slt

slt

Assembly RISC-V Referência

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

slt compara dois números e armazena o resultado como 1 ou 0. O nome significa set less than (definir menor que). A forma abaixo testa se rs1 é menor que rs2. Se o teste for bem-sucedido, a instrução escreve 1 no registrador de destino rd. Se falhar, escreve 0.

slt rd, rs1, rs2

Uma comparação pode ser usada de duas maneiras. Uma instrução de desvio salta com base nela. Alternativamente, a resposta sim ou não pode ser armazenada como um número, 1 para verdadeiro e 0 para falso, e usada depois. slt faz o armazenamento. O assembly representa verdadeiro e falso com o 1 ou 0 armazenado, e esse valor pode ser somado, mascarado ou combinado como qualquer outro número.

A comparação trata os valores como com sinal, então eles podem ser negativos, e -1 conta como menor que 0. A instrução relacionada sltu os trata como sem sinal, o que muda a resposta para valores grandes e para valores que parecem negativos.

O manual do RISC-V descreve slt e sltu 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 também usa slt em uma verificação de overflow para adição com sinal geral. Após a adição, a segunda linha abaixo registra se o segundo operando é negativo, a terceira linha registra se a soma é menor que o primeiro operando, e a última linha salta quando as duas respostas diferem.

add t0, t1, t2
slti t3, t2, 0
slt t4, t0, t1
bne t3, t4, overflow

O raciocínio é que a soma deve ser menor que um operando apenas quando o outro operando é negativo.

Não existe instrução set greater than (definir maior que). Para testar se a é maior que b, troque os operandos e pergunte se b é menor que a. O exemplo compara 3 e 9. Como 3 é menor que 9, t2 é definido como 1.

Exemplo

li t0, 3
li t1, 9
slt t2, t0, t1   # t2 = 1