This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Committed] Introduce TARGET_MEM_CONSTRAINT macro


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-05-27 08:40:45.000000000 +0200
--- gcc/defaults.h	2008-05-27 08:45:44.000000000 +0200
*************** along with GCC; see the file COPYING3.  
*** 902,907 ****
--- 902,911 ----
  #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-05-15 10:28:00.000000000 +0200
--- gcc/postreload.c	2008-05-27 08:45:44.000000000 +0200
*************** reload_cse_simplify_operands (rtx insn, 
*** 542,553 ****
  		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 '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':
  		  /* These don't say anything we care about.  */
  		  break;
  
--- 542,553 ----
  		case '*':  case '%':
  		case '0':  case '1':  case '2':  case '3':  case '4':
  		case '5':  case '6':  case '7':  case '8':  case '9':
! 		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 TARGET_MEM_CONSTRAINT:
  		  /* These don't say anything we care about.  */
  		  break;
  
Index: gcc/recog.c
===================================================================
*** gcc/recog.c.orig	2008-05-27 08:40:45.000000000 +0200
--- gcc/recog.c	2008-05-27 08:45:44.000000000 +0200
*************** asm_operand_ok (rtx op, const char *cons
*** 1543,1549 ****
  	    result = 1;
  	  break;
  
! 	case 'm':
  	case 'V': /* non-offsettable */
  	  if (memory_operand (op, VOIDmode))
  	    result = 1;
--- 1543,1549 ----
  	    result = 1;
  	  break;
  
! 	case TARGET_MEM_CONSTRAINT:
  	case 'V': /* non-offsettable */
  	  if (memory_operand (op, VOIDmode))
  	    result = 1;
*************** preprocess_constraints (void)
*** 2082,2088 ****
  		  }
  		  continue;
  
! 		case 'm':
  		  op_alt[j].memory_ok = 1;
  		  break;
  		case '<':
--- 2082,2088 ----
  		  }
  		  continue;
  
! 		case TARGET_MEM_CONSTRAINT:
  		  op_alt[j].memory_ok = 1;
  		  break;
  		case '<':
*************** constrain_operands (int strict)
*** 2355,2361 ****
  		win = 1;
  		break;
  
! 	      case 'm':
  		/* Memory operands must be valid, to the extent
  		   required by STRICT.  */
  		if (MEM_P (op))
--- 2355,2361 ----
  		win = 1;
  		break;
  
! 	      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-05-15 10:28:00.000000000 +0200
--- gcc/regclass.c	2008-05-27 08:45:44.000000000 +0200
*************** record_reg_classes (int n_alts, int n_op
*** 1701,1707 ****
  		    [(int) base_reg_class (VOIDmode, ADDRESS, SCRATCH)];
  		  break;
  
! 		case 'm':  case 'o':  case 'V':
  		  /* It doesn't seem worth distinguishing between offsettable
  		     and non-offsettable addresses here.  */
  		  allows_mem[i] = 1;
--- 1701,1707 ----
  		    [(int) base_reg_class (VOIDmode, ADDRESS, SCRATCH)];
  		  break;
  
! 		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-05-15 10:28:00.000000000 +0200
--- gcc/reload.c	2008-05-27 08:45:44.000000000 +0200
*************** find_reloads (rtx insn, int replace, int
*** 3182,3188 ****
  		badop = 0;
  		break;
  
! 	      case 'm':
  		if (force_reload)
  		  break;
  		if (MEM_P (operand)
--- 3182,3188 ----
  		badop = 0;
  		break;
  
! 	      case TARGET_MEM_CONSTRAINT:
  		if (force_reload)
  		  break;
  		if (MEM_P (operand)
*************** alternative_allows_const_pool_ref (rtx m
*** 4522,4528 ****
        while (*constraint++ != ',');
        altnum--;
      }
!   /* Scan the requested alternative for 'm' or 'o'.
       If one of them is present, this alternative accepts the result of
       passing a constant-pool reference through find_reloads_toplev.
  
--- 4522,4528 ----
        while (*constraint++ != ',');
        altnum--;
      }
!   /* 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.
  
*************** alternative_allows_const_pool_ref (rtx m
*** 4533,4539 ****
    for (; (c = *constraint) && c != ',' && c != '#';
         constraint += CONSTRAINT_LEN (c, constraint))
      {
!       if (c == 'm' || c == 'o')
  	return true;
  #ifdef EXTRA_CONSTRAINT_STR
        if (EXTRA_MEMORY_CONSTRAINT (c, constraint)
--- 4533,4539 ----
    for (; (c = *constraint) && c != ',' && c != '#';
         constraint += CONSTRAINT_LEN (c, constraint))
      {
!       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-05-15 10:28:00.000000000 +0200
--- gcc/reload1.c	2008-05-27 08:45:44.000000000 +0200
*************** maybe_fix_stack_asms (void)
*** 1454,1464 ****
  	      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':
  		  break;
  
  		case 'p':
--- 1454,1464 ----
  	      switch (c)
  		{
  		case '=': case '+': case '*': case '%': case '?': case '!':
! 		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	2008-05-15 10:28:00.000000000 +0200
--- gcc/stmt.c	2008-05-27 08:45:44.000000000 +0200
*************** parse_output_constraint (const char **co
*** 363,369 ****
  	  }
  	break;
  
!       case 'V':  case 'm':  case 'o':
  	*allows_mem = true;
  	break;
  
--- 363,369 ----
  	  }
  	break;
  
!       case 'V':  case TARGET_MEM_CONSTRAINT:  case 'o':
  	*allows_mem = true;
  	break;
  
*************** parse_input_constraint (const char **con
*** 462,468 ****
  	  }
  	break;
  
!       case 'V':  case 'm':  case 'o':
  	*allows_mem = true;
  	break;
  
--- 462,468 ----
  	  }
  	break;
  
!       case 'V':  case TARGET_MEM_CONSTRAINT:  case 'o':
  	*allows_mem = true;
  	break;
  
Index: gcc/recog.h
===================================================================
*** gcc/recog.h.orig	2008-05-15 10:28:00.000000000 +0200
--- gcc/recog.h	2008-05-27 08:45:44.000000000 +0200
*************** struct operand_alternative
*** 50,56 ****
  
    /* Nonzero if '&' was found in the constraint string.  */
    unsigned int earlyclobber:1;
!   /* Nonzero if 'm' 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;
--- 50,57 ----
  
    /* Nonzero if '&' was found in the constraint string.  */
    unsigned int earlyclobber:1;
!   /* 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-05-15 10:28:00.000000000 +0200
--- gcc/genpreds.c	2008-05-27 08:45:44.000000000 +0200
*************** static struct constraint_data **last_con
*** 690,697 ****
    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";
  
  /* Machine-independent code expects that constraints with these
     (initial) letters will allow only (a subset of all) CONST_INTs.  */
--- 690,700 ----
    for (iter_ = first_constraint; iter_; iter_ = iter_->next_textual)
  
  /* These letters, and all names beginning with them, are reserved for
!    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-05-15 10:28:00.000000000 +0200
--- gcc/genoutput.c	2008-05-27 08:45:44.000000000 +0200
*************** note_constraint (rtx exp, int lineno)
*** 1122,1128 ****
    unsigned int namelen = strlen (name);
    struct constraint_data **iter, **slot, *new;
  
!   if (strchr (indep_constraints, name[0]))
      {
        if (name[1] == '\0')
  	message_with_line (lineno, "constraint letter '%s' cannot be "
--- 1122,1131 ----
    unsigned int namelen = strlen (name);
    struct constraint_data **iter, **slot, *new;
  
!   /* 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	2008-05-15 10:22:48.000000000 +0200
--- gcc/doc/md.texi	2008-05-27 08:45:44.000000000 +0200
*************** number of constraints and modifiers.
*** 1085,1090 ****
--- 1085,1092 ----
  @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-05-27 08:40:32.000000000 +0200
--- gcc/doc/tm.texi	2008-05-27 08:45:44.000000000 +0200
*************** into the @code{symbol_ref}, and then che
*** 5315,5320 ****
--- 5315,5331 ----
  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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]