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