4. Logische en bitsgewijze instructies¶
4.1. Documentconventies¶
Notatie: Rd, Rn duiden de ARM-registers R0-R7 aan, behalve in het geval van de speciale instructies waar R0-R15 mag worden gebruikt. Rn<a-b> duidt een ARM-register aan waarvan de inhoud in het bereik a <= contents <= b moet liggen. In het geval van instructies met twee register-argumenten is het toegestaan dat deze identiek zijn. Het volgende zal bijvoorbeeld R0 nullen (Python R0 ^= R0) ongeacht de oorspronkelijke inhoud.
eor(r0, r0)
Deze instructies beïnvloeden de conditievlaggen, behalve waar anders aangegeven.
4.2. Logische instructies¶
and_(Rd, Rn)
Rd &= Rnorr(Rd, Rn)
Rd |= Rneor(Rd, Rn)
Rd ^= Rnmvn(Rd, Rn)
Rd = Rn ^ 0xffffffffd.w.z. Rd = 1’s complement van Rnbic(Rd, Rn)
Rd &= ~Rnwis bits van Rd met het masker in Rn
Merk het gebruik van “and_” op in plaats van “and”, omdat “and” een gereserveerd sleutelwoord is in Python.
4.3. Schuif- en rotatie-instructies¶
lsl(Rd, Rn<0-31>)
Rd <<= Rnlsr(Rd, Rn<1-32>)
Rd = (Rd & 0xffffffff) >> RnLogische schuif naar rechtsasr(Rd, Rn<1-32>)
Rd >>= Rnrekenkundige schuif naar rechtsror(Rd, Rn<1-31>)
Rd = rotate_right(Rd, Rn)Rd wordt Rn bits naar rechts geroteerd.
Een rotatie over (bijvoorbeeld) drie bits werkt als volgt. Als Rd aanvankelijk de bits b31 b30..b0 bevat, bevat het na rotatie b2 b1 b0 b31 b30..b3
4.4. Speciale instructies¶
Conditiecodes worden niet beïnvloed door deze instructies.
clz(Rd, Rn)
Rd = count_leading_zeros(Rn)
count_leading_zeros(Rn) retourneert het aantal binaire nul-bits vóór de eerste binaire één-bit in Rn.
rbit(Rd, Rn)
Rd = bit_reverse(Rn)
bit_reverse(Rn) retourneert de bitomgekeerde inhoud van Rn. Als Rn de bits b31 b30..b0 bevat, wordt Rd ingesteld op b0 b1 b2..b31
Achterliggende nullen kunnen worden geteld door een bitomkering uit te voeren voordat clz wordt uitgevoerd.