defaults.h (TARGET_MEM_CONSTRAINT): New target macro added.
authorAndreas Krebbel <krebbel1@de.ibm.com>
Tue, 27 May 2008 11:41:10 +0000 (11:41 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Tue, 27 May 2008 11:41:10 +0000 (11:41 +0000)
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

13 files changed:
gcc/ChangeLog
gcc/defaults.h
gcc/doc/md.texi
gcc/doc/tm.texi
gcc/genoutput.c
gcc/genpreds.c
gcc/postreload.c
gcc/recog.c
gcc/recog.h
gcc/regclass.c
gcc/reload.c
gcc/reload1.c
gcc/stmt.c

index d373b1bf31473f2c78b33ba02a43944761b85c70..a26bec4eed4cecd3ba04b168a295fff687e748e2 100644 (file)
@@ -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
index 392d22cfabb755ae515a7fa22bf699661e9303dd..3eecd8db81a67c9b47742f773b61ea59081a5ce4 100644 (file)
@@ -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
index a8e43ead2fd3e8aaa981e760842bcedff13f3e1e..ee8021c7d59759c9f9da50db96f2e5d52319218b 100644 (file)
@@ -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
index eeb744bd60dccab9bc2c5c7fb6ea60426e3c628c..3e4d2b7b5bf72d6ac7469f73d175fc401e020706 100644 (file)
@@ -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.
index ba7fd4c24621b874a64640336b652ee3d85cb90c..be4fb00bc7c50e0f4598117b5c4428153c831fd2 100644 (file)
@@ -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 "
index bc20b16f70eef44efb22d55f2910682e541a0d24..b292784247ad9f42567afa164374fcd35ba7a175 100644 (file)
@@ -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.  */
index 7e40728e87684ea4f0e83ab5cd55230de30c2671..15a14f001c65064178c467ff9f13a94934f675b8 100644 (file)
@@ -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;
 
index 9ede30f90fd40802b21c3917d199b336ca686ddc..a8994ea856e609510c495786f18a3ece3f733b8f 100644 (file)
@@ -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))
index cdc438c88929126eef58864f67a385b9526adfd4..a7e22e6e349b0136b76a0d697492890cea7db47d 100644 (file)
@@ -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;
index 200f3eefa5812634f32b17ee0d8a656c5876f137..1194c5ca75d1e49e14fdd6c50c4e0c140bd80475 100644 (file)
@@ -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;
index 0492ee8cc642abf81a9c23615f253fb37936101b..b6880ea7bc93e0f9fa67969d16aaa66c3edea8d7 100644 (file)
@@ -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)
index 13b8e6f7ef0e3e2c9b5627b3956f4a630cce8248..51d3f4c4d19d8ac6a4b54cc163d0d9c9715c8567 100644 (file)
@@ -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':
index 4dba88196cfaa2df243456e373b75dc065cca60a..57e8ad4db7e25ca0905be03da26696e0ba89555a 100644 (file)
@@ -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;