bltu

bltu

Assembly RISC-V Riferimento

lyszt.net tratta bltu e altre istruzioni RISC-V in modo più dettagliato.

Formato di codifica

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

Descrizione

bltu esegue lo stesso salto di blt ma legge entrambi i registri come senza segno. Il nome sta per branch if less than, unsigned. Il salto viene preso quando rs1 è minore di rs2, con entrambi i valori letti come numeri non negativi da 0 fino a circa 4 miliardi. La pagina blt descrive il salto stesso. Questa pagina spiega perché la lettura senza segno ha un'istruzione propria.

Gli stessi 32 bit rappresentano numeri diversi a seconda che il bit più alto sia letto come segno o come parte del valore. blt legge i bit come con segno e bltu li legge come senza segno, e le due letture sono in disaccordo. Un registro con tutti i bit impostati a 1 è -1 per blt, un valore molto piccolo, e il valore più grande possibile per bltu. Scegliere l'istruzione sbagliata produce una risposta errata senza alcun messaggio di errore.

bltu è adatto a tutto ciò che non può essere negativo, come indirizzi di memoria, dimensioni, conteggi e posizioni. Confrontare gli indirizzi con il blt con segno fallisce quando un indirizzo è abbastanza grande da avere il bit più alto impostato, perché la lettura con segno lo rende negativo.

Il manuale RISC-V nota lo stesso controllo di intervallo. Un limite di array con segno può essere verificato con un singolo bltu, poiché qualsiasi indice negativo viene confrontato come maggiore di qualsiasi limite non negativo.

Un singolo bltu verifica che un indice sia nell'intervallo, almeno 0 e inferiore alla dimensione n.

bltu i, n, ok

Se i è negativo, la sua lettura senza segno è un numero molto grande e fallisce il test, quindi un singolo confronto senza segno cattura sia il caso troppo grande sia quello negativo.

Esempio

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