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

simdSFTimm6_results
Joseph Halfmoon

前回、ロング化一族(勝手命名)を2回に分けて練習すると書きました。しかし既視感。実は今回練習にとってあった4命令、練習済でした。実体がない上に、二股かけてる?奴らだったからです。気を取り直して今回は挿入系一族(勝手命名)といっても2命令だけですがを練習していきたいと思います。ぐだぐだな成り行きだな。
“ぐだぐだ低レベルプログラミング(170)ARM64(AArach64)SIMD即値シフト6” の続きを読む

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

SIMD_shift_imm5_table
Joseph Halfmoon

今回も対称性(直交性)は破れているの回です。前回のアキュムレート付きシフトは全て右シフトでした。今回から2回にわけて練習する予定のロング化(デスティネーションがソースのビット幅の倍のビット幅になる)シフトは全て左シフトです。当たり前っちゃ当たり前だけれども。ただロング化一族の中でも微妙に凸凹あり。 “ぐだぐだ低レベルプログラミング(169)ARM64(AArach64)SIMD即値シフト5” の続きを読む

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

INSN_IMM4
Joseph Halfmoon

SIMDの即値シフト命令の練習4回目。今回は勝手命名「即値シフトのアキュムレート系」を練習。即値シフト後の値をデスティネーションレジスタの値に加えるものです。命令を並べてみるとこの一族は「直交的」です。A64にはめずらしい対称性?ただし、アキュムレート一族は右シフトのみ。根本的なところで対称性は破れている?違うか。
“ぐだぐだ低レベルプログラミング(168)ARM64(AArach64)SIMD即値シフト4” の続きを読む

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

SFTimm3EC
Joseph Halfmoon

SIMDの即値シフト命令の練習3回目です。前回は「一番ちょろい」命令3つばかりを練習してお茶を濁しました。今回は「ちょっと複雑な」命令に入っていきたいと思います。ただし、ナローとかロングとかは無。インサートとアキュムレートも無。それでも飽和と丸めが有り。その上、符号付だか符号無だかハッキリしろいと言いたくなる奴あり。
“ぐだぐだ低レベルプログラミング(167)ARM64(AArach64)SIMD即値シフト3” の続きを読む

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

SIMD_SFTIMM_2_SRC
Joseph Halfmoon

前回は、即値でシフトのビット数を指定できるSIMD命令のあまりの多さに、その特徴を表に整理するところで力つきました。ようやく今回から実機練習に戻ります。まずは「一番簡単な」シフトから。まあ後に控えている奴らを考えたら素直で分かり易いです。単純な左シフトと右シフトです。対称な2命令かと思えば、A64がそんな筈ないっと。
“ぐだぐだ低レベルプログラミング(166)ARM64(AArach64)SIMD即値シフト2” の続きを読む

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

SIMD_SFTIMM_TBL2
Joseph Halfmoon

何時ものツブヤキですが、今回こそは腹の底から言いたいです。「命令多過ぎA64」と。今回はSIMDの即値を引数にとるシフト命令です。シフト命令なので、右、左あり、シフト量は即値で指定ね、とシンプルに行くことを期待したものの、A64がそれを許すハズが無かったのです。いろいろオプションありすぎ命令も多過ぎ。 “ぐだぐだ低レベルプログラミング(165)ARM64(AArach64)SIMD即値シフト” の続きを読む

ぐだぐだ低レベルプログラミング(164)ARM64(AArach64)SIMD即値命令

FMOV_EC
Joseph Halfmoon

前回はSIMDの転置(transpose)命令に「絶対自分じゃ思いつかね~」と感心しました。今回はSIMDでも即値(イミーディエイト)をソースにとる命令群です。たった8ビットなんだけれどもその効果たるや意外と複雑?中でも8ビット即値を浮動小数にエンコードしてロードするFMOV命令にはちょいとてこずりましたぞ。

“ぐだぐだ低レベルプログラミング(164)ARM64(AArach64)SIMD即値命令” の続きを読む

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

Transpose4x4
Joseph Halfmoon

今回はSIMD命令の華「transpose」命令の実習をしたいと思います。転置デス。行列にはつきもののアレです。「簡単な操作」なのでメモリ上の要素をループで読んで順序を変えて書き戻せば可能。でもメモリにアクセスする時間を考えると大変。しかしA64のTRN1、TRN2を使えばレジスタ上で転置ができてしまうっと。
“ぐだぐだ低レベルプログラミング(163)ARM64(AArach64)SIMD 転置命令” の続きを読む

ぐだぐだ低レベルプログラミング(162)A64(AArach64)SIMD permute

ZipUzpDiag
Joseph Halfmoon

今回からSIMDレジスタ2個の内容を「混ぜあわせて並び変える」permute命令群の練習に入りたいと思います。SIMD命令でプログラムを書こうとすると避けて通れないどころか、ここの始末のエレガントさで性能段違いっす。まさにSIMDの華というべきか。ホントか?誰が言った?今回はその露払いね。 “ぐだぐだ低レベルプログラミング(162)A64(AArach64)SIMD permute” の続きを読む

ぐだぐだ低レベルプログラミング(161)A64 SIMD要素毎SQDMLAHはARMv8.1

ASMerror
Joseph Halfmoon

今回こそ「SIMDレジスタの一方の全要素に他方の一要素を共通に掛け算」する命令の練習を完了せんとしたところ、既に完了していることに気づいて愕然。お楽しみにとっておいた「符号付整数の乗算結果を2倍して積和した結果の上側半分を丸めて格納、もし溢れたらサチュレーション」は実習不可。それどころかあちこち要訂正。トホホ。

“ぐだぐだ低レベルプログラミング(161)A64 SIMD要素毎SQDMLAHはARMv8.1” の続きを読む

ぐだぐだ低レベルプログラミング(160)A64 SIMD要素毎SQDMLAL(題訂正)

simd_elemSQDMLALresults
Joseph Halfmoon

前回に続き「SIMDレジスタの一方の全要素に他方の一要素を共通に掛け算」する命令の練習です。今回は「符号付整数の乗算結果を2倍した上で倍のビット幅のレジスタに積和もしくは積差を行った結果が溢れたらサチュレーションさせる」命令を練習してみます。まあ何度となくメンドクセー奴らを練習してきたのでこのくらいはなんてことない? “ぐだぐだ低レベルプログラミング(160)A64 SIMD要素毎SQDMLAL(題訂正)” の続きを読む

ぐだぐだ低レベルプログラミング(159)A64(AArach64)SIMD要素毎FMULX

elemFMULXargs
Joseph Halfmoon

前回につづき「SIMDレジスタの一方の全要素に他方の一要素を共通に掛け算」する浮動小数点演算命令を練習しようとして発覚。FMLAL, FMLAL2, FMLSL, FMLSL2の4命令、ARMv8.2以降の実装です。ARMv8.0では練習できません。ラッキー?残りはと見ればFMULXのみ。しかしメンドクセー奴なんだ。
“ぐだぐだ低レベルプログラミング(159)A64(AArach64)SIMD要素毎FMULX” の続きを読む

ぐだぐだ低レベルプログラミング(158)ARM64(AArach64)SIMD要素毎FMUL

elemFMULresultsEC
Joseph Halfmoon

「SIMDレジスタの一方の全要素に他方の一要素を共通に掛け算」する系統の命令があまりに数が多いです。前回それらを表にまとめました。今回はそれらの中から「シンプル」な浮動小数の乗算、積和算、積差算を練習してみたいと思います。シンプルとは言え積和が出てくると fused計算を避けて通れませぬ。fusedの効果確認メンドい

“ぐだぐだ低レベルプログラミング(158)ARM64(AArach64)SIMD要素毎FMUL” の続きを読む

ぐだぐだ低レベルプログラミング(157)ARM64(AArach64)SIMD 要素毎MUL

elemEC
Joseph Halfmoon

前回、SIMDレジスタの全要素に、別なSIMDレジスタの1要素を乗じる形の命令を練習しました。この「全要素に他方の一要素を共通で掛け算」する系統の命令は実に33種あり(前回の3種含む)、忘却力の老人が覚えきれるものではありませぬ。そこで今回は一覧表を作って「整理」してみたのだけれど、ダメだ、こんがらがる。。。

“ぐだぐだ低レベルプログラミング(157)ARM64(AArach64)SIMD 要素毎MUL” の続きを読む