sra

sra

Assembly RISC-V Referência

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

sra é o segundo deslocamento à direita, ao lado de srl. O nome significa shift right arithmetic (deslocamento aritmético à direita). A forma abaixo desloca rs1 para a direita pela quantidade contida em rs2.

sra rd, rs1, rs2

Como qualquer deslocamento à direita, ele move os bits em direção à extremidade inferior e descarta os que caem. Seu tratamento das posições superiores vazias difere do srl.

O RISC-V usa um esquema com sinal no qual o bit superior marca o sinal, e um 1 ali significa que o número é negativo. O srl preenche o topo com 0s, o que apaga o marcador de sinal e transforma um número negativo em um grande número positivo. O sra preenche o topo com cópias do bit de sinal existente, então o preenchimento é de 1s para um número negativo e de 0s para um positivo. O número mantém seu sinal.

sra divide um número com sinal por uma potência de dois. Um deslocamento de 1 o divide pela metade, um deslocamento de 3 o divide por 8, e números negativos permanecem negativos. O resultado arredonda para baixo, em direção ao valor mais negativo, então -7 deslocado à direita por 1 dá -4, enquanto a instrução div dá -3. Código de gráficos e áudio geralmente aceita o arredondamento para baixo.

O manual do RISC-V mantém a quantidade de deslocamento nos 5 bits inferiores do registrador rs2. Cinco bits cobrem 0 a 31 posições, então os outros bits de rs2 não têm efeito. O manual descreve sra como um deslocamento aritmético à direita, que copia o bit de sinal original para os bits superiores vagos.

Use sra para números com sinal e srl para padrões de bits brutos ou números que nunca são negativos. Para uma quantidade fixa, use a forma constante srai.

Exemplo

li t0, -8
li t1, 1
sra t2, t0, t1   # t2 = -4 (sign-filled)