bltu

bltu

Ensamblador RISC-V Referencia

lyszt.net cubre bltu y otras instrucciones RISC-V con más detalle.

Formato de codificación

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

Descripción

bltu realiza la misma bifurcación que blt, pero lee ambos registros como sin signo. El nombre significa branch if less than, unsigned (bifurcar si es menor que, sin signo). La bifurcación se toma cuando rs1 es menor que rs2, con ambos valores leídos como números no negativos desde 0 hasta aproximadamente 4 mil millones. La página de blt describe la bifurcación en sí. Esta página explica por qué la lectura sin signo tiene una instrucción propia.

Los mismos 32 bits representan números diferentes según si el bit superior se lee como signo o como parte del valor. blt lee los bits como con signo y bltu los lee como sin signo, y ambas lecturas no coinciden. Un registro con todos los bits a 1 es -1 para blt, un valor muy pequeño, y el mayor valor posible para bltu. Elegir la instrucción equivocada produce una respuesta incorrecta sin ningún mensaje de error.

bltu sirve para cualquier cosa que no pueda ser negativa, como direcciones de memoria, tamaños, recuentos y posiciones. Comparar direcciones con el blt con signo falla en cuanto una dirección es lo bastante grande como para tener el bit superior a 1, porque la lectura con signo la vuelve negativa.

El manual de RISC-V señala la misma comprobación de rango. Un límite de array con signo puede comprobarse con un solo bltu, ya que cualquier índice negativo se compara como mayor que cualquier límite no negativo.

Un solo bltu comprueba que un índice esté dentro del rango, al menos 0 y por debajo del tamaño n.

bltu i, n, ok

Si i es negativo, su lectura sin signo es un número muy grande y no pasa la prueba, así que una sola comparación sin signo detecta tanto el caso de demasiado grande como el negativo.

Ejemplo

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