当前位置: 首页 > news >正文

RISCV instr 第11-20章

Chapter 20. "F" Extension for Single-Precision Floating-Point, Version 2.2

本章介绍了针对单精度浮点数的标准指令集扩展,该扩展被命名为“F”,并增加了符合 IEEE 754-2008 运算标准(ANSI/IEEE 标准 754-2008,《浮点运算标准》,2008 年)的单精度浮点数计算指令。F 扩展依赖于“Zicsr”扩展来实现控制和状态寄存器的访问。

首先,NaN值的定义是指数位全1,尾数位不全为0的浮点数。

对于二进制表示,IEEE 754-2008标准中只定义了Quiet NaNSignaling NaN,其中Quiet NaN是指尾数最高位(也称quiet bit)为1的NaN值,Signaling NaN是指尾数quiet bit为0,其余低位不全为0的NaN值。

在RISC-V中还定义了Canonical NaN,指符号位为0,指数位全1,尾数quiet bit为1,其余位全0的Quiet NaN值。对于单精度浮点,其编码为0x7fc00000。 // QNaN SNaN

20.1. F Register State

F 扩展增加了 32 个浮点寄存器,编号为 f0 至 f31,每个寄存器均为 32 位宽,并且还有一个浮点控制和状态寄存器 fcsr,其中包含了浮点单元的运行模式和异常状态。增加的状态信息如表 24 所示。我们使用术语 FLEN 来描述 RISC-V 指令集架构中浮点寄存器的宽度,对于 F 单精度浮点扩展,FLEN = 32。大多数浮点指令操作数都在浮点寄存器文件中。浮点load和store指令在寄存器和内存之间传输浮点值。还提供了将数据传输到和从整数寄存器文件中的指令。

我们曾考虑为整数和浮点值共用一个统一的寄存器文件,因为这能简化软件中的寄存器分配和调用约定,并减少用户状态的总量。然而,分段式组织会增加在给定指令宽度下可访问的寄存器总数,简化为宽超标量指令提供足够的寄存器文件端口的功能,支持解耦式浮点单元架构,并简化内部浮点编码技术的使用。对于分段式寄存器文件架构的编译器支持和调用约定已得到充分理解,而且在浮点寄存器文件状态上使用脏位可以降低上下文切换的开销。

20.2. Floating-Point Control and Status Register

浮点控制与状态寄存器(fcsr)是 RISC-V 的控制与状态寄存器(CSR)。它是一个 32 位可读写寄存器,用于选择浮点运算的动态舍入模式,并保存累积的异常标志,如“浮点控制与状态寄存器”所示。

fcsr 寄存器可以通过 FRCSR 和 FSCSR 指令进行读取和写入操作,这些指令是基于底层 CSR 访问指令构建的汇编伪指令。FRCSR 通过将 fcsr 复制到整数寄存器 rd 来读取 fcsr。FSCSR 通过将 fcsr 中的原始值复制到整数寄存器 rd 中,然后将从整数寄存器 rs1 获得的新值写入 fcsr 来交换 fcsr 中的值。
fcsr 内部的字段也可以通过不同的 CSR 地址单独访问,并且针对这些访问定义了单独的汇编伪指令。FRRM 指令读取 Rounding Mode 字段 frm(fcsr 的第 7 至 5 位)并将其复制到整数寄存器 rd 的最低有效三位中,其余位全为零。FSRM 通过将 frm 中的原始值复制到整数寄存器 rd 中,然后将从整数寄存器 rs1 的最低三位中获得的新值写入 frm 来交换 frm 中的值。FRFLAGS 和 FSFLAGS 对于累加异常标志字段 fflags(fcsr 的第 4 至 0 位)也以类似的方式定义。

fcsr 的第 31 至 8 位被预留用于其他标准扩展。若这些扩展未被启用,则实现程序应忽略对这些位的写入操作,并在读取时提供零值。标准软件应保留这些位的原有内容。

浮点运算要么使用指令中编码的静态舍入模式,要么使用存储在 frm 中的动态舍入模式。舍入模式的编码方式如表 25 所示。指令的 rm 字段中值为 111 时,会选择存储在 frm 中的动态舍入模式。当使用保留的舍入模式执行依赖于舍入模式的浮点指令时,这些指令的行为是保留的,包括静态保留舍入模式(101 - 110)和动态保留舍入模式(101 - 111)。一些指令,包括扩展转换,虽然有 rm 字段,但其数学行为不受舍入模式的影响;软件应将 rm 字段设置为 RNE(000),但实现必须像往常一样处理 rm 字段(特别是要区分合法编码和保留编码的解码)

C99 语言标准明确要求必须提供一个动态舍入模式寄存器。在通常的实现中,对动态舍入模式 CSR 状态的写入会阻塞流水线。静态舍入模式用于实现那些经常需要频繁切换不同舍入模式的特殊算术运算。
F 规范的批准版本规定,当执行带有保留动态舍入模式的指令时,应引发非法指令异常。这一规定已被弱化为保留模式,这与静态舍入模式指令的行为一致。在遇到保留编码时引发非法指令异常仍然是有效的行为,因此符合批准规范的实现也与弱化后的规范兼容。

累积的异常标志指示了自该字段上次由软件重置以来,在任何浮点运算指令中出现的异常情况,如表 26 所示。RISC-V 基础指令集架构并不支持在设置浮点异常标志时触发陷阱。

根据标准的规定,我们在 F 扩展中不支持对浮点异常的陷阱处理,而是要求在软件中进行标志的显式检查。我们曾考虑添加由浮点累积异常标志的内容直接控制的分支指令,但最终决定省略这些指令,以保持指令集架构的简洁性。

20.3. NaN Generation and Propagation

除非另有说明,若浮点运算的结果为 NaN(非数字),则该 NaN 为标准 NaN。标准 NaN 具有正的符号位,所有有效数字位清零(除了最高有效位,即无声位)。对于单精度浮点数,这对应于模式 0x7fc00000。

我们曾考虑按照标准的建议采用 NaN 有效负载的方式,但这一决定会增加硬件成本。此外,由于该功能在标准中是可选的,所以无法在可移植代码中使用。
实现者可以自由地提供一种 NaN 有效负载传播方案,作为非标准扩展通过非标准操作模式启用。然而,上述描述的规范性 NaN 方案必须始终得到支持,并且应当是默认模式。

我们要求实现方案在出现异常情况时能够自动返回标准规定的默认值,且无需用户级软件进行任何额外干预(这与阿尔法指令集的浮点陷阱屏障不同)。我们认为,针对异常情况的全硬件处理将会变得更加普遍,因此我们希望避免对用户级指令集进行复杂修改以优化其他方法。实现方案可以随时将异常情况捕获到机器模式的软件处理程序中,以提供异常情况下的默认值。

20.4. Subnormal Arithmetic

对亚正常数的运算按照 IEEE 754-2008 标准进行处理。按照 IEEE 标准的术语,细微性是在舍入后进行检测的。

在进行圆整操作后检测微小值,能够减少虚假的下溢信号。

http://www.jsqmd.com/news/192368/

相关文章:

  • 学校要求穿校服的深层逻辑:破解攀比困境、兼顾公平与高效管理的多重考量
  • 紧急避坑!C#网络编程中被忽视的12个协议级安全隐患
  • 【有功-无功协调优化】基于改进多目标粒子群优化算法的输电网有功-无功协调优化研究附Matlab代码
  • 新兴-智慧城市:交通信号AI优化测试报告‌
  • C#跨平台性能测试实战(从零搭建高性能Benchmark环境)
  • 运维人至暗时刻?收藏这篇!AI大模型才是破局关键!
  • ‌水下机器人导航测试:软件测试挑战与实战指南
  • 学校强制穿校服的成本 - 收益分析:多主体视角下的理性权衡
  • 紧急应对C#服务部署异常:3种高危场景及实时回滚方案
  • 缩略图点击选中视频:为后续下载或删除操作做准备
  • 【必学收藏】智能体设计模式:从入门到实战,构建可规模化的大模型应用
  • 学长亲荐!10款AI论文网站测评:本科生毕业论文全攻略
  • 收藏!程序员入局大模型必看:6大高潜职业方向全解析
  • 谁还在为学网安踩坑 emo?这些坑一定要避开,快码住避雷!
  • 收藏!AI 的下半场:智能体(Agent)将如何重塑我们所有的应用?
  • Span<T>在实际项目中的应用(C#高性能数据处理实战案例)
  • 建议收藏:2026年AI Agent将爆发!从算力硬件到大模型应用,一篇全掌握
  • Origin科研绘图——桑基图
  • FLV老视频还能用!传统格式用户也能接入HeyGem生态
  • 为什么你的LLM搞不定复杂任务?一文掌握ReAct+Reflexion核心技术
  • 声呐探测软件在农业-渔业场景的准确性测试方法论
  • C#集合表达式性能瓶颈:90%开发者忽略的3个致命问题
  • 技术认知:AI产品经理的沟通黄金法则,小白入门必看,建议收藏
  • 别再盲目入行!2026 网络工程师:传统路由交换没用了,转型才是出路!
  • 2025年程序员必看!大模型领域8大高薪岗位+转行全攻略,收藏这篇就够了!
  • SSHPortScan SSH端口扫描、SSH版本识别、公钥认证探测
  • RAG知识冲突怎么办?5个实用方法助你构建更精准的大模型问答系统,建议收藏!
  • phome_enewsplf 数据表字段解释(评论字段表)
  • 收藏!2025大模型转型全攻略:普通人从入门到拿Offer的实战指南
  • 掌握这3种方法,轻松实现C#交错数组动态修改(附完整代码示例)