bltu
lyszt.net aborda bltu e outras instruções RISC-V com mais detalhes.
Formato de codificação
Descrição
bltu realiza o mesmo desvio que blt, mas lê ambos os registradores como não assinados. O nome significa branch if less than, unsigned. O desvio é tomado quando rs1 é menor que rs2, com ambos os valores lidos como números não negativos de 0 até cerca de 4 bilhões. A página blt descreve o próprio desvio. Esta página explica por que a leitura não assinada tem uma instrução própria.
Os mesmos 32 bits representam números diferentes dependendo se o bit mais significativo é lido como sinal ou como parte do valor. blt lê os bits como assinados e bltu os lê como não assinados, e as duas leituras discordam. Um registrador com todos os bits definidos como 1 é -1 para blt, um valor muito pequeno, e o maior valor possível para bltu. Escolher a instrução errada produz uma resposta errada sem nenhuma mensagem de erro.
bltu serve para qualquer coisa que não possa ser negativa, como endereços de memória, tamanhos, contagens e posições. Comparar endereços com o blt assinado falha quando um endereço é grande o suficiente para ter o bit mais significativo definido, porque a leitura assinada o torna negativo.
O manual do RISC-V observa a mesma verificação de intervalo. Um limite de array assinado pode ser verificado com um único bltu, já que qualquer índice negativo é comparado como maior que qualquer limite não negativo.
Um único bltu verifica que um índice está no intervalo, pelo menos 0 e abaixo do tamanho n.
bltu i, n, ok
Se i for negativo, sua leitura não assinada é um número muito grande e falha no teste, então uma única comparação não assinada captura tanto o caso grande demais quanto o caso negativo.
Exemplo
li t0, 1 li t1, -1 bltu t0, t1, done # t1 read as unsigned is huge, so jump to 'done'
