On 10/09/2012 01:27 PM, Aurelien Jarno wrote: > - return float64_sqrt(fdt0, &env->active_fpu.fp_status); > + set_float_exception_flags(0, &env->active_fpu.fp_status); > + fdt0 = float64_sqrt(fdt0, &env->active_fpu.fp_status); > + update_fcr31(env); > + return fdt0;
While accurate, I can't help but think there'd be less memory traffic if the invariant "fp_status == 0" is maintained between insns. Thus you don't need to reset the flags to 0 in each insn, merely change static inline void update_fcr31(CPUMIPSState *env) { int tmp = ieee_ex_to_mips(get_float_exception_flags(&env->active_fpu.fp_status)); if (tmp) { set_float_exception_flags(0, &env->active_fpu.fp_status); SET_FP_CAUSE(env->active_fpu.fcr31, tmp); if (GET_FP_ENABLE(env->active_fpu.fcr31) & tmp) { helper_raise_exception(env, EXCP_FPE); } else { UPDATE_FP_FLAGS(env->active_fpu.fcr31, tmp); } } } I'll also note that we don't get the proper PC for the trap there. We don't save the PC in the translator before the insn, or, more properly invoke do_restore_state. That clearly ought to be a separate change, however. r~