xori

xori

Assembly RISC-V Referência

lyszt.net aborda xori e outras instruções RISC-V com mais detalhes.

Formato de codificação

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Descrição

xori realiza XOR bit a bit com uma constante. Juntamente com andi e ori, ela completa as instruções lógicas com imediato. O i significa imediato: um valor fixo codificado na instrução, então um segundo registrador é desnecessário. XOR resulta em 1 em uma posição de bit quando os dois bits diferem (veja a página xor). Dada uma máscara constante, um 1 na máscara inverte o bit correspondente e um 0 deixa esse bit inalterado.

A sintaxe de xori aparece abaixo. Ela faz XOR do valor em rs1 com a constante imm e escreve o resultado em rd.

xori rd, rs1, imm

andi limpa bits selecionados, ori os define, e xori os inverte. Inverter duas vezes retorna o valor original.

xori também fornece a instrução not. Inverter todos os bits de um valor significa XOR com uma máscara de todos os 1s, e not é uma abreviação para a linha abaixo, porque -1 em bits é todos os 1s. RISC-V não tem uma instrução dedicada que inverta todos os bits.

xori rd, rs, -1

O manual do RISC-V afirma que o imediato de 12 bits é estendido com sinal para 32 bits antes da operação, então a constante -1 se torna uma máscara de todos os 1s. Ele lista xori com a constante -1 como a inversão lógica bit a bit de um registrador, que é a pseudoinstrução not.

Um uso pequeno comum alterna um valor sim ou não mantido como 0 ou 1. A linha seguinte o alterna para o outro estado sempre que é executada.

xori t0, t0, 1

A constante é limitada a 12 bits. Para padrões mais amplos, carregue a máscara em um registrador e use xor.

Exemplo

li t0, 0
xori t1, t0, -1   # t1 = -1 (every bit flipped)