首页/指令库/VFMIN-VV
VFMIN.VV

RISC-V VFMIN.VV 指令详解

指令手册V-type

VFMIN.VV 是 RVV 单宽浮点最小值选择指令,语法为 vfmin.vv vd, vs2, vs1, vm;每个活动元素比较 vs2[i] 与 vs1[i],把较小值写入 vd[i]。

指令语法

vfmin.vv vd, vs2, vs1, vm
操作数说明
vd、vs2 是 SEW 位向量组;同 EEW 目标与源可重叠,同名源须读取相同初值。没有立即数操作数。
vs1 提供同 lane 的第二个 SEW 位浮点值;这不是跨 lane 归约。
汇编 vm 是可选 v0.t;省略为 vm=1。仅 vstart≤i<vl 且(vm=1 或 v0[i]=1)的活动元素执行 minimumNumber/maximumNumber。
要求 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向量运算浮点

指令行为说明

VFMIN.VV 对 vl 范围内的活动元素执行逐 lane 浮点最小值选择。第二源来自同 lane 的 vs1[i];vm=0 时 v0.t 控制哪些元素执行,vm=1 时不使用执行掩码。NaN、signaling NaN invalid flag、有符号零和结果选择遵循官方 RISC-V FMIN/FMAX 规则;这不是整数最值、饱和运算或融合乘加。

VFMIN.VV 指令解析与执行动画

从 OP-V 编码解码到逐元素浮点最小值选择:第二源来自 same-lane vs1。

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

lane 0: min(1, 0.5) -> 0x3f000000 (0.5)

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

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

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

逐元素结果
本次执行不置 NV长向量在模块内部横向滚动,不造成页面溢出。
i=0活动
min(1, 0.5)
0x3f000000 (0.5)
i=1活动
min(1.5, 1)
0x3f800000 (1)
i=2跳过
v0.t=0,不执行
--
i=3活动
min(2.5, 2)
0x40000000 (2)
i=4活动
min(-3, 2.5)
0xc0400000 (-3)
i=5活动
min(3.5, 3)
0x40400000 (3)
i=6跳过
v0.t=0,不执行
--
i=7活动
min(4.5, 4)
0x40800000 (4)
本动画先按 SEW=32 / binary32 表示输入值,再按 FMIN/FMAX 选择:单个 NaN 返回另一输入,双 NaN 返回 canonical NaN;任一 sNaN 使活动元素置 NV。-0 小于 +0,同号零保留符号。结果选择不按 frm 舍入,但真实指令仍要求有效 frm。显示的是本次执行是否置 NV,不是原有 fflags 的清零或完整快照。

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

快速理解与检索要点

VFMIN.VV 的学习重点是 OP-V 编码、同 lane 的 vs1[i]、v0.t 掩码,以及每个活动元素的 vd[i] = min(vs2[i], vs1[i])。

OP-V 编码中 funct6=000100、funct3=001 选择 vfmin.vv 的 vector-vector 浮点最小值形式。
语义是 vd[i] = min(vs2[i], vs1[i]),只对 vl 范围内的活动元素执行。
vm=0 使用 v0.t 作为执行掩码;vm=1 表示不使用执行掩码。
只有一个输入为 NaN 时返回非 NaN 输入;两个输入均为 NaN 时返回 canonical NaN。任一 signaling NaN 输入置 fflags.NV,即使返回数值;仅 quiet NaN 不置 NV。最值比较把 -0.0 视为小于 +0.0,同号零保留该符号。
普通 masked vector 指令的目标向量寄存器组不能与 v0 掩码源重叠;动画在 vm=0 且 vd=v0 时会报错。
本页讨论 V 1.0:V 依赖 F/D,支持 SEW=32/64 的浮点运算;VS/FS 必须已启用且 vtype 合法。即使本操作不按 frm 舍入,使用无效 frm 仍属保留。

向量执行上下文

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

vs1 提供同 lane 的第二个 SEW 位浮点值;这不是跨 lane 归约。

汇编 vm 是可选 v0.t;省略为 vm=1。仅 vstart≤i<vl 且(vm=1 或 v0[i]=1)的活动元素执行 minimumNumber/maximumNumber。

要求 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。v3=[2,-3,1,-0] → v1=[1,-3,1,-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。v3=[2,-3,1,-0] → v1=[1,-3,1,-0]。最值示例省略 v0.t,故四个 body 元素均执行;merge 的 v0 只选择来源。尾部遵循 ta,不假定清零。

使用前检查清单

语法检查
  • vd、vs2 是 SEW 位向量组;同 EEW 目标与源可重叠,同名源须读取相同初值。没有立即数操作数。
  • vs1 提供同 lane 的第二个 SEW 位浮点值;这不是跨 lane 归约。
语义检查
  • 汇编 vm 是可选 v0.t;省略为 vm=1。仅 vstart≤i<vl 且(vm=1 或 v0[i]=1)的活动元素执行 minimumNumber/maximumNumber。
  • 要求 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。

容易混淆 / 常见误区

操作数顺序是 vs2[i] 与 vs1[i] 做最小值选择;不要把它当作跨 lane 归约。
NaN 和有符号零不能简化成普通数值比较;应按官方 FMIN/FMAX 规则理解。
这不是整数最值、饱和裁剪或 FMA;结果是浮点值选择。
vm=0 时只有 v0.t=1 的活动元素执行;vm=1 时 body 元素全部执行。被掩码关闭的元素按 vma 处理,不保证清零或保留。
当 vm=0 使用 v0.t 作为执行掩码时,普通目标向量寄存器组不能与 v0 掩码寄存器重叠。

常见问题

VFMIN.VV 的 vm 操作数控制什么?

vm=0 时只执行 v0.t 为 1 的活动元素;vm=1 表示不使用执行掩码。本页公式是 vd[i] = min(vs2[i], vs1[i])。

VFMIN.VV 是归约最值指令吗?

不是。它逐 lane 产生一个目标向量元素;跨元素归约最值使用对应的 vector reduction 指令。

VFMIN.VV 如何处理 NaN 和有符号零?

只有一个输入为 NaN 时返回非 NaN 输入;两个输入均为 NaN 时返回 canonical NaN。任一 signaling NaN 输入置 fflags.NV,即使返回数值;仅 quiet NaN 不置 NV。最值比较把 -0.0 视为小于 +0.0,同号零保留该符号。