首页/指令库/VFWADD-WV
VFWADD.WV

RISC-V VFWADD.WV 指令详解

指令手册OPFVV

将vs2的2*SEW浮点元素与扩展后的vs1(SEW)元素相加,结果(2*SEW)写入vd。

指令语法

vfwadd.wv vd, vs2, vs1, vm
操作数说明
语法 vfwadd.wv vd, vs2, vs1[, v0.t];32 位 OP-V:opcode=1010111、funct3=001、funct6=110100。vs1 选择窄向量源。
vs2 与 vd 的 EEW=2×SEW、EMUL=2×LMUL;vs1 的 EEW=SEW、EMUL=LMUL。EMUL=2/4/8 按组大小对齐,EMUL>8 保留;EMUL≤1 不要求偶数起点。
窄 vs1 精确扩宽后与宽 vs2 相加,结果按动态 frm 舍入;宽 vs2 可与同宽目标重叠。宽 vs2 不得与窄 vs1 共享寄存器。所有向量浮点指令仍要求有效 frm(包括 vl=0),无效 frm 的使用保留;vxrm 不参与。
窄源与宽目标重叠仅在源 EMUL≥1、最高编号寄存器相同时合法;不同 EEW 的合法重叠强制 mask/tail agnostic。masked 目标不得含 v0;同一寄存器不得同时作为不同 EEW 的数据源和掩码源读取。
可选 v0.t 对应 vm=0,省略为 vm=1。活动元素满足 vstart≤i<vl 且掩码允许;仅活动元素异常累积到 fflags。prestart 不更新、不产生异常;vl=0 或 vstart≥vl 时所有目标元素包括 tail 均不更新。其余非活动/尾部由 vma/vta 决定,ta/ma 不保证清零;成功执行复位 vstart=0。
要求所需扩展、受支持的浮点格式、合法 vtype 和 VS/FS 已启用;H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、ta/ma 与有限输入;不完整模拟 NaN、无穷、fflags 或微架构周期。
V向量运算浮点

指令行为说明

VFWADD.WV 对活动元素计算 vd[i] = vs2[i] + widen(vs1[i]):vs2 已为 2×SEW 宽,vs1 为 SEW 宽,结果为 2×SEW 宽。窄浮点源精确扩宽后,按动态 frm 进行双宽加法。本页动画展示 binary64 向量加 binary32 向量的有限 RNE 路径。

VFWADD.WV 指令解析与执行动画

从 OP-V 编码解码到逐元素拓宽浮点加法:vs2 已是 2*SEW=64 宽,vs1[i] 从 SEW=32 精确扩展后参与运算,结果写入 2*SEW=64。

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

lane 0: 1 + 0.5 -> 1.5

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

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

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

逐元素结果
长向量在模块内部横向滚动,不造成页面溢出。
i=0活动
1 + 0.5
1.5
i=1活动
1.5 + 1
2.5
i=2跳过
v0.t=0,不执行
--
i=3活动
2.5 + 2
4.5
i=4活动
-3 + 2.5
-0.5
i=5活动
3.5 + 3
6.5
i=6跳过
v0.t=0,不执行
--
i=7活动
4.5 + 4
8.5
本教学模型固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、合法 vtype、VS/FS 已启用以及 ta/ma。vs2 为 binary64,vs1 为 binary32,结果以 RNE 舍入到 binary64。非活动和尾部元素不显示确定值;VL=0 不更新任何目标元素。NaN、无穷、fflags 和微架构周期不在本模型展开。

快速理解与检索要点

VFWADD.WV 用于在更宽精度中保存加法结果,区别于单宽 VFADD。

32 位 OP-V:opcode=1010111、funct3=001、funct6=110100;vs1 选择窄向量源。
vs2 和 vd 的 EEW=2×SEW、EMUL=2×LMUL;vs1 的 EEW=SEW、EMUL=LMUL。EMUL=2/4/8 时组起点按组大小对齐,EMUL>8 的编码保留;EMUL≤1 不要求偶数起点。窄源重叠仅在源 EMUL≥1 且源/目标最高编号寄存器相同时合法;不同 EEW 的合法重叠强制 mask/tail agnostic。
宽 vs2 可与同宽目标重叠;宽 vs2 与窄 vs1 不能共享源寄存器,否则同一寄存器会按不同 EEW 读取。
动态 frm 控制双宽加法舍入;活动元素的异常累积到 fflags。所有向量浮点指令都要求有效 frm,即使不受舍入影响或 vl=0;无效 frm 的使用保留。vxrm 不控制这些运算。
vm 表示可选 v0.t;省略为 vm=1,使用 v0.t 为 vm=0。活动元素满足 vstart≤i<vl 且掩码允许。masked 目标不得与 v0 重叠,同一寄存器不得同时作为数据源和 EEW=1 掩码源读取。
prestart 不更新、不产生异常;vl=0 或 vstart≥vl 时包括 tail 的所有目标元素均不更新。其余非活动/尾部由 vma/vta 决定,ta/ma 可保留旧值或写全 1,不保证清零。成功执行复位 vstart=0。
要求扩展、支持的浮点宽度、合法 vtype 和 VS/FS 已启用;H 且虚拟化 V=1 时还需 vsstatus.VS/FS 已启用。本页动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0 和 ta/ma,演示 64 位目标;不完整模拟 NaN、无穷或 fflags。

向量执行上下文

语法 vfwadd.wv vd, vs2, vs1[, v0.t];32 位 OP-V:opcode=1010111、funct3=001、funct6=110100。vs1 选择窄向量源。

vs2 与 vd 的 EEW=2×SEW、EMUL=2×LMUL;vs1 的 EEW=SEW、EMUL=LMUL。EMUL=2/4/8 按组大小对齐,EMUL>8 保留;EMUL≤1 不要求偶数起点。

窄 vs1 精确扩宽后与宽 vs2 相加,结果按动态 frm 舍入;宽 vs2 可与同宽目标重叠。宽 vs2 不得与窄 vs1 共享寄存器。所有向量浮点指令仍要求有效 frm(包括 vl=0),无效 frm 的使用保留;vxrm 不参与。

窄源与宽目标重叠仅在源 EMUL≥1、最高编号寄存器相同时合法;不同 EEW 的合法重叠强制 mask/tail agnostic。masked 目标不得含 v0;同一寄存器不得同时作为不同 EEW 的数据源和掩码源读取。

可选 v0.t 对应 vm=0,省略为 vm=1。活动元素满足 vstart≤i<vl 且掩码允许;仅活动元素异常累积到 fflags。prestart 不更新、不产生异常;vl=0 或 vstart≥vl 时所有目标元素包括 tail 均不更新。其余非活动/尾部由 vma/vta 决定,ta/ma 不保证清零;成功执行复位 vstart=0。

要求所需扩展、受支持的浮点格式、合法 vtype 和 VS/FS 已启用;H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、ta/ma 与有限输入;不完整模拟 NaN、无穷、fflags 或微架构周期。

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

常见使用场景

向宽浮点向量加入窄浮点向量

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

混合精度加法

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

使用前检查清单

语法检查
  • 语法 vfwadd.wv vd, vs2, vs1[, v0.t];32 位 OP-V:opcode=1010111、funct3=001、funct6=110100。vs1 选择窄向量源。
  • vs2 与 vd 的 EEW=2×SEW、EMUL=2×LMUL;vs1 的 EEW=SEW、EMUL=LMUL。EMUL=2/4/8 按组大小对齐,EMUL>8 保留;EMUL≤1 不要求偶数起点。
语义检查
  • 窄 vs1 精确扩宽后与宽 vs2 相加,结果按动态 frm 舍入;宽 vs2 可与同宽目标重叠。宽 vs2 不得与窄 vs1 共享寄存器。所有向量浮点指令仍要求有效 frm(包括 vl=0),无效 frm 的使用保留;vxrm 不参与。
  • 窄源与宽目标重叠仅在源 EMUL≥1、最高编号寄存器相同时合法;不同 EEW 的合法重叠强制 mask/tail agnostic。masked 目标不得含 v0;同一寄存器不得同时作为不同 EEW 的数据源和掩码源读取。
  • 可选 v0.t 对应 vm=0,省略为 vm=1。活动元素满足 vstart≤i<vl 且掩码允许;仅活动元素异常累积到 fflags。prestart 不更新、不产生异常;vl=0 或 vstart≥vl 时所有目标元素包括 tail 均不更新。其余非活动/尾部由 vma/vta 决定,ta/ma 不保证清零;成功执行复位 vstart=0。
  • 要求所需扩展、受支持的浮点格式、合法 vtype 和 VS/FS 已启用;H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、ta/ma 与有限输入;不完整模拟 NaN、无穷、fflags 或微架构周期。

容易混淆 / 常见误区

vs2 和 vd 的 EEW=2×SEW、EMUL=2×LMUL;vs1 的 EEW=SEW、EMUL=LMUL。EMUL=2/4/8 时组起点按组大小对齐,EMUL>8 的编码保留;EMUL≤1 不要求偶数起点。窄源重叠仅在源 EMUL≥1 且源/目标最高编号寄存器相同时合法;不同 EEW 的合法重叠强制 mask/tail agnostic。
动态 frm 控制双宽加法舍入;活动元素的异常累积到 fflags。
本页动画限制不代表真实指令的全部合法输入范围;先将十进制浮点输入表示为对应 binary32/binary64 值,再执行运算。

常见问题

这些浮点指令使用 vxrm 吗?

不使用。普通 RVV 浮点运算和浮点转换使用浮点舍入模式 frm 或指令指定的固定舍入;vxrm 用于定点舍入指令。