xori

xori

Assembleur RISC-V Référence

lyszt.net couvre xori et d'autres instructions RISC-V plus en détail.

Format d'encodage

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

Description

xori effectue un XOR bit à bit avec une constante. Avec andi et ori, elle complète les instructions logiques à valeur immédiate. Le i signifie immédiat : une valeur fixe encodée dans l'instruction, donc un second registre est inutile. XOR donne 1 à une position de bit lorsque les deux bits diffèrent (voir la page xor). Étant donné un masque constant, un 1 dans le masque inverse le bit correspondant et un 0 laisse ce bit inchangé.

La syntaxe de xori apparaît ci-dessous. Elle effectue un XOR de la valeur dans rs1 avec la constante imm et écrit le résultat dans rd.

xori rd, rs1, imm

andi efface les bits sélectionnés, ori les définit, et xori les inverse. Inverser deux fois redonne la valeur d'origine.

xori fournit également l'instruction not. Inverser tous les bits d'une valeur revient à faire un XOR avec un masque de tous les 1, et not est un raccourci pour la ligne ci-dessous, car -1 en binaire est composé de tous les 1. RISC-V n'a pas d'instruction dédiée qui inverse chaque bit.

xori rd, rs, -1

Le manuel RISC-V indique que l'immédiat de 12 bits est étendu en signe à 32 bits avant l'opération, donc la constante -1 devient un masque de tous les 1. Il répertorie xori avec la constante -1 comme l'inversion logique bit à bit d'un registre, ce qui est la pseudo-instruction not.

Un petit usage courant consiste à basculer une valeur oui ou non stockée sous forme de 0 ou 1. La ligne suivante la fait passer à l'autre état à chaque exécution.

xori t0, t0, 1

La constante est limitée à 12 bits. Pour des motifs plus larges, chargez le masque dans un registre et utilisez xor.

Exemple

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