FMSUB.D

RISC-V FMSUB.D 指令详解

指令手册R4-type

双精度浮点融合乘减:rd = (rs1 * rs2) - rs3,只舍入一次。

指令语法

fmsub.d rd, rs1, rs2, rs3, rm
操作数说明
rd:目标浮点寄存器。
rs1、rs2、rs3:三个源浮点寄存器;R4 格式不是普通三寄存器 R-type。
rm:融合乘加/乘减最终结果的舍入模式字段。
D浮点运算

指令行为说明

FMSUB.D 使用 R4 型四寄存器格式执行双精度浮点融合乘减。乘法和加/减法作为一个融合操作完成,中间精确结果只在最终按 rm 舍入一次后写入 rd。

快速理解与检索要点

FMSUB.D 的重点是 fused:乘积和加/减项不先写回中间结果,而是在最终一步按 rm 舍入一次。

R4 型格式包含 rs3;不要按普通 R 型三寄存器指令理解。
符号规则按官方定义:FMADD 加 rs3,FMSUB 减 rs3,FNMADD 与 FNMSUB 对融合结果使用负号变体。

常见使用场景

浮点融合运算

结合 «fmsub.d f0, f1, f2, f3 # f0 = f1*f2-f3» 等实际代码理解该场景。

数值计算

结合 «fmsub.d f0, f1, f2, f3 # f0 = f1*f2-f3» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 R4-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

FMA 只舍入一次,不等同于先 FMUL 再 FADD/FSUB 的两次舍入序列。
负形式 FNMSUB/FNMADD 的符号规则容易与普通 FMSUB/FMADD 混淆。
rm 控制最终一次舍入;异常标志按融合操作累积。

常见问题

FMSUB.D 和 FMUL 后接加减有什么不同?

融合指令只进行一次最终舍入;分开的两条指令会先舍入乘积,再舍入加减结果。

FMSUB.D 为什么是 R4-type?

它需要 rd、rs1、rs2 和 rs3 四个寄存器字段来表示乘法两个源和加/减项。