sra
lyszt.net 更详细地介绍了 sra 和其他 RISC-V 指令。
编码格式
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
描述
sra 是第二种右移,紧邻 srl。该名称代表 shift right arithmetic(算术右移)。下面的形式将 rs1 右移 rs2 中保存的量。
sra rd, rs1, rs2
与任何右移一样,它将位向低位端移动,并丢弃掉落的位。它对空出的高位位置的处理与 srl 不同。
RISC-V 使用有符号方案,其中最高位标记符号,该位为 1 表示该数为负数。srl 用 0 填充高位,这会抹去符号标记,把负数变成很大的正数。sra 用现有符号位的副本填充高位,因此负数的填充为 1,正数的填充为 0。该数保持其符号。
sra 将有符号数除以 2 的幂。移位 1 将其减半,移位 3 将其除以 8,负数保持为负数。结果向下舍入,即向更负的值舍入,因此 -7 右移 1 得到 -4,而 div 指令得到 -3。图形和音频代码通常接受向下舍入。
RISC-V 手册将移位量保存在寄存器 rs2 的低 5 位中。5 位覆盖 0 到 31 位,因此 rs2 的其他位没有影响。手册将 sra 描述为算术右移,它把原始符号位复制到空出的高位中。
对有符号数使用 sra,对原始位模式或永不为负的数使用 srl。对于固定量,使用常量形式 srai。
示例
li t0, -8 li t1, 1 sra t2, t0, t1 # t2 = -4 (sign-filled)
