lhu
lyszt.net aborda lhu e outras instruções RISC-V com mais detalhes.
Formato de codificação
Descrição
lhu lê uma meia-palavra (16 bits, ou 2 bytes) da memória e a trata como não assinada. Ela faz par com lh, e as duas diferem em como preenchem a metade superior do registrador de destino. Ambas leem 16 bits com o mesmo endereçamento. Meias-palavras e a forma de endereçamento são abordadas na página lh. A forma de lhu é mostrada abaixo.
lhu rd, offset(rs1)
Um registrador contém 32 bits, então um carregamento de 16 bits deve preencher os 16 bits superiores. lh copia o bit de sinal para eles, o que mantém os números negativos negativos. lhu os preenche com 0s, chamado de extensão de zeros, então o resultado é sempre não negativo, de 0 a 65535. O u no nome marca a leitura não assinada.
Os dados decidem qual usar. Escolha lh para valores que podem ser negativos e lhu para valores que nunca são negativos. O padrão de bits 0xFFFF carregado com lhu é 65535, e os mesmos bits carregados com lh são -1.
O manual RISC-V define lhu como carregar um valor de 16 bits da memória e estendê-lo com zeros para 32 bits antes de armazená-lo em rd. O endereço efetivo é o registrador rs1 mais o offset de 12 bits estendido com sinal.
A maioria dos dados de 16 bits é não assinada. Códigos de caracteres em algumas codificações de texto, números de porta e checksums em dados de rede, formatos de pixel de 16 bits e campos de comprimento em formatos de arquivo são exemplos. A extensão de sinal daria um valor errado para qualquer um deles assim que o bit superior estiver definido, então lhu é o carregamento correto. Meias-palavras ficam a 2 bytes de distância, então loops sobre elas movem o endereço em 2.
Exemplo
.data val: .half 0xffff .text la t0, val lhu t1, 0(t0) # t1 = 65535 (zero-extended)
