ぐだぐだ低レベルプログラミング(151)ARM64(AArach64)SIMD 抽出系

xtn
Joseph Halfmoon

前回はSIMD要素のビット幅が倍になる勝手命名「拡張系」の皆さんでした。今回はSIMD要素のビット幅が半分になる勝手命名「抽出系」の皆さんです。逆方向だから前回の逆で4命令かと思えば、倍の8命令もあります。サチュレーションとかいろいろあるのよ抽出系。符号もちょいと捻くれたものもあるし。それにしても命令多過ぎA64。
“ぐだぐだ低レベルプログラミング(151)ARM64(AArach64)SIMD 抽出系” の続きを読む

ぐだぐだ低レベルプログラミング(150)ARM64(AArach64)SIMD 拡張系

sxtl_uxtl
Joseph Halfmoon

今回練習するのはSIMDの符号拡張、ゼロ拡張命令です。ソースの整数要素のビット幅を符号拡張またはゼロ拡張により倍幅にするもの。勝手に「拡張系」とグループ化。しかしてその実体は、だいぶ以前に練習済のSIMDのシフト命令です。「拡張系」はシフト命令のエイリアス、幻ってことかい?拡張するときはこっちの方が分かり易いですけど。

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

ぐだぐだ低レベルプログラミング(149)ARM64(AArach64)SIMD 逆数系

recpeResults
Joseph Halfmoon

前回は、御勝手命名「SIMD 反転系」でした。今回は同じく勝手命名「逆数系」です。反転とか逆数とか逆らってばかりだな。なんで逆数とるのと問われれば、割り算命令が無いから、と。除算は大変な割に使わないからね、逆数の掛け算で代えさせていただきますってか。でも逆数といっても「だいたい」です。後はニュートン法で精度を出せと。 “ぐだぐだ低レベルプログラミング(149)ARM64(AArach64)SIMD 逆数系” の続きを読む

ぐだぐだ低レベルプログラミング(148)ARM64(AArach64)SIMD 反転系

simd_rev
Joseph Halfmoon

前回はSIMDの絶対値や符号反転命令を「符合系」などとまとめました。今回は「反転系」などと勝手に分類。ビットの値の「反転」、バイト内のビット順の「反転」、要素順の「反転」をまとめて練習してみます。今回も地味な命令がつづくなあ。でもどれも有れば便利、無いとメンドイものばかり。ハマりどころで活躍、そうでないとこではスルー?

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

ぐだぐだ低レベルプログラミング(147)ARM64(AArach64)SIMD 符号系

abs_neg_EC
Joseph Halfmoon

前回はSIMDのビットカウント系命令を練習しました。今回はSIMDの符号操作系命令です。地味な命令が続くな~。今回対象は6命令です。整数と浮動小数、絶対値とネゲート、その組み合わせだけだったら4命令じゃん。残りの2つは何?何を隠そう整数型には「サインド・サチューレーティング」があるのよ、なんじゃらほい。
“ぐだぐだ低レベルプログラミング(147)ARM64(AArach64)SIMD 符号系” の続きを読む

ぐだぐだ低レベルプログラミング(146)ARM64(AArach64)SIMD カウント系

cntResults
Joseph Halfmoon

前回ようやく2要素を演算した結果の要素のビット幅が変わる奴らをやっつけ終えました。今回から1要素を処理して1要素が得られる系統の命令に入ります。ともかく命令数が多いのでコマケー話は踏みつぶしてサッサと通り過ぎたい気でいるのですがどうなることか。その初回は「カウント系」です。クセさえ分かればどおってことない。ホントか?
“ぐだぐだ低レベルプログラミング(146)ARM64(AArach64)SIMD カウント系” の続きを読む

ぐだぐだ低レベルプログラミング(145)ARM64(AArach64)SIMD ビット幅変4

wnmulResults
Joseph Halfmoon

SIMD要素のビット幅が変化する命令群の練習の最後は乗算系です。今まで練習してきた加算系、減算系と異なり、ビット幅が狭くなる方向の命令はありません。そして広くなる方向にWideとLongの2種類の区別があるとかもありません。だから命令数少ないかと言ったらそうはいかないA64です。18個とな。命令多過ぎA64。

“ぐだぐだ低レベルプログラミング(145)ARM64(AArach64)SIMD ビット幅変4” の続きを読む

ぐだぐだ低レベルプログラミング(144)ARM64(AArach64)SIMD ビット幅変3

uabalResults
Joseph Halfmoon

前回前々回でSIMD要素のビット幅が狭く(narrow)なる、広く(wide/long)なる命令群のうち「加算系」を練習してみました。加算あれば減算あり、とは言え加算命令群と「対称な」減算命令群ならパスしても良いのでは?と思ったら「減算系」には差を取った後、絶対値をとる命令群もあるのです。命令多過ぎA64。

“ぐだぐだ低レベルプログラミング(144)ARM64(AArach64)SIMD ビット幅変3” の続きを読む

ぐだぐだ低レベルプログラミング(143)ARM64(AArach64)SIMD ビット幅変2

uaddwl_saddwl
Joseph Halfmoon

前回は、SIMD要素のビット幅が狭く(narrow)なる、広く(wide/long)なる命令の転送パターンを整数加算を例にいくつか練習してみました。今回は、丸め有/丸め無、符合付/符号無、各種組み合わせを練習してみます。題材は整数加算のみなんだけれども。いったいどんだけ組み合わせがあるんじゃ。つくづく命令多過ぎA64。

“ぐだぐだ低レベルプログラミング(143)ARM64(AArach64)SIMD ビット幅変2” の続きを読む

ぐだぐだ低レベルプログラミング(142)ARM64(AArach64)SIMD ビット幅変?

ADDHN_FIG
Joseph Halfmoon

前回前々回とA64のSIMD比較命令を練習。今回から要素のビット幅が「変わる」SIMD算術演算命令に入ります。通常のSIMD命令は要素のビット幅は不変なのでコイツ等はちょっと変わり者です。しかし変わり者といえどフツーにひと揃いの演算が含まれております。命令多過ぎA64。いったい何個あるんじゃあ。

“ぐだぐだ低レベルプログラミング(142)ARM64(AArach64)SIMD ビット幅変?” の続きを読む

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

typeDef
Joseph Halfmoon

前回に続きSIMDの比較命令の練習です。今回は浮動小数型。条件一致すればオール1、不一致でオール0が結果です。いつもの通りA64の命令多すぎ、と書いておきます。前回の整数型であったビット比較が無くなって1個減ったと思ったら、絶対値比較が2個も増えている。かえって練習するパターン増だと。流石だなA64。

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

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

cmge_cmgt_cmhi_cmhs
Joseph Halfmoon

今回練習するのはSIMDの比較命令です。スカラー同士の比較であれば分岐のためですが、SIMDの場合は各要素の計算を「通すか否か」のマスク的なものの生成。今回対象は浮動小数比較でなく整数のみですが、いつものとおりA64の命令多すぎ。便利そうな命令は網羅するのがArmの行き方か。ミニマリストではないわいな。多分。

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

ぐだぐだ低レベルプログラミング(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” の続きを読む