1 /* Support routines for the various generation passes.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
3 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"
29 #include "gensupport.h"
32 /* In case some macros used by files we include need it, define this here. */
39 /* This callback will be invoked whenever an rtl include directive is
40 processed. To be used for creation of the dependency file. */
41 void (*include_callback
) (const char *);
43 static struct obstack obstack
;
44 struct obstack
*rtl_obstack
= &obstack
;
46 static int sequence_num
;
49 static int predicable_default
;
50 static const char *predicable_true
;
51 static const char *predicable_false
;
53 static htab_t condition_table
;
55 static char *base_dir
= NULL
;
57 /* We initially queue all patterns, process the define_insn and
58 define_cond_exec patterns, then return them one at a time. */
65 struct queue_elem
*next
;
66 /* In a DEFINE_INSN that came from a DEFINE_INSN_AND_SPLIT, SPLIT
67 points to the generated DEFINE_SPLIT. */
68 struct queue_elem
*split
;
71 static struct queue_elem
*define_attr_queue
;
72 static struct queue_elem
**define_attr_tail
= &define_attr_queue
;
73 static struct queue_elem
*define_pred_queue
;
74 static struct queue_elem
**define_pred_tail
= &define_pred_queue
;
75 static struct queue_elem
*define_insn_queue
;
76 static struct queue_elem
**define_insn_tail
= &define_insn_queue
;
77 static struct queue_elem
*define_cond_exec_queue
;
78 static struct queue_elem
**define_cond_exec_tail
= &define_cond_exec_queue
;
79 static struct queue_elem
*other_queue
;
80 static struct queue_elem
**other_tail
= &other_queue
;
82 static struct queue_elem
*queue_pattern (rtx
, struct queue_elem
***,
85 /* Current maximum length of directory names in the search path
86 for include files. (Altered as we get more of them.) */
88 size_t max_include_len
;
92 struct file_name_list
*next
;
96 struct file_name_list
*first_dir_md_include
= 0; /* First dir to search */
97 /* First dir to search for <file> */
98 struct file_name_list
*first_bracket_include
= 0;
99 struct file_name_list
*last_dir_md_include
= 0; /* Last in chain */
101 static void remove_constraints (rtx
);
102 static void process_rtx (rtx
, int);
104 static int is_predicable (struct queue_elem
*);
105 static void identify_predicable_attribute (void);
106 static int n_alternatives (const char *);
107 static void collect_insn_data (rtx
, int *, int *);
108 static rtx
alter_predicate_for_insn (rtx
, int, int, int);
109 static const char *alter_test_for_insn (struct queue_elem
*,
110 struct queue_elem
*);
111 static char *shift_output_template (char *, const char *, int);
112 static const char *alter_output_for_insn (struct queue_elem
*,
115 static void process_one_cond_exec (struct queue_elem
*);
116 static void process_define_cond_exec (void);
117 static void process_include (rtx
, int);
118 static char *save_string (const char *, int);
119 static void init_predicate_table (void);
120 static void record_insn_name (int, const char *);
123 message_with_line (int lineno
, const char *msg
, ...)
129 fprintf (stderr
, "%s:%d: ", read_rtx_filename
, lineno
);
130 vfprintf (stderr
, msg
, ap
);
131 fputc ('\n', stderr
);
136 /* Make a version of gen_rtx_CONST_INT so that GEN_INT can be used in
137 the gensupport programs. */
140 gen_rtx_CONST_INT (enum machine_mode
ARG_UNUSED (mode
),
143 rtx rt
= rtx_alloc (CONST_INT
);
149 /* Queue PATTERN on LIST_TAIL. Return the address of the new queue
152 static struct queue_elem
*
153 queue_pattern (rtx pattern
, struct queue_elem
***list_tail
,
154 const char *filename
, int lineno
)
156 struct queue_elem
*e
= XNEW(struct queue_elem
);
158 e
->filename
= filename
;
163 *list_tail
= &e
->next
;
167 /* Recursively remove constraints from an rtx. */
170 remove_constraints (rtx part
)
173 const char *format_ptr
;
178 if (GET_CODE (part
) == MATCH_OPERAND
)
180 else if (GET_CODE (part
) == MATCH_SCRATCH
)
183 format_ptr
= GET_RTX_FORMAT (GET_CODE (part
));
185 for (i
= 0; i
< GET_RTX_LENGTH (GET_CODE (part
)); i
++)
186 switch (*format_ptr
++)
190 remove_constraints (XEXP (part
, i
));
193 if (XVEC (part
, i
) != NULL
)
194 for (j
= 0; j
< XVECLEN (part
, i
); j
++)
195 remove_constraints (XVECEXP (part
, i
, j
));
200 /* Process an include file assuming that it lives in gcc/config/{target}/
201 if the include looks like (include "file"). */
204 process_include (rtx desc
, int lineno
)
206 const char *filename
= XSTR (desc
, 0);
207 const char *old_filename
;
212 /* If specified file name is absolute, skip the include stack. */
213 if (! IS_ABSOLUTE_PATH (filename
))
215 struct file_name_list
*stackp
;
217 /* Search directory path, trying to open the file. */
218 for (stackp
= first_dir_md_include
; stackp
; stackp
= stackp
->next
)
220 static const char sep
[2] = { DIR_SEPARATOR
, '\0' };
222 pathname
= concat (stackp
->fname
, sep
, filename
, NULL
);
223 input_file
= fopen (pathname
, "r");
224 if (input_file
!= NULL
)
231 pathname
= concat (base_dir
, filename
, NULL
);
233 pathname
= xstrdup (filename
);
234 input_file
= fopen (pathname
, "r");
235 if (input_file
== NULL
)
238 message_with_line (lineno
, "include file `%s' not found", filename
);
244 /* Save old cursor; setup new for the new file. Note that "lineno" the
245 argument to this function is the beginning of the include statement,
246 while read_rtx_lineno has already been advanced. */
247 old_filename
= read_rtx_filename
;
248 old_lineno
= read_rtx_lineno
;
249 read_rtx_filename
= pathname
;
252 if (include_callback
)
253 include_callback (pathname
);
255 /* Read the entire file. */
256 while (read_rtx (input_file
, &desc
, &lineno
))
257 process_rtx (desc
, lineno
);
259 /* Do not free pathname. It is attached to the various rtx queue
262 read_rtx_filename
= old_filename
;
263 read_rtx_lineno
= old_lineno
;
268 /* Process a top level rtx in some way, queuing as appropriate. */
271 process_rtx (rtx desc
, int lineno
)
273 switch (GET_CODE (desc
))
276 queue_pattern (desc
, &define_insn_tail
, read_rtx_filename
, lineno
);
279 case DEFINE_COND_EXEC
:
280 queue_pattern (desc
, &define_cond_exec_tail
, read_rtx_filename
, lineno
);
284 queue_pattern (desc
, &define_attr_tail
, read_rtx_filename
, lineno
);
287 case DEFINE_PREDICATE
:
288 case DEFINE_SPECIAL_PREDICATE
:
289 case DEFINE_CONSTRAINT
:
290 case DEFINE_REGISTER_CONSTRAINT
:
291 case DEFINE_MEMORY_CONSTRAINT
:
292 case DEFINE_ADDRESS_CONSTRAINT
:
293 queue_pattern (desc
, &define_pred_tail
, read_rtx_filename
, lineno
);
297 process_include (desc
, lineno
);
300 case DEFINE_INSN_AND_SPLIT
:
302 const char *split_cond
;
306 struct queue_elem
*insn_elem
;
307 struct queue_elem
*split_elem
;
309 /* Create a split with values from the insn_and_split. */
310 split
= rtx_alloc (DEFINE_SPLIT
);
312 i
= XVECLEN (desc
, 1);
313 XVEC (split
, 0) = rtvec_alloc (i
);
316 XVECEXP (split
, 0, i
) = copy_rtx (XVECEXP (desc
, 1, i
));
317 remove_constraints (XVECEXP (split
, 0, i
));
320 /* If the split condition starts with "&&", append it to the
321 insn condition to create the new split condition. */
322 split_cond
= XSTR (desc
, 4);
323 if (split_cond
[0] == '&' && split_cond
[1] == '&')
325 copy_rtx_ptr_loc (split_cond
+ 2, split_cond
);
326 split_cond
= join_c_conditions (XSTR (desc
, 2), split_cond
+ 2);
328 XSTR (split
, 1) = split_cond
;
329 XVEC (split
, 2) = XVEC (desc
, 5);
330 XSTR (split
, 3) = XSTR (desc
, 6);
332 /* Fix up the DEFINE_INSN. */
333 attr
= XVEC (desc
, 7);
334 PUT_CODE (desc
, DEFINE_INSN
);
335 XVEC (desc
, 4) = attr
;
339 = queue_pattern (desc
, &define_insn_tail
, read_rtx_filename
,
342 = queue_pattern (split
, &other_tail
, read_rtx_filename
, lineno
);
343 insn_elem
->split
= split_elem
;
348 queue_pattern (desc
, &other_tail
, read_rtx_filename
, lineno
);
353 /* Return true if attribute PREDICABLE is true for ELEM, which holds
357 is_predicable (struct queue_elem
*elem
)
359 rtvec vec
= XVEC (elem
->data
, 4);
364 return predicable_default
;
366 for (i
= GET_NUM_ELEM (vec
) - 1; i
>= 0; --i
)
368 rtx sub
= RTVEC_ELT (vec
, i
);
369 switch (GET_CODE (sub
))
372 if (strcmp (XSTR (sub
, 0), "predicable") == 0)
374 value
= XSTR (sub
, 1);
379 case SET_ATTR_ALTERNATIVE
:
380 if (strcmp (XSTR (sub
, 0), "predicable") == 0)
382 message_with_line (elem
->lineno
,
383 "multiple alternatives for `predicable'");
390 if (GET_CODE (SET_DEST (sub
)) != ATTR
391 || strcmp (XSTR (SET_DEST (sub
), 0), "predicable") != 0)
394 if (GET_CODE (sub
) == CONST_STRING
)
396 value
= XSTR (sub
, 0);
400 /* ??? It would be possible to handle this if we really tried.
401 It's not easy though, and I'm not going to bother until it
402 really proves necessary. */
403 message_with_line (elem
->lineno
,
404 "non-constant value for `predicable'");
413 return predicable_default
;
416 /* Verify that predicability does not vary on the alternative. */
417 /* ??? It should be possible to handle this by simply eliminating
418 the non-predicable alternatives from the insn. FRV would like
419 to do this. Delay this until we've got the basics solid. */
420 if (strchr (value
, ',') != NULL
)
422 message_with_line (elem
->lineno
,
423 "multiple alternatives for `predicable'");
428 /* Find out which value we're looking at. */
429 if (strcmp (value
, predicable_true
) == 0)
431 if (strcmp (value
, predicable_false
) == 0)
434 message_with_line (elem
->lineno
,
435 "unknown value `%s' for `predicable' attribute",
441 /* Examine the attribute "predicable"; discover its boolean values
445 identify_predicable_attribute (void)
447 struct queue_elem
*elem
;
448 char *p_true
, *p_false
;
451 /* Look for the DEFINE_ATTR for `predicable', which must exist. */
452 for (elem
= define_attr_queue
; elem
; elem
= elem
->next
)
453 if (strcmp (XSTR (elem
->data
, 0), "predicable") == 0)
456 message_with_line (define_cond_exec_queue
->lineno
,
457 "attribute `predicable' not defined");
462 value
= XSTR (elem
->data
, 1);
463 p_false
= xstrdup (value
);
464 p_true
= strchr (p_false
, ',');
465 if (p_true
== NULL
|| strchr (++p_true
, ',') != NULL
)
467 message_with_line (elem
->lineno
,
468 "attribute `predicable' is not a boolean");
476 predicable_true
= p_true
;
477 predicable_false
= p_false
;
479 switch (GET_CODE (XEXP (elem
->data
, 2)))
482 value
= XSTR (XEXP (elem
->data
, 2), 0);
486 message_with_line (elem
->lineno
,
487 "attribute `predicable' cannot be const");
494 message_with_line (elem
->lineno
,
495 "attribute `predicable' must have a constant default");
502 if (strcmp (value
, p_true
) == 0)
503 predicable_default
= 1;
504 else if (strcmp (value
, p_false
) == 0)
505 predicable_default
= 0;
508 message_with_line (elem
->lineno
,
509 "unknown value `%s' for `predicable' attribute",
517 /* Return the number of alternatives in constraint S. */
520 n_alternatives (const char *s
)
531 /* Determine how many alternatives there are in INSN, and how many
535 collect_insn_data (rtx pattern
, int *palt
, int *pmax
)
541 code
= GET_CODE (pattern
);
545 i
= n_alternatives (XSTR (pattern
, 2));
546 *palt
= (i
> *palt
? i
: *palt
);
552 i
= XINT (pattern
, 0);
561 fmt
= GET_RTX_FORMAT (code
);
562 len
= GET_RTX_LENGTH (code
);
563 for (i
= 0; i
< len
; i
++)
568 collect_insn_data (XEXP (pattern
, i
), palt
, pmax
);
572 if (XVEC (pattern
, i
) == NULL
)
576 for (j
= XVECLEN (pattern
, i
) - 1; j
>= 0; --j
)
577 collect_insn_data (XVECEXP (pattern
, i
, j
), palt
, pmax
);
580 case 'i': case 'w': case '0': case 's': case 'S': case 'T':
590 alter_predicate_for_insn (rtx pattern
, int alt
, int max_op
, int lineno
)
596 code
= GET_CODE (pattern
);
601 const char *c
= XSTR (pattern
, 2);
603 if (n_alternatives (c
) != 1)
605 message_with_line (lineno
,
606 "too many alternatives for operand %d",
612 /* Replicate C as needed to fill out ALT alternatives. */
613 if (c
&& *c
&& alt
> 1)
615 size_t c_len
= strlen (c
);
616 size_t len
= alt
* (c_len
+ 1);
617 char *new_c
= XNEWVEC(char, len
);
619 memcpy (new_c
, c
, c_len
);
620 for (i
= 1; i
< alt
; ++i
)
622 new_c
[i
* (c_len
+ 1) - 1] = ',';
623 memcpy (&new_c
[i
* (c_len
+ 1)], c
, c_len
);
625 new_c
[len
- 1] = '\0';
626 XSTR (pattern
, 2) = new_c
;
634 XINT (pattern
, 0) += max_op
;
641 fmt
= GET_RTX_FORMAT (code
);
642 len
= GET_RTX_LENGTH (code
);
643 for (i
= 0; i
< len
; i
++)
650 r
= alter_predicate_for_insn (XEXP (pattern
, i
), alt
,
657 for (j
= XVECLEN (pattern
, i
) - 1; j
>= 0; --j
)
659 r
= alter_predicate_for_insn (XVECEXP (pattern
, i
, j
),
660 alt
, max_op
, lineno
);
666 case 'i': case 'w': case '0': case 's':
678 alter_test_for_insn (struct queue_elem
*ce_elem
,
679 struct queue_elem
*insn_elem
)
681 return join_c_conditions (XSTR (ce_elem
->data
, 1),
682 XSTR (insn_elem
->data
, 2));
685 /* Adjust all of the operand numbers in SRC to match the shift they'll
686 get from an operand displacement of DISP. Return a pointer after the
690 shift_output_template (char *dest
, const char *src
, int disp
)
699 if (ISDIGIT ((unsigned char) c
))
701 else if (ISALPHA (c
))
714 alter_output_for_insn (struct queue_elem
*ce_elem
,
715 struct queue_elem
*insn_elem
,
718 const char *ce_out
, *insn_out
;
720 size_t len
, ce_len
, insn_len
;
722 /* ??? Could coordinate with genoutput to not duplicate code here. */
724 ce_out
= XSTR (ce_elem
->data
, 2);
725 insn_out
= XTMPL (insn_elem
->data
, 3);
726 if (!ce_out
|| *ce_out
== '\0')
729 ce_len
= strlen (ce_out
);
730 insn_len
= strlen (insn_out
);
732 if (*insn_out
== '*')
733 /* You must take care of the predicate yourself. */
736 if (*insn_out
== '@')
738 len
= (ce_len
+ 1) * alt
+ insn_len
+ 1;
739 p
= result
= XNEWVEC(char, len
);
745 while (ISSPACE ((unsigned char) *insn_out
));
747 if (*insn_out
!= '#')
749 p
= shift_output_template (p
, ce_out
, max_op
);
755 while (*insn_out
&& *insn_out
!= '\n');
762 len
= ce_len
+ 1 + insn_len
+ 1;
763 result
= XNEWVEC (char, len
);
765 p
= shift_output_template (result
, ce_out
, max_op
);
767 memcpy (p
, insn_out
, insn_len
+ 1);
773 /* Replicate insns as appropriate for the given DEFINE_COND_EXEC. */
776 process_one_cond_exec (struct queue_elem
*ce_elem
)
778 struct queue_elem
*insn_elem
;
779 for (insn_elem
= define_insn_queue
; insn_elem
; insn_elem
= insn_elem
->next
)
781 int alternatives
, max_operand
;
782 rtx pred
, insn
, pattern
, split
;
786 if (! is_predicable (insn_elem
))
791 collect_insn_data (insn_elem
->data
, &alternatives
, &max_operand
);
794 if (XVECLEN (ce_elem
->data
, 0) != 1)
796 message_with_line (ce_elem
->lineno
,
797 "too many patterns in predicate");
802 pred
= copy_rtx (XVECEXP (ce_elem
->data
, 0, 0));
803 pred
= alter_predicate_for_insn (pred
, alternatives
, max_operand
,
808 /* Construct a new pattern for the new insn. */
809 insn
= copy_rtx (insn_elem
->data
);
810 new_name
= XNEWVAR (char, strlen
XSTR (insn_elem
->data
, 0) + 4);
811 sprintf (new_name
, "*p %s", XSTR (insn_elem
->data
, 0));
812 XSTR (insn
, 0) = new_name
;
813 pattern
= rtx_alloc (COND_EXEC
);
814 XEXP (pattern
, 0) = pred
;
815 if (XVECLEN (insn
, 1) == 1)
817 XEXP (pattern
, 1) = XVECEXP (insn
, 1, 0);
818 XVECEXP (insn
, 1, 0) = pattern
;
819 PUT_NUM_ELEM (XVEC (insn
, 1), 1);
823 XEXP (pattern
, 1) = rtx_alloc (PARALLEL
);
824 XVEC (XEXP (pattern
, 1), 0) = XVEC (insn
, 1);
825 XVEC (insn
, 1) = rtvec_alloc (1);
826 XVECEXP (insn
, 1, 0) = pattern
;
829 XSTR (insn
, 2) = alter_test_for_insn (ce_elem
, insn_elem
);
830 XTMPL (insn
, 3) = alter_output_for_insn (ce_elem
, insn_elem
,
831 alternatives
, max_operand
);
833 /* ??? Set `predicable' to false. Not crucial since it's really
834 only used here, and we won't reprocess this new pattern. */
836 /* Put the new pattern on the `other' list so that it
837 (a) is not reprocessed by other define_cond_exec patterns
838 (b) appears after all normal define_insn patterns.
840 ??? B is debatable. If one has normal insns that match
841 cond_exec patterns, they will be preferred over these
842 generated patterns. Whether this matters in practice, or if
843 it's a good thing, or whether we should thread these new
844 patterns into the define_insn chain just after their generator
845 is something we'll have to experiment with. */
847 queue_pattern (insn
, &other_tail
, insn_elem
->filename
,
850 if (!insn_elem
->split
)
853 /* If the original insn came from a define_insn_and_split,
854 generate a new split to handle the predicated insn. */
855 split
= copy_rtx (insn_elem
->split
->data
);
856 /* Predicate the pattern matched by the split. */
857 pattern
= rtx_alloc (COND_EXEC
);
858 XEXP (pattern
, 0) = pred
;
859 if (XVECLEN (split
, 0) == 1)
861 XEXP (pattern
, 1) = XVECEXP (split
, 0, 0);
862 XVECEXP (split
, 0, 0) = pattern
;
863 PUT_NUM_ELEM (XVEC (split
, 0), 1);
867 XEXP (pattern
, 1) = rtx_alloc (PARALLEL
);
868 XVEC (XEXP (pattern
, 1), 0) = XVEC (split
, 0);
869 XVEC (split
, 0) = rtvec_alloc (1);
870 XVECEXP (split
, 0, 0) = pattern
;
872 /* Predicate all of the insns generated by the split. */
873 for (i
= 0; i
< XVECLEN (split
, 2); i
++)
875 pattern
= rtx_alloc (COND_EXEC
);
876 XEXP (pattern
, 0) = pred
;
877 XEXP (pattern
, 1) = XVECEXP (split
, 2, i
);
878 XVECEXP (split
, 2, i
) = pattern
;
880 /* Add the new split to the queue. */
881 queue_pattern (split
, &other_tail
, read_rtx_filename
,
882 insn_elem
->split
->lineno
);
886 /* If we have any DEFINE_COND_EXEC patterns, expand the DEFINE_INSN
887 patterns appropriately. */
890 process_define_cond_exec (void)
892 struct queue_elem
*elem
;
894 identify_predicable_attribute ();
898 for (elem
= define_cond_exec_queue
; elem
; elem
= elem
->next
)
899 process_one_cond_exec (elem
);
903 save_string (const char *s
, int len
)
905 char *result
= XNEWVEC (char, len
+ 1);
907 memcpy (result
, s
, len
);
913 /* The entry point for initializing the reader. */
916 init_md_reader_args_cb (int argc
, char **argv
, bool (*parse_opt
)(const char *))
922 bool no_more_options
;
923 bool already_read_stdin
;
925 /* Unlock the stdio streams. */
926 unlock_std_streams ();
928 /* First we loop over all the options. */
929 for (i
= 1; i
< argc
; i
++)
931 if (argv
[i
][0] != '-')
937 case 'I': /* Add directory to path for includes. */
939 struct file_name_list
*dirtmp
;
941 dirtmp
= XNEW (struct file_name_list
);
942 dirtmp
->next
= 0; /* New one goes on the end */
943 if (first_dir_md_include
== 0)
944 first_dir_md_include
= dirtmp
;
946 last_dir_md_include
->next
= dirtmp
;
947 last_dir_md_include
= dirtmp
; /* Tail follows the last one */
948 if (argv
[i
][1] == 'I' && argv
[i
][2] != 0)
949 dirtmp
->fname
= argv
[i
] + 2;
950 else if (i
+ 1 == argc
)
951 fatal ("directory name missing after -I option");
953 dirtmp
->fname
= argv
[++i
];
954 if (strlen (dirtmp
->fname
) > max_include_len
)
955 max_include_len
= strlen (dirtmp
->fname
);
960 /* An argument consisting of exactly one dash is a request to
961 read stdin. This will be handled in the second loop. */
965 /* An argument consisting of just two dashes causes option
967 if (argv
[i
][2] == '\0')
968 goto stop_parsing_options
;
971 /* The program may have provided a callback so it can
972 accept its own options. */
973 if (parse_opt
&& parse_opt (argv
[i
]))
976 fatal ("invalid option `%s'", argv
[i
]);
980 stop_parsing_options
:
982 /* Prepare to read input. */
983 condition_table
= htab_create (500, hash_c_test
, cmp_c_test
, NULL
);
984 init_predicate_table ();
985 obstack_init (rtl_obstack
);
988 no_more_options
= false;
989 already_read_stdin
= false;
992 /* Now loop over all input files. */
993 for (i
= 1; i
< argc
; i
++)
995 if (argv
[i
][0] == '-')
997 if (argv
[i
][1] == '\0')
1000 if (already_read_stdin
)
1001 fatal ("cannot read standard input twice");
1004 read_rtx_filename
= in_fname
= "<stdin>";
1005 read_rtx_lineno
= 1;
1007 already_read_stdin
= true;
1009 while (read_rtx (input_file
, &desc
, &lineno
))
1010 process_rtx (desc
, lineno
);
1011 fclose (input_file
);
1014 else if (argv
[i
][1] == '-' && argv
[i
][2] == '\0')
1016 /* No further arguments are to be treated as options. */
1017 no_more_options
= true;
1020 else if (!no_more_options
)
1024 /* If we get here we are looking at a non-option argument, i.e.
1025 a file to be processed. */
1028 lastsl
= strrchr (in_fname
, '/');
1030 base_dir
= save_string (in_fname
, lastsl
- in_fname
+ 1 );
1034 read_rtx_filename
= in_fname
;
1035 read_rtx_lineno
= 1;
1036 input_file
= fopen (in_fname
, "r");
1037 if (input_file
== 0)
1040 return FATAL_EXIT_CODE
;
1043 while (read_rtx (input_file
, &desc
, &lineno
))
1044 process_rtx (desc
, lineno
);
1045 fclose (input_file
);
1048 /* If we get to this point without having seen any files to process,
1049 read standard input now. */
1053 read_rtx_filename
= in_fname
= "<stdin>";
1054 read_rtx_lineno
= 1;
1057 while (read_rtx (input_file
, &desc
, &lineno
))
1058 process_rtx (desc
, lineno
);
1059 fclose (input_file
);
1062 /* Process define_cond_exec patterns. */
1063 if (define_cond_exec_queue
!= NULL
)
1064 process_define_cond_exec ();
1066 return errors
? FATAL_EXIT_CODE
: SUCCESS_EXIT_CODE
;
1069 /* Programs that don't have their own options can use this entry point
1072 init_md_reader_args (int argc
, char **argv
)
1074 return init_md_reader_args_cb (argc
, argv
, 0);
1077 /* The entry point for reading a single rtx from an md file. */
1080 read_md_rtx (int *lineno
, int *seqnr
)
1082 struct queue_elem
**queue
, *elem
;
1087 /* Read all patterns from a given queue before moving on to the next. */
1088 if (define_attr_queue
!= NULL
)
1089 queue
= &define_attr_queue
;
1090 else if (define_pred_queue
!= NULL
)
1091 queue
= &define_pred_queue
;
1092 else if (define_insn_queue
!= NULL
)
1093 queue
= &define_insn_queue
;
1094 else if (other_queue
!= NULL
)
1095 queue
= &other_queue
;
1100 *queue
= elem
->next
;
1102 read_rtx_filename
= elem
->filename
;
1103 *lineno
= elem
->lineno
;
1104 *seqnr
= sequence_num
;
1108 /* Discard insn patterns which we know can never match (because
1109 their C test is provably always false). If insn_elision is
1110 false, our caller needs to see all the patterns. Note that the
1111 elided patterns are never counted by the sequence numbering; it
1112 it is the caller's responsibility, when insn_elision is false, not
1113 to use elided pattern numbers for anything. */
1114 switch (GET_CODE (desc
))
1118 if (maybe_eval_c_test (XSTR (desc
, 2)) != 0)
1120 else if (insn_elision
)
1123 /* *seqnr is used here so the name table will match caller's
1124 idea of insn numbering, whether or not elision is active. */
1125 record_insn_name (*seqnr
, XSTR (desc
, 0));
1129 case DEFINE_PEEPHOLE
:
1130 case DEFINE_PEEPHOLE2
:
1131 if (maybe_eval_c_test (XSTR (desc
, 1)) != 0)
1133 else if (insn_elision
)
1144 /* Helper functions for insn elision. */
1146 /* Compute a hash function of a c_test structure, which is keyed
1147 by its ->expr field. */
1149 hash_c_test (const void *x
)
1151 const struct c_test
*a
= (const struct c_test
*) x
;
1152 const unsigned char *base
, *s
= (const unsigned char *) a
->expr
;
1160 while ((c
= *s
++) != '\0')
1162 hash
+= c
+ (c
<< 17);
1167 hash
+= len
+ (len
<< 17);
1173 /* Compare two c_test expression structures. */
1175 cmp_c_test (const void *x
, const void *y
)
1177 const struct c_test
*a
= (const struct c_test
*) x
;
1178 const struct c_test
*b
= (const struct c_test
*) y
;
1180 return !strcmp (a
->expr
, b
->expr
);
1183 /* Given a string representing a C test expression, look it up in the
1184 condition_table and report whether or not its value is known
1185 at compile time. Returns a tristate: 1 for known true, 0 for
1186 known false, -1 for unknown. */
1188 maybe_eval_c_test (const char *expr
)
1190 const struct c_test
*test
;
1191 struct c_test dummy
;
1197 test
= (const struct c_test
*)htab_find (condition_table
, &dummy
);
1203 /* Record the C test expression EXPR in the condition_table, with
1204 value VAL. Duplicates clobber previous entries. */
1207 add_c_test (const char *expr
, int value
)
1209 struct c_test
*test
;
1214 test
= XNEW (struct c_test
);
1216 test
->value
= value
;
1218 *(htab_find_slot (condition_table
, test
, INSERT
)) = test
;
1221 /* For every C test, call CALLBACK with two arguments: a pointer to
1222 the condition structure and INFO. Stops when CALLBACK returns zero. */
1224 traverse_c_tests (htab_trav callback
, void *info
)
1226 if (condition_table
)
1227 htab_traverse (condition_table
, callback
, info
);
1231 /* Given a string, return the number of comma-separated elements in it.
1232 Return 0 for the null string. */
1234 n_comma_elts (const char *s
)
1241 for (n
= 1; *s
; s
++)
1248 /* Given a pointer to a (char *), return a pointer to the beginning of the
1249 next comma-separated element in the string. Advance the pointer given
1250 to the end of that element. Return NULL if at end of string. Caller
1251 is responsible for copying the string if necessary. White space between
1252 a comma and an element is ignored. */
1255 scan_comma_elt (const char **pstr
)
1258 const char *p
= *pstr
;
1270 while (*p
!= ',' && *p
!= '\0')
1277 /* Helper functions for define_predicate and define_special_predicate
1278 processing. Shared between genrecog.c and genpreds.c. */
1280 static htab_t predicate_table
;
1281 struct pred_data
*first_predicate
;
1282 static struct pred_data
**last_predicate
= &first_predicate
;
1285 hash_struct_pred_data (const void *ptr
)
1287 return htab_hash_string (((const struct pred_data
*)ptr
)->name
);
1291 eq_struct_pred_data (const void *a
, const void *b
)
1293 return !strcmp (((const struct pred_data
*)a
)->name
,
1294 ((const struct pred_data
*)b
)->name
);
1298 lookup_predicate (const char *name
)
1300 struct pred_data key
;
1302 return (struct pred_data
*) htab_find (predicate_table
, &key
);
1305 /* Record that predicate PRED can accept CODE. */
1308 add_predicate_code (struct pred_data
*pred
, enum rtx_code code
)
1310 if (!pred
->codes
[code
])
1313 pred
->codes
[code
] = true;
1315 if (GET_RTX_CLASS (code
) != RTX_CONST_OBJ
)
1316 pred
->allows_non_const
= true;
1323 && code
!= STRICT_LOW_PART
)
1324 pred
->allows_non_lvalue
= true;
1326 if (pred
->num_codes
== 1)
1327 pred
->singleton
= code
;
1328 else if (pred
->num_codes
== 2)
1329 pred
->singleton
= UNKNOWN
;
1334 add_predicate (struct pred_data
*pred
)
1336 void **slot
= htab_find_slot (predicate_table
, pred
, INSERT
);
1339 error ("duplicate predicate definition for '%s'", pred
->name
);
1343 *last_predicate
= pred
;
1344 last_predicate
= &pred
->next
;
1347 /* This array gives the initial content of the predicate table. It
1348 has entries for all predicates defined in recog.c. */
1350 struct std_pred_table
1354 bool allows_const_p
;
1355 RTX_CODE codes
[NUM_RTX_CODE
];
1358 static const struct std_pred_table std_preds
[] = {
1359 {"general_operand", false, true, {SUBREG
, REG
, MEM
}},
1360 {"address_operand", true, true, {SUBREG
, REG
, MEM
, PLUS
, MINUS
, MULT
}},
1361 {"register_operand", false, false, {SUBREG
, REG
}},
1362 {"pmode_register_operand", true, false, {SUBREG
, REG
}},
1363 {"scratch_operand", false, false, {SCRATCH
, REG
}},
1364 {"immediate_operand", false, true, {UNKNOWN
}},
1365 {"const_int_operand", false, false, {CONST_INT
}},
1366 {"const_double_operand", false, false, {CONST_INT
, CONST_DOUBLE
}},
1367 {"nonimmediate_operand", false, false, {SUBREG
, REG
, MEM
}},
1368 {"nonmemory_operand", false, true, {SUBREG
, REG
}},
1369 {"push_operand", false, false, {MEM
}},
1370 {"pop_operand", false, false, {MEM
}},
1371 {"memory_operand", false, false, {SUBREG
, MEM
}},
1372 {"indirect_operand", false, false, {SUBREG
, MEM
}},
1373 {"ordered_comparison_operator", false, false, {EQ
, NE
,
1375 LEU
, LTU
, GEU
, GTU
}},
1376 {"comparison_operator", false, false, {EQ
, NE
,
1383 #define NUM_KNOWN_STD_PREDS ARRAY_SIZE (std_preds)
1385 /* Initialize the table of predicate definitions, starting with
1386 the information we have on generic predicates. */
1389 init_predicate_table (void)
1392 struct pred_data
*pred
;
1394 predicate_table
= htab_create_alloc (37, hash_struct_pred_data
,
1395 eq_struct_pred_data
, 0,
1398 for (i
= 0; i
< NUM_KNOWN_STD_PREDS
; i
++)
1400 pred
= XCNEW (struct pred_data
);
1401 pred
->name
= std_preds
[i
].name
;
1402 pred
->special
= std_preds
[i
].special
;
1404 for (j
= 0; std_preds
[i
].codes
[j
] != 0; j
++)
1405 add_predicate_code (pred
, std_preds
[i
].codes
[j
]);
1407 if (std_preds
[i
].allows_const_p
)
1408 for (j
= 0; j
< NUM_RTX_CODE
; j
++)
1409 if (GET_RTX_CLASS (j
) == RTX_CONST_OBJ
)
1410 add_predicate_code (pred
, (enum rtx_code
) j
);
1412 add_predicate (pred
);
1416 /* These functions allow linkage with print-rtl.c. Also, some generators
1417 like to annotate their output with insn names. */
1419 /* Holds an array of names indexed by insn_code_number. */
1420 static char **insn_name_ptr
= 0;
1421 static int insn_name_ptr_size
= 0;
1424 get_insn_name (int code
)
1426 if (code
< insn_name_ptr_size
)
1427 return insn_name_ptr
[code
];
1433 record_insn_name (int code
, const char *name
)
1435 static const char *last_real_name
= "insn";
1436 static int last_real_code
= 0;
1439 if (insn_name_ptr_size
<= code
)
1442 new_size
= (insn_name_ptr_size
? insn_name_ptr_size
* 2 : 512);
1443 insn_name_ptr
= XRESIZEVEC (char *, insn_name_ptr
, new_size
);
1444 memset (insn_name_ptr
+ insn_name_ptr_size
, 0,
1445 sizeof(char *) * (new_size
- insn_name_ptr_size
));
1446 insn_name_ptr_size
= new_size
;
1449 if (!name
|| name
[0] == '\0')
1451 new_name
= XNEWVAR (char, strlen (last_real_name
) + 10);
1452 sprintf (new_name
, "%s+%d", last_real_name
, code
- last_real_code
);
1456 last_real_name
= new_name
= xstrdup (name
);
1457 last_real_code
= code
;
1460 insn_name_ptr
[code
] = new_name
;