AArch64

読み:エイアーキろくじゅうよん
読み:エイアークろくじゅうよん
外語:AArch64 英語
品詞:名詞

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

目次

従来の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つのステート(実行モード)を持ち、合わせて三つの命令セットを持つ。

後方互換性のため、従来の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までのレジスターバンクがあり、次のように名前を付けて用いる。

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-RARMv7-Mには除算命令が追加されたものの、ARMv7-Aおよびそれ以前のARMには除算命令はなかった。

A64では、32ビット演算と64ビット演算それぞれで、符号あり/無しの除算命令が追加された。

剰余算は無いが、剰余は「被除数 − 除数 * 商」で算出可能で、これはMSUB命令を使うと1命令で実行できる。

この命令では0除算は確認されず、例外も発生しない。長いレイテンシーのあとで結果が0として返される。除算命令の前に除数の確認をするべきである。

用語の所属
ARMアーキテクチャ
関連する用語
ARMv8
AArch32
A64

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club