首页/指令库/VFNCVT-X-F-W
VFNCVT.X.F.W

RISC-V VFNCVT.X.F.W 指令详解

指令手册OPFVV

将 2*SEW 宽浮点源元素按 frm 舍入后窄化为 SEW 有符号整数。

指令语法

vfncvt.x.f.w vd, vs2[, v0.t]
操作数说明
语法 vd, vs2[, v0.t];vs1=10001 是 VFUNARY0 selector,不是第二源。funct6=010010、funct3=001、opcode=1010111;指令长 32 位。
源 EEW=2*SEW、EMUL=2*LMUL;目标 EEW=SEW、EMUL=LMUL。寄存器组最多 8 个且按组大小对齐。重叠须从同一最低编号寄存器开始,并强制 mask/tail agnostic;.w 不表示固定 32 位。
可选 v0.t 对应 vm=0,省略为 vm=1。活动元素满足 vstart≤i<vl 且 mask 启用。masked vd 不得重叠 v0;数据源也不能同时按数据 EEW 和 mask EEW=1 读取 v0。
prestart 保持不变;vl=0 或 vstart≥vl 时所有目标元素包括 tail 均不更新。其他非活动/尾元素遵循 vma/vta,ta/ma 不保证清零;成功执行重置 vstart=0。
浮点转整数先按动态 frm 舍入,再检查 SEW 目标范围;越界/无穷/NaN 按标量转换规则裁剪并置 NV,未置 NV 且值改变时置 NX。负小数舍入为 0 可为有效无符号转换。动画只接受舍入结果在 32 位范围内的有限 binary64 输入,不展示 fflags。
V 1.0 在 RV32/RV64 支持此处 64→32 路径,且依赖 F/D。SEW=16 的本转换需要 Zvfh;Zvfh 还定义 SEW=8 的 binary16→8 位整数路径。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0。
要求合法 vtype、支持所需浮点宽度、VS/FS 已启用;H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。无效 frm 的使用保留,即使 vl=0 或无活动元素;vxrm 不控制浮点运算。教学步骤不表示处理器周期。
V向量类型转换/扩展浮点

指令行为说明

VFNCVT.X.F.W 将 vs2 中 EEW=2*SEW 的浮点元素,按动态 frm 舍入转换为 SEW 位有符号整数并写入 vd。转换后的值不能表示时按标量转换规则裁剪并置 NV;否则舍入改变数值时置 NX。只执行活动元素,不写通用整数寄存器。

VFNCVT.X.F.W 指令解析与执行动画

从 OP-V 编码解码到 VFUNARY0 窄化类型转换:每个活动元素把 vs2[i] 2*SEW 浮点值转换为有符号整数。

输入的指令
vfncvt.x.f.w
执行环境
LMULm1本动画固定的寄存器组倍数
VLEN4096固定向量寄存器长度(bits)
VLMAX128m1 下的最大元素数
vstart0本动画不展示 prestart 元素
FP stateFS enabledFS=Off 会触发非法指令;本动画固定展示 FS 已启用的架构路径
source EEW64源元素宽度
vta/vmata, ma尾部/非活动元素策略
opcode1010111OP-V 主操作码
vs110001VFUNARY0 转换选择字段
编码字段
0x48889257
31..26
25
24..20
19..15
14..12
11..7
6..0
010010
funct6
0
vm
01000
vs2
10001
vs1/sel
001
funct3
00100
vd
1010111
OP-V
执行数据路径

lane 0: narrow_round.frm_signed(-3.75) -> -4

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

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

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

逐元素结果
长向量在模块内部横向滚动,不造成页面溢出。
i=0活动
narrow_round.frm_signed(-3.75)
-4
i=1活动
narrow_round.frm_signed(-2.5)
-2
i=2跳过
v0.t=0,不执行
--
i=3活动
narrow_round.frm_signed(-0.25)
0
i=4活动
narrow_round.frm_signed(0.25)
0
i=5活动
narrow_round.frm_signed(1.5)
2
i=6跳过
v0.t=0,不执行
--
i=7活动
narrow_round.frm_signed(3.75)
4
source EEW=64 / binary64 -> destination width=32:先按动态 frm(RNE、RTZ、RDN、RUP 或 RMM)舍入,再检查 32 位有符号整数范围。reserved frm 会拒绝编码和执行。本动画仅接受有限且舍入后未越界的输入;NaN、无穷、越界裁剪和 fflags 仍按官方 RVV/标量浮点规则处理,不在本教学模型中计算。

教学环境固定 VLEN=4096、LMUL=m1、SEW=32、vstart=0、合法 vtype、VS/FS 已启用和有效 frm。源组为偶数 vs2..vs2+1,目标为单个寄存器;重叠只能从源组最低编号寄存器开始,并强制 mask/tail agnostic。VL=0 时包括 tail 在内的目标元素均不更新。非活动和尾部不显示确定值;不展示完整 fflags。NaN、无穷和越界整数转换是模型范围之外的合法浮点输入,不表示非法指令。

快速理解与检索要点

这是“宽浮点到窄有符号整数”的 frm 舍入转换;不要把 `.w` 理解成写 32 位固定宽度。

VFNCVT.X.F.W 属于 RVV VFUNARY0 转换编码空间:selector(vs1[19:15])=10001,funct6=010010,funct3=001(OPFVV),opcode=1010111(OP-V)。这里的 vs1 字段是编码 selector,不是汇编语法中的源寄存器。
本组是窄化转换:vs2 源元素宽度为 2*SEW,vd 目标元素宽度为 SEW;它不是单宽 VFCVT,也不是宽化 VFWCVT。
窄化源寄存器组的 EMUL 是目标组的 2 倍;按官方 narrowing overlap 规则,若目标组与源组重叠,目标组最低编号寄存器必须等于源组最低编号寄存器。
只对 vl 范围内的活动元素执行;vm=0 时 v0.t 控制活动元素,非活动元素和尾部元素按当前 vma/vta 策略处理。
普通浮点转换使用 frm;rtz/rod 形式的结果舍入由指令固定选择,frm 有效性仍按官方 vector FP 规则处理;这些转换不使用定点 vxrm。

向量执行上下文

语法 vd, vs2[, v0.t];vs1=10001 是 VFUNARY0 selector,不是第二源。funct6=010010、funct3=001、opcode=1010111;指令长 32 位。

源 EEW=2*SEW、EMUL=2*LMUL;目标 EEW=SEW、EMUL=LMUL。寄存器组最多 8 个且按组大小对齐。重叠须从同一最低编号寄存器开始,并强制 mask/tail agnostic;.w 不表示固定 32 位。

可选 v0.t 对应 vm=0,省略为 vm=1。活动元素满足 vstart≤i<vl 且 mask 启用。masked vd 不得重叠 v0;数据源也不能同时按数据 EEW 和 mask EEW=1 读取 v0。

prestart 保持不变;vl=0 或 vstart≥vl 时所有目标元素包括 tail 均不更新。其他非活动/尾元素遵循 vma/vta,ta/ma 不保证清零;成功执行重置 vstart=0。

浮点转整数先按动态 frm 舍入,再检查 SEW 目标范围;越界/无穷/NaN 按标量转换规则裁剪并置 NV,未置 NV 且值改变时置 NX。负小数舍入为 0 可为有效无符号转换。动画只接受舍入结果在 32 位范围内的有限 binary64 输入,不展示 fflags。

V 1.0 在 RV32/RV64 支持此处 64→32 路径,且依赖 F/D。SEW=16 的本转换需要 Zvfh;Zvfh 还定义 SEW=8 的 binary16→8 位整数路径。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0。

要求合法 vtype、支持所需浮点宽度、VS/FS 已启用;H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。无效 frm 的使用保留,即使 vl=0 或无活动元素;vxrm 不控制浮点运算。教学步骤不表示处理器周期。

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

常见使用场景

宽浮点结果落地为较窄有符号整数

假定 V/VS/FS 已启用、合法 vtype、frm=RNE、e32,m1 和所需浮点格式可用、VLMAX≥4、a0=4;vsetvli 后 vl=4、vstart=0。源组为 v2/v3、EEW=64。示例省略 v0.t、未掩码:binary64 v2=[-3.75,-2.5,1.5,2.5] → int32 v1=[-4,-2,2,2] (NX)。tail 按 ta 处理,不假定清零。

转换后存储或整数后处理

假定 V/VS/FS 已启用、合法 vtype、frm=RNE、e32,m1 和所需浮点格式可用、VLMAX≥4、a0=4;vsetvli 后 vl=4、vstart=0。源组为 v2/v3、EEW=64。示例省略 v0.t、未掩码:binary64 v2=[-3.75,-2.5,1.5,2.5] → int32 v1=[-4,-2,2,2] (NX)。tail 按 ta 处理,不假定清零。

使用前检查清单

语法检查
  • 语法 vd, vs2[, v0.t];vs1=10001 是 VFUNARY0 selector,不是第二源。funct6=010010、funct3=001、opcode=1010111;指令长 32 位。
  • 源 EEW=2*SEW、EMUL=2*LMUL;目标 EEW=SEW、EMUL=LMUL。寄存器组最多 8 个且按组大小对齐。重叠须从同一最低编号寄存器开始,并强制 mask/tail agnostic;.w 不表示固定 32 位。
语义检查
  • 可选 v0.t 对应 vm=0,省略为 vm=1。活动元素满足 vstart≤i<vl 且 mask 启用。masked vd 不得重叠 v0;数据源也不能同时按数据 EEW 和 mask EEW=1 读取 v0。
  • prestart 保持不变;vl=0 或 vstart≥vl 时所有目标元素包括 tail 均不更新。其他非活动/尾元素遵循 vma/vta,ta/ma 不保证清零;成功执行重置 vstart=0。
  • 浮点转整数先按动态 frm 舍入,再检查 SEW 目标范围;越界/无穷/NaN 按标量转换规则裁剪并置 NV,未置 NV 且值改变时置 NX。负小数舍入为 0 可为有效无符号转换。动画只接受舍入结果在 32 位范围内的有限 binary64 输入,不展示 fflags。
  • V 1.0 在 RV32/RV64 支持此处 64→32 路径,且依赖 F/D。SEW=16 的本转换需要 Zvfh;Zvfh 还定义 SEW=8 的 binary16→8 位整数路径。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0。
  • 要求合法 vtype、支持所需浮点宽度、VS/FS 已启用;H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。无效 frm 的使用保留,即使 vl=0 或无活动元素;vxrm 不控制浮点运算。教学步骤不表示处理器周期。

容易混淆 / 常见误区

动态 frm 与 rtz 固定截断不同。
源元素宽度是 2*SEW,目标元素宽度是 SEW,寄存器组重叠规则按 narrowing 指令处理。

常见问题

VFNCVT 和 VFWCVT 的方向有什么区别?

VFNCVT 从 2*SEW 源元素窄化到 SEW 目标元素;VFWCVT 从 SEW 源元素扩宽到 2*SEW 目标元素。二者方向相反,寄存器组大小和允许重叠规则也不同。

VFNCVT 使用 vxrm 舍入吗?

不使用。VFNCVT 是浮点/整数转换族,普通形式使用浮点 frm,rtz 和 rod 是指令指定的固定舍入形式;vxrm 属于定点舍入指令。

NaN、无穷与负数如何转换?

目标范围为 −2^(SEW−1)..2^(SEW−1)−1。负越界或 −∞ 返回最小值,正越界、+∞ 或 NaN 返回最大值,并置 NV。未置 NV 且舍入改变值时置 NX。