diff options
author | uweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-08-14 10:04:51 +0000 |
---|---|---|
committer | uweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-08-14 10:04:51 +0000 |
commit | a5004c3da9d0b789d68611ec00a1f59d8f62761b (patch) | |
tree | f8955f2da7788407bd35a092c0a414ccd029de11 /gcc/reload.c | |
parent | c363d230bc0490ec67a7726707d6eea248e5d5c4 (diff) | |
download | gcc-a5004c3da9d0b789d68611ec00a1f59d8f62761b.tar.gz |
* reload.c (find_reloads): Handle constraint letters marked by
EXTRA_ADDRESS_CONSTRAINT and EXTRA_MEMORY_CONSTRAINT.
(alternative_allows_memconst): Likewise.
* reload1.c (maybe_fix_stack_asms): Likewise.
* recog.c (asm_operand_ok, preprocess_constraints,
constrain_operands): Likewise.
* regclass.c (record_operand_costs, record_reg_classes): Likewise.
* local-alloc.c (block_alloc, requires_inout): Likewise.
* stmt.c (parse_output_constraint, parse_input_constraint): Likewise.
* defaults.h (EXTRA_MEMORY_CONSTRAINT): Provide a default.
(EXTRA_ADDRESS_CONSTRAINT): Likewise.
* doc/tm.texi: Document these two new target macros.
* config/s390/s390.c (s390_expand_plus_operand): Accept already
valid operands.
(q_constraint): New function.
config/s390/s390-protos.h (q_constraint): Declare it.
config/s390/s390.h (EXTRA_CONSTRAINT): Use it.
(EXTRA_MEMORY_CONSTRAINT): New macro.
* config/s390/s390.md: Throughout the machine description,
replace all instances of the constraint combinations 'Qo'
or 'oQ' with simply 'Q'.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@56291 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/reload.c')
-rw-r--r-- | gcc/reload.c | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/gcc/reload.c b/gcc/reload.c index 41d671d3146..67f411b9040 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -2641,7 +2641,8 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p) if (*constraints[i] == 0) /* Ignore things like match_operator operands. */ ; - else if (constraints[i][0] == 'p') + else if (constraints[i][0] == 'p' + || EXTRA_ADDRESS_CONSTRAINT (constraints[i][0])) { find_reloads_address (VOIDmode, (rtx*) 0, recog_data.operand[i], @@ -3222,6 +3223,49 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p) if (REG_CLASS_FROM_LETTER (c) == NO_REGS) { #ifdef EXTRA_CONSTRAINT + if (EXTRA_MEMORY_CONSTRAINT (c)) + { + if (force_reload) + break; + if (EXTRA_CONSTRAINT (operand, c)) + win = 1; + /* If the address was already reloaded, + we win as well. */ + if (GET_CODE (operand) == MEM && address_reloaded[i]) + win = 1; + /* Likewise if the address will be reloaded because + reg_equiv_address is nonzero. For reg_equiv_mem + we have to check. */ + if (GET_CODE (operand) == REG + && REGNO (operand) >= FIRST_PSEUDO_REGISTER + && reg_renumber[REGNO (operand)] < 0 + && ((reg_equiv_mem[REGNO (operand)] != 0 + && EXTRA_CONSTRAINT (reg_equiv_mem[REGNO (operand)], c)) + || (reg_equiv_address[REGNO (operand)] != 0))) + win = 1; + + /* If we didn't already win, we can reload + constants via force_const_mem, and other + MEMs by reloading the address like for 'o'. */ + if ((CONSTANT_P (operand) && GET_CODE (operand) != HIGH) + || GET_CODE (operand) == MEM) + badop = 0; + constmemok = 1; + offmemok = 1; + break; + } + if (EXTRA_ADDRESS_CONSTRAINT (c)) + { + if (EXTRA_CONSTRAINT (operand, c)) + win = 1; + + /* If we didn't already win, we can reload + the address into a base register. */ + this_alternative[i] = (int) MODE_BASE_REG_CLASS (VOIDmode); + badop = 0; + break; + } + if (EXTRA_CONSTRAINT (operand, c)) win = 1; #endif @@ -4291,7 +4335,7 @@ alternative_allows_memconst (constraint, altnum) /* Scan the requested alternative for 'm' or 'o'. If one of them is present, this alternative accepts memory constants. */ while ((c = *constraint++) && c != ',' && c != '#') - if (c == 'm' || c == 'o') + if (c == 'm' || c == 'o' || EXTRA_MEMORY_CONSTRAINT (c)) return 1; return 0; } |