* regclass.c (record_reg_classes): Correctly handle 'p' constraint.
authorDavid Edelsohn <edelsohn@mhpcc.edu>
Thu, 18 Feb 1999 19:49:19 +0000 (19:49 +0000)
committerJeff Law <law@gcc.gnu.org>
Thu, 18 Feb 1999 19:49:19 +0000 (12:49 -0700)
From-SVN: r25295

gcc/ChangeLog
gcc/regclass.c

index 921f2490fd8a65579a683a349344b08fb9e3e20a..5aff4b3700ddb58298d8bee9782a33afd69e456a 100644 (file)
@@ -1,3 +1,7 @@
+Thu Feb 18 20:44:21 1999  David Edelsohn  <edelsohn@mhpcc.edu>
+
+       * regclass.c (record_reg_classes): Correctly handle 'p' constraint.
+
 Thu Feb 18 19:59:37 1999  Marc Espie <espie@cvs.openbsd.org>
 
        * configure.in :Handle OpenBSD platforms.
index f1761206143a442580a478b5d935776b74974fd4..9faf8ab3f786a53b281387026fd54e423a25f9c1 100644 (file)
@@ -1159,6 +1159,7 @@ record_reg_classes (n_alts, n_ops, ops, modes, constraints, insn)
          const char *p = constraints[i];
          rtx op = ops[i];
          enum machine_mode mode = modes[i];
+         int allows_addr = 0;
          int allows_mem = 0;
          int win = 0;
          unsigned char c;
@@ -1262,7 +1263,11 @@ record_reg_classes (n_alts, n_ops, ops, modes, constraints, insn)
              case '!':  case '#':  case '&':
              case '0':  case '1':  case '2':  case '3':  case '4':
              case '5':  case '6':  case '7':  case '8':  case '9':
+               break;
+
              case 'p':
+               allows_addr = 1;
+               win = address_operand (op, GET_MODE (op));
                break;
 
              case 'm':  case 'o':  case 'V':
@@ -1393,7 +1398,10 @@ record_reg_classes (n_alts, n_ops, ops, modes, constraints, insn)
          if (GET_CODE (op) == REG && REGNO (op) >= FIRST_PSEUDO_REGISTER)
            {
              if (classes[i] == NO_REGS)
-               alt_fail = 1;
+               {
+                 if (! allows_addr)
+                   alt_fail = 1;
+               }
              else
                {
                  struct costs *pp = &this_op_costs[i];
@@ -1443,7 +1451,7 @@ record_reg_classes (n_alts, n_ops, ops, modes, constraints, insn)
          /* The only other way this alternative can be used is if this is a
             constant that could be placed into memory.  */
 
-         else if (CONSTANT_P (op) && allows_mem)
+         else if (CONSTANT_P (op) && (allows_addr || allows_mem))
            alt_cost += MEMORY_MOVE_COST (mode, classes[i], 1);
          else
            alt_fail = 1;