re PR target/37878 (PPC64 ldu command generated with invalid offset)
authorDavid Edelsohn <edelsohn@gnu.org>
Wed, 29 Oct 2008 23:33:02 +0000 (23:33 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Wed, 29 Oct 2008 23:33:02 +0000 (19:33 -0400)
        PR target/37878
        * config/rs6000/predicates.md (word_offset_memref_operand):
        Restructure code and look inside auto-inc/dec addresses.

From-SVN: r141450

gcc/ChangeLog
gcc/config/rs6000/predicates.md

index c064c103b0ab739e4ad20ddad80506135c7d4a9f..b3448e3d2c10672df5e435613b1b6e923ea37a0e 100644 (file)
@@ -1,3 +1,9 @@
+2008-10-29  David Edelsohn  <edelsohn@gnu.org>
+
+       PR target/37878
+       * config/rs6000/predicates.md (word_offset_memref_operand):
+       Restructure code and look inside auto-inc/dec addresses.
+       
 2008-10-29  Steve Ellcey  <sje@cup.hp.com>
 
        PR target/32277
index a04a7d8cdbd20a144a9c45c1b4c84272097065ba..af80ef46b6f0a8ddc8933c44d23fe0af29264505 100644 (file)
 
 ;; Return 1 if the operand is a memory operand with an address divisible by 4
 (define_predicate "word_offset_memref_operand"
-  (and (match_operand 0 "memory_operand")
-       (match_test "GET_CODE (XEXP (op, 0)) != PLUS
-                   || ! REG_P (XEXP (XEXP (op, 0), 0)) 
-                   || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT
-                   || INTVAL (XEXP (XEXP (op, 0), 1)) % 4 == 0")))
+  (match_operand 0 "memory_operand")
+{
+  /* Address inside MEM.  */
+  op = XEXP (op, 0);
+
+  /* Extract address from auto-inc/dec.  */
+  if (GET_CODE (op) == PRE_INC
+      || GET_CODE (op) == PRE_DEC)
+    op = XEXP (op, 0);
+  else if (GET_CODE (op) == PRE_MODIFY)
+    op = XEXP (op, 1);
+
+  return (GET_CODE (op) != PLUS
+         || ! REG_P (XEXP (op, 0))
+         || GET_CODE (XEXP (op, 1)) != CONST_INT
+         || INTVAL (XEXP (op, 1)) % 4 == 0);
+})
 
 ;; Return 1 if the operand is an indexed or indirect memory operand.
 (define_predicate "indexed_or_indirect_operand"