ぐだぐだ低レベルプログラミング(139)ARM64(AArach64)SIMDsqdmulh

SDMULH_results
Joseph Halfmoon

今回練習するのは2命令、その一つのニーモニックはSQRDMULHです。マニュアルから命令の意味を引用すると「Signed saturating Rounding Doubling Multiply returning High half」です。これだけでメンドクセー奴だということだけは分かります。掛け算系の氷山の一角。

“ぐだぐだ低レベルプログラミング(139)ARM64(AArach64)SIMDsqdmulh” の続きを読む

ぐだぐだ低レベルプログラミング(138)ARM64(AArach64)SIMD sqshl

sqrshl_table
Joseph Halfmoon

毎度ですがA64の命令多すぎ。今回練習するのはSIMDのシフト命令です。符合付/符号無、サチュレーションの有無、丸めの有無で2の3乗、合計8種のニーモニックが存在します。そしてニーモニック上はLEFTと読めるので左シフトだけかと思えば「負の左シフトは右シフト」ということで右シフトも出来。でもこれだけじゃなかったんだ。

“ぐだぐだ低レベルプログラミング(138)ARM64(AArach64)SIMD sqshl” の続きを読む

ぐだぐだ低レベルプログラミング(137)ARM64(AArach64)SIMD sqadd

ADD_SQADD_UQADD
Joseph Halfmoon

前回は演算後のHavingで桁あふれに備える系統の命令を実験しました。今回はサチュレーション演算によって桁あふれしない範囲内に結果をとどめるための系統の命令を使ってみます。SQADD、UQSUBなどと命令ニーモニックの中にQを含む命令共です。しかし命令充実(A64の命令数大すぎ。)とても1回じゃ練習しきれませぬ。 “ぐだぐだ低レベルプログラミング(137)ARM64(AArach64)SIMD sqadd” の続きを読む

ぐだぐだ低レベルプログラミング(136)ARM64(AArach64)SIMD shadd

uhadd_shadd
Joseph Halfmoon

前回はチラリと代数学が出てきてビビリました。今回はビビらないで済む普通の算術っす。整数の足し算ね。でもSIMDあるあるデス。整数の足し算といっても一筋縄ではいかんのですな(勿論フツーの足し算もあるけれども。)今回は加算後に1ビット右シフトを伴う(値をだいたい半分にするということだね)一族を練習してみます。
“ぐだぐだ低レベルプログラミング(136)ARM64(AArach64)SIMD shadd” の続きを読む

ぐだぐだ低レベルプログラミング(135)ARM64(AArach64)SIMD pmul

makeANS
Joseph Halfmoon

何度も書いてますが、A64の命令、特にSIMD命令多すぎ。SIMDで普通の足し算だのはメンドイのでほぼ省略、ユニークな奴らだけ練習してます。前回はニュートン・ラフソン法にてご利益があるらしい命令をやりました。今回は多項式っす。ここを掘っていくと群、環、体などという者どもが飛び出してくること必定。ヤバイ命令だよ。
“ぐだぐだ低レベルプログラミング(135)ARM64(AArach64)SIMD pmul” の続きを読む

ぐだぐだ低レベルプログラミング(134)ARM64(AArach64)SIMD frecps

FRECPS_FRSQRTS
Joseph Halfmoon

今回練習するのは frecps 命令です。なんじゃそれ?という感じ。これぞニュートン法(ニュートン・ラフソン法)で方程式を解く(当然SIMD命令を駆使して)ときに活躍する命令なのであります。遥かなる太古の時代、大学の数値解析の授業の最初の方でニュートン法やりましたな。最近の縁の下ではこういう命令が駆使されておる、と。

“ぐだぐだ低レベルプログラミング(134)ARM64(AArach64)SIMD frecps” の続きを読む

ぐだぐだ低レベルプログラミング(133)ARM64(AArach64) SIMD bit操作

BIT_OPR_SIMDa
Joseph Halfmoon

まだSIMDのMOV命令は残っているのですが、今回はさっさと先に進みます。言ってもしょうがないけどA64の命令多すぎ。特にSIMD命令多すぎ。今回実験してみるのはSIMDのbit操作関係の命令群です。ビット操作なので要素は記述の形式的で、実際はSIMDレジスタの全ビット幅の各ビットに対して作用するもの。

“ぐだぐだ低レベルプログラミング(133)ARM64(AArach64) SIMD bit操作” の続きを読む

ぐだぐだ低レベルプログラミング(132)ARM64(AArach64)整数/SIMD間転送

ginsdupEC
Joseph Halfmoon

前回までSIMD(ベクトル)レジスタ間での転送を練習してきましたが、今回は汎用(整数)レジスタとSIMDレジスタ間での転送を練習してみます。前回も登場したINS命令とDUP命令がここでも登場します。またUMOVとかSMOVとか一味違う奴らも登場。例によってMOVはエイリアスなんだけれどここでは幅を利かせてるみたい。

“ぐだぐだ低レベルプログラミング(132)ARM64(AArach64)整数/SIMD間転送” の続きを読む

ぐだぐだ低レベルプログラミング(131)ARM64(AArach64)DUP(ベクトル)

DUP_Diagram
Joseph Halfmoon

前回は「実はA64のSIMD(ベクトル)命令にMOVなんてない」の回でした。今回はMOVじゃないけどMOVする命令があるの回です。INSとDUP。INSは前回の復習になりますが、DUPはSIMD計算するときにゃゼッテー欲しくなる操作です。ただ同じエレメントを並べるだけなんだけれども。無かったらどうして良いか分からない?
“ぐだぐだ低レベルプログラミング(131)ARM64(AArach64)DUP(ベクトル)” の続きを読む

ぐだぐだ低レベルプログラミング(130)ARM64(AArach64)MOV(ベクトル)

movv_diag
Joseph Halfmoon

前回のSIMD命令はソースオペランド1個をとって計算結果をデスティネーション1個に格納するパターン。このパターンの一番シンプルなものはMOVですな。勿論、SIMD(ベクトル)命令にもMOVというニーモニックは「有り」です。しかし、エイリアスが久しぶりの登場。「MOVはエイリアスなので実はMOV命令など無い」、なんと。
“ぐだぐだ低レベルプログラミング(130)ARM64(AArach64)MOV(ベクトル)” の続きを読む

ぐだぐだ低レベルプログラミング(129)ARM64(AArach64)FSQRT(ベクトル)

fsqrtvDiagram
Joseph Halfmoon

前回前々回とA64のSIMD命令のうちソースオペランドを2つ取る演算命令の2タイプを練習しました。今回はソースオペランドを一つだけとる演算命令の代表選手?FSQRTです。前にもそんなこと書いた気がするな。デジャヴか記憶の混濁か?SIMD命令はとっても数が多いので「各パターン」せめて一種類くらいは練習しておこうと。 “ぐだぐだ低レベルプログラミング(129)ARM64(AArach64)FSQRT(ベクトル)” の続きを読む

ぐだぐだ低レベルプログラミング(128)ARM64(AArach64)FMLA、ベクトル積和

FMLAvDiag
Joseph Halfmoon

前回からA64のベクトル(SIMD)演算命令に入ってます。今回は、はやくも「核心」的なSIMDの積和算を練習してみます。なんでSIMD使うのかと問われれば半分くらいは積和したいから、ということになるんじゃないかと思うからです。SIMD積和算にも浮動小数、整数の両方あるのですが今回は単精度浮動小数のみ。手抜き。
“ぐだぐだ低レベルプログラミング(128)ARM64(AArach64)FMLA、ベクトル積和” の続きを読む

ぐだぐだ低レベルプログラミング(127)ARM64(AArach64)FSUB、ベクトル減算

fsubDiag
Joseph Halfmoon

前回A64のベクトルロード命令をあらかた終えたつもり。今回からA64のベクトル(SIMD)演算命令に入ってまいりたいと思います。その初回はFSUBです。3オペランドの「典型的」演算かつ、ソースの順序に依存する命令ということでの「起用」であります。でも以前にもFSUBというニーモニック自体は使ってるんでないかい?

“ぐだぐだ低レベルプログラミング(127)ARM64(AArach64)FSUB、ベクトル減算” の続きを読む

ぐだぐだ低レベルプログラミング(126)ARM64(AArach64)LD1R、レプリケート

LD1Rreplicate
Joseph Halfmoon

前回のキモは「デ・インタリーブ」でしたが、今回は「レプリケーション」です。同じ要素を全てのレーンに複製して書き込むもの。前回の「デ・インタリーブ」が要素の個数に応じてLD1からLD4まで4通りあったのと同様、今回もLD1RからLD4Rまで4通りの命令が存在します。SIMD計算するときには「アリガチ」な操作ね。

“ぐだぐだ低レベルプログラミング(126)ARM64(AArach64)LD1R、レプリケート” の続きを読む