浮點乘法加法取反

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) 陷阱

中斷:禁用“浮點暫存器”錯誤與“浮點異常”陷阱

“浮點異常”錯誤