Home | History | Annotate | Line # | Download | only in gcc
gensupport.cc revision 1.1
      1  1.1  mrg /* Support routines for the various generation passes.
      2  1.1  mrg    Copyright (C) 2000-2022 Free Software Foundation, Inc.
      3  1.1  mrg 
      4  1.1  mrg    This file is part of GCC.
      5  1.1  mrg 
      6  1.1  mrg    GCC is free software; you can redistribute it and/or modify it
      7  1.1  mrg    under the terms of the GNU General Public License as published by
      8  1.1  mrg    the Free Software Foundation; either version 3, or (at your option)
      9  1.1  mrg    any later version.
     10  1.1  mrg 
     11  1.1  mrg    GCC is distributed in the hope that it will be useful, but WITHOUT
     12  1.1  mrg    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     13  1.1  mrg    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     14  1.1  mrg    License for more details.
     15  1.1  mrg 
     16  1.1  mrg    You should have received a copy of the GNU General Public License
     17  1.1  mrg    along with GCC; see the file COPYING3.  If not see
     18  1.1  mrg    <http://www.gnu.org/licenses/>.  */
     19  1.1  mrg 
     20  1.1  mrg #include "bconfig.h"
     21  1.1  mrg #include "system.h"
     22  1.1  mrg #include "coretypes.h"
     23  1.1  mrg #include "tm.h"
     24  1.1  mrg #include "rtl.h"
     25  1.1  mrg #include "obstack.h"
     26  1.1  mrg #include "errors.h"
     27  1.1  mrg #include "read-md.h"
     28  1.1  mrg #include "gensupport.h"
     29  1.1  mrg #include "vec.h"
     30  1.1  mrg 
     31  1.1  mrg #define MAX_OPERANDS 40
     32  1.1  mrg 
     33  1.1  mrg static rtx operand_data[MAX_OPERANDS];
     34  1.1  mrg static rtx match_operand_entries_in_pattern[MAX_OPERANDS];
     35  1.1  mrg static char used_operands_numbers[MAX_OPERANDS];
     36  1.1  mrg 
     37  1.1  mrg 
     38  1.1  mrg /* In case some macros used by files we include need it, define this here.  */
     39  1.1  mrg int target_flags;
     40  1.1  mrg 
     41  1.1  mrg int insn_elision = 1;
     42  1.1  mrg 
     43  1.1  mrg static struct obstack obstack;
     44  1.1  mrg struct obstack *rtl_obstack = &obstack;
     45  1.1  mrg 
     46  1.1  mrg /* Counter for named patterns and INSN_CODEs.  */
     47  1.1  mrg static int insn_sequence_num;
     48  1.1  mrg 
     49  1.1  mrg /* Counter for define_splits.  */
     50  1.1  mrg static int split_sequence_num;
     51  1.1  mrg 
     52  1.1  mrg /* Counter for define_peephole2s.  */
     53  1.1  mrg static int peephole2_sequence_num;
     54  1.1  mrg 
     55  1.1  mrg static int predicable_default;
     56  1.1  mrg static const char *predicable_true;
     57  1.1  mrg static const char *predicable_false;
     58  1.1  mrg 
     59  1.1  mrg static const char *subst_true = "yes";
     60  1.1  mrg static const char *subst_false = "no";
     61  1.1  mrg 
     62  1.1  mrg static htab_t condition_table;
     63  1.1  mrg 
     64  1.1  mrg /* We initially queue all patterns, process the define_insn,
     65  1.1  mrg    define_cond_exec and define_subst patterns, then return
     66  1.1  mrg    them one at a time.  */
     67  1.1  mrg 
     68  1.1  mrg class queue_elem
     69  1.1  mrg {
     70  1.1  mrg public:
     71  1.1  mrg   rtx data;
     72  1.1  mrg   file_location loc;
     73  1.1  mrg   class queue_elem *next;
     74  1.1  mrg   /* In a DEFINE_INSN that came from a DEFINE_INSN_AND_SPLIT or
     75  1.1  mrg      DEFINE_INSN_AND_REWRITE, SPLIT points to the generated DEFINE_SPLIT.  */
     76  1.1  mrg   class queue_elem *split;
     77  1.1  mrg };
     78  1.1  mrg 
     79  1.1  mrg #define MNEMONIC_ATTR_NAME "mnemonic"
     80  1.1  mrg #define MNEMONIC_HTAB_SIZE 1024
     81  1.1  mrg 
     82  1.1  mrg static class queue_elem *define_attr_queue;
     83  1.1  mrg static class queue_elem **define_attr_tail = &define_attr_queue;
     84  1.1  mrg static class queue_elem *define_pred_queue;
     85  1.1  mrg static class queue_elem **define_pred_tail = &define_pred_queue;
     86  1.1  mrg static class queue_elem *define_insn_queue;
     87  1.1  mrg static class queue_elem **define_insn_tail = &define_insn_queue;
     88  1.1  mrg static class queue_elem *define_cond_exec_queue;
     89  1.1  mrg static class queue_elem **define_cond_exec_tail = &define_cond_exec_queue;
     90  1.1  mrg static class queue_elem *define_subst_queue;
     91  1.1  mrg static class queue_elem **define_subst_tail = &define_subst_queue;
     92  1.1  mrg static class queue_elem *other_queue;
     93  1.1  mrg static class queue_elem **other_tail = &other_queue;
     94  1.1  mrg static class queue_elem *define_subst_attr_queue;
     95  1.1  mrg static class queue_elem **define_subst_attr_tail = &define_subst_attr_queue;
     96  1.1  mrg 
     97  1.1  mrg /* Mapping from DEFINE_* rtxes to their location in the source file.  */
     98  1.1  mrg static hash_map <rtx, file_location> *rtx_locs;
     99  1.1  mrg 
    100  1.1  mrg static void remove_constraints (rtx);
    101  1.1  mrg 
    102  1.1  mrg static int is_predicable (class queue_elem *);
    103  1.1  mrg static void identify_predicable_attribute (void);
    104  1.1  mrg static int n_alternatives (const char *);
    105  1.1  mrg static void collect_insn_data (rtx, int *, int *);
    106  1.1  mrg static const char *alter_test_for_insn (class queue_elem *,
    107  1.1  mrg 					class queue_elem *);
    108  1.1  mrg static char *shift_output_template (char *, const char *, int);
    109  1.1  mrg static const char *alter_output_for_insn (class queue_elem *,
    110  1.1  mrg 					  class queue_elem *,
    111  1.1  mrg 					  int, int);
    112  1.1  mrg static void process_one_cond_exec (class queue_elem *);
    113  1.1  mrg static void process_define_cond_exec (void);
    114  1.1  mrg static void init_predicate_table (void);
    115  1.1  mrg static void record_insn_name (int, const char *);
    116  1.1  mrg 
    117  1.1  mrg static bool has_subst_attribute (class queue_elem *, class queue_elem *);
    118  1.1  mrg static const char * alter_output_for_subst_insn (rtx, int);
    119  1.1  mrg static void alter_attrs_for_subst_insn (class queue_elem *, int);
    120  1.1  mrg static void process_substs_on_one_elem (class queue_elem *,
    121  1.1  mrg 					class queue_elem *);
    122  1.1  mrg static rtx subst_dup (rtx, int, int);
    123  1.1  mrg static void process_define_subst (void);
    124  1.1  mrg 
    125  1.1  mrg static const char * duplicate_alternatives (const char *, int);
    126  1.1  mrg static const char * duplicate_each_alternative (const char * str, int n_dup);
    127  1.1  mrg 
    128  1.1  mrg typedef const char * (*constraints_handler_t) (const char *, int);
    129  1.1  mrg static rtx alter_constraints (rtx, int, constraints_handler_t);
    130  1.1  mrg static rtx adjust_operands_numbers (rtx);
    131  1.1  mrg static rtx replace_duplicating_operands_in_pattern (rtx);
    132  1.1  mrg 
    133  1.1  mrg /* Make a version of gen_rtx_CONST_INT so that GEN_INT can be used in
    135  1.1  mrg    the gensupport programs.  */
    136  1.1  mrg 
    137  1.1  mrg rtx
    138  1.1  mrg gen_rtx_CONST_INT (machine_mode ARG_UNUSED (mode),
    139  1.1  mrg 		   HOST_WIDE_INT arg)
    140  1.1  mrg {
    141  1.1  mrg   rtx rt = rtx_alloc (CONST_INT);
    142  1.1  mrg 
    143  1.1  mrg   XWINT (rt, 0) = arg;
    144  1.1  mrg   return rt;
    145  1.1  mrg }
    146  1.1  mrg 
    147  1.1  mrg /* Return the rtx pattern specified by the list of rtxes in a
    148  1.1  mrg    define_insn or define_split.  */
    149  1.1  mrg 
    150  1.1  mrg rtx
    151  1.1  mrg add_implicit_parallel (rtvec vec)
    152  1.1  mrg {
    153  1.1  mrg   if (GET_NUM_ELEM (vec) == 1)
    154  1.1  mrg     return RTVEC_ELT (vec, 0);
    155  1.1  mrg   else
    156  1.1  mrg     {
    157  1.1  mrg       rtx pattern = rtx_alloc (PARALLEL);
    158  1.1  mrg       XVEC (pattern, 0) = vec;
    159  1.1  mrg       return pattern;
    160  1.1  mrg     }
    161  1.1  mrg }
    162  1.1  mrg 
    163  1.1  mrg /* Predicate handling.
    165  1.1  mrg 
    166  1.1  mrg    We construct from the machine description a table mapping each
    167  1.1  mrg    predicate to a list of the rtl codes it can possibly match.  The
    168  1.1  mrg    function 'maybe_both_true' uses it to deduce that there are no
    169  1.1  mrg    expressions that can be matches by certain pairs of tree nodes.
    170  1.1  mrg    Also, if a predicate can match only one code, we can hardwire that
    171  1.1  mrg    code into the node testing the predicate.
    172  1.1  mrg 
    173  1.1  mrg    Some predicates are flagged as special.  validate_pattern will not
    174  1.1  mrg    warn about modeless match_operand expressions if they have a
    175  1.1  mrg    special predicate.  Predicates that allow only constants are also
    176  1.1  mrg    treated as special, for this purpose.
    177  1.1  mrg 
    178  1.1  mrg    validate_pattern will warn about predicates that allow non-lvalues
    179  1.1  mrg    when they appear in destination operands.
    180  1.1  mrg 
    181  1.1  mrg    Calculating the set of rtx codes that can possibly be accepted by a
    182  1.1  mrg    predicate expression EXP requires a three-state logic: any given
    183  1.1  mrg    subexpression may definitively accept a code C (Y), definitively
    184  1.1  mrg    reject a code C (N), or may have an indeterminate effect (I).  N
    185  1.1  mrg    and I is N; Y or I is Y; Y and I, N or I are both I.  Here are full
    186  1.1  mrg    truth tables.
    187  1.1  mrg 
    188  1.1  mrg      a b  a&b  a|b
    189  1.1  mrg      Y Y   Y    Y
    190  1.1  mrg      N Y   N    Y
    191  1.1  mrg      N N   N    N
    192  1.1  mrg      I Y   I    Y
    193  1.1  mrg      I N   N    I
    194  1.1  mrg      I I   I    I
    195  1.1  mrg 
    196  1.1  mrg    We represent Y with 1, N with 0, I with 2.  If any code is left in
    197  1.1  mrg    an I state by the complete expression, we must assume that that
    198  1.1  mrg    code can be accepted.  */
    199  1.1  mrg 
    200  1.1  mrg #define N 0
    201  1.1  mrg #define Y 1
    202  1.1  mrg #define I 2
    203  1.1  mrg 
    204  1.1  mrg #define TRISTATE_AND(a,b)			\
    205  1.1  mrg   ((a) == I ? ((b) == N ? N : I) :		\
    206  1.1  mrg    (b) == I ? ((a) == N ? N : I) :		\
    207  1.1  mrg    (a) && (b))
    208  1.1  mrg 
    209  1.1  mrg #define TRISTATE_OR(a,b)			\
    210  1.1  mrg   ((a) == I ? ((b) == Y ? Y : I) :		\
    211  1.1  mrg    (b) == I ? ((a) == Y ? Y : I) :		\
    212  1.1  mrg    (a) || (b))
    213  1.1  mrg 
    214  1.1  mrg #define TRISTATE_NOT(a)				\
    215  1.1  mrg   ((a) == I ? I : !(a))
    216  1.1  mrg 
    217  1.1  mrg /* 0 means no warning about that code yet, 1 means warned.  */
    218  1.1  mrg static char did_you_mean_codes[NUM_RTX_CODE];
    219  1.1  mrg 
    220  1.1  mrg /* Recursively calculate the set of rtx codes accepted by the
    221  1.1  mrg    predicate expression EXP, writing the result to CODES.  LOC is
    222  1.1  mrg    the .md file location of the directive containing EXP.  */
    223  1.1  mrg 
    224  1.1  mrg void
    225  1.1  mrg compute_test_codes (rtx exp, file_location loc, char *codes)
    226  1.1  mrg {
    227  1.1  mrg   char op0_codes[NUM_RTX_CODE];
    228  1.1  mrg   char op1_codes[NUM_RTX_CODE];
    229  1.1  mrg   char op2_codes[NUM_RTX_CODE];
    230  1.1  mrg   int i;
    231  1.1  mrg 
    232  1.1  mrg   switch (GET_CODE (exp))
    233  1.1  mrg     {
    234  1.1  mrg     case AND:
    235  1.1  mrg       compute_test_codes (XEXP (exp, 0), loc, op0_codes);
    236  1.1  mrg       compute_test_codes (XEXP (exp, 1), loc, op1_codes);
    237  1.1  mrg       for (i = 0; i < NUM_RTX_CODE; i++)
    238  1.1  mrg 	codes[i] = TRISTATE_AND (op0_codes[i], op1_codes[i]);
    239  1.1  mrg       break;
    240  1.1  mrg 
    241  1.1  mrg     case IOR:
    242  1.1  mrg       compute_test_codes (XEXP (exp, 0), loc, op0_codes);
    243  1.1  mrg       compute_test_codes (XEXP (exp, 1), loc, op1_codes);
    244  1.1  mrg       for (i = 0; i < NUM_RTX_CODE; i++)
    245  1.1  mrg 	codes[i] = TRISTATE_OR (op0_codes[i], op1_codes[i]);
    246  1.1  mrg       break;
    247  1.1  mrg     case NOT:
    248  1.1  mrg       compute_test_codes (XEXP (exp, 0), loc, op0_codes);
    249  1.1  mrg       for (i = 0; i < NUM_RTX_CODE; i++)
    250  1.1  mrg 	codes[i] = TRISTATE_NOT (op0_codes[i]);
    251  1.1  mrg       break;
    252  1.1  mrg 
    253  1.1  mrg     case IF_THEN_ELSE:
    254  1.1  mrg       /* a ? b : c  accepts the same codes as (a & b) | (!a & c).  */
    255  1.1  mrg       compute_test_codes (XEXP (exp, 0), loc, op0_codes);
    256  1.1  mrg       compute_test_codes (XEXP (exp, 1), loc, op1_codes);
    257  1.1  mrg       compute_test_codes (XEXP (exp, 2), loc, op2_codes);
    258  1.1  mrg       for (i = 0; i < NUM_RTX_CODE; i++)
    259  1.1  mrg 	codes[i] = TRISTATE_OR (TRISTATE_AND (op0_codes[i], op1_codes[i]),
    260  1.1  mrg 				TRISTATE_AND (TRISTATE_NOT (op0_codes[i]),
    261  1.1  mrg 					      op2_codes[i]));
    262  1.1  mrg       break;
    263  1.1  mrg 
    264  1.1  mrg     case MATCH_CODE:
    265  1.1  mrg       /* MATCH_CODE allows a specified list of codes.  However, if it
    266  1.1  mrg 	 does not apply to the top level of the expression, it does not
    267  1.1  mrg 	 constrain the set of codes for the top level.  */
    268  1.1  mrg       if (XSTR (exp, 1)[0] != '\0')
    269  1.1  mrg 	{
    270  1.1  mrg 	  memset (codes, Y, NUM_RTX_CODE);
    271  1.1  mrg 	  break;
    272  1.1  mrg 	}
    273  1.1  mrg 
    274  1.1  mrg       memset (codes, N, NUM_RTX_CODE);
    275  1.1  mrg       {
    276  1.1  mrg 	const char *next_code = XSTR (exp, 0);
    277  1.1  mrg 	const char *code;
    278  1.1  mrg 
    279  1.1  mrg 	if (*next_code == '\0')
    280  1.1  mrg 	  {
    281  1.1  mrg 	    error_at (loc, "empty match_code expression");
    282  1.1  mrg 	    break;
    283  1.1  mrg 	  }
    284  1.1  mrg 
    285  1.1  mrg 	while ((code = scan_comma_elt (&next_code)) != 0)
    286  1.1  mrg 	  {
    287  1.1  mrg 	    size_t n = next_code - code;
    288  1.1  mrg 	    int found_it = 0;
    289  1.1  mrg 
    290  1.1  mrg 	    for (i = 0; i < NUM_RTX_CODE; i++)
    291  1.1  mrg 	      if (!strncmp (code, GET_RTX_NAME (i), n)
    292  1.1  mrg 		  && GET_RTX_NAME (i)[n] == '\0')
    293  1.1  mrg 		{
    294  1.1  mrg 		  codes[i] = Y;
    295  1.1  mrg 		  found_it = 1;
    296  1.1  mrg 		  break;
    297  1.1  mrg 		}
    298  1.1  mrg 	    if (!found_it)
    299  1.1  mrg 	      {
    300  1.1  mrg 		error_at (loc, "match_code \"%.*s\" matches nothing",
    301  1.1  mrg 			  (int) n, code);
    302  1.1  mrg 		for (i = 0; i < NUM_RTX_CODE; i++)
    303  1.1  mrg 		  if (!strncasecmp (code, GET_RTX_NAME (i), n)
    304  1.1  mrg 		      && GET_RTX_NAME (i)[n] == '\0'
    305  1.1  mrg 		      && !did_you_mean_codes[i])
    306  1.1  mrg 		    {
    307  1.1  mrg 		      did_you_mean_codes[i] = 1;
    308  1.1  mrg 		      message_at (loc, "(did you mean \"%s\"?)",
    309  1.1  mrg 				  GET_RTX_NAME (i));
    310  1.1  mrg 		    }
    311  1.1  mrg 	      }
    312  1.1  mrg 	  }
    313  1.1  mrg       }
    314  1.1  mrg       break;
    315  1.1  mrg 
    316  1.1  mrg     case MATCH_OPERAND:
    317  1.1  mrg       /* MATCH_OPERAND disallows the set of codes that the named predicate
    318  1.1  mrg 	 disallows, and is indeterminate for the codes that it does allow.  */
    319  1.1  mrg       {
    320  1.1  mrg 	struct pred_data *p = lookup_predicate (XSTR (exp, 1));
    321  1.1  mrg 	if (!p)
    322  1.1  mrg 	  {
    323  1.1  mrg 	    error_at (loc, "reference to unknown predicate '%s'",
    324  1.1  mrg 		      XSTR (exp, 1));
    325  1.1  mrg 	    break;
    326  1.1  mrg 	  }
    327  1.1  mrg 	for (i = 0; i < NUM_RTX_CODE; i++)
    328  1.1  mrg 	  codes[i] = p->codes[i] ? I : N;
    329  1.1  mrg       }
    330  1.1  mrg       break;
    331  1.1  mrg 
    332  1.1  mrg 
    333  1.1  mrg     case MATCH_TEST:
    334  1.1  mrg       /* (match_test WHATEVER) is completely indeterminate.  */
    335  1.1  mrg       memset (codes, I, NUM_RTX_CODE);
    336  1.1  mrg       break;
    337  1.1  mrg 
    338  1.1  mrg     default:
    339  1.1  mrg       error_at (loc, "'%s' cannot be used in predicates or constraints",
    340  1.1  mrg 		GET_RTX_NAME (GET_CODE (exp)));
    341  1.1  mrg       memset (codes, I, NUM_RTX_CODE);
    342  1.1  mrg       break;
    343  1.1  mrg     }
    344  1.1  mrg }
    345  1.1  mrg 
    346  1.1  mrg #undef TRISTATE_OR
    347  1.1  mrg #undef TRISTATE_AND
    348  1.1  mrg #undef TRISTATE_NOT
    349  1.1  mrg 
    350  1.1  mrg /* Return true if NAME is a valid predicate name.  */
    351  1.1  mrg 
    352  1.1  mrg static bool
    353  1.1  mrg valid_predicate_name_p (const char *name)
    354  1.1  mrg {
    355  1.1  mrg   const char *p;
    356  1.1  mrg 
    357  1.1  mrg   if (!ISALPHA (name[0]) && name[0] != '_')
    358  1.1  mrg     return false;
    359  1.1  mrg   for (p = name + 1; *p; p++)
    360  1.1  mrg     if (!ISALNUM (*p) && *p != '_')
    361  1.1  mrg       return false;
    362  1.1  mrg   return true;
    363  1.1  mrg }
    364  1.1  mrg 
    365  1.1  mrg /* Process define_predicate directive DESC, which appears at location LOC.
    366  1.1  mrg    Compute the set of codes that can be matched, and record this as a known
    367  1.1  mrg    predicate.  */
    368  1.1  mrg 
    369  1.1  mrg static void
    370  1.1  mrg process_define_predicate (rtx desc, file_location loc)
    371  1.1  mrg {
    372  1.1  mrg   struct pred_data *pred;
    373  1.1  mrg   char codes[NUM_RTX_CODE];
    374  1.1  mrg   int i;
    375  1.1  mrg 
    376  1.1  mrg   if (!valid_predicate_name_p (XSTR (desc, 0)))
    377  1.1  mrg     {
    378  1.1  mrg       error_at (loc, "%s: predicate name must be a valid C function name",
    379  1.1  mrg 		XSTR (desc, 0));
    380  1.1  mrg       return;
    381  1.1  mrg     }
    382  1.1  mrg 
    383  1.1  mrg   pred = XCNEW (struct pred_data);
    384  1.1  mrg   pred->name = XSTR (desc, 0);
    385  1.1  mrg   pred->exp = XEXP (desc, 1);
    386  1.1  mrg   pred->c_block = XSTR (desc, 2);
    387  1.1  mrg   if (GET_CODE (desc) == DEFINE_SPECIAL_PREDICATE)
    388  1.1  mrg     pred->special = true;
    389  1.1  mrg 
    390  1.1  mrg   compute_test_codes (XEXP (desc, 1), loc, codes);
    391  1.1  mrg 
    392  1.1  mrg   for (i = 0; i < NUM_RTX_CODE; i++)
    393  1.1  mrg     if (codes[i] != N)
    394  1.1  mrg       add_predicate_code (pred, (enum rtx_code) i);
    395  1.1  mrg 
    396  1.1  mrg   add_predicate (pred);
    397  1.1  mrg }
    398  1.1  mrg #undef I
    399  1.1  mrg #undef N
    400  1.1  mrg #undef Y
    401  1.1  mrg 
    402  1.1  mrg /* Queue PATTERN on LIST_TAIL.  Return the address of the new queue
    404  1.1  mrg    element.  */
    405  1.1  mrg 
    406  1.1  mrg static class queue_elem *
    407  1.1  mrg queue_pattern (rtx pattern, class queue_elem ***list_tail,
    408  1.1  mrg 	       file_location loc)
    409  1.1  mrg {
    410  1.1  mrg   class queue_elem *e = XNEW (class queue_elem);
    411  1.1  mrg   e->data = pattern;
    412  1.1  mrg   e->loc = loc;
    413  1.1  mrg   e->next = NULL;
    414  1.1  mrg   e->split = NULL;
    415  1.1  mrg   **list_tail = e;
    416  1.1  mrg   *list_tail = &e->next;
    417  1.1  mrg   return e;
    418  1.1  mrg }
    419  1.1  mrg 
    420  1.1  mrg /* Remove element ELEM from QUEUE.  */
    421  1.1  mrg static void
    422  1.1  mrg remove_from_queue (class queue_elem *elem, class queue_elem **queue)
    423  1.1  mrg {
    424  1.1  mrg   class queue_elem *prev, *e;
    425  1.1  mrg   prev = NULL;
    426  1.1  mrg   for (e = *queue; e ; e = e->next)
    427  1.1  mrg     {
    428  1.1  mrg       if (e == elem)
    429  1.1  mrg 	break;
    430  1.1  mrg       prev = e;
    431  1.1  mrg     }
    432  1.1  mrg   if (e == NULL)
    433  1.1  mrg     return;
    434  1.1  mrg 
    435  1.1  mrg   if (prev)
    436  1.1  mrg     prev->next = elem->next;
    437  1.1  mrg   else
    438  1.1  mrg     *queue = elem->next;
    439  1.1  mrg }
    440  1.1  mrg 
    441  1.1  mrg /* Build a define_attr for an binary attribute with name NAME and
    442  1.1  mrg    possible values "yes" and "no", and queue it.  */
    443  1.1  mrg static void
    444  1.1  mrg add_define_attr (const char *name)
    445  1.1  mrg {
    446  1.1  mrg   class queue_elem *e = XNEW (class queue_elem);
    447  1.1  mrg   rtx t1 = rtx_alloc (DEFINE_ATTR);
    448  1.1  mrg   XSTR (t1, 0) = name;
    449  1.1  mrg   XSTR (t1, 1) = "no,yes";
    450  1.1  mrg   XEXP (t1, 2) = rtx_alloc (CONST_STRING);
    451  1.1  mrg   XSTR (XEXP (t1, 2), 0) = "yes";
    452  1.1  mrg   e->data = t1;
    453  1.1  mrg   e->loc = file_location ("built-in", -1, -1);
    454  1.1  mrg   e->next = define_attr_queue;
    455  1.1  mrg   define_attr_queue = e;
    456  1.1  mrg 
    457  1.1  mrg }
    458  1.1  mrg 
    459  1.1  mrg /* Recursively remove constraints from an rtx.  */
    460  1.1  mrg 
    461  1.1  mrg static void
    462  1.1  mrg remove_constraints (rtx part)
    463  1.1  mrg {
    464  1.1  mrg   int i, j;
    465  1.1  mrg   const char *format_ptr;
    466  1.1  mrg 
    467  1.1  mrg   if (part == 0)
    468  1.1  mrg     return;
    469  1.1  mrg 
    470  1.1  mrg   if (GET_CODE (part) == MATCH_OPERAND)
    471  1.1  mrg     XSTR (part, 2) = "";
    472  1.1  mrg   else if (GET_CODE (part) == MATCH_SCRATCH)
    473  1.1  mrg     XSTR (part, 1) = "";
    474  1.1  mrg 
    475  1.1  mrg   format_ptr = GET_RTX_FORMAT (GET_CODE (part));
    476  1.1  mrg 
    477  1.1  mrg   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (part)); i++)
    478  1.1  mrg     switch (*format_ptr++)
    479  1.1  mrg       {
    480  1.1  mrg       case 'e':
    481  1.1  mrg       case 'u':
    482  1.1  mrg 	remove_constraints (XEXP (part, i));
    483  1.1  mrg 	break;
    484  1.1  mrg       case 'E':
    485  1.1  mrg 	if (XVEC (part, i) != NULL)
    486  1.1  mrg 	  for (j = 0; j < XVECLEN (part, i); j++)
    487  1.1  mrg 	    remove_constraints (XVECEXP (part, i, j));
    488  1.1  mrg 	break;
    489  1.1  mrg       }
    490  1.1  mrg }
    491  1.1  mrg 
    492  1.1  mrg /* Recursively replace MATCH_OPERANDs with MATCH_DUPs and MATCH_OPERATORs
    493  1.1  mrg    with MATCH_OP_DUPs in X.  */
    494  1.1  mrg 
    495  1.1  mrg static rtx
    496  1.1  mrg replace_operands_with_dups (rtx x)
    497  1.1  mrg {
    498  1.1  mrg   if (x == 0)
    499  1.1  mrg     return x;
    500  1.1  mrg 
    501  1.1  mrg   rtx newx;
    502  1.1  mrg   if (GET_CODE (x) == MATCH_OPERAND)
    503  1.1  mrg     {
    504  1.1  mrg       newx = rtx_alloc (MATCH_DUP);
    505  1.1  mrg       XINT (newx, 0) = XINT (x, 0);
    506  1.1  mrg       x = newx;
    507  1.1  mrg     }
    508  1.1  mrg   else if (GET_CODE (x) == MATCH_OPERATOR)
    509  1.1  mrg     {
    510  1.1  mrg       newx = rtx_alloc (MATCH_OP_DUP);
    511  1.1  mrg       XINT (newx, 0) = XINT (x, 0);
    512  1.1  mrg       XVEC (newx, 1) = XVEC (x, 2);
    513  1.1  mrg       x = newx;
    514  1.1  mrg     }
    515  1.1  mrg   else
    516  1.1  mrg     newx = shallow_copy_rtx (x);
    517  1.1  mrg 
    518  1.1  mrg   const char *format_ptr = GET_RTX_FORMAT (GET_CODE (x));
    519  1.1  mrg   for (int i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
    520  1.1  mrg     switch (*format_ptr++)
    521  1.1  mrg       {
    522  1.1  mrg       case 'e':
    523  1.1  mrg       case 'u':
    524  1.1  mrg 	XEXP (newx, i) = replace_operands_with_dups (XEXP (x, i));
    525  1.1  mrg 	break;
    526  1.1  mrg       case 'E':
    527  1.1  mrg 	if (XVEC (x, i) != NULL)
    528  1.1  mrg 	  {
    529  1.1  mrg 	    XVEC (newx, i) = rtvec_alloc (XVECLEN (x, i));
    530  1.1  mrg 	    for (int j = 0; j < XVECLEN (x, i); j++)
    531  1.1  mrg 	      XVECEXP (newx, i, j)
    532  1.1  mrg 		= replace_operands_with_dups (XVECEXP (x, i, j));
    533  1.1  mrg 	  }
    534  1.1  mrg 	break;
    535  1.1  mrg       }
    536  1.1  mrg   return newx;
    537  1.1  mrg }
    538  1.1  mrg 
    539  1.1  mrg /* Convert matching pattern VEC from a DEFINE_INSN_AND_REWRITE into
    540  1.1  mrg    a sequence that should be generated by the splitter.  */
    541  1.1  mrg 
    542  1.1  mrg static rtvec
    543  1.1  mrg gen_rewrite_sequence (rtvec vec)
    544  1.1  mrg {
    545  1.1  mrg   rtvec new_vec = rtvec_alloc (1);
    546  1.1  mrg   rtx x = add_implicit_parallel (vec);
    547  1.1  mrg   RTVEC_ELT (new_vec, 0) = replace_operands_with_dups (x);
    548  1.1  mrg   return new_vec;
    549  1.1  mrg }
    550  1.1  mrg 
    551  1.1  mrg /* Process a top level rtx in some way, queuing as appropriate.  */
    552  1.1  mrg 
    553  1.1  mrg static void
    554  1.1  mrg process_rtx (rtx desc, file_location loc)
    555  1.1  mrg {
    556  1.1  mrg   switch (GET_CODE (desc))
    557  1.1  mrg     {
    558  1.1  mrg     case DEFINE_INSN:
    559  1.1  mrg       queue_pattern (desc, &define_insn_tail, loc);
    560  1.1  mrg       break;
    561  1.1  mrg 
    562  1.1  mrg     case DEFINE_COND_EXEC:
    563  1.1  mrg       queue_pattern (desc, &define_cond_exec_tail, loc);
    564  1.1  mrg       break;
    565  1.1  mrg 
    566  1.1  mrg     case DEFINE_SUBST:
    567  1.1  mrg       queue_pattern (desc, &define_subst_tail, loc);
    568  1.1  mrg       break;
    569  1.1  mrg 
    570  1.1  mrg     case DEFINE_SUBST_ATTR:
    571  1.1  mrg       queue_pattern (desc, &define_subst_attr_tail, loc);
    572  1.1  mrg       break;
    573  1.1  mrg 
    574  1.1  mrg     case DEFINE_ATTR:
    575  1.1  mrg     case DEFINE_ENUM_ATTR:
    576  1.1  mrg       queue_pattern (desc, &define_attr_tail, loc);
    577  1.1  mrg       break;
    578  1.1  mrg 
    579  1.1  mrg     case DEFINE_PREDICATE:
    580  1.1  mrg     case DEFINE_SPECIAL_PREDICATE:
    581  1.1  mrg       process_define_predicate (desc, loc);
    582  1.1  mrg       /* Fall through.  */
    583  1.1  mrg 
    584  1.1  mrg     case DEFINE_CONSTRAINT:
    585  1.1  mrg     case DEFINE_REGISTER_CONSTRAINT:
    586  1.1  mrg     case DEFINE_MEMORY_CONSTRAINT:
    587  1.1  mrg     case DEFINE_SPECIAL_MEMORY_CONSTRAINT:
    588  1.1  mrg     case DEFINE_RELAXED_MEMORY_CONSTRAINT:
    589  1.1  mrg     case DEFINE_ADDRESS_CONSTRAINT:
    590  1.1  mrg       queue_pattern (desc, &define_pred_tail, loc);
    591  1.1  mrg       break;
    592  1.1  mrg 
    593  1.1  mrg     case DEFINE_INSN_AND_SPLIT:
    594  1.1  mrg     case DEFINE_INSN_AND_REWRITE:
    595  1.1  mrg       {
    596  1.1  mrg 	const char *split_cond;
    597  1.1  mrg 	rtx split;
    598  1.1  mrg 	rtvec attr;
    599  1.1  mrg 	int i;
    600  1.1  mrg 	class queue_elem *insn_elem;
    601  1.1  mrg 	class queue_elem *split_elem;
    602  1.1  mrg 	int split_code = (GET_CODE (desc) == DEFINE_INSN_AND_REWRITE ? 5 : 6);
    603  1.1  mrg 
    604  1.1  mrg 	/* Create a split with values from the insn_and_split.  */
    605  1.1  mrg 	split = rtx_alloc (DEFINE_SPLIT);
    606  1.1  mrg 
    607  1.1  mrg 	i = XVECLEN (desc, 1);
    608  1.1  mrg 	XVEC (split, 0) = rtvec_alloc (i);
    609  1.1  mrg 	while (--i >= 0)
    610  1.1  mrg 	  {
    611  1.1  mrg 	    XVECEXP (split, 0, i) = copy_rtx (XVECEXP (desc, 1, i));
    612  1.1  mrg 	    remove_constraints (XVECEXP (split, 0, i));
    613  1.1  mrg 	  }
    614  1.1  mrg 
    615  1.1  mrg 	/* If the split condition starts with "&&", append it to the
    616  1.1  mrg 	   insn condition to create the new split condition.  */
    617  1.1  mrg 	split_cond = XSTR (desc, 4);
    618  1.1  mrg 	if (split_cond[0] == '&' && split_cond[1] == '&')
    619  1.1  mrg 	  {
    620  1.1  mrg 	    rtx_reader_ptr->copy_md_ptr_loc (split_cond + 2, split_cond);
    621  1.1  mrg 	    split_cond = rtx_reader_ptr->join_c_conditions (XSTR (desc, 2),
    622  1.1  mrg 							    split_cond + 2);
    623  1.1  mrg 	  }
    624  1.1  mrg 	else if (GET_CODE (desc) == DEFINE_INSN_AND_REWRITE)
    625  1.1  mrg 	  error_at (loc, "the rewrite condition must start with `&&'");
    626  1.1  mrg 	XSTR (split, 1) = split_cond;
    627  1.1  mrg 	if (GET_CODE (desc) == DEFINE_INSN_AND_REWRITE)
    628  1.1  mrg 	  XVEC (split, 2) = gen_rewrite_sequence (XVEC (desc, 1));
    629  1.1  mrg 	else
    630  1.1  mrg 	  XVEC (split, 2) = XVEC (desc, 5);
    631  1.1  mrg 	XSTR (split, 3) = XSTR (desc, split_code);
    632  1.1  mrg 
    633  1.1  mrg 	/* Fix up the DEFINE_INSN.  */
    634  1.1  mrg 	attr = XVEC (desc, split_code + 1);
    635  1.1  mrg 	PUT_CODE (desc, DEFINE_INSN);
    636  1.1  mrg 	XVEC (desc, 4) = attr;
    637  1.1  mrg 
    638  1.1  mrg 	/* Queue them.  */
    639  1.1  mrg 	insn_elem = queue_pattern (desc, &define_insn_tail, loc);
    640  1.1  mrg 	split_elem = queue_pattern (split, &other_tail, loc);
    641  1.1  mrg 	insn_elem->split = split_elem;
    642  1.1  mrg 	break;
    643  1.1  mrg       }
    644  1.1  mrg 
    645  1.1  mrg     default:
    646  1.1  mrg       queue_pattern (desc, &other_tail, loc);
    647  1.1  mrg       break;
    648  1.1  mrg     }
    649  1.1  mrg }
    650  1.1  mrg 
    651  1.1  mrg /* Return true if attribute PREDICABLE is true for ELEM, which holds
    653  1.1  mrg    a DEFINE_INSN.  */
    654  1.1  mrg 
    655  1.1  mrg static int
    656  1.1  mrg is_predicable (class queue_elem *elem)
    657  1.1  mrg {
    658  1.1  mrg   rtvec vec = XVEC (elem->data, 4);
    659  1.1  mrg   const char *value;
    660  1.1  mrg   int i;
    661  1.1  mrg 
    662  1.1  mrg   if (! vec)
    663  1.1  mrg     return predicable_default;
    664  1.1  mrg 
    665  1.1  mrg   for (i = GET_NUM_ELEM (vec) - 1; i >= 0; --i)
    666  1.1  mrg     {
    667  1.1  mrg       rtx sub = RTVEC_ELT (vec, i);
    668  1.1  mrg       switch (GET_CODE (sub))
    669  1.1  mrg 	{
    670  1.1  mrg 	case SET_ATTR:
    671  1.1  mrg 	  if (strcmp (XSTR (sub, 0), "predicable") == 0)
    672  1.1  mrg 	    {
    673  1.1  mrg 	      value = XSTR (sub, 1);
    674  1.1  mrg 	      goto found;
    675  1.1  mrg 	    }
    676  1.1  mrg 	  break;
    677  1.1  mrg 
    678  1.1  mrg 	case SET_ATTR_ALTERNATIVE:
    679  1.1  mrg 	  if (strcmp (XSTR (sub, 0), "predicable") == 0)
    680  1.1  mrg 	    {
    681  1.1  mrg 	      error_at (elem->loc, "multiple alternatives for `predicable'");
    682  1.1  mrg 	      return 0;
    683  1.1  mrg 	    }
    684  1.1  mrg 	  break;
    685  1.1  mrg 
    686  1.1  mrg 	case SET:
    687  1.1  mrg 	  if (GET_CODE (SET_DEST (sub)) != ATTR
    688  1.1  mrg 	      || strcmp (XSTR (SET_DEST (sub), 0), "predicable") != 0)
    689  1.1  mrg 	    break;
    690  1.1  mrg 	  sub = SET_SRC (sub);
    691  1.1  mrg 	  if (GET_CODE (sub) == CONST_STRING)
    692  1.1  mrg 	    {
    693  1.1  mrg 	      value = XSTR (sub, 0);
    694  1.1  mrg 	      goto found;
    695  1.1  mrg 	    }
    696  1.1  mrg 
    697  1.1  mrg 	  /* ??? It would be possible to handle this if we really tried.
    698  1.1  mrg 	     It's not easy though, and I'm not going to bother until it
    699  1.1  mrg 	     really proves necessary.  */
    700  1.1  mrg 	  error_at (elem->loc, "non-constant value for `predicable'");
    701  1.1  mrg 	  return 0;
    702  1.1  mrg 
    703  1.1  mrg 	default:
    704  1.1  mrg 	  gcc_unreachable ();
    705  1.1  mrg 	}
    706  1.1  mrg     }
    707  1.1  mrg 
    708  1.1  mrg   return predicable_default;
    709  1.1  mrg 
    710  1.1  mrg  found:
    711  1.1  mrg   /* Find out which value we're looking at.  Multiple alternatives means at
    712  1.1  mrg      least one is predicable.  */
    713  1.1  mrg   if (strchr (value, ',') != NULL)
    714  1.1  mrg     return 1;
    715  1.1  mrg   if (strcmp (value, predicable_true) == 0)
    716  1.1  mrg     return 1;
    717  1.1  mrg   if (strcmp (value, predicable_false) == 0)
    718  1.1  mrg     return 0;
    719  1.1  mrg 
    720  1.1  mrg   error_at (elem->loc, "unknown value `%s' for `predicable' attribute", value);
    721  1.1  mrg   return 0;
    722  1.1  mrg }
    723  1.1  mrg 
    724  1.1  mrg /* Find attribute SUBST in ELEM and assign NEW_VALUE to it.  */
    725  1.1  mrg static void
    726  1.1  mrg change_subst_attribute (class queue_elem *elem,
    727  1.1  mrg 			class queue_elem *subst_elem,
    728  1.1  mrg 			const char *new_value)
    729  1.1  mrg {
    730  1.1  mrg   rtvec attrs_vec = XVEC (elem->data, 4);
    731  1.1  mrg   const char *subst_name = XSTR (subst_elem->data, 0);
    732  1.1  mrg   int i;
    733  1.1  mrg 
    734  1.1  mrg   if (! attrs_vec)
    735  1.1  mrg     return;
    736  1.1  mrg 
    737  1.1  mrg   for (i = GET_NUM_ELEM (attrs_vec) - 1; i >= 0; --i)
    738  1.1  mrg     {
    739  1.1  mrg       rtx cur_attr = RTVEC_ELT (attrs_vec, i);
    740  1.1  mrg       if (GET_CODE (cur_attr) != SET_ATTR)
    741  1.1  mrg 	continue;
    742  1.1  mrg       if (strcmp (XSTR (cur_attr, 0), subst_name) == 0)
    743  1.1  mrg 	{
    744  1.1  mrg 	  XSTR (cur_attr, 1) = new_value;
    745  1.1  mrg 	  return;
    746  1.1  mrg 	}
    747  1.1  mrg     }
    748  1.1  mrg }
    749  1.1  mrg 
    750  1.1  mrg /* Return true if ELEM has the attribute with the name of DEFINE_SUBST
    751  1.1  mrg    represented by SUBST_ELEM and this attribute has value SUBST_TRUE.
    752  1.1  mrg    DEFINE_SUBST isn't applied to patterns without such attribute.  In other
    753  1.1  mrg    words, we suppose the default value of the attribute to be 'no' since it is
    754  1.1  mrg    always generated automatically in read-rtl.cc.  */
    755  1.1  mrg static bool
    756  1.1  mrg has_subst_attribute (class queue_elem *elem, class queue_elem *subst_elem)
    757  1.1  mrg {
    758  1.1  mrg   rtvec attrs_vec = XVEC (elem->data, 4);
    759  1.1  mrg   const char *value, *subst_name = XSTR (subst_elem->data, 0);
    760  1.1  mrg   int i;
    761  1.1  mrg 
    762  1.1  mrg   if (! attrs_vec)
    763  1.1  mrg     return false;
    764  1.1  mrg 
    765  1.1  mrg   for (i = GET_NUM_ELEM (attrs_vec) - 1; i >= 0; --i)
    766  1.1  mrg     {
    767  1.1  mrg       rtx cur_attr = RTVEC_ELT (attrs_vec, i);
    768  1.1  mrg       switch (GET_CODE (cur_attr))
    769  1.1  mrg 	{
    770  1.1  mrg 	case SET_ATTR:
    771  1.1  mrg 	  if (strcmp (XSTR (cur_attr, 0), subst_name) == 0)
    772  1.1  mrg 	    {
    773  1.1  mrg 	      value = XSTR (cur_attr, 1);
    774  1.1  mrg 	      goto found;
    775  1.1  mrg 	    }
    776  1.1  mrg 	  break;
    777  1.1  mrg 
    778  1.1  mrg 	case SET:
    779  1.1  mrg 	  if (GET_CODE (SET_DEST (cur_attr)) != ATTR
    780  1.1  mrg 	      || strcmp (XSTR (SET_DEST (cur_attr), 0), subst_name) != 0)
    781  1.1  mrg 	    break;
    782  1.1  mrg 	  cur_attr = SET_SRC (cur_attr);
    783  1.1  mrg 	  if (GET_CODE (cur_attr) == CONST_STRING)
    784  1.1  mrg 	    {
    785  1.1  mrg 	      value = XSTR (cur_attr, 0);
    786  1.1  mrg 	      goto found;
    787  1.1  mrg 	    }
    788  1.1  mrg 
    789  1.1  mrg 	  /* Only (set_attr "subst" "yes/no") and
    790  1.1  mrg 		  (set (attr "subst" (const_string "yes/no")))
    791  1.1  mrg 	     are currently allowed.  */
    792  1.1  mrg 	  error_at (elem->loc, "unsupported value for `%s'", subst_name);
    793  1.1  mrg 	  return false;
    794  1.1  mrg 
    795  1.1  mrg 	case SET_ATTR_ALTERNATIVE:
    796  1.1  mrg 	  if (strcmp (XSTR (cur_attr, 0), subst_name) == 0)
    797  1.1  mrg 	    error_at (elem->loc,
    798  1.1  mrg 		      "%s: `set_attr_alternative' is unsupported by "
    799  1.1  mrg 		      "`define_subst'", XSTR (elem->data, 0));
    800  1.1  mrg 	  return false;
    801  1.1  mrg 
    802  1.1  mrg 
    803  1.1  mrg 	default:
    804  1.1  mrg 	  gcc_unreachable ();
    805  1.1  mrg 	}
    806  1.1  mrg     }
    807  1.1  mrg 
    808  1.1  mrg   return false;
    809  1.1  mrg 
    810  1.1  mrg  found:
    811  1.1  mrg   if (strcmp (value, subst_true) == 0)
    812  1.1  mrg     return true;
    813  1.1  mrg   if (strcmp (value, subst_false) == 0)
    814  1.1  mrg     return false;
    815  1.1  mrg 
    816  1.1  mrg   error_at (elem->loc, "unknown value `%s' for `%s' attribute",
    817  1.1  mrg 	    value, subst_name);
    818  1.1  mrg   return false;
    819  1.1  mrg }
    820  1.1  mrg 
    821  1.1  mrg /* Compare RTL-template of original define_insn X to input RTL-template of
    822  1.1  mrg    define_subst PT.  Return 1 if the templates match, 0 otherwise.
    823  1.1  mrg    During the comparison, the routine also fills global_array OPERAND_DATA.  */
    824  1.1  mrg static bool
    825  1.1  mrg subst_pattern_match (rtx x, rtx pt, file_location loc)
    826  1.1  mrg {
    827  1.1  mrg   RTX_CODE code, code_pt;
    828  1.1  mrg   int i, j, len;
    829  1.1  mrg   const char *fmt, *pred_name;
    830  1.1  mrg 
    831  1.1  mrg   code = GET_CODE (x);
    832  1.1  mrg   code_pt = GET_CODE (pt);
    833  1.1  mrg 
    834  1.1  mrg   if (code_pt == MATCH_OPERAND)
    835  1.1  mrg     {
    836  1.1  mrg       /* MATCH_DUP, and MATCH_OP_DUP don't have a specified mode, so we
    837  1.1  mrg 	 always accept them.  */
    838  1.1  mrg       if (GET_MODE (pt) != VOIDmode && GET_MODE (x) != GET_MODE (pt)
    839  1.1  mrg 	  && (code != MATCH_DUP && code != MATCH_OP_DUP))
    840  1.1  mrg 	return false; /* Modes don't match.  */
    841  1.1  mrg 
    842  1.1  mrg       if (code == MATCH_OPERAND)
    843  1.1  mrg 	{
    844  1.1  mrg 	  pred_name = XSTR (pt, 1);
    845  1.1  mrg 	  if (pred_name[0] != 0)
    846  1.1  mrg 	    {
    847  1.1  mrg 	      const struct pred_data *pred_pt = lookup_predicate (pred_name);
    848  1.1  mrg 	      if (!pred_pt || pred_pt != lookup_predicate (XSTR (x, 1)))
    849  1.1  mrg 		return false; /* Predicates don't match.  */
    850  1.1  mrg 	    }
    851  1.1  mrg 	}
    852  1.1  mrg 
    853  1.1  mrg       gcc_assert (XINT (pt, 0) >= 0 && XINT (pt, 0) < MAX_OPERANDS);
    854  1.1  mrg       operand_data[XINT (pt, 0)] = x;
    855  1.1  mrg       return true;
    856  1.1  mrg     }
    857  1.1  mrg 
    858  1.1  mrg   if (code_pt == MATCH_OPERATOR)
    859  1.1  mrg     {
    860  1.1  mrg       int x_vecexp_pos = -1;
    861  1.1  mrg 
    862  1.1  mrg       /* Compare modes.  */
    863  1.1  mrg       if (GET_MODE (pt) != VOIDmode && GET_MODE (x) != GET_MODE (pt))
    864  1.1  mrg 	return false;
    865  1.1  mrg 
    866  1.1  mrg       /* In case X is also match_operator, compare predicates.  */
    867  1.1  mrg       if (code == MATCH_OPERATOR)
    868  1.1  mrg 	{
    869  1.1  mrg 	  pred_name = XSTR (pt, 1);
    870  1.1  mrg 	  if (pred_name[0] != 0)
    871  1.1  mrg 	    {
    872  1.1  mrg 	      const struct pred_data *pred_pt = lookup_predicate (pred_name);
    873  1.1  mrg 	      if (!pred_pt || pred_pt != lookup_predicate (XSTR (x, 1)))
    874  1.1  mrg 		return false;
    875  1.1  mrg 	    }
    876  1.1  mrg 	}
    877  1.1  mrg 
    878  1.1  mrg       /* Compare operands.
    879  1.1  mrg 	 MATCH_OPERATOR in input template could match in original template
    880  1.1  mrg 	 either 1) MATCH_OPERAND, 2) UNSPEC, 3) ordinary operation (like PLUS).
    881  1.1  mrg 	 In the first case operands are at (XVECEXP (x, 2, j)), in the second
    882  1.1  mrg 	 - at (XVECEXP (x, 0, j)), in the last one - (XEXP (x, j)).
    883  1.1  mrg 	 X_VECEXP_POS variable shows, where to look for these operands.  */
    884  1.1  mrg       if (code == UNSPEC
    885  1.1  mrg 	  || code == UNSPEC_VOLATILE)
    886  1.1  mrg 	x_vecexp_pos = 0;
    887  1.1  mrg       else if (code == MATCH_OPERATOR)
    888  1.1  mrg 	x_vecexp_pos = 2;
    889  1.1  mrg       else
    890  1.1  mrg 	x_vecexp_pos = -1;
    891  1.1  mrg 
    892  1.1  mrg       /* MATCH_OPERATOR or UNSPEC case.  */
    893  1.1  mrg       if (x_vecexp_pos >= 0)
    894  1.1  mrg 	{
    895  1.1  mrg 	  /* Compare operands number in X and PT.  */
    896  1.1  mrg 	  if (XVECLEN (x, x_vecexp_pos) != XVECLEN (pt, 2))
    897  1.1  mrg 	    return false;
    898  1.1  mrg 	  for (j = 0; j < XVECLEN (pt, 2); j++)
    899  1.1  mrg 	    if (!subst_pattern_match (XVECEXP (x, x_vecexp_pos, j),
    900  1.1  mrg 				      XVECEXP (pt, 2, j), loc))
    901  1.1  mrg 	      return false;
    902  1.1  mrg 	}
    903  1.1  mrg 
    904  1.1  mrg       /* Ordinary operator.  */
    905  1.1  mrg       else
    906  1.1  mrg 	{
    907  1.1  mrg 	  /* Compare operands number in X and PT.
    908  1.1  mrg 	     We count operands differently for X and PT since we compare
    909  1.1  mrg 	     an operator (with operands directly in RTX) and MATCH_OPERATOR
    910  1.1  mrg 	     (that has a vector with operands).  */
    911  1.1  mrg 	  if (GET_RTX_LENGTH (code) != XVECLEN (pt, 2))
    912  1.1  mrg 	    return false;
    913  1.1  mrg 	  for (j = 0; j < XVECLEN (pt, 2); j++)
    914  1.1  mrg 	    if (!subst_pattern_match (XEXP (x, j), XVECEXP (pt, 2, j), loc))
    915  1.1  mrg 	      return false;
    916  1.1  mrg 	}
    917  1.1  mrg 
    918  1.1  mrg       /* Store the operand to OPERAND_DATA array.  */
    919  1.1  mrg       gcc_assert (XINT (pt, 0) >= 0 && XINT (pt, 0) < MAX_OPERANDS);
    920  1.1  mrg       operand_data[XINT (pt, 0)] = x;
    921  1.1  mrg       return true;
    922  1.1  mrg     }
    923  1.1  mrg 
    924  1.1  mrg   if (code_pt == MATCH_PAR_DUP
    925  1.1  mrg       || code_pt == MATCH_DUP
    926  1.1  mrg       || code_pt == MATCH_OP_DUP
    927  1.1  mrg       || code_pt == MATCH_SCRATCH
    928  1.1  mrg       || code_pt == MATCH_PARALLEL)
    929  1.1  mrg     {
    930  1.1  mrg       /* Currently interface for these constructions isn't defined -
    931  1.1  mrg 	 probably they aren't needed in input template of define_subst at all.
    932  1.1  mrg 	 So, for now their usage in define_subst is forbidden.  */
    933  1.1  mrg       error_at (loc, "%s cannot be used in define_subst",
    934  1.1  mrg 		GET_RTX_NAME (code_pt));
    935  1.1  mrg     }
    936  1.1  mrg 
    937  1.1  mrg   gcc_assert (code != MATCH_PAR_DUP
    938  1.1  mrg       && code_pt != MATCH_DUP
    939  1.1  mrg       && code_pt != MATCH_OP_DUP
    940  1.1  mrg       && code_pt != MATCH_SCRATCH
    941  1.1  mrg       && code_pt != MATCH_PARALLEL
    942  1.1  mrg       && code_pt != MATCH_OPERAND
    943  1.1  mrg       && code_pt != MATCH_OPERATOR);
    944  1.1  mrg   /* If PT is none of the handled above, then we match only expressions with
    945  1.1  mrg      the same code in X.  */
    946  1.1  mrg   if (code != code_pt)
    947  1.1  mrg     return false;
    948  1.1  mrg 
    949  1.1  mrg   fmt = GET_RTX_FORMAT (code_pt);
    950  1.1  mrg   len = GET_RTX_LENGTH (code_pt);
    951  1.1  mrg 
    952  1.1  mrg   for (i = 0; i < len; i++)
    953  1.1  mrg     {
    954  1.1  mrg       if (fmt[i] == '0')
    955  1.1  mrg 	break;
    956  1.1  mrg 
    957  1.1  mrg       switch (fmt[i])
    958  1.1  mrg 	{
    959  1.1  mrg 	case 'r': case 'p': case 'i': case 'w': case 's':
    960  1.1  mrg 	  continue;
    961  1.1  mrg 
    962  1.1  mrg 	case 'e': case 'u':
    963  1.1  mrg 	  if (!subst_pattern_match (XEXP (x, i), XEXP (pt, i), loc))
    964  1.1  mrg 	    return false;
    965  1.1  mrg 	  break;
    966  1.1  mrg 	case 'E':
    967  1.1  mrg 	  {
    968  1.1  mrg 	    if (XVECLEN (x, i) != XVECLEN (pt, i))
    969  1.1  mrg 	      return false;
    970  1.1  mrg 	    for (j = 0; j < XVECLEN (pt, i); j++)
    971  1.1  mrg 	      if (!subst_pattern_match (XVECEXP (x, i, j),
    972  1.1  mrg 					XVECEXP (pt, i, j), loc))
    973  1.1  mrg 		return false;
    974  1.1  mrg 	    break;
    975  1.1  mrg 	  }
    976  1.1  mrg 	default:
    977  1.1  mrg 	  gcc_unreachable ();
    978  1.1  mrg 	}
    979  1.1  mrg     }
    980  1.1  mrg 
    981  1.1  mrg   return true;
    982  1.1  mrg }
    983  1.1  mrg 
    984  1.1  mrg /* Examine the attribute "predicable"; discover its boolean values
    985  1.1  mrg    and its default.  */
    986  1.1  mrg 
    987  1.1  mrg static void
    988  1.1  mrg identify_predicable_attribute (void)
    989  1.1  mrg {
    990  1.1  mrg   class queue_elem *elem;
    991  1.1  mrg   char *p_true, *p_false;
    992  1.1  mrg   const char *value;
    993  1.1  mrg 
    994  1.1  mrg   /* Look for the DEFINE_ATTR for `predicable', which must exist.  */
    995  1.1  mrg   for (elem = define_attr_queue; elem ; elem = elem->next)
    996  1.1  mrg     if (strcmp (XSTR (elem->data, 0), "predicable") == 0)
    997  1.1  mrg       goto found;
    998  1.1  mrg 
    999  1.1  mrg   error_at (define_cond_exec_queue->loc,
   1000  1.1  mrg 	    "attribute `predicable' not defined");
   1001  1.1  mrg   return;
   1002  1.1  mrg 
   1003  1.1  mrg  found:
   1004  1.1  mrg   value = XSTR (elem->data, 1);
   1005  1.1  mrg   p_false = xstrdup (value);
   1006  1.1  mrg   p_true = strchr (p_false, ',');
   1007  1.1  mrg   if (p_true == NULL || strchr (++p_true, ',') != NULL)
   1008  1.1  mrg     {
   1009  1.1  mrg       error_at (elem->loc, "attribute `predicable' is not a boolean");
   1010  1.1  mrg       free (p_false);
   1011  1.1  mrg       return;
   1012  1.1  mrg     }
   1013  1.1  mrg   p_true[-1] = '\0';
   1014  1.1  mrg 
   1015  1.1  mrg   predicable_true = p_true;
   1016  1.1  mrg   predicable_false = p_false;
   1017  1.1  mrg 
   1018  1.1  mrg   switch (GET_CODE (XEXP (elem->data, 2)))
   1019  1.1  mrg     {
   1020  1.1  mrg     case CONST_STRING:
   1021  1.1  mrg       value = XSTR (XEXP (elem->data, 2), 0);
   1022  1.1  mrg       break;
   1023  1.1  mrg 
   1024  1.1  mrg     case CONST:
   1025  1.1  mrg       error_at (elem->loc, "attribute `predicable' cannot be const");
   1026  1.1  mrg       free (p_false);
   1027  1.1  mrg       return;
   1028  1.1  mrg 
   1029  1.1  mrg     default:
   1030  1.1  mrg       error_at (elem->loc,
   1031  1.1  mrg 		"attribute `predicable' must have a constant default");
   1032  1.1  mrg       free (p_false);
   1033  1.1  mrg       return;
   1034  1.1  mrg     }
   1035  1.1  mrg 
   1036  1.1  mrg   if (strcmp (value, p_true) == 0)
   1037  1.1  mrg     predicable_default = 1;
   1038  1.1  mrg   else if (strcmp (value, p_false) == 0)
   1039  1.1  mrg     predicable_default = 0;
   1040  1.1  mrg   else
   1041  1.1  mrg     {
   1042  1.1  mrg       error_at (elem->loc, "unknown value `%s' for `predicable' attribute",
   1043  1.1  mrg 		value);
   1044  1.1  mrg       free (p_false);
   1045  1.1  mrg     }
   1046  1.1  mrg }
   1047  1.1  mrg 
   1048  1.1  mrg /* Return the number of alternatives in constraint S.  */
   1049  1.1  mrg 
   1050  1.1  mrg static int
   1051  1.1  mrg n_alternatives (const char *s)
   1052  1.1  mrg {
   1053  1.1  mrg   int n = 1;
   1054  1.1  mrg 
   1055  1.1  mrg   if (s)
   1056  1.1  mrg     while (*s)
   1057  1.1  mrg       n += (*s++ == ',');
   1058  1.1  mrg 
   1059  1.1  mrg   return n;
   1060  1.1  mrg }
   1061  1.1  mrg 
   1062  1.1  mrg /* The routine scans rtl PATTERN, find match_operand in it and counts
   1063  1.1  mrg    number of alternatives.  If PATTERN contains several match_operands
   1064  1.1  mrg    with different number of alternatives, error is emitted, and the
   1065  1.1  mrg    routine returns 0.  If all match_operands in PATTERN have the same
   1066  1.1  mrg    number of alternatives, it's stored in N_ALT, and the routine returns 1.
   1067  1.1  mrg    LOC is the location of PATTERN, for error reporting.  */
   1068  1.1  mrg static int
   1069  1.1  mrg get_alternatives_number (rtx pattern, int *n_alt, file_location loc)
   1070  1.1  mrg {
   1071  1.1  mrg   const char *fmt;
   1072  1.1  mrg   enum rtx_code code;
   1073  1.1  mrg   int i, j, len;
   1074  1.1  mrg 
   1075  1.1  mrg   if (!n_alt)
   1076  1.1  mrg     return 0;
   1077  1.1  mrg 
   1078  1.1  mrg   code = GET_CODE (pattern);
   1079  1.1  mrg   switch (code)
   1080  1.1  mrg     {
   1081  1.1  mrg     case MATCH_OPERAND:
   1082  1.1  mrg       i = n_alternatives (XSTR (pattern, 2));
   1083  1.1  mrg       /* n_alternatives returns 1 if constraint string is empty -
   1084  1.1  mrg 	 here we fix it up.  */
   1085  1.1  mrg       if (!*(XSTR (pattern, 2)))
   1086  1.1  mrg 	i = 0;
   1087  1.1  mrg       if (*n_alt <= 0)
   1088  1.1  mrg 	*n_alt = i;
   1089  1.1  mrg 
   1090  1.1  mrg       else if (i && i != *n_alt)
   1091  1.1  mrg 	{
   1092  1.1  mrg 	  error_at (loc, "wrong number of alternatives in operand %d",
   1093  1.1  mrg 		    XINT (pattern, 0));
   1094  1.1  mrg 	  return 0;
   1095  1.1  mrg 	}
   1096  1.1  mrg 
   1097  1.1  mrg     default:
   1098  1.1  mrg       break;
   1099  1.1  mrg     }
   1100  1.1  mrg 
   1101  1.1  mrg   fmt = GET_RTX_FORMAT (code);
   1102  1.1  mrg   len = GET_RTX_LENGTH (code);
   1103  1.1  mrg   for (i = 0; i < len; i++)
   1104  1.1  mrg     {
   1105  1.1  mrg       switch (fmt[i])
   1106  1.1  mrg 	{
   1107  1.1  mrg 	case 'e': case 'u':
   1108  1.1  mrg 	  if (!get_alternatives_number (XEXP (pattern, i), n_alt, loc))
   1109  1.1  mrg 	    return 0;
   1110  1.1  mrg 	  break;
   1111  1.1  mrg 
   1112  1.1  mrg 	case 'V':
   1113  1.1  mrg 	  if (XVEC (pattern, i) == NULL)
   1114  1.1  mrg 	    break;
   1115  1.1  mrg 	  /* FALLTHRU */
   1116  1.1  mrg 
   1117  1.1  mrg 	case 'E':
   1118  1.1  mrg 	  for (j = XVECLEN (pattern, i) - 1; j >= 0; --j)
   1119  1.1  mrg 	    if (!get_alternatives_number (XVECEXP (pattern, i, j), n_alt, loc))
   1120  1.1  mrg 	      return 0;
   1121  1.1  mrg 	  break;
   1122  1.1  mrg 
   1123  1.1  mrg 	case 'r': case 'p': case 'i': case 'w':
   1124  1.1  mrg 	case '0': case 's': case 'S': case 'T':
   1125  1.1  mrg 	  break;
   1126  1.1  mrg 
   1127  1.1  mrg 	default:
   1128  1.1  mrg 	  gcc_unreachable ();
   1129  1.1  mrg 	}
   1130  1.1  mrg     }
   1131  1.1  mrg     return 1;
   1132  1.1  mrg }
   1133  1.1  mrg 
   1134  1.1  mrg /* Determine how many alternatives there are in INSN, and how many
   1135  1.1  mrg    operands.  */
   1136  1.1  mrg 
   1137  1.1  mrg static void
   1138  1.1  mrg collect_insn_data (rtx pattern, int *palt, int *pmax)
   1139  1.1  mrg {
   1140  1.1  mrg   const char *fmt;
   1141  1.1  mrg   enum rtx_code code;
   1142  1.1  mrg   int i, j, len;
   1143  1.1  mrg 
   1144  1.1  mrg   code = GET_CODE (pattern);
   1145  1.1  mrg   switch (code)
   1146  1.1  mrg     {
   1147  1.1  mrg     case MATCH_OPERAND:
   1148  1.1  mrg     case MATCH_SCRATCH:
   1149  1.1  mrg       i = n_alternatives (XSTR (pattern, code == MATCH_SCRATCH ? 1 : 2));
   1150  1.1  mrg       *palt = (i > *palt ? i : *palt);
   1151  1.1  mrg       /* Fall through.  */
   1152  1.1  mrg 
   1153  1.1  mrg     case MATCH_OPERATOR:
   1154  1.1  mrg     case MATCH_PARALLEL:
   1155  1.1  mrg       i = XINT (pattern, 0);
   1156  1.1  mrg       if (i > *pmax)
   1157  1.1  mrg 	*pmax = i;
   1158  1.1  mrg       break;
   1159  1.1  mrg 
   1160  1.1  mrg     default:
   1161  1.1  mrg       break;
   1162  1.1  mrg     }
   1163  1.1  mrg 
   1164  1.1  mrg   fmt = GET_RTX_FORMAT (code);
   1165  1.1  mrg   len = GET_RTX_LENGTH (code);
   1166  1.1  mrg   for (i = 0; i < len; i++)
   1167  1.1  mrg     {
   1168  1.1  mrg       switch (fmt[i])
   1169  1.1  mrg 	{
   1170  1.1  mrg 	case 'e': case 'u':
   1171  1.1  mrg 	  collect_insn_data (XEXP (pattern, i), palt, pmax);
   1172  1.1  mrg 	  break;
   1173  1.1  mrg 
   1174  1.1  mrg 	case 'V':
   1175  1.1  mrg 	  if (XVEC (pattern, i) == NULL)
   1176  1.1  mrg 	    break;
   1177  1.1  mrg 	  /* Fall through.  */
   1178  1.1  mrg 	case 'E':
   1179  1.1  mrg 	  for (j = XVECLEN (pattern, i) - 1; j >= 0; --j)
   1180  1.1  mrg 	    collect_insn_data (XVECEXP (pattern, i, j), palt, pmax);
   1181  1.1  mrg 	  break;
   1182  1.1  mrg 
   1183  1.1  mrg 	case 'r': case 'p': case 'i': case 'w':
   1184  1.1  mrg 	case '0': case 's': case 'S': case 'T':
   1185  1.1  mrg 	  break;
   1186  1.1  mrg 
   1187  1.1  mrg 	default:
   1188  1.1  mrg 	  gcc_unreachable ();
   1189  1.1  mrg 	}
   1190  1.1  mrg     }
   1191  1.1  mrg }
   1192  1.1  mrg 
   1193  1.1  mrg static rtx
   1194  1.1  mrg alter_predicate_for_insn (rtx pattern, int alt, int max_op,
   1195  1.1  mrg 			  file_location loc)
   1196  1.1  mrg {
   1197  1.1  mrg   const char *fmt;
   1198  1.1  mrg   enum rtx_code code;
   1199  1.1  mrg   int i, j, len;
   1200  1.1  mrg 
   1201  1.1  mrg   code = GET_CODE (pattern);
   1202  1.1  mrg   switch (code)
   1203  1.1  mrg     {
   1204  1.1  mrg     case MATCH_OPERAND:
   1205  1.1  mrg       {
   1206  1.1  mrg 	const char *c = XSTR (pattern, 2);
   1207  1.1  mrg 
   1208  1.1  mrg 	if (n_alternatives (c) != 1)
   1209  1.1  mrg 	  {
   1210  1.1  mrg 	    error_at (loc, "too many alternatives for operand %d",
   1211  1.1  mrg 		      XINT (pattern, 0));
   1212  1.1  mrg 	    return NULL;
   1213  1.1  mrg 	  }
   1214  1.1  mrg 
   1215  1.1  mrg 	/* Replicate C as needed to fill out ALT alternatives.  */
   1216  1.1  mrg 	if (c && *c && alt > 1)
   1217  1.1  mrg 	  {
   1218  1.1  mrg 	    size_t c_len = strlen (c);
   1219  1.1  mrg 	    size_t len = alt * (c_len + 1);
   1220  1.1  mrg 	    char *new_c = XNEWVEC (char, len);
   1221  1.1  mrg 
   1222  1.1  mrg 	    memcpy (new_c, c, c_len);
   1223  1.1  mrg 	    for (i = 1; i < alt; ++i)
   1224  1.1  mrg 	      {
   1225  1.1  mrg 		new_c[i * (c_len + 1) - 1] = ',';
   1226  1.1  mrg 		memcpy (&new_c[i * (c_len + 1)], c, c_len);
   1227  1.1  mrg 	      }
   1228  1.1  mrg 	    new_c[len - 1] = '\0';
   1229  1.1  mrg 	    XSTR (pattern, 2) = new_c;
   1230  1.1  mrg 	  }
   1231  1.1  mrg       }
   1232  1.1  mrg       /* Fall through.  */
   1233  1.1  mrg 
   1234  1.1  mrg     case MATCH_OPERATOR:
   1235  1.1  mrg     case MATCH_SCRATCH:
   1236  1.1  mrg     case MATCH_PARALLEL:
   1237  1.1  mrg     case MATCH_DUP:
   1238  1.1  mrg       XINT (pattern, 0) += max_op;
   1239  1.1  mrg       break;
   1240  1.1  mrg 
   1241  1.1  mrg     default:
   1242  1.1  mrg       break;
   1243  1.1  mrg     }
   1244  1.1  mrg 
   1245  1.1  mrg   fmt = GET_RTX_FORMAT (code);
   1246  1.1  mrg   len = GET_RTX_LENGTH (code);
   1247  1.1  mrg   for (i = 0; i < len; i++)
   1248  1.1  mrg     {
   1249  1.1  mrg       rtx r;
   1250  1.1  mrg 
   1251  1.1  mrg       switch (fmt[i])
   1252  1.1  mrg 	{
   1253  1.1  mrg 	case 'e': case 'u':
   1254  1.1  mrg 	  r = alter_predicate_for_insn (XEXP (pattern, i), alt, max_op, loc);
   1255  1.1  mrg 	  if (r == NULL)
   1256  1.1  mrg 	    return r;
   1257  1.1  mrg 	  break;
   1258  1.1  mrg 
   1259  1.1  mrg 	case 'E':
   1260  1.1  mrg 	  for (j = XVECLEN (pattern, i) - 1; j >= 0; --j)
   1261  1.1  mrg 	    {
   1262  1.1  mrg 	      r = alter_predicate_for_insn (XVECEXP (pattern, i, j),
   1263  1.1  mrg 					    alt, max_op, loc);
   1264  1.1  mrg 	      if (r == NULL)
   1265  1.1  mrg 		return r;
   1266  1.1  mrg 	    }
   1267  1.1  mrg 	  break;
   1268  1.1  mrg 
   1269  1.1  mrg 	case 'r': case 'p': case 'i': case 'w': case '0': case 's':
   1270  1.1  mrg 	  break;
   1271  1.1  mrg 
   1272  1.1  mrg 	default:
   1273  1.1  mrg 	  gcc_unreachable ();
   1274  1.1  mrg 	}
   1275  1.1  mrg     }
   1276  1.1  mrg 
   1277  1.1  mrg   return pattern;
   1278  1.1  mrg }
   1279  1.1  mrg 
   1280  1.1  mrg /* Duplicate constraints in PATTERN.  If pattern is from original
   1281  1.1  mrg    rtl-template, we need to duplicate each alternative - for that we
   1282  1.1  mrg    need to use duplicate_each_alternative () as a functor ALTER.
   1283  1.1  mrg    If pattern is from output-pattern of define_subst, we need to
   1284  1.1  mrg    duplicate constraints in another way - with duplicate_alternatives ().
   1285  1.1  mrg    N_DUP is multiplication factor.  */
   1286  1.1  mrg static rtx
   1287  1.1  mrg alter_constraints (rtx pattern, int n_dup, constraints_handler_t alter)
   1288  1.1  mrg {
   1289  1.1  mrg   const char *fmt;
   1290  1.1  mrg   enum rtx_code code;
   1291  1.1  mrg   int i, j, len;
   1292  1.1  mrg 
   1293  1.1  mrg   code = GET_CODE (pattern);
   1294  1.1  mrg   switch (code)
   1295  1.1  mrg     {
   1296  1.1  mrg     case MATCH_OPERAND:
   1297  1.1  mrg       XSTR (pattern, 2) = alter (XSTR (pattern, 2), n_dup);
   1298  1.1  mrg       break;
   1299  1.1  mrg     case MATCH_SCRATCH:
   1300  1.1  mrg       XSTR (pattern, 1) = alter (XSTR (pattern, 1), n_dup);
   1301  1.1  mrg       break;
   1302  1.1  mrg 
   1303  1.1  mrg     default:
   1304  1.1  mrg       break;
   1305  1.1  mrg     }
   1306  1.1  mrg 
   1307  1.1  mrg   fmt = GET_RTX_FORMAT (code);
   1308  1.1  mrg   len = GET_RTX_LENGTH (code);
   1309  1.1  mrg   for (i = 0; i < len; i++)
   1310  1.1  mrg     {
   1311  1.1  mrg       rtx r;
   1312  1.1  mrg 
   1313  1.1  mrg       switch (fmt[i])
   1314  1.1  mrg 	{
   1315  1.1  mrg 	case 'e': case 'u':
   1316  1.1  mrg 	  r = alter_constraints (XEXP (pattern, i), n_dup, alter);
   1317  1.1  mrg 	  if (r == NULL)
   1318  1.1  mrg 	    return r;
   1319  1.1  mrg 	  break;
   1320  1.1  mrg 
   1321  1.1  mrg 	case 'E':
   1322  1.1  mrg 	  for (j = XVECLEN (pattern, i) - 1; j >= 0; --j)
   1323  1.1  mrg 	    {
   1324  1.1  mrg 	      r = alter_constraints (XVECEXP (pattern, i, j), n_dup, alter);
   1325  1.1  mrg 	      if (r == NULL)
   1326  1.1  mrg 		return r;
   1327  1.1  mrg 	    }
   1328  1.1  mrg 	  break;
   1329  1.1  mrg 
   1330  1.1  mrg 	case 'r': case 'p': case 'i': case 'w': case '0': case 's':
   1331  1.1  mrg 	  break;
   1332  1.1  mrg 
   1333  1.1  mrg 	default:
   1334  1.1  mrg 	  break;
   1335  1.1  mrg 	}
   1336  1.1  mrg     }
   1337  1.1  mrg 
   1338  1.1  mrg   return pattern;
   1339  1.1  mrg }
   1340  1.1  mrg 
   1341  1.1  mrg static const char *
   1342  1.1  mrg alter_test_for_insn (class queue_elem *ce_elem,
   1343  1.1  mrg 		     class queue_elem *insn_elem)
   1344  1.1  mrg {
   1345  1.1  mrg   return rtx_reader_ptr->join_c_conditions (XSTR (ce_elem->data, 1),
   1346  1.1  mrg 					    XSTR (insn_elem->data, 2));
   1347  1.1  mrg }
   1348  1.1  mrg 
   1349  1.1  mrg /* Modify VAL, which is an attribute expression for the "enabled" attribute,
   1350  1.1  mrg    to take "ce_enabled" into account.  Return the new expression.  */
   1351  1.1  mrg static rtx
   1352  1.1  mrg modify_attr_enabled_ce (rtx val)
   1353  1.1  mrg {
   1354  1.1  mrg   rtx eq_attr, str;
   1355  1.1  mrg   rtx ite;
   1356  1.1  mrg   eq_attr = rtx_alloc (EQ_ATTR);
   1357  1.1  mrg   ite = rtx_alloc (IF_THEN_ELSE);
   1358  1.1  mrg   str = rtx_alloc (CONST_STRING);
   1359  1.1  mrg 
   1360  1.1  mrg   XSTR (eq_attr, 0) = "ce_enabled";
   1361  1.1  mrg   XSTR (eq_attr, 1) = "yes";
   1362  1.1  mrg   XSTR (str, 0) = "no";
   1363  1.1  mrg   XEXP (ite, 0) = eq_attr;
   1364  1.1  mrg   XEXP (ite, 1) = val;
   1365  1.1  mrg   XEXP (ite, 2) = str;
   1366  1.1  mrg 
   1367  1.1  mrg   return ite;
   1368  1.1  mrg }
   1369  1.1  mrg 
   1370  1.1  mrg /* Alter the attribute vector of INSN, which is a COND_EXEC variant created
   1371  1.1  mrg    from a define_insn pattern.  We must modify the "predicable" attribute
   1372  1.1  mrg    to be named "ce_enabled", and also change any "enabled" attribute that's
   1373  1.1  mrg    present so that it takes ce_enabled into account.
   1374  1.1  mrg    We rely on the fact that INSN was created with copy_rtx, and modify data
   1375  1.1  mrg    in-place.  */
   1376  1.1  mrg 
   1377  1.1  mrg static void
   1378  1.1  mrg alter_attrs_for_insn (rtx insn)
   1379  1.1  mrg {
   1380  1.1  mrg   static bool global_changes_made = false;
   1381  1.1  mrg   rtvec vec = XVEC (insn, 4);
   1382  1.1  mrg   rtvec new_vec;
   1383  1.1  mrg   rtx val, set;
   1384  1.1  mrg   int num_elem;
   1385  1.1  mrg   int predicable_idx = -1;
   1386  1.1  mrg   int enabled_idx = -1;
   1387  1.1  mrg   int i;
   1388  1.1  mrg 
   1389  1.1  mrg   if (! vec)
   1390  1.1  mrg     return;
   1391  1.1  mrg 
   1392  1.1  mrg   num_elem = GET_NUM_ELEM (vec);
   1393  1.1  mrg   for (i = num_elem - 1; i >= 0; --i)
   1394  1.1  mrg     {
   1395  1.1  mrg       rtx sub = RTVEC_ELT (vec, i);
   1396  1.1  mrg       switch (GET_CODE (sub))
   1397  1.1  mrg 	{
   1398  1.1  mrg 	case SET_ATTR:
   1399  1.1  mrg 	  if (strcmp (XSTR (sub, 0), "predicable") == 0)
   1400  1.1  mrg 	    {
   1401  1.1  mrg 	      predicable_idx = i;
   1402  1.1  mrg 	      XSTR (sub, 0) = "ce_enabled";
   1403  1.1  mrg 	    }
   1404  1.1  mrg 	  else if (strcmp (XSTR (sub, 0), "enabled") == 0)
   1405  1.1  mrg 	    {
   1406  1.1  mrg 	      enabled_idx = i;
   1407  1.1  mrg 	      XSTR (sub, 0) = "nonce_enabled";
   1408  1.1  mrg 	    }
   1409  1.1  mrg 	  break;
   1410  1.1  mrg 
   1411  1.1  mrg 	case SET_ATTR_ALTERNATIVE:
   1412  1.1  mrg 	  if (strcmp (XSTR (sub, 0), "predicable") == 0)
   1413  1.1  mrg 	    /* We already give an error elsewhere.  */
   1414  1.1  mrg 	    return;
   1415  1.1  mrg 	  else if (strcmp (XSTR (sub, 0), "enabled") == 0)
   1416  1.1  mrg 	    {
   1417  1.1  mrg 	      enabled_idx = i;
   1418  1.1  mrg 	      XSTR (sub, 0) = "nonce_enabled";
   1419  1.1  mrg 	    }
   1420  1.1  mrg 	  break;
   1421  1.1  mrg 
   1422  1.1  mrg 	case SET:
   1423  1.1  mrg 	  if (GET_CODE (SET_DEST (sub)) != ATTR)
   1424  1.1  mrg 	    break;
   1425  1.1  mrg 	  if (strcmp (XSTR (SET_DEST (sub), 0), "predicable") == 0)
   1426  1.1  mrg 	    {
   1427  1.1  mrg 	      sub = SET_SRC (sub);
   1428  1.1  mrg 	      if (GET_CODE (sub) == CONST_STRING)
   1429  1.1  mrg 		{
   1430  1.1  mrg 		  predicable_idx = i;
   1431  1.1  mrg 		  XSTR (sub, 0) = "ce_enabled";
   1432  1.1  mrg 		}
   1433  1.1  mrg 	      else
   1434  1.1  mrg 		/* We already give an error elsewhere.  */
   1435  1.1  mrg 		return;
   1436  1.1  mrg 	      break;
   1437  1.1  mrg 	    }
   1438  1.1  mrg 	  if (strcmp (XSTR (SET_DEST (sub), 0), "enabled") == 0)
   1439  1.1  mrg 	    {
   1440  1.1  mrg 	      enabled_idx = i;
   1441  1.1  mrg 	      XSTR (SET_DEST (sub), 0) = "nonce_enabled";
   1442  1.1  mrg 	    }
   1443  1.1  mrg 	  break;
   1444  1.1  mrg 
   1445  1.1  mrg 	default:
   1446  1.1  mrg 	  gcc_unreachable ();
   1447  1.1  mrg 	}
   1448  1.1  mrg     }
   1449  1.1  mrg   if (predicable_idx == -1)
   1450  1.1  mrg     return;
   1451  1.1  mrg 
   1452  1.1  mrg   if (!global_changes_made)
   1453  1.1  mrg     {
   1454  1.1  mrg       class queue_elem *elem;
   1455  1.1  mrg 
   1456  1.1  mrg       global_changes_made = true;
   1457  1.1  mrg       add_define_attr ("ce_enabled");
   1458  1.1  mrg       add_define_attr ("nonce_enabled");
   1459  1.1  mrg 
   1460  1.1  mrg       for (elem = define_attr_queue; elem ; elem = elem->next)
   1461  1.1  mrg 	if (strcmp (XSTR (elem->data, 0), "enabled") == 0)
   1462  1.1  mrg 	  {
   1463  1.1  mrg 	    XEXP (elem->data, 2)
   1464  1.1  mrg 	      = modify_attr_enabled_ce (XEXP (elem->data, 2));
   1465  1.1  mrg 	  }
   1466  1.1  mrg     }
   1467  1.1  mrg   if (enabled_idx == -1)
   1468  1.1  mrg     return;
   1469  1.1  mrg 
   1470  1.1  mrg   new_vec = rtvec_alloc (num_elem + 1);
   1471  1.1  mrg   for (i = 0; i < num_elem; i++)
   1472  1.1  mrg     RTVEC_ELT (new_vec, i) = RTVEC_ELT (vec, i);
   1473  1.1  mrg   val = rtx_alloc (IF_THEN_ELSE);
   1474  1.1  mrg   XEXP (val, 0) = rtx_alloc (EQ_ATTR);
   1475  1.1  mrg   XEXP (val, 1) = rtx_alloc (CONST_STRING);
   1476  1.1  mrg   XEXP (val, 2) = rtx_alloc (CONST_STRING);
   1477  1.1  mrg   XSTR (XEXP (val, 0), 0) = "nonce_enabled";
   1478  1.1  mrg   XSTR (XEXP (val, 0), 1) = "yes";
   1479  1.1  mrg   XSTR (XEXP (val, 1), 0) = "yes";
   1480  1.1  mrg   XSTR (XEXP (val, 2), 0) = "no";
   1481  1.1  mrg   set = rtx_alloc (SET);
   1482  1.1  mrg   SET_DEST (set) = rtx_alloc (ATTR);
   1483  1.1  mrg   XSTR (SET_DEST (set), 0) = "enabled";
   1484  1.1  mrg   SET_SRC (set) = modify_attr_enabled_ce (val);
   1485  1.1  mrg   RTVEC_ELT (new_vec, i) = set;
   1486  1.1  mrg   XVEC (insn, 4) = new_vec;
   1487  1.1  mrg }
   1488  1.1  mrg 
   1489  1.1  mrg /* As number of constraints is changed after define_subst, we need to
   1490  1.1  mrg    process attributes as well - we need to duplicate them the same way
   1491  1.1  mrg    that we duplicated constraints in original pattern
   1492  1.1  mrg    ELEM is a queue element, containing our rtl-template,
   1493  1.1  mrg    N_DUP - multiplication factor.  */
   1494  1.1  mrg static void
   1495  1.1  mrg alter_attrs_for_subst_insn (class queue_elem * elem, int n_dup)
   1496  1.1  mrg {
   1497  1.1  mrg   rtvec vec = XVEC (elem->data, 4);
   1498  1.1  mrg   int num_elem;
   1499  1.1  mrg   int i;
   1500  1.1  mrg 
   1501  1.1  mrg   if (n_dup < 2 || ! vec)
   1502  1.1  mrg     return;
   1503  1.1  mrg 
   1504  1.1  mrg   num_elem = GET_NUM_ELEM (vec);
   1505  1.1  mrg   for (i = num_elem - 1; i >= 0; --i)
   1506  1.1  mrg     {
   1507  1.1  mrg       rtx sub = RTVEC_ELT (vec, i);
   1508  1.1  mrg       switch (GET_CODE (sub))
   1509  1.1  mrg 	{
   1510  1.1  mrg 	case SET_ATTR:
   1511  1.1  mrg 	  if (strchr (XSTR (sub, 1), ',') != NULL)
   1512  1.1  mrg 	    XSTR (sub, 1) = duplicate_alternatives (XSTR (sub, 1), n_dup);
   1513  1.1  mrg 	  break;
   1514  1.1  mrg 
   1515  1.1  mrg 	case SET_ATTR_ALTERNATIVE:
   1516  1.1  mrg 	case SET:
   1517  1.1  mrg 	  error_at (elem->loc,
   1518  1.1  mrg 		    "%s: `define_subst' does not support attributes "
   1519  1.1  mrg 		    "assigned by `set' and `set_attr_alternative'",
   1520  1.1  mrg 		    XSTR (elem->data, 0));
   1521  1.1  mrg 	  return;
   1522  1.1  mrg 
   1523  1.1  mrg 	default:
   1524  1.1  mrg 	  gcc_unreachable ();
   1525  1.1  mrg 	}
   1526  1.1  mrg     }
   1527  1.1  mrg }
   1528  1.1  mrg 
   1529  1.1  mrg /* Adjust all of the operand numbers in SRC to match the shift they'll
   1530  1.1  mrg    get from an operand displacement of DISP.  Return a pointer after the
   1531  1.1  mrg    adjusted string.  */
   1532  1.1  mrg 
   1533  1.1  mrg static char *
   1534  1.1  mrg shift_output_template (char *dest, const char *src, int disp)
   1535  1.1  mrg {
   1536  1.1  mrg   while (*src)
   1537  1.1  mrg     {
   1538  1.1  mrg       char c = *src++;
   1539  1.1  mrg       *dest++ = c;
   1540  1.1  mrg       if (c == '%')
   1541  1.1  mrg 	{
   1542  1.1  mrg 	  c = *src++;
   1543  1.1  mrg 	  if (ISDIGIT ((unsigned char) c))
   1544  1.1  mrg 	    c += disp;
   1545  1.1  mrg 	  else if (ISALPHA (c))
   1546  1.1  mrg 	    {
   1547  1.1  mrg 	      *dest++ = c;
   1548  1.1  mrg 	      c = *src++ + disp;
   1549  1.1  mrg 	    }
   1550  1.1  mrg 	  *dest++ = c;
   1551  1.1  mrg 	}
   1552  1.1  mrg     }
   1553  1.1  mrg 
   1554  1.1  mrg   return dest;
   1555  1.1  mrg }
   1556  1.1  mrg 
   1557  1.1  mrg static const char *
   1558  1.1  mrg alter_output_for_insn (class queue_elem *ce_elem,
   1559  1.1  mrg 		       class queue_elem *insn_elem,
   1560  1.1  mrg 		       int alt, int max_op)
   1561  1.1  mrg {
   1562  1.1  mrg   const char *ce_out, *insn_out;
   1563  1.1  mrg   char *result, *p;
   1564  1.1  mrg   size_t len, ce_len, insn_len;
   1565  1.1  mrg 
   1566  1.1  mrg   /* ??? Could coordinate with genoutput to not duplicate code here.  */
   1567  1.1  mrg 
   1568  1.1  mrg   ce_out = XSTR (ce_elem->data, 2);
   1569  1.1  mrg   insn_out = XTMPL (insn_elem->data, 3);
   1570  1.1  mrg   if (!ce_out || *ce_out == '\0')
   1571  1.1  mrg     return insn_out;
   1572  1.1  mrg 
   1573  1.1  mrg   ce_len = strlen (ce_out);
   1574  1.1  mrg   insn_len = strlen (insn_out);
   1575  1.1  mrg 
   1576  1.1  mrg   if (*insn_out == '*')
   1577  1.1  mrg     /* You must take care of the predicate yourself.  */
   1578  1.1  mrg     return insn_out;
   1579  1.1  mrg 
   1580  1.1  mrg   if (*insn_out == '@')
   1581  1.1  mrg     {
   1582  1.1  mrg       len = (ce_len + 1) * alt + insn_len + 1;
   1583  1.1  mrg       p = result = XNEWVEC (char, len);
   1584  1.1  mrg 
   1585  1.1  mrg       do
   1586  1.1  mrg 	{
   1587  1.1  mrg 	  do
   1588  1.1  mrg 	    *p++ = *insn_out++;
   1589  1.1  mrg 	  while (ISSPACE ((unsigned char) *insn_out));
   1590  1.1  mrg 
   1591  1.1  mrg 	  if (*insn_out != '#')
   1592  1.1  mrg 	    {
   1593  1.1  mrg 	      p = shift_output_template (p, ce_out, max_op);
   1594  1.1  mrg 	      *p++ = ' ';
   1595  1.1  mrg 	    }
   1596  1.1  mrg 
   1597  1.1  mrg 	  do
   1598  1.1  mrg 	    *p++ = *insn_out++;
   1599  1.1  mrg 	  while (*insn_out && *insn_out != '\n');
   1600  1.1  mrg 	}
   1601  1.1  mrg       while (*insn_out);
   1602  1.1  mrg       *p = '\0';
   1603  1.1  mrg     }
   1604  1.1  mrg   else
   1605  1.1  mrg     {
   1606  1.1  mrg       len = ce_len + 1 + insn_len + 1;
   1607  1.1  mrg       result = XNEWVEC (char, len);
   1608  1.1  mrg 
   1609  1.1  mrg       p = shift_output_template (result, ce_out, max_op);
   1610  1.1  mrg       *p++ = ' ';
   1611  1.1  mrg       memcpy (p, insn_out, insn_len + 1);
   1612  1.1  mrg     }
   1613  1.1  mrg 
   1614  1.1  mrg   return result;
   1615  1.1  mrg }
   1616  1.1  mrg 
   1617  1.1  mrg /* From string STR "a,b,c" produce "a,b,c,a,b,c,a,b,c", i.e. original
   1618  1.1  mrg    string, duplicated N_DUP times.  */
   1619  1.1  mrg 
   1620  1.1  mrg static const char *
   1621  1.1  mrg duplicate_alternatives (const char * str, int n_dup)
   1622  1.1  mrg {
   1623  1.1  mrg   int i, len, new_len;
   1624  1.1  mrg   char *result, *sp;
   1625  1.1  mrg   const char *cp;
   1626  1.1  mrg 
   1627  1.1  mrg   if (n_dup < 2)
   1628  1.1  mrg     return str;
   1629  1.1  mrg 
   1630  1.1  mrg   while (ISSPACE (*str))
   1631  1.1  mrg     str++;
   1632  1.1  mrg 
   1633  1.1  mrg   if (*str == '\0')
   1634  1.1  mrg     return str;
   1635  1.1  mrg 
   1636  1.1  mrg   cp = str;
   1637  1.1  mrg   len = strlen (str);
   1638  1.1  mrg   new_len = (len + 1) * n_dup;
   1639  1.1  mrg 
   1640  1.1  mrg   sp = result = XNEWVEC (char, new_len);
   1641  1.1  mrg 
   1642  1.1  mrg   /* Global modifier characters mustn't be duplicated: skip if found.  */
   1643  1.1  mrg   if (*cp == '=' || *cp == '+' || *cp == '%')
   1644  1.1  mrg     {
   1645  1.1  mrg       *sp++ = *cp++;
   1646  1.1  mrg       len--;
   1647  1.1  mrg     }
   1648  1.1  mrg 
   1649  1.1  mrg   /* Copy original constraints N_DUP times.  */
   1650  1.1  mrg   for (i = 0; i < n_dup; i++, sp += len+1)
   1651  1.1  mrg     {
   1652  1.1  mrg       memcpy (sp, cp, len);
   1653  1.1  mrg       *(sp+len) = (i == n_dup - 1) ? '\0' : ',';
   1654  1.1  mrg     }
   1655  1.1  mrg 
   1656  1.1  mrg   return result;
   1657  1.1  mrg }
   1658  1.1  mrg 
   1659  1.1  mrg /* From string STR "a,b,c" produce "a,a,a,b,b,b,c,c,c", i.e. string where
   1660  1.1  mrg    each alternative from the original string is duplicated N_DUP times.  */
   1661  1.1  mrg static const char *
   1662  1.1  mrg duplicate_each_alternative (const char * str, int n_dup)
   1663  1.1  mrg {
   1664  1.1  mrg   int i, len, new_len;
   1665  1.1  mrg   char *result, *sp, *ep, *cp;
   1666  1.1  mrg 
   1667  1.1  mrg   if (n_dup < 2)
   1668  1.1  mrg     return str;
   1669  1.1  mrg 
   1670  1.1  mrg   while (ISSPACE (*str))
   1671  1.1  mrg     str++;
   1672  1.1  mrg 
   1673  1.1  mrg   if (*str == '\0')
   1674  1.1  mrg     return str;
   1675  1.1  mrg 
   1676  1.1  mrg   cp = xstrdup (str);
   1677  1.1  mrg 
   1678  1.1  mrg   new_len = (strlen (cp) + 1) * n_dup;
   1679  1.1  mrg 
   1680  1.1  mrg   sp = result = XNEWVEC (char, new_len);
   1681  1.1  mrg 
   1682  1.1  mrg   /* Global modifier characters mustn't be duplicated: skip if found.  */
   1683  1.1  mrg   if (*cp == '=' || *cp == '+' || *cp == '%')
   1684  1.1  mrg       *sp++ = *cp++;
   1685  1.1  mrg 
   1686  1.1  mrg   do
   1687  1.1  mrg     {
   1688  1.1  mrg       if ((ep = strchr (cp, ',')) != NULL)
   1689  1.1  mrg 	*ep++ = '\0';
   1690  1.1  mrg       len = strlen (cp);
   1691  1.1  mrg 
   1692  1.1  mrg       /* Copy a constraint N_DUP times.  */
   1693  1.1  mrg       for (i = 0; i < n_dup; i++, sp += len + 1)
   1694  1.1  mrg 	{
   1695  1.1  mrg 	  memcpy (sp, cp, len);
   1696  1.1  mrg 	  *(sp+len) = (ep == NULL && i == n_dup - 1) ? '\0' : ',';
   1697  1.1  mrg 	}
   1698  1.1  mrg 
   1699  1.1  mrg       cp = ep;
   1700  1.1  mrg     }
   1701  1.1  mrg   while (cp != NULL);
   1702  1.1  mrg 
   1703  1.1  mrg   return result;
   1704  1.1  mrg }
   1705  1.1  mrg 
   1706  1.1  mrg /* Alter the output of INSN whose pattern was modified by
   1707  1.1  mrg    DEFINE_SUBST.  We must replicate output strings according
   1708  1.1  mrg    to the new number of alternatives ALT in substituted pattern.
   1709  1.1  mrg    If ALT equals 1, output has one alternative or defined by C
   1710  1.1  mrg    code, then output is returned without any changes.  */
   1711  1.1  mrg 
   1712  1.1  mrg static const char *
   1713  1.1  mrg alter_output_for_subst_insn (rtx insn, int alt)
   1714  1.1  mrg {
   1715  1.1  mrg   const char *insn_out, *old_out;
   1716  1.1  mrg   char *new_out, *cp;
   1717  1.1  mrg   size_t old_len, new_len;
   1718  1.1  mrg   int j;
   1719  1.1  mrg 
   1720  1.1  mrg   insn_out = XTMPL (insn, 3);
   1721  1.1  mrg 
   1722  1.1  mrg   if (alt < 2 || *insn_out != '@')
   1723  1.1  mrg     return insn_out;
   1724  1.1  mrg 
   1725  1.1  mrg   old_out = insn_out + 1;
   1726  1.1  mrg   while (ISSPACE (*old_out))
   1727  1.1  mrg     old_out++;
   1728  1.1  mrg   old_len = strlen (old_out);
   1729  1.1  mrg 
   1730  1.1  mrg   new_len = alt * (old_len + 1) + 1;
   1731  1.1  mrg 
   1732  1.1  mrg   new_out = XNEWVEC (char, new_len);
   1733  1.1  mrg   new_out[0] = '@';
   1734  1.1  mrg 
   1735  1.1  mrg   for (j = 0, cp = new_out + 1; j < alt; j++, cp += old_len + 1)
   1736  1.1  mrg     {
   1737  1.1  mrg       memcpy (cp, old_out, old_len);
   1738  1.1  mrg       cp[old_len] = (j == alt - 1) ? '\0' : '\n';
   1739  1.1  mrg     }
   1740  1.1  mrg 
   1741  1.1  mrg   return new_out;
   1742  1.1  mrg }
   1743  1.1  mrg 
   1744  1.1  mrg /* Replicate insns as appropriate for the given DEFINE_COND_EXEC.  */
   1745  1.1  mrg 
   1746  1.1  mrg static void
   1747  1.1  mrg process_one_cond_exec (class queue_elem *ce_elem)
   1748  1.1  mrg {
   1749  1.1  mrg   class queue_elem *insn_elem;
   1750  1.1  mrg   for (insn_elem = define_insn_queue; insn_elem ; insn_elem = insn_elem->next)
   1751  1.1  mrg     {
   1752  1.1  mrg       int alternatives, max_operand;
   1753  1.1  mrg       rtx pred, insn, pattern, split;
   1754  1.1  mrg       char *new_name;
   1755  1.1  mrg       int i;
   1756  1.1  mrg 
   1757  1.1  mrg       if (! is_predicable (insn_elem))
   1758  1.1  mrg 	continue;
   1759  1.1  mrg 
   1760  1.1  mrg       alternatives = 1;
   1761  1.1  mrg       max_operand = -1;
   1762  1.1  mrg       collect_insn_data (insn_elem->data, &alternatives, &max_operand);
   1763  1.1  mrg       max_operand += 1;
   1764  1.1  mrg 
   1765  1.1  mrg       if (XVECLEN (ce_elem->data, 0) != 1)
   1766  1.1  mrg 	{
   1767  1.1  mrg 	  error_at (ce_elem->loc, "too many patterns in predicate");
   1768  1.1  mrg 	  return;
   1769  1.1  mrg 	}
   1770  1.1  mrg 
   1771  1.1  mrg       pred = copy_rtx (XVECEXP (ce_elem->data, 0, 0));
   1772  1.1  mrg       pred = alter_predicate_for_insn (pred, alternatives, max_operand,
   1773  1.1  mrg 				       ce_elem->loc);
   1774  1.1  mrg       if (pred == NULL)
   1775  1.1  mrg 	return;
   1776  1.1  mrg 
   1777  1.1  mrg       /* Construct a new pattern for the new insn.  */
   1778  1.1  mrg       insn = copy_rtx (insn_elem->data);
   1779  1.1  mrg       new_name = XNEWVAR (char, strlen XSTR (insn_elem->data, 0) + 4);
   1780  1.1  mrg       sprintf (new_name, "*p %s", XSTR (insn_elem->data, 0));
   1781  1.1  mrg       XSTR (insn, 0) = new_name;
   1782  1.1  mrg       pattern = rtx_alloc (COND_EXEC);
   1783  1.1  mrg       XEXP (pattern, 0) = pred;
   1784  1.1  mrg       XEXP (pattern, 1) = add_implicit_parallel (XVEC (insn, 1));
   1785  1.1  mrg       XVEC (insn, 1) = rtvec_alloc (1);
   1786  1.1  mrg       XVECEXP (insn, 1, 0) = pattern;
   1787  1.1  mrg 
   1788  1.1  mrg        if (XVEC (ce_elem->data, 3) != NULL)
   1789  1.1  mrg 	{
   1790  1.1  mrg 	  rtvec attributes = rtvec_alloc (XVECLEN (insn, 4)
   1791  1.1  mrg 	                                  + XVECLEN (ce_elem->data, 3));
   1792  1.1  mrg 	  int i = 0;
   1793  1.1  mrg 	  int j = 0;
   1794  1.1  mrg 	  for (i = 0; i < XVECLEN (insn, 4); i++)
   1795  1.1  mrg 	    RTVEC_ELT (attributes, i) = XVECEXP (insn, 4, i);
   1796  1.1  mrg 
   1797  1.1  mrg 	  for (j = 0; j < XVECLEN (ce_elem->data, 3); j++, i++)
   1798  1.1  mrg 	    RTVEC_ELT (attributes, i) = XVECEXP (ce_elem->data, 3, j);
   1799  1.1  mrg 
   1800  1.1  mrg 	  XVEC (insn, 4) = attributes;
   1801  1.1  mrg 	}
   1802  1.1  mrg 
   1803  1.1  mrg       XSTR (insn, 2) = alter_test_for_insn (ce_elem, insn_elem);
   1804  1.1  mrg       XTMPL (insn, 3) = alter_output_for_insn (ce_elem, insn_elem,
   1805  1.1  mrg 					      alternatives, max_operand);
   1806  1.1  mrg       alter_attrs_for_insn (insn);
   1807  1.1  mrg 
   1808  1.1  mrg       /* Put the new pattern on the `other' list so that it
   1809  1.1  mrg 	 (a) is not reprocessed by other define_cond_exec patterns
   1810  1.1  mrg 	 (b) appears after all normal define_insn patterns.
   1811  1.1  mrg 
   1812  1.1  mrg 	 ??? B is debatable.  If one has normal insns that match
   1813  1.1  mrg 	 cond_exec patterns, they will be preferred over these
   1814  1.1  mrg 	 generated patterns.  Whether this matters in practice, or if
   1815  1.1  mrg 	 it's a good thing, or whether we should thread these new
   1816  1.1  mrg 	 patterns into the define_insn chain just after their generator
   1817  1.1  mrg 	 is something we'll have to experiment with.  */
   1818  1.1  mrg 
   1819  1.1  mrg       queue_pattern (insn, &other_tail, insn_elem->loc);
   1820  1.1  mrg 
   1821  1.1  mrg       if (!insn_elem->split)
   1822  1.1  mrg 	continue;
   1823  1.1  mrg 
   1824  1.1  mrg       /* If the original insn came from a define_insn_and_split,
   1825  1.1  mrg 	 generate a new split to handle the predicated insn.  */
   1826  1.1  mrg       split = copy_rtx (insn_elem->split->data);
   1827  1.1  mrg       /* Predicate the pattern matched by the split.  */
   1828  1.1  mrg       pattern = rtx_alloc (COND_EXEC);
   1829  1.1  mrg       XEXP (pattern, 0) = pred;
   1830  1.1  mrg       XEXP (pattern, 1) = add_implicit_parallel (XVEC (split, 0));
   1831  1.1  mrg       XVEC (split, 0) = rtvec_alloc (1);
   1832  1.1  mrg       XVECEXP (split, 0, 0) = pattern;
   1833  1.1  mrg 
   1834  1.1  mrg       /* Predicate all of the insns generated by the split.  */
   1835  1.1  mrg       for (i = 0; i < XVECLEN (split, 2); i++)
   1836  1.1  mrg 	{
   1837  1.1  mrg 	  pattern = rtx_alloc (COND_EXEC);
   1838  1.1  mrg 	  XEXP (pattern, 0) = pred;
   1839  1.1  mrg 	  XEXP (pattern, 1) = XVECEXP (split, 2, i);
   1840  1.1  mrg 	  XVECEXP (split, 2, i) = pattern;
   1841  1.1  mrg 	}
   1842  1.1  mrg       /* Add the new split to the queue.  */
   1843  1.1  mrg       queue_pattern (split, &other_tail, insn_elem->split->loc);
   1844  1.1  mrg     }
   1845  1.1  mrg }
   1846  1.1  mrg 
   1847  1.1  mrg /* Try to apply define_substs to the given ELEM.
   1848  1.1  mrg    Only define_substs, specified via attributes would be applied.
   1849  1.1  mrg    If attribute, requiring define_subst, is set, but no define_subst
   1850  1.1  mrg    was applied, ELEM would be deleted.  */
   1851  1.1  mrg 
   1852  1.1  mrg static void
   1853  1.1  mrg process_substs_on_one_elem (class queue_elem *elem,
   1854  1.1  mrg 			    class queue_elem *queue)
   1855  1.1  mrg {
   1856  1.1  mrg   class queue_elem *subst_elem;
   1857  1.1  mrg   int i, j, patterns_match;
   1858  1.1  mrg 
   1859  1.1  mrg   for (subst_elem = define_subst_queue;
   1860  1.1  mrg        subst_elem; subst_elem = subst_elem->next)
   1861  1.1  mrg     {
   1862  1.1  mrg       int alternatives, alternatives_subst;
   1863  1.1  mrg       rtx subst_pattern;
   1864  1.1  mrg       rtvec subst_pattern_vec;
   1865  1.1  mrg 
   1866  1.1  mrg       if (!has_subst_attribute (elem, subst_elem))
   1867  1.1  mrg 	continue;
   1868  1.1  mrg 
   1869  1.1  mrg       /* Compare original rtl-pattern from define_insn with input
   1870  1.1  mrg 	 pattern from define_subst.
   1871  1.1  mrg 	 Also, check if numbers of alternatives are the same in all
   1872  1.1  mrg 	 match_operands.  */
   1873  1.1  mrg       if (XVECLEN (elem->data, 1) != XVECLEN (subst_elem->data, 1))
   1874  1.1  mrg 	continue;
   1875  1.1  mrg       patterns_match = 1;
   1876  1.1  mrg       alternatives = -1;
   1877  1.1  mrg       alternatives_subst = -1;
   1878  1.1  mrg       for (j = 0; j < XVECLEN (elem->data, 1); j++)
   1879  1.1  mrg 	{
   1880  1.1  mrg 	  if (!subst_pattern_match (XVECEXP (elem->data, 1, j),
   1881  1.1  mrg 				    XVECEXP (subst_elem->data, 1, j),
   1882  1.1  mrg 				    subst_elem->loc))
   1883  1.1  mrg 	    {
   1884  1.1  mrg 	      patterns_match = 0;
   1885  1.1  mrg 	      break;
   1886  1.1  mrg 	    }
   1887  1.1  mrg 
   1888  1.1  mrg 	  if (!get_alternatives_number (XVECEXP (elem->data, 1, j),
   1889  1.1  mrg 					&alternatives, subst_elem->loc))
   1890  1.1  mrg 	    {
   1891  1.1  mrg 	      patterns_match = 0;
   1892  1.1  mrg 	      break;
   1893  1.1  mrg 	    }
   1894  1.1  mrg 	}
   1895  1.1  mrg 
   1896  1.1  mrg       /* Check if numbers of alternatives are the same in all
   1897  1.1  mrg 	 match_operands in output template of define_subst.  */
   1898  1.1  mrg       for (j = 0; j < XVECLEN (subst_elem->data, 3); j++)
   1899  1.1  mrg 	{
   1900  1.1  mrg 	  if (!get_alternatives_number (XVECEXP (subst_elem->data, 3, j),
   1901  1.1  mrg 					&alternatives_subst,
   1902  1.1  mrg 					subst_elem->loc))
   1903  1.1  mrg 	    {
   1904  1.1  mrg 	      patterns_match = 0;
   1905  1.1  mrg 	      break;
   1906  1.1  mrg 	    }
   1907  1.1  mrg 	}
   1908  1.1  mrg 
   1909  1.1  mrg       if (!patterns_match)
   1910  1.1  mrg 	continue;
   1911  1.1  mrg 
   1912  1.1  mrg       /* Clear array in which we save occupied indexes of operands.  */
   1913  1.1  mrg       memset (used_operands_numbers, 0, sizeof (used_operands_numbers));
   1914  1.1  mrg 
   1915  1.1  mrg       /* Create a pattern, based on the output one from define_subst.  */
   1916  1.1  mrg       subst_pattern_vec = rtvec_alloc (XVECLEN (subst_elem->data, 3));
   1917  1.1  mrg       for (j = 0; j < XVECLEN (subst_elem->data, 3); j++)
   1918  1.1  mrg 	{
   1919  1.1  mrg 	  subst_pattern = copy_rtx (XVECEXP (subst_elem->data, 3, j));
   1920  1.1  mrg 
   1921  1.1  mrg 	  /* Duplicate constraints in substitute-pattern.  */
   1922  1.1  mrg 	  subst_pattern = alter_constraints (subst_pattern, alternatives,
   1923  1.1  mrg 					     duplicate_each_alternative);
   1924  1.1  mrg 
   1925  1.1  mrg 	  subst_pattern = adjust_operands_numbers (subst_pattern);
   1926  1.1  mrg 
   1927  1.1  mrg 	  /* Substitute match_dup and match_op_dup in the new pattern and
   1928  1.1  mrg 	     duplicate constraints.  */
   1929  1.1  mrg 	  subst_pattern = subst_dup (subst_pattern, alternatives,
   1930  1.1  mrg 				     alternatives_subst);
   1931  1.1  mrg 
   1932  1.1  mrg 	  replace_duplicating_operands_in_pattern (subst_pattern);
   1933  1.1  mrg 
   1934  1.1  mrg 	  /* We don't need any constraints in DEFINE_EXPAND.  */
   1935  1.1  mrg 	  if (GET_CODE (elem->data) == DEFINE_EXPAND)
   1936  1.1  mrg 	    remove_constraints (subst_pattern);
   1937  1.1  mrg 
   1938  1.1  mrg 	  RTVEC_ELT (subst_pattern_vec, j) = subst_pattern;
   1939  1.1  mrg 	}
   1940  1.1  mrg       XVEC (elem->data, 1) = subst_pattern_vec;
   1941  1.1  mrg 
   1942  1.1  mrg       for (i = 0; i < MAX_OPERANDS; i++)
   1943  1.1  mrg 	  match_operand_entries_in_pattern[i] = NULL;
   1944  1.1  mrg 
   1945  1.1  mrg       if (GET_CODE (elem->data) == DEFINE_INSN)
   1946  1.1  mrg 	{
   1947  1.1  mrg 	  XTMPL (elem->data, 3) =
   1948  1.1  mrg 	    alter_output_for_subst_insn (elem->data, alternatives_subst);
   1949  1.1  mrg 	  alter_attrs_for_subst_insn (elem, alternatives_subst);
   1950  1.1  mrg 	}
   1951  1.1  mrg 
   1952  1.1  mrg       /* Recalculate condition, joining conditions from original and
   1953  1.1  mrg 	 DEFINE_SUBST input patterns.  */
   1954  1.1  mrg       XSTR (elem->data, 2)
   1955  1.1  mrg 	= rtx_reader_ptr->join_c_conditions (XSTR (subst_elem->data, 2),
   1956  1.1  mrg 					     XSTR (elem->data, 2));
   1957  1.1  mrg       /* Mark that subst was applied by changing attribute from "yes"
   1958  1.1  mrg 	 to "no".  */
   1959  1.1  mrg       change_subst_attribute (elem, subst_elem, subst_false);
   1960  1.1  mrg     }
   1961  1.1  mrg 
   1962  1.1  mrg   /* If ELEM contains a subst attribute with value "yes", then we
   1963  1.1  mrg      expected that a subst would be applied, but it wasn't - so,
   1964  1.1  mrg      we need to remove that elementto avoid duplicating.  */
   1965  1.1  mrg   for (subst_elem = define_subst_queue;
   1966  1.1  mrg        subst_elem; subst_elem = subst_elem->next)
   1967  1.1  mrg     {
   1968  1.1  mrg       if (has_subst_attribute (elem, subst_elem))
   1969  1.1  mrg 	{
   1970  1.1  mrg 	  remove_from_queue (elem, &queue);
   1971  1.1  mrg 	  return;
   1972  1.1  mrg 	}
   1973  1.1  mrg     }
   1974  1.1  mrg }
   1975  1.1  mrg 
   1976  1.1  mrg /* This is a subroutine of mark_operands_used_in_match_dup.
   1977  1.1  mrg    This routine is marks all MATCH_OPERANDs inside PATTERN as occupied.  */
   1978  1.1  mrg static void
   1979  1.1  mrg mark_operands_from_match_dup (rtx pattern)
   1980  1.1  mrg {
   1981  1.1  mrg   const char *fmt;
   1982  1.1  mrg   int i, j, len, opno;
   1983  1.1  mrg 
   1984  1.1  mrg   if (GET_CODE (pattern) == MATCH_OPERAND
   1985  1.1  mrg       || GET_CODE (pattern) == MATCH_OPERATOR
   1986  1.1  mrg       || GET_CODE (pattern) == MATCH_PARALLEL)
   1987  1.1  mrg     {
   1988  1.1  mrg       opno = XINT (pattern, 0);
   1989  1.1  mrg       gcc_assert (opno >= 0 && opno < MAX_OPERANDS);
   1990  1.1  mrg       used_operands_numbers [opno] = 1;
   1991  1.1  mrg     }
   1992  1.1  mrg   fmt = GET_RTX_FORMAT (GET_CODE (pattern));
   1993  1.1  mrg   len = GET_RTX_LENGTH (GET_CODE (pattern));
   1994  1.1  mrg   for (i = 0; i < len; i++)
   1995  1.1  mrg     {
   1996  1.1  mrg       switch (fmt[i])
   1997  1.1  mrg 	{
   1998  1.1  mrg 	case 'e': case 'u':
   1999  1.1  mrg 	  mark_operands_from_match_dup (XEXP (pattern, i));
   2000  1.1  mrg 	  break;
   2001  1.1  mrg 	case 'E':
   2002  1.1  mrg 	  for (j = XVECLEN (pattern, i) - 1; j >= 0; --j)
   2003  1.1  mrg 	    mark_operands_from_match_dup (XVECEXP (pattern, i, j));
   2004  1.1  mrg 	  break;
   2005  1.1  mrg 	}
   2006  1.1  mrg     }
   2007  1.1  mrg }
   2008  1.1  mrg 
   2009  1.1  mrg /* This is a subroutine of adjust_operands_numbers.
   2010  1.1  mrg    It goes through all expressions in PATTERN and when MATCH_DUP is
   2011  1.1  mrg    met, all MATCH_OPERANDs inside it is marked as occupied.  The
   2012  1.1  mrg    process of marking is done by routin mark_operands_from_match_dup.  */
   2013  1.1  mrg static void
   2014  1.1  mrg mark_operands_used_in_match_dup (rtx pattern)
   2015  1.1  mrg {
   2016  1.1  mrg   const char *fmt;
   2017  1.1  mrg   int i, j, len, opno;
   2018  1.1  mrg 
   2019  1.1  mrg   if (GET_CODE (pattern) == MATCH_DUP)
   2020  1.1  mrg     {
   2021  1.1  mrg       opno = XINT (pattern, 0);
   2022  1.1  mrg       gcc_assert (opno >= 0 && opno < MAX_OPERANDS);
   2023  1.1  mrg       mark_operands_from_match_dup (operand_data[opno]);
   2024  1.1  mrg       return;
   2025  1.1  mrg     }
   2026  1.1  mrg   fmt = GET_RTX_FORMAT (GET_CODE (pattern));
   2027  1.1  mrg   len = GET_RTX_LENGTH (GET_CODE (pattern));
   2028  1.1  mrg   for (i = 0; i < len; i++)
   2029  1.1  mrg     {
   2030  1.1  mrg       switch (fmt[i])
   2031  1.1  mrg 	{
   2032  1.1  mrg 	case 'e': case 'u':
   2033  1.1  mrg 	  mark_operands_used_in_match_dup (XEXP (pattern, i));
   2034  1.1  mrg 	  break;
   2035  1.1  mrg 	case 'E':
   2036  1.1  mrg 	  for (j = XVECLEN (pattern, i) - 1; j >= 0; --j)
   2037  1.1  mrg 	    mark_operands_used_in_match_dup (XVECEXP (pattern, i, j));
   2038  1.1  mrg 	  break;
   2039  1.1  mrg 	}
   2040  1.1  mrg     }
   2041  1.1  mrg }
   2042  1.1  mrg 
   2043  1.1  mrg /* This is subroutine of renumerate_operands_in_pattern.
   2044  1.1  mrg    It finds first not-occupied operand-index.  */
   2045  1.1  mrg static int
   2046  1.1  mrg find_first_unused_number_of_operand ()
   2047  1.1  mrg {
   2048  1.1  mrg   int i;
   2049  1.1  mrg   for (i = 0; i < MAX_OPERANDS; i++)
   2050  1.1  mrg     if (!used_operands_numbers[i])
   2051  1.1  mrg       return i;
   2052  1.1  mrg   return MAX_OPERANDS;
   2053  1.1  mrg }
   2054  1.1  mrg 
   2055  1.1  mrg /* This is subroutine of adjust_operands_numbers.
   2056  1.1  mrg    It visits all expressions in PATTERN and assigns not-occupied
   2057  1.1  mrg    operand indexes to MATCH_OPERANDs and MATCH_OPERATORs of this
   2058  1.1  mrg    PATTERN.  */
   2059  1.1  mrg static void
   2060  1.1  mrg renumerate_operands_in_pattern (rtx pattern)
   2061  1.1  mrg {
   2062  1.1  mrg   const char *fmt;
   2063  1.1  mrg   enum rtx_code code;
   2064  1.1  mrg   int i, j, len, new_opno;
   2065  1.1  mrg   code = GET_CODE (pattern);
   2066  1.1  mrg 
   2067  1.1  mrg   if (code == MATCH_OPERAND
   2068  1.1  mrg       || code == MATCH_OPERATOR)
   2069  1.1  mrg     {
   2070  1.1  mrg       new_opno = find_first_unused_number_of_operand ();
   2071  1.1  mrg       gcc_assert (new_opno >= 0 && new_opno < MAX_OPERANDS);
   2072  1.1  mrg       XINT (pattern, 0) = new_opno;
   2073  1.1  mrg       used_operands_numbers [new_opno] = 1;
   2074  1.1  mrg     }
   2075  1.1  mrg 
   2076  1.1  mrg   fmt = GET_RTX_FORMAT (GET_CODE (pattern));
   2077  1.1  mrg   len = GET_RTX_LENGTH (GET_CODE (pattern));
   2078  1.1  mrg   for (i = 0; i < len; i++)
   2079  1.1  mrg     {
   2080  1.1  mrg       switch (fmt[i])
   2081  1.1  mrg 	{
   2082  1.1  mrg 	case 'e': case 'u':
   2083  1.1  mrg 	  renumerate_operands_in_pattern (XEXP (pattern, i));
   2084  1.1  mrg 	  break;
   2085  1.1  mrg 	case 'E':
   2086  1.1  mrg 	  for (j = XVECLEN (pattern, i) - 1; j >= 0; --j)
   2087  1.1  mrg 	    renumerate_operands_in_pattern (XVECEXP (pattern, i, j));
   2088  1.1  mrg 	  break;
   2089  1.1  mrg 	}
   2090  1.1  mrg     }
   2091  1.1  mrg }
   2092  1.1  mrg 
   2093  1.1  mrg /* If output pattern of define_subst contains MATCH_DUP, then this
   2094  1.1  mrg    expression would be replaced with the pattern, matched with
   2095  1.1  mrg    MATCH_OPERAND from input pattern.  This pattern could contain any
   2096  1.1  mrg    number of MATCH_OPERANDs, MATCH_OPERATORs etc., so it's possible
   2097  1.1  mrg    that a MATCH_OPERAND from output_pattern (if any) would have the
   2098  1.1  mrg    same number, as MATCH_OPERAND from copied pattern.  To avoid such
   2099  1.1  mrg    indexes overlapping, we assign new indexes to MATCH_OPERANDs,
   2100  1.1  mrg    laying in the output pattern outside of MATCH_DUPs.  */
   2101  1.1  mrg static rtx
   2102  1.1  mrg adjust_operands_numbers (rtx pattern)
   2103  1.1  mrg {
   2104  1.1  mrg   mark_operands_used_in_match_dup (pattern);
   2105  1.1  mrg 
   2106  1.1  mrg   renumerate_operands_in_pattern (pattern);
   2107  1.1  mrg 
   2108  1.1  mrg   return pattern;
   2109  1.1  mrg }
   2110  1.1  mrg 
   2111  1.1  mrg /* Generate RTL expression
   2112  1.1  mrg    (match_dup OPNO)
   2113  1.1  mrg    */
   2114  1.1  mrg static rtx
   2115  1.1  mrg generate_match_dup (int opno)
   2116  1.1  mrg {
   2117  1.1  mrg   rtx return_rtx = rtx_alloc (MATCH_DUP);
   2118  1.1  mrg   PUT_CODE (return_rtx, MATCH_DUP);
   2119  1.1  mrg   XINT (return_rtx, 0) = opno;
   2120  1.1  mrg   return return_rtx;
   2121  1.1  mrg }
   2122  1.1  mrg 
   2123  1.1  mrg /* This routine checks all match_operands in PATTERN and if some of
   2124  1.1  mrg    have the same index, it replaces all of them except the first one  to
   2125  1.1  mrg    match_dup.
   2126  1.1  mrg    Usually, match_operands with the same indexes are forbidden, but
   2127  1.1  mrg    after define_subst copy an RTL-expression from original template,
   2128  1.1  mrg    indexes of existed and just-copied match_operands could coincide.
   2129  1.1  mrg    To fix it, we replace one of them with match_dup.  */
   2130  1.1  mrg static rtx
   2131  1.1  mrg replace_duplicating_operands_in_pattern (rtx pattern)
   2132  1.1  mrg {
   2133  1.1  mrg   const char *fmt;
   2134  1.1  mrg   int i, j, len, opno;
   2135  1.1  mrg   rtx mdup;
   2136  1.1  mrg 
   2137  1.1  mrg   if (GET_CODE (pattern) == MATCH_OPERAND)
   2138  1.1  mrg     {
   2139  1.1  mrg       opno = XINT (pattern, 0);
   2140  1.1  mrg       gcc_assert (opno >= 0 && opno < MAX_OPERANDS);
   2141  1.1  mrg       if (match_operand_entries_in_pattern[opno] == NULL)
   2142  1.1  mrg 	{
   2143  1.1  mrg 	  match_operand_entries_in_pattern[opno] = pattern;
   2144  1.1  mrg 	  return NULL;
   2145  1.1  mrg 	}
   2146  1.1  mrg       else
   2147  1.1  mrg 	{
   2148  1.1  mrg 	  /* Compare predicates before replacing with match_dup.  */
   2149  1.1  mrg 	  if (strcmp (XSTR (pattern, 1),
   2150  1.1  mrg 		      XSTR (match_operand_entries_in_pattern[opno], 1)))
   2151  1.1  mrg 	    {
   2152  1.1  mrg 	      error ("duplicated match_operands with different predicates were"
   2153  1.1  mrg 		     " found.");
   2154  1.1  mrg 	      return NULL;
   2155  1.1  mrg 	    }
   2156  1.1  mrg 	  return generate_match_dup (opno);
   2157  1.1  mrg 	}
   2158  1.1  mrg     }
   2159  1.1  mrg   fmt = GET_RTX_FORMAT (GET_CODE (pattern));
   2160  1.1  mrg   len = GET_RTX_LENGTH (GET_CODE (pattern));
   2161  1.1  mrg   for (i = 0; i < len; i++)
   2162  1.1  mrg     {
   2163  1.1  mrg       switch (fmt[i])
   2164  1.1  mrg 	{
   2165  1.1  mrg 	case 'e': case 'u':
   2166  1.1  mrg 	  mdup = replace_duplicating_operands_in_pattern (XEXP (pattern, i));
   2167  1.1  mrg 	  if (mdup)
   2168  1.1  mrg 	    XEXP (pattern, i) = mdup;
   2169  1.1  mrg 	  break;
   2170  1.1  mrg 	case 'E':
   2171  1.1  mrg 	  for (j = XVECLEN (pattern, i) - 1; j >= 0; --j)
   2172  1.1  mrg 	    {
   2173  1.1  mrg 	      mdup =
   2174  1.1  mrg 		replace_duplicating_operands_in_pattern (XVECEXP
   2175  1.1  mrg 							 (pattern, i, j));
   2176  1.1  mrg 	      if (mdup)
   2177  1.1  mrg 		XVECEXP (pattern, i, j) = mdup;
   2178  1.1  mrg 	    }
   2179  1.1  mrg 	  break;
   2180  1.1  mrg 	}
   2181  1.1  mrg     }
   2182  1.1  mrg   return NULL;
   2183  1.1  mrg }
   2184  1.1  mrg 
   2185  1.1  mrg /* The routine modifies given input PATTERN of define_subst, replacing
   2186  1.1  mrg    MATCH_DUP and MATCH_OP_DUP with operands from define_insn original
   2187  1.1  mrg    pattern, whose operands are stored in OPERAND_DATA array.
   2188  1.1  mrg    It also duplicates constraints in operands - constraints from
   2189  1.1  mrg    define_insn operands are duplicated N_SUBST_ALT times, constraints
   2190  1.1  mrg    from define_subst operands are duplicated N_ALT times.
   2191  1.1  mrg    After the duplication, returned output rtl-pattern contains every
   2192  1.1  mrg    combination of input constraints Vs constraints from define_subst
   2193  1.1  mrg    output.  */
   2194  1.1  mrg static rtx
   2195  1.1  mrg subst_dup (rtx pattern, int n_alt, int n_subst_alt)
   2196  1.1  mrg {
   2197  1.1  mrg   const char *fmt;
   2198  1.1  mrg   enum rtx_code code;
   2199  1.1  mrg   int i, j, len, opno;
   2200  1.1  mrg 
   2201  1.1  mrg   code = GET_CODE (pattern);
   2202  1.1  mrg   switch (code)
   2203  1.1  mrg     {
   2204  1.1  mrg     case MATCH_DUP:
   2205  1.1  mrg     case MATCH_OP_DUP:
   2206  1.1  mrg       opno = XINT (pattern, 0);
   2207  1.1  mrg 
   2208  1.1  mrg       gcc_assert (opno >= 0 && opno < MAX_OPERANDS);
   2209  1.1  mrg 
   2210  1.1  mrg       if (operand_data[opno])
   2211  1.1  mrg 	{
   2212  1.1  mrg 	  pattern = copy_rtx (operand_data[opno]);
   2213  1.1  mrg 
   2214  1.1  mrg 	  /* Duplicate constraints.  */
   2215  1.1  mrg 	  pattern = alter_constraints (pattern, n_subst_alt,
   2216  1.1  mrg 				       duplicate_alternatives);
   2217  1.1  mrg 	}
   2218  1.1  mrg       break;
   2219  1.1  mrg 
   2220  1.1  mrg     default:
   2221  1.1  mrg       break;
   2222  1.1  mrg     }
   2223  1.1  mrg 
   2224  1.1  mrg   fmt = GET_RTX_FORMAT (GET_CODE (pattern));
   2225  1.1  mrg   len = GET_RTX_LENGTH (GET_CODE (pattern));
   2226  1.1  mrg   for (i = 0; i < len; i++)
   2227  1.1  mrg     {
   2228  1.1  mrg       switch (fmt[i])
   2229  1.1  mrg 	{
   2230  1.1  mrg 	case 'e': case 'u':
   2231  1.1  mrg 	  if (code != MATCH_DUP && code != MATCH_OP_DUP)
   2232  1.1  mrg 	    XEXP (pattern, i) = subst_dup (XEXP (pattern, i),
   2233  1.1  mrg 					   n_alt, n_subst_alt);
   2234  1.1  mrg 	  break;
   2235  1.1  mrg 	case 'V':
   2236  1.1  mrg 	  if (XVEC (pattern, i) == NULL)
   2237  1.1  mrg 	    break;
   2238  1.1  mrg 	  /* FALLTHRU */
   2239  1.1  mrg 	case 'E':
   2240  1.1  mrg 	  if (code != MATCH_DUP && code != MATCH_OP_DUP)
   2241  1.1  mrg 	    for (j = XVECLEN (pattern, i) - 1; j >= 0; --j)
   2242  1.1  mrg 	      XVECEXP (pattern, i, j) = subst_dup (XVECEXP (pattern, i, j),
   2243  1.1  mrg 						   n_alt, n_subst_alt);
   2244  1.1  mrg 	  break;
   2245  1.1  mrg 
   2246  1.1  mrg 	case 'r': case 'p': case 'i': case 'w':
   2247  1.1  mrg 	case '0': case 's': case 'S': case 'T':
   2248  1.1  mrg 	  break;
   2249  1.1  mrg 
   2250  1.1  mrg 	default:
   2251  1.1  mrg 	  gcc_unreachable ();
   2252  1.1  mrg 	}
   2253  1.1  mrg     }
   2254  1.1  mrg   return pattern;
   2255  1.1  mrg }
   2256  1.1  mrg 
   2257  1.1  mrg /* If we have any DEFINE_COND_EXEC patterns, expand the DEFINE_INSN
   2258  1.1  mrg    patterns appropriately.  */
   2259  1.1  mrg 
   2260  1.1  mrg static void
   2261  1.1  mrg process_define_cond_exec (void)
   2262  1.1  mrg {
   2263  1.1  mrg   class queue_elem *elem;
   2264  1.1  mrg 
   2265  1.1  mrg   identify_predicable_attribute ();
   2266  1.1  mrg   if (have_error)
   2267  1.1  mrg     return;
   2268  1.1  mrg 
   2269  1.1  mrg   for (elem = define_cond_exec_queue; elem ; elem = elem->next)
   2270  1.1  mrg     process_one_cond_exec (elem);
   2271  1.1  mrg }
   2272  1.1  mrg 
   2273  1.1  mrg /* If we have any DEFINE_SUBST patterns, expand DEFINE_INSN and
   2274  1.1  mrg    DEFINE_EXPAND patterns appropriately.  */
   2275  1.1  mrg 
   2276  1.1  mrg static void
   2277  1.1  mrg process_define_subst (void)
   2278  1.1  mrg {
   2279  1.1  mrg   class queue_elem *elem, *elem_attr;
   2280  1.1  mrg 
   2281  1.1  mrg   /* Check if each define_subst has corresponding define_subst_attr.  */
   2282  1.1  mrg   for (elem = define_subst_queue; elem ; elem = elem->next)
   2283  1.1  mrg     {
   2284  1.1  mrg       for (elem_attr = define_subst_attr_queue;
   2285  1.1  mrg 	   elem_attr;
   2286  1.1  mrg 	   elem_attr = elem_attr->next)
   2287  1.1  mrg 	if (strcmp (XSTR (elem->data, 0), XSTR (elem_attr->data, 1)) == 0)
   2288  1.1  mrg 	    goto found;
   2289  1.1  mrg 
   2290  1.1  mrg       error_at (elem->loc,
   2291  1.1  mrg 		"%s: `define_subst' must have at least one "
   2292  1.1  mrg 		"corresponding `define_subst_attr'",
   2293  1.1  mrg 		XSTR (elem->data, 0));
   2294  1.1  mrg       return;
   2295  1.1  mrg 
   2296  1.1  mrg       found:
   2297  1.1  mrg 	continue;
   2298  1.1  mrg     }
   2299  1.1  mrg 
   2300  1.1  mrg   for (elem = define_insn_queue; elem ; elem = elem->next)
   2301  1.1  mrg     process_substs_on_one_elem (elem, define_insn_queue);
   2302  1.1  mrg   for (elem = other_queue; elem ; elem = elem->next)
   2303  1.1  mrg     {
   2304  1.1  mrg       if (GET_CODE (elem->data) != DEFINE_EXPAND)
   2305  1.1  mrg 	continue;
   2306  1.1  mrg       process_substs_on_one_elem (elem, other_queue);
   2307  1.1  mrg     }
   2308  1.1  mrg }
   2309  1.1  mrg 
   2310  1.1  mrg /* A subclass of rtx_reader which reads .md files and calls process_rtx on
   2312  1.1  mrg    the top-level elements.  */
   2313  1.1  mrg 
   2314  1.1  mrg class gen_reader : public rtx_reader
   2315  1.1  mrg {
   2316  1.1  mrg  public:
   2317  1.1  mrg   gen_reader () : rtx_reader (false) {}
   2318  1.1  mrg   void handle_unknown_directive (file_location, const char *);
   2319  1.1  mrg };
   2320  1.1  mrg 
   2321  1.1  mrg void
   2322  1.1  mrg gen_reader::handle_unknown_directive (file_location loc, const char *rtx_name)
   2323  1.1  mrg {
   2324  1.1  mrg   auto_vec<rtx, 32> subrtxs;
   2325  1.1  mrg   if (!read_rtx (rtx_name, &subrtxs))
   2326  1.1  mrg     return;
   2327  1.1  mrg 
   2328  1.1  mrg   rtx x;
   2329  1.1  mrg   unsigned int i;
   2330  1.1  mrg   FOR_EACH_VEC_ELT (subrtxs, i, x)
   2331  1.1  mrg     process_rtx (x, loc);
   2332  1.1  mrg }
   2333  1.1  mrg 
   2334  1.1  mrg /* Add mnemonic STR with length LEN to the mnemonic hash table
   2335  1.1  mrg    MNEMONIC_HTAB.  A trailing zero end character is appended to STR
   2336  1.1  mrg    and a permanent heap copy of STR is created.  */
   2337  1.1  mrg 
   2338  1.1  mrg static void
   2339  1.1  mrg add_mnemonic_string (htab_t mnemonic_htab, const char *str, size_t len)
   2340  1.1  mrg {
   2341  1.1  mrg   char *new_str;
   2342  1.1  mrg   void **slot;
   2343  1.1  mrg   char *str_zero = (char*)alloca (len + 1);
   2344  1.1  mrg 
   2345  1.1  mrg   memcpy (str_zero, str, len);
   2346  1.1  mrg   str_zero[len] = '\0';
   2347  1.1  mrg 
   2348  1.1  mrg   slot = htab_find_slot (mnemonic_htab, str_zero, INSERT);
   2349  1.1  mrg 
   2350  1.1  mrg   if (*slot)
   2351  1.1  mrg     return;
   2352  1.1  mrg 
   2353  1.1  mrg   /* Not found; create a permanent copy and add it to the hash table.  */
   2354  1.1  mrg   new_str = XNEWVAR (char, len + 1);
   2355  1.1  mrg   memcpy (new_str, str_zero, len + 1);
   2356  1.1  mrg   *slot = new_str;
   2357  1.1  mrg }
   2358  1.1  mrg 
   2359  1.1  mrg /* Scan INSN for mnemonic strings and add them to the mnemonic hash
   2360  1.1  mrg    table in MNEMONIC_HTAB.
   2361  1.1  mrg 
   2362  1.1  mrg    The mnemonics cannot be found if they are emitted using C code.
   2363  1.1  mrg 
   2364  1.1  mrg    If a mnemonic string contains ';' or a newline the string assumed
   2365  1.1  mrg    to consist of more than a single instruction.  The attribute value
   2366  1.1  mrg    will then be set to the user defined default value.  */
   2367  1.1  mrg 
   2368  1.1  mrg static void
   2369  1.1  mrg gen_mnemonic_setattr (htab_t mnemonic_htab, rtx insn)
   2370  1.1  mrg {
   2371  1.1  mrg   const char *template_code, *cp;
   2372  1.1  mrg   int i;
   2373  1.1  mrg   int vec_len;
   2374  1.1  mrg   rtx set_attr;
   2375  1.1  mrg   char *attr_name;
   2376  1.1  mrg   rtvec new_vec;
   2377  1.1  mrg   struct obstack *string_obstack = rtx_reader_ptr->get_string_obstack ();
   2378  1.1  mrg 
   2379  1.1  mrg   template_code = XTMPL (insn, 3);
   2380  1.1  mrg 
   2381  1.1  mrg   /* Skip patterns which use C code to emit the template.  */
   2382  1.1  mrg   if (template_code[0] == '*')
   2383  1.1  mrg     return;
   2384  1.1  mrg 
   2385  1.1  mrg   if (template_code[0] == '@')
   2386  1.1  mrg     cp = &template_code[1];
   2387  1.1  mrg   else
   2388  1.1  mrg     cp = &template_code[0];
   2389  1.1  mrg 
   2390  1.1  mrg   for (i = 0; *cp; )
   2391  1.1  mrg     {
   2392  1.1  mrg       const char *ep, *sp;
   2393  1.1  mrg       size_t size = 0;
   2394  1.1  mrg 
   2395  1.1  mrg       while (ISSPACE (*cp))
   2396  1.1  mrg 	cp++;
   2397  1.1  mrg 
   2398  1.1  mrg       for (ep = sp = cp; !IS_VSPACE (*ep) && *ep != '\0'; ++ep)
   2399  1.1  mrg 	if (!ISSPACE (*ep))
   2400  1.1  mrg 	  sp = ep + 1;
   2401  1.1  mrg 
   2402  1.1  mrg       if (i > 0)
   2403  1.1  mrg 	obstack_1grow (string_obstack, ',');
   2404  1.1  mrg 
   2405  1.1  mrg       while (cp < sp && ((*cp >= '0' && *cp <= '9')
   2406  1.1  mrg 			 || (*cp >= 'a' && *cp <= 'z')))
   2407  1.1  mrg 
   2408  1.1  mrg 	{
   2409  1.1  mrg 	  obstack_1grow (string_obstack, *cp);
   2410  1.1  mrg 	  cp++;
   2411  1.1  mrg 	  size++;
   2412  1.1  mrg 	}
   2413  1.1  mrg 
   2414  1.1  mrg       while (cp < sp)
   2415  1.1  mrg 	{
   2416  1.1  mrg 	  if (*cp == ';' || (*cp == '\\' && cp[1] == 'n'))
   2417  1.1  mrg 	    {
   2418  1.1  mrg 	      /* Don't set a value if there are more than one
   2419  1.1  mrg 		 instruction in the string.  */
   2420  1.1  mrg 	      obstack_blank_fast (string_obstack, -size);
   2421  1.1  mrg 	      size = 0;
   2422  1.1  mrg 
   2423  1.1  mrg 	      cp = sp;
   2424  1.1  mrg 	      break;
   2425  1.1  mrg 	    }
   2426  1.1  mrg 	  cp++;
   2427  1.1  mrg 	}
   2428  1.1  mrg       if (size == 0)
   2429  1.1  mrg 	obstack_1grow (string_obstack, '*');
   2430  1.1  mrg       else
   2431  1.1  mrg 	add_mnemonic_string (mnemonic_htab,
   2432  1.1  mrg 			     (char *) obstack_next_free (string_obstack) - size,
   2433  1.1  mrg 			     size);
   2434  1.1  mrg       i++;
   2435  1.1  mrg     }
   2436  1.1  mrg 
   2437  1.1  mrg   /* An insn definition might emit an empty string.  */
   2438  1.1  mrg   if (obstack_object_size (string_obstack) == 0)
   2439  1.1  mrg     return;
   2440  1.1  mrg 
   2441  1.1  mrg   obstack_1grow (string_obstack, '\0');
   2442  1.1  mrg 
   2443  1.1  mrg   set_attr = rtx_alloc (SET_ATTR);
   2444  1.1  mrg   XSTR (set_attr, 1) = XOBFINISH (string_obstack, char *);
   2445  1.1  mrg   attr_name = XNEWVAR (char, strlen (MNEMONIC_ATTR_NAME) + 1);
   2446  1.1  mrg   strcpy (attr_name, MNEMONIC_ATTR_NAME);
   2447  1.1  mrg   XSTR (set_attr, 0) = attr_name;
   2448  1.1  mrg 
   2449  1.1  mrg   if (!XVEC (insn, 4))
   2450  1.1  mrg     vec_len = 0;
   2451  1.1  mrg   else
   2452  1.1  mrg     vec_len = XVECLEN (insn, 4);
   2453  1.1  mrg 
   2454  1.1  mrg   new_vec = rtvec_alloc (vec_len + 1);
   2455  1.1  mrg   for (i = 0; i < vec_len; i++)
   2456  1.1  mrg     RTVEC_ELT (new_vec, i) = XVECEXP (insn, 4, i);
   2457  1.1  mrg   RTVEC_ELT (new_vec, vec_len) = set_attr;
   2458  1.1  mrg   XVEC (insn, 4) = new_vec;
   2459  1.1  mrg }
   2460  1.1  mrg 
   2461  1.1  mrg /* This function is called for the elements in the mnemonic hashtable
   2462  1.1  mrg    and generates a comma separated list of the mnemonics.  */
   2463  1.1  mrg 
   2464  1.1  mrg static int
   2465  1.1  mrg mnemonic_htab_callback (void **slot, void *info ATTRIBUTE_UNUSED)
   2466  1.1  mrg {
   2467  1.1  mrg   struct obstack *string_obstack = rtx_reader_ptr->get_string_obstack ();
   2468  1.1  mrg 
   2469  1.1  mrg   obstack_grow (string_obstack, (char*) *slot, strlen ((char*) *slot));
   2470  1.1  mrg   obstack_1grow (string_obstack, ',');
   2471  1.1  mrg   return 1;
   2472  1.1  mrg }
   2473  1.1  mrg 
   2474  1.1  mrg /* Generate (set_attr "mnemonic" "..") RTXs and append them to every
   2475  1.1  mrg    insn definition in case the back end requests it by defining the
   2476  1.1  mrg    mnemonic attribute.  The values for the attribute will be extracted
   2477  1.1  mrg    from the output patterns of the insn definitions as far as
   2478  1.1  mrg    possible.  */
   2479  1.1  mrg 
   2480  1.1  mrg static void
   2481  1.1  mrg gen_mnemonic_attr (void)
   2482  1.1  mrg {
   2483  1.1  mrg   class queue_elem *elem;
   2484  1.1  mrg   rtx mnemonic_attr = NULL;
   2485  1.1  mrg   htab_t mnemonic_htab;
   2486  1.1  mrg   const char *str, *p;
   2487  1.1  mrg   int i;
   2488  1.1  mrg   struct obstack *string_obstack = rtx_reader_ptr->get_string_obstack ();
   2489  1.1  mrg 
   2490  1.1  mrg   if (have_error)
   2491  1.1  mrg     return;
   2492  1.1  mrg 
   2493  1.1  mrg   /* Look for the DEFINE_ATTR for `mnemonic'.  */
   2494  1.1  mrg   for (elem = define_attr_queue; elem != *define_attr_tail; elem = elem->next)
   2495  1.1  mrg     if (GET_CODE (elem->data) == DEFINE_ATTR
   2496  1.1  mrg 	&& strcmp (XSTR (elem->data, 0), MNEMONIC_ATTR_NAME) == 0)
   2497  1.1  mrg       {
   2498  1.1  mrg 	mnemonic_attr = elem->data;
   2499  1.1  mrg 	break;
   2500  1.1  mrg       }
   2501  1.1  mrg 
   2502  1.1  mrg   /* A (define_attr "mnemonic" "...") indicates that the back-end
   2503  1.1  mrg      wants a mnemonic attribute to be generated.  */
   2504  1.1  mrg   if (!mnemonic_attr)
   2505  1.1  mrg     return;
   2506  1.1  mrg 
   2507  1.1  mrg   mnemonic_htab = htab_create_alloc (MNEMONIC_HTAB_SIZE, htab_hash_string,
   2508  1.1  mrg 				     htab_eq_string, 0, xcalloc, free);
   2509  1.1  mrg 
   2510  1.1  mrg   for (elem = define_insn_queue; elem; elem = elem->next)
   2511  1.1  mrg     {
   2512  1.1  mrg       rtx insn = elem->data;
   2513  1.1  mrg       bool found = false;
   2514  1.1  mrg 
   2515  1.1  mrg       /* Check if the insn definition already has
   2516  1.1  mrg 	 (set_attr "mnemonic" ...) or (set (attr "mnemonic") ...).  */
   2517  1.1  mrg       if (XVEC (insn, 4))
   2518  1.1  mrg  	for (i = 0; i < XVECLEN (insn, 4); i++)
   2519  1.1  mrg 	  {
   2520  1.1  mrg 	    rtx set_attr = XVECEXP (insn, 4, i);
   2521  1.1  mrg 
   2522  1.1  mrg 	    switch (GET_CODE (set_attr))
   2523  1.1  mrg 	      {
   2524  1.1  mrg 	      case SET_ATTR:
   2525  1.1  mrg 	      case SET_ATTR_ALTERNATIVE:
   2526  1.1  mrg 		if (strcmp (XSTR (set_attr, 0), MNEMONIC_ATTR_NAME) == 0)
   2527  1.1  mrg 		  found = true;
   2528  1.1  mrg 		break;
   2529  1.1  mrg 	      case SET:
   2530  1.1  mrg 		if (GET_CODE (SET_DEST (set_attr)) == ATTR
   2531  1.1  mrg 		    && strcmp (XSTR (SET_DEST (set_attr), 0),
   2532  1.1  mrg 			       MNEMONIC_ATTR_NAME) == 0)
   2533  1.1  mrg 		  found = true;
   2534  1.1  mrg 		break;
   2535  1.1  mrg 	      default:
   2536  1.1  mrg 		break;
   2537  1.1  mrg 	      }
   2538  1.1  mrg 	  }
   2539  1.1  mrg 
   2540  1.1  mrg       if (!found)
   2541  1.1  mrg 	gen_mnemonic_setattr (mnemonic_htab, insn);
   2542  1.1  mrg     }
   2543  1.1  mrg 
   2544  1.1  mrg   /* Add the user defined values to the hash table.  */
   2545  1.1  mrg   str = XSTR (mnemonic_attr, 1);
   2546  1.1  mrg   while ((p = scan_comma_elt (&str)) != NULL)
   2547  1.1  mrg     add_mnemonic_string (mnemonic_htab, p, str - p);
   2548  1.1  mrg 
   2549  1.1  mrg   htab_traverse (mnemonic_htab, mnemonic_htab_callback, NULL);
   2550  1.1  mrg 
   2551  1.1  mrg   /* Replace the last ',' with the zero end character.  */
   2552  1.1  mrg   *((char *) obstack_next_free (string_obstack) - 1) = '\0';
   2553  1.1  mrg   XSTR (mnemonic_attr, 1) = XOBFINISH (string_obstack, char *);
   2554  1.1  mrg }
   2555  1.1  mrg 
   2556  1.1  mrg /* Check if there are DEFINE_ATTRs with the same name.  */
   2557  1.1  mrg static void
   2558  1.1  mrg check_define_attr_duplicates ()
   2559  1.1  mrg {
   2560  1.1  mrg   class queue_elem *elem;
   2561  1.1  mrg   htab_t attr_htab;
   2562  1.1  mrg   char * attr_name;
   2563  1.1  mrg   void **slot;
   2564  1.1  mrg 
   2565  1.1  mrg   attr_htab = htab_create (500, htab_hash_string, htab_eq_string, NULL);
   2566  1.1  mrg 
   2567  1.1  mrg   for (elem = define_attr_queue; elem; elem = elem->next)
   2568  1.1  mrg     {
   2569  1.1  mrg       attr_name = xstrdup (XSTR (elem->data, 0));
   2570  1.1  mrg 
   2571  1.1  mrg       slot = htab_find_slot (attr_htab, attr_name, INSERT);
   2572  1.1  mrg 
   2573  1.1  mrg       /* Duplicate.  */
   2574  1.1  mrg       if (*slot)
   2575  1.1  mrg 	{
   2576  1.1  mrg 	  error_at (elem->loc, "redefinition of attribute '%s'", attr_name);
   2577  1.1  mrg 	  htab_delete (attr_htab);
   2578  1.1  mrg 	  return;
   2579  1.1  mrg 	}
   2580  1.1  mrg 
   2581  1.1  mrg       *slot = attr_name;
   2582  1.1  mrg     }
   2583  1.1  mrg 
   2584  1.1  mrg   htab_delete (attr_htab);
   2585  1.1  mrg }
   2586  1.1  mrg 
   2587  1.1  mrg /* The entry point for initializing the reader.  */
   2588  1.1  mrg 
   2589  1.1  mrg rtx_reader *
   2590  1.1  mrg init_rtx_reader_args_cb (int argc, const char **argv,
   2591  1.1  mrg 			 bool (*parse_opt) (const char *))
   2592  1.1  mrg {
   2593  1.1  mrg   /* Prepare to read input.  */
   2594  1.1  mrg   condition_table = htab_create (500, hash_c_test, cmp_c_test, NULL);
   2595  1.1  mrg   init_predicate_table ();
   2596  1.1  mrg   obstack_init (rtl_obstack);
   2597  1.1  mrg 
   2598  1.1  mrg   /* Start at 1, to make 0 available for CODE_FOR_nothing.  */
   2599  1.1  mrg   insn_sequence_num = 1;
   2600  1.1  mrg 
   2601  1.1  mrg   /* These sequences are not used as indices, so can start at 1 also.  */
   2602  1.1  mrg   split_sequence_num = 1;
   2603  1.1  mrg   peephole2_sequence_num = 1;
   2604  1.1  mrg 
   2605  1.1  mrg   gen_reader *reader = new gen_reader ();
   2606  1.1  mrg   reader->read_md_files (argc, argv, parse_opt);
   2607  1.1  mrg 
   2608  1.1  mrg   if (define_attr_queue != NULL)
   2609  1.1  mrg     check_define_attr_duplicates ();
   2610  1.1  mrg 
   2611  1.1  mrg   /* Process define_cond_exec patterns.  */
   2612  1.1  mrg   if (define_cond_exec_queue != NULL)
   2613  1.1  mrg     process_define_cond_exec ();
   2614  1.1  mrg 
   2615  1.1  mrg   /* Process define_subst patterns.  */
   2616  1.1  mrg   if (define_subst_queue != NULL)
   2617  1.1  mrg     process_define_subst ();
   2618  1.1  mrg 
   2619  1.1  mrg   if (define_attr_queue != NULL)
   2620  1.1  mrg     gen_mnemonic_attr ();
   2621  1.1  mrg 
   2622  1.1  mrg   if (have_error)
   2623  1.1  mrg     {
   2624  1.1  mrg       delete reader;
   2625  1.1  mrg       return NULL;
   2626  1.1  mrg     }
   2627  1.1  mrg 
   2628  1.1  mrg   return reader;
   2629  1.1  mrg }
   2630  1.1  mrg 
   2631  1.1  mrg /* Programs that don't have their own options can use this entry point
   2632  1.1  mrg    instead.  */
   2633  1.1  mrg rtx_reader *
   2634  1.1  mrg init_rtx_reader_args (int argc, const char **argv)
   2635  1.1  mrg {
   2636  1.1  mrg   return init_rtx_reader_args_cb (argc, argv, 0);
   2637  1.1  mrg }
   2638  1.1  mrg 
   2639  1.1  mrg /* Try to read a single rtx from the file.  Return true on success,
   2641  1.1  mrg    describing it in *INFO.  */
   2642  1.1  mrg 
   2643  1.1  mrg bool
   2644  1.1  mrg read_md_rtx (md_rtx_info *info)
   2645  1.1  mrg {
   2646  1.1  mrg   int truth, *counter;
   2647  1.1  mrg   rtx def;
   2648  1.1  mrg 
   2649  1.1  mrg   /* Discard insn patterns which we know can never match (because
   2650  1.1  mrg      their C test is provably always false).  If insn_elision is
   2651  1.1  mrg      false, our caller needs to see all the patterns.  Note that the
   2652  1.1  mrg      elided patterns are never counted by the sequence numbering; it
   2653  1.1  mrg      is the caller's responsibility, when insn_elision is false, not
   2654  1.1  mrg      to use elided pattern numbers for anything.  */
   2655  1.1  mrg   do
   2656  1.1  mrg     {
   2657  1.1  mrg       class queue_elem **queue, *elem;
   2658  1.1  mrg 
   2659  1.1  mrg       /* Read all patterns from a given queue before moving on to the next.  */
   2660  1.1  mrg       if (define_attr_queue != NULL)
   2661  1.1  mrg 	queue = &define_attr_queue;
   2662  1.1  mrg       else if (define_pred_queue != NULL)
   2663  1.1  mrg 	queue = &define_pred_queue;
   2664  1.1  mrg       else if (define_insn_queue != NULL)
   2665  1.1  mrg 	queue = &define_insn_queue;
   2666  1.1  mrg       else if (other_queue != NULL)
   2667  1.1  mrg 	queue = &other_queue;
   2668  1.1  mrg       else
   2669  1.1  mrg 	return false;
   2670  1.1  mrg 
   2671  1.1  mrg       elem = *queue;
   2672  1.1  mrg       *queue = elem->next;
   2673  1.1  mrg       def = elem->data;
   2674  1.1  mrg       info->def = def;
   2675  1.1  mrg       info->loc = elem->loc;
   2676  1.1  mrg       free (elem);
   2677  1.1  mrg 
   2678  1.1  mrg       truth = maybe_eval_c_test (get_c_test (def));
   2679  1.1  mrg     }
   2680  1.1  mrg   while (truth == 0 && insn_elision);
   2681  1.1  mrg 
   2682  1.1  mrg   /* Perform code-specific processing and pick the appropriate sequence
   2683  1.1  mrg      number counter.  */
   2684  1.1  mrg   switch (GET_CODE (def))
   2685  1.1  mrg     {
   2686  1.1  mrg     case DEFINE_INSN:
   2687  1.1  mrg     case DEFINE_EXPAND:
   2688  1.1  mrg       /* insn_sequence_num is used here so the name table will match caller's
   2689  1.1  mrg 	 idea of insn numbering, whether or not elision is active.  */
   2690  1.1  mrg       record_insn_name (insn_sequence_num, XSTR (def, 0));
   2691  1.1  mrg 
   2692  1.1  mrg       /* Fall through.  */
   2693  1.1  mrg     case DEFINE_PEEPHOLE:
   2694  1.1  mrg       counter = &insn_sequence_num;
   2695  1.1  mrg       break;
   2696  1.1  mrg 
   2697  1.1  mrg     case DEFINE_SPLIT:
   2698  1.1  mrg       counter = &split_sequence_num;
   2699  1.1  mrg       break;
   2700  1.1  mrg 
   2701  1.1  mrg     case DEFINE_PEEPHOLE2:
   2702  1.1  mrg       counter = &peephole2_sequence_num;
   2703  1.1  mrg       break;
   2704  1.1  mrg 
   2705  1.1  mrg     default:
   2706  1.1  mrg       counter = NULL;
   2707  1.1  mrg       break;
   2708  1.1  mrg     }
   2709  1.1  mrg 
   2710  1.1  mrg   if (counter)
   2711  1.1  mrg     {
   2712  1.1  mrg       info->index = *counter;
   2713  1.1  mrg       if (truth != 0)
   2714  1.1  mrg 	*counter += 1;
   2715  1.1  mrg     }
   2716  1.1  mrg   else
   2717  1.1  mrg     info->index = -1;
   2718  1.1  mrg 
   2719  1.1  mrg   if (!rtx_locs)
   2720  1.1  mrg     rtx_locs = new hash_map <rtx, file_location>;
   2721  1.1  mrg   rtx_locs->put (info->def, info->loc);
   2722  1.1  mrg 
   2723  1.1  mrg   return true;
   2724  1.1  mrg }
   2725  1.1  mrg 
   2726  1.1  mrg /* Return the file location of DEFINE_* rtx X, which was previously
   2727  1.1  mrg    returned by read_md_rtx.  */
   2728  1.1  mrg file_location
   2729  1.1  mrg get_file_location (rtx x)
   2730  1.1  mrg {
   2731  1.1  mrg   gcc_assert (rtx_locs);
   2732  1.1  mrg   file_location *entry = rtx_locs->get (x);
   2733  1.1  mrg   gcc_assert (entry);
   2734  1.1  mrg   return *entry;
   2735  1.1  mrg }
   2736  1.1  mrg 
   2737  1.1  mrg /* Return the number of possible INSN_CODEs.  Only meaningful once the
   2738  1.1  mrg    whole file has been processed.  */
   2739  1.1  mrg unsigned int
   2740  1.1  mrg get_num_insn_codes ()
   2741  1.1  mrg {
   2742  1.1  mrg   return insn_sequence_num;
   2743  1.1  mrg }
   2744  1.1  mrg 
   2745  1.1  mrg /* Return the C test that says whether definition rtx DEF can be used,
   2746  1.1  mrg    or "" if it can be used unconditionally.  */
   2747  1.1  mrg 
   2748  1.1  mrg const char *
   2749  1.1  mrg get_c_test (rtx x)
   2750  1.1  mrg {
   2751  1.1  mrg   switch (GET_CODE (x))
   2752  1.1  mrg     {
   2753  1.1  mrg     case DEFINE_INSN:
   2754  1.1  mrg     case DEFINE_EXPAND:
   2755  1.1  mrg     case DEFINE_SUBST:
   2756  1.1  mrg       return XSTR (x, 2);
   2757  1.1  mrg 
   2758  1.1  mrg     case DEFINE_SPLIT:
   2759  1.1  mrg     case DEFINE_PEEPHOLE:
   2760  1.1  mrg     case DEFINE_PEEPHOLE2:
   2761  1.1  mrg       return XSTR (x, 1);
   2762  1.1  mrg 
   2763  1.1  mrg     default:
   2764  1.1  mrg       return "";
   2765  1.1  mrg     }
   2766  1.1  mrg }
   2767  1.1  mrg 
   2768  1.1  mrg /* Helper functions for insn elision.  */
   2769  1.1  mrg 
   2770  1.1  mrg /* Compute a hash function of a c_test structure, which is keyed
   2771  1.1  mrg    by its ->expr field.  */
   2772  1.1  mrg hashval_t
   2773  1.1  mrg hash_c_test (const void *x)
   2774  1.1  mrg {
   2775  1.1  mrg   const struct c_test *a = (const struct c_test *) x;
   2776  1.1  mrg   const unsigned char *base, *s = (const unsigned char *) a->expr;
   2777  1.1  mrg   hashval_t hash;
   2778  1.1  mrg   unsigned char c;
   2779  1.1  mrg   unsigned int len;
   2780  1.1  mrg 
   2781  1.1  mrg   base = s;
   2782  1.1  mrg   hash = 0;
   2783  1.1  mrg 
   2784  1.1  mrg   while ((c = *s++) != '\0')
   2785  1.1  mrg     {
   2786  1.1  mrg       hash += c + (c << 17);
   2787  1.1  mrg       hash ^= hash >> 2;
   2788  1.1  mrg     }
   2789  1.1  mrg 
   2790  1.1  mrg   len = s - base;
   2791  1.1  mrg   hash += len + (len << 17);
   2792  1.1  mrg   hash ^= hash >> 2;
   2793  1.1  mrg 
   2794  1.1  mrg   return hash;
   2795  1.1  mrg }
   2796  1.1  mrg 
   2797  1.1  mrg /* Compare two c_test expression structures.  */
   2798  1.1  mrg int
   2799  1.1  mrg cmp_c_test (const void *x, const void *y)
   2800  1.1  mrg {
   2801  1.1  mrg   const struct c_test *a = (const struct c_test *) x;
   2802  1.1  mrg   const struct c_test *b = (const struct c_test *) y;
   2803  1.1  mrg 
   2804  1.1  mrg   return !strcmp (a->expr, b->expr);
   2805  1.1  mrg }
   2806  1.1  mrg 
   2807  1.1  mrg /* Given a string representing a C test expression, look it up in the
   2808  1.1  mrg    condition_table and report whether or not its value is known
   2809  1.1  mrg    at compile time.  Returns a tristate: 1 for known true, 0 for
   2810  1.1  mrg    known false, -1 for unknown.  */
   2811  1.1  mrg int
   2812  1.1  mrg maybe_eval_c_test (const char *expr)
   2813  1.1  mrg {
   2814  1.1  mrg   const struct c_test *test;
   2815  1.1  mrg   struct c_test dummy;
   2816  1.1  mrg 
   2817  1.1  mrg   if (expr[0] == 0)
   2818  1.1  mrg     return 1;
   2819  1.1  mrg 
   2820  1.1  mrg   dummy.expr = expr;
   2821  1.1  mrg   test = (const struct c_test *)htab_find (condition_table, &dummy);
   2822  1.1  mrg   if (!test)
   2823  1.1  mrg     return -1;
   2824  1.1  mrg   return test->value;
   2825  1.1  mrg }
   2826  1.1  mrg 
   2827  1.1  mrg /* Record the C test expression EXPR in the condition_table, with
   2828  1.1  mrg    value VAL.  Duplicates clobber previous entries.  */
   2829  1.1  mrg 
   2830  1.1  mrg void
   2831  1.1  mrg add_c_test (const char *expr, int value)
   2832  1.1  mrg {
   2833  1.1  mrg   struct c_test *test;
   2834  1.1  mrg 
   2835  1.1  mrg   if (expr[0] == 0)
   2836  1.1  mrg     return;
   2837  1.1  mrg 
   2838  1.1  mrg   test = XNEW (struct c_test);
   2839  1.1  mrg   test->expr = expr;
   2840  1.1  mrg   test->value = value;
   2841  1.1  mrg 
   2842  1.1  mrg   *(htab_find_slot (condition_table, test, INSERT)) = test;
   2843  1.1  mrg }
   2844  1.1  mrg 
   2845  1.1  mrg /* For every C test, call CALLBACK with two arguments: a pointer to
   2846  1.1  mrg    the condition structure and INFO.  Stops when CALLBACK returns zero.  */
   2847  1.1  mrg void
   2848  1.1  mrg traverse_c_tests (htab_trav callback, void *info)
   2849  1.1  mrg {
   2850  1.1  mrg   if (condition_table)
   2851  1.1  mrg     htab_traverse (condition_table, callback, info);
   2852  1.1  mrg }
   2853  1.1  mrg 
   2854  1.1  mrg /* Helper functions for define_predicate and define_special_predicate
   2855  1.1  mrg    processing.  Shared between genrecog.cc and genpreds.cc.  */
   2856  1.1  mrg 
   2857  1.1  mrg static htab_t predicate_table;
   2858  1.1  mrg struct pred_data *first_predicate;
   2859  1.1  mrg static struct pred_data **last_predicate = &first_predicate;
   2860  1.1  mrg 
   2861  1.1  mrg static hashval_t
   2862  1.1  mrg hash_struct_pred_data (const void *ptr)
   2863  1.1  mrg {
   2864  1.1  mrg   return htab_hash_string (((const struct pred_data *)ptr)->name);
   2865  1.1  mrg }
   2866  1.1  mrg 
   2867  1.1  mrg static int
   2868  1.1  mrg eq_struct_pred_data (const void *a, const void *b)
   2869  1.1  mrg {
   2870  1.1  mrg   return !strcmp (((const struct pred_data *)a)->name,
   2871  1.1  mrg 		  ((const struct pred_data *)b)->name);
   2872  1.1  mrg }
   2873  1.1  mrg 
   2874  1.1  mrg struct pred_data *
   2875  1.1  mrg lookup_predicate (const char *name)
   2876  1.1  mrg {
   2877  1.1  mrg   struct pred_data key;
   2878  1.1  mrg   key.name = name;
   2879  1.1  mrg   return (struct pred_data *) htab_find (predicate_table, &key);
   2880  1.1  mrg }
   2881  1.1  mrg 
   2882  1.1  mrg /* Record that predicate PRED can accept CODE.  */
   2883  1.1  mrg 
   2884  1.1  mrg void
   2885  1.1  mrg add_predicate_code (struct pred_data *pred, enum rtx_code code)
   2886  1.1  mrg {
   2887  1.1  mrg   if (!pred->codes[code])
   2888  1.1  mrg     {
   2889  1.1  mrg       pred->num_codes++;
   2890  1.1  mrg       pred->codes[code] = true;
   2891  1.1  mrg 
   2892  1.1  mrg       if (GET_RTX_CLASS (code) != RTX_CONST_OBJ)
   2893  1.1  mrg 	pred->allows_non_const = true;
   2894  1.1  mrg 
   2895  1.1  mrg       if (code != REG
   2896  1.1  mrg 	  && code != SUBREG
   2897  1.1  mrg 	  && code != MEM
   2898  1.1  mrg 	  && code != CONCAT
   2899  1.1  mrg 	  && code != PARALLEL
   2900  1.1  mrg 	  && code != STRICT_LOW_PART
   2901  1.1  mrg 	  && code != ZERO_EXTRACT
   2902  1.1  mrg 	  && code != SCRATCH)
   2903  1.1  mrg 	pred->allows_non_lvalue = true;
   2904  1.1  mrg 
   2905  1.1  mrg       if (pred->num_codes == 1)
   2906  1.1  mrg 	pred->singleton = code;
   2907  1.1  mrg       else if (pred->num_codes == 2)
   2908  1.1  mrg 	pred->singleton = UNKNOWN;
   2909  1.1  mrg     }
   2910  1.1  mrg }
   2911  1.1  mrg 
   2912  1.1  mrg void
   2913  1.1  mrg add_predicate (struct pred_data *pred)
   2914  1.1  mrg {
   2915  1.1  mrg   void **slot = htab_find_slot (predicate_table, pred, INSERT);
   2916  1.1  mrg   if (*slot)
   2917  1.1  mrg     {
   2918  1.1  mrg       error ("duplicate predicate definition for '%s'", pred->name);
   2919  1.1  mrg       return;
   2920  1.1  mrg     }
   2921  1.1  mrg   *slot = pred;
   2922  1.1  mrg   *last_predicate = pred;
   2923  1.1  mrg   last_predicate = &pred->next;
   2924  1.1  mrg }
   2925  1.1  mrg 
   2926  1.1  mrg /* This array gives the initial content of the predicate table.  It
   2927  1.1  mrg    has entries for all predicates defined in recog.cc.  */
   2928  1.1  mrg 
   2929  1.1  mrg struct std_pred_table
   2930  1.1  mrg {
   2931  1.1  mrg   const char *name;
   2932  1.1  mrg   bool special;
   2933  1.1  mrg   bool allows_const_p;
   2934  1.1  mrg   RTX_CODE codes[NUM_RTX_CODE];
   2935  1.1  mrg };
   2936  1.1  mrg 
   2937  1.1  mrg static const struct std_pred_table std_preds[] = {
   2938  1.1  mrg   {"general_operand", false, true, {SUBREG, REG, MEM}},
   2939  1.1  mrg   {"address_operand", true, true, {SUBREG, REG, MEM, PLUS, MINUS, MULT,
   2940  1.1  mrg 				   ZERO_EXTEND, SIGN_EXTEND, AND}},
   2941  1.1  mrg   {"register_operand", false, false, {SUBREG, REG}},
   2942  1.1  mrg   {"pmode_register_operand", true, false, {SUBREG, REG}},
   2943  1.1  mrg   {"scratch_operand", false, false, {SCRATCH, REG}},
   2944  1.1  mrg   {"immediate_operand", false, true, {UNKNOWN}},
   2945  1.1  mrg   {"const_int_operand", false, false, {CONST_INT}},
   2946  1.1  mrg #if TARGET_SUPPORTS_WIDE_INT
   2947  1.1  mrg   {"const_scalar_int_operand", false, false, {CONST_INT, CONST_WIDE_INT}},
   2948  1.1  mrg   {"const_double_operand", false, false, {CONST_DOUBLE}},
   2949  1.1  mrg #else
   2950  1.1  mrg   {"const_double_operand", false, false, {CONST_INT, CONST_DOUBLE}},
   2951  1.1  mrg #endif
   2952  1.1  mrg   {"nonimmediate_operand", false, false, {SUBREG, REG, MEM}},
   2953  1.1  mrg   {"nonmemory_operand", false, true, {SUBREG, REG}},
   2954  1.1  mrg   {"push_operand", false, false, {MEM}},
   2955  1.1  mrg   {"pop_operand", false, false, {MEM}},
   2956  1.1  mrg   {"memory_operand", false, false, {SUBREG, MEM}},
   2957  1.1  mrg   {"indirect_operand", false, false, {SUBREG, MEM}},
   2958  1.1  mrg   {"ordered_comparison_operator", false, false, {EQ, NE,
   2959  1.1  mrg 						 LE, LT, GE, GT,
   2960  1.1  mrg 						 LEU, LTU, GEU, GTU}},
   2961  1.1  mrg   {"comparison_operator", false, false, {EQ, NE,
   2962  1.1  mrg 					 LE, LT, GE, GT,
   2963  1.1  mrg 					 LEU, LTU, GEU, GTU,
   2964  1.1  mrg 					 UNORDERED, ORDERED,
   2965  1.1  mrg 					 UNEQ, UNGE, UNGT,
   2966  1.1  mrg 					 UNLE, UNLT, LTGT}}
   2967  1.1  mrg };
   2968  1.1  mrg #define NUM_KNOWN_STD_PREDS ARRAY_SIZE (std_preds)
   2969  1.1  mrg 
   2970  1.1  mrg /* Initialize the table of predicate definitions, starting with
   2971  1.1  mrg    the information we have on generic predicates.  */
   2972  1.1  mrg 
   2973  1.1  mrg static void
   2974  1.1  mrg init_predicate_table (void)
   2975  1.1  mrg {
   2976  1.1  mrg   size_t i, j;
   2977  1.1  mrg   struct pred_data *pred;
   2978  1.1  mrg 
   2979  1.1  mrg   predicate_table = htab_create_alloc (37, hash_struct_pred_data,
   2980  1.1  mrg 				       eq_struct_pred_data, 0,
   2981  1.1  mrg 				       xcalloc, free);
   2982  1.1  mrg 
   2983  1.1  mrg   for (i = 0; i < NUM_KNOWN_STD_PREDS; i++)
   2984  1.1  mrg     {
   2985  1.1  mrg       pred = XCNEW (struct pred_data);
   2986  1.1  mrg       pred->name = std_preds[i].name;
   2987  1.1  mrg       pred->special = std_preds[i].special;
   2988  1.1  mrg 
   2989  1.1  mrg       for (j = 0; std_preds[i].codes[j] != 0; j++)
   2990  1.1  mrg 	add_predicate_code (pred, std_preds[i].codes[j]);
   2991  1.1  mrg 
   2992  1.1  mrg       if (std_preds[i].allows_const_p)
   2993  1.1  mrg 	for (j = 0; j < NUM_RTX_CODE; j++)
   2994  1.1  mrg 	  if (GET_RTX_CLASS (j) == RTX_CONST_OBJ)
   2995  1.1  mrg 	    add_predicate_code (pred, (enum rtx_code) j);
   2996  1.1  mrg 
   2997  1.1  mrg       add_predicate (pred);
   2998  1.1  mrg     }
   2999  1.1  mrg }
   3000  1.1  mrg 
   3001  1.1  mrg /* These functions allow linkage with print-rtl.cc.  Also, some generators
   3003  1.1  mrg    like to annotate their output with insn names.  */
   3004  1.1  mrg 
   3005  1.1  mrg /* Holds an array of names indexed by insn_code_number.  */
   3006  1.1  mrg static char **insn_name_ptr = 0;
   3007  1.1  mrg static int insn_name_ptr_size = 0;
   3008  1.1  mrg 
   3009  1.1  mrg const char *
   3010  1.1  mrg get_insn_name (int code)
   3011  1.1  mrg {
   3012  1.1  mrg   if (code < insn_name_ptr_size)
   3013  1.1  mrg     return insn_name_ptr[code];
   3014  1.1  mrg   else
   3015  1.1  mrg     return NULL;
   3016  1.1  mrg }
   3017  1.1  mrg 
   3018  1.1  mrg static void
   3019  1.1  mrg record_insn_name (int code, const char *name)
   3020  1.1  mrg {
   3021  1.1  mrg   static const char *last_real_name = "insn";
   3022  1.1  mrg   static int last_real_code = 0;
   3023  1.1  mrg   char *new_name;
   3024  1.1  mrg 
   3025  1.1  mrg   if (insn_name_ptr_size <= code)
   3026  1.1  mrg     {
   3027  1.1  mrg       int new_size;
   3028  1.1  mrg       new_size = (insn_name_ptr_size ? insn_name_ptr_size * 2 : 512);
   3029  1.1  mrg       insn_name_ptr = XRESIZEVEC (char *, insn_name_ptr, new_size);
   3030  1.1  mrg       memset (insn_name_ptr + insn_name_ptr_size, 0,
   3031  1.1  mrg 	      sizeof (char *) * (new_size - insn_name_ptr_size));
   3032  1.1  mrg       insn_name_ptr_size = new_size;
   3033  1.1  mrg     }
   3034  1.1  mrg 
   3035  1.1  mrg   if (!name || name[0] == '\0')
   3036  1.1  mrg     {
   3037  1.1  mrg       new_name = XNEWVAR (char, strlen (last_real_name) + 10);
   3038  1.1  mrg       sprintf (new_name, "%s+%d", last_real_name, code - last_real_code);
   3039  1.1  mrg     }
   3040  1.1  mrg   else
   3041  1.1  mrg     {
   3042  1.1  mrg       last_real_name = new_name = xstrdup (name);
   3043  1.1  mrg       last_real_code = code;
   3044  1.1  mrg     }
   3045  1.1  mrg 
   3046  1.1  mrg   insn_name_ptr[code] = new_name;
   3047  1.1  mrg }
   3048  1.1  mrg 
   3049  1.1  mrg /* Make STATS describe the operands that appear in rtx X.  */
   3051  1.1  mrg 
   3052  1.1  mrg static void
   3053  1.1  mrg get_pattern_stats_1 (struct pattern_stats *stats, rtx x)
   3054  1.1  mrg {
   3055  1.1  mrg   RTX_CODE code;
   3056  1.1  mrg   int i;
   3057  1.1  mrg   int len;
   3058  1.1  mrg   const char *fmt;
   3059  1.1  mrg 
   3060  1.1  mrg   if (x == NULL_RTX)
   3061  1.1  mrg     return;
   3062  1.1  mrg 
   3063  1.1  mrg   code = GET_CODE (x);
   3064  1.1  mrg   switch (code)
   3065  1.1  mrg     {
   3066  1.1  mrg     case MATCH_OPERAND:
   3067  1.1  mrg     case MATCH_OPERATOR:
   3068  1.1  mrg     case MATCH_PARALLEL:
   3069  1.1  mrg       stats->max_opno = MAX (stats->max_opno, XINT (x, 0));
   3070  1.1  mrg       break;
   3071  1.1  mrg 
   3072  1.1  mrg     case MATCH_DUP:
   3073  1.1  mrg     case MATCH_OP_DUP:
   3074  1.1  mrg     case MATCH_PAR_DUP:
   3075  1.1  mrg       stats->num_dups++;
   3076  1.1  mrg       stats->max_dup_opno = MAX (stats->max_dup_opno, XINT (x, 0));
   3077  1.1  mrg       break;
   3078  1.1  mrg 
   3079  1.1  mrg     case MATCH_SCRATCH:
   3080  1.1  mrg       if (stats->min_scratch_opno == -1)
   3081  1.1  mrg 	stats->min_scratch_opno = XINT (x, 0);
   3082  1.1  mrg       else
   3083  1.1  mrg 	stats->min_scratch_opno = MIN (stats->min_scratch_opno, XINT (x, 0));
   3084  1.1  mrg       stats->max_scratch_opno = MAX (stats->max_scratch_opno, XINT (x, 0));
   3085  1.1  mrg       break;
   3086  1.1  mrg 
   3087  1.1  mrg     default:
   3088  1.1  mrg       break;
   3089  1.1  mrg     }
   3090  1.1  mrg 
   3091  1.1  mrg   fmt = GET_RTX_FORMAT (code);
   3092  1.1  mrg   len = GET_RTX_LENGTH (code);
   3093  1.1  mrg   for (i = 0; i < len; i++)
   3094  1.1  mrg     {
   3095  1.1  mrg       if (fmt[i] == 'e' || fmt[i] == 'u')
   3096  1.1  mrg 	get_pattern_stats_1 (stats, XEXP (x, i));
   3097  1.1  mrg       else if (fmt[i] == 'E')
   3098  1.1  mrg 	{
   3099  1.1  mrg 	  int j;
   3100  1.1  mrg 	  for (j = 0; j < XVECLEN (x, i); j++)
   3101  1.1  mrg 	    get_pattern_stats_1 (stats, XVECEXP (x, i, j));
   3102  1.1  mrg 	}
   3103  1.1  mrg     }
   3104  1.1  mrg }
   3105  1.1  mrg 
   3106  1.1  mrg /* Make STATS describe the operands that appear in instruction pattern
   3107  1.1  mrg    PATTERN.  */
   3108  1.1  mrg 
   3109  1.1  mrg void
   3110  1.1  mrg get_pattern_stats (struct pattern_stats *stats, rtvec pattern)
   3111  1.1  mrg {
   3112  1.1  mrg   int i, len;
   3113  1.1  mrg 
   3114  1.1  mrg   stats->max_opno = -1;
   3115  1.1  mrg   stats->max_dup_opno = -1;
   3116  1.1  mrg   stats->min_scratch_opno = -1;
   3117  1.1  mrg   stats->max_scratch_opno = -1;
   3118  1.1  mrg   stats->num_dups = 0;
   3119  1.1  mrg 
   3120  1.1  mrg   len = GET_NUM_ELEM (pattern);
   3121  1.1  mrg   for (i = 0; i < len; i++)
   3122  1.1  mrg     get_pattern_stats_1 (stats, RTVEC_ELT (pattern, i));
   3123  1.1  mrg 
   3124  1.1  mrg   stats->num_generator_args = stats->max_opno + 1;
   3125  1.1  mrg   stats->num_insn_operands = MAX (stats->max_opno,
   3126  1.1  mrg 				  stats->max_scratch_opno) + 1;
   3127  1.1  mrg   stats->num_operand_vars = MAX (stats->max_opno,
   3128  1.1  mrg 				  MAX (stats->max_dup_opno,
   3129  1.1  mrg 				       stats->max_scratch_opno)) + 1;
   3130  1.1  mrg }
   3131  1.1  mrg 
   3132  1.1  mrg /* Return the emit_* function that should be used for pattern X, or NULL
   3133  1.1  mrg    if we can't pick a particular type at compile time and should instead
   3134  1.1  mrg    fall back to "emit".  */
   3135  1.1  mrg 
   3136  1.1  mrg const char *
   3137  1.1  mrg get_emit_function (rtx x)
   3138  1.1  mrg {
   3139  1.1  mrg   switch (classify_insn (x))
   3140  1.1  mrg     {
   3141  1.1  mrg     case INSN:
   3142  1.1  mrg       return "emit_insn";
   3143  1.1  mrg 
   3144  1.1  mrg     case CALL_INSN:
   3145  1.1  mrg       return "emit_call_insn";
   3146  1.1  mrg 
   3147  1.1  mrg     case JUMP_INSN:
   3148  1.1  mrg       return "emit_jump_insn";
   3149  1.1  mrg 
   3150  1.1  mrg     case UNKNOWN:
   3151  1.1  mrg       return NULL;
   3152  1.1  mrg 
   3153  1.1  mrg     default:
   3154  1.1  mrg       gcc_unreachable ();
   3155  1.1  mrg     }
   3156  1.1  mrg }
   3157  1.1  mrg 
   3158  1.1  mrg /* Return true if we must emit a barrier after pattern X.  */
   3159  1.1  mrg 
   3160  1.1  mrg bool
   3161  1.1  mrg needs_barrier_p (rtx x)
   3162  1.1  mrg {
   3163  1.1  mrg   return (GET_CODE (x) == SET
   3164  1.1  mrg 	  && GET_CODE (SET_DEST (x)) == PC
   3165  1.1  mrg 	  && GET_CODE (SET_SRC (x)) == LABEL_REF);
   3166  1.1  mrg }
   3167  1.1  mrg 
   3168  1.1  mrg #define NS "NULL"
   3169  1.1  mrg #define ZS "'\\0'"
   3170  1.1  mrg #define OPTAB_CL(o, p, c, b, l)    { #o, p, #b, ZS, #l, o, c, UNKNOWN, 1 },
   3171  1.1  mrg #define OPTAB_CX(o, p) { #o, p, NULL, NULL, NULL, o, UNKNOWN, UNKNOWN, 1 },
   3172  1.1  mrg #define OPTAB_CD(o, p) { #o, p, NS, ZS, NS, o, UNKNOWN, UNKNOWN, 2 },
   3173  1.1  mrg #define OPTAB_NL(o, p, c, b, s, l) { #o, p, #b, #s, #l, o, c, c, 3 },
   3174  1.1  mrg #define OPTAB_NC(o, p, c)          { #o, p, NS, ZS, NS, o, c, c, 3 },
   3175  1.1  mrg #define OPTAB_NX(o, p) { #o, p, NULL, NULL, NULL, o, UNKNOWN, UNKNOWN, 3 },
   3176  1.1  mrg #define OPTAB_VL(o, p, c, b, s, l) { #o, p, #b, #s, #l, o, c, UNKNOWN, 3 },
   3177  1.1  mrg #define OPTAB_VC(o, p, c)          { #o, p, NS, ZS, NS, o, c, UNKNOWN, 3 },
   3178  1.1  mrg #define OPTAB_VX(o, p) { #o, p, NULL, NULL, NULL, o, UNKNOWN, UNKNOWN, 3 },
   3179  1.1  mrg #define OPTAB_DC(o, p, c)          { #o, p, NS, ZS, NS, o, c, c, 4 },
   3180  1.1  mrg #define OPTAB_D(o, p)  { #o, p, NS, ZS, NS, o, UNKNOWN, UNKNOWN, 4 },
   3181  1.1  mrg 
   3182  1.1  mrg /* An array of all optabs.  Note that the same optab can appear more
   3183  1.1  mrg    than once, with a different pattern.  */
   3184  1.1  mrg optab_def optabs[] = {
   3185  1.1  mrg   { "unknown_optab", NULL, NS, ZS, NS, unknown_optab, UNKNOWN, UNKNOWN, 0 },
   3186  1.1  mrg #include "optabs.def"
   3187  1.1  mrg };
   3188  1.1  mrg 
   3189  1.1  mrg /* The number of entries in optabs[].  */
   3190  1.1  mrg unsigned int num_optabs = ARRAY_SIZE (optabs);
   3191  1.1  mrg 
   3192  1.1  mrg #undef OPTAB_CL
   3193  1.1  mrg #undef OPTAB_CX
   3194  1.1  mrg #undef OPTAB_CD
   3195  1.1  mrg #undef OPTAB_NL
   3196  1.1  mrg #undef OPTAB_NC
   3197  1.1  mrg #undef OPTAB_NX
   3198  1.1  mrg #undef OPTAB_VL
   3199  1.1  mrg #undef OPTAB_VC
   3200  1.1  mrg #undef OPTAB_VX
   3201  1.1  mrg #undef OPTAB_DC
   3202  1.1  mrg #undef OPTAB_D
   3203  1.1  mrg 
   3204  1.1  mrg /* Return true if instruction NAME matches pattern PAT, storing information
   3205  1.1  mrg    about the match in P if so.  */
   3206  1.1  mrg 
   3207  1.1  mrg static bool
   3208  1.1  mrg match_pattern (optab_pattern *p, const char *name, const char *pat)
   3209  1.1  mrg {
   3210  1.1  mrg   bool force_float = false;
   3211  1.1  mrg   bool force_int = false;
   3212  1.1  mrg   bool force_partial_int = false;
   3213  1.1  mrg   bool force_fixed = false;
   3214  1.1  mrg 
   3215  1.1  mrg   if (pat == NULL)
   3216  1.1  mrg     return false;
   3217  1.1  mrg   for (; ; ++pat)
   3218  1.1  mrg     {
   3219  1.1  mrg       if (*pat != '$')
   3220  1.1  mrg 	{
   3221  1.1  mrg 	  if (*pat != *name++)
   3222  1.1  mrg 	    return false;
   3223  1.1  mrg 	  if (*pat == '\0')
   3224  1.1  mrg 	    return true;
   3225  1.1  mrg 	  continue;
   3226  1.1  mrg 	}
   3227  1.1  mrg       switch (*++pat)
   3228  1.1  mrg 	{
   3229  1.1  mrg 	case 'I':
   3230  1.1  mrg 	  force_int = 1;
   3231  1.1  mrg 	  break;
   3232  1.1  mrg 	case 'P':
   3233  1.1  mrg 	  force_partial_int = 1;
   3234  1.1  mrg 	  break;
   3235  1.1  mrg 	case 'F':
   3236  1.1  mrg 	  force_float = 1;
   3237  1.1  mrg 	  break;
   3238  1.1  mrg 	case 'Q':
   3239  1.1  mrg 	  force_fixed = 1;
   3240  1.1  mrg 	  break;
   3241  1.1  mrg 
   3242  1.1  mrg 	case 'a':
   3243  1.1  mrg 	case 'b':
   3244  1.1  mrg 	  {
   3245  1.1  mrg 	    int i;
   3246  1.1  mrg 
   3247  1.1  mrg 	    /* This loop will stop at the first prefix match, so
   3248  1.1  mrg 	       look through the modes in reverse order, in case
   3249  1.1  mrg 	       there are extra CC modes and CC is a prefix of the
   3250  1.1  mrg 	       CC modes (as it should be).  */
   3251  1.1  mrg 	    for (i = (MAX_MACHINE_MODE) - 1; i >= 0; i--)
   3252  1.1  mrg 	      {
   3253  1.1  mrg 		const char *p, *q;
   3254  1.1  mrg 		for (p = GET_MODE_NAME (i), q = name; *p; p++, q++)
   3255  1.1  mrg 		  if (TOLOWER (*p) != *q)
   3256  1.1  mrg 		    break;
   3257  1.1  mrg 		if (*p == 0
   3258  1.1  mrg 		    && (! force_int || mode_class[i] == MODE_INT
   3259  1.1  mrg 			|| mode_class[i] == MODE_VECTOR_INT)
   3260  1.1  mrg 		    && (! force_partial_int
   3261  1.1  mrg 			|| mode_class[i] == MODE_INT
   3262  1.1  mrg 			|| mode_class[i] == MODE_PARTIAL_INT
   3263  1.1  mrg 			|| mode_class[i] == MODE_VECTOR_INT)
   3264  1.1  mrg 		    && (! force_float
   3265  1.1  mrg 			|| mode_class[i] == MODE_FLOAT
   3266  1.1  mrg 			|| mode_class[i] == MODE_DECIMAL_FLOAT
   3267  1.1  mrg 			|| mode_class[i] == MODE_COMPLEX_FLOAT
   3268  1.1  mrg 			|| mode_class[i] == MODE_VECTOR_FLOAT)
   3269  1.1  mrg 		    && (! force_fixed
   3270  1.1  mrg 			|| mode_class[i] == MODE_FRACT
   3271  1.1  mrg 			|| mode_class[i] == MODE_UFRACT
   3272  1.1  mrg 			|| mode_class[i] == MODE_ACCUM
   3273  1.1  mrg 			|| mode_class[i] == MODE_UACCUM
   3274  1.1  mrg 			|| mode_class[i] == MODE_VECTOR_FRACT
   3275  1.1  mrg 			|| mode_class[i] == MODE_VECTOR_UFRACT
   3276  1.1  mrg 			|| mode_class[i] == MODE_VECTOR_ACCUM
   3277  1.1  mrg 			|| mode_class[i] == MODE_VECTOR_UACCUM))
   3278  1.1  mrg 		  break;
   3279  1.1  mrg 	      }
   3280  1.1  mrg 
   3281  1.1  mrg 	    if (i < 0)
   3282  1.1  mrg 	      return false;
   3283  1.1  mrg 	    name += strlen (GET_MODE_NAME (i));
   3284  1.1  mrg 	    if (*pat == 'a')
   3285  1.1  mrg 	      p->m1 = i;
   3286  1.1  mrg 	    else
   3287  1.1  mrg 	      p->m2 = i;
   3288  1.1  mrg 
   3289  1.1  mrg 	    force_int = false;
   3290  1.1  mrg 	    force_partial_int = false;
   3291  1.1  mrg 	    force_float = false;
   3292  1.1  mrg 	    force_fixed = false;
   3293  1.1  mrg 	  }
   3294  1.1  mrg 	  break;
   3295  1.1  mrg 
   3296  1.1  mrg 	default:
   3297  1.1  mrg 	  gcc_unreachable ();
   3298  1.1  mrg 	}
   3299  1.1  mrg     }
   3300  1.1  mrg }
   3301  1.1  mrg 
   3302  1.1  mrg /* Return true if NAME is the name of an optab, describing it in P if so.  */
   3303  1.1  mrg 
   3304  1.1  mrg bool
   3305  1.1  mrg find_optab (optab_pattern *p, const char *name)
   3306  1.1  mrg {
   3307  1.1  mrg   if (*name == 0 || *name == '*')
   3308  1.1  mrg     return false;
   3309  1.1  mrg 
   3310  1.1  mrg   /* See if NAME matches one of the patterns we have for the optabs
   3311  1.1  mrg      we know about.  */
   3312  1.1  mrg   for (unsigned int pindex = 0; pindex < ARRAY_SIZE (optabs); pindex++)
   3313  1.1  mrg     {
   3314  1.1  mrg       p->m1 = p->m2 = 0;
   3315  1.1  mrg       if (match_pattern (p, name, optabs[pindex].pattern))
   3316  1.1  mrg 	{
   3317           	  p->name = name;
   3318           	  p->op = optabs[pindex].op;
   3319           	  p->sort_num = (p->op << 16) | (p->m2 << 8) | p->m1;
   3320           	  return true;
   3321           	}
   3322               }
   3323             return false;
   3324           }
   3325