AArch64

AArch64またはARM64は、ARMアーキテクチャの64ビット命令セットである。 最初に、Armv8-Aアーキテクチャとして導入された。Armは毎年新しい拡張機能をリリースしている。

1. Armv8.xおよびArmv9.x拡張機能
------------------------

2011年10月に発表された Armv8-Aは、ARMアーキテクチャの根本的な変化を示した。これは、「AArch64」という名前のオプションの64ビットアーキテクチャと、関連する新しい「A64」命令セットを追加した。AArch64は、既存の32ビットアーキテクチャおよび命令セットとのユーザースペース互換性を提供する。16ビットのThumb命令セットは「T32」と呼ばれ、64ビットの命令セットがない。Armv8-Aを使用すると、32ビットアプリケーションを64ビットOSで実行し、32ビットOSを64ビットハイパーバイザーの制御下に置くことができる。ARMは、2012年10月30日にCortex-A53およびCortex-A57コアを発表した。

Appleは、消費者向け製品でArmv8-A互換コアを最初にリリースした。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 を標準としている。また、AES、SHA-1/SHA-256、および有限体演算をサポートする暗号化命令も追加する。

1.1. 命名規則
---------

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

1.2. AArch64の機能
---------------

新しい命令セット、A64
31個の汎用64ビットレジスタがある。
専用のゼロレジスタまたはスタックポインタレジスタがある。
プログラムカウンタは、レジスタとして直接アクセスできなくなった。
命令はまだ32ビット長で、ほとんどA32と同じである。
LDM/STMの代わりにロード/ストアのペアを搭載。
ほとんどの命令で予測を行わない。
ほとんどの命令は、32ビットまたは64ビットの引数を取ることができる。
アドレスは64ビットと見なされる。
Advanced SIMD拡張 
32個の128ビットレジスタがあり、VFPv4からもアクセスできる。
倍精度浮動小数点形式をサポート。
IEEE 754に完全に準拠。
AES暗号化/復号およびSHA-1/SHA-2ハッシュ命令もこれらのレジスタを使用。
新しい例外システム
レジスタとモードのバンク切り替えが少なくなる。
既存のLarge Physical Address Extensionに基づく48ビット仮想アドレスから64ビットに簡単に拡張できるよう設計されたメモリ変換。拡張：データ収集のヒント

AArch64はArmv8-Aで導入され、後続のバージョンに含まれている。AArch64は、Armv8-Aへの導入後にオプションとしてArmv8-Rにも導入された。Armv8-Mには含まれていない。

1.2.1. 命令エンコード
--------------

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



1.3. 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状態ビット：明示的に有効にされていない限り、ユーザーデータへの特権アクセスを防止する制御を提供。
仮想化のためのVMID範囲の拡大。多数の仮想マシンをサポート。
ページテーブルアクセスフラグのハードウェア更新のオプションのサポート、およびオプションのハードウェア更新されたダーティビットメカニズムの標準化。
仮想化ホスト拡張機能：この拡張機能は、ホストオペレーティングシステムとゲストオペレーティングシステム間の移行時に関連するソフトウェアオーバーヘッドを削減し、タイプ2ハイパーバイザーのパフォーマンスを向上する。この拡張機能により、ホストOSは実質的な変更なしにEL1ではなくEL2で実行可能。
OSがハードウェアサポートを必要としない場合に、オペレーティングシステムで使用するために一部の変換テーブルビットを解放するメカニズム。
メモリのタグ付け機能を提供するTop-byte Ignore。

1.4. Armv8.2-A
--------------

2016年1月、Armv8.2-Aが発表された。その機能強化は、次の4つのカテゴリに分類される。

オプションの半精度浮動小数点データ処理。
メモリモデルの機能強化
信頼性、可用性、および保守性の拡張の導入
統計的プロファイリングの導入

1.4.1. Scalable Vector Extension
--------------------------------

スケーラブルベクター拡張機能は、特にハイパフォーマンスコンピューティングの科学的ワークロードのベクトル化のために開発された「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フォークは、自動ベクトル化をサポートしている。

1.5. Armv8.3-A
--------------

2016年10月、Armv8.3-Aが発表された。その機能強化は6つのカテゴリに分類される。

ポインタ認証。アーキテクチャへの必須の拡張。
ネストされた仮想化
Advanced SIMDでの複素数のサポート。たとえば、90度の倍数の回転
新しいFJCVTZS命令
メモリ整合性モデルへの変更。C++11/C11のより弱いRCpcモデルをサポートするため
より大きなシステム可視キャッシュのIDメカニズムのサポートArmv8.3-AアーキテクチャはGCC7コンパイラでサポートされるようになった。

1.6. Armv8.4-A
--------------

2017年11月、Armv8.4-Aが発表されました。この拡張機能は次のカテゴリに分類される。

SHA3/SHA512/SM3/SM4暗号拡張
改善された仮想化サポート
メモリパーティショニングおよびモニタリング機能
新しいセキュアEL2状態とアクティビティモニター
符号付きおよび符号なし整数ドット積命令

1.7. Armv8.5-AおよびArmv9.0-A
--------------------------

2018年9月、Armv8.5-Aが発表された。その拡張機能は次のカテゴリに分類される。

Memory Tagging Extension
「攻撃者が任意のコードを実行する能力」を低減するための分岐ターゲットインジケータ
乱数ジェネレーター命令：さまざまな国内および国際規格に準拠した決定論的で真の乱数を提供する2019年8月2日、GoogleはAndroidがMemory Tagging Extensionを採用すると発表した。

2021年3月、Armv9-Aが発表された。Armv9-Aのベースラインは、Armv8.5のすべての機能である。Armv9-Aは以下も追加している。

スケーラブルベクターエクステンション2。SVE2は、SVEのスケーラブルなベクトル化に基づいて構築されており、細粒度のデータレベル並列処理を向上させ、命令ごとにより多くの作業を実行できる。SVE2は、現在Neonを使用しているDSPやマルチメディアSIMDコードなど、幅広いソフトウェアにこれらのメリットをもたらすことを目的とする。LLVM/Clang 9.0およびGCC 10.0開発コードは、SVE2をサポートするように更新された。
トランザクションメモリ拡張。x86拡張機能に続いて、TMEはハードウェアトランザクションメモリとトランザクションロックエリジオンのサポートを提供する。TMEは、スケーラブルな同時実行性を実現して、粗粒度のスレッドレベル並列処理を向上させ、スレッドごとにより多くの作業を実行できるようにすることを目的としている。LLVM/Clang 9.0およびGCC 10.0開発コードは、TMEをサポートするように更新された。
機密コンピューティングアーキテクチャ

1.8. Armv8.6-AおよびArmv9.1-A
--------------------------

2019年9月、Armv8.6-Aが発表された。その拡張機能は次のカテゴリに分類される。

一般的な行列積
bfloat16フォーマットのサポート
SIMD行列操作命令、BFDOT、BFMMLA、BFMLAL、およびBFCVT
仮想化、システム管理、およびセキュリティの強化
次の拡張機能：
拡張カウンター仮想化
ファイングレイントラップ
アクティビティモニターの仮想化たとえば、きめ細かいトラップ、Wait-for-Event命令、EnhancedPAC2、FPACなどがある。SVEおよびNEONのBfloat16拡張機能は、主に深層学習で使用するためのものである。

1.9. Armv8.7-AおよびArmv9.2-A
--------------------------

2020年9月、Armv8.7-Aが発表された。

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

1.10. Armv8.8-AおよびArmv9.3-A
---------------------------

2021年9月、Armv8.8-AおよびArmv9.3-Aが発表された。

マスク不可能な割り込み
memcpyおよびmemsetスタイルの操作を最適化する命令
PACへの拡張機能
ヒント付き条件分岐

1.11. Armv8.9-AおよびArmv9.4-A
---------------------------

2022年9月、ARMv8.9-AとARMv9.4-Aを発表。

仮想メモリシステムアーキテクチャの機能強化
パーミッションインダイレクトとオーバーレイ
translation hardening
128 ビット変換テーブル
Scalable Matrix Extension 2  
マルチベクトル命令
マルチベクトルpredicate
2b/4b のウェイト圧縮
1b バイナリーネットワーク
レンジプリフェッチ
ガード付きコントロールスタック
コンフィデンシャル・コンピューティング
メモリ暗号化コンテクスト
デバイスの割り当て

2. Armv8-R
----------

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

3. 脚注
-----