sltiu

sltiu

Assembleur RISC-V Référence

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

sltiu combine slti et sltu. Il compare un registre à une constante et traite les deux valeurs comme non signées. Le nom empile les parties : set less than, immediate, unsigned. La forme ci-dessous écrit 1 dans rd lorsque rs1 est inférieur à la constante imm, les deux étant lues comme des nombres non négatifs, et 0 sinon.

sltiu rd, rs1, imm

Non signé, comme sur la page sltu, signifie que le bit de poids fort compte comme un chiffre ordinaire du nombre, donc la plage va de 0 à environ 4 milliards. sltiu gère les contrôles de plage sur des valeurs qui ne peuvent pas être négatives, comme vérifier si un indice est inférieur à la taille d'un tableau, en une seule instruction.

La ligne ci-dessous demande si la valeur est inférieure à 1.

sltiu rd, rs, 1

Zéro est la seule valeur non signée inférieure à 1, donc le résultat est 1 lorsque rs vaut zéro et 0 sinon. Cela teste l'égalité à zéro, et le raccourci seqz en est construit. L'égalité entre deux valeurs en découle. Faites un XOR des deux valeurs, ce qui donne zéro uniquement lorsqu'elles correspondent, et testez le résultat par rapport à zéro.

Le manuel RISC-V indique que la constante est d'abord étendue en signe à 32 bits puis traitée comme un nombre non signé. Une constante négative devient donc une très grande valeur non signée. Le manuel donne sltiu avec la constante 1 comme moyen de tester zéro, ce qui est la pseudo-instruction seqz.

Comme pour slti, les constantes au-delà de la plage de 12 bits sont chargées dans un registre avec li et comparées avec sltu.

Exemple

li t0, -1
sltiu t1, t0, 5   # t1 = 0 (t0 read as unsigned is huge)