i386.c (ix86_split_long_move): When optimizing for size...
authorRoger Sayle <roger@eyesopen.com>
Fri, 10 Sep 2004 02:29:57 +0000 (02:29 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Fri, 10 Sep 2004 02:29:57 +0000 (02:29 +0000)
* config/i386/i386.c (ix86_split_long_move): When optimizing for
size, and the low and high parts of a DImode constant are equal,
copy one register to another instead of loading the same immediate
value twice.

From-SVN: r87270

gcc/ChangeLog
gcc/config/i386/i386.c

index 0d8f266ee918a745933e7d31470b7fbe690b1081..06bef510120926047f2fd49df07cb6c9c6850432 100644 (file)
@@ -1,3 +1,10 @@
+2004-09-09  Roger Sayle  <roger@eyesopen.com>
+
+       * config/i386/i386.c (ix86_split_long_move): When optimizing for
+       size, and the low and high parts of a DImode constant are equal,
+       copy one register to another instead of loading the same immediate
+       value twice.
+
 2004-09-09  Richard Henderson  <rth@redhat.com>
 
        PR middle-end/17367
index 25fa8d821ae85b43793185dd63e8cc82e79bd60e..2a175452a190fc275404bb6a4495e79987d83e23 100644 (file)
@@ -9938,6 +9938,33 @@ ix86_split_long_move (rtx operands[])
          operands[6] = part[1][1];
        }
     }
+
+  /* If optimizing for size, attempt to locally unCSE non-zero constants.  */
+  if (optimize_size)
+    {
+      if (GET_CODE (operands[5]) == CONST_INT
+         && operands[5] != const0_rtx
+         && REG_P (operands[2]))
+       {
+         if (GET_CODE (operands[6]) == CONST_INT
+             && INTVAL (operands[6]) == INTVAL (operands[5]))
+           operands[6] = operands[2];
+
+         if (nparts == 3
+             && GET_CODE (operands[7]) == CONST_INT
+             && INTVAL (operands[7]) == INTVAL (operands[5]))
+           operands[7] = operands[2];
+       }
+
+      if (nparts == 3
+         && GET_CODE (operands[6]) == CONST_INT
+         && operands[6] != const0_rtx
+         && REG_P (operands[3])
+         && GET_CODE (operands[7]) == CONST_INT
+         && INTVAL (operands[7]) == INTVAL (operands[6]))
+       operands[7] = operands[3];
+    }
+
   emit_move_insn (operands[2], operands[5]);
   emit_move_insn (operands[3], operands[6]);
   if (nparts == 3)