sltu

sltu

Ensamblador RISC-V Referencia

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

sltu establece el registro de destino en 1 o 0 como slt, y compara dos números como valores sin signo. El nombre significa set less than, unsigned. La página de slt cubre cómo almacenar el resultado de una comparación como un 1 o un 0.

Los mismos 32 bits se pueden leer como un número con signo, donde el bit superior significa negativo y el rango va aproximadamente de -2 mil millones a +2 mil millones, o como un número sin signo, sin negativos y con un rango de 0 a unos 4 mil millones. slt lee el valor con signo y sltu lee el valor sin signo. Un registro con todos los bits a 1 es -1 para slt y el mayor valor posible para sltu, por lo que las dos instrucciones pueden discrepar con entradas idénticas.

Usa sltu para cantidades que no pueden ser negativas, como direcciones de memoria, tamaños, recuentos y posiciones. Comparar dos direcciones de memoria con el slt con signo da un resultado incorrecto en cuanto una dirección es lo bastante grande como para activar su bit superior, ya que la lectura con signo la trata como negativa.

El manual de RISC-V describe slt y sltu juntas como las comparaciones con signo y sin signo que escriben 1 en rd si rs1 es menor que rs2 y 0 en caso contrario. Proporciona la línea siguiente como la forma de comprobar si no es cero, que es la pseudoinstrucción snez.

sltu rd, x0, rs2

La forma de sltu se muestra a continuación.

sltu rd, rs1, rs2

En el caso especial siguiente, rd se convierte en 1 siempre que rs sea cualquier cosa distinta de cero, ya que 0 es menor que cualquier otro valor sin signo. Esto reduce cualquier número a un 1 o un 0.

sltu rd, zero, rs

Ejemplo

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