uint32_t helper_fsqrt(CPUMBState *env, uint32_t a) { CPU_FloatU fd, fa; int flags; set_float_exception_flags(0, &env->fp_status); fa.l = a; fd.l = float32_sqrt(fa.f, &env->fp_status); flags = get_float_exception_flags(&env->fp_status); update_fpu_flags(env, flags); return fd.l; }
uint32_t helper_fcmp_gt(CPUMBState *env, uint32_t a, uint32_t b) { CPU_FloatU fa, fb; int flags, r; fa.l = a; fb.l = b; set_float_exception_flags(0, &env->fp_status); r = float32_lt(fa.f, fb.f, &env->fp_status); flags = get_float_exception_flags(&env->fp_status); update_fpu_flags(env, flags & float_flag_invalid); return r; }
uint32_t helper_frsub(CPUMBState *env, uint32_t a, uint32_t b) { CPU_FloatU fd, fa, fb; int flags; set_float_exception_flags(0, &env->fp_status); fa.l = a; fb.l = b; fd.f = float32_sub(fb.f, fa.f, &env->fp_status); flags = get_float_exception_flags(&env->fp_status); update_fpu_flags(env, flags); return fd.l; }
uint32_t helper_fint(CPUMBState *env, uint32_t a) { CPU_FloatU fa; uint32_t r; int flags; set_float_exception_flags(0, &env->fp_status); fa.l = a; r = float32_to_int32(fa.f, &env->fp_status); flags = get_float_exception_flags(&env->fp_status); update_fpu_flags(env, flags); return r; }
uint32_t helper_fcmp_ne(uint32_t a, uint32_t b) { CPU_FloatU fa, fb; int flags, r; fa.l = a; fb.l = b; set_float_exception_flags(0, &env->fp_status); r = !float32_eq_quiet(fa.f, fb.f, &env->fp_status); flags = get_float_exception_flags(&env->fp_status); update_fpu_flags(flags & float_flag_invalid); return r; }
uint32_t helper_fmul(uint32_t a, uint32_t b) { CPU_FloatU fd, fa, fb; int flags; set_float_exception_flags(0, &env->fp_status); fa.l = a; fb.l = b; fd.f = float32_mul(fa.f, fb.f, &env->fp_status); flags = get_float_exception_flags(&env->fp_status); update_fpu_flags(flags); return fd.l; }
static uint32_t soft_to_fpcr_exc(CPUAlphaState *env) { uint8_t exc = get_float_exception_flags(&FP_STATUS); uint32_t ret = 0; if (unlikely(exc)) { set_float_exception_flags(0, &FP_STATUS); ret |= CONVERT_BIT(exc, float_flag_invalid, FPCR_INV); ret |= CONVERT_BIT(exc, float_flag_divbyzero, FPCR_DZE); ret |= CONVERT_BIT(exc, float_flag_overflow, FPCR_OVF); ret |= CONVERT_BIT(exc, float_flag_underflow, FPCR_UNF); ret |= CONVERT_BIT(exc, float_flag_inexact, FPCR_INE); } return ret; }
static void update_fpscr(void *retaddr) { int xcpt, cause, enable; xcpt = get_float_exception_flags(&env->fp_status); /* Clear the flag entries */ env->fpscr &= ~FPSCR_FLAG_MASK; if (unlikely(xcpt)) { if (xcpt & float_flag_invalid) { env->fpscr |= FPSCR_FLAG_V; } if (xcpt & float_flag_divbyzero) { env->fpscr |= FPSCR_FLAG_Z; } if (xcpt & float_flag_overflow) { env->fpscr |= FPSCR_FLAG_O; } if (xcpt & float_flag_underflow) { env->fpscr |= FPSCR_FLAG_U; } if (xcpt & float_flag_inexact) { env->fpscr |= FPSCR_FLAG_I; } /* Accumulate in cause entries */ env->fpscr |= (env->fpscr & FPSCR_FLAG_MASK) << (FPSCR_CAUSE_SHIFT - FPSCR_FLAG_SHIFT); /* Generate an exception if enabled */ cause = (env->fpscr & FPSCR_CAUSE_MASK) >> FPSCR_CAUSE_SHIFT; enable = (env->fpscr & FPSCR_ENABLE_MASK) >> FPSCR_ENABLE_SHIFT; if (cause & enable) { cpu_restore_state_from_retaddr(retaddr); env->exception_index = 0x120; cpu_loop_exit(env); } } }
static void update_fpscr(CPUSH4State *env, uintptr_t retaddr) { int xcpt, cause, enable; xcpt = get_float_exception_flags(&env->fp_status); /* Clear the flag entries */ env->fpscr &= ~FPSCR_FLAG_MASK; if (unlikely(xcpt)) { if (xcpt & float_flag_invalid) { env->fpscr |= FPSCR_FLAG_V; } if (xcpt & float_flag_divbyzero) { env->fpscr |= FPSCR_FLAG_Z; } if (xcpt & float_flag_overflow) { env->fpscr |= FPSCR_FLAG_O; } if (xcpt & float_flag_underflow) { env->fpscr |= FPSCR_FLAG_U; } if (xcpt & float_flag_inexact) { env->fpscr |= FPSCR_FLAG_I; } /* Accumulate in cause entries */ env->fpscr |= (env->fpscr & FPSCR_FLAG_MASK) << (FPSCR_CAUSE_SHIFT - FPSCR_FLAG_SHIFT); /* Generate an exception if enabled */ cause = (env->fpscr & FPSCR_CAUSE_MASK) >> FPSCR_CAUSE_SHIFT; enable = (env->fpscr & FPSCR_ENABLE_MASK) >> FPSCR_ENABLE_SHIFT; if (cause & enable) { raise_exception(env, 0x120, retaddr); } } }
uint32_t helper_fp_exc_get(CPUAlphaState *env) { return get_float_exception_flags(&FP_STATUS); }