@@ -2621,9 +2621,23 @@ uint64_t helper_float_cvtl_d(CPUMIPSState *env, uint64_t
fdt0)
uint64_t dt2;
dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status);
- if (get_float_exception_flags(&env->active_fpu.fp_status)
- & (float_flag_invalid | float_flag_overflow)) {
- dt2 = FP_TO_INT64_OVERFLOW;
+ if (env->active_fpu.fcr31 & (1 << FCR31_NAN2008)) {
+ if (get_float_exception_flags(&env->active_fpu.fp_status)
+ & (float_flag_invalid | float_flag_overflow)) {
+ if (float64_is_any_nan(fdt0)) {
+ dt2 = 0;
+ } else {
+ if (float64_is_neg(fdt0))
+ dt2 = INT64_MIN;
+ else
+ dt2 = INT64_MAX;
+ }
+ }
+ } else {
+ if (get_float_exception_flags(&env->active_fpu.fp_status)
+ & (float_flag_invalid | float_flag_overflow)) {
+ dt2 = FP_TO_INT64_OVERFLOW;
+ }
+uint64_t helper_float_abs_d(CPUMIPSState *env, uint64_t fdt0)
+{
+ uint64_t fdt1;
+
+ if (env->active_fpu.fcr31 & (1 << FCR31_ABS2008)) {
+ fdt1 = float64_abs(fdt0);
+ } else {
+ if (float64_is_neg(fdt0)) {
+ fdt1 = float64_sub(0, fdt0, &env->active_fpu.fp_status);
+ } else {
+ fdt1 = float64_add(0, fdt0, &env->active_fpu.fp_status);
+ }
+ update_fcr31(env, GETPC());