レジスタ

コアレジスタセット

すべてのARMプロセッサはロード/ストア・アーキテクチャを採用しており、演算処理はレジスタで行います。命令は16個すべてのレジスタにアクセスできますが、r13〜r15は特別な役割を持っています。

図1
  • ①スタックポインタ
    現在のレジスタ値を一時退避するために使用するメモリ領域のアドレスを保持します。
  • ②リンクレジスタ
    BL命令の次の命令のアドレスを保持し、関数呼び出しを行う場合のリターンアドレスを保持します。
  • ③プログラムカウンタ
    プログラムを実行しているアドレスを保持します。Thumb-2命令の場合は、ワードまたはハーフワード単位に命令が配置され、ビット0は未定義となります。

cpsr(カレントプログラムステータスレジスタ)

プロセッサの演算結果や動作モード・割り込み設定状態を保持し、プログラムの制御などを使用します。

図2

【cpsr形式】

名称 意味
N 演算結果が負の場合に設定されます。
Z 演算結果が0の場合に設定されます。
C 演算結果がキャリーアウトの場合に設定されます。
V 演算結果がオーバフローの場合に設定されます。
Q 飽和が発生したことを示します。(自動クリアされません)
J プロセッサがJazelle状態かどうかを示します。
GE[3:0] いくつかのSIMD命令で使用されます。
IT[7:0] Thumb2-命令のIF-THEN条件付実行で使用します。
E ロード/ストア命令のエンディアン形式を設定します。
A 不正確データアボートを禁止にします。
I IRQ割り込みの設定を行います。(I=1:IRQ割り込み禁止)
F FIQ割り込みの設定を行います。(F=1:FIQ割り込み禁止)
T T=0:プロセッサはARMステート/T=1: プロセッサはTHUMBステート
MODE[4:0] プロセッサ動作モードを設定します。

プログラマから見たレジスタ

プログラムを効率的に作成する場合、C/C++コンパイラが利用する関数への引数や戻り値について、考慮する必要があります。関数への引数や戻り値の仕様は、「AAPCS(ARMアーキテクチャのプロシージャコール標準)」で定められています。

図3

AAPCSを考慮したプログラムの作成

ARMプロセッサは、64ビットデータを使用することができます。その場合、関数の引数定義の順番を入れ替えることで、パフォーマンスを向上させることが可能となります。64ビット引数は、偶数番のレジスタと連続した奇数番のレジスタを使用して渡します。また、スタックは8バイトアラインメントする必要があります。

関数コールの基本

32ビット引数が4個までの場合は、レジスタで引数を渡すことができるため、関数呼び出しを効率的に行うことができます。

図4

long long型を含む場合

変数bは、64ビット引数となります。

図5

double型を含む場合

図6

レジスタと動作モード

Cortex-Aプロセッサは、動作モード(第5回参照)によって特定のレジスタが自動的に切り替えを行います。(cpsrレジスタは、spsrレジスタに保存されます。)FIQモードのみ、専用レジスタ「r8からr14」を利用することで、スタックの使用量を削減し、高速に動作させることが可能です。

Cortex-A9には、アーキテクチャレジスタと物理レジスタを使用するレジスタリネーミング機能(第2回参照)により、命令セットアーキテクチャを変更することなく、利用できるレジスタを増やし、動作を高速化させることが可能です。

図7

浮動小数点とNEONレジスタ

Cortex-Aプロセッサは、オプションでARM浮動小数点アーキテクチャ(以下:VFP)を搭載し、同時にNEON汎用SIMDエンジン(以下:NEON)を搭載することが可能です。プロセッサによって搭載可能なVFPのバージョンは異なります。

プロセッサシリーズ VFP型式
Cortex-A5 VFPv4
Cortex-A7 VFPv4
Cortex-A8 VFPv3
Cortex-A9 VFPv3-D16
Cortex-A12 VFPv4
Cortex-A15 VFPv4

VFPとNEONレジスタは一部レジスタを共有し、コアレジスタ(r0-r15)と異なるレジスタセットを使用します。

s<n>レジスタは32ビット、d<n>レジスタは64ビット、q<n>は128ビットとなります。同一レジスタを異なったサイズで利用することも可能です。

図8