VSRA.VI

RISC-V VSRA.VI 指令详解

指令手册V-type

逐元素算术右移。

指令语法

vsra.vi vd, vs2, uimm, vm
操作数说明
V 1.0;要求向量状态已启用、vill=0及受支持的vtype/SEW。vd/vs2是EEW=SEW、EMUL=LMUL的向量组,组起点须对齐。uimm为0–31的5位零扩展立即数;SEW=64时也不能编码32–63。
32位OP-V:opcode=1010111,funct6=101001,funct3=011;vm在bit25,vs2在bits24:20,uimm在bits19:15,vd在bits11:7。shamt仅取低lg2(SEW)位。算术右移复制符号位。不使用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向量运算

指令行为说明

VSRA.VI 执行 RVV 单宽整数算术右移。每个活动元素从 vs2[i] 读取源值,移位量来自 uimm,并只使用官方按 SEW 规定的低位部分;结果写入 vd 的活动元素。vm=0 时由 v0.t 选择参与本条移位的 body 元素。

VSRA.VI 指令解析与执行动画

从 OP-V 编码字段开始,展示 VSRA 如何取移位量低位、按有符号元素执行算术右移并保留符号。

输入的指令
vsra.vi

教学环境: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 不更新目标;步骤不是处理器周期。

执行环境
立即数值
4 -> shamt 4
5-bit unsigned uimm;移位量取低 lg2(SEW) 位
OP-V encodingvsra.vi
funct6
101001
vm
0
vs2
01000
uimm
00100
funct3
011
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0x00fa
0x010b
0x011c
0x012d
0x013e
0x014f
0x0160
0x0171
>>
>>
>>
>>
>>
>>
>>
>>
imm
0x0004
0x0004
0x0004
0x0004
0x0004
0x0004
0x0004
0x0004
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
当前步骤

显示 OP-V 32 位编码字段

vsra.vi 使用 OP-V 编码。动画把固定字段、寄存器字段、vm 和 uimm 字段放在同一条编码带中。

动画展示 OP-V 解码、移位量低位选择、逐元素右移与目标写回;不模拟流水线或执行时延。

快速理解与检索要点

VSRA.VI 对当前 vl 范围内的活动元素逐 lane 执行算术右移。移位量不是完整整数值直接使用,而是按 SEW 只取低 log2(SEW) 位;mask-off 和 tail 元素按当前 vtype policy 处理。

VSRA 属于 OP-V 向量算术编码,funct6=101001;.vi 形式由 funct3=011 选择。
VI 形式使用 5 位无符号 uimm 字段作为移位量来源。 实际移位量只取低 log2(SEW) 位。
VSRA.VI 按有符号元素算术右移并保留符号,按有符号元素符号扩展;普通 VSLL/VSRL/VSRA 不使用 vxrm 舍入,也不设置 vxsat。
vm=0 使用 v0 mask,vm=1 为未掩码形式;mask-off body 元素和 tail 元素的目标结果由当前 mask/tail policy 决定。

向量执行上下文

V 1.0;要求向量状态已启用、vill=0及受支持的vtype/SEW。vd/vs2是EEW=SEW、EMUL=LMUL的向量组,组起点须对齐。uimm为0–31的5位零扩展立即数;SEW=64时也不能编码32–63。

32位OP-V:opcode=1010111,funct6=101001,funct3=011;vm在bit25,vs2在bits24:20,uimm在bits19:15,vd在bits11:7。shamt仅取低lg2(SEW)位。算术右移复制符号位。不使用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。

The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture — Version 20260120, Chapter 31

常见使用场景

位操作与掩码

假定V/VS已启用、合法受支持vtype、LMUL=m1、VLEN=4096、XLEN=64、vstart=0,源和全部body掩码已初始化。SEW=8, vl=4, uimm=3, v12=[1,127,128,255] → v8=[0,15,240,255] (0,15,-16,-1)。inactive/tail按vma/vta,不保证清零。正常完成后vstart=0。

向量运算

假定V/VS已启用、合法受支持vtype、LMUL=m1、VLEN=4096、XLEN=64、vstart=0,源和全部body掩码已初始化。SEW=8, vl=4, uimm=3, v12=[1,127,128,255] → v8=[0,15,240,255] (0,15,-16,-1)。inactive/tail按vma/vta,不保证清零。正常完成后vstart=0。

有符号移位

假定V/VS已启用、合法受支持vtype、LMUL=m1、VLEN=4096、XLEN=64、vstart=0,源和全部body掩码已初始化。SEW=8, vl=4, uimm=3, v12=[1,127,128,255] → v8=[0,15,240,255] (0,15,-16,-1)。inactive/tail按vma/vta,不保证清零。正常完成后vstart=0。

使用前检查清单

语法检查
  • V 1.0;要求向量状态已启用、vill=0及受支持的vtype/SEW。vd/vs2是EEW=SEW、EMUL=LMUL的向量组,组起点须对齐。uimm为0–31的5位零扩展立即数;SEW=64时也不能编码32–63。
  • 32位OP-V:opcode=1010111,funct6=101001,funct3=011;vm在bit25,vs2在bits24:20,uimm在bits19:15,vd在bits11:7。shamt仅取低lg2(SEW)位。算术右移复制符号位。不使用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。

容易混淆 / 常见误区

不要把 VSRA.VI 的移位量理解为完整源值;实际移位量只取按 SEW 规定的低位。
VSRA.VI 是普通整数移位,不使用 vxrm 舍入,也不会因为移出位而设置 vxsat。
mask-off body 元素不是确定写 0;目标元素按当前 mask policy 处理。

常见问题

VSRA.VI 能编码多大的移位量?

uimm只能编码0–31。实际移位量取低lg2(SEW)位,因此SEW=8时31变成7,SEW=64时仍不能编码32–63。

VSRA.VI 与相邻移位指令有什么区别?

VSRA 把 vs2 元素解释为有符号值进行算术右移;VSRL 对相同位模式做逻辑右移,高位补 0。