4. Instruções lógicas e de bits

4.1. Convenções do documento

Notação: Rd, Rn denotam os registradores ARM R0-R7, exceto no caso das instruções especiais onde R0-R15 podem ser usados. Rn<a-b> denota um registrador ARM cujo conteúdo deve estar no intervalo a <= contents <= b. No caso de instruções com dois argumentos de registrador, é permitido que sejam idênticos. Por exemplo, o seguinte zera R0 (em Python R0 ^= R0), independentemente de seu conteúdo inicial.

  • eor(r0, r0)

Estas instruções afetam os flags de condição, exceto onde indicado.

4.2. Instruções lógicas

  • and_(Rd, Rn) Rd &= Rn

  • orr(Rd, Rn) Rd |= Rn

  • eor(Rd, Rn) Rd ^= Rn

  • mvn(Rd, Rn) Rd = Rn ^ 0xffffffff ou seja, Rd = complemento de 1 de Rn

  • bic(Rd, Rn) Rd &= ~Rn bit clear em Rd usando a máscara em Rn

Observe o uso de “and_” em vez de “and”, porque “and” é uma palavra reservada em Python.

4.3. Instruções de deslocamento e rotação

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

  • lsr(Rd, Rn<1-32>) Rd = (Rd & 0xffffffff) >> Rn Deslocamento lógico à direita

  • asr(Rd, Rn<1-32>) Rd >>= Rn deslocamento aritmético à direita

  • ror(Rd, Rn<1-31>) Rd = rotate_right(Rd, Rn) Rd é rotacionado à direita em Rn bits.

Uma rotação de (por exemplo) três bits funciona da seguinte forma. Se Rd contiver inicialmente os bits b31 b30..b0, após a rotação ele conterá b2 b1 b0 b31 b30..b3

4.4. Instruções especiais

Os códigos de condição não são afetados por estas instruções.

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

count_leading_zeros(Rn) retorna o número de bits binários zero antes do primeiro bit binário um em Rn.

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

bit_reverse(Rn) retorna o conteúdo de Rn com os bits invertidos. Se Rn contiver os bits b31 b30..b0, Rd será definido como b0 b1 b2..b31

Os zeros à direita podem ser contados realizando uma inversão de bits antes de executar clz.