On 23 March 2014 18:02, Tom Musta <tommu...@gmail.com> wrote: > diff --git a/target-ppc/fpu_helper.c b/target-ppc/fpu_helper.c > index e7f3295..ccfc5cc 100644 > --- a/target-ppc/fpu_helper.c > +++ b/target-ppc/fpu_helper.c > @@ -2558,10 +2558,14 @@ void helper_##op(CPUPPCState *env, uint32_t opcode) > \ > fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXCVI, 0); > \ > xt.tfld = rnan; > \ > } else { > \ > + /* force round to zero mode (truncation) */ > \ > + set_float_rounding_mode(float_round_to_zero, &env->fp_status); > \ > xt.tfld = stp##_to_##ttp(xb.sfld, &env->fp_status); > \ > if (env->fp_status.float_exception_flags & float_flag_invalid) { > \ > fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXCVI, 0); > \ > } > \
If we raise a CPU exception here (via helper_raise_exception_err()) we'll longjmp out of here and never restore the rounding mode. So the restoring of the rounding mode needs to happen before we check for exceptions here. > + /* restore rounding mode from FPSCR */ > \ > + fpscr_set_rounding_mode(env); > \ > } > \ > } > \ > > \ thanks -- PMM