bltu

bltu

Assembleur RISC-V Référence

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

bltu effectue le même branchement que blt mais lit les deux registres comme non signés. Le nom signifie branch if less than, unsigned. Le branchement est pris lorsque rs1 est inférieur à rs2, les deux valeurs étant lues comme des nombres non négatifs allant de 0 jusqu'à environ 4 milliards. La page blt décrit le branchement lui-même. Cette page explique pourquoi la lecture non signée dispose de sa propre instruction.

Les mêmes 32 bits représentent des nombres différents selon que le bit de poids fort est lu comme un signe ou comme une partie de la valeur. blt lit les bits comme signés et bltu les lit comme non signés, et les deux lectures sont en désaccord. Un registre dont tous les bits valent 1 vaut -1 pour blt, une valeur très petite, et la plus grande valeur possible pour bltu. Choisir la mauvaise instruction produit un résultat erroné sans aucun message d'erreur.

bltu convient à tout ce qui ne peut pas être négatif, comme les adresses mémoire, les tailles, les compteurs et les positions. Comparer des adresses avec le blt signé échoue dès qu'une adresse est assez grande pour avoir son bit de poids fort à 1, car la lecture signée la rend négative.

Le manuel RISC-V mentionne la même vérification de plage. Une borne de tableau signée peut être vérifiée avec un seul bltu, car tout indice négatif se compare comme supérieur à toute borne non négative.

Un seul bltu vérifie qu'un indice est dans la plage, au moins 0 et inférieur à la taille n.

bltu i, n, ok

Si i est négatif, sa lecture non signée est un très grand nombre et échoue au test, donc une seule comparaison non signée attrape à la fois le cas trop grand et le cas négatif.

Exemple

li t0, 1
li t1, -1
bltu t0, t1, done   # t1 read as unsigned is huge, so jump to 'done'