andi

andi

Assembleur RISC-V Référence

lyszt.net couvre andi 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

andi effectue un AND bit à bit avec une constante. and prend deux registres, mais andi prend un registre et un immédiat, une valeur fixe encodée dans l'instruction. Le i signifie immédiat. La règle du AND est inchangée : un bit du résultat vaut 1 seulement lorsque les deux bits d'entrée valent 1, donc la constante agit comme un masque qui conserve certains bits et efface les autres. Le masquage et les opérations bit à bit sont traités sur la page and.

La forme de andi est présentée ci-dessous. Elle effectue un AND entre la valeur dans rs1 et la constante imm et écrit le résultat dans rd.

andi rd, rs1, imm

Utilisez-la lorsque vous savez à l'avance quels bits conserver. La ligne suivante conserve les 8 bits de poids faible de t0 et efface les 24 bits supérieurs, extrayant un octet d'une valeur plus grande. Le préfixe 0x indique une constante hexadécimale.

andi t1, t0, 0xff

La constante doit tenir sur 12 bits, elle ne peut donc pas exprimer un masque large. Pour un masque plus grand, chargez-le dans un registre avec li et utilisez and.

Le manuel RISC-V indique que l'immédiat de 12 bits est étendu en signe à 32 bits avant l'opération, donc une constante négative a tous ses bits supérieurs à 1. andi, ori et xori effectuent l'opération bit à bit sur le registre rs1 et cette valeur étendue et placent le résultat dans rd.

Deux usages courants suivent. La première ligne ci-dessous ne conserve que le bit de poids faible, qui vaut 1 pour les nombres impairs et 0 pour les nombres pairs. La deuxième ligne donne le reste après division par 8, car un reste non signé par une puissance de deux correspond aux bits de poids faible.

andi t1, t0, 1
andi t1, t0, 7

Exemple

andi t1, t0, 0xff   # keep only the low byte