首页/指令库/VSSRA-VX
VSSRA.VX

RISC-V VSSRA.VX 指令详解

指令手册OP-V / OPIVX

VSSRA.VX 按 x[rs1] 标量值给出的移位量执行逐元素定点舍入算术右移。

指令语法

vssra.vx vd, vs2, rs1, vm
操作数说明
vd/vs2 是 EEW=SEW、EMUL=LMUL 的向量组,起点须合法对齐;同宽源/目标可重叠,同名源读取相同初值。rs1 选择整数寄存器;XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展,x0 提供零。
32 位 OP-V:opcode=1010111,funct6=101011,funct3=100;vm 在 bit25,vs2 在 bits24:20,rs1 在 bits19:15,vd 在 bits11:7。省略 v0.t 为 vm=1,给出为 vm=0。
d 仅取移位量低 lg2(SEW) 位;按补码有符号数算术右移,再按 vxrm 计算 (v >> d)+r。rnu 最近向上、rne 最近偶数、rdn 向下、rod 奇数舍入;d=0 保留原值。该操作不饱和、不改变 vxsat。
要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 vtype/SEW。仅活动 vstart≤i<vl 元素计算;prestart 保持不变,inactive/tail 按 vma/vta 保留旧值或全1。vstart≥vl(含 vl=0)不更新任何目标元素。masked vd 不可含 v0;v0 不可同时作 EEW=1 掩码和 SEW 数据源。正常完成后 vstart=0;实现可拒绝无法由本实现产生的非零 vstart。
V向量运算

指令行为说明

VSSRA.VX 是 RISC-V V 扩展定点缩放移位指令。它读取 vs2 的活动元素,使用 x[rs1] 标量值的低位作为移位量,按 vxrm 对被移出的位舍入,然后把 SEW 位结果写入 vd。

VSSRA.VX 指令解析与执行动画

从 OP-V 编码字段开始,展示 VSSRA 如何取移位量低位、按 vxrm 舍入,并以有符号算术右移保留符号。

输入的指令
vssra.vx

教学环境: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 不显示确定值。输入非负 SEW 位模式;VSSRA 按补码有符号解释,VSSRL 按无符号解释,再按 vxrm 舍入;不改变 vxsat。d=0 不舍入。x0 提供零;正常完成后 vstart=0。VL=0 不更新目标;步骤不是处理器周期。

执行环境
移位量规则:只使用 x[rs1]的低 lg2(SEW) 位。
OP-V encodingvssra.vx
funct6
101011
vm
0
vs2
01000
rs1
01011
funct3
100
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0x0035
0x800c
0x0080
0x0123
0x801b
0x0019
0x0035
0x802a
round>>
round>>
round>>
round>>
round>>
round>>
round>>
round>>
x11
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
当前步骤

显示 OP-V 32 位编码字段

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

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

快速理解与检索要点

VSSRA.VX 可以理解为“右移 + vxrm 舍入”的 RVV 定点缩放操作:活动 lane 从 vs2 取值,从 x[rs1] 标量值取移位量,舍入后写回 vd。

官方语法为 `vssra.vx vd, vs2, rs1, vm`;vm 控制未掩码或 v0.t 掩码执行。
VSSRA 使用 V 扩展 fixed-point rounding mode CSR vxrm;舍入模式包括 rnu、rne、rdn、rod。
算术右移后按 vxrm 舍入,再以 SEW 位写回;仅活动 vstart≤i<vl 元素计算。prestart 保持不变,inactive/tail 由 vma/vta 处理;vl=0 或 vstart≥vl 不更新任何目标元素。
VSSRA 不设置 vxsat,区别于带饱和窄化语义的 VNCLIP/VNCLIPU。

向量执行上下文

vd/vs2 是 EEW=SEW、EMUL=LMUL 的向量组,起点须合法对齐;同宽源/目标可重叠,同名源读取相同初值。rs1 选择整数寄存器;XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展,x0 提供零。

32 位 OP-V:opcode=1010111,funct6=101011,funct3=100;vm 在 bit25,vs2 在 bits24:20,rs1 在 bits19:15,vd 在 bits11:7。省略 v0.t 为 vm=1,给出为 vm=0。

d 仅取移位量低 lg2(SEW) 位;按补码有符号数算术右移,再按 vxrm 计算 (v >> d)+r。rnu 最近向上、rne 最近偶数、rdn 向下、rod 奇数舍入;d=0 保留原值。该操作不饱和、不改变 vxsat。

要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 vtype/SEW。仅活动 vstart≤i<vl 元素计算;prestart 保持不变,inactive/tail 按 vma/vta 保留旧值或全1。vstart≥vl(含 vl=0)不更新任何目标元素。masked vd 不可含 v0;v0 不可同时作 EEW=1 掩码和 SEW 数据源。正常完成后 vstart=0;实现可拒绝无法由本实现产生的非零 vstart。

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

常见使用场景

定点缩放

假定 V/VS 已启用、合法 e8,m1,tu,mu、VLEN=4096、XLEN=64、vl=4、vstart=0、vxrm=rne,v0.mask[0..3]=1111,v12=[1,127,128,255],x5=3。d=3,最近偶数舍入后 v8=[0,16,240,0] (0,16,-16,0);源不变,inactive/tail 保持旧值,vxsat 不变,正常完成后 vstart=0。

向量移位

假定 V/VS 已启用、合法 e8,m1,tu,mu、VLEN=4096、XLEN=64、vl=4、vstart=0、vxrm=rne,v0.mask[0..3]=1111,v12=[1,127,128,255],x5=3。d=3,最近偶数舍入后 v8=[0,16,240,0] (0,16,-16,0);源不变,inactive/tail 保持旧值,vxsat 不变,正常完成后 vstart=0。

DSP 数据路径

假定 V/VS 已启用、合法 e8,m1,tu,mu、VLEN=4096、XLEN=64、vl=4、vstart=0、vxrm=rne,v0.mask[0..3]=1111,v12=[1,127,128,255],x5=3。d=3,最近偶数舍入后 v8=[0,16,240,0] (0,16,-16,0);源不变,inactive/tail 保持旧值,vxsat 不变,正常完成后 vstart=0。

使用前检查清单

语法检查
  • vd/vs2 是 EEW=SEW、EMUL=LMUL 的向量组,起点须合法对齐;同宽源/目标可重叠,同名源读取相同初值。rs1 选择整数寄存器;XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展,x0 提供零。
  • 32 位 OP-V:opcode=1010111,funct6=101011,funct3=100;vm 在 bit25,vs2 在 bits24:20,rs1 在 bits19:15,vd 在 bits11:7。省略 v0.t 为 vm=1,给出为 vm=0。
语义检查
  • d 仅取移位量低 lg2(SEW) 位;按补码有符号数算术右移,再按 vxrm 计算 (v >> d)+r。rnu 最近向上、rne 最近偶数、rdn 向下、rod 奇数舍入;d=0 保留原值。该操作不饱和、不改变 vxsat。
  • 要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 vtype/SEW。仅活动 vstart≤i<vl 元素计算;prestart 保持不变,inactive/tail 按 vma/vta 保留旧值或全1。vstart≥vl(含 vl=0)不更新任何目标元素。masked vd 不可含 v0;v0 不可同时作 EEW=1 掩码和 SEW 数据源。正常完成后 vstart=0;实现可拒绝无法由本实现产生的非零 vstart。

容易混淆 / 常见误区

VSSRA 使用 vxrm 舍入移出的位,不是普通 VSRA 右移。
该指令不做饱和裁剪,也不设置 vxsat;需要饱和窄化时应查看 VNCLIP/VNCLIPU。
VX 形式的移位量来自 x[rs1] 标量值;有效移位量按 SEW 选取低位。

常见问题

VSSRA.VX 和 VSRA 有什么区别?

VSSRA.VX 在右移时按 vxrm 对被移出的位舍入;VSRA 是普通右移,不使用 vxrm。

VSSRA.VX 会设置 vxsat 吗?

不会。VSSRA.VX 是定点舍入缩放移位,不是饱和裁剪指令。