blt

blt

Assembly RISC-V Referência

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

blt compara dois valores e desvia quando o primeiro é menor. beq e bne testam igualdade em vez disso. O nome significa branch if less than (desviar se menor que). A forma abaixo salta para a posição rotulada quando rs1 é menor que rs2, e segue para a próxima instrução caso contrário.

blt rs1, rs2, label

A página beq explica desvios, rótulos e como um salto funciona.

A comparação trata ambos os valores como com sinal, então eles podem ser negativos. -1 é menor que 0, e qualquer número negativo é menor que qualquer número positivo. Comparações sem sinal usam uma instrução separada, bltu, e as duas discordam em qualquer valor cujo bit mais significativo esteja definido.

Laços de contagem dependem de blt. A linha abaixo se repete enquanto o contador t0 permanecer abaixo de seu limite t1.

blt t0, t1, loop

Quando o contador atinge o limite, o desvio não é tomado e o laço termina. Verificações de limites usam a mesma instrução para manter um valor abaixo de um máximo antes que o programa o utilize.

O manual do RISC-V especifica que blt e bltu tomam o desvio quando rs1 é menor que rs2, comparando com sinal e sem sinal, respectivamente. Ele também observa que bgt, bgtu, ble e bleu podem ser sintetizados invertendo os operandos de blt, bltu, bge e bgeu.

O RISC-V não fornece desvio se maior. Para testar se a é maior que b, inverta a comparação e teste se b é menor que a. O montador oferece um atalho bgt que troca os operandos para você.

Exemplo

li t0, 2
li t1, 5
blt t0, t1, done   # 2 < 5, so jump to 'done'