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