4. Logické a bitové instrukce

4.1. Konvence dokumentu

Notace: Rd, Rn označují ARM registry R0-R7 s výjimkou speciálních instrukcí, kde lze použít R0-R15. Rn<a-b> označuje ARM registr, jehož obsah musí ležet v rozsahu a <= contents <= b. V případě instrukcí se dvěma registrovými argumenty je přípustné, aby byly totožné. Například následující vynuluje R0 (Python R0 ^= R0) bez ohledu na jeho počáteční obsah.

  • eor(r0, r0)

Tyto instrukce ovlivňují příznaky podmínek, není-li uvedeno jinak.

4.2. Logické instrukce

  • and_(Rd, Rn) Rd &= Rn

  • orr(Rd, Rn) Rd |= Rn

  • eor(Rd, Rn) Rd ^= Rn

  • mvn(Rd, Rn) Rd = Rn ^ 0xffffffff tj. Rd = jedničkový doplněk Rn

  • bic(Rd, Rn) Rd &= ~Rn vymazání bitů Rd pomocí masky v Rn

Všimněte si použití „and_“ místo „and“, protože „and“ je v Pythonu rezervované klíčové slovo.

4.3. Instrukce posunu a rotace

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

  • lsr(Rd, Rn<1-32>) Rd = (Rd & 0xffffffff) >> Rn Logický posun vpravo

  • asr(Rd, Rn<1-32>) Rd >>= Rn aritmetický posun vpravo

  • ror(Rd, Rn<1-31>) Rd = rotate_right(Rd, Rn) Rd je rotován vpravo o Rn bitů.

Rotace o (například) tři bity funguje následovně. Pokud Rd zpočátku obsahuje bity b31 b30..b0, po rotaci bude obsahovat b2 b1 b0 b31 b30..b3

4.4. Speciální instrukce

Tyto instrukce neovlivňují kódy podmínek.

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

count_leading_zeros(Rn) vrací počet binárních nulových bitů před prvním binárním jedničkovým bitem v Rn.

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

bit_reverse(Rn) vrací bitově obrácený obsah Rn. Pokud Rn obsahuje bity b31 b30..b0, Rd bude nastaveno na b0 b1 b2..b31

Koncové nuly lze spočítat provedením bitového obrácení před vykonáním clz.