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

ぐだぐだ低レベルプログラミング(125)ARM64(AArach64)LD3、デインタリーブ

LD3_deinterleaving
Joseph Halfmoon

前回までベクトルロード/ストアは「1要素」のLD1/ST1命令使ってました。しかしA64の命令セットには1要素から4要素まで、ロードはLD1からLD4、ストアはST1からST4まであるのです。今回はLD3命令を使って「3要素」のときの動作を確認してみます。キーワードは de-interleaving とな。
“ぐだぐだ低レベルプログラミング(125)ARM64(AArach64)LD3、デインタリーブ” の続きを読む

ぐだぐだ低レベルプログラミング(124)ARM64(AArach64)ST1、ベクトルストア

fld1st1s
Joseph Halfmoon

前回はLD1命令を練習。1ストラクチャが1要素の一番「シンプル」なベクトルロード命令です。今回はLD1と対になるST1命令をつかってベクトルストアを練習してみます。ベクトルロードしたものを即ストア。折角なので前回未使用だったポスト・インデックス・アドレシングも使用。「シンプル」といいながら1命令の動作がデッカイドー。

“ぐだぐだ低レベルプログラミング(124)ARM64(AArach64)ST1、ベクトルストア” の続きを読む

ぐだぐだ低レベルプログラミング(123)ARM64(AArach64)LD1、ベクトルロード

fld1_EC
Joseph Halfmoon

ついにSIMDレジスタへのベクトルロード命令へと進出?いたしました。4命令LD1、LD2、LD3、LD4と並んでいるうち、今回は最初のLD1を動かしてみたいと思います。「1」なんて簡単だろ~と思うなかれ。相手はベクトルっす。メンドイ奴らです。その上、ロードされた様子を観察するだけでも一苦労(特に老眼の目には) “ぐだぐだ低レベルプログラミング(123)ARM64(AArach64)LD1、ベクトルロード” の続きを読む

ぐだぐだ低レベルプログラミング(123)ARM64(AArach64)LDNP/STNP

fldnpEC
Joseph Halfmoon

前回はレジスタ・ペアをロード/ストアするLDPとSTP命令を練習しました。今回のLDNP/STNP、「表向きの機能」はLDPとSTPとクリソツです。アドレシングモードが少ないことを除けば見分けがつきません。しかしこの命令の真の機能は無駄にキャッシュラインをアサインしないことにあります。確かめるのはムツカシーです。

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

ぐだぐだ低レベルプログラミング(122)ARM64(AArach64)LDP/STP

FLDP_asm_EC
Joseph Halfmoon

似たような命令を何度も練習しているのも、A64の命令が多すぎるからと同じ文句を垂れてます。今回は浮動小数/SIMD(スカラー扱い)レジスタの「ペア」を一度にロード、ストアするLDP命令とSTP命令です。この命令とは別に複数レジスタを一度にロードできるベクトルロード、ストアもあるのだけれども、また後で。

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

ぐだぐだ低レベルプログラミング(121)ARM64(AArach64)LDUR/STUR

FLDUR_STUR_EC
Joseph Halfmoon

今回も「A64の命令多すぎ」感を醸し出す命令であります。浮動小数とSIMD(スカラー扱い)レジスタに対するロード、ストア命令の「一翼を担う」LDUR/STUR命令です。似たアドレシングモードはLDR/STRでも使えるのだけれども、ちょっと違うんだと。Armの八方美人的体質の成せる技?あれば使ってしまうの道理かと。

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

ぐだぐだ低レベルプログラミング(120)ARM64(AArach64)Floatのストア#1

FSTR_EC
Joseph Halfmoon

ロードあればストアあり。前回前々回と浮動小数とSIMD(スカラー)のロード命令(LDR)を練習してみました。今回は対になるストア命令(STR)の練習です。ほぼ同様なアドレシングモードが使用できますが、唯一PC相対だけはありません。PC相対で指定できるのは”.TEXT”セグメントと解釈されるのでストアは対象外っと。

“ぐだぐだ低レベルプログラミング(120)ARM64(AArach64)Floatのストア#1” の続きを読む