AArch64
読み:エイアーキろくじゅうよん
外語:AArch64
ARMアーキテクチャ
の実行モードのうち、
ARMv8
(及びそれ以降)における64ビットのステート(動作モード)。
目次
概要
仕様
主な仕様
アドレス空間
命令セット
命令長
技術
命令デコーダー
レジスター
本数とバンク
種類
整数レジスター
レジスター31
FP/SIMDレジスター
整数演算
除算命令
概要
従来の
AArch32
と、命令のフォーマットやレジスター構成、例外処理モデルなどを大きく変更している。
AArch64で採用された命令セットを「A64」という。
仕様
主な仕様
オペコード
は32ビット固定長。ただし、
オペランド
が後付され、全体として32ビット、64ビット、96ビットの3パターンでの不定長となる
31本の64ビット汎用レジスター
ゼロレジスター
の追加
従来は汎用レジスターと兼用だった、
スタックポインター
、リンクレジスター、
プログラムカウンター
は、専用レジスター化
複数レジスターを処理するLDM、STM、PUSH、POP命令はなくなったが、2つのレジスターのロード/ストアを搭載
条件付き命令が大幅に減少した。
Thumb-2命令
のIT命令相当も存在しない
待望の整数除算命令の追加
128ビットの結果を得る乗算命令の追加
アドレス空間
AArch64では、64ビット命令により、64ビットの仮想アドレス空間を提供する能力を持つ。
実際の性能はプロセッサーの設計次第で、例えば
ARM Cortex-A57
では、64ビット仮想アドレス(実際に使用しているのはうち48ビット)と、44ビットの物理メモリー空間(16Tiバイト)が提供されている。
AArch64は、大容量メモリーが必要なサーバー用途も想定されているようだが、実際にAArch64(ARMv8)を最初に大々的に導入したのは、Appleのスマートフォン用プロセッサー
Apple A7
だった。
命令セット
AArch64は2つのステート(実行モード)を持ち、合わせて三つの命令セットを持つ。
AArch64ステート
新命令セット「
A64
」
AArch32ステート
旧来のARM命令セット「
A32
」
Thumb命令セット「
T32
」
後方互換性
のため、従来のAArch32ステートの機能を持っている。
命令長
64ビット化したからといって、命令長も64ビット化すると、単純に考えてコードサイズはおよそ倍に増大することになり、また命令フェッチの非効率化などの悪影響が想定される。
しかしAArch64の命令セットA64では、命令は従来同様32ビット長に抑えられた。従って、コードサイズが倍になったりすることはない。
技術
命令デコーダー
従来の32ビット命令は全ての命令に条件が付けられるなどしており、効率面では決して良くはなかった。
A64では、シンプルな命令体系となり、効率的になった。さらに命令デコーダーを2系列持ち、効率的な動作を支援する。
レジスター
本数とバンク
旧Arch32では、レジスターが16本(うち汎用レジスターは13本)だったが、AArch64では、汎用レジスターは倍以上の31本に増えた。RISCで16本は少なかったが、これを増やすことで効率的な動作を実現する。
レジスター数が増えると、コンパイラーの出力する処理も効率的となり、実行速度の高速化が期待できる。
また、旧Arch32は例外モードが多数あり、例外モードごとに汎用レジスターをバンク切り替えするという仕様があったが、AArch64ではこれも廃止した。AArch64にはバンキングはなく、これも効率的な動作に貢献する。
種類
レジスター名は、英字1文字に番号を付して呼ぶ。
整数
W 32ビット整数
X 64ビット整数
SIMDスカラーと浮動小数点数
B 8ビットスカラー
H 16ビットスカラー、半精度浮動小数点数
S 32ビットスカラー、単精度浮動小数点数
D 64ビットスカラー、倍精度浮動小数点数
Q 128ビットスカラー
整数レジスター
R0からR31までのレジスターバンクがあり、次のように名前を付けて用いる。
汎用レジスター
(32ビットWn、64ビットXn) nは0から30まで
ゼロレジスター
(32ビットWZR、64ビットXZR)
スタックポインター
(32ビットWSP、64ビットSP)
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までのレジスターバンクがあり、次のように名前を付けて用いる。
SIMDスカラーレジスター nは0から31まで
Bn 8ビット
Hn 16ビット
Sn 32ビット
Dn 64ビット
Qn 128ビット
SIMDベクターレジスター nは0から31まで
Vn.8B 8b×8
Vn.16B 8b×16
Vn.4H 16b×4
Vn.8H 16b×8
Vn.2S 32b×2
Vn.4S 32b×4
Vn.1D 64b×1
Vn.2D 64b×2
SIMDベクター要素
Vn.B[i] 8b
Vn.H[i] 16b
Vn.S[i] 32b
Vn.D[i] 64b
整数演算
A64では、殆どの整数命令で32ビット演算と64ビット演算が可能。
アセンブリ言語
での表現では、整数演算でレジスターをWnと書けば32ビット演算、Xnと書けば64ビット演算となる。
レジスターバンク自体は64ビットであるが、32ビット演算を用いた場合、次のように動作する。
ソースレジスターの上位32ビットは無視される
デスティネーションレジスターの上位32ビットはゼロクリアされる
状態ビットは下位32ビットの演算結果を反映したものとなる
除算命令
ARMv7-R
と
ARMv7-M
には除算命令が追加されたものの、
ARMv7-A
およびそれ以前のARMには除算命令はなかった。
A64では、32ビット演算と64ビット演算それぞれで、符号あり/無しの除算命令が追加された。
剰余算は無いが、剰余は「被除数 - 除数 * 商」で算出可能で、これはMSUB命令を使うと1命令で実行できる。
この命令では0除算は確認されず、例外も発生しない。長いレイテンシーのあとで結果が0として返される。除算命令の前に除数の確認をするべきである。
再検索