sltiu

sltiu

Assembly RISC-V Referência

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

sltiu combina slti e sltu. Ele compara um registrador com uma constante e trata ambos os valores como não assinados. O nome empilha as partes: set less than, immediate, unsigned. A forma abaixo escreve 1 em rd quando rs1 está abaixo da constante imm, com ambos lidos como números não negativos, e 0 caso contrário.

sltiu rd, rs1, imm

Não assinado, como na página sltu, significa que o bit mais significativo conta como um dígito comum do número, então o intervalo vai de 0 a cerca de 4 bilhões. sltiu lida com verificações de intervalo em valores que não podem ser negativos, como testar se um índice está abaixo do tamanho de um array, em uma única instrução.

A linha abaixo pergunta se o valor está abaixo de 1.

sltiu rd, rs, 1

Zero é o único valor não assinado abaixo de 1, então o resultado é 1 quando rs é zero e 0 caso contrário. Isso testa a igualdade com zero, e o atalho seqz é construído a partir disso. A igualdade entre dois valores decorre disso. Faça XOR dos dois valores, o que dá zero apenas quando eles coincidem, e teste o resultado em relação a zero.

O manual do RISC-V diz que a constante é primeiro estendida com sinal para 32 bits e então tratada como um número não assinado. Uma constante negativa, portanto, se torna um valor não assinado muito grande. O manual apresenta sltiu com a constante 1 como a maneira de testar zero, que é a pseudoinstrução seqz.

Assim como com slti, constantes além do intervalo de 12 bits são carregadas em um registrador com li e comparadas com sltu.

Exemplo

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