FMV.W.X

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

指令手册R-type

把整数寄存器低位按位复制到单精度浮点寄存器。

指令语法

fmv.w.x rd, rs1
操作数说明
rd:浮点寄存器 f0–f31;f0 可写。
rs1:唯一的整数源 x0–x31;x0 读零。没有立即数或 rm 操作数。
编码 rs2=00000 是固定选择子,不是第二个源寄存器;同编号 x/f 属于不同寄存器文件。
F浮点位搬移

扩展条件:RV32/RV64,要求 F 2.2。 标准特权架构中,浮点状态 FS=Off 时访问浮点状态产生非法指令异常。

指令行为说明

FMV.W.X 将 x[rs1] 的低 32 位按位复制到 f[rd],形成单精度浮点编码;在更宽 FLEN 中结果按 NaN-boxing 规则保存。这是位移动,不是数值转换。

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

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

rd
rs1
fmv.w.x
,
执行环境
fmt=S (00)
FLEN>=32

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

31..27
26..25
24..20
19..15
14..12
11..7
6..0
11110
funct5=to-f
00
fmt=S
00000
rs2=00000
01011
rs1
000
funct3=000
01010
rd
1010011
OP-FP
执行数据路径
instruction
0xF0058553
opcode
1010011 -> OP-FP
funct5/fmt
11110 + 00 -> funct7 1111000
rs2
00000 fixed for FMV.W.X
rd/rs1
fa0(f10) / a1(x11)
read bits
a1(x11) = 0x40490FDB
bit move
copy low 32 bits -> 0x40490FDB; FLEN=32: full-width copy
write
尚未写回
当前步骤

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

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

encoding: 0xF0058553
syntax : fmv.w.x fa0(f10), a1(x11)
result : 尚未写回
位模式搬移视图
integer low bits
0x40490FDB
unchanged payload
0x40490FDB
writeback
尚未写回

FMV.W.X 只取整数源寄存器低 32 位形成单精度编码;在更宽 FLEN 中按 NaN-boxing 规则保存。

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

快速理解与检索要点

FMV.W.X 从整数寄存器取低 32 位,按原样放入浮点寄存器作为单精度编码。它不是把整数数值转换成 float;更宽 FLEN 中按 NaN-boxing 规则保存。

32 位 OP-FP 编码:funct7=1111000、rs2=00000、funct3=000、opcode=1010011;rs2 是固定选择子,不是汇编操作数。
OP-FP 编码使用 fmt=S,固定字段选择 FMV.W.X 位搬移形式。
只复制 x[rs1] 的低 32 位,不使用 rm,不设置 fflags。
当 FLEN 大于 32 时,写入的单精度值按 NaN-boxing 规则表示。
浮点位传出忽略高位 NaN-boxing;位传入在 FLEN 大于有效位宽时把高位全部置 1。

常见使用场景

构造浮点位模式

结合 «fmv.w.x f0, x10 # x10=0x1234C100; FLEN=64 -> f0=0xFFFFFFFF1234C100» 等实际代码理解该场景。

NaN payload 保留

结合 «fmv.w.x f0, x10 # x10=0x1234C100; FLEN=64 -> f0=0xFFFFFFFF1234C100» 等实际代码理解该场景。

调试原始编码

结合 «fmv.w.x f0, x10 # x10=0x1234C100; FLEN=64 -> f0=0xFFFFFFFF1234C100» 等实际代码理解该场景。

使用前检查清单

语法检查
  • rd:浮点寄存器 f0–f31;f0 可写。
  • rs1:唯一的整数源 x0–x31;x0 读零。没有立即数或 rm 操作数。
  • 编码 rs2=00000 是固定选择子,不是第二个源寄存器;同编号 x/f 属于不同寄存器文件。
语义检查
  • 确认这是位复制,不是浮点/整数数值转换。
  • 确认目标寄存器方向、符号扩展或 NaN-boxing 规则符合该 FMV 变体。

容易混淆 / 常见误区

这是位复制,不是 FCVT 数值转换。
不使用 rm,也不会设置 fflags。
源整数寄存器只提供目标格式宽度的低位。

常见问题

FMV.W.X 会把整数转换成 float 吗?

不会。它把整数源的低 32 位当作单精度编码写入浮点寄存器;数值转换应使用 FCVT.S.W 或相关 FCVT 指令。

FMV.W.X 会设置 fflags 吗?

不会。它不是浮点算术或数值转换,也不执行舍入。