AArch64

ファイル:ARMCortexA57A53.jpg|サムネイル| ARMv8 Cortex-A57/A53 MPCore big.LITTLE CPUチップ
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ビットレジスタに格納される。

**Advanced SIMD and Floating-point 命令**
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 
のようなバリエーションが命令のニーモニックを保ちつつ、オペランドのプレフィックス (s, d, v) とサフィックスを変更することによって記述可能になっている（サフィックスについては、一部の環境向けのアセンブラではニーモニック側に付加する省略記法も許されるようである）。これはx86プロセッサのSSE命令セットがスカラ命令とSIMD命令の双方を備えているのとよく似ている。

**Scalable Vector Extension**
Scalable Vector Extension (SVE) は、Armv8.2-Aで追加されたSIMD命令セット。富岳に使われたA64FX、Arm Neoverse V1（AWS Graviton3）などで実装されている。次の特徴がある"hpcwire"。- スケーラブルなベクトル長(VL)。128～2048ビットに対応する。レジスタはAdvanced SIMDと兼用で、Advanced SIMDでは下位128ビットを使用する。レジスタ数は引き続き32個。- ベクトル長に囚われない(Vector Length Agnostic; VLA)プログラミング。レジスタのビット長が異なったとしても、同一の命令でSIMD処理をすることが可能である。- ギャザー・ロードとスキャッター・ストア- レーン単位の条件付き実行制御- 条件付き実行制御主導のループ制御と管理- ベクトル・パーティショニングとSW管理の投機- 拡張整数および浮動小数点演算の水平方向の縮小- スカラー化内部ベクトル・サブループ
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**
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.4-Aで追加されたSIMD命令セット。

**Armv8.xおよびArmv9.x拡張機能**
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、およびFinite field arithmeticをサポートする暗号化命令も追加する。

**命名規則**
 64+32ビット
** アーキテクチャ：AArch64
** 仕様：Armv8-A
** 命令セット：A64 + A32
** サフィックス：v8-A- 32 + 16（サム）ビット
** アーキテクチャ：AArch32
** 仕様：Armv8-R/ARMv7-A
** 命令セット：A32 + T32
** サフィックス：-A32/-R/v7-A
** 例：Armv8-R、Cortex-A32 

**AArch64の機能**
 新しい命令セット、A64
** 31個の汎用64ビットレジスタがある。
** 専用のゼロレジスタまたはスタックポインタ（SP）レジスタがある（命令によって異なる）。
** プログラムカウンタ（PC）は、レジスタとして直接アクセスできなくなった。
** 命令はまだ32ビット長で、ほとんどA32と同じである（LDM/STM命令とほとんどの条件付き実行が削除された）。
*** LDM/STMの代わりにロード/ストアのペアを搭載。
*** ほとんどの命令で予測を行わない（分岐予測を除く）。
** ほとんどの命令は、32ビットまたは64ビットの引数を取ることができる。
** アドレスは64ビットと見なされる。- Advanced SIMD拡張 (NEON)
** 32個の128ビットレジスタ（以前の16個から増加）があり、VFPv4からもアクセスできる。
** 倍精度浮動小数点形式をサポート。
** IEEE 754に完全に準拠。
** AES暗号化/復号およびSHA-1/SHA-2ハッシュ命令もこれらのレジスタを使用。- 新しい例外システム
** レジスタとモードのバンク切り替えが少なくなる。- 既存のLarge Physical Address Extension（LPAE）に基づく48ビット仮想アドレスから64ビットに簡単に拡張できるよう設計されたメモリ変換。
拡張：データ収集のヒント（Armv8.0-DGH）
AArch64はArmv8-Aで導入され、後続のバージョンに含まれている。AArch64は、Armv8-Aへの導入後にオプションとしてArmv8-Rにも導入された。Armv8-Mには含まれていない。

**命令エンコード**
A64命令は以下の表のビットアサインに基づいてエンコードされる。命令はグルーピングされており、主にビット25から28が命令の所属グループを表現している。

**Armv8.1-A**
2014年12月、「v8.0を超える増分メリット」をもたらすアップデートであるArmv8.1-Aが発表された。拡張機能は2つのカテゴリ、すなわち命令セットの変更、および例外モデルとメモリ変換の変更に分類される。
命令セットの機能強化には、次のものが含まれる。- AArch64アトミック読み取り/書き込み命令のセット。- 一部のライブラリ最適化の機会を可能にするためのAArch32とAArch64の両方のAdvanced SIMD命令セットへの追加：
** 符号付き飽和丸め2倍乗算積算、上位半分を返す。
** 符号付き飽和丸め2倍乗算減算、上位半分を返す。
** 命令は、ベクトル形式とスカラー形式で追加される。- 構成可能なアドレス領域に制限されたメモリアクセス順序を提供できるAArch64ロードおよびストア命令のセット。- v8.0ではオプションだったCRC命令は、Armv8.1では要件になった。
例外モデルとメモリ変換システムの機能強化には、次のものが含まれる。- 新しいPrivileged Access Never（PAN）状態ビット：明示的に有効にされていない限り、ユーザーデータへの特権アクセスを防止する制御を提供。- 仮想化のためのVMID範囲の拡大。多数の仮想マシンをサポート。- ページテーブルアクセスフラグのハードウェア更新のオプションのサポート、およびオプションのハードウェア更新されたダーティビットメカニズムの標準化。- 仮想化ホスト拡張機能（VHE）：この拡張機能は、ホストオペレーティングシステムとゲストオペレーティングシステム間の移行時に関連するソフトウェアオーバーヘッドを削減し、タイプ2ハイパーバイザーのパフォーマンスを向上する。この拡張機能により、ホストOSは実質的な変更なしにEL1ではなくEL2で実行可能。- OSがハードウェアサポートを必要としない場合に、オペレーティングシステムで使用するために一部の変換テーブルビットを解放するメカニズム。- メモリのタグ付け機能を提供するTop-byte Ignore。

**Armv8.2-A**
2016年1月、Armv8.2-Aが発表された。その機能強化は、次の4つのカテゴリに分類される。- オプションの半精度浮動小数点データ処理（半精度は以前からストレージ形式ではサポートされていたが、演算ではサポートされていなかった）。- メモリモデルの機能強化- 信頼性、可用性、および保守性の拡張（RAS拡張）の導入- 統計的プロファイリングの導入

**Scalable Vector Extension（SVE）**
スケーラブルベクター拡張機能（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フォークは、自動ベクトル化をサポートしている。

**Armv8.3-A**
2016年10月、Armv8.3-Aが発表された。その機能強化は6つのカテゴリに分類される。- ポインタ認証（AArch64のみ）。アーキテクチャへの必須の拡張（新しいブロック暗号、QARMAに基づく）（コンパイラはセキュリティ機能を利用する必要があるが、命令はNOPスペースにあるため、古いチップでは追加のセキュリティを提供しないが、下位互換性がある）。- ネストされた仮想化（AArch64のみ）- Advanced SIMDでの複素数のサポート（AArch64およびAArch32）。たとえば、90度の倍数の回転- 新しいFJCVTZS（Floating-point JavaScript Convert to Signed fixed-point, rounding toward Zero：JavaScriptの浮動小数点数を符号付き固定小数点数に変換し、ゼロ方向に丸める）命令- メモリ整合性モデルへの変更（AArch64のみ）。C++11/C11の（デフォルトではない）より弱いRCpc（Release Consistent processor consistent）モデルをサポートするため（デフォルトのC++11/C11コンシステンシー・モデルは以前のArmv8ですでにサポートされていた）- より大きなシステム可視キャッシュのIDメカニズムのサポート（AArch64およびAArch32）
Armv8.3-Aアーキテクチャは（少なくとも）GCC7コンパイラでサポートされるようになった。

**Armv8.4-A**
2017年11月、Armv8.4-Aが発表された。この拡張機能は次のカテゴリに分類される。- SHA3/SHA512/SM3/SM4暗号拡張- 改善された仮想化サポート- メモリパーティショニングおよびモニタリング（MPAM）機能- 新しいセキュアEL2状態とアクティビティモニター- 符号付きおよび符号なし整数ドット積（SDOTおよびUDOT）命令

**Armv8.5-AおよびArmv9.0-A**
2018年9月、Armv8.5-Aが発表された。その拡張機能は次のカテゴリに分類される。- Memory Tagging Extension（MTE）- 「攻撃者が任意のコードを実行する能力」を低減するための分岐ターゲットインジケータ（BTI）- 乱数ジェネレーター命令：さまざまな国内および国際規格に準拠した決定論的で真の乱数を提供する
2019年8月2日、GoogleはAndroidがMemory Tagging Extension（MTE）を採用すると発表した。
2021年3月、Armv9-Aが発表された。Armv9-Aのベースラインは、Armv8.5のすべての機能である。Armv9-Aは以下も追加している。- スケーラブルベクターエクステンション2（SVE2）。SVE2は、SVEのスケーラブルなベクトル化に基づいて構築されており、細粒度のデータレベル並列処理（DLP）を向上させ、命令ごとにより多くの作業を実行できる。SVE2は、Advanced SIMD (NEON)のスーパーセットとなり、現在NEONを使用しているDSPやマルチメディアSIMDコードなど、幅広いソフトウェアにこれらのメリットをもたらすことを目的とする。LLVM/Clang 9およびGCC 10からSVE2をサポートしている。- トランザクションメモリ拡張（TME）。x86拡張機能に続いて、TMEはハードウェアトランザクションメモリ（HTM）とトランザクションロックエリジオン（TLE）のサポートを提供する。TMEは、スケーラブルな同時実行性を実現して、粗粒度のスレッドレベル並列処理（TLP）を向上させ、スレッドごとにより多くの作業を実行できるようにすることを目的としている。LLVM/Clang 9およびGCC 10からTMEをサポートしている。- 機密コンピューティングアーキテクチャ（CCA）

**Armv8.6-AおよびArmv9.1-A**
2019年9月、Armv8.6-Aが発表された。その拡張機能は次のカテゴリに分類される。- 一般的な行列積（GEMM）- bfloat16フォーマットのサポート- SIMD行列操作命令、BFDOT、BFMMLA、BFMLAL、およびBFCVT- 仮想化、システム管理、およびセキュリティの強化- 次の拡張機能（LLVM 11ではすでにこれらの機能のサポートを追加済み）：
** 拡張カウンター仮想化（Armv8.6-ECV）
** ファイングレイントラップ（Armv8.6-FGT）
** アクティビティモニターの仮想化（Armv8.6-AMU）
たとえば、きめ細かいトラップ、Wait-for-Event（WFE）命令、EnhancedPAC2、FPACなどがある。SVEおよびNEONのBfloat16拡張機能は、主に深層学習で使用するためのものである。

**Armv8.7-AおよびArmv9.2-A**
2020年9月、Armv8.7-Aが発表された。- スケーラブルマトリックス拡張（SME）（Armv9.2のみ）。SMEは行列を効率的に処理するために、次のような新機能を追加する。
** 行列タイルストレージ
** オンザフライの行列転置
** タイルベクトルのロード/保存/挿入/抽出
** SVEベクトルの行列外積
** 「ストリーミングモード」SVE- PCIeホットプラグの拡張サポート（AArch64）- アトミックな64バイトロード/ストアでのアクセラレータへのアクセス（AArch64）- タイムアウト指定付きのWait For Instruction（WFI）およびWait For Event（WFE）（AArch64）- 分岐レコードの記録（Armv9.2のみ）

**Armv8.8-AおよびArmv9.3-A**
2021年9月、Armv8.8-AおよびArmv9.3-Aが発表された。- マスク不可能な割り込み（AArch64）- memcpy()およびmemset()スタイルの操作を最適化する命令（AArch64）- PACへの拡張機能（AArch64）- ヒント付き条件分岐（AArch64）

**Armv8.9-AおよびArmv9.4-A**
2022年9月、ARMv8.9-AとARMv9.4-Aが発表された。- 仮想メモリシステムアーキテクチャ（VMSA）の機能強化
** パーミッションインダイレクトとオーバーレイ
** translation hardening
** 128 ビット変換テーブル（ARMv9 のみ）- Scalable Matrix Extension 2 (SME2) (ARMv9のみ)
** マルチベクトル命令
** マルチベクトルpredicate
** 2b/4b のウェイト圧縮
** 1b バイナリーネットワーク
** レンジプリフェッチ- ガード付きコントロールスタック（GCS）（ARMv9のみ）- コンフィデンシャル・コンピューティング
** メモリ暗号化コンテクスト
** デバイスの割り当て

**Armv9.5-A**
2023年10月、ARMv9.5-Aが発表された。- SME2, SVE2, Advanced SIMD(NEON)での、FP8サポート（E5M2およびE4M3フォーマット）が追加された- ハードウェアを使用した仮想マシンのライブ移行 ダーティ状態追跡構造（FEAT_HDBSS） - チェックされたポイントの計算- ポインタ認証コードの生成またはチェック時に、PCとSPの組み合わせを修飾子として使用するためのサポート- レルム管理拡張（RME）のサポートは、設計を可能にし、細分化された保護テーブルでの非セキュアのみのサポート、および特定の物理アドレス空間（PAS）を無効にする機能- EL3構成の書き込みトラップ- リンクを必要としない、アドレス範囲とミスマッチトリガーのブレークポイントサポート- SErrorsをEL3からEL2またはEL1に効率的に委任するためのサポート

**Armv9.6-A**
2024年10月、ARMv9.6-Aが発表された。- 構造化されたスパースとクォータータイル操作によるSMEの効率の向上- マルチチップレットおよびマルチチップシステムで共有メモリコンピュータシステムをより適切にサポートするMPAMドメイン- 仮想マシン上のトレースと統計プロファイリングのためのハイパーバイザーメモリ制御- キャッシュとデータ配置の改善- 機密計算のための細分化されたデータ分離- EL1システムレジスタのビット単位ロック- 大規模なメモリシステム用の細分化された保護テーブル（GPT）のスケーリングの改善- 展開/コンパクトと最初/最後のアクティブ要素を見つけるための新しいSVE命令- OSがアプリケーション・メモリとやりとりできるようにするための、非特権ロード命令と非特権ストア命令の追加- 新しい比較命令と分岐命令- EL3からの未定義命令例外のインジェクション

**Armv8-R（リアルタイムアーキテクチャ）**
オプションのAArch64サポートがArmv8-Rプロファイルに追加され、最初のARMコアがCortex-R82を実装した。A64命令セットが追加され、メモリバリア命令にいくつかの変更が加えられている。

**脚注 ==