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

RISC-V VFWNMSAC.VF 指令详解

指令手册R-type

扩展浮点 FMA:wide_product = 扩展(f[rs1] * vs2[i]),vd[i] = -(wide_product) + vd[i]。

指令语法

vfwnmsac.vf vd, rs1, vs2, vm
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数寄存器。
源寄存器 rs2:第二个操作数寄存器。
VZvfh向量乘法/乘加浮点

指令行为说明

VFWNMSAC.VF 执行扩展浮点融合乘加/乘减。窄浮点标量 f[rs1] 与窄向量元素 vs2[i] 相乘。乘积扩展到 2*SEW 后按公式 vd[i] = -(wide_product) + vd[i] 与宽 vd 组合,融合为一次舍入。 向量 FP32/FP64 操作需要相应标量 F/D 支持;FP16 由相应向量半精度扩展控制,基础 V 扩展不自动包含半精度算术。

快速理解与检索要点

VFWNMSAC.VF 的核心是窄输入生成宽乘积,再按 vd[i] = -(wide_product) + vd[i] 与宽 vd 融合。

扩展 FMA 的目标元素宽度为 2*SEW,寄存器组占用随 EMUL 改变。
只对 vl 范围内的活动元素执行;非活动元素和尾部元素受当前 vma/vta 策略影响。
vm=0 使用 v0 作为执行掩码,vm=1 表示不使用掩码。
浮点算术和转换遵循 RVV 浮点规则;普通浮点舍入来自 frm,定点 vxrm 不控制这些指令。
向量 FP32/FP64 操作需要相应标量 F/D 支持;FP16 由相应向量半精度扩展控制,基础 V 扩展不自动包含半精度算术。

常见使用场景

交替加减

结合 «vsetvli t0, a0, e16, m1, ta, ma vfwnmsac.vf v2, ft0, v4» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 R-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

使用公式 wide_product = widen(f[rs1] * vs2[i]); vd[i] = -(wide_product) + vd[i]。
vd 是 2*SEW 宽读写目标;不要把扩展 FMA 与 VFWMUL 纯乘法混淆。
向量 FP32/FP64 操作需要相应标量 F/D 支持;FP16 由相应向量半精度扩展控制,基础 V 扩展不自动包含半精度算术。

常见问题

这些指令使用 vxrm 吗?

不使用。浮点算术和转换使用 frm 或指令规定的固定舍入;vxrm 用于定点舍入指令。