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