# 4. Logical & Bitwise instructions¶

## 4.1. Document conventions¶

Notation: `Rd, Rn` denote ARM registers R0-R7 except in the case of the special instructions where R0-R15 may be used. `Rn<a-b>` denotes an ARM register whose contents must lie in range `a <= contents <= b`. In the case of instructions with two register arguments, it is permissible for them to be identical. For example the following will zero R0 (Python `R0 ^= R0`) regardless of its initial contents.

• eor(r0, r0)

These instructions affect the condition flags except where stated.

## 4.2. Logical instructions¶

• and_(Rd, Rn) `Rd &= Rn`
• orr(Rd, Rn) `Rd |= Rn`
• eor(Rd, Rn) `Rd ^= Rn`
• mvn(Rd, Rn) `Rd = Rn ^ 0xffffffff` i.e. Rd = 1’s complement of Rn
• bic(Rd, Rn) `Rd &= ~Rn` bit clear Rd using mask in Rn

Note the use of “and_” instead of “and”, because “and” is a reserved keyword in Python.

## 4.3. Shift and rotation instructions¶

• lsl(Rd, Rn<0-31>) `Rd <<= Rn`
• lsr(Rd, Rn<1-32>) `Rd = (Rd & 0xffffffff) >> Rn` Logical shift right
• asr(Rd, Rn<1-32>) `Rd >>= Rn` arithmetic shift right
• ror(Rd, Rn<1-31>) `Rd = rotate_right(Rd, Rn)` Rd is rotated right Rn bits.

A rotation by (for example) three bits works as follows. If Rd initially contains bits `b31 b30..b0` after rotation it will contain `b2 b1 b0 b31 b30..b3`

## 4.4. Special instructions¶

Condition codes are unaffected by these instructions.

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

count_leading_zeros(Rn) returns the number of binary zero bits before the first binary one bit in Rn.

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

bit_reverse(Rn) returns the bit-reversed contents of Rn. If Rn contains bits `b31 b30..b0` Rd will be set to `b0 b1 b2..b31`

Trailing zeros may be counted by performing a bit reverse prior to executing clz.