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-2015 Free Software Foundation, Inc.
7 This file is part of GCC.
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)
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.
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/>. */
25 #include "coretypes.h"
31 #include "gensupport.h"
33 static char general_mem
[] = { TARGET_MEM_CONSTRAINT
, 0 };
35 /* Given a predicate expression EXP, from form NAME at line LINENO,
36 verify that it does not contain any RTL constructs which are not
37 valid in predicate definitions. Returns true if EXP is
38 INvalid; issues error messages, caller need not. */
40 validate_exp (rtx exp
, const char *name
, int lineno
)
44 message_with_line (lineno
, "%s: must give a predicate expression", name
);
48 switch (GET_CODE (exp
))
50 /* Ternary, binary, unary expressions: recurse into subexpressions. */
52 if (validate_exp (XEXP (exp
, 2), name
, lineno
))
54 /* else fall through */
57 if (validate_exp (XEXP (exp
, 1), name
, lineno
))
59 /* else fall through */
61 return validate_exp (XEXP (exp
, 0), name
, lineno
);
63 /* MATCH_CODE might have a syntax error in its path expression. */
67 for (p
= XSTR (exp
, 1); *p
; p
++)
69 if (!ISDIGIT (*p
) && !ISLOWER (*p
))
71 error_with_line (lineno
, "%s: invalid character in path "
72 "string '%s'", name
, XSTR (exp
, 1));
79 /* These need no special checking. */
85 error_with_line (lineno
,
86 "%s: cannot use '%s' in a predicate expression",
87 name
, GET_RTX_NAME (GET_CODE (exp
)));
92 /* Predicates are defined with (define_predicate) or
93 (define_special_predicate) expressions in the machine description. */
95 process_define_predicate (rtx defn
, int lineno
)
97 validate_exp (XEXP (defn
, 1), XSTR (defn
, 0), lineno
);
100 /* Given a predicate, if it has an embedded C block, write the block
101 out as a static inline subroutine, and augment the RTL test with a
102 match_test that calls that subroutine. For instance,
104 (define_predicate "basereg_operand"
105 (match_operand 0 "register_operand")
107 if (GET_CODE (op) == SUBREG)
108 op = SUBREG_REG (op);
109 return REG_POINTER (op);
114 static inline int basereg_operand_1(rtx op, machine_mode mode)
116 if (GET_CODE (op) == SUBREG)
117 op = SUBREG_REG (op);
118 return REG_POINTER (op);
121 (define_predicate "basereg_operand"
122 (and (match_operand 0 "register_operand")
123 (match_test "basereg_operand_1 (op, mode)")))
125 The only wart is that there's no way to insist on a { } string in
126 an RTL template, so we have to handle "" strings. */
130 write_predicate_subfunction (struct pred_data
*p
)
132 const char *match_test_str
;
133 rtx match_test_exp
, and_exp
;
135 if (p
->c_block
[0] == '\0')
138 /* Construct the function-call expression. */
139 obstack_grow (rtl_obstack
, p
->name
, strlen (p
->name
));
140 obstack_grow (rtl_obstack
, "_1 (op, mode)",
141 sizeof "_1 (op, mode)");
142 match_test_str
= XOBFINISH (rtl_obstack
, const char *);
144 /* Add the function-call expression to the complete expression to be
146 match_test_exp
= rtx_alloc (MATCH_TEST
);
147 XSTR (match_test_exp
, 0) = match_test_str
;
149 and_exp
= rtx_alloc (AND
);
150 XEXP (and_exp
, 0) = p
->exp
;
151 XEXP (and_exp
, 1) = match_test_exp
;
155 printf ("static inline int\n"
156 "%s_1 (rtx op, machine_mode mode ATTRIBUTE_UNUSED)\n",
158 print_md_ptr_loc (p
->c_block
);
159 if (p
->c_block
[0] == '{')
160 fputs (p
->c_block
, stdout
);
162 printf ("{\n %s\n}", p
->c_block
);
163 fputs ("\n\n", stdout
);
166 /* Given a predicate expression EXP, from form NAME, determine whether
167 it refers to the variable given as VAR. */
169 needs_variable (rtx exp
, const char *var
)
171 switch (GET_CODE (exp
))
173 /* Ternary, binary, unary expressions need a variable if
174 any of their subexpressions do. */
176 if (needs_variable (XEXP (exp
, 2), var
))
178 /* else fall through */
181 if (needs_variable (XEXP (exp
, 1), var
))
183 /* else fall through */
185 return needs_variable (XEXP (exp
, 0), var
);
187 /* MATCH_CODE uses "op", but nothing else. */
189 return !strcmp (var
, "op");
191 /* MATCH_OPERAND uses "op" and may use "mode". */
193 if (!strcmp (var
, "op"))
195 if (!strcmp (var
, "mode") && GET_MODE (exp
) == VOIDmode
)
199 /* MATCH_TEST uses var if XSTR (exp, 0) =~ /\b${var}\b/o; */
202 const char *p
= XSTR (exp
, 0);
203 const char *q
= strstr (p
, var
);
206 if (q
!= p
&& (ISALNUM (q
[-1]) || q
[-1] == '_'))
209 if (ISALNUM (q
[0]) || q
[0] == '_')
219 /* Given an RTL expression EXP, find all subexpressions which we may
220 assume to perform mode tests. Normal MATCH_OPERAND does;
221 MATCH_CODE doesn't as such (although certain codes always have
222 VOIDmode); and we have to assume that MATCH_TEST does not.
223 These combine in almost-boolean fashion - the only exception is
224 that (not X) must be assumed not to perform a mode test, whether
227 The mark is the RTL /v flag, which is true for subexpressions which
228 do *not* perform mode tests.
230 #define NO_MODE_TEST(EXP) RTX_FLAG (EXP, volatil)
232 mark_mode_tests (rtx exp
)
234 switch (GET_CODE (exp
))
238 struct pred_data
*p
= lookup_predicate (XSTR (exp
, 1));
240 error ("reference to undefined predicate '%s'", XSTR (exp
, 1));
241 else if (p
->special
|| GET_MODE (exp
) != VOIDmode
)
242 NO_MODE_TEST (exp
) = 1;
247 NO_MODE_TEST (exp
) = 1;
252 NO_MODE_TEST (exp
) = 1;
256 mark_mode_tests (XEXP (exp
, 0));
257 mark_mode_tests (XEXP (exp
, 1));
259 NO_MODE_TEST (exp
) = (NO_MODE_TEST (XEXP (exp
, 0))
260 && NO_MODE_TEST (XEXP (exp
, 1)));
264 mark_mode_tests (XEXP (exp
, 0));
265 mark_mode_tests (XEXP (exp
, 1));
267 NO_MODE_TEST (exp
) = (NO_MODE_TEST (XEXP (exp
, 0))
268 || NO_MODE_TEST (XEXP (exp
, 1)));
272 /* A ? B : C does a mode test if (one of A and B) does a mode
273 test, and C does too. */
274 mark_mode_tests (XEXP (exp
, 0));
275 mark_mode_tests (XEXP (exp
, 1));
276 mark_mode_tests (XEXP (exp
, 2));
278 NO_MODE_TEST (exp
) = ((NO_MODE_TEST (XEXP (exp
, 0))
279 && NO_MODE_TEST (XEXP (exp
, 1)))
280 || NO_MODE_TEST (XEXP (exp
, 2)));
288 /* Determine whether the expression EXP is a MATCH_CODE that should
289 be written as a switch statement. */
291 generate_switch_p (rtx exp
)
293 return GET_CODE (exp
) == MATCH_CODE
294 && strchr (XSTR (exp
, 0), ',');
297 /* Given a predicate, work out where in its RTL expression to add
298 tests for proper modes. Special predicates do not get any such
299 tests. We try to avoid adding tests when we don't have to; in
300 particular, other normal predicates can be counted on to do it for
304 add_mode_tests (struct pred_data
*p
)
306 rtx match_test_exp
, and_exp
;
309 /* Don't touch special predicates. */
313 /* Check whether the predicate accepts const scalar ints (which always
314 have a stored mode of VOIDmode, but logically have a real mode)
315 and whether it matches anything besides const scalar ints. */
316 bool matches_const_scalar_int_p
= false;
317 bool matches_other_p
= false;
318 for (int i
= 0; i
< NUM_RTX_CODE
; ++i
)
324 matches_const_scalar_int_p
= true;
328 if (!TARGET_SUPPORTS_WIDE_INT
)
329 matches_const_scalar_int_p
= true;
330 matches_other_p
= true;
334 matches_other_p
= true;
338 /* There's no need for a mode check if the predicate only accepts
339 constant integers. The code checks in the predicate are enough
340 to establish that the mode is VOIDmode.
342 Note that the predicate itself should check whether a scalar
343 integer is in range of the given mode. */
344 if (!matches_other_p
)
347 mark_mode_tests (p
->exp
);
349 /* If the whole expression already tests the mode, we're done. */
350 if (!NO_MODE_TEST (p
->exp
))
353 match_test_exp
= rtx_alloc (MATCH_TEST
);
354 if (matches_const_scalar_int_p
)
355 XSTR (match_test_exp
, 0) = ("mode == VOIDmode || GET_MODE (op) == mode"
356 " || GET_MODE (op) == VOIDmode");
358 XSTR (match_test_exp
, 0) = "mode == VOIDmode || GET_MODE (op) == mode";
359 and_exp
= rtx_alloc (AND
);
360 XEXP (and_exp
, 1) = match_test_exp
;
362 /* It is always correct to rewrite p->exp as
364 (and (...) (match_test "mode == VOIDmode || GET_MODE (op) == mode"))
366 but there are a couple forms where we can do better. If the
367 top-level pattern is an IOR, and one of the two branches does test
368 the mode, we can wrap just the branch that doesn't. Likewise, if
369 we have an IF_THEN_ELSE, and one side of it tests the mode, we can
370 wrap just the side that doesn't. And, of course, we can repeat this
371 descent as many times as it works. */
378 switch (GET_CODE (subexp
))
381 /* The switch code generation in write_predicate_stmts prefers
382 rtx code tests to be at the top of the expression tree. So
383 push this AND down into the second operand of an existing
385 if (generate_switch_p (XEXP (subexp
, 0)))
386 pos
= &XEXP (subexp
, 1);
391 int test0
= NO_MODE_TEST (XEXP (subexp
, 0));
392 int test1
= NO_MODE_TEST (XEXP (subexp
, 1));
394 gcc_assert (test0
|| test1
);
398 pos
= test0
? &XEXP (subexp
, 0) : &XEXP (subexp
, 1);
404 int test0
= NO_MODE_TEST (XEXP (subexp
, 0));
405 int test1
= NO_MODE_TEST (XEXP (subexp
, 1));
406 int test2
= NO_MODE_TEST (XEXP (subexp
, 2));
408 gcc_assert ((test0
&& test1
) || test2
);
410 if (test0
&& test1
&& test2
)
413 /* Must put it on the dependent clause, not the
414 controlling expression, or we change the meaning of
416 pos
= &XEXP (subexp
, 1);
418 pos
= &XEXP (subexp
, 2);
427 XEXP (and_exp
, 0) = *pos
;
431 /* PATH is a string describing a path from the root of an RTL
432 expression to an inner subexpression to be tested. Output
433 code which computes the subexpression from the variable
434 holding the root of the expression. */
436 write_extract_subexp (const char *path
)
438 int len
= strlen (path
);
441 /* We first write out the operations (XEXP or XVECEXP) in reverse
442 order, then write "op", then the indices in forward order. */
443 for (i
= len
- 1; i
>= 0; i
--)
445 if (ISLOWER (path
[i
]))
446 fputs ("XVECEXP (", stdout
);
447 else if (ISDIGIT (path
[i
]))
448 fputs ("XEXP (", stdout
);
453 fputs ("op", stdout
);
455 for (i
= 0; i
< len
; i
++)
457 if (ISLOWER (path
[i
]))
458 printf (", 0, %d)", path
[i
] - 'a');
459 else if (ISDIGIT (path
[i
]))
460 printf (", %d)", path
[i
] - '0');
466 /* CODES is a list of RTX codes. Write out an expression which
467 determines whether the operand has one of those codes. */
469 write_match_code (const char *path
, const char *codes
)
473 while ((code
= scan_comma_elt (&codes
)) != 0)
475 fputs ("GET_CODE (", stdout
);
476 write_extract_subexp (path
);
477 fputs (") == ", stdout
);
480 putchar (TOUPPER (*code
));
485 fputs (" || ", stdout
);
489 /* EXP is an RTL (sub)expression for a predicate. Recursively
490 descend the expression and write out an equivalent C expression. */
492 write_predicate_expr (rtx exp
)
494 switch (GET_CODE (exp
))
498 write_predicate_expr (XEXP (exp
, 0));
499 fputs (") && (", stdout
);
500 write_predicate_expr (XEXP (exp
, 1));
506 write_predicate_expr (XEXP (exp
, 0));
507 fputs (") || (", stdout
);
508 write_predicate_expr (XEXP (exp
, 1));
513 fputs ("!(", stdout
);
514 write_predicate_expr (XEXP (exp
, 0));
520 write_predicate_expr (XEXP (exp
, 0));
521 fputs (") ? (", stdout
);
522 write_predicate_expr (XEXP (exp
, 1));
523 fputs (") : (", stdout
);
524 write_predicate_expr (XEXP (exp
, 2));
529 if (GET_MODE (exp
) == VOIDmode
)
530 printf ("%s (op, mode)", XSTR (exp
, 1));
532 printf ("%s (op, %smode)", XSTR (exp
, 1), mode_name
[GET_MODE (exp
)]);
536 write_match_code (XSTR (exp
, 1), XSTR (exp
, 0));
540 print_c_condition (XSTR (exp
, 0));
548 /* Write the MATCH_CODE expression EXP as a switch statement. */
551 write_match_code_switch (rtx exp
)
553 const char *codes
= XSTR (exp
, 0);
554 const char *path
= XSTR (exp
, 1);
557 fputs (" switch (GET_CODE (", stdout
);
558 write_extract_subexp (path
);
559 fputs ("))\n {\n", stdout
);
561 while ((code
= scan_comma_elt (&codes
)) != 0)
563 fputs (" case ", stdout
);
566 putchar (TOUPPER (*code
));
569 fputs (":\n", stdout
);
573 /* Given a predicate expression EXP, write out a sequence of stmts
574 to evaluate it. This is similar to write_predicate_expr but can
575 generate efficient switch statements. */
578 write_predicate_stmts (rtx exp
)
580 switch (GET_CODE (exp
))
583 if (generate_switch_p (exp
))
585 write_match_code_switch (exp
);
586 puts (" return true;\n"
596 if (generate_switch_p (XEXP (exp
, 0)))
598 write_match_code_switch (XEXP (exp
, 0));
608 if (generate_switch_p (XEXP (exp
, 0)))
610 write_match_code_switch (XEXP (exp
, 0));
611 puts (" return true;\n"
620 if (generate_switch_p (XEXP (exp
, 0)))
622 write_match_code_switch (XEXP (exp
, 0));
623 puts (" return false;\n"
636 fputs (" return ",stdout
);
637 write_predicate_expr (exp
);
638 fputs (";\n", stdout
);
641 /* Given a predicate, write out a complete C function to compute it. */
643 write_one_predicate_function (struct pred_data
*p
)
648 write_predicate_subfunction (p
);
651 /* A normal predicate can legitimately not look at machine_mode
652 if it accepts only CONST_INTs and/or CONST_WIDE_INT and/or CONST_DOUBLEs. */
653 printf ("int\n%s (rtx op, machine_mode mode ATTRIBUTE_UNUSED)\n{\n",
655 write_predicate_stmts (p
->exp
);
656 fputs ("}\n\n", stdout
);
659 /* Constraints fall into two categories: register constraints
660 (define_register_constraint), and others (define_constraint,
661 define_memory_constraint, define_address_constraint). We
662 work out automatically which of the various old-style macros
663 they correspond to, and produce appropriate code. They all
664 go in the same hash table so we can verify that there are no
667 /* All data from one constraint definition. */
668 struct constraint_data
670 struct constraint_data
*next_this_letter
;
671 struct constraint_data
*next_textual
;
673 const char *c_name
; /* same as .name unless mangling is necessary */
675 const char *regclass
; /* for register constraints */
676 rtx exp
; /* for other constraints */
677 unsigned int lineno
; /* line of definition */
678 unsigned int is_register
: 1;
679 unsigned int is_const_int
: 1;
680 unsigned int is_const_dbl
: 1;
681 unsigned int is_extra
: 1;
682 unsigned int is_memory
: 1;
683 unsigned int is_address
: 1;
684 unsigned int maybe_allows_reg
: 1;
685 unsigned int maybe_allows_mem
: 1;
688 /* Overview of all constraints beginning with a given letter. */
690 static struct constraint_data
*
691 constraints_by_letter_table
[1<<CHAR_BIT
];
693 /* For looking up all the constraints in the order that they appeared
694 in the machine description. */
695 static struct constraint_data
*first_constraint
;
696 static struct constraint_data
**last_constraint_ptr
= &first_constraint
;
698 #define FOR_ALL_CONSTRAINTS(iter_) \
699 for (iter_ = first_constraint; iter_; iter_ = iter_->next_textual)
701 /* Contraint letters that have a special meaning and that cannot be used
702 in define*_constraints. */
703 static const char generic_constraint_letters
[] = "g";
705 /* Machine-independent code expects that constraints with these
706 (initial) letters will allow only (a subset of all) CONST_INTs. */
708 static const char const_int_constraints
[] = "IJKLMNOP";
710 /* Machine-independent code expects that constraints with these
711 (initial) letters will allow only (a subset of all) CONST_DOUBLEs. */
713 static const char const_dbl_constraints
[] = "GH";
715 /* Summary data used to decide whether to output various functions and
716 macro definitions. */
717 static unsigned int constraint_max_namelen
;
718 static bool have_register_constraints
;
719 static bool have_memory_constraints
;
720 static bool have_address_constraints
;
721 static bool have_extra_constraints
;
722 static bool have_const_int_constraints
;
723 static unsigned int num_constraints
;
725 static const constraint_data
**enum_order
;
726 static unsigned int register_start
, register_end
;
727 static unsigned int satisfied_start
;
728 static unsigned int const_int_start
, const_int_end
;
729 static unsigned int memory_start
, memory_end
;
730 static unsigned int address_start
, address_end
;
731 static unsigned int maybe_allows_none_start
, maybe_allows_none_end
;
732 static unsigned int maybe_allows_reg_start
, maybe_allows_reg_end
;
733 static unsigned int maybe_allows_mem_start
, maybe_allows_mem_end
;
735 /* Convert NAME, which contains angle brackets and/or underscores, to
736 a string that can be used as part of a C identifier. The string
737 comes from the rtl_obstack. */
739 mangle (const char *name
)
741 for (; *name
; name
++)
744 case '_': obstack_grow (rtl_obstack
, "__", 2); break;
745 case '<': obstack_grow (rtl_obstack
, "_l", 2); break;
746 case '>': obstack_grow (rtl_obstack
, "_g", 2); break;
747 default: obstack_1grow (rtl_obstack
, *name
); break;
750 obstack_1grow (rtl_obstack
, '\0');
751 return XOBFINISH (rtl_obstack
, const char *);
754 /* Add one constraint, of any sort, to the tables. NAME is its name;
755 REGCLASS is the register class, if any; EXP is the expression to
756 test, if any; IS_MEMORY and IS_ADDRESS indicate memory and address
757 constraints, respectively; LINENO is the line number from the MD reader.
758 Not all combinations of arguments are valid; most importantly, REGCLASS
759 is mutually exclusive with EXP, and IS_MEMORY/IS_ADDRESS are only
760 meaningful for constraints with EXP.
762 This function enforces all syntactic and semantic rules about what
763 constraints can be defined. */
766 add_constraint (const char *name
, const char *regclass
,
767 rtx exp
, bool is_memory
, bool is_address
,
770 struct constraint_data
*c
, **iter
, **slot
;
772 bool need_mangled_name
= false;
777 if (strcmp (name
, "TARGET_MEM_CONSTRAINT") == 0)
780 if (exp
&& validate_exp (exp
, name
, lineno
))
783 for (p
= name
; *p
; p
++)
786 if (*p
== '<' || *p
== '>' || *p
== '_')
787 need_mangled_name
= true;
790 error_with_line (lineno
,
791 "constraint name '%s' must be composed of "
792 "letters, digits, underscores, and "
793 "angle brackets", name
);
798 if (strchr (generic_constraint_letters
, name
[0]))
801 error_with_line (lineno
, "constraint letter '%s' cannot be "
802 "redefined by the machine description", name
);
804 error_with_line (lineno
, "constraint name '%s' cannot be defined by "
805 "the machine description, as it begins with '%c'",
811 namelen
= strlen (name
);
812 slot
= &constraints_by_letter_table
[(unsigned int)name
[0]];
813 for (iter
= slot
; *iter
; iter
= &(*iter
)->next_this_letter
)
815 /* This causes slot to end up pointing to the
816 next_this_letter field of the last constraint with a name
817 of equal or greater length than the new constraint; hence
818 the new constraint will be inserted after all previous
819 constraints with names of the same length. */
820 if ((*iter
)->namelen
>= namelen
)
823 if (!strcmp ((*iter
)->name
, name
))
825 error_with_line (lineno
, "redefinition of constraint '%s'", name
);
826 message_with_line ((*iter
)->lineno
, "previous definition is here");
829 else if (!strncmp ((*iter
)->name
, name
, (*iter
)->namelen
))
831 error_with_line (lineno
, "defining constraint '%s' here", name
);
832 message_with_line ((*iter
)->lineno
, "renders constraint '%s' "
833 "(defined here) a prefix", (*iter
)->name
);
836 else if (!strncmp ((*iter
)->name
, name
, namelen
))
838 error_with_line (lineno
, "constraint '%s' is a prefix", name
);
839 message_with_line ((*iter
)->lineno
, "of constraint '%s' "
840 "(defined here)", (*iter
)->name
);
845 is_const_int
= strchr (const_int_constraints
, name
[0]) != 0;
846 is_const_dbl
= strchr (const_dbl_constraints
, name
[0]) != 0;
848 if (is_const_int
|| is_const_dbl
)
850 enum rtx_code appropriate_code
851 = is_const_int
? CONST_INT
: CONST_DOUBLE
;
853 /* Consider relaxing this requirement in the future. */
855 || GET_CODE (exp
) != AND
856 || GET_CODE (XEXP (exp
, 0)) != MATCH_CODE
857 || strcmp (XSTR (XEXP (exp
, 0), 0),
858 GET_RTX_NAME (appropriate_code
)))
861 error_with_line (lineno
, "constraint letter '%c' is reserved "
862 "for %s constraints",
863 name
[0], GET_RTX_NAME (appropriate_code
));
865 error_with_line (lineno
, "constraint names beginning with '%c' "
866 "(%s) are reserved for %s constraints",
867 name
[0], name
, GET_RTX_NAME (appropriate_code
));
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 error_with_line (lineno
, "constraint letter '%c' cannot be a "
886 "memory constraint", name
[0]);
888 error_with_line (lineno
, "constraint name '%s' begins with '%c', "
889 "and therefore cannot be a memory constraint",
896 c
= XOBNEW (rtl_obstack
, struct constraint_data
);
898 c
->c_name
= need_mangled_name
? mangle (name
) : name
;
900 c
->namelen
= namelen
;
901 c
->regclass
= regclass
;
903 c
->is_register
= regclass
!= 0;
904 c
->is_const_int
= is_const_int
;
905 c
->is_const_dbl
= is_const_dbl
;
906 c
->is_extra
= !(regclass
|| is_const_int
|| is_const_dbl
);
907 c
->is_memory
= is_memory
;
908 c
->is_address
= is_address
;
909 c
->maybe_allows_reg
= true;
910 c
->maybe_allows_mem
= true;
913 char codes
[NUM_RTX_CODE
];
914 compute_test_codes (exp
, lineno
, codes
);
915 if (!codes
[REG
] && !codes
[SUBREG
])
916 c
->maybe_allows_reg
= false;
918 c
->maybe_allows_mem
= false;
920 c
->next_this_letter
= *slot
;
923 /* Insert this constraint in the list of all constraints in textual
926 *last_constraint_ptr
= c
;
927 last_constraint_ptr
= &c
->next_textual
;
929 constraint_max_namelen
= MAX (constraint_max_namelen
, strlen (name
));
930 have_register_constraints
|= c
->is_register
;
931 have_const_int_constraints
|= c
->is_const_int
;
932 have_extra_constraints
|= c
->is_extra
;
933 have_memory_constraints
|= c
->is_memory
;
934 have_address_constraints
|= c
->is_address
;
935 num_constraints
+= 1;
938 /* Process a DEFINE_CONSTRAINT, DEFINE_MEMORY_CONSTRAINT, or
939 DEFINE_ADDRESS_CONSTRAINT expression, C. */
941 process_define_constraint (rtx c
, int lineno
)
943 add_constraint (XSTR (c
, 0), 0, XEXP (c
, 2),
944 GET_CODE (c
) == DEFINE_MEMORY_CONSTRAINT
,
945 GET_CODE (c
) == DEFINE_ADDRESS_CONSTRAINT
,
949 /* Process a DEFINE_REGISTER_CONSTRAINT expression, C. */
951 process_define_register_constraint (rtx c
, int lineno
)
953 add_constraint (XSTR (c
, 0), XSTR (c
, 1), 0, false, false, lineno
);
956 /* Put the constraints into enum order. We want to keep constraints
957 of the same type together so that query functions can be simple
960 choose_enum_order (void)
962 struct constraint_data
*c
;
964 enum_order
= XNEWVEC (const constraint_data
*, num_constraints
);
965 unsigned int next
= 0;
967 register_start
= next
;
968 FOR_ALL_CONSTRAINTS (c
)
970 enum_order
[next
++] = c
;
973 satisfied_start
= next
;
975 const_int_start
= next
;
976 FOR_ALL_CONSTRAINTS (c
)
978 enum_order
[next
++] = c
;
979 const_int_end
= next
;
982 FOR_ALL_CONSTRAINTS (c
)
984 enum_order
[next
++] = c
;
987 address_start
= next
;
988 FOR_ALL_CONSTRAINTS (c
)
990 enum_order
[next
++] = c
;
993 maybe_allows_none_start
= next
;
994 FOR_ALL_CONSTRAINTS (c
)
995 if (!c
->is_register
&& !c
->is_const_int
&& !c
->is_memory
&& !c
->is_address
996 && !c
->maybe_allows_reg
&& !c
->maybe_allows_mem
)
997 enum_order
[next
++] = c
;
998 maybe_allows_none_end
= next
;
1000 maybe_allows_reg_start
= next
;
1001 FOR_ALL_CONSTRAINTS (c
)
1002 if (!c
->is_register
&& !c
->is_const_int
&& !c
->is_memory
&& !c
->is_address
1003 && c
->maybe_allows_reg
&& !c
->maybe_allows_mem
)
1004 enum_order
[next
++] = c
;
1005 maybe_allows_reg_end
= next
;
1007 maybe_allows_mem_start
= next
;
1008 FOR_ALL_CONSTRAINTS (c
)
1009 if (!c
->is_register
&& !c
->is_const_int
&& !c
->is_memory
&& !c
->is_address
1010 && !c
->maybe_allows_reg
&& c
->maybe_allows_mem
)
1011 enum_order
[next
++] = c
;
1012 maybe_allows_mem_end
= next
;
1014 FOR_ALL_CONSTRAINTS (c
)
1015 if (!c
->is_register
&& !c
->is_const_int
&& !c
->is_memory
&& !c
->is_address
1016 && c
->maybe_allows_reg
&& c
->maybe_allows_mem
)
1017 enum_order
[next
++] = c
;
1018 gcc_assert (next
== num_constraints
);
1021 /* Write out an enumeration with one entry per machine-specific
1024 write_enum_constraint_num (void)
1026 fputs ("#define CONSTRAINT_NUM_DEFINED_P 1\n", stdout
);
1027 fputs ("enum constraint_num\n"
1029 " CONSTRAINT__UNKNOWN = 0", stdout
);
1030 for (unsigned int i
= 0; i
< num_constraints
; ++i
)
1031 printf (",\n CONSTRAINT_%s", enum_order
[i
]->c_name
);
1032 puts (",\n CONSTRAINT__LIMIT\n};\n");
1035 /* Write out a function which looks at a string and determines what
1036 constraint name, if any, it begins with. */
1038 write_lookup_constraint_1 (void)
1041 puts ("enum constraint_num\n"
1042 "lookup_constraint_1 (const char *str)\n"
1044 " switch (str[0])\n"
1047 for (i
= 0; i
< ARRAY_SIZE (constraints_by_letter_table
); i
++)
1049 struct constraint_data
*c
= constraints_by_letter_table
[i
];
1053 printf (" case '%c':\n", i
);
1054 if (c
->namelen
== 1)
1055 printf (" return CONSTRAINT_%s;\n", c
->c_name
);
1060 printf (" if (!strncmp (str + 1, \"%s\", %lu))\n"
1061 " return CONSTRAINT_%s;\n",
1062 c
->name
+ 1, (unsigned long int) c
->namelen
- 1,
1064 c
= c
->next_this_letter
;
1071 puts (" default: break;\n"
1073 " return CONSTRAINT__UNKNOWN;\n"
1077 /* Write out an array that maps single-letter characters to their
1078 constraints (if that fits in a character) or 255 if lookup_constraint_1
1081 write_lookup_constraint_array (void)
1084 printf ("const unsigned char lookup_constraint_array[] = {\n ");
1085 for (i
= 0; i
< ARRAY_SIZE (constraints_by_letter_table
); i
++)
1089 struct constraint_data
*c
= constraints_by_letter_table
[i
];
1091 printf ("CONSTRAINT__UNKNOWN");
1092 else if (c
->namelen
== 1)
1093 printf ("MIN ((int) CONSTRAINT_%s, (int) UCHAR_MAX)", c
->c_name
);
1095 printf ("UCHAR_MAX");
1097 printf ("\n};\n\n");
1100 /* Write out a function which looks at a string and determines what
1101 the constraint name length is. */
1103 write_insn_constraint_len (void)
1107 puts ("static inline size_t\n"
1108 "insn_constraint_len (char fc, const char *str ATTRIBUTE_UNUSED)\n"
1113 for (i
= 0; i
< ARRAY_SIZE (constraints_by_letter_table
); i
++)
1115 struct constraint_data
*c
= constraints_by_letter_table
[i
];
1121 /* Constraints with multiple characters should have the same
1124 struct constraint_data
*c2
= c
->next_this_letter
;
1125 size_t len
= c
->namelen
;
1128 if (c2
->namelen
!= len
)
1129 error ("Multi-letter constraints with first letter '%c' "
1130 "should have same length", i
);
1131 c2
= c2
->next_this_letter
;
1135 printf (" case '%c': return %lu;\n",
1136 i
, (unsigned long int) c
->namelen
);
1139 puts (" default: break;\n"
1145 /* Write out the function which computes the register class corresponding
1146 to a register constraint. */
1148 write_reg_class_for_constraint_1 (void)
1150 struct constraint_data
*c
;
1152 puts ("enum reg_class\n"
1153 "reg_class_for_constraint_1 (enum constraint_num c)\n"
1158 FOR_ALL_CONSTRAINTS (c
)
1160 printf (" case CONSTRAINT_%s: return %s;\n", c
->c_name
, c
->regclass
);
1162 puts (" default: break;\n"
1164 " return NO_REGS;\n"
1168 /* Write out the functions which compute whether a given value matches
1169 a given non-register constraint. */
1171 write_tm_constrs_h (void)
1173 struct constraint_data
*c
;
1176 /* Generated automatically by the program '%s'\n\
1177 from the machine description file '%s'. */\n\n", progname
, in_fname
);
1180 #ifndef GCC_TM_CONSTRS_H\n\
1181 #define GCC_TM_CONSTRS_H\n");
1183 FOR_ALL_CONSTRAINTS (c
)
1184 if (!c
->is_register
)
1186 bool needs_ival
= needs_variable (c
->exp
, "ival");
1187 bool needs_hval
= needs_variable (c
->exp
, "hval");
1188 bool needs_lval
= needs_variable (c
->exp
, "lval");
1189 bool needs_rval
= needs_variable (c
->exp
, "rval");
1190 bool needs_mode
= (needs_variable (c
->exp
, "mode")
1191 || needs_hval
|| needs_lval
|| needs_rval
);
1192 bool needs_op
= (needs_variable (c
->exp
, "op")
1193 || needs_ival
|| needs_mode
);
1195 printf ("static inline bool\n"
1196 "satisfies_constraint_%s (rtx %s)\n"
1198 needs_op
? "op" : "ARG_UNUSED (op)");
1200 puts (" machine_mode mode = GET_MODE (op);");
1202 puts (" HOST_WIDE_INT ival = 0;");
1204 puts (" HOST_WIDE_INT hval = 0;");
1206 puts (" unsigned HOST_WIDE_INT lval = 0;");
1208 puts (" const REAL_VALUE_TYPE *rval = 0;");
1211 puts (" if (CONST_INT_P (op))\n"
1212 " ival = INTVAL (op);");
1213 #if TARGET_SUPPORTS_WIDE_INT
1214 if (needs_lval
|| needs_hval
)
1215 error ("you can't use lval or hval");
1218 puts (" if (GET_CODE (op) == CONST_DOUBLE && mode == VOIDmode)"
1219 " hval = CONST_DOUBLE_HIGH (op);");
1221 puts (" if (GET_CODE (op) == CONST_DOUBLE && mode == VOIDmode)"
1222 " lval = CONST_DOUBLE_LOW (op);");
1225 puts (" if (GET_CODE (op) == CONST_DOUBLE && mode != VOIDmode)"
1226 " rval = CONST_DOUBLE_REAL_VALUE (op);");
1228 write_predicate_stmts (c
->exp
);
1229 fputs ("}\n", stdout
);
1231 puts ("#endif /* tm-constrs.h */");
1234 /* Write out the wrapper function, constraint_satisfied_p, that maps
1235 a CONSTRAINT_xxx constant to one of the predicate functions generated
1238 write_constraint_satisfied_p_array (void)
1240 if (satisfied_start
== num_constraints
)
1243 printf ("bool (*constraint_satisfied_p_array[]) (rtx) = {\n ");
1244 for (unsigned int i
= satisfied_start
; i
< num_constraints
; ++i
)
1246 if (i
!= satisfied_start
)
1248 printf ("satisfies_constraint_%s", enum_order
[i
]->c_name
);
1250 printf ("\n};\n\n");
1253 /* Write out the function which computes whether a given value matches
1254 a given CONST_INT constraint. This doesn't just forward to
1255 constraint_satisfied_p because caller passes the INTVAL, not the RTX. */
1257 write_insn_const_int_ok_for_constraint (void)
1259 struct constraint_data
*c
;
1262 "insn_const_int_ok_for_constraint (HOST_WIDE_INT ival, "
1263 "enum constraint_num c)\n"
1268 FOR_ALL_CONSTRAINTS (c
)
1269 if (c
->is_const_int
)
1271 printf (" case CONSTRAINT_%s:\n return ", c
->c_name
);
1272 /* c->exp is guaranteed to be (and (match_code "const_int") (...));
1273 we know at this point that we have a const_int, so we need not
1274 bother with that part of the test. */
1275 write_predicate_expr (XEXP (c
->exp
, 1));
1276 fputs (";\n\n", stdout
);
1279 puts (" default: break;\n"
1285 /* Write a definition for a function NAME that returns true if a given
1286 constraint_num is in the range [START, END). */
1288 write_range_function (const char *name
, unsigned int start
, unsigned int end
)
1290 printf ("static inline bool\n");
1292 printf ("%s (enum constraint_num c)\n"
1294 " return c >= CONSTRAINT_%s && c <= CONSTRAINT_%s;\n"
1296 name
, enum_order
[start
]->c_name
, enum_order
[end
- 1]->c_name
);
1298 printf ("%s (enum constraint_num)\n"
1304 /* Write a definition for insn_extra_constraint_allows_reg_mem function. */
1306 write_allows_reg_mem_function (void)
1308 printf ("static inline void\n"
1309 "insn_extra_constraint_allows_reg_mem (enum constraint_num c,\n"
1310 "\t\t\t\t bool *allows_reg, bool *allows_mem)\n"
1312 if (maybe_allows_none_start
!= maybe_allows_none_end
)
1313 printf (" if (c >= CONSTRAINT_%s && c <= CONSTRAINT_%s)\n"
1315 enum_order
[maybe_allows_none_start
]->c_name
,
1316 enum_order
[maybe_allows_none_end
- 1]->c_name
);
1317 if (maybe_allows_reg_start
!= maybe_allows_reg_end
)
1318 printf (" if (c >= CONSTRAINT_%s && c <= CONSTRAINT_%s)\n"
1320 " *allows_reg = true;\n"
1323 enum_order
[maybe_allows_reg_start
]->c_name
,
1324 enum_order
[maybe_allows_reg_end
- 1]->c_name
);
1325 if (maybe_allows_mem_start
!= maybe_allows_mem_end
)
1326 printf (" if (c >= CONSTRAINT_%s && c <= CONSTRAINT_%s)\n"
1328 " *allows_mem = true;\n"
1331 enum_order
[maybe_allows_mem_start
]->c_name
,
1332 enum_order
[maybe_allows_mem_end
- 1]->c_name
);
1333 printf (" (void) c;\n"
1334 " *allows_reg = true;\n"
1335 " *allows_mem = true;\n"
1339 /* VEC is a list of key/value pairs, with the keys being lower bounds
1340 of a range. Output a decision tree that handles the keys covered by
1341 [VEC[START], VEC[END]), returning FALLBACK for keys lower then VEC[START]'s.
1342 INDENT is the number of spaces to indent the code. */
1344 print_type_tree (const vec
<std::pair
<unsigned int, const char *> > &vec
,
1345 unsigned int start
, unsigned int end
, const char *fallback
,
1346 unsigned int indent
)
1350 unsigned int mid
= (start
+ end
) / 2;
1351 printf ("%*sif (c >= CONSTRAINT_%s)\n",
1352 indent
, "", enum_order
[vec
[mid
].first
]->c_name
);
1354 print_type_tree (vec
, mid
+ 1, end
, vec
[mid
].second
, indent
+ 2);
1357 printf ("%*s{\n", indent
+ 2, "");
1358 print_type_tree (vec
, mid
+ 1, end
, vec
[mid
].second
, indent
+ 4);
1359 printf ("%*s}\n", indent
+ 2, "");
1363 printf ("%*sreturn %s;\n", indent
, "", fallback
);
1366 /* Write tm-preds.h. Unfortunately, it is impossible to forward-declare
1367 an enumeration in portable C, so we have to condition all these
1368 prototypes on HAVE_MACHINE_MODES. */
1370 write_tm_preds_h (void)
1372 struct pred_data
*p
;
1375 /* Generated automatically by the program '%s'\n\
1376 from the machine description file '%s'. */\n\n", progname
, in_fname
);
1379 #ifndef GCC_TM_PREDS_H\n\
1380 #define GCC_TM_PREDS_H\n\
1382 #ifdef HAVE_MACHINE_MODES");
1384 FOR_ALL_PREDICATES (p
)
1385 printf ("extern int %s (rtx, machine_mode);\n", p
->name
);
1387 puts ("#endif /* HAVE_MACHINE_MODES */\n");
1389 if (constraint_max_namelen
> 0)
1391 write_enum_constraint_num ();
1392 puts ("extern enum constraint_num lookup_constraint_1 (const char *);\n"
1393 "extern const unsigned char lookup_constraint_array[];\n"
1395 "/* Return the constraint at the beginning of P, or"
1396 " CONSTRAINT__UNKNOWN if it\n"
1397 " isn't recognized. */\n"
1399 "static inline enum constraint_num\n"
1400 "lookup_constraint (const char *p)\n"
1402 " unsigned int index = lookup_constraint_array"
1403 "[(unsigned char) *p];\n"
1404 " return (index == UCHAR_MAX\n"
1405 " ? lookup_constraint_1 (p)\n"
1406 " : (enum constraint_num) index);\n"
1408 if (satisfied_start
== num_constraints
)
1409 puts ("/* Return true if X satisfies constraint C. */\n"
1411 "static inline bool\n"
1412 "constraint_satisfied_p (rtx, enum constraint_num)\n"
1417 printf ("extern bool (*constraint_satisfied_p_array[]) (rtx);\n"
1419 "/* Return true if X satisfies constraint C. */\n"
1421 "static inline bool\n"
1422 "constraint_satisfied_p (rtx x, enum constraint_num c)\n"
1424 " int i = (int) c - (int) CONSTRAINT_%s;\n"
1425 " return i >= 0 && constraint_satisfied_p_array[i] (x);\n"
1428 enum_order
[satisfied_start
]->name
);
1430 write_range_function ("insn_extra_register_constraint",
1431 register_start
, register_end
);
1432 write_range_function ("insn_extra_memory_constraint",
1433 memory_start
, memory_end
);
1434 write_range_function ("insn_extra_address_constraint",
1435 address_start
, address_end
);
1436 write_allows_reg_mem_function ();
1438 if (constraint_max_namelen
> 1)
1440 write_insn_constraint_len ();
1441 puts ("#define CONSTRAINT_LEN(c_,s_) "
1442 "insn_constraint_len (c_,s_)\n");
1445 puts ("#define CONSTRAINT_LEN(c_,s_) 1\n");
1446 if (have_register_constraints
)
1447 puts ("extern enum reg_class reg_class_for_constraint_1 "
1448 "(enum constraint_num);\n"
1450 "static inline enum reg_class\n"
1451 "reg_class_for_constraint (enum constraint_num c)\n"
1453 " if (insn_extra_register_constraint (c))\n"
1454 " return reg_class_for_constraint_1 (c);\n"
1455 " return NO_REGS;\n"
1458 puts ("static inline enum reg_class\n"
1459 "reg_class_for_constraint (enum constraint_num)\n"
1461 " return NO_REGS;\n"
1463 if (have_const_int_constraints
)
1464 puts ("extern bool insn_const_int_ok_for_constraint "
1465 "(HOST_WIDE_INT, enum constraint_num);\n"
1466 "#define CONST_OK_FOR_CONSTRAINT_P(v_,c_,s_) \\\n"
1467 " insn_const_int_ok_for_constraint (v_, "
1468 "lookup_constraint (s_))\n");
1470 puts ("static inline bool\n"
1471 "insn_const_int_ok_for_constraint (HOST_WIDE_INT,"
1472 " enum constraint_num)\n"
1477 puts ("enum constraint_type\n"
1486 "static inline enum constraint_type\n"
1487 "get_constraint_type (enum constraint_num c)\n"
1489 auto_vec
<std::pair
<unsigned int, const char *>, 4> values
;
1490 if (const_int_start
!= const_int_end
)
1491 values
.safe_push (std::make_pair (const_int_start
, "CT_CONST_INT"));
1492 if (memory_start
!= memory_end
)
1493 values
.safe_push (std::make_pair (memory_start
, "CT_MEMORY"));
1494 if (address_start
!= address_end
)
1495 values
.safe_push (std::make_pair (address_start
, "CT_ADDRESS"));
1496 if (address_end
!= num_constraints
)
1497 values
.safe_push (std::make_pair (address_end
, "CT_FIXED_FORM"));
1498 print_type_tree (values
, 0, values
.length (), "CT_REGISTER", 2);
1502 puts ("#endif /* tm-preds.h */");
1505 /* Write insn-preds.c.
1506 N.B. the list of headers to include was copied from genrecog; it
1509 FUTURE: Write #line markers referring back to the machine
1510 description. (Can't practically do this now since we don't know
1511 the line number of the C block - just the line number of the enclosing
1514 write_insn_preds_c (void)
1516 struct pred_data
*p
;
1519 /* Generated automatically by the program '%s'\n\
1520 from the machine description file '%s'. */\n\n", progname
, in_fname
);
1523 #include \"config.h\"\n\
1524 #include \"system.h\"\n\
1525 #include \"coretypes.h\"\n\
1526 #include \"backend.h\"\n\
1527 #include \"tree.h\"\n\
1528 #include \"rtl.h\"\n\
1529 #include \"alias.h\"\n\
1530 #include \"varasm.h\"\n\
1531 #include \"stor-layout.h\"\n\
1532 #include \"calls.h\"\n\
1533 #include \"tm_p.h\"\n\
1534 #include \"insn-config.h\"\n\
1535 #include \"recog.h\"\n\
1536 #include \"output.h\"\n\
1537 #include \"flags.h\"\n\
1538 #include \"df.h\"\n\
1539 #include \"resource.h\"\n\
1540 #include \"diagnostic-core.h\"\n\
1541 #include \"reload.h\"\n\
1542 #include \"regs.h\"\n\
1543 #include \"emit-rtl.h\"\n\
1544 #include \"tm-constrs.h\"\n");
1546 FOR_ALL_PREDICATES (p
)
1547 write_one_predicate_function (p
);
1549 if (constraint_max_namelen
> 0)
1551 write_lookup_constraint_1 ();
1552 write_lookup_constraint_array ();
1553 if (have_register_constraints
)
1554 write_reg_class_for_constraint_1 ();
1555 write_constraint_satisfied_p_array ();
1557 if (have_const_int_constraints
)
1558 write_insn_const_int_ok_for_constraint ();
1562 /* Argument parsing. */
1563 static bool gen_header
;
1564 static bool gen_constrs
;
1567 parse_option (const char *opt
)
1569 if (!strcmp (opt
, "-h"))
1574 else if (!strcmp (opt
, "-c"))
1583 /* Master control. */
1585 main (int argc
, char **argv
)
1588 int pattern_lineno
, next_insn_code
= 0;
1592 fatal ("no input file name");
1593 if (!init_rtx_reader_args_cb (argc
, argv
, parse_option
))
1594 return FATAL_EXIT_CODE
;
1596 while ((defn
= read_md_rtx (&pattern_lineno
, &next_insn_code
)) != 0)
1597 switch (GET_CODE (defn
))
1599 case DEFINE_PREDICATE
:
1600 case DEFINE_SPECIAL_PREDICATE
:
1601 process_define_predicate (defn
, pattern_lineno
);
1604 case DEFINE_CONSTRAINT
:
1605 case DEFINE_MEMORY_CONSTRAINT
:
1606 case DEFINE_ADDRESS_CONSTRAINT
:
1607 process_define_constraint (defn
, pattern_lineno
);
1610 case DEFINE_REGISTER_CONSTRAINT
:
1611 process_define_register_constraint (defn
, pattern_lineno
);
1618 choose_enum_order ();
1621 write_tm_preds_h ();
1622 else if (gen_constrs
)
1623 write_tm_constrs_h ();
1625 write_insn_preds_c ();
1627 if (have_error
|| ferror (stdout
) || fflush (stdout
) || fclose (stdout
))
1628 return FATAL_EXIT_CODE
;
1630 return SUCCESS_EXIT_CODE
;