首页/指令库/存储半精度浮点数
FSH

RISC-V FSH 指令详解

指令手册S-type

将浮点寄存器中的 16 位半精度位模式存储到内存。

指令语法

fsh rs2, offset(rs1)
操作数说明
rs2:浮点 f0–f31;rs1:整数 x0–x31,x0 基址固定为零;两类寄存器不可混用。
offset 是 -2048..2047 的有符号字节偏移,无 rd、rm 或 rs3;存储低 16 位,忽略源的高位且不检查 NaN-boxing。
ZfhZfhmin浮点存储

指令行为说明

FSH 使用 S-type STORE-FP 编码,将浮点寄存器 f[rs2] 中的低 16 位半精度浮点位模式存储到 x[rs1] 加 12 位有符号字节偏移形成的有效地址。存储按位写出该格式宽度的数据,不执行浮点舍入、格式转换或 NaN payload 规范化。自然对齐访问的原子性按官方 Zfh 规则保证,非对齐访问由执行环境约束。

FSH 指令解析与执行动画

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

rs2
offset
rs1
fsh
,
,
执行环境
fmt=H / width=16
基址寄存器是整数 x 寄存器
fflags 不改变
31..25
24..20
19..15
14..12
11..7
6..0
0000000
imm[11:5]
01011
rs2
01010
rs1
001
FSH
00010
imm[4:0]
0100111
STORE-FP
执行数据路径
instruction
0x00B51127
opcode
0100111 -> STORE-FP
funct3
001 -> 16-bit store
offset
000000000010 -> 2
rs2/rs1
fa1(f11) / a0(x10)
read
a0(x10) = 0x0000000000001000, fa1(f11) = 0x3E00
address
等待 Address 计算
memory
尚未存储;内存未更新
当前步骤

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

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

encoding: 0x00B51127
syntax : fsh fa1(f11), 2(a0(x10))
result : 尚未存储;内存未更新
地址与位模式传输
base
0x0000000000001000
offset
2
address
等待 Address 计算
alignment
2-byte aligned
stored bits
尚未存储;内存未更新

FSH 只存储 rs2 的低 16 位半精度位模式,不执行舍入、格式转换或 NaN 规范化。 当前有效地址自然对齐,官方保证 FSH 原子执行。 当前示例自然对齐,不能引发地址未对齐异常。

假定扩展与 FS 已启用,地址可访问;仅演示选定的 EEI 分支,不模拟权限或地址翻译。源输入代表低位位模式,存储忽略更高位,不检查 NaN-boxing;步骤是教学视图。

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

快速理解与检索要点

FSH 是 Zfh/Zfhmin 半精度浮点存储。它用整数基址和 12 位字节偏移计算地址,把 f[rs2] 的 16 位半精度位模式写入内存;它不执行浮点算术,也没有 rm 舍入字段。

S-type STORE-FP:imm[11:5]、rs2、rs1、funct3=001、imm[4:0]、opcode=0100111。
有效地址 = x[rs1] + sign_extend(offset),偏移单位是字节。
FSH 存储源浮点寄存器中的低 16 位半精度编码,不规范化 NaN payload。
Zfhmin 1.0 已包含 FSH,Zfh 1.0 也支持;两者依赖 F。需所需扩展与浮点状态启用。
有效地址按 XLEN 回绕;rs1=x0 读零。成功存储不改变源寄存器、基址寄存器或 fflags。

常见使用场景

浮点访存

假定 RV32/RV64 Zfhmin(或 Zfh)与浮点状态启用,x10=0x1000、f11 低 16 位为 0x3E00,内存可写且存储成功:fsh f11, 2(x10) 把 0x3E00 原样写入 mem16[0x1002],源、基址及 fflags 不变;不检查源高位的 NaN-boxing。

数据加载与存储

假定 RV32/RV64 Zfhmin(或 Zfh)与浮点状态启用,x10=0x1000、f11 低 16 位为 0x3E00,内存可写且存储成功:fsh f11, 2(x10) 把 0x3E00 原样写入 mem16[0x1002],源、基址及 fflags 不变;不检查源高位的 NaN-boxing。

使用前检查清单

语法检查
  • rs2:浮点 f0–f31;rs1:整数 x0–x31,x0 基址固定为零;两类寄存器不可混用。
  • offset 是 -2048..2047 的有符号字节偏移,无 rd、rm 或 rs3;存储低 16 位,忽略源的高位且不检查 NaN-boxing。
语义检查
  • 确认 offset 是字节偏移,不是元素索引。
  • 确认存储写出的是源浮点寄存器中的该格式编码,不执行格式转换。

容易混淆 / 常见误区

rs1 是整数基址寄存器;rs2 是浮点源寄存器。
offset 是 12 位有符号字节偏移,范围 -2048 到 2047。
FSH 只存储半精度格式宽度的位模式,不执行浮点舍入或格式转换。
FSH 不写回浮点寄存器;加载时的 NaN-boxing 不是存储阶段的动作。
存储忽略高于低 16 位的所有源位,不检查 NaN-boxing;自然对齐为 2 字节。
未对齐访问可由 EEI 完成或产生异常;异常时不能保证内存完全不变。

常见问题

FSH 的地址来自浮点寄存器吗?

不是。地址基址来自整数寄存器 rs1;浮点寄存器 rs2 只提供要写入内存的数据位模式。

FSH 会改变 fflags 吗?

不会。FSH 是位模式存储,不执行浮点算术或舍入,按 ISA 可见语义不会设置浮点异常标志。