fnmadd 或 fnma (浮动负乘-添加) 指令
用途
将两个浮点操作数相乘,将结果添加到一个浮点操作数,并将结果的负数放置在浮点寄存器中。
语法
| 位数 | VALUE |
|---|---|
| 0-5 | 63 |
| 6-10 | FRT |
| 11-15 | 法国 |
| 16-20 | FRB |
| 21-25 | FRC |
| 26-30 | 31 |
| 31 | rc |
| 位数 | 值 |
|---|---|
| 0-5 | 59 |
| 6-10 | FRT |
| 11-15 | 法国 |
| 16-20 | FRB |
| 21-25 | FRC |
| 26-30 | 31 |
| 31 | rc |
描述
fnmadd 和 fnma 指令将浮点寄存器 (FPR) FRA 中的 64 位双精度浮点操作数乘以 FPR FRC中的 64,bit,双精度浮点操作数,并将 FPR FRB 中的 64 位双精度浮点操作数添加到乘法结果中。
fnmadd 指令将 FPR FRA 中的 32 位单精度浮点操作数与 FPR FRC中的 32 位单精度浮点操作数相乘,并将 FPR FRB 中的 32 位单精度浮点操作数与乘法结果相加。
添加结果将在浮点状态和控制寄存器的浮点舍入控制字段 RN 的控制下进行舍入。
注: 如果操作数是反规范化数字,那么将在开始操作之前对其进行预规范化。
fnmadd 和 fnma 指令与 fmadd 和 fma (Floating Multiply-Add Single) 指令相同,最终结果为求反,但有以下例外:
- 静默 NaNs (QNaNs) 传播不会影响其 "符号" 位。
- 由于禁用 "无效操作异常" 而生成的 QNaNs 具有 "符号" 位 0。
- 由于禁用了 "无效操作异常" 而转换为 QNaNs 的信号 NaNs (SNaNs) 对其 "符号" 位没有任何影响。
当浮点无效操作异常启用位为 1 时,浮点状态和控制寄存器的浮点结果标志字段将设置为结果的类和符号 (无效操作异常除外)。
fnmadd, fnmadd和 fnma 指令各有两种语法形式。 每种语法形式对条件寄存器字段 1 都有不同的影响。
| 项 | 描述 | ||
|---|---|---|---|
| 语法 表单 | 浮点状态和 控制寄存器 | 记录 位 (RC) | 条件 注册字段 1 |
| fnmadd | C , FL , FG , FE , FU , FR , FI , OX , UX , XX , VXSNAN , VXISI , VXIMZ | 0 | 无 |
| fnmadd。 | C , FL , FG , FE , FU , FR , FI , OX , UX , XX , VXSNAN , VXISI , VXIMZ | 1 | FX , FEX , VX 和 OX |
| fnmadd | C , FL , FG , FE , FU , FR , FI , OX , UX , XX , VXSNAN , VXISI , VXIMZ | 0 | 无 |
| fnmadd。 | C , FL , FG , FE , FU , FR , FI , OX , UX , XX , VXSNAN , VXISI , VXIMZ | 1 | FX , FEX , VX 和 OX |
| fnma | C , FL , FG , FE , FU , FR , FI , OX , UX , XX , VXSNAN , VXISI , VXIMZ | 0 | 无 |
| fnma。 | C , FL , FG , FE , FU , FR , FI , OX , UX , XX , VXSNAN , VXISI , VXIMZ | 1 | FX , FEX , VX 和 OX |
fnmadd, fnmadd和 fnma 指令的所有语法形式始终会影响浮点状态和控制寄存器。 如果语法格式将 "记录 (Rc)" 位设置为 1 ,那么指令会影响 "条件寄存器" 字段 1 中的 "浮点异常" (FX) , "已启用浮点异常" (FEX) , "浮点无效操作异常" (VX) 和 "浮点溢出异常" (OX) 位。
注: 在对加法结果求反之前进行舍入。 根据 RN,可能会产生不精确的值。
参数
| 项 | 描述 |
|---|---|
| FRT | 指定操作的目标浮点寄存器。 |
| 法国 | 指定操作的源浮点寄存器。 |
| FRB | 指定操作的源浮点寄存器。 |
| FRC | 指定操作的源浮点寄存器。 |
示例
- 以下代码将 FPR 4 和 FPR 5 的内容相乘,将结果添加到 FPR 7 的内容,将求反结果存储在 FPR 6 中,并设置浮点状态和控制寄存器以反映操作结果:
# Assume FPR 4 contains 0xC053 4000 0000 0000. # Assume FPR 5 contains 0x400C 0000 0000 0000. # Assume FPR 7 contains 0x3DE2 6AB4 B33c 110A. # Assume FPSCR = 0. fnmadd 6,4,5,7 # FPR 6 now contains 0x4070 D7FF FFFF F6CB. # FPSCR now contains 0x8206 4000. - 以下代码将 FPR 4 和 FPR 5 的内容相乘,将结果添加到 FPR 7 的内容,将求反结果存储在 FPR 6 中,并设置浮点状态和控制寄存器以及条件寄存器字段 1 以反映操作结果:
# Assume FPR 4 contains 0xC053 4000 0000 0000. # Assume FPR 5 contains 0x400C 0000 0000 0000. # Assume FPR 7 contains 0x3DE2 6AB4 B33c 110A. # Assume FPSCR = 0 and CR = 0. fnmadd. 6,4,5,7 # FPR 6 now contains 0x4070 D7FF FFFF F6CB. # FPSCR now contains 0x8206 4000. # CR now contains 0x0800 0000.