0
|
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 }
|