fnma
格式
(qp) fnma.pc.sf f1 = f3, f4, f2 F1
說明
FR f3 與 FR f4 的乘積計算到無限精度,取反之後加上 FR f2,同樣計算到無限精度。隨後按照 FPSR.sf.rc 指定的取整模式,將結果值取整到 pc(及可能的 FPSR.sf.pc 與 FPSR.sf.wre)指定的精度。取整后的結果放入 FR f1。
如果 FR f3、FR f4 或 FR f2 中的任何一個是 NaTVal,則 FR f1 設定為 NaTVal,而不是計算的結果。
如果 f2 是 f0,則執行 IEEE 乘法運算,然後對乘積取反。請參閱
第 3:82 頁上的“fnmpy - 浮點乘法取反”。
操作碼的 pc 的助記符值在第 3:50 頁上的“表 2-22”中給出。sf 的助記符值在第 3:50 頁上的“表 2-23”中給出。如需瞭解狀態欄位的 pc、wre 及 rc 的編碼與解釋,請參閱 Intel(R) Itanium(R) Architecture Software Developer's Manual(英特爾(R) 安騰(R) 體系結構軟件開發人員手冊)第 1:80 頁的“表 5-5”與“表 5-6”。
操作
if (PR[qp]) {
fp_check_target_register(f1);
if (tmp_isrcode = fp_reg_disabled(f1, f2, f3, f4))
disabled_fp_register_fault(tmp_isrcode, 0);
if (fp_is_natval(FR[f2]) || fp_is_natval(FR[f3]) ||
fp_is_natval(FR[f4])) {
FR[f1] = NATVAL;
fp_update_psr(f1);
} else {
tmp_default_result = fms_fnma_exception_fault_check(f2, f3, f4,
pc, sf, &tmp_fp_env);
if (fp_raise_fault(tmp_fp_env))
fp_exception_fault(fp_decode_fault(tmp_fp_env));
if (fp_is_nan_or_inf(tmp_default_result)) {
FR[f1] = tmp_default_result;
} else {
tmp_res = fp_mul(fp_reg_read(FR[f3]), fp_reg_read(FR[f4]));
tmp_res.sign = !tmp_res.sign;
if (f2 != 0)
tmp_res = fp_add(tmp_res, fp_reg_read(FR[f2]), tmp_fp_env);
FR[f1] = fp_ieee_round(tmp_res, &tmp_fp_env);
}
fp_update_fpsr(sf, tmp_fp_env);
fp_update_psr(f1);
if (fp_raise_traps(tmp_fp_env))
fp_exception_trap(fp_decode_trap(tmp_fp_env));
}
}
FP 異常
無效操作 (V) 下溢 (U)
非規格化/非常規運算元 (D) 上溢 (O)
軟體協助 (SWA) 錯誤:不精確 (I)
軟體協助 (SWA) 陷阱
中斷:禁用“浮點暫存器”錯誤與“浮點異常”陷阱
“浮點異常”錯誤