首页/指令库/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/vs1 或标量源:按指令后缀 .vv/.vx/.vi/.vf 决定来源。
vm:若语法包含 vm,vm=0 使用 v0 作为执行掩码,vm=1 为未掩码。
V向量运算浮点

指令行为说明

VFMERGE.VFM 是浮点标量合并指令。对每个元素,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固定 RNE 的有限教学环境;真实指令使用动态 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[1] ? 1.5 : 1 -> 0x3fc00000 (1.5)

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

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

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

逐元素结果
长向量在模块内部横向滚动,不造成页面溢出。
i=0活动
v0[1] ? 1.5 : 1
0x3fc00000 (1.5)
i=1活动
v0[1] ? 1.5 : 1.5
0x3fc00000 (1.5)
i=2活动
v0[0] ? 1.5 : 2
0x40000000 (2)
i=3活动
v0[1] ? 1.5 : 2.5
0x3fc00000 (1.5)
i=4活动
v0[1] ? 1.5 : -3
0x3fc00000 (1.5)
i=5活动
v0[1] ? 1.5 : 3.5
0x3fc00000 (1.5)
i=6活动
v0[0] ? 1.5 : 4
0x40800000 (4)
i=7活动
v0[1] ? 1.5 : 4.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。

快速理解与检索要点

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 处理。

向量执行上下文

阅读 VFMERGE.VFM 时,不要只看助记符。官方 V 扩展语义还依赖当前 vl、vtype 和掩码状态。后缀和操作数形式决定源操作数来自向量、标量还是立即数。

先看 vl

当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。

再看 vtype

当前 vtype 提供 SEW、LMUL、tail policy 和 mask policy;这些规则影响元素宽度、寄存器组大小以及非活动/尾部目标元素。

最后看 vm/v0

带 vm 的普通向量指令在 vm=0 时用 v0 作为执行掩码,vm=1 表示未掩码。VMERGE 等少数形式会把 v0 当作数据选择输入。

官方来源:RISC-V V Standard Extension for Vector Operations

常见使用场景

条件赋值

结合 «vsetvli t0, a0, e32, m1, ta, ma vfmerge.vfm v1, v2, ft0, v0 # v0[i] ? ft0 : v2[i]» 等实际代码理解该场景。

三元运算符

结合 «vsetvli t0, a0, e32, m1, ta, ma vfmerge.vfm v1, v2, ft0, v0 # v0[i] ? ft0 : v2[i]» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

选择掩码固定为 v0,且编码中的 vm 位固定为 0;它不是可选的普通执行掩码。
VFMERGE.VFM 是 vmerge.vxm 的浮点版本。标量来自 f 寄存器而非 x 寄存器。
向量 FP32/FP64 操作需要对应的标量 F/D 支持;仅有 V 并不意味着支持 FP16。

常见问题

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

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