defaults.h (TARGET_MEM_CONSTRAINT): New target macro added.
2008-05-27 Andreas Krebbel <krebbel1@de.ibm.com> * defaults.h (TARGET_MEM_CONSTRAINT): New target macro added. * postreload.c (reload_cse_simplify_operands): Replace 'm' constraint with TARGET_MEM_CONSTRAINT. * recog.c (asm_operand_ok, preprocess_constraints, constrain_operands): Likewise. * regclass.c (record_reg_classes): Likewise. * reload.c (find_reloads, alternative_allows_const_pool_ref): Likewise. * reload1.c (maybe_fix_stack_asms): Likewise. * stmt.c (parse_output_constraint, parse_input_constraint): Likewise. * recog.h: Adjust comment. * genpreds.c (generic_constraint_letters): Remove 'm' constraint. * genoutput.c (note_constraint): Don't emit error for 'm' constraint. * doc/md.texi: Add a note to description of 'm' constraint. * doc/tm.texi: Document the new TARGET_MEM_CONSTRAINT macro. From-SVN: r136011
This commit is contained in:
parent
79d2a7279f
commit
a4edaf8359
@ -1,3 +1,23 @@
|
||||
2008-05-27 Andreas Krebbel <krebbel1@de.ibm.com>
|
||||
|
||||
* defaults.h (TARGET_MEM_CONSTRAINT): New target macro added.
|
||||
* postreload.c (reload_cse_simplify_operands): Replace 'm'
|
||||
constraint with TARGET_MEM_CONSTRAINT.
|
||||
* recog.c (asm_operand_ok, preprocess_constraints,
|
||||
constrain_operands): Likewise.
|
||||
* regclass.c (record_reg_classes): Likewise.
|
||||
* reload.c (find_reloads, alternative_allows_const_pool_ref):
|
||||
Likewise.
|
||||
* reload1.c (maybe_fix_stack_asms): Likewise.
|
||||
* stmt.c (parse_output_constraint, parse_input_constraint):
|
||||
Likewise.
|
||||
* recog.h: Adjust comment.
|
||||
* genpreds.c (generic_constraint_letters): Remove 'm' constraint.
|
||||
* genoutput.c (note_constraint): Don't emit error for 'm'
|
||||
constraint.
|
||||
* doc/md.texi: Add a note to description of 'm' constraint.
|
||||
* doc/tm.texi: Document the new TARGET_MEM_CONSTRAINT macro.
|
||||
|
||||
2008-05-27 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* tree-sra.c (sra_type_can_be_decomposed_p) <RECORD_TYPE>: Make sure
|
||||
|
@ -902,6 +902,10 @@ along with GCC; see the file COPYING3. If not see
|
||||
#define LEGITIMATE_PIC_OPERAND_P(X) 1
|
||||
#endif
|
||||
|
||||
#ifndef TARGET_MEM_CONSTRAINT
|
||||
#define TARGET_MEM_CONSTRAINT 'm'
|
||||
#endif
|
||||
|
||||
#ifndef REVERSIBLE_CC_MODE
|
||||
#define REVERSIBLE_CC_MODE(MODE) 0
|
||||
#endif
|
||||
|
@ -1085,6 +1085,8 @@ number of constraints and modifiers.
|
||||
@item @samp{m}
|
||||
A memory operand is allowed, with any kind of address that the machine
|
||||
supports in general.
|
||||
Note that the letter used for the general memory constraint can be
|
||||
re-defined by a back end using the @code{TARGET_MEM_CONSTRAINT} macro.
|
||||
|
||||
@cindex offsettable address
|
||||
@cindex @samp{o} in constraint
|
||||
|
@ -5315,6 +5315,17 @@ into the @code{symbol_ref}, and then check for it here. When you see a
|
||||
Format}.
|
||||
@end defmac
|
||||
|
||||
@defmac TARGET_MEM_CONSTRAINT
|
||||
A single character to be used instead of the default @code{'m'}
|
||||
character for general memory addresses. This defines the constraint
|
||||
letter which matches the memory addresses accepted by
|
||||
@code{GO_IF_LEGITIMATE_ADDRESS_P}. Define this macro if you want to
|
||||
support new address formats in your back end without changing the
|
||||
semantics of the @code{'m'} constraint. This is necessary in order to
|
||||
preserve functionality of inline assembly constructs using the
|
||||
@code{'m'} constraint.
|
||||
@end defmac
|
||||
|
||||
@defmac FIND_BASE_TERM (@var{x})
|
||||
A C expression to determine the base term of address @var{x}.
|
||||
This macro is used in only one place: `find_base_term' in alias.c.
|
||||
|
@ -1122,7 +1122,10 @@ note_constraint (rtx exp, int lineno)
|
||||
unsigned int namelen = strlen (name);
|
||||
struct constraint_data **iter, **slot, *new;
|
||||
|
||||
if (strchr (indep_constraints, name[0]))
|
||||
/* The 'm' constraint is special here since that constraint letter
|
||||
can be overridden by the back end by defining the
|
||||
TARGET_MEM_CONSTRAINT macro. */
|
||||
if (strchr (indep_constraints, name[0]) && name[0] != 'm')
|
||||
{
|
||||
if (name[1] == '\0')
|
||||
message_with_line (lineno, "constraint letter '%s' cannot be "
|
||||
|
@ -690,8 +690,11 @@ static struct constraint_data **last_constraint_ptr = &first_constraint;
|
||||
for (iter_ = first_constraint; iter_; iter_ = iter_->next_textual)
|
||||
|
||||
/* These letters, and all names beginning with them, are reserved for
|
||||
generic constraints. */
|
||||
static const char generic_constraint_letters[] = "EFVXgimnoprs";
|
||||
generic constraints.
|
||||
The 'm' constraint is not mentioned here since that constraint
|
||||
letter can be overridden by the back end by defining the
|
||||
TARGET_MEM_CONSTRAINT macro. */
|
||||
static const char generic_constraint_letters[] = "EFVXginoprs";
|
||||
|
||||
/* Machine-independent code expects that constraints with these
|
||||
(initial) letters will allow only (a subset of all) CONST_INTs. */
|
||||
|
@ -542,12 +542,12 @@ reload_cse_simplify_operands (rtx insn, rtx testreg)
|
||||
case '*': case '%':
|
||||
case '0': case '1': case '2': case '3': case '4':
|
||||
case '5': case '6': case '7': case '8': case '9':
|
||||
case 'm': case '<': case '>': case 'V': case 'o':
|
||||
case '<': case '>': case 'V': case 'o':
|
||||
case 'E': case 'F': case 'G': case 'H':
|
||||
case 's': case 'i': case 'n':
|
||||
case 'I': case 'J': case 'K': case 'L':
|
||||
case 'M': case 'N': case 'O': case 'P':
|
||||
case 'p': case 'X':
|
||||
case 'p': case 'X': case TARGET_MEM_CONSTRAINT:
|
||||
/* These don't say anything we care about. */
|
||||
break;
|
||||
|
||||
|
@ -1543,7 +1543,7 @@ asm_operand_ok (rtx op, const char *constraint)
|
||||
result = 1;
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
case TARGET_MEM_CONSTRAINT:
|
||||
case 'V': /* non-offsettable */
|
||||
if (memory_operand (op, VOIDmode))
|
||||
result = 1;
|
||||
@ -2082,7 +2082,7 @@ preprocess_constraints (void)
|
||||
}
|
||||
continue;
|
||||
|
||||
case 'm':
|
||||
case TARGET_MEM_CONSTRAINT:
|
||||
op_alt[j].memory_ok = 1;
|
||||
break;
|
||||
case '<':
|
||||
@ -2355,7 +2355,7 @@ constrain_operands (int strict)
|
||||
win = 1;
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
case TARGET_MEM_CONSTRAINT:
|
||||
/* Memory operands must be valid, to the extent
|
||||
required by STRICT. */
|
||||
if (MEM_P (op))
|
||||
|
@ -50,7 +50,8 @@ struct operand_alternative
|
||||
|
||||
/* Nonzero if '&' was found in the constraint string. */
|
||||
unsigned int earlyclobber:1;
|
||||
/* Nonzero if 'm' was found in the constraint string. */
|
||||
/* Nonzero if TARGET_MEM_CONSTRAINT was found in the constraint
|
||||
string. */
|
||||
unsigned int memory_ok:1;
|
||||
/* Nonzero if 'o' was found in the constraint string. */
|
||||
unsigned int offmem_ok:1;
|
||||
|
@ -1701,7 +1701,7 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
|
||||
[(int) base_reg_class (VOIDmode, ADDRESS, SCRATCH)];
|
||||
break;
|
||||
|
||||
case 'm': case 'o': case 'V':
|
||||
case TARGET_MEM_CONSTRAINT: case 'o': case 'V':
|
||||
/* It doesn't seem worth distinguishing between offsettable
|
||||
and non-offsettable addresses here. */
|
||||
allows_mem[i] = 1;
|
||||
|
@ -3182,7 +3182,7 @@ find_reloads (rtx insn, int replace, int ind_levels, int live_known,
|
||||
badop = 0;
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
case TARGET_MEM_CONSTRAINT:
|
||||
if (force_reload)
|
||||
break;
|
||||
if (MEM_P (operand)
|
||||
@ -4522,7 +4522,7 @@ alternative_allows_const_pool_ref (rtx mem, const char *constraint, int altnum)
|
||||
while (*constraint++ != ',');
|
||||
altnum--;
|
||||
}
|
||||
/* Scan the requested alternative for 'm' or 'o'.
|
||||
/* Scan the requested alternative for TARGET_MEM_CONSTRAINT or 'o'.
|
||||
If one of them is present, this alternative accepts the result of
|
||||
passing a constant-pool reference through find_reloads_toplev.
|
||||
|
||||
@ -4533,7 +4533,7 @@ alternative_allows_const_pool_ref (rtx mem, const char *constraint, int altnum)
|
||||
for (; (c = *constraint) && c != ',' && c != '#';
|
||||
constraint += CONSTRAINT_LEN (c, constraint))
|
||||
{
|
||||
if (c == 'm' || c == 'o')
|
||||
if (c == TARGET_MEM_CONSTRAINT || c == 'o')
|
||||
return true;
|
||||
#ifdef EXTRA_CONSTRAINT_STR
|
||||
if (EXTRA_MEMORY_CONSTRAINT (c, constraint)
|
||||
|
@ -1454,11 +1454,11 @@ maybe_fix_stack_asms (void)
|
||||
switch (c)
|
||||
{
|
||||
case '=': case '+': case '*': case '%': case '?': case '!':
|
||||
case '0': case '1': case '2': case '3': case '4': case 'm':
|
||||
case '<': case '>': case 'V': case 'o': case '&': case 'E':
|
||||
case 'F': case 's': case 'i': case 'n': case 'X': case 'I':
|
||||
case 'J': case 'K': case 'L': case 'M': case 'N': case 'O':
|
||||
case 'P':
|
||||
case '0': case '1': case '2': case '3': case '4': case '<':
|
||||
case '>': case 'V': case 'o': case '&': case 'E': case 'F':
|
||||
case 's': case 'i': case 'n': case 'X': case 'I': case 'J':
|
||||
case 'K': case 'L': case 'M': case 'N': case 'O': case 'P':
|
||||
case TARGET_MEM_CONSTRAINT:
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
|
@ -363,7 +363,7 @@ parse_output_constraint (const char **constraint_p, int operand_num,
|
||||
}
|
||||
break;
|
||||
|
||||
case 'V': case 'm': case 'o':
|
||||
case 'V': case TARGET_MEM_CONSTRAINT: case 'o':
|
||||
*allows_mem = true;
|
||||
break;
|
||||
|
||||
@ -462,7 +462,7 @@ parse_input_constraint (const char **constraint_p, int input_num,
|
||||
}
|
||||
break;
|
||||
|
||||
case 'V': case 'm': case 'o':
|
||||
case 'V': case TARGET_MEM_CONSTRAINT: case 'o':
|
||||
*allows_mem = true;
|
||||
break;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user