]> gcc.gnu.org Git - gcc.git/blame - gcc/genrecog.c
*** empty log message ***
[gcc.git] / gcc / genrecog.c
CommitLineData
ec65fa66 1/* Generate code from machine description to recognize rtl as insns.
c66e0741 2 Copyright (C) 1987, 1988, 1992 Free Software Foundation, Inc.
ec65fa66
RK
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU CC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU CC; see the file COPYING. If not, write to
18the 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
e0689256 32 insn_* tables, such as insn_template, insn_outfun, and insn_n_operands
ec65fa66
RK
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
53static struct obstack obstack;
54struct obstack *rtl_obstack = &obstack;
55
56#define obstack_chunk_alloc xmalloc
57#define obstack_chunk_free free
58
59extern void free ();
31d04616 60extern rtx read_rtx ();
ec65fa66 61
e0689256
RK
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
66struct decision_head { struct decision *first, *last; };
67
ec65fa66
RK
68/* Data structure for decision tree for recognizing
69 legitimate instructions. */
70
71struct decision
72{
e0689256
RK
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) */
de6a431b 85 int elt_one_int; /* Required value for XINT (rtl, 1) */
e0689256
RK
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 */
ec65fa66
RK
100};
101
102#define SUBROUTINE_THRESHOLD 50
103
104static 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
109enum routine_type {RECOG, SPLIT};
110
e0689256 111/* Next available node number for tree nodes. */
ec65fa66 112
e0689256 113static int next_number;
ec65fa66 114
e0689256 115/* Next number to use as an insn_code. */
ec65fa66 116
e0689256 117static int next_insn_code;
ec65fa66 118
e0689256
RK
119/* Similar, but counts all expressions in the MD file; used for
120 error messages. */
ec65fa66 121
e0689256 122static int next_index;
ec65fa66 123
e0689256
RK
124/* Record the highest depth we ever have so we know how many variables to
125 allocate in each subroutine we make. */
ec65fa66 126
e0689256
RK
127static 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. */
ec65fa66 134
e0689256
RK
135static 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])
ec65fa66 164
e0689256
RK
165static int try_merge_1 ();
166static int no_same_mode ();
167static int same_codes ();
168static int same_modes ();
ec65fa66
RK
169char *xmalloc ();
170static struct decision *add_to_sequence ();
e0689256 171static struct decision_head merge_trees ();
ec65fa66
RK
172static struct decision *try_merge_2 ();
173static void write_subroutine ();
174static void print_code ();
175static void clear_codes ();
176static void clear_modes ();
177static void change_state ();
178static void write_tree ();
179static char *copystr ();
180static char *concat ();
181static void fatal ();
182void fancy_abort ();
183static void mybzero ();
e0689256 184static void mybcopy ();
ec65fa66 185\f
ec65fa66 186/* Construct and return a sequence of decisions
e0689256 187 that will recognize INSN.
ec65fa66 188
e0689256
RK
189 TYPE says what type of routine we are recognizing (RECOG or SPLIT). */
190
191static struct decision_head
192make_insn_sequence (insn, type)
ec65fa66 193 rtx insn;
e0689256 194 enum routine_type type;
ec65fa66
RK
195{
196 rtx x;
e0689256 197 char *c_test = XSTR (insn, type == RECOG ? 2 : 1);
ec65fa66 198 struct decision *last;
e0689256 199 struct decision_head head;
ec65fa66 200
e0689256
RK
201 if (XVECLEN (insn, type == RECOG) == 1)
202 x = XVECEXP (insn, type == RECOG, 0);
ec65fa66
RK
203 else
204 {
205 x = rtx_alloc (PARALLEL);
e0689256 206 XVEC (x, 0) = XVEC (insn, type == RECOG);
ec65fa66
RK
207 PUT_MODE (x, VOIDmode);
208 }
209
e0689256 210 last = add_to_sequence (x, &head, "");
ec65fa66
RK
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
e0689256
RK
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. */
ec65fa66 220
e0689256 221 if (type == RECOG && GET_CODE (x) == PARALLEL)
ec65fa66
RK
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;
e0689256 234 struct decision_head clobber_head;
ec65fa66
RK
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
e0689256 248 last = add_to_sequence (new, &clobber_head, "");
ec65fa66
RK
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;
e0689256
RK
254
255 head = merge_trees (head, clobber_head);
ec65fa66
RK
256 }
257 }
258
259 next_insn_code++;
ec65fa66 260
e0689256
RK
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);
ec65fa66 264
e0689256
RK
265 return head;
266}
267\f
268/* Create a chain of nodes to verify that an rtl expression matches
269 PATTERN.
ec65fa66 270
e0689256
RK
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).
ec65fa66 273
e0689256 274 POSITION is the string representing the current position in the insn.
ec65fa66 275
e0689256 276 A pointer to the final node in the chain is returned. */
ec65fa66
RK
277
278static struct decision *
279add_to_sequence (pattern, last, position)
280 rtx pattern;
e0689256 281 struct decision_head *last;
ec65fa66
RK
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;
e0689256 291 int depth = strlen (position);
ec65fa66
RK
292 int len;
293
e0689256
RK
294 if (depth > max_depth)
295 max_depth = depth;
296
ec65fa66
RK
297 new->number = next_number++;
298 new->position = copystr (position);
e0689256
RK
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;
ec65fa66
RK
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;
e0689256
RK
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;
ec65fa66 316 new->afterward = 0;
e0689256
RK
317 new->opno = -1;
318 new->dupno = -1;
ec65fa66 319 new->label_needed = 0;
ec65fa66
RK
320 new->subroutine_number = 0;
321
322 this = new;
323
e0689256 324 last->first = last->last = new;
ec65fa66 325
ec65fa66
RK
326 newpos = (char *) alloca (depth + 2);
327 strcpy (newpos, position);
328 newpos[depth + 1] = 0;
329
330 restart:
331
ec65fa66
RK
332 new->mode = GET_MODE (pattern);
333 new->code = code = GET_CODE (pattern);
334
335 switch (code)
336 {
337 case MATCH_OPERAND:
ec65fa66 338 case MATCH_SCRATCH:
ec65fa66 339 case MATCH_OPERATOR:
ec65fa66
RK
340 case MATCH_PARALLEL:
341 new->opno = XINT (pattern, 0);
e0689256
RK
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
ec65fa66
RK
350 if (*new->tests == 0)
351 new->tests = 0;
e0689256
RK
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))
cba998bf 378 new->tests = 0, new->pred = -1;
e0689256
RK
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)
ec65fa66 392 {
e0689256
RK
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;
ec65fa66 401 }
e0689256 402
ec65fa66
RK
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';
e0689256
RK
413 new = add_to_sequence (XVECEXP (pattern, 1, i),
414 &new->success, newpos);
ec65fa66 415 }
e0689256 416 this->success.first->enforce_mode = 0;
ec65fa66
RK
417 return new;
418
419 case MATCH_DUP:
420 new->dupno = XINT (pattern, 0);
421 new->code = UNKNOWN;
e0689256 422 new->enforce_mode = 0;
ec65fa66
RK
423 return new;
424
425 case ADDRESS:
426 pattern = XEXP (pattern, 0);
427 goto restart;
428
ec65fa66
RK
429 case SET:
430 newpos[depth] = '0';
e0689256
RK
431 new = add_to_sequence (SET_DEST (pattern), &new->success, newpos);
432 this->success.first->enforce_mode = 1;
ec65fa66 433 newpos[depth] = '1';
e0689256
RK
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;
ec65fa66
RK
441 return new;
442
e0689256
RK
443 case SIGN_EXTEND:
444 case ZERO_EXTEND:
ec65fa66
RK
445 case STRICT_LOW_PART:
446 newpos[depth] = '0';
e0689256
RK
447 new = add_to_sequence (XEXP (pattern, 0), &new->success, newpos);
448 this->success.first->enforce_mode = 1;
ec65fa66
RK
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';
e0689256
RK
455 new = add_to_sequence (XEXP (pattern, 0), &new->success, newpos);
456 this->success.first->enforce_mode = 1;
ec65fa66
RK
457 return new;
458
459 case ZERO_EXTRACT:
460 case SIGN_EXTRACT:
461 newpos[depth] = '0';
e0689256
RK
462 new = add_to_sequence (XEXP (pattern, 0), &new->success, newpos);
463 this->success.first->enforce_mode = 1;
ec65fa66 464 newpos[depth] = '1';
e0689256 465 new = add_to_sequence (XEXP (pattern, 1), &new->success, newpos);
ec65fa66 466 newpos[depth] = '2';
e0689256
RK
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);
ec65fa66
RK
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')
e0689256 495 new = add_to_sequence (XEXP (pattern, i), &new->success, newpos);
ec65fa66
RK
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),
e0689256 522 &new->success, newpos);
ec65fa66
RK
523 }
524 }
525 else if (fmt[i] != '0')
526 abort ();
527 }
528 return new;
529}
e0689256
RK
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).
ec65fa66 534
e0689256
RK
535 TOPLEVEL is non-zero if we are to only look at the top level and not
536 recursively descend. */
ec65fa66 537
e0689256
RK
538static int
539not_both_true (d1, d2, toplevel)
540 struct decision *d1, *d2;
541 int toplevel;
ec65fa66 542{
e0689256
RK
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;
ec65fa66 566
e0689256
RK
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. */
ec65fa66 570
e0689256 571 if (d1->pred >= 0 || d2->pred >= 0)
ec65fa66 572 {
e0689256
RK
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)
ec65fa66 581 {
e0689256
RK
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;
ec65fa66 607 }
ec65fa66 608 }
ec65fa66 609
e0689256
RK
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. */
ec65fa66 615
e0689256
RK
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,
6dc42e49 636 tests for specific modes should precede nodes that allow any mode.
e0689256
RK
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
643static int
644position_merit (p, mode, code)
645 struct decision *p;
646 enum machine_mode mode;
647 RTX_CODE code;
ec65fa66 648{
e0689256 649 enum machine_mode p_mode;
ec65fa66 650
e0689256
RK
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;
ec65fa66 655
e0689256 656 p_mode = p->enforce_mode ? p->mode : VOIDmode;
ec65fa66 657
e0689256
RK
658 /* The best case is if the codes and modes both match. */
659 if (p_mode == mode && p->code== code)
660 return 0;
ec65fa66 661
e0689256
RK
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
699static struct decision_head
700merge_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;
ec65fa66 710
e0689256
RK
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)
ec65fa66 716 {
e0689256
RK
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)
ec65fa66 740 {
e0689256
RK
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
e0689256 828 if (old->insn_code_number >= 0 && add->insn_code_number >= 0)
de6a431b
RK
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
e0689256
RK
849 if (old->insn_code_number == -1)
850 old->insn_code_number = add->insn_code_number;
de6a431b 851 old->success = merge_trees (old->success, add->success);
e0689256 852 add = 0;
ec65fa66 853 break;
e0689256
RK
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;
ec65fa66 866 }
ec65fa66 867
e0689256
RK
868 /* If ADD was duplicate, we are done. */
869 if (add == 0)
870 continue;
ec65fa66 871
e0689256
RK
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. */
ec65fa66 875
e0689256
RK
876 if (best_position == 0)
877 abort ();
ec65fa66 878
e0689256
RK
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 }
ec65fa66 886
e0689256
RK
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 }
ec65fa66 898
e0689256 899 return oldh;
ec65fa66
RK
900}
901\f
e0689256
RK
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.
ec65fa66 905
e0689256
RK
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. */
ec65fa66
RK
910
911static int
e0689256
RK
912break_out_subroutines (head, type, initial)
913 struct decision_head head;
ec65fa66 914 enum routine_type type;
e0689256 915 int initial;
ec65fa66
RK
916{
917 int size = 0;
e0689256
RK
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)
ec65fa66 924 {
e0689256
RK
925 head.first->subroutine_number = ++next_subroutine_number;
926 write_subroutine (head.first, type);
ec65fa66
RK
927 size = 1;
928 }
929 return size;
930}
e0689256
RK
931\f
932/* Write out a subroutine of type TYPE to do comparisons starting at node
933 TREE. */
ec65fa66
RK
934
935static void
936write_subroutine (tree, type)
937 struct decision *tree;
938 enum routine_type type;
939{
e0689256 940 int i;
ec65fa66
RK
941
942 if (type == SPLIT)
e0689256 943 printf ("rtx\nsplit");
ec65fa66 944 else
e0689256
RK
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");
ec65fa66
RK
960
961 printf ("{\n");
962 printf (" register rtx *ro = &recog_operand[0];\n");
e0689256
RK
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);
ec65fa66
RK
971 printf (" ret0: return %d;\n}\n\n", type == SPLIT ? 0 : -1);
972}
973\f
e0689256
RK
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
978static 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
6dc42e49 994 Occasionally, we cannot arbitrarily reorder the tests so that multiple
e0689256
RK
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. */
ec65fa66 1003
e0689256
RK
1004void
1005write_tree_1 (tree, prevpos, afterward, type)
ec65fa66
RK
1006 struct decision *tree;
1007 char *prevpos;
e0689256 1008 struct decision *afterward;
ec65fa66
RK
1009 enum routine_type type;
1010{
1011 register struct decision *p, *p1;
e0689256
RK
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;
ec65fa66
RK
1016 char modemap[NUM_MACHINE_MODES];
1017 char codemap[NUM_RTX_CODE];
e0689256
RK
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. */
ec65fa66 1045
ec65fa66 1046
e0689256
RK
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
ec65fa66
RK
1060 for (p = tree; p; p = p->next)
1061 {
e0689256 1062 enum machine_mode mode = p->enforce_mode ? p->mode : VOIDmode;
cba998bf
RK
1063 int need_bracket;
1064 int wrote_bracket = 0;
e0689256
RK
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 ;
ec65fa66 1075 p->afterward = p1;
ec65fa66 1076
e0689256 1077 if (p1)
ec65fa66 1078 {
e0689256
RK
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;
ec65fa66 1084 }
e0689256
RK
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))))
ec65fa66 1094 {
e0689256
RK
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;
ec65fa66
RK
1148 }
1149
e0689256
RK
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. */
ec65fa66 1153
e0689256
RK
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)
ec65fa66
RK
1178 abort ();
1179
e0689256
RK
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;
ec65fa66 1191
e0689256
RK
1192 /* If we are not in any switches, see if we can shortcut things
1193 by checking for identical modes and codes. */
ec65fa66 1194
e0689256 1195 if (switch_mode == VOIDmode && switch_code == UNKNOWN)
ec65fa66
RK
1196 {
1197 /* If p and its alternatives all want the same mode,
1198 reject all others at once, first, then ignore the mode. */
e0689256
RK
1199
1200 if (mode != VOIDmode && p->next && same_modes (p, mode))
ec65fa66
RK
1201 {
1202 printf (" if (GET_MODE (x%d) != %smode)\n",
1203 depth, GET_MODE_NAME (p->mode));
1204 if (afterward)
1205 {
e0689256
RK
1206 printf (" {\n");
1207 change_state (p->position, afterward->position, 6);
1208 printf (" goto L%d;\n }\n", afterward->number);
ec65fa66
RK
1209 }
1210 else
1211 printf (" goto ret0;\n");
1212 clear_modes (p);
e0689256 1213 mode = VOIDmode;
ec65fa66
RK
1214 }
1215
1216 /* If p and its alternatives all want the same code,
1217 reject all others at once, first, then ignore the code. */
e0689256 1218
ec65fa66
RK
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 {
e0689256
RK
1226 printf (" {\n");
1227 change_state (p->position, afterward->position, indent + 4);
1228 printf (" goto L%d;\n }\n", afterward->number);
ec65fa66
RK
1229 }
1230 else
1231 printf (" goto ret0;\n");
1232 clear_codes (p);
1233 }
1234 }
1235
e0689256
RK
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). */
ec65fa66 1240
e0689256
RK
1241 if (switch_mode == VOIDmode && mode != VOIDmode && p->next != 0
1242 && p->next->enforce_mode && p->next->mode != VOIDmode)
1243 {
ec65fa66 1244 mybzero (modemap, sizeof modemap);
e0689256
RK
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;
ec65fa66
RK
1252 }
1253
e0689256
RK
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)
ec65fa66 1258 {
ec65fa66 1259 mybzero (codemap, sizeof codemap);
e0689256
RK
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;
ec65fa66
RK
1268 }
1269
e0689256
RK
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. */
ec65fa66 1281
e0689256
RK
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)
ec65fa66 1286 {
e0689256
RK
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)
ec65fa66
RK
1293 {
1294 printf ("GET_CODE (x%d) == ", depth);
1295 print_code (p->code);
e0689256 1296 printf (" && ");
ec65fa66 1297 }
e0689256
RK
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;
ec65fa66 1317 }
ec65fa66 1318 else
e0689256 1319 uncond = 1;
ec65fa66 1320
cba998bf
RK
1321 need_bracket = ! uncond;
1322
ec65fa66 1323 if (p->opno >= 0)
e0689256 1324 {
cba998bf
RK
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);
e0689256 1334 }
ec65fa66
RK
1335
1336 if (p->c_test)
e0689256
RK
1337 {
1338 printf ("%sif (%s)\n", indents[inner_indent], p->c_test);
1339 inner_indent += 2;
1340 uncond = 0;
cba998bf 1341 need_bracket = 1;
e0689256 1342 }
ec65fa66
RK
1343
1344 if (p->insn_code_number >= 0)
1345 {
1346 if (type == SPLIT)
e0689256
RK
1347 printf ("%sreturn gen_split_%d (operands);\n",
1348 indents[inner_indent], p->insn_code_number);
ec65fa66
RK
1349 else
1350 {
1351 if (p->num_clobbers_to_add)
1352 {
cba998bf 1353 if (need_bracket)
e0689256
RK
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
cba998bf 1364 if (need_bracket)
e0689256
RK
1365 {
1366 inner_indent -= 2;
1367 printf ("%s}\n", indents[inner_indent]);
1368 }
ec65fa66
RK
1369 }
1370 else
e0689256
RK
1371 printf ("%sreturn %d;\n",
1372 indents[inner_indent], p->insn_code_number);
ec65fa66
RK
1373 }
1374 }
1375 else
e0689256
RK
1376 printf ("%sgoto L%d;\n", indents[inner_indent],
1377 p->success.first->number);
ec65fa66 1378
cba998bf 1379 if (wrote_bracket)
e0689256
RK
1380 printf ("%s}\n", indents[inner_indent - 2]);
1381 }
ec65fa66 1382
e0689256 1383 /* We have now tested all alternatives. End any switches we have open
cba998bf
RK
1384 and branch to the alternative node unless we know that we can't fall
1385 through to the branch. */
ec65fa66 1386
e0689256
RK
1387 if (switch_code != UNKNOWN)
1388 {
1389 printf ("%s}\n", indents[indent - 2]);
1390 indent -= 4;
cba998bf 1391 uncond = 0;
e0689256 1392 }
ec65fa66 1393
e0689256
RK
1394 if (switch_mode != VOIDmode)
1395 {
1396 printf ("%s}\n", indents[indent - 2]);
1397 indent -= 4;
cba998bf 1398 uncond = 0;
ec65fa66
RK
1399 }
1400
e0689256
RK
1401 if (indent != 2)
1402 abort ();
ec65fa66 1403
cba998bf
RK
1404 if (uncond)
1405 return;
1406
ec65fa66
RK
1407 if (afterward)
1408 {
e0689256
RK
1409 change_state (prevpos, afterward->position, 2);
1410 printf (" goto L%d;\n", afterward->number);
ec65fa66
RK
1411 }
1412 else
1413 printf (" goto ret0;\n");
ec65fa66
RK
1414}
1415
1416static void
1417print_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
1430static int
1431same_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
1442static void
1443clear_codes (p)
1444 register struct decision *p;
1445{
1446 for (; p; p = p->next)
e0689256 1447 p->ignore_code = 1;
ec65fa66
RK
1448}
1449
1450static int
1451same_modes (p, mode)
1452 register struct decision *p;
1453 register enum machine_mode mode;
1454{
1455 for (; p; p = p->next)
cba998bf 1456 if ((p->enforce_mode ? p->mode : VOIDmode) != mode)
ec65fa66
RK
1457 return 0;
1458
1459 return 1;
1460}
1461
1462static void
1463clear_modes (p)
1464 register struct decision *p;
1465{
1466 for (; p; p = p->next)
e0689256 1467 p->enforce_mode = 0;
ec65fa66
RK
1468}
1469\f
e0689256
RK
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
1478static void
1479write_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
ec65fa66 1522static void
e0689256 1523change_state (oldpos, newpos, indent)
ec65fa66
RK
1524 char *oldpos;
1525 char *newpos;
e0689256 1526 int indent;
ec65fa66
RK
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')
e0689256
RK
1542 printf ("%sx%d = XVECEXP (x%d, 0, %d);\n",
1543 indents[indent], depth + 1, depth, newpos[depth] - 'a');
ec65fa66 1544 else
e0689256
RK
1545 printf ("%sx%d = XEXP (x%d, %c);\n",
1546 indents[indent], depth + 1, depth, newpos[depth]);
ec65fa66
RK
1547 ++depth;
1548 }
1549}
1550\f
1551static char *
1552copystr (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
1566static void
1567mybzero (b, length)
1568 register char *b;
1569 register unsigned length;
1570{
1571 while (length-- > 0)
1572 *b++ = 0;
1573}
1574
e0689256
RK
1575static void
1576mybcopy (in, out, length)
1577 register char *in, *out;
1578 register unsigned length;
1579{
1580 while (length-- > 0)
1581 *out++ = *in++;
1582}
1583
ec65fa66
RK
1584static char *
1585concat (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
1603char *
1604xrealloc (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
1614char *
1615xmalloc (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
1625static void
1626fatal (s, a1, a2)
1627 char *s;
1628{
1629 fprintf (stderr, "genrecog: ");
1630 fprintf (stderr, s, a1, a2);
1631 fprintf (stderr, "\n");
de6a431b 1632 fprintf (stderr, "after %d definitions\n", next_index);
ec65fa66
RK
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
1639void
1640fancy_abort ()
1641{
1642 fatal ("Internal gcc abort.");
1643}
1644\f
1645int
1646main (argc, argv)
1647 int argc;
1648 char **argv;
1649{
1650 rtx desc;
e0689256
RK
1651 struct decision_head recog_tree;
1652 struct decision_head split_tree;
ec65fa66 1653 FILE *infile;
ec65fa66
RK
1654 register int c;
1655
1656 obstack_init (rtl_obstack);
e0689256 1657 recog_tree.first = recog_tree.last = split_tree.first = split_tree.last = 0;
ec65fa66
RK
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\
1674from 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)
e0689256
RK
1696 recog_tree = merge_trees (recog_tree,
1697 make_insn_sequence (desc, RECOG));
ec65fa66 1698 else if (GET_CODE (desc) == DEFINE_SPLIT)
e0689256
RK
1699 split_tree = merge_trees (split_tree,
1700 make_insn_sequence (desc, SPLIT));
ec65fa66
RK
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
e0689256 1728 if (split_tree.first)
ec65fa66
RK
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;
e0689256
RK
1741 break_out_subroutines (recog_tree, RECOG, 1);
1742 write_subroutine (recog_tree.first, RECOG);
ec65fa66
RK
1743
1744 next_subroutine_number = 0;
e0689256
RK
1745 break_out_subroutines (split_tree, SPLIT, 1);
1746 write_subroutine (split_tree.first, SPLIT);
ec65fa66
RK
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.222338 seconds and 5 git commands to generate.