xori

xori

Assembly RISC-V Riferimento

lyszt.net tratta xori e altre istruzioni RISC-V in modo più dettagliato.

Formato di codifica

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

Descrizione

xori esegue un XOR bit a bit con una costante. Insieme a andi e ori, completa le istruzioni logiche con immediato. La i significa immediato: un valore fisso codificato nell'istruzione, quindi un secondo registro è superfluo. XOR restituisce 1 in una posizione di bit quando i due bit differiscono (vedi la pagina xor). Data una maschera costante, un 1 nella maschera inverte il bit corrispondente e uno 0 lascia quel bit invariato.

La sintassi di xori è mostrata di seguito. Esegue lo XOR del valore in rs1 con la costante imm e scrive il risultato in rd.

xori rd, rs1, imm

andi azzera i bit selezionati, ori li imposta e xori li inverte. Invertire due volte restituisce il valore originale.

xori fornisce anche l'istruzione not. Invertire tutti i bit di un valore significa eseguire lo XOR con una maschera di tutti 1, e not è una scorciatoia per la riga seguente, perché -1 in binario è composto da tutti 1. RISC-V non ha un'istruzione dedicata che inverta ogni bit.

xori rd, rs, -1

Il manuale RISC-V afferma che l'immediato a 12 bit viene esteso con il segno a 32 bit prima dell'operazione, quindi la costante -1 diventa una maschera di tutti 1. Elenca xori con la costante -1 come l'inversione logica bit a bit di un registro, ovvero la pseudo-istruzione not.

Un piccolo uso comune inverte un valore sì o no mantenuto come 0 o 1. La riga seguente lo commuta nell'altro stato ogni volta che viene eseguita.

xori t0, t0, 1

La costante è limitata a 12 bit. Per pattern più ampi, caricare la maschera in un registro e usare xor.

Esempio

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