On 08/09/2015 01:13 PM, Laurent Vivier wrote:
> Signed-off-by: Laurent Vivier <[email protected]>
> ---
> target-m68k/helper.c | 91
> +++++++++++++++++++++++++++++++++++++++++++++++++
> target-m68k/helper.h | 3 ++
> target-m68k/translate.c | 82 ++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 176 insertions(+)
>
> diff --git a/target-m68k/helper.c b/target-m68k/helper.c
> index 8c10fbc..f4be52b 100644
> --- a/target-m68k/helper.c
> +++ b/target-m68k/helper.c
> @@ -938,3 +938,94 @@ void HELPER(set_mac_extu)(CPUM68KState *env, uint32_t
> val, uint32_t acc)
> res |= (uint64_t)(val & 0xffff0000) << 16;
> env->macc[acc + 1] = res;
> }
> +
> +uint32_t HELPER(abcd_cc)(CPUM68KState *env, uint32_t src, uint32_t dest)
> +{
> + uint16_t hi, lo;
> + uint16_t res;
> + uint32_t flags;
> + int extend = 0;
> +
> + flags = env->cc_dest;
> + flags &= ~CCF_C;
> +
> + lo = (src & 0x0f) + (dest & 0x0f);
> + if (env->cc_x) {
> + lo++;
> + }
A nit: Since CC_X == 0 or 1, you can just add it.
> +uint32_t HELPER(sbcd_cc)(CPUM68KState *env, uint32_t src, uint32_t dest)
> +{
> + uint16_t hi, lo;
> + uint16_t res;
> + uint32_t flags;
> + int bcd = 0, carry = 0, extend = 0;
> +
> + flags = env->cc_dest;
> + flags &= CCF_C;
> +
> + if (env->cc_x) {
> + carry = 1;
> + }
Likewise with subtracting it. carry == env->cc_x.
> +DISAS_INSN(nbcd)
> +{
> + TCGv dest;
> + TCGv addr;
> +
> + SRC_EA(env, dest, OS_BYTE, -1, &addr);
> +
> + gen_flush_flags(s);
> + gen_helper_sbcd_cc(dest, cpu_env, dest, tcg_const_i32(0));
Free the zero temp.
r~