bgeu

bgeu

Assembly RISC-V Referência

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

bgeu é a versão sem sinal de bge e o oposto de bltu. O nome significa branch if greater than or equal, unsigned. Ele salta para o rótulo quando rs1 é pelo menos rs2, com ambos lidos como números não negativos. Veja bge para a comparação e bltu para o que o sem sinal muda.

Com bgeu, a família tem seis branches. Há três perguntas, igual, menor que e maior ou igual, e as duas últimas vêm em uma forma com sinal e uma sem sinal. beq e bne testam igualdade, blt e bge comparam valores com sinal, e bltu e bgeu comparam valores sem sinal. Essas seis, junto com a troca dos operandos para as direções maior que e menor ou igual, cobrem toda comparação que um programa precisa.

bgeu é adequado para limites de quantidades que não podem ser negativas. Exemplos são sair de um laço quando uma posição chega ao fim, rejeitar um índice que atingiu o tamanho do array e desviar para um handler quando um comprimento atinge a capacidade. Comparar endereços de memória usa bltu e bgeu, já que endereços são sem sinal, e as versões com sinal dão resultados errados ali.

O manual do RISC-V diz que limites de array com sinal podem ser verificados com um único branch sem sinal, já que qualquer índice negativo é comparado como maior que qualquer limite não negativo. bgeu e bltu são as duas formas dessa verificação.

A linha abaixo realiza a verificação combinada de limites em uma única instrução.

bgeu i, n, error

Ela captura um índice grande demais ou negativo, porque um índice negativo é lido como um valor sem sinal enorme e falha no teste.

Exemplo

li t0, -1
li t1, 1
bgeu t0, t1, done   # t0 read as unsigned is huge, so jump to 'done'