首页/指令库/VFMERGE-VFM
VFMERGE.VFM

RISC-V VFMERGE.VFM 指令详解

指令手册V-type

依 v0 掩码合并 vs2[i] 与 f[rs1]:掩码为 1 时写 f[rs1],为 0 时写 vs2[i]。

指令语法

vfmerge.vfm vd, vs2, rs1, v0
操作数说明
vd、vs2 是 SEW 位向量组;同 EEW 目标与源可重叠,同名源须读取相同初值。没有立即数操作数。
rs1 选择浮点 f0–f31 或 ABI 名称;FLEN>SEW 时无效 NaN-box 读取为 canonical NaN。
v0 是必需的选择源,固定 vm=0;v0[i]=1 选择 f[rs1],为 0 选择 vs2[i],全部 body 元素都写回。
要求 V、受支持的 vtype 与浮点宽度、VS/FS 已启用;V 支持 FP32/FP64 且依赖 F/D。H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。无效 frm 的使用保留,即使操作不舍入或 vl=0。
prestart 不变;vl=0 或 vstart≥vl 时所有目标元素(包括 tail)均不更新。否则非活动/尾部遵循 vma/vta,不保证清零或保留。
vm=0 时 vd 不可重叠 v0;v0 也不能同时作为 EEW=1 选择/掩码源和 SEW 数据源。成功执行后 vstart 复位为 0。
V向量运算浮点

指令行为说明

VFMERGE.VFM 是浮点标量合并指令。对从 vstart 到 vl-1 的每个 body 元素,v0.mask[i]=1 时把 f[rs1] 写入 vd[i],v0.mask[i]=0 时把 vs2[i] 写入 vd[i];它使用 v0 作为选择掩码,而不是普通执行掩码。

VFMERGE.VFM 指令解析与执行动画

从 OP-V 编码解码到逐元素浮点合并:固定 vm=0,v0 的每一位选择 f[rs1] 或 vs2[i],但不会屏蔽 body 元素执行。

输入的指令
vfmerge.vfm
vm0固定为 0:v0 是选择掩码,不屏蔽执行
执行环境
LMULm1本动画固定的寄存器组倍数
VLEN4096固定向量寄存器长度(bits)
VLMAX128m1 下的最大元素数
vstart0本动画不展示 prestart 元素
frmRNE本指令不按 frm 舍入;真实指令仍要求有效 frm
FP stateFS enabledFS=Off 会触发非法指令;本动画固定展示 FS 已启用的架构路径
vta / vmata, mamerge 写全部 body 元素;仅尾部由 vta 处理
opcode1010111OP-V 主操作码
编码字段
0x5c855257
31..26
25
24..20
19..15
14..12
11..7
6..0
010111
funct6
0
vm
01000
vs2
01010
rs1
101
funct3
00100
vd
1010111
OP-V
执行数据路径

lane 0: v0[i]=1: 1.5 -> 0x3fc00000 (1.5)

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

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

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

逐元素结果
长向量在模块内部横向滚动,不造成页面溢出。
i=0活动
v0[i]=1: 1.5
0x3fc00000 (1.5)
i=1活动
v0[i]=1: 1.5
0x3fc00000 (1.5)
i=2活动
v0[i]=0: 2
0x40000000 (2)
i=3活动
v0[i]=1: 1.5
0x3fc00000 (1.5)
i=4活动
v0[i]=1: 1.5
0x3fc00000 (1.5)
i=5活动
v0[i]=1: 1.5
0x3fc00000 (1.5)
i=6活动
v0[i]=0: 4
0x40800000 (4)
i=7活动
v0[i]=1: 1.5
0x3fc00000 (1.5)
SEW=32 / binary32 示例直接复制选中的 IEEE 位模式:v0[i]=1 复制 f[rs1],v0[i]=0 复制 vs2[i]。固定 vm=0 不是普通执行掩码;所有 body 元素都写入,prestart 保持不变,tail 由 vta 策略处理。若 FLEN 大于 SEW,标量 f[rs1] 必须是有效 NaN-boxed 值,否则架构上把它视为 canonical NaN。

本教学环境固定 VS/FS 已启用、vtype 合法、frm=RNE、FLEN=64;SEW=32 的标量输入表示有效 NaN-box 中的低32位。同名源须给出相同位模式。同宽目标与源重叠合法;ta/ma 不保证非活动或尾部的具体值。VL=0 时所有目标元素包括 tail 均不更新。

快速理解与检索要点

VFMERGE.VFM 是条件选择,不是算术运算。最容易弄反的是选择方向:掩码位为 1 选择浮点标量,掩码位为 0 选择 vs2 元素。

该指令固定使用 v0 作为合并选择掩码。
对从 vstart 到 vl-1 的全部 body 元素执行;v0 位只选择来源,因此没有由该掩码产生的 inactive 元素,尾部才遵循 vta 策略。
编码的 vm 位固定为 0;v0.mask[i]=1 选择 f[rs1],为 0 选择 vs2[i]。
若 FLEN 大于 SEW,vector-scalar 形式读取的 f[rs1] 必须是有效 NaN-boxed 值;否则该标量操作数按 canonical NaN 处理。
本页讨论 V 1.0:V 依赖 F/D,支持 SEW=32/64 的浮点运算;VS/FS 必须已启用且 vtype 合法。即使本操作不按 frm 舍入,使用无效 frm 仍属保留。标量来自 f 寄存器;FLEN>SEW 时须为有效 NaN-boxed 值,否则按 canonical NaN 读取。
OP-V 为 32 位编码:funct6=010111、funct3=101、vm=0。vd 不能与 v0 重叠;vs2 不能把 v0 同时作为 SEW 数据源和 EEW=1 选择源读取。

向量执行上下文

vd、vs2 是 SEW 位向量组;同 EEW 目标与源可重叠,同名源须读取相同初值。没有立即数操作数。

rs1 选择浮点 f0–f31 或 ABI 名称;FLEN>SEW 时无效 NaN-box 读取为 canonical NaN。

v0 是必需的选择源,固定 vm=0;v0[i]=1 选择 f[rs1],为 0 选择 vs2[i],全部 body 元素都写回。

要求 V、受支持的 vtype 与浮点宽度、VS/FS 已启用;V 支持 FP32/FP64 且依赖 F/D。H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。无效 frm 的使用保留,即使操作不舍入或 vl=0。

prestart 不变;vl=0 或 vstart≥vl 时所有目标元素(包括 tail)均不更新。否则非活动/尾部遵循 vma/vta,不保证清零或保留。

vm=0 时 vd 不可重叠 v0;v0 也不能同时作为 EEW=1 选择/掩码源和 SEW 数据源。成功执行后 vstart 复位为 0。

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

常见使用场景

条件赋值

假定 V/VS/FS 已启用、有效 frm、e32,m1 可用、VLMAX≥4、x10=4、vstart=0 且 v2=[1,-2,3,+0];标量为有效 NaN-boxed。v0=[1,0,1,0], f0=1.5 → v1=[1.5,-2,1.5,+0]。最值示例省略 v0.t,故四个 body 元素均执行;merge 的 v0 只选择来源。尾部遵循 ta,不假定清零。

三元运算符

假定 V/VS/FS 已启用、有效 frm、e32,m1 可用、VLMAX≥4、x10=4、vstart=0 且 v2=[1,-2,3,+0];标量为有效 NaN-boxed。v0=[1,0,1,0], f0=1.5 → v1=[1.5,-2,1.5,+0]。最值示例省略 v0.t,故四个 body 元素均执行;merge 的 v0 只选择来源。尾部遵循 ta,不假定清零。

使用前检查清单

语法检查
  • vd、vs2 是 SEW 位向量组;同 EEW 目标与源可重叠,同名源须读取相同初值。没有立即数操作数。
  • rs1 选择浮点 f0–f31 或 ABI 名称;FLEN>SEW 时无效 NaN-box 读取为 canonical NaN。
语义检查
  • v0 是必需的选择源,固定 vm=0;v0[i]=1 选择 f[rs1],为 0 选择 vs2[i],全部 body 元素都写回。
  • 要求 V、受支持的 vtype 与浮点宽度、VS/FS 已启用;V 支持 FP32/FP64 且依赖 F/D。H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。无效 frm 的使用保留,即使操作不舍入或 vl=0。
  • prestart 不变;vl=0 或 vstart≥vl 时所有目标元素(包括 tail)均不更新。否则非活动/尾部遵循 vma/vta,不保证清零或保留。
  • vm=0 时 vd 不可重叠 v0;v0 也不能同时作为 EEW=1 选择/掩码源和 SEW 数据源。成功执行后 vstart 复位为 0。

容易混淆 / 常见误区

选择掩码固定为 v0,且编码中的 vm 位固定为 0;它不是可选的普通执行掩码。
VFMERGE.VFM 是 vmerge.vxm 的浮点版本。标量来自 f 寄存器而非 x 寄存器。
V 依赖 F 和 D 并支持 FP32/FP64;V 本身不提供 FP16 运算。

常见问题

掩码为 1 时选择哪个操作数?

选择浮点标量 f[rs1];掩码为 0 时选择 vs2[i]。