
前回、前々回とA64のSIMD命令のうちソースオペランドを2つ取る演算命令の2タイプを練習しました。今回はソースオペランドを一つだけとる演算命令の代表選手?FSQRTです。前にもそんなこと書いた気がするな。デジャヴか記憶の混濁か?SIMD命令はとっても数が多いので「各パターン」せめて一種類くらいは練習しておこうと。 “ぐだぐだ低レベルプログラミング(129)ARM64(AArach64)FSQRT(ベクトル)” の続きを読む
デバイス作る人>>デバイス使う人>>デバイスおたく
前回、前々回とA64のSIMD命令のうちソースオペランドを2つ取る演算命令の2タイプを練習しました。今回はソースオペランドを一つだけとる演算命令の代表選手?FSQRTです。前にもそんなこと書いた気がするな。デジャヴか記憶の混濁か?SIMD命令はとっても数が多いので「各パターン」せめて一種類くらいは練習しておこうと。 “ぐだぐだ低レベルプログラミング(129)ARM64(AArach64)FSQRT(ベクトル)” の続きを読む
前回からA64のベクトル(SIMD)演算命令に入ってます。今回は、はやくも「核心」的なSIMDの積和算を練習してみます。なんでSIMD使うのかと問われれば半分くらいは積和したいから、ということになるんじゃないかと思うからです。SIMD積和算にも浮動小数、整数の両方あるのですが今回は単精度浮動小数のみ。手抜き。
“ぐだぐだ低レベルプログラミング(128)ARM64(AArach64)FMLA、ベクトル積和” の続きを読む
前回までベクトルロード/ストアは「1要素」のLD1/ST1命令使ってました。しかしA64の命令セットには1要素から4要素まで、ロードはLD1からLD4、ストアはST1からST4まであるのです。今回はLD3命令を使って「3要素」のときの動作を確認してみます。キーワードは de-interleaving とな。
“ぐだぐだ低レベルプログラミング(125)ARM64(AArach64)LD3、デインタリーブ” の続きを読む
ついにSIMDレジスタへのベクトルロード命令へと進出?いたしました。4命令LD1、LD2、LD3、LD4と並んでいるうち、今回は最初のLD1を動かしてみたいと思います。「1」なんて簡単だろ~と思うなかれ。相手はベクトルっす。メンドイ奴らです。その上、ロードされた様子を観察するだけでも一苦労(特に老眼の目には) “ぐだぐだ低レベルプログラミング(123)ARM64(AArach64)LD1、ベクトルロード” の続きを読む
前回はレジスタ・ペアをロード/ストアするLDPとSTP命令を練習しました。今回のLDNP/STNP、「表向きの機能」はLDPとSTPとクリソツです。アドレシングモードが少ないことを除けば見分けがつきません。しかしこの命令の真の機能は無駄にキャッシュラインをアサインしないことにあります。確かめるのはムツカシーです。
前回より浮動小数点レジスタおよびSIMDレジスタのスカラーに関するメモリからのロード命令の練習を始めました。何度も書いているようにA64の命令も多すぎなら、アドレシング・モードも多すぎ(個人の感想です。)下手をするとオペランドのビット幅のバリエーションが多い分、整数ロード命令より組み合わせ多いんでないの。
ようやく浮動小数の「スカラー演算」命令をあらかた舐めたので次はSIMD命令と思いました。しかし「浮動小数およびSIMDの」ロード・ストア命令の練習を挟んでおきたいと思います。ロード、ストア無にはSIMDの威力も半減以下と。ロード、ストア命令自体は以前やった整数のロード、ストアの以下同文。それでもいろいろありすぎA64。
“ぐだぐだ低レベルプログラミング(118)ARM64(AArach64)Floatのロード#1” の続きを読む
前回FCMP命令を練習したので「そこへの道が開いた」のがFCSEL命令であります。比較結果(条件フラグ)に基づいて「ソース1」をデスティネーションに書き込むのか「ソース2」を書き込むのか実行するもの。C言語の3項演算子みたいなものですが、肝心の条件比較は先行する命令、FCMPかCMP(整数比較)などにお任せです。
“ぐだぐだ低レベルプログラミング(117)ARM64(AArach64)FCSEL” の続きを読む