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