SRA 的移位量来自哪里?
寄存器版本的移位量来自 rs2 的低 log2(XLEN) 位。
将rs1按rs2的低log2(XLEN)位算术右移(高位用原符号位填充),结果写入rd
SRA 使用 opcode 0110011(0x33)、funct3 101、funct7 0100000。rs1 和 rs2 字段选择两个源寄存器,rd 字段选择目标寄存器。
SRA指令采用R型格式。将rs1的值按rs2低log2(XLEN)位指定的量进行算术右移(RV32取rs2[4:0],RV64取rs2[5:0]),高位用原符号位填充,低位丢弃,结果写入rd。funct7=0100000, funct3=101, bit30=1。bit30=1将其与SRL区分开来。用于有符号整数的动态除以2的幂和符号保持右移。
SRA 执行算术右移,高位复制原符号位,结果写入 rd。移位量来自 rs2 的低 log2(XLEN) 位。
结合 «sra x5, x6, x7 # x5 = x6 >> (x7[4:0]) (arithmetic, sign fill)» 等实际代码理解该场景。
结合 «sra x5, x6, x7 # x5 = x6 >> (x7[4:0]) (arithmetic, sign fill)» 等实际代码理解该场景。
寄存器版本的移位量来自 rs2 的低 log2(XLEN) 位。
逻辑右移高位补 0;算术右移高位复制原符号位,通常用于保持有符号数的符号。