首页/指令库/半精度转无符号整数
FCVT.WU.H

RISC-V FCVT.WU.H 指令详解

指令手册R-type

按 rm 将半精度浮点值转为无符号32位整数;RV64仍符号扩展。

指令语法

fcvt.wu.h rd, rs1, rm

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

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

RV32/RV64 Zfh(依赖F,Zfhmin不包含本指令);rm可省略,默认dyn使用frm,静态101/110和动态frm=101–111的行为保留。所需扩展与浮点状态须启用。

先按rm舍入,再检查0..2^32−1:负越界/−∞写0,正越界/+∞/NaN写2^32−1并置NV;结果变化且无NV才置NX。RV64将bit31符号扩展。

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

Zfh浮点转换

指令行为说明

fcvt.wu.h 读取浮点寄存器 rs1 中的半精度值,按 rm 舍入到无符号 32 位整数并写整数寄存器 rd。合法范围按舍入后的整数判定,为 0 到 2^32−1;RV64 将结果的第 31 位符号扩展到 XLEN,WU 不表示零扩展。

FCVT.WU.H 指令解析与执行动画

展示 Zfh 扩展 FCVT 的 ISA 可见流程:解析 OP-FP 编码、fmt/rs2 转换选择、rm 舍入字段,读取浮点源并写回整数目标。

rd
rs1
rm
fcvt.wu.h
,
,

rm 可留空,按汇编默认 dyn(111);DYN 示例固定 frm=RNE。仅接受小写 rne/rtz/rdn/rup/rmm/dyn。

执行环境
fmt=H (10)
rs2=WU
舍入: RNE 最近偶数
fflags: NX

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

31..27
26..25
24..20
19..15
14..12
11..7
6..0
11000
FCVT.WU
10
fmt=H
00001
rs2=WU
01011
rs1
000
rm
01010
rd
1010011
OP-FP
执行数据路径
instruction
0xC4158553
opcode
1010011 -> OP-FP
funct5/fmt
11000 + 10 -> FCVT.WU.H
rs2
00001 -> WU target
rm
000 -> RNE 最近偶数
rd/rs1
a0(x10) / fa1(f11)
read
fa1(f11) = 42.75
convert
42.75 -> uint32 0x0000002B (43)
write
a0(x10) = 0x0000002B (43); NX
当前步骤

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

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

encoding: 0xC4158553
syntax : fcvt.wu.h a0(x10), fa1(f11), rne
result : a0(x10) = 0x0000002B (43); NX

当前示例按 rm 舍入为 32 位整数,因源值含小数部分,示例显示 NX 不精确标志。

FCVT 转换视图
H FP source
42.75
conversion
42.75 -> uint32 0x0000002B (43)
writeback
a0(x10) = 0x0000002B (43)

当前示例按 rm 舍入为 32 位整数,因源值含小数部分,示例显示 NX 不精确标志。

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

快速理解与检索要点

fcvt.wu.h 读取浮点寄存器 rs1 中的半精度值,按 rm 舍入到无符号 32 位整数并写整数寄存器 rd。合法范围按舍入后的整数判定,为 0 到 2^32−1;RV64 将结果的第 31 位符号扩展到 XLEN,WU 不表示零扩展。

32位OP-FP编码:opcode=1010011,funct5=11000,fmt=10,rs2=00001选择WU;rs2不是第二个源寄存器。
rd为整数寄存器,rs1为浮点寄存器;W/WU形式在RV32和RV64均可用。
rm=000/001/010/011/100分别为RNE/RTZ/RDN/RUP/RMM;rm=111使用frm。保留舍入模式的行为为保留。
源值与舍入结果不同时设置NX,前提是未设置NV;fflags累积异常,基础浮点ISA不会因这些标志置位而触发trap。

常见使用场景

浮点到无符号整数转换

结合 «# f0 = 3.5; initial fflags = 0 fcvt.wu.h x10, f0, rtz # x10 = 3; NX = 1» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 32位OP-FP字段:opcode=1010011、funct5=11000、fmt=10;rs2=00001为固定选择子,不是第二个源。
  • rd为x0–x31,rs1为f0–f31;rd=x0仅丢弃整数写回,fflags仍累积。
语义检查
  • RV32/RV64 Zfh(依赖F,Zfhmin不包含本指令);rm可省略,默认dyn使用frm,静态101/110和动态frm=101–111的行为保留。所需扩展与浮点状态须启用。
  • 先按rm舍入,再检查0..2^32−1:负越界/−∞写0,正越界/+∞/NaN写2^32−1并置NV;结果变化且无NV才置NX。RV64将bit31符号扩展。
  • 源格式窄于FLEN时须正确NaN-boxed,否则按canonical NaN读取。fflags累积异常,标志置位本身不会触发基础浮点异常trap。

容易混淆 / 常见误区

先舍入再判定范围:-0.5 在 RNE 下得到 0 并设置 NX;在 RDN 下舍入为 -1,结果夹取为 0 并设置 NV。
舍入后小于0或为−∞时写0;舍入后大于2^32−1、+∞或NaN时写2^32−1并设置NV,NV时不设置NX。
RV64将32位结果符号扩展;rd=x0丢弃整数写回,但仍累积fflags。
当源格式窄于FLEN时,非法NaN-boxing按该格式的canonical NaN读取。

常见问题

负数输入一定设置NV吗?

不是。范围检查在舍入之后;-0.5按RNE或RTZ得到0并设置NX,而按RDN得到范围外的−1并设置NV。

WU在RV64上零扩展吗?

不。32位结果符号扩展到XLEN。例如无符号目标2^32−1写入0xFFFFFFFFFFFFFFFF。