AArch64
読み:エイアーキろくじゅうよん
外語:AArch64

 ARMアーキテクチャの実行モードのうち、ARMv8(及びそれ以降)における64ビットのステート(動作モード)。
目次

概要
 従来のAArch32と、命令のフォーマットやレジスター構成、例外処理モデルなどを大きく変更している。
 AArch64で採用された命令セットを「A64」という。

仕様

主な仕様

アドレス空間
 AArch64では、64ビット命令により、64ビットの仮想アドレス空間を提供する能力を持つ。
 実際の性能はプロセッサーの設計次第で、例えばARM Cortex-A57では、64ビット仮想アドレス(実際に使用しているのはうち48ビット)と、44ビットの物理メモリー空間(16Tiバイト)が提供されている。
 AArch64は、大容量メモリーが必要なサーバー用途も想定されているようだが、実際にAArch64(ARMv8)を最初に大々的に導入したのは、Appleのスマートフォン用プロセッサーApple A7だった。

命令セット
 AArch64は2つのステート(実行モード)を持ち、合わせて三つの命令セットを持つ。
 後方互換性のため、従来のAArch32ステートの機能を持っている。

命令長
 64ビット化したからといって、命令長も64ビット化すると、単純に考えてコードサイズはおよそ倍に増大することになり、また命令フェッチの非効率化などの悪影響が想定される。
 しかしAArch64の命令セットA64では、命令は従来同様32ビット長に抑えられた。従って、コードサイズが倍になったりすることはない。

技術

命令デコーダー
 従来の32ビット命令は全ての命令に条件が付けられるなどしており、効率面では決して良くはなかった。
 A64では、シンプルな命令体系となり、効率的になった。さらに命令デコーダーを2系列持ち、効率的な動作を支援する。

レジスター

本数とバンク
 旧Arch32では、レジスターが16本(うち汎用レジスターは13本)だったが、AArch64では、汎用レジスターは倍以上の31本に増えた。RISCで16本は少なかったが、これを増やすことで効率的な動作を実現する。
 レジスター数が増えると、コンパイラーの出力する処理も効率的となり、実行速度の高速化が期待できる。
 また、旧Arch32は例外モードが多数あり、例外モードごとに汎用レジスターをバンク切り替えするという仕様があったが、AArch64ではこれも廃止した。AArch64にはバンキングはなく、これも効率的な動作に貢献する。

種類
 レジスター名は、英字1文字に番号を付して呼ぶ。

整数レジスター
 R0からR31までのレジスターバンクがあり、次のように名前を付けて用いる。
 W31やX31は使用しない。該当の番号は、状況に応じて、ゼロレジスターまたはスタックポインターが対応する。

レジスター31
 レジスター31は、殆どの状況で、ゼロレジスターとして機能する。つまり、読めばゼロ、書いた内容は破棄される。
 ロード/ストアのベースレジスターとして使用される場合と、一部の算術演算命令でのみ、レジスター31は現在のモードのスタックポインターを参照する。割り込み処理など、動作モードが切り替わる際に、CPUは自動的にスタックポインターを切り替える。
 例えばADD命令はsrcまたはdstにSPが指定可能で、スタックポインターへの代入は次のように書くことができる。
 ADD SP, Xn, #0
 アセンブリ言語においては、次のように書くことができる。
 MOV SP, Xn
 これはエイリアスであり、アセンブルした際には「ADD SP, Xn, #0」のコードが出力される。

FP/SIMDレジスター
 V0からV31までのレジスターバンクがあり、次のように名前を付けて用いる。

整数演算
 A64では、殆どの整数命令で32ビット演算と64ビット演算が可能。
 アセンブリ言語での表現では、整数演算でレジスターをWnと書けば32ビット演算、Xnと書けば64ビット演算となる。
 レジスターバンク自体は64ビットであるが、32ビット演算を用いた場合、次のように動作する。

除算命令
 ARMv7-RARMv7-Mには除算命令が追加されたものの、ARMv7-Aおよびそれ以前のARMには除算命令はなかった。
 A64では、32ビット演算と64ビット演算それぞれで、符号あり/無しの除算命令が追加された。
 剰余算は無いが、剰余は「被除数 - 除数 * 商」で算出可能で、これはMSUB命令を使うと1命令で実行できる。
 この命令では0除算は確認されず、例外も発生しない。長いレイテンシーのあとで結果が0として返される。除算命令の前に除数の確認をするべきである。

再検索