VSRL.VX 的移位量可以大于 SEW 吗?
编码或源操作数可以提供更宽的值,但普通 RVV 移位实际只使用按 SEW 选择的低 log2(SEW) 位作为移位量。
逐元素逻辑右移。
VSRL.VX 执行 RVV 单宽整数逻辑右移。每个活动元素从 vs2[i] 读取源值,移位量来自 x[rs1],并只使用官方按 SEW 规定的低位部分;结果写入 vd 的活动元素。vm=0 时由 v0.t 选择参与本条移位的 body 元素。
从 OP-V 编码字段开始,展示 VSRL 如何取移位量低位、对活动元素逻辑右移并高位补零。
教学环境:V 1.0、向量状态已启用、合法受支持 vtype/SEW,LMUL=m1、VLEN=4096、vstart=0,VLMAX=4096/16。同宽源/目标可重叠;同名源须有相同元素。v0.t 时 vd/vs2/vs1 不可为 v0。只取移位量低 log2(SEW) 位,结果保留低 SEW 位;inactive/tail 不显示确定值。VL=0 不更新目标;步骤不是处理器周期。
vsrl.vx 使用 OP-V 编码。动画把固定字段、寄存器字段、vm 和 rs1 字段放在同一条编码带中。
动画展示 OP-V 解码、移位量低位选择、逐元素右移与目标写回;不模拟流水线或执行时延。
VSRL.VX 对当前 vl 范围内的活动元素逐 lane 执行逻辑右移。移位量不是完整整数值直接使用,而是按 SEW 只取低 log2(SEW) 位;mask-off 和 tail 元素按当前 vtype policy 处理。
V 1.0;要求向量状态已启用、vill=0及受支持的vtype/SEW。vd/vs2是EEW=SEW、EMUL=LMUL的向量组,组起点须对齐。x[rs1]提供移位量,x0提供零;标量先按XLEN/SEW规则转换。
32位OP-V:opcode=1010111,funct6=101000,funct3=100;vm在bit25,vs2在bits24:20,rs1在bits19:15,vd在bits11:7。shamt仅取低lg2(SEW)位。逻辑右移高位补0。不使用vxrm,也不改变vxsat。
v0.t为可选掩码(vm=0),省略为vm=1。masked vd不能包含v0;v0不能同时提供EEW=1掩码和SEW数据。同宽源/目标可重叠。仅活动vstart≤i<vl计算;prestart不变,inactive/tail按vma/vta;vstart≥vl(含vl=0)不更新目标。正常完成后vstart=0。
假定V/VS已启用、合法受支持vtype、LMUL=m1、VLEN=4096、XLEN=64、vstart=0,源和全部body掩码已初始化。SEW=8, vl=4, x5=3, v12=[1,127,128,255] → v8=[0,15,16,31]。inactive/tail按vma/vta,不保证清零。正常完成后vstart=0。
假定V/VS已启用、合法受支持vtype、LMUL=m1、VLEN=4096、XLEN=64、vstart=0,源和全部body掩码已初始化。SEW=8, vl=4, x5=3, v12=[1,127,128,255] → v8=[0,15,16,31]。inactive/tail按vma/vta,不保证清零。正常完成后vstart=0。
假定V/VS已启用、合法受支持vtype、LMUL=m1、VLEN=4096、XLEN=64、vstart=0,源和全部body掩码已初始化。SEW=8, vl=4, x5=3, v12=[1,127,128,255] → v8=[0,15,16,31]。inactive/tail按vma/vta,不保证清零。正常完成后vstart=0。
编码或源操作数可以提供更宽的值,但普通 RVV 移位实际只使用按 SEW 选择的低 log2(SEW) 位作为移位量。
VSRL 是逻辑右移,高位补 0;VSRA 是算术右移,会把有符号元素的符号位向高位扩展。