先看 vl
当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。
依 v0 掩码合并 vs2[i] 与 f[rs1]:掩码为 1 时写 f[rs1],为 0 时写 vs2[i]。
VFMERGE.VFM 是浮点标量合并指令。对每个元素,v0.mask[i]=1 时把 f[rs1] 写入 vd[i],v0.mask[i]=0 时把 vs2[i] 写入 vd[i];它使用 v0 作为选择掩码,而不是普通执行掩码。
VFMERGE.VFM 是条件选择,不是算术运算。最容易弄反的是选择方向:掩码位为 1 选择浮点标量,掩码位为 0 选择 vs2 元素。
阅读 VFMERGE.VFM 时,不要只看助记符。官方 V 扩展语义还依赖当前 vl、vtype 和掩码状态。后缀和操作数形式决定源操作数来自向量、标量还是立即数。
当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。
当前 vtype 提供 SEW、LMUL、tail policy 和 mask policy;这些规则影响元素宽度、寄存器组大小以及非活动/尾部目标元素。
带 vm 的普通向量指令在 vm=0 时用 v0 作为执行掩码,vm=1 表示未掩码。VMERGE 等少数形式会把 v0 当作数据选择输入。
结合 «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]» 等实际代码理解该场景。
选择浮点标量 f[rs1];掩码为 0 时选择 vs2[i]。