1 /* Generate from machine description:
2 - prototype declarations for operand predicates (tm-preds.h)
3 - function definitions of operand predicates, if defined new-style
5 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
6 Free Software Foundation, Inc.
8 This file is part of GCC.
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)
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.
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/>. */
26 #include "coretypes.h"
32 #include "gensupport.h"
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. */
39 validate_exp (rtx exp
, const char *name
, int lineno
)
43 message_with_line (lineno
, "%s: must give a predicate expression", name
);
47 switch (GET_CODE (exp
))
49 /* Ternary, binary, unary expressions: recurse into subexpressions. */
51 if (validate_exp (XEXP (exp
, 2), name
, lineno
))
53 /* else fall through */
56 if (validate_exp (XEXP (exp
, 1), name
, lineno
))
58 /* else fall through */
60 return validate_exp (XEXP (exp
, 0), name
, lineno
);
62 /* MATCH_CODE might have a syntax error in its path expression. */
66 for (p
= XSTR (exp
, 1); *p
; p
++)
68 if (!ISDIGIT (*p
) && !ISLOWER (*p
))
70 error_with_line (lineno
, "%s: invalid character in path "
71 "string '%s'", name
, XSTR (exp
, 1));
78 /* These need no special checking. */
84 error_with_line (lineno
,
85 "%s: cannot use '%s' in a predicate expression",
86 name
, GET_RTX_NAME (GET_CODE (exp
)));
91 /* Predicates are defined with (define_predicate) or
92 (define_special_predicate) expressions in the machine description. */
94 process_define_predicate (rtx defn
, int lineno
)
96 struct pred_data
*pred
;
99 if (!ISALPHA (XSTR (defn
, 0)[0]) && XSTR (defn
, 0)[0] != '_')
101 for (p
= XSTR (defn
, 0) + 1; *p
; p
++)
102 if (!ISALNUM (*p
) && *p
!= '_')
105 if (validate_exp (XEXP (defn
, 1), XSTR (defn
, 0), lineno
))
108 pred
= XCNEW (struct pred_data
);
109 pred
->name
= XSTR (defn
, 0);
110 pred
->exp
= XEXP (defn
, 1);
111 pred
->c_block
= XSTR (defn
, 2);
113 if (GET_CODE (defn
) == DEFINE_SPECIAL_PREDICATE
)
114 pred
->special
= true;
116 add_predicate (pred
);
120 error_with_line (lineno
,
121 "%s: predicate name must be a valid C function name",
126 /* Given a predicate, if it has an embedded C block, write the block
127 out as a static inline subroutine, and augment the RTL test with a
128 match_test that calls that subroutine. For instance,
130 (define_predicate "basereg_operand"
131 (match_operand 0 "register_operand")
133 if (GET_CODE (op) == SUBREG)
134 op = SUBREG_REG (op);
135 return REG_POINTER (op);
140 static inline int basereg_operand_1(rtx op, enum machine_mode mode)
142 if (GET_CODE (op) == SUBREG)
143 op = SUBREG_REG (op);
144 return REG_POINTER (op);
147 (define_predicate "basereg_operand"
148 (and (match_operand 0 "register_operand")
149 (match_test "basereg_operand_1 (op, mode)")))
151 The only wart is that there's no way to insist on a { } string in
152 an RTL template, so we have to handle "" strings. */
156 write_predicate_subfunction (struct pred_data
*p
)
158 const char *match_test_str
;
159 rtx match_test_exp
, and_exp
;
161 if (p
->c_block
[0] == '\0')
164 /* Construct the function-call expression. */
165 obstack_grow (rtl_obstack
, p
->name
, strlen (p
->name
));
166 obstack_grow (rtl_obstack
, "_1 (op, mode)",
167 sizeof "_1 (op, mode)");
168 match_test_str
= XOBFINISH (rtl_obstack
, const char *);
170 /* Add the function-call expression to the complete expression to be
172 match_test_exp
= rtx_alloc (MATCH_TEST
);
173 XSTR (match_test_exp
, 0) = match_test_str
;
175 and_exp
= rtx_alloc (AND
);
176 XEXP (and_exp
, 0) = p
->exp
;
177 XEXP (and_exp
, 1) = match_test_exp
;
181 printf ("static inline int\n"
182 "%s_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)\n",
184 print_md_ptr_loc (p
->c_block
);
185 if (p
->c_block
[0] == '{')
186 fputs (p
->c_block
, stdout
);
188 printf ("{\n %s\n}", p
->c_block
);
189 fputs ("\n\n", stdout
);
192 /* Given a predicate expression EXP, from form NAME, determine whether
193 it refers to the variable given as VAR. */
195 needs_variable (rtx exp
, const char *var
)
197 switch (GET_CODE (exp
))
199 /* Ternary, binary, unary expressions need a variable if
200 any of their subexpressions do. */
202 if (needs_variable (XEXP (exp
, 2), var
))
204 /* else fall through */
207 if (needs_variable (XEXP (exp
, 1), var
))
209 /* else fall through */
211 return needs_variable (XEXP (exp
, 0), var
);
213 /* MATCH_CODE uses "op", but nothing else. */
215 return !strcmp (var
, "op");
217 /* MATCH_OPERAND uses "op" and may use "mode". */
219 if (!strcmp (var
, "op"))
221 if (!strcmp (var
, "mode") && GET_MODE (exp
) == VOIDmode
)
225 /* MATCH_TEST uses var if XSTR (exp, 0) =~ /\b${var}\b/o; */
228 const char *p
= XSTR (exp
, 0);
229 const char *q
= strstr (p
, var
);
232 if (q
!= p
&& (ISALNUM (q
[-1]) || q
[-1] == '_'))
235 if (ISALNUM (q
[0]) || q
[0] == '_')
245 /* Given an RTL expression EXP, find all subexpressions which we may
246 assume to perform mode tests. Normal MATCH_OPERAND does;
247 MATCH_CODE does if it applies to the whole expression and accepts
248 CONST_INT or CONST_DOUBLE; and we have to assume that MATCH_TEST
249 does not. These combine in almost-boolean fashion - the only
250 exception is that (not X) must be assumed not to perform a mode
251 test, whether or not X does.
253 The mark is the RTL /v flag, which is true for subexpressions which
254 do *not* perform mode tests.
256 #define NO_MODE_TEST(EXP) RTX_FLAG (EXP, volatil)
258 mark_mode_tests (rtx exp
)
260 switch (GET_CODE (exp
))
264 struct pred_data
*p
= lookup_predicate (XSTR (exp
, 1));
266 error ("reference to undefined predicate '%s'", XSTR (exp
, 1));
267 else if (p
->special
|| GET_MODE (exp
) != VOIDmode
)
268 NO_MODE_TEST (exp
) = 1;
273 if (XSTR (exp
, 1)[0] != '\0'
274 || (!strstr (XSTR (exp
, 0), "const_int")
275 && !strstr (XSTR (exp
, 0), "const_double")))
276 NO_MODE_TEST (exp
) = 1;
281 NO_MODE_TEST (exp
) = 1;
285 mark_mode_tests (XEXP (exp
, 0));
286 mark_mode_tests (XEXP (exp
, 1));
288 NO_MODE_TEST (exp
) = (NO_MODE_TEST (XEXP (exp
, 0))
289 && NO_MODE_TEST (XEXP (exp
, 1)));
293 mark_mode_tests (XEXP (exp
, 0));
294 mark_mode_tests (XEXP (exp
, 1));
296 NO_MODE_TEST (exp
) = (NO_MODE_TEST (XEXP (exp
, 0))
297 || NO_MODE_TEST (XEXP (exp
, 1)));
301 /* A ? B : C does a mode test if (one of A and B) does a mode
302 test, and C does too. */
303 mark_mode_tests (XEXP (exp
, 0));
304 mark_mode_tests (XEXP (exp
, 1));
305 mark_mode_tests (XEXP (exp
, 2));
307 NO_MODE_TEST (exp
) = ((NO_MODE_TEST (XEXP (exp
, 0))
308 && NO_MODE_TEST (XEXP (exp
, 1)))
309 || NO_MODE_TEST (XEXP (exp
, 2)));
317 /* Determine whether the expression EXP is a MATCH_CODE that should
318 be written as a switch statement. */
320 generate_switch_p (rtx exp
)
322 return GET_CODE (exp
) == MATCH_CODE
323 && strchr (XSTR (exp
, 0), ',');
326 /* Given a predicate, work out where in its RTL expression to add
327 tests for proper modes. Special predicates do not get any such
328 tests. We try to avoid adding tests when we don't have to; in
329 particular, other normal predicates can be counted on to do it for
333 add_mode_tests (struct pred_data
*p
)
335 rtx match_test_exp
, and_exp
;
338 /* Don't touch special predicates. */
342 mark_mode_tests (p
->exp
);
344 /* If the whole expression already tests the mode, we're done. */
345 if (!NO_MODE_TEST (p
->exp
))
348 match_test_exp
= rtx_alloc (MATCH_TEST
);
349 XSTR (match_test_exp
, 0) = "mode == VOIDmode || GET_MODE (op) == mode";
350 and_exp
= rtx_alloc (AND
);
351 XEXP (and_exp
, 1) = match_test_exp
;
353 /* It is always correct to rewrite p->exp as
355 (and (...) (match_test "mode == VOIDmode || GET_MODE (op) == mode"))
357 but there are a couple forms where we can do better. If the
358 top-level pattern is an IOR, and one of the two branches does test
359 the mode, we can wrap just the branch that doesn't. Likewise, if
360 we have an IF_THEN_ELSE, and one side of it tests the mode, we can
361 wrap just the side that doesn't. And, of course, we can repeat this
362 descent as many times as it works. */
369 switch (GET_CODE (subexp
))
372 /* The switch code generation in write_predicate_stmts prefers
373 rtx code tests to be at the top of the expression tree. So
374 push this AND down into the second operand of an existing
376 if (generate_switch_p (XEXP (subexp
, 0)))
377 pos
= &XEXP (subexp
, 1);
382 int test0
= NO_MODE_TEST (XEXP (subexp
, 0));
383 int test1
= NO_MODE_TEST (XEXP (subexp
, 1));
385 gcc_assert (test0
|| test1
);
389 pos
= test0
? &XEXP (subexp
, 0) : &XEXP (subexp
, 1);
395 int test0
= NO_MODE_TEST (XEXP (subexp
, 0));
396 int test1
= NO_MODE_TEST (XEXP (subexp
, 1));
397 int test2
= NO_MODE_TEST (XEXP (subexp
, 2));
399 gcc_assert ((test0
&& test1
) || test2
);
401 if (test0
&& test1
&& test2
)
404 /* Must put it on the dependent clause, not the
405 controlling expression, or we change the meaning of
407 pos
= &XEXP (subexp
, 1);
409 pos
= &XEXP (subexp
, 2);
418 XEXP (and_exp
, 0) = *pos
;
422 /* PATH is a string describing a path from the root of an RTL
423 expression to an inner subexpression to be tested. Output
424 code which computes the subexpression from the variable
425 holding the root of the expression. */
427 write_extract_subexp (const char *path
)
429 int len
= strlen (path
);
432 /* We first write out the operations (XEXP or XVECEXP) in reverse
433 order, then write "op", then the indices in forward order. */
434 for (i
= len
- 1; i
>= 0; i
--)
436 if (ISLOWER (path
[i
]))
437 fputs ("XVECEXP (", stdout
);
438 else if (ISDIGIT (path
[i
]))
439 fputs ("XEXP (", stdout
);
444 fputs ("op", stdout
);
446 for (i
= 0; i
< len
; i
++)
448 if (ISLOWER (path
[i
]))
449 printf (", 0, %d)", path
[i
] - 'a');
450 else if (ISDIGIT (path
[i
]))
451 printf (", %d)", path
[i
] - '0');
457 /* CODES is a list of RTX codes. Write out an expression which
458 determines whether the operand has one of those codes. */
460 write_match_code (const char *path
, const char *codes
)
464 while ((code
= scan_comma_elt (&codes
)) != 0)
466 fputs ("GET_CODE (", stdout
);
467 write_extract_subexp (path
);
468 fputs (") == ", stdout
);
471 putchar (TOUPPER (*code
));
476 fputs (" || ", stdout
);
480 /* EXP is an RTL (sub)expression for a predicate. Recursively
481 descend the expression and write out an equivalent C expression. */
483 write_predicate_expr (rtx exp
)
485 switch (GET_CODE (exp
))
489 write_predicate_expr (XEXP (exp
, 0));
490 fputs (") && (", stdout
);
491 write_predicate_expr (XEXP (exp
, 1));
497 write_predicate_expr (XEXP (exp
, 0));
498 fputs (") || (", stdout
);
499 write_predicate_expr (XEXP (exp
, 1));
504 fputs ("!(", stdout
);
505 write_predicate_expr (XEXP (exp
, 0));
511 write_predicate_expr (XEXP (exp
, 0));
512 fputs (") ? (", stdout
);
513 write_predicate_expr (XEXP (exp
, 1));
514 fputs (") : (", stdout
);
515 write_predicate_expr (XEXP (exp
, 2));
520 if (GET_MODE (exp
) == VOIDmode
)
521 printf ("%s (op, mode)", XSTR (exp
, 1));
523 printf ("%s (op, %smode)", XSTR (exp
, 1), mode_name
[GET_MODE (exp
)]);
527 write_match_code (XSTR (exp
, 1), XSTR (exp
, 0));
531 print_c_condition (XSTR (exp
, 0));
539 /* Write the MATCH_CODE expression EXP as a switch statement. */
542 write_match_code_switch (rtx exp
)
544 const char *codes
= XSTR (exp
, 0);
545 const char *path
= XSTR (exp
, 1);
548 fputs (" switch (GET_CODE (", stdout
);
549 write_extract_subexp (path
);
550 fputs ("))\n {\n", stdout
);
552 while ((code
= scan_comma_elt (&codes
)) != 0)
554 fputs (" case ", stdout
);
557 putchar (TOUPPER (*code
));
560 fputs(":\n", stdout
);
564 /* Given a predicate expression EXP, write out a sequence of stmts
565 to evaluate it. This is similar to write_predicate_expr but can
566 generate efficient switch statements. */
569 write_predicate_stmts (rtx exp
)
571 switch (GET_CODE (exp
))
574 if (generate_switch_p (exp
))
576 write_match_code_switch (exp
);
577 puts (" return true;\n"
587 if (generate_switch_p (XEXP (exp
, 0)))
589 write_match_code_switch (XEXP (exp
, 0));
599 if (generate_switch_p (XEXP (exp
, 0)))
601 write_match_code_switch (XEXP (exp
, 0));
602 puts (" return true;\n"
611 if (generate_switch_p (XEXP (exp
, 0)))
613 write_match_code_switch (XEXP (exp
, 0));
614 puts (" return false;\n"
627 fputs(" return ",stdout
);
628 write_predicate_expr (exp
);
629 fputs(";\n", stdout
);
632 /* Given a predicate, write out a complete C function to compute it. */
634 write_one_predicate_function (struct pred_data
*p
)
639 write_predicate_subfunction (p
);
642 /* A normal predicate can legitimately not look at enum machine_mode
643 if it accepts only CONST_INTs and/or CONST_DOUBLEs. */
644 printf ("int\n%s (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)\n{\n",
646 write_predicate_stmts (p
->exp
);
647 fputs ("}\n\n", stdout
);
650 /* Constraints fall into two categories: register constraints
651 (define_register_constraint), and others (define_constraint,
652 define_memory_constraint, define_address_constraint). We
653 work out automatically which of the various old-style macros
654 they correspond to, and produce appropriate code. They all
655 go in the same hash table so we can verify that there are no
658 /* All data from one constraint definition. */
659 struct constraint_data
661 struct constraint_data
*next_this_letter
;
662 struct constraint_data
*next_textual
;
664 const char *c_name
; /* same as .name unless mangling is necessary */
666 const char *regclass
; /* for register constraints */
667 rtx exp
; /* for other constraints */
668 unsigned int lineno
; /* line of definition */
669 unsigned int is_register
: 1;
670 unsigned int is_const_int
: 1;
671 unsigned int is_const_dbl
: 1;
672 unsigned int is_extra
: 1;
673 unsigned int is_memory
: 1;
674 unsigned int is_address
: 1;
677 /* Overview of all constraints beginning with a given letter. */
679 static struct constraint_data
*
680 constraints_by_letter_table
[1<<CHAR_BIT
];
682 /* For looking up all the constraints in the order that they appeared
683 in the machine description. */
684 static struct constraint_data
*first_constraint
;
685 static struct constraint_data
**last_constraint_ptr
= &first_constraint
;
687 #define FOR_ALL_CONSTRAINTS(iter_) \
688 for (iter_ = first_constraint; iter_; iter_ = iter_->next_textual)
690 /* These letters, and all names beginning with them, are reserved for
692 The 'm' constraint is not mentioned here since that constraint
693 letter can be overridden by the back end by defining the
694 TARGET_MEM_CONSTRAINT macro. */
695 static const char generic_constraint_letters
[] = "EFVXginoprs";
697 /* Machine-independent code expects that constraints with these
698 (initial) letters will allow only (a subset of all) CONST_INTs. */
700 static const char const_int_constraints
[] = "IJKLMNOP";
702 /* Machine-independent code expects that constraints with these
703 (initial) letters will allow only (a subset of all) CONST_DOUBLEs. */
705 static const char const_dbl_constraints
[] = "GH";
707 /* Summary data used to decide whether to output various functions and
708 macro definitions. */
709 static unsigned int constraint_max_namelen
;
710 static bool have_register_constraints
;
711 static bool have_memory_constraints
;
712 static bool have_address_constraints
;
713 static bool have_extra_constraints
;
714 static bool have_const_int_constraints
;
715 static bool have_const_dbl_constraints
;
717 /* Convert NAME, which contains angle brackets and/or underscores, to
718 a string that can be used as part of a C identifier. The string
719 comes from the rtl_obstack. */
721 mangle (const char *name
)
723 for (; *name
; name
++)
726 case '_': obstack_grow (rtl_obstack
, "__", 2); break;
727 case '<': obstack_grow (rtl_obstack
, "_l", 2); break;
728 case '>': obstack_grow (rtl_obstack
, "_g", 2); break;
729 default: obstack_1grow (rtl_obstack
, *name
); break;
732 obstack_1grow (rtl_obstack
, '\0');
733 return XOBFINISH (rtl_obstack
, const char *);
736 /* Add one constraint, of any sort, to the tables. NAME is its name;
737 REGCLASS is the register class, if any; EXP is the expression to
738 test, if any; IS_MEMORY and IS_ADDRESS indicate memory and address
739 constraints, respectively; LINENO is the line number from the MD reader.
740 Not all combinations of arguments are valid; most importantly, REGCLASS
741 is mutually exclusive with EXP, and IS_MEMORY/IS_ADDRESS are only
742 meaningful for constraints with EXP.
744 This function enforces all syntactic and semantic rules about what
745 constraints can be defined. */
748 add_constraint (const char *name
, const char *regclass
,
749 rtx exp
, bool is_memory
, bool is_address
,
752 struct constraint_data
*c
, **iter
, **slot
;
754 bool need_mangled_name
= false;
759 if (exp
&& validate_exp (exp
, name
, lineno
))
762 if (!ISALPHA (name
[0]) && name
[0] != '_')
765 error_with_line (lineno
, "constraint name '%s' is not "
766 "a letter or underscore", name
);
768 error_with_line (lineno
, "constraint name '%s' does not begin "
769 "with a letter or underscore", name
);
772 for (p
= name
; *p
; p
++)
775 if (*p
== '<' || *p
== '>' || *p
== '_')
776 need_mangled_name
= true;
779 error_with_line (lineno
,
780 "constraint name '%s' must be composed of "
781 "letters, digits, underscores, and "
782 "angle brackets", name
);
787 if (strchr (generic_constraint_letters
, name
[0]))
790 error_with_line (lineno
, "constraint letter '%s' cannot be "
791 "redefined by the machine description", name
);
793 error_with_line (lineno
, "constraint name '%s' cannot be defined by "
794 "the machine description, as it begins with '%c'",
800 namelen
= strlen (name
);
801 slot
= &constraints_by_letter_table
[(unsigned int)name
[0]];
802 for (iter
= slot
; *iter
; iter
= &(*iter
)->next_this_letter
)
804 /* This causes slot to end up pointing to the
805 next_this_letter field of the last constraint with a name
806 of equal or greater length than the new constraint; hence
807 the new constraint will be inserted after all previous
808 constraints with names of the same length. */
809 if ((*iter
)->namelen
>= namelen
)
812 if (!strcmp ((*iter
)->name
, name
))
814 error_with_line (lineno
, "redefinition of constraint '%s'", name
);
815 message_with_line ((*iter
)->lineno
, "previous definition is here");
818 else if (!strncmp ((*iter
)->name
, name
, (*iter
)->namelen
))
820 error_with_line (lineno
, "defining constraint '%s' here", name
);
821 message_with_line ((*iter
)->lineno
, "renders constraint '%s' "
822 "(defined here) a prefix", (*iter
)->name
);
825 else if (!strncmp ((*iter
)->name
, name
, namelen
))
827 error_with_line (lineno
, "constraint '%s' is a prefix", name
);
828 message_with_line ((*iter
)->lineno
, "of constraint '%s' "
829 "(defined here)", (*iter
)->name
);
834 is_const_int
= strchr (const_int_constraints
, name
[0]) != 0;
835 is_const_dbl
= strchr (const_dbl_constraints
, name
[0]) != 0;
837 if (is_const_int
|| is_const_dbl
)
839 enum rtx_code appropriate_code
840 = is_const_int
? CONST_INT
: CONST_DOUBLE
;
842 /* Consider relaxing this requirement in the future. */
844 || GET_CODE (exp
) != AND
845 || GET_CODE (XEXP (exp
, 0)) != MATCH_CODE
846 || strcmp (XSTR (XEXP (exp
, 0), 0),
847 GET_RTX_NAME (appropriate_code
)))
850 error_with_line (lineno
, "constraint letter '%c' is reserved "
851 "for %s constraints",
852 name
[0], GET_RTX_NAME (appropriate_code
));
854 error_with_line (lineno
, "constraint names beginning with '%c' "
855 "(%s) are reserved for %s constraints",
856 name
[0], name
, GET_RTX_NAME (appropriate_code
));
863 error_with_line (lineno
, "constraint letter '%c' cannot be a "
864 "memory constraint", name
[0]);
866 error_with_line (lineno
, "constraint name '%s' begins with '%c', "
867 "and therefore cannot be a memory constraint",
874 error_with_line (lineno
, "constraint letter '%c' cannot be a "
875 "memory constraint", name
[0]);
877 error_with_line (lineno
, "constraint name '%s' begins with '%c', "
878 "and therefore cannot be a memory constraint",
885 c
= XOBNEW (rtl_obstack
, struct constraint_data
);
887 c
->c_name
= need_mangled_name
? mangle (name
) : name
;
889 c
->namelen
= namelen
;
890 c
->regclass
= regclass
;
892 c
->is_register
= regclass
!= 0;
893 c
->is_const_int
= is_const_int
;
894 c
->is_const_dbl
= is_const_dbl
;
895 c
->is_extra
= !(regclass
|| is_const_int
|| is_const_dbl
);
896 c
->is_memory
= is_memory
;
897 c
->is_address
= is_address
;
899 c
->next_this_letter
= *slot
;
902 /* Insert this constraint in the list of all constraints in textual
905 *last_constraint_ptr
= c
;
906 last_constraint_ptr
= &c
->next_textual
;
908 constraint_max_namelen
= MAX (constraint_max_namelen
, strlen (name
));
909 have_register_constraints
|= c
->is_register
;
910 have_const_int_constraints
|= c
->is_const_int
;
911 have_const_dbl_constraints
|= c
->is_const_dbl
;
912 have_extra_constraints
|= c
->is_extra
;
913 have_memory_constraints
|= c
->is_memory
;
914 have_address_constraints
|= c
->is_address
;
917 /* Process a DEFINE_CONSTRAINT, DEFINE_MEMORY_CONSTRAINT, or
918 DEFINE_ADDRESS_CONSTRAINT expression, C. */
920 process_define_constraint (rtx c
, int lineno
)
922 add_constraint (XSTR (c
, 0), 0, XEXP (c
, 2),
923 GET_CODE (c
) == DEFINE_MEMORY_CONSTRAINT
,
924 GET_CODE (c
) == DEFINE_ADDRESS_CONSTRAINT
,
928 /* Process a DEFINE_REGISTER_CONSTRAINT expression, C. */
930 process_define_register_constraint (rtx c
, int lineno
)
932 add_constraint (XSTR (c
, 0), XSTR (c
, 1), 0, false, false, lineno
);
935 /* Write out an enumeration with one entry per machine-specific
938 write_enum_constraint_num (void)
940 struct constraint_data
*c
;
942 fputs ("#define CONSTRAINT_NUM_DEFINED_P 1\n", stdout
);
943 fputs ("enum constraint_num\n"
945 " CONSTRAINT__UNKNOWN = 0", stdout
);
946 FOR_ALL_CONSTRAINTS (c
)
947 printf (",\n CONSTRAINT_%s", c
->c_name
);
948 puts (",\n CONSTRAINT__LIMIT\n};\n");
951 /* Write out a function which looks at a string and determines what
952 constraint name, if any, it begins with. */
954 write_lookup_constraint (void)
957 puts ("enum constraint_num\n"
958 "lookup_constraint (const char *str)\n"
963 for (i
= 0; i
< ARRAY_SIZE(constraints_by_letter_table
); i
++)
965 struct constraint_data
*c
= constraints_by_letter_table
[i
];
969 printf (" case '%c':\n", i
);
971 printf (" return CONSTRAINT_%s;\n", c
->c_name
);
976 printf (" if (!strncmp (str, \"%s\", %lu))\n"
977 " return CONSTRAINT_%s;\n",
978 c
->name
, (unsigned long int) c
->namelen
, c
->c_name
);
979 c
= c
->next_this_letter
;
986 puts (" default: break;\n"
988 " return CONSTRAINT__UNKNOWN;\n"
992 /* Write out a function which looks at a string and determines what
993 the constraint name length is. */
995 write_insn_constraint_len (void)
999 puts ("static inline size_t\n"
1000 "insn_constraint_len (char fc, const char *str ATTRIBUTE_UNUSED)\n"
1005 for (i
= 0; i
< ARRAY_SIZE(constraints_by_letter_table
); i
++)
1007 struct constraint_data
*c
= constraints_by_letter_table
[i
];
1013 /* Constraints with multiple characters should have the same
1016 struct constraint_data
*c2
= c
->next_this_letter
;
1017 size_t len
= c
->namelen
;
1020 if (c2
->namelen
!= len
)
1021 error ("Multi-letter constraints with first letter '%c' "
1022 "should have same length", i
);
1023 c2
= c2
->next_this_letter
;
1027 printf (" case '%c': return %lu;\n",
1028 i
, (unsigned long int) c
->namelen
);
1031 puts (" default: break;\n"
1037 /* Write out the function which computes the register class corresponding
1038 to a register constraint. */
1040 write_regclass_for_constraint (void)
1042 struct constraint_data
*c
;
1044 puts ("enum reg_class\n"
1045 "regclass_for_constraint (enum constraint_num c)\n"
1050 FOR_ALL_CONSTRAINTS (c
)
1052 printf (" case CONSTRAINT_%s: return %s;\n", c
->c_name
, c
->regclass
);
1054 puts (" default: break;\n"
1056 " return NO_REGS;\n"
1060 /* Write out the functions which compute whether a given value matches
1061 a given non-register constraint. */
1063 write_tm_constrs_h (void)
1065 struct constraint_data
*c
;
1068 /* Generated automatically by the program '%s'\n\
1069 from the machine description file '%s'. */\n\n", progname
, in_fname
);
1072 #ifndef GCC_TM_CONSTRS_H\n\
1073 #define GCC_TM_CONSTRS_H\n");
1075 FOR_ALL_CONSTRAINTS (c
)
1076 if (!c
->is_register
)
1078 bool needs_ival
= needs_variable (c
->exp
, "ival");
1079 bool needs_hval
= needs_variable (c
->exp
, "hval");
1080 bool needs_lval
= needs_variable (c
->exp
, "lval");
1081 bool needs_rval
= needs_variable (c
->exp
, "rval");
1082 bool needs_mode
= (needs_variable (c
->exp
, "mode")
1083 || needs_hval
|| needs_lval
|| needs_rval
);
1084 bool needs_op
= (needs_variable (c
->exp
, "op")
1085 || needs_ival
|| needs_mode
);
1087 printf ("static inline bool\n"
1088 "satisfies_constraint_%s (rtx %s)\n"
1090 needs_op
? "op" : "ARG_UNUSED (op)");
1092 puts (" enum machine_mode mode = GET_MODE (op);");
1094 puts (" HOST_WIDE_INT ival = 0;");
1096 puts (" HOST_WIDE_INT hval = 0;");
1098 puts (" unsigned HOST_WIDE_INT lval = 0;");
1100 puts (" const REAL_VALUE_TYPE *rval = 0;");
1103 puts (" if (CONST_INT_P (op))\n"
1104 " ival = INTVAL (op);");
1106 puts (" if (GET_CODE (op) == CONST_DOUBLE && mode == VOIDmode)"
1107 " hval = CONST_DOUBLE_HIGH (op);");
1109 puts (" if (GET_CODE (op) == CONST_DOUBLE && mode == VOIDmode)"
1110 " lval = CONST_DOUBLE_LOW (op);");
1112 puts (" if (GET_CODE (op) == CONST_DOUBLE && mode != VOIDmode)"
1113 " rval = CONST_DOUBLE_REAL_VALUE (op);");
1115 write_predicate_stmts (c
->exp
);
1116 fputs ("}\n", stdout
);
1118 puts ("#endif /* tm-constrs.h */");
1121 /* Write out the wrapper function, constraint_satisfied_p, that maps
1122 a CONSTRAINT_xxx constant to one of the predicate functions generated
1125 write_constraint_satisfied_p (void)
1127 struct constraint_data
*c
;
1130 "constraint_satisfied_p (rtx op, enum constraint_num c)\n"
1135 FOR_ALL_CONSTRAINTS (c
)
1136 if (!c
->is_register
)
1137 printf (" case CONSTRAINT_%s: "
1138 "return satisfies_constraint_%s (op);\n",
1139 c
->c_name
, c
->c_name
);
1141 puts (" default: break;\n"
1147 /* Write out the function which computes whether a given value matches
1148 a given CONST_INT constraint. This doesn't just forward to
1149 constraint_satisfied_p because caller passes the INTVAL, not the RTX. */
1151 write_insn_const_int_ok_for_constraint (void)
1153 struct constraint_data
*c
;
1156 "insn_const_int_ok_for_constraint (HOST_WIDE_INT ival, "
1157 "enum constraint_num c)\n"
1162 FOR_ALL_CONSTRAINTS (c
)
1163 if (c
->is_const_int
)
1165 printf (" case CONSTRAINT_%s:\n return ", c
->c_name
);
1166 /* c->exp is guaranteed to be (and (match_code "const_int") (...));
1167 we know at this point that we have a const_int, so we need not
1168 bother with that part of the test. */
1169 write_predicate_expr (XEXP (c
->exp
, 1));
1170 fputs (";\n\n", stdout
);
1173 puts (" default: break;\n"
1180 /* Write out the function which computes whether a given constraint is
1181 a memory constraint. */
1183 write_insn_extra_memory_constraint (void)
1185 struct constraint_data
*c
;
1188 "insn_extra_memory_constraint (enum constraint_num c)\n"
1193 FOR_ALL_CONSTRAINTS (c
)
1195 printf (" case CONSTRAINT_%s:\n return true;\n\n", c
->c_name
);
1197 puts (" default: break;\n"
1203 /* Write out the function which computes whether a given constraint is
1204 an address constraint. */
1206 write_insn_extra_address_constraint (void)
1208 struct constraint_data
*c
;
1211 "insn_extra_address_constraint (enum constraint_num c)\n"
1216 FOR_ALL_CONSTRAINTS (c
)
1218 printf (" case CONSTRAINT_%s:\n return true;\n\n", c
->c_name
);
1220 puts (" default: break;\n"
1227 /* Write tm-preds.h. Unfortunately, it is impossible to forward-declare
1228 an enumeration in portable C, so we have to condition all these
1229 prototypes on HAVE_MACHINE_MODES. */
1231 write_tm_preds_h (void)
1233 struct pred_data
*p
;
1236 /* Generated automatically by the program '%s'\n\
1237 from the machine description file '%s'. */\n\n", progname
, in_fname
);
1240 #ifndef GCC_TM_PREDS_H\n\
1241 #define GCC_TM_PREDS_H\n\
1243 #ifdef HAVE_MACHINE_MODES");
1245 FOR_ALL_PREDICATES (p
)
1246 printf ("extern int %s (rtx, enum machine_mode);\n", p
->name
);
1248 puts ("#endif /* HAVE_MACHINE_MODES */\n");
1250 if (constraint_max_namelen
> 0)
1252 write_enum_constraint_num ();
1253 puts ("extern enum constraint_num lookup_constraint (const char *);\n"
1254 "extern bool constraint_satisfied_p (rtx, enum constraint_num);\n");
1256 if (constraint_max_namelen
> 1)
1258 write_insn_constraint_len ();
1259 puts ("#define CONSTRAINT_LEN(c_,s_) "
1260 "insn_constraint_len (c_,s_)\n");
1263 puts ("#define CONSTRAINT_LEN(c_,s_) 1\n");
1264 if (have_register_constraints
)
1265 puts ("extern enum reg_class regclass_for_constraint "
1266 "(enum constraint_num);\n"
1267 "#define REG_CLASS_FROM_CONSTRAINT(c_,s_) \\\n"
1268 " regclass_for_constraint (lookup_constraint (s_))\n"
1269 "#define REG_CLASS_FOR_CONSTRAINT(x_) \\\n"
1270 " regclass_for_constraint (x_)\n");
1272 puts ("#define REG_CLASS_FROM_CONSTRAINT(c_,s_) NO_REGS\n"
1273 "#define REG_CLASS_FOR_CONSTRAINT(x_) \\\n"
1275 if (have_const_int_constraints
)
1276 puts ("extern bool insn_const_int_ok_for_constraint "
1277 "(HOST_WIDE_INT, enum constraint_num);\n"
1278 "#define CONST_OK_FOR_CONSTRAINT_P(v_,c_,s_) \\\n"
1279 " insn_const_int_ok_for_constraint (v_, "
1280 "lookup_constraint (s_))\n");
1281 if (have_const_dbl_constraints
)
1282 puts ("#define CONST_DOUBLE_OK_FOR_CONSTRAINT_P(v_,c_,s_) \\\n"
1283 " constraint_satisfied_p (v_, lookup_constraint (s_))\n");
1285 puts ("#define CONST_DOUBLE_OK_FOR_CONSTRAINT_P(v_,c_,s_) 0\n");
1286 if (have_extra_constraints
)
1287 puts ("#define EXTRA_CONSTRAINT_STR(v_,c_,s_) \\\n"
1288 " constraint_satisfied_p (v_, lookup_constraint (s_))\n");
1289 if (have_memory_constraints
)
1290 puts ("extern bool "
1291 "insn_extra_memory_constraint (enum constraint_num);\n"
1292 "#define EXTRA_MEMORY_CONSTRAINT(c_,s_) "
1293 "insn_extra_memory_constraint (lookup_constraint (s_))\n");
1295 puts ("#define EXTRA_MEMORY_CONSTRAINT(c_,s_) false\n");
1296 if (have_address_constraints
)
1297 puts ("extern bool "
1298 "insn_extra_address_constraint (enum constraint_num);\n"
1299 "#define EXTRA_ADDRESS_CONSTRAINT(c_,s_) "
1300 "insn_extra_address_constraint (lookup_constraint (s_))\n");
1302 puts ("#define EXTRA_ADDRESS_CONSTRAINT(c_,s_) false\n");
1305 puts ("#endif /* tm-preds.h */");
1308 /* Write insn-preds.c.
1309 N.B. the list of headers to include was copied from genrecog; it
1312 FUTURE: Write #line markers referring back to the machine
1313 description. (Can't practically do this now since we don't know
1314 the line number of the C block - just the line number of the enclosing
1317 write_insn_preds_c (void)
1319 struct pred_data
*p
;
1322 /* Generated automatically by the program '%s'\n\
1323 from the machine description file '%s'. */\n\n", progname
, in_fname
);
1326 #include \"config.h\"\n\
1327 #include \"system.h\"\n\
1328 #include \"coretypes.h\"\n\
1329 #include \"tm.h\"\n\
1330 #include \"rtl.h\"\n\
1331 #include \"tree.h\"\n\
1332 #include \"tm_p.h\"\n\
1333 #include \"function.h\"\n\
1334 #include \"insn-config.h\"\n\
1335 #include \"recog.h\"\n\
1336 #include \"output.h\"\n\
1337 #include \"flags.h\"\n\
1338 #include \"hard-reg-set.h\"\n\
1339 #include \"resource.h\"\n\
1340 #include \"diagnostic-core.h\"\n\
1341 #include \"toplev.h\"\n\
1342 #include \"reload.h\"\n\
1343 #include \"regs.h\"\n\
1344 #include \"tm-constrs.h\"\n");
1346 FOR_ALL_PREDICATES (p
)
1347 write_one_predicate_function (p
);
1349 if (constraint_max_namelen
> 0)
1351 write_lookup_constraint ();
1352 if (have_register_constraints
)
1353 write_regclass_for_constraint ();
1354 write_constraint_satisfied_p ();
1356 if (have_const_int_constraints
)
1357 write_insn_const_int_ok_for_constraint ();
1359 if (have_memory_constraints
)
1360 write_insn_extra_memory_constraint ();
1361 if (have_address_constraints
)
1362 write_insn_extra_address_constraint ();
1366 /* Argument parsing. */
1367 static bool gen_header
;
1368 static bool gen_constrs
;
1371 parse_option (const char *opt
)
1373 if (!strcmp (opt
, "-h"))
1378 else if (!strcmp (opt
, "-c"))
1387 /* Master control. */
1389 main (int argc
, char **argv
)
1392 int pattern_lineno
, next_insn_code
= 0;
1396 fatal ("no input file name");
1397 if (!init_rtx_reader_args_cb (argc
, argv
, parse_option
))
1398 return FATAL_EXIT_CODE
;
1400 while ((defn
= read_md_rtx (&pattern_lineno
, &next_insn_code
)) != 0)
1401 switch (GET_CODE (defn
))
1403 case DEFINE_PREDICATE
:
1404 case DEFINE_SPECIAL_PREDICATE
:
1405 process_define_predicate (defn
, pattern_lineno
);
1408 case DEFINE_CONSTRAINT
:
1409 case DEFINE_MEMORY_CONSTRAINT
:
1410 case DEFINE_ADDRESS_CONSTRAINT
:
1411 process_define_constraint (defn
, pattern_lineno
);
1414 case DEFINE_REGISTER_CONSTRAINT
:
1415 process_define_register_constraint (defn
, pattern_lineno
);
1423 write_tm_preds_h ();
1424 else if (gen_constrs
)
1425 write_tm_constrs_h ();
1427 write_insn_preds_c ();
1429 if (have_error
|| ferror (stdout
) || fflush (stdout
) || fclose (stdout
))
1430 return FATAL_EXIT_CODE
;
1432 return SUCCESS_EXIT_CODE
;