首页/指令库/VFWSUB-VF
VFWSUB.VF

RISC-V VFWSUB.VF 指令详解

指令手册OPFVF

窄向量 vs2 减去浮点标量 f[rs1],结果以 2*SEW 宽度写入 vd。

指令语法

vfwsub.vf vd, vs2, rs1, vm
操作数说明
32 位 OP-V:opcode=1010111、funct3=101、funct6=110010。vs2 为SEW 浮点源,rs1 选择 SEW 浮点 f 寄存器。
窄源精确拓宽后计算 vs2[i]−f[rs1],以动态 frm 舍入到 2×SEW。目标 EEW=2×SEW、EMUL=2×LMUL,EMUL=2/4/8 按组大小对齐、EMUL>8 保留。
同宽目标/源可以重叠;窄源 EMUL≥1 时只能与宽目标最高端重叠,不同 EEW 合法重叠强制 agnostic。同一寄存器不能以两个源 EEW 读取(包括 EEW=1 掩码)。FLEN>SEW 检查 NaN-box,无效时使用 canonical NaN;FLEN<SEW 保留。
省略 v0.t 为 vm=1,写出为 vm=0。prestart 不更新;inactive/tail 按 vma/vta 处理,undisturbed 保留旧值,agnostic 可保留旧值或写全1。vl=0 或 vstart≥vl 不更新任何目标(包括 tail);成功执行后 vstart=0。
V 1.0 适用于 RV32/RV64,并依赖 F/D;要求支持源/目标浮点格式、合法 vtype、VS/FS 已启用。无效 frm 使用保留(包括 vl=0),vxrm 不参与。活动异常累积到 fflags,inactive 不产生异常;NaN 规则与标量相同。动画仅展示 SEW=32 到 binary64 的有限 RNE 路径;NaN、无穷和完整 fflags 在模型之外。
V向量运算浮点

指令行为说明

VFWSUB.VF 是 RISC-V V 扩展的拓宽浮点减法指令。两个输入先扩展到 2*SEW 宽度后相减。结果写入 2*SEW 宽度的 vd 元素,浮点舍入、异常标志和 NaN 处理遵循 RVV 浮点规则。

VFWSUB.VF 指令解析与执行动画

从 OP-V 编码解码到逐元素拓宽浮点减法:两个 SEW=32 源先扩展,再写入 2*SEW=64 的结果。

输入的指令
vfwsub.vf
执行环境
LMULm1本动画固定的寄存器组倍数
VLEN4096固定向量寄存器长度(bits)
VLMAX128m1 下的最大元素数
vstart0本动画不展示 prestart 元素
frmRNE固定 RNE 的有限教学环境;真实指令使用动态 frm
FP stateFS enabledFS=Off 会触发非法指令;本动画固定展示 FS 已启用的架构路径
dest EEW64目标元素宽度
vta/vmata, ma尾部/非活动元素策略
opcode1010111OP-V 主操作码
编码字段
0xc8855257
31..26
25
24..20
19..15
14..12
11..7
6..0
110010
funct6
0
vm
01000
vs2
01010
rs1
101
funct3
00100
vd
1010111
OP-V
执行数据路径

lane 0: 1 - 1.5 -> -0.5

显示的 lane 与当前步骤高亮同步;其余逐元素结果位于下方。

步骤 1 / 15
读取 OP-V 编码字段

V 扩展浮点指令使用 OP-V 主操作码,字段包含 funct6、源寄存器、vm、funct3、vd 和 opcode。

逐元素结果
长向量在模块内部横向滚动,不造成页面溢出。
i=0活动
1 - 1.5
-0.5
i=1活动
1.5 - 1.5
0
i=2跳过
v0.t=0,不执行
--
i=3活动
2.5 - 1.5
1
i=4活动
-3 - 1.5
-4.5
i=5活动
3.5 - 1.5
2
i=6跳过
v0.t=0,不执行
--
i=7活动
4.5 - 1.5
3
本有限减法模型固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、合法 vtype、VS/FS 已启用、frm=RNE 和 ta/ma。vs2 先表示为 binary32 并精确拓宽;右源先表示为 binary32 并精确拓宽,再计算 vs2−右源并舍入到 binary64。目标和宽 vs2 采用偶数双寄存器组;窄源只可重叠目标组高端,同名窄源须有相同初值。FLEN=64,标量假定有效 NaN-box。VL=0 不更新任何目标元素,包括 tail;非活动/尾部不显示确定值。NaN、无穷、溢出、完整 fflags 和微架构周期不在模型展开;真实指令使用动态 frm,无效 frm 使用保留(包括 VL=0)。

快速理解与检索要点

VFWSUB.VF 的方向是 vs2 减去 f[rs1];不要把它理解成反向减法。

.VV/.VF 形式先把窄输入拓宽,vd 元素宽度为 2*SEW。
活动元素的减法按动态 frm 舍入;无效 frm 的使用保留,包括 vl=0 时。vxrm 不参与;只有活动元素的浮点异常累积到 fflags。
向量 FP32/FP64 操作需要相应标量 F/D 支持;半精度由对应向量半精度扩展控制。
vm=0 使用 v0.t,省略掩码为 vm=1。prestart 保持不变;inactive/tail 按 vma/vta 处理,不保证清零。vl=0 或 vstart≥vl 时包括 tail 在内均不更新。

向量执行上下文

32 位 OP-V:opcode=1010111、funct3=101、funct6=110010。vs2 为SEW 浮点源,rs1 选择 SEW 浮点 f 寄存器。

窄源精确拓宽后计算 vs2[i]−f[rs1],以动态 frm 舍入到 2×SEW。目标 EEW=2×SEW、EMUL=2×LMUL,EMUL=2/4/8 按组大小对齐、EMUL>8 保留。

同宽目标/源可以重叠;窄源 EMUL≥1 时只能与宽目标最高端重叠,不同 EEW 合法重叠强制 agnostic。同一寄存器不能以两个源 EEW 读取(包括 EEW=1 掩码)。FLEN>SEW 检查 NaN-box,无效时使用 canonical NaN;FLEN<SEW 保留。

省略 v0.t 为 vm=1,写出为 vm=0。prestart 不更新;inactive/tail 按 vma/vta 处理,undisturbed 保留旧值,agnostic 可保留旧值或写全1。vl=0 或 vstart≥vl 不更新任何目标(包括 tail);成功执行后 vstart=0。

V 1.0 适用于 RV32/RV64,并依赖 F/D;要求支持源/目标浮点格式、合法 vtype、VS/FS 已启用。无效 frm 使用保留(包括 vl=0),vxrm 不参与。活动异常累积到 fflags,inactive 不产生异常;NaN 规则与标量相同。动画仅展示 SEW=32 到 binary64 的有限 RNE 路径;NaN、无穷和完整 fflags 在模型之外。

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

常见使用场景

高精度差分

假定合法 e32,m1、VS/FS 已启用、所需格式受支持、VLMAX≥4、a0=4,vsetvli 后 vl=4、vstart=0。frm=RNE,ft0 在 FLEN=64 下有效 NaN-boxed;省略 v0.t,未掩码;v4(binary32)=[2,4,-2,0], ft0=1.5 → v2/v3(binary64)=[0.5,2.5,-3.5,-1.5]。非活动/尾部按 ma/ta 处理,不保证清零。

使用前检查清单

语法检查
  • 32 位 OP-V:opcode=1010111、funct3=101、funct6=110010。vs2 为SEW 浮点源,rs1 选择 SEW 浮点 f 寄存器。
  • 窄源精确拓宽后计算 vs2[i]−f[rs1],以动态 frm 舍入到 2×SEW。目标 EEW=2×SEW、EMUL=2×LMUL,EMUL=2/4/8 按组大小对齐、EMUL>8 保留。
语义检查
  • 同宽目标/源可以重叠;窄源 EMUL≥1 时只能与宽目标最高端重叠,不同 EEW 合法重叠强制 agnostic。同一寄存器不能以两个源 EEW 读取(包括 EEW=1 掩码)。FLEN>SEW 检查 NaN-box,无效时使用 canonical NaN;FLEN<SEW 保留。
  • 省略 v0.t 为 vm=1,写出为 vm=0。prestart 不更新;inactive/tail 按 vma/vta 处理,undisturbed 保留旧值,agnostic 可保留旧值或写全1。vl=0 或 vstart≥vl 不更新任何目标(包括 tail);成功执行后 vstart=0。
  • V 1.0 适用于 RV32/RV64,并依赖 F/D;要求支持源/目标浮点格式、合法 vtype、VS/FS 已启用。无效 frm 使用保留(包括 vl=0),vxrm 不参与。活动异常累积到 fflags,inactive 不产生异常;NaN 规则与标量相同。动画仅展示 SEW=32 到 binary64 的有限 RNE 路径;NaN、无穷和完整 fflags 在模型之外。

容易混淆 / 常见误区

目标 EEW=2×SEW、EMUL=2×LMUL;EMUL=2/4/8 按组大小对齐,EMUL>8 的编码保留。掩码目标不能包含 v0;窄源仅可在满足条件时与目标高端重叠。
向量 FP32/FP64 操作需要对应的标量 F/D 支持;仅有 V 并不意味着支持 FP16。

常见问题

VFWSUB.VF 的目标寄存器宽度是多少?

它写入 2*SEW 宽度的浮点结果,因此目标寄存器组占用按拓宽结果计算。

VFWSUB.VF 如何处理掩码?

vm=0 时用 v0 选择活动元素,vm=1 时所有 body 元素都参与;非活动和尾部元素按当前策略处理。