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 &= Rnorr(Rd, Rn)
Rd |= Rneor(Rd, Rn)
Rd ^= Rnmvn(Rd, Rn)
Rd = Rn ^ 0xffffffffすなわち Rd = Rn の 1 の補数bic(Rd, Rn)
Rd &= ~RnRn 内のマスクを使って Rd のビットをクリア
「and」は Python の予約キーワードであるため、「and」の代わりに「and_」を使用する点に注意してください。
4.3. シフトおよびローテーション命令¶
lsl(Rd, Rn<0-31>)
Rd <<= Rnlsr(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 を実行する前にビット反転を行うことで数えることができます。