1/* Generate from machine description:
2   - prototype declarations for operand predicates (tm-preds.h)
3   - function definitions of operand predicates, if defined new-style
4     (insn-preds.c)
5   Copyright (C) 2001-2015 Free Software Foundation, Inc.
6
7This file is part of GCC.
8
9GCC is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 3, or (at your option)
12any later version.
13
14GCC is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with GCC; see the file COPYING3.  If not see
21<http://www.gnu.org/licenses/>.  */
22
23#include "bconfig.h"
24#include "system.h"
25#include "coretypes.h"
26#include "tm.h"
27#include "rtl.h"
28#include "errors.h"
29#include "obstack.h"
30#include "read-md.h"
31#include "gensupport.h"
32
33static char general_mem[] = { TARGET_MEM_CONSTRAINT, 0 };
34
35/* Given a predicate expression EXP, from form NAME at line LINENO,
36   verify that it does not contain any RTL constructs which are not
37   valid in predicate definitions.  Returns true if EXP is
38   INvalid; issues error messages, caller need not.  */
39static bool
40validate_exp (rtx exp, const char *name, int lineno)
41{
42  if (exp == 0)
43    {
44      message_with_line (lineno, "%s: must give a predicate expression", name);
45      return true;
46    }
47
48  switch (GET_CODE (exp))
49    {
50      /* Ternary, binary, unary expressions: recurse into subexpressions.  */
51    case IF_THEN_ELSE:
52      if (validate_exp (XEXP (exp, 2), name, lineno))
53	return true;
54      /* else fall through */
55    case AND:
56    case IOR:
57      if (validate_exp (XEXP (exp, 1), name, lineno))
58	return true;
59      /* else fall through */
60    case NOT:
61      return validate_exp (XEXP (exp, 0), name, lineno);
62
63      /* MATCH_CODE might have a syntax error in its path expression.  */
64    case MATCH_CODE:
65      {
66	const char *p;
67	for (p = XSTR (exp, 1); *p; p++)
68	  {
69	    if (!ISDIGIT (*p) && !ISLOWER (*p))
70	      {
71		error_with_line (lineno, "%s: invalid character in path "
72				 "string '%s'", name, XSTR (exp, 1));
73		return true;
74	      }
75	  }
76      }
77      /* fall through */
78
79      /* These need no special checking.  */
80    case MATCH_OPERAND:
81    case MATCH_TEST:
82      return false;
83
84    default:
85      error_with_line (lineno,
86		       "%s: cannot use '%s' in a predicate expression",
87		       name, GET_RTX_NAME (GET_CODE (exp)));
88      return true;
89    }
90}
91
92/* Predicates are defined with (define_predicate) or
93   (define_special_predicate) expressions in the machine description.  */
94static void
95process_define_predicate (rtx defn, int lineno)
96{
97  validate_exp (XEXP (defn, 1), XSTR (defn, 0), lineno);
98}
99
100/* Given a predicate, if it has an embedded C block, write the block
101   out as a static inline subroutine, and augment the RTL test with a
102   match_test that calls that subroutine.  For instance,
103
104       (define_predicate "basereg_operand"
105         (match_operand 0 "register_operand")
106       {
107         if (GET_CODE (op) == SUBREG)
108           op = SUBREG_REG (op);
109         return REG_POINTER (op);
110       })
111
112   becomes
113
114       static inline int basereg_operand_1(rtx op, machine_mode mode)
115       {
116         if (GET_CODE (op) == SUBREG)
117           op = SUBREG_REG (op);
118         return REG_POINTER (op);
119       }
120
121       (define_predicate "basereg_operand"
122         (and (match_operand 0 "register_operand")
123	      (match_test "basereg_operand_1 (op, mode)")))
124
125   The only wart is that there's no way to insist on a { } string in
126   an RTL template, so we have to handle "" strings.  */
127
128
129static void
130write_predicate_subfunction (struct pred_data *p)
131{
132  const char *match_test_str;
133  rtx match_test_exp, and_exp;
134
135  if (p->c_block[0] == '\0')
136    return;
137
138  /* Construct the function-call expression.  */
139  obstack_grow (rtl_obstack, p->name, strlen (p->name));
140  obstack_grow (rtl_obstack, "_1 (op, mode)",
141		sizeof "_1 (op, mode)");
142  match_test_str = XOBFINISH (rtl_obstack, const char *);
143
144  /* Add the function-call expression to the complete expression to be
145     evaluated.  */
146  match_test_exp = rtx_alloc (MATCH_TEST);
147  XSTR (match_test_exp, 0) = match_test_str;
148
149  and_exp = rtx_alloc (AND);
150  XEXP (and_exp, 0) = p->exp;
151  XEXP (and_exp, 1) = match_test_exp;
152
153  p->exp = and_exp;
154
155  printf ("static inline int\n"
156	  "%s_1 (rtx op, machine_mode mode ATTRIBUTE_UNUSED)\n",
157	  p->name);
158  print_md_ptr_loc (p->c_block);
159  if (p->c_block[0] == '{')
160    fputs (p->c_block, stdout);
161  else
162    printf ("{\n  %s\n}", p->c_block);
163  fputs ("\n\n", stdout);
164}
165
166/* Given a predicate expression EXP, from form NAME, determine whether
167   it refers to the variable given as VAR.  */
168static bool
169needs_variable (rtx exp, const char *var)
170{
171  switch (GET_CODE (exp))
172    {
173      /* Ternary, binary, unary expressions need a variable if
174	 any of their subexpressions do.  */
175    case IF_THEN_ELSE:
176      if (needs_variable (XEXP (exp, 2), var))
177	return true;
178      /* else fall through */
179    case AND:
180    case IOR:
181      if (needs_variable (XEXP (exp, 1), var))
182	return true;
183      /* else fall through */
184    case NOT:
185      return needs_variable (XEXP (exp, 0), var);
186
187      /* MATCH_CODE uses "op", but nothing else.  */
188    case MATCH_CODE:
189      return !strcmp (var, "op");
190
191      /* MATCH_OPERAND uses "op" and may use "mode".  */
192    case MATCH_OPERAND:
193      if (!strcmp (var, "op"))
194	return true;
195      if (!strcmp (var, "mode") && GET_MODE (exp) == VOIDmode)
196	return true;
197      return false;
198
199      /* MATCH_TEST uses var if XSTR (exp, 0) =~ /\b${var}\b/o; */
200    case MATCH_TEST:
201      {
202	const char *p = XSTR (exp, 0);
203	const char *q = strstr (p, var);
204	if (!q)
205	  return false;
206	if (q != p && (ISALNUM (q[-1]) || q[-1] == '_'))
207	  return false;
208	q += strlen (var);
209	if (ISALNUM (q[0]) || q[0] == '_')
210	  return false;
211      }
212      return true;
213
214    default:
215      gcc_unreachable ();
216    }
217}
218
219/* Given an RTL expression EXP, find all subexpressions which we may
220   assume to perform mode tests.  Normal MATCH_OPERAND does;
221   MATCH_CODE does if it applies to the whole expression and accepts
222   CONST_INT or CONST_DOUBLE; and we have to assume that MATCH_TEST
223   does not.  These combine in almost-boolean fashion - the only
224   exception is that (not X) must be assumed not to perform a mode
225   test, whether or not X does.
226
227   The mark is the RTL /v flag, which is true for subexpressions which
228   do *not* perform mode tests.
229*/
230#define NO_MODE_TEST(EXP) RTX_FLAG (EXP, volatil)
231static void
232mark_mode_tests (rtx exp)
233{
234  switch (GET_CODE (exp))
235    {
236    case MATCH_OPERAND:
237      {
238	struct pred_data *p = lookup_predicate (XSTR (exp, 1));
239	if (!p)
240	  error ("reference to undefined predicate '%s'", XSTR (exp, 1));
241	else if (p->special || GET_MODE (exp) != VOIDmode)
242	  NO_MODE_TEST (exp) = 1;
243      }
244      break;
245
246    case MATCH_CODE:
247      if (XSTR (exp, 1)[0] != '\0'
248	  || (!strstr (XSTR (exp, 0), "const_int")
249	      && !strstr (XSTR (exp, 0), "const_double")))
250	NO_MODE_TEST (exp) = 1;
251      break;
252
253    case MATCH_TEST:
254    case NOT:
255      NO_MODE_TEST (exp) = 1;
256      break;
257
258    case AND:
259      mark_mode_tests (XEXP (exp, 0));
260      mark_mode_tests (XEXP (exp, 1));
261
262      NO_MODE_TEST (exp) = (NO_MODE_TEST (XEXP (exp, 0))
263			    && NO_MODE_TEST (XEXP (exp, 1)));
264      break;
265
266    case IOR:
267      mark_mode_tests (XEXP (exp, 0));
268      mark_mode_tests (XEXP (exp, 1));
269
270      NO_MODE_TEST (exp) = (NO_MODE_TEST (XEXP (exp, 0))
271			    || NO_MODE_TEST (XEXP (exp, 1)));
272      break;
273
274    case IF_THEN_ELSE:
275      /* A ? B : C does a mode test if (one of A and B) does a mode
276	 test, and C does too.  */
277      mark_mode_tests (XEXP (exp, 0));
278      mark_mode_tests (XEXP (exp, 1));
279      mark_mode_tests (XEXP (exp, 2));
280
281      NO_MODE_TEST (exp) = ((NO_MODE_TEST (XEXP (exp, 0))
282			     && NO_MODE_TEST (XEXP (exp, 1)))
283			    || NO_MODE_TEST (XEXP (exp, 2)));
284      break;
285
286    default:
287      gcc_unreachable ();
288    }
289}
290
291/* Determine whether the expression EXP is a MATCH_CODE that should
292   be written as a switch statement.  */
293static bool
294generate_switch_p (rtx exp)
295{
296  return GET_CODE (exp) == MATCH_CODE
297	 && strchr (XSTR (exp, 0), ',');
298}
299
300/* Given a predicate, work out where in its RTL expression to add
301   tests for proper modes.  Special predicates do not get any such
302   tests.  We try to avoid adding tests when we don't have to; in
303   particular, other normal predicates can be counted on to do it for
304   us.  */
305
306static void
307add_mode_tests (struct pred_data *p)
308{
309  rtx match_test_exp, and_exp;
310  rtx *pos;
311
312  /* Don't touch special predicates.  */
313  if (p->special)
314    return;
315
316  mark_mode_tests (p->exp);
317
318  /* If the whole expression already tests the mode, we're done.  */
319  if (!NO_MODE_TEST (p->exp))
320    return;
321
322  match_test_exp = rtx_alloc (MATCH_TEST);
323  XSTR (match_test_exp, 0) = "mode == VOIDmode || GET_MODE (op) == mode";
324  and_exp = rtx_alloc (AND);
325  XEXP (and_exp, 1) = match_test_exp;
326
327  /* It is always correct to rewrite p->exp as
328
329        (and (...) (match_test "mode == VOIDmode || GET_MODE (op) == mode"))
330
331     but there are a couple forms where we can do better.  If the
332     top-level pattern is an IOR, and one of the two branches does test
333     the mode, we can wrap just the branch that doesn't.  Likewise, if
334     we have an IF_THEN_ELSE, and one side of it tests the mode, we can
335     wrap just the side that doesn't.  And, of course, we can repeat this
336     descent as many times as it works.  */
337
338  pos = &p->exp;
339  for (;;)
340    {
341      rtx subexp = *pos;
342
343      switch (GET_CODE (subexp))
344	{
345	case AND:
346	  /* The switch code generation in write_predicate_stmts prefers
347	     rtx code tests to be at the top of the expression tree.  So
348	     push this AND down into the second operand of an existing
349	     AND expression.  */
350	  if (generate_switch_p (XEXP (subexp, 0)))
351	    pos = &XEXP (subexp, 1);
352	  goto break_loop;
353
354	case IOR:
355	  {
356	    int test0 = NO_MODE_TEST (XEXP (subexp, 0));
357	    int test1 = NO_MODE_TEST (XEXP (subexp, 1));
358
359	    gcc_assert (test0 || test1);
360
361	    if (test0 && test1)
362	      goto break_loop;
363	    pos = test0 ? &XEXP (subexp, 0) : &XEXP (subexp, 1);
364	  }
365	  break;
366
367	case IF_THEN_ELSE:
368	  {
369	    int test0 = NO_MODE_TEST (XEXP (subexp, 0));
370	    int test1 = NO_MODE_TEST (XEXP (subexp, 1));
371	    int test2 = NO_MODE_TEST (XEXP (subexp, 2));
372
373	    gcc_assert ((test0 && test1) || test2);
374
375	    if (test0 && test1 && test2)
376	      goto break_loop;
377	    if (test0 && test1)
378	      /* Must put it on the dependent clause, not the
379	      	 controlling expression, or we change the meaning of
380	      	 the test.  */
381	      pos = &XEXP (subexp, 1);
382	    else
383	      pos = &XEXP (subexp, 2);
384	  }
385	  break;
386
387	default:
388	  goto break_loop;
389	}
390    }
391 break_loop:
392  XEXP (and_exp, 0) = *pos;
393  *pos = and_exp;
394}
395
396/* PATH is a string describing a path from the root of an RTL
397   expression to an inner subexpression to be tested.  Output
398   code which computes the subexpression from the variable
399   holding the root of the expression.  */
400static void
401write_extract_subexp (const char *path)
402{
403  int len = strlen (path);
404  int i;
405
406  /* We first write out the operations (XEXP or XVECEXP) in reverse
407     order, then write "op", then the indices in forward order.  */
408  for (i = len - 1; i >= 0; i--)
409    {
410      if (ISLOWER (path[i]))
411	fputs ("XVECEXP (", stdout);
412      else if (ISDIGIT (path[i]))
413	fputs ("XEXP (", stdout);
414      else
415	gcc_unreachable ();
416    }
417
418  fputs ("op", stdout);
419
420  for (i = 0; i < len; i++)
421    {
422      if (ISLOWER (path[i]))
423	printf (", 0, %d)", path[i] - 'a');
424      else if (ISDIGIT (path[i]))
425	printf (", %d)", path[i] - '0');
426      else
427	gcc_unreachable ();
428    }
429}
430
431/* CODES is a list of RTX codes.  Write out an expression which
432   determines whether the operand has one of those codes.  */
433static void
434write_match_code (const char *path, const char *codes)
435{
436  const char *code;
437
438  while ((code = scan_comma_elt (&codes)) != 0)
439    {
440      fputs ("GET_CODE (", stdout);
441      write_extract_subexp (path);
442      fputs (") == ", stdout);
443      while (code < codes)
444	{
445	  putchar (TOUPPER (*code));
446	  code++;
447	}
448
449      if (*codes == ',')
450	fputs (" || ", stdout);
451    }
452}
453
454/* EXP is an RTL (sub)expression for a predicate.  Recursively
455   descend the expression and write out an equivalent C expression.  */
456static void
457write_predicate_expr (rtx exp)
458{
459  switch (GET_CODE (exp))
460    {
461    case AND:
462      putchar ('(');
463      write_predicate_expr (XEXP (exp, 0));
464      fputs (") && (", stdout);
465      write_predicate_expr (XEXP (exp, 1));
466      putchar (')');
467      break;
468
469    case IOR:
470      putchar ('(');
471      write_predicate_expr (XEXP (exp, 0));
472      fputs (") || (", stdout);
473      write_predicate_expr (XEXP (exp, 1));
474      putchar (')');
475      break;
476
477    case NOT:
478      fputs ("!(", stdout);
479      write_predicate_expr (XEXP (exp, 0));
480      putchar (')');
481      break;
482
483    case IF_THEN_ELSE:
484      putchar ('(');
485      write_predicate_expr (XEXP (exp, 0));
486      fputs (") ? (", stdout);
487      write_predicate_expr (XEXP (exp, 1));
488      fputs (") : (", stdout);
489      write_predicate_expr (XEXP (exp, 2));
490      putchar (')');
491      break;
492
493    case MATCH_OPERAND:
494      if (GET_MODE (exp) == VOIDmode)
495        printf ("%s (op, mode)", XSTR (exp, 1));
496      else
497        printf ("%s (op, %smode)", XSTR (exp, 1), mode_name[GET_MODE (exp)]);
498      break;
499
500    case MATCH_CODE:
501      write_match_code (XSTR (exp, 1), XSTR (exp, 0));
502      break;
503
504    case MATCH_TEST:
505      print_c_condition (XSTR (exp, 0));
506      break;
507
508    default:
509      gcc_unreachable ();
510    }
511}
512
513/* Write the MATCH_CODE expression EXP as a switch statement.  */
514
515static void
516write_match_code_switch (rtx exp)
517{
518  const char *codes = XSTR (exp, 0);
519  const char *path = XSTR (exp, 1);
520  const char *code;
521
522  fputs ("  switch (GET_CODE (", stdout);
523  write_extract_subexp (path);
524  fputs ("))\n    {\n", stdout);
525
526  while ((code = scan_comma_elt (&codes)) != 0)
527    {
528      fputs ("    case ", stdout);
529      while (code < codes)
530	{
531	  putchar (TOUPPER (*code));
532	  code++;
533	}
534      fputs (":\n", stdout);
535    }
536}
537
538/* Given a predicate expression EXP, write out a sequence of stmts
539   to evaluate it.  This is similar to write_predicate_expr but can
540   generate efficient switch statements.  */
541
542static void
543write_predicate_stmts (rtx exp)
544{
545  switch (GET_CODE (exp))
546    {
547    case MATCH_CODE:
548      if (generate_switch_p (exp))
549	{
550	  write_match_code_switch (exp);
551	  puts ("      return true;\n"
552		"    default:\n"
553		"      break;\n"
554		"    }\n"
555		"  return false;");
556	  return;
557	}
558      break;
559
560    case AND:
561      if (generate_switch_p (XEXP (exp, 0)))
562	{
563	  write_match_code_switch (XEXP (exp, 0));
564	  puts ("      break;\n"
565		"    default:\n"
566		"      return false;\n"
567		"    }");
568	  exp = XEXP (exp, 1);
569	}
570      break;
571
572    case IOR:
573      if (generate_switch_p (XEXP (exp, 0)))
574	{
575	  write_match_code_switch (XEXP (exp, 0));
576	  puts ("      return true;\n"
577		"    default:\n"
578		"      break;\n"
579		"    }");
580	  exp = XEXP (exp, 1);
581	}
582      break;
583
584    case NOT:
585      if (generate_switch_p (XEXP (exp, 0)))
586	{
587	  write_match_code_switch (XEXP (exp, 0));
588	  puts ("      return false;\n"
589		"    default:\n"
590		"      break;\n"
591		"    }\n"
592		"  return true;");
593	  return;
594	}
595      break;
596
597    default:
598      break;
599    }
600
601  fputs ("  return ",stdout);
602  write_predicate_expr (exp);
603  fputs (";\n", stdout);
604}
605
606/* Given a predicate, write out a complete C function to compute it.  */
607static void
608write_one_predicate_function (struct pred_data *p)
609{
610  if (!p->exp)
611    return;
612
613  write_predicate_subfunction (p);
614  add_mode_tests (p);
615
616  /* A normal predicate can legitimately not look at machine_mode
617     if it accepts only CONST_INTs and/or CONST_WIDE_INT and/or CONST_DOUBLEs.  */
618  printf ("int\n%s (rtx op, machine_mode mode ATTRIBUTE_UNUSED)\n{\n",
619	  p->name);
620  write_predicate_stmts (p->exp);
621  fputs ("}\n\n", stdout);
622}
623
624/* Constraints fall into two categories: register constraints
625   (define_register_constraint), and others (define_constraint,
626   define_memory_constraint, define_address_constraint).  We
627   work out automatically which of the various old-style macros
628   they correspond to, and produce appropriate code.  They all
629   go in the same hash table so we can verify that there are no
630   duplicate names.  */
631
632/* All data from one constraint definition.  */
633struct constraint_data
634{
635  struct constraint_data *next_this_letter;
636  struct constraint_data *next_textual;
637  const char *name;
638  const char *c_name;    /* same as .name unless mangling is necessary */
639  size_t namelen;
640  const char *regclass;  /* for register constraints */
641  rtx exp;               /* for other constraints */
642  unsigned int lineno;   /* line of definition */
643  unsigned int is_register	: 1;
644  unsigned int is_const_int	: 1;
645  unsigned int is_const_dbl	: 1;
646  unsigned int is_extra		: 1;
647  unsigned int is_memory	: 1;
648  unsigned int is_address	: 1;
649  unsigned int maybe_allows_reg : 1;
650  unsigned int maybe_allows_mem : 1;
651};
652
653/* Overview of all constraints beginning with a given letter.  */
654
655static struct constraint_data *
656constraints_by_letter_table[1<<CHAR_BIT];
657
658/* For looking up all the constraints in the order that they appeared
659   in the machine description.  */
660static struct constraint_data *first_constraint;
661static struct constraint_data **last_constraint_ptr = &first_constraint;
662
663#define FOR_ALL_CONSTRAINTS(iter_) \
664  for (iter_ = first_constraint; iter_; iter_ = iter_->next_textual)
665
666/* Contraint letters that have a special meaning and that cannot be used
667   in define*_constraints.  */
668static const char generic_constraint_letters[] = "g";
669
670/* Machine-independent code expects that constraints with these
671   (initial) letters will allow only (a subset of all) CONST_INTs.  */
672
673static const char const_int_constraints[] = "IJKLMNOP";
674
675/* Machine-independent code expects that constraints with these
676   (initial) letters will allow only (a subset of all) CONST_DOUBLEs.  */
677
678static const char const_dbl_constraints[] = "GH";
679
680/* Summary data used to decide whether to output various functions and
681   macro definitions.  */
682static unsigned int constraint_max_namelen;
683static bool have_register_constraints;
684static bool have_memory_constraints;
685static bool have_address_constraints;
686static bool have_extra_constraints;
687static bool have_const_int_constraints;
688static unsigned int num_constraints;
689
690static const constraint_data **enum_order;
691static unsigned int register_start, register_end;
692static unsigned int satisfied_start;
693static unsigned int const_int_start, const_int_end;
694static unsigned int memory_start, memory_end;
695static unsigned int address_start, address_end;
696static unsigned int maybe_allows_none_start, maybe_allows_none_end;
697static unsigned int maybe_allows_reg_start, maybe_allows_reg_end;
698static unsigned int maybe_allows_mem_start, maybe_allows_mem_end;
699
700/* Convert NAME, which contains angle brackets and/or underscores, to
701   a string that can be used as part of a C identifier.  The string
702   comes from the rtl_obstack.  */
703static const char *
704mangle (const char *name)
705{
706  for (; *name; name++)
707    switch (*name)
708      {
709      case '_': obstack_grow (rtl_obstack, "__", 2); break;
710      case '<':	obstack_grow (rtl_obstack, "_l", 2); break;
711      case '>':	obstack_grow (rtl_obstack, "_g", 2); break;
712      default: obstack_1grow (rtl_obstack, *name); break;
713      }
714
715  obstack_1grow (rtl_obstack, '\0');
716  return XOBFINISH (rtl_obstack, const char *);
717}
718
719/* Return a bitmask, bit 1 if EXP maybe allows a REG/SUBREG, 2 if EXP
720   maybe allows a MEM.  Bits should be clear only when we are sure it
721   will not allow a REG/SUBREG or a MEM.  */
722static int
723compute_maybe_allows (rtx exp)
724{
725  switch (GET_CODE (exp))
726    {
727    case IF_THEN_ELSE:
728      /* Conservative answer is like IOR, of the THEN and ELSE branches.  */
729      return compute_maybe_allows (XEXP (exp, 1))
730	     | compute_maybe_allows (XEXP (exp, 2));
731    case AND:
732      return compute_maybe_allows (XEXP (exp, 0))
733	     & compute_maybe_allows (XEXP (exp, 1));
734    case IOR:
735      return compute_maybe_allows (XEXP (exp, 0))
736	     | compute_maybe_allows (XEXP (exp, 1));
737    case MATCH_CODE:
738      if (*XSTR (exp, 1) == '\0')
739	return (strstr (XSTR (exp, 0), "reg") != NULL ? 1 : 0)
740	       | (strstr (XSTR (exp, 0), "mem") != NULL ? 2 : 0);
741      /* FALLTHRU */
742    default:
743      return 3;
744    }
745}
746
747/* Add one constraint, of any sort, to the tables.  NAME is its name;
748   REGCLASS is the register class, if any; EXP is the expression to
749   test, if any;  IS_MEMORY and IS_ADDRESS indicate memory and address
750   constraints, respectively; LINENO is the line number from the MD reader.
751   Not all combinations of arguments are valid; most importantly, REGCLASS
752   is mutually exclusive with EXP, and IS_MEMORY/IS_ADDRESS are only
753   meaningful for constraints with EXP.
754
755   This function enforces all syntactic and semantic rules about what
756   constraints can be defined.  */
757
758static void
759add_constraint (const char *name, const char *regclass,
760		rtx exp, bool is_memory, bool is_address,
761		int lineno)
762{
763  struct constraint_data *c, **iter, **slot;
764  const char *p;
765  bool need_mangled_name = false;
766  bool is_const_int;
767  bool is_const_dbl;
768  size_t namelen;
769
770  if (strcmp (name, "TARGET_MEM_CONSTRAINT") == 0)
771    name = general_mem;
772
773  if (exp && validate_exp (exp, name, lineno))
774    return;
775
776  for (p = name; *p; p++)
777    if (!ISALNUM (*p))
778      {
779	if (*p == '<' || *p == '>' || *p == '_')
780	  need_mangled_name = true;
781	else
782	  {
783	    error_with_line (lineno,
784			     "constraint name '%s' must be composed of "
785			     "letters, digits, underscores, and "
786			     "angle brackets", name);
787	    return;
788	  }
789      }
790
791  if (strchr (generic_constraint_letters, name[0]))
792    {
793      if (name[1] == '\0')
794	error_with_line (lineno, "constraint letter '%s' cannot be "
795			 "redefined by the machine description", name);
796      else
797	error_with_line (lineno, "constraint name '%s' cannot be defined by "
798			 "the machine description, as it begins with '%c'",
799			 name, name[0]);
800      return;
801    }
802
803
804  namelen = strlen (name);
805  slot = &constraints_by_letter_table[(unsigned int)name[0]];
806  for (iter = slot; *iter; iter = &(*iter)->next_this_letter)
807    {
808      /* This causes slot to end up pointing to the
809	 next_this_letter field of the last constraint with a name
810	 of equal or greater length than the new constraint; hence
811	 the new constraint will be inserted after all previous
812	 constraints with names of the same length.  */
813      if ((*iter)->namelen >= namelen)
814	slot = iter;
815
816      if (!strcmp ((*iter)->name, name))
817	{
818	  error_with_line (lineno, "redefinition of constraint '%s'", name);
819	  message_with_line ((*iter)->lineno, "previous definition is here");
820	  return;
821	}
822      else if (!strncmp ((*iter)->name, name, (*iter)->namelen))
823	{
824	  error_with_line (lineno, "defining constraint '%s' here", name);
825	  message_with_line ((*iter)->lineno, "renders constraint '%s' "
826			     "(defined here) a prefix", (*iter)->name);
827	  return;
828	}
829      else if (!strncmp ((*iter)->name, name, namelen))
830	{
831	  error_with_line (lineno, "constraint '%s' is a prefix", name);
832	  message_with_line ((*iter)->lineno, "of constraint '%s' "
833			     "(defined here)", (*iter)->name);
834	  return;
835	}
836    }
837
838  is_const_int = strchr (const_int_constraints, name[0]) != 0;
839  is_const_dbl = strchr (const_dbl_constraints, name[0]) != 0;
840
841  if (is_const_int || is_const_dbl)
842    {
843      enum rtx_code appropriate_code
844	= is_const_int ? CONST_INT : CONST_DOUBLE;
845
846      /* Consider relaxing this requirement in the future.  */
847      if (regclass
848	  || GET_CODE (exp) != AND
849	  || GET_CODE (XEXP (exp, 0)) != MATCH_CODE
850	  || strcmp (XSTR (XEXP (exp, 0), 0),
851		     GET_RTX_NAME (appropriate_code)))
852	{
853	  if (name[1] == '\0')
854	    error_with_line (lineno, "constraint letter '%c' is reserved "
855			     "for %s constraints",
856			     name[0], GET_RTX_NAME (appropriate_code));
857	  else
858	    error_with_line (lineno, "constraint names beginning with '%c' "
859			     "(%s) are reserved for %s constraints",
860			     name[0], name, GET_RTX_NAME (appropriate_code));
861	  return;
862	}
863
864      if (is_memory)
865	{
866	  if (name[1] == '\0')
867	    error_with_line (lineno, "constraint letter '%c' cannot be a "
868			     "memory constraint", name[0]);
869	  else
870	    error_with_line (lineno, "constraint name '%s' begins with '%c', "
871			     "and therefore cannot be a memory constraint",
872			     name, name[0]);
873	  return;
874	}
875      else if (is_address)
876	{
877	  if (name[1] == '\0')
878	    error_with_line (lineno, "constraint letter '%c' cannot be a "
879			     "memory constraint", name[0]);
880	  else
881	    error_with_line (lineno, "constraint name '%s' begins with '%c', "
882			     "and therefore cannot be a memory constraint",
883			     name, name[0]);
884	  return;
885	}
886    }
887
888
889  c = XOBNEW (rtl_obstack, struct constraint_data);
890  c->name = name;
891  c->c_name = need_mangled_name ? mangle (name) : name;
892  c->lineno = lineno;
893  c->namelen = namelen;
894  c->regclass = regclass;
895  c->exp = exp;
896  c->is_register = regclass != 0;
897  c->is_const_int = is_const_int;
898  c->is_const_dbl = is_const_dbl;
899  c->is_extra = !(regclass || is_const_int || is_const_dbl);
900  c->is_memory = is_memory;
901  c->is_address = is_address;
902  int maybe_allows = 3;
903  if (exp)
904    maybe_allows = compute_maybe_allows (exp);
905  c->maybe_allows_reg = (maybe_allows & 1) != 0;
906  c->maybe_allows_mem = (maybe_allows & 2) != 0;
907
908  c->next_this_letter = *slot;
909  *slot = c;
910
911  /* Insert this constraint in the list of all constraints in textual
912     order.  */
913  c->next_textual = 0;
914  *last_constraint_ptr = c;
915  last_constraint_ptr = &c->next_textual;
916
917  constraint_max_namelen = MAX (constraint_max_namelen, strlen (name));
918  have_register_constraints |= c->is_register;
919  have_const_int_constraints |= c->is_const_int;
920  have_extra_constraints |= c->is_extra;
921  have_memory_constraints |= c->is_memory;
922  have_address_constraints |= c->is_address;
923  num_constraints += 1;
924}
925
926/* Process a DEFINE_CONSTRAINT, DEFINE_MEMORY_CONSTRAINT, or
927   DEFINE_ADDRESS_CONSTRAINT expression, C.  */
928static void
929process_define_constraint (rtx c, int lineno)
930{
931  add_constraint (XSTR (c, 0), 0, XEXP (c, 2),
932		  GET_CODE (c) == DEFINE_MEMORY_CONSTRAINT,
933		  GET_CODE (c) == DEFINE_ADDRESS_CONSTRAINT,
934		  lineno);
935}
936
937/* Process a DEFINE_REGISTER_CONSTRAINT expression, C.  */
938static void
939process_define_register_constraint (rtx c, int lineno)
940{
941  add_constraint (XSTR (c, 0), XSTR (c, 1), 0, false, false, lineno);
942}
943
944/* Put the constraints into enum order.  We want to keep constraints
945   of the same type together so that query functions can be simple
946   range checks.  */
947static void
948choose_enum_order (void)
949{
950  struct constraint_data *c;
951
952  enum_order = XNEWVEC (const constraint_data *, num_constraints);
953  unsigned int next = 0;
954
955  register_start = next;
956  FOR_ALL_CONSTRAINTS (c)
957    if (c->is_register)
958      enum_order[next++] = c;
959  register_end = next;
960
961  satisfied_start = next;
962
963  const_int_start = next;
964  FOR_ALL_CONSTRAINTS (c)
965    if (c->is_const_int)
966      enum_order[next++] = c;
967  const_int_end = next;
968
969  memory_start = next;
970  FOR_ALL_CONSTRAINTS (c)
971    if (c->is_memory)
972      enum_order[next++] = c;
973  memory_end = next;
974
975  address_start = next;
976  FOR_ALL_CONSTRAINTS (c)
977    if (c->is_address)
978      enum_order[next++] = c;
979  address_end = next;
980
981  maybe_allows_none_start = next;
982  FOR_ALL_CONSTRAINTS (c)
983    if (!c->is_register && !c->is_const_int && !c->is_memory && !c->is_address
984	&& !c->maybe_allows_reg && !c->maybe_allows_mem)
985      enum_order[next++] = c;
986  maybe_allows_none_end = next;
987
988  maybe_allows_reg_start = next;
989  FOR_ALL_CONSTRAINTS (c)
990    if (!c->is_register && !c->is_const_int && !c->is_memory && !c->is_address
991	&& c->maybe_allows_reg && !c->maybe_allows_mem)
992      enum_order[next++] = c;
993  maybe_allows_reg_end = next;
994
995  maybe_allows_mem_start = next;
996  FOR_ALL_CONSTRAINTS (c)
997    if (!c->is_register && !c->is_const_int && !c->is_memory && !c->is_address
998	&& !c->maybe_allows_reg && c->maybe_allows_mem)
999      enum_order[next++] = c;
1000  maybe_allows_mem_end = next;
1001
1002  FOR_ALL_CONSTRAINTS (c)
1003    if (!c->is_register && !c->is_const_int && !c->is_memory && !c->is_address
1004	&& c->maybe_allows_reg && c->maybe_allows_mem)
1005      enum_order[next++] = c;
1006  gcc_assert (next == num_constraints);
1007}
1008
1009/* Write out an enumeration with one entry per machine-specific
1010   constraint.  */
1011static void
1012write_enum_constraint_num (void)
1013{
1014  fputs ("#define CONSTRAINT_NUM_DEFINED_P 1\n", stdout);
1015  fputs ("enum constraint_num\n"
1016	 "{\n"
1017	 "  CONSTRAINT__UNKNOWN = 0", stdout);
1018  for (unsigned int i = 0; i < num_constraints; ++i)
1019    printf (",\n  CONSTRAINT_%s", enum_order[i]->c_name);
1020  puts (",\n  CONSTRAINT__LIMIT\n};\n");
1021}
1022
1023/* Write out a function which looks at a string and determines what
1024   constraint name, if any, it begins with.  */
1025static void
1026write_lookup_constraint_1 (void)
1027{
1028  unsigned int i;
1029  puts ("enum constraint_num\n"
1030	"lookup_constraint_1 (const char *str)\n"
1031	"{\n"
1032	"  switch (str[0])\n"
1033	"    {");
1034
1035  for (i = 0; i < ARRAY_SIZE (constraints_by_letter_table); i++)
1036    {
1037      struct constraint_data *c = constraints_by_letter_table[i];
1038      if (!c)
1039	continue;
1040
1041      printf ("    case '%c':\n", i);
1042      if (c->namelen == 1)
1043	printf ("      return CONSTRAINT_%s;\n", c->c_name);
1044      else
1045	{
1046	  do
1047	    {
1048	      printf ("      if (!strncmp (str + 1, \"%s\", %lu))\n"
1049		      "        return CONSTRAINT_%s;\n",
1050		      c->name + 1, (unsigned long int) c->namelen - 1,
1051		      c->c_name);
1052	      c = c->next_this_letter;
1053	    }
1054	  while (c);
1055	  puts ("      break;");
1056	}
1057    }
1058
1059  puts ("    default: break;\n"
1060	"    }\n"
1061	"  return CONSTRAINT__UNKNOWN;\n"
1062	"}\n");
1063}
1064
1065/* Write out an array that maps single-letter characters to their
1066   constraints (if that fits in a character) or 255 if lookup_constraint_1
1067   must be called.  */
1068static void
1069write_lookup_constraint_array (void)
1070{
1071  unsigned int i;
1072  printf ("const unsigned char lookup_constraint_array[] = {\n  ");
1073  for (i = 0; i < ARRAY_SIZE (constraints_by_letter_table); i++)
1074    {
1075      if (i != 0)
1076	printf (",\n  ");
1077      struct constraint_data *c = constraints_by_letter_table[i];
1078      if (!c)
1079	printf ("CONSTRAINT__UNKNOWN");
1080      else if (c->namelen == 1)
1081	printf ("MIN ((int) CONSTRAINT_%s, (int) UCHAR_MAX)", c->c_name);
1082      else
1083	printf ("UCHAR_MAX");
1084    }
1085  printf ("\n};\n\n");
1086}
1087
1088/* Write out a function which looks at a string and determines what
1089   the constraint name length is.  */
1090static void
1091write_insn_constraint_len (void)
1092{
1093  unsigned int i;
1094
1095  puts ("static inline size_t\n"
1096	"insn_constraint_len (char fc, const char *str ATTRIBUTE_UNUSED)\n"
1097	"{\n"
1098	"  switch (fc)\n"
1099	"    {");
1100
1101  for (i = 0; i < ARRAY_SIZE (constraints_by_letter_table); i++)
1102    {
1103      struct constraint_data *c = constraints_by_letter_table[i];
1104
1105      if (!c
1106      	  || c->namelen == 1)
1107	continue;
1108
1109      /* Constraints with multiple characters should have the same
1110	 length.  */
1111      {
1112	struct constraint_data *c2 = c->next_this_letter;
1113	size_t len = c->namelen;
1114	while (c2)
1115	  {
1116	    if (c2->namelen != len)
1117	      error ("Multi-letter constraints with first letter '%c' "
1118		     "should have same length", i);
1119	    c2 = c2->next_this_letter;
1120	  }
1121      }
1122
1123      printf ("    case '%c': return %lu;\n",
1124	      i, (unsigned long int) c->namelen);
1125    }
1126
1127  puts ("    default: break;\n"
1128	"    }\n"
1129	"  return 1;\n"
1130	"}\n");
1131}
1132
1133/* Write out the function which computes the register class corresponding
1134   to a register constraint.  */
1135static void
1136write_reg_class_for_constraint_1 (void)
1137{
1138  struct constraint_data *c;
1139
1140  puts ("enum reg_class\n"
1141	"reg_class_for_constraint_1 (enum constraint_num c)\n"
1142	"{\n"
1143	"  switch (c)\n"
1144	"    {");
1145
1146  FOR_ALL_CONSTRAINTS (c)
1147    if (c->is_register)
1148      printf ("    case CONSTRAINT_%s: return %s;\n", c->c_name, c->regclass);
1149
1150  puts ("    default: break;\n"
1151	"    }\n"
1152	"  return NO_REGS;\n"
1153	"}\n");
1154}
1155
1156/* Write out the functions which compute whether a given value matches
1157   a given non-register constraint.  */
1158static void
1159write_tm_constrs_h (void)
1160{
1161  struct constraint_data *c;
1162
1163  printf ("\
1164/* Generated automatically by the program '%s'\n\
1165   from the machine description file '%s'.  */\n\n", progname, in_fname);
1166
1167  puts ("\
1168#ifndef GCC_TM_CONSTRS_H\n\
1169#define GCC_TM_CONSTRS_H\n");
1170
1171  FOR_ALL_CONSTRAINTS (c)
1172    if (!c->is_register)
1173      {
1174	bool needs_ival = needs_variable (c->exp, "ival");
1175	bool needs_hval = needs_variable (c->exp, "hval");
1176	bool needs_lval = needs_variable (c->exp, "lval");
1177	bool needs_rval = needs_variable (c->exp, "rval");
1178	bool needs_mode = (needs_variable (c->exp, "mode")
1179			   || needs_hval || needs_lval || needs_rval);
1180	bool needs_op = (needs_variable (c->exp, "op")
1181			 || needs_ival || needs_mode);
1182
1183	printf ("static inline bool\n"
1184		"satisfies_constraint_%s (rtx %s)\n"
1185		"{\n", c->c_name,
1186		needs_op ? "op" : "ARG_UNUSED (op)");
1187	if (needs_mode)
1188	  puts ("  machine_mode mode = GET_MODE (op);");
1189	if (needs_ival)
1190	  puts ("  HOST_WIDE_INT ival = 0;");
1191	if (needs_hval)
1192	  puts ("  HOST_WIDE_INT hval = 0;");
1193	if (needs_lval)
1194	  puts ("  unsigned HOST_WIDE_INT lval = 0;");
1195	if (needs_rval)
1196	  puts ("  const REAL_VALUE_TYPE *rval = 0;");
1197
1198	if (needs_ival)
1199	  puts ("  if (CONST_INT_P (op))\n"
1200		"    ival = INTVAL (op);");
1201#if TARGET_SUPPORTS_WIDE_INT
1202	if (needs_lval || needs_hval)
1203	  error ("you can't use lval or hval");
1204#else
1205	if (needs_hval)
1206	  puts ("  if (GET_CODE (op) == CONST_DOUBLE && mode == VOIDmode)"
1207		"    hval = CONST_DOUBLE_HIGH (op);");
1208	if (needs_lval)
1209	  puts ("  if (GET_CODE (op) == CONST_DOUBLE && mode == VOIDmode)"
1210		"    lval = CONST_DOUBLE_LOW (op);");
1211#endif
1212	if (needs_rval)
1213	  puts ("  if (GET_CODE (op) == CONST_DOUBLE && mode != VOIDmode)"
1214		"    rval = CONST_DOUBLE_REAL_VALUE (op);");
1215
1216	write_predicate_stmts (c->exp);
1217	fputs ("}\n", stdout);
1218      }
1219  puts ("#endif /* tm-constrs.h */");
1220}
1221
1222/* Write out the wrapper function, constraint_satisfied_p, that maps
1223   a CONSTRAINT_xxx constant to one of the predicate functions generated
1224   above.  */
1225static void
1226write_constraint_satisfied_p_array (void)
1227{
1228  if (satisfied_start == num_constraints)
1229    return;
1230
1231  printf ("bool (*constraint_satisfied_p_array[]) (rtx) = {\n  ");
1232  for (unsigned int i = satisfied_start; i < num_constraints; ++i)
1233    {
1234      if (i != satisfied_start)
1235	printf (",\n  ");
1236      printf ("satisfies_constraint_%s", enum_order[i]->c_name);
1237    }
1238  printf ("\n};\n\n");
1239}
1240
1241/* Write out the function which computes whether a given value matches
1242   a given CONST_INT constraint.  This doesn't just forward to
1243   constraint_satisfied_p because caller passes the INTVAL, not the RTX.  */
1244static void
1245write_insn_const_int_ok_for_constraint (void)
1246{
1247  struct constraint_data *c;
1248
1249  puts ("bool\n"
1250	"insn_const_int_ok_for_constraint (HOST_WIDE_INT ival, "
1251	                                  "enum constraint_num c)\n"
1252	"{\n"
1253	"  switch (c)\n"
1254	"    {");
1255
1256  FOR_ALL_CONSTRAINTS (c)
1257    if (c->is_const_int)
1258      {
1259	printf ("    case CONSTRAINT_%s:\n      return ", c->c_name);
1260	/* c->exp is guaranteed to be (and (match_code "const_int") (...));
1261	   we know at this point that we have a const_int, so we need not
1262	   bother with that part of the test.  */
1263	write_predicate_expr (XEXP (c->exp, 1));
1264	fputs (";\n\n", stdout);
1265      }
1266
1267  puts ("    default: break;\n"
1268	"    }\n"
1269	"  return false;\n"
1270	"}\n");
1271}
1272
1273/* Write a definition for a function NAME that returns true if a given
1274   constraint_num is in the range [START, END).  */
1275static void
1276write_range_function (const char *name, unsigned int start, unsigned int end)
1277{
1278  printf ("static inline bool\n");
1279  if (start != end)
1280    printf ("%s (enum constraint_num c)\n"
1281	    "{\n"
1282	    "  return c >= CONSTRAINT_%s && c <= CONSTRAINT_%s;\n"
1283	    "}\n\n",
1284	    name, enum_order[start]->c_name, enum_order[end - 1]->c_name);
1285  else
1286    printf ("%s (enum constraint_num)\n"
1287	    "{\n"
1288	    "  return false;\n"
1289	    "}\n\n", name);
1290}
1291
1292/* Write a definition for insn_extra_constraint_allows_reg_mem function.  */
1293static void
1294write_allows_reg_mem_function (void)
1295{
1296  printf ("static inline void\n"
1297	  "insn_extra_constraint_allows_reg_mem (enum constraint_num c,\n"
1298	  "\t\t\t\t      bool *allows_reg, bool *allows_mem)\n"
1299	  "{\n");
1300  if (maybe_allows_none_start != maybe_allows_none_end)
1301    printf ("  if (c >= CONSTRAINT_%s && c <= CONSTRAINT_%s)\n"
1302	    "    return;\n",
1303	    enum_order[maybe_allows_none_start]->c_name,
1304	    enum_order[maybe_allows_none_end - 1]->c_name);
1305  if (maybe_allows_reg_start != maybe_allows_reg_end)
1306    printf ("  if (c >= CONSTRAINT_%s && c <= CONSTRAINT_%s)\n"
1307	    "    {\n"
1308	    "      *allows_reg = true;\n"
1309	    "      return;\n"
1310	    "    }\n",
1311	    enum_order[maybe_allows_reg_start]->c_name,
1312	    enum_order[maybe_allows_reg_end - 1]->c_name);
1313  if (maybe_allows_mem_start != maybe_allows_mem_end)
1314    printf ("  if (c >= CONSTRAINT_%s && c <= CONSTRAINT_%s)\n"
1315	    "    {\n"
1316	    "      *allows_mem = true;\n"
1317	    "      return;\n"
1318	    "    }\n",
1319	    enum_order[maybe_allows_mem_start]->c_name,
1320	    enum_order[maybe_allows_mem_end - 1]->c_name);
1321  printf ("  (void) c;\n"
1322	  "  *allows_reg = true;\n"
1323	  "  *allows_mem = true;\n"
1324	  "}\n\n");
1325}
1326
1327/* VEC is a list of key/value pairs, with the keys being lower bounds
1328   of a range.  Output a decision tree that handles the keys covered by
1329   [VEC[START], VEC[END]), returning FALLBACK for keys lower then VEC[START]'s.
1330   INDENT is the number of spaces to indent the code.  */
1331static void
1332print_type_tree (const vec <std::pair <unsigned int, const char *> > &vec,
1333		 unsigned int start, unsigned int end, const char *fallback,
1334		 unsigned int indent)
1335{
1336  while (start < end)
1337    {
1338      unsigned int mid = (start + end) / 2;
1339      printf ("%*sif (c >= CONSTRAINT_%s)\n",
1340	      indent, "", enum_order[vec[mid].first]->c_name);
1341      if (mid + 1 == end)
1342	print_type_tree (vec, mid + 1, end, vec[mid].second, indent + 2);
1343      else
1344	{
1345	  printf ("%*s{\n", indent + 2, "");
1346	  print_type_tree (vec, mid + 1, end, vec[mid].second, indent + 4);
1347	  printf ("%*s}\n", indent + 2, "");
1348	}
1349      end = mid;
1350    }
1351  printf ("%*sreturn %s;\n", indent, "", fallback);
1352}
1353
1354/* Write tm-preds.h.  Unfortunately, it is impossible to forward-declare
1355   an enumeration in portable C, so we have to condition all these
1356   prototypes on HAVE_MACHINE_MODES.  */
1357static void
1358write_tm_preds_h (void)
1359{
1360  struct pred_data *p;
1361
1362  printf ("\
1363/* Generated automatically by the program '%s'\n\
1364   from the machine description file '%s'.  */\n\n", progname, in_fname);
1365
1366  puts ("\
1367#ifndef GCC_TM_PREDS_H\n\
1368#define GCC_TM_PREDS_H\n\
1369\n\
1370#ifdef HAVE_MACHINE_MODES");
1371
1372  FOR_ALL_PREDICATES (p)
1373    printf ("extern int %s (rtx, machine_mode);\n", p->name);
1374
1375  puts ("#endif /* HAVE_MACHINE_MODES */\n");
1376
1377  if (constraint_max_namelen > 0)
1378    {
1379      write_enum_constraint_num ();
1380      puts ("extern enum constraint_num lookup_constraint_1 (const char *);\n"
1381	    "extern const unsigned char lookup_constraint_array[];\n"
1382	    "\n"
1383	    "/* Return the constraint at the beginning of P, or"
1384	    " CONSTRAINT__UNKNOWN if it\n"
1385	    "   isn't recognized.  */\n"
1386	    "\n"
1387	    "static inline enum constraint_num\n"
1388	    "lookup_constraint (const char *p)\n"
1389	    "{\n"
1390	    "  unsigned int index = lookup_constraint_array"
1391	    "[(unsigned char) *p];\n"
1392	    "  return (index == UCHAR_MAX\n"
1393	    "          ? lookup_constraint_1 (p)\n"
1394	    "          : (enum constraint_num) index);\n"
1395	    "}\n");
1396      if (satisfied_start == num_constraints)
1397	puts ("/* Return true if X satisfies constraint C.  */\n"
1398	      "\n"
1399	      "static inline bool\n"
1400	      "constraint_satisfied_p (rtx, enum constraint_num)\n"
1401	      "{\n"
1402	      "  return false;\n"
1403	      "}\n");
1404      else
1405	printf ("extern bool (*constraint_satisfied_p_array[]) (rtx);\n"
1406		"\n"
1407		"/* Return true if X satisfies constraint C.  */\n"
1408		"\n"
1409		"static inline bool\n"
1410		"constraint_satisfied_p (rtx x, enum constraint_num c)\n"
1411		"{\n"
1412		"  int i = (int) c - (int) CONSTRAINT_%s;\n"
1413		"  return i >= 0 && constraint_satisfied_p_array[i] (x);\n"
1414		"}\n"
1415		"\n",
1416		enum_order[satisfied_start]->name);
1417
1418      write_range_function ("insn_extra_register_constraint",
1419			    register_start, register_end);
1420      write_range_function ("insn_extra_memory_constraint",
1421			    memory_start, memory_end);
1422      write_range_function ("insn_extra_address_constraint",
1423			    address_start, address_end);
1424      write_allows_reg_mem_function ();
1425
1426      if (constraint_max_namelen > 1)
1427        {
1428	  write_insn_constraint_len ();
1429	  puts ("#define CONSTRAINT_LEN(c_,s_) "
1430		"insn_constraint_len (c_,s_)\n");
1431	}
1432      else
1433	puts ("#define CONSTRAINT_LEN(c_,s_) 1\n");
1434      if (have_register_constraints)
1435	puts ("extern enum reg_class reg_class_for_constraint_1 "
1436	      "(enum constraint_num);\n"
1437	      "\n"
1438	      "static inline enum reg_class\n"
1439	      "reg_class_for_constraint (enum constraint_num c)\n"
1440	      "{\n"
1441	      "  if (insn_extra_register_constraint (c))\n"
1442	      "    return reg_class_for_constraint_1 (c);\n"
1443	      "  return NO_REGS;\n"
1444	      "}\n");
1445      else
1446	puts ("static inline enum reg_class\n"
1447	      "reg_class_for_constraint (enum constraint_num)\n"
1448	      "{\n"
1449	      "  return NO_REGS;\n"
1450	      "}\n");
1451      if (have_const_int_constraints)
1452	puts ("extern bool insn_const_int_ok_for_constraint "
1453	      "(HOST_WIDE_INT, enum constraint_num);\n"
1454	      "#define CONST_OK_FOR_CONSTRAINT_P(v_,c_,s_) \\\n"
1455	      "    insn_const_int_ok_for_constraint (v_, "
1456	      "lookup_constraint (s_))\n");
1457      else
1458	puts ("static inline bool\n"
1459	      "insn_const_int_ok_for_constraint (HOST_WIDE_INT,"
1460	      " enum constraint_num)\n"
1461	      "{\n"
1462	      "  return false;\n"
1463	      "}\n");
1464
1465      puts ("enum constraint_type\n"
1466	    "{\n"
1467	    "  CT_REGISTER,\n"
1468	    "  CT_CONST_INT,\n"
1469	    "  CT_MEMORY,\n"
1470	    "  CT_ADDRESS,\n"
1471	    "  CT_FIXED_FORM\n"
1472	    "};\n"
1473	    "\n"
1474	    "static inline enum constraint_type\n"
1475	    "get_constraint_type (enum constraint_num c)\n"
1476	    "{");
1477      auto_vec <std::pair <unsigned int, const char *>, 4> values;
1478      if (const_int_start != const_int_end)
1479	values.safe_push (std::make_pair (const_int_start, "CT_CONST_INT"));
1480      if (memory_start != memory_end)
1481	values.safe_push (std::make_pair (memory_start, "CT_MEMORY"));
1482      if (address_start != address_end)
1483	values.safe_push (std::make_pair (address_start, "CT_ADDRESS"));
1484      if (address_end != num_constraints)
1485	values.safe_push (std::make_pair (address_end, "CT_FIXED_FORM"));
1486      print_type_tree (values, 0, values.length (), "CT_REGISTER", 2);
1487      puts ("}");
1488    }
1489
1490  puts ("#endif /* tm-preds.h */");
1491}
1492
1493/* Write insn-preds.c.
1494   N.B. the list of headers to include was copied from genrecog; it
1495   may not be ideal.
1496
1497   FUTURE: Write #line markers referring back to the machine
1498   description.  (Can't practically do this now since we don't know
1499   the line number of the C block - just the line number of the enclosing
1500   expression.)  */
1501static void
1502write_insn_preds_c (void)
1503{
1504  struct pred_data *p;
1505
1506  printf ("\
1507/* Generated automatically by the program '%s'\n\
1508   from the machine description file '%s'.  */\n\n", progname, in_fname);
1509
1510  puts ("\
1511#include \"config.h\"\n\
1512#include \"system.h\"\n\
1513#include \"coretypes.h\"\n\
1514#include \"tm.h\"\n\
1515#include \"rtl.h\"\n\
1516#include \"hash-set.h\"\n\
1517#include \"machmode.h\"\n\
1518#include \"vec.h\"\n\
1519#include \"double-int.h\"\n\
1520#include \"input.h\"\n\
1521#include \"alias.h\"\n\
1522#include \"symtab.h\"\n\
1523#include \"wide-int.h\"\n\
1524#include \"inchash.h\"\n\
1525#include \"tree.h\"\n\
1526#include \"varasm.h\"\n\
1527#include \"stor-layout.h\"\n\
1528#include \"calls.h\"\n\
1529#include \"tm_p.h\"\n\
1530#include \"hashtab.h\"\n\
1531#include \"hash-set.h\"\n\
1532#include \"vec.h\"\n\
1533#include \"machmode.h\"\n\
1534#include \"hard-reg-set.h\"\n\
1535#include \"input.h\"\n\
1536#include \"function.h\"\n\
1537#include \"insn-config.h\"\n\
1538#include \"recog.h\"\n\
1539#include \"output.h\"\n\
1540#include \"flags.h\"\n\
1541#include \"hard-reg-set.h\"\n\
1542#include \"predict.h\"\n\
1543#include \"basic-block.h\"\n\
1544#include \"resource.h\"\n\
1545#include \"diagnostic-core.h\"\n\
1546#include \"reload.h\"\n\
1547#include \"regs.h\"\n\
1548#include \"tm-constrs.h\"\n");
1549
1550  FOR_ALL_PREDICATES (p)
1551    write_one_predicate_function (p);
1552
1553  if (constraint_max_namelen > 0)
1554    {
1555      write_lookup_constraint_1 ();
1556      write_lookup_constraint_array ();
1557      if (have_register_constraints)
1558	write_reg_class_for_constraint_1 ();
1559      write_constraint_satisfied_p_array ();
1560
1561      if (have_const_int_constraints)
1562	write_insn_const_int_ok_for_constraint ();
1563    }
1564}
1565
1566/* Argument parsing.  */
1567static bool gen_header;
1568static bool gen_constrs;
1569
1570static bool
1571parse_option (const char *opt)
1572{
1573  if (!strcmp (opt, "-h"))
1574    {
1575      gen_header = true;
1576      return 1;
1577    }
1578  else if (!strcmp (opt, "-c"))
1579    {
1580      gen_constrs = true;
1581      return 1;
1582    }
1583  else
1584    return 0;
1585}
1586
1587/* Master control.  */
1588int
1589main (int argc, char **argv)
1590{
1591  rtx defn;
1592  int pattern_lineno, next_insn_code = 0;
1593
1594  progname = argv[0];
1595  if (argc <= 1)
1596    fatal ("no input file name");
1597  if (!init_rtx_reader_args_cb (argc, argv, parse_option))
1598    return FATAL_EXIT_CODE;
1599
1600  while ((defn = read_md_rtx (&pattern_lineno, &next_insn_code)) != 0)
1601    switch (GET_CODE (defn))
1602      {
1603      case DEFINE_PREDICATE:
1604      case DEFINE_SPECIAL_PREDICATE:
1605	process_define_predicate (defn, pattern_lineno);
1606	break;
1607
1608      case DEFINE_CONSTRAINT:
1609      case DEFINE_MEMORY_CONSTRAINT:
1610      case DEFINE_ADDRESS_CONSTRAINT:
1611	process_define_constraint (defn, pattern_lineno);
1612	break;
1613
1614      case DEFINE_REGISTER_CONSTRAINT:
1615	process_define_register_constraint (defn, pattern_lineno);
1616	break;
1617
1618      default:
1619	break;
1620      }
1621
1622  choose_enum_order ();
1623
1624  if (gen_header)
1625    write_tm_preds_h ();
1626  else if (gen_constrs)
1627    write_tm_constrs_h ();
1628  else
1629    write_insn_preds_c ();
1630
1631  if (have_error || ferror (stdout) || fflush (stdout) || fclose (stdout))
1632    return FATAL_EXIT_CODE;
1633
1634  return SUCCESS_EXIT_CODE;
1635}
1636