diff options
author | David Edelsohn <edelsohn@mhpcc.edu> | 1999-02-18 19:49:19 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1999-02-18 12:49:19 -0700 |
commit | 94e6f78366432e9495ea7d041f43134122b23753 (patch) | |
tree | 4065946f3c698f4bccf9a39fbf478501c4e2d442 | |
parent | 1b4a979b011b22a370aaed6f57f4caaf3cf0d07a (diff) | |
download | gcc-94e6f78366432e9495ea7d041f43134122b23753.zip gcc-94e6f78366432e9495ea7d041f43134122b23753.tar.gz gcc-94e6f78366432e9495ea7d041f43134122b23753.tar.bz2 |
* regclass.c (record_reg_classes): Correctly handle 'p' constraint.
From-SVN: r25295
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/regclass.c | 12 |
2 files changed, 14 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 921f249..5aff4b3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/regclass.c b/gcc/regclass.c index f176120..9faf8ab 100644 --- a/gcc/regclass.c +++ b/gcc/regclass.c @@ -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; |