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