target/sparc: Merge check_ieee_exceptions with FPop helpers

If an exception is to be raised, the destination fp register
should be unmodified.  The current implementation is incorrect,
in that double results will be written back before calling
gen_helper_check_ieee_exceptions, despite the placement of
gen_store_fpr_D, since gen_dest_fpr_D returns cpu_fpr[].

We can simplify the entire implementation by having each
FPOp helper call check_ieee_exceptions.  For the moment this
requires that all FPop helpers write to the TCG global cpu_fsr,
so remove TCG_CALL_NO_WG from the DEF_HELPER_FLAGS_*.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Message-Id: <20231103173841.33651-19-richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2023-11-03 10:38:37 -07:00
parent efeb8b0750
commit db71391123
3 changed files with 219 additions and 129 deletions

View file

@ -35,81 +35,80 @@ DEF_HELPER_3(tsubcctv, tl, env, tl, tl)
DEF_HELPER_FLAGS_4(ld_asi, TCG_CALL_NO_WG, i64, env, tl, int, i32)
DEF_HELPER_FLAGS_5(st_asi, TCG_CALL_NO_WG, void, env, tl, i64, int, i32)
#endif
DEF_HELPER_FLAGS_1(check_ieee_exceptions, TCG_CALL_NO_WG, tl, env)
DEF_HELPER_FLAGS_1(get_fsr, TCG_CALL_NO_WG_SE, tl, env)
DEF_HELPER_FLAGS_2(set_fsr, TCG_CALL_NO_RWG, void, env, tl)
DEF_HELPER_FLAGS_2(fsqrts, TCG_CALL_NO_RWG, f32, env, f32)
DEF_HELPER_FLAGS_2(fsqrtd, TCG_CALL_NO_RWG, f64, env, f64)
DEF_HELPER_FLAGS_3(fcmps, TCG_CALL_NO_WG, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmpd, TCG_CALL_NO_WG, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmpes, TCG_CALL_NO_WG, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmped, TCG_CALL_NO_WG, tl, env, f64, f64)
DEF_HELPER_FLAGS_2(fsqrtq, TCG_CALL_NO_RWG, i128, env, i128)
DEF_HELPER_FLAGS_3(fcmpq, TCG_CALL_NO_WG, tl, env, i128, i128)
DEF_HELPER_FLAGS_3(fcmpeq, TCG_CALL_NO_WG, tl, env, i128, i128)
DEF_HELPER_FLAGS_2(fsqrts, 0, f32, env, f32)
DEF_HELPER_FLAGS_2(fsqrtd, 0, f64, env, f64)
DEF_HELPER_FLAGS_2(fsqrtq, 0, i128, env, i128)
DEF_HELPER_FLAGS_3(fcmps, 0, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmpd, 0, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmpes, 0, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmped, 0, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmpq, 0, tl, env, i128, i128)
DEF_HELPER_FLAGS_3(fcmpeq, 0, tl, env, i128, i128)
#ifdef TARGET_SPARC64
DEF_HELPER_FLAGS_3(fcmps_fcc1, TCG_CALL_NO_WG, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmps_fcc2, TCG_CALL_NO_WG, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmps_fcc3, TCG_CALL_NO_WG, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmpd_fcc1, TCG_CALL_NO_WG, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmpd_fcc2, TCG_CALL_NO_WG, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmpd_fcc3, TCG_CALL_NO_WG, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmpes_fcc1, TCG_CALL_NO_WG, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmpes_fcc2, TCG_CALL_NO_WG, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmpes_fcc3, TCG_CALL_NO_WG, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmped_fcc1, TCG_CALL_NO_WG, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmped_fcc2, TCG_CALL_NO_WG, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmped_fcc3, TCG_CALL_NO_WG, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmpq_fcc1, TCG_CALL_NO_WG, tl, env, i128, i128)
DEF_HELPER_FLAGS_3(fcmpq_fcc2, TCG_CALL_NO_WG, tl, env, i128, i128)
DEF_HELPER_FLAGS_3(fcmpq_fcc3, TCG_CALL_NO_WG, tl, env, i128, i128)
DEF_HELPER_FLAGS_3(fcmpeq_fcc1, TCG_CALL_NO_WG, tl, env, i128, i128)
DEF_HELPER_FLAGS_3(fcmpeq_fcc2, TCG_CALL_NO_WG, tl, env, i128, i128)
DEF_HELPER_FLAGS_3(fcmpeq_fcc3, TCG_CALL_NO_WG, tl, env, i128, i128)
DEF_HELPER_FLAGS_3(fcmps_fcc1, 0, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmps_fcc2, 0, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmps_fcc3, 0, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmpd_fcc1, 0, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmpd_fcc2, 0, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmpd_fcc3, 0, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmpes_fcc1, 0, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmpes_fcc2, 0, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmpes_fcc3, 0, tl, env, f32, f32)
DEF_HELPER_FLAGS_3(fcmped_fcc1, 0, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmped_fcc2, 0, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmped_fcc3, 0, tl, env, f64, f64)
DEF_HELPER_FLAGS_3(fcmpq_fcc1, 0, tl, env, i128, i128)
DEF_HELPER_FLAGS_3(fcmpq_fcc2, 0, tl, env, i128, i128)
DEF_HELPER_FLAGS_3(fcmpq_fcc3, 0, tl, env, i128, i128)
DEF_HELPER_FLAGS_3(fcmpeq_fcc1, 0, tl, env, i128, i128)
DEF_HELPER_FLAGS_3(fcmpeq_fcc2, 0, tl, env, i128, i128)
DEF_HELPER_FLAGS_3(fcmpeq_fcc3, 0, tl, env, i128, i128)
#endif
DEF_HELPER_2(raise_exception, noreturn, env, int)
DEF_HELPER_FLAGS_3(faddd, TCG_CALL_NO_RWG, f64, env, f64, f64)
DEF_HELPER_FLAGS_3(fsubd, TCG_CALL_NO_RWG, f64, env, f64, f64)
DEF_HELPER_FLAGS_3(fmuld, TCG_CALL_NO_RWG, f64, env, f64, f64)
DEF_HELPER_FLAGS_3(fdivd, TCG_CALL_NO_RWG, f64, env, f64, f64)
DEF_HELPER_FLAGS_3(faddd, 0, f64, env, f64, f64)
DEF_HELPER_FLAGS_3(fsubd, 0, f64, env, f64, f64)
DEF_HELPER_FLAGS_3(fmuld, 0, f64, env, f64, f64)
DEF_HELPER_FLAGS_3(fdivd, 0, f64, env, f64, f64)
DEF_HELPER_FLAGS_3(faddq, TCG_CALL_NO_RWG, i128, env, i128, i128)
DEF_HELPER_FLAGS_3(fsubq, TCG_CALL_NO_RWG, i128, env, i128, i128)
DEF_HELPER_FLAGS_3(fmulq, TCG_CALL_NO_RWG, i128, env, i128, i128)
DEF_HELPER_FLAGS_3(fdivq, TCG_CALL_NO_RWG, i128, env, i128, i128)
DEF_HELPER_FLAGS_3(faddq, 0, i128, env, i128, i128)
DEF_HELPER_FLAGS_3(fsubq, 0, i128, env, i128, i128)
DEF_HELPER_FLAGS_3(fmulq, 0, i128, env, i128, i128)
DEF_HELPER_FLAGS_3(fdivq, 0, i128, env, i128, i128)
DEF_HELPER_FLAGS_3(fadds, TCG_CALL_NO_RWG, f32, env, f32, f32)
DEF_HELPER_FLAGS_3(fsubs, TCG_CALL_NO_RWG, f32, env, f32, f32)
DEF_HELPER_FLAGS_3(fmuls, TCG_CALL_NO_RWG, f32, env, f32, f32)
DEF_HELPER_FLAGS_3(fdivs, TCG_CALL_NO_RWG, f32, env, f32, f32)
DEF_HELPER_FLAGS_3(fadds, 0, f32, env, f32, f32)
DEF_HELPER_FLAGS_3(fsubs, 0, f32, env, f32, f32)
DEF_HELPER_FLAGS_3(fmuls, 0, f32, env, f32, f32)
DEF_HELPER_FLAGS_3(fdivs, 0, f32, env, f32, f32)
DEF_HELPER_FLAGS_3(fsmuld, TCG_CALL_NO_RWG, f64, env, f32, f32)
DEF_HELPER_FLAGS_3(fdmulq, TCG_CALL_NO_RWG, i128, env, f64, f64)
DEF_HELPER_FLAGS_3(fsmuld, 0, f64, env, f32, f32)
DEF_HELPER_FLAGS_3(fdmulq, 0, i128, env, f64, f64)
DEF_HELPER_FLAGS_2(fitod, TCG_CALL_NO_RWG_SE, f64, env, s32)
DEF_HELPER_FLAGS_2(fitoq, TCG_CALL_NO_RWG, i128, env, s32)
DEF_HELPER_FLAGS_2(fitod, 0, f64, env, s32)
DEF_HELPER_FLAGS_2(fitoq, 0, i128, env, s32)
DEF_HELPER_FLAGS_2(fitos, TCG_CALL_NO_RWG, f32, env, s32)
DEF_HELPER_FLAGS_2(fitos, 0, f32, env, s32)
#ifdef TARGET_SPARC64
DEF_HELPER_FLAGS_2(fxtos, TCG_CALL_NO_RWG, f32, env, s64)
DEF_HELPER_FLAGS_2(fxtod, TCG_CALL_NO_RWG, f64, env, s64)
DEF_HELPER_FLAGS_2(fxtoq, TCG_CALL_NO_RWG, i128, env, s64)
DEF_HELPER_FLAGS_2(fxtos, 0, f32, env, s64)
DEF_HELPER_FLAGS_2(fxtod, 0, f64, env, s64)
DEF_HELPER_FLAGS_2(fxtoq, 0, i128, env, s64)
#endif
DEF_HELPER_FLAGS_2(fdtos, TCG_CALL_NO_RWG, f32, env, f64)
DEF_HELPER_FLAGS_2(fstod, TCG_CALL_NO_RWG, f64, env, f32)
DEF_HELPER_FLAGS_2(fqtos, TCG_CALL_NO_RWG, f32, env, i128)
DEF_HELPER_FLAGS_2(fstoq, TCG_CALL_NO_RWG, i128, env, f32)
DEF_HELPER_FLAGS_2(fqtod, TCG_CALL_NO_RWG, f64, env, i128)
DEF_HELPER_FLAGS_2(fdtoq, TCG_CALL_NO_RWG, i128, env, f64)
DEF_HELPER_FLAGS_2(fstoi, TCG_CALL_NO_RWG, s32, env, f32)
DEF_HELPER_FLAGS_2(fdtoi, TCG_CALL_NO_RWG, s32, env, f64)
DEF_HELPER_FLAGS_2(fqtoi, TCG_CALL_NO_RWG, s32, env, i128)
DEF_HELPER_FLAGS_2(fdtos, 0, f32, env, f64)
DEF_HELPER_FLAGS_2(fstod, 0, f64, env, f32)
DEF_HELPER_FLAGS_2(fqtos, 0, f32, env, i128)
DEF_HELPER_FLAGS_2(fstoq, 0, i128, env, f32)
DEF_HELPER_FLAGS_2(fqtod, 0, f64, env, i128)
DEF_HELPER_FLAGS_2(fdtoq, 0, i128, env, f64)
DEF_HELPER_FLAGS_2(fstoi, 0, s32, env, f32)
DEF_HELPER_FLAGS_2(fdtoi, 0, s32, env, f64)
DEF_HELPER_FLAGS_2(fqtoi, 0, s32, env, i128)
#ifdef TARGET_SPARC64
DEF_HELPER_FLAGS_2(fstox, TCG_CALL_NO_RWG, s64, env, f32)
DEF_HELPER_FLAGS_2(fdtox, TCG_CALL_NO_RWG, s64, env, f64)
DEF_HELPER_FLAGS_2(fqtox, TCG_CALL_NO_RWG, s64, env, i128)
DEF_HELPER_FLAGS_2(fstox, 0, s64, env, f32)
DEF_HELPER_FLAGS_2(fdtox, 0, s64, env, f64)
DEF_HELPER_FLAGS_2(fqtox, 0, s64, env, i128)
DEF_HELPER_FLAGS_2(fpmerge, TCG_CALL_NO_RWG_SE, i64, i64, i64)
DEF_HELPER_FLAGS_2(fmul8x16, TCG_CALL_NO_RWG_SE, i64, i64, i64)