4. Instrucciones lógicas y de bits

4.1. Convenciones del documento

Notación: Rd, Rn denotan los registros ARM R0-R7 excepto en el caso de las instrucciones especiales, donde puede usarse R0-R15. Rn<a-b> denota un registro ARM cuyo contenido debe estar en el rango a <= contents <= b. En el caso de las instrucciones con dos argumentos de registro, se permite que sean idénticos. Por ejemplo, lo siguiente pondrá a cero R0 (en Python R0 ^= R0) sin importar su contenido inicial.

  • eor(r0, r0)

Estas instrucciones afectan a las banderas de condición excepto donde se indique.

4.2. Instrucciones lógicas

  • and_(Rd, Rn) Rd &= Rn

  • orr(Rd, Rn) Rd |= Rn

  • eor(Rd, Rn) Rd ^= Rn

  • mvn(Rd, Rn) Rd = Rn ^ 0xffffffff es decir, Rd = complemento a 1 de Rn

  • bic(Rd, Rn) Rd &= ~Rn borra los bits de Rd usando la máscara en Rn

Observe el uso de «and_» en lugar de «and», porque «and» es una palabra clave reservada en Python.

4.3. Instrucciones de desplazamiento y rotación

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

  • lsr(Rd, Rn<1-32>) Rd = (Rd & 0xffffffff) >> Rn Desplazamiento lógico a la derecha

  • asr(Rd, Rn<1-32>) Rd >>= Rn desplazamiento aritmético a la derecha

  • ror(Rd, Rn<1-31>) Rd = rotate_right(Rd, Rn) Rd se rota a la derecha Rn bits.

Una rotación de (por ejemplo) tres bits funciona de la siguiente manera. Si Rd contiene inicialmente los bits b31 b30..b0, tras la rotación contendrá b2 b1 b0 b31 b30..b3

4.4. Instrucciones especiales

Los códigos de condición no se ven afectados por estas instrucciones.

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

count_leading_zeros(Rn) retorna el número de bits cero binarios antes del primer bit uno binario en Rn.

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

bit_reverse(Rn) retorna el contenido de Rn con los bits invertidos. Si Rn contiene los bits b31 b30..b0, Rd se establecerá en b0 b1 b2..b31

Los ceros finales pueden contarse realizando una inversión de bits antes de ejecutar clz.