sltu

sltu

Assembly RISC-V Referência

lyszt.net aborda sltu e outras instruções RISC-V com mais detalhes.

Formato de codificação

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

Descrição

sltu define o registrador de destino como 1 ou 0, assim como slt, e compara dois números como valores sem sinal. O nome significa set less than, unsigned. A página slt aborda o armazenamento de um resultado de comparação como 1 ou 0.

Os mesmos 32 bits podem ser lidos como um número com sinal, com o bit mais significativo indicando negativo e um intervalo de aproximadamente -2 bilhões a +2 bilhões, ou como um número sem sinal, sem negativos e com um intervalo de 0 a cerca de 4 bilhões. slt lê o valor com sinal e sltu lê o sem sinal. Um registrador com todos os bits definidos como 1 é -1 para slt e o maior valor possível para sltu, então as duas instruções podem discordar em entradas idênticas.

Use sltu para quantidades que não podem ser negativas, como endereços de memória, tamanhos, contagens e posições. Comparar dois endereços de memória com o slt com sinal dá um resultado errado quando um endereço é grande o suficiente para definir seu bit mais significativo, já que a leitura com sinal o trata como negativo.

O manual do RISC-V descreve slt e sltu juntos como as comparações com e sem sinal que escrevem 1 em rd se rs1 for menor que rs2 e 0 caso contrário. Ele fornece a linha abaixo como a maneira de testar se é diferente de zero, que é a pseudoinstrução snez.

sltu rd, x0, rs2

A forma de sltu é mostrada abaixo.

sltu rd, rs1, rs2

No caso especial abaixo, rd se torna 1 sempre que rs for qualquer coisa diferente de zero, já que 0 é menor que qualquer outro valor sem sinal. Isso reduz qualquer número a 1 ou 0.

sltu rd, zero, rs

Exemplo

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