srai

srai

Assembly RISC-V Referência

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

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)