| 扩展名 | 含义 | 精度类型 | 浮点寄存器 | 每个寄存器宽度 | 对应 IEEE 标准 | 常用后缀 | 示例指令 |
|---|---|---|---|---|---|---|---|
| F | Single-Precision Floating Point | 单精度浮点(float) | f0–f31 共 32 个 | 32 位 | IEEE-754 单精度 | .s |
fadd.s, fmul.s, fsqrt.s |
| D | Double-Precision Floating Point | 双精度浮点(double) | f0–f31 共 32 个 | 64 位 | IEEE-754 双精度 | .d |
fadd.d, fmul.d, fsqrt.d |
对应 C 语言中的 float 类型(32 位)。
采用 IEEE-754 标准的单精度格式:
每个浮点寄存器 f0–f31 是 32 位宽。
指令示例:
fadd.s f1, f2, f3 # f1 = f2 + f3 (单精度加法)
fmul.s f4, f5, f6 # f4 = f5 * f6 (单精度乘法)
fcvt.w.s x1, f1 # 将 float 转为 int
fcvt.s.w f2, x3 # 将 int 转为 float
对应 C 语言中的 double 类型(64 位)。
采用 IEEE-754 标准的双精度格式:
每个浮点寄存器仍是 f0–f31,但每个寄存器宽度变为 64 位。
RV32D 依赖于 F 扩展(即必须先有 F 扩展)。
指令示例:
fadd.d f1, f2, f3 # f1 = f2 + f3 (双精度加法)
fdiv.d f4, f5, f6 # f4 = f5 / f6 (双精度除法)
fcvt.s.d f7, f8 # 双精度转单精度
fcvt.d.s f9, f10 # 单精度转双精度
浮点寄存器命名为 f0–f31,在 C 语言 ABI(Application Binary Interface)中对应:
| 名称 | 用途 | 调用约定 |
|---|---|---|
| f0–f7 | 临时寄存器(caller-saved) | 传参/返回值 |
| f8–f9 | 返回值寄存器 | return float/double |
| f10–f17 | 参数寄存器 | 浮点函数参数 |
| f18–f27 | 保存寄存器(callee-saved) | 函数内部可保存 |
| f28–f31 | 临时寄存器 | caller-saved |
| 项目 | RV32F | RV32D |
|---|---|---|
| 精度 | 单精度(float,32 位) | 双精度(double,64 位) |
| IEEE 标准 | IEEE-754 单精度 | IEEE-754 双精度 |
| 依赖关系 | 独立 | 依赖 F |
| 指令后缀 | .s |
.d |
| 浮点寄存器 | f0–f31(每个 32 位) | f0–f31(每个 64 位) |
| 典型用途 | 普通计算、嵌入式 | 高精度科学运算 |