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