4. Instrukcje logiczne i bitowe

4.1. Konwencje dokumentu

Notacja: Rd, Rn oznaczają rejestry ARM R0-R7 z wyjątkiem instrukcji specjalnych, gdzie można używać R0-R15. Rn<a-b> oznacza rejestr ARM, którego zawartość musi mieścić się w zakresie a <= contents <= b. W przypadku instrukcji z dwoma argumentami rejestrowymi dopuszczalne jest, aby były one identyczne. Na przykład poniższe wyzeruje R0 (w Pythonie R0 ^= R0) niezależnie od jego początkowej zawartości.

  • eor(r0, r0)

Te instrukcje wpływają na flagi warunku, z wyjątkiem przypadków, gdy stwierdzono inaczej.

4.2. Instrukcje logiczne

  • and_(Rd, Rn) Rd &= Rn

  • orr(Rd, Rn) Rd |= Rn

  • eor(Rd, Rn) Rd ^= Rn

  • mvn(Rd, Rn) Rd = Rn ^ 0xffffffff tzn. Rd = dopełnienie jedynkowe Rn

  • bic(Rd, Rn) Rd &= ~Rn wyczyść bity Rd używając maski w Rn

Należy zwrócić uwagę na użycie „and_” zamiast „and”, ponieważ „and” jest zarezerwowanym słowem kluczowym w Pythonie.

4.3. Instrukcje przesunięcia i rotacji

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

  • lsr(Rd, Rn<1-32>) Rd = (Rd & 0xffffffff) >> Rn Logiczne przesunięcie w prawo

  • asr(Rd, Rn<1-32>) Rd >>= Rn arytmetyczne przesunięcie w prawo

  • ror(Rd, Rn<1-31>) Rd = rotate_right(Rd, Rn) Rd jest rotowany w prawo o Rn bitów.

Rotacja o (na przykład) trzy bity działa w następujący sposób. Jeśli Rd początkowo zawiera bity b31 b30..b0, po rotacji będzie zawierać b2 b1 b0 b31 b30..b3

4.4. Instrukcje specjalne

Te instrukcje nie wpływają na kody warunku.

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

count_leading_zeros(Rn) zwraca liczbę binarnych bitów zerowych przed pierwszym binarnym bitem jedynkowym w Rn.

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

bit_reverse(Rn) zwraca zawartość Rn z odwróconą kolejnością bitów. Jeśli Rn zawiera bity b31 b30..b0, Rd zostanie ustawione na b0 b1 b2..b31

Końcowe zera można policzyć, wykonując odwrócenie bitów przed wykonaniem clz.