前回はADD、SUBなどの算術演算命令、AND、ORなどの論理演算命令8種が「ほぼほぼ」以下同文ということを確認しました。でも算術演算といえば加減乗除というくらいで、乗除はどうなってんの?そこで今回は乗算命令MULを見ていきます。「何かと何かを掛ける」命令のハズなのに、アセンブラのオペランドは1個だけ。なして?
ぐだぐだ低レベルプログラミング(182)x86(16bit)、ADD以下同文?微妙に非対称?
前回、x86の16ビット命令セットからADD命令を練習。実はADDが分かれば、ADC、AND、XOR、OR、SBB、SUB、CMPの残り7命令も「ほぼほぼ以下同文」てことで理解できます。でも「ほぼほぼ」って何だ?そこで、この辺でCISCらしいx86のオペコードエンコーディングを復習。ほんとメンドクセーんだが、これ。 “ぐだぐだ低レベルプログラミング(182)x86(16bit)、ADD以下同文?微妙に非対称?” の続きを読む
ぐだぐだ低レベルプログラミング(181)x86(16bit)、ADDオペランド何でもありすぎ
前回から元祖x86、16bitCPU、8086/8088の命令セットの復習を始めました。うん十年ぶり。忘れてます。しかしArmとかRISC-Vとかの後に改めて8086の命令をみると確かに複雑、CISCだからあたりまえか。今回は整数足し算、ADD命令を練習してみます。命令にとれるオペランドがいろいろありすぎ、何でもあり?
ぐだぐだ低レベルプログラミング(180)x86(16bit)、INC/DECにCISCを見?
さて前回よりx86の最初のステップ、16ビットモードに入りました。いままでRISC-V、ArmとRISC系(Armはそれにしちゃ命令多過ぎだが)を練習してきましたが、今回からは「バリバリの」CISCデス。それほど意識することはないけれども、違いは確実にあるので気づいたところから見ていきます。 “ぐだぐだ低レベルプログラミング(180)x86(16bit)、INC/DECにCISCを見?” の続きを読む
ぐだぐだ低レベルプログラミング(179)x86、16/32/64bit、整数レジスタの発展?
長らく練習してきたArmを終え(まだ他所でやるケド)、今回からx86に入ります。Armの命令多過ぎなどと文句を垂れてきましたが、x86の命令「もっと」多過ぎ、死ぬまでに舐め終わらない気がします。そのうえ屋上屋を重ねる拡張により「古い16ビット命令」は「64ビット機では練習しずらく」なってます。どうするの?
ぐだぐだ低レベルプログラミング(178)ARM64(AArach64)オプショナル命令確認
前回「表引き」命令を練習した後も練習すべき「SIMDのデータ処理命令は尽きまじ」などと思っておったお惚け老人です。しかしマニュアルをよく見てみれば、残り2つのカテゴリのうち一つは ARMv8.3、もう一つは ARMv8.0だけれども「optional」でした。ラズパイ4機で該当の「optional」使えるのか?
ぐだぐだ低レベルプログラミング(177)ARM64(AArach64)SIMD 表引き命令群
今回は「表引き」命令群です。「群」といっても2命令だけ。SIMD(ベクトル)ソースレジスタのバイト要素をインデックスとして、複数のSIMDレジスタを「バイト・テーブル」としてアクセスし、引いた結果をデスティネーションのSIMDレジスタに書き込むという命令です。1度に最大16個の表引きをできるもの。単純だけれど強力?
ぐだぐだ低レベルプログラミング(176)ARM64(AArach64)SIMD ペア操作群2
前回はベクトルレジスタ2個の隣接要素どうし演算、ベクトルレジスタ1個分(半分の長さ)に縮める「ペアワイズ」操作のうち整数演算の命令5つを練習。今回は残りの「ペアワイズ」操作命令5個を練習してみます。今度は浮動小数点命令ね。やっぱりADDとMAX、MIN操作なのだけれどもNANの扱いでMAX、MINは各2命令あり。
“ぐだぐだ低レベルプログラミング(176)ARM64(AArach64)SIMD ペア操作群2” の続きを読む
ぐだぐだ低レベルプログラミング(175)ARM64(AArach64)SIMD ペア操作群1
前回まで「ベクトル横断」命令群を練習してました。ベクトルにつまった要素を縮約処理して1個のスカラーにまとめてしまうもの。しかし、スカラーにまでまとめる前にもう一手間あるんじゃないすか、というのが今回のペア操作です。複数SIMDレジスタにまたがる長大なベクトルを隣接要素どうしで処理して半分の長さに縮めるもの。
“ぐだぐだ低レベルプログラミング(175)ARM64(AArach64)SIMD ペア操作群1” の続きを読む
ぐだぐだ低レベルプログラミング(174)ARM64(AArach64)SIMD FMAXV
前回から「Across Vector」、SIMDレジスタに並ぶ各要素を横断的に処理(縮約)して1個のスカラー値を得る命令を練習してます。今回はFMAXVとその一族です。浮動小数要素のMAXおよびMINを求める命令ですが2命令づつあります。同じMAXとる命令でもNaNの扱いで2種類に分かれるっと。メンドクセー奴だよ。
“ぐだぐだ低レベルプログラミング(174)ARM64(AArach64)SIMD FMAXV” の続きを読む
ぐだぐだ低レベルプログラミング(173)ARM64(AArach64)SIMDベクタ横断群1
今回からA64のマニュアル呼ぶところの「Across Vector」命令群の練習に入ります。ベクタ横断、という言い方がしっくりこなければ、リダクション、あるいは縮約と言い換えても良いのでしょう。ベクトル内の各要素を「横断的」に処理して1個のスカラ値を得るための演算です。ベクトル演算の〆の一発ね。
ぐだぐだ低レベルプログラミング(172)ARM64(AArach64)SIMD即値シフト8
ついにA64のSIMD即値シフト命令、8回を費やし今回にて完了であります。命令数トンデモなかったデス。今回は残るナロー化(ソース要素のビット幅の半分の結果を得る)右シフト一族のうち、サチュレーションやらラウンディングやら複数重なるような複雑な奴らです。でもね、順番にやっているうちに慣れました?どんとこいっと。ホントか?
“ぐだぐだ低レベルプログラミング(172)ARM64(AArach64)SIMD即値シフト8” の続きを読む
ぐだぐだ低レベルプログラミング(171)ARM64(AArach64)SIMD即値シフト7
どんだけあるんだA64のSIMD即値シフト命令ということですが、後一息デス。今回は残る「ナロー化一族(勝手命名)」を2回に分けて練習する予定の1回目です。ロング化が左シフトのみであったのに対して、ナロー化は右シフトのみです。右シフトした結果のビット幅を半分にして格納するナロー化一族。でもいろいろあるのよ。
“ぐだぐだ低レベルプログラミング(171)ARM64(AArach64)SIMD即値シフト7” の続きを読む
ぐだぐだ低レベルプログラミング(170)ARM64(AArach64)SIMD即値シフト6
前回、ロング化一族(勝手命名)を2回に分けて練習すると書きました。しかし既視感。実は今回練習にとってあった4命令、練習済でした。実体がない上に、二股かけてる?奴らだったからです。気を取り直して今回は挿入系一族(勝手命名)といっても2命令だけですがを練習していきたいと思います。ぐだぐだな成り行きだな。
“ぐだぐだ低レベルプログラミング(170)ARM64(AArach64)SIMD即値シフト6” の続きを読む