sltu

sltu

Assembleur RISC-V Référence

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

sltu définit le registre de destination à 1 ou 0 comme slt, et il compare deux nombres en tant que valeurs non signées. Le nom signifie set less than, unsigned. La page slt couvre le stockage d'un résultat de comparaison sous la forme d'un 1 ou d'un 0.

Les mêmes 32 bits peuvent être lus comme un nombre signé, avec le bit de poids fort signifiant négatif et une plage d'environ -2 milliards à +2 milliards, ou comme un nombre non signé, sans négatifs et avec une plage de 0 à environ 4 milliards. slt lit la valeur signée et sltu lit la valeur non signée. Un registre dont tous les bits sont à 1 vaut -1 pour slt et la plus grande valeur possible pour sltu, donc les deux instructions peuvent être en désaccord sur des entrées identiques.

Utilisez sltu pour les quantités qui ne peuvent pas être négatives, telles que les adresses mémoire, les tailles, les compteurs et les positions. Comparer deux adresses mémoire avec le slt signé donne un résultat erroné dès qu'une adresse est suffisamment grande pour que son bit de poids fort soit à 1, car la lecture signée la traite comme négative.

Le manuel RISC-V décrit slt et sltu ensemble comme les comparaisons signée et non signée qui écrivent 1 dans rd si rs1 est inférieur à rs2 et 0 sinon. Il donne la ligne ci-dessous comme moyen de tester la non-nullité, ce qui est la pseudo-instruction snez.

sltu rd, x0, rs2

La forme de sltu est montrée ci-dessous.

sltu rd, rs1, rs2

Dans le cas particulier ci-dessous, rd devient 1 chaque fois que rs est différent de zéro, puisque 0 est inférieur à toute autre valeur non signée. Cela réduit tout nombre à un 1 ou un 0.

sltu rd, zero, rs

Exemple

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