4. Logičke i bitovne instrukcije

4.1. Konvencije dokumenta

Notacija: Rd, Rn označavaju ARM registre R0-R7 osim u slučaju posebnih instrukcija gdje se mogu koristiti R0-R15. Rn<a-b> označava ARM registar čiji sadržaj mora ležati u rasponu a <= contents <= b. U slučaju instrukcija s dva registarska argumenta, dopušteno je da budu identični. Na primjer, sljedeće će ponuliti R0 (Python R0 ^= R0) bez obzira na njegov početni sadržaj.

  • eor(r0, r0)

Ove instrukcije utječu na uvjetne zastavice osim gdje je navedeno.

4.2. Logičke instrukcije

  • and_(Rd, Rn) Rd &= Rn

  • orr(Rd, Rn) Rd |= Rn

  • eor(Rd, Rn) Rd ^= Rn

  • mvn(Rd, Rn) Rd = Rn ^ 0xffffffff tj. Rd = jedinični komplement od Rn

  • bic(Rd, Rn) Rd &= ~Rn čisti bitove u Rd koristeći masku u Rn

Imajte na umu uporabu „and_” umjesto „and”, jer je „and” rezervirana ključna riječ u Pythonu.

4.3. Instrukcije posmaka i rotacije

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

  • lsr(Rd, Rn<1-32>) Rd = (Rd & 0xffffffff) >> Rn Logički posmak udesno

  • asr(Rd, Rn<1-32>) Rd >>= Rn aritmetički posmak udesno

  • ror(Rd, Rn<1-31>) Rd = rotate_right(Rd, Rn) Rd se rotira udesno za Rn bitova.

Rotacija za (na primjer) tri bita radi na sljedeći način. Ako Rd početno sadrži bitove b31 b30..b0 nakon rotacije sadržavat će b2 b1 b0 b31 b30..b3

4.4. Posebne instrukcije

Na ove instrukcije ne utječu uvjetni kodovi.

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

count_leading_zeros(Rn) vraća broj binarnih nula prije prvog binarnog jedinice u Rn.

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

bit_reverse(Rn) vraća bitovno obrnuti sadržaj od Rn. Ako Rn sadrži bitove b31 b30..b0 Rd će biti postavljen na b0 b1 b2..b31

Završne nule mogu se prebrojati izvođenjem bitovnog obrtanja prije izvršavanja clz.