A32
読み:エイさんじゅうに
外語:A32
AArch32(古い呼称でARMステート)で使われている、32ビット環境用の32ビット固定長の命令セット。
概要
従来からある32ビットの命令セットである。
Thumb命令が登場するまでは唯一の命令セットだった。Thumb命令が登場後、呼び分けが必要となり、従来命令を使うモードを「ARMステート」、新たなThumb命令を使うモードを「Thumbステート」と、各々呼ばれるようになった。
更にARMv8が登場し64ビット化されて以降は、AArch32というアーキテクチャに属する2つの命令セットのうちの一つ「A32」と呼ばれるようになった。
特徴
命令
AArch32の命令セット(A32)には、次のような特徴がある。
- 32ビット固定長
- 3オペランド命令、4オペランド命令
- 全ての命令に条件フィールドがあり、実行条件付きで実行できる
- 演算命令などを中心に、シフト機能が付いている
- 代入時のイミディエイトは8ビット長しか使えない
- メモリーアクセスはPC相対を基本とする
実行条件付き命令
ARMの提供するマニュアルには、使用例としてユークリッドの互除法の計算が掲載されている。
Cで書いた場合、次のような処理になる。
int gcd(int a, int b)
{
while (a != b)
{
if (a > b)
a = a - b;
else
b = b - a;
}
return a;
}
これを、一般的なCPUと同様にARMで記述した場合、次のようになるだろう。
gcd CMP r0, r1
BEQ end
BLT less
SUB r0, r0, r1
B gcd
less
SUB r1, r1, r0
B gcd
end
さて、ARMには全ての命令に実行条件を付けることができるため、次のように、僅か4命令で書くことができる。
gcd CMP r0, r1
SUBGT r0, r0, r1
SUBLT r1, r1, r0
BNE gcd
様々な条件で、コードサイズが小さくなり、実行速度も速くなる。
ただ、一般的なCコンパイラーでは、ここまで最適化する能力を持たないため、必ずしもここまで効率化できるとは限らない。
オペコード
基本構造
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
cond | op1 | | op | |
殆どのARM命令はビット31〜28で実行条件をつけることが可能で、ビット27〜25で主要な細分化が行なわれている。
あとからの拡張の影響で、一部につきビット4を主要な細分化に用いているものがある。
cond | op1 | op | 命令クラス |
1111以外 | 00x | x | データ処理とその他の命令 |
010 | x | ワードと符号なしバイトのロード/ストア |
011 | 0 |
011 | 1 | メディア命令 |
10x | x | 分岐、リンク付き分岐、ブロックデータ転送 |
11x | x | システムコール、コプロセッサー命令(VFP/Advanced SIMDを含む) |
1111 | xxx | x | 無条件命令 |
cond≠0b1111
基本的な命令の配列は次の通り。
※付きは、古いARMでは使えない。
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
データ処理 | Cond | 0 | 0 | I | OpCode | S | Rn | Rd | Operand2 |
PSR転送 |
乗算 | Cond | 0 | 0 | 0 | 0 | 0 | 0 | A | S | Rd | Rn | Rs | 1 | 0 | 0 | 1 | Rm |
ロング乗算※ | Cond | 0 | 0 | 0 | 0 | 1 | U | A | S | RdHi | RdLo | Rs | 1 | 0 | 0 | 1 | Rm |
SWP | Cond | 0 | 0 | 0 | 1 | 0 | B | 0 | 0 | Rn | Rd | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | Rm |
分岐と切り替え※ | Cond | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | Rn |
ハーフワードレジスター※ | Cond | 0 | 0 | 0 | P | U | 0 | W | L | Rn | Rd | 0 | 1 | S | H | 1 | Rm |
ハーフワード即値※ | Cond | 0 | 0 | 0 | P | U | 1 | W | L | Rn | Rd | Offset1 | 1 | S | H | 1 | Offset2 |
LDR、STR | Cond | 0 | 1 | I | P | U | B | W | L | Rn | Rd | Offset |
未定義 | Cond | 0 | 1 | 1 | | 1 | |
ブロック転送 | Cond | 1 | 0 | 0 | P | U | S | W | L | Rn | Register List |
分岐 | Cond | 1 | 0 | 1 | L | offset |
コプロデータ転送 | Cond | 1 | 1 | 0 | P | U | N | W | L | Rn | CRd | cp_num | offset |
コプロデータ処理 | Cond | 1 | 1 | 1 | 0 | CP opc | CRn | CRd | cp_num | CP | 0 | CRm |
コプロレジスター転送 | Cond | 1 | 1 | 1 | 0 | CP opc | L | CRn | Rd | cp_num | CP | 1 | CRm |
ソフトウェア割り込み | Cond | 1 | 1 | 1 | 1 | 情報欄 |
cond=0b1111
元々cond=0b1111は使用されておらず予約扱いだったが、ARMv5以降に無条件実行のみの拡張命令が配置されるようになり、ARMv6で更に命令が追加された。
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
1 | 1 | 1 | 1 | op1 | Rn | | op | |
次のような命令がある。
op1 | op | Rn | 命令 |
0xxxxxxx | x | | その他の命令、メモリーのヒント、Advanced SIMD命令 |
100xx1x0 | x | | Store Return State(SRS) [ARMv6〜] |
100xx0x1 | x | | Return From Exception(RFE) [ARMv6〜] |
101xxxxx | x | | 分岐命令(BL、BLX) |
11000x1111001xx11101xxx1 | xxx | 1111以外 | コプロセッサーのロード (イミディエイト) |
1111 | コプロセッサーのロード (リテラル) |
11000x1011001xx01101xxx0 | xxx | | コプロセッサーのストア |
11000100 | x | | 2つのARMコアレジスターからコプロセッサーへのデータ移動 [ARMv6〜] |
11000101 | x | | コプロセッサーから2つのARMコアレジスターへのデータ移動 [ARMv6〜] |
1110xxxx | 0 | | コプロセッサーデータ操作 |
1110xxx0 | 1 | | ARMコアレジスターからコプロセッサーへのデータ移動 |
1110xxx1 | 1 | | コプロセッサーからARMコアレジスターへのデータ移動 |
Cond
- 0000 = EQ ‐ 等しい (Z=1)
- 0001 = NE ‐ 等しくない (Z=0)
- 0010 = CS/HS ‐ ≧(符号無し) (C=1)
- 0011 = CC/LO ‐ <(符号無し) (C=0)
- 0100 = MI ‐ 負 (N=1)
- 0101 = PL ‐ 正またはゼロ (N=0)
- 0110 = VS ‐ オーバフロー (V=1)
- 0111 = VC ‐ オーバフローではない (V=0)
- 1000 = HI ‐ >(符号無し) (C=1 AND Z=0)
- 1001 = LS ‐ ≦(符号無し) (C=0 OR Z=1)
- 1010 = GE ‐ ≧(符号あり) (N=V)
- 1011 = LT ‐ <(符号あり) (N≠V)
- 1100 = GT ‐ >(符号あり) (Z=0 AND N=V)
- 1101 = LE ‐ ≦(符号あり) (Z=1 AND N≠V)
- 1110 = AL ‐ 無条件
- 1111 = NV ‐ (使用禁止)
再検索