VSUB.VV

RISC-V VSUB.VV 指令详解

指令手册OPIVV

VSUB.VV 计算活动元素的 vs2 减vs1,保留低 SEW 位。

指令语法

vsub.vv vd, vs2, vs1, vm
操作数说明
vd/vs2/vs1 是 EEW=SEW、EMUL=LMUL 的向量组,组起点须合法对齐。同宽源/目标可重叠,同名源读取相同值。vs1[i] 是减数。
32 位 OP-V:opcode=1010111、funct6=000010、funct3=000;vm 在 bit25,vs2 在 bits24:20,vs1 在 bits19:15,vd 在 bits11:7。
活动 vd[i]=(vs2[i] - vs1[i]) mod 2^SEW;不产生借位标志或整数溢出异常,不饱和、不改变 vxsat。VRSUB 的减法方向相反。
要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 vtype/SEW。v0.t 为 vm=0,省略为 vm=1;仅掩码允许的 vstart≤i<vl 元素计算;prestart 不变,inactive/tail 按 vma/vta 保留或全1;masked vd 不可含 v0。vstart≥vl(含 vl=0)目标不更新;v0 不可同时提供 EEW=1 掩码和数据。正常完成后 vstart=0。
V向量运算

指令行为说明

VSUB.VV 对活动元素计算 vs2[i] - vs1[i],结果按 SEW 宽度回绕。

VSUB.VV 指令解析与执行动画

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

输入的指令
vsub.vv

要求 V 1.0、已启用向量状态及合法受支持 vtype/SEW。固定 LMUL=m1、vstart=0、VLEN=4096,VLMAX=4096/16=256。普通 masked vd 不可为 v0;同宽源/目标可重叠。XLEN>SEW 取标量低 SEW 位,XLEN<SEW 符号扩展,x0 提供零。v0 提供 EEW=1 掩码时不可同时作 SEW 数据源。VL=0 不更新任何目标元素;这里只展示 body,不伪造 inactive/tail 的确定值。步骤是教学分解,不是处理器周期。

执行环境
OP-V encodingvsub.vv
funct6
000010
vm
0
vs2
01000
vs1
01100
funct3
000
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0x00fa
0x010b
0x011c
0x012d
0x013e
0x014f
0x0160
0x0171
-
-
-
-
-
-
-
-
v12
0x000d
0x0016
0x001f
0x0028
0x0031
0x003a
0x0043
0x004c
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
当前步骤

显示 OP-V 32 位编码字段

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

动画展示 OP-V 字段解析、活动元素读取、SEW 宽度整数减法、mask 控制和 vd 写回。步骤是教学分解,不表示流水线、缓存或执行时延。

快速理解与检索要点

VSUB.VV 对活动元素计算 vs2[i] - vs1[i],结果按 SEW 宽度回绕。

32 位 OP-V:opcode=1010111、funct6=000010、funct3=000;vs2 是被减数。只保留低 SEW 位,无借位标志或整数溢出异常,不改变 vxsat。
要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 vtype/SEW。活动元素满足 vstart≤i<vl,vm=0 时还须 v0.mask[i]=1;省略 v0.t 表示 vm=1。
prestart 不变;inactive/tail 按 vma/vta 保留旧值或全1。vstart≥vl(含 vl=0)不更新任何目标元素;正常完成后 vstart=0。
向量 EEW=SEW、EMUL=LMUL,组起点须对齐;同宽源/目标可重叠,同名源须读取相同值。masked vd 不可含 v0;v0 不可同时提供掩码与 SEW 数据。

向量执行上下文

vd/vs2/vs1 是 EEW=SEW、EMUL=LMUL 的向量组,组起点须合法对齐。同宽源/目标可重叠,同名源读取相同值。vs1[i] 是减数。

32 位 OP-V:opcode=1010111、funct6=000010、funct3=000;vm 在 bit25,vs2 在 bits24:20,vs1 在 bits19:15,vd 在 bits11:7。

活动 vd[i]=(vs2[i] - vs1[i]) mod 2^SEW;不产生借位标志或整数溢出异常,不饱和、不改变 vxsat。VRSUB 的减法方向相反。

要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 vtype/SEW。v0.t 为 vm=0,省略为 vm=1;仅掩码允许的 vstart≤i<vl 元素计算;prestart 不变,inactive/tail 按 vma/vta 保留或全1;masked vd 不可含 v0。vstart≥vl(含 vl=0)目标不更新;v0 不可同时提供 EEW=1 掩码和数据。正常完成后 vstart=0。

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

常见使用场景

逐元素向量差值

假定 V/VS 已启用、合法 m1,tu,mu、VLEN=4096、vl=4、vstart=0,v0.mask[0..3]=1101;SEW=8, v12=[0,1,255,7], v4=[1,1,1,1]。v8[0]=255, v8[1]=0, v8[3]=6。lane2和tail保持旧值;vxsat不变。正常完成后vstart=0。

向量数据减法

假定 V/VS 已启用、合法 m1,tu,mu、VLEN=4096、vl=4、vstart=0,v0.mask[0..3]=1101;SEW=8, v12=[0,1,255,7], v4=[1,1,1,1]。v8[0]=255, v8[1]=0, v8[3]=6。lane2和tail保持旧值;vxsat不变。正常完成后vstart=0。

使用前检查清单

语法检查
  • vd/vs2/vs1 是 EEW=SEW、EMUL=LMUL 的向量组,组起点须合法对齐。同宽源/目标可重叠,同名源读取相同值。vs1[i] 是减数。
  • 32 位 OP-V:opcode=1010111、funct6=000010、funct3=000;vm 在 bit25,vs2 在 bits24:20,vs1 在 bits19:15,vd 在 bits11:7。
语义检查
  • 活动 vd[i]=(vs2[i] - vs1[i]) mod 2^SEW;不产生借位标志或整数溢出异常,不饱和、不改变 vxsat。VRSUB 的减法方向相反。
  • 要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 vtype/SEW。v0.t 为 vm=0,省略为 vm=1;仅掩码允许的 vstart≤i<vl 元素计算;prestart 不变,inactive/tail 按 vma/vta 保留或全1;masked vd 不可含 v0。vstart≥vl(含 vl=0)目标不更新;v0 不可同时提供 EEW=1 掩码和数据。正常完成后 vstart=0。

容易混淆 / 常见误区

结果按 SEW 宽度回绕,不产生整数溢出异常。
操作数顺序是 vs2 - vs1/rs1,不是反向减法。
需要反向标量减向量时使用 vrsub。

常见问题

VSUB.VV 和 VRSUB 有什么区别?

VSUB.VV 的方向是 vs2[i] - vs1[i]。VRSUB 是反向减法,用标量或立即数减 vs2[i]。

VSUB.VV 下溢会触发异常吗?

不会。普通向量整数减法保留低 SEW 位,结果按 SEW 宽度回绕。