bge

bge

Assembly RISC-V Referência

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

bge faz par com blt e inverte sua condição. As letras significam branch if greater than or equal (desvio se maior ou igual). Quando rs1 é pelo menos rs2, a instrução abaixo salta para a posição rotulada. Caso contrário, a execução continua com a próxima instrução.

bge rs1, rs2, label

Para quaisquer dois valores, exatamente um entre blt e bge realiza o desvio, de modo que os dois cobrem todos os casos. A comparação é descrita em blt, e os desvios em geral em beq.

bge costuma aparecer no topo de um laço como teste de saída. A linha abaixo deixa o laço assim que o contador t1 atinge seu limite t2.

bge t1, t2, done

O corpo do laço vem em seguida, e um salto incondicional em seu final retorna ao topo. Testar antes do corpo trata zero repetições, já que um corpo cuja condição já é satisfeita nunca é executado.

A parte or equal (ou igual) decide o comportamento na fronteira. bge desvia quando os dois valores são iguais, e erros de off-by-one em laços geralmente remontam a essa fronteira. Um laço que conta de 0 até n sai quando o contador atinge n.

De acordo com o manual RISC-V, bge e bgeu realizam o desvio quando rs1 é maior ou igual a rs2, comparando valores com sinal e sem sinal, respectivamente. Um deslocamento de desvio é um valor de 12 bits medido em múltiplos de 2 bytes.

Assim como em blt, a comparação é com sinal, então valores negativos são permitidos. bgeu é a forma sem sinal, usada para endereços e tamanhos. Um uso comum é verificar que um valor é não negativo, como na linha abaixo.

bge t0, zero, ok

Exemplo

bge t1, t2, done   # leave the loop once i >= n