aboutsummaryrefslogtreecommitdiffstats
path: root/target-mips/op_helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'target-mips/op_helper.c')
-rw-r--r--target-mips/op_helper.c980
1 files changed, 612 insertions, 368 deletions
diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c
index 309856344..008fb2c0b 100644
--- a/target-mips/op_helper.c
+++ b/target-mips/op_helper.c
@@ -2121,380 +2121,555 @@ static always_inline void update_fcr31(void)
"d" suffix, 32bit integer "w", 64bit integer "l", paired single "ps",
paired single lower "pl", paired single upper "pu". */
-#define FLOAT_OP(name, p) void do_float_##name##_##p(void)
-
/* unary operations, modifying fp status */
-#define FLOAT_UNOP(name) \
-FLOAT_OP(name, d) \
-{ \
- FDT2 = float64_ ## name(FDT0, &env->fpu->fp_status); \
-} \
-FLOAT_OP(name, s) \
-{ \
- FST2 = float32_ ## name(FST0, &env->fpu->fp_status); \
-}
-FLOAT_UNOP(sqrt)
-#undef FLOAT_UNOP
+uint64_t do_float_sqrt_d(uint64_t fdt0)
+{
+ return float64_sqrt(fdt0, &env->fpu->fp_status);
+}
+
+uint32_t do_float_sqrt_s(uint32_t fst0)
+{
+ return float32_sqrt(fst0, &env->fpu->fp_status);
+}
-FLOAT_OP(cvtd, s)
+uint64_t do_float_cvtd_s(uint32_t fst0)
{
+ uint64_t fdt2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FDT2 = float32_to_float64(FST0, &env->fpu->fp_status);
+ fdt2 = float32_to_float64(fst0, &env->fpu->fp_status);
update_fcr31();
+ return fdt2;
}
-FLOAT_OP(cvtd, w)
+
+uint64_t do_float_cvtd_w(uint32_t wt0)
{
+ uint64_t fdt2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FDT2 = int32_to_float64(WT0, &env->fpu->fp_status);
+ fdt2 = int32_to_float64(wt0, &env->fpu->fp_status);
update_fcr31();
+ return fdt2;
}
-FLOAT_OP(cvtd, l)
+
+uint64_t do_float_cvtd_l(uint64_t dt0)
{
+ uint64_t fdt2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FDT2 = int64_to_float64(DT0, &env->fpu->fp_status);
+ fdt2 = int64_to_float64(dt0, &env->fpu->fp_status);
update_fcr31();
+ return fdt2;
}
-FLOAT_OP(cvtl, d)
+
+uint64_t do_float_cvtl_d(uint64_t fdt0)
{
+ uint64_t dt2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- DT2 = float64_to_int64(FDT0, &env->fpu->fp_status);
+ dt2 = float64_to_int64(fdt0, &env->fpu->fp_status);
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- DT2 = FLOAT_SNAN64;
+ dt2 = FLOAT_SNAN64;
+ return dt2;
}
-FLOAT_OP(cvtl, s)
+
+uint64_t do_float_cvtl_s(uint32_t fst0)
{
+ uint64_t dt2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- DT2 = float32_to_int64(FST0, &env->fpu->fp_status);
+ dt2 = float32_to_int64(fst0, &env->fpu->fp_status);
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- DT2 = FLOAT_SNAN64;
+ dt2 = FLOAT_SNAN64;
+ return dt2;
}
-FLOAT_OP(cvtps, pw)
+uint64_t do_float_cvtps_pw(uint64_t dt0)
{
+ uint32_t fst2;
+ uint32_t fsth2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = int32_to_float32(WT0, &env->fpu->fp_status);
- FSTH2 = int32_to_float32(WTH0, &env->fpu->fp_status);
+ fst2 = int32_to_float32(dt0 & 0XFFFFFFFF, &env->fpu->fp_status);
+ fsth2 = int32_to_float32(dt0 >> 32, &env->fpu->fp_status);
update_fcr31();
+ return ((uint64_t)fsth2 << 32) | fst2;
}
-FLOAT_OP(cvtpw, ps)
+
+uint64_t do_float_cvtpw_ps(uint64_t fdt0)
{
+ uint32_t wt2;
+ uint32_t wth2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- WT2 = float32_to_int32(FST0, &env->fpu->fp_status);
- WTH2 = float32_to_int32(FSTH0, &env->fpu->fp_status);
+ wt2 = float32_to_int32(fdt0 & 0XFFFFFFFF, &env->fpu->fp_status);
+ wth2 = float32_to_int32(fdt0 >> 32, &env->fpu->fp_status);
update_fcr31();
- if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- WT2 = FLOAT_SNAN32;
+ if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID)) {
+ wt2 = FLOAT_SNAN32;
+ wth2 = FLOAT_SNAN32;
+ }
+ return ((uint64_t)wth2 << 32) | wt2;
}
-FLOAT_OP(cvts, d)
+
+uint32_t do_float_cvts_d(uint64_t fdt0)
{
+ uint32_t fst2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = float64_to_float32(FDT0, &env->fpu->fp_status);
+ fst2 = float64_to_float32(fdt0, &env->fpu->fp_status);
update_fcr31();
+ return fst2;
}
-FLOAT_OP(cvts, w)
+
+uint32_t do_float_cvts_w(uint32_t wt0)
{
+ uint32_t fst2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = int32_to_float32(WT0, &env->fpu->fp_status);
+ fst2 = int32_to_float32(wt0, &env->fpu->fp_status);
update_fcr31();
+ return fst2;
}
-FLOAT_OP(cvts, l)
+
+uint32_t do_float_cvts_l(uint64_t dt0)
{
+ uint32_t fst2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = int64_to_float32(DT0, &env->fpu->fp_status);
+ fst2 = int64_to_float32(dt0, &env->fpu->fp_status);
update_fcr31();
+ return fst2;
}
-FLOAT_OP(cvts, pl)
+
+uint32_t do_float_cvts_pl(uint32_t wt0)
{
+ uint32_t wt2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- WT2 = WT0;
+ wt2 = wt0;
update_fcr31();
+ return wt2;
}
-FLOAT_OP(cvts, pu)
+
+uint32_t do_float_cvts_pu(uint32_t wth0)
{
+ uint32_t wt2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- WT2 = WTH0;
+ wt2 = wth0;
update_fcr31();
+ return wt2;
}
-FLOAT_OP(cvtw, s)
+
+uint32_t do_float_cvtw_s(uint32_t fst0)
{
+ uint32_t wt2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- WT2 = float32_to_int32(FST0, &env->fpu->fp_status);
+ wt2 = float32_to_int32(fst0, &env->fpu->fp_status);
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- WT2 = FLOAT_SNAN32;
+ wt2 = FLOAT_SNAN32;
+ return wt2;
}
-FLOAT_OP(cvtw, d)
+
+uint32_t do_float_cvtw_d(uint64_t fdt0)
{
+ uint32_t wt2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- WT2 = float64_to_int32(FDT0, &env->fpu->fp_status);
+ wt2 = float64_to_int32(fdt0, &env->fpu->fp_status);
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- WT2 = FLOAT_SNAN32;
+ wt2 = FLOAT_SNAN32;
+ return wt2;
}
-FLOAT_OP(roundl, d)
+uint64_t do_float_roundl_d(uint64_t fdt0)
{
+ uint64_t dt2;
+
set_float_rounding_mode(float_round_nearest_even, &env->fpu->fp_status);
- DT2 = float64_to_int64(FDT0, &env->fpu->fp_status);
+ dt2 = float64_to_int64(fdt0, &env->fpu->fp_status);
RESTORE_ROUNDING_MODE;
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- DT2 = FLOAT_SNAN64;
+ dt2 = FLOAT_SNAN64;
+ return dt2;
}
-FLOAT_OP(roundl, s)
+
+uint64_t do_float_roundl_s(uint32_t fst0)
{
+ uint64_t dt2;
+
set_float_rounding_mode(float_round_nearest_even, &env->fpu->fp_status);
- DT2 = float32_to_int64(FST0, &env->fpu->fp_status);
+ dt2 = float32_to_int64(fst0, &env->fpu->fp_status);
RESTORE_ROUNDING_MODE;
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- DT2 = FLOAT_SNAN64;
+ dt2 = FLOAT_SNAN64;
+ return dt2;
}
-FLOAT_OP(roundw, d)
+
+uint32_t do_float_roundw_d(uint64_t fdt0)
{
+ uint32_t wt2;
+
set_float_rounding_mode(float_round_nearest_even, &env->fpu->fp_status);
- WT2 = float64_to_int32(FDT0, &env->fpu->fp_status);
+ wt2 = float64_to_int32(fdt0, &env->fpu->fp_status);
RESTORE_ROUNDING_MODE;
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- WT2 = FLOAT_SNAN32;
+ wt2 = FLOAT_SNAN32;
+ return wt2;
}
-FLOAT_OP(roundw, s)
+
+uint32_t do_float_roundw_s(uint32_t fst0)
{
+ uint32_t wt2;
+
set_float_rounding_mode(float_round_nearest_even, &env->fpu->fp_status);
- WT2 = float32_to_int32(FST0, &env->fpu->fp_status);
+ wt2 = float32_to_int32(fst0, &env->fpu->fp_status);
RESTORE_ROUNDING_MODE;
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- WT2 = FLOAT_SNAN32;
+ wt2 = FLOAT_SNAN32;
+ return wt2;
}
-FLOAT_OP(truncl, d)
+uint64_t do_float_truncl_d(uint64_t fdt0)
{
- DT2 = float64_to_int64_round_to_zero(FDT0, &env->fpu->fp_status);
+ uint64_t dt2;
+
+ dt2 = float64_to_int64_round_to_zero(fdt0, &env->fpu->fp_status);
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- DT2 = FLOAT_SNAN64;
+ dt2 = FLOAT_SNAN64;
+ return dt2;
}
-FLOAT_OP(truncl, s)
+
+uint64_t do_float_truncl_s(uint32_t fst0)
{
- DT2 = float32_to_int64_round_to_zero(FST0, &env->fpu->fp_status);
+ uint64_t dt2;
+
+ dt2 = float32_to_int64_round_to_zero(fst0, &env->fpu->fp_status);
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- DT2 = FLOAT_SNAN64;
+ dt2 = FLOAT_SNAN64;
+ return dt2;
}
-FLOAT_OP(truncw, d)
+
+uint32_t do_float_truncw_d(uint64_t fdt0)
{
- WT2 = float64_to_int32_round_to_zero(FDT0, &env->fpu->fp_status);
+ uint32_t wt2;
+
+ wt2 = float64_to_int32_round_to_zero(fdt0, &env->fpu->fp_status);
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- WT2 = FLOAT_SNAN32;
+ wt2 = FLOAT_SNAN32;
+ return wt2;
}
-FLOAT_OP(truncw, s)
+
+uint32_t do_float_truncw_s(uint32_t fst0)
{
- WT2 = float32_to_int32_round_to_zero(FST0, &env->fpu->fp_status);
+ uint32_t wt2;
+
+ wt2 = float32_to_int32_round_to_zero(fst0, &env->fpu->fp_status);
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- WT2 = FLOAT_SNAN32;
+ wt2 = FLOAT_SNAN32;
+ return wt2;
}
-FLOAT_OP(ceill, d)
+uint64_t do_float_ceill_d(uint64_t fdt0)
{
+ uint64_t dt2;
+
set_float_rounding_mode(float_round_up, &env->fpu->fp_status);
- DT2 = float64_to_int64(FDT0, &env->fpu->fp_status);
+ dt2 = float64_to_int64(fdt0, &env->fpu->fp_status);
RESTORE_ROUNDING_MODE;
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- DT2 = FLOAT_SNAN64;
+ dt2 = FLOAT_SNAN64;
+ return dt2;
}
-FLOAT_OP(ceill, s)
+
+uint64_t do_float_ceill_s(uint32_t fst0)
{
+ uint64_t dt2;
+
set_float_rounding_mode(float_round_up, &env->fpu->fp_status);
- DT2 = float32_to_int64(FST0, &env->fpu->fp_status);
+ dt2 = float32_to_int64(fst0, &env->fpu->fp_status);
RESTORE_ROUNDING_MODE;
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- DT2 = FLOAT_SNAN64;
+ dt2 = FLOAT_SNAN64;
+ return dt2;
}
-FLOAT_OP(ceilw, d)
+
+uint32_t do_float_ceilw_d(uint64_t fdt0)
{
+ uint32_t wt2;
+
set_float_rounding_mode(float_round_up, &env->fpu->fp_status);
- WT2 = float64_to_int32(FDT0, &env->fpu->fp_status);
+ wt2 = float64_to_int32(fdt0, &env->fpu->fp_status);
RESTORE_ROUNDING_MODE;
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- WT2 = FLOAT_SNAN32;
+ wt2 = FLOAT_SNAN32;
+ return wt2;
}
-FLOAT_OP(ceilw, s)
+
+uint32_t do_float_ceilw_s(uint32_t fst0)
{
+ uint32_t wt2;
+
set_float_rounding_mode(float_round_up, &env->fpu->fp_status);
- WT2 = float32_to_int32(FST0, &env->fpu->fp_status);
+ wt2 = float32_to_int32(fst0, &env->fpu->fp_status);
RESTORE_ROUNDING_MODE;
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- WT2 = FLOAT_SNAN32;
+ wt2 = FLOAT_SNAN32;
+ return wt2;
}
-FLOAT_OP(floorl, d)
+uint64_t do_float_floorl_d(uint64_t fdt0)
{
+ uint64_t dt2;
+
set_float_rounding_mode(float_round_down, &env->fpu->fp_status);
- DT2 = float64_to_int64(FDT0, &env->fpu->fp_status);
+ dt2 = float64_to_int64(fdt0, &env->fpu->fp_status);
RESTORE_ROUNDING_MODE;
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- DT2 = FLOAT_SNAN64;
+ dt2 = FLOAT_SNAN64;
+ return dt2;
}
-FLOAT_OP(floorl, s)
+
+uint64_t do_float_floorl_s(uint32_t fst0)
{
+ uint64_t dt2;
+
set_float_rounding_mode(float_round_down, &env->fpu->fp_status);
- DT2 = float32_to_int64(FST0, &env->fpu->fp_status);
+ dt2 = float32_to_int64(fst0, &env->fpu->fp_status);
RESTORE_ROUNDING_MODE;
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- DT2 = FLOAT_SNAN64;
+ dt2 = FLOAT_SNAN64;
+ return dt2;
}
-FLOAT_OP(floorw, d)
+
+uint32_t do_float_floorw_d(uint64_t fdt0)
{
+ uint32_t wt2;
+
set_float_rounding_mode(float_round_down, &env->fpu->fp_status);
- WT2 = float64_to_int32(FDT0, &env->fpu->fp_status);
+ wt2 = float64_to_int32(fdt0, &env->fpu->fp_status);
RESTORE_ROUNDING_MODE;
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- WT2 = FLOAT_SNAN32;
+ wt2 = FLOAT_SNAN32;
+ return wt2;
}
-FLOAT_OP(floorw, s)
+
+uint32_t do_float_floorw_s(uint32_t fst0)
{
+ uint32_t wt2;
+
set_float_rounding_mode(float_round_down, &env->fpu->fp_status);
- WT2 = float32_to_int32(FST0, &env->fpu->fp_status);
+ wt2 = float32_to_int32(fst0, &env->fpu->fp_status);
RESTORE_ROUNDING_MODE;
update_fcr31();
if (GET_FP_CAUSE(env->fpu->fcr31) & (FP_OVERFLOW | FP_INVALID))
- WT2 = FLOAT_SNAN32;
+ wt2 = FLOAT_SNAN32;
+ return wt2;
}
/* unary operations, not modifying fp status */
-#define FLOAT_UNOP(name) \
-FLOAT_OP(name, d) \
-{ \
- FDT2 = float64_ ## name(FDT0); \
-} \
-FLOAT_OP(name, s) \
-{ \
- FST2 = float32_ ## name(FST0); \
-} \
-FLOAT_OP(name, ps) \
-{ \
- FST2 = float32_ ## name(FST0); \
- FSTH2 = float32_ ## name(FSTH0); \
+#define FLOAT_UNOP(name) \
+uint64_t do_float_ ## name ## _d(uint64_t fdt0) \
+{ \
+ return float64_ ## name(fdt0); \
+} \
+uint32_t do_float_ ## name ## _s(uint32_t fst0) \
+{ \
+ return float32_ ## name(fst0); \
+} \
+uint64_t do_float_ ## name ## _ps(uint64_t fdt0) \
+{ \
+ uint32_t wt0; \
+ uint32_t wth0; \
+ \
+ wt0 = float32_ ## name(fdt0 & 0XFFFFFFFF); \
+ wth0 = float32_ ## name(fdt0 >> 32); \
+ return ((uint64_t)wth0 << 32) | wt0; \
}
FLOAT_UNOP(abs)
FLOAT_UNOP(chs)
#undef FLOAT_UNOP
/* MIPS specific unary operations */
-FLOAT_OP(recip, d)
+uint64_t do_float_recip_d(uint64_t fdt0)
{
+ uint64_t fdt2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FDT2 = float64_div(FLOAT_ONE64, FDT0, &env->fpu->fp_status);
+ fdt2 = float64_div(FLOAT_ONE64, fdt0, &env->fpu->fp_status);
update_fcr31();
+ return fdt2;
}
-FLOAT_OP(recip, s)
+
+uint32_t do_float_recip_s(uint32_t fst0)
{
+ uint32_t fst2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = float32_div(FLOAT_ONE32, FST0, &env->fpu->fp_status);
+ fst2 = float32_div(FLOAT_ONE32, fst0, &env->fpu->fp_status);
update_fcr31();
+ return fst2;
}
-FLOAT_OP(rsqrt, d)
+uint64_t do_float_rsqrt_d(uint64_t fdt0)
{
+ uint64_t fdt2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FDT2 = float64_sqrt(FDT0, &env->fpu->fp_status);
- FDT2 = float64_div(FLOAT_ONE64, FDT2, &env->fpu->fp_status);
+ fdt2 = float64_sqrt(fdt0, &env->fpu->fp_status);
+ fdt2 = float64_div(FLOAT_ONE64, fdt2, &env->fpu->fp_status);
update_fcr31();
+ return fdt2;
}
-FLOAT_OP(rsqrt, s)
+
+uint32_t do_float_rsqrt_s(uint32_t fst0)
{
+ uint32_t fst2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = float32_sqrt(FST0, &env->fpu->fp_status);
- FST2 = float32_div(FLOAT_ONE32, FST2, &env->fpu->fp_status);
+ fst2 = float32_sqrt(fst0, &env->fpu->fp_status);
+ fst2 = float32_div(FLOAT_ONE32, fst2, &env->fpu->fp_status);
update_fcr31();
+ return fst2;
}
-FLOAT_OP(recip1, d)
+uint64_t do_float_recip1_d(uint64_t fdt0)
{
+ uint64_t fdt2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FDT2 = float64_div(FLOAT_ONE64, FDT0, &env->fpu->fp_status);
+ fdt2 = float64_div(FLOAT_ONE64, fdt0, &env->fpu->fp_status);
update_fcr31();
+ return fdt2;
}
-FLOAT_OP(recip1, s)
+
+uint32_t do_float_recip1_s(uint32_t fst0)
{
+ uint32_t fst2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = float32_div(FLOAT_ONE32, FST0, &env->fpu->fp_status);
+ fst2 = float32_div(FLOAT_ONE32, fst0, &env->fpu->fp_status);
update_fcr31();
+ return fst2;
}
-FLOAT_OP(recip1, ps)
+
+uint64_t do_float_recip1_ps(uint64_t fdt0)
{
+ uint32_t fst2;
+ uint32_t fsth2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = float32_div(FLOAT_ONE32, FST0, &env->fpu->fp_status);
- FSTH2 = float32_div(FLOAT_ONE32, FSTH0, &env->fpu->fp_status);
+ fst2 = float32_div(FLOAT_ONE32, fdt0 & 0XFFFFFFFF, &env->fpu->fp_status);
+ fsth2 = float32_div(FLOAT_ONE32, fdt0 >> 32, &env->fpu->fp_status);
update_fcr31();
+ return ((uint64_t)fsth2 << 32) | fst2;
}
-FLOAT_OP(rsqrt1, d)
+uint64_t do_float_rsqrt1_d(uint64_t fdt0)
{
+ uint64_t fdt2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FDT2 = float64_sqrt(FDT0, &env->fpu->fp_status);
- FDT2 = float64_div(FLOAT_ONE64, FDT2, &env->fpu->fp_status);
+ fdt2 = float64_sqrt(fdt0, &env->fpu->fp_status);
+ fdt2 = float64_div(FLOAT_ONE64, fdt2, &env->fpu->fp_status);
update_fcr31();
+ return fdt2;
}
-FLOAT_OP(rsqrt1, s)
+
+uint32_t do_float_rsqrt1_s(uint32_t fst0)
{
+ uint32_t fst2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = float32_sqrt(FST0, &env->fpu->fp_status);
- FST2 = float32_div(FLOAT_ONE32, FST2, &env->fpu->fp_status);
+ fst2 = float32_sqrt(fst0, &env->fpu->fp_status);
+ fst2 = float32_div(FLOAT_ONE32, fst2, &env->fpu->fp_status);
update_fcr31();
+ return fst2;
}
-FLOAT_OP(rsqrt1, ps)
+
+uint64_t do_float_rsqrt1_ps(uint64_t fdt0)
{
+ uint32_t fst2;
+ uint32_t fsth2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = float32_sqrt(FST0, &env->fpu->fp_status);
- FSTH2 = float32_sqrt(FSTH0, &env->fpu->fp_status);
- FST2 = float32_div(FLOAT_ONE32, FST2, &env->fpu->fp_status);
- FSTH2 = float32_div(FLOAT_ONE32, FSTH2, &env->fpu->fp_status);
+ fst2 = float32_sqrt(fdt0 & 0XFFFFFFFF, &env->fpu->fp_status);
+ fsth2 = float32_sqrt(fdt0 >> 32, &env->fpu->fp_status);
+ fst2 = float32_div(FLOAT_ONE32, fst2, &env->fpu->fp_status);
+ fsth2 = float32_div(FLOAT_ONE32, fsth2, &env->fpu->fp_status);
update_fcr31();
+ return ((uint64_t)fsth2 << 32) | fst2;
}
+#define FLOAT_OP(name, p) void do_float_##name##_##p(void)
+
/* binary operations */
-#define FLOAT_BINOP(name) \
-FLOAT_OP(name, d) \
-{ \
+#define FLOAT_BINOP(name) \
+uint64_t do_float_ ## name ## _d(uint64_t fdt0, uint64_t fdt1) \
+{ \
+ uint64_t dt2; \
+ \
set_float_exception_flags(0, &env->fpu->fp_status); \
- FDT2 = float64_ ## name (FDT0, FDT1, &env->fpu->fp_status); \
+ dt2 = float64_ ## name (fdt0, fdt1, &env->fpu->fp_status); \
update_fcr31(); \
if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) \
- DT2 = FLOAT_QNAN64; \
-} \
-FLOAT_OP(name, s) \
-{ \
+ dt2 = FLOAT_QNAN64; \
+ return dt2; \
+} \
+ \
+uint32_t do_float_ ## name ## _s(uint32_t fst0, uint32_t fst1) \
+{ \
+ uint32_t wt2; \
+ \
set_float_exception_flags(0, &env->fpu->fp_status); \
- FST2 = float32_ ## name (FST0, FST1, &env->fpu->fp_status); \
+ wt2 = float32_ ## name (fst0, fst1, &env->fpu->fp_status); \
update_fcr31(); \
if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) \
- WT2 = FLOAT_QNAN32; \
-} \
-FLOAT_OP(name, ps) \
-{ \
+ wt2 = FLOAT_QNAN32; \
+ return wt2; \
+} \
+ \
+uint64_t do_float_ ## name ## _ps(uint64_t fdt0, uint64_t fdt1) \
+{ \
+ uint32_t fst0 = fdt0 & 0XFFFFFFFF; \
+ uint32_t fsth0 = fdt0 >> 32; \
+ uint32_t fst1 = fdt1 & 0XFFFFFFFF; \
+ uint32_t fsth1 = fdt1 >> 32; \
+ uint32_t wt2; \
+ uint32_t wth2; \
+ \
set_float_exception_flags(0, &env->fpu->fp_status); \
- FST2 = float32_ ## name (FST0, FST1, &env->fpu->fp_status); \
- FSTH2 = float32_ ## name (FSTH0, FSTH1, &env->fpu->fp_status); \
- update_fcr31(); \
+ wt2 = float32_ ## name (fst0, fst1, &env->fpu->fp_status); \
+ wth2 = float32_ ## name (fsth0, fsth1, &env->fpu->fp_status); \
+ update_fcr31(); \
if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) { \
- WT2 = FLOAT_QNAN32; \
- WTH2 = FLOAT_QNAN32; \
- } \
+ wt2 = FLOAT_QNAN32; \
+ wth2 = FLOAT_QNAN32; \
+ } \
+ return ((uint64_t)wth2 << 32) | wt2; \
}
+
FLOAT_BINOP(add)
FLOAT_BINOP(sub)
FLOAT_BINOP(mul)
@@ -2502,146 +2677,210 @@ FLOAT_BINOP(div)
#undef FLOAT_BINOP
/* ternary operations */
-#define FLOAT_TERNOP(name1, name2) \
-FLOAT_OP(name1 ## name2, d) \
-{ \
- FDT0 = float64_ ## name1 (FDT0, FDT1, &env->fpu->fp_status); \
- FDT2 = float64_ ## name2 (FDT0, FDT2, &env->fpu->fp_status); \
-} \
-FLOAT_OP(name1 ## name2, s) \
-{ \
- FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \
- FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \
-} \
-FLOAT_OP(name1 ## name2, ps) \
-{ \
- FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \
- FSTH0 = float32_ ## name1 (FSTH0, FSTH1, &env->fpu->fp_status); \
- FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \
- FSTH2 = float32_ ## name2 (FSTH0, FSTH2, &env->fpu->fp_status); \
+#define FLOAT_TERNOP(name1, name2) \
+uint64_t do_float_ ## name1 ## name2 ## _d(uint64_t fdt0, uint64_t fdt1, \
+ uint64_t fdt2) \
+{ \
+ fdt0 = float64_ ## name1 (fdt0, fdt1, &env->fpu->fp_status); \
+ return float64_ ## name2 (fdt0, fdt2, &env->fpu->fp_status); \
+} \
+ \
+uint32_t do_float_ ## name1 ## name2 ## _s(uint32_t fst0, uint32_t fst1, \
+ uint32_t fst2) \
+{ \
+ fst0 = float32_ ## name1 (fst0, fst1, &env->fpu->fp_status); \
+ return float32_ ## name2 (fst0, fst2, &env->fpu->fp_status); \
+} \
+ \
+uint64_t do_float_ ## name1 ## name2 ## _ps(uint64_t fdt0, uint64_t fdt1, \
+ uint64_t fdt2) \
+{ \
+ uint32_t fst0 = fdt0 & 0XFFFFFFFF; \
+ uint32_t fsth0 = fdt0 >> 32; \
+ uint32_t fst1 = fdt1 & 0XFFFFFFFF; \
+ uint32_t fsth1 = fdt1 >> 32; \
+ uint32_t fst2 = fdt2 & 0XFFFFFFFF; \
+ uint32_t fsth2 = fdt2 >> 32; \
+ \
+ fst0 = float32_ ## name1 (fst0, fst1, &env->fpu->fp_status); \
+ fsth0 = float32_ ## name1 (fsth0, fsth1, &env->fpu->fp_status); \
+ fst2 = float32_ ## name2 (fst0, fst2, &env->fpu->fp_status); \
+ fsth2 = float32_ ## name2 (fsth0, fsth2, &env->fpu->fp_status); \
+ return ((uint64_t)fsth2 << 32) | fst2; \
}
+
FLOAT_TERNOP(mul, add)
FLOAT_TERNOP(mul, sub)
#undef FLOAT_TERNOP
/* negated ternary operations */
-#define FLOAT_NTERNOP(name1, name2) \
-FLOAT_OP(n ## name1 ## name2, d) \
-{ \
- FDT0 = float64_ ## name1 (FDT0, FDT1, &env->fpu->fp_status); \
- FDT2 = float64_ ## name2 (FDT0, FDT2, &env->fpu->fp_status); \
- FDT2 = float64_chs(FDT2); \
-} \
-FLOAT_OP(n ## name1 ## name2, s) \
-{ \
- FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \
- FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \
- FST2 = float32_chs(FST2); \
-} \
-FLOAT_OP(n ## name1 ## name2, ps) \
-{ \
- FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \
- FSTH0 = float32_ ## name1 (FSTH0, FSTH1, &env->fpu->fp_status); \
- FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \
- FSTH2 = float32_ ## name2 (FSTH0, FSTH2, &env->fpu->fp_status); \
- FST2 = float32_chs(FST2); \
- FSTH2 = float32_chs(FSTH2); \
+#define FLOAT_NTERNOP(name1, name2) \
+uint64_t do_float_n ## name1 ## name2 ## _d(uint64_t fdt0, uint64_t fdt1, \
+ uint64_t fdt2) \
+{ \
+ fdt0 = float64_ ## name1 (fdt0, fdt1, &env->fpu->fp_status); \
+ fdt2 = float64_ ## name2 (fdt0, fdt2, &env->fpu->fp_status); \
+ return float64_chs(fdt2); \
+} \
+ \
+uint32_t do_float_n ## name1 ## name2 ## _s(uint32_t fst0, uint32_t fst1, \
+ uint32_t fst2) \
+{ \
+ fst0 = float32_ ## name1 (fst0, fst1, &env->fpu->fp_status); \
+ fst2 = float32_ ## name2 (fst0, fst2, &env->fpu->fp_status); \
+ return float32_chs(fst2); \
+} \
+ \
+uint64_t do_float_n ## name1 ## name2 ## _ps(uint64_t fdt0, uint64_t fdt1,\
+ uint64_t fdt2) \
+{ \
+ uint32_t fst0 = fdt0 & 0XFFFFFFFF; \
+ uint32_t fsth0 = fdt0 >> 32; \
+ uint32_t fst1 = fdt1 & 0XFFFFFFFF; \
+ uint32_t fsth1 = fdt1 >> 32; \
+ uint32_t fst2 = fdt2 & 0XFFFFFFFF; \
+ uint32_t fsth2 = fdt2 >> 32; \
+ \
+ fst0 = float32_ ## name1 (fst0, fst1, &env->fpu->fp_status); \
+ fsth0 = float32_ ## name1 (fsth0, fsth1, &env->fpu->fp_status); \
+ fst2 = float32_ ## name2 (fst0, fst2, &env->fpu->fp_status); \
+ fsth2 = float32_ ## name2 (fsth0, fsth2, &env->fpu->fp_status); \
+ fst2 = float32_chs(fst2); \
+ fsth2 = float32_chs(fsth2); \
+ return ((uint64_t)fsth2 << 32) | fst2; \
}
+
FLOAT_NTERNOP(mul, add)
FLOAT_NTERNOP(mul, sub)
#undef FLOAT_NTERNOP
/* MIPS specific binary operations */
-FLOAT_OP(recip2, d)
+uint64_t do_float_recip2_d(uint64_t fdt0, uint64_t fdt2)
{
set_float_exception_flags(0, &env->fpu->fp_status);
- FDT2 = float64_mul(FDT0, FDT2, &env->fpu->fp_status);
- FDT2 = float64_chs(float64_sub(FDT2, FLOAT_ONE64, &env->fpu->fp_status));
+ fdt2 = float64_mul(fdt0, fdt2, &env->fpu->fp_status);
+ fdt2 = float64_chs(float64_sub(fdt2, FLOAT_ONE64, &env->fpu->fp_status));
update_fcr31();
+ return fdt2;
}
-FLOAT_OP(recip2, s)
+
+uint32_t do_float_recip2_s(uint32_t fst0, uint32_t fst2)
{
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = float32_mul(FST0, FST2, &env->fpu->fp_status);
- FST2 = float32_chs(float32_sub(FST2, FLOAT_ONE32, &env->fpu->fp_status));
+ fst2 = float32_mul(fst0, fst2, &env->fpu->fp_status);
+ fst2 = float32_chs(float32_sub(fst2, FLOAT_ONE32, &env->fpu->fp_status));
update_fcr31();
+ return fst2;
}
-FLOAT_OP(recip2, ps)
+
+uint64_t do_float_recip2_ps(uint64_t fdt0, uint64_t fdt2)
{
+ uint32_t fst0 = fdt0 & 0XFFFFFFFF;
+ uint32_t fsth0 = fdt0 >> 32;
+ uint32_t fst2 = fdt2 & 0XFFFFFFFF;
+ uint32_t fsth2 = fdt2 >> 32;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = float32_mul(FST0, FST2, &env->fpu->fp_status);
- FSTH2 = float32_mul(FSTH0, FSTH2, &env->fpu->fp_status);
- FST2 = float32_chs(float32_sub(FST2, FLOAT_ONE32, &env->fpu->fp_status));
- FSTH2 = float32_chs(float32_sub(FSTH2, FLOAT_ONE32, &env->fpu->fp_status));
+ fst2 = float32_mul(fst0, fst2, &env->fpu->fp_status);
+ fsth2 = float32_mul(fsth0, fsth2, &env->fpu->fp_status);
+ fst2 = float32_chs(float32_sub(fst2, FLOAT_ONE32, &env->fpu->fp_status));
+ fsth2 = float32_chs(float32_sub(fsth2, FLOAT_ONE32, &env->fpu->fp_status));
update_fcr31();
+ return ((uint64_t)fsth2 << 32) | fst2;
}
-FLOAT_OP(rsqrt2, d)
+uint64_t do_float_rsqrt2_d(uint64_t fdt0, uint64_t fdt2)
{
set_float_exception_flags(0, &env->fpu->fp_status);
- FDT2 = float64_mul(FDT0, FDT2, &env->fpu->fp_status);
- FDT2 = float64_sub(FDT2, FLOAT_ONE64, &env->fpu->fp_status);
- FDT2 = float64_chs(float64_div(FDT2, FLOAT_TWO64, &env->fpu->fp_status));
+ fdt2 = float64_mul(fdt0, fdt2, &env->fpu->fp_status);
+ fdt2 = float64_sub(fdt2, FLOAT_ONE64, &env->fpu->fp_status);
+ fdt2 = float64_chs(float64_div(fdt2, FLOAT_TWO64, &env->fpu->fp_status));
update_fcr31();
+ return fdt2;
}
-FLOAT_OP(rsqrt2, s)
+
+uint32_t do_float_rsqrt2_s(uint32_t fst0, uint32_t fst2)
{
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = float32_mul(FST0, FST2, &env->fpu->fp_status);
- FST2 = float32_sub(FST2, FLOAT_ONE32, &env->fpu->fp_status);
- FST2 = float32_chs(float32_div(FST2, FLOAT_TWO32, &env->fpu->fp_status));
+ fst2 = float32_mul(fst0, fst2, &env->fpu->fp_status);
+ fst2 = float32_sub(fst2, FLOAT_ONE32, &env->fpu->fp_status);
+ fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, &env->fpu->fp_status));
update_fcr31();
+ return fst2;
}
-FLOAT_OP(rsqrt2, ps)
+
+uint64_t do_float_rsqrt2_ps(uint64_t fdt0, uint64_t fdt2)
{
+ uint32_t fst0 = fdt0 & 0XFFFFFFFF;
+ uint32_t fsth0 = fdt0 >> 32;
+ uint32_t fst2 = fdt2 & 0XFFFFFFFF;
+ uint32_t fsth2 = fdt2 >> 32;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = float32_mul(FST0, FST2, &env->fpu->fp_status);
- FSTH2 = float32_mul(FSTH0, FSTH2, &env->fpu->fp_status);
- FST2 = float32_sub(FST2, FLOAT_ONE32, &env->fpu->fp_status);
- FSTH2 = float32_sub(FSTH2, FLOAT_ONE32, &env->fpu->fp_status);
- FST2 = float32_chs(float32_div(FST2, FLOAT_TWO32, &env->fpu->fp_status));
- FSTH2 = float32_chs(float32_div(FSTH2, FLOAT_TWO32, &env->fpu->fp_status));
+ fst2 = float32_mul(fst0, fst2, &env->fpu->fp_status);
+ fsth2 = float32_mul(fsth0, fsth2, &env->fpu->fp_status);
+ fst2 = float32_sub(fst2, FLOAT_ONE32, &env->fpu->fp_status);
+ fsth2 = float32_sub(fsth2, FLOAT_ONE32, &env->fpu->fp_status);
+ fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, &env->fpu->fp_status));
+ fsth2 = float32_chs(float32_div(fsth2, FLOAT_TWO32, &env->fpu->fp_status));
update_fcr31();
+ return ((uint64_t)fsth2 << 32) | fst2;
}
-FLOAT_OP(addr, ps)
+uint64_t do_float_addr_ps(uint64_t fdt0, uint64_t fdt1)
{
+ uint32_t fst0 = fdt0 & 0XFFFFFFFF;
+ uint32_t fsth0 = fdt0 >> 32;
+ uint32_t fst1 = fdt1 & 0XFFFFFFFF;
+ uint32_t fsth1 = fdt1 >> 32;
+ uint32_t fst2;
+ uint32_t fsth2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = float32_add (FST0, FSTH0, &env->fpu->fp_status);
- FSTH2 = float32_add (FST1, FSTH1, &env->fpu->fp_status);
+ fst2 = float32_add (fst0, fsth0, &env->fpu->fp_status);
+ fsth2 = float32_add (fst1, fsth1, &env->fpu->fp_status);
update_fcr31();
+ return ((uint64_t)fsth2 << 32) | fst2;
}
-FLOAT_OP(mulr, ps)
+uint64_t do_float_mulr_ps(uint64_t fdt0, uint64_t fdt1)
{
+ uint32_t fst0 = fdt0 & 0XFFFFFFFF;
+ uint32_t fsth0 = fdt0 >> 32;
+ uint32_t fst1 = fdt1 & 0XFFFFFFFF;
+ uint32_t fsth1 = fdt1 >> 32;
+ uint32_t fst2;
+ uint32_t fsth2;
+
set_float_exception_flags(0, &env->fpu->fp_status);
- FST2 = float32_mul (FST0, FSTH0, &env->fpu->fp_status);
- FSTH2 = float32_mul (FST1, FSTH1, &env->fpu->fp_status);
+ fst2 = float32_mul (fst0, fsth0, &env->fpu->fp_status);
+ fsth2 = float32_mul (fst1, fsth1, &env->fpu->fp_status);
update_fcr31();
+ return ((uint64_t)fsth2 << 32) | fst2;
}
/* compare operations */
-#define FOP_COND_D(op, cond) \
-void do_cmp_d_ ## op (long cc) \
-{ \
- int c = cond; \
- update_fcr31(); \
- if (c) \
- SET_FP_COND(cc, env->fpu); \
- else \
- CLEAR_FP_COND(cc, env->fpu); \
-} \
-void do_cmpabs_d_ ## op (long cc) \
-{ \
- int c; \
- FDT0 = float64_abs(FDT0); \
- FDT1 = float64_abs(FDT1); \
- c = cond; \
- update_fcr31(); \
- if (c) \
- SET_FP_COND(cc, env->fpu); \
- else \
- CLEAR_FP_COND(cc, env->fpu); \
+#define FOP_COND_D(op, cond) \
+void do_cmp_d_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \
+{ \
+ int c = cond; \
+ update_fcr31(); \
+ if (c) \
+ SET_FP_COND(cc, env->fpu); \
+ else \
+ CLEAR_FP_COND(cc, env->fpu); \
+} \
+void do_cmpabs_d_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \
+{ \
+ int c; \
+ fdt0 = float64_abs(fdt0); \
+ fdt1 = float64_abs(fdt1); \
+ c = cond; \
+ update_fcr31(); \
+ if (c) \
+ SET_FP_COND(cc, env->fpu); \
+ else \
+ CLEAR_FP_COND(cc, env->fpu); \
}
int float64_is_unordered(int sig, float64 a, float64 b STATUS_PARAM)
@@ -2660,46 +2899,46 @@ int float64_is_unordered(int sig, float64 a, float64 b STATUS_PARAM)
/* NOTE: the comma operator will make "cond" to eval to false,
* but float*_is_unordered() is still called. */
-FOP_COND_D(f, (float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status), 0))
-FOP_COND_D(un, float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status))
-FOP_COND_D(eq, !float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status) && float64_eq(FDT0, FDT1, &env->fpu->fp_status))
-FOP_COND_D(ueq, float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status) || float64_eq(FDT0, FDT1, &env->fpu->fp_status))
-FOP_COND_D(olt, !float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status) && float64_lt(FDT0, FDT1, &env->fpu->fp_status))
-FOP_COND_D(ult, float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status) || float64_lt(FDT0, FDT1, &env->fpu->fp_status))
-FOP_COND_D(ole, !float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status) && float64_le(FDT0, FDT1, &env->fpu->fp_status))
-FOP_COND_D(ule, float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status) || float64_le(FDT0, FDT1, &env->fpu->fp_status))
+FOP_COND_D(f, (float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status), 0))
+FOP_COND_D(un, float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status))
+FOP_COND_D(eq, !float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status) && float64_eq(fdt0, fdt1, &env->fpu->fp_status))
+FOP_COND_D(ueq, float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status) || float64_eq(fdt0, fdt1, &env->fpu->fp_status))
+FOP_COND_D(olt, !float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status) && float64_lt(fdt0, fdt1, &env->fpu->fp_status))
+FOP_COND_D(ult, float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status) || float64_lt(fdt0, fdt1, &env->fpu->fp_status))
+FOP_COND_D(ole, !float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status) && float64_le(fdt0, fdt1, &env->fpu->fp_status))
+FOP_COND_D(ule, float64_is_unordered(0, fdt1, fdt0, &env->fpu->fp_status) || float64_le(fdt0, fdt1, &env->fpu->fp_status))
/* NOTE: the comma operator will make "cond" to eval to false,
* but float*_is_unordered() is still called. */
-FOP_COND_D(sf, (float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status), 0))
-FOP_COND_D(ngle,float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status))
-FOP_COND_D(seq, !float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status) && float64_eq(FDT0, FDT1, &env->fpu->fp_status))
-FOP_COND_D(ngl, float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status) || float64_eq(FDT0, FDT1, &env->fpu->fp_status))
-FOP_COND_D(lt, !float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status) && float64_lt(FDT0, FDT1, &env->fpu->fp_status))
-FOP_COND_D(nge, float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status) || float64_lt(FDT0, FDT1, &env->fpu->fp_status))
-FOP_COND_D(le, !float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status) && float64_le(FDT0, FDT1, &env->fpu->fp_status))
-FOP_COND_D(ngt, float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status) || float64_le(FDT0, FDT1, &env->fpu->fp_status))
-
-#define FOP_COND_S(op, cond) \
-void do_cmp_s_ ## op (long cc) \
-{ \
- int c = cond; \
- update_fcr31(); \
- if (c) \
- SET_FP_COND(cc, env->fpu); \
- else \
- CLEAR_FP_COND(cc, env->fpu); \
-} \
-void do_cmpabs_s_ ## op (long cc) \
-{ \
- int c; \
- FST0 = float32_abs(FST0); \
- FST1 = float32_abs(FST1); \
- c = cond; \
- update_fcr31(); \
- if (c) \
- SET_FP_COND(cc, env->fpu); \
- else \
- CLEAR_FP_COND(cc, env->fpu); \
+FOP_COND_D(sf, (float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status), 0))
+FOP_COND_D(ngle,float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status))
+FOP_COND_D(seq, !float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status) && float64_eq(fdt0, fdt1, &env->fpu->fp_status))
+FOP_COND_D(ngl, float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status) || float64_eq(fdt0, fdt1, &env->fpu->fp_status))
+FOP_COND_D(lt, !float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status) && float64_lt(fdt0, fdt1, &env->fpu->fp_status))
+FOP_COND_D(nge, float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status) || float64_lt(fdt0, fdt1, &env->fpu->fp_status))
+FOP_COND_D(le, !float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status) && float64_le(fdt0, fdt1, &env->fpu->fp_status))
+FOP_COND_D(ngt, float64_is_unordered(1, fdt1, fdt0, &env->fpu->fp_status) || float64_le(fdt0, fdt1, &env->fpu->fp_status))
+
+#define FOP_COND_S(op, cond) \
+void do_cmp_s_ ## op (uint32_t fst0, uint32_t fst1, int cc) \
+{ \
+ int c = cond; \
+ update_fcr31(); \
+ if (c) \
+ SET_FP_COND(cc, env->fpu); \
+ else \
+ CLEAR_FP_COND(cc, env->fpu); \
+} \
+void do_cmpabs_s_ ## op (uint32_t fst0, uint32_t fst1, int cc) \
+{ \
+ int c; \
+ fst0 = float32_abs(fst0); \
+ fst1 = float32_abs(fst1); \
+ c = cond; \
+ update_fcr31(); \
+ if (c) \
+ SET_FP_COND(cc, env->fpu); \
+ else \
+ CLEAR_FP_COND(cc, env->fpu); \
}
flag float32_is_unordered(int sig, float32 a, float32 b STATUS_PARAM)
@@ -2718,93 +2957,98 @@ flag float32_is_unordered(int sig, float32 a, float32 b STATUS_PARAM)
/* NOTE: the comma operator will make "cond" to eval to false,
* but float*_is_unordered() is still called. */
-FOP_COND_S(f, (float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status), 0))
-FOP_COND_S(un, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status))
-FOP_COND_S(eq, !float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) && float32_eq(FST0, FST1, &env->fpu->fp_status))
-FOP_COND_S(ueq, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) || float32_eq(FST0, FST1, &env->fpu->fp_status))
-FOP_COND_S(olt, !float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) && float32_lt(FST0, FST1, &env->fpu->fp_status))
-FOP_COND_S(ult, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) || float32_lt(FST0, FST1, &env->fpu->fp_status))
-FOP_COND_S(ole, !float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) && float32_le(FST0, FST1, &env->fpu->fp_status))
-FOP_COND_S(ule, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) || float32_le(FST0, FST1, &env->fpu->fp_status))
+FOP_COND_S(f, (float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status), 0))
+FOP_COND_S(un, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status))
+FOP_COND_S(eq, !float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) && float32_eq(fst0, fst1, &env->fpu->fp_status))
+FOP_COND_S(ueq, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) || float32_eq(fst0, fst1, &env->fpu->fp_status))
+FOP_COND_S(olt, !float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) && float32_lt(fst0, fst1, &env->fpu->fp_status))
+FOP_COND_S(ult, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) || float32_lt(fst0, fst1, &env->fpu->fp_status))
+FOP_COND_S(ole, !float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) && float32_le(fst0, fst1, &env->fpu->fp_status))
+FOP_COND_S(ule, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) || float32_le(fst0, fst1, &env->fpu->fp_status))
/* NOTE: the comma operator will make "cond" to eval to false,
* but float*_is_unordered() is still called. */
-FOP_COND_S(sf, (float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status), 0))
-FOP_COND_S(ngle,float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status))
-FOP_COND_S(seq, !float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) && float32_eq(FST0, FST1, &env->fpu->fp_status))
-FOP_COND_S(ngl, float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) || float32_eq(FST0, FST1, &env->fpu->fp_status))
-FOP_COND_S(lt, !float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) && float32_lt(FST0, FST1, &env->fpu->fp_status))
-FOP_COND_S(nge, float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) || float32_lt(FST0, FST1, &env->fpu->fp_status))
-FOP_COND_S(le, !float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) && float32_le(FST0, FST1, &env->fpu->fp_status))
-FOP_COND_S(ngt, float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) || float32_le(FST0, FST1, &env->fpu->fp_status))
-
-#define FOP_COND_PS(op, condl, condh) \
-void do_cmp_ps_ ## op (long cc) \
-{ \
- int cl = condl; \
- int ch = condh; \
- update_fcr31(); \
- if (cl) \
- SET_FP_COND(cc, env->fpu); \
- else \
- CLEAR_FP_COND(cc, env->fpu); \
- if (ch) \
- SET_FP_COND(cc + 1, env->fpu); \
- else \
- CLEAR_FP_COND(cc + 1, env->fpu); \
-} \
-void do_cmpabs_ps_ ## op (long cc) \
-{ \
- int cl, ch; \
- FST0 = float32_abs(FST0); \
- FSTH0 = float32_abs(FSTH0); \
- FST1 = float32_abs(FST1); \
- FSTH1 = float32_abs(FSTH1); \
- cl = condl; \
- ch = condh; \
- update_fcr31(); \
- if (cl) \
- SET_FP_COND(cc, env->fpu); \
- else \
- CLEAR_FP_COND(cc, env->fpu); \
- if (ch) \
- SET_FP_COND(cc + 1, env->fpu); \
- else \
- CLEAR_FP_COND(cc + 1, env->fpu); \
+FOP_COND_S(sf, (float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status), 0))
+FOP_COND_S(ngle,float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status))
+FOP_COND_S(seq, !float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) && float32_eq(fst0, fst1, &env->fpu->fp_status))
+FOP_COND_S(ngl, float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) || float32_eq(fst0, fst1, &env->fpu->fp_status))
+FOP_COND_S(lt, !float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) && float32_lt(fst0, fst1, &env->fpu->fp_status))
+FOP_COND_S(nge, float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) || float32_lt(fst0, fst1, &env->fpu->fp_status))
+FOP_COND_S(le, !float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) && float32_le(fst0, fst1, &env->fpu->fp_status))
+FOP_COND_S(ngt, float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) || float32_le(fst0, fst1, &env->fpu->fp_status))
+
+#define FOP_COND_PS(op, condl, condh) \
+void do_cmp_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \
+{ \
+ uint32_t fst0 = float32_abs(fdt0 & 0XFFFFFFFF); \
+ uint32_t fsth0 = float32_abs(fdt0 >> 32); \
+ uint32_t fst1 = float32_abs(fdt1 & 0XFFFFFFFF); \
+ uint32_t fsth1 = float32_abs(fdt1 >> 32); \
+ int cl = condl; \
+ int ch = condh; \
+ \
+ update_fcr31(); \
+ if (cl) \
+ SET_FP_COND(cc, env->fpu); \
+ else \
+ CLEAR_FP_COND(cc, env->fpu); \
+ if (ch) \
+ SET_FP_COND(cc + 1, env->fpu); \
+ else \
+ CLEAR_FP_COND(cc + 1, env->fpu); \
+} \
+void do_cmpabs_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \
+{ \
+ uint32_t fst0 = float32_abs(fdt0 & 0XFFFFFFFF); \
+ uint32_t fsth0 = float32_abs(fdt0 >> 32); \
+ uint32_t fst1 = float32_abs(fdt1 & 0XFFFFFFFF); \
+ uint32_t fsth1 = float32_abs(fdt1 >> 32); \
+ int cl = condl; \
+ int ch = condh; \
+ \
+ update_fcr31(); \
+ if (cl) \
+ SET_FP_COND(cc, env->fpu); \
+ else \
+ CLEAR_FP_COND(cc, env->fpu); \
+ if (ch) \
+ SET_FP_COND(cc + 1, env->fpu); \
+ else \
+ CLEAR_FP_COND(cc + 1, env->fpu); \
}
/* NOTE: the comma operator will make "cond" to eval to false,
* but float*_is_unordered() is still called. */
-FOP_COND_PS(f, (float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status), 0),
- (float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status), 0))
-FOP_COND_PS(un, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status),
- float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status))
-FOP_COND_PS(eq, !float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) && float32_eq(FST0, FST1, &env->fpu->fp_status),
- !float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status) && float32_eq(FSTH0, FSTH1, &env->fpu->fp_status))
-FOP_COND_PS(ueq, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) || float32_eq(FST0, FST1, &env->fpu->fp_status),
- float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status) || float32_eq(FSTH0, FSTH1, &env->fpu->fp_status))
-FOP_COND_PS(olt, !float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) && float32_lt(FST0, FST1, &env->fpu->fp_status),
- !float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status) && float32_lt(FSTH0, FSTH1, &env->fpu->fp_status))
-FOP_COND_PS(ult, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) || float32_lt(FST0, FST1, &env->fpu->fp_status),
- float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status) || float32_lt(FSTH0, FSTH1, &env->fpu->fp_status))
-FOP_COND_PS(ole, !float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) && float32_le(FST0, FST1, &env->fpu->fp_status),
- !float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status) && float32_le(FSTH0, FSTH1, &env->fpu->fp_status))
-FOP_COND_PS(ule, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) || float32_le(FST0, FST1, &env->fpu->fp_status),
- float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status) || float32_le(FSTH0, FSTH1, &env->fpu->fp_status))
+FOP_COND_PS(f, (float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status), 0),
+ (float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status), 0))
+FOP_COND_PS(un, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status),
+ float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status))
+FOP_COND_PS(eq, !float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) && float32_eq(fst0, fst1, &env->fpu->fp_status),
+ !float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status) && float32_eq(fsth0, fsth1, &env->fpu->fp_status))
+FOP_COND_PS(ueq, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) || float32_eq(fst0, fst1, &env->fpu->fp_status),
+ float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status) || float32_eq(fsth0, fsth1, &env->fpu->fp_status))
+FOP_COND_PS(olt, !float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) && float32_lt(fst0, fst1, &env->fpu->fp_status),
+ !float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status) && float32_lt(fsth0, fsth1, &env->fpu->fp_status))
+FOP_COND_PS(ult, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) || float32_lt(fst0, fst1, &env->fpu->fp_status),
+ float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status) || float32_lt(fsth0, fsth1, &env->fpu->fp_status))
+FOP_COND_PS(ole, !float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) && float32_le(fst0, fst1, &env->fpu->fp_status),
+ !float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status) && float32_le(fsth0, fsth1, &env->fpu->fp_status))
+FOP_COND_PS(ule, float32_is_unordered(0, fst1, fst0, &env->fpu->fp_status) || float32_le(fst0, fst1, &env->fpu->fp_status),
+ float32_is_unordered(0, fsth1, fsth0, &env->fpu->fp_status) || float32_le(fsth0, fsth1, &env->fpu->fp_status))
/* NOTE: the comma operator will make "cond" to eval to false,
* but float*_is_unordered() is still called. */
-FOP_COND_PS(sf, (float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status), 0),
- (float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status), 0))
-FOP_COND_PS(ngle,float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status),
- float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status))
-FOP_COND_PS(seq, !float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) && float32_eq(FST0, FST1, &env->fpu->fp_status),
- !float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status) && float32_eq(FSTH0, FSTH1, &env->fpu->fp_status))
-FOP_COND_PS(ngl, float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) || float32_eq(FST0, FST1, &env->fpu->fp_status),
- float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status) || float32_eq(FSTH0, FSTH1, &env->fpu->fp_status))
-FOP_COND_PS(lt, !float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) && float32_lt(FST0, FST1, &env->fpu->fp_status),
- !float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status) && float32_lt(FSTH0, FSTH1, &env->fpu->fp_status))
-FOP_COND_PS(nge, float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) || float32_lt(FST0, FST1, &env->fpu->fp_status),
- float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status) || float32_lt(FSTH0, FSTH1, &env->fpu->fp_status))
-FOP_COND_PS(le, !float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) && float32_le(FST0, FST1, &env->fpu->fp_status),
- !float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status) && float32_le(FSTH0, FSTH1, &env->fpu->fp_status))
-FOP_COND_PS(ngt, float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) || float32_le(FST0, FST1, &env->fpu->fp_status),
- float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status) || float32_le(FSTH0, FSTH1, &env->fpu->fp_status))
+FOP_COND_PS(sf, (float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status), 0),
+ (float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status), 0))
+FOP_COND_PS(ngle,float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status),
+ float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status))
+FOP_COND_PS(seq, !float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) && float32_eq(fst0, fst1, &env->fpu->fp_status),
+ !float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status) && float32_eq(fsth0, fsth1, &env->fpu->fp_status))
+FOP_COND_PS(ngl, float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) || float32_eq(fst0, fst1, &env->fpu->fp_status),
+ float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status) || float32_eq(fsth0, fsth1, &env->fpu->fp_status))
+FOP_COND_PS(lt, !float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) && float32_lt(fst0, fst1, &env->fpu->fp_status),
+ !float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status) && float32_lt(fsth0, fsth1, &env->fpu->fp_status))
+FOP_COND_PS(nge, float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) || float32_lt(fst0, fst1, &env->fpu->fp_status),
+ float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status) || float32_lt(fsth0, fsth1, &env->fpu->fp_status))
+FOP_COND_PS(le, !float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) && float32_le(fst0, fst1, &env->fpu->fp_status),
+ !float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status) && float32_le(fsth0, fsth1, &env->fpu->fp_status))
+FOP_COND_PS(ngt, float32_is_unordered(1, fst1, fst0, &env->fpu->fp_status) || float32_le(fst0, fst1, &env->fpu->fp_status),
+ float32_is_unordered(1, fsth1, fsth0, &env->fpu->fp_status) || float32_le(fsth0, fsth1, &env->fpu->fp_status))