何時ものツブヤキですが、今回こそは腹の底から言いたいです。「命令多過ぎA64」と。今回はSIMDの即値を引数にとるシフト命令です。シフト命令なので、右、左あり、シフト量は即値で指定ね、とシンプルに行くことを期待したものの、A64がそれを許すハズが無かったのです。いろいろオプションありすぎ命令も多過ぎ。
※「ぐだぐだ低レベルプログラミング」投稿順indexはこちら
※実機動作確認には以下を使用しております。
-
- Raspberry Pi 4 model B、Cortex-A72コア(ARMv8-A)
- Raspberry Pi OS (64bit) bullseye
- gcc (Debian 10.2.1-6) 10.2.1 20210110
ARMv8もいろいろレベルがあり、Arm Cortex-A72はARMv8の中でもベーシックな(命令数の少ない)ARMv8p0です。
※A64の最新のマニュアルは以下でダウンロード可能です。
Arm Architecture Reference Manual for A-profile architecture
SIMDの即値指定シフト命令
今回は、SIMDの即値指定シフト命令一族の全ニーモニックに対する「オプション」的な要素を列挙しただけで疲れ切りました。実習はなし、次回ね。列挙しただけの表が以下に。先ほども抜けを見つけて書き込みしたのだけれど、まだ抜けがあるかもしれません。
左端に並んでいるのがこの一族の命令共のニーモニックです。ところどころ、末尾に「2」のつくニーモニックがあり、そのような場合、1行に2つのニーモニックが併記されてます。これらはSIMD要素のビット幅が狭くなったり(ナロー)、広くなったり(ロング)する形式の命令において、狭い方のオペランドをSIMDレジスタの下側からとるか(無印)、上側からとるか(2印)の指定です。なお、ソースになるのかデスティネーションになるのかは命令次第っす。
最初から何やら分からん注釈に走ってしまいましたが、表の上部には、Rndから始まり、Rgtまで記号を書いてあります。これらこそが各命令の特性を示す「オプション」とでもいったものです。右端の2列はお馴染みの以下です。
-
- Lft(Left)、左シフト、シフト量は即値で決定される
- Rgt(Right)、右シフト、シフト量は即値で決定される
これだけで全てであれば、メンドクセーことは一つも無かったのだけれども。その横にはメンドクセー奴らがならんでいます。今度は左から、
-
- Rnd(Round)、丸め
シフトした結果、失われる下位ビットを「丸めて」シフト結果に反映させます。Roundが含まれていない場合は、Trancateということで失われるビットはバッサリ、それっきりです。それがフツーなんだと思うけど。
-
- Nar(Narrow)、ナロー
シフト結果の要素ビット幅をソースビット幅の半分にします。例えば128ビット幅のSIMDレジスタに詰まっているソース要素にこの操作を加えれば結果は64ビット幅になる筈。結果をSIMDレジスタのMSB側に置くのか、LSB側に置くのかでさっき出てきた「無印」と「2印」が活躍。
-
- Lng(Long)、ロング
シフト結果の要素ビット幅をソースビット幅の倍にします。例えば64ビット幅のSIMDレジスタに詰まっているソース要素にこの操作を加えれば結果は128ビット幅になる筈。ソースをSIMDレジスタの上側から引いてくるのか、下側から引いてくるのかで再び「無印」と「2印」が活躍。
-
- Ins(Insert)、挿入
シフトされたソース要素のビット列をデスティネーション要素に挿入します。シフトした結果のゼロ詰め部分には書き込まず、デスティネーション要素のビットを維持。込み入っているなあ。
-
- Usn(Unsign)、シフトされるデータは符号なし
- Sgn(Sign)、シフトされるデータは符号付き
符号無と符号有違いがあるのは仕方ない。しかし次の飽和との「相乗」効果でややこしくなります。
-
- Sat(Saturate)、シフト結果を飽和させる
- Ust(Saturate the shifted results to unsigned integer value)
サチュレーション(飽和)付は、シフトした結果を表現可能な範囲に飽和させます。当然、データの符号無、符号有に影響を受けます。しかし、符号付きの値をシフトするのだけれども、飽和する場合は符号無の値に飽和させる、という符号付きなんだか符号無なんだかハッキリしろい、というオプションがあり。お惚け老人はその複雑さについていけませぬ。
-
- Acc(Accumulate)、シフト結果をデスティネーションに加算
こうしてみるとアキュムレートなどまったく複雑な気がしませんな。
-
- Ext(Extend)、符号拡張、ゼロ拡張
符号拡張、ゼロ拡張では「エイリアス」も登場。
次回からの練習が思いやられます。