首页/指令库/VMFEQ-VF
VMFEQ.VF

RISC-V VMFEQ.VF 指令详解

指令手册OPFVF

逐元素执行浮点相等比较,并把布尔结果写入目标掩码 vd。

指令语法

vmfeq.vf vd, vs2, rs1, vm
操作数说明
vd 是单个 mask 目标,每个元素一位;rs1 选择浮点 f 寄存器,非整数寄存器。活动元素写 vs2[i]==f[rs1];+0 与 -0 相等,NaN 写0,仅活动 sNaN 输入置 NV。
32 位 OP-V:opcode=1010111、funct6=011000、funct3=101。省略 v0.t 为 vm=1,给出为 vm=0。
允许 mask 目标与 v0 重叠;数据源与 mask 共用寄存器而 EEW 不同的编码保留。LMUL=m1 时 vd 可与 vs2 同起点重叠。
需合法 vtype、VS/FS 已启用、受支持浮点格式和有效 frm;FLEN>SEW 时无效 NaN-box 视作 canonical NaN,FLEN<SEW 保留。比较不按 frm 舍入,但无效 frm 使用仍保留。
body 为 vstart≤i<vl;prestart 不更新,inactive 按 vma,mask tail 始终 agnostic。VL=0 或 vstart≥vl 不更新任何目标(含 tail)。动画固定 LMUL=m1、VLEN=4096、vstart=0,步骤不是处理器周期。
V向量浮点运算比较

指令行为说明

VMFEQ.VF 是 RISC-V V 扩展的向量浮点比较指令。它在 vl 范围内对活动元素计算 vs2[i] == 浮点标量 f[rs1],并把每个布尔结果写入目标掩码寄存器 vd 的对应位。vm=0 时 v0.t 选择活动元素,vm=1 表示不使用执行掩码;NaN、invalid 异常标志和 tail-agnostic 结果规则遵循官方 RVV 浮点比较语义。

VMFEQ.VF 指令解析与执行动画

从 OP-V 编码解码到逐元素浮点比较:每个活动元素计算 vs2[i] == f[rs1],并把布尔结果写入目标掩码位。

输入的指令
vmfeq.vf
执行环境
LMULm1本动画固定的寄存器组倍数
VLEN4096固定向量寄存器长度(bits)
VLMAX128m1 下的最大元素数
vstart0本动画不展示 prestart 元素
frmRNE本指令不按 frm 舍入
FP stateFS enabledFS=Off 会触发非法指令;本动画固定展示 FS 已启用的架构路径
vta/vmata, ma尾部/非活动元素策略
opcode1010111OP-V 主操作码
编码字段
0x60855257
31..26
25
24..20
19..15
14..12
11..7
6..0
011000
funct6
0
vm
01000
vs2
01010
rs1
101
funct3
00100
vd
1010111
OP-V
执行数据路径

lane 0: 1 == 1.5 -> mask=0

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

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

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

逐元素结果
本次执行不置 NV长向量在模块内部横向滚动,不造成页面溢出。
i=0活动
1 == 1.5
mask=0
i=1活动
1.5 == 1.5
mask=1
i=2跳过
v0.t=0,不执行
--
i=3活动
2.5 == 1.5
mask=0
i=4活动
-3 == 1.5
mask=0
i=5活动
3.5 == 1.5
mask=0
i=6跳过
v0.t=0,不执行
--
i=7活动
4.5 == 1.5
mask=0

教学环境固定 VLEN=4096、LMUL=m1、vstart=0、合法 vtype、VS/FS 已启用、FLEN=64 和有效 frm。支持所选 binary32/64;SEW=32 标量假定有效 NaN-box。vd 是单寄存器 mask,可与 v0 或 vs2 同起点重叠;masked vs2 不可为 v0(EEW 不同)。vd 与 vs2 的不同 EEW 重叠还强制 mask-agnostic,不受 vma 控制。非活动位不显示确定值,mask tail 始终 agnostic;VL=0 不更新任何目标位。显示本次执行是否置 NV,不清除旧 fflags;比较结果不受舍入选择影响,但无效 frm 仍保留。步骤不是处理器周期。

SEW=32 / binary32 示例接受有限数值或完整 IEEE 十六进制位模式,因此可检查 qNaN/sNaN。活动元素写入目标掩码位 0/1,并在需要时显示本次执行的 fflags.NV。官方规则中,VMFEQ/VMFNE 仅在 signaling NaN 输入时置 invalid;VMFLT/VMFLE/VMFGT/VMFGE 对 signaling 或 quiet NaN 都置 invalid;除 VMFNE 遇 NaN 写 1 外,其它比较遇 NaN 写 0。

快速理解与检索要点

VMFEQ.VF 对活动元素比较 vs2[i] 与浮点标量 f[rs1] 是否相等,把每个布尔结果写入目标掩码 vd 的一位。

OP-V 编码中 funct6=011000、funct3=101 选择 VMFEQ.VF 的 vf 浮点比较形式。
vm=0 使用 v0.t 作为执行掩码;vm=1 表示不使用执行掩码。
比较指令写 mask 结果,尾部元素按 tail-agnostic 处理。
VMFEQ 仅在 signaling NaN 输入时设置 invalid。
VMFEQ 遇 NaN 比较写 0。
需受支持浮点格式、合法 vtype、VS/FS 已启用和有效 frm;FLEN>SEW 时无效 NaN-box 视作 canonical NaN,FLEN<SEW 保留。masked-off 元素不置异常标志。

向量执行上下文

vd 是单个 mask 目标,每个元素一位;rs1 选择浮点 f 寄存器,非整数寄存器。活动元素写 vs2[i]==f[rs1];+0 与 -0 相等,NaN 写0,仅活动 sNaN 输入置 NV。

32 位 OP-V:opcode=1010111、funct6=011000、funct3=101。省略 v0.t 为 vm=1,给出为 vm=0。

允许 mask 目标与 v0 重叠;数据源与 mask 共用寄存器而 EEW 不同的编码保留。LMUL=m1 时 vd 可与 vs2 同起点重叠。

需合法 vtype、VS/FS 已启用、受支持浮点格式和有效 frm;FLEN>SEW 时无效 NaN-box 视作 canonical NaN,FLEN<SEW 保留。比较不按 frm 舍入,但无效 frm 使用仍保留。

body 为 vstart≤i<vl;prestart 不更新,inactive 按 vma,mask tail 始终 agnostic。VL=0 或 vstart≥vl 不更新任何目标(含 tail)。动画固定 LMUL=m1、VLEN=4096、vstart=0,步骤不是处理器周期。

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

常见使用场景

生成谓词掩码

假定 V/VS 已启用、e32,m1 可用、VLEN≥128、vl=4、vstart=0、ta/ma,源已初始化;FS 已启用、frm=RNE、FLEN=64,f0 为有效 NaN-box,未掩码。v2=[1.5,-0,2,1.5], f0=1.5 → v1.mask[0..3]=[1,0,0,1], NV unchanged。tail 不保证清零;mask 目标始终 tail-agnostic。

浮点条件判断

假定 V/VS 已启用、e32,m1 可用、VLEN≥128、vl=4、vstart=0、ta/ma,源已初始化;FS 已启用、frm=RNE、FLEN=64,f0 为有效 NaN-box,未掩码。v2=[1.5,-0,2,1.5], f0=1.5 → v1.mask[0..3]=[1,0,0,1], NV unchanged。tail 不保证清零;mask 目标始终 tail-agnostic。

NaN 检查

假定 V/VS 已启用、e32,m1 可用、VLEN≥128、vl=4、vstart=0、ta/ma,源已初始化;FS 已启用、frm=RNE、FLEN=64,f0 为有效 NaN-box,未掩码。v2=[1.5,-0,2,1.5], f0=1.5 → v1.mask[0..3]=[1,0,0,1], NV unchanged。tail 不保证清零;mask 目标始终 tail-agnostic。

向量化条件执行

假定 V/VS 已启用、e32,m1 可用、VLEN≥128、vl=4、vstart=0、ta/ma,源已初始化;FS 已启用、frm=RNE、FLEN=64,f0 为有效 NaN-box,未掩码。v2=[1.5,-0,2,1.5], f0=1.5 → v1.mask[0..3]=[1,0,0,1], NV unchanged。tail 不保证清零;mask 目标始终 tail-agnostic。

使用前检查清单

语法检查
  • vd 是单个 mask 目标,每个元素一位;rs1 选择浮点 f 寄存器,非整数寄存器。活动元素写 vs2[i]==f[rs1];+0 与 -0 相等,NaN 写0,仅活动 sNaN 输入置 NV。
  • 32 位 OP-V:opcode=1010111、funct6=011000、funct3=101。省略 v0.t 为 vm=1,给出为 vm=0。
语义检查
  • 允许 mask 目标与 v0 重叠;数据源与 mask 共用寄存器而 EEW 不同的编码保留。LMUL=m1 时 vd 可与 vs2 同起点重叠。
  • 需合法 vtype、VS/FS 已启用、受支持浮点格式和有效 frm;FLEN>SEW 时无效 NaN-box 视作 canonical NaN,FLEN<SEW 保留。比较不按 frm 舍入,但无效 frm 使用仍保留。
  • body 为 vstart≤i<vl;prestart 不更新,inactive 按 vma,mask tail 始终 agnostic。VL=0 或 vstart≥vl 不更新任何目标(含 tail)。动画固定 LMUL=m1、VLEN=4096、vstart=0,步骤不是处理器周期。

容易混淆 / 常见误区

结果写入掩码寄存器布局,每个元素一位;它不是 0/-1 或 0/1 的普通整数向量。
比较类指令的目标是 mask,tail 元素按 tail-agnostic 处理;不要按普通浮点结果解释尾部位。
vm=0 时使用 v0.t 作为执行掩码;比较指令允许目标掩码 vd 与 v0 源掩码重叠。
VMFEQ.VF 使用 浮点标量 f[rs1],不要把 .vf 的 rs1 当作整数通用寄存器。
NaN 与 invalid 标志按官方 RVV 浮点比较规则处理,不能套用整数比较或 JavaScript 比较语义。

常见问题

VMFEQ.VF 写入普通向量元素吗?

不写。VMFEQ.VF 写目标掩码 vd,每个活动元素产生一个布尔位。

VMFEQ.VF 可以在 vm=0 时写 v0 吗?

可以。官方 V 规范允许生成 mask 的比较指令目标与源 mask v0 重叠,这一点不同于普通 masked vector 指令。

VMFEQ.VF 的 NaN 比较结果是什么?

NaN 比较写 0;只有 signaling NaN 输入设置 invalid。