AArch64

AArch64またはARM64は、ARMアーキテクチャの64ビット命令セットである。

最初に、Armv8-Aアーキテクチャとして導入された。Armは毎年新しい拡張機能をリリースしている。

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、およびをサポートする暗号化命令も追加する。

命名規則 
 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拡張機能を補完するものであり、これに置き換わるものではない。

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のみ）。アーキテクチャへの必須の拡張（新しいブロック暗号、に基づく）（コンパイラはセキュリティ機能を利用する必要があるが、命令は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は、現在Neonを使用しているDSPやマルチメディアSIMDコードなど、幅広いソフトウェアにこれらのメリットをもたらすことを目的とする。LLVM/Clang 9.0およびGCC 10.0開発コードは、SVE2をサポートするように更新された。
 トランザクションメモリ拡張（TME）。x86拡張機能に続いて、TMEはハードウェアトランザクションメモリ（HTM）とトランザクションロックエリジオン（TLE）のサポートを提供する。TMEは、スケーラブルな同時実行性を実現して、粗粒度のスレッドレベル並列処理（TLP）を向上させ、スレッドごとにより多くの作業を実行できるようにすることを目的としている。LLVM/Clang 9.0およびGCC 10.0開発コードは、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のみ）
 コンフィデンシャル・コンピューティング
 メモリ暗号化コンテクスト
 デバイスの割り当て

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

脚注 

64ビット・コンピュータ
命令セットアーキテクチャ
ARMアーキテクチャ