The attached change fixes PR target/56214.  We need to reject everything
but QImode and HImode when reload is in progress and strict is specified.

Tested on hppa2.0w-hp-hpux11.11 and hppa64-hp-hpux11.11.  Committed to
trunk.

Dave
-- 
J. David Anglin                                  dave.ang...@nrc-cnrc.gc.ca
National Research Council of Canada              (613) 990-0752 (FAX: 952-6602)

2013-02-18  John David Anglin  <dave.ang...@nrc-cnrc.ca>

        PR target/56214
        * config/pa/predicates.md (base14_operand): Except for BLKmode, QImode
        and HImode, require all displacements to be an integer multiple of their
        mode size.
        * config/pa/pa.c (pa_legitimate_address_p): For REG+BASE addresses,
        only allow QImode and HImode when reload is in progress and strict is
        true.  Likewise for symbolic addresses.  Use base14_operand to check
        displacements in REG+BASE addresses.

Index: config/pa/predicates.md
===================================================================
--- config/pa/predicates.md     (revision 196102)
+++ config/pa/predicates.md     (working copy)
@@ -272,22 +272,13 @@
      assumed in the instruction encoding.  */
   switch (mode)
     {
+    case BLKmode:
     case QImode:
     case HImode:
       return true;
 
-    case SImode:
-    case SFmode:
-    case SCmode:
-      return (INTVAL (op) % 4) == 0;
-
-    case DImode:
-    case DFmode:
-    case DCmode:
-      return (INTVAL (op) % 8) == 0;
-
     default:
-      break;
+      return (INTVAL (op) % GET_MODE_SIZE (mode)) == 0;
     }
 
   return false;
Index: config/pa/pa.c
===================================================================
--- config/pa/pa.c      (revision 196102)
+++ config/pa/pa.c      (working copy)
@@ -10517,21 +10532,13 @@
             the majority of accesses will use floating point instructions
             that don't support 14-bit offsets.  */
          if (!INT14_OK_STRICT
-             && (GET_MODE_CLASS (mode) == MODE_FLOAT
-                 || (reload_in_progress
-                     && strict
-                     && (mode == SImode || mode == DImode))))
-          return false;
+             && reload_in_progress
+             && strict
+             && mode != QImode
+             && mode != HImode)
+           return false;
 
-         if (INT_14_BITS (index)
-             && (mode == BLKmode
-                 || mode == QImode
-                 || mode == HImode
-                 /* Displacement must be a multiple of its size.  */
-                 || (INTVAL (index) % GET_MODE_SIZE (mode)) == 0))
-           return true;
-
-         return false;
+         return base14_operand (index, mode);
        }
 
       if (!TARGET_DISABLE_INDEXING
@@ -10586,11 +10593,11 @@
            return true;
 
          if (!INT14_OK_STRICT
-             && (GET_MODE_CLASS (mode) == MODE_FLOAT
-                 || (reload_in_progress
-                     && strict
-                     && (mode == SImode || mode == DImode))))
-          return false;
+             && reload_in_progress
+             && strict
+             && mode != QImode
+             && mode != HImode)
+           return false;
 
          if (CONSTANT_P (XEXP (x, 1)))
            return true;

Reply via email to