Mercurial > hg > CbC > CbC_gcc
comparison gcc/genrecog.c @ 0:a06113de4d67
first commit
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2009 14:47:48 +0900 |
parents | |
children | 77e2b8dfacca |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:a06113de4d67 |
---|---|
1 /* Generate code from machine description to recognize rtl as insns. | |
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1997, 1998, | |
3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008 | |
4 Free Software Foundation, Inc. | |
5 | |
6 This file is part of GCC. | |
7 | |
8 GCC is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by | |
10 the Free Software Foundation; either version 3, or (at your option) | |
11 any later version. | |
12 | |
13 GCC is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | |
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public | |
16 License for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with GCC; see the file COPYING3. If not see | |
20 <http://www.gnu.org/licenses/>. */ | |
21 | |
22 | |
23 /* This program is used to produce insn-recog.c, which contains a | |
24 function called `recog' plus its subroutines. These functions | |
25 contain a decision tree that recognizes whether an rtx, the | |
26 argument given to recog, is a valid instruction. | |
27 | |
28 recog returns -1 if the rtx is not valid. If the rtx is valid, | |
29 recog returns a nonnegative number which is the insn code number | |
30 for the pattern that matched. This is the same as the order in the | |
31 machine description of the entry that matched. This number can be | |
32 used as an index into various insn_* tables, such as insn_template, | |
33 insn_outfun, and insn_n_operands (found in insn-output.c). | |
34 | |
35 The third argument to recog is an optional pointer to an int. If | |
36 present, recog will accept a pattern if it matches except for | |
37 missing CLOBBER expressions at the end. In that case, the value | |
38 pointed to by the optional pointer will be set to the number of | |
39 CLOBBERs that need to be added (it should be initialized to zero by | |
40 the caller). If it is set nonzero, the caller should allocate a | |
41 PARALLEL of the appropriate size, copy the initial entries, and | |
42 call add_clobbers (found in insn-emit.c) to fill in the CLOBBERs. | |
43 | |
44 This program also generates the function `split_insns', which | |
45 returns 0 if the rtl could not be split, or it returns the split | |
46 rtl as an INSN list. | |
47 | |
48 This program also generates the function `peephole2_insns', which | |
49 returns 0 if the rtl could not be matched. If there was a match, | |
50 the new rtl is returned in an INSN list, and LAST_INSN will point | |
51 to the last recognized insn in the old sequence. */ | |
52 | |
53 #include "bconfig.h" | |
54 #include "system.h" | |
55 #include "coretypes.h" | |
56 #include "tm.h" | |
57 #include "rtl.h" | |
58 #include "errors.h" | |
59 #include "gensupport.h" | |
60 | |
61 #define OUTPUT_LABEL(INDENT_STRING, LABEL_NUMBER) \ | |
62 printf("%sL%d: ATTRIBUTE_UNUSED_LABEL\n", (INDENT_STRING), (LABEL_NUMBER)) | |
63 | |
64 /* A listhead of decision trees. The alternatives to a node are kept | |
65 in a doubly-linked list so we can easily add nodes to the proper | |
66 place when merging. */ | |
67 | |
68 struct decision_head | |
69 { | |
70 struct decision *first; | |
71 struct decision *last; | |
72 }; | |
73 | |
74 /* A single test. The two accept types aren't tests per-se, but | |
75 their equality (or lack thereof) does affect tree merging so | |
76 it is convenient to keep them here. */ | |
77 | |
78 struct decision_test | |
79 { | |
80 /* A linked list through the tests attached to a node. */ | |
81 struct decision_test *next; | |
82 | |
83 /* These types are roughly in the order in which we'd like to test them. */ | |
84 enum decision_type | |
85 { | |
86 DT_num_insns, | |
87 DT_mode, DT_code, DT_veclen, | |
88 DT_elt_zero_int, DT_elt_one_int, DT_elt_zero_wide, DT_elt_zero_wide_safe, | |
89 DT_const_int, | |
90 DT_veclen_ge, DT_dup, DT_pred, DT_c_test, | |
91 DT_accept_op, DT_accept_insn | |
92 } type; | |
93 | |
94 union | |
95 { | |
96 int num_insns; /* Number if insn in a define_peephole2. */ | |
97 enum machine_mode mode; /* Machine mode of node. */ | |
98 RTX_CODE code; /* Code to test. */ | |
99 | |
100 struct | |
101 { | |
102 const char *name; /* Predicate to call. */ | |
103 const struct pred_data *data; | |
104 /* Optimization hints for this predicate. */ | |
105 enum machine_mode mode; /* Machine mode for node. */ | |
106 } pred; | |
107 | |
108 const char *c_test; /* Additional test to perform. */ | |
109 int veclen; /* Length of vector. */ | |
110 int dup; /* Number of operand to compare against. */ | |
111 HOST_WIDE_INT intval; /* Value for XINT for XWINT. */ | |
112 int opno; /* Operand number matched. */ | |
113 | |
114 struct { | |
115 int code_number; /* Insn number matched. */ | |
116 int lineno; /* Line number of the insn. */ | |
117 int num_clobbers_to_add; /* Number of CLOBBERs to be added. */ | |
118 } insn; | |
119 } u; | |
120 }; | |
121 | |
122 /* Data structure for decision tree for recognizing legitimate insns. */ | |
123 | |
124 struct decision | |
125 { | |
126 struct decision_head success; /* Nodes to test on success. */ | |
127 struct decision *next; /* Node to test on failure. */ | |
128 struct decision *prev; /* Node whose failure tests us. */ | |
129 struct decision *afterward; /* Node to test on success, | |
130 but failure of successor nodes. */ | |
131 | |
132 const char *position; /* String denoting position in pattern. */ | |
133 | |
134 struct decision_test *tests; /* The tests for this node. */ | |
135 | |
136 int number; /* Node number, used for labels */ | |
137 int subroutine_number; /* Number of subroutine this node starts */ | |
138 int need_label; /* Label needs to be output. */ | |
139 }; | |
140 | |
141 #define SUBROUTINE_THRESHOLD 100 | |
142 | |
143 static int next_subroutine_number; | |
144 | |
145 /* We can write three types of subroutines: One for insn recognition, | |
146 one to split insns, and one for peephole-type optimizations. This | |
147 defines which type is being written. */ | |
148 | |
149 enum routine_type { | |
150 RECOG, SPLIT, PEEPHOLE2 | |
151 }; | |
152 | |
153 #define IS_SPLIT(X) ((X) != RECOG) | |
154 | |
155 /* Next available node number for tree nodes. */ | |
156 | |
157 static int next_number; | |
158 | |
159 /* Next number to use as an insn_code. */ | |
160 | |
161 static int next_insn_code; | |
162 | |
163 /* Record the highest depth we ever have so we know how many variables to | |
164 allocate in each subroutine we make. */ | |
165 | |
166 static int max_depth; | |
167 | |
168 /* The line number of the start of the pattern currently being processed. */ | |
169 static int pattern_lineno; | |
170 | |
171 /* Count of errors. */ | |
172 static int error_count; | |
173 | |
174 /* Predicate handling. | |
175 | |
176 We construct from the machine description a table mapping each | |
177 predicate to a list of the rtl codes it can possibly match. The | |
178 function 'maybe_both_true' uses it to deduce that there are no | |
179 expressions that can be matches by certain pairs of tree nodes. | |
180 Also, if a predicate can match only one code, we can hardwire that | |
181 code into the node testing the predicate. | |
182 | |
183 Some predicates are flagged as special. validate_pattern will not | |
184 warn about modeless match_operand expressions if they have a | |
185 special predicate. Predicates that allow only constants are also | |
186 treated as special, for this purpose. | |
187 | |
188 validate_pattern will warn about predicates that allow non-lvalues | |
189 when they appear in destination operands. | |
190 | |
191 Calculating the set of rtx codes that can possibly be accepted by a | |
192 predicate expression EXP requires a three-state logic: any given | |
193 subexpression may definitively accept a code C (Y), definitively | |
194 reject a code C (N), or may have an indeterminate effect (I). N | |
195 and I is N; Y or I is Y; Y and I, N or I are both I. Here are full | |
196 truth tables. | |
197 | |
198 a b a&b a|b | |
199 Y Y Y Y | |
200 N Y N Y | |
201 N N N N | |
202 I Y I Y | |
203 I N N I | |
204 I I I I | |
205 | |
206 We represent Y with 1, N with 0, I with 2. If any code is left in | |
207 an I state by the complete expression, we must assume that that | |
208 code can be accepted. */ | |
209 | |
210 #define N 0 | |
211 #define Y 1 | |
212 #define I 2 | |
213 | |
214 #define TRISTATE_AND(a,b) \ | |
215 ((a) == I ? ((b) == N ? N : I) : \ | |
216 (b) == I ? ((a) == N ? N : I) : \ | |
217 (a) && (b)) | |
218 | |
219 #define TRISTATE_OR(a,b) \ | |
220 ((a) == I ? ((b) == Y ? Y : I) : \ | |
221 (b) == I ? ((a) == Y ? Y : I) : \ | |
222 (a) || (b)) | |
223 | |
224 #define TRISTATE_NOT(a) \ | |
225 ((a) == I ? I : !(a)) | |
226 | |
227 /* 0 means no warning about that code yet, 1 means warned. */ | |
228 static char did_you_mean_codes[NUM_RTX_CODE]; | |
229 | |
230 /* Recursively calculate the set of rtx codes accepted by the | |
231 predicate expression EXP, writing the result to CODES. */ | |
232 static void | |
233 compute_predicate_codes (rtx exp, char codes[NUM_RTX_CODE]) | |
234 { | |
235 char op0_codes[NUM_RTX_CODE]; | |
236 char op1_codes[NUM_RTX_CODE]; | |
237 char op2_codes[NUM_RTX_CODE]; | |
238 int i; | |
239 | |
240 switch (GET_CODE (exp)) | |
241 { | |
242 case AND: | |
243 compute_predicate_codes (XEXP (exp, 0), op0_codes); | |
244 compute_predicate_codes (XEXP (exp, 1), op1_codes); | |
245 for (i = 0; i < NUM_RTX_CODE; i++) | |
246 codes[i] = TRISTATE_AND (op0_codes[i], op1_codes[i]); | |
247 break; | |
248 | |
249 case IOR: | |
250 compute_predicate_codes (XEXP (exp, 0), op0_codes); | |
251 compute_predicate_codes (XEXP (exp, 1), op1_codes); | |
252 for (i = 0; i < NUM_RTX_CODE; i++) | |
253 codes[i] = TRISTATE_OR (op0_codes[i], op1_codes[i]); | |
254 break; | |
255 case NOT: | |
256 compute_predicate_codes (XEXP (exp, 0), op0_codes); | |
257 for (i = 0; i < NUM_RTX_CODE; i++) | |
258 codes[i] = TRISTATE_NOT (op0_codes[i]); | |
259 break; | |
260 | |
261 case IF_THEN_ELSE: | |
262 /* a ? b : c accepts the same codes as (a & b) | (!a & c). */ | |
263 compute_predicate_codes (XEXP (exp, 0), op0_codes); | |
264 compute_predicate_codes (XEXP (exp, 1), op1_codes); | |
265 compute_predicate_codes (XEXP (exp, 2), op2_codes); | |
266 for (i = 0; i < NUM_RTX_CODE; i++) | |
267 codes[i] = TRISTATE_OR (TRISTATE_AND (op0_codes[i], op1_codes[i]), | |
268 TRISTATE_AND (TRISTATE_NOT (op0_codes[i]), | |
269 op2_codes[i])); | |
270 break; | |
271 | |
272 case MATCH_CODE: | |
273 /* MATCH_CODE allows a specified list of codes. However, if it | |
274 does not apply to the top level of the expression, it does not | |
275 constrain the set of codes for the top level. */ | |
276 if (XSTR (exp, 1)[0] != '\0') | |
277 { | |
278 memset (codes, Y, NUM_RTX_CODE); | |
279 break; | |
280 } | |
281 | |
282 memset (codes, N, NUM_RTX_CODE); | |
283 { | |
284 const char *next_code = XSTR (exp, 0); | |
285 const char *code; | |
286 | |
287 if (*next_code == '\0') | |
288 { | |
289 message_with_line (pattern_lineno, "empty match_code expression"); | |
290 error_count++; | |
291 break; | |
292 } | |
293 | |
294 while ((code = scan_comma_elt (&next_code)) != 0) | |
295 { | |
296 size_t n = next_code - code; | |
297 int found_it = 0; | |
298 | |
299 for (i = 0; i < NUM_RTX_CODE; i++) | |
300 if (!strncmp (code, GET_RTX_NAME (i), n) | |
301 && GET_RTX_NAME (i)[n] == '\0') | |
302 { | |
303 codes[i] = Y; | |
304 found_it = 1; | |
305 break; | |
306 } | |
307 if (!found_it) | |
308 { | |
309 message_with_line (pattern_lineno, "match_code \"%.*s\" matches nothing", | |
310 (int) n, code); | |
311 error_count ++; | |
312 for (i = 0; i < NUM_RTX_CODE; i++) | |
313 if (!strncasecmp (code, GET_RTX_NAME (i), n) | |
314 && GET_RTX_NAME (i)[n] == '\0' | |
315 && !did_you_mean_codes[i]) | |
316 { | |
317 did_you_mean_codes[i] = 1; | |
318 message_with_line (pattern_lineno, "(did you mean \"%s\"?)", GET_RTX_NAME (i)); | |
319 } | |
320 } | |
321 | |
322 } | |
323 } | |
324 break; | |
325 | |
326 case MATCH_OPERAND: | |
327 /* MATCH_OPERAND disallows the set of codes that the named predicate | |
328 disallows, and is indeterminate for the codes that it does allow. */ | |
329 { | |
330 struct pred_data *p = lookup_predicate (XSTR (exp, 1)); | |
331 if (!p) | |
332 { | |
333 message_with_line (pattern_lineno, | |
334 "reference to unknown predicate '%s'", | |
335 XSTR (exp, 1)); | |
336 error_count++; | |
337 break; | |
338 } | |
339 for (i = 0; i < NUM_RTX_CODE; i++) | |
340 codes[i] = p->codes[i] ? I : N; | |
341 } | |
342 break; | |
343 | |
344 | |
345 case MATCH_TEST: | |
346 /* (match_test WHATEVER) is completely indeterminate. */ | |
347 memset (codes, I, NUM_RTX_CODE); | |
348 break; | |
349 | |
350 default: | |
351 message_with_line (pattern_lineno, | |
352 "'%s' cannot be used in a define_predicate expression", | |
353 GET_RTX_NAME (GET_CODE (exp))); | |
354 error_count++; | |
355 memset (codes, I, NUM_RTX_CODE); | |
356 break; | |
357 } | |
358 } | |
359 | |
360 #undef TRISTATE_OR | |
361 #undef TRISTATE_AND | |
362 #undef TRISTATE_NOT | |
363 | |
364 /* Process a define_predicate expression: compute the set of predicates | |
365 that can be matched, and record this as a known predicate. */ | |
366 static void | |
367 process_define_predicate (rtx desc) | |
368 { | |
369 struct pred_data *pred = XCNEW (struct pred_data); | |
370 char codes[NUM_RTX_CODE]; | |
371 int i; | |
372 | |
373 pred->name = XSTR (desc, 0); | |
374 if (GET_CODE (desc) == DEFINE_SPECIAL_PREDICATE) | |
375 pred->special = 1; | |
376 | |
377 compute_predicate_codes (XEXP (desc, 1), codes); | |
378 | |
379 for (i = 0; i < NUM_RTX_CODE; i++) | |
380 if (codes[i] != N) | |
381 add_predicate_code (pred, i); | |
382 | |
383 add_predicate (pred); | |
384 } | |
385 #undef I | |
386 #undef N | |
387 #undef Y | |
388 | |
389 | |
390 static struct decision *new_decision | |
391 (const char *, struct decision_head *); | |
392 static struct decision_test *new_decision_test | |
393 (enum decision_type, struct decision_test ***); | |
394 static rtx find_operand | |
395 (rtx, int, rtx); | |
396 static rtx find_matching_operand | |
397 (rtx, int); | |
398 static void validate_pattern | |
399 (rtx, rtx, rtx, int); | |
400 static struct decision *add_to_sequence | |
401 (rtx, struct decision_head *, const char *, enum routine_type, int); | |
402 | |
403 static int maybe_both_true_2 | |
404 (struct decision_test *, struct decision_test *); | |
405 static int maybe_both_true_1 | |
406 (struct decision_test *, struct decision_test *); | |
407 static int maybe_both_true | |
408 (struct decision *, struct decision *, int); | |
409 | |
410 static int nodes_identical_1 | |
411 (struct decision_test *, struct decision_test *); | |
412 static int nodes_identical | |
413 (struct decision *, struct decision *); | |
414 static void merge_accept_insn | |
415 (struct decision *, struct decision *); | |
416 static void merge_trees | |
417 (struct decision_head *, struct decision_head *); | |
418 | |
419 static void factor_tests | |
420 (struct decision_head *); | |
421 static void simplify_tests | |
422 (struct decision_head *); | |
423 static int break_out_subroutines | |
424 (struct decision_head *, int); | |
425 static void find_afterward | |
426 (struct decision_head *, struct decision *); | |
427 | |
428 static void change_state | |
429 (const char *, const char *, const char *); | |
430 static void print_code | |
431 (enum rtx_code); | |
432 static void write_afterward | |
433 (struct decision *, struct decision *, const char *); | |
434 static struct decision *write_switch | |
435 (struct decision *, int); | |
436 static void write_cond | |
437 (struct decision_test *, int, enum routine_type); | |
438 static void write_action | |
439 (struct decision *, struct decision_test *, int, int, | |
440 struct decision *, enum routine_type); | |
441 static int is_unconditional | |
442 (struct decision_test *, enum routine_type); | |
443 static int write_node | |
444 (struct decision *, int, enum routine_type); | |
445 static void write_tree_1 | |
446 (struct decision_head *, int, enum routine_type); | |
447 static void write_tree | |
448 (struct decision_head *, const char *, enum routine_type, int); | |
449 static void write_subroutine | |
450 (struct decision_head *, enum routine_type); | |
451 static void write_subroutines | |
452 (struct decision_head *, enum routine_type); | |
453 static void write_header | |
454 (void); | |
455 | |
456 static struct decision_head make_insn_sequence | |
457 (rtx, enum routine_type); | |
458 static void process_tree | |
459 (struct decision_head *, enum routine_type); | |
460 | |
461 static void debug_decision_0 | |
462 (struct decision *, int, int); | |
463 static void debug_decision_1 | |
464 (struct decision *, int); | |
465 static void debug_decision_2 | |
466 (struct decision_test *); | |
467 extern void debug_decision | |
468 (struct decision *); | |
469 extern void debug_decision_list | |
470 (struct decision *); | |
471 | |
472 /* Create a new node in sequence after LAST. */ | |
473 | |
474 static struct decision * | |
475 new_decision (const char *position, struct decision_head *last) | |
476 { | |
477 struct decision *new_decision = XCNEW (struct decision); | |
478 | |
479 new_decision->success = *last; | |
480 new_decision->position = xstrdup (position); | |
481 new_decision->number = next_number++; | |
482 | |
483 last->first = last->last = new_decision; | |
484 return new_decision; | |
485 } | |
486 | |
487 /* Create a new test and link it in at PLACE. */ | |
488 | |
489 static struct decision_test * | |
490 new_decision_test (enum decision_type type, struct decision_test ***pplace) | |
491 { | |
492 struct decision_test **place = *pplace; | |
493 struct decision_test *test; | |
494 | |
495 test = XNEW (struct decision_test); | |
496 test->next = *place; | |
497 test->type = type; | |
498 *place = test; | |
499 | |
500 place = &test->next; | |
501 *pplace = place; | |
502 | |
503 return test; | |
504 } | |
505 | |
506 /* Search for and return operand N, stop when reaching node STOP. */ | |
507 | |
508 static rtx | |
509 find_operand (rtx pattern, int n, rtx stop) | |
510 { | |
511 const char *fmt; | |
512 RTX_CODE code; | |
513 int i, j, len; | |
514 rtx r; | |
515 | |
516 if (pattern == stop) | |
517 return stop; | |
518 | |
519 code = GET_CODE (pattern); | |
520 if ((code == MATCH_SCRATCH | |
521 || code == MATCH_OPERAND | |
522 || code == MATCH_OPERATOR | |
523 || code == MATCH_PARALLEL) | |
524 && XINT (pattern, 0) == n) | |
525 return pattern; | |
526 | |
527 fmt = GET_RTX_FORMAT (code); | |
528 len = GET_RTX_LENGTH (code); | |
529 for (i = 0; i < len; i++) | |
530 { | |
531 switch (fmt[i]) | |
532 { | |
533 case 'e': case 'u': | |
534 if ((r = find_operand (XEXP (pattern, i), n, stop)) != NULL_RTX) | |
535 return r; | |
536 break; | |
537 | |
538 case 'V': | |
539 if (! XVEC (pattern, i)) | |
540 break; | |
541 /* Fall through. */ | |
542 | |
543 case 'E': | |
544 for (j = 0; j < XVECLEN (pattern, i); j++) | |
545 if ((r = find_operand (XVECEXP (pattern, i, j), n, stop)) | |
546 != NULL_RTX) | |
547 return r; | |
548 break; | |
549 | |
550 case 'i': case 'w': case '0': case 's': | |
551 break; | |
552 | |
553 default: | |
554 gcc_unreachable (); | |
555 } | |
556 } | |
557 | |
558 return NULL; | |
559 } | |
560 | |
561 /* Search for and return operand M, such that it has a matching | |
562 constraint for operand N. */ | |
563 | |
564 static rtx | |
565 find_matching_operand (rtx pattern, int n) | |
566 { | |
567 const char *fmt; | |
568 RTX_CODE code; | |
569 int i, j, len; | |
570 rtx r; | |
571 | |
572 code = GET_CODE (pattern); | |
573 if (code == MATCH_OPERAND | |
574 && (XSTR (pattern, 2)[0] == '0' + n | |
575 || (XSTR (pattern, 2)[0] == '%' | |
576 && XSTR (pattern, 2)[1] == '0' + n))) | |
577 return pattern; | |
578 | |
579 fmt = GET_RTX_FORMAT (code); | |
580 len = GET_RTX_LENGTH (code); | |
581 for (i = 0; i < len; i++) | |
582 { | |
583 switch (fmt[i]) | |
584 { | |
585 case 'e': case 'u': | |
586 if ((r = find_matching_operand (XEXP (pattern, i), n))) | |
587 return r; | |
588 break; | |
589 | |
590 case 'V': | |
591 if (! XVEC (pattern, i)) | |
592 break; | |
593 /* Fall through. */ | |
594 | |
595 case 'E': | |
596 for (j = 0; j < XVECLEN (pattern, i); j++) | |
597 if ((r = find_matching_operand (XVECEXP (pattern, i, j), n))) | |
598 return r; | |
599 break; | |
600 | |
601 case 'i': case 'w': case '0': case 's': | |
602 break; | |
603 | |
604 default: | |
605 gcc_unreachable (); | |
606 } | |
607 } | |
608 | |
609 return NULL; | |
610 } | |
611 | |
612 | |
613 /* Check for various errors in patterns. SET is nonnull for a destination, | |
614 and is the complete set pattern. SET_CODE is '=' for normal sets, and | |
615 '+' within a context that requires in-out constraints. */ | |
616 | |
617 static void | |
618 validate_pattern (rtx pattern, rtx insn, rtx set, int set_code) | |
619 { | |
620 const char *fmt; | |
621 RTX_CODE code; | |
622 size_t i, len; | |
623 int j; | |
624 | |
625 code = GET_CODE (pattern); | |
626 switch (code) | |
627 { | |
628 case MATCH_SCRATCH: | |
629 return; | |
630 case MATCH_DUP: | |
631 case MATCH_OP_DUP: | |
632 case MATCH_PAR_DUP: | |
633 if (find_operand (insn, XINT (pattern, 0), pattern) == pattern) | |
634 { | |
635 message_with_line (pattern_lineno, | |
636 "operand %i duplicated before defined", | |
637 XINT (pattern, 0)); | |
638 error_count++; | |
639 } | |
640 break; | |
641 case MATCH_OPERAND: | |
642 case MATCH_OPERATOR: | |
643 { | |
644 const char *pred_name = XSTR (pattern, 1); | |
645 const struct pred_data *pred; | |
646 const char *c_test; | |
647 | |
648 if (GET_CODE (insn) == DEFINE_INSN) | |
649 c_test = XSTR (insn, 2); | |
650 else | |
651 c_test = XSTR (insn, 1); | |
652 | |
653 if (pred_name[0] != 0) | |
654 { | |
655 pred = lookup_predicate (pred_name); | |
656 if (!pred) | |
657 message_with_line (pattern_lineno, | |
658 "warning: unknown predicate '%s'", | |
659 pred_name); | |
660 } | |
661 else | |
662 pred = 0; | |
663 | |
664 if (code == MATCH_OPERAND) | |
665 { | |
666 const char constraints0 = XSTR (pattern, 2)[0]; | |
667 | |
668 /* In DEFINE_EXPAND, DEFINE_SPLIT, and DEFINE_PEEPHOLE2, we | |
669 don't use the MATCH_OPERAND constraint, only the predicate. | |
670 This is confusing to folks doing new ports, so help them | |
671 not make the mistake. */ | |
672 if (GET_CODE (insn) == DEFINE_EXPAND | |
673 || GET_CODE (insn) == DEFINE_SPLIT | |
674 || GET_CODE (insn) == DEFINE_PEEPHOLE2) | |
675 { | |
676 if (constraints0) | |
677 message_with_line (pattern_lineno, | |
678 "warning: constraints not supported in %s", | |
679 rtx_name[GET_CODE (insn)]); | |
680 } | |
681 | |
682 /* A MATCH_OPERAND that is a SET should have an output reload. */ | |
683 else if (set && constraints0) | |
684 { | |
685 if (set_code == '+') | |
686 { | |
687 if (constraints0 == '+') | |
688 ; | |
689 /* If we've only got an output reload for this operand, | |
690 we'd better have a matching input operand. */ | |
691 else if (constraints0 == '=' | |
692 && find_matching_operand (insn, XINT (pattern, 0))) | |
693 ; | |
694 else | |
695 { | |
696 message_with_line (pattern_lineno, | |
697 "operand %d missing in-out reload", | |
698 XINT (pattern, 0)); | |
699 error_count++; | |
700 } | |
701 } | |
702 else if (constraints0 != '=' && constraints0 != '+') | |
703 { | |
704 message_with_line (pattern_lineno, | |
705 "operand %d missing output reload", | |
706 XINT (pattern, 0)); | |
707 error_count++; | |
708 } | |
709 } | |
710 } | |
711 | |
712 /* Allowing non-lvalues in destinations -- particularly CONST_INT -- | |
713 while not likely to occur at runtime, results in less efficient | |
714 code from insn-recog.c. */ | |
715 if (set && pred && pred->allows_non_lvalue) | |
716 message_with_line (pattern_lineno, | |
717 "warning: destination operand %d " | |
718 "allows non-lvalue", | |
719 XINT (pattern, 0)); | |
720 | |
721 /* A modeless MATCH_OPERAND can be handy when we can check for | |
722 multiple modes in the c_test. In most other cases, it is a | |
723 mistake. Only DEFINE_INSN is eligible, since SPLIT and | |
724 PEEP2 can FAIL within the output pattern. Exclude special | |
725 predicates, which check the mode themselves. Also exclude | |
726 predicates that allow only constants. Exclude the SET_DEST | |
727 of a call instruction, as that is a common idiom. */ | |
728 | |
729 if (GET_MODE (pattern) == VOIDmode | |
730 && code == MATCH_OPERAND | |
731 && GET_CODE (insn) == DEFINE_INSN | |
732 && pred | |
733 && !pred->special | |
734 && pred->allows_non_const | |
735 && strstr (c_test, "operands") == NULL | |
736 && ! (set | |
737 && GET_CODE (set) == SET | |
738 && GET_CODE (SET_SRC (set)) == CALL)) | |
739 message_with_line (pattern_lineno, | |
740 "warning: operand %d missing mode?", | |
741 XINT (pattern, 0)); | |
742 return; | |
743 } | |
744 | |
745 case SET: | |
746 { | |
747 enum machine_mode dmode, smode; | |
748 rtx dest, src; | |
749 | |
750 dest = SET_DEST (pattern); | |
751 src = SET_SRC (pattern); | |
752 | |
753 /* STRICT_LOW_PART is a wrapper. Its argument is the real | |
754 destination, and it's mode should match the source. */ | |
755 if (GET_CODE (dest) == STRICT_LOW_PART) | |
756 dest = XEXP (dest, 0); | |
757 | |
758 /* Find the referent for a DUP. */ | |
759 | |
760 if (GET_CODE (dest) == MATCH_DUP | |
761 || GET_CODE (dest) == MATCH_OP_DUP | |
762 || GET_CODE (dest) == MATCH_PAR_DUP) | |
763 dest = find_operand (insn, XINT (dest, 0), NULL); | |
764 | |
765 if (GET_CODE (src) == MATCH_DUP | |
766 || GET_CODE (src) == MATCH_OP_DUP | |
767 || GET_CODE (src) == MATCH_PAR_DUP) | |
768 src = find_operand (insn, XINT (src, 0), NULL); | |
769 | |
770 dmode = GET_MODE (dest); | |
771 smode = GET_MODE (src); | |
772 | |
773 /* The mode of an ADDRESS_OPERAND is the mode of the memory | |
774 reference, not the mode of the address. */ | |
775 if (GET_CODE (src) == MATCH_OPERAND | |
776 && ! strcmp (XSTR (src, 1), "address_operand")) | |
777 ; | |
778 | |
779 /* The operands of a SET must have the same mode unless one | |
780 is VOIDmode. */ | |
781 else if (dmode != VOIDmode && smode != VOIDmode && dmode != smode) | |
782 { | |
783 message_with_line (pattern_lineno, | |
784 "mode mismatch in set: %smode vs %smode", | |
785 GET_MODE_NAME (dmode), GET_MODE_NAME (smode)); | |
786 error_count++; | |
787 } | |
788 | |
789 /* If only one of the operands is VOIDmode, and PC or CC0 is | |
790 not involved, it's probably a mistake. */ | |
791 else if (dmode != smode | |
792 && GET_CODE (dest) != PC | |
793 && GET_CODE (dest) != CC0 | |
794 && GET_CODE (src) != PC | |
795 && GET_CODE (src) != CC0 | |
796 && GET_CODE (src) != CONST_INT) | |
797 { | |
798 const char *which; | |
799 which = (dmode == VOIDmode ? "destination" : "source"); | |
800 message_with_line (pattern_lineno, | |
801 "warning: %s missing a mode?", which); | |
802 } | |
803 | |
804 if (dest != SET_DEST (pattern)) | |
805 validate_pattern (dest, insn, pattern, '='); | |
806 validate_pattern (SET_DEST (pattern), insn, pattern, '='); | |
807 validate_pattern (SET_SRC (pattern), insn, NULL_RTX, 0); | |
808 return; | |
809 } | |
810 | |
811 case CLOBBER: | |
812 validate_pattern (SET_DEST (pattern), insn, pattern, '='); | |
813 return; | |
814 | |
815 case ZERO_EXTRACT: | |
816 validate_pattern (XEXP (pattern, 0), insn, set, set ? '+' : 0); | |
817 validate_pattern (XEXP (pattern, 1), insn, NULL_RTX, 0); | |
818 validate_pattern (XEXP (pattern, 2), insn, NULL_RTX, 0); | |
819 return; | |
820 | |
821 case STRICT_LOW_PART: | |
822 validate_pattern (XEXP (pattern, 0), insn, set, set ? '+' : 0); | |
823 return; | |
824 | |
825 case LABEL_REF: | |
826 if (GET_MODE (XEXP (pattern, 0)) != VOIDmode) | |
827 { | |
828 message_with_line (pattern_lineno, | |
829 "operand to label_ref %smode not VOIDmode", | |
830 GET_MODE_NAME (GET_MODE (XEXP (pattern, 0)))); | |
831 error_count++; | |
832 } | |
833 break; | |
834 | |
835 default: | |
836 break; | |
837 } | |
838 | |
839 fmt = GET_RTX_FORMAT (code); | |
840 len = GET_RTX_LENGTH (code); | |
841 for (i = 0; i < len; i++) | |
842 { | |
843 switch (fmt[i]) | |
844 { | |
845 case 'e': case 'u': | |
846 validate_pattern (XEXP (pattern, i), insn, NULL_RTX, 0); | |
847 break; | |
848 | |
849 case 'E': | |
850 for (j = 0; j < XVECLEN (pattern, i); j++) | |
851 validate_pattern (XVECEXP (pattern, i, j), insn, NULL_RTX, 0); | |
852 break; | |
853 | |
854 case 'i': case 'w': case '0': case 's': | |
855 break; | |
856 | |
857 default: | |
858 gcc_unreachable (); | |
859 } | |
860 } | |
861 } | |
862 | |
863 /* Create a chain of nodes to verify that an rtl expression matches | |
864 PATTERN. | |
865 | |
866 LAST is a pointer to the listhead in the previous node in the chain (or | |
867 in the calling function, for the first node). | |
868 | |
869 POSITION is the string representing the current position in the insn. | |
870 | |
871 INSN_TYPE is the type of insn for which we are emitting code. | |
872 | |
873 A pointer to the final node in the chain is returned. */ | |
874 | |
875 static struct decision * | |
876 add_to_sequence (rtx pattern, struct decision_head *last, const char *position, | |
877 enum routine_type insn_type, int top) | |
878 { | |
879 RTX_CODE code; | |
880 struct decision *this_decision, *sub; | |
881 struct decision_test *test; | |
882 struct decision_test **place; | |
883 char *subpos; | |
884 size_t i; | |
885 const char *fmt; | |
886 int depth = strlen (position); | |
887 int len; | |
888 enum machine_mode mode; | |
889 | |
890 if (depth > max_depth) | |
891 max_depth = depth; | |
892 | |
893 subpos = XNEWVAR (char, depth + 2); | |
894 strcpy (subpos, position); | |
895 subpos[depth + 1] = 0; | |
896 | |
897 sub = this_decision = new_decision (position, last); | |
898 place = &this_decision->tests; | |
899 | |
900 restart: | |
901 mode = GET_MODE (pattern); | |
902 code = GET_CODE (pattern); | |
903 | |
904 switch (code) | |
905 { | |
906 case PARALLEL: | |
907 /* Toplevel peephole pattern. */ | |
908 if (insn_type == PEEPHOLE2 && top) | |
909 { | |
910 int num_insns; | |
911 | |
912 /* Check we have sufficient insns. This avoids complications | |
913 because we then know peep2_next_insn never fails. */ | |
914 num_insns = XVECLEN (pattern, 0); | |
915 if (num_insns > 1) | |
916 { | |
917 test = new_decision_test (DT_num_insns, &place); | |
918 test->u.num_insns = num_insns; | |
919 last = &sub->success; | |
920 } | |
921 else | |
922 { | |
923 /* We don't need the node we just created -- unlink it. */ | |
924 last->first = last->last = NULL; | |
925 } | |
926 | |
927 for (i = 0; i < (size_t) XVECLEN (pattern, 0); i++) | |
928 { | |
929 /* Which insn we're looking at is represented by A-Z. We don't | |
930 ever use 'A', however; it is always implied. */ | |
931 | |
932 subpos[depth] = (i > 0 ? 'A' + i : 0); | |
933 sub = add_to_sequence (XVECEXP (pattern, 0, i), | |
934 last, subpos, insn_type, 0); | |
935 last = &sub->success; | |
936 } | |
937 goto ret; | |
938 } | |
939 | |
940 /* Else nothing special. */ | |
941 break; | |
942 | |
943 case MATCH_PARALLEL: | |
944 /* The explicit patterns within a match_parallel enforce a minimum | |
945 length on the vector. The match_parallel predicate may allow | |
946 for more elements. We do need to check for this minimum here | |
947 or the code generated to match the internals may reference data | |
948 beyond the end of the vector. */ | |
949 test = new_decision_test (DT_veclen_ge, &place); | |
950 test->u.veclen = XVECLEN (pattern, 2); | |
951 /* Fall through. */ | |
952 | |
953 case MATCH_OPERAND: | |
954 case MATCH_SCRATCH: | |
955 case MATCH_OPERATOR: | |
956 { | |
957 RTX_CODE was_code = code; | |
958 const char *pred_name; | |
959 bool allows_const_int = true; | |
960 | |
961 if (code == MATCH_SCRATCH) | |
962 { | |
963 pred_name = "scratch_operand"; | |
964 code = UNKNOWN; | |
965 } | |
966 else | |
967 { | |
968 pred_name = XSTR (pattern, 1); | |
969 if (code == MATCH_PARALLEL) | |
970 code = PARALLEL; | |
971 else | |
972 code = UNKNOWN; | |
973 } | |
974 | |
975 if (pred_name[0] != 0) | |
976 { | |
977 const struct pred_data *pred; | |
978 | |
979 test = new_decision_test (DT_pred, &place); | |
980 test->u.pred.name = pred_name; | |
981 test->u.pred.mode = mode; | |
982 | |
983 /* See if we know about this predicate. | |
984 If we do, remember it for use below. | |
985 | |
986 We can optimize the generated code a little if either | |
987 (a) the predicate only accepts one code, or (b) the | |
988 predicate does not allow CONST_INT, in which case it | |
989 can match only if the modes match. */ | |
990 pred = lookup_predicate (pred_name); | |
991 if (pred) | |
992 { | |
993 test->u.pred.data = pred; | |
994 allows_const_int = pred->codes[CONST_INT]; | |
995 if (was_code == MATCH_PARALLEL | |
996 && pred->singleton != PARALLEL) | |
997 message_with_line (pattern_lineno, | |
998 "predicate '%s' used in match_parallel " | |
999 "does not allow only PARALLEL", pred->name); | |
1000 else | |
1001 code = pred->singleton; | |
1002 } | |
1003 else | |
1004 message_with_line (pattern_lineno, | |
1005 "warning: unknown predicate '%s' in '%s' expression", | |
1006 pred_name, GET_RTX_NAME (was_code)); | |
1007 } | |
1008 | |
1009 /* Can't enforce a mode if we allow const_int. */ | |
1010 if (allows_const_int) | |
1011 mode = VOIDmode; | |
1012 | |
1013 /* Accept the operand, i.e. record it in `operands'. */ | |
1014 test = new_decision_test (DT_accept_op, &place); | |
1015 test->u.opno = XINT (pattern, 0); | |
1016 | |
1017 if (was_code == MATCH_OPERATOR || was_code == MATCH_PARALLEL) | |
1018 { | |
1019 char base = (was_code == MATCH_OPERATOR ? '0' : 'a'); | |
1020 for (i = 0; i < (size_t) XVECLEN (pattern, 2); i++) | |
1021 { | |
1022 subpos[depth] = i + base; | |
1023 sub = add_to_sequence (XVECEXP (pattern, 2, i), | |
1024 &sub->success, subpos, insn_type, 0); | |
1025 } | |
1026 } | |
1027 goto fini; | |
1028 } | |
1029 | |
1030 case MATCH_OP_DUP: | |
1031 code = UNKNOWN; | |
1032 | |
1033 test = new_decision_test (DT_dup, &place); | |
1034 test->u.dup = XINT (pattern, 0); | |
1035 | |
1036 test = new_decision_test (DT_accept_op, &place); | |
1037 test->u.opno = XINT (pattern, 0); | |
1038 | |
1039 for (i = 0; i < (size_t) XVECLEN (pattern, 1); i++) | |
1040 { | |
1041 subpos[depth] = i + '0'; | |
1042 sub = add_to_sequence (XVECEXP (pattern, 1, i), | |
1043 &sub->success, subpos, insn_type, 0); | |
1044 } | |
1045 goto fini; | |
1046 | |
1047 case MATCH_DUP: | |
1048 case MATCH_PAR_DUP: | |
1049 code = UNKNOWN; | |
1050 | |
1051 test = new_decision_test (DT_dup, &place); | |
1052 test->u.dup = XINT (pattern, 0); | |
1053 goto fini; | |
1054 | |
1055 case ADDRESS: | |
1056 pattern = XEXP (pattern, 0); | |
1057 goto restart; | |
1058 | |
1059 default: | |
1060 break; | |
1061 } | |
1062 | |
1063 fmt = GET_RTX_FORMAT (code); | |
1064 len = GET_RTX_LENGTH (code); | |
1065 | |
1066 /* Do tests against the current node first. */ | |
1067 for (i = 0; i < (size_t) len; i++) | |
1068 { | |
1069 if (fmt[i] == 'i') | |
1070 { | |
1071 gcc_assert (i < 2); | |
1072 | |
1073 if (!i) | |
1074 { | |
1075 test = new_decision_test (DT_elt_zero_int, &place); | |
1076 test->u.intval = XINT (pattern, i); | |
1077 } | |
1078 else | |
1079 { | |
1080 test = new_decision_test (DT_elt_one_int, &place); | |
1081 test->u.intval = XINT (pattern, i); | |
1082 } | |
1083 } | |
1084 else if (fmt[i] == 'w') | |
1085 { | |
1086 /* If this value actually fits in an int, we can use a switch | |
1087 statement here, so indicate that. */ | |
1088 enum decision_type type | |
1089 = ((int) XWINT (pattern, i) == XWINT (pattern, i)) | |
1090 ? DT_elt_zero_wide_safe : DT_elt_zero_wide; | |
1091 | |
1092 gcc_assert (!i); | |
1093 | |
1094 test = new_decision_test (type, &place); | |
1095 test->u.intval = XWINT (pattern, i); | |
1096 } | |
1097 else if (fmt[i] == 'E') | |
1098 { | |
1099 gcc_assert (!i); | |
1100 | |
1101 test = new_decision_test (DT_veclen, &place); | |
1102 test->u.veclen = XVECLEN (pattern, i); | |
1103 } | |
1104 } | |
1105 | |
1106 /* Now test our sub-patterns. */ | |
1107 for (i = 0; i < (size_t) len; i++) | |
1108 { | |
1109 switch (fmt[i]) | |
1110 { | |
1111 case 'e': case 'u': | |
1112 subpos[depth] = '0' + i; | |
1113 sub = add_to_sequence (XEXP (pattern, i), &sub->success, | |
1114 subpos, insn_type, 0); | |
1115 break; | |
1116 | |
1117 case 'E': | |
1118 { | |
1119 int j; | |
1120 for (j = 0; j < XVECLEN (pattern, i); j++) | |
1121 { | |
1122 subpos[depth] = 'a' + j; | |
1123 sub = add_to_sequence (XVECEXP (pattern, i, j), | |
1124 &sub->success, subpos, insn_type, 0); | |
1125 } | |
1126 break; | |
1127 } | |
1128 | |
1129 case 'i': case 'w': | |
1130 /* Handled above. */ | |
1131 break; | |
1132 case '0': | |
1133 break; | |
1134 | |
1135 default: | |
1136 gcc_unreachable (); | |
1137 } | |
1138 } | |
1139 | |
1140 fini: | |
1141 /* Insert nodes testing mode and code, if they're still relevant, | |
1142 before any of the nodes we may have added above. */ | |
1143 if (code != UNKNOWN) | |
1144 { | |
1145 place = &this_decision->tests; | |
1146 test = new_decision_test (DT_code, &place); | |
1147 test->u.code = code; | |
1148 } | |
1149 | |
1150 if (mode != VOIDmode) | |
1151 { | |
1152 place = &this_decision->tests; | |
1153 test = new_decision_test (DT_mode, &place); | |
1154 test->u.mode = mode; | |
1155 } | |
1156 | |
1157 /* If we didn't insert any tests or accept nodes, hork. */ | |
1158 gcc_assert (this_decision->tests); | |
1159 | |
1160 ret: | |
1161 free (subpos); | |
1162 return sub; | |
1163 } | |
1164 | |
1165 /* A subroutine of maybe_both_true; examines only one test. | |
1166 Returns > 0 for "definitely both true" and < 0 for "maybe both true". */ | |
1167 | |
1168 static int | |
1169 maybe_both_true_2 (struct decision_test *d1, struct decision_test *d2) | |
1170 { | |
1171 if (d1->type == d2->type) | |
1172 { | |
1173 switch (d1->type) | |
1174 { | |
1175 case DT_num_insns: | |
1176 if (d1->u.num_insns == d2->u.num_insns) | |
1177 return 1; | |
1178 else | |
1179 return -1; | |
1180 | |
1181 case DT_mode: | |
1182 return d1->u.mode == d2->u.mode; | |
1183 | |
1184 case DT_code: | |
1185 return d1->u.code == d2->u.code; | |
1186 | |
1187 case DT_veclen: | |
1188 return d1->u.veclen == d2->u.veclen; | |
1189 | |
1190 case DT_elt_zero_int: | |
1191 case DT_elt_one_int: | |
1192 case DT_elt_zero_wide: | |
1193 case DT_elt_zero_wide_safe: | |
1194 return d1->u.intval == d2->u.intval; | |
1195 | |
1196 default: | |
1197 break; | |
1198 } | |
1199 } | |
1200 | |
1201 /* If either has a predicate that we know something about, set | |
1202 things up so that D1 is the one that always has a known | |
1203 predicate. Then see if they have any codes in common. */ | |
1204 | |
1205 if (d1->type == DT_pred || d2->type == DT_pred) | |
1206 { | |
1207 if (d2->type == DT_pred) | |
1208 { | |
1209 struct decision_test *tmp; | |
1210 tmp = d1, d1 = d2, d2 = tmp; | |
1211 } | |
1212 | |
1213 /* If D2 tests a mode, see if it matches D1. */ | |
1214 if (d1->u.pred.mode != VOIDmode) | |
1215 { | |
1216 if (d2->type == DT_mode) | |
1217 { | |
1218 if (d1->u.pred.mode != d2->u.mode | |
1219 /* The mode of an address_operand predicate is the | |
1220 mode of the memory, not the operand. It can only | |
1221 be used for testing the predicate, so we must | |
1222 ignore it here. */ | |
1223 && strcmp (d1->u.pred.name, "address_operand") != 0) | |
1224 return 0; | |
1225 } | |
1226 /* Don't check two predicate modes here, because if both predicates | |
1227 accept CONST_INT, then both can still be true even if the modes | |
1228 are different. If they don't accept CONST_INT, there will be a | |
1229 separate DT_mode that will make maybe_both_true_1 return 0. */ | |
1230 } | |
1231 | |
1232 if (d1->u.pred.data) | |
1233 { | |
1234 /* If D2 tests a code, see if it is in the list of valid | |
1235 codes for D1's predicate. */ | |
1236 if (d2->type == DT_code) | |
1237 { | |
1238 if (!d1->u.pred.data->codes[d2->u.code]) | |
1239 return 0; | |
1240 } | |
1241 | |
1242 /* Otherwise see if the predicates have any codes in common. */ | |
1243 else if (d2->type == DT_pred && d2->u.pred.data) | |
1244 { | |
1245 bool common = false; | |
1246 enum rtx_code c; | |
1247 | |
1248 for (c = 0; c < NUM_RTX_CODE; c++) | |
1249 if (d1->u.pred.data->codes[c] && d2->u.pred.data->codes[c]) | |
1250 { | |
1251 common = true; | |
1252 break; | |
1253 } | |
1254 | |
1255 if (!common) | |
1256 return 0; | |
1257 } | |
1258 } | |
1259 } | |
1260 | |
1261 /* Tests vs veclen may be known when strict equality is involved. */ | |
1262 if (d1->type == DT_veclen && d2->type == DT_veclen_ge) | |
1263 return d1->u.veclen >= d2->u.veclen; | |
1264 if (d1->type == DT_veclen_ge && d2->type == DT_veclen) | |
1265 return d2->u.veclen >= d1->u.veclen; | |
1266 | |
1267 return -1; | |
1268 } | |
1269 | |
1270 /* A subroutine of maybe_both_true; examines all the tests for a given node. | |
1271 Returns > 0 for "definitely both true" and < 0 for "maybe both true". */ | |
1272 | |
1273 static int | |
1274 maybe_both_true_1 (struct decision_test *d1, struct decision_test *d2) | |
1275 { | |
1276 struct decision_test *t1, *t2; | |
1277 | |
1278 /* A match_operand with no predicate can match anything. Recognize | |
1279 this by the existence of a lone DT_accept_op test. */ | |
1280 if (d1->type == DT_accept_op || d2->type == DT_accept_op) | |
1281 return 1; | |
1282 | |
1283 /* Eliminate pairs of tests while they can exactly match. */ | |
1284 while (d1 && d2 && d1->type == d2->type) | |
1285 { | |
1286 if (maybe_both_true_2 (d1, d2) == 0) | |
1287 return 0; | |
1288 d1 = d1->next, d2 = d2->next; | |
1289 } | |
1290 | |
1291 /* After that, consider all pairs. */ | |
1292 for (t1 = d1; t1 ; t1 = t1->next) | |
1293 for (t2 = d2; t2 ; t2 = t2->next) | |
1294 if (maybe_both_true_2 (t1, t2) == 0) | |
1295 return 0; | |
1296 | |
1297 return -1; | |
1298 } | |
1299 | |
1300 /* Return 0 if we can prove that there is no RTL that can match both | |
1301 D1 and D2. Otherwise, return 1 (it may be that there is an RTL that | |
1302 can match both or just that we couldn't prove there wasn't such an RTL). | |
1303 | |
1304 TOPLEVEL is nonzero if we are to only look at the top level and not | |
1305 recursively descend. */ | |
1306 | |
1307 static int | |
1308 maybe_both_true (struct decision *d1, struct decision *d2, | |
1309 int toplevel) | |
1310 { | |
1311 struct decision *p1, *p2; | |
1312 int cmp; | |
1313 | |
1314 /* Don't compare strings on the different positions in insn. Doing so | |
1315 is incorrect and results in false matches from constructs like | |
1316 | |
1317 [(set (subreg:HI (match_operand:SI "register_operand" "r") 0) | |
1318 (subreg:HI (match_operand:SI "register_operand" "r") 0))] | |
1319 vs | |
1320 [(set (match_operand:HI "register_operand" "r") | |
1321 (match_operand:HI "register_operand" "r"))] | |
1322 | |
1323 If we are presented with such, we are recursing through the remainder | |
1324 of a node's success nodes (from the loop at the end of this function). | |
1325 Skip forward until we come to a position that matches. | |
1326 | |
1327 Due to the way position strings are constructed, we know that iterating | |
1328 forward from the lexically lower position (e.g. "00") will run into | |
1329 the lexically higher position (e.g. "1") and not the other way around. | |
1330 This saves a bit of effort. */ | |
1331 | |
1332 cmp = strcmp (d1->position, d2->position); | |
1333 if (cmp != 0) | |
1334 { | |
1335 gcc_assert (!toplevel); | |
1336 | |
1337 /* If the d2->position was lexically lower, swap. */ | |
1338 if (cmp > 0) | |
1339 p1 = d1, d1 = d2, d2 = p1; | |
1340 | |
1341 if (d1->success.first == 0) | |
1342 return 1; | |
1343 for (p1 = d1->success.first; p1; p1 = p1->next) | |
1344 if (maybe_both_true (p1, d2, 0)) | |
1345 return 1; | |
1346 | |
1347 return 0; | |
1348 } | |
1349 | |
1350 /* Test the current level. */ | |
1351 cmp = maybe_both_true_1 (d1->tests, d2->tests); | |
1352 if (cmp >= 0) | |
1353 return cmp; | |
1354 | |
1355 /* We can't prove that D1 and D2 cannot both be true. If we are only | |
1356 to check the top level, return 1. Otherwise, see if we can prove | |
1357 that all choices in both successors are mutually exclusive. If | |
1358 either does not have any successors, we can't prove they can't both | |
1359 be true. */ | |
1360 | |
1361 if (toplevel || d1->success.first == 0 || d2->success.first == 0) | |
1362 return 1; | |
1363 | |
1364 for (p1 = d1->success.first; p1; p1 = p1->next) | |
1365 for (p2 = d2->success.first; p2; p2 = p2->next) | |
1366 if (maybe_both_true (p1, p2, 0)) | |
1367 return 1; | |
1368 | |
1369 return 0; | |
1370 } | |
1371 | |
1372 /* A subroutine of nodes_identical. Examine two tests for equivalence. */ | |
1373 | |
1374 static int | |
1375 nodes_identical_1 (struct decision_test *d1, struct decision_test *d2) | |
1376 { | |
1377 switch (d1->type) | |
1378 { | |
1379 case DT_num_insns: | |
1380 return d1->u.num_insns == d2->u.num_insns; | |
1381 | |
1382 case DT_mode: | |
1383 return d1->u.mode == d2->u.mode; | |
1384 | |
1385 case DT_code: | |
1386 return d1->u.code == d2->u.code; | |
1387 | |
1388 case DT_pred: | |
1389 return (d1->u.pred.mode == d2->u.pred.mode | |
1390 && strcmp (d1->u.pred.name, d2->u.pred.name) == 0); | |
1391 | |
1392 case DT_c_test: | |
1393 return strcmp (d1->u.c_test, d2->u.c_test) == 0; | |
1394 | |
1395 case DT_veclen: | |
1396 case DT_veclen_ge: | |
1397 return d1->u.veclen == d2->u.veclen; | |
1398 | |
1399 case DT_dup: | |
1400 return d1->u.dup == d2->u.dup; | |
1401 | |
1402 case DT_elt_zero_int: | |
1403 case DT_elt_one_int: | |
1404 case DT_elt_zero_wide: | |
1405 case DT_elt_zero_wide_safe: | |
1406 return d1->u.intval == d2->u.intval; | |
1407 | |
1408 case DT_accept_op: | |
1409 return d1->u.opno == d2->u.opno; | |
1410 | |
1411 case DT_accept_insn: | |
1412 /* Differences will be handled in merge_accept_insn. */ | |
1413 return 1; | |
1414 | |
1415 default: | |
1416 gcc_unreachable (); | |
1417 } | |
1418 } | |
1419 | |
1420 /* True iff the two nodes are identical (on one level only). Due | |
1421 to the way these lists are constructed, we shouldn't have to | |
1422 consider different orderings on the tests. */ | |
1423 | |
1424 static int | |
1425 nodes_identical (struct decision *d1, struct decision *d2) | |
1426 { | |
1427 struct decision_test *t1, *t2; | |
1428 | |
1429 for (t1 = d1->tests, t2 = d2->tests; t1 && t2; t1 = t1->next, t2 = t2->next) | |
1430 { | |
1431 if (t1->type != t2->type) | |
1432 return 0; | |
1433 if (! nodes_identical_1 (t1, t2)) | |
1434 return 0; | |
1435 } | |
1436 | |
1437 /* For success, they should now both be null. */ | |
1438 if (t1 != t2) | |
1439 return 0; | |
1440 | |
1441 /* Check that their subnodes are at the same position, as any one set | |
1442 of sibling decisions must be at the same position. Allowing this | |
1443 requires complications to find_afterward and when change_state is | |
1444 invoked. */ | |
1445 if (d1->success.first | |
1446 && d2->success.first | |
1447 && strcmp (d1->success.first->position, d2->success.first->position)) | |
1448 return 0; | |
1449 | |
1450 return 1; | |
1451 } | |
1452 | |
1453 /* A subroutine of merge_trees; given two nodes that have been declared | |
1454 identical, cope with two insn accept states. If they differ in the | |
1455 number of clobbers, then the conflict was created by make_insn_sequence | |
1456 and we can drop the with-clobbers version on the floor. If both | |
1457 nodes have no additional clobbers, we have found an ambiguity in the | |
1458 source machine description. */ | |
1459 | |
1460 static void | |
1461 merge_accept_insn (struct decision *oldd, struct decision *addd) | |
1462 { | |
1463 struct decision_test *old, *add; | |
1464 | |
1465 for (old = oldd->tests; old; old = old->next) | |
1466 if (old->type == DT_accept_insn) | |
1467 break; | |
1468 if (old == NULL) | |
1469 return; | |
1470 | |
1471 for (add = addd->tests; add; add = add->next) | |
1472 if (add->type == DT_accept_insn) | |
1473 break; | |
1474 if (add == NULL) | |
1475 return; | |
1476 | |
1477 /* If one node is for a normal insn and the second is for the base | |
1478 insn with clobbers stripped off, the second node should be ignored. */ | |
1479 | |
1480 if (old->u.insn.num_clobbers_to_add == 0 | |
1481 && add->u.insn.num_clobbers_to_add > 0) | |
1482 { | |
1483 /* Nothing to do here. */ | |
1484 } | |
1485 else if (old->u.insn.num_clobbers_to_add > 0 | |
1486 && add->u.insn.num_clobbers_to_add == 0) | |
1487 { | |
1488 /* In this case, replace OLD with ADD. */ | |
1489 old->u.insn = add->u.insn; | |
1490 } | |
1491 else | |
1492 { | |
1493 message_with_line (add->u.insn.lineno, "`%s' matches `%s'", | |
1494 get_insn_name (add->u.insn.code_number), | |
1495 get_insn_name (old->u.insn.code_number)); | |
1496 message_with_line (old->u.insn.lineno, "previous definition of `%s'", | |
1497 get_insn_name (old->u.insn.code_number)); | |
1498 error_count++; | |
1499 } | |
1500 } | |
1501 | |
1502 /* Merge two decision trees OLDH and ADDH, modifying OLDH destructively. */ | |
1503 | |
1504 static void | |
1505 merge_trees (struct decision_head *oldh, struct decision_head *addh) | |
1506 { | |
1507 struct decision *next, *add; | |
1508 | |
1509 if (addh->first == 0) | |
1510 return; | |
1511 if (oldh->first == 0) | |
1512 { | |
1513 *oldh = *addh; | |
1514 return; | |
1515 } | |
1516 | |
1517 /* Trying to merge bits at different positions isn't possible. */ | |
1518 gcc_assert (!strcmp (oldh->first->position, addh->first->position)); | |
1519 | |
1520 for (add = addh->first; add ; add = next) | |
1521 { | |
1522 struct decision *old, *insert_before = NULL; | |
1523 | |
1524 next = add->next; | |
1525 | |
1526 /* The semantics of pattern matching state that the tests are | |
1527 done in the order given in the MD file so that if an insn | |
1528 matches two patterns, the first one will be used. However, | |
1529 in practice, most, if not all, patterns are unambiguous so | |
1530 that their order is independent. In that case, we can merge | |
1531 identical tests and group all similar modes and codes together. | |
1532 | |
1533 Scan starting from the end of OLDH until we reach a point | |
1534 where we reach the head of the list or where we pass a | |
1535 pattern that could also be true if NEW is true. If we find | |
1536 an identical pattern, we can merge them. Also, record the | |
1537 last node that tests the same code and mode and the last one | |
1538 that tests just the same mode. | |
1539 | |
1540 If we have no match, place NEW after the closest match we found. */ | |
1541 | |
1542 for (old = oldh->last; old; old = old->prev) | |
1543 { | |
1544 if (nodes_identical (old, add)) | |
1545 { | |
1546 merge_accept_insn (old, add); | |
1547 merge_trees (&old->success, &add->success); | |
1548 goto merged_nodes; | |
1549 } | |
1550 | |
1551 if (maybe_both_true (old, add, 0)) | |
1552 break; | |
1553 | |
1554 /* Insert the nodes in DT test type order, which is roughly | |
1555 how expensive/important the test is. Given that the tests | |
1556 are also ordered within the list, examining the first is | |
1557 sufficient. */ | |
1558 if ((int) add->tests->type < (int) old->tests->type) | |
1559 insert_before = old; | |
1560 } | |
1561 | |
1562 if (insert_before == NULL) | |
1563 { | |
1564 add->next = NULL; | |
1565 add->prev = oldh->last; | |
1566 oldh->last->next = add; | |
1567 oldh->last = add; | |
1568 } | |
1569 else | |
1570 { | |
1571 if ((add->prev = insert_before->prev) != NULL) | |
1572 add->prev->next = add; | |
1573 else | |
1574 oldh->first = add; | |
1575 add->next = insert_before; | |
1576 insert_before->prev = add; | |
1577 } | |
1578 | |
1579 merged_nodes:; | |
1580 } | |
1581 } | |
1582 | |
1583 /* Walk the tree looking for sub-nodes that perform common tests. | |
1584 Factor out the common test into a new node. This enables us | |
1585 (depending on the test type) to emit switch statements later. */ | |
1586 | |
1587 static void | |
1588 factor_tests (struct decision_head *head) | |
1589 { | |
1590 struct decision *first, *next; | |
1591 | |
1592 for (first = head->first; first && first->next; first = next) | |
1593 { | |
1594 enum decision_type type; | |
1595 struct decision *new_dec, *old_last; | |
1596 | |
1597 type = first->tests->type; | |
1598 next = first->next; | |
1599 | |
1600 /* Want at least two compatible sequential nodes. */ | |
1601 if (next->tests->type != type) | |
1602 continue; | |
1603 | |
1604 /* Don't want all node types, just those we can turn into | |
1605 switch statements. */ | |
1606 if (type != DT_mode | |
1607 && type != DT_code | |
1608 && type != DT_veclen | |
1609 && type != DT_elt_zero_int | |
1610 && type != DT_elt_one_int | |
1611 && type != DT_elt_zero_wide_safe) | |
1612 continue; | |
1613 | |
1614 /* If we'd been performing more than one test, create a new node | |
1615 below our first test. */ | |
1616 if (first->tests->next != NULL) | |
1617 { | |
1618 new_dec = new_decision (first->position, &first->success); | |
1619 new_dec->tests = first->tests->next; | |
1620 first->tests->next = NULL; | |
1621 } | |
1622 | |
1623 /* Crop the node tree off after our first test. */ | |
1624 first->next = NULL; | |
1625 old_last = head->last; | |
1626 head->last = first; | |
1627 | |
1628 /* For each compatible test, adjust to perform only one test in | |
1629 the top level node, then merge the node back into the tree. */ | |
1630 do | |
1631 { | |
1632 struct decision_head h; | |
1633 | |
1634 if (next->tests->next != NULL) | |
1635 { | |
1636 new_dec = new_decision (next->position, &next->success); | |
1637 new_dec->tests = next->tests->next; | |
1638 next->tests->next = NULL; | |
1639 } | |
1640 new_dec = next; | |
1641 next = next->next; | |
1642 new_dec->next = NULL; | |
1643 h.first = h.last = new_dec; | |
1644 | |
1645 merge_trees (head, &h); | |
1646 } | |
1647 while (next && next->tests->type == type); | |
1648 | |
1649 /* After we run out of compatible tests, graft the remaining nodes | |
1650 back onto the tree. */ | |
1651 if (next) | |
1652 { | |
1653 next->prev = head->last; | |
1654 head->last->next = next; | |
1655 head->last = old_last; | |
1656 } | |
1657 } | |
1658 | |
1659 /* Recurse. */ | |
1660 for (first = head->first; first; first = first->next) | |
1661 factor_tests (&first->success); | |
1662 } | |
1663 | |
1664 /* After factoring, try to simplify the tests on any one node. | |
1665 Tests that are useful for switch statements are recognizable | |
1666 by having only a single test on a node -- we'll be manipulating | |
1667 nodes with multiple tests: | |
1668 | |
1669 If we have mode tests or code tests that are redundant with | |
1670 predicates, remove them. */ | |
1671 | |
1672 static void | |
1673 simplify_tests (struct decision_head *head) | |
1674 { | |
1675 struct decision *tree; | |
1676 | |
1677 for (tree = head->first; tree; tree = tree->next) | |
1678 { | |
1679 struct decision_test *a, *b; | |
1680 | |
1681 a = tree->tests; | |
1682 b = a->next; | |
1683 if (b == NULL) | |
1684 continue; | |
1685 | |
1686 /* Find a predicate node. */ | |
1687 while (b && b->type != DT_pred) | |
1688 b = b->next; | |
1689 if (b) | |
1690 { | |
1691 /* Due to how these tests are constructed, we don't even need | |
1692 to check that the mode and code are compatible -- they were | |
1693 generated from the predicate in the first place. */ | |
1694 while (a->type == DT_mode || a->type == DT_code) | |
1695 a = a->next; | |
1696 tree->tests = a; | |
1697 } | |
1698 } | |
1699 | |
1700 /* Recurse. */ | |
1701 for (tree = head->first; tree; tree = tree->next) | |
1702 simplify_tests (&tree->success); | |
1703 } | |
1704 | |
1705 /* Count the number of subnodes of HEAD. If the number is high enough, | |
1706 make the first node in HEAD start a separate subroutine in the C code | |
1707 that is generated. */ | |
1708 | |
1709 static int | |
1710 break_out_subroutines (struct decision_head *head, int initial) | |
1711 { | |
1712 int size = 0; | |
1713 struct decision *sub; | |
1714 | |
1715 for (sub = head->first; sub; sub = sub->next) | |
1716 size += 1 + break_out_subroutines (&sub->success, 0); | |
1717 | |
1718 if (size > SUBROUTINE_THRESHOLD && ! initial) | |
1719 { | |
1720 head->first->subroutine_number = ++next_subroutine_number; | |
1721 size = 1; | |
1722 } | |
1723 return size; | |
1724 } | |
1725 | |
1726 /* For each node p, find the next alternative that might be true | |
1727 when p is true. */ | |
1728 | |
1729 static void | |
1730 find_afterward (struct decision_head *head, struct decision *real_afterward) | |
1731 { | |
1732 struct decision *p, *q, *afterward; | |
1733 | |
1734 /* We can't propagate alternatives across subroutine boundaries. | |
1735 This is not incorrect, merely a minor optimization loss. */ | |
1736 | |
1737 p = head->first; | |
1738 afterward = (p->subroutine_number > 0 ? NULL : real_afterward); | |
1739 | |
1740 for ( ; p ; p = p->next) | |
1741 { | |
1742 /* Find the next node that might be true if this one fails. */ | |
1743 for (q = p->next; q ; q = q->next) | |
1744 if (maybe_both_true (p, q, 1)) | |
1745 break; | |
1746 | |
1747 /* If we reached the end of the list without finding one, | |
1748 use the incoming afterward position. */ | |
1749 if (!q) | |
1750 q = afterward; | |
1751 p->afterward = q; | |
1752 if (q) | |
1753 q->need_label = 1; | |
1754 } | |
1755 | |
1756 /* Recurse. */ | |
1757 for (p = head->first; p ; p = p->next) | |
1758 if (p->success.first) | |
1759 find_afterward (&p->success, p->afterward); | |
1760 | |
1761 /* When we are generating a subroutine, record the real afterward | |
1762 position in the first node where write_tree can find it, and we | |
1763 can do the right thing at the subroutine call site. */ | |
1764 p = head->first; | |
1765 if (p->subroutine_number > 0) | |
1766 p->afterward = real_afterward; | |
1767 } | |
1768 | |
1769 /* Assuming that the state of argument is denoted by OLDPOS, take whatever | |
1770 actions are necessary to move to NEWPOS. If we fail to move to the | |
1771 new state, branch to node AFTERWARD if nonzero, otherwise return. | |
1772 | |
1773 Failure to move to the new state can only occur if we are trying to | |
1774 match multiple insns and we try to step past the end of the stream. */ | |
1775 | |
1776 static void | |
1777 change_state (const char *oldpos, const char *newpos, const char *indent) | |
1778 { | |
1779 int odepth = strlen (oldpos); | |
1780 int ndepth = strlen (newpos); | |
1781 int depth; | |
1782 int old_has_insn, new_has_insn; | |
1783 | |
1784 /* Pop up as many levels as necessary. */ | |
1785 for (depth = odepth; strncmp (oldpos, newpos, depth) != 0; --depth) | |
1786 continue; | |
1787 | |
1788 /* Hunt for the last [A-Z] in both strings. */ | |
1789 for (old_has_insn = odepth - 1; old_has_insn >= 0; --old_has_insn) | |
1790 if (ISUPPER (oldpos[old_has_insn])) | |
1791 break; | |
1792 for (new_has_insn = ndepth - 1; new_has_insn >= 0; --new_has_insn) | |
1793 if (ISUPPER (newpos[new_has_insn])) | |
1794 break; | |
1795 | |
1796 /* Go down to desired level. */ | |
1797 while (depth < ndepth) | |
1798 { | |
1799 /* It's a different insn from the first one. */ | |
1800 if (ISUPPER (newpos[depth])) | |
1801 { | |
1802 printf ("%stem = peep2_next_insn (%d);\n", | |
1803 indent, newpos[depth] - 'A'); | |
1804 printf ("%sx%d = PATTERN (tem);\n", indent, depth + 1); | |
1805 } | |
1806 else if (ISLOWER (newpos[depth])) | |
1807 printf ("%sx%d = XVECEXP (x%d, 0, %d);\n", | |
1808 indent, depth + 1, depth, newpos[depth] - 'a'); | |
1809 else | |
1810 printf ("%sx%d = XEXP (x%d, %c);\n", | |
1811 indent, depth + 1, depth, newpos[depth]); | |
1812 ++depth; | |
1813 } | |
1814 } | |
1815 | |
1816 /* Print the enumerator constant for CODE -- the upcase version of | |
1817 the name. */ | |
1818 | |
1819 static void | |
1820 print_code (enum rtx_code code) | |
1821 { | |
1822 const char *p; | |
1823 for (p = GET_RTX_NAME (code); *p; p++) | |
1824 putchar (TOUPPER (*p)); | |
1825 } | |
1826 | |
1827 /* Emit code to cross an afterward link -- change state and branch. */ | |
1828 | |
1829 static void | |
1830 write_afterward (struct decision *start, struct decision *afterward, | |
1831 const char *indent) | |
1832 { | |
1833 if (!afterward || start->subroutine_number > 0) | |
1834 printf("%sgoto ret0;\n", indent); | |
1835 else | |
1836 { | |
1837 change_state (start->position, afterward->position, indent); | |
1838 printf ("%sgoto L%d;\n", indent, afterward->number); | |
1839 } | |
1840 } | |
1841 | |
1842 /* Emit a HOST_WIDE_INT as an integer constant expression. We need to take | |
1843 special care to avoid "decimal constant is so large that it is unsigned" | |
1844 warnings in the resulting code. */ | |
1845 | |
1846 static void | |
1847 print_host_wide_int (HOST_WIDE_INT val) | |
1848 { | |
1849 HOST_WIDE_INT min = (unsigned HOST_WIDE_INT)1 << (HOST_BITS_PER_WIDE_INT-1); | |
1850 if (val == min) | |
1851 printf ("(" HOST_WIDE_INT_PRINT_DEC_C "-1)", val + 1); | |
1852 else | |
1853 printf (HOST_WIDE_INT_PRINT_DEC_C, val); | |
1854 } | |
1855 | |
1856 /* Emit a switch statement, if possible, for an initial sequence of | |
1857 nodes at START. Return the first node yet untested. */ | |
1858 | |
1859 static struct decision * | |
1860 write_switch (struct decision *start, int depth) | |
1861 { | |
1862 struct decision *p = start; | |
1863 enum decision_type type = p->tests->type; | |
1864 struct decision *needs_label = NULL; | |
1865 | |
1866 /* If we have two or more nodes in sequence that test the same one | |
1867 thing, we may be able to use a switch statement. */ | |
1868 | |
1869 if (!p->next | |
1870 || p->tests->next | |
1871 || p->next->tests->type != type | |
1872 || p->next->tests->next | |
1873 || nodes_identical_1 (p->tests, p->next->tests)) | |
1874 return p; | |
1875 | |
1876 /* DT_code is special in that we can do interesting things with | |
1877 known predicates at the same time. */ | |
1878 if (type == DT_code) | |
1879 { | |
1880 char codemap[NUM_RTX_CODE]; | |
1881 struct decision *ret; | |
1882 RTX_CODE code; | |
1883 | |
1884 memset (codemap, 0, sizeof(codemap)); | |
1885 | |
1886 printf (" switch (GET_CODE (x%d))\n {\n", depth); | |
1887 code = p->tests->u.code; | |
1888 do | |
1889 { | |
1890 if (p != start && p->need_label && needs_label == NULL) | |
1891 needs_label = p; | |
1892 | |
1893 printf (" case "); | |
1894 print_code (code); | |
1895 printf (":\n goto L%d;\n", p->success.first->number); | |
1896 p->success.first->need_label = 1; | |
1897 | |
1898 codemap[code] = 1; | |
1899 p = p->next; | |
1900 } | |
1901 while (p | |
1902 && ! p->tests->next | |
1903 && p->tests->type == DT_code | |
1904 && ! codemap[code = p->tests->u.code]); | |
1905 | |
1906 /* If P is testing a predicate that we know about and we haven't | |
1907 seen any of the codes that are valid for the predicate, we can | |
1908 write a series of "case" statement, one for each possible code. | |
1909 Since we are already in a switch, these redundant tests are very | |
1910 cheap and will reduce the number of predicates called. */ | |
1911 | |
1912 /* Note that while we write out cases for these predicates here, | |
1913 we don't actually write the test here, as it gets kinda messy. | |
1914 It is trivial to leave this to later by telling our caller that | |
1915 we only processed the CODE tests. */ | |
1916 if (needs_label != NULL) | |
1917 ret = needs_label; | |
1918 else | |
1919 ret = p; | |
1920 | |
1921 while (p && p->tests->type == DT_pred && p->tests->u.pred.data) | |
1922 { | |
1923 const struct pred_data *data = p->tests->u.pred.data; | |
1924 RTX_CODE c; | |
1925 for (c = 0; c < NUM_RTX_CODE; c++) | |
1926 if (codemap[c] && data->codes[c]) | |
1927 goto pred_done; | |
1928 | |
1929 for (c = 0; c < NUM_RTX_CODE; c++) | |
1930 if (data->codes[c]) | |
1931 { | |
1932 fputs (" case ", stdout); | |
1933 print_code (c); | |
1934 fputs (":\n", stdout); | |
1935 codemap[c] = 1; | |
1936 } | |
1937 | |
1938 printf (" goto L%d;\n", p->number); | |
1939 p->need_label = 1; | |
1940 p = p->next; | |
1941 } | |
1942 | |
1943 pred_done: | |
1944 /* Make the default case skip the predicates we managed to match. */ | |
1945 | |
1946 printf (" default:\n"); | |
1947 if (p != ret) | |
1948 { | |
1949 if (p) | |
1950 { | |
1951 printf (" goto L%d;\n", p->number); | |
1952 p->need_label = 1; | |
1953 } | |
1954 else | |
1955 write_afterward (start, start->afterward, " "); | |
1956 } | |
1957 else | |
1958 printf (" break;\n"); | |
1959 printf (" }\n"); | |
1960 | |
1961 return ret; | |
1962 } | |
1963 else if (type == DT_mode | |
1964 || type == DT_veclen | |
1965 || type == DT_elt_zero_int | |
1966 || type == DT_elt_one_int | |
1967 || type == DT_elt_zero_wide_safe) | |
1968 { | |
1969 const char *indent = ""; | |
1970 | |
1971 /* We cast switch parameter to integer, so we must ensure that the value | |
1972 fits. */ | |
1973 if (type == DT_elt_zero_wide_safe) | |
1974 { | |
1975 indent = " "; | |
1976 printf(" if ((int) XWINT (x%d, 0) == XWINT (x%d, 0))\n", depth, depth); | |
1977 } | |
1978 printf ("%s switch (", indent); | |
1979 switch (type) | |
1980 { | |
1981 case DT_mode: | |
1982 printf ("GET_MODE (x%d)", depth); | |
1983 break; | |
1984 case DT_veclen: | |
1985 printf ("XVECLEN (x%d, 0)", depth); | |
1986 break; | |
1987 case DT_elt_zero_int: | |
1988 printf ("XINT (x%d, 0)", depth); | |
1989 break; | |
1990 case DT_elt_one_int: | |
1991 printf ("XINT (x%d, 1)", depth); | |
1992 break; | |
1993 case DT_elt_zero_wide_safe: | |
1994 /* Convert result of XWINT to int for portability since some C | |
1995 compilers won't do it and some will. */ | |
1996 printf ("(int) XWINT (x%d, 0)", depth); | |
1997 break; | |
1998 default: | |
1999 gcc_unreachable (); | |
2000 } | |
2001 printf (")\n%s {\n", indent); | |
2002 | |
2003 do | |
2004 { | |
2005 /* Merge trees will not unify identical nodes if their | |
2006 sub-nodes are at different levels. Thus we must check | |
2007 for duplicate cases. */ | |
2008 struct decision *q; | |
2009 for (q = start; q != p; q = q->next) | |
2010 if (nodes_identical_1 (p->tests, q->tests)) | |
2011 goto case_done; | |
2012 | |
2013 if (p != start && p->need_label && needs_label == NULL) | |
2014 needs_label = p; | |
2015 | |
2016 printf ("%s case ", indent); | |
2017 switch (type) | |
2018 { | |
2019 case DT_mode: | |
2020 printf ("%smode", GET_MODE_NAME (p->tests->u.mode)); | |
2021 break; | |
2022 case DT_veclen: | |
2023 printf ("%d", p->tests->u.veclen); | |
2024 break; | |
2025 case DT_elt_zero_int: | |
2026 case DT_elt_one_int: | |
2027 case DT_elt_zero_wide: | |
2028 case DT_elt_zero_wide_safe: | |
2029 print_host_wide_int (p->tests->u.intval); | |
2030 break; | |
2031 default: | |
2032 gcc_unreachable (); | |
2033 } | |
2034 printf (":\n%s goto L%d;\n", indent, p->success.first->number); | |
2035 p->success.first->need_label = 1; | |
2036 | |
2037 p = p->next; | |
2038 } | |
2039 while (p && p->tests->type == type && !p->tests->next); | |
2040 | |
2041 case_done: | |
2042 printf ("%s default:\n%s break;\n%s }\n", | |
2043 indent, indent, indent); | |
2044 | |
2045 return needs_label != NULL ? needs_label : p; | |
2046 } | |
2047 else | |
2048 { | |
2049 /* None of the other tests are amenable. */ | |
2050 return p; | |
2051 } | |
2052 } | |
2053 | |
2054 /* Emit code for one test. */ | |
2055 | |
2056 static void | |
2057 write_cond (struct decision_test *p, int depth, | |
2058 enum routine_type subroutine_type) | |
2059 { | |
2060 switch (p->type) | |
2061 { | |
2062 case DT_num_insns: | |
2063 printf ("peep2_current_count >= %d", p->u.num_insns); | |
2064 break; | |
2065 | |
2066 case DT_mode: | |
2067 printf ("GET_MODE (x%d) == %smode", depth, GET_MODE_NAME (p->u.mode)); | |
2068 break; | |
2069 | |
2070 case DT_code: | |
2071 printf ("GET_CODE (x%d) == ", depth); | |
2072 print_code (p->u.code); | |
2073 break; | |
2074 | |
2075 case DT_veclen: | |
2076 printf ("XVECLEN (x%d, 0) == %d", depth, p->u.veclen); | |
2077 break; | |
2078 | |
2079 case DT_elt_zero_int: | |
2080 printf ("XINT (x%d, 0) == %d", depth, (int) p->u.intval); | |
2081 break; | |
2082 | |
2083 case DT_elt_one_int: | |
2084 printf ("XINT (x%d, 1) == %d", depth, (int) p->u.intval); | |
2085 break; | |
2086 | |
2087 case DT_elt_zero_wide: | |
2088 case DT_elt_zero_wide_safe: | |
2089 printf ("XWINT (x%d, 0) == ", depth); | |
2090 print_host_wide_int (p->u.intval); | |
2091 break; | |
2092 | |
2093 case DT_const_int: | |
2094 printf ("x%d == const_int_rtx[MAX_SAVED_CONST_INT + (%d)]", | |
2095 depth, (int) p->u.intval); | |
2096 break; | |
2097 | |
2098 case DT_veclen_ge: | |
2099 printf ("XVECLEN (x%d, 0) >= %d", depth, p->u.veclen); | |
2100 break; | |
2101 | |
2102 case DT_dup: | |
2103 printf ("rtx_equal_p (x%d, operands[%d])", depth, p->u.dup); | |
2104 break; | |
2105 | |
2106 case DT_pred: | |
2107 printf ("%s (x%d, %smode)", p->u.pred.name, depth, | |
2108 GET_MODE_NAME (p->u.pred.mode)); | |
2109 break; | |
2110 | |
2111 case DT_c_test: | |
2112 print_c_condition (p->u.c_test); | |
2113 break; | |
2114 | |
2115 case DT_accept_insn: | |
2116 gcc_assert (subroutine_type == RECOG); | |
2117 gcc_assert (p->u.insn.num_clobbers_to_add); | |
2118 printf ("pnum_clobbers != NULL"); | |
2119 break; | |
2120 | |
2121 default: | |
2122 gcc_unreachable (); | |
2123 } | |
2124 } | |
2125 | |
2126 /* Emit code for one action. The previous tests have succeeded; | |
2127 TEST is the last of the chain. In the normal case we simply | |
2128 perform a state change. For the `accept' tests we must do more work. */ | |
2129 | |
2130 static void | |
2131 write_action (struct decision *p, struct decision_test *test, | |
2132 int depth, int uncond, struct decision *success, | |
2133 enum routine_type subroutine_type) | |
2134 { | |
2135 const char *indent; | |
2136 int want_close = 0; | |
2137 | |
2138 if (uncond) | |
2139 indent = " "; | |
2140 else if (test->type == DT_accept_op || test->type == DT_accept_insn) | |
2141 { | |
2142 fputs (" {\n", stdout); | |
2143 indent = " "; | |
2144 want_close = 1; | |
2145 } | |
2146 else | |
2147 indent = " "; | |
2148 | |
2149 if (test->type == DT_accept_op) | |
2150 { | |
2151 printf("%soperands[%d] = x%d;\n", indent, test->u.opno, depth); | |
2152 | |
2153 /* Only allow DT_accept_insn to follow. */ | |
2154 if (test->next) | |
2155 { | |
2156 test = test->next; | |
2157 gcc_assert (test->type == DT_accept_insn); | |
2158 } | |
2159 } | |
2160 | |
2161 /* Sanity check that we're now at the end of the list of tests. */ | |
2162 gcc_assert (!test->next); | |
2163 | |
2164 if (test->type == DT_accept_insn) | |
2165 { | |
2166 switch (subroutine_type) | |
2167 { | |
2168 case RECOG: | |
2169 if (test->u.insn.num_clobbers_to_add != 0) | |
2170 printf ("%s*pnum_clobbers = %d;\n", | |
2171 indent, test->u.insn.num_clobbers_to_add); | |
2172 printf ("%sreturn %d; /* %s */\n", indent, | |
2173 test->u.insn.code_number, | |
2174 get_insn_name (test->u.insn.code_number)); | |
2175 break; | |
2176 | |
2177 case SPLIT: | |
2178 printf ("%sreturn gen_split_%d (insn, operands);\n", | |
2179 indent, test->u.insn.code_number); | |
2180 break; | |
2181 | |
2182 case PEEPHOLE2: | |
2183 { | |
2184 int match_len = 0, i; | |
2185 | |
2186 for (i = strlen (p->position) - 1; i >= 0; --i) | |
2187 if (ISUPPER (p->position[i])) | |
2188 { | |
2189 match_len = p->position[i] - 'A'; | |
2190 break; | |
2191 } | |
2192 printf ("%s*_pmatch_len = %d;\n", indent, match_len); | |
2193 printf ("%stem = gen_peephole2_%d (insn, operands);\n", | |
2194 indent, test->u.insn.code_number); | |
2195 printf ("%sif (tem != 0)\n%s return tem;\n", indent, indent); | |
2196 } | |
2197 break; | |
2198 | |
2199 default: | |
2200 gcc_unreachable (); | |
2201 } | |
2202 } | |
2203 else | |
2204 { | |
2205 printf("%sgoto L%d;\n", indent, success->number); | |
2206 success->need_label = 1; | |
2207 } | |
2208 | |
2209 if (want_close) | |
2210 fputs (" }\n", stdout); | |
2211 } | |
2212 | |
2213 /* Return 1 if the test is always true and has no fallthru path. Return -1 | |
2214 if the test does have a fallthru path, but requires that the condition be | |
2215 terminated. Otherwise return 0 for a normal test. */ | |
2216 /* ??? is_unconditional is a stupid name for a tri-state function. */ | |
2217 | |
2218 static int | |
2219 is_unconditional (struct decision_test *t, enum routine_type subroutine_type) | |
2220 { | |
2221 if (t->type == DT_accept_op) | |
2222 return 1; | |
2223 | |
2224 if (t->type == DT_accept_insn) | |
2225 { | |
2226 switch (subroutine_type) | |
2227 { | |
2228 case RECOG: | |
2229 return (t->u.insn.num_clobbers_to_add == 0); | |
2230 case SPLIT: | |
2231 return 1; | |
2232 case PEEPHOLE2: | |
2233 return -1; | |
2234 default: | |
2235 gcc_unreachable (); | |
2236 } | |
2237 } | |
2238 | |
2239 return 0; | |
2240 } | |
2241 | |
2242 /* Emit code for one node -- the conditional and the accompanying action. | |
2243 Return true if there is no fallthru path. */ | |
2244 | |
2245 static int | |
2246 write_node (struct decision *p, int depth, | |
2247 enum routine_type subroutine_type) | |
2248 { | |
2249 struct decision_test *test, *last_test; | |
2250 int uncond; | |
2251 | |
2252 /* Scan the tests and simplify comparisons against small | |
2253 constants. */ | |
2254 for (test = p->tests; test; test = test->next) | |
2255 { | |
2256 if (test->type == DT_code | |
2257 && test->u.code == CONST_INT | |
2258 && test->next | |
2259 && test->next->type == DT_elt_zero_wide_safe | |
2260 && -MAX_SAVED_CONST_INT <= test->next->u.intval | |
2261 && test->next->u.intval <= MAX_SAVED_CONST_INT) | |
2262 { | |
2263 test->type = DT_const_int; | |
2264 test->u.intval = test->next->u.intval; | |
2265 test->next = test->next->next; | |
2266 } | |
2267 } | |
2268 | |
2269 last_test = test = p->tests; | |
2270 uncond = is_unconditional (test, subroutine_type); | |
2271 if (uncond == 0) | |
2272 { | |
2273 printf (" if ("); | |
2274 write_cond (test, depth, subroutine_type); | |
2275 | |
2276 while ((test = test->next) != NULL) | |
2277 { | |
2278 last_test = test; | |
2279 if (is_unconditional (test, subroutine_type)) | |
2280 break; | |
2281 | |
2282 printf ("\n && "); | |
2283 write_cond (test, depth, subroutine_type); | |
2284 } | |
2285 | |
2286 printf (")\n"); | |
2287 } | |
2288 | |
2289 write_action (p, last_test, depth, uncond, p->success.first, subroutine_type); | |
2290 | |
2291 return uncond > 0; | |
2292 } | |
2293 | |
2294 /* Emit code for all of the sibling nodes of HEAD. */ | |
2295 | |
2296 static void | |
2297 write_tree_1 (struct decision_head *head, int depth, | |
2298 enum routine_type subroutine_type) | |
2299 { | |
2300 struct decision *p, *next; | |
2301 int uncond = 0; | |
2302 | |
2303 for (p = head->first; p ; p = next) | |
2304 { | |
2305 /* The label for the first element was printed in write_tree. */ | |
2306 if (p != head->first && p->need_label) | |
2307 OUTPUT_LABEL (" ", p->number); | |
2308 | |
2309 /* Attempt to write a switch statement for a whole sequence. */ | |
2310 next = write_switch (p, depth); | |
2311 if (p != next) | |
2312 uncond = 0; | |
2313 else | |
2314 { | |
2315 /* Failed -- fall back and write one node. */ | |
2316 uncond = write_node (p, depth, subroutine_type); | |
2317 next = p->next; | |
2318 } | |
2319 } | |
2320 | |
2321 /* Finished with this chain. Close a fallthru path by branching | |
2322 to the afterward node. */ | |
2323 if (! uncond) | |
2324 write_afterward (head->last, head->last->afterward, " "); | |
2325 } | |
2326 | |
2327 /* Write out the decision tree starting at HEAD. PREVPOS is the | |
2328 position at the node that branched to this node. */ | |
2329 | |
2330 static void | |
2331 write_tree (struct decision_head *head, const char *prevpos, | |
2332 enum routine_type type, int initial) | |
2333 { | |
2334 struct decision *p = head->first; | |
2335 | |
2336 putchar ('\n'); | |
2337 if (p->need_label) | |
2338 OUTPUT_LABEL (" ", p->number); | |
2339 | |
2340 if (! initial && p->subroutine_number > 0) | |
2341 { | |
2342 static const char * const name_prefix[] = { | |
2343 "recog", "split", "peephole2" | |
2344 }; | |
2345 | |
2346 static const char * const call_suffix[] = { | |
2347 ", pnum_clobbers", "", ", _pmatch_len" | |
2348 }; | |
2349 | |
2350 /* This node has been broken out into a separate subroutine. | |
2351 Call it, test the result, and branch accordingly. */ | |
2352 | |
2353 if (p->afterward) | |
2354 { | |
2355 printf (" tem = %s_%d (x0, insn%s);\n", | |
2356 name_prefix[type], p->subroutine_number, call_suffix[type]); | |
2357 if (IS_SPLIT (type)) | |
2358 printf (" if (tem != 0)\n return tem;\n"); | |
2359 else | |
2360 printf (" if (tem >= 0)\n return tem;\n"); | |
2361 | |
2362 change_state (p->position, p->afterward->position, " "); | |
2363 printf (" goto L%d;\n", p->afterward->number); | |
2364 } | |
2365 else | |
2366 { | |
2367 printf (" return %s_%d (x0, insn%s);\n", | |
2368 name_prefix[type], p->subroutine_number, call_suffix[type]); | |
2369 } | |
2370 } | |
2371 else | |
2372 { | |
2373 int depth = strlen (p->position); | |
2374 | |
2375 change_state (prevpos, p->position, " "); | |
2376 write_tree_1 (head, depth, type); | |
2377 | |
2378 for (p = head->first; p; p = p->next) | |
2379 if (p->success.first) | |
2380 write_tree (&p->success, p->position, type, 0); | |
2381 } | |
2382 } | |
2383 | |
2384 /* Write out a subroutine of type TYPE to do comparisons starting at | |
2385 node TREE. */ | |
2386 | |
2387 static void | |
2388 write_subroutine (struct decision_head *head, enum routine_type type) | |
2389 { | |
2390 int subfunction = head->first ? head->first->subroutine_number : 0; | |
2391 const char *s_or_e; | |
2392 char extension[32]; | |
2393 int i; | |
2394 | |
2395 s_or_e = subfunction ? "static " : ""; | |
2396 | |
2397 if (subfunction) | |
2398 sprintf (extension, "_%d", subfunction); | |
2399 else if (type == RECOG) | |
2400 extension[0] = '\0'; | |
2401 else | |
2402 strcpy (extension, "_insns"); | |
2403 | |
2404 switch (type) | |
2405 { | |
2406 case RECOG: | |
2407 printf ("%sint\n\ | |
2408 recog%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *pnum_clobbers ATTRIBUTE_UNUSED)\n", s_or_e, extension); | |
2409 break; | |
2410 case SPLIT: | |
2411 printf ("%srtx\n\ | |
2412 split%s (rtx x0 ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED)\n", | |
2413 s_or_e, extension); | |
2414 break; | |
2415 case PEEPHOLE2: | |
2416 printf ("%srtx\n\ | |
2417 peephole2%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *_pmatch_len ATTRIBUTE_UNUSED)\n", | |
2418 s_or_e, extension); | |
2419 break; | |
2420 } | |
2421 | |
2422 printf ("{\n rtx * const operands ATTRIBUTE_UNUSED = &recog_data.operand[0];\n"); | |
2423 for (i = 1; i <= max_depth; i++) | |
2424 printf (" rtx x%d ATTRIBUTE_UNUSED;\n", i); | |
2425 | |
2426 printf (" %s tem ATTRIBUTE_UNUSED;\n", IS_SPLIT (type) ? "rtx" : "int"); | |
2427 | |
2428 if (!subfunction) | |
2429 printf (" recog_data.insn = NULL_RTX;\n"); | |
2430 | |
2431 if (head->first) | |
2432 write_tree (head, "", type, 1); | |
2433 else | |
2434 printf (" goto ret0;\n"); | |
2435 | |
2436 printf (" ret0:\n return %d;\n}\n\n", IS_SPLIT (type) ? 0 : -1); | |
2437 } | |
2438 | |
2439 /* In break_out_subroutines, we discovered the boundaries for the | |
2440 subroutines, but did not write them out. Do so now. */ | |
2441 | |
2442 static void | |
2443 write_subroutines (struct decision_head *head, enum routine_type type) | |
2444 { | |
2445 struct decision *p; | |
2446 | |
2447 for (p = head->first; p ; p = p->next) | |
2448 if (p->success.first) | |
2449 write_subroutines (&p->success, type); | |
2450 | |
2451 if (head->first->subroutine_number > 0) | |
2452 write_subroutine (head, type); | |
2453 } | |
2454 | |
2455 /* Begin the output file. */ | |
2456 | |
2457 static void | |
2458 write_header (void) | |
2459 { | |
2460 puts ("\ | |
2461 /* Generated automatically by the program `genrecog' from the target\n\ | |
2462 machine description file. */\n\ | |
2463 \n\ | |
2464 #include \"config.h\"\n\ | |
2465 #include \"system.h\"\n\ | |
2466 #include \"coretypes.h\"\n\ | |
2467 #include \"tm.h\"\n\ | |
2468 #include \"rtl.h\"\n\ | |
2469 #include \"tm_p.h\"\n\ | |
2470 #include \"function.h\"\n\ | |
2471 #include \"insn-config.h\"\n\ | |
2472 #include \"recog.h\"\n\ | |
2473 #include \"real.h\"\n\ | |
2474 #include \"output.h\"\n\ | |
2475 #include \"flags.h\"\n\ | |
2476 #include \"hard-reg-set.h\"\n\ | |
2477 #include \"resource.h\"\n\ | |
2478 #include \"toplev.h\"\n\ | |
2479 #include \"reload.h\"\n\ | |
2480 #include \"regs.h\"\n\ | |
2481 #include \"tm-constrs.h\"\n\ | |
2482 \n"); | |
2483 | |
2484 puts ("\n\ | |
2485 /* `recog' contains a decision tree that recognizes whether the rtx\n\ | |
2486 X0 is a valid instruction.\n\ | |
2487 \n\ | |
2488 recog returns -1 if the rtx is not valid. If the rtx is valid, recog\n\ | |
2489 returns a nonnegative number which is the insn code number for the\n\ | |
2490 pattern that matched. This is the same as the order in the machine\n\ | |
2491 description of the entry that matched. This number can be used as an\n\ | |
2492 index into `insn_data' and other tables.\n"); | |
2493 puts ("\ | |
2494 The third argument to recog is an optional pointer to an int. If\n\ | |
2495 present, recog will accept a pattern if it matches except for missing\n\ | |
2496 CLOBBER expressions at the end. In that case, the value pointed to by\n\ | |
2497 the optional pointer will be set to the number of CLOBBERs that need\n\ | |
2498 to be added (it should be initialized to zero by the caller). If it"); | |
2499 puts ("\ | |
2500 is set nonzero, the caller should allocate a PARALLEL of the\n\ | |
2501 appropriate size, copy the initial entries, and call add_clobbers\n\ | |
2502 (found in insn-emit.c) to fill in the CLOBBERs.\n\ | |
2503 "); | |
2504 | |
2505 puts ("\n\ | |
2506 The function split_insns returns 0 if the rtl could not\n\ | |
2507 be split or the split rtl as an INSN list if it can be.\n\ | |
2508 \n\ | |
2509 The function peephole2_insns returns 0 if the rtl could not\n\ | |
2510 be matched. If there was a match, the new rtl is returned in an INSN list,\n\ | |
2511 and LAST_INSN will point to the last recognized insn in the old sequence.\n\ | |
2512 */\n\n"); | |
2513 } | |
2514 | |
2515 | |
2516 /* Construct and return a sequence of decisions | |
2517 that will recognize INSN. | |
2518 | |
2519 TYPE says what type of routine we are recognizing (RECOG or SPLIT). */ | |
2520 | |
2521 static struct decision_head | |
2522 make_insn_sequence (rtx insn, enum routine_type type) | |
2523 { | |
2524 rtx x; | |
2525 const char *c_test = XSTR (insn, type == RECOG ? 2 : 1); | |
2526 int truth = maybe_eval_c_test (c_test); | |
2527 struct decision *last; | |
2528 struct decision_test *test, **place; | |
2529 struct decision_head head; | |
2530 char c_test_pos[2]; | |
2531 | |
2532 /* We should never see an insn whose C test is false at compile time. */ | |
2533 gcc_assert (truth); | |
2534 | |
2535 c_test_pos[0] = '\0'; | |
2536 if (type == PEEPHOLE2) | |
2537 { | |
2538 int i, j; | |
2539 | |
2540 /* peephole2 gets special treatment: | |
2541 - X always gets an outer parallel even if it's only one entry | |
2542 - we remove all traces of outer-level match_scratch and match_dup | |
2543 expressions here. */ | |
2544 x = rtx_alloc (PARALLEL); | |
2545 PUT_MODE (x, VOIDmode); | |
2546 XVEC (x, 0) = rtvec_alloc (XVECLEN (insn, 0)); | |
2547 for (i = j = 0; i < XVECLEN (insn, 0); i++) | |
2548 { | |
2549 rtx tmp = XVECEXP (insn, 0, i); | |
2550 if (GET_CODE (tmp) != MATCH_SCRATCH && GET_CODE (tmp) != MATCH_DUP) | |
2551 { | |
2552 XVECEXP (x, 0, j) = tmp; | |
2553 j++; | |
2554 } | |
2555 } | |
2556 XVECLEN (x, 0) = j; | |
2557 | |
2558 c_test_pos[0] = 'A' + j - 1; | |
2559 c_test_pos[1] = '\0'; | |
2560 } | |
2561 else if (XVECLEN (insn, type == RECOG) == 1) | |
2562 x = XVECEXP (insn, type == RECOG, 0); | |
2563 else | |
2564 { | |
2565 x = rtx_alloc (PARALLEL); | |
2566 XVEC (x, 0) = XVEC (insn, type == RECOG); | |
2567 PUT_MODE (x, VOIDmode); | |
2568 } | |
2569 | |
2570 validate_pattern (x, insn, NULL_RTX, 0); | |
2571 | |
2572 memset(&head, 0, sizeof(head)); | |
2573 last = add_to_sequence (x, &head, "", type, 1); | |
2574 | |
2575 /* Find the end of the test chain on the last node. */ | |
2576 for (test = last->tests; test->next; test = test->next) | |
2577 continue; | |
2578 place = &test->next; | |
2579 | |
2580 /* Skip the C test if it's known to be true at compile time. */ | |
2581 if (truth == -1) | |
2582 { | |
2583 /* Need a new node if we have another test to add. */ | |
2584 if (test->type == DT_accept_op) | |
2585 { | |
2586 last = new_decision (c_test_pos, &last->success); | |
2587 place = &last->tests; | |
2588 } | |
2589 test = new_decision_test (DT_c_test, &place); | |
2590 test->u.c_test = c_test; | |
2591 } | |
2592 | |
2593 test = new_decision_test (DT_accept_insn, &place); | |
2594 test->u.insn.code_number = next_insn_code; | |
2595 test->u.insn.lineno = pattern_lineno; | |
2596 test->u.insn.num_clobbers_to_add = 0; | |
2597 | |
2598 switch (type) | |
2599 { | |
2600 case RECOG: | |
2601 /* If this is a DEFINE_INSN and X is a PARALLEL, see if it ends | |
2602 with a group of CLOBBERs of (hard) registers or MATCH_SCRATCHes. | |
2603 If so, set up to recognize the pattern without these CLOBBERs. */ | |
2604 | |
2605 if (GET_CODE (x) == PARALLEL) | |
2606 { | |
2607 int i; | |
2608 | |
2609 /* Find the last non-clobber in the parallel. */ | |
2610 for (i = XVECLEN (x, 0); i > 0; i--) | |
2611 { | |
2612 rtx y = XVECEXP (x, 0, i - 1); | |
2613 if (GET_CODE (y) != CLOBBER | |
2614 || (!REG_P (XEXP (y, 0)) | |
2615 && GET_CODE (XEXP (y, 0)) != MATCH_SCRATCH)) | |
2616 break; | |
2617 } | |
2618 | |
2619 if (i != XVECLEN (x, 0)) | |
2620 { | |
2621 rtx new_rtx; | |
2622 struct decision_head clobber_head; | |
2623 | |
2624 /* Build a similar insn without the clobbers. */ | |
2625 if (i == 1) | |
2626 new_rtx = XVECEXP (x, 0, 0); | |
2627 else | |
2628 { | |
2629 int j; | |
2630 | |
2631 new_rtx = rtx_alloc (PARALLEL); | |
2632 XVEC (new_rtx, 0) = rtvec_alloc (i); | |
2633 for (j = i - 1; j >= 0; j--) | |
2634 XVECEXP (new_rtx, 0, j) = XVECEXP (x, 0, j); | |
2635 } | |
2636 | |
2637 /* Recognize it. */ | |
2638 memset (&clobber_head, 0, sizeof(clobber_head)); | |
2639 last = add_to_sequence (new_rtx, &clobber_head, "", type, 1); | |
2640 | |
2641 /* Find the end of the test chain on the last node. */ | |
2642 for (test = last->tests; test->next; test = test->next) | |
2643 continue; | |
2644 | |
2645 /* We definitely have a new test to add -- create a new | |
2646 node if needed. */ | |
2647 place = &test->next; | |
2648 if (test->type == DT_accept_op) | |
2649 { | |
2650 last = new_decision ("", &last->success); | |
2651 place = &last->tests; | |
2652 } | |
2653 | |
2654 /* Skip the C test if it's known to be true at compile | |
2655 time. */ | |
2656 if (truth == -1) | |
2657 { | |
2658 test = new_decision_test (DT_c_test, &place); | |
2659 test->u.c_test = c_test; | |
2660 } | |
2661 | |
2662 test = new_decision_test (DT_accept_insn, &place); | |
2663 test->u.insn.code_number = next_insn_code; | |
2664 test->u.insn.lineno = pattern_lineno; | |
2665 test->u.insn.num_clobbers_to_add = XVECLEN (x, 0) - i; | |
2666 | |
2667 merge_trees (&head, &clobber_head); | |
2668 } | |
2669 } | |
2670 break; | |
2671 | |
2672 case SPLIT: | |
2673 /* Define the subroutine we will call below and emit in genemit. */ | |
2674 printf ("extern rtx gen_split_%d (rtx, rtx *);\n", next_insn_code); | |
2675 break; | |
2676 | |
2677 case PEEPHOLE2: | |
2678 /* Define the subroutine we will call below and emit in genemit. */ | |
2679 printf ("extern rtx gen_peephole2_%d (rtx, rtx *);\n", | |
2680 next_insn_code); | |
2681 break; | |
2682 } | |
2683 | |
2684 return head; | |
2685 } | |
2686 | |
2687 static void | |
2688 process_tree (struct decision_head *head, enum routine_type subroutine_type) | |
2689 { | |
2690 if (head->first == NULL) | |
2691 { | |
2692 /* We can elide peephole2_insns, but not recog or split_insns. */ | |
2693 if (subroutine_type == PEEPHOLE2) | |
2694 return; | |
2695 } | |
2696 else | |
2697 { | |
2698 factor_tests (head); | |
2699 | |
2700 next_subroutine_number = 0; | |
2701 break_out_subroutines (head, 1); | |
2702 find_afterward (head, NULL); | |
2703 | |
2704 /* We run this after find_afterward, because find_afterward needs | |
2705 the redundant DT_mode tests on predicates to determine whether | |
2706 two tests can both be true or not. */ | |
2707 simplify_tests(head); | |
2708 | |
2709 write_subroutines (head, subroutine_type); | |
2710 } | |
2711 | |
2712 write_subroutine (head, subroutine_type); | |
2713 } | |
2714 | |
2715 extern int main (int, char **); | |
2716 | |
2717 int | |
2718 main (int argc, char **argv) | |
2719 { | |
2720 rtx desc; | |
2721 struct decision_head recog_tree, split_tree, peephole2_tree, h; | |
2722 | |
2723 progname = "genrecog"; | |
2724 | |
2725 memset (&recog_tree, 0, sizeof recog_tree); | |
2726 memset (&split_tree, 0, sizeof split_tree); | |
2727 memset (&peephole2_tree, 0, sizeof peephole2_tree); | |
2728 | |
2729 if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE) | |
2730 return (FATAL_EXIT_CODE); | |
2731 | |
2732 next_insn_code = 0; | |
2733 | |
2734 write_header (); | |
2735 | |
2736 /* Read the machine description. */ | |
2737 | |
2738 while (1) | |
2739 { | |
2740 desc = read_md_rtx (&pattern_lineno, &next_insn_code); | |
2741 if (desc == NULL) | |
2742 break; | |
2743 | |
2744 switch (GET_CODE (desc)) | |
2745 { | |
2746 case DEFINE_PREDICATE: | |
2747 case DEFINE_SPECIAL_PREDICATE: | |
2748 process_define_predicate (desc); | |
2749 break; | |
2750 | |
2751 case DEFINE_INSN: | |
2752 h = make_insn_sequence (desc, RECOG); | |
2753 merge_trees (&recog_tree, &h); | |
2754 break; | |
2755 | |
2756 case DEFINE_SPLIT: | |
2757 h = make_insn_sequence (desc, SPLIT); | |
2758 merge_trees (&split_tree, &h); | |
2759 break; | |
2760 | |
2761 case DEFINE_PEEPHOLE2: | |
2762 h = make_insn_sequence (desc, PEEPHOLE2); | |
2763 merge_trees (&peephole2_tree, &h); | |
2764 | |
2765 default: | |
2766 /* do nothing */; | |
2767 } | |
2768 } | |
2769 | |
2770 if (error_count || have_error) | |
2771 return FATAL_EXIT_CODE; | |
2772 | |
2773 puts ("\n\n"); | |
2774 | |
2775 process_tree (&recog_tree, RECOG); | |
2776 process_tree (&split_tree, SPLIT); | |
2777 process_tree (&peephole2_tree, PEEPHOLE2); | |
2778 | |
2779 fflush (stdout); | |
2780 return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); | |
2781 } | |
2782 | |
2783 static void | |
2784 debug_decision_2 (struct decision_test *test) | |
2785 { | |
2786 switch (test->type) | |
2787 { | |
2788 case DT_num_insns: | |
2789 fprintf (stderr, "num_insns=%d", test->u.num_insns); | |
2790 break; | |
2791 case DT_mode: | |
2792 fprintf (stderr, "mode=%s", GET_MODE_NAME (test->u.mode)); | |
2793 break; | |
2794 case DT_code: | |
2795 fprintf (stderr, "code=%s", GET_RTX_NAME (test->u.code)); | |
2796 break; | |
2797 case DT_veclen: | |
2798 fprintf (stderr, "veclen=%d", test->u.veclen); | |
2799 break; | |
2800 case DT_elt_zero_int: | |
2801 fprintf (stderr, "elt0_i=%d", (int) test->u.intval); | |
2802 break; | |
2803 case DT_elt_one_int: | |
2804 fprintf (stderr, "elt1_i=%d", (int) test->u.intval); | |
2805 break; | |
2806 case DT_elt_zero_wide: | |
2807 fprintf (stderr, "elt0_w=" HOST_WIDE_INT_PRINT_DEC, test->u.intval); | |
2808 break; | |
2809 case DT_elt_zero_wide_safe: | |
2810 fprintf (stderr, "elt0_ws=" HOST_WIDE_INT_PRINT_DEC, test->u.intval); | |
2811 break; | |
2812 case DT_veclen_ge: | |
2813 fprintf (stderr, "veclen>=%d", test->u.veclen); | |
2814 break; | |
2815 case DT_dup: | |
2816 fprintf (stderr, "dup=%d", test->u.dup); | |
2817 break; | |
2818 case DT_pred: | |
2819 fprintf (stderr, "pred=(%s,%s)", | |
2820 test->u.pred.name, GET_MODE_NAME(test->u.pred.mode)); | |
2821 break; | |
2822 case DT_c_test: | |
2823 { | |
2824 char sub[16+4]; | |
2825 strncpy (sub, test->u.c_test, sizeof(sub)); | |
2826 memcpy (sub+16, "...", 4); | |
2827 fprintf (stderr, "c_test=\"%s\"", sub); | |
2828 } | |
2829 break; | |
2830 case DT_accept_op: | |
2831 fprintf (stderr, "A_op=%d", test->u.opno); | |
2832 break; | |
2833 case DT_accept_insn: | |
2834 fprintf (stderr, "A_insn=(%d,%d)", | |
2835 test->u.insn.code_number, test->u.insn.num_clobbers_to_add); | |
2836 break; | |
2837 | |
2838 default: | |
2839 gcc_unreachable (); | |
2840 } | |
2841 } | |
2842 | |
2843 static void | |
2844 debug_decision_1 (struct decision *d, int indent) | |
2845 { | |
2846 int i; | |
2847 struct decision_test *test; | |
2848 | |
2849 if (d == NULL) | |
2850 { | |
2851 for (i = 0; i < indent; ++i) | |
2852 putc (' ', stderr); | |
2853 fputs ("(nil)\n", stderr); | |
2854 return; | |
2855 } | |
2856 | |
2857 for (i = 0; i < indent; ++i) | |
2858 putc (' ', stderr); | |
2859 | |
2860 putc ('{', stderr); | |
2861 test = d->tests; | |
2862 if (test) | |
2863 { | |
2864 debug_decision_2 (test); | |
2865 while ((test = test->next) != NULL) | |
2866 { | |
2867 fputs (" + ", stderr); | |
2868 debug_decision_2 (test); | |
2869 } | |
2870 } | |
2871 fprintf (stderr, "} %d n %d a %d\n", d->number, | |
2872 (d->next ? d->next->number : -1), | |
2873 (d->afterward ? d->afterward->number : -1)); | |
2874 } | |
2875 | |
2876 static void | |
2877 debug_decision_0 (struct decision *d, int indent, int maxdepth) | |
2878 { | |
2879 struct decision *n; | |
2880 int i; | |
2881 | |
2882 if (maxdepth < 0) | |
2883 return; | |
2884 if (d == NULL) | |
2885 { | |
2886 for (i = 0; i < indent; ++i) | |
2887 putc (' ', stderr); | |
2888 fputs ("(nil)\n", stderr); | |
2889 return; | |
2890 } | |
2891 | |
2892 debug_decision_1 (d, indent); | |
2893 for (n = d->success.first; n ; n = n->next) | |
2894 debug_decision_0 (n, indent + 2, maxdepth - 1); | |
2895 } | |
2896 | |
2897 void | |
2898 debug_decision (struct decision *d) | |
2899 { | |
2900 debug_decision_0 (d, 0, 1000000); | |
2901 } | |
2902 | |
2903 void | |
2904 debug_decision_list (struct decision *d) | |
2905 { | |
2906 while (d) | |
2907 { | |
2908 debug_decision_0 (d, 0, 0); | |
2909 d = d->next; | |
2910 } | |
2911 } |