前回「表引き」命令を練習した後も練習すべき「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” の続きを読む
ぐだぐだ低レベルプログラミング(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” の続きを読む
ぐだぐだ低レベルプログラミング(169)ARM64(AArach64)SIMD即値シフト5
今回も対称性(直交性)は破れているの回です。前回のアキュムレート付きシフトは全て右シフトでした。今回から2回にわけて練習する予定のロング化(デスティネーションがソースのビット幅の倍のビット幅になる)シフトは全て左シフトです。当たり前っちゃ当たり前だけれども。ただロング化一族の中でも微妙に凸凹あり。 “ぐだぐだ低レベルプログラミング(169)ARM64(AArach64)SIMD即値シフト5” の続きを読む
ぐだぐだ低レベルプログラミング(168)ARM64(AArach64)SIMD即値シフト4
SIMDの即値シフト命令の練習4回目。今回は勝手命名「即値シフトのアキュムレート系」を練習。即値シフト後の値をデスティネーションレジスタの値に加えるものです。命令を並べてみるとこの一族は「直交的」です。A64にはめずらしい対称性?ただし、アキュムレート一族は右シフトのみ。根本的なところで対称性は破れている?違うか。
“ぐだぐだ低レベルプログラミング(168)ARM64(AArach64)SIMD即値シフト4” の続きを読む
ぐだぐだ低レベルプログラミング(167)ARM64(AArach64)SIMD即値シフト3
SIMDの即値シフト命令の練習3回目です。前回は「一番ちょろい」命令3つばかりを練習してお茶を濁しました。今回は「ちょっと複雑な」命令に入っていきたいと思います。ただし、ナローとかロングとかは無。インサートとアキュムレートも無。それでも飽和と丸めが有り。その上、符号付だか符号無だかハッキリしろいと言いたくなる奴あり。
“ぐだぐだ低レベルプログラミング(167)ARM64(AArach64)SIMD即値シフト3” の続きを読む
冥界のLSI(10) NEC(大昔の)Vシリーズ、シングルチップおまとめ
20世紀のチップ共の記憶が薄れゆく中、いくらかでも記憶にとどめるべく取りとめないこと書き連ねてます。今回は第7回「V41/V51、NEC版PC/XTワンチップ」の補足。NEC V30は「いろいろあって」多くの人が記憶にとどめているけれど、VシリーズにはMCUもSoC(当時はそういう名前はなかったけど)もあったのだよね。
“冥界のLSI(10) NEC(大昔の)Vシリーズ、シングルチップおまとめ” の続きを読む
ぐだぐだ低レベルプログラミング(166)ARM64(AArach64)SIMD即値シフト2
前回は、即値でシフトのビット数を指定できるSIMD命令のあまりの多さに、その特徴を表に整理するところで力つきました。ようやく今回から実機練習に戻ります。まずは「一番簡単な」シフトから。まあ後に控えている奴らを考えたら素直で分かり易いです。単純な左シフトと右シフトです。対称な2命令かと思えば、A64がそんな筈ないっと。
“ぐだぐだ低レベルプログラミング(166)ARM64(AArach64)SIMD即値シフト2” の続きを読む
ぐだぐだ低レベルプログラミング(165)ARM64(AArach64)SIMD即値シフト
何時ものツブヤキですが、今回こそは腹の底から言いたいです。「命令多過ぎA64」と。今回はSIMDの即値を引数にとるシフト命令です。シフト命令なので、右、左あり、シフト量は即値で指定ね、とシンプルに行くことを期待したものの、A64がそれを許すハズが無かったのです。いろいろオプションありすぎ命令も多過ぎ。 “ぐだぐだ低レベルプログラミング(165)ARM64(AArach64)SIMD即値シフト” の続きを読む