A32
読み:エイさんじゅうに
外語:A32

 AArch32(古い呼称でARMステート)で使われている、32ビット環境用の32ビット固定長の命令セット。
目次

概要
 従来からある32ビットの命令セットである。
 Thumb命令が登場するまでは唯一の命令セットだった。Thumb命令が登場後、呼び分けが必要となり、従来命令を使うモードを「ARMステート」、新たなThumb命令を使うモードを「Thumbステート」と、各々呼ばれるようになった。
 更にARMv8が登場し64ビット化されて以降は、AArch32というアーキテクチャに属する2つの命令セットのうちの一つ「A32」と呼ばれるようになった。

特徴

命令
 AArch32の命令セット(A32)には、次のような特徴がある。

実行条件付き命令
 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コンパイラーでは、ここまで最適化する能力を持たないため、必ずしもここまで効率化できるとは限らない。

オペコード

基本構造
3130292827262524232221201918171615141312111009080706050403020100
condop1 op 
 殆どのARM命令はビット31〜28で実行条件をつけることが可能で、ビット27〜25で主要な細分化が行なわれている。
 あとからの拡張の影響で、一部につきビット4を主要な細分化に用いているものがある。
condop1op命令クラス
1111以外00xxデータ処理とその他の命令
010xワードと符号なしバイトのロード/ストア
0110
0111メディア命令
10xx分岐、リンク付き分岐、ブロックデータ転送
11xxシステムコール、コプロセッサー命令(VFP/Advanced SIMDを含む)
1111xxxx無条件命令

cond≠0b1111
 基本的な命令の配列は次の通り。
 ※付きは、古いARMでは使えない。
 3130292827262524232221201918171615141312111009080706050403020100
データ処理Cond00IOpCodeSRnRdOperand2
PSR転送
乗算Cond000000ASRdRnRs1001Rm
ロング乗算※Cond00001UASRdHiRdLoRs1001Rm
SWPCond00010B00RnRd00001001Rm
分岐と切り替え※Cond000100101111111111110001Rn
ハーフワードレジスター※Cond000PU0WLRnRd01SH1Rm
ハーフワード即値※Cond000PU1WLRnRdOffset11SH1Offset2
LDR、STRCond01IPUBWLRnRdOffset
未定義Cond011 1 
ブロック転送Cond100PUSWLRnRegister List
分岐Cond101Loffset
コプロデータ転送Cond110PUNWLRnCRdcp_numoffset
コプロデータ処理Cond1110CP opcCRnCRdcp_numCP0CRm
コプロレジスター転送Cond1110CP opcLCRnRdcp_numCP1CRm
ソフトウェア割り込みCond1111情報欄

cond=0b1111
 元々cond=0b1111は使用されておらず予約扱いだったが、ARMv5以降に無条件実行のみの拡張命令が配置されるようになり、ARMv6で更に命令が追加された。
3130292827262524232221201918171615141312111009080706050403020100
1111op1Rn op 
 次のような命令がある。
op1opRn命令
0xxxxxxxx その他の命令、メモリーのヒント、Advanced SIMD命令
100xx1x0x Store Return State(SRS) [ARMv6〜]
100xx0x1x Return From Exception(RFE) [ARMv6〜]
101xxxxxx 分岐命令(BL、BLX)
11000x1111001xx11101xxx1xxx1111以外コプロセッサーのロード (イミディエイト)
1111コプロセッサーのロード (リテラル)
11000x1011001xx01101xxx0xxx コプロセッサーのストア
11000100x 2つのARMコアレジスターからコプロセッサーへのデータ移動 [ARMv6〜]
11000101x コプロセッサーから2つのARMコアレジスターへのデータ移動 [ARMv6〜]
1110xxxx0 コプロセッサーデータ操作
1110xxx01 ARMコアレジスターからコプロセッサーへのデータ移動
1110xxx11 コプロセッサーからARMコアレジスターへのデータ移動

Cond

再検索