]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
xtensa.md (adddi3): Don't clobber source operand used to detect carry.
authorBob Wilson <bob.wilson@acm.org>
Wed, 12 Mar 2003 21:11:40 +0000 (21:11 +0000)
committerBob Wilson <bwilson@gcc.gnu.org>
Wed, 12 Mar 2003 21:11:40 +0000 (21:11 +0000)
        * config/xtensa/xtensa.md (adddi3): Don't clobber source operand used
        to detect carry.
        (subdi3): Reorder emitted instructions.

From-SVN: r64265

gcc/ChangeLog
gcc/config/xtensa/xtensa.md

index 4fecda4cae93fe9a73b5ed768d71aab5224b05fa..e663fe33987170b9182a876bbf504ab4de077f1c 100644 (file)
@@ -1,3 +1,12 @@
+2003-03-12  Bob Wilson  <bob.wilson@acm.org>
+
+       Backport from mainline:
+       2003-03-12  Bob Wilson  <bob.wilson@acm.org>
+
+       * config/xtensa/xtensa.md (adddi3): Don't clobber source operand used
+       to detect carry.
+       (subdi3): Reorder emitted instructions.
+
 2003-03-12  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        PR c/9928
index 55bfd0b8377f153eb2ed273f3d92ce41b02bc09b..7e801b4c95309ad13e2e873836d14a3d8f3e0635 100644 (file)
@@ -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]);
   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;
 }")
 
   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;
 }")