fsflagsi

RISC-V fsflagsi 伪指令详解

汇编器伪指令

立即数写 fflags 伪指令,展开为 csrrwi rd, fflags, uimm 或写后不返回旧值的 x0 形式。用于直接写浮点异常标志字段。

你写下的是
fsflagsi rd, uimm / fsflagsi uimm
常见真实展开
csrrwi rd, fflags, uimm # or write-only form: csrrwi x0, fflags, uimm

这条伪指令到底在帮你省什么

浮点状态本质上通过 CSR 指令访问;这些伪指令把 fcsr/frm/fflags 的常见读写写法命名出来,便于阅读浮点环境代码。

fsflagsi 的核心作用是“用立即数写异常标志”。它是汇编器层面的简写;调试、审计或阅读机器码时,应回到页面列出的真实展开指令和相关重定位语义来判断行为。

官方语义核对重点

官方汇编手册把 fsflagsi 作为汇编器层面的伪指令/别名处理,硬件执行的是展开后的真实指令序列。
真实语义以 CSRRWI 等展开指令的 ISA 定义为准;本页不把 fsflagsi 当作独立硬件 opcode。
CSR 读写、置位、清位和立即数字段行为以 Zicsr 的 CSRRW/CSRRS/CSRRC 及立即数变体语义为准。

可用性与扩展条件

基础条件
  • 需要实现相关浮点状态 CSR
  • 通过 Zicsr 指令访问 fflags/frm/fcsr
单指令/标准写法条件
  • 目标 ISA/ABI 环境支持相应浮点扩展和 CSR 访问
回退/边界
没有相应浮点状态或 CSR 访问权限时,不应假定这些伪指令可用。
备注
  • 写 frm、fflags 或 fcsr 可能影响后续浮点指令结果或异常标志。

展开过程怎么理解

步骤 1
带 rd 形式:CSRRWI 将 5 位立即数写入 fflags,并把旧 fflags 写入 rd。
步骤 2
不带 rd 形式:CSRRWI 将 5 位立即数写入 fflags,且 rd=x0 不返回旧 fflags。

在 objdump / 反汇编里可能看到什么

工具可能显示 frcsr/fscsr/frrm/fsrm/frflags/fsflags 等伪指令,也可能显示底层 CSRRS/CSRRW/CSRRWI。

官方依据与阅读顺序

本页把伪指令当作汇编器层面的别名或宏来解释:先看它会展开成哪些真实指令,再回到官方 ISA 手册理解真实指令的行为。涉及 ABI、重定位或链接器松弛时,以 psABI 文档为准。

什么时候优先想到它

保存或恢复浮点环境
读取浮点异常标志进行诊断
切换动态舍入模式
编写运行库、数学库或低层测试代码

容易混淆 / 常见误区

这些伪指令要求目标实现支持相关浮点状态;没有相应扩展时不可假定可用
写 frm/fflags/fcsr 可能影响后续浮点指令结果或异常标志
立即数形式仍受 5 位 CSR 立即数字段限制

常见问题

fsflagsi 是真实 RISC-V 指令吗?

fsflagsi 是汇编器伪指令或别名,不是单独硬件 opcode。页面中的“常见真实展开”列出官方展开,真实行为由展开后的 ISA 指令决定。

使用 fsflagsi 时最容易误解什么?

这些伪指令要求目标实现支持相关浮点状态;没有相应扩展时不可假定可用