andi
lyszt.net aborda andi e outras instruções RISC-V com mais detalhes.
Formato de codificação
Descrição
andi realiza AND bit a bit com uma constante. and recebe dois registradores, mas andi recebe um registrador e um imediato, um valor fixo codificado na instrução. O i significa imediato. A regra do AND é inalterada: um bit do resultado é 1 apenas quando ambos os bits de entrada são 1, então a constante atua como uma máscara que preserva alguns bits e limpa os outros. Mascaramento e operações bit a bit são abordados na página and.
A forma de andi é mostrada abaixo. Ela faz AND do valor em rs1 com a constante imm e escreve o resultado em rd.
andi rd, rs1, imm
Use-a quando você sabe de antemão quais bits manter. A linha seguinte mantém os 8 bits mais baixos de t0 e limpa os 24 superiores, extraindo um byte de um valor maior. O prefixo 0x marca uma constante hexadecimal.
andi t1, t0, 0xff
A constante deve caber em 12 bits, então não pode expressar uma máscara ampla. Para uma máscara maior, carregue-a em um registrador com li e use and.
O manual do RISC-V diz que o imediato de 12 bits é estendido com sinal para 32 bits antes da operação, então uma constante negativa tem todos os seus bits superiores definidos. andi, ori e xori realizam a operação bit a bit no registrador rs1 e nesse valor estendido e colocam o resultado em rd.
Dois usos comuns seguem. A primeira linha abaixo mantém apenas o bit mais baixo, que é 1 para números ímpares e 0 para números pares. A segunda linha dá o resto após dividir por 8, porque um resto sem sinal por uma potência de dois são os bits mais baixos.
andi t1, t0, 1 andi t1, t0, 7
Exemplo
andi t1, t0, 0xff # keep only the low byte
