首页/指令库/VRSUB.VX
VRSUB.VX

RISC-V VRSUB.VX 指令详解

指令手册OPIVX (OP-V)

从标量寄存器中减去向量元素。

指令语法

vrsub.vx vd, vs2, rs1[, v0.t]
操作数说明
语法:vrsub.vx vd, vs2, rs1[, v0.t];省略掩码为 vm=1,给出为 vm=0。32 位 OP-V:opcode=1010111、funct3=100(OPIVX)、funct6=000011。
计算x[rs1],XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展,x0 提供零减 vs2[i],结果保留低 SEW 位,不产生算术溢出异常。
body 为 vstart≤i<vl;仅掩码开启的 body 元素执行,inactive/tail 按 vma/vta。prestart 不变;vl=0 或 vstart≥vl 不更新任何目标元素。
同宽源/目标可重叠;普通 masked vd 不可为v0。v0 提供 EEW=1 掩码/借位时不可同时作数据源;源组不能以不同 EEW 读取同一寄存器。组起点按 EMUL 对齐,EMUL≤8。
要求 RV32/RV64 V 1.0、已启用向量状态、合法受支持 vtype/SEW。动画固定 m1、vstart=0;VLEN=4096,只展示 body;步骤不是处理器周期。
V向量整数运算算术

指令行为说明

VRSUB.VX 对活动元素计算 x[rs1] - vs2[i],低 SEW 位写入 vd。

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

从 OP-V 编码字段开始,展示 VRSUB 如何按第二源减 vs2 计算活动元素、按 SEW 回绕,并写回 vd。

输入的指令
vrsub.vx

要求 V 1.0、启用向量状态及合法受支持 vtype/SEW;固定 LMUL=m1、vstart=0。固定 VLEN=4096,VLMAX=4096/16=256;同宽源/目标可重叠。计算按 XLEN/SEW 转换的标量减 vs2[i],保留低 SEW 位。x0 提供零。v0 用于 EEW=1 掩码/借位时不可同时作数据源。输入元素为非负位模式;VL=0 不更新任何目标位。只展示 body,不指定 inactive/tail 值;教学步骤不是处理器周期。

执行环境
OP-V encodingvrsub.vx
funct6
000011
vm
0
vs2
01000
rs1
01011
funct3
100
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
x11
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
-
-
-
-
-
-
-
-
v8
0x00fa
0x010b
0x011c
0x012d
0x013e
0x014f
0x0160
0x0171
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
当前步骤

显示 OP-V 32 位编码字段

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

动画展示 OP-V 字段解析、反向减法、执行掩码与 vd 写回;步骤是教学分解,不表示处理器周期。

快速理解与检索要点

VRSUB.VX 是反向减法:每个活动元素计算 x[rs1] - vs2[i]。它不是 VSUB.VX 的同义词,二者操作数方向相反。

body 为 vstart≤i<vl;vm=0 时使用 v0 作为执行掩码,inactive/tail 按 vma/vta 处理;vl=0 或 vstart≥vl 不更新任何目标元素。
VRSUB 是单宽整数反向减法;VX 形式的左操作数来自整数寄存器 rs1。
`.vx` 形式的方向是 rs1 - vs2;需要 vs2 - rs1 时使用 VSUB.VX。
OP-V 编码中 opcode=1010111,VRSUB 使用 funct6=000011;`.vx` 形式由 funct3=100 选择。
结果按低 SEW 位回绕,不提供借位标志或溢出异常。
XLEN>SEW 时取标量低 SEW 位,XLEN<SEW 时符号扩展到 SEW;rs1=x0 提供零。

向量执行上下文

语法:vrsub.vx vd, vs2, rs1[, v0.t];省略掩码为 vm=1,给出为 vm=0。32 位 OP-V:opcode=1010111、funct3=100(OPIVX)、funct6=000011。

计算x[rs1],XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展,x0 提供零减 vs2[i],结果保留低 SEW 位,不产生算术溢出异常。

body 为 vstart≤i<vl;仅掩码开启的 body 元素执行,inactive/tail 按 vma/vta。prestart 不变;vl=0 或 vstart≥vl 不更新任何目标元素。

同宽源/目标可重叠;普通 masked vd 不可为v0。v0 提供 EEW=1 掩码/借位时不可同时作数据源;源组不能以不同 EEW 读取同一寄存器。组起点按 EMUL 对齐,EMUL≤8。

要求 RV32/RV64 V 1.0、已启用向量状态、合法受支持 vtype/SEW。动画固定 m1、vstart=0;VLEN=4096,只展示 body;步骤不是处理器周期。

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

常见使用场景

逐元素反向减法

假定 V/VS 已启用、合法 m1、支持 SEW、VLEN=4096、XLEN=64、vl=4、vstart=0,源已初始化,v0.mask[0..3]=1111。SEW=8, x5=7, v12=[10,0,255,7] → v8=[253,7,8,0]。inactive/tail 按 vma/vta。vl=0 不更新目标。

计算向量相反数

假定 V/VS 已启用、合法 m1、支持 SEW、VLEN=4096、XLEN=64、vl=4、vstart=0,源已初始化,v0.mask[0..3]=1111。SEW=8, x5=7, v12=[10,0,255,7] → v8=[253,7,8,0]。inactive/tail 按 vma/vta。vl=0 不更新目标。

使用前检查清单

语法检查
  • 语法:vrsub.vx vd, vs2, rs1[, v0.t];省略掩码为 vm=1,给出为 vm=0。32 位 OP-V:opcode=1010111、funct3=100(OPIVX)、funct6=000011。
  • 计算x[rs1],XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展,x0 提供零减 vs2[i],结果保留低 SEW 位,不产生算术溢出异常。
语义检查
  • body 为 vstart≤i<vl;仅掩码开启的 body 元素执行,inactive/tail 按 vma/vta。prestart 不变;vl=0 或 vstart≥vl 不更新任何目标元素。
  • 同宽源/目标可重叠;普通 masked vd 不可为v0。v0 提供 EEW=1 掩码/借位时不可同时作数据源;源组不能以不同 EEW 读取同一寄存器。组起点按 EMUL 对齐,EMUL≤8。
  • 要求 RV32/RV64 V 1.0、已启用向量状态、合法受支持 vtype/SEW。动画固定 m1、vstart=0;VLEN=4096,只展示 body;步骤不是处理器周期。

容易混淆 / 常见误区

左操作数是立即数或标量,右操作数是 vs2[i]。
结果保留低 SEW 位;普通掩码 inactive/tail 按 vma/vta 处理。

常见问题

VRSUB.VX 和 VSUB.VX 的区别是什么?

VRSUB.VX 计算 x[rs1] - vs2[i],VSUB.VX 计算 vs2[i] - x[rs1]。减法不满足交换律,两个结果通常不同。

VRSUB.VX 结果如何处理下溢?

结果保留低 SEW 位,按 SEW 宽度回绕,不产生整数异常或借位标志。