On 03/01/2016 08:24 AM, Bastian Koppelmann wrote: > Signed-off-by: Bastian Koppelmann <kbast...@mail.uni-paderborn.de> > --- > target-tricore/fpu_helper.c | 29 +++++++++++++++++++++++++++++ > target-tricore/helper.h | 1 + > target-tricore/translate.c | 3 +++ > 3 files changed, 33 insertions(+) > > diff --git a/target-tricore/fpu_helper.c b/target-tricore/fpu_helper.c > index ee8b687..ceda415 100644 > --- a/target-tricore/fpu_helper.c > +++ b/target-tricore/fpu_helper.c > @@ -171,3 +171,32 @@ uint32_t helper_fdiv(CPUTriCoreState *env, uint32_t r1, > uint32_t r2) > f_update_psw_flags(env, true); > return (uint32_t)f_result; > } > + > +uint32_t helper_fcmp(CPUTriCoreState *env, uint32_t r1, uint32_t r2) > +{ > + uint32_t result = 0; > + uint32_t lt, eq, uo; > + float32 arg1 = make_float32(r1); > + float32 arg2 = make_float32(r2); > + > + set_flush_inputs_to_zero(0, &env->fp_status); > + > + lt = float32_lt_quiet(arg1, arg2, &env->fp_status); > + eq = float32_eq_quiet(arg1, arg2, &env->fp_status); > + uo = float32_unordered(arg1, arg2, &env->fp_status);
Do it in one step with float32_compare. You don't want _quiet; see below re psw_flags. > + env->FPU_FS = 0; > + if (float32_is_signaling_nan(arg1) || float32_is_signaling_nan(arg2)) { > + env->FPU_FI = (1 << 31); > + env->FPU_FS = 1; > + } > + > + return result; If you return flush_inputs_to_zero to 1 here, you don't have to zero it on all other fp operations. Why aren't you using the same f_update_psw_flags function? The only bit that compare can set is invalid anyway. r~