From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:52828) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TLykW-0005jl-J3 for qemu-devel@nongnu.org; Wed, 10 Oct 2012 12:03:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TLykQ-0007f7-EE for qemu-devel@nongnu.org; Wed, 10 Oct 2012 12:03:08 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:50072) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TLykQ-0007dV-76 for qemu-devel@nongnu.org; Wed, 10 Oct 2012 12:03:02 -0400 Received: by mail-pb0-f45.google.com with SMTP id rp2so850961pbb.4 for ; Wed, 10 Oct 2012 09:03:01 -0700 (PDT) Sender: Richard Henderson From: Richard Henderson Date: Wed, 10 Oct 2012 09:02:41 -0700 Message-Id: <1349884967-4608-8-git-send-email-rth@twiddle.net> In-Reply-To: <1349884967-4608-1-git-send-email-rth@twiddle.net> References: <1349884967-4608-1-git-send-email-rth@twiddle.net> Subject: [Qemu-devel] [PATCH 07/13] tcg-sparc: Fix add2/sub2 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Blue Swirl We must care not to clobber the high parts before we consume them. Signed-off-by: Richard Henderson --- tcg/sparc/tcg-target.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c index 31e8204..d6da9fa 100644 --- a/tcg/sparc/tcg-target.c +++ b/tcg/sparc/tcg-target.c @@ -704,6 +704,22 @@ static void tcg_out_setcond2_i32(TCGContext *s, TCGCond cond, TCGArg ret, break; } } + +static void tcg_out_addsub2(TCGContext *s, TCGArg rl, TCGArg rh, + TCGArg al, TCGArg ah, TCGArg bl, int blconst, + TCGArg bh, int bhconst, int opl, int oph) +{ + TCGArg tmp = TCG_REG_T1; + + /* Note that the low parts are fully consumed before tmp is set. */ + if (rl != ah && (bhconst || rl != bh)) { + tmp = rl; + } + + tcg_out_arithc(s, tmp, al, bl, blconst, opl); + tcg_out_arithc(s, rh, ah, bh, bhconst, oph); + tcg_out_mov(s, TCG_TYPE_I32, rl, tmp); +} #endif /* Generate global QEMU prologue and epilogue code */ @@ -1243,16 +1259,14 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, args[4], const_args[4]); break; case INDEX_op_add2_i32: - tcg_out_arithc(s, args[0], args[2], args[4], const_args[4], - ARITH_ADDCC); - tcg_out_arithc(s, args[1], args[3], args[5], const_args[5], - ARITH_ADDX); + tcg_out_addsub2(s, args[0], args[1], args[2], args[3], + args[4], const_args[4], args[5], const_args[5], + ARITH_ADDCC, ARITH_ADDX); break; case INDEX_op_sub2_i32: - tcg_out_arithc(s, args[0], args[2], args[4], const_args[4], - ARITH_SUBCC); - tcg_out_arithc(s, args[1], args[3], args[5], const_args[5], - ARITH_SUBX); + tcg_out_addsub2(s, args[0], args[1], args[2], args[3], + args[4], const_args[4], args[5], const_args[5], + ARITH_SUBCC, ARITH_SUBX); break; case INDEX_op_mulu2_i32: tcg_out_arithc(s, args[0], args[2], args[3], const_args[3], -- 1.7.11.4