sltiu

sltiu

Ensamblador RISC-V Referencia

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

sltiu combina slti y sltu. Compara un registro con una constante y trata ambos valores como sin signo. El nombre apila las partes: set less than, immediate, unsigned. La forma siguiente escribe 1 en rd cuando rs1 es menor que la constante imm, leyendo ambos como números no negativos, y 0 en caso contrario.

sltiu rd, rs1, imm

Sin signo, como en la página de sltu, significa que el bit más significativo cuenta como un dígito ordinario del número, por lo que el rango va de 0 a unos 4 mil millones. sltiu realiza comprobaciones de rango sobre valores que no pueden ser negativos, como comprobar si un índice es menor que el tamaño de un arreglo, en una sola instrucción.

La línea siguiente pregunta si el valor es menor que 1.

sltiu rd, rs, 1

El cero es el único valor sin signo menor que 1, así que el resultado es 1 cuando rs es cero y 0 en caso contrario. Esto comprueba si es igual a cero, y la abreviatura seqz se construye a partir de ello. La igualdad entre dos valores se deduce de ello. Aplica XOR a los dos valores, lo que da cero solo cuando coinciden, y comprueba si el resultado es cero.

El manual de RISC-V dice que la constante se extiende primero con signo a 32 bits y luego se trata como un número sin signo. Por lo tanto, una constante negativa se convierte en un valor sin signo muy grande. El manual presenta sltiu con la constante 1 como la forma de comprobar si es cero, que es la pseudoinstrucción seqz.

Al igual que con slti, las constantes fuera del rango de 12 bits se cargan en un registro con li y se comparan con sltu.

Ejemplo

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