# 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.

Language and External Links

Language
  English
  中文

External links
  openmv.io
  forums.openmv.io
  github.com/openmv/openmv
  micropython.org
  forum.micropython.org
  github.com/micropython/micropython