bgeu
lyszt.net aborda bgeu e outras instruções RISC-V com mais detalhes.
Formato de codificação
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'
