bltu

bltu

Assembly RISC-V Referência

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

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'