srai
lyszt.net aborda srai e outras instruções RISC-V com mais detalhes.
Formato de codificação
Descrição
srai desloca os bits para a direita por uma quantidade fixa e copia o bit de sinal para as posições superiores vagas, o que mantém os números negativos negativos. É a forma de quantidade constante de sra, e é por isso que o preenchimento preserva o sinal. O i significa imediato, uma constante codificada na instrução.
A sintaxe de srai aparece abaixo, com amount como uma constante entre 0 e 31.
srai rd, rs1, amount
Um deslocamento à direita de uma posição divide um número pela metade e deixa o sinal inalterado, então srai divide um número com sinal por uma potência de dois. A linha seguinte divide um valor com sinal por 8, tanto para entradas positivas quanto negativas.
srai t0, t0, 3
srai arredonda para baixo, em direção ao valor mais negativo. Deslocar -7 para a direita em 1 dá -4, enquanto div com um divisor de 2 dá -3 porque arredonda em direção a zero. Os dois concordam em números não negativos e em divisões sem resto. Eles diferem em um apenas quando um número negativo deixa um resto. Código de gráficos, áudio e sinais geralmente precisa do arredondamento para baixo.
O manual do RISC-V codifica deslocamentos constantes como uma especialização do formato do tipo I, um dos layouts de instrução padrão. A quantidade de deslocamento ocupa os 5 bits inferiores do campo imediato, e o bit 30 da instrução distingue os dois deslocamentos à direita. srai realiza um deslocamento aritmético à direita, e o bit de sinal original preenche os bits superiores vagos.
Dos quatro deslocamentos, srai lida com números com sinal sendo divididos e srli lida com bits brutos ou números que nunca ficam negativos. As formas sem i, sra e srl, recebem uma distância de deslocamento calculada enquanto o programa é executado.
Exemplo
li t0, -8 srai t1, t0, 1 # t1 = -4 (sign-filled)
