File ibm304071-z10-1 of Package gcc43

From gcc-patches-return-218929-listarch-gcc-patches=gcc dot gnu dot org at gcc dot gnu dot org Tue May 27 12:02:57 2008
Return-Path: <gcc-patches-return-218929-listarch-gcc-patches=gcc dot gnu dot org at gcc dot gnu dot org>
Delivered-To: listarch-gcc-patches at gcc dot gnu dot org
Received: (qmail 22506 invoked by alias); 27 May 2008 12:02:57 -0000
Received: (qmail 22491 invoked by uid 22791); 27 May 2008 12:02:51 -0000
X-Spam-Check-By: sourceware.org
Received: from mtagate8.de.ibm.com (HELO mtagate8.de.ibm.com) (195.212.29.157)     by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 27 May 2008 12:02:25 +0000
Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) 	by mtagate8.de.ibm.com (8.13.8/8.13.8) with ESMTP id m4RC1vlb685348 	for <gcc-patches@gcc.gnu.org>; Tue, 27 May 2008 12:01:57 GMT
Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) 	by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v8.7) with ESMTP id m4RC1vvA3752188 	for <gcc-patches@gcc.gnu.org>; Tue, 27 May 2008 14:01:57 +0200
Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) 	by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m4RC1viq021264 	for <gcc-patches@gcc.gnu.org>; Tue, 27 May 2008 14:01:57 +0200
Received: from lc4eb0107015440.ibm.com (dyn-9-152-216-52.boeblingen.de.ibm.com [9.152.216.52]) 	by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with SMTP id m4RC1uCO021230 	for <gcc-patches@gcc.gnu.org>; Tue, 27 May 2008 14:01:56 +0200
Received: by lc4eb0107015440.ibm.com (sSMTP sendmail emulation); Tue, 27 May 2008 14:02:00 +0200
From: "Andreas Krebbel" <Andreas dot Krebbel at de dot ibm dot com>
Date: Tue, 27 May 2008 14:02:00 +0200
To: gcc-patches at gcc dot gnu dot org
Subject: [Committed] Introduce TARGET_MEM_CONSTRAINT macro
Message-ID: <20080527120200.GC18965@homer.boeblingen.de.ibm.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.4.2.2i
Mailing-List: contact gcc-patches-help at gcc dot gnu dot org; run by ezmlm
Precedence: bulk
List-Id: <gcc-patches.gcc.gnu.org>
List-Archive: <http://gcc.gnu.org/ml/gcc-patches/>
List-Post: <mailto:gcc-patches at gcc dot gnu dot org>
List-Help: <mailto:gcc-patches-help at gcc dot gnu dot org>
Sender: gcc-patches-owner at gcc dot gnu dot org
Delivered-To: mailing list gcc-patches at gcc dot gnu dot org

Applied to mainline.
Approved with: http://gcc.gnu.org/ml/gcc-patches/2008-04/msg00639.html

Bye,

-Andreas-

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.


Index: gcc/defaults.h
===================================================================
--- gcc/defaults.h.orig	2008-02-19 10:55:59.000000000 +0100
+++ gcc/defaults.h	2009-11-20 13:51:25.000000000 +0100
@@ -902,6 +902,10 @@ along with GCC; see the file COPYING3.
 #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: gcc/postreload.c
===================================================================
--- gcc/postreload.c.orig	2008-02-19 10:55:59.000000000 +0100
+++ gcc/postreload.c	2009-11-20 13:51:25.000000000 +0100
@@ -542,12 +542,12 @@ reload_cse_simplify_operands (rtx insn,
 		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: gcc/recog.c
===================================================================
--- gcc/recog.c.orig	2009-11-20 13:50:29.000000000 +0100
+++ gcc/recog.c	2009-11-20 13:51:25.000000000 +0100
@@ -1593,7 +1593,7 @@ asm_operand_ok (rtx op, const char *cons
 	    result = 1;
 	  break;
 
-	case 'm':
+	case TARGET_MEM_CONSTRAINT:
 	case 'V': /* non-offsettable */
 	  if (memory_operand (op, VOIDmode))
 	    result = 1;
@@ -2132,7 +2132,7 @@ preprocess_constraints (void)
 		  }
 		  continue;
 
-		case 'm':
+		case TARGET_MEM_CONSTRAINT:
 		  op_alt[j].memory_ok = 1;
 		  break;
 		case '<':
@@ -2405,7 +2405,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: gcc/regclass.c
===================================================================
--- gcc/regclass.c.orig	2008-02-19 10:56:00.000000000 +0100
+++ gcc/regclass.c	2009-11-20 13:51:25.000000000 +0100
@@ -1699,7 +1699,7 @@ record_reg_classes (int n_alts, int n_op
 		    [(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: gcc/reload.c
===================================================================
--- gcc/reload.c.orig	2008-08-18 10:56:42.000000000 +0200
+++ gcc/reload.c	2009-11-20 13:51:25.000000000 +0100
@@ -3203,7 +3203,7 @@ find_reloads (rtx insn, int replace, int
 		badop = 0;
 		break;
 
-	      case 'm':
+	      case TARGET_MEM_CONSTRAINT:
 		if (force_reload)
 		  break;
 		if (MEM_P (operand)
@@ -4555,7 +4555,7 @@ alternative_allows_const_pool_ref (rtx m
       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.
 
@@ -4566,7 +4566,7 @@ alternative_allows_const_pool_ref (rtx m
   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: gcc/reload1.c
===================================================================
--- gcc/reload1.c.orig	2008-02-19 10:56:00.000000000 +0100
+++ gcc/reload1.c	2009-11-20 13:51:25.000000000 +0100
@@ -1455,11 +1455,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: gcc/stmt.c
===================================================================
--- gcc/stmt.c.orig	2009-03-13 16:34:03.000000000 +0100
+++ gcc/stmt.c	2009-11-20 13:51:25.000000000 +0100
@@ -364,7 +364,7 @@ parse_output_constraint (const char **co
 	  }
 	break;
 
-      case 'V':  case 'm':  case 'o':
+      case 'V':  case TARGET_MEM_CONSTRAINT:  case 'o':
 	*allows_mem = true;
 	break;
 
@@ -463,7 +463,7 @@ parse_input_constraint (const char **con
 	  }
 	break;
 
-      case 'V':  case 'm':  case 'o':
+      case 'V':  case TARGET_MEM_CONSTRAINT:  case 'o':
 	*allows_mem = true;
 	break;
 
Index: gcc/recog.h
===================================================================
--- gcc/recog.h.orig	2009-03-13 16:34:03.000000000 +0100
+++ gcc/recog.h	2009-11-20 13:51:25.000000000 +0100
@@ -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: gcc/genpreds.c
===================================================================
--- gcc/genpreds.c.orig	2008-02-19 10:56:00.000000000 +0100
+++ gcc/genpreds.c	2009-11-20 13:51:25.000000000 +0100
@@ -690,8 +690,11 @@ static struct constraint_data **last_con
   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: gcc/genoutput.c
===================================================================
--- gcc/genoutput.c.orig	2008-02-19 10:55:59.000000000 +0100
+++ gcc/genoutput.c	2009-11-20 13:51:25.000000000 +0100
@@ -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: gcc/doc/md.texi
===================================================================
--- gcc/doc/md.texi.orig	2009-11-20 13:51:10.000000000 +0100
+++ gcc/doc/md.texi	2009-11-20 13:51:25.000000000 +0100
@@ -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: gcc/doc/tm.texi
===================================================================
--- gcc/doc/tm.texi.orig	2008-02-19 10:52:38.000000000 +0100
+++ gcc/doc/tm.texi	2009-11-20 13:51:25.000000000 +0100
@@ -5297,6 +5297,17 @@ into the @code{symbol_ref}, and then che
 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.