OSDN Git Service

* config/xtensa/xtensa.md (adddi3): Don't clobber source operand used
authorbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Mar 2003 20:50:24 +0000 (20:50 +0000)
committerbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Mar 2003 20:50:24 +0000 (20:50 +0000)
        to detect carry.
        (subdi3): Reorder emitted instructions.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@64262 138bc75d-0d04-0410-961f-82ee72b054a4

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

index be8cc2c..9a3a8e6 100644 (file)
@@ -1,3 +1,9 @@
+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  Andreas Jaeger  <aj@suse.de>
 
        * config/i386/netbsd64.h (TARGET_OS_CPP_BUILTINS): Remove call to
index cbda342..cc722b9 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;
 }")