Hi, I come back on some patches as I've been able to test some instructions using RISU.
Le 01/11/2016 à 21:03, Laurent Vivier a écrit : ... > --- a/target-m68k/op_helper.c > +++ b/target-m68k/op_helper.c > @@ -179,51 +184,178 @@ void HELPER(raise_exception)(CPUM68KState *env, > uint32_t tt) > raise_exception(env, tt); > } > > -void HELPER(divu)(CPUM68KState *env, uint32_t word) > +void HELPER(divuw)(CPUM68KState *env, int destr, uint32_t den) > { > - uint32_t num; > - uint32_t den; > - uint32_t quot; > - uint32_t rem; > + uint32_t num = env->dregs[destr]; > + uint32_t quot, rem; > > - num = env->div1; > - den = env->div2; > - /* ??? This needs to make sure the throwing location is accurate. */ > if (den == 0) { > - raise_exception(env, EXCP_DIV0); > + raise_exception_ra(env, EXCP_DIV0, GETPC()); > } > quot = num / den; > rem = num % den; > > - env->cc_v = (word && quot > 0xffff ? -1 : 0); > + env->cc_c = 0; /* always cleared, even if overflow */ > + if (quot > 0xffff) { > + env->cc_v = -1; > + /* nothing else is modified */ > + /* real 68040 keeps Z and N on overflow, > + * whereas documentation says "undefined" > + */ > + return; > + } > + env->dregs[destr] = deposit32(quot, 16, 16, rem); > env->cc_z = quot; > env->cc_n = quot; quot is here a 32bit, but the result is only the 16 lower bits, so I think we should have env->cc_z = (int16_t)quot; env->cc_n = (int16_t)quot; > + env->cc_v = 0; > +} > + > +void HELPER(divsw)(CPUM68KState *env, int destr, int32_t den) > +{ > + int32_t num = env->dregs[destr]; > + uint32_t quot, rem; > + > + if (den == 0) { > + raise_exception_ra(env, EXCP_DIV0, GETPC()); > + } > + quot = num / den; > + rem = num % den; > + > + env->cc_c = 0; /* always cleared, even if overflow */ > + if (quot != (int16_t)quot) { > + env->cc_v = -1; > + /* nothing else is modified */ > + /* real 68040 keeps Z and N on overflow, > + * whereas documentation says "undefined" > + */ > + return; > + } > + env->dregs[destr] = deposit32(quot, 16, 16, rem); > + env->cc_z = quot; > + env->cc_n = quot; Same here: env->cc_z = (int16_t)quot; env->cc_n = (int16_t)quot; Thanks, Laurent