From: Bob Wilson Date: Wed, 12 Mar 2003 21:11:40 +0000 (+0000) Subject: xtensa.md (adddi3): Don't clobber source operand used to detect carry. X-Git-Tag: releases/gcc-3.2.3~121 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1efede7e34d717598d51a4cf4e7c7183c43503a0;p=thirdparty%2Fgcc.git xtensa.md (adddi3): Don't clobber source operand used to detect carry. * config/xtensa/xtensa.md (adddi3): Don't clobber source operand used to detect carry. (subdi3): Reorder emitted instructions. From-SVN: r64265 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4fecda4cae93..e663fe339871 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2003-03-12 Bob Wilson + + Backport from mainline: + 2003-03-12 Bob Wilson + + * config/xtensa/xtensa.md (adddi3): Don't clobber source operand used + to detect carry. + (subdi3): Reorder emitted instructions. + 2003-03-12 Eric Botcazou PR c/9928 diff --git a/gcc/config/xtensa/xtensa.md b/gcc/config/xtensa/xtensa.md index 55bfd0b8377f..7e801b4c9530 100644 --- a/gcc/config/xtensa/xtensa.md +++ b/gcc/config/xtensa/xtensa.md @@ -97,6 +97,7 @@ "" " { + rtx srclo; rtx dstlo = gen_lowpart (SImode, operands[0]); rtx src1lo = gen_lowpart (SImode, operands[1]); rtx src2lo = gen_lowpart (SImode, operands[2]); @@ -105,9 +106,21 @@ rtx src1hi = gen_highpart (SImode, operands[1]); rtx src2hi = gen_highpart (SImode, operands[2]); + /* Either source can be used for overflow checking, as long as it's + not clobbered by the first addition. */ + if (!rtx_equal_p (dstlo, src1lo)) + srclo = src1lo; + else if (!rtx_equal_p (dstlo, src2lo)) + srclo = src2lo; + else + { + srclo = gen_reg_rtx (SImode); + emit_move_insn (srclo, src1lo); + } + emit_insn (gen_addsi3 (dstlo, src1lo, src2lo)); emit_insn (gen_addsi3 (dsthi, src1hi, src2hi)); - emit_insn (gen_adddi_carry (dsthi, dstlo, src2lo)); + emit_insn (gen_adddi_carry (dsthi, dstlo, srclo)); DONE; }") @@ -209,9 +222,9 @@ rtx src1hi = gen_highpart (SImode, operands[1]); rtx src2hi = gen_highpart (SImode, operands[2]); - emit_insn (gen_subsi3 (dstlo, src1lo, src2lo)); emit_insn (gen_subsi3 (dsthi, src1hi, src2hi)); emit_insn (gen_subdi_carry (dsthi, src1lo, src2lo)); + emit_insn (gen_subsi3 (dstlo, src1lo, src2lo)); DONE; }")