slt

slt

Assembleur RISC-V Référence

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

slt compare deux nombres et stocke le résultat sous la forme 1 ou 0. Le nom signifie set less than (définir inférieur à). La forme ci-dessous teste si rs1 est inférieur à rs2. Si le test réussit, l'instruction écrit 1 dans le registre de destination rd. S'il échoue, elle écrit 0.

slt rd, rs1, rs2

Une comparaison peut être utilisée de deux manières. Une instruction de branchement saute en fonction de celle-ci. Sinon, la réponse oui ou non peut être stockée sous forme de nombre, 1 pour vrai et 0 pour faux, et utilisée plus tard. slt effectue le stockage. L'assembleur représente vrai et faux par le 1 ou le 0 stocké, et cette valeur peut être additionnée, masquée ou combinée comme n'importe quel autre nombre.

La comparaison traite les valeurs comme signées, elles peuvent donc être négatives, et -1 compte comme inférieur à 0. L'instruction associée sltu les traite comme non signées, ce qui change la réponse pour les grandes valeurs et pour les valeurs qui semblent négatives.

Le manuel RISC-V décrit slt et sltu comme les comparaisons signée et non signée qui écrivent 1 dans rd si rs1 est inférieur à rs2 et 0 sinon. Il utilise également slt dans une vérification de débordement pour l'addition signée générale. Après l'addition, la deuxième ligne ci-dessous enregistre si le deuxième opérande est négatif, la troisième ligne enregistre si la somme est inférieure au premier opérande, et la dernière ligne saute lorsque les deux réponses diffèrent.

add t0, t1, t2
slti t3, t2, 0
slt t4, t0, t1
bne t3, t4, overflow

Le raisonnement est que la somme ne devrait être inférieure à un opérande que lorsque l'autre opérande est négatif.

Il n'existe pas d'instruction set greater than (définir supérieur à). Pour tester si a est supérieur à b, échangez les opérandes et demandez si b est inférieur à a. L'exemple compare 3 et 9. Comme 3 est inférieur à 9, t2 est défini à 1.

Exemple

li t0, 3
li t1, 9
slt t2, t0, t1   # t2 = 1