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

RISC-V VFRSUB.VF 指令详解

指令手册OP-V

VFRSUB.VF 对 VL 范围内的活动元素执行向量-标量浮点反向减法:vd[i] = f[rs1] - vs2[i]。

指令语法

vfrsub.vf vd, vs2, rs1, vm
操作数说明
32 位 OP-V 编码:funct6=100111、funct3=101、opcode=1010111。rs1 选择浮点 f 寄存器,不是整数寄存器。FLEN>SEW 时有效 NaN-box 取低 SEW 位,无效时使用 canonical NaN;FLEN<SEW 保留。
向量操作数及结果为 SEW 位、EMUL=LMUL。同宽源/目标可重叠,同名源必须有一致的初始位模式。普通 masked 目标不能与 v0 重叠。
可选 vm 操作数写作 v0.t,对应 vm=0;省略为 vm=1。活动元素满足 vstart≤i<vl 且掩码启用。不能把同一源寄存器同时作为 EEW=1 的 mask 和 SEW 数据读取。
prestart 不更新;vstart≥vl 或 vl=0 时所有目标元素包括 tail 均不更新。其他非活动/尾部按 vma/vta 处理,ta/ma 不保证清零。
逐元素计算 f[rs1] - vs2[i],按动态 frm 舍入;活动元素异常累积到 fflags。
V 1.0 适用于 RV32/RV64,包含 FP32/FP64 并依赖 F/D;SEW=16 算术需 Zvfh。要求合法 vtype、支持的宽度及 VS/FS 已启用;H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。所有这些向量浮点指令都要求有效 frm,即使结果不依赖它或 vl=0;vxrm 不控制它们。
动画为教学步骤,不是处理器周期。固定 VLEN=4096、LMUL=m1、vstart=0、合法 vtype 与 VS/FS 已启用;具体输入格式、固定舍入及模型边界见动画说明。VF 标量按 FLEN=64 读取,SEW=32 时假定有效 NaN-boxed。
V向量运算浮点

指令行为说明

活动元素计算 vd[i] = f[rs1] - vs2[i]:标量减向量,按动态 frm 舍入,异常累积到 fflags。vm=0 使用 v0.t,vm=1 未掩码;vxrm 不控制此运算。

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

从 OP-V 编码解码到逐元素反向浮点减法:每个活动元素计算 f[rs1] - vs2[i]。

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

lane 0: 1.5 - 1 -> 0.5

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

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

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

逐元素结果
长向量在模块内部横向滚动,不造成页面溢出。
i=0活动
1.5 - 1
0.5
i=1活动
1.5 - 1.5
0
i=2跳过
v0.t=0,不执行
--
i=3活动
1.5 - 2.5
-1
i=4活动
1.5 - -3
4.5
i=5活动
1.5 - 3.5
-2
i=6跳过
v0.t=0,不执行
--
i=7活动
1.5 - 4.5
-3
SEW=32 / binary32 输入先表示为当前浮点格式,再计算 f[rs1] - vs2[i] 并以 RNE 舍入。固定 FLEN=64;SEW=32 标量假定有效 NaN-boxed。仅计算有限结果,溢出及完整 fflags 不在模型展开;真实指令使用动态 frm。

快速理解与检索要点

VFRSUB.VF 的学习重点是 OP-V 编码、浮点标量寄存器 f[rs1]、v0.t 掩码和逐元素 vd[i] = f[rs1] - vs2[i]。

funct6=100111、funct3=101、opcode=1010111 标识该 OP-V 浮点算术形式。
vfrsub.vf vd, vs2, rs1, vm 中的 vm 是执行掩码控制;vm=0 使用 v0.t,vm=1 表示不使用掩码。
`.vf` 形式的 rs1 表示浮点寄存器编号 f[rs1],不是整数通用寄存器值。
结果、NaN、无穷、舍入和 fflags 遵循官方向量浮点规则。
FLEN>SEW 时,标量必须有效 NaN-boxed 才使用低 SEW 位,否则视为 canonical NaN;FLEN<SEW 的编码保留。

向量执行上下文

32 位 OP-V 编码:funct6=100111、funct3=101、opcode=1010111。rs1 选择浮点 f 寄存器,不是整数寄存器。FLEN>SEW 时有效 NaN-box 取低 SEW 位,无效时使用 canonical NaN;FLEN<SEW 保留。

向量操作数及结果为 SEW 位、EMUL=LMUL。同宽源/目标可重叠,同名源必须有一致的初始位模式。普通 masked 目标不能与 v0 重叠。

可选 vm 操作数写作 v0.t,对应 vm=0;省略为 vm=1。活动元素满足 vstart≤i<vl 且掩码启用。不能把同一源寄存器同时作为 EEW=1 的 mask 和 SEW 数据读取。

prestart 不更新;vstart≥vl 或 vl=0 时所有目标元素包括 tail 均不更新。其他非活动/尾部按 vma/vta 处理,ta/ma 不保证清零。

逐元素计算 f[rs1] - vs2[i],按动态 frm 舍入;活动元素异常累积到 fflags。

V 1.0 适用于 RV32/RV64,包含 FP32/FP64 并依赖 F/D;SEW=16 算术需 Zvfh。要求合法 vtype、支持的宽度及 VS/FS 已启用;H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。所有这些向量浮点指令都要求有效 frm,即使结果不依赖它或 vl=0;vxrm 不控制它们。

动画为教学步骤,不是处理器周期。固定 VLEN=4096、LMUL=m1、vstart=0、合法 vtype 与 VS/FS 已启用;具体输入格式、固定舍入及模型边界见动画说明。VF 标量按 FLEN=64 读取,SEW=32 时假定有效 NaN-boxed。

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

常见使用场景

常数减向量

假定 V/VS/FS 已启用、合法 vtype、有效 frm=RNE、e32,m1 可用、VLMAX≥4、a0=4;vsetvli 后 vl=4、vstart=0。输入为 binary32;ft0 若使用则在 FLEN=64 下有效 NaN-boxed。省略 v0.t,未掩码:ft0=8, v2=[1,2,3,4] → v1=[7,6,5,4]。尾部按 ta 处理,不假定清零。

使用前检查清单

语法检查
  • 32 位 OP-V 编码:funct6=100111、funct3=101、opcode=1010111。rs1 选择浮点 f 寄存器,不是整数寄存器。FLEN>SEW 时有效 NaN-box 取低 SEW 位,无效时使用 canonical NaN;FLEN<SEW 保留。
  • 向量操作数及结果为 SEW 位、EMUL=LMUL。同宽源/目标可重叠,同名源必须有一致的初始位模式。普通 masked 目标不能与 v0 重叠。
语义检查
  • 可选 vm 操作数写作 v0.t,对应 vm=0;省略为 vm=1。活动元素满足 vstart≤i<vl 且掩码启用。不能把同一源寄存器同时作为 EEW=1 的 mask 和 SEW 数据读取。
  • prestart 不更新;vstart≥vl 或 vl=0 时所有目标元素包括 tail 均不更新。其他非活动/尾部按 vma/vta 处理,ta/ma 不保证清零。
  • 逐元素计算 f[rs1] - vs2[i],按动态 frm 舍入;活动元素异常累积到 fflags。
  • V 1.0 适用于 RV32/RV64,包含 FP32/FP64 并依赖 F/D;SEW=16 算术需 Zvfh。要求合法 vtype、支持的宽度及 VS/FS 已启用;H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。所有这些向量浮点指令都要求有效 frm,即使结果不依赖它或 vl=0;vxrm 不控制它们。
  • 动画为教学步骤,不是处理器周期。固定 VLEN=4096、LMUL=m1、vstart=0、合法 vtype 与 VS/FS 已启用;具体输入格式、固定舍入及模型边界见动画说明。VF 标量按 FLEN=64 读取,SEW=32 时假定有效 NaN-boxed。

容易混淆 / 常见误区

它是标量减向量元素,不是归约或整数反向减法。
只有 VL 范围内且执行掩码为真的元素执行;非活动元素和尾部元素按当前 vma/vta 策略处理。
普通 RVV 浮点算术使用浮点舍入环境 frm/动态舍入语义,不使用定点 vxrm。
不要把浏览器演示中的有限数值样例当成完整 IEEE 754 异常模拟;NaN、无穷和 fflags 以官方手册为准。

常见问题

VFRSUB.VF 使用 vxrm 吗?

不使用。普通 RVV 浮点算术使用浮点舍入环境 frm 或指令规定的浮点舍入规则;vxrm 用于定点舍入指令。

VFRSUB.VF 的 vm 操作数是什么意思?

vm=0 表示用 v0.t 作为执行掩码;vm=1 表示不使用执行掩码。它不是一个普通数据源寄存器。