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

4.1. Convenções do documento

Notação: Rd, Rn denotam registos ARM R0-R7, exceto no caso das instruções especiais onde podem ser utilizados R0-R15. Rn<a-b> denota um registo ARM cujo conteúdo deve estar no intervalo a <= contents <= b. No caso de instruções com dois argumentos de registo, é permitido que sejam idênticos. Por exemplo, o seguinte zerará R0 (Python R0 ^= R0) independentemente do 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 i.e. Rd = complemento para 1 de Rn

  • bic(Rd, Rn) Rd &= ~Rn limpar bits de Rd usando a máscara em Rn

Note a utilização 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 para a direita

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

  • ror(Rd, Rn<1-31>) Rd = rotate_right(Rd, Rn) Rd é rodado Rn bits para a direita.

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 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 zero binários antes do primeiro bit um binário 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.