2008-05-08 Paolo Bonzini <bonzini@gnu.org>
authordje <dje@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 May 2008 16:35:56 +0000 (16:35 +0000)
committerdje <dje@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 May 2008 16:35:56 +0000 (16:35 +0000)
        PR target/36090
        * simplify-rtx.c (simplify_plus_minus): Create CONST of
        similar RTX_CONST_OBJ before CONST_INT.

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

gcc/ChangeLog
gcc/simplify-rtx.c

index f87e063..7ac7cd2 100644 (file)
@@ -1,3 +1,9 @@
+2008-05-08  Paolo Bonzini  <bonzini@gnu.org>
+
+       PR target/36090
+       * simplify-rtx.c (simplify_plus_minus): Create CONST of
+       similar RTX_CONST_OBJ before CONST_INT.
+
 2008-05-08  Steve Ellcey  <sje@cup.hp.com>
 
        * stmt.c (expand_stack_restore): Change sa mode if needed.
index 44f3ef5..15e4c2a 100644 (file)
@@ -3674,6 +3674,24 @@ simplify_plus_minus (enum rtx_code code, enum machine_mode mode, rtx op0,
      one CONST_INT, and the sort will have ensured that it is last
      in the array and that any other constant will be next-to-last.  */
 
+  if (GET_CODE (ops[n_ops - 1].op) == CONST_INT)
+    i = n_ops - 2;
+  else
+    i = n_ops - 1;
+
+  if (i >= 1
+      && ops[i].neg
+      && !ops[i - 1].neg
+      && CONSTANT_P (ops[i].op)
+      && GET_CODE (ops[i].op) == GET_CODE (ops[i - 1].op))
+    {
+      ops[i - 1].op = gen_rtx_MINUS (mode, ops[i - 1].op, ops[i].op);
+      ops[i - 1].op = gen_rtx_CONST (mode, ops[i - 1].op);
+      if (i < n_ops - 1)
+       ops[i] = ops[i + 1];
+      n_ops--;
+    }
+
   if (n_ops > 1
       && GET_CODE (ops[n_ops - 1].op) == CONST_INT
       && CONSTANT_P (ops[n_ops - 2].op))