ぐだぐだ低レベルプログラミング(165)ARM64(AArach64)SIMD即値シフト

Joseph Halfmoon

何時ものツブヤキですが、今回こそは腹の底から言いたいです。「命令多過ぎ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の即値指定シフト命令一族の全ニーモニックに対する「オプション」的な要素を列挙しただけで疲れ切りました。実習はなし、次回ね。列挙しただけの表が以下に。先ほども抜けを見つけて書き込みしたのだけれど、まだ抜けがあるかもしれません。SIMD_SFTIMM_TBL2

 

左端に並んでいるのがこの一族の命令共のニーモニックです。ところどころ、末尾に「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)、符号拡張、ゼロ拡張

符号拡張、ゼロ拡張では「エイリアス」も登場。

次回からの練習が思いやられます。

ぐだぐだ低レベルプログラミング(163)ARM64(AArach64)SIMD 転置命令 へ戻る

ぐだぐだ低レベルプログラミング(166)ARM64(AArach64)SIMD即値シフト2 へ進む