4. 論理&ビット演算命令

4.1. ドキュメントの表記規則

表記: Rd, Rn は ARM レジスタ R0-R7 を表します。ただし、R0-R15 が使用可能な特殊命令の場合を除きます。Rn<a-b> は、内容が範囲 a <= contents <= b に収まらなければならない ARM レジスタを表します。2 つのレジスタ引数を持つ命令の場合、それらが同一であっても構いません。たとえば次の命令は、R0 の初期内容にかかわらず R0 をゼロにします(Python では R0 ^= R0)。

  • eor(r0, r0)

これらの命令は、特に明記されない限り条件フラグに影響を与えます。

4.2. 論理命令

  • and_(Rd, Rn) Rd &= Rn

  • orr(Rd, Rn) Rd |= Rn

  • eor(Rd, Rn) Rd ^= Rn

  • mvn(Rd, Rn) Rd = Rn ^ 0xffffffff すなわち Rd = Rn の 1 の補数

  • bic(Rd, Rn) Rd &= ~Rn Rn 内のマスクを使って Rd のビットをクリア

「and」は Python の予約キーワードであるため、「and」の代わりに「and_」を使用する点に注意してください。

4.3. シフトおよびローテーション命令

  • lsl(Rd, Rn<0-31>) Rd <<= Rn

  • lsr(Rd, Rn<1-32>) Rd = (Rd & 0xffffffff) >> Rn 論理右シフト

  • asr(Rd, Rn<1-32>) Rd >>= Rn 算術右シフト

  • ror(Rd, Rn<1-31>) Rd = rotate_right(Rd, Rn) Rd を右へ Rn ビット回転します。

(たとえば)3 ビットの回転は次のように機能します。Rd が最初にビット b31 b30..b0 を含んでいる場合、回転後は b2 b1 b0 b31 b30..b3 を含みます。

4.4. 特殊命令

条件コードはこれらの命令の影響を受けません。

  • clz(Rd, Rn) Rd = count_leading_zeros(Rn)

count_leading_zeros(Rn) は、Rn 内の最初の 2 進数の 1 ビットより前にある 2 進数の 0 ビットの数を返します。

  • rbit(Rd, Rn) Rd = bit_reverse(Rn)

bit_reverse(Rn) は、Rn のビットを反転した内容を返します。Rn がビット b31 b30..b0 を含む場合、Rd は b0 b1 b2..b31 に設定されます。

末尾のゼロは、clz を実行する前にビット反転を行うことで数えることができます。