4. Instructions logiques et bit à bit

4.1. Conventions du document

Notation : Rd, Rn désignent les registres ARM R0-R7 sauf dans le cas des instructions spéciales où R0-R15 peuvent être utilisés. Rn<a-b> désigne un registre ARM dont le contenu doit se situer dans la plage a <= contents <= b. Dans le cas des instructions à deux arguments de registre, il est permis qu’ils soient identiques. Par exemple, ce qui suit mettra R0 à zéro (en Python R0 ^= R0) quel que soit son contenu initial.

  • eor(r0, r0)

Ces instructions affectent les drapeaux de condition sauf indication contraire.

4.2. Instructions logiques

  • and_(Rd, Rn) Rd &= Rn

  • orr(Rd, Rn) Rd |= Rn

  • eor(Rd, Rn) Rd ^= Rn

  • mvn(Rd, Rn) Rd = Rn ^ 0xffffffff c.-à-d. Rd = complément à 1 de Rn

  • bic(Rd, Rn) Rd &= ~Rn efface les bits de Rd à l’aide du masque dans Rn

Notez l’utilisation de « and_ » au lieu de « and », car « and » est un mot-clé réservé en Python.

4.3. Instructions de décalage et de rotation

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

  • lsr(Rd, Rn<1-32>) Rd = (Rd & 0xffffffff) >> Rn Décalage logique vers la droite

  • asr(Rd, Rn<1-32>) Rd >>= Rn décalage arithmétique vers la droite

  • ror(Rd, Rn<1-31>) Rd = rotate_right(Rd, Rn) Rd subit une rotation vers la droite de Rn bits.

Une rotation de (par exemple) trois bits fonctionne comme suit. Si Rd contient initialement les bits b31 b30..b0, après rotation il contiendra b2 b1 b0 b31 b30..b3

4.4. Instructions spéciales

Les codes de condition ne sont pas affectés par ces instructions.

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

count_leading_zeros(Rn) renvoie le nombre de bits binaires à zéro précédant le premier bit binaire à un dans Rn.

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

bit_reverse(Rn) renvoie le contenu de Rn avec les bits inversés. Si Rn contient les bits b31 b30..b0, Rd sera positionné à b0 b1 b2..b31

Les zéros de fin peuvent être comptés en effectuant une inversion de bits avant d’exécuter clz.