24531904_j

24531904_j 24531904_j

16.02.2013 Aufrufe

fprcpa ─ 浮動小数点並列逆数近似 (Floating-point Parallel Reciprocal Approximation) fprcpa 書式 : (qp) fprcpa.sf f 1 ,p 2 = f 2 , f 3 F6 説明 : PR qp が 0 の場合、 RP p2 がク リアされる。 FR f1 はそのま ま変わらない。 PR qp が 1 の場合、 以下が行われる。 • FR f1 の仮数の上下各半分が、 FR f3 の対応する半分の逆数の近似値 ( 相対誤差

fprcpa } else if (fp_is_zero(num) && fp_is_finite(den)) { tmp_res = FP_ZERO; tmp_res.sign = num.sign ^ den.sign; tmp_pred_hi = 0; } else { tmp_res = fp_ieee_recip(den); if (limits_check.hi_fr2_or_quot) tmp_pred_hi = 0; else tmp_pred_hi = 1; } tmp_res_hi = fp_single(tmp_res); } if (fp_is_nan_or_inf(tmp_default_result_pair.lo) || limits_check.lo_fr3) { tmp_res_lo = fp_single(tmp_default_result_pair.lo); tmp_pred_lo = 0; } else { num = fp_normalize(fp_reg_read_lo(f2 )); den = fp_normalize(fp_reg_read_lo(f3 )); if (fp_is_inf(num) && fp_is_finite(den)) { tmp_res = FP_INFINITY; tmp_res.sign = num.sign ^ den.sign; tmp_pred_lo = 0; } else if (fp_is_finite(num) && fp_is_inf(den)) { tmp_res = FP_ZERO; tmp_res.sign = num.sign ^ den.sign; tmp_pred_lo = 0; } else if (fp_is_zero(num) && fp_is_finite(den)) { tmp_res = FP_ZERO; tmp_res.sign = num.sign ^ den.sign; tmp_pred_lo = 0; } else { tmp_res = fp_ieee_recip(den); if (limits_check.lo_fr2_or_quot) tmp_pred_lo = 0; else tmp_pred_lo = 1; } tmp_res_lo = fp_single(tmp_res); } FR[f 1].significand = fp_concatenate(tmp_res_hi, tmp_res_lo); FR[f 1 ].exponent = FP_INTEGER_EXP; FR[f 1 ].sign = FP_SIGN_POSITIVE; PR[p 2] = tmp_pred_hi && tmp_pred_lo; fp_update_fpsr(sf, tmp_fp_env); } fp_update_psr(f1 ); } else { PR[p2] = 0; } FP 例外 : 無効操作 (Invalid Operation: V) ゼロ除算 (Zero Divide: Z) デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D) ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト 割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト 浮動小数点レ ジ ス タ無効フ ォ ル ト 第 3 巻 : 命令リファレンス 3:111

fprcpa<br />

} else if (fp_is_zero(num) && fp_is_finite(den)) {<br />

tmp_res = FP_ZERO;<br />

tmp_res.sign = num.sign ^ den.sign;<br />

tmp_pred_hi = 0;<br />

} else {<br />

tmp_res = fp_ieee_recip(den);<br />

if (limits_check.hi_fr2_or_quot)<br />

tmp_pred_hi = 0;<br />

else<br />

tmp_pred_hi = 1;<br />

}<br />

tmp_res_hi = fp_single(tmp_res);<br />

}<br />

if (fp_is_nan_or_inf(tmp_default_result_pair.lo) ||<br />

limits_check.lo_fr3) {<br />

tmp_res_lo = fp_single(tmp_default_result_pair.lo);<br />

tmp_pred_lo = 0;<br />

} else {<br />

num = fp_normalize(fp_reg_read_lo(f2 ));<br />

den = fp_normalize(fp_reg_read_lo(f3 ));<br />

if (fp_is_inf(num) && fp_is_finite(den)) {<br />

tmp_res = FP_INFINITY;<br />

tmp_res.sign = num.sign ^ den.sign;<br />

tmp_pred_lo = 0;<br />

} else if (fp_is_finite(num) && fp_is_inf(den)) {<br />

tmp_res = FP_ZERO;<br />

tmp_res.sign = num.sign ^ den.sign;<br />

tmp_pred_lo = 0;<br />

} else if (fp_is_zero(num) && fp_is_finite(den)) {<br />

tmp_res = FP_ZERO;<br />

tmp_res.sign = num.sign ^ den.sign;<br />

tmp_pred_lo = 0;<br />

} else {<br />

tmp_res = fp_ieee_recip(den);<br />

if (limits_check.lo_fr2_or_quot)<br />

tmp_pred_lo = 0;<br />

else<br />

tmp_pred_lo = 1;<br />

}<br />

tmp_res_lo = fp_single(tmp_res);<br />

}<br />

FR[f 1].significand = fp_concatenate(tmp_res_hi, tmp_res_lo);<br />

FR[f 1 ].exponent = FP_INTEGER_EXP;<br />

FR[f 1 ].sign = FP_SIGN_POSITIVE;<br />

PR[p 2] = tmp_pred_hi && tmp_pred_lo;<br />

fp_update_fpsr(sf, tmp_fp_env);<br />

}<br />

fp_update_psr(f1 );<br />

} else {<br />

PR[p2] = 0;<br />

}<br />

FP 例外 : 無効操作 (Invalid Operation: V)<br />

ゼロ除算 (Zero Divide: Z)<br />

デノーマル/ アンノ ーマル ・ オペラン ド (Denormal/Unnormal Operand: D)<br />

ソフ ト ウェア・アシスト (Software Assist: SWA) フォルト<br />

割り込み : 無効操作フ ォ ル ト 浮動小数点例外フ ォ ル ト<br />

浮動小数点レ ジ ス タ無効フ ォ ル ト<br />

第 3 巻 : 命令リファレンス 3:111

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!