ぐだぐだ低レベルプログラミング(108)ARM64(AArach64)FCVTxy、整数変換

fcvt2Result
Joseph Halfmoon

前回は単精度と倍精度の間のフォーマット変換を行うFCVT命令でした。同じ命令が丸めモードの設定で動作が変わるので厄介でした。今回のFCVTxy命令群(xyのところはいろいろ)は、浮動小数点数を整数に変換するもの。丸めモードフラグには関係なしと喜んだら、かえって組み合わせが増えているでないの?もうメンドくてやりきれない?
“ぐだぐだ低レベルプログラミング(108)ARM64(AArach64)FCVTxy、整数変換” の続きを読む

ぐだぐだ低レベルプログラミング(107)ARM64(AArach64)FCVT

fcvt_asm
Joseph Halfmoon

今回はたった1命令、FCVTをエクササイズしてみます。練習に使っているArm Cortex-A72は半精度浮動小数のサポートが無く、以前残念に思ってましたが、今回は無くて良かった、という感じです。単精度があったら組み合わせは3倍、やめてくれです。前回登場のFPCRレジスタのRMビットが活躍します。
“ぐだぐだ低レベルプログラミング(107)ARM64(AArach64)FCVT” の続きを読む

ぐだぐだ低レベルプログラミング(106)ARM64(AArach64)FPSR/FPCR

A64_FPCR_FPSR
Joseph Halfmoon

何時までも見て見ぬふりもできないので今回はFPSRとFPCRを調べてみたいと思います。命令ニーモニックではありませぬ。フローティングポイントステータスレジスタとコントロールレジスタ、「メンドイ」浮動小数の例外やら非数(NaN)などの制御とそのステータスを保持するもの。今回はレジスタのビットの配置から。 “ぐだぐだ低レベルプログラミング(106)ARM64(AArach64)FPSR/FPCR” の続きを読む

ぐだぐだ低レベルプログラミング(105)ARM64(AArach64)FMOV

FMOV
Joseph Halfmoon

今回はFMOV命令です。浮動小数点数の転送命令。浮動小数点といっても何の変換操作もなし、単なるビットパターンのコピーです。命令はたった一つFMOV。しかしこれが意外に面倒デス。今回でも組み合わせが多いのに、ターゲットマシンが半精度を使える機種だったらもっとやらないといけなかったです。頭文字Fの命令にチョロイのはいない。
“ぐだぐだ低レベルプログラミング(105)ARM64(AArach64)FMOV” の続きを読む

ぐだぐだ低レベルプログラミング(104)ARM64(AArach64)FABS、FSQRT他

fabsnegsqrtResults
Joseph Halfmoon

今回はFloating-point arithmetic(one source)のカテゴリを一気にやります。といっても3命令、FABS、FNEG、FSQRTです。例外とか「コマケー話」を避けていれば浮動小数点の演算そのものは素直で分かりやすい?です。そのうちメンドイ話もやらんといかんですが、今回は無し。平穏無事。。 “ぐだぐだ低レベルプログラミング(104)ARM64(AArach64)FABS、FSQRT他” の続きを読む

ぐだぐだ低レベルプログラミング(103)ARM64(AArach64)FSUB、FMUL他

FP_SUB_EC
Joseph Halfmoon

前回はFADD命令をさわり、ARMv8p0には半精度浮動小数点型が無かったというお間抜け発覚。今回はFADD以外のFloating-point arithmetic (two sources)の残りFSUB, FMUL, FNMUL, FDIVであります。まあ、以下同文っていう感じなんでありますが。単精度と倍精度。

“ぐだぐだ低レベルプログラミング(103)ARM64(AArach64)FSUB、FMUL他” の続きを読む

ぐだぐだ低レベルプログラミング(102)ARM64(AArach64)FADDと半精度

fpError
Joseph Halfmoon

前回、浮動小数点レジスタのお名前一覧など図にしておったので半精度浮動小数が使える、と頭から信じておりました。しかし今回気づきました。これがArmv8でもv8.2からの拡張であることを。つまり手元のラズパイ4のCortex-A72(Armv8p0)では使えないようです。トホホ。ということで倍精度、単精度のみの練習とな。 “ぐだぐだ低レベルプログラミング(102)ARM64(AArach64)FADDと半精度” の続きを読む

ぐだぐだ低レベルプログラミング(101)ARM64(AArach64)SIMD&FPレジスタ

VregistersNames
Joseph Halfmoon

前回までで「特権なし」で楽しく使える分岐命令はだいたい網羅したので、今回から「懸案」のSIMD命令、FP命令に入っていきたいと思います。新たなレジスタファイルが登場します。Vレジスタとな。まあ、X86_64ほど複雑怪奇ではないものの、それなりに込み入ってます。今回は冒頭の画像1枚描いて力尽きました。 “ぐだぐだ低レベルプログラミング(101)ARM64(AArach64)SIMD&FPレジスタ” の続きを読む

ぐだぐだ低レベルプログラミング(100)ARM64(AArach64)、レジスタ間接分岐

ubEC
Joseph Halfmoon

今回はレジスタ間接分岐命令をエクササイズしてみます。といって一族命令には今までも「お世話」にはなっとります。LR(リンクレジスタ、X30)に向かって分岐するRET命令もレジスタ間接分岐命令と原理的には同じもの。レジスタ間接分岐では論理絶対番地でどこへでも飛べますが、とび先番地には気を付けないと。
“ぐだぐだ低レベルプログラミング(100)ARM64(AArach64)、レジスタ間接分岐” の続きを読む

ぐだぐだ低レベルプログラミング(99)ARM64(AArach64)、所謂call、ret

topOfasmFunc
Joseph Halfmoon

今回はいわゆるCALL命令をエクササイズしてみます。A64的にはBL命令ですが。またいままで見て見ぬフリ?をしてきていたスタックポインタも登場、だいたいA64でPUSH/POPするのはどしたらよいのでしょうか?32ビットのArmとはだいぶ違う感じ。ここを乗り越えるとA64のABIが見えてくる。ホントか? “ぐだぐだ低レベルプログラミング(99)ARM64(AArach64)、所謂call、ret” の続きを読む

ぐだぐだ低レベルプログラミング(98)ARM64(AArach64)、条件分岐CBNZ族

cbzEC
Joseph Halfmoon

前回は条件フラグを「見て」飛ぶ一般的な条件分岐命令B.condでした。しかし思い起こせばRISC-Vでは条件フラグが無く、「その場」でレジスタの内容を判断して飛ぶ命令ばかりでした。A64でもそういう命令が無いわけではないです。今回はフラグを使わずレジスタの内容で分岐するCBNZ命令一族について実習してみます。

“ぐだぐだ低レベルプログラミング(98)ARM64(AArach64)、条件分岐CBNZ族” の続きを読む

ぐだぐだ低レベルプログラミング(97)ARM64(AArach64)、条件分岐B.cond

bcondEC
Joseph Halfmoon

前回までロードストア命令を実習してきました。まだまだロードストアあるのですが別件実習してからの方がよさそうな奴らばかりなので一たんお休み。今回から分岐命令に入りたいと思います。最初は条件分岐命令です。どのプロセッサも「似たようなもん」ですが、条件の組み合わせを全部通すのはメンドイです。

“ぐだぐだ低レベルプログラミング(97)ARM64(AArach64)、条件分岐B.cond” の続きを読む

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

str2URencode
Joseph Halfmoon

さらっとニーモニックを一通り撫でるつもりでも命令多すぎArmです。アドレッシングモードはロード命令でやったし、データサイズは幅だけだからなどと言い訳を言って、大幅に手を抜きました、ハイ。今回はストア命令の「落穂ひろい」編であります。微妙にロードとは非対称だけれども大体はあるのだ、ストアにも。 “ぐだぐだ低レベルプログラミング(96)ARM64(AArach64)、ロードストア命令その7” の続きを読む

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

strEC
Joseph Halfmoon

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