首页/指令库/双精度位搬移至整数寄存器
FMV.X.D

RISC-V FMV.X.D 指令详解

指令手册R-type

RV64 双精度位模式搬移:从浮点寄存器到整数寄存器,不做数值转换。

指令语法

fmv.x.d rd, rs1

rd:整数 x0–x31;rs1:浮点 f0–f31。x0 丢弃写回,f0 是普通浮点源;没有立即数或 rm 操作数。

OP-FP 编码固定 funct7=1110001、rs2=00000、funct3=000、opcode=1010011;只有 rd 和 rs1 字段可变。

D 扩展依赖 F,要求 XLEN≥64、FLEN≥64 且启用浮点状态;读取 f[rs1] 的低 64 位,忽略更高位。

逐位复制双精度编码到 x[rd],保留非规范 NaN 载荷,不舍入、不设置 fflags;它不是 FCVT.L.D 数值转换。

D浮点位搬移

指令行为说明

FMV.X.D 在整数寄存器和浮点寄存器之间搬移 IEEE 754 双精度 64 位编码。它不修改被传输位,也不规范化 NaN 载荷;该形式仅在 XLEN>=64 时定义。它把 f[rs1] 的双精度编码写入 x[rd],不设置浮点异常标志。

FMV.X.D 指令解析与执行动画

展示 D 扩展 FMV.X.D 位模式搬移:解析 OP-FP 编码,读取源寄存器位模式,按官方规则不做数值转换地写回目标寄存器。

rd
rs1
fmv.x.d
,
执行环境
fmt=D (01)
FLEN>=64

假定所需扩展存在且浮点状态已启用。整数源输入覆盖 XLEN 位;浮点源输入只提供所选格式的位片段,上方 NaN-box 位被忽略。

31..27
26..25
24..20
19..15
14..12
11..7
6..0
11100
funct5=to-x
01
fmt=D
00000
rs2=00000
01011
rs1
000
funct3=000
01010
rd
1010011
OP-FP
执行数据路径
instruction
0xE2058553
opcode
1010011 -> OP-FP
funct5/fmt
11100 + 01 -> funct7 1110001
rs2
00000 fixed for FMV.X.D
rd/rs1
a0(x10) / fa1(f11)
read bits
fa1(f11) = 0x400921FB54442D18
bit move
copy 64-visible bits -> 0x400921FB54442D18
write
尚未写回
当前步骤

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

机器码按 R-type OP-FP 字段切分;FMV 位搬移指令使用 opcode 1010011。

encoding: 0xE2058553
syntax : fmv.x.d x10, f11
result : 尚未写回
位模式搬移视图
FP source bits
0x400921FB54442D18
unchanged payload
0x400921FB54442D18
writeback
尚未写回

FMV.X.D 只在 XLEN>=64 时定义,双精度 64 位编码原样写入整数寄存器,不设置 fflags。

该动画只展示 RISC-V D 扩展 FMV 的 ISA 可见编码和位模式搬移;不模拟 FPU 流水线、浮点数值解释、异常处理或微架构实现。

快速理解与检索要点

FMV.X.D 只在 XLEN>=64 时定义,用于把双精度 64 位编码原样移动到整数寄存器。它不把 double 转成整数数值,也不会规范化 NaN payload。

D 扩展中该 64 位搬移形式要求 XLEN>=64。
传输位保持不变,包括非规范 NaN payload。
不使用 rm,不舍入,不设置浮点异常标志。

常见使用场景

双精度位模式检查

在 RV64、D 扩展和浮点状态已启用时,预置 f0 的低 64 位为 0x7FF8000000000042,执行 fmv.x.d x10, f0 # x10 = bits of f0 (RV64),x10 得到同一 64 位编码,NaN 载荷保留且 fflags 不变。

NaN payload 保留

在 RV64、D 扩展和浮点状态已启用时,预置 f0 的低 64 位为 0x7FF8000000000042,执行 fmv.x.d x10, f0 # x10 = bits of f0 (RV64),x10 得到同一 64 位编码,NaN 载荷保留且 fflags 不变。

RV64 原始编码调试

在 RV64、D 扩展和浮点状态已启用时,预置 f0 的低 64 位为 0x7FF8000000000042,执行 fmv.x.d x10, f0 # x10 = bits of f0 (RV64),x10 得到同一 64 位编码,NaN 载荷保留且 fflags 不变。

使用前检查清单

语法检查
  • rd:整数 x0–x31;rs1:浮点 f0–f31。x0 丢弃写回,f0 是普通浮点源;没有立即数或 rm 操作数。
  • OP-FP 编码固定 funct7=1110001、rs2=00000、funct3=000、opcode=1010011;只有 rd 和 rs1 字段可变。
语义检查
  • D 扩展依赖 F,要求 XLEN≥64、FLEN≥64 且启用浮点状态;读取 f[rs1] 的低 64 位,忽略更高位。
  • 逐位复制双精度编码到 x[rd],保留非规范 NaN 载荷,不舍入、不设置 fflags;它不是 FCVT.L.D 数值转换。

容易混淆 / 常见误区

这是位模式搬移,不是整数/浮点数值转换;需要数值转换时使用 FCVT。
仅 XLEN>=64 定义;RV32 没有 FMV.D.X/FMV.X.D。
不会设置浮点异常标志,也不会把 NaN 载荷规范化。

常见问题

FMV.X.D 能在 RV32 使用吗?

不能。官方 D 扩展只在 XLEN>=64 时定义 FMV.X.D / FMV.D.X 这类 64 位整数/浮点寄存器搬移。

FMV.X.D 和 FCVT.L.D 有什么区别?

FMV.X.D 保留 64 位编码位;FCVT.L.D 执行双精度到 64 位整数的数值转换,可能舍入并设置 fflags。