From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48688) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZPaH0-0002h9-FQ for qemu-devel@nongnu.org; Wed, 12 Aug 2015 13:57:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZPaGw-0005XQ-FP for qemu-devel@nongnu.org; Wed, 12 Aug 2015 13:57:10 -0400 Received: from mail-qg0-x233.google.com ([2607:f8b0:400d:c04::233]:35981) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZPaGw-0005Wq-A9 for qemu-devel@nongnu.org; Wed, 12 Aug 2015 13:57:06 -0400 Received: by qgdd90 with SMTP id d90so15660457qgd.3 for ; Wed, 12 Aug 2015 10:57:05 -0700 (PDT) Sender: Richard Henderson References: <1439151229-27747-1-git-send-email-laurent@vivier.eu> <1439151229-27747-26-git-send-email-laurent@vivier.eu> From: Richard Henderson Message-ID: <55CB88EE.6050407@twiddle.net> Date: Wed, 12 Aug 2015 10:57:02 -0700 MIME-Version: 1.0 In-Reply-To: <1439151229-27747-26-git-send-email-laurent@vivier.eu> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH for-2.5 25/30] m68k: add abcd, sbcd, nbcd instructions List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Laurent Vivier , qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, Andreas Schwab , gerg@uclinux.org On 08/09/2015 01:13 PM, Laurent Vivier wrote: > Signed-off-by: Laurent Vivier > --- > 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~