単精度の浮動小数点演算はNEONでも実行可能であるが、倍精度の浮動小数点演算やIEEE754準拠の4つの丸めモード、非正規化数のサポート等はNEONには存在しないため、これらを利用したい場合はVFP命令を使う必要がある。 ARMv8-Aから採用。ARMの64ビットモードアーキテクチャAArch64では、汎用レジスタはすべて64ビットとなり、数も16個から31個に増やされる。サーバ用途も意識して仮想化支援命令および暗号支援命令が追加され、SIMD拡張命令であるNEONも大幅に強化される。 汎用レジスタの増加と64ビット化に伴い、命令セットは完全に再定義されている。コード効率を重視して命令長は32ビットのままで、32ビットARMの特徴であった条件付き実行命令の大半が削除される。これによって一般的なRISC命令セットに近くなったが、依然としてコードサイズを小さくするための工夫が随所に織り込まれている。 AArch64モードにおける命令セットはA64と呼ばれ、以下にA64命令セットの特徴を示す。 汎用レジスタは64ビット幅であるが、多くの演算命令にはレジスタの下位32ビットのみを参照する32ビット命令が用意されている。この場合、レジスタの部分書き換えが発生しないように、演算結果の32ビットの値は暗黙のゼロ拡張が行われた上で64ビットレジスタに格納される。 A64命令セットにおいては従来のVFPとAdvanced SIMD (NEON) は統合され、一つの命令体系となった。これに伴い、名称についてはAdvanced SIMD and Floating-point命令と呼ばれるようになった。 主な変更点は倍精度浮動小数点演算への対応、IEEE754への準拠、レジスタ本数の増加の3点である。レジスタについては128ビットのレジスタが32本に増加している。依然として64ビットレジスタとしてアクセスすることも可能であるが、32ビットモードとは異なり、64ビットレジスタは128ビットレジスタの下位64ビットにマッピングされている。 VFPとAdvanced SIMDの統合に伴い、従来はVFPが担っていたスカラの浮動小数点演算命令は、SIMDレジスタのうち下位の32/64ビットにのみ作用する命令として再定義されている。例えば浮動小数点加算命令については fadd s2, s1, s0 ; s2 <= s0 + s1(単精度スカラ) fadd d2, d1, d0 ; d2 <= d0 + d1(倍精度スカラ) fadd v2.4s, v1.4s, v0.4s ; [v2] <= [v0] + [v1](単精度x4 SIMD) fadd v2.2d, v1.2d, v0.2d ; [v2] <= [v0] + [v1](倍精度x2 SIMD) のようなバリエーションが命令のニーモニックを保ちつつ、オペランドのプレフィックス (s, d, v) とサフィックスを変更することによって記述可能になっている(サフィックスについては、一部の環境向けのアセンブラではニーモニック側に付加する省略記法も許されるようである)。これはx86プロセッサのSSE命令セットがスカラ命令とSIMD命令の双方を備えているのとよく似ている。 Scalable Vector Extension (SVE) は、Armv8.2-Aで追加されたSIMD命令セット。富岳に使われたA64FXなどで実装されている[39]。次の特徴がある[39]。 Scalable Vector Extension 2 (SVE2) は、Armv9.0-Aで追加されたSIMD命令セット[40]。SVEを発展させて汎用化し[41]、Advanced SIMD (NEON)のスーパーセットとなった[42]。ARM Cortex-X2等で実装されている[43]。ただし、ARM Cortex-X2, X3, X4, Neoverse V2で採用しているベクトル長はAdvanced SIMDと同じく128ビットで、特に長くはしていない[44][45][46][47]。 Scalable Matrix Extension (SME) は、Armv9.2-Aで追加されたSIMD命令セット。Scalable Vector Extension は(1次元)ベクトルを対象とするのに対して、Scalable Matrix Extension は(2次元)行列を対象とする[48]。Apple M4等で実装されていて[49]、Apple M4はベクトル長として512ビットを採用[50]。 Scalable Matrix Extension 2 (SME2) は、Armv9.4-Aで追加されたSIMD命令セット。[51]
64ビットARM
命令セットの特徴
即値シフト付きオペランド
これは従来の32ビットARM命令セットにおいてフレキシブル第2オペランド (Flexible second operand) と呼ばれていたものに相当する。多くの基本的な演算命令においては、入力オペランドのうち1つに対する操作を即値左シフト、即値論理右シフト、即値算術右シフト、シフトなし、の4つから選択することができ、演算命令と即値シフト命令を一体化することができる。なお、従来とは異なりローテートは不可能となった。
条件付き実行命令
汎用レジスタ数が倍増したのに伴い、基本命令の多くからは条件付き実行機能が削除されたが、それでも比較的豊富な条件付き実行命令が定義されている。代表的なものを挙げるとCCMP(条件付き比較)、CINC(条件付きインクリメント)、CSEL(条件付き選択; いわゆるCMOV)等が存在する。
Compare-and-Branch命令
PC相対分岐においては、ゼロフラグを参照する場合のみであるが比較と条件分岐を1命令で行うことが可能になっている (CBZ/CBNZ)。これは従来Thumb-2命令セットでのみ定義されていたものであるが、A64モードでは基本命令として定義されている。
符号拡張/ゼロ拡張付き命令
算術演算/比較命令については、入力オペランドのうち1つを8,16,32ビットから32もしくは64ビットに符号/ゼロ拡張するバージョンが用意されている。
Advanced SIMD and Floating-point 命令
Scalable Vector Extension「AArch64」も参照
スケーラブルなベクトル長(VL)。128?2048ビットに対応する。レジスタはAdvanced SIMDと兼用で、Advanced SIMDでは下位128ビットを使用する。レジスタ数は引き続き32個。
ベクトル長に囚われない(Vector Length Agnostic; VLA)プログラミング。レジスタのビット長が異なったとしても、同一の命令でSIMD処理をすることが可能である。
ギャザー・ロードとスキャッター・ストア
レーン単位の条件付き実行制御
条件付き実行制御主導のループ制御と管理
ベクトル・パーティショニングとSW管理の投機
拡張整数および浮動小数点演算の水平方向の縮小
スカラー化内部ベクトル・サブループ
Scalable Matrix Extension「AArch64」も参照
脚注[脚注の使い方]
注釈^ ベクトルレジスタが明示的に用意されておらず、複数のスカラレジスタに対して演算を行う。ベクタ長は固定されておらず、FPSCRという特殊なレジスタで最大8要素までのベクタ長を指定可能。また、レジスタがスカラモードのみで使えるバンクとベクタモードで使えるバンクに分けられており、レジスタの組み合わせに制約がある。
Size:111 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)』
担当:undef