首页/指令库/FCVTMOD.W.D
FCVTMOD.W.D

RISC-V FCVTMOD.W.D 指令详解

指令手册R-type

双精度浮点模转换到有符号字(截断后取模2^32)

指令语法

fcvtmod.w.d rd, rs1, rtz

32位OP-FP字段:opcode=1010011、funct5=11000、fmt=01;rs2=01000为固定选择子,不是第二个源。

rd为x0–x31,rs1为f0–f31;rd=x0仅丢弃整数写回,fflags仍累积。

RV32/RV64 Zfa+D;必须显式写rtz,rm=001,其他rm编码保留。所需扩展与浮点状态须启用。

固定RTZ后取无界结果低32位并符号扩展到XLEN;NaN/无穷写0,fflags与同输入RTZ的FCVT.W.D相同。

源格式窄于FLEN时须正确NaN-boxed,否则按canonical NaN读取。fflags累积异常,标志置位本身不会触发基础浮点异常trap。

ZfaD浮点转换

指令行为说明

fcvtmod.w.d 是 Zfa 指令,将双精度浮点数按 RTZ 转换为无界二进制补码整数,取低 32 位后符号扩展到 XLEN;NaN 和正负无穷转换为 0。

FCVTMOD.W.D 指令解析与执行动画

展示 Zfa + D 扩展 FCVTMOD 的 ISA 可见流程:解析 OP-FP 编码、fmt/rs2 转换选择、固定 rm=001 (RTZ),读取浮点源并写回整数目标。

rd
rs1
rm
fcvtmod.w.d
,
,
执行环境
fmt=D (01)
rs2=8 (modular W)
舍入: 固定 RTZ (001)
fflags: NX

假定所需扩展与浮点状态已启用,源值满足适用的 NaN-boxing,初始 fflags=0。结果为当前输入的计算预览;Writeback 步表示提交。

31..27
26..25
24..20
19..15
14..12
11..7
6..0
11000
FCVTMOD
01
fmt=D
01000
rs2=8 (modular W)
01011
rs1
001
rm=001 RTZ
01010
rd
1010011
OP-FP
执行数据路径
instruction
0xC2859553
opcode
1010011 -> OP-FP
funct5/fmt
11000 + 01 -> FCVTMOD.W.D
rs2
01000 -> 8 (modular W) target
rm
001 -> fixed RTZ; other rm encodings are reserved
rd/rs1
a0(x10) / fa1(f11)
read
fa1(f11) = -42.75
convert
-42.75 -> int32 -42
write
a0(x10) = 0xFFFFFFD6 (-42); NX
当前步骤

Fetch:展示 32-bit OP-FP 编码

机器码按 R-type OP-FP 字段切分;FCVTMOD 使用 opcode 1010011。

encoding: 0xC2859553
syntax : fcvtmod.w.d a0(x10), fa1(f11), rtz
result : a0(x10) = 0xFFFFFFD6 (-42); NX

当前示例固定向零取整,取无界二进制补码结果的低 32 位并符号扩展;fflags 按同一输入的 FCVT.W.D 显示 NX。

FCVTMOD Conversion View
D FP source
-42.75
conversion
-42.75 -> int32 -42
writeback
a0(x10) = 0xFFFFFFD6 (-42)

当前示例固定向零取整,取无界二进制补码结果的低 32 位并符号扩展;fflags 按同一输入的 FCVT.W.D 显示 NX。

该动画只展示 RISC-V Zfa + D 扩展 FCVTMOD 的 ISA 可见编码、源/目标寄存器方向、舍入字段与示例 fflags;不模拟具体 FPU 流水线、异常处理机制、NaN payload 或微架构实现。

快速理解与检索要点

fcvtmod.w.d 是 Zfa 指令,将双精度浮点数按 RTZ 转换为无界二进制补码整数,取低 32 位后符号扩展到 XLEN;NaN 和正负无穷转换为 0。

32位OP-FP编码:opcode=1010011、funct5=11000、fmt=01、rs2=01000、rm=001;rs1为浮点源,rd为整数目标。
汇编语法必须显式写 rtz;其他 rm 编码为保留。
它是模 2^32 转换,不是 FCVT.W.D 那样的饱和/夹取转换。
NaN 和正负无穷结果为 0,这是该 Zfa 指令的专门规则。
fflags 与同一输入的 FCVT.W.D 相同;无效转换会设置 NV。
需要Zfa和D扩展,RV32和RV64均可用;rd=x0丢弃整数写回但不抑制fflags。

常见使用场景

JavaScript整数模转换

结合 «# f0 = 4294967297; initial fflags = 0 fcvtmod.w.d x10, f0, rtz # x10 = 1; NV = 1» 等实际代码理解该场景。

模2^32转换

结合 «# f0 = 4294967297; initial fflags = 0 fcvtmod.w.d x10, f0, rtz # x10 = 1; NV = 1» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 32位OP-FP字段:opcode=1010011、funct5=11000、fmt=01;rs2=01000为固定选择子,不是第二个源。
  • rd为x0–x31,rs1为f0–f31;rd=x0仅丢弃整数写回,fflags仍累积。
语义检查
  • RV32/RV64 Zfa+D;必须显式写rtz,rm=001,其他rm编码保留。所需扩展与浮点状态须启用。
  • 固定RTZ后取无界结果低32位并符号扩展到XLEN;NaN/无穷写0,fflags与同输入RTZ的FCVT.W.D相同。
  • 源格式窄于FLEN时须正确NaN-boxed,否则按canonical NaN读取。fflags累积异常,标志置位本身不会触发基础浮点异常trap。

容易混淆 / 常见误区

汇编语法必须显式写 rtz;其他 rm 编码为保留。
它是模 2^32 转换,不是 FCVT.W.D 那样的饱和/夹取转换。
NaN 和正负无穷结果为 0,这是该 Zfa 指令的专门规则。

常见问题

fcvtmod.w.d 和 fcvt.w.d 有什么区别?

fcvtmod.w.d 取无界 RTZ 转换结果的低 32 位并模 2^32;fcvt.w.d 对越界整数转换使用官方无效转换结果。

fcvtmod.w.d 为什么要求 rtz?

Zfa 规定汇编语法必须显式指定 RTZ,其他 rm 编码保留。