前回はLD1命令を練習。1ストラクチャが1要素の一番「シンプル」なベクトルロード命令です。今回はLD1と対になるST1命令をつかってベクトルストアを練習してみます。ベクトルロードしたものを即ストア。折角なので前回未使用だったポスト・インデックス・アドレシングも使用。「シンプル」といいながら1命令の動作がデッカイドー。
ぐだぐだ低レベルプログラミング(123)ARM64(AArach64)LD1、ベクトルロード
ついにSIMDレジスタへのベクトルロード命令へと進出?いたしました。4命令LD1、LD2、LD3、LD4と並んでいるうち、今回は最初のLD1を動かしてみたいと思います。「1」なんて簡単だろ~と思うなかれ。相手はベクトルっす。メンドイ奴らです。その上、ロードされた様子を観察するだけでも一苦労(特に老眼の目には) “ぐだぐだ低レベルプログラミング(123)ARM64(AArach64)LD1、ベクトルロード” の続きを読む
ぐだぐだ低レベルプログラミング(123)ARM64(AArach64)LDNP/STNP
前回はレジスタ・ペアをロード/ストアするLDPとSTP命令を練習しました。今回のLDNP/STNP、「表向きの機能」はLDPとSTPとクリソツです。アドレシングモードが少ないことを除けば見分けがつきません。しかしこの命令の真の機能は無駄にキャッシュラインをアサインしないことにあります。確かめるのはムツカシーです。
オプション沼(23) gcc、dangling-pointerの見つけ方、伝統的な方?
gccのオプション、バージョンアップとともに増え続けてるみたいデス。旧版コンパイラを後生大事に使用中。最新版なら存在するハズのオプションが不在なこともままあり。今回はdangling-pointerを警告するオプションでそれに遭遇しました。ま、古い版のコンパイラでも検出する手段はあり~の、ただし「ステージ」が違うっと。
ぐだぐだ低レベルプログラミング(122)ARM64(AArach64)LDP/STP
似たような命令を何度も練習しているのも、A64の命令が多すぎるからと同じ文句を垂れてます。今回は浮動小数/SIMD(スカラー扱い)レジスタの「ペア」を一度にロード、ストアするLDP命令とSTP命令です。この命令とは別に複数レジスタを一度にロードできるベクトルロード、ストアもあるのだけれども、また後で。
ぐだぐだ低レベルプログラミング(121)ARM64(AArach64)LDUR/STUR
今回も「A64の命令多すぎ」感を醸し出す命令であります。浮動小数とSIMD(スカラー扱い)レジスタに対するロード、ストア命令の「一翼を担う」LDUR/STUR命令です。似たアドレシングモードはLDR/STRでも使えるのだけれども、ちょっと違うんだと。Armの八方美人的体質の成せる技?あれば使ってしまうの道理かと。
ぐだぐだ低レベルプログラミング(120)ARM64(AArach64)Floatのストア#1
ぐだぐだ低レベルプログラミング(119)ARM64(AArach64)Floatのロード#2
前回より浮動小数点レジスタおよびSIMDレジスタのスカラーに関するメモリからのロード命令の練習を始めました。何度も書いているようにA64の命令も多すぎなら、アドレシング・モードも多すぎ(個人の感想です。)下手をするとオペランドのビット幅のバリエーションが多い分、整数ロード命令より組み合わせ多いんでないの。
ぐだぐだ低レベルプログラミング(118)ARM64(AArach64)Floatのロード#1
ようやく浮動小数の「スカラー演算」命令をあらかた舐めたので次はSIMD命令と思いました。しかし「浮動小数およびSIMDの」ロード・ストア命令の練習を挟んでおきたいと思います。ロード、ストア無にはSIMDの威力も半減以下と。ロード、ストア命令自体は以前やった整数のロード、ストアの以下同文。それでもいろいろありすぎA64。
“ぐだぐだ低レベルプログラミング(118)ARM64(AArach64)Floatのロード#1” の続きを読む
ぐだぐだ低レベルプログラミング(117)ARM64(AArach64)FCSEL
前回FCMP命令を練習したので「そこへの道が開いた」のがFCSEL命令であります。比較結果(条件フラグ)に基づいて「ソース1」をデスティネーションに書き込むのか「ソース2」を書き込むのか実行するもの。C言語の3項演算子みたいなものですが、肝心の条件比較は先行する命令、FCMPかCMP(整数比較)などにお任せです。
“ぐだぐだ低レベルプログラミング(117)ARM64(AArach64)FCSEL” の続きを読む
ぐだぐだ低レベルプログラミング(116)ARM64(AArach64)FCMP
今回はFCMP、浮動小数点数の比較命令です。前回のFMAX同様NaN(Not a Number)が絡んできます、メンドクセー。しかしそれ以前にフェイント一発かまされてます。比較結果は条件フラグに反映されるのですが、FPSR(浮動小数ステータス)に条件フラグが存在するのに、PSTATEの条件フラグに反映です。おっと。
“ぐだぐだ低レベルプログラミング(116)ARM64(AArach64)FCMP” の続きを読む
ぐだぐだ低レベルプログラミング(115)ARM64(AArach64)FMAX, FMIN
今回は2つのソースオペランドのうち大きい方を求めるFMAXと小さい方を求めるFMINです。でもね、この命令それほどシンプルでもありません。メンドクセー奴、NaN(Not a Number)がからんでくるから。2命令FMAXとFMAXNMの差はNaNのとりあつかい次第。NaNにあまり深入りせずにお楽に行きたいです。
“ぐだぐだ低レベルプログラミング(115)ARM64(AArach64)FMAX, FMIN” の続きを読む
ぐだぐだ低レベルプログラミング(114)ARM64(AArach64)FABS他
今回はFABS「他」などと省略してしまいましたが、残りはFNEGとFSQRTです。絶対値(FABS)に符号反転(FNEG)そして平方根(FSQRT)です。いずれもソース一つをとって結果ひとつをデスティネーションに返すもの。例によってARMv8.0に半精度はないので、単精度と倍精度のみ。お楽? “ぐだぐだ低レベルプログラミング(114)ARM64(AArach64)FABS他” の続きを読む
ぐだぐだ低レベルプログラミング(113)ARM64(AArach64)積和演算4種の違い
前回、浮動小数の積和演算はfused演算だということで、fused演算とそうでない計算の微妙な差を味わいました。今回は残りの積和演算命令を一気にやってみます。というか4つ並べて実行してその差をみるとようやく4個ある意味が良く分かるから。A64の命令多すぎるからさっさとやりたいというのも心の底にあり? “ぐだぐだ低レベルプログラミング(113)ARM64(AArach64)積和演算4種の違い” の続きを読む