ぐだぐだ低レベルプログラミング(95)ARM64(AArach64)、ロードストア命令その6

strEC
Joseph Halfmoon

今回からストア命令に入ります。前回までのロード命令に比べるとお楽です。ロード命令で既にやったからということで面倒なアドレシングモードをパスしてしまったせいもあります。しかし何と言っても符合について考える必要ないのがうれしいです。ストアするときはデータ幅さえ指定すりゃよいと。 “ぐだぐだ低レベルプログラミング(95)ARM64(AArach64)、ロードストア命令その6” の続きを読む

ぐだぐだ低レベルプログラミング(94)ARM64(AArach64)、ロードストア命令その5

ldpEC
Joseph Halfmoon

今回扱うLDP命令には、デスティネーションが2つあります。といって驚いちゃいけません。32ビットのArm命令(A32)には任意本数のレジスタをスポポンと1命令で出し入れするLDM/STMなどという命令まであったことに比べれば、A64は「抑え気味」です。でも言いたくなります。それでもRISCかよ?と。 “ぐだぐだ低レベルプログラミング(94)ARM64(AArach64)、ロードストア命令その5” の続きを読む

ぐだぐだ低レベルプログラミング(93)ARM64(AArach64)、ロードストア命令その4

ldurEncode
Joseph Halfmoon

今回はイミディエイト・オフセットで同じアドレスを指すのに2通りの命令がある話。一つはスケールド12ビット、もう一つはスケール無9ビット。12ビットあればいいじゃん、と思わないこともないのですが、心の広いArm様です。アン・アラインドなアクセスはお勧めしないけれど一律禁止ではありません。よってスケールしない命令も必要と。

“ぐだぐだ低レベルプログラミング(93)ARM64(AArach64)、ロードストア命令その4” の続きを読む

ぐだぐだ低レベルプログラミング(92)ARM64(AArach64)、ロードストア命令その3

ldr3_EC
Joseph Halfmoon

A64のロード命令をさらっています。元より組み合わせを網羅しようなどとは考えておらず「ありがちな」例を「通り一遍」なでるだけのつもりなのですが、Armは命令数が多いっす。ロードだけでもどんだけ?今回は、前回積み残しのアドレシングモードを使ってみます。POST/PRE-indexみたいな「複雑な」奴らも登場。 “ぐだぐだ低レベルプログラミング(92)ARM64(AArach64)、ロードストア命令その3” の続きを読む

ぐだぐだ低レベルプログラミング(91)ARM64(AArach64)、ロードストア命令その2

TargetMEM
Joseph Halfmoon

前回、Armのロードストア命令のアドレシングモード複雑怪奇、などと書きながら、今回実習に使用いたしますのは「ベース+オフセット」一択です。人生複雑にしたくない人はそれが一番、違うか。ロードストアは1命令テストするのにもメモリを用意しないといけないので、準備のCのコードがメンドイのよね。文句が多いな。
“ぐだぐだ低レベルプログラミング(91)ARM64(AArach64)、ロードストア命令その2” の続きを読む

ぐだぐだ低レベルプログラミング(90)ARM64(AArach64)、ロードストア命令その1

bimm9
Joseph Halfmoon

今回からロードストア命令に入ります。気が重いです。Armは下手なCISC(多分x86のことだよ)よりもアドレシングモードが複雑怪奇。オペランドによっては特例的な規則もあります。64ビット化したおかげで、バイト、ハーフワード、ワードに加えてダブルワード(SIMD考えるともっと)あり、それに符合がからんで大変。 “ぐだぐだ低レベルプログラミング(90)ARM64(AArach64)、ロードストア命令その1” の続きを読む

ぐだぐだ低レベルプログラミング(89)ARM64(AArach64)、除算命令

divEC
Joseph Halfmoon

前回までの整数乗算命令「いろいろ」あって全4回を要しました。今回は整数除算命令ですが、この1回で完了です。乗算のような組み合わせの多さもエイリアスもなくシンプル。シンプル・イズ・ベスト?シンプル・ライフ?(古い)でも除算はいいけれど剰余算はどうよ?というと「すでにやっていた」事実が発覚。なんてこったい。
“ぐだぐだ低レベルプログラミング(89)ARM64(AArach64)、除算命令” の続きを読む

ぐだぐだ低レベルプログラミング(88)ARM64(AArach64)、整数乗算命令その4

smulEC
Joseph Halfmoon

今回でようやく整数乗算命令の「舐め終わり」です。前回積み残していた「符合付」の命令群です。前々回のようにデスティネーションがソースと等ビット幅であれば出る幕がないですが、前回のようにデスティネーションがソースの倍幅あると必須な奴ら。文字で書いていても何だかよくわからなくなりますが、これで計算はできるのだと。

“ぐだぐだ低レベルプログラミング(88)ARM64(AArach64)、整数乗算命令その4” の続きを読む

ぐだぐだ低レベルプログラミング(87)ARM64(AArach64)、整数乗算命令その3

mul_INSN_AliasU
Joseph Halfmoon

RISC-Vのとき基本整数命令セットを一当たりなめるのは大した回数でなかった記憶。しかしArmの64ビット命令セットA64は命令多いです。まだ整数乗算命令です。今回は前回やってない「パターン2」と「パターン3」ですが符合無のみ。符合付も一度にやるとちょっと疲れそうだったから。そういうところで回数多くなっているな、オイ。 “ぐだぐだ低レベルプログラミング(87)ARM64(AArach64)、整数乗算命令その3” の続きを読む

ぐだぐだ低レベルプログラミング(86)ARM64(AArach64)、整数乗算命令その2

mulEC
Joseph Halfmoon

前回は整数の掛け算命令について表にまとめたところで終わってました。今回は3つある演算パターンのうち、すべてのレジスタのビット幅が等しい第1のパターンを練習してみます。「普通のMUL命令」もこの分類です。でも基本は積和演算MADDです。MULはMADDのエイリアスという扱い、実際にはMADDだと。
“ぐだぐだ低レベルプログラミング(86)ARM64(AArach64)、整数乗算命令その2” の続きを読む

ぐだぐだ低レベルプログラミング(85)ARM64(AArch64)、整数乗算命令その1

mul_INSN_Alias2
Joseph Halfmoon

前回まで実習していた条件フラグ命令、マニュアルにはまだまだあるな~と思っていたのですが勘違いでした。今回ターゲットのArm Cortex-A72はARMv8の中ではキホンのARMv8p0なので使えないようです。残念。そこで今回から整数の乗算命令に転じます。これがまた、いろいろあるのよ。今回はざっと眺めるだけ、実習なし。 “ぐだぐだ低レベルプログラミング(85)ARM64(AArch64)、整数乗算命令その1” の続きを読む

ぐだぐだ低レベルプログラミング(84)ARM64(AArch64)、条件選択命令群その2

CSEL_2
Joseph Halfmoon

前回は、数多い条件選択命令群のうち「表」の4命令を動かしてみました。今回は「裏(エイリアス)」の5命令を動かしてみたいと思います。共通しているのは、「表」の命令と条件判断がひっくりかえっていること、そして本来3オペランドの「表」命令のソースオペランドに制限を加えていることです。 “ぐだぐだ低レベルプログラミング(84)ARM64(AArch64)、条件選択命令群その2” の続きを読む

ぐだぐだ低レベルプログラミング(83)ARM64(AArch64)、条件選択命令群その1

CSEL_Table2
Joseph Halfmoon

前々回から条件フラグNZCV関連の命令に入っておりますが、非常に充実してます。これは32ビット時代のArmがほぼ全ての命令に条件判断を付与できるという過激なあり方だったのを64ビット化するときに廃止してしまった「罪滅ぼし」なんじゃないかと密かに思います。知らんけど。今回は条件付き選択命令。多すぎて1回では終わらず。
“ぐだぐだ低レベルプログラミング(83)ARM64(AArch64)、条件選択命令群その1” の続きを読む

ぐだぐだ低レベルプログラミング(82)ARM64(AArch64)、条件付き比較命令

setFlagInstTable
Joseph Halfmoon

前回から、条件フラグNZCV関係に踏み入っております。やる前から分かっていたことですが、真か偽か判定するだけの1ビットのフラグですが、複数条件重なれば、霧のかかった老人の頭では、いずれが真か偽、是々非々、是々非々。特に今回の命令群は条件フラグの操作をするのに条件を判断して行うという奇怪さであります。 “ぐだぐだ低レベルプログラミング(82)ARM64(AArch64)、条件付き比較命令” の続きを読む