1 /* Generate code from machine description to recognize rtl as insns.
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
4 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GCC is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
23 /* This program is used to produce insn-recog.c, which contains a
24 function called `recog' plus its subroutines. These functions
25 contain a decision tree that recognizes whether an rtx, the
26 argument given to recog, is a valid instruction.
28 recog returns -1 if the rtx is not valid. If the rtx is valid,
29 recog returns a nonnegative number which is the insn code number
30 for the pattern that matched. This is the same as the order in the
31 machine description of the entry that matched. This number can be
32 used as an index into various insn_* tables, such as insn_template,
33 insn_outfun, and insn_n_operands (found in insn-output.c).
35 The third argument to recog is an optional pointer to an int. If
36 present, recog will accept a pattern if it matches except for
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
42 call add_clobbers (found in insn-emit.c) to fill in the CLOBBERs.
44 This program also generates the function `split_insns', which
45 returns 0 if the rtl could not be split, or it returns the split
48 This program also generates the function `peephole2_insns', which
49 returns 0 if the rtl could not be matched. If there was a match,
50 the new rtl is returned in an INSN list, and LAST_INSN will point
51 to the last recognized insn in the old sequence. */
55 #include "coretypes.h"
59 #include "gensupport.h"
61 #define OUTPUT_LABEL(INDENT_STRING, LABEL_NUMBER) \
62 printf("%sL%d: ATTRIBUTE_UNUSED_LABEL\n", (INDENT_STRING), (LABEL_NUMBER))
64 /* A listhead of decision trees. The alternatives to a node are kept
65 in a doubly-linked list so we can easily add nodes to the proper
66 place when merging. */
70 struct decision
*first
;
71 struct decision
*last
;
74 /* These types are roughly in the order in which we'd like to test them. */
78 DT_mode
, DT_code
, DT_veclen
,
79 DT_elt_zero_int
, DT_elt_one_int
, DT_elt_zero_wide
, DT_elt_zero_wide_safe
,
81 DT_veclen_ge
, DT_dup
, DT_pred
, DT_c_test
,
82 DT_accept_op
, DT_accept_insn
85 /* A single test. The two accept types aren't tests per-se, but
86 their equality (or lack thereof) does affect tree merging so
87 it is convenient to keep them here. */
91 /* A linked list through the tests attached to a node. */
92 struct decision_test
*next
;
94 enum decision_type type
;
98 int num_insns
; /* Number if insn in a define_peephole2. */
99 enum machine_mode mode
; /* Machine mode of node. */
100 RTX_CODE code
; /* Code to test. */
104 const char *name
; /* Predicate to call. */
105 const struct pred_data
*data
;
106 /* Optimization hints for this predicate. */
107 enum machine_mode mode
; /* Machine mode for node. */
110 const char *c_test
; /* Additional test to perform. */
111 int veclen
; /* Length of vector. */
112 int dup
; /* Number of operand to compare against. */
113 HOST_WIDE_INT intval
; /* Value for XINT for XWINT. */
114 int opno
; /* Operand number matched. */
117 int code_number
; /* Insn number matched. */
118 int lineno
; /* Line number of the insn. */
119 int num_clobbers_to_add
; /* Number of CLOBBERs to be added. */
124 /* Data structure for decision tree for recognizing legitimate insns. */
128 struct decision_head success
; /* Nodes to test on success. */
129 struct decision
*next
; /* Node to test on failure. */
130 struct decision
*prev
; /* Node whose failure tests us. */
131 struct decision
*afterward
; /* Node to test on success,
132 but failure of successor nodes. */
134 const char *position
; /* String denoting position in pattern. */
136 struct decision_test
*tests
; /* The tests for this node. */
138 int number
; /* Node number, used for labels */
139 int subroutine_number
; /* Number of subroutine this node starts */
140 int need_label
; /* Label needs to be output. */
143 #define SUBROUTINE_THRESHOLD 100
145 static int next_subroutine_number
;
147 /* We can write three types of subroutines: One for insn recognition,
148 one to split insns, and one for peephole-type optimizations. This
149 defines which type is being written. */
152 RECOG
, SPLIT
, PEEPHOLE2
155 #define IS_SPLIT(X) ((X) != RECOG)
157 /* Next available node number for tree nodes. */
159 static int next_number
;
161 /* Next number to use as an insn_code. */
163 static int next_insn_code
;
165 /* Record the highest depth we ever have so we know how many variables to
166 allocate in each subroutine we make. */
168 static int max_depth
;
170 /* The line number of the start of the pattern currently being processed. */
171 static int pattern_lineno
;
173 /* Count of errors. */
174 static int error_count
;
176 /* Predicate handling.
178 We construct from the machine description a table mapping each
179 predicate to a list of the rtl codes it can possibly match. The
180 function 'maybe_both_true' uses it to deduce that there are no
181 expressions that can be matches by certain pairs of tree nodes.
182 Also, if a predicate can match only one code, we can hardwire that
183 code into the node testing the predicate.
185 Some predicates are flagged as special. validate_pattern will not
186 warn about modeless match_operand expressions if they have a
187 special predicate. Predicates that allow only constants are also
188 treated as special, for this purpose.
190 validate_pattern will warn about predicates that allow non-lvalues
191 when they appear in destination operands.
193 Calculating the set of rtx codes that can possibly be accepted by a
194 predicate expression EXP requires a three-state logic: any given
195 subexpression may definitively accept a code C (Y), definitively
196 reject a code C (N), or may have an indeterminate effect (I). N
197 and I is N; Y or I is Y; Y and I, N or I are both I. Here are full
208 We represent Y with 1, N with 0, I with 2. If any code is left in
209 an I state by the complete expression, we must assume that that
210 code can be accepted. */
216 #define TRISTATE_AND(a,b) \
217 ((a) == I ? ((b) == N ? N : I) : \
218 (b) == I ? ((a) == N ? N : I) : \
221 #define TRISTATE_OR(a,b) \
222 ((a) == I ? ((b) == Y ? Y : I) : \
223 (b) == I ? ((a) == Y ? Y : I) : \
226 #define TRISTATE_NOT(a) \
227 ((a) == I ? I : !(a))
229 /* 0 means no warning about that code yet, 1 means warned. */
230 static char did_you_mean_codes
[NUM_RTX_CODE
];
232 /* Recursively calculate the set of rtx codes accepted by the
233 predicate expression EXP, writing the result to CODES. */
235 compute_predicate_codes (rtx exp
, char codes
[NUM_RTX_CODE
])
237 char op0_codes
[NUM_RTX_CODE
];
238 char op1_codes
[NUM_RTX_CODE
];
239 char op2_codes
[NUM_RTX_CODE
];
242 switch (GET_CODE (exp
))
245 compute_predicate_codes (XEXP (exp
, 0), op0_codes
);
246 compute_predicate_codes (XEXP (exp
, 1), op1_codes
);
247 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
248 codes
[i
] = TRISTATE_AND (op0_codes
[i
], op1_codes
[i
]);
252 compute_predicate_codes (XEXP (exp
, 0), op0_codes
);
253 compute_predicate_codes (XEXP (exp
, 1), op1_codes
);
254 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
255 codes
[i
] = TRISTATE_OR (op0_codes
[i
], op1_codes
[i
]);
258 compute_predicate_codes (XEXP (exp
, 0), op0_codes
);
259 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
260 codes
[i
] = TRISTATE_NOT (op0_codes
[i
]);
264 /* a ? b : c accepts the same codes as (a & b) | (!a & c). */
265 compute_predicate_codes (XEXP (exp
, 0), op0_codes
);
266 compute_predicate_codes (XEXP (exp
, 1), op1_codes
);
267 compute_predicate_codes (XEXP (exp
, 2), op2_codes
);
268 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
269 codes
[i
] = TRISTATE_OR (TRISTATE_AND (op0_codes
[i
], op1_codes
[i
]),
270 TRISTATE_AND (TRISTATE_NOT (op0_codes
[i
]),
275 /* MATCH_CODE allows a specified list of codes. However, if it
276 does not apply to the top level of the expression, it does not
277 constrain the set of codes for the top level. */
278 if (XSTR (exp
, 1)[0] != '\0')
280 memset (codes
, Y
, NUM_RTX_CODE
);
284 memset (codes
, N
, NUM_RTX_CODE
);
286 const char *next_code
= XSTR (exp
, 0);
289 if (*next_code
== '\0')
291 message_with_line (pattern_lineno
, "empty match_code expression");
296 while ((code
= scan_comma_elt (&next_code
)) != 0)
298 size_t n
= next_code
- code
;
301 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
302 if (!strncmp (code
, GET_RTX_NAME (i
), n
)
303 && GET_RTX_NAME (i
)[n
] == '\0')
311 message_with_line (pattern_lineno
, "match_code \"%.*s\" matches nothing",
314 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
315 if (!strncasecmp (code
, GET_RTX_NAME (i
), n
)
316 && GET_RTX_NAME (i
)[n
] == '\0'
317 && !did_you_mean_codes
[i
])
319 did_you_mean_codes
[i
] = 1;
320 message_with_line (pattern_lineno
, "(did you mean \"%s\"?)", GET_RTX_NAME (i
));
329 /* MATCH_OPERAND disallows the set of codes that the named predicate
330 disallows, and is indeterminate for the codes that it does allow. */
332 struct pred_data
*p
= lookup_predicate (XSTR (exp
, 1));
335 message_with_line (pattern_lineno
,
336 "reference to unknown predicate '%s'",
341 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
342 codes
[i
] = p
->codes
[i
] ? I
: N
;
348 /* (match_test WHATEVER) is completely indeterminate. */
349 memset (codes
, I
, NUM_RTX_CODE
);
353 message_with_line (pattern_lineno
,
354 "'%s' cannot be used in a define_predicate expression",
355 GET_RTX_NAME (GET_CODE (exp
)));
357 memset (codes
, I
, NUM_RTX_CODE
);
366 /* Process a define_predicate expression: compute the set of predicates
367 that can be matched, and record this as a known predicate. */
369 process_define_predicate (rtx desc
)
371 struct pred_data
*pred
= XCNEW (struct pred_data
);
372 char codes
[NUM_RTX_CODE
];
375 pred
->name
= XSTR (desc
, 0);
376 if (GET_CODE (desc
) == DEFINE_SPECIAL_PREDICATE
)
379 compute_predicate_codes (XEXP (desc
, 1), codes
);
381 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
383 add_predicate_code (pred
, (enum rtx_code
) i
);
385 add_predicate (pred
);
392 static struct decision
*new_decision
393 (const char *, struct decision_head
*);
394 static struct decision_test
*new_decision_test
395 (enum decision_type
, struct decision_test
***);
396 static rtx find_operand
398 static rtx find_matching_operand
400 static void validate_pattern
401 (rtx
, rtx
, rtx
, int);
402 static struct decision
*add_to_sequence
403 (rtx
, struct decision_head
*, const char *, enum routine_type
, int);
405 static int maybe_both_true_2
406 (struct decision_test
*, struct decision_test
*);
407 static int maybe_both_true_1
408 (struct decision_test
*, struct decision_test
*);
409 static int maybe_both_true
410 (struct decision
*, struct decision
*, int);
412 static int nodes_identical_1
413 (struct decision_test
*, struct decision_test
*);
414 static int nodes_identical
415 (struct decision
*, struct decision
*);
416 static void merge_accept_insn
417 (struct decision
*, struct decision
*);
418 static void merge_trees
419 (struct decision_head
*, struct decision_head
*);
421 static void factor_tests
422 (struct decision_head
*);
423 static void simplify_tests
424 (struct decision_head
*);
425 static int break_out_subroutines
426 (struct decision_head
*, int);
427 static void find_afterward
428 (struct decision_head
*, struct decision
*);
430 static void change_state
431 (const char *, const char *, const char *);
432 static void print_code
434 static void write_afterward
435 (struct decision
*, struct decision
*, const char *);
436 static struct decision
*write_switch
437 (struct decision
*, int);
438 static void write_cond
439 (struct decision_test
*, int, enum routine_type
);
440 static void write_action
441 (struct decision
*, struct decision_test
*, int, int,
442 struct decision
*, enum routine_type
);
443 static int is_unconditional
444 (struct decision_test
*, enum routine_type
);
445 static int write_node
446 (struct decision
*, int, enum routine_type
);
447 static void write_tree_1
448 (struct decision_head
*, int, enum routine_type
);
449 static void write_tree
450 (struct decision_head
*, const char *, enum routine_type
, int);
451 static void write_subroutine
452 (struct decision_head
*, enum routine_type
);
453 static void write_subroutines
454 (struct decision_head
*, enum routine_type
);
455 static void write_header
458 static struct decision_head make_insn_sequence
459 (rtx
, enum routine_type
);
460 static void process_tree
461 (struct decision_head
*, enum routine_type
);
463 static void debug_decision_0
464 (struct decision
*, int, int);
465 static void debug_decision_1
466 (struct decision
*, int);
467 static void debug_decision_2
468 (struct decision_test
*);
469 extern void debug_decision
471 extern void debug_decision_list
474 /* Create a new node in sequence after LAST. */
476 static struct decision
*
477 new_decision (const char *position
, struct decision_head
*last
)
479 struct decision
*new_decision
= XCNEW (struct decision
);
481 new_decision
->success
= *last
;
482 new_decision
->position
= xstrdup (position
);
483 new_decision
->number
= next_number
++;
485 last
->first
= last
->last
= new_decision
;
489 /* Create a new test and link it in at PLACE. */
491 static struct decision_test
*
492 new_decision_test (enum decision_type type
, struct decision_test
***pplace
)
494 struct decision_test
**place
= *pplace
;
495 struct decision_test
*test
;
497 test
= XNEW (struct decision_test
);
508 /* Search for and return operand N, stop when reaching node STOP. */
511 find_operand (rtx pattern
, int n
, rtx stop
)
521 code
= GET_CODE (pattern
);
522 if ((code
== MATCH_SCRATCH
523 || code
== MATCH_OPERAND
524 || code
== MATCH_OPERATOR
525 || code
== MATCH_PARALLEL
)
526 && XINT (pattern
, 0) == n
)
529 fmt
= GET_RTX_FORMAT (code
);
530 len
= GET_RTX_LENGTH (code
);
531 for (i
= 0; i
< len
; i
++)
536 if ((r
= find_operand (XEXP (pattern
, i
), n
, stop
)) != NULL_RTX
)
541 if (! XVEC (pattern
, i
))
546 for (j
= 0; j
< XVECLEN (pattern
, i
); j
++)
547 if ((r
= find_operand (XVECEXP (pattern
, i
, j
), n
, stop
))
552 case 'i': case 'w': case '0': case 's':
563 /* Search for and return operand M, such that it has a matching
564 constraint for operand N. */
567 find_matching_operand (rtx pattern
, int n
)
574 code
= GET_CODE (pattern
);
575 if (code
== MATCH_OPERAND
576 && (XSTR (pattern
, 2)[0] == '0' + n
577 || (XSTR (pattern
, 2)[0] == '%'
578 && XSTR (pattern
, 2)[1] == '0' + n
)))
581 fmt
= GET_RTX_FORMAT (code
);
582 len
= GET_RTX_LENGTH (code
);
583 for (i
= 0; i
< len
; i
++)
588 if ((r
= find_matching_operand (XEXP (pattern
, i
), n
)))
593 if (! XVEC (pattern
, i
))
598 for (j
= 0; j
< XVECLEN (pattern
, i
); j
++)
599 if ((r
= find_matching_operand (XVECEXP (pattern
, i
, j
), n
)))
603 case 'i': case 'w': case '0': case 's':
615 /* Check for various errors in patterns. SET is nonnull for a destination,
616 and is the complete set pattern. SET_CODE is '=' for normal sets, and
617 '+' within a context that requires in-out constraints. */
620 validate_pattern (rtx pattern
, rtx insn
, rtx set
, int set_code
)
627 code
= GET_CODE (pattern
);
635 if (find_operand (insn
, XINT (pattern
, 0), pattern
) == pattern
)
637 message_with_line (pattern_lineno
,
638 "operand %i duplicated before defined",
646 const char *pred_name
= XSTR (pattern
, 1);
647 const struct pred_data
*pred
;
650 if (GET_CODE (insn
) == DEFINE_INSN
)
651 c_test
= XSTR (insn
, 2);
653 c_test
= XSTR (insn
, 1);
655 if (pred_name
[0] != 0)
657 pred
= lookup_predicate (pred_name
);
659 message_with_line (pattern_lineno
,
660 "warning: unknown predicate '%s'",
666 if (code
== MATCH_OPERAND
)
668 const char constraints0
= XSTR (pattern
, 2)[0];
670 /* In DEFINE_EXPAND, DEFINE_SPLIT, and DEFINE_PEEPHOLE2, we
671 don't use the MATCH_OPERAND constraint, only the predicate.
672 This is confusing to folks doing new ports, so help them
673 not make the mistake. */
674 if (GET_CODE (insn
) == DEFINE_EXPAND
675 || GET_CODE (insn
) == DEFINE_SPLIT
676 || GET_CODE (insn
) == DEFINE_PEEPHOLE2
)
679 message_with_line (pattern_lineno
,
680 "warning: constraints not supported in %s",
681 rtx_name
[GET_CODE (insn
)]);
684 /* A MATCH_OPERAND that is a SET should have an output reload. */
685 else if (set
&& constraints0
)
689 if (constraints0
== '+')
691 /* If we've only got an output reload for this operand,
692 we'd better have a matching input operand. */
693 else if (constraints0
== '='
694 && find_matching_operand (insn
, XINT (pattern
, 0)))
698 message_with_line (pattern_lineno
,
699 "operand %d missing in-out reload",
704 else if (constraints0
!= '=' && constraints0
!= '+')
706 message_with_line (pattern_lineno
,
707 "operand %d missing output reload",
714 /* Allowing non-lvalues in destinations -- particularly CONST_INT --
715 while not likely to occur at runtime, results in less efficient
716 code from insn-recog.c. */
717 if (set
&& pred
&& pred
->allows_non_lvalue
)
718 message_with_line (pattern_lineno
,
719 "warning: destination operand %d "
723 /* A modeless MATCH_OPERAND can be handy when we can check for
724 multiple modes in the c_test. In most other cases, it is a
725 mistake. Only DEFINE_INSN is eligible, since SPLIT and
726 PEEP2 can FAIL within the output pattern. Exclude special
727 predicates, which check the mode themselves. Also exclude
728 predicates that allow only constants. Exclude the SET_DEST
729 of a call instruction, as that is a common idiom. */
731 if (GET_MODE (pattern
) == VOIDmode
732 && code
== MATCH_OPERAND
733 && GET_CODE (insn
) == DEFINE_INSN
736 && pred
->allows_non_const
737 && strstr (c_test
, "operands") == NULL
739 && GET_CODE (set
) == SET
740 && GET_CODE (SET_SRC (set
)) == CALL
))
741 message_with_line (pattern_lineno
,
742 "warning: operand %d missing mode?",
749 enum machine_mode dmode
, smode
;
752 dest
= SET_DEST (pattern
);
753 src
= SET_SRC (pattern
);
755 /* STRICT_LOW_PART is a wrapper. Its argument is the real
756 destination, and it's mode should match the source. */
757 if (GET_CODE (dest
) == STRICT_LOW_PART
)
758 dest
= XEXP (dest
, 0);
760 /* Find the referent for a DUP. */
762 if (GET_CODE (dest
) == MATCH_DUP
763 || GET_CODE (dest
) == MATCH_OP_DUP
764 || GET_CODE (dest
) == MATCH_PAR_DUP
)
765 dest
= find_operand (insn
, XINT (dest
, 0), NULL
);
767 if (GET_CODE (src
) == MATCH_DUP
768 || GET_CODE (src
) == MATCH_OP_DUP
769 || GET_CODE (src
) == MATCH_PAR_DUP
)
770 src
= find_operand (insn
, XINT (src
, 0), NULL
);
772 dmode
= GET_MODE (dest
);
773 smode
= GET_MODE (src
);
775 /* The mode of an ADDRESS_OPERAND is the mode of the memory
776 reference, not the mode of the address. */
777 if (GET_CODE (src
) == MATCH_OPERAND
778 && ! strcmp (XSTR (src
, 1), "address_operand"))
781 /* The operands of a SET must have the same mode unless one
783 else if (dmode
!= VOIDmode
&& smode
!= VOIDmode
&& dmode
!= smode
)
785 message_with_line (pattern_lineno
,
786 "mode mismatch in set: %smode vs %smode",
787 GET_MODE_NAME (dmode
), GET_MODE_NAME (smode
));
791 /* If only one of the operands is VOIDmode, and PC or CC0 is
792 not involved, it's probably a mistake. */
793 else if (dmode
!= smode
794 && GET_CODE (dest
) != PC
795 && GET_CODE (dest
) != CC0
796 && GET_CODE (src
) != PC
797 && GET_CODE (src
) != CC0
798 && !CONST_INT_P (src
)
799 && GET_CODE (src
) != CALL
)
802 which
= (dmode
== VOIDmode
? "destination" : "source");
803 message_with_line (pattern_lineno
,
804 "warning: %s missing a mode?", which
);
807 if (dest
!= SET_DEST (pattern
))
808 validate_pattern (dest
, insn
, pattern
, '=');
809 validate_pattern (SET_DEST (pattern
), insn
, pattern
, '=');
810 validate_pattern (SET_SRC (pattern
), insn
, NULL_RTX
, 0);
815 validate_pattern (SET_DEST (pattern
), insn
, pattern
, '=');
819 validate_pattern (XEXP (pattern
, 0), insn
, set
, set
? '+' : 0);
820 validate_pattern (XEXP (pattern
, 1), insn
, NULL_RTX
, 0);
821 validate_pattern (XEXP (pattern
, 2), insn
, NULL_RTX
, 0);
824 case STRICT_LOW_PART
:
825 validate_pattern (XEXP (pattern
, 0), insn
, set
, set
? '+' : 0);
829 if (GET_MODE (XEXP (pattern
, 0)) != VOIDmode
)
831 message_with_line (pattern_lineno
,
832 "operand to label_ref %smode not VOIDmode",
833 GET_MODE_NAME (GET_MODE (XEXP (pattern
, 0))));
842 fmt
= GET_RTX_FORMAT (code
);
843 len
= GET_RTX_LENGTH (code
);
844 for (i
= 0; i
< len
; i
++)
849 validate_pattern (XEXP (pattern
, i
), insn
, NULL_RTX
, 0);
853 for (j
= 0; j
< XVECLEN (pattern
, i
); j
++)
854 validate_pattern (XVECEXP (pattern
, i
, j
), insn
, NULL_RTX
, 0);
857 case 'i': case 'w': case '0': case 's':
866 /* Create a chain of nodes to verify that an rtl expression matches
869 LAST is a pointer to the listhead in the previous node in the chain (or
870 in the calling function, for the first node).
872 POSITION is the string representing the current position in the insn.
874 INSN_TYPE is the type of insn for which we are emitting code.
876 A pointer to the final node in the chain is returned. */
878 static struct decision
*
879 add_to_sequence (rtx pattern
, struct decision_head
*last
, const char *position
,
880 enum routine_type insn_type
, int top
)
883 struct decision
*this_decision
, *sub
;
884 struct decision_test
*test
;
885 struct decision_test
**place
;
889 int depth
= strlen (position
);
891 enum machine_mode mode
;
893 if (depth
> max_depth
)
896 subpos
= XNEWVAR (char, depth
+ 2);
897 strcpy (subpos
, position
);
898 subpos
[depth
+ 1] = 0;
900 sub
= this_decision
= new_decision (position
, last
);
901 place
= &this_decision
->tests
;
904 mode
= GET_MODE (pattern
);
905 code
= GET_CODE (pattern
);
910 /* Toplevel peephole pattern. */
911 if (insn_type
== PEEPHOLE2
&& top
)
915 /* Check we have sufficient insns. This avoids complications
916 because we then know peep2_next_insn never fails. */
917 num_insns
= XVECLEN (pattern
, 0);
920 test
= new_decision_test (DT_num_insns
, &place
);
921 test
->u
.num_insns
= num_insns
;
922 last
= &sub
->success
;
926 /* We don't need the node we just created -- unlink it. */
927 last
->first
= last
->last
= NULL
;
930 for (i
= 0; i
< (size_t) XVECLEN (pattern
, 0); i
++)
932 /* Which insn we're looking at is represented by A-Z. We don't
933 ever use 'A', however; it is always implied. */
935 subpos
[depth
] = (i
> 0 ? 'A' + i
: 0);
936 sub
= add_to_sequence (XVECEXP (pattern
, 0, i
),
937 last
, subpos
, insn_type
, 0);
938 last
= &sub
->success
;
943 /* Else nothing special. */
947 /* The explicit patterns within a match_parallel enforce a minimum
948 length on the vector. The match_parallel predicate may allow
949 for more elements. We do need to check for this minimum here
950 or the code generated to match the internals may reference data
951 beyond the end of the vector. */
952 test
= new_decision_test (DT_veclen_ge
, &place
);
953 test
->u
.veclen
= XVECLEN (pattern
, 2);
960 RTX_CODE was_code
= code
;
961 const char *pred_name
;
962 bool allows_const_int
= true;
964 if (code
== MATCH_SCRATCH
)
966 pred_name
= "scratch_operand";
971 pred_name
= XSTR (pattern
, 1);
972 if (code
== MATCH_PARALLEL
)
978 if (pred_name
[0] != 0)
980 const struct pred_data
*pred
;
982 test
= new_decision_test (DT_pred
, &place
);
983 test
->u
.pred
.name
= pred_name
;
984 test
->u
.pred
.mode
= mode
;
986 /* See if we know about this predicate.
987 If we do, remember it for use below.
989 We can optimize the generated code a little if either
990 (a) the predicate only accepts one code, or (b) the
991 predicate does not allow CONST_INT, in which case it
992 can match only if the modes match. */
993 pred
= lookup_predicate (pred_name
);
996 test
->u
.pred
.data
= pred
;
997 allows_const_int
= pred
->codes
[CONST_INT
];
998 if (was_code
== MATCH_PARALLEL
999 && pred
->singleton
!= PARALLEL
)
1000 message_with_line (pattern_lineno
,
1001 "predicate '%s' used in match_parallel "
1002 "does not allow only PARALLEL", pred
->name
);
1004 code
= pred
->singleton
;
1007 message_with_line (pattern_lineno
,
1008 "warning: unknown predicate '%s' in '%s' expression",
1009 pred_name
, GET_RTX_NAME (was_code
));
1012 /* Can't enforce a mode if we allow const_int. */
1013 if (allows_const_int
)
1016 /* Accept the operand, i.e. record it in `operands'. */
1017 test
= new_decision_test (DT_accept_op
, &place
);
1018 test
->u
.opno
= XINT (pattern
, 0);
1020 if (was_code
== MATCH_OPERATOR
|| was_code
== MATCH_PARALLEL
)
1022 char base
= (was_code
== MATCH_OPERATOR
? '0' : 'a');
1023 for (i
= 0; i
< (size_t) XVECLEN (pattern
, 2); i
++)
1025 subpos
[depth
] = i
+ base
;
1026 sub
= add_to_sequence (XVECEXP (pattern
, 2, i
),
1027 &sub
->success
, subpos
, insn_type
, 0);
1036 test
= new_decision_test (DT_dup
, &place
);
1037 test
->u
.dup
= XINT (pattern
, 0);
1039 test
= new_decision_test (DT_accept_op
, &place
);
1040 test
->u
.opno
= XINT (pattern
, 0);
1042 for (i
= 0; i
< (size_t) XVECLEN (pattern
, 1); i
++)
1044 subpos
[depth
] = i
+ '0';
1045 sub
= add_to_sequence (XVECEXP (pattern
, 1, i
),
1046 &sub
->success
, subpos
, insn_type
, 0);
1054 test
= new_decision_test (DT_dup
, &place
);
1055 test
->u
.dup
= XINT (pattern
, 0);
1059 pattern
= XEXP (pattern
, 0);
1066 fmt
= GET_RTX_FORMAT (code
);
1067 len
= GET_RTX_LENGTH (code
);
1069 /* Do tests against the current node first. */
1070 for (i
= 0; i
< (size_t) len
; i
++)
1078 test
= new_decision_test (DT_elt_zero_int
, &place
);
1079 test
->u
.intval
= XINT (pattern
, i
);
1083 test
= new_decision_test (DT_elt_one_int
, &place
);
1084 test
->u
.intval
= XINT (pattern
, i
);
1087 else if (fmt
[i
] == 'w')
1089 /* If this value actually fits in an int, we can use a switch
1090 statement here, so indicate that. */
1091 enum decision_type type
1092 = ((int) XWINT (pattern
, i
) == XWINT (pattern
, i
))
1093 ? DT_elt_zero_wide_safe
: DT_elt_zero_wide
;
1097 test
= new_decision_test (type
, &place
);
1098 test
->u
.intval
= XWINT (pattern
, i
);
1100 else if (fmt
[i
] == 'E')
1104 test
= new_decision_test (DT_veclen
, &place
);
1105 test
->u
.veclen
= XVECLEN (pattern
, i
);
1109 /* Now test our sub-patterns. */
1110 for (i
= 0; i
< (size_t) len
; i
++)
1115 subpos
[depth
] = '0' + i
;
1116 sub
= add_to_sequence (XEXP (pattern
, i
), &sub
->success
,
1117 subpos
, insn_type
, 0);
1123 for (j
= 0; j
< XVECLEN (pattern
, i
); j
++)
1125 subpos
[depth
] = 'a' + j
;
1126 sub
= add_to_sequence (XVECEXP (pattern
, i
, j
),
1127 &sub
->success
, subpos
, insn_type
, 0);
1133 /* Handled above. */
1144 /* Insert nodes testing mode and code, if they're still relevant,
1145 before any of the nodes we may have added above. */
1146 if (code
!= UNKNOWN
)
1148 place
= &this_decision
->tests
;
1149 test
= new_decision_test (DT_code
, &place
);
1150 test
->u
.code
= code
;
1153 if (mode
!= VOIDmode
)
1155 place
= &this_decision
->tests
;
1156 test
= new_decision_test (DT_mode
, &place
);
1157 test
->u
.mode
= mode
;
1160 /* If we didn't insert any tests or accept nodes, hork. */
1161 gcc_assert (this_decision
->tests
);
1168 /* A subroutine of maybe_both_true; examines only one test.
1169 Returns > 0 for "definitely both true" and < 0 for "maybe both true". */
1172 maybe_both_true_2 (struct decision_test
*d1
, struct decision_test
*d2
)
1174 if (d1
->type
== d2
->type
)
1179 if (d1
->u
.num_insns
== d2
->u
.num_insns
)
1185 return d1
->u
.mode
== d2
->u
.mode
;
1188 return d1
->u
.code
== d2
->u
.code
;
1191 return d1
->u
.veclen
== d2
->u
.veclen
;
1193 case DT_elt_zero_int
:
1194 case DT_elt_one_int
:
1195 case DT_elt_zero_wide
:
1196 case DT_elt_zero_wide_safe
:
1197 return d1
->u
.intval
== d2
->u
.intval
;
1204 /* If either has a predicate that we know something about, set
1205 things up so that D1 is the one that always has a known
1206 predicate. Then see if they have any codes in common. */
1208 if (d1
->type
== DT_pred
|| d2
->type
== DT_pred
)
1210 if (d2
->type
== DT_pred
)
1212 struct decision_test
*tmp
;
1213 tmp
= d1
, d1
= d2
, d2
= tmp
;
1216 /* If D2 tests a mode, see if it matches D1. */
1217 if (d1
->u
.pred
.mode
!= VOIDmode
)
1219 if (d2
->type
== DT_mode
)
1221 if (d1
->u
.pred
.mode
!= d2
->u
.mode
1222 /* The mode of an address_operand predicate is the
1223 mode of the memory, not the operand. It can only
1224 be used for testing the predicate, so we must
1226 && strcmp (d1
->u
.pred
.name
, "address_operand") != 0)
1229 /* Don't check two predicate modes here, because if both predicates
1230 accept CONST_INT, then both can still be true even if the modes
1231 are different. If they don't accept CONST_INT, there will be a
1232 separate DT_mode that will make maybe_both_true_1 return 0. */
1235 if (d1
->u
.pred
.data
)
1237 /* If D2 tests a code, see if it is in the list of valid
1238 codes for D1's predicate. */
1239 if (d2
->type
== DT_code
)
1241 if (!d1
->u
.pred
.data
->codes
[d2
->u
.code
])
1245 /* Otherwise see if the predicates have any codes in common. */
1246 else if (d2
->type
== DT_pred
&& d2
->u
.pred
.data
)
1248 bool common
= false;
1251 for (c
= 0; c
< NUM_RTX_CODE
; c
++)
1252 if (d1
->u
.pred
.data
->codes
[c
] && d2
->u
.pred
.data
->codes
[c
])
1264 /* Tests vs veclen may be known when strict equality is involved. */
1265 if (d1
->type
== DT_veclen
&& d2
->type
== DT_veclen_ge
)
1266 return d1
->u
.veclen
>= d2
->u
.veclen
;
1267 if (d1
->type
== DT_veclen_ge
&& d2
->type
== DT_veclen
)
1268 return d2
->u
.veclen
>= d1
->u
.veclen
;
1273 /* A subroutine of maybe_both_true; examines all the tests for a given node.
1274 Returns > 0 for "definitely both true" and < 0 for "maybe both true". */
1277 maybe_both_true_1 (struct decision_test
*d1
, struct decision_test
*d2
)
1279 struct decision_test
*t1
, *t2
;
1281 /* A match_operand with no predicate can match anything. Recognize
1282 this by the existence of a lone DT_accept_op test. */
1283 if (d1
->type
== DT_accept_op
|| d2
->type
== DT_accept_op
)
1286 /* Eliminate pairs of tests while they can exactly match. */
1287 while (d1
&& d2
&& d1
->type
== d2
->type
)
1289 if (maybe_both_true_2 (d1
, d2
) == 0)
1291 d1
= d1
->next
, d2
= d2
->next
;
1294 /* After that, consider all pairs. */
1295 for (t1
= d1
; t1
; t1
= t1
->next
)
1296 for (t2
= d2
; t2
; t2
= t2
->next
)
1297 if (maybe_both_true_2 (t1
, t2
) == 0)
1303 /* Return 0 if we can prove that there is no RTL that can match both
1304 D1 and D2. Otherwise, return 1 (it may be that there is an RTL that
1305 can match both or just that we couldn't prove there wasn't such an RTL).
1307 TOPLEVEL is nonzero if we are to only look at the top level and not
1308 recursively descend. */
1311 maybe_both_true (struct decision
*d1
, struct decision
*d2
,
1314 struct decision
*p1
, *p2
;
1317 /* Don't compare strings on the different positions in insn. Doing so
1318 is incorrect and results in false matches from constructs like
1320 [(set (subreg:HI (match_operand:SI "register_operand" "r") 0)
1321 (subreg:HI (match_operand:SI "register_operand" "r") 0))]
1323 [(set (match_operand:HI "register_operand" "r")
1324 (match_operand:HI "register_operand" "r"))]
1326 If we are presented with such, we are recursing through the remainder
1327 of a node's success nodes (from the loop at the end of this function).
1328 Skip forward until we come to a position that matches.
1330 Due to the way position strings are constructed, we know that iterating
1331 forward from the lexically lower position (e.g. "00") will run into
1332 the lexically higher position (e.g. "1") and not the other way around.
1333 This saves a bit of effort. */
1335 cmp
= strcmp (d1
->position
, d2
->position
);
1338 gcc_assert (!toplevel
);
1340 /* If the d2->position was lexically lower, swap. */
1342 p1
= d1
, d1
= d2
, d2
= p1
;
1344 if (d1
->success
.first
== 0)
1346 for (p1
= d1
->success
.first
; p1
; p1
= p1
->next
)
1347 if (maybe_both_true (p1
, d2
, 0))
1353 /* Test the current level. */
1354 cmp
= maybe_both_true_1 (d1
->tests
, d2
->tests
);
1358 /* We can't prove that D1 and D2 cannot both be true. If we are only
1359 to check the top level, return 1. Otherwise, see if we can prove
1360 that all choices in both successors are mutually exclusive. If
1361 either does not have any successors, we can't prove they can't both
1364 if (toplevel
|| d1
->success
.first
== 0 || d2
->success
.first
== 0)
1367 for (p1
= d1
->success
.first
; p1
; p1
= p1
->next
)
1368 for (p2
= d2
->success
.first
; p2
; p2
= p2
->next
)
1369 if (maybe_both_true (p1
, p2
, 0))
1375 /* A subroutine of nodes_identical. Examine two tests for equivalence. */
1378 nodes_identical_1 (struct decision_test
*d1
, struct decision_test
*d2
)
1383 return d1
->u
.num_insns
== d2
->u
.num_insns
;
1386 return d1
->u
.mode
== d2
->u
.mode
;
1389 return d1
->u
.code
== d2
->u
.code
;
1392 return (d1
->u
.pred
.mode
== d2
->u
.pred
.mode
1393 && strcmp (d1
->u
.pred
.name
, d2
->u
.pred
.name
) == 0);
1396 return strcmp (d1
->u
.c_test
, d2
->u
.c_test
) == 0;
1400 return d1
->u
.veclen
== d2
->u
.veclen
;
1403 return d1
->u
.dup
== d2
->u
.dup
;
1405 case DT_elt_zero_int
:
1406 case DT_elt_one_int
:
1407 case DT_elt_zero_wide
:
1408 case DT_elt_zero_wide_safe
:
1409 return d1
->u
.intval
== d2
->u
.intval
;
1412 return d1
->u
.opno
== d2
->u
.opno
;
1414 case DT_accept_insn
:
1415 /* Differences will be handled in merge_accept_insn. */
1423 /* True iff the two nodes are identical (on one level only). Due
1424 to the way these lists are constructed, we shouldn't have to
1425 consider different orderings on the tests. */
1428 nodes_identical (struct decision
*d1
, struct decision
*d2
)
1430 struct decision_test
*t1
, *t2
;
1432 for (t1
= d1
->tests
, t2
= d2
->tests
; t1
&& t2
; t1
= t1
->next
, t2
= t2
->next
)
1434 if (t1
->type
!= t2
->type
)
1436 if (! nodes_identical_1 (t1
, t2
))
1440 /* For success, they should now both be null. */
1444 /* Check that their subnodes are at the same position, as any one set
1445 of sibling decisions must be at the same position. Allowing this
1446 requires complications to find_afterward and when change_state is
1448 if (d1
->success
.first
1449 && d2
->success
.first
1450 && strcmp (d1
->success
.first
->position
, d2
->success
.first
->position
))
1456 /* A subroutine of merge_trees; given two nodes that have been declared
1457 identical, cope with two insn accept states. If they differ in the
1458 number of clobbers, then the conflict was created by make_insn_sequence
1459 and we can drop the with-clobbers version on the floor. If both
1460 nodes have no additional clobbers, we have found an ambiguity in the
1461 source machine description. */
1464 merge_accept_insn (struct decision
*oldd
, struct decision
*addd
)
1466 struct decision_test
*old
, *add
;
1468 for (old
= oldd
->tests
; old
; old
= old
->next
)
1469 if (old
->type
== DT_accept_insn
)
1474 for (add
= addd
->tests
; add
; add
= add
->next
)
1475 if (add
->type
== DT_accept_insn
)
1480 /* If one node is for a normal insn and the second is for the base
1481 insn with clobbers stripped off, the second node should be ignored. */
1483 if (old
->u
.insn
.num_clobbers_to_add
== 0
1484 && add
->u
.insn
.num_clobbers_to_add
> 0)
1486 /* Nothing to do here. */
1488 else if (old
->u
.insn
.num_clobbers_to_add
> 0
1489 && add
->u
.insn
.num_clobbers_to_add
== 0)
1491 /* In this case, replace OLD with ADD. */
1492 old
->u
.insn
= add
->u
.insn
;
1496 message_with_line (add
->u
.insn
.lineno
, "`%s' matches `%s'",
1497 get_insn_name (add
->u
.insn
.code_number
),
1498 get_insn_name (old
->u
.insn
.code_number
));
1499 message_with_line (old
->u
.insn
.lineno
, "previous definition of `%s'",
1500 get_insn_name (old
->u
.insn
.code_number
));
1505 /* Merge two decision trees OLDH and ADDH, modifying OLDH destructively. */
1508 merge_trees (struct decision_head
*oldh
, struct decision_head
*addh
)
1510 struct decision
*next
, *add
;
1512 if (addh
->first
== 0)
1514 if (oldh
->first
== 0)
1520 /* Trying to merge bits at different positions isn't possible. */
1521 gcc_assert (!strcmp (oldh
->first
->position
, addh
->first
->position
));
1523 for (add
= addh
->first
; add
; add
= next
)
1525 struct decision
*old
, *insert_before
= NULL
;
1529 /* The semantics of pattern matching state that the tests are
1530 done in the order given in the MD file so that if an insn
1531 matches two patterns, the first one will be used. However,
1532 in practice, most, if not all, patterns are unambiguous so
1533 that their order is independent. In that case, we can merge
1534 identical tests and group all similar modes and codes together.
1536 Scan starting from the end of OLDH until we reach a point
1537 where we reach the head of the list or where we pass a
1538 pattern that could also be true if NEW is true. If we find
1539 an identical pattern, we can merge them. Also, record the
1540 last node that tests the same code and mode and the last one
1541 that tests just the same mode.
1543 If we have no match, place NEW after the closest match we found. */
1545 for (old
= oldh
->last
; old
; old
= old
->prev
)
1547 if (nodes_identical (old
, add
))
1549 merge_accept_insn (old
, add
);
1550 merge_trees (&old
->success
, &add
->success
);
1554 if (maybe_both_true (old
, add
, 0))
1557 /* Insert the nodes in DT test type order, which is roughly
1558 how expensive/important the test is. Given that the tests
1559 are also ordered within the list, examining the first is
1561 if ((int) add
->tests
->type
< (int) old
->tests
->type
)
1562 insert_before
= old
;
1565 if (insert_before
== NULL
)
1568 add
->prev
= oldh
->last
;
1569 oldh
->last
->next
= add
;
1574 if ((add
->prev
= insert_before
->prev
) != NULL
)
1575 add
->prev
->next
= add
;
1578 add
->next
= insert_before
;
1579 insert_before
->prev
= add
;
1586 /* Walk the tree looking for sub-nodes that perform common tests.
1587 Factor out the common test into a new node. This enables us
1588 (depending on the test type) to emit switch statements later. */
1591 factor_tests (struct decision_head
*head
)
1593 struct decision
*first
, *next
;
1595 for (first
= head
->first
; first
&& first
->next
; first
= next
)
1597 enum decision_type type
;
1598 struct decision
*new_dec
, *old_last
;
1600 type
= first
->tests
->type
;
1603 /* Want at least two compatible sequential nodes. */
1604 if (next
->tests
->type
!= type
)
1607 /* Don't want all node types, just those we can turn into
1608 switch statements. */
1611 && type
!= DT_veclen
1612 && type
!= DT_elt_zero_int
1613 && type
!= DT_elt_one_int
1614 && type
!= DT_elt_zero_wide_safe
)
1617 /* If we'd been performing more than one test, create a new node
1618 below our first test. */
1619 if (first
->tests
->next
!= NULL
)
1621 new_dec
= new_decision (first
->position
, &first
->success
);
1622 new_dec
->tests
= first
->tests
->next
;
1623 first
->tests
->next
= NULL
;
1626 /* Crop the node tree off after our first test. */
1628 old_last
= head
->last
;
1631 /* For each compatible test, adjust to perform only one test in
1632 the top level node, then merge the node back into the tree. */
1635 struct decision_head h
;
1637 if (next
->tests
->next
!= NULL
)
1639 new_dec
= new_decision (next
->position
, &next
->success
);
1640 new_dec
->tests
= next
->tests
->next
;
1641 next
->tests
->next
= NULL
;
1645 new_dec
->next
= NULL
;
1646 h
.first
= h
.last
= new_dec
;
1648 merge_trees (head
, &h
);
1650 while (next
&& next
->tests
->type
== type
);
1652 /* After we run out of compatible tests, graft the remaining nodes
1653 back onto the tree. */
1656 next
->prev
= head
->last
;
1657 head
->last
->next
= next
;
1658 head
->last
= old_last
;
1663 for (first
= head
->first
; first
; first
= first
->next
)
1664 factor_tests (&first
->success
);
1667 /* After factoring, try to simplify the tests on any one node.
1668 Tests that are useful for switch statements are recognizable
1669 by having only a single test on a node -- we'll be manipulating
1670 nodes with multiple tests:
1672 If we have mode tests or code tests that are redundant with
1673 predicates, remove them. */
1676 simplify_tests (struct decision_head
*head
)
1678 struct decision
*tree
;
1680 for (tree
= head
->first
; tree
; tree
= tree
->next
)
1682 struct decision_test
*a
, *b
;
1689 /* Find a predicate node. */
1690 while (b
&& b
->type
!= DT_pred
)
1694 /* Due to how these tests are constructed, we don't even need
1695 to check that the mode and code are compatible -- they were
1696 generated from the predicate in the first place. */
1697 while (a
->type
== DT_mode
|| a
->type
== DT_code
)
1704 for (tree
= head
->first
; tree
; tree
= tree
->next
)
1705 simplify_tests (&tree
->success
);
1708 /* Count the number of subnodes of HEAD. If the number is high enough,
1709 make the first node in HEAD start a separate subroutine in the C code
1710 that is generated. */
1713 break_out_subroutines (struct decision_head
*head
, int initial
)
1716 struct decision
*sub
;
1718 for (sub
= head
->first
; sub
; sub
= sub
->next
)
1719 size
+= 1 + break_out_subroutines (&sub
->success
, 0);
1721 if (size
> SUBROUTINE_THRESHOLD
&& ! initial
)
1723 head
->first
->subroutine_number
= ++next_subroutine_number
;
1729 /* For each node p, find the next alternative that might be true
1733 find_afterward (struct decision_head
*head
, struct decision
*real_afterward
)
1735 struct decision
*p
, *q
, *afterward
;
1737 /* We can't propagate alternatives across subroutine boundaries.
1738 This is not incorrect, merely a minor optimization loss. */
1741 afterward
= (p
->subroutine_number
> 0 ? NULL
: real_afterward
);
1743 for ( ; p
; p
= p
->next
)
1745 /* Find the next node that might be true if this one fails. */
1746 for (q
= p
->next
; q
; q
= q
->next
)
1747 if (maybe_both_true (p
, q
, 1))
1750 /* If we reached the end of the list without finding one,
1751 use the incoming afterward position. */
1760 for (p
= head
->first
; p
; p
= p
->next
)
1761 if (p
->success
.first
)
1762 find_afterward (&p
->success
, p
->afterward
);
1764 /* When we are generating a subroutine, record the real afterward
1765 position in the first node where write_tree can find it, and we
1766 can do the right thing at the subroutine call site. */
1768 if (p
->subroutine_number
> 0)
1769 p
->afterward
= real_afterward
;
1772 /* Assuming that the state of argument is denoted by OLDPOS, take whatever
1773 actions are necessary to move to NEWPOS. If we fail to move to the
1774 new state, branch to node AFTERWARD if nonzero, otherwise return.
1776 Failure to move to the new state can only occur if we are trying to
1777 match multiple insns and we try to step past the end of the stream. */
1780 change_state (const char *oldpos
, const char *newpos
, const char *indent
)
1782 int odepth
= strlen (oldpos
);
1783 int ndepth
= strlen (newpos
);
1785 int old_has_insn
, new_has_insn
;
1787 /* Pop up as many levels as necessary. */
1788 for (depth
= odepth
; strncmp (oldpos
, newpos
, depth
) != 0; --depth
)
1791 /* Hunt for the last [A-Z] in both strings. */
1792 for (old_has_insn
= odepth
- 1; old_has_insn
>= 0; --old_has_insn
)
1793 if (ISUPPER (oldpos
[old_has_insn
]))
1795 for (new_has_insn
= ndepth
- 1; new_has_insn
>= 0; --new_has_insn
)
1796 if (ISUPPER (newpos
[new_has_insn
]))
1799 /* Go down to desired level. */
1800 while (depth
< ndepth
)
1802 /* It's a different insn from the first one. */
1803 if (ISUPPER (newpos
[depth
]))
1805 printf ("%stem = peep2_next_insn (%d);\n",
1806 indent
, newpos
[depth
] - 'A');
1807 printf ("%sx%d = PATTERN (tem);\n", indent
, depth
+ 1);
1809 else if (ISLOWER (newpos
[depth
]))
1810 printf ("%sx%d = XVECEXP (x%d, 0, %d);\n",
1811 indent
, depth
+ 1, depth
, newpos
[depth
] - 'a');
1813 printf ("%sx%d = XEXP (x%d, %c);\n",
1814 indent
, depth
+ 1, depth
, newpos
[depth
]);
1819 /* Print the enumerator constant for CODE -- the upcase version of
1823 print_code (enum rtx_code code
)
1826 for (p
= GET_RTX_NAME (code
); *p
; p
++)
1827 putchar (TOUPPER (*p
));
1830 /* Emit code to cross an afterward link -- change state and branch. */
1833 write_afterward (struct decision
*start
, struct decision
*afterward
,
1836 if (!afterward
|| start
->subroutine_number
> 0)
1837 printf("%sgoto ret0;\n", indent
);
1840 change_state (start
->position
, afterward
->position
, indent
);
1841 printf ("%sgoto L%d;\n", indent
, afterward
->number
);
1845 /* Emit a HOST_WIDE_INT as an integer constant expression. We need to take
1846 special care to avoid "decimal constant is so large that it is unsigned"
1847 warnings in the resulting code. */
1850 print_host_wide_int (HOST_WIDE_INT val
)
1852 HOST_WIDE_INT min
= (unsigned HOST_WIDE_INT
)1 << (HOST_BITS_PER_WIDE_INT
-1);
1854 printf ("(" HOST_WIDE_INT_PRINT_DEC_C
"-1)", val
+ 1);
1856 printf (HOST_WIDE_INT_PRINT_DEC_C
, val
);
1859 /* Emit a switch statement, if possible, for an initial sequence of
1860 nodes at START. Return the first node yet untested. */
1862 static struct decision
*
1863 write_switch (struct decision
*start
, int depth
)
1865 struct decision
*p
= start
;
1866 enum decision_type type
= p
->tests
->type
;
1867 struct decision
*needs_label
= NULL
;
1869 /* If we have two or more nodes in sequence that test the same one
1870 thing, we may be able to use a switch statement. */
1874 || p
->next
->tests
->type
!= type
1875 || p
->next
->tests
->next
1876 || nodes_identical_1 (p
->tests
, p
->next
->tests
))
1879 /* DT_code is special in that we can do interesting things with
1880 known predicates at the same time. */
1881 if (type
== DT_code
)
1883 char codemap
[NUM_RTX_CODE
];
1884 struct decision
*ret
;
1887 memset (codemap
, 0, sizeof(codemap
));
1889 printf (" switch (GET_CODE (x%d))\n {\n", depth
);
1890 code
= p
->tests
->u
.code
;
1893 if (p
!= start
&& p
->need_label
&& needs_label
== NULL
)
1898 printf (":\n goto L%d;\n", p
->success
.first
->number
);
1899 p
->success
.first
->need_label
= 1;
1906 && p
->tests
->type
== DT_code
1907 && ! codemap
[code
= p
->tests
->u
.code
]);
1909 /* If P is testing a predicate that we know about and we haven't
1910 seen any of the codes that are valid for the predicate, we can
1911 write a series of "case" statement, one for each possible code.
1912 Since we are already in a switch, these redundant tests are very
1913 cheap and will reduce the number of predicates called. */
1915 /* Note that while we write out cases for these predicates here,
1916 we don't actually write the test here, as it gets kinda messy.
1917 It is trivial to leave this to later by telling our caller that
1918 we only processed the CODE tests. */
1919 if (needs_label
!= NULL
)
1924 while (p
&& p
->tests
->type
== DT_pred
&& p
->tests
->u
.pred
.data
)
1926 const struct pred_data
*data
= p
->tests
->u
.pred
.data
;
1929 for (c
= 0; c
< NUM_RTX_CODE
; c
++)
1930 if (codemap
[c
] && data
->codes
[c
])
1933 for (c
= 0; c
< NUM_RTX_CODE
; c
++)
1936 fputs (" case ", stdout
);
1937 print_code ((enum rtx_code
) c
);
1938 fputs (":\n", stdout
);
1942 printf (" goto L%d;\n", p
->number
);
1948 /* Make the default case skip the predicates we managed to match. */
1950 printf (" default:\n");
1955 printf (" goto L%d;\n", p
->number
);
1959 write_afterward (start
, start
->afterward
, " ");
1962 printf (" break;\n");
1967 else if (type
== DT_mode
1968 || type
== DT_veclen
1969 || type
== DT_elt_zero_int
1970 || type
== DT_elt_one_int
1971 || type
== DT_elt_zero_wide_safe
)
1973 const char *indent
= "";
1975 /* We cast switch parameter to integer, so we must ensure that the value
1977 if (type
== DT_elt_zero_wide_safe
)
1980 printf(" if ((int) XWINT (x%d, 0) == XWINT (x%d, 0))\n", depth
, depth
);
1982 printf ("%s switch (", indent
);
1986 printf ("GET_MODE (x%d)", depth
);
1989 printf ("XVECLEN (x%d, 0)", depth
);
1991 case DT_elt_zero_int
:
1992 printf ("XINT (x%d, 0)", depth
);
1994 case DT_elt_one_int
:
1995 printf ("XINT (x%d, 1)", depth
);
1997 case DT_elt_zero_wide_safe
:
1998 /* Convert result of XWINT to int for portability since some C
1999 compilers won't do it and some will. */
2000 printf ("(int) XWINT (x%d, 0)", depth
);
2005 printf (")\n%s {\n", indent
);
2009 /* Merge trees will not unify identical nodes if their
2010 sub-nodes are at different levels. Thus we must check
2011 for duplicate cases. */
2013 for (q
= start
; q
!= p
; q
= q
->next
)
2014 if (nodes_identical_1 (p
->tests
, q
->tests
))
2017 if (p
!= start
&& p
->need_label
&& needs_label
== NULL
)
2020 printf ("%s case ", indent
);
2024 printf ("%smode", GET_MODE_NAME (p
->tests
->u
.mode
));
2027 printf ("%d", p
->tests
->u
.veclen
);
2029 case DT_elt_zero_int
:
2030 case DT_elt_one_int
:
2031 case DT_elt_zero_wide
:
2032 case DT_elt_zero_wide_safe
:
2033 print_host_wide_int (p
->tests
->u
.intval
);
2038 printf (":\n%s goto L%d;\n", indent
, p
->success
.first
->number
);
2039 p
->success
.first
->need_label
= 1;
2043 while (p
&& p
->tests
->type
== type
&& !p
->tests
->next
);
2046 printf ("%s default:\n%s break;\n%s }\n",
2047 indent
, indent
, indent
);
2049 return needs_label
!= NULL
? needs_label
: p
;
2053 /* None of the other tests are amenable. */
2058 /* Emit code for one test. */
2061 write_cond (struct decision_test
*p
, int depth
,
2062 enum routine_type subroutine_type
)
2067 printf ("peep2_current_count >= %d", p
->u
.num_insns
);
2071 printf ("GET_MODE (x%d) == %smode", depth
, GET_MODE_NAME (p
->u
.mode
));
2075 printf ("GET_CODE (x%d) == ", depth
);
2076 print_code (p
->u
.code
);
2080 printf ("XVECLEN (x%d, 0) == %d", depth
, p
->u
.veclen
);
2083 case DT_elt_zero_int
:
2084 printf ("XINT (x%d, 0) == %d", depth
, (int) p
->u
.intval
);
2087 case DT_elt_one_int
:
2088 printf ("XINT (x%d, 1) == %d", depth
, (int) p
->u
.intval
);
2091 case DT_elt_zero_wide
:
2092 case DT_elt_zero_wide_safe
:
2093 printf ("XWINT (x%d, 0) == ", depth
);
2094 print_host_wide_int (p
->u
.intval
);
2098 printf ("x%d == const_int_rtx[MAX_SAVED_CONST_INT + (%d)]",
2099 depth
, (int) p
->u
.intval
);
2103 printf ("XVECLEN (x%d, 0) >= %d", depth
, p
->u
.veclen
);
2107 printf ("rtx_equal_p (x%d, operands[%d])", depth
, p
->u
.dup
);
2111 printf ("%s (x%d, %smode)", p
->u
.pred
.name
, depth
,
2112 GET_MODE_NAME (p
->u
.pred
.mode
));
2116 print_c_condition (p
->u
.c_test
);
2119 case DT_accept_insn
:
2120 gcc_assert (subroutine_type
== RECOG
);
2121 gcc_assert (p
->u
.insn
.num_clobbers_to_add
);
2122 printf ("pnum_clobbers != NULL");
2130 /* Emit code for one action. The previous tests have succeeded;
2131 TEST is the last of the chain. In the normal case we simply
2132 perform a state change. For the `accept' tests we must do more work. */
2135 write_action (struct decision
*p
, struct decision_test
*test
,
2136 int depth
, int uncond
, struct decision
*success
,
2137 enum routine_type subroutine_type
)
2144 else if (test
->type
== DT_accept_op
|| test
->type
== DT_accept_insn
)
2146 fputs (" {\n", stdout
);
2153 if (test
->type
== DT_accept_op
)
2155 printf("%soperands[%d] = x%d;\n", indent
, test
->u
.opno
, depth
);
2157 /* Only allow DT_accept_insn to follow. */
2161 gcc_assert (test
->type
== DT_accept_insn
);
2165 /* Sanity check that we're now at the end of the list of tests. */
2166 gcc_assert (!test
->next
);
2168 if (test
->type
== DT_accept_insn
)
2170 switch (subroutine_type
)
2173 if (test
->u
.insn
.num_clobbers_to_add
!= 0)
2174 printf ("%s*pnum_clobbers = %d;\n",
2175 indent
, test
->u
.insn
.num_clobbers_to_add
);
2176 printf ("%sreturn %d; /* %s */\n", indent
,
2177 test
->u
.insn
.code_number
,
2178 get_insn_name (test
->u
.insn
.code_number
));
2182 printf ("%sreturn gen_split_%d (insn, operands);\n",
2183 indent
, test
->u
.insn
.code_number
);
2188 int match_len
= 0, i
;
2190 for (i
= strlen (p
->position
) - 1; i
>= 0; --i
)
2191 if (ISUPPER (p
->position
[i
]))
2193 match_len
= p
->position
[i
] - 'A';
2196 printf ("%s*_pmatch_len = %d;\n", indent
, match_len
);
2197 printf ("%stem = gen_peephole2_%d (insn, operands);\n",
2198 indent
, test
->u
.insn
.code_number
);
2199 printf ("%sif (tem != 0)\n%s return tem;\n", indent
, indent
);
2209 printf("%sgoto L%d;\n", indent
, success
->number
);
2210 success
->need_label
= 1;
2214 fputs (" }\n", stdout
);
2217 /* Return 1 if the test is always true and has no fallthru path. Return -1
2218 if the test does have a fallthru path, but requires that the condition be
2219 terminated. Otherwise return 0 for a normal test. */
2220 /* ??? is_unconditional is a stupid name for a tri-state function. */
2223 is_unconditional (struct decision_test
*t
, enum routine_type subroutine_type
)
2225 if (t
->type
== DT_accept_op
)
2228 if (t
->type
== DT_accept_insn
)
2230 switch (subroutine_type
)
2233 return (t
->u
.insn
.num_clobbers_to_add
== 0);
2246 /* Emit code for one node -- the conditional and the accompanying action.
2247 Return true if there is no fallthru path. */
2250 write_node (struct decision
*p
, int depth
,
2251 enum routine_type subroutine_type
)
2253 struct decision_test
*test
, *last_test
;
2256 /* Scan the tests and simplify comparisons against small
2258 for (test
= p
->tests
; test
; test
= test
->next
)
2260 if (test
->type
== DT_code
2261 && test
->u
.code
== CONST_INT
2263 && test
->next
->type
== DT_elt_zero_wide_safe
2264 && -MAX_SAVED_CONST_INT
<= test
->next
->u
.intval
2265 && test
->next
->u
.intval
<= MAX_SAVED_CONST_INT
)
2267 test
->type
= DT_const_int
;
2268 test
->u
.intval
= test
->next
->u
.intval
;
2269 test
->next
= test
->next
->next
;
2273 last_test
= test
= p
->tests
;
2274 uncond
= is_unconditional (test
, subroutine_type
);
2278 write_cond (test
, depth
, subroutine_type
);
2280 while ((test
= test
->next
) != NULL
)
2283 if (is_unconditional (test
, subroutine_type
))
2287 write_cond (test
, depth
, subroutine_type
);
2293 write_action (p
, last_test
, depth
, uncond
, p
->success
.first
, subroutine_type
);
2298 /* Emit code for all of the sibling nodes of HEAD. */
2301 write_tree_1 (struct decision_head
*head
, int depth
,
2302 enum routine_type subroutine_type
)
2304 struct decision
*p
, *next
;
2307 for (p
= head
->first
; p
; p
= next
)
2309 /* The label for the first element was printed in write_tree. */
2310 if (p
!= head
->first
&& p
->need_label
)
2311 OUTPUT_LABEL (" ", p
->number
);
2313 /* Attempt to write a switch statement for a whole sequence. */
2314 next
= write_switch (p
, depth
);
2319 /* Failed -- fall back and write one node. */
2320 uncond
= write_node (p
, depth
, subroutine_type
);
2325 /* Finished with this chain. Close a fallthru path by branching
2326 to the afterward node. */
2328 write_afterward (head
->last
, head
->last
->afterward
, " ");
2331 /* Write out the decision tree starting at HEAD. PREVPOS is the
2332 position at the node that branched to this node. */
2335 write_tree (struct decision_head
*head
, const char *prevpos
,
2336 enum routine_type type
, int initial
)
2338 struct decision
*p
= head
->first
;
2342 OUTPUT_LABEL (" ", p
->number
);
2344 if (! initial
&& p
->subroutine_number
> 0)
2346 static const char * const name_prefix
[] = {
2347 "recog", "split", "peephole2"
2350 static const char * const call_suffix
[] = {
2351 ", pnum_clobbers", "", ", _pmatch_len"
2354 /* This node has been broken out into a separate subroutine.
2355 Call it, test the result, and branch accordingly. */
2359 printf (" tem = %s_%d (x0, insn%s);\n",
2360 name_prefix
[type
], p
->subroutine_number
, call_suffix
[type
]);
2361 if (IS_SPLIT (type
))
2362 printf (" if (tem != 0)\n return tem;\n");
2364 printf (" if (tem >= 0)\n return tem;\n");
2366 change_state (p
->position
, p
->afterward
->position
, " ");
2367 printf (" goto L%d;\n", p
->afterward
->number
);
2371 printf (" return %s_%d (x0, insn%s);\n",
2372 name_prefix
[type
], p
->subroutine_number
, call_suffix
[type
]);
2377 int depth
= strlen (p
->position
);
2379 change_state (prevpos
, p
->position
, " ");
2380 write_tree_1 (head
, depth
, type
);
2382 for (p
= head
->first
; p
; p
= p
->next
)
2383 if (p
->success
.first
)
2384 write_tree (&p
->success
, p
->position
, type
, 0);
2388 /* Write out a subroutine of type TYPE to do comparisons starting at
2392 write_subroutine (struct decision_head
*head
, enum routine_type type
)
2394 int subfunction
= head
->first
? head
->first
->subroutine_number
: 0;
2399 s_or_e
= subfunction
? "static " : "";
2402 sprintf (extension
, "_%d", subfunction
);
2403 else if (type
== RECOG
)
2404 extension
[0] = '\0';
2406 strcpy (extension
, "_insns");
2412 recog%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *pnum_clobbers ATTRIBUTE_UNUSED)\n", s_or_e
, extension
);
2416 split%s (rtx x0 ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED)\n",
2421 peephole2%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *_pmatch_len ATTRIBUTE_UNUSED)\n",
2426 printf ("{\n rtx * const operands ATTRIBUTE_UNUSED = &recog_data.operand[0];\n");
2427 for (i
= 1; i
<= max_depth
; i
++)
2428 printf (" rtx x%d ATTRIBUTE_UNUSED;\n", i
);
2430 printf (" %s tem ATTRIBUTE_UNUSED;\n", IS_SPLIT (type
) ? "rtx" : "int");
2433 printf (" recog_data.insn = NULL_RTX;\n");
2436 write_tree (head
, "", type
, 1);
2438 printf (" goto ret0;\n");
2440 printf (" ret0:\n return %d;\n}\n\n", IS_SPLIT (type
) ? 0 : -1);
2443 /* In break_out_subroutines, we discovered the boundaries for the
2444 subroutines, but did not write them out. Do so now. */
2447 write_subroutines (struct decision_head
*head
, enum routine_type type
)
2451 for (p
= head
->first
; p
; p
= p
->next
)
2452 if (p
->success
.first
)
2453 write_subroutines (&p
->success
, type
);
2455 if (head
->first
->subroutine_number
> 0)
2456 write_subroutine (head
, type
);
2459 /* Begin the output file. */
2465 /* Generated automatically by the program `genrecog' from the target\n\
2466 machine description file. */\n\
2468 #include \"config.h\"\n\
2469 #include \"system.h\"\n\
2470 #include \"coretypes.h\"\n\
2471 #include \"tm.h\"\n\
2472 #include \"rtl.h\"\n\
2473 #include \"tm_p.h\"\n\
2474 #include \"function.h\"\n\
2475 #include \"insn-config.h\"\n\
2476 #include \"recog.h\"\n\
2477 #include \"real.h\"\n\
2478 #include \"output.h\"\n\
2479 #include \"flags.h\"\n\
2480 #include \"hard-reg-set.h\"\n\
2481 #include \"resource.h\"\n\
2482 #include \"toplev.h\"\n\
2483 #include \"reload.h\"\n\
2484 #include \"regs.h\"\n\
2485 #include \"tm-constrs.h\"\n\
2489 /* `recog' contains a decision tree that recognizes whether the rtx\n\
2490 X0 is a valid instruction.\n\
2492 recog returns -1 if the rtx is not valid. If the rtx is valid, recog\n\
2493 returns a nonnegative number which is the insn code number for the\n\
2494 pattern that matched. This is the same as the order in the machine\n\
2495 description of the entry that matched. This number can be used as an\n\
2496 index into `insn_data' and other tables.\n");
2498 The third argument to recog is an optional pointer to an int. If\n\
2499 present, recog will accept a pattern if it matches except for missing\n\
2500 CLOBBER expressions at the end. In that case, the value pointed to by\n\
2501 the optional pointer will be set to the number of CLOBBERs that need\n\
2502 to be added (it should be initialized to zero by the caller). If it");
2504 is set nonzero, the caller should allocate a PARALLEL of the\n\
2505 appropriate size, copy the initial entries, and call add_clobbers\n\
2506 (found in insn-emit.c) to fill in the CLOBBERs.\n\
2510 The function split_insns returns 0 if the rtl could not\n\
2511 be split or the split rtl as an INSN list if it can be.\n\
2513 The function peephole2_insns returns 0 if the rtl could not\n\
2514 be matched. If there was a match, the new rtl is returned in an INSN list,\n\
2515 and LAST_INSN will point to the last recognized insn in the old sequence.\n\
2520 /* Construct and return a sequence of decisions
2521 that will recognize INSN.
2523 TYPE says what type of routine we are recognizing (RECOG or SPLIT). */
2525 static struct decision_head
2526 make_insn_sequence (rtx insn
, enum routine_type type
)
2529 const char *c_test
= XSTR (insn
, type
== RECOG
? 2 : 1);
2530 int truth
= maybe_eval_c_test (c_test
);
2531 struct decision
*last
;
2532 struct decision_test
*test
, **place
;
2533 struct decision_head head
;
2536 /* We should never see an insn whose C test is false at compile time. */
2539 c_test_pos
[0] = '\0';
2540 if (type
== PEEPHOLE2
)
2544 /* peephole2 gets special treatment:
2545 - X always gets an outer parallel even if it's only one entry
2546 - we remove all traces of outer-level match_scratch and match_dup
2547 expressions here. */
2548 x
= rtx_alloc (PARALLEL
);
2549 PUT_MODE (x
, VOIDmode
);
2550 XVEC (x
, 0) = rtvec_alloc (XVECLEN (insn
, 0));
2551 for (i
= j
= 0; i
< XVECLEN (insn
, 0); i
++)
2553 rtx tmp
= XVECEXP (insn
, 0, i
);
2554 if (GET_CODE (tmp
) != MATCH_SCRATCH
&& GET_CODE (tmp
) != MATCH_DUP
)
2556 XVECEXP (x
, 0, j
) = tmp
;
2562 c_test_pos
[0] = 'A' + j
- 1;
2563 c_test_pos
[1] = '\0';
2565 else if (XVECLEN (insn
, type
== RECOG
) == 1)
2566 x
= XVECEXP (insn
, type
== RECOG
, 0);
2569 x
= rtx_alloc (PARALLEL
);
2570 XVEC (x
, 0) = XVEC (insn
, type
== RECOG
);
2571 PUT_MODE (x
, VOIDmode
);
2574 validate_pattern (x
, insn
, NULL_RTX
, 0);
2576 memset(&head
, 0, sizeof(head
));
2577 last
= add_to_sequence (x
, &head
, "", type
, 1);
2579 /* Find the end of the test chain on the last node. */
2580 for (test
= last
->tests
; test
->next
; test
= test
->next
)
2582 place
= &test
->next
;
2584 /* Skip the C test if it's known to be true at compile time. */
2587 /* Need a new node if we have another test to add. */
2588 if (test
->type
== DT_accept_op
)
2590 last
= new_decision (c_test_pos
, &last
->success
);
2591 place
= &last
->tests
;
2593 test
= new_decision_test (DT_c_test
, &place
);
2594 test
->u
.c_test
= c_test
;
2597 test
= new_decision_test (DT_accept_insn
, &place
);
2598 test
->u
.insn
.code_number
= next_insn_code
;
2599 test
->u
.insn
.lineno
= pattern_lineno
;
2600 test
->u
.insn
.num_clobbers_to_add
= 0;
2605 /* If this is a DEFINE_INSN and X is a PARALLEL, see if it ends
2606 with a group of CLOBBERs of (hard) registers or MATCH_SCRATCHes.
2607 If so, set up to recognize the pattern without these CLOBBERs. */
2609 if (GET_CODE (x
) == PARALLEL
)
2613 /* Find the last non-clobber in the parallel. */
2614 for (i
= XVECLEN (x
, 0); i
> 0; i
--)
2616 rtx y
= XVECEXP (x
, 0, i
- 1);
2617 if (GET_CODE (y
) != CLOBBER
2618 || (!REG_P (XEXP (y
, 0))
2619 && GET_CODE (XEXP (y
, 0)) != MATCH_SCRATCH
))
2623 if (i
!= XVECLEN (x
, 0))
2626 struct decision_head clobber_head
;
2628 /* Build a similar insn without the clobbers. */
2630 new_rtx
= XVECEXP (x
, 0, 0);
2635 new_rtx
= rtx_alloc (PARALLEL
);
2636 XVEC (new_rtx
, 0) = rtvec_alloc (i
);
2637 for (j
= i
- 1; j
>= 0; j
--)
2638 XVECEXP (new_rtx
, 0, j
) = XVECEXP (x
, 0, j
);
2642 memset (&clobber_head
, 0, sizeof(clobber_head
));
2643 last
= add_to_sequence (new_rtx
, &clobber_head
, "", type
, 1);
2645 /* Find the end of the test chain on the last node. */
2646 for (test
= last
->tests
; test
->next
; test
= test
->next
)
2649 /* We definitely have a new test to add -- create a new
2651 place
= &test
->next
;
2652 if (test
->type
== DT_accept_op
)
2654 last
= new_decision ("", &last
->success
);
2655 place
= &last
->tests
;
2658 /* Skip the C test if it's known to be true at compile
2662 test
= new_decision_test (DT_c_test
, &place
);
2663 test
->u
.c_test
= c_test
;
2666 test
= new_decision_test (DT_accept_insn
, &place
);
2667 test
->u
.insn
.code_number
= next_insn_code
;
2668 test
->u
.insn
.lineno
= pattern_lineno
;
2669 test
->u
.insn
.num_clobbers_to_add
= XVECLEN (x
, 0) - i
;
2671 merge_trees (&head
, &clobber_head
);
2677 /* Define the subroutine we will call below and emit in genemit. */
2678 printf ("extern rtx gen_split_%d (rtx, rtx *);\n", next_insn_code
);
2682 /* Define the subroutine we will call below and emit in genemit. */
2683 printf ("extern rtx gen_peephole2_%d (rtx, rtx *);\n",
2692 process_tree (struct decision_head
*head
, enum routine_type subroutine_type
)
2694 if (head
->first
== NULL
)
2696 /* We can elide peephole2_insns, but not recog or split_insns. */
2697 if (subroutine_type
== PEEPHOLE2
)
2702 factor_tests (head
);
2704 next_subroutine_number
= 0;
2705 break_out_subroutines (head
, 1);
2706 find_afterward (head
, NULL
);
2708 /* We run this after find_afterward, because find_afterward needs
2709 the redundant DT_mode tests on predicates to determine whether
2710 two tests can both be true or not. */
2711 simplify_tests(head
);
2713 write_subroutines (head
, subroutine_type
);
2716 write_subroutine (head
, subroutine_type
);
2719 extern int main (int, char **);
2722 main (int argc
, char **argv
)
2725 struct decision_head recog_tree
, split_tree
, peephole2_tree
, h
;
2727 progname
= "genrecog";
2729 memset (&recog_tree
, 0, sizeof recog_tree
);
2730 memset (&split_tree
, 0, sizeof split_tree
);
2731 memset (&peephole2_tree
, 0, sizeof peephole2_tree
);
2733 if (init_md_reader_args (argc
, argv
) != SUCCESS_EXIT_CODE
)
2734 return (FATAL_EXIT_CODE
);
2740 /* Read the machine description. */
2744 desc
= read_md_rtx (&pattern_lineno
, &next_insn_code
);
2748 switch (GET_CODE (desc
))
2750 case DEFINE_PREDICATE
:
2751 case DEFINE_SPECIAL_PREDICATE
:
2752 process_define_predicate (desc
);
2756 h
= make_insn_sequence (desc
, RECOG
);
2757 merge_trees (&recog_tree
, &h
);
2761 h
= make_insn_sequence (desc
, SPLIT
);
2762 merge_trees (&split_tree
, &h
);
2765 case DEFINE_PEEPHOLE2
:
2766 h
= make_insn_sequence (desc
, PEEPHOLE2
);
2767 merge_trees (&peephole2_tree
, &h
);
2774 if (error_count
|| have_error
)
2775 return FATAL_EXIT_CODE
;
2779 process_tree (&recog_tree
, RECOG
);
2780 process_tree (&split_tree
, SPLIT
);
2781 process_tree (&peephole2_tree
, PEEPHOLE2
);
2784 return (ferror (stdout
) != 0 ? FATAL_EXIT_CODE
: SUCCESS_EXIT_CODE
);
2788 debug_decision_2 (struct decision_test
*test
)
2793 fprintf (stderr
, "num_insns=%d", test
->u
.num_insns
);
2796 fprintf (stderr
, "mode=%s", GET_MODE_NAME (test
->u
.mode
));
2799 fprintf (stderr
, "code=%s", GET_RTX_NAME (test
->u
.code
));
2802 fprintf (stderr
, "veclen=%d", test
->u
.veclen
);
2804 case DT_elt_zero_int
:
2805 fprintf (stderr
, "elt0_i=%d", (int) test
->u
.intval
);
2807 case DT_elt_one_int
:
2808 fprintf (stderr
, "elt1_i=%d", (int) test
->u
.intval
);
2810 case DT_elt_zero_wide
:
2811 fprintf (stderr
, "elt0_w=" HOST_WIDE_INT_PRINT_DEC
, test
->u
.intval
);
2813 case DT_elt_zero_wide_safe
:
2814 fprintf (stderr
, "elt0_ws=" HOST_WIDE_INT_PRINT_DEC
, test
->u
.intval
);
2817 fprintf (stderr
, "veclen>=%d", test
->u
.veclen
);
2820 fprintf (stderr
, "dup=%d", test
->u
.dup
);
2823 fprintf (stderr
, "pred=(%s,%s)",
2824 test
->u
.pred
.name
, GET_MODE_NAME(test
->u
.pred
.mode
));
2829 strncpy (sub
, test
->u
.c_test
, sizeof(sub
));
2830 memcpy (sub
+16, "...", 4);
2831 fprintf (stderr
, "c_test=\"%s\"", sub
);
2835 fprintf (stderr
, "A_op=%d", test
->u
.opno
);
2837 case DT_accept_insn
:
2838 fprintf (stderr
, "A_insn=(%d,%d)",
2839 test
->u
.insn
.code_number
, test
->u
.insn
.num_clobbers_to_add
);
2848 debug_decision_1 (struct decision
*d
, int indent
)
2851 struct decision_test
*test
;
2855 for (i
= 0; i
< indent
; ++i
)
2857 fputs ("(nil)\n", stderr
);
2861 for (i
= 0; i
< indent
; ++i
)
2868 debug_decision_2 (test
);
2869 while ((test
= test
->next
) != NULL
)
2871 fputs (" + ", stderr
);
2872 debug_decision_2 (test
);
2875 fprintf (stderr
, "} %d n %d a %d\n", d
->number
,
2876 (d
->next
? d
->next
->number
: -1),
2877 (d
->afterward
? d
->afterward
->number
: -1));
2881 debug_decision_0 (struct decision
*d
, int indent
, int maxdepth
)
2890 for (i
= 0; i
< indent
; ++i
)
2892 fputs ("(nil)\n", stderr
);
2896 debug_decision_1 (d
, indent
);
2897 for (n
= d
->success
.first
; n
; n
= n
->next
)
2898 debug_decision_0 (n
, indent
+ 2, maxdepth
- 1);
2902 debug_decision (struct decision
*d
)
2904 debug_decision_0 (d
, 0, 1000000);
2908 debug_decision_list (struct decision
*d
)
2912 debug_decision_0 (d
, 0, 0);