1 /* Support routines for the various generation passes.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 2010, Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
30 #include "gensupport.h"
33 /* In case some macros used by files we include need it, define this here. */
38 static struct obstack obstack
;
39 struct obstack
*rtl_obstack
= &obstack
;
41 static int sequence_num
;
43 static int predicable_default
;
44 static const char *predicable_true
;
45 static const char *predicable_false
;
47 static htab_t condition_table
;
49 /* We initially queue all patterns, process the define_insn and
50 define_cond_exec patterns, then return them one at a time. */
57 struct queue_elem
*next
;
58 /* In a DEFINE_INSN that came from a DEFINE_INSN_AND_SPLIT, SPLIT
59 points to the generated DEFINE_SPLIT. */
60 struct queue_elem
*split
;
63 #define MNEMONIC_ATTR_NAME "mnemonic"
64 #define MNEMONIC_HTAB_SIZE 1024
66 static struct queue_elem
*define_attr_queue
;
67 static struct queue_elem
**define_attr_tail
= &define_attr_queue
;
68 static struct queue_elem
*define_pred_queue
;
69 static struct queue_elem
**define_pred_tail
= &define_pred_queue
;
70 static struct queue_elem
*define_insn_queue
;
71 static struct queue_elem
**define_insn_tail
= &define_insn_queue
;
72 static struct queue_elem
*define_cond_exec_queue
;
73 static struct queue_elem
**define_cond_exec_tail
= &define_cond_exec_queue
;
74 static struct queue_elem
*other_queue
;
75 static struct queue_elem
**other_tail
= &other_queue
;
77 static struct queue_elem
*queue_pattern (rtx
, struct queue_elem
***,
80 static void remove_constraints (rtx
);
81 static void process_rtx (rtx
, int);
83 static int is_predicable (struct queue_elem
*);
84 static void identify_predicable_attribute (void);
85 static int n_alternatives (const char *);
86 static void collect_insn_data (rtx
, int *, int *);
87 static rtx
alter_predicate_for_insn (rtx
, int, int, int);
88 static const char *alter_test_for_insn (struct queue_elem
*,
90 static char *shift_output_template (char *, const char *, int);
91 static const char *alter_output_for_insn (struct queue_elem
*,
94 static void process_one_cond_exec (struct queue_elem
*);
95 static void process_define_cond_exec (void);
96 static void init_predicate_table (void);
97 static void record_insn_name (int, const char *);
99 /* Make a version of gen_rtx_CONST_INT so that GEN_INT can be used in
100 the gensupport programs. */
103 gen_rtx_CONST_INT (enum machine_mode
ARG_UNUSED (mode
),
106 rtx rt
= rtx_alloc (CONST_INT
);
112 /* Predicate handling.
114 We construct from the machine description a table mapping each
115 predicate to a list of the rtl codes it can possibly match. The
116 function 'maybe_both_true' uses it to deduce that there are no
117 expressions that can be matches by certain pairs of tree nodes.
118 Also, if a predicate can match only one code, we can hardwire that
119 code into the node testing the predicate.
121 Some predicates are flagged as special. validate_pattern will not
122 warn about modeless match_operand expressions if they have a
123 special predicate. Predicates that allow only constants are also
124 treated as special, for this purpose.
126 validate_pattern will warn about predicates that allow non-lvalues
127 when they appear in destination operands.
129 Calculating the set of rtx codes that can possibly be accepted by a
130 predicate expression EXP requires a three-state logic: any given
131 subexpression may definitively accept a code C (Y), definitively
132 reject a code C (N), or may have an indeterminate effect (I). N
133 and I is N; Y or I is Y; Y and I, N or I are both I. Here are full
144 We represent Y with 1, N with 0, I with 2. If any code is left in
145 an I state by the complete expression, we must assume that that
146 code can be accepted. */
152 #define TRISTATE_AND(a,b) \
153 ((a) == I ? ((b) == N ? N : I) : \
154 (b) == I ? ((a) == N ? N : I) : \
157 #define TRISTATE_OR(a,b) \
158 ((a) == I ? ((b) == Y ? Y : I) : \
159 (b) == I ? ((a) == Y ? Y : I) : \
162 #define TRISTATE_NOT(a) \
163 ((a) == I ? I : !(a))
165 /* 0 means no warning about that code yet, 1 means warned. */
166 static char did_you_mean_codes
[NUM_RTX_CODE
];
168 /* Recursively calculate the set of rtx codes accepted by the
169 predicate expression EXP, writing the result to CODES. LINENO is
170 the line number on which the directive containing EXP appeared. */
173 compute_predicate_codes (rtx exp
, int lineno
, char codes
[NUM_RTX_CODE
])
175 char op0_codes
[NUM_RTX_CODE
];
176 char op1_codes
[NUM_RTX_CODE
];
177 char op2_codes
[NUM_RTX_CODE
];
180 switch (GET_CODE (exp
))
183 compute_predicate_codes (XEXP (exp
, 0), lineno
, op0_codes
);
184 compute_predicate_codes (XEXP (exp
, 1), lineno
, op1_codes
);
185 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
186 codes
[i
] = TRISTATE_AND (op0_codes
[i
], op1_codes
[i
]);
190 compute_predicate_codes (XEXP (exp
, 0), lineno
, op0_codes
);
191 compute_predicate_codes (XEXP (exp
, 1), lineno
, op1_codes
);
192 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
193 codes
[i
] = TRISTATE_OR (op0_codes
[i
], op1_codes
[i
]);
196 compute_predicate_codes (XEXP (exp
, 0), lineno
, op0_codes
);
197 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
198 codes
[i
] = TRISTATE_NOT (op0_codes
[i
]);
202 /* a ? b : c accepts the same codes as (a & b) | (!a & c). */
203 compute_predicate_codes (XEXP (exp
, 0), lineno
, op0_codes
);
204 compute_predicate_codes (XEXP (exp
, 1), lineno
, op1_codes
);
205 compute_predicate_codes (XEXP (exp
, 2), lineno
, op2_codes
);
206 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
207 codes
[i
] = TRISTATE_OR (TRISTATE_AND (op0_codes
[i
], op1_codes
[i
]),
208 TRISTATE_AND (TRISTATE_NOT (op0_codes
[i
]),
213 /* MATCH_CODE allows a specified list of codes. However, if it
214 does not apply to the top level of the expression, it does not
215 constrain the set of codes for the top level. */
216 if (XSTR (exp
, 1)[0] != '\0')
218 memset (codes
, Y
, NUM_RTX_CODE
);
222 memset (codes
, N
, NUM_RTX_CODE
);
224 const char *next_code
= XSTR (exp
, 0);
227 if (*next_code
== '\0')
229 error_with_line (lineno
, "empty match_code expression");
233 while ((code
= scan_comma_elt (&next_code
)) != 0)
235 size_t n
= next_code
- code
;
238 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
239 if (!strncmp (code
, GET_RTX_NAME (i
), n
)
240 && GET_RTX_NAME (i
)[n
] == '\0')
248 error_with_line (lineno
,
249 "match_code \"%.*s\" matches nothing",
251 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
252 if (!strncasecmp (code
, GET_RTX_NAME (i
), n
)
253 && GET_RTX_NAME (i
)[n
] == '\0'
254 && !did_you_mean_codes
[i
])
256 did_you_mean_codes
[i
] = 1;
257 message_with_line (lineno
, "(did you mean \"%s\"?)",
266 /* MATCH_OPERAND disallows the set of codes that the named predicate
267 disallows, and is indeterminate for the codes that it does allow. */
269 struct pred_data
*p
= lookup_predicate (XSTR (exp
, 1));
272 error_with_line (lineno
, "reference to unknown predicate '%s'",
276 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
277 codes
[i
] = p
->codes
[i
] ? I
: N
;
283 /* (match_test WHATEVER) is completely indeterminate. */
284 memset (codes
, I
, NUM_RTX_CODE
);
288 error_with_line (lineno
,
289 "'%s' cannot be used in a define_predicate expression",
290 GET_RTX_NAME (GET_CODE (exp
)));
291 memset (codes
, I
, NUM_RTX_CODE
);
300 /* Return true if NAME is a valid predicate name. */
303 valid_predicate_name_p (const char *name
)
307 if (!ISALPHA (name
[0]) && name
[0] != '_')
309 for (p
= name
+ 1; *p
; p
++)
310 if (!ISALNUM (*p
) && *p
!= '_')
315 /* Process define_predicate directive DESC, which appears on line number
316 LINENO. Compute the set of codes that can be matched, and record this
317 as a known predicate. */
320 process_define_predicate (rtx desc
, int lineno
)
322 struct pred_data
*pred
;
323 char codes
[NUM_RTX_CODE
];
326 if (!valid_predicate_name_p (XSTR (desc
, 0)))
328 error_with_line (lineno
,
329 "%s: predicate name must be a valid C function name",
334 pred
= XCNEW (struct pred_data
);
335 pred
->name
= XSTR (desc
, 0);
336 pred
->exp
= XEXP (desc
, 1);
337 pred
->c_block
= XSTR (desc
, 2);
338 if (GET_CODE (desc
) == DEFINE_SPECIAL_PREDICATE
)
339 pred
->special
= true;
341 compute_predicate_codes (XEXP (desc
, 1), lineno
, codes
);
343 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
345 add_predicate_code (pred
, (enum rtx_code
) i
);
347 add_predicate (pred
);
353 /* Queue PATTERN on LIST_TAIL. Return the address of the new queue
356 static struct queue_elem
*
357 queue_pattern (rtx pattern
, struct queue_elem
***list_tail
,
358 const char *filename
, int lineno
)
360 struct queue_elem
*e
= XNEW(struct queue_elem
);
362 e
->filename
= filename
;
367 *list_tail
= &e
->next
;
371 /* Recursively remove constraints from an rtx. */
374 remove_constraints (rtx part
)
377 const char *format_ptr
;
382 if (GET_CODE (part
) == MATCH_OPERAND
)
384 else if (GET_CODE (part
) == MATCH_SCRATCH
)
387 format_ptr
= GET_RTX_FORMAT (GET_CODE (part
));
389 for (i
= 0; i
< GET_RTX_LENGTH (GET_CODE (part
)); i
++)
390 switch (*format_ptr
++)
394 remove_constraints (XEXP (part
, i
));
397 if (XVEC (part
, i
) != NULL
)
398 for (j
= 0; j
< XVECLEN (part
, i
); j
++)
399 remove_constraints (XVECEXP (part
, i
, j
));
404 /* Process a top level rtx in some way, queuing as appropriate. */
407 process_rtx (rtx desc
, int lineno
)
409 switch (GET_CODE (desc
))
412 queue_pattern (desc
, &define_insn_tail
, read_md_filename
, lineno
);
415 case DEFINE_COND_EXEC
:
416 queue_pattern (desc
, &define_cond_exec_tail
, read_md_filename
, lineno
);
420 case DEFINE_ENUM_ATTR
:
421 queue_pattern (desc
, &define_attr_tail
, read_md_filename
, lineno
);
424 case DEFINE_PREDICATE
:
425 case DEFINE_SPECIAL_PREDICATE
:
426 process_define_predicate (desc
, lineno
);
429 case DEFINE_CONSTRAINT
:
430 case DEFINE_REGISTER_CONSTRAINT
:
431 case DEFINE_MEMORY_CONSTRAINT
:
432 case DEFINE_ADDRESS_CONSTRAINT
:
433 queue_pattern (desc
, &define_pred_tail
, read_md_filename
, lineno
);
436 case DEFINE_INSN_AND_SPLIT
:
438 const char *split_cond
;
442 struct queue_elem
*insn_elem
;
443 struct queue_elem
*split_elem
;
445 /* Create a split with values from the insn_and_split. */
446 split
= rtx_alloc (DEFINE_SPLIT
);
448 i
= XVECLEN (desc
, 1);
449 XVEC (split
, 0) = rtvec_alloc (i
);
452 XVECEXP (split
, 0, i
) = copy_rtx (XVECEXP (desc
, 1, i
));
453 remove_constraints (XVECEXP (split
, 0, i
));
456 /* If the split condition starts with "&&", append it to the
457 insn condition to create the new split condition. */
458 split_cond
= XSTR (desc
, 4);
459 if (split_cond
[0] == '&' && split_cond
[1] == '&')
461 copy_md_ptr_loc (split_cond
+ 2, split_cond
);
462 split_cond
= join_c_conditions (XSTR (desc
, 2), split_cond
+ 2);
464 XSTR (split
, 1) = split_cond
;
465 XVEC (split
, 2) = XVEC (desc
, 5);
466 XSTR (split
, 3) = XSTR (desc
, 6);
468 /* Fix up the DEFINE_INSN. */
469 attr
= XVEC (desc
, 7);
470 PUT_CODE (desc
, DEFINE_INSN
);
471 XVEC (desc
, 4) = attr
;
475 = queue_pattern (desc
, &define_insn_tail
, read_md_filename
,
478 = queue_pattern (split
, &other_tail
, read_md_filename
, lineno
);
479 insn_elem
->split
= split_elem
;
484 queue_pattern (desc
, &other_tail
, read_md_filename
, lineno
);
489 /* Return true if attribute PREDICABLE is true for ELEM, which holds
493 is_predicable (struct queue_elem
*elem
)
495 rtvec vec
= XVEC (elem
->data
, 4);
500 return predicable_default
;
502 for (i
= GET_NUM_ELEM (vec
) - 1; i
>= 0; --i
)
504 rtx sub
= RTVEC_ELT (vec
, i
);
505 switch (GET_CODE (sub
))
508 if (strcmp (XSTR (sub
, 0), "predicable") == 0)
510 value
= XSTR (sub
, 1);
515 case SET_ATTR_ALTERNATIVE
:
516 if (strcmp (XSTR (sub
, 0), "predicable") == 0)
518 error_with_line (elem
->lineno
,
519 "multiple alternatives for `predicable'");
525 if (GET_CODE (SET_DEST (sub
)) != ATTR
526 || strcmp (XSTR (SET_DEST (sub
), 0), "predicable") != 0)
529 if (GET_CODE (sub
) == CONST_STRING
)
531 value
= XSTR (sub
, 0);
535 /* ??? It would be possible to handle this if we really tried.
536 It's not easy though, and I'm not going to bother until it
537 really proves necessary. */
538 error_with_line (elem
->lineno
,
539 "non-constant value for `predicable'");
547 return predicable_default
;
550 /* Verify that predicability does not vary on the alternative. */
551 /* ??? It should be possible to handle this by simply eliminating
552 the non-predicable alternatives from the insn. FRV would like
553 to do this. Delay this until we've got the basics solid. */
554 if (strchr (value
, ',') != NULL
)
556 error_with_line (elem
->lineno
, "multiple alternatives for `predicable'");
560 /* Find out which value we're looking at. */
561 if (strcmp (value
, predicable_true
) == 0)
563 if (strcmp (value
, predicable_false
) == 0)
566 error_with_line (elem
->lineno
,
567 "unknown value `%s' for `predicable' attribute", value
);
571 /* Examine the attribute "predicable"; discover its boolean values
575 identify_predicable_attribute (void)
577 struct queue_elem
*elem
;
578 char *p_true
, *p_false
;
581 /* Look for the DEFINE_ATTR for `predicable', which must exist. */
582 for (elem
= define_attr_queue
; elem
; elem
= elem
->next
)
583 if (strcmp (XSTR (elem
->data
, 0), "predicable") == 0)
586 error_with_line (define_cond_exec_queue
->lineno
,
587 "attribute `predicable' not defined");
591 value
= XSTR (elem
->data
, 1);
592 p_false
= xstrdup (value
);
593 p_true
= strchr (p_false
, ',');
594 if (p_true
== NULL
|| strchr (++p_true
, ',') != NULL
)
596 error_with_line (elem
->lineno
, "attribute `predicable' is not a boolean");
602 predicable_true
= p_true
;
603 predicable_false
= p_false
;
605 switch (GET_CODE (XEXP (elem
->data
, 2)))
608 value
= XSTR (XEXP (elem
->data
, 2), 0);
612 error_with_line (elem
->lineno
, "attribute `predicable' cannot be const");
617 error_with_line (elem
->lineno
,
618 "attribute `predicable' must have a constant default");
623 if (strcmp (value
, p_true
) == 0)
624 predicable_default
= 1;
625 else if (strcmp (value
, p_false
) == 0)
626 predicable_default
= 0;
629 error_with_line (elem
->lineno
,
630 "unknown value `%s' for `predicable' attribute", value
);
635 /* Return the number of alternatives in constraint S. */
638 n_alternatives (const char *s
)
649 /* Determine how many alternatives there are in INSN, and how many
653 collect_insn_data (rtx pattern
, int *palt
, int *pmax
)
659 code
= GET_CODE (pattern
);
663 i
= n_alternatives (XSTR (pattern
, 2));
664 *palt
= (i
> *palt
? i
: *palt
);
670 i
= XINT (pattern
, 0);
679 fmt
= GET_RTX_FORMAT (code
);
680 len
= GET_RTX_LENGTH (code
);
681 for (i
= 0; i
< len
; i
++)
686 collect_insn_data (XEXP (pattern
, i
), palt
, pmax
);
690 if (XVEC (pattern
, i
) == NULL
)
694 for (j
= XVECLEN (pattern
, i
) - 1; j
>= 0; --j
)
695 collect_insn_data (XVECEXP (pattern
, i
, j
), palt
, pmax
);
698 case 'i': case 'w': case '0': case 's': case 'S': case 'T':
708 alter_predicate_for_insn (rtx pattern
, int alt
, int max_op
, int lineno
)
714 code
= GET_CODE (pattern
);
719 const char *c
= XSTR (pattern
, 2);
721 if (n_alternatives (c
) != 1)
723 error_with_line (lineno
, "too many alternatives for operand %d",
728 /* Replicate C as needed to fill out ALT alternatives. */
729 if (c
&& *c
&& alt
> 1)
731 size_t c_len
= strlen (c
);
732 size_t len
= alt
* (c_len
+ 1);
733 char *new_c
= XNEWVEC(char, len
);
735 memcpy (new_c
, c
, c_len
);
736 for (i
= 1; i
< alt
; ++i
)
738 new_c
[i
* (c_len
+ 1) - 1] = ',';
739 memcpy (&new_c
[i
* (c_len
+ 1)], c
, c_len
);
741 new_c
[len
- 1] = '\0';
742 XSTR (pattern
, 2) = new_c
;
750 XINT (pattern
, 0) += max_op
;
757 fmt
= GET_RTX_FORMAT (code
);
758 len
= GET_RTX_LENGTH (code
);
759 for (i
= 0; i
< len
; i
++)
766 r
= alter_predicate_for_insn (XEXP (pattern
, i
), alt
,
773 for (j
= XVECLEN (pattern
, i
) - 1; j
>= 0; --j
)
775 r
= alter_predicate_for_insn (XVECEXP (pattern
, i
, j
),
776 alt
, max_op
, lineno
);
782 case 'i': case 'w': case '0': case 's':
794 alter_test_for_insn (struct queue_elem
*ce_elem
,
795 struct queue_elem
*insn_elem
)
797 return join_c_conditions (XSTR (ce_elem
->data
, 1),
798 XSTR (insn_elem
->data
, 2));
801 /* Adjust all of the operand numbers in SRC to match the shift they'll
802 get from an operand displacement of DISP. Return a pointer after the
806 shift_output_template (char *dest
, const char *src
, int disp
)
815 if (ISDIGIT ((unsigned char) c
))
817 else if (ISALPHA (c
))
830 alter_output_for_insn (struct queue_elem
*ce_elem
,
831 struct queue_elem
*insn_elem
,
834 const char *ce_out
, *insn_out
;
836 size_t len
, ce_len
, insn_len
;
838 /* ??? Could coordinate with genoutput to not duplicate code here. */
840 ce_out
= XSTR (ce_elem
->data
, 2);
841 insn_out
= XTMPL (insn_elem
->data
, 3);
842 if (!ce_out
|| *ce_out
== '\0')
845 ce_len
= strlen (ce_out
);
846 insn_len
= strlen (insn_out
);
848 if (*insn_out
== '*')
849 /* You must take care of the predicate yourself. */
852 if (*insn_out
== '@')
854 len
= (ce_len
+ 1) * alt
+ insn_len
+ 1;
855 p
= result
= XNEWVEC(char, len
);
861 while (ISSPACE ((unsigned char) *insn_out
));
863 if (*insn_out
!= '#')
865 p
= shift_output_template (p
, ce_out
, max_op
);
871 while (*insn_out
&& *insn_out
!= '\n');
878 len
= ce_len
+ 1 + insn_len
+ 1;
879 result
= XNEWVEC (char, len
);
881 p
= shift_output_template (result
, ce_out
, max_op
);
883 memcpy (p
, insn_out
, insn_len
+ 1);
889 /* Replicate insns as appropriate for the given DEFINE_COND_EXEC. */
892 process_one_cond_exec (struct queue_elem
*ce_elem
)
894 struct queue_elem
*insn_elem
;
895 for (insn_elem
= define_insn_queue
; insn_elem
; insn_elem
= insn_elem
->next
)
897 int alternatives
, max_operand
;
898 rtx pred
, insn
, pattern
, split
;
902 if (! is_predicable (insn_elem
))
907 collect_insn_data (insn_elem
->data
, &alternatives
, &max_operand
);
910 if (XVECLEN (ce_elem
->data
, 0) != 1)
912 error_with_line (ce_elem
->lineno
, "too many patterns in predicate");
916 pred
= copy_rtx (XVECEXP (ce_elem
->data
, 0, 0));
917 pred
= alter_predicate_for_insn (pred
, alternatives
, max_operand
,
922 /* Construct a new pattern for the new insn. */
923 insn
= copy_rtx (insn_elem
->data
);
924 new_name
= XNEWVAR (char, strlen
XSTR (insn_elem
->data
, 0) + 4);
925 sprintf (new_name
, "*p %s", XSTR (insn_elem
->data
, 0));
926 XSTR (insn
, 0) = new_name
;
927 pattern
= rtx_alloc (COND_EXEC
);
928 XEXP (pattern
, 0) = pred
;
929 if (XVECLEN (insn
, 1) == 1)
931 XEXP (pattern
, 1) = XVECEXP (insn
, 1, 0);
932 XVECEXP (insn
, 1, 0) = pattern
;
933 PUT_NUM_ELEM (XVEC (insn
, 1), 1);
937 XEXP (pattern
, 1) = rtx_alloc (PARALLEL
);
938 XVEC (XEXP (pattern
, 1), 0) = XVEC (insn
, 1);
939 XVEC (insn
, 1) = rtvec_alloc (1);
940 XVECEXP (insn
, 1, 0) = pattern
;
943 XSTR (insn
, 2) = alter_test_for_insn (ce_elem
, insn_elem
);
944 XTMPL (insn
, 3) = alter_output_for_insn (ce_elem
, insn_elem
,
945 alternatives
, max_operand
);
947 /* ??? Set `predicable' to false. Not crucial since it's really
948 only used here, and we won't reprocess this new pattern. */
950 /* Put the new pattern on the `other' list so that it
951 (a) is not reprocessed by other define_cond_exec patterns
952 (b) appears after all normal define_insn patterns.
954 ??? B is debatable. If one has normal insns that match
955 cond_exec patterns, they will be preferred over these
956 generated patterns. Whether this matters in practice, or if
957 it's a good thing, or whether we should thread these new
958 patterns into the define_insn chain just after their generator
959 is something we'll have to experiment with. */
961 queue_pattern (insn
, &other_tail
, insn_elem
->filename
,
964 if (!insn_elem
->split
)
967 /* If the original insn came from a define_insn_and_split,
968 generate a new split to handle the predicated insn. */
969 split
= copy_rtx (insn_elem
->split
->data
);
970 /* Predicate the pattern matched by the split. */
971 pattern
= rtx_alloc (COND_EXEC
);
972 XEXP (pattern
, 0) = pred
;
973 if (XVECLEN (split
, 0) == 1)
975 XEXP (pattern
, 1) = XVECEXP (split
, 0, 0);
976 XVECEXP (split
, 0, 0) = pattern
;
977 PUT_NUM_ELEM (XVEC (split
, 0), 1);
981 XEXP (pattern
, 1) = rtx_alloc (PARALLEL
);
982 XVEC (XEXP (pattern
, 1), 0) = XVEC (split
, 0);
983 XVEC (split
, 0) = rtvec_alloc (1);
984 XVECEXP (split
, 0, 0) = pattern
;
986 /* Predicate all of the insns generated by the split. */
987 for (i
= 0; i
< XVECLEN (split
, 2); i
++)
989 pattern
= rtx_alloc (COND_EXEC
);
990 XEXP (pattern
, 0) = pred
;
991 XEXP (pattern
, 1) = XVECEXP (split
, 2, i
);
992 XVECEXP (split
, 2, i
) = pattern
;
994 /* Add the new split to the queue. */
995 queue_pattern (split
, &other_tail
, read_md_filename
,
996 insn_elem
->split
->lineno
);
1000 /* If we have any DEFINE_COND_EXEC patterns, expand the DEFINE_INSN
1001 patterns appropriately. */
1004 process_define_cond_exec (void)
1006 struct queue_elem
*elem
;
1008 identify_predicable_attribute ();
1012 for (elem
= define_cond_exec_queue
; elem
; elem
= elem
->next
)
1013 process_one_cond_exec (elem
);
1016 /* A read_md_files callback for reading an rtx. */
1019 rtx_handle_directive (int lineno
, const char *rtx_name
)
1023 if (read_rtx (rtx_name
, &queue
))
1024 for (x
= queue
; x
; x
= XEXP (x
, 1))
1025 process_rtx (XEXP (x
, 0), lineno
);
1028 /* Comparison function for the mnemonic hash table. */
1031 htab_eq_string (const void *s1
, const void *s2
)
1033 return strcmp ((const char*)s1
, (const char*)s2
) == 0;
1036 /* Add mnemonic STR with length LEN to the mnemonic hash table
1037 MNEMONIC_HTAB. A trailing zero end character is appendend to STR
1038 and a permanent heap copy of STR is created. */
1041 add_mnemonic_string (htab_t mnemonic_htab
, const char *str
, int len
)
1045 char *str_zero
= (char*)alloca (len
+ 1);
1047 memcpy (str_zero
, str
, len
);
1048 str_zero
[len
] = '\0';
1050 slot
= htab_find_slot (mnemonic_htab
, str_zero
, INSERT
);
1055 /* Not found; create a permanent copy and add it to the hash table. */
1056 new_str
= XNEWVAR (char, len
+ 1);
1057 memcpy (new_str
, str_zero
, len
+ 1);
1061 /* Scan INSN for mnemonic strings and add them to the mnemonic hash
1062 table in MNEMONIC_HTAB.
1064 The mnemonics cannot be found if they are emitted using C code.
1066 If a mnemonic string contains ';' or a newline the string assumed
1067 to consist of more than a single instruction. The attribute value
1068 will then be set to the user defined default value. */
1071 gen_mnemonic_setattr (htab_t mnemonic_htab
, rtx insn
)
1073 const char *template_code
, *cp
;
1080 template_code
= XTMPL (insn
, 3);
1082 /* Skip patterns which use C code to emit the template. */
1083 if (template_code
[0] == '*')
1086 if (template_code
[0] == '@')
1087 cp
= &template_code
[1];
1089 cp
= &template_code
[0];
1093 const char *ep
, *sp
;
1096 while (ISSPACE (*cp
))
1099 for (ep
= sp
= cp
; !IS_VSPACE (*ep
) && *ep
!= '\0'; ++ep
)
1104 obstack_1grow (&string_obstack
, ',');
1106 while (cp
< sp
&& ((*cp
>= '0' && *cp
<= '9')
1107 || (*cp
>= 'a' && *cp
<= 'z')))
1110 obstack_1grow (&string_obstack
, *cp
);
1117 if (*cp
== ';' || (*cp
== '\\' && cp
[1] == 'n'))
1119 /* Don't set a value if there are more than one
1120 instruction in the string. */
1121 obstack_next_free (&string_obstack
) =
1122 obstack_next_free (&string_obstack
) - size
;
1131 obstack_1grow (&string_obstack
, '*');
1133 add_mnemonic_string (mnemonic_htab
,
1134 obstack_next_free (&string_obstack
) - size
,
1139 /* An insn definition might emit an empty string. */
1140 if (obstack_object_size (&string_obstack
) == 0)
1143 obstack_1grow (&string_obstack
, '\0');
1145 set_attr
= rtx_alloc (SET_ATTR
);
1146 XSTR (set_attr
, 1) = XOBFINISH (&string_obstack
, char *);
1147 attr_name
= XNEWVAR (char, strlen (MNEMONIC_ATTR_NAME
) + 1);
1148 strcpy (attr_name
, MNEMONIC_ATTR_NAME
);
1149 XSTR (set_attr
, 0) = attr_name
;
1151 if (!XVEC (insn
, 4))
1154 vec_len
= XVECLEN (insn
, 4);
1156 new_vec
= rtvec_alloc (vec_len
+ 1);
1157 for (i
= 0; i
< vec_len
; i
++)
1158 RTVEC_ELT (new_vec
, i
) = XVECEXP (insn
, 4, i
);
1159 RTVEC_ELT (new_vec
, vec_len
) = set_attr
;
1160 XVEC (insn
, 4) = new_vec
;
1163 /* This function is called for the elements in the mnemonic hashtable
1164 and generates a comma separated list of the mnemonics. */
1167 mnemonic_htab_callback (void **slot
, void *info ATTRIBUTE_UNUSED
)
1169 obstack_grow (&string_obstack
, (char*)*slot
, strlen ((char*)*slot
));
1170 obstack_1grow (&string_obstack
, ',');
1174 /* Generate (set_attr "mnemonic" "..") RTXs and append them to every
1175 insn definition in case the back end requests it by defining the
1176 mnemonic attribute. The values for the attribute will be extracted
1177 from the output patterns of the insn definitions as far as
1181 gen_mnemonic_attr (void)
1183 struct queue_elem
*elem
;
1184 rtx mnemonic_attr
= NULL
;
1185 htab_t mnemonic_htab
;
1186 const char *str
, *p
;
1192 /* Look for the DEFINE_ATTR for `mnemonic'. */
1193 for (elem
= define_attr_queue
; elem
!= *define_attr_tail
; elem
= elem
->next
)
1194 if (GET_CODE (elem
->data
) == DEFINE_ATTR
1195 && strcmp (XSTR (elem
->data
, 0), MNEMONIC_ATTR_NAME
) == 0)
1197 mnemonic_attr
= elem
->data
;
1201 /* A (define_attr "mnemonic" "...") indicates that the back-end
1202 wants a mnemonic attribute to be generated. */
1206 mnemonic_htab
= htab_create_alloc (MNEMONIC_HTAB_SIZE
, htab_hash_string
,
1207 htab_eq_string
, 0, xcalloc
, free
);
1209 for (elem
= define_insn_queue
; elem
; elem
= elem
->next
)
1211 rtx insn
= elem
->data
;
1214 /* Check if the insn definition already has
1215 (set_attr "mnemonic" ...). */
1217 for (i
= 0; i
< XVECLEN (insn
, 4); i
++)
1218 if (strcmp (XSTR (XVECEXP (insn
, 4, i
), 0), MNEMONIC_ATTR_NAME
) == 0)
1225 gen_mnemonic_setattr (mnemonic_htab
, insn
);
1228 /* Add the user defined values to the hash table. */
1229 str
= XSTR (mnemonic_attr
, 1);
1230 while ((p
= scan_comma_elt (&str
)) != NULL
)
1231 add_mnemonic_string (mnemonic_htab
, p
, str
- p
);
1233 htab_traverse (mnemonic_htab
, mnemonic_htab_callback
, NULL
);
1235 /* Replace the last ',' with the zero end character. */
1236 *((char *)obstack_next_free (&string_obstack
) - 1) = '\0';
1237 XSTR (mnemonic_attr
, 1) = XOBFINISH (&string_obstack
, char *);
1240 /* The entry point for initializing the reader. */
1243 init_rtx_reader_args_cb (int argc
, char **argv
,
1244 bool (*parse_opt
) (const char *))
1246 /* Prepare to read input. */
1247 condition_table
= htab_create (500, hash_c_test
, cmp_c_test
, NULL
);
1248 init_predicate_table ();
1249 obstack_init (rtl_obstack
);
1252 read_md_files (argc
, argv
, parse_opt
, rtx_handle_directive
);
1254 /* Process define_cond_exec patterns. */
1255 if (define_cond_exec_queue
!= NULL
)
1256 process_define_cond_exec ();
1258 if (define_attr_queue
!= NULL
)
1259 gen_mnemonic_attr ();
1264 /* Programs that don't have their own options can use this entry point
1267 init_rtx_reader_args (int argc
, char **argv
)
1269 return init_rtx_reader_args_cb (argc
, argv
, 0);
1272 /* The entry point for reading a single rtx from an md file. */
1275 read_md_rtx (int *lineno
, int *seqnr
)
1277 struct queue_elem
**queue
, *elem
;
1282 /* Read all patterns from a given queue before moving on to the next. */
1283 if (define_attr_queue
!= NULL
)
1284 queue
= &define_attr_queue
;
1285 else if (define_pred_queue
!= NULL
)
1286 queue
= &define_pred_queue
;
1287 else if (define_insn_queue
!= NULL
)
1288 queue
= &define_insn_queue
;
1289 else if (other_queue
!= NULL
)
1290 queue
= &other_queue
;
1295 *queue
= elem
->next
;
1297 read_md_filename
= elem
->filename
;
1298 *lineno
= elem
->lineno
;
1299 *seqnr
= sequence_num
;
1303 /* Discard insn patterns which we know can never match (because
1304 their C test is provably always false). If insn_elision is
1305 false, our caller needs to see all the patterns. Note that the
1306 elided patterns are never counted by the sequence numbering; it
1307 is the caller's responsibility, when insn_elision is false, not
1308 to use elided pattern numbers for anything. */
1309 switch (GET_CODE (desc
))
1313 if (maybe_eval_c_test (XSTR (desc
, 2)) != 0)
1315 else if (insn_elision
)
1318 /* *seqnr is used here so the name table will match caller's
1319 idea of insn numbering, whether or not elision is active. */
1320 record_insn_name (*seqnr
, XSTR (desc
, 0));
1324 case DEFINE_PEEPHOLE
:
1325 case DEFINE_PEEPHOLE2
:
1326 if (maybe_eval_c_test (XSTR (desc
, 1)) != 0)
1328 else if (insn_elision
)
1339 /* Helper functions for insn elision. */
1341 /* Compute a hash function of a c_test structure, which is keyed
1342 by its ->expr field. */
1344 hash_c_test (const void *x
)
1346 const struct c_test
*a
= (const struct c_test
*) x
;
1347 const unsigned char *base
, *s
= (const unsigned char *) a
->expr
;
1355 while ((c
= *s
++) != '\0')
1357 hash
+= c
+ (c
<< 17);
1362 hash
+= len
+ (len
<< 17);
1368 /* Compare two c_test expression structures. */
1370 cmp_c_test (const void *x
, const void *y
)
1372 const struct c_test
*a
= (const struct c_test
*) x
;
1373 const struct c_test
*b
= (const struct c_test
*) y
;
1375 return !strcmp (a
->expr
, b
->expr
);
1378 /* Given a string representing a C test expression, look it up in the
1379 condition_table and report whether or not its value is known
1380 at compile time. Returns a tristate: 1 for known true, 0 for
1381 known false, -1 for unknown. */
1383 maybe_eval_c_test (const char *expr
)
1385 const struct c_test
*test
;
1386 struct c_test dummy
;
1392 test
= (const struct c_test
*)htab_find (condition_table
, &dummy
);
1398 /* Record the C test expression EXPR in the condition_table, with
1399 value VAL. Duplicates clobber previous entries. */
1402 add_c_test (const char *expr
, int value
)
1404 struct c_test
*test
;
1409 test
= XNEW (struct c_test
);
1411 test
->value
= value
;
1413 *(htab_find_slot (condition_table
, test
, INSERT
)) = test
;
1416 /* For every C test, call CALLBACK with two arguments: a pointer to
1417 the condition structure and INFO. Stops when CALLBACK returns zero. */
1419 traverse_c_tests (htab_trav callback
, void *info
)
1421 if (condition_table
)
1422 htab_traverse (condition_table
, callback
, info
);
1425 /* Helper functions for define_predicate and define_special_predicate
1426 processing. Shared between genrecog.c and genpreds.c. */
1428 static htab_t predicate_table
;
1429 struct pred_data
*first_predicate
;
1430 static struct pred_data
**last_predicate
= &first_predicate
;
1433 hash_struct_pred_data (const void *ptr
)
1435 return htab_hash_string (((const struct pred_data
*)ptr
)->name
);
1439 eq_struct_pred_data (const void *a
, const void *b
)
1441 return !strcmp (((const struct pred_data
*)a
)->name
,
1442 ((const struct pred_data
*)b
)->name
);
1446 lookup_predicate (const char *name
)
1448 struct pred_data key
;
1450 return (struct pred_data
*) htab_find (predicate_table
, &key
);
1453 /* Record that predicate PRED can accept CODE. */
1456 add_predicate_code (struct pred_data
*pred
, enum rtx_code code
)
1458 if (!pred
->codes
[code
])
1461 pred
->codes
[code
] = true;
1463 if (GET_RTX_CLASS (code
) != RTX_CONST_OBJ
)
1464 pred
->allows_non_const
= true;
1471 && code
!= STRICT_LOW_PART
)
1472 pred
->allows_non_lvalue
= true;
1474 if (pred
->num_codes
== 1)
1475 pred
->singleton
= code
;
1476 else if (pred
->num_codes
== 2)
1477 pred
->singleton
= UNKNOWN
;
1482 add_predicate (struct pred_data
*pred
)
1484 void **slot
= htab_find_slot (predicate_table
, pred
, INSERT
);
1487 error ("duplicate predicate definition for '%s'", pred
->name
);
1491 *last_predicate
= pred
;
1492 last_predicate
= &pred
->next
;
1495 /* This array gives the initial content of the predicate table. It
1496 has entries for all predicates defined in recog.c. */
1498 struct std_pred_table
1502 bool allows_const_p
;
1503 RTX_CODE codes
[NUM_RTX_CODE
];
1506 static const struct std_pred_table std_preds
[] = {
1507 {"general_operand", false, true, {SUBREG
, REG
, MEM
}},
1508 {"address_operand", true, true, {SUBREG
, REG
, MEM
, PLUS
, MINUS
, MULT
}},
1509 {"register_operand", false, false, {SUBREG
, REG
}},
1510 {"pmode_register_operand", true, false, {SUBREG
, REG
}},
1511 {"scratch_operand", false, false, {SCRATCH
, REG
}},
1512 {"immediate_operand", false, true, {UNKNOWN
}},
1513 {"const_int_operand", false, false, {CONST_INT
}},
1514 {"const_double_operand", false, false, {CONST_INT
, CONST_DOUBLE
}},
1515 {"nonimmediate_operand", false, false, {SUBREG
, REG
, MEM
}},
1516 {"nonmemory_operand", false, true, {SUBREG
, REG
}},
1517 {"push_operand", false, false, {MEM
}},
1518 {"pop_operand", false, false, {MEM
}},
1519 {"memory_operand", false, false, {SUBREG
, MEM
}},
1520 {"indirect_operand", false, false, {SUBREG
, MEM
}},
1521 {"ordered_comparison_operator", false, false, {EQ
, NE
,
1523 LEU
, LTU
, GEU
, GTU
}},
1524 {"comparison_operator", false, false, {EQ
, NE
,
1531 #define NUM_KNOWN_STD_PREDS ARRAY_SIZE (std_preds)
1533 /* Initialize the table of predicate definitions, starting with
1534 the information we have on generic predicates. */
1537 init_predicate_table (void)
1540 struct pred_data
*pred
;
1542 predicate_table
= htab_create_alloc (37, hash_struct_pred_data
,
1543 eq_struct_pred_data
, 0,
1546 for (i
= 0; i
< NUM_KNOWN_STD_PREDS
; i
++)
1548 pred
= XCNEW (struct pred_data
);
1549 pred
->name
= std_preds
[i
].name
;
1550 pred
->special
= std_preds
[i
].special
;
1552 for (j
= 0; std_preds
[i
].codes
[j
] != 0; j
++)
1553 add_predicate_code (pred
, std_preds
[i
].codes
[j
]);
1555 if (std_preds
[i
].allows_const_p
)
1556 for (j
= 0; j
< NUM_RTX_CODE
; j
++)
1557 if (GET_RTX_CLASS (j
) == RTX_CONST_OBJ
)
1558 add_predicate_code (pred
, (enum rtx_code
) j
);
1560 add_predicate (pred
);
1564 /* These functions allow linkage with print-rtl.c. Also, some generators
1565 like to annotate their output with insn names. */
1567 /* Holds an array of names indexed by insn_code_number. */
1568 static char **insn_name_ptr
= 0;
1569 static int insn_name_ptr_size
= 0;
1572 get_insn_name (int code
)
1574 if (code
< insn_name_ptr_size
)
1575 return insn_name_ptr
[code
];
1581 record_insn_name (int code
, const char *name
)
1583 static const char *last_real_name
= "insn";
1584 static int last_real_code
= 0;
1587 if (insn_name_ptr_size
<= code
)
1590 new_size
= (insn_name_ptr_size
? insn_name_ptr_size
* 2 : 512);
1591 insn_name_ptr
= XRESIZEVEC (char *, insn_name_ptr
, new_size
);
1592 memset (insn_name_ptr
+ insn_name_ptr_size
, 0,
1593 sizeof(char *) * (new_size
- insn_name_ptr_size
));
1594 insn_name_ptr_size
= new_size
;
1597 if (!name
|| name
[0] == '\0')
1599 new_name
= XNEWVAR (char, strlen (last_real_name
) + 10);
1600 sprintf (new_name
, "%s+%d", last_real_name
, code
- last_real_code
);
1604 last_real_name
= new_name
= xstrdup (name
);
1605 last_real_code
= code
;
1608 insn_name_ptr
[code
] = new_name
;
1611 /* Make STATS describe the operands that appear in rtx X. */
1614 get_pattern_stats_1 (struct pattern_stats
*stats
, rtx x
)
1624 code
= GET_CODE (x
);
1628 case MATCH_OPERATOR
:
1629 case MATCH_PARALLEL
:
1630 stats
->max_opno
= MAX (stats
->max_opno
, XINT (x
, 0));
1637 stats
->max_dup_opno
= MAX (stats
->max_dup_opno
, XINT (x
, 0));
1641 stats
->max_scratch_opno
= MAX (stats
->max_scratch_opno
, XINT (x
, 0));
1648 fmt
= GET_RTX_FORMAT (code
);
1649 len
= GET_RTX_LENGTH (code
);
1650 for (i
= 0; i
< len
; i
++)
1652 if (fmt
[i
] == 'e' || fmt
[i
] == 'u')
1653 get_pattern_stats_1 (stats
, XEXP (x
, i
));
1654 else if (fmt
[i
] == 'E')
1657 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
1658 get_pattern_stats_1 (stats
, XVECEXP (x
, i
, j
));
1663 /* Make STATS describe the operands that appear in instruction pattern
1667 get_pattern_stats (struct pattern_stats
*stats
, rtvec pattern
)
1671 stats
->max_opno
= -1;
1672 stats
->max_dup_opno
= -1;
1673 stats
->max_scratch_opno
= -1;
1674 stats
->num_dups
= 0;
1676 len
= GET_NUM_ELEM (pattern
);
1677 for (i
= 0; i
< len
; i
++)
1678 get_pattern_stats_1 (stats
, RTVEC_ELT (pattern
, i
));
1680 stats
->num_generator_args
= stats
->max_opno
+ 1;
1681 stats
->num_insn_operands
= MAX (stats
->max_opno
,
1682 stats
->max_scratch_opno
) + 1;
1683 stats
->num_operand_vars
= MAX (stats
->max_opno
,
1684 MAX (stats
->max_dup_opno
,
1685 stats
->max_scratch_opno
)) + 1;