首页/指令库/加载半精度浮点数
FLH

RISC-V FLH 指令详解

指令手册I-type

从内存加载 16 位半精度浮点位模式到浮点寄存器。

指令语法

flh rd, offset(rs1)
操作数说明
rd:目标浮点寄存器。
rs1:整数基址寄存器。
offset:12 位有符号字节偏移,与 rs1 相加形成有效地址。
ZfhZfhmin浮点加载

指令行为说明

FLH 使用 I-type LOAD-FP 编码,从 x[rs1] 加 12 位有符号字节偏移形成的有效地址加载 16 位半精度浮点位模式,并写入浮点寄存器 f[rd]。传输不会执行浮点舍入、格式转换或 NaN payload 规范化;写入较宽 FLEN 寄存器时按 Zfh 的 NaN-boxing 规则保存半精度值。自然对齐访问的原子性按官方 Zfh 规则保证,非对齐访问由执行环境约束。

FLH 指令解析与执行动画

展示 Zfh/Zfhmin 扩展浮点加载的 ISA 可见流程:解析 I-type 编码,用整数基址加 12 位偏移形成地址,并传输 16 位浮点位模式。

rd
offset
rs1
flh
,
,
执行环境
fmt=H / width=16
基址寄存器是整数 x 寄存器
fflags 不改变
31..20
19..15
14..12
11..7
6..0
000000000010
imm[11:0]
01010
rs1
001
FLH
01010
rd
0000111
LOAD-FP
执行数据路径
instruction
0x00251507
opcode
0000111 -> LOAD-FP
funct3
001 -> 16-bit load
offset
000000000010 -> 2
rd/rs1
fa0(f10) / a0(x10)
read
a0(x10) = 0x0000000000001000
address
0x0000000000001000 + (2) = 0x0000000000001002
write
fa0(f10) = 0x3E00
当前步骤

Fetch:展示 32-bit I-type 编码

机器码按 I-type 字段切分;浮点访存不是 OP-FP 算术编码。

encoding: 0x00251507
syntax : flh fa0(f10), 2(a0(x10))
result : fa0(f10) = 0x3E00
地址与位模式传输
base
0x0000000000001000
offset
2
address
0x0000000000001002
loaded bits
0x3E00

FLH 传输 16 位半精度位模式,写入 rd 时按 Zfh 规则 NaN-box;传输本身保留非规范 NaN payload。

该动画只展示 RISC-V Zfh/Zfhmin 扩展浮点加载/存储的 ISA 可见地址计算和位模式传输;不模拟 cache、总线、异常处理器、FPU 流水线或微架构时序。

快速理解与检索要点

FLH 是 Zfh/Zfhmin 半精度浮点加载。它用整数寄存器 rs1 加 12 位有符号字节偏移形成地址,从内存取 16 位半精度位模式写入浮点寄存器 rd;这不是浮点算术,也不使用 rm 舍入。

I-type LOAD-FP:imm[11:0]、rs1、funct3=001、rd、opcode=0000111。
有效地址 = x[rs1] + sign_extend(offset),偏移单位是字节。
FLH 传输 16 位半精度位模式;写入较宽 FLEN 寄存器时按 NaN-boxing 保存。

常见使用场景

浮点访存

结合 «flh f10, 0(x11) ; load half-precision from [x11]» 等实际代码理解该场景。

数据加载与存储

结合 «flh f10, 0(x11) ; load half-precision from [x11]» 等实际代码理解该场景。

使用前检查清单

语法检查
  • rd:目标浮点寄存器。
  • rs1:整数基址寄存器。
  • offset:12 位有符号字节偏移,与 rs1 相加形成有效地址。
语义检查
  • 确认 offset 是字节偏移,不是元素索引。
  • 确认目标地址的自然对齐和执行环境的非对齐访问规则。

容易混淆 / 常见误区

rs1 是整数基址寄存器,不是浮点寄存器;rd 才是浮点目标寄存器。
offset 是 12 位有符号字节偏移,范围 -2048 到 2047,不是半精度元素索引。
FLH 传输 16 位位模式,不执行舍入或格式转换;较宽 FLEN 写回按 NaN-boxing 保存。
自然对齐访问才有规范保证的原子性;非对齐行为取决于执行环境。

常见问题

FLH 的 rs1 是浮点寄存器吗?

不是。rs1 是整数寄存器,用来提供内存基址;rd 是浮点目标寄存器。

FLH 会把半精度转换成单精度吗?

不会。FLH 是位模式加载,不是 FCVT;它搬移半精度编码,并在较宽 FLEN 中按 NaN-boxing 保存。