4. Логічні та побітові інструкції

4.1. Конвенції документа

Позначення: Rd, Rn позначають регістри ARM R0-R7, за винятком спеціальних інструкцій, де можуть використовуватись R0-R15. Rn<a-b> позначає регістр ARM, вміст якого повинен знаходитися в діапазоні a <= contents <= b. Для інструкцій з двома аргументами-регістрами допустимо, щоб вони були однаковими. Наприклад, наступне обнулить 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

  • bic(Rd, Rn) Rd &= ~Rn побітове очищення Rd за маскою в Rn

Зверніть увагу на використання «and_» замість «and», оскільки «and» є зарезервованим ключовим словом в Python.

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 бітів.

Обертання на (наприклад) три біти працює наступним чином. Якщо 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.

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

bit_reverse(Rn) повертає побітово обернений вміст Rn. Якщо Rn містить біти b31 b30..b0, Rd буде встановлено в b0 b1 b2..b31

Кінцеві нулі можуть бути підраховані шляхом виконання побітового обертання перед виконанням clz.