首页/指令库/VFWMUL-VV
VFWMUL.VV

RISC-V VFWMUL.VV 指令详解

指令手册OPFVV

将 vs2[i] 与同 lane 的 vs1[i] 相乘,并将 2*SEW 宽的结果写入 vd[i]。

指令语法

vfwmul.vv vd, vs2, vs1, vm
操作数说明
语法 vfwmul.vv vd, vs2, vs1[, v0.t];32 位 OP-V:opcode=1010111, funct3=001, funct6=111000。旧 vd 不是累加器。
窄向量源 EEW=SEW、EMUL=LMUL;vd 的 EEW=2×SEW、EMUL=2×LMUL。EMUL=2/4/8 按组大小对齐,EMUL>8 保留。窄源与宽目标重叠须源 EMUL≥1 且最高编号寄存器相同;不同 EEW 的合法重叠强制 mask/tail agnostic。同名窄源读取相同初值。
每个活动元素计算 (vs1[i] * vs2[i]),生成双宽乘积。真实指令使用动态 frm,vxrm 不参与。两个乘数来自同索引的向量元素。
省略 v0.t 为 vm=1,写出为 vm=0;仅 vstart≤i<vl 且掩码允许的元素执行并累积浮点异常到 fflags。masked 目标不得含 v0;同一寄存器不能同时作为 EEW=1 掩码源和不同 EEW 数据源读取。
prestart 不更新、不产生异常;vl=0 或 vstart≥vl 时包括 tail 在内的全部目标不更新。其余 inactive/tail 按 vma/vta 处理,ta/ma 不保证清零;成功执行复位 vstart=0。
V 1.0 适用于 RV32/RV64,依赖 F/D;要求受支持的浮点格式、合法 vtype、VS/FS 已启用。H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。无效 frm 的使用保留(包括 vl=0)。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、RNE、ta/ma 与有限输入,不完整模拟 NaN、无穷或 fflags。
V向量乘法/乘加浮点

扩展条件:V 1.0,适用于 RV32/RV64;所需浮点格式和 vtype 必须受支持,VS/FS 必须启用。标准 V 支持此处 SEW=32 到 binary64 的路径;不表示 SEW=64 可生成受支持的 binary128。

指令行为说明

VFWMUL.VV 执行逐元素拓宽浮点乘法:每个活动元素计算 vs2[i] × vs1[i],结果以 2*SEW 宽度写入 vd[i]。它不读取旧 vd 作为累加项;掩码、vl 和当前 vtype 决定哪些元素执行。

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

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

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

lane 0: 1 * 0.5 -> 0.5

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

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

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

逐元素结果
长向量在模块内部横向滚动,不造成页面溢出。
i=0活动
1 * 0.5
0.5
i=1活动
1.5 * 1
1.5
i=2跳过
v0.t=0,不执行
--
i=3活动
2.5 * 2
5
i=4活动
-3 * 2.5
-7.5
i=5活动
3.5 * 3
10.5
i=6跳过
v0.t=0,不执行
--
i=7活动
4.5 * 4
18
本模型固定 SEW=32、LMUL=m1、VLEN=4096、VLMAX=128、vstart=0、合法 vtype、VS/FS 已启用及 ta/ma。乘数先表示为 binary32,结果为 binary64。不读取旧 vd 作为累加器;窄源只能与双寄存器目的组的高端重叠,不同 EEW 的合法重叠强制 mask/tail agnostic。同名窄源必须有相同初始位模式。非活动与尾部不显示确定值;VL=0 不更新任何目标元素。NaN、无穷、fflags 和微架构周期不在模型范围;真实指令使用动态 frm,无效 frm 的使用保留(包括 VL=0)。

快速理解与检索要点

VFWMUL.VV 将每个活动的 vs2[i] 与 vs1[i] 相乘,并把拓宽到 2*SEW 的结果写到 vd[i];没有旧 vd 累加项。

官方语法为 vfwmul.vv vd, vs2, vs1, vm:每个活动元素使用同 lane 的 vs2[i] 和 vs1[i]。
本指令是 2*SEW = SEW x SEW 的拓宽乘法;vd 元素宽度为源元素宽度的两倍。
没有旧 vd 累加项;需要拓宽融合累加时应比较 VFWMACC/VFWMSAC 系列的独立语义。
仅 vstart≤i<vl 内且未被执行掩码关闭的元素执行;vm=0 时 v0 提供逐元素执行掩码。
OP-V 编码使用 opcode=1010111、funct3=001(OPFVV)与 funct6=111000。
窄源 EEW=SEW、EMUL=LMUL;宽目标 EEW=2*SEW、EMUL=2*LMUL,EMUL>8 的编码保留。
窄源与宽目标仅在源 EMUL≥1 且最高编号寄存器相同时可重叠;不同 EEW 的合法重叠强制 mask/tail agnostic。
活动元素满足 vstart≤i<vl 且掩码允许;vl=0 或 vstart≥vl 不更新包括 tail 在内的任何目标元素。ta/ma 不保证清零;成功执行复位 vstart=0。
真实指令使用动态 frm,无效 frm 的使用保留(包括 vl=0);仅活动元素的浮点异常累积到 fflags。

向量执行上下文

语法 vfwmul.vv vd, vs2, vs1[, v0.t];32 位 OP-V:opcode=1010111, funct3=001, funct6=111000。旧 vd 不是累加器。

窄向量源 EEW=SEW、EMUL=LMUL;vd 的 EEW=2×SEW、EMUL=2×LMUL。EMUL=2/4/8 按组大小对齐,EMUL>8 保留。窄源与宽目标重叠须源 EMUL≥1 且最高编号寄存器相同;不同 EEW 的合法重叠强制 mask/tail agnostic。同名窄源读取相同初值。

每个活动元素计算 (vs1[i] * vs2[i]),生成双宽乘积。真实指令使用动态 frm,vxrm 不参与。两个乘数来自同索引的向量元素。

省略 v0.t 为 vm=1,写出为 vm=0;仅 vstart≤i<vl 且掩码允许的元素执行并累积浮点异常到 fflags。masked 目标不得含 v0;同一寄存器不能同时作为 EEW=1 掩码源和不同 EEW 数据源读取。

prestart 不更新、不产生异常;vl=0 或 vstart≥vl 时包括 tail 在内的全部目标不更新。其余 inactive/tail 按 vma/vta 处理,ta/ma 不保证清零;成功执行复位 vstart=0。

V 1.0 适用于 RV32/RV64,依赖 F/D;要求受支持的浮点格式、合法 vtype、VS/FS 已启用。H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。无效 frm 的使用保留(包括 vl=0)。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、RNE、ta/ma 与有限输入,不完整模拟 NaN、无穷或 fflags。

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

常见使用场景

binary32 乘数生成 binary64 乘积

假定 V/VS/FS 已启用、合法 e32,m1、所需格式受支持、frm=RNE、VLMAX≥4、a0=4;vsetvli 后 vl=4、vstart=0。省略 v0.t,未掩码:v4(binary32)=[3,-1,2,5], v6(binary32)=[2,4,-2,0] → v2/v3(binary64)=[6,-4,-4,0]。tail 按 ta 处理,不保证清零。

使用前检查清单

语法检查
  • 语法 vfwmul.vv vd, vs2, vs1[, v0.t];32 位 OP-V:opcode=1010111, funct3=001, funct6=111000。旧 vd 不是累加器。
  • 窄向量源 EEW=SEW、EMUL=LMUL;vd 的 EEW=2×SEW、EMUL=2×LMUL。EMUL=2/4/8 按组大小对齐,EMUL>8 保留。窄源与宽目标重叠须源 EMUL≥1 且最高编号寄存器相同;不同 EEW 的合法重叠强制 mask/tail agnostic。同名窄源读取相同初值。
语义检查
  • 每个活动元素计算 (vs1[i] * vs2[i]),生成双宽乘积。真实指令使用动态 frm,vxrm 不参与。两个乘数来自同索引的向量元素。
  • 省略 v0.t 为 vm=1,写出为 vm=0;仅 vstart≤i<vl 且掩码允许的元素执行并累积浮点异常到 fflags。masked 目标不得含 v0;同一寄存器不能同时作为 EEW=1 掩码源和不同 EEW 数据源读取。
  • prestart 不更新、不产生异常;vl=0 或 vstart≥vl 时包括 tail 在内的全部目标不更新。其余 inactive/tail 按 vma/vta 处理,ta/ma 不保证清零;成功执行复位 vstart=0。
  • V 1.0 适用于 RV32/RV64,依赖 F/D;要求受支持的浮点格式、合法 vtype、VS/FS 已启用。H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。无效 frm 的使用保留(包括 vl=0)。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、RNE、ta/ma 与有限输入,不完整模拟 NaN、无穷或 fflags。

容易混淆 / 常见误区

汇编顺序是 vd、vs2、vs1、vm;两条源向量在同一元素索引处配对相乘。
vd 写入 2*SEW 宽结果,不读取旧 vd 作为累加器;宽目的组的合法性与重叠约束必须符合当前 vtype。

常见问题

VFWMUL.VV 读取旧 vd 作为累加器吗?

不读取旧 vd 作为累加器。活动元素写入双宽乘积;合法的窄源与宽目标重叠仍会读取重叠处的源值。