]> gcc.gnu.org Git - gcc.git/blob - gcc/genrecog.c
cppp.c (xrealloc): Fix typo last change.
[gcc.git] / gcc / genrecog.c
1 /* Generate code from machine description to recognize rtl as insns.
2 Copyright (C) 1987, 88, 92-95, 97-98, 1999 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21
22 /* This program is used to produce insn-recog.c, which contains
23 a function called `recog' plus its subroutines.
24 These functions contain a decision tree
25 that recognizes whether an rtx, the argument given to recog,
26 is a valid instruction.
27
28 recog returns -1 if the rtx is not valid.
29 If the rtx is valid, recog returns a nonnegative number
30 which is the insn code number for the pattern that matched.
31 This is the same as the order in the machine description of the
32 entry that matched. This number can be used as an index into various
33 insn_* tables, such as insn_template, insn_outfun, and insn_n_operands
34 (found in insn-output.c).
35
36 The third argument to recog is an optional pointer to an int.
37 If present, recog will accept a pattern if it matches except for
38 missing CLOBBER expressions at the end. In that case, the value
39 pointed to by the optional pointer will be set to the number of
40 CLOBBERs that need to be added (it should be initialized to zero by
41 the caller). If it is set nonzero, the caller should allocate a
42 PARALLEL of the appropriate size, copy the initial entries, and call
43 add_clobbers (found in insn-emit.c) to fill in the CLOBBERs.
44
45 This program also generates the function `split_insns',
46 which returns 0 if the rtl could not be split, or
47 it returns the split rtl in a SEQUENCE. */
48
49 #include "hconfig.h"
50 #include "system.h"
51 #include "rtl.h"
52 #include "obstack.h"
53
54 #define OUTPUT_LABEL(INDENT_STRING, LABEL_NUMBER) \
55 printf("%sL%d: ATTRIBUTE_UNUSED_LABEL\n", (INDENT_STRING), (LABEL_NUMBER))
56
57 static struct obstack obstack;
58 struct obstack *rtl_obstack = &obstack;
59
60 #define obstack_chunk_alloc xmalloc
61 #define obstack_chunk_free free
62
63 /* Holds an array of names indexed by insn_code_number. */
64 char **insn_name_ptr = 0;
65 int insn_name_ptr_size = 0;
66
67 /* Data structure for a listhead of decision trees. The alternatives
68 to a node are kept in a doublely-linked list so we can easily add nodes
69 to the proper place when merging. */
70
71 struct decision_head { struct decision *first, *last; };
72
73 /* Data structure for decision tree for recognizing
74 legitimate instructions. */
75
76 struct decision
77 {
78 int number; /* Node number, used for labels */
79 char *position; /* String denoting position in pattern */
80 RTX_CODE code; /* Code to test for or UNKNOWN to suppress */
81 char ignore_code; /* If non-zero, need not test code */
82 char ignore_mode; /* If non-zero, need not test mode */
83 int veclen; /* Length of vector, if nonzero */
84 enum machine_mode mode; /* Machine mode of node */
85 char enforce_mode; /* If non-zero, test `mode' */
86 char retest_code, retest_mode; /* See write_tree_1 */
87 int test_elt_zero_int; /* Nonzero if should test XINT (rtl, 0) */
88 int elt_zero_int; /* Required value for XINT (rtl, 0) */
89 int test_elt_one_int; /* Nonzero if should test XINT (rtl, 1) */
90 int elt_one_int; /* Required value for XINT (rtl, 1) */
91 int test_elt_zero_wide; /* Nonzero if should test XWINT (rtl, 0) */
92 HOST_WIDE_INT elt_zero_wide; /* Required value for XWINT (rtl, 0) */
93 const char *tests; /* If nonzero predicate to call */
94 int pred; /* `preds' index of predicate or -1 */
95 char *c_test; /* Additional test to perform */
96 struct decision_head success; /* Nodes to test on success */
97 int insn_code_number; /* Insn number matched, if success */
98 int num_clobbers_to_add; /* Number of CLOBBERs to be added to pattern */
99 struct decision *next; /* Node to test on failure */
100 struct decision *prev; /* Node whose failure tests us */
101 struct decision *afterward; /* Node to test on success, but failure of
102 successor nodes */
103 int opno; /* Operand number, if >= 0 */
104 int dupno; /* Number of operand to compare against */
105 int label_needed; /* Nonzero if label needed when writing tree */
106 int subroutine_number; /* Number of subroutine this node starts */
107 };
108
109 #define SUBROUTINE_THRESHOLD 50
110
111 static int next_subroutine_number;
112
113 /* We can write two types of subroutines: One for insn recognition and
114 one to split insns. This defines which type is being written. */
115
116 enum routine_type {RECOG, SPLIT};
117
118 /* Next available node number for tree nodes. */
119
120 static int next_number;
121
122 /* Next number to use as an insn_code. */
123
124 static int next_insn_code;
125
126 /* Similar, but counts all expressions in the MD file; used for
127 error messages. */
128
129 static int next_index;
130
131 /* Record the highest depth we ever have so we know how many variables to
132 allocate in each subroutine we make. */
133
134 static int max_depth;
135 \f
136 /* This table contains a list of the rtl codes that can possibly match a
137 predicate defined in recog.c. The function `not_both_true' uses it to
138 deduce that there are no expressions that can be matches by certain pairs
139 of tree nodes. Also, if a predicate can match only one code, we can
140 hardwire that code into the node testing the predicate. */
141
142 static struct pred_table
143 {
144 const char *name;
145 RTX_CODE codes[NUM_RTX_CODE];
146 } preds[]
147 = {{"general_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
148 LABEL_REF, SUBREG, REG, MEM}},
149 #ifdef PREDICATE_CODES
150 PREDICATE_CODES
151 #endif
152 {"address_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
153 LABEL_REF, SUBREG, REG, MEM, PLUS, MINUS, MULT}},
154 {"register_operand", {SUBREG, REG}},
155 {"scratch_operand", {SCRATCH, REG}},
156 {"immediate_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
157 LABEL_REF}},
158 {"const_int_operand", {CONST_INT}},
159 {"const_double_operand", {CONST_INT, CONST_DOUBLE}},
160 {"nonimmediate_operand", {SUBREG, REG, MEM}},
161 {"nonmemory_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
162 LABEL_REF, SUBREG, REG}},
163 {"push_operand", {MEM}},
164 {"pop_operand", {MEM}},
165 {"memory_operand", {SUBREG, MEM}},
166 {"indirect_operand", {SUBREG, MEM}},
167 {"comparison_operator", {EQ, NE, LE, LT, GE, GT, LEU, LTU, GEU, GTU}},
168 {"mode_independent_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
169 LABEL_REF, SUBREG, REG, MEM}}};
170
171 #define NUM_KNOWN_PREDS (sizeof preds / sizeof preds[0])
172
173 static struct decision_head make_insn_sequence PROTO((rtx, enum routine_type));
174 static struct decision *add_to_sequence PROTO((rtx, struct decision_head *,
175 const char *));
176 static int not_both_true PROTO((struct decision *, struct decision *,
177 int));
178 static int position_merit PROTO((struct decision *, enum machine_mode,
179 enum rtx_code));
180 static struct decision_head merge_trees PROTO((struct decision_head,
181 struct decision_head));
182 static int break_out_subroutines PROTO((struct decision_head,
183 enum routine_type, int));
184 static void write_subroutine PROTO((struct decision *, enum routine_type));
185 static void write_tree_1 PROTO((struct decision *, const char *,
186 struct decision *, enum routine_type));
187 static void print_code PROTO((enum rtx_code));
188 static int same_codes PROTO((struct decision *, enum rtx_code));
189 static void clear_codes PROTO((struct decision *));
190 static int same_modes PROTO((struct decision *, enum machine_mode));
191 static void clear_modes PROTO((struct decision *));
192 static void write_tree PROTO((struct decision *, const char *,
193 struct decision *, int,
194 enum routine_type));
195 static void change_state PROTO((const char *, const char *, int));
196 static void fatal PVPROTO((const char *, ...))
197 ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
198 void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN;
199 \f
200 /* Construct and return a sequence of decisions
201 that will recognize INSN.
202
203 TYPE says what type of routine we are recognizing (RECOG or SPLIT). */
204
205 static struct decision_head
206 make_insn_sequence (insn, type)
207 rtx insn;
208 enum routine_type type;
209 {
210 rtx x;
211 char *c_test = XSTR (insn, type == RECOG ? 2 : 1);
212 struct decision *last;
213 struct decision_head head;
214
215 {
216 static char *last_real_name = "insn";
217 static int last_real_code = 0;
218 char *name;
219
220 if (insn_name_ptr_size <= next_insn_code)
221 {
222 int new_size;
223 new_size = (insn_name_ptr_size ? insn_name_ptr_size * 2 : 512);
224 insn_name_ptr = xrealloc (insn_name_ptr, sizeof(char *) * new_size);
225 bzero (insn_name_ptr + insn_name_ptr_size,
226 sizeof(char *) * (new_size - insn_name_ptr_size));
227 insn_name_ptr_size = new_size;
228 }
229
230 name = XSTR (insn, 0);
231 if (!name || name[0] == '\0')
232 {
233 name = xmalloc (strlen (last_real_name) + 10);
234 sprintf (name, "%s+%d", last_real_name,
235 next_insn_code - last_real_code);
236 }
237 else
238 {
239 last_real_name = name;
240 last_real_code = next_insn_code;
241 }
242
243 insn_name_ptr[next_insn_code] = name;
244 }
245
246 if (XVECLEN (insn, type == RECOG) == 1)
247 x = XVECEXP (insn, type == RECOG, 0);
248 else
249 {
250 x = rtx_alloc (PARALLEL);
251 XVEC (x, 0) = XVEC (insn, type == RECOG);
252 PUT_MODE (x, VOIDmode);
253 }
254
255 last = add_to_sequence (x, &head, "");
256
257 if (c_test[0])
258 last->c_test = c_test;
259 last->insn_code_number = next_insn_code;
260 last->num_clobbers_to_add = 0;
261
262 /* If this is not a DEFINE_SPLIT and X is a PARALLEL, see if it ends with a
263 group of CLOBBERs of (hard) registers or MATCH_SCRATCHes. If so, set up
264 to recognize the pattern without these CLOBBERs. */
265
266 if (type == RECOG && GET_CODE (x) == PARALLEL)
267 {
268 int i;
269
270 for (i = XVECLEN (x, 0); i > 0; i--)
271 if (GET_CODE (XVECEXP (x, 0, i - 1)) != CLOBBER
272 || (GET_CODE (XEXP (XVECEXP (x, 0, i - 1), 0)) != REG
273 && GET_CODE (XEXP (XVECEXP (x, 0, i - 1), 0)) != MATCH_SCRATCH))
274 break;
275
276 if (i != XVECLEN (x, 0))
277 {
278 rtx new;
279 struct decision_head clobber_head;
280
281 if (i == 1)
282 new = XVECEXP (x, 0, 0);
283 else
284 {
285 int j;
286
287 new = rtx_alloc (PARALLEL);
288 XVEC (new, 0) = rtvec_alloc (i);
289 for (j = i - 1; j >= 0; j--)
290 XVECEXP (new, 0, j) = XVECEXP (x, 0, j);
291 }
292
293 last = add_to_sequence (new, &clobber_head, "");
294
295 if (c_test[0])
296 last->c_test = c_test;
297 last->insn_code_number = next_insn_code;
298 last->num_clobbers_to_add = XVECLEN (x, 0) - i;
299
300 head = merge_trees (head, clobber_head);
301 }
302 }
303
304 next_insn_code++;
305
306 if (type == SPLIT)
307 /* Define the subroutine we will call below and emit in genemit. */
308 printf ("extern rtx gen_split_%d ();\n", last->insn_code_number);
309
310 return head;
311 }
312 \f
313 /* Create a chain of nodes to verify that an rtl expression matches
314 PATTERN.
315
316 LAST is a pointer to the listhead in the previous node in the chain (or
317 in the calling function, for the first node).
318
319 POSITION is the string representing the current position in the insn.
320
321 A pointer to the final node in the chain is returned. */
322
323 static struct decision *
324 add_to_sequence (pattern, last, position)
325 rtx pattern;
326 struct decision_head *last;
327 const char *position;
328 {
329 register RTX_CODE code;
330 register struct decision *new
331 = (struct decision *) xmalloc (sizeof (struct decision));
332 struct decision *this;
333 char *newpos;
334 register char *fmt;
335 register size_t i;
336 int depth = strlen (position);
337 int len;
338
339 if (depth > max_depth)
340 max_depth = depth;
341
342 new->number = next_number++;
343 new->position = xstrdup (position);
344 new->ignore_code = 0;
345 new->ignore_mode = 0;
346 new->enforce_mode = 1;
347 new->retest_code = new->retest_mode = 0;
348 new->veclen = 0;
349 new->test_elt_zero_int = 0;
350 new->test_elt_one_int = 0;
351 new->test_elt_zero_wide = 0;
352 new->elt_zero_int = 0;
353 new->elt_one_int = 0;
354 new->elt_zero_wide = 0;
355 new->tests = 0;
356 new->pred = -1;
357 new->c_test = 0;
358 new->success.first = new->success.last = 0;
359 new->insn_code_number = -1;
360 new->num_clobbers_to_add = 0;
361 new->next = 0;
362 new->prev = 0;
363 new->afterward = 0;
364 new->opno = -1;
365 new->dupno = -1;
366 new->label_needed = 0;
367 new->subroutine_number = 0;
368
369 this = new;
370
371 last->first = last->last = new;
372
373 newpos = (char *) alloca (depth + 2);
374 strcpy (newpos, position);
375 newpos[depth + 1] = 0;
376
377 restart:
378
379 new->mode = GET_MODE (pattern);
380 new->code = code = GET_CODE (pattern);
381
382 switch (code)
383 {
384 case MATCH_OPERAND:
385 case MATCH_SCRATCH:
386 case MATCH_OPERATOR:
387 case MATCH_PARALLEL:
388 case MATCH_INSN2:
389 new->opno = XINT (pattern, 0);
390 new->code = (code == MATCH_PARALLEL ? PARALLEL : UNKNOWN);
391 new->enforce_mode = 0;
392
393 if (code == MATCH_SCRATCH)
394 new->tests = "scratch_operand";
395 else
396 new->tests = XSTR (pattern, 1);
397
398 if (*new->tests == 0)
399 new->tests = 0;
400
401 /* See if we know about this predicate and save its number. If we do,
402 and it only accepts one code, note that fact. The predicate
403 `const_int_operand' only tests for a CONST_INT, so if we do so we
404 can avoid calling it at all.
405
406 Finally, if we know that the predicate does not allow CONST_INT, we
407 know that the only way the predicate can match is if the modes match
408 (here we use the kludge of relying on the fact that "address_operand"
409 accepts CONST_INT; otherwise, it would have to be a special case),
410 so we can test the mode (but we need not). This fact should
411 considerably simplify the generated code. */
412
413 if (new->tests)
414 {
415 for (i = 0; i < NUM_KNOWN_PREDS; i++)
416 if (! strcmp (preds[i].name, new->tests))
417 {
418 int j;
419 int allows_const_int = 0;
420
421 new->pred = i;
422
423 if (preds[i].codes[1] == 0 && new->code == UNKNOWN)
424 {
425 new->code = preds[i].codes[0];
426 if (! strcmp ("const_int_operand", new->tests))
427 new->tests = 0, new->pred = -1;
428 }
429
430 for (j = 0; j < NUM_RTX_CODE && preds[i].codes[j] != 0; j++)
431 if (preds[i].codes[j] == CONST_INT)
432 allows_const_int = 1;
433
434 if (! allows_const_int)
435 new->enforce_mode = new->ignore_mode= 1;
436
437 break;
438 }
439
440 #ifdef PREDICATE_CODES
441 /* If the port has a list of the predicates it uses but omits
442 one, warn. */
443 if (i == NUM_KNOWN_PREDS)
444 fprintf (stderr, "Warning: `%s' not in PREDICATE_CODES\n",
445 new->tests);
446 #endif
447 }
448
449 if (code == MATCH_OPERATOR || code == MATCH_PARALLEL)
450 {
451 for (i = 0; i < (size_t) XVECLEN (pattern, 2); i++)
452 {
453 newpos[depth] = i + (code == MATCH_OPERATOR ? '0': 'a');
454 new = add_to_sequence (XVECEXP (pattern, 2, i),
455 &new->success, newpos);
456 }
457 }
458
459 return new;
460
461 case MATCH_OP_DUP:
462 new->opno = XINT (pattern, 0);
463 new->dupno = XINT (pattern, 0);
464 new->code = UNKNOWN;
465 new->tests = 0;
466 for (i = 0; i < (size_t) XVECLEN (pattern, 1); i++)
467 {
468 newpos[depth] = i + '0';
469 new = add_to_sequence (XVECEXP (pattern, 1, i),
470 &new->success, newpos);
471 }
472 return new;
473
474 case MATCH_DUP:
475 case MATCH_PAR_DUP:
476 new->dupno = XINT (pattern, 0);
477 new->code = UNKNOWN;
478 new->enforce_mode = 0;
479 return new;
480
481 case ADDRESS:
482 pattern = XEXP (pattern, 0);
483 goto restart;
484
485 case SET:
486 /* The operands of a SET must have the same mode unless one is VOIDmode. */
487 if (GET_MODE (SET_SRC (pattern)) != VOIDmode
488 && GET_MODE (SET_DEST (pattern)) != VOIDmode
489 && GET_MODE (SET_SRC (pattern)) != GET_MODE (SET_DEST (pattern))
490 /* The mode of an ADDRESS_OPERAND is the mode of the memory reference,
491 not the mode of the address. */
492 && ! (GET_CODE (SET_SRC (pattern)) == MATCH_OPERAND
493 && ! strcmp (XSTR (SET_SRC (pattern), 1), "address_operand")))
494 {
495 print_rtl (stderr, pattern);
496 fputc ('\n', stderr);
497 fatal ("mode mismatch in SET");
498 }
499 newpos[depth] = '0';
500 new = add_to_sequence (SET_DEST (pattern), &new->success, newpos);
501 this->success.first->enforce_mode = 1;
502 newpos[depth] = '1';
503 new = add_to_sequence (SET_SRC (pattern), &new->success, newpos);
504
505 /* If set are setting CC0 from anything other than a COMPARE, we
506 must enforce the mode so that we do not produce ambiguous insns. */
507 if (GET_CODE (SET_DEST (pattern)) == CC0
508 && GET_CODE (SET_SRC (pattern)) != COMPARE)
509 this->success.first->enforce_mode = 1;
510 return new;
511
512 case SIGN_EXTEND:
513 case ZERO_EXTEND:
514 case STRICT_LOW_PART:
515 newpos[depth] = '0';
516 new = add_to_sequence (XEXP (pattern, 0), &new->success, newpos);
517 this->success.first->enforce_mode = 1;
518 return new;
519
520 case SUBREG:
521 this->test_elt_one_int = 1;
522 this->elt_one_int = XINT (pattern, 1);
523 newpos[depth] = '0';
524 new = add_to_sequence (XEXP (pattern, 0), &new->success, newpos);
525 this->success.first->enforce_mode = 1;
526 return new;
527
528 case ZERO_EXTRACT:
529 case SIGN_EXTRACT:
530 newpos[depth] = '0';
531 new = add_to_sequence (XEXP (pattern, 0), &new->success, newpos);
532 this->success.first->enforce_mode = 1;
533 newpos[depth] = '1';
534 new = add_to_sequence (XEXP (pattern, 1), &new->success, newpos);
535 newpos[depth] = '2';
536 new = add_to_sequence (XEXP (pattern, 2), &new->success, newpos);
537 return new;
538
539 case EQ: case NE: case LE: case LT: case GE: case GT:
540 case LEU: case LTU: case GEU: case GTU:
541 /* If the first operand is (cc0), we don't have to do anything
542 special. */
543 if (GET_CODE (XEXP (pattern, 0)) == CC0)
544 break;
545
546 /* ... fall through ... */
547
548 case COMPARE:
549 /* Enforce the mode on the first operand to avoid ambiguous insns. */
550 newpos[depth] = '0';
551 new = add_to_sequence (XEXP (pattern, 0), &new->success, newpos);
552 this->success.first->enforce_mode = 1;
553 newpos[depth] = '1';
554 new = add_to_sequence (XEXP (pattern, 1), &new->success, newpos);
555 return new;
556
557 default:
558 break;
559 }
560
561 fmt = GET_RTX_FORMAT (code);
562 len = GET_RTX_LENGTH (code);
563 for (i = 0; i < (size_t) len; i++)
564 {
565 newpos[depth] = '0' + i;
566 if (fmt[i] == 'e' || fmt[i] == 'u')
567 new = add_to_sequence (XEXP (pattern, i), &new->success, newpos);
568 else if (fmt[i] == 'i' && i == 0)
569 {
570 this->test_elt_zero_int = 1;
571 this->elt_zero_int = XINT (pattern, i);
572 }
573 else if (fmt[i] == 'i' && i == 1)
574 {
575 this->test_elt_one_int = 1;
576 this->elt_one_int = XINT (pattern, i);
577 }
578 else if (fmt[i] == 'w' && i == 0)
579 {
580 this->test_elt_zero_wide = 1;
581 this->elt_zero_wide = XWINT (pattern, i);
582 }
583 else if (fmt[i] == 'E')
584 {
585 register int j;
586 /* We do not handle a vector appearing as other than
587 the first item, just because nothing uses them
588 and by handling only the special case
589 we can use one element in newpos for either
590 the item number of a subexpression
591 or the element number in a vector. */
592 if (i != 0)
593 abort ();
594 this->veclen = XVECLEN (pattern, i);
595 for (j = 0; j < XVECLEN (pattern, i); j++)
596 {
597 newpos[depth] = 'a' + j;
598 new = add_to_sequence (XVECEXP (pattern, i, j),
599 &new->success, newpos);
600 }
601 }
602 else if (fmt[i] != '0')
603 abort ();
604 }
605 return new;
606 }
607 \f
608 /* Return 1 if we can prove that there is no RTL that can match both
609 D1 and D2. Otherwise, return 0 (it may be that there is an RTL that
610 can match both or just that we couldn't prove there wasn't such an RTL).
611
612 TOPLEVEL is non-zero if we are to only look at the top level and not
613 recursively descend. */
614
615 static int
616 not_both_true (d1, d2, toplevel)
617 struct decision *d1, *d2;
618 int toplevel;
619 {
620 struct decision *p1, *p2;
621
622 /* If they are both to test modes and the modes are different, they aren't
623 both true. Similarly for codes, integer elements, and vector lengths. */
624
625 if ((d1->enforce_mode && d2->enforce_mode
626 && d1->mode != VOIDmode && d2->mode != VOIDmode && d1->mode != d2->mode)
627 || (d1->code != UNKNOWN && d2->code != UNKNOWN && d1->code != d2->code)
628 || (d1->test_elt_zero_int && d2->test_elt_zero_int
629 && d1->elt_zero_int != d2->elt_zero_int)
630 || (d1->test_elt_one_int && d2->test_elt_one_int
631 && d1->elt_one_int != d2->elt_one_int)
632 || (d1->test_elt_zero_wide && d2->test_elt_zero_wide
633 && d1->elt_zero_wide != d2->elt_zero_wide)
634 || (d1->veclen && d2->veclen && d1->veclen != d2->veclen))
635 return 1;
636
637 /* If either is a wild-card MATCH_OPERAND without a predicate, it can match
638 absolutely anything, so we can't say that no intersection is possible.
639 This case is detected by having a zero TESTS field with a code of
640 UNKNOWN. */
641
642 if ((d1->tests == 0 && d1->code == UNKNOWN)
643 || (d2->tests == 0 && d2->code == UNKNOWN))
644 return 0;
645
646 /* If either has a predicate that we know something about, set things up so
647 that D1 is the one that always has a known predicate. Then see if they
648 have any codes in common. */
649
650 if (d1->pred >= 0 || d2->pred >= 0)
651 {
652 int i, j;
653
654 if (d2->pred >= 0)
655 p1 = d1, d1 = d2, d2 = p1;
656
657 /* If D2 tests an explicit code, see if it is in the list of valid codes
658 for D1's predicate. */
659 if (d2->code != UNKNOWN)
660 {
661 for (i = 0; i < NUM_RTX_CODE && preds[d1->pred].codes[i] != 0; i++)
662 if (preds[d1->pred].codes[i] == d2->code)
663 break;
664
665 if (preds[d1->pred].codes[i] == 0)
666 return 1;
667 }
668
669 /* Otherwise see if the predicates have any codes in common. */
670
671 else if (d2->pred >= 0)
672 {
673 for (i = 0; i < NUM_RTX_CODE && preds[d1->pred].codes[i] != 0; i++)
674 {
675 for (j = 0; j < NUM_RTX_CODE; j++)
676 if (preds[d2->pred].codes[j] == 0
677 || preds[d2->pred].codes[j] == preds[d1->pred].codes[i])
678 break;
679
680 if (preds[d2->pred].codes[j] != 0)
681 break;
682 }
683
684 if (preds[d1->pred].codes[i] == 0)
685 return 1;
686 }
687 }
688
689 /* If we got here, we can't prove that D1 and D2 cannot both be true.
690 If we are only to check the top level, return 0. Otherwise, see if
691 we can prove that all choices in both successors are mutually
692 exclusive. If either does not have any successors, we can't prove
693 they can't both be true. */
694
695 if (toplevel || d1->success.first == 0 || d2->success.first == 0)
696 return 0;
697
698 for (p1 = d1->success.first; p1; p1 = p1->next)
699 for (p2 = d2->success.first; p2; p2 = p2->next)
700 if (! not_both_true (p1, p2, 0))
701 return 0;
702
703 return 1;
704 }
705 \f
706 /* Assuming that we can reorder all the alternatives at a specific point in
707 the tree (see discussion in merge_trees), we would prefer an ordering of
708 nodes where groups of consecutive nodes test the same mode and, within each
709 mode, groups of nodes test the same code. With this order, we can
710 construct nested switch statements, the inner one to test the code and
711 the outer one to test the mode.
712
713 We would like to list nodes testing for specific codes before those
714 that test predicates to avoid unnecessary function calls. Similarly,
715 tests for specific modes should precede nodes that allow any mode.
716
717 This function returns the merit (with 0 being the best) of inserting
718 a test involving the specified MODE and CODE after node P. If P is
719 zero, we are to determine the merit of inserting the test at the front
720 of the list. */
721
722 static int
723 position_merit (p, mode, code)
724 struct decision *p;
725 enum machine_mode mode;
726 enum rtx_code code;
727 {
728 enum machine_mode p_mode;
729
730 /* The only time the front of the list is anything other than the worst
731 position is if we are testing a mode that isn't VOIDmode. */
732 if (p == 0)
733 return mode == VOIDmode ? 3 : 2;
734
735 p_mode = p->enforce_mode ? p->mode : VOIDmode;
736
737 /* The best case is if the codes and modes both match. */
738 if (p_mode == mode && p->code== code)
739 return 0;
740
741 /* If the codes don't match, the next best case is if the modes match.
742 In that case, the best position for this node depends on whether
743 we are testing for a specific code or not. If we are, the best place
744 is after some other test for an explicit code and our mode or after
745 the last test in the previous mode if every test in our mode is for
746 an unknown code.
747
748 If we are testing for UNKNOWN, then the next best case is at the end of
749 our mode. */
750
751 if ((code != UNKNOWN
752 && ((p_mode == mode && p->code != UNKNOWN)
753 || (p_mode != mode && p->next
754 && (p->next->enforce_mode ? p->next->mode : VOIDmode) == mode
755 && (p->next->code == UNKNOWN))))
756 || (code == UNKNOWN && p_mode == mode
757 && (p->next == 0
758 || (p->next->enforce_mode ? p->next->mode : VOIDmode) != mode)))
759 return 1;
760
761 /* The third best case occurs when nothing is testing MODE. If MODE
762 is not VOIDmode, then the third best case is after something of any
763 mode that is not VOIDmode. If we are testing VOIDmode, the third best
764 place is the end of the list. */
765
766 if (p_mode != mode
767 && ((mode != VOIDmode && p_mode != VOIDmode)
768 || (mode == VOIDmode && p->next == 0)))
769 return 2;
770
771 /* Otherwise, we have the worst case. */
772 return 3;
773 }
774 \f
775 /* Merge two decision tree listheads OLDH and ADDH,
776 modifying OLDH destructively, and return the merged tree. */
777
778 static struct decision_head
779 merge_trees (oldh, addh)
780 register struct decision_head oldh, addh;
781 {
782 struct decision *add, *next;
783
784 if (oldh.first == 0)
785 return addh;
786
787 if (addh.first == 0)
788 return oldh;
789
790 /* If we are adding things at different positions, something is wrong. */
791 if (strcmp (oldh.first->position, addh.first->position))
792 abort ();
793
794 for (add = addh.first; add; add = next)
795 {
796 enum machine_mode add_mode = add->enforce_mode ? add->mode : VOIDmode;
797 struct decision *best_position = 0;
798 int best_merit = 4;
799 struct decision *old;
800
801 next = add->next;
802
803 /* The semantics of pattern matching state that the tests are done in
804 the order given in the MD file so that if an insn matches two
805 patterns, the first one will be used. However, in practice, most,
806 if not all, patterns are unambiguous so that their order is
807 independent. In that case, we can merge identical tests and
808 group all similar modes and codes together.
809
810 Scan starting from the end of OLDH until we reach a point
811 where we reach the head of the list or where we pass a pattern
812 that could also be true if NEW is true. If we find an identical
813 pattern, we can merge them. Also, record the last node that tests
814 the same code and mode and the last one that tests just the same mode.
815
816 If we have no match, place NEW after the closest match we found. */
817
818 for (old = oldh.last; old; old = old->prev)
819 {
820 int our_merit;
821
822 /* If we don't have anything to test except an additional test,
823 do not consider the two nodes equal. If we did, the test below
824 would cause an infinite recursion. */
825 if (old->tests == 0 && old->test_elt_zero_int == 0
826 && old->test_elt_one_int == 0 && old->veclen == 0
827 && old->test_elt_zero_wide == 0
828 && old->dupno == -1 && old->mode == VOIDmode
829 && old->code == UNKNOWN
830 && (old->c_test != 0 || add->c_test != 0))
831 ;
832
833 else if ((old->tests == add->tests
834 || (old->pred >= 0 && old->pred == add->pred)
835 || (old->tests && add->tests
836 && !strcmp (old->tests, add->tests)))
837 && old->test_elt_zero_int == add->test_elt_zero_int
838 && old->elt_zero_int == add->elt_zero_int
839 && old->test_elt_one_int == add->test_elt_one_int
840 && old->elt_one_int == add->elt_one_int
841 && old->test_elt_zero_wide == add->test_elt_zero_wide
842 && old->elt_zero_wide == add->elt_zero_wide
843 && old->veclen == add->veclen
844 && old->dupno == add->dupno
845 && old->opno == add->opno
846 && old->code == add->code
847 && old->enforce_mode == add->enforce_mode
848 && old->mode == add->mode)
849 {
850 /* If the additional test is not the same, split both nodes
851 into nodes that just contain all things tested before the
852 additional test and nodes that contain the additional test
853 and actions when it is true. This optimization is important
854 because of the case where we have almost identical patterns
855 with different tests on target flags. */
856
857 if (old->c_test != add->c_test
858 && ! (old->c_test && add->c_test
859 && !strcmp (old->c_test, add->c_test)))
860 {
861 if (old->insn_code_number >= 0 || old->opno >= 0)
862 {
863 struct decision *split
864 = (struct decision *) xmalloc (sizeof (struct decision));
865
866 memcpy (split, old, sizeof (struct decision));
867
868 old->success.first = old->success.last = split;
869 old->c_test = 0;
870 old->opno = -1;
871 old->insn_code_number = -1;
872 old->num_clobbers_to_add = 0;
873
874 split->number = next_number++;
875 split->next = split->prev = 0;
876 split->mode = VOIDmode;
877 split->code = UNKNOWN;
878 split->veclen = 0;
879 split->test_elt_zero_int = 0;
880 split->test_elt_one_int = 0;
881 split->test_elt_zero_wide = 0;
882 split->tests = 0;
883 split->pred = -1;
884 split->dupno = -1;
885 }
886
887 if (add->insn_code_number >= 0 || add->opno >= 0)
888 {
889 struct decision *split
890 = (struct decision *) xmalloc (sizeof (struct decision));
891
892 memcpy (split, add, sizeof (struct decision));
893
894 add->success.first = add->success.last = split;
895 add->c_test = 0;
896 add->opno = -1;
897 add->insn_code_number = -1;
898 add->num_clobbers_to_add = 0;
899
900 split->number = next_number++;
901 split->next = split->prev = 0;
902 split->mode = VOIDmode;
903 split->code = UNKNOWN;
904 split->veclen = 0;
905 split->test_elt_zero_int = 0;
906 split->test_elt_one_int = 0;
907 split->test_elt_zero_wide = 0;
908 split->tests = 0;
909 split->pred = -1;
910 split->dupno = -1;
911 }
912 }
913
914 if (old->insn_code_number >= 0 && add->insn_code_number >= 0)
915 {
916 /* If one node is for a normal insn and the second is
917 for the base insn with clobbers stripped off, the
918 second node should be ignored. */
919
920 if (old->num_clobbers_to_add == 0
921 && add->num_clobbers_to_add > 0)
922 /* Nothing to do here. */
923 ;
924 else if (old->num_clobbers_to_add > 0
925 && add->num_clobbers_to_add == 0)
926 {
927 /* In this case, replace OLD with ADD. */
928 old->insn_code_number = add->insn_code_number;
929 old->num_clobbers_to_add = 0;
930 }
931 else
932 fatal ("Two actions at one point in tree for insns \"%s\" (%d) and \"%s\" (%d)",
933 insn_name_ptr[old->insn_code_number],
934 old->insn_code_number,
935 insn_name_ptr[add->insn_code_number],
936 add->insn_code_number);
937 }
938
939 if (old->insn_code_number == -1)
940 old->insn_code_number = add->insn_code_number;
941 old->success = merge_trees (old->success, add->success);
942 add = 0;
943 break;
944 }
945
946 /* Unless we have already found the best possible insert point,
947 see if this position is better. If so, record it. */
948
949 if (best_merit != 0
950 && ((our_merit = position_merit (old, add_mode, add->code))
951 < best_merit))
952 best_merit = our_merit, best_position = old;
953
954 if (! not_both_true (old, add, 0))
955 break;
956 }
957
958 /* If ADD was duplicate, we are done. */
959 if (add == 0)
960 continue;
961
962 /* Otherwise, find the best place to insert ADD. Normally this is
963 BEST_POSITION. However, if we went all the way to the top of
964 the list, it might be better to insert at the top. */
965
966 if (best_position == 0)
967 abort ();
968
969 if (old == 0
970 && position_merit (NULL_PTR, add_mode, add->code) < best_merit)
971 {
972 add->prev = 0;
973 add->next = oldh.first;
974 oldh.first->prev = add;
975 oldh.first = add;
976 }
977
978 else
979 {
980 add->prev = best_position;
981 add->next = best_position->next;
982 best_position->next = add;
983 if (best_position == oldh.last)
984 oldh.last = add;
985 else
986 add->next->prev = add;
987 }
988 }
989
990 return oldh;
991 }
992 \f
993 /* Count the number of subnodes of HEAD. If the number is high enough,
994 make the first node in HEAD start a separate subroutine in the C code
995 that is generated.
996
997 TYPE gives the type of routine we are writing.
998
999 INITIAL is non-zero if this is the highest-level node. We never write
1000 it out here. */
1001
1002 static int
1003 break_out_subroutines (head, type, initial)
1004 struct decision_head head;
1005 enum routine_type type;
1006 int initial;
1007 {
1008 int size = 0;
1009 struct decision *sub;
1010
1011 for (sub = head.first; sub; sub = sub->next)
1012 size += 1 + break_out_subroutines (sub->success, type, 0);
1013
1014 if (size > SUBROUTINE_THRESHOLD && ! initial)
1015 {
1016 head.first->subroutine_number = ++next_subroutine_number;
1017 write_subroutine (head.first, type);
1018 size = 1;
1019 }
1020 return size;
1021 }
1022 \f
1023 /* Write out a subroutine of type TYPE to do comparisons starting at node
1024 TREE. */
1025
1026 static void
1027 write_subroutine (tree, type)
1028 struct decision *tree;
1029 enum routine_type type;
1030 {
1031 int i;
1032
1033 if (type == SPLIT)
1034 printf ("rtx\nsplit");
1035 else
1036 printf ("int\nrecog");
1037
1038 if (tree != 0 && tree->subroutine_number > 0)
1039 printf ("_%d", tree->subroutine_number);
1040 else if (type == SPLIT)
1041 printf ("_insns");
1042
1043 printf (" (x0, insn");
1044 if (type == RECOG)
1045 printf (", pnum_clobbers");
1046
1047 printf (")\n");
1048 printf (" register rtx x0;\n rtx insn ATTRIBUTE_UNUSED;\n");
1049 if (type == RECOG)
1050 printf (" int *pnum_clobbers ATTRIBUTE_UNUSED;\n");
1051
1052 printf ("{\n");
1053 printf (" register rtx *ro = &recog_operand[0];\n");
1054
1055 printf (" register rtx ");
1056 for (i = 1; i < max_depth; i++)
1057 printf ("x%d ATTRIBUTE_UNUSED, ", i);
1058
1059 printf ("x%d ATTRIBUTE_UNUSED;\n", max_depth);
1060 printf (" %s tem ATTRIBUTE_UNUSED;\n", type == SPLIT ? "rtx" : "int");
1061 write_tree (tree, "", NULL_PTR, 1, type);
1062 printf (" ret0: return %d;\n}\n\n", type == SPLIT ? 0 : -1);
1063 }
1064 \f
1065 /* This table is used to indent the recog_* functions when we are inside
1066 conditions or switch statements. We only support small indentations
1067 and always indent at least two spaces. */
1068
1069 static const char *indents[]
1070 = {" ", " ", " ", " ", " ", " ", " ", " ",
1071 "\t", "\t ", "\t ", "\t ", "\t ", "\t ", "\t ",
1072 "\t\t", "\t\t ", "\t\t ", "\t\t ", "\t\t ", "\t\t "};
1073
1074 /* Write out C code to perform the decisions in TREE for a subroutine of
1075 type TYPE. If all of the choices fail, branch to node AFTERWARD, if
1076 non-zero, otherwise return. PREVPOS is the position of the node that
1077 branched to this test.
1078
1079 When we merged all alternatives, we tried to set up a convenient order.
1080 Specifically, tests involving the same mode are all grouped together,
1081 followed by a group that does not contain a mode test. Within each group
1082 of the same mode, we also group tests with the same code, followed by a
1083 group that does not test a code.
1084
1085 Occasionally, we cannot arbitrarily reorder the tests so that multiple
1086 sequence of groups as described above are present.
1087
1088 We generate two nested switch statements, the outer statement for
1089 testing modes, and the inner switch for testing RTX codes. It is
1090 not worth optimizing cases when only a small number of modes or
1091 codes is tested, since the compiler can do that when compiling the
1092 resulting function. We do check for when every test is the same mode
1093 or code. */
1094
1095 static void
1096 write_tree_1 (tree, prevpos, afterward, type)
1097 struct decision *tree;
1098 const char *prevpos;
1099 struct decision *afterward;
1100 enum routine_type type;
1101 {
1102 register struct decision *p, *p1;
1103 register int depth = tree ? strlen (tree->position) : 0;
1104 enum machine_mode switch_mode = VOIDmode;
1105 RTX_CODE switch_code = UNKNOWN;
1106 int uncond = 0;
1107 char modemap[NUM_MACHINE_MODES];
1108 char codemap[NUM_RTX_CODE];
1109 int indent = 2;
1110 int i;
1111
1112 /* One tricky area is what is the exact state when we branch to a
1113 node's label. There are two cases where we branch: when looking at
1114 successors to a node, or when a set of tests fails.
1115
1116 In the former case, we are always branching to the first node in a
1117 decision list and we want all required tests to be performed. We
1118 put the labels for such nodes in front of any switch or test statements.
1119 These branches are done without updating the position to that of the
1120 target node.
1121
1122 In the latter case, we are branching to a node that is not the first
1123 node in a decision list. We have already checked that it is possible
1124 for both the node we originally tested at this level and the node we
1125 are branching to to both match some pattern. That means that they
1126 usually will be testing the same mode and code. So it is normally safe
1127 for such labels to be inside switch statements, since the tests done
1128 by virtue of arriving at that label will usually already have been
1129 done. The exception is a branch from a node that does not test a
1130 mode or code to one that does. In such cases, we set the `retest_mode'
1131 or `retest_code' flags. That will ensure that we start a new switch
1132 at that position and put the label before the switch.
1133
1134 The branches in the latter case must set the position to that of the
1135 target node. */
1136
1137
1138 printf ("\n");
1139 if (tree && tree->subroutine_number == 0)
1140 {
1141 OUTPUT_LABEL (" ", tree->number);
1142 tree->label_needed = 0;
1143 }
1144
1145 if (tree)
1146 {
1147 change_state (prevpos, tree->position, 2);
1148 prevpos = tree->position;
1149 }
1150
1151 for (p = tree; p; p = p->next)
1152 {
1153 enum machine_mode mode = p->enforce_mode ? p->mode : VOIDmode;
1154 int need_bracket;
1155 int wrote_bracket = 0;
1156 int inner_indent;
1157
1158 if (p->success.first == 0 && p->insn_code_number < 0)
1159 abort ();
1160
1161 /* Find the next alternative to p that might be true when p is true.
1162 Test that one next if p's successors fail. */
1163
1164 for (p1 = p->next; p1 && not_both_true (p, p1, 1); p1 = p1->next)
1165 ;
1166 p->afterward = p1;
1167
1168 if (p1)
1169 {
1170 if (mode == VOIDmode && p1->enforce_mode && p1->mode != VOIDmode)
1171 p1->retest_mode = 1;
1172 if (p->code == UNKNOWN && p1->code != UNKNOWN)
1173 p1->retest_code = 1;
1174 p1->label_needed = 1;
1175 }
1176
1177 /* If we have a different code or mode than the last node and
1178 are in a switch on codes, we must either end the switch or
1179 go to another case. We must also end the switch if this
1180 node needs a label and to retest either the mode or code. */
1181
1182 if (switch_code != UNKNOWN
1183 && (switch_code != p->code || switch_mode != mode
1184 || (p->label_needed && (p->retest_mode || p->retest_code))))
1185 {
1186 enum rtx_code code = p->code;
1187
1188 /* If P is testing a predicate that we know about and we haven't
1189 seen any of the codes that are valid for the predicate, we
1190 can write a series of "case" statement, one for each possible
1191 code. Since we are already in a switch, these redundant tests
1192 are very cheap and will reduce the number of predicate called. */
1193
1194 if (p->pred >= 0)
1195 {
1196 for (i = 0; i < NUM_RTX_CODE && preds[p->pred].codes[i] != 0; i++)
1197 if (codemap[(int) preds[p->pred].codes[i]])
1198 break;
1199
1200 if (preds[p->pred].codes[i] == 0)
1201 code = MATCH_OPERAND;
1202 }
1203
1204 if (code == UNKNOWN || codemap[(int) code]
1205 || switch_mode != mode
1206 || (p->label_needed && (p->retest_mode || p->retest_code)))
1207 {
1208 printf ("%s}\n", indents[indent - 2]);
1209 switch_code = UNKNOWN;
1210 indent -= 4;
1211 }
1212 else
1213 {
1214 if (! uncond)
1215 printf ("%sbreak;\n", indents[indent]);
1216
1217 if (code == MATCH_OPERAND)
1218 {
1219 for (i = 0; i < NUM_RTX_CODE && preds[p->pred].codes[i] != 0; i++)
1220 {
1221 printf ("%scase ", indents[indent - 2]);
1222 print_code (preds[p->pred].codes[i]);
1223 printf (":\n");
1224 codemap[(int) preds[p->pred].codes[i]] = 1;
1225 }
1226 }
1227 else
1228 {
1229 printf ("%scase ", indents[indent - 2]);
1230 print_code (code);
1231 printf (":\n");
1232 codemap[(int) p->code] = 1;
1233 }
1234
1235 switch_code = code;
1236 }
1237
1238 uncond = 0;
1239 }
1240
1241 /* If we were previously in a switch on modes and now have a different
1242 mode, end at least the case, and maybe end the switch if we are
1243 not testing a mode or testing a mode whose case we already saw. */
1244
1245 if (switch_mode != VOIDmode
1246 && (switch_mode != mode || (p->label_needed && p->retest_mode)))
1247 {
1248 if (mode == VOIDmode || modemap[(int) mode]
1249 || (p->label_needed && p->retest_mode))
1250 {
1251 printf ("%s}\n", indents[indent - 2]);
1252 switch_mode = VOIDmode;
1253 indent -= 4;
1254 }
1255 else
1256 {
1257 if (! uncond)
1258 printf (" break;\n");
1259 printf (" case %smode:\n", GET_MODE_NAME (mode));
1260 switch_mode = mode;
1261 modemap[(int) mode] = 1;
1262 }
1263
1264 uncond = 0;
1265 }
1266
1267 /* If we are about to write dead code, something went wrong. */
1268 if (! p->label_needed && uncond)
1269 abort ();
1270
1271 /* If we need a label and we will want to retest the mode or code at
1272 that label, write the label now. We have already ensured that
1273 things will be valid for the test. */
1274
1275 if (p->label_needed && (p->retest_mode || p->retest_code))
1276 {
1277 OUTPUT_LABEL (indents[indent - 2], p->number);
1278 p->label_needed = 0;
1279 }
1280
1281 uncond = 0;
1282
1283 /* If we are not in any switches, see if we can shortcut things
1284 by checking for identical modes and codes. */
1285
1286 if (switch_mode == VOIDmode && switch_code == UNKNOWN)
1287 {
1288 /* If p and its alternatives all want the same mode,
1289 reject all others at once, first, then ignore the mode. */
1290
1291 if (mode != VOIDmode && p->next && same_modes (p, mode))
1292 {
1293 printf (" if (GET_MODE (x%d) != %smode)\n",
1294 depth, GET_MODE_NAME (p->mode));
1295 if (afterward)
1296 {
1297 printf (" {\n");
1298 change_state (p->position, afterward->position, 6);
1299 printf (" goto L%d;\n }\n", afterward->number);
1300 }
1301 else
1302 printf (" goto ret0;\n");
1303 clear_modes (p);
1304 mode = VOIDmode;
1305 }
1306
1307 /* If p and its alternatives all want the same code,
1308 reject all others at once, first, then ignore the code. */
1309
1310 if (p->code != UNKNOWN && p->next && same_codes (p, p->code))
1311 {
1312 printf (" if (GET_CODE (x%d) != ", depth);
1313 print_code (p->code);
1314 printf (")\n");
1315 if (afterward)
1316 {
1317 printf (" {\n");
1318 change_state (p->position, afterward->position, indent + 4);
1319 printf (" goto L%d;\n }\n", afterward->number);
1320 }
1321 else
1322 printf (" goto ret0;\n");
1323 clear_codes (p);
1324 }
1325 }
1326
1327 /* If we are not in a mode switch and we are testing for a specific
1328 mode, start a mode switch unless we have just one node or the next
1329 node is not testing a mode (we have already tested for the case of
1330 more than one mode, but all of the same mode). */
1331
1332 if (switch_mode == VOIDmode && mode != VOIDmode && p->next != 0
1333 && p->next->enforce_mode && p->next->mode != VOIDmode)
1334 {
1335 memset (modemap, 0, sizeof modemap);
1336 printf ("%sswitch (GET_MODE (x%d))\n", indents[indent], depth);
1337 printf ("%s{\n", indents[indent + 2]);
1338 indent += 4;
1339 printf ("%sdefault:\n%sbreak;\n", indents[indent - 2],
1340 indents[indent]);
1341 printf ("%scase %smode:\n", indents[indent - 2],
1342 GET_MODE_NAME (mode));
1343 modemap[(int) mode] = 1;
1344 switch_mode = mode;
1345 }
1346
1347 /* Similarly for testing codes. */
1348
1349 if (switch_code == UNKNOWN && p->code != UNKNOWN && ! p->ignore_code
1350 && p->next != 0 && p->next->code != UNKNOWN)
1351 {
1352 memset (codemap, 0, sizeof codemap);
1353 printf ("%sswitch (GET_CODE (x%d))\n", indents[indent], depth);
1354 printf ("%s{\n", indents[indent + 2]);
1355 indent += 4;
1356 printf ("%sdefault:\n%sbreak;\n", indents[indent - 2],
1357 indents[indent]);
1358 printf ("%scase ", indents[indent - 2]);
1359 print_code (p->code);
1360 printf (":\n");
1361 codemap[(int) p->code] = 1;
1362 switch_code = p->code;
1363 }
1364
1365 /* Now that most mode and code tests have been done, we can write out
1366 a label for an inner node, if we haven't already. */
1367 if (p->label_needed)
1368 OUTPUT_LABEL (indents[indent - 2], p->number);
1369
1370 inner_indent = indent;
1371
1372 /* The only way we can have to do a mode or code test here is if
1373 this node needs such a test but is the only node to be tested.
1374 In that case, we won't have started a switch. Note that this is
1375 the only way the switch and test modes can disagree. */
1376
1377 if ((mode != switch_mode && ! p->ignore_mode)
1378 || (p->code != switch_code && p->code != UNKNOWN && ! p->ignore_code)
1379 || p->test_elt_zero_int || p->test_elt_one_int
1380 || p->test_elt_zero_wide || p->veclen
1381 || p->dupno >= 0 || p->tests || p->num_clobbers_to_add)
1382 {
1383 printf ("%sif (", indents[indent]);
1384
1385 if (mode != switch_mode && ! p->ignore_mode)
1386 printf ("GET_MODE (x%d) == %smode && ",
1387 depth, GET_MODE_NAME (mode));
1388 if (p->code != switch_code && p->code != UNKNOWN && ! p->ignore_code)
1389 {
1390 printf ("GET_CODE (x%d) == ", depth);
1391 print_code (p->code);
1392 printf (" && ");
1393 }
1394
1395 if (p->test_elt_zero_int)
1396 printf ("XINT (x%d, 0) == %d && ", depth, p->elt_zero_int);
1397 if (p->test_elt_one_int)
1398 printf ("XINT (x%d, 1) == %d && ", depth, p->elt_one_int);
1399 if (p->test_elt_zero_wide)
1400 {
1401 /* Set offset to 1 iff the number might get propagated to
1402 unsigned long by ANSI C rules, else 0.
1403 Prospective hosts are required to have at least 32 bit
1404 ints, and integer constants in machine descriptions
1405 must fit in 32 bit, thus it suffices to check only
1406 for 1 << 31 . */
1407 HOST_WIDE_INT offset = p->elt_zero_wide == -2147483647 - 1;
1408 printf ("XWINT (x%d, 0) == ", depth);
1409 printf (HOST_WIDE_INT_PRINT_DEC, p->elt_zero_wide + offset);
1410 printf ("%s && ", offset ? "-1" : "");
1411 }
1412 if (p->veclen)
1413 printf ("XVECLEN (x%d, 0) == %d && ", depth, p->veclen);
1414 if (p->dupno >= 0)
1415 printf ("rtx_equal_p (x%d, ro[%d]) && ", depth, p->dupno);
1416 if (p->num_clobbers_to_add)
1417 printf ("pnum_clobbers != 0 && ");
1418 if (p->tests)
1419 printf ("%s (x%d, %smode)", p->tests, depth,
1420 GET_MODE_NAME (p->mode));
1421 else
1422 printf ("1");
1423
1424 printf (")\n");
1425 inner_indent += 2;
1426 }
1427 else
1428 uncond = 1;
1429
1430 need_bracket = ! uncond;
1431
1432 if (p->opno >= 0)
1433 {
1434 if (need_bracket)
1435 {
1436 printf ("%s{\n", indents[inner_indent]);
1437 inner_indent += 2;
1438 wrote_bracket = 1;
1439 need_bracket = 0;
1440 }
1441
1442 printf ("%sro[%d] = x%d;\n", indents[inner_indent], p->opno, depth);
1443 }
1444
1445 if (p->c_test)
1446 {
1447 printf ("%sif (%s)\n", indents[inner_indent], p->c_test);
1448 inner_indent += 2;
1449 uncond = 0;
1450 need_bracket = 1;
1451 }
1452
1453 if (p->insn_code_number >= 0)
1454 {
1455 if (type == SPLIT)
1456 printf ("%sreturn gen_split_%d (operands);\n",
1457 indents[inner_indent], p->insn_code_number);
1458 else
1459 {
1460 if (p->num_clobbers_to_add)
1461 {
1462 if (need_bracket)
1463 {
1464 printf ("%s{\n", indents[inner_indent]);
1465 inner_indent += 2;
1466 }
1467
1468 printf ("%s*pnum_clobbers = %d;\n",
1469 indents[inner_indent], p->num_clobbers_to_add);
1470 printf ("%sreturn %d;\n",
1471 indents[inner_indent], p->insn_code_number);
1472
1473 if (need_bracket)
1474 {
1475 inner_indent -= 2;
1476 printf ("%s}\n", indents[inner_indent]);
1477 }
1478 }
1479 else
1480 printf ("%sreturn %d;\n",
1481 indents[inner_indent], p->insn_code_number);
1482 }
1483 }
1484 else
1485 printf ("%sgoto L%d;\n", indents[inner_indent],
1486 p->success.first->number);
1487
1488 if (wrote_bracket)
1489 printf ("%s}\n", indents[inner_indent - 2]);
1490 }
1491
1492 /* We have now tested all alternatives. End any switches we have open
1493 and branch to the alternative node unless we know that we can't fall
1494 through to the branch. */
1495
1496 if (switch_code != UNKNOWN)
1497 {
1498 printf ("%s}\n", indents[indent - 2]);
1499 indent -= 4;
1500 uncond = 0;
1501 }
1502
1503 if (switch_mode != VOIDmode)
1504 {
1505 printf ("%s}\n", indents[indent - 2]);
1506 indent -= 4;
1507 uncond = 0;
1508 }
1509
1510 if (indent != 2)
1511 abort ();
1512
1513 if (uncond)
1514 return;
1515
1516 if (afterward)
1517 {
1518 change_state (prevpos, afterward->position, 2);
1519 printf (" goto L%d;\n", afterward->number);
1520 }
1521 else
1522 printf (" goto ret0;\n");
1523 }
1524
1525 static void
1526 print_code (code)
1527 enum rtx_code code;
1528 {
1529 register char *p1;
1530 for (p1 = GET_RTX_NAME (code); *p1; p1++)
1531 {
1532 if (*p1 >= 'a' && *p1 <= 'z')
1533 putchar (*p1 + 'A' - 'a');
1534 else
1535 putchar (*p1);
1536 }
1537 }
1538
1539 static int
1540 same_codes (p, code)
1541 register struct decision *p;
1542 register enum rtx_code code;
1543 {
1544 for (; p; p = p->next)
1545 if (p->code != code)
1546 return 0;
1547
1548 return 1;
1549 }
1550
1551 static void
1552 clear_codes (p)
1553 register struct decision *p;
1554 {
1555 for (; p; p = p->next)
1556 p->ignore_code = 1;
1557 }
1558
1559 static int
1560 same_modes (p, mode)
1561 register struct decision *p;
1562 register enum machine_mode mode;
1563 {
1564 for (; p; p = p->next)
1565 if ((p->enforce_mode ? p->mode : VOIDmode) != mode)
1566 return 0;
1567
1568 return 1;
1569 }
1570
1571 static void
1572 clear_modes (p)
1573 register struct decision *p;
1574 {
1575 for (; p; p = p->next)
1576 p->enforce_mode = 0;
1577 }
1578 \f
1579 /* Write out the decision tree starting at TREE for a subroutine of type TYPE.
1580
1581 PREVPOS is the position at the node that branched to this node.
1582
1583 INITIAL is nonzero if this is the first node we are writing in a subroutine.
1584
1585 If all nodes are false, branch to the node AFTERWARD. */
1586
1587 static void
1588 write_tree (tree, prevpos, afterward, initial, type)
1589 struct decision *tree;
1590 const char *prevpos;
1591 struct decision *afterward;
1592 int initial;
1593 enum routine_type type;
1594 {
1595 register struct decision *p;
1596 const char *name_prefix = (type == SPLIT ? "split" : "recog");
1597 const char *call_suffix = (type == SPLIT ? "" : ", pnum_clobbers");
1598
1599 if (! initial && tree->subroutine_number > 0)
1600 {
1601 OUTPUT_LABEL (" ", tree->number);
1602
1603 if (afterward)
1604 {
1605 printf (" tem = %s_%d (x0, insn%s);\n",
1606 name_prefix, tree->subroutine_number, call_suffix);
1607 if (type == SPLIT)
1608 printf (" if (tem != 0) return tem;\n");
1609 else
1610 printf (" if (tem >= 0) return tem;\n");
1611 change_state (tree->position, afterward->position, 2);
1612 printf (" goto L%d;\n", afterward->number);
1613 }
1614 else
1615 printf (" return %s_%d (x0, insn%s);\n",
1616 name_prefix, tree->subroutine_number, call_suffix);
1617 return;
1618 }
1619
1620 write_tree_1 (tree, prevpos, afterward, type);
1621
1622 for (p = tree; p; p = p->next)
1623 if (p->success.first)
1624 write_tree (p->success.first, p->position,
1625 p->afterward ? p->afterward : afterward, 0, type);
1626 }
1627
1628 \f
1629 /* Assuming that the state of argument is denoted by OLDPOS, take whatever
1630 actions are necessary to move to NEWPOS.
1631
1632 INDENT says how many blanks to place at the front of lines. */
1633
1634 static void
1635 change_state (oldpos, newpos, indent)
1636 const char *oldpos;
1637 const char *newpos;
1638 int indent;
1639 {
1640 int odepth = strlen (oldpos);
1641 int depth = odepth;
1642 int ndepth = strlen (newpos);
1643
1644 /* Pop up as many levels as necessary. */
1645
1646 while (strncmp (oldpos, newpos, depth))
1647 --depth;
1648
1649 /* Go down to desired level. */
1650
1651 while (depth < ndepth)
1652 {
1653 if (newpos[depth] >= 'a' && newpos[depth] <= 'z')
1654 printf ("%sx%d = XVECEXP (x%d, 0, %d);\n",
1655 indents[indent], depth + 1, depth, newpos[depth] - 'a');
1656 else
1657 printf ("%sx%d = XEXP (x%d, %c);\n",
1658 indents[indent], depth + 1, depth, newpos[depth]);
1659 ++depth;
1660 }
1661 }
1662 \f
1663 char *
1664 xstrdup (input)
1665 const char *input;
1666 {
1667 register size_t len = strlen (input) + 1;
1668 register char *output = xmalloc (len);
1669 memcpy (output, input, len);
1670 return output;
1671 }
1672
1673 PTR
1674 xrealloc (old, size)
1675 PTR old;
1676 size_t size;
1677 {
1678 register PTR ptr;
1679 if (old)
1680 ptr = (PTR) realloc (old, size);
1681 else
1682 ptr = (PTR) malloc (size);
1683 if (!ptr)
1684 fatal ("virtual memory exhausted");
1685 return ptr;
1686 }
1687
1688 PTR
1689 xmalloc (size)
1690 size_t size;
1691 {
1692 register PTR val = (PTR) malloc (size);
1693
1694 if (val == 0)
1695 fatal ("virtual memory exhausted");
1696 return val;
1697 }
1698
1699 static void
1700 fatal VPROTO ((const char *format, ...))
1701 {
1702 #ifndef ANSI_PROTOTYPES
1703 const char *format;
1704 #endif
1705 va_list ap;
1706
1707 VA_START (ap, format);
1708
1709 #ifndef ANSI_PROTOTYPES
1710 format = va_arg (ap, const char *);
1711 #endif
1712
1713 fprintf (stderr, "genrecog: ");
1714 vfprintf (stderr, format, ap);
1715 va_end (ap);
1716 fprintf (stderr, "\n");
1717 fprintf (stderr, "after %d definitions\n", next_index);
1718 exit (FATAL_EXIT_CODE);
1719 }
1720
1721 /* More 'friendly' abort that prints the line and file.
1722 config.h can #define abort fancy_abort if you like that sort of thing. */
1723
1724 void
1725 fancy_abort ()
1726 {
1727 fatal ("Internal gcc abort.");
1728 }
1729 \f
1730 int
1731 main (argc, argv)
1732 int argc;
1733 char **argv;
1734 {
1735 rtx desc;
1736 struct decision_head recog_tree;
1737 struct decision_head split_tree;
1738 FILE *infile;
1739 register int c;
1740
1741 obstack_init (rtl_obstack);
1742 recog_tree.first = recog_tree.last = split_tree.first = split_tree.last = 0;
1743
1744 if (argc <= 1)
1745 fatal ("No input file name.");
1746
1747 infile = fopen (argv[1], "r");
1748 if (infile == 0)
1749 {
1750 perror (argv[1]);
1751 exit (FATAL_EXIT_CODE);
1752 }
1753
1754 init_rtl ();
1755 next_insn_code = 0;
1756 next_index = 0;
1757
1758 printf ("/* Generated automatically by the program `genrecog'\n\
1759 from the machine description file `md'. */\n\n");
1760
1761 printf ("#include \"config.h\"\n");
1762 printf ("#include \"system.h\"\n");
1763 printf ("#include \"rtl.h\"\n");
1764 printf ("#include \"insn-config.h\"\n");
1765 printf ("#include \"recog.h\"\n");
1766 printf ("#include \"real.h\"\n");
1767 printf ("#include \"output.h\"\n");
1768 printf ("#include \"flags.h\"\n");
1769 printf ("\n");
1770
1771 /* Read the machine description. */
1772
1773 while (1)
1774 {
1775 c = read_skip_spaces (infile);
1776 if (c == EOF)
1777 break;
1778 ungetc (c, infile);
1779
1780 desc = read_rtx (infile);
1781 if (GET_CODE (desc) == DEFINE_INSN)
1782 recog_tree = merge_trees (recog_tree,
1783 make_insn_sequence (desc, RECOG));
1784 else if (GET_CODE (desc) == DEFINE_SPLIT)
1785 split_tree = merge_trees (split_tree,
1786 make_insn_sequence (desc, SPLIT));
1787 if (GET_CODE (desc) == DEFINE_PEEPHOLE
1788 || GET_CODE (desc) == DEFINE_EXPAND)
1789 next_insn_code++;
1790 next_index++;
1791 }
1792
1793 printf ("\n\
1794 /* `recog' contains a decision tree\n\
1795 that recognizes whether the rtx X0 is a valid instruction.\n\
1796 \n\
1797 recog returns -1 if the rtx is not valid.\n\
1798 If the rtx is valid, recog returns a nonnegative number\n\
1799 which is the insn code number for the pattern that matched.\n");
1800 printf (" This is the same as the order in the machine description of\n\
1801 the entry that matched. This number can be used as an index into various\n\
1802 insn_* tables, such as insn_templates, insn_outfun, and insn_n_operands\n\
1803 (found in insn-output.c).\n\n");
1804 printf (" The third argument to recog is an optional pointer to an int.\n\
1805 If present, recog will accept a pattern if it matches except for\n\
1806 missing CLOBBER expressions at the end. In that case, the value\n\
1807 pointed to by the optional pointer will be set to the number of\n\
1808 CLOBBERs that need to be added (it should be initialized to zero by\n\
1809 the caller). If it is set nonzero, the caller should allocate a\n\
1810 PARALLEL of the appropriate size, copy the initial entries, and call\n\
1811 add_clobbers (found in insn-emit.c) to fill in the CLOBBERs.");
1812
1813 if (split_tree.first)
1814 printf ("\n\n The function split_insns returns 0 if the rtl could not\n\
1815 be split or the split rtl in a SEQUENCE if it can be.");
1816
1817 printf ("*/\n\n");
1818
1819 printf ("#define operands recog_operand\n\n");
1820
1821 next_subroutine_number = 0;
1822 break_out_subroutines (recog_tree, RECOG, 1);
1823 write_subroutine (recog_tree.first, RECOG);
1824
1825 next_subroutine_number = 0;
1826 break_out_subroutines (split_tree, SPLIT, 1);
1827 write_subroutine (split_tree.first, SPLIT);
1828
1829 fflush (stdout);
1830 exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
1831 /* NOTREACHED */
1832 return 0;
1833 }
This page took 0.130436 seconds and 6 git commands to generate.