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

elemEC
Joseph Halfmoon

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

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

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

MULresults
Joseph Halfmoon

SIMDの「整数変換系」まだあると思ったらFRINT32X一族はARMv8.0には存在せず。ラッキー?前回で整数変換系の練習は終わりであります。そこで次の単元?に入ったですが、今度はSIMDのMUL系、まだ練習してないことに気づきました。もっとムツカシー奴らは練習していたのにシンプルなMULやってなかったのね。。。

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

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

FCVTzpm
Joseph Halfmoon

前回は浮動小数を浮動小数フォーマットのまま整数に丸めるFRINTx命令でした。今回は浮動小数を丸めて「ホンモノの」整数表現に変換してしまうFCVTxy命令です。前回は丸めモードフラグに影響される命令が2個ありましたが、今回は相当する命令はありません。命令減ったの?とみれば増えとります。変換先が2種類あるから。
“ぐだぐだ低レベルプログラミング(155)ARM64(AArach64)SIMD FCVTxy” の続きを読む

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

FRINTX_EC
Joseph Halfmoon

前回につづき今回も勝手命名「SIMD整数変換系」の命令の練習です。浮動小数値を浮動小数形式のまま整数に丸めるもの。メンドイので後回しにしたかった奴ら。浮動小数に「つきもの」の丸めモロだしです。丸めの差が見えるように入力値を選ばねばならないけれど、一部の結果はステータスフラグまで見に行かないとわかりませぬ。メンドイ。

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

ぐだぐだ低レベルプログラミング(154)ARM64(AArach64)SIMD from整数

SCVFresults
Joseph Halfmoon

前回はSIMD「整数変換系」と勝手に称して表をまとめるだけで疲れてしまい、実習なしでした。今回は実習編。整数から浮動小数への変換命令の練習です。ニーモニック的には前回の巨大な表の末尾の2個だけです。浮動小数からの変換命令がそれだけ多いということだけれども、整数からの変換にも多少は凸凹あり。それほど単純ではありませぬ。 “ぐだぐだ低レベルプログラミング(154)ARM64(AArach64)SIMD from整数” の続きを読む

ぐだぐだ低レベルプログラミング(153)ARM64(AArach64)SIMD 整数変換系

FRINTtableEC
Joseph Halfmoon

メンドクセーのでなるべく後回しにしていたのですが、やる順番です。勝手命名、SIMD「整数変換系」です。浮動小数の数値を「整数」に変換したりその逆をするもの。前回が浮動小数の数値のフォーマット変換(単精度から倍精度とか)であったのでここでやっとかないとイケない感じ。毎度のことですが叫ばざるを得ません。命令多過ぎA64と。

“ぐだぐだ低レベルプログラミング(153)ARM64(AArach64)SIMD 整数変換系” の続きを読む

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

FCVTL
Joseph Halfmoon

前回は勝手命名SIMD抽出系、SIMDの整数要素のビット幅が狭くなる命令群でした。今回はFCVTL一族です。SIMDの浮動小数要素に作用し、浮動小数フォーマットを広く、あるいは狭くするものどもです。ARMv8p0の場合、単精度と倍精度の間の変換だけなのでお気楽。でもコマケーこだわりの命令もあるよ。 “ぐだぐだ低レベルプログラミング(152)ARM64(AArach64)SIMD FCVTL” の続きを読む

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