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