rs6000.c (rs6000_legitimate_address, [...]): Handle AND pattern
authorDorit Naishlos <dorit@il.ibm.com>
Mon, 27 Sep 2004 20:23:38 +0000 (20:23 +0000)
committerDorit Nuzman <dorit@gcc.gnu.org>
Mon, 27 Sep 2004 20:23:38 +0000 (20:23 +0000)
* config/rs6000/rs6000.c (rs6000_legitimate_address, print_operand):
        Handle AND pattern

From-SVN: r88196

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 8c0e62927b35d48956715efd0fec58bc5ff4f8b3..29d7774b9aa1a9d0d1b2372fcd5d274f695edef8 100644 (file)
@@ -1,3 +1,8 @@
+2004-09-27  Dorit Naishlos  <dorit@il.ibm.com>
+
+       * config/rs6000/rs6000.c (rs6000_legitimate_address, print_operand):
+       Handle AND pattern
+
 2004-09-27  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        PR c/13804
index 39ace238fa3f2ca209b14deb2eca95b0f12a2587..602498bd9da701c35afb229ed8318221ec79198d 100644 (file)
@@ -3189,6 +3189,7 @@ legitimate_indexed_address_p (rtx x, int strict)
 
   if (GET_CODE (x) != PLUS)
     return false;
+
   op0 = XEXP (x, 0);
   op1 = XEXP (x, 1);
 
@@ -3805,6 +3806,14 @@ rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
 int
 rs6000_legitimate_address (enum machine_mode mode, rtx x, int reg_ok_strict)
 {
+  /* If this is an unaligned stvx/ldvx type address, discard the outer AND.  */
+  if (TARGET_ALTIVEC
+      && ALTIVEC_VECTOR_MODE (mode)
+      && GET_CODE (x) == AND
+      && GET_CODE (XEXP (x, 1)) == CONST_INT
+      && INTVAL (XEXP (x, 1)) == -16)
+    x = XEXP (x, 0);
+
   if (RS6000_SYMBOL_REF_TLS_P (x))
     return 0;
   if (legitimate_indirect_address_p (x, reg_ok_strict))
@@ -10559,6 +10568,11 @@ print_operand (FILE *file, rtx x, int code)
 
            /* Fall through.  Must be [reg+reg].  */
          }
+       if (TARGET_ALTIVEC
+           && GET_CODE (tmp) == AND
+           && GET_CODE (XEXP (tmp, 1)) == CONST_INT
+           && INTVAL (XEXP (tmp, 1)) == -16)
+         tmp = XEXP (tmp, 0);
        if (GET_CODE (tmp) == REG)
          fprintf (file, "0,%s", reg_names[REGNO (tmp)]);
        else if (GET_CODE (tmp) == PLUS && GET_CODE (XEXP (tmp, 1)) == REG)