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 &= Rnorr(Rd, Rn)
Rd |= Rneor(Rd, Rn)
Rd ^= Rnmvn(Rd, Rn)
Rd = Rn ^ 0xffffffffou seja, Rd = complemento de 1 de Rnbic(Rd, Rn)
Rd &= ~Rnbit 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 <<= Rnlsr(Rd, Rn<1-32>)
Rd = (Rd & 0xffffffff) >> RnDeslocamento lógico à direitaasr(Rd, Rn<1-32>)
Rd >>= Rndeslocamento aritmético à direitaror(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.