4. Instruksi logika & bitwise

4.1. Konvensi dokumen

Notasi: Rd, Rn menunjuk register ARM R0-R7 kecuali dalam kasus instruksi khusus di mana R0-R15 dapat digunakan. Rn<a-b> menunjuk register ARM yang isinya harus berada dalam rentang a <= contents <= b. Dalam kasus instruksi dengan dua argumen register, diperbolehkan bagi keduanya untuk identik. Misalnya, berikut ini akan mengubah R0 menjadi nol (Python R0 ^= R0) terlepas dari isi awalnya.

  • eor(r0, r0)

Instruksi-instruksi ini mempengaruhi flag kondisi kecuali dinyatakan sebaliknya.

4.2. Instruksi logika

  • and_(Rd, Rn) Rd &= Rn

  • orr(Rd, Rn) Rd |= Rn

  • eor(Rd, Rn) Rd ^= Rn

  • mvn(Rd, Rn) Rd = Rn ^ 0xffffffff yaitu Rd = komplemen 1 dari Rn

  • bic(Rd, Rn) Rd &= ~Rn hapus bit Rd menggunakan mask di Rn

Perhatikan penggunaan "and_" alih-alih "and", karena "and" adalah kata kunci yang dicadangkan dalam Python.

4.3. Instruksi geser dan rotasi

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

  • lsr(Rd, Rn<1-32>) Rd = (Rd & 0xffffffff) >> Rn Geser logika ke kanan

  • asr(Rd, Rn<1-32>) Rd >>= Rn geser aritmetika ke kanan

  • ror(Rd, Rn<1-31>) Rd = rotate_right(Rd, Rn) Rd dirotasi ke kanan sebanyak Rn bit.

Rotasi sebanyak (misalnya) tiga bit bekerja sebagai berikut. Jika Rd awalnya berisi bit b31 b30..b0 setelah rotasi akan berisi b2 b1 b0 b31 b30..b3

4.4. Instruksi khusus

Kode kondisi tidak terpengaruh oleh instruksi-instruksi ini.

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

count_leading_zeros(Rn) mengembalikan jumlah bit biner nol sebelum bit biner satu pertama di Rn.

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

bit_reverse(Rn) mengembalikan isi Rn yang dibalik bitnya. Jika Rn berisi bit b31 b30..b0 maka Rd akan diset ke b0 b1 b2..b31

Trailing zero dapat dihitung dengan melakukan pembalikan bit sebelum mengeksekusi clz.