
AArch64(ARM Architecture 64-bit)またはARM64は、ARMアーキテクチャの64ビット命令セットである。
最初に、ARMv8-Aとして導入された。Armは毎年新しい拡張機能をリリースしている。
ARMv8-Aから採用されたAArch64アーキテクチャでは、汎用レジスタが全て64ビットとなり、レジスタの数も16個から31個に増加している。サーバ用途を考慮して、仮想化支援命令や暗号支援命令が追加され、SIMD拡張命令であるNEONも大幅に強化されている。
汎用レジスタの増加と64ビット化に伴い、命令セットは完全に再定義されている。コード効率を重視し、命令長は32ビットのままに保たれ、32ビットARMの特徴であった条件付き実行命令の大半は削除された。これにより、一般的なRISC命令セットに近づいたが、依然としてコードサイズを小さくするための工夫が随所に施されている。
AArch64モードにおける命令セットはA64と呼ばれ、その特徴は以下の通りである。
即値シフト付きオペランドは、従来の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ビットに符号/ゼロ拡張するバージョンが用意されている。
汎用レジスタは64ビット幅であるが、多くの演算命令にはレジスタの下位32ビットのみを参照する32ビット命令が用意されている。この場合、レジスタの部分書き換えが発生しないように、演算結果の32ビットの値は暗黙のゼロ拡張が行われた上で64ビットレジスタに格納される。
A64命令セットでは、従来のVFPとAdvanced SIMD(NEON)が統合され、1つの命令体系となった。これにより、名称はAdvanced SIMD and Floating-point命令と呼ばれるようになった。
主な変更点は、倍精度浮動小数点演算への対応、IEEE754への準拠、レジスタ本数の増加の3点である。レジスタについては、128ビットのレジスタが32本に増加しており、依然として64ビットレジスタとしてアクセスすることも可能であるが、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、Arm Neoverse V1(AWS Graviton3)などで実装されている。次の特徴がある。
Scalable Vector Extension 2 (SVE2) は、Armv9.0-Aで追加されたSIMD命令セット。SVEを発展させて汎用化し、Advanced SIMD (NEON)のスーパーセットとなった。SVEとは異なり、SVE2はArmv9-Aでは実装が必須となり、Arm Cortex-X2等で実装されている。ただし、Arm Cortex-X2, X3, X4, Neoverse V2で採用しているベクトル長はAdvanced SIMDと同じく128ビットで、特に長くはしていない。
Scalable Matrix Extension (SME) は、Armv9.2-Aで追加されたSIMD命令セット。Scalable Vector Extension は(1次元)ベクトルを対象とするのに対して、Scalable Matrix Extension は(2次元)行列を対象とする。Apple M4等で実装されていて、Apple M4はベクトル長として512ビットを採用。
Scalable Matrix Extension 2 (SME2) は、Armv9.3-Aで追加されたSIMD命令セット。Arm C1 CPU などで実装されている。
Scalable Matrix Extension 2.1 (SME2.1) は、Armv9.4-Aで追加されたSIMD命令セット。
2011年10月に発表された Armv8-Aは、ARMアーキテクチャの根本的な変化を示した。これは、「AArch64」という名前のオプションの64ビットアーキテクチャと、関連する新しい「A64」命令セットを追加した。AArch64は、既存の32ビットアーキテクチャ("AArch32"/ARMv7-A)および命令セット("A32")とのユーザースペース互換性を提供する。16ビットのThumb命令セットは「T32」と呼ばれ、64ビットの命令セットがない。Armv8-Aを使用すると、32ビットアプリケーションを64ビットOSで実行し、32ビットOSを64ビットハイパーバイザーの制御下に置くことができる。ARMは、2012年10月30日にCortex-A53およびCortex-A57コアを発表した。
Appleは、消費者向け製品(iPhone 5s)でArmv8-A互換コア(Cyclone)を最初にリリースした。AppliedMicroは、シリコンチップ化される前のArmv8-A アーキテクチャをFPGAに構築し、64ビットLinuxを実行する最初のデモを行った。Samsungの最初のArmv8-A SoCは、Galaxy Note 4で使用されているExynos 5433であり、big.LITTLE構成の4つのCortex-A57コアとCortex-A53コアの2つのクラスターを備えている。ただし、AArch32モードでのみ実行される。
AArch32とAArch64の両方に対して、Armv8-AはVFPv3/v4とAdvanced SIMD (NEON)を標準としている。また、AES、SHA-1/SHA-256、および有限体演算をサポートする暗号化命令も追加する。
拡張:データ収集のヒント(Armv8.0-DGH)
AArch64はArmv8-Aで導入され、後続のバージョンに含まれている。AArch64は、Armv8-Aへの導入後にオプションとしてArmv8-Rにも導入された。Armv8-Mには含まれていない。
A64命令は以下の表のビットアサインに基づいてエンコードされる。命令はグルーピングされており、主にビット25から28が命令の所属グループを表現している。
| タイプ | ビット | |||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 予約 | 0 | op0 | 0000 | op1 | ||||||||||||||||||||||||||||
| SME命令 | 1 | op0 | 0000 | op1 | op2 | op3 | ||||||||||||||||||||||||||
| 未割当 | 0001 | |||||||||||||||||||||||||||||||
| SVE命令 | op0 | 0010 | op1 | op2 | op3 | op4 | ||||||||||||||||||||||||||
| 未割当 | 0011 | |||||||||||||||||||||||||||||||
| データ処理(即値) | 100 | op0 | ||||||||||||||||||||||||||||||
| 分岐/例外生成/システム命令 | op0 | 101 | op1 | op2 | ||||||||||||||||||||||||||||
| ロード・ストア命令 | op0 | 1 | op1 | 0 | op2 | op3 | op4 | |||||||||||||||||||||||||
| データ処理(レジスタ) | op0 | op1 | 101 | op2 | op3 | |||||||||||||||||||||||||||
| データ処理(浮動小数/SIMD) | op0 | 111 | op1 | op2 | op3 | |||||||||||||||||||||||||||
2014年12月、「v8.0を超える増分メリット」をもたらすアップデートであるArmv8.1-Aが発表された。拡張機能は2つのカテゴリ、すなわち命令セットの変更、および例外モデルとメモリ変換の変更に分類される。
命令セットの機能強化には、次のものが含まれる。
例外モデルとメモリ変換システムの機能強化には、次のものが含まれる。
2016年1月、Armv8.2-Aが発表された。その機能強化は、次の4つのカテゴリに分類される。
スケーラブルベクター拡張機能(SVE)は、特にハイパフォーマンスコンピューティングの科学的ワークロードのベクトル化のために開発された「Armv8.2-Aアーキテクチャ以降のオプションの拡張機能」である。この仕様では、128から2048ビットの可変ベクトル長を実装できる。当初は、この拡張機能は、NEON拡張機能を補完するものであり、これに置き換わるものではなかったが、SVE2からはNEONのスーパーセットとなった。
512ビットのSVEの一種は、富士通A64FX ARMプロセッサを使用して富岳スーパーコンピュータに実装されている。富岳は、2021年に本格稼働を開始し、当時世界最高性能のスーパーコンピュータとなった。
SVEはGCCコンパイラによってサポートされており、GCC 8は自動ベクトル化をサポートし、GCC10はC組み込み関数をサポートしている。2020年7月の時点で、LLVMとclangはCとIRの組み込み関数をサポートしている。ARM独自のLLVMフォークは、自動ベクトル化をサポートしている。
2016年10月、Armv8.3-Aが発表された。その機能強化は6つのカテゴリに分類される。
Armv8.3-Aアーキテクチャは(少なくとも)GCC7コンパイラでサポートされるようになった。
2017年11月、Armv8.4-Aが発表された。この拡張機能は次のカテゴリに分類される。
2018年9月、Armv8.5-Aが発表された。その拡張機能は次のカテゴリに分類される。
2019年8月2日、GoogleはAndroidがMemory Tagging Extension(MTE)を採用すると発表した。
2021年3月、Armv9-Aが発表された。Armv9-Aのベースラインは、Armv8.5のすべての機能である。Armv9-Aは以下も追加している。
2019年9月、Armv8.6-Aが発表された。その拡張機能は次のカテゴリに分類される。
たとえば、きめ細かいトラップ、Wait-for-Event(WFE)命令、EnhancedPAC2、FPACなどがある。SVEおよびNEONのBfloat16拡張機能は、主に深層学習で使用するためのものである。
2020年9月、Armv8.7-Aが発表された。
2021年9月、Armv8.8-AおよびArmv9.3-Aが発表された。
2022年9月、ARMv8.9-AとARMv9.4-Aが発表された。
2023年10月、ARMv9.5-Aが発表された。
2024年10月、ARMv9.6-Aが発表された。
2025年9月、ARMv9.7-Aが発表された。
オプションのAArch64サポートがArmv8-Rプロファイルに追加され、最初のARMコアがCortex-R82を実装した。A64命令セットが追加され、メモリバリア命令にいくつかの変更が加えられている。