rs6000.md (fseldfsf4): Add TARGET_SINGLE_FLOAT condition.
[gcc.git] / gcc / recog.c
1 /* Subroutines used by or related to instruction recognition.
2 Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
4 Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
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/>. */
21
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "rtl.h"
28 #include "tm_p.h"
29 #include "insn-config.h"
30 #include "insn-attr.h"
31 #include "hard-reg-set.h"
32 #include "recog.h"
33 #include "regs.h"
34 #include "addresses.h"
35 #include "expr.h"
36 #include "function.h"
37 #include "flags.h"
38 #include "real.h"
39 #include "toplev.h"
40 #include "basic-block.h"
41 #include "output.h"
42 #include "reload.h"
43 #include "target.h"
44 #include "timevar.h"
45 #include "tree-pass.h"
46 #include "df.h"
47
48 #ifndef STACK_PUSH_CODE
49 #ifdef STACK_GROWS_DOWNWARD
50 #define STACK_PUSH_CODE PRE_DEC
51 #else
52 #define STACK_PUSH_CODE PRE_INC
53 #endif
54 #endif
55
56 #ifndef STACK_POP_CODE
57 #ifdef STACK_GROWS_DOWNWARD
58 #define STACK_POP_CODE POST_INC
59 #else
60 #define STACK_POP_CODE POST_DEC
61 #endif
62 #endif
63
64 #ifndef HAVE_ATTR_enabled
65 static inline bool
66 get_attr_enabled (rtx insn ATTRIBUTE_UNUSED)
67 {
68 return true;
69 }
70 #endif
71
72 static void validate_replace_rtx_1 (rtx *, rtx, rtx, rtx, bool);
73 static void validate_replace_src_1 (rtx *, void *);
74 static rtx split_insn (rtx);
75
76 /* Nonzero means allow operands to be volatile.
77 This should be 0 if you are generating rtl, such as if you are calling
78 the functions in optabs.c and expmed.c (most of the time).
79 This should be 1 if all valid insns need to be recognized,
80 such as in regclass.c and final.c and reload.c.
81
82 init_recog and init_recog_no_volatile are responsible for setting this. */
83
84 int volatile_ok;
85
86 struct recog_data recog_data;
87
88 /* Contains a vector of operand_alternative structures for every operand.
89 Set up by preprocess_constraints. */
90 struct operand_alternative recog_op_alt[MAX_RECOG_OPERANDS][MAX_RECOG_ALTERNATIVES];
91
92 /* On return from `constrain_operands', indicate which alternative
93 was satisfied. */
94
95 int which_alternative;
96
97 /* Nonzero after end of reload pass.
98 Set to 1 or 0 by toplev.c.
99 Controls the significance of (SUBREG (MEM)). */
100
101 int reload_completed;
102
103 /* Nonzero after thread_prologue_and_epilogue_insns has run. */
104 int epilogue_completed;
105
106 /* Initialize data used by the function `recog'.
107 This must be called once in the compilation of a function
108 before any insn recognition may be done in the function. */
109
110 void
111 init_recog_no_volatile (void)
112 {
113 volatile_ok = 0;
114 }
115
116 void
117 init_recog (void)
118 {
119 volatile_ok = 1;
120 }
121
122 \f
123 /* Check that X is an insn-body for an `asm' with operands
124 and that the operands mentioned in it are legitimate. */
125
126 int
127 check_asm_operands (rtx x)
128 {
129 int noperands;
130 rtx *operands;
131 const char **constraints;
132 int i;
133
134 /* Post-reload, be more strict with things. */
135 if (reload_completed)
136 {
137 /* ??? Doh! We've not got the wrapping insn. Cook one up. */
138 extract_insn (make_insn_raw (x));
139 constrain_operands (1);
140 return which_alternative >= 0;
141 }
142
143 noperands = asm_noperands (x);
144 if (noperands < 0)
145 return 0;
146 if (noperands == 0)
147 return 1;
148
149 operands = XALLOCAVEC (rtx, noperands);
150 constraints = XALLOCAVEC (const char *, noperands);
151
152 decode_asm_operands (x, operands, NULL, constraints, NULL, NULL);
153
154 for (i = 0; i < noperands; i++)
155 {
156 const char *c = constraints[i];
157 if (c[0] == '%')
158 c++;
159 if (ISDIGIT ((unsigned char) c[0]) && c[1] == '\0')
160 c = constraints[c[0] - '0'];
161
162 if (! asm_operand_ok (operands[i], c))
163 return 0;
164 }
165
166 return 1;
167 }
168 \f
169 /* Static data for the next two routines. */
170
171 typedef struct change_t
172 {
173 rtx object;
174 int old_code;
175 rtx *loc;
176 rtx old;
177 bool unshare;
178 } change_t;
179
180 static change_t *changes;
181 static int changes_allocated;
182
183 static int num_changes = 0;
184
185 /* Validate a proposed change to OBJECT. LOC is the location in the rtl
186 at which NEW_RTX will be placed. If OBJECT is zero, no validation is done,
187 the change is simply made.
188
189 Two types of objects are supported: If OBJECT is a MEM, memory_address_p
190 will be called with the address and mode as parameters. If OBJECT is
191 an INSN, CALL_INSN, or JUMP_INSN, the insn will be re-recognized with
192 the change in place.
193
194 IN_GROUP is nonzero if this is part of a group of changes that must be
195 performed as a group. In that case, the changes will be stored. The
196 function `apply_change_group' will validate and apply the changes.
197
198 If IN_GROUP is zero, this is a single change. Try to recognize the insn
199 or validate the memory reference with the change applied. If the result
200 is not valid for the machine, suppress the change and return zero.
201 Otherwise, perform the change and return 1. */
202
203 static bool
204 validate_change_1 (rtx object, rtx *loc, rtx new_rtx, bool in_group, bool unshare)
205 {
206 rtx old = *loc;
207
208 if (old == new_rtx || rtx_equal_p (old, new_rtx))
209 return 1;
210
211 gcc_assert (in_group != 0 || num_changes == 0);
212
213 *loc = new_rtx;
214
215 /* Save the information describing this change. */
216 if (num_changes >= changes_allocated)
217 {
218 if (changes_allocated == 0)
219 /* This value allows for repeated substitutions inside complex
220 indexed addresses, or changes in up to 5 insns. */
221 changes_allocated = MAX_RECOG_OPERANDS * 5;
222 else
223 changes_allocated *= 2;
224
225 changes = XRESIZEVEC (change_t, changes, changes_allocated);
226 }
227
228 changes[num_changes].object = object;
229 changes[num_changes].loc = loc;
230 changes[num_changes].old = old;
231 changes[num_changes].unshare = unshare;
232
233 if (object && !MEM_P (object))
234 {
235 /* Set INSN_CODE to force rerecognition of insn. Save old code in
236 case invalid. */
237 changes[num_changes].old_code = INSN_CODE (object);
238 INSN_CODE (object) = -1;
239 }
240
241 num_changes++;
242
243 /* If we are making a group of changes, return 1. Otherwise, validate the
244 change group we made. */
245
246 if (in_group)
247 return 1;
248 else
249 return apply_change_group ();
250 }
251
252 /* Wrapper for validate_change_1 without the UNSHARE argument defaulting
253 UNSHARE to false. */
254
255 bool
256 validate_change (rtx object, rtx *loc, rtx new_rtx, bool in_group)
257 {
258 return validate_change_1 (object, loc, new_rtx, in_group, false);
259 }
260
261 /* Wrapper for validate_change_1 without the UNSHARE argument defaulting
262 UNSHARE to true. */
263
264 bool
265 validate_unshare_change (rtx object, rtx *loc, rtx new_rtx, bool in_group)
266 {
267 return validate_change_1 (object, loc, new_rtx, in_group, true);
268 }
269
270
271 /* Keep X canonicalized if some changes have made it non-canonical; only
272 modifies the operands of X, not (for example) its code. Simplifications
273 are not the job of this routine.
274
275 Return true if anything was changed. */
276 bool
277 canonicalize_change_group (rtx insn, rtx x)
278 {
279 if (COMMUTATIVE_P (x)
280 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
281 {
282 /* Oops, the caller has made X no longer canonical.
283 Let's redo the changes in the correct order. */
284 rtx tem = XEXP (x, 0);
285 validate_change (insn, &XEXP (x, 0), XEXP (x, 1), 1);
286 validate_change (insn, &XEXP (x, 1), tem, 1);
287 return true;
288 }
289 else
290 return false;
291 }
292
293
294 /* This subroutine of apply_change_group verifies whether the changes to INSN
295 were valid; i.e. whether INSN can still be recognized. */
296
297 int
298 insn_invalid_p (rtx insn)
299 {
300 rtx pat = PATTERN (insn);
301 int num_clobbers = 0;
302 /* If we are before reload and the pattern is a SET, see if we can add
303 clobbers. */
304 int icode = recog (pat, insn,
305 (GET_CODE (pat) == SET
306 && ! reload_completed && ! reload_in_progress)
307 ? &num_clobbers : 0);
308 int is_asm = icode < 0 && asm_noperands (PATTERN (insn)) >= 0;
309
310
311 /* If this is an asm and the operand aren't legal, then fail. Likewise if
312 this is not an asm and the insn wasn't recognized. */
313 if ((is_asm && ! check_asm_operands (PATTERN (insn)))
314 || (!is_asm && icode < 0))
315 return 1;
316
317 /* If we have to add CLOBBERs, fail if we have to add ones that reference
318 hard registers since our callers can't know if they are live or not.
319 Otherwise, add them. */
320 if (num_clobbers > 0)
321 {
322 rtx newpat;
323
324 if (added_clobbers_hard_reg_p (icode))
325 return 1;
326
327 newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (num_clobbers + 1));
328 XVECEXP (newpat, 0, 0) = pat;
329 add_clobbers (newpat, icode);
330 PATTERN (insn) = pat = newpat;
331 }
332
333 /* After reload, verify that all constraints are satisfied. */
334 if (reload_completed)
335 {
336 extract_insn (insn);
337
338 if (! constrain_operands (1))
339 return 1;
340 }
341
342 INSN_CODE (insn) = icode;
343 return 0;
344 }
345
346 /* Return number of changes made and not validated yet. */
347 int
348 num_changes_pending (void)
349 {
350 return num_changes;
351 }
352
353 /* Tentatively apply the changes numbered NUM and up.
354 Return 1 if all changes are valid, zero otherwise. */
355
356 int
357 verify_changes (int num)
358 {
359 int i;
360 rtx last_validated = NULL_RTX;
361
362 /* The changes have been applied and all INSN_CODEs have been reset to force
363 rerecognition.
364
365 The changes are valid if we aren't given an object, or if we are
366 given a MEM and it still is a valid address, or if this is in insn
367 and it is recognized. In the latter case, if reload has completed,
368 we also require that the operands meet the constraints for
369 the insn. */
370
371 for (i = num; i < num_changes; i++)
372 {
373 rtx object = changes[i].object;
374
375 /* If there is no object to test or if it is the same as the one we
376 already tested, ignore it. */
377 if (object == 0 || object == last_validated)
378 continue;
379
380 if (MEM_P (object))
381 {
382 if (! memory_address_p (GET_MODE (object), XEXP (object, 0)))
383 break;
384 }
385 else if (insn_invalid_p (object))
386 {
387 rtx pat = PATTERN (object);
388
389 /* Perhaps we couldn't recognize the insn because there were
390 extra CLOBBERs at the end. If so, try to re-recognize
391 without the last CLOBBER (later iterations will cause each of
392 them to be eliminated, in turn). But don't do this if we
393 have an ASM_OPERAND. */
394 if (GET_CODE (pat) == PARALLEL
395 && GET_CODE (XVECEXP (pat, 0, XVECLEN (pat, 0) - 1)) == CLOBBER
396 && asm_noperands (PATTERN (object)) < 0)
397 {
398 rtx newpat;
399
400 if (XVECLEN (pat, 0) == 2)
401 newpat = XVECEXP (pat, 0, 0);
402 else
403 {
404 int j;
405
406 newpat
407 = gen_rtx_PARALLEL (VOIDmode,
408 rtvec_alloc (XVECLEN (pat, 0) - 1));
409 for (j = 0; j < XVECLEN (newpat, 0); j++)
410 XVECEXP (newpat, 0, j) = XVECEXP (pat, 0, j);
411 }
412
413 /* Add a new change to this group to replace the pattern
414 with this new pattern. Then consider this change
415 as having succeeded. The change we added will
416 cause the entire call to fail if things remain invalid.
417
418 Note that this can lose if a later change than the one
419 we are processing specified &XVECEXP (PATTERN (object), 0, X)
420 but this shouldn't occur. */
421
422 validate_change (object, &PATTERN (object), newpat, 1);
423 continue;
424 }
425 else if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
426 /* If this insn is a CLOBBER or USE, it is always valid, but is
427 never recognized. */
428 continue;
429 else
430 break;
431 }
432 last_validated = object;
433 }
434
435 return (i == num_changes);
436 }
437
438 /* A group of changes has previously been issued with validate_change
439 and verified with verify_changes. Call df_insn_rescan for each of
440 the insn changed and clear num_changes. */
441
442 void
443 confirm_change_group (void)
444 {
445 int i;
446 rtx last_object = NULL;
447
448 for (i = 0; i < num_changes; i++)
449 {
450 rtx object = changes[i].object;
451
452 if (changes[i].unshare)
453 *changes[i].loc = copy_rtx (*changes[i].loc);
454
455 /* Avoid unnecessary rescanning when multiple changes to same instruction
456 are made. */
457 if (object)
458 {
459 if (object != last_object && last_object && INSN_P (last_object))
460 df_insn_rescan (last_object);
461 last_object = object;
462 }
463 }
464
465 if (last_object && INSN_P (last_object))
466 df_insn_rescan (last_object);
467 num_changes = 0;
468 }
469
470 /* Apply a group of changes previously issued with `validate_change'.
471 If all changes are valid, call confirm_change_group and return 1,
472 otherwise, call cancel_changes and return 0. */
473
474 int
475 apply_change_group (void)
476 {
477 if (verify_changes (0))
478 {
479 confirm_change_group ();
480 return 1;
481 }
482 else
483 {
484 cancel_changes (0);
485 return 0;
486 }
487 }
488
489
490 /* Return the number of changes so far in the current group. */
491
492 int
493 num_validated_changes (void)
494 {
495 return num_changes;
496 }
497
498 /* Retract the changes numbered NUM and up. */
499
500 void
501 cancel_changes (int num)
502 {
503 int i;
504
505 /* Back out all the changes. Do this in the opposite order in which
506 they were made. */
507 for (i = num_changes - 1; i >= num; i--)
508 {
509 *changes[i].loc = changes[i].old;
510 if (changes[i].object && !MEM_P (changes[i].object))
511 INSN_CODE (changes[i].object) = changes[i].old_code;
512 }
513 num_changes = num;
514 }
515
516 /* A subroutine of validate_replace_rtx_1 that tries to simplify the resulting
517 rtx. */
518
519 static void
520 simplify_while_replacing (rtx *loc, rtx to, rtx object,
521 enum machine_mode op0_mode)
522 {
523 rtx x = *loc;
524 enum rtx_code code = GET_CODE (x);
525 rtx new_rtx;
526
527 if (SWAPPABLE_OPERANDS_P (x)
528 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
529 {
530 validate_unshare_change (object, loc,
531 gen_rtx_fmt_ee (COMMUTATIVE_ARITH_P (x) ? code
532 : swap_condition (code),
533 GET_MODE (x), XEXP (x, 1),
534 XEXP (x, 0)), 1);
535 x = *loc;
536 code = GET_CODE (x);
537 }
538
539 switch (code)
540 {
541 case PLUS:
542 /* If we have a PLUS whose second operand is now a CONST_INT, use
543 simplify_gen_binary to try to simplify it.
544 ??? We may want later to remove this, once simplification is
545 separated from this function. */
546 if (GET_CODE (XEXP (x, 1)) == CONST_INT && XEXP (x, 1) == to)
547 validate_change (object, loc,
548 simplify_gen_binary
549 (PLUS, GET_MODE (x), XEXP (x, 0), XEXP (x, 1)), 1);
550 break;
551 case MINUS:
552 if (GET_CODE (XEXP (x, 1)) == CONST_INT
553 || GET_CODE (XEXP (x, 1)) == CONST_DOUBLE)
554 validate_change (object, loc,
555 simplify_gen_binary
556 (PLUS, GET_MODE (x), XEXP (x, 0),
557 simplify_gen_unary (NEG,
558 GET_MODE (x), XEXP (x, 1),
559 GET_MODE (x))), 1);
560 break;
561 case ZERO_EXTEND:
562 case SIGN_EXTEND:
563 if (GET_MODE (XEXP (x, 0)) == VOIDmode)
564 {
565 new_rtx = simplify_gen_unary (code, GET_MODE (x), XEXP (x, 0),
566 op0_mode);
567 /* If any of the above failed, substitute in something that
568 we know won't be recognized. */
569 if (!new_rtx)
570 new_rtx = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
571 validate_change (object, loc, new_rtx, 1);
572 }
573 break;
574 case SUBREG:
575 /* All subregs possible to simplify should be simplified. */
576 new_rtx = simplify_subreg (GET_MODE (x), SUBREG_REG (x), op0_mode,
577 SUBREG_BYTE (x));
578
579 /* Subregs of VOIDmode operands are incorrect. */
580 if (!new_rtx && GET_MODE (SUBREG_REG (x)) == VOIDmode)
581 new_rtx = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
582 if (new_rtx)
583 validate_change (object, loc, new_rtx, 1);
584 break;
585 case ZERO_EXTRACT:
586 case SIGN_EXTRACT:
587 /* If we are replacing a register with memory, try to change the memory
588 to be the mode required for memory in extract operations (this isn't
589 likely to be an insertion operation; if it was, nothing bad will
590 happen, we might just fail in some cases). */
591
592 if (MEM_P (XEXP (x, 0))
593 && GET_CODE (XEXP (x, 1)) == CONST_INT
594 && GET_CODE (XEXP (x, 2)) == CONST_INT
595 && !mode_dependent_address_p (XEXP (XEXP (x, 0), 0))
596 && !MEM_VOLATILE_P (XEXP (x, 0)))
597 {
598 enum machine_mode wanted_mode = VOIDmode;
599 enum machine_mode is_mode = GET_MODE (XEXP (x, 0));
600 int pos = INTVAL (XEXP (x, 2));
601
602 if (GET_CODE (x) == ZERO_EXTRACT)
603 {
604 enum machine_mode new_mode
605 = mode_for_extraction (EP_extzv, 1);
606 if (new_mode != MAX_MACHINE_MODE)
607 wanted_mode = new_mode;
608 }
609 else if (GET_CODE (x) == SIGN_EXTRACT)
610 {
611 enum machine_mode new_mode
612 = mode_for_extraction (EP_extv, 1);
613 if (new_mode != MAX_MACHINE_MODE)
614 wanted_mode = new_mode;
615 }
616
617 /* If we have a narrower mode, we can do something. */
618 if (wanted_mode != VOIDmode
619 && GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
620 {
621 int offset = pos / BITS_PER_UNIT;
622 rtx newmem;
623
624 /* If the bytes and bits are counted differently, we
625 must adjust the offset. */
626 if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN)
627 offset =
628 (GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (wanted_mode) -
629 offset);
630
631 pos %= GET_MODE_BITSIZE (wanted_mode);
632
633 newmem = adjust_address_nv (XEXP (x, 0), wanted_mode, offset);
634
635 validate_change (object, &XEXP (x, 2), GEN_INT (pos), 1);
636 validate_change (object, &XEXP (x, 0), newmem, 1);
637 }
638 }
639
640 break;
641
642 default:
643 break;
644 }
645 }
646
647 /* Replace every occurrence of FROM in X with TO. Mark each change with
648 validate_change passing OBJECT. */
649
650 static void
651 validate_replace_rtx_1 (rtx *loc, rtx from, rtx to, rtx object,
652 bool simplify)
653 {
654 int i, j;
655 const char *fmt;
656 rtx x = *loc;
657 enum rtx_code code;
658 enum machine_mode op0_mode = VOIDmode;
659 int prev_changes = num_changes;
660
661 if (!x)
662 return;
663
664 code = GET_CODE (x);
665 fmt = GET_RTX_FORMAT (code);
666 if (fmt[0] == 'e')
667 op0_mode = GET_MODE (XEXP (x, 0));
668
669 /* X matches FROM if it is the same rtx or they are both referring to the
670 same register in the same mode. Avoid calling rtx_equal_p unless the
671 operands look similar. */
672
673 if (x == from
674 || (REG_P (x) && REG_P (from)
675 && GET_MODE (x) == GET_MODE (from)
676 && REGNO (x) == REGNO (from))
677 || (GET_CODE (x) == GET_CODE (from) && GET_MODE (x) == GET_MODE (from)
678 && rtx_equal_p (x, from)))
679 {
680 validate_unshare_change (object, loc, to, 1);
681 return;
682 }
683
684 /* Call ourself recursively to perform the replacements.
685 We must not replace inside already replaced expression, otherwise we
686 get infinite recursion for replacements like (reg X)->(subreg (reg X))
687 done by regmove, so we must special case shared ASM_OPERANDS. */
688
689 if (GET_CODE (x) == PARALLEL)
690 {
691 for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
692 {
693 if (j && GET_CODE (XVECEXP (x, 0, j)) == SET
694 && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == ASM_OPERANDS)
695 {
696 /* Verify that operands are really shared. */
697 gcc_assert (ASM_OPERANDS_INPUT_VEC (SET_SRC (XVECEXP (x, 0, 0)))
698 == ASM_OPERANDS_INPUT_VEC (SET_SRC (XVECEXP
699 (x, 0, j))));
700 validate_replace_rtx_1 (&SET_DEST (XVECEXP (x, 0, j)),
701 from, to, object, simplify);
702 }
703 else
704 validate_replace_rtx_1 (&XVECEXP (x, 0, j), from, to, object,
705 simplify);
706 }
707 }
708 else
709 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
710 {
711 if (fmt[i] == 'e')
712 validate_replace_rtx_1 (&XEXP (x, i), from, to, object, simplify);
713 else if (fmt[i] == 'E')
714 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
715 validate_replace_rtx_1 (&XVECEXP (x, i, j), from, to, object,
716 simplify);
717 }
718
719 /* If we didn't substitute, there is nothing more to do. */
720 if (num_changes == prev_changes)
721 return;
722
723 /* Allow substituted expression to have different mode. This is used by
724 regmove to change mode of pseudo register. */
725 if (fmt[0] == 'e' && GET_MODE (XEXP (x, 0)) != VOIDmode)
726 op0_mode = GET_MODE (XEXP (x, 0));
727
728 /* Do changes needed to keep rtx consistent. Don't do any other
729 simplifications, as it is not our job. */
730 if (simplify)
731 simplify_while_replacing (loc, to, object, op0_mode);
732 }
733
734 /* Try replacing every occurrence of FROM in INSN with TO. After all
735 changes have been made, validate by seeing if INSN is still valid. */
736
737 int
738 validate_replace_rtx (rtx from, rtx to, rtx insn)
739 {
740 validate_replace_rtx_1 (&PATTERN (insn), from, to, insn, true);
741 return apply_change_group ();
742 }
743
744 /* Try replacing every occurrence of FROM in WHERE with TO. Assume that WHERE
745 is a part of INSN. After all changes have been made, validate by seeing if
746 INSN is still valid.
747 validate_replace_rtx (from, to, insn) is equivalent to
748 validate_replace_rtx_part (from, to, &PATTERN (insn), insn). */
749
750 int
751 validate_replace_rtx_part (rtx from, rtx to, rtx *where, rtx insn)
752 {
753 validate_replace_rtx_1 (where, from, to, insn, true);
754 return apply_change_group ();
755 }
756
757 /* Same as above, but do not simplify rtx afterwards. */
758 int
759 validate_replace_rtx_part_nosimplify (rtx from, rtx to, rtx *where,
760 rtx insn)
761 {
762 validate_replace_rtx_1 (where, from, to, insn, false);
763 return apply_change_group ();
764
765 }
766
767 /* Try replacing every occurrence of FROM in INSN with TO. */
768
769 void
770 validate_replace_rtx_group (rtx from, rtx to, rtx insn)
771 {
772 validate_replace_rtx_1 (&PATTERN (insn), from, to, insn, true);
773 }
774
775 /* Function called by note_uses to replace used subexpressions. */
776 struct validate_replace_src_data
777 {
778 rtx from; /* Old RTX */
779 rtx to; /* New RTX */
780 rtx insn; /* Insn in which substitution is occurring. */
781 };
782
783 static void
784 validate_replace_src_1 (rtx *x, void *data)
785 {
786 struct validate_replace_src_data *d
787 = (struct validate_replace_src_data *) data;
788
789 validate_replace_rtx_1 (x, d->from, d->to, d->insn, true);
790 }
791
792 /* Try replacing every occurrence of FROM in INSN with TO, avoiding
793 SET_DESTs. */
794
795 void
796 validate_replace_src_group (rtx from, rtx to, rtx insn)
797 {
798 struct validate_replace_src_data d;
799
800 d.from = from;
801 d.to = to;
802 d.insn = insn;
803 note_uses (&PATTERN (insn), validate_replace_src_1, &d);
804 }
805
806 /* Try simplify INSN.
807 Invoke simplify_rtx () on every SET_SRC and SET_DEST inside the INSN's
808 pattern and return true if something was simplified. */
809
810 bool
811 validate_simplify_insn (rtx insn)
812 {
813 int i;
814 rtx pat = NULL;
815 rtx newpat = NULL;
816
817 pat = PATTERN (insn);
818
819 if (GET_CODE (pat) == SET)
820 {
821 newpat = simplify_rtx (SET_SRC (pat));
822 if (newpat && !rtx_equal_p (SET_SRC (pat), newpat))
823 validate_change (insn, &SET_SRC (pat), newpat, 1);
824 newpat = simplify_rtx (SET_DEST (pat));
825 if (newpat && !rtx_equal_p (SET_DEST (pat), newpat))
826 validate_change (insn, &SET_DEST (pat), newpat, 1);
827 }
828 else if (GET_CODE (pat) == PARALLEL)
829 for (i = 0; i < XVECLEN (pat, 0); i++)
830 {
831 rtx s = XVECEXP (pat, 0, i);
832
833 if (GET_CODE (XVECEXP (pat, 0, i)) == SET)
834 {
835 newpat = simplify_rtx (SET_SRC (s));
836 if (newpat && !rtx_equal_p (SET_SRC (s), newpat))
837 validate_change (insn, &SET_SRC (s), newpat, 1);
838 newpat = simplify_rtx (SET_DEST (s));
839 if (newpat && !rtx_equal_p (SET_DEST (s), newpat))
840 validate_change (insn, &SET_DEST (s), newpat, 1);
841 }
842 }
843 return ((num_changes_pending () > 0) && (apply_change_group () > 0));
844 }
845 \f
846 #ifdef HAVE_cc0
847 /* Return 1 if the insn using CC0 set by INSN does not contain
848 any ordered tests applied to the condition codes.
849 EQ and NE tests do not count. */
850
851 int
852 next_insn_tests_no_inequality (rtx insn)
853 {
854 rtx next = next_cc0_user (insn);
855
856 /* If there is no next insn, we have to take the conservative choice. */
857 if (next == 0)
858 return 0;
859
860 return (INSN_P (next)
861 && ! inequality_comparisons_p (PATTERN (next)));
862 }
863 #endif
864 \f
865 /* Return 1 if OP is a valid general operand for machine mode MODE.
866 This is either a register reference, a memory reference,
867 or a constant. In the case of a memory reference, the address
868 is checked for general validity for the target machine.
869
870 Register and memory references must have mode MODE in order to be valid,
871 but some constants have no machine mode and are valid for any mode.
872
873 If MODE is VOIDmode, OP is checked for validity for whatever mode
874 it has.
875
876 The main use of this function is as a predicate in match_operand
877 expressions in the machine description.
878
879 For an explanation of this function's behavior for registers of
880 class NO_REGS, see the comment for `register_operand'. */
881
882 int
883 general_operand (rtx op, enum machine_mode mode)
884 {
885 enum rtx_code code = GET_CODE (op);
886
887 if (mode == VOIDmode)
888 mode = GET_MODE (op);
889
890 /* Don't accept CONST_INT or anything similar
891 if the caller wants something floating. */
892 if (GET_MODE (op) == VOIDmode && mode != VOIDmode
893 && GET_MODE_CLASS (mode) != MODE_INT
894 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
895 return 0;
896
897 if (GET_CODE (op) == CONST_INT
898 && mode != VOIDmode
899 && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
900 return 0;
901
902 if (CONSTANT_P (op))
903 return ((GET_MODE (op) == VOIDmode || GET_MODE (op) == mode
904 || mode == VOIDmode)
905 && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
906 && LEGITIMATE_CONSTANT_P (op));
907
908 /* Except for certain constants with VOIDmode, already checked for,
909 OP's mode must match MODE if MODE specifies a mode. */
910
911 if (GET_MODE (op) != mode)
912 return 0;
913
914 if (code == SUBREG)
915 {
916 rtx sub = SUBREG_REG (op);
917
918 #ifdef INSN_SCHEDULING
919 /* On machines that have insn scheduling, we want all memory
920 reference to be explicit, so outlaw paradoxical SUBREGs.
921 However, we must allow them after reload so that they can
922 get cleaned up by cleanup_subreg_operands. */
923 if (!reload_completed && MEM_P (sub)
924 && GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (sub)))
925 return 0;
926 #endif
927 /* Avoid memories with nonzero SUBREG_BYTE, as offsetting the memory
928 may result in incorrect reference. We should simplify all valid
929 subregs of MEM anyway. But allow this after reload because we
930 might be called from cleanup_subreg_operands.
931
932 ??? This is a kludge. */
933 if (!reload_completed && SUBREG_BYTE (op) != 0
934 && MEM_P (sub))
935 return 0;
936
937 /* FLOAT_MODE subregs can't be paradoxical. Combine will occasionally
938 create such rtl, and we must reject it. */
939 if (SCALAR_FLOAT_MODE_P (GET_MODE (op))
940 && GET_MODE_SIZE (GET_MODE (op)) > GET_MODE_SIZE (GET_MODE (sub)))
941 return 0;
942
943 op = sub;
944 code = GET_CODE (op);
945 }
946
947 if (code == REG)
948 /* A register whose class is NO_REGS is not a general operand. */
949 return (REGNO (op) >= FIRST_PSEUDO_REGISTER
950 || REGNO_REG_CLASS (REGNO (op)) != NO_REGS);
951
952 if (code == MEM)
953 {
954 rtx y = XEXP (op, 0);
955
956 if (! volatile_ok && MEM_VOLATILE_P (op))
957 return 0;
958
959 /* Use the mem's mode, since it will be reloaded thus. */
960 if (memory_address_p (GET_MODE (op), y))
961 return 1;
962 }
963
964 return 0;
965 }
966 \f
967 /* Return 1 if OP is a valid memory address for a memory reference
968 of mode MODE.
969
970 The main use of this function is as a predicate in match_operand
971 expressions in the machine description. */
972
973 int
974 address_operand (rtx op, enum machine_mode mode)
975 {
976 return memory_address_p (mode, op);
977 }
978
979 /* Return 1 if OP is a register reference of mode MODE.
980 If MODE is VOIDmode, accept a register in any mode.
981
982 The main use of this function is as a predicate in match_operand
983 expressions in the machine description.
984
985 As a special exception, registers whose class is NO_REGS are
986 not accepted by `register_operand'. The reason for this change
987 is to allow the representation of special architecture artifacts
988 (such as a condition code register) without extending the rtl
989 definitions. Since registers of class NO_REGS cannot be used
990 as registers in any case where register classes are examined,
991 it is most consistent to keep this function from accepting them. */
992
993 int
994 register_operand (rtx op, enum machine_mode mode)
995 {
996 if (GET_MODE (op) != mode && mode != VOIDmode)
997 return 0;
998
999 if (GET_CODE (op) == SUBREG)
1000 {
1001 rtx sub = SUBREG_REG (op);
1002
1003 /* Before reload, we can allow (SUBREG (MEM...)) as a register operand
1004 because it is guaranteed to be reloaded into one.
1005 Just make sure the MEM is valid in itself.
1006 (Ideally, (SUBREG (MEM)...) should not exist after reload,
1007 but currently it does result from (SUBREG (REG)...) where the
1008 reg went on the stack.) */
1009 if (! reload_completed && MEM_P (sub))
1010 return general_operand (op, mode);
1011
1012 #ifdef CANNOT_CHANGE_MODE_CLASS
1013 if (REG_P (sub)
1014 && REGNO (sub) < FIRST_PSEUDO_REGISTER
1015 && REG_CANNOT_CHANGE_MODE_P (REGNO (sub), GET_MODE (sub), mode)
1016 && GET_MODE_CLASS (GET_MODE (sub)) != MODE_COMPLEX_INT
1017 && GET_MODE_CLASS (GET_MODE (sub)) != MODE_COMPLEX_FLOAT)
1018 return 0;
1019 #endif
1020
1021 /* FLOAT_MODE subregs can't be paradoxical. Combine will occasionally
1022 create such rtl, and we must reject it. */
1023 if (SCALAR_FLOAT_MODE_P (GET_MODE (op))
1024 && GET_MODE_SIZE (GET_MODE (op)) > GET_MODE_SIZE (GET_MODE (sub)))
1025 return 0;
1026
1027 op = sub;
1028 }
1029
1030 /* We don't consider registers whose class is NO_REGS
1031 to be a register operand. */
1032 return (REG_P (op)
1033 && (REGNO (op) >= FIRST_PSEUDO_REGISTER
1034 || REGNO_REG_CLASS (REGNO (op)) != NO_REGS));
1035 }
1036
1037 /* Return 1 for a register in Pmode; ignore the tested mode. */
1038
1039 int
1040 pmode_register_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1041 {
1042 return register_operand (op, Pmode);
1043 }
1044
1045 /* Return 1 if OP should match a MATCH_SCRATCH, i.e., if it is a SCRATCH
1046 or a hard register. */
1047
1048 int
1049 scratch_operand (rtx op, enum machine_mode mode)
1050 {
1051 if (GET_MODE (op) != mode && mode != VOIDmode)
1052 return 0;
1053
1054 return (GET_CODE (op) == SCRATCH
1055 || (REG_P (op)
1056 && REGNO (op) < FIRST_PSEUDO_REGISTER));
1057 }
1058
1059 /* Return 1 if OP is a valid immediate operand for mode MODE.
1060
1061 The main use of this function is as a predicate in match_operand
1062 expressions in the machine description. */
1063
1064 int
1065 immediate_operand (rtx op, enum machine_mode mode)
1066 {
1067 /* Don't accept CONST_INT or anything similar
1068 if the caller wants something floating. */
1069 if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1070 && GET_MODE_CLASS (mode) != MODE_INT
1071 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1072 return 0;
1073
1074 if (GET_CODE (op) == CONST_INT
1075 && mode != VOIDmode
1076 && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
1077 return 0;
1078
1079 return (CONSTANT_P (op)
1080 && (GET_MODE (op) == mode || mode == VOIDmode
1081 || GET_MODE (op) == VOIDmode)
1082 && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
1083 && LEGITIMATE_CONSTANT_P (op));
1084 }
1085
1086 /* Returns 1 if OP is an operand that is a CONST_INT. */
1087
1088 int
1089 const_int_operand (rtx op, enum machine_mode mode)
1090 {
1091 if (GET_CODE (op) != CONST_INT)
1092 return 0;
1093
1094 if (mode != VOIDmode
1095 && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
1096 return 0;
1097
1098 return 1;
1099 }
1100
1101 /* Returns 1 if OP is an operand that is a constant integer or constant
1102 floating-point number. */
1103
1104 int
1105 const_double_operand (rtx op, enum machine_mode mode)
1106 {
1107 /* Don't accept CONST_INT or anything similar
1108 if the caller wants something floating. */
1109 if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1110 && GET_MODE_CLASS (mode) != MODE_INT
1111 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1112 return 0;
1113
1114 return ((GET_CODE (op) == CONST_DOUBLE || GET_CODE (op) == CONST_INT)
1115 && (mode == VOIDmode || GET_MODE (op) == mode
1116 || GET_MODE (op) == VOIDmode));
1117 }
1118
1119 /* Return 1 if OP is a general operand that is not an immediate operand. */
1120
1121 int
1122 nonimmediate_operand (rtx op, enum machine_mode mode)
1123 {
1124 return (general_operand (op, mode) && ! CONSTANT_P (op));
1125 }
1126
1127 /* Return 1 if OP is a register reference or immediate value of mode MODE. */
1128
1129 int
1130 nonmemory_operand (rtx op, enum machine_mode mode)
1131 {
1132 if (CONSTANT_P (op))
1133 {
1134 /* Don't accept CONST_INT or anything similar
1135 if the caller wants something floating. */
1136 if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1137 && GET_MODE_CLASS (mode) != MODE_INT
1138 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1139 return 0;
1140
1141 if (GET_CODE (op) == CONST_INT
1142 && mode != VOIDmode
1143 && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
1144 return 0;
1145
1146 return ((GET_MODE (op) == VOIDmode || GET_MODE (op) == mode
1147 || mode == VOIDmode)
1148 && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
1149 && LEGITIMATE_CONSTANT_P (op));
1150 }
1151
1152 if (GET_MODE (op) != mode && mode != VOIDmode)
1153 return 0;
1154
1155 if (GET_CODE (op) == SUBREG)
1156 {
1157 /* Before reload, we can allow (SUBREG (MEM...)) as a register operand
1158 because it is guaranteed to be reloaded into one.
1159 Just make sure the MEM is valid in itself.
1160 (Ideally, (SUBREG (MEM)...) should not exist after reload,
1161 but currently it does result from (SUBREG (REG)...) where the
1162 reg went on the stack.) */
1163 if (! reload_completed && MEM_P (SUBREG_REG (op)))
1164 return general_operand (op, mode);
1165 op = SUBREG_REG (op);
1166 }
1167
1168 /* We don't consider registers whose class is NO_REGS
1169 to be a register operand. */
1170 return (REG_P (op)
1171 && (REGNO (op) >= FIRST_PSEUDO_REGISTER
1172 || REGNO_REG_CLASS (REGNO (op)) != NO_REGS));
1173 }
1174
1175 /* Return 1 if OP is a valid operand that stands for pushing a
1176 value of mode MODE onto the stack.
1177
1178 The main use of this function is as a predicate in match_operand
1179 expressions in the machine description. */
1180
1181 int
1182 push_operand (rtx op, enum machine_mode mode)
1183 {
1184 unsigned int rounded_size = GET_MODE_SIZE (mode);
1185
1186 #ifdef PUSH_ROUNDING
1187 rounded_size = PUSH_ROUNDING (rounded_size);
1188 #endif
1189
1190 if (!MEM_P (op))
1191 return 0;
1192
1193 if (mode != VOIDmode && GET_MODE (op) != mode)
1194 return 0;
1195
1196 op = XEXP (op, 0);
1197
1198 if (rounded_size == GET_MODE_SIZE (mode))
1199 {
1200 if (GET_CODE (op) != STACK_PUSH_CODE)
1201 return 0;
1202 }
1203 else
1204 {
1205 if (GET_CODE (op) != PRE_MODIFY
1206 || GET_CODE (XEXP (op, 1)) != PLUS
1207 || XEXP (XEXP (op, 1), 0) != XEXP (op, 0)
1208 || GET_CODE (XEXP (XEXP (op, 1), 1)) != CONST_INT
1209 #ifdef STACK_GROWS_DOWNWARD
1210 || INTVAL (XEXP (XEXP (op, 1), 1)) != - (int) rounded_size
1211 #else
1212 || INTVAL (XEXP (XEXP (op, 1), 1)) != (int) rounded_size
1213 #endif
1214 )
1215 return 0;
1216 }
1217
1218 return XEXP (op, 0) == stack_pointer_rtx;
1219 }
1220
1221 /* Return 1 if OP is a valid operand that stands for popping a
1222 value of mode MODE off the stack.
1223
1224 The main use of this function is as a predicate in match_operand
1225 expressions in the machine description. */
1226
1227 int
1228 pop_operand (rtx op, enum machine_mode mode)
1229 {
1230 if (!MEM_P (op))
1231 return 0;
1232
1233 if (mode != VOIDmode && GET_MODE (op) != mode)
1234 return 0;
1235
1236 op = XEXP (op, 0);
1237
1238 if (GET_CODE (op) != STACK_POP_CODE)
1239 return 0;
1240
1241 return XEXP (op, 0) == stack_pointer_rtx;
1242 }
1243
1244 /* Return 1 if ADDR is a valid memory address for mode MODE. */
1245
1246 int
1247 memory_address_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx addr)
1248 {
1249 GO_IF_LEGITIMATE_ADDRESS (mode, addr, win);
1250 return 0;
1251
1252 win:
1253 return 1;
1254 }
1255
1256 /* Return 1 if OP is a valid memory reference with mode MODE,
1257 including a valid address.
1258
1259 The main use of this function is as a predicate in match_operand
1260 expressions in the machine description. */
1261
1262 int
1263 memory_operand (rtx op, enum machine_mode mode)
1264 {
1265 rtx inner;
1266
1267 if (! reload_completed)
1268 /* Note that no SUBREG is a memory operand before end of reload pass,
1269 because (SUBREG (MEM...)) forces reloading into a register. */
1270 return MEM_P (op) && general_operand (op, mode);
1271
1272 if (mode != VOIDmode && GET_MODE (op) != mode)
1273 return 0;
1274
1275 inner = op;
1276 if (GET_CODE (inner) == SUBREG)
1277 inner = SUBREG_REG (inner);
1278
1279 return (MEM_P (inner) && general_operand (op, mode));
1280 }
1281
1282 /* Return 1 if OP is a valid indirect memory reference with mode MODE;
1283 that is, a memory reference whose address is a general_operand. */
1284
1285 int
1286 indirect_operand (rtx op, enum machine_mode mode)
1287 {
1288 /* Before reload, a SUBREG isn't in memory (see memory_operand, above). */
1289 if (! reload_completed
1290 && GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op)))
1291 {
1292 int offset = SUBREG_BYTE (op);
1293 rtx inner = SUBREG_REG (op);
1294
1295 if (mode != VOIDmode && GET_MODE (op) != mode)
1296 return 0;
1297
1298 /* The only way that we can have a general_operand as the resulting
1299 address is if OFFSET is zero and the address already is an operand
1300 or if the address is (plus Y (const_int -OFFSET)) and Y is an
1301 operand. */
1302
1303 return ((offset == 0 && general_operand (XEXP (inner, 0), Pmode))
1304 || (GET_CODE (XEXP (inner, 0)) == PLUS
1305 && GET_CODE (XEXP (XEXP (inner, 0), 1)) == CONST_INT
1306 && INTVAL (XEXP (XEXP (inner, 0), 1)) == -offset
1307 && general_operand (XEXP (XEXP (inner, 0), 0), Pmode)));
1308 }
1309
1310 return (MEM_P (op)
1311 && memory_operand (op, mode)
1312 && general_operand (XEXP (op, 0), Pmode));
1313 }
1314
1315 /* Return 1 if this is a comparison operator. This allows the use of
1316 MATCH_OPERATOR to recognize all the branch insns. */
1317
1318 int
1319 comparison_operator (rtx op, enum machine_mode mode)
1320 {
1321 return ((mode == VOIDmode || GET_MODE (op) == mode)
1322 && COMPARISON_P (op));
1323 }
1324 \f
1325 /* If BODY is an insn body that uses ASM_OPERANDS,
1326 return the number of operands (both input and output) in the insn.
1327 Otherwise return -1. */
1328
1329 int
1330 asm_noperands (const_rtx body)
1331 {
1332 switch (GET_CODE (body))
1333 {
1334 case ASM_OPERANDS:
1335 /* No output operands: return number of input operands. */
1336 return ASM_OPERANDS_INPUT_LENGTH (body);
1337 case SET:
1338 if (GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
1339 /* Single output operand: BODY is (set OUTPUT (asm_operands ...)). */
1340 return ASM_OPERANDS_INPUT_LENGTH (SET_SRC (body)) + 1;
1341 else
1342 return -1;
1343 case PARALLEL:
1344 if (GET_CODE (XVECEXP (body, 0, 0)) == SET
1345 && GET_CODE (SET_SRC (XVECEXP (body, 0, 0))) == ASM_OPERANDS)
1346 {
1347 /* Multiple output operands, or 1 output plus some clobbers:
1348 body is [(set OUTPUT (asm_operands ...))... (clobber (reg ...))...]. */
1349 int i;
1350 int n_sets;
1351
1352 /* Count backwards through CLOBBERs to determine number of SETs. */
1353 for (i = XVECLEN (body, 0); i > 0; i--)
1354 {
1355 if (GET_CODE (XVECEXP (body, 0, i - 1)) == SET)
1356 break;
1357 if (GET_CODE (XVECEXP (body, 0, i - 1)) != CLOBBER)
1358 return -1;
1359 }
1360
1361 /* N_SETS is now number of output operands. */
1362 n_sets = i;
1363
1364 /* Verify that all the SETs we have
1365 came from a single original asm_operands insn
1366 (so that invalid combinations are blocked). */
1367 for (i = 0; i < n_sets; i++)
1368 {
1369 rtx elt = XVECEXP (body, 0, i);
1370 if (GET_CODE (elt) != SET)
1371 return -1;
1372 if (GET_CODE (SET_SRC (elt)) != ASM_OPERANDS)
1373 return -1;
1374 /* If these ASM_OPERANDS rtx's came from different original insns
1375 then they aren't allowed together. */
1376 if (ASM_OPERANDS_INPUT_VEC (SET_SRC (elt))
1377 != ASM_OPERANDS_INPUT_VEC (SET_SRC (XVECEXP (body, 0, 0))))
1378 return -1;
1379 }
1380 return (ASM_OPERANDS_INPUT_LENGTH (SET_SRC (XVECEXP (body, 0, 0)))
1381 + n_sets);
1382 }
1383 else if (GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
1384 {
1385 /* 0 outputs, but some clobbers:
1386 body is [(asm_operands ...) (clobber (reg ...))...]. */
1387 int i;
1388
1389 /* Make sure all the other parallel things really are clobbers. */
1390 for (i = XVECLEN (body, 0) - 1; i > 0; i--)
1391 if (GET_CODE (XVECEXP (body, 0, i)) != CLOBBER)
1392 return -1;
1393
1394 return ASM_OPERANDS_INPUT_LENGTH (XVECEXP (body, 0, 0));
1395 }
1396 else
1397 return -1;
1398 default:
1399 return -1;
1400 }
1401 }
1402
1403 /* Assuming BODY is an insn body that uses ASM_OPERANDS,
1404 copy its operands (both input and output) into the vector OPERANDS,
1405 the locations of the operands within the insn into the vector OPERAND_LOCS,
1406 and the constraints for the operands into CONSTRAINTS.
1407 Write the modes of the operands into MODES.
1408 Return the assembler-template.
1409
1410 If MODES, OPERAND_LOCS, CONSTRAINTS or OPERANDS is 0,
1411 we don't store that info. */
1412
1413 const char *
1414 decode_asm_operands (rtx body, rtx *operands, rtx **operand_locs,
1415 const char **constraints, enum machine_mode *modes,
1416 location_t *loc)
1417 {
1418 int i;
1419 int noperands;
1420 rtx asmop = 0;
1421
1422 if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
1423 {
1424 asmop = SET_SRC (body);
1425 /* Single output operand: BODY is (set OUTPUT (asm_operands ....)). */
1426
1427 noperands = ASM_OPERANDS_INPUT_LENGTH (asmop) + 1;
1428
1429 for (i = 1; i < noperands; i++)
1430 {
1431 if (operand_locs)
1432 operand_locs[i] = &ASM_OPERANDS_INPUT (asmop, i - 1);
1433 if (operands)
1434 operands[i] = ASM_OPERANDS_INPUT (asmop, i - 1);
1435 if (constraints)
1436 constraints[i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i - 1);
1437 if (modes)
1438 modes[i] = ASM_OPERANDS_INPUT_MODE (asmop, i - 1);
1439 }
1440
1441 /* The output is in the SET.
1442 Its constraint is in the ASM_OPERANDS itself. */
1443 if (operands)
1444 operands[0] = SET_DEST (body);
1445 if (operand_locs)
1446 operand_locs[0] = &SET_DEST (body);
1447 if (constraints)
1448 constraints[0] = ASM_OPERANDS_OUTPUT_CONSTRAINT (asmop);
1449 if (modes)
1450 modes[0] = GET_MODE (SET_DEST (body));
1451 }
1452 else if (GET_CODE (body) == ASM_OPERANDS)
1453 {
1454 asmop = body;
1455 /* No output operands: BODY is (asm_operands ....). */
1456
1457 noperands = ASM_OPERANDS_INPUT_LENGTH (asmop);
1458
1459 /* The input operands are found in the 1st element vector. */
1460 /* Constraints for inputs are in the 2nd element vector. */
1461 for (i = 0; i < noperands; i++)
1462 {
1463 if (operand_locs)
1464 operand_locs[i] = &ASM_OPERANDS_INPUT (asmop, i);
1465 if (operands)
1466 operands[i] = ASM_OPERANDS_INPUT (asmop, i);
1467 if (constraints)
1468 constraints[i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1469 if (modes)
1470 modes[i] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1471 }
1472 }
1473 else if (GET_CODE (body) == PARALLEL
1474 && GET_CODE (XVECEXP (body, 0, 0)) == SET
1475 && GET_CODE (SET_SRC (XVECEXP (body, 0, 0))) == ASM_OPERANDS)
1476 {
1477 int nparallel = XVECLEN (body, 0); /* Includes CLOBBERs. */
1478 int nin;
1479 int nout = 0; /* Does not include CLOBBERs. */
1480
1481 asmop = SET_SRC (XVECEXP (body, 0, 0));
1482 nin = ASM_OPERANDS_INPUT_LENGTH (asmop);
1483
1484 /* At least one output, plus some CLOBBERs. */
1485
1486 /* The outputs are in the SETs.
1487 Their constraints are in the ASM_OPERANDS itself. */
1488 for (i = 0; i < nparallel; i++)
1489 {
1490 if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
1491 break; /* Past last SET */
1492
1493 if (operands)
1494 operands[i] = SET_DEST (XVECEXP (body, 0, i));
1495 if (operand_locs)
1496 operand_locs[i] = &SET_DEST (XVECEXP (body, 0, i));
1497 if (constraints)
1498 constraints[i] = XSTR (SET_SRC (XVECEXP (body, 0, i)), 1);
1499 if (modes)
1500 modes[i] = GET_MODE (SET_DEST (XVECEXP (body, 0, i)));
1501 nout++;
1502 }
1503
1504 for (i = 0; i < nin; i++)
1505 {
1506 if (operand_locs)
1507 operand_locs[i + nout] = &ASM_OPERANDS_INPUT (asmop, i);
1508 if (operands)
1509 operands[i + nout] = ASM_OPERANDS_INPUT (asmop, i);
1510 if (constraints)
1511 constraints[i + nout] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1512 if (modes)
1513 modes[i + nout] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1514 }
1515 }
1516 else if (GET_CODE (body) == PARALLEL
1517 && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
1518 {
1519 /* No outputs, but some CLOBBERs. */
1520
1521 int nin;
1522
1523 asmop = XVECEXP (body, 0, 0);
1524 nin = ASM_OPERANDS_INPUT_LENGTH (asmop);
1525
1526 for (i = 0; i < nin; i++)
1527 {
1528 if (operand_locs)
1529 operand_locs[i] = &ASM_OPERANDS_INPUT (asmop, i);
1530 if (operands)
1531 operands[i] = ASM_OPERANDS_INPUT (asmop, i);
1532 if (constraints)
1533 constraints[i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1534 if (modes)
1535 modes[i] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1536 }
1537
1538 }
1539
1540 if (loc)
1541 *loc = ASM_OPERANDS_SOURCE_LOCATION (asmop);
1542
1543 return ASM_OPERANDS_TEMPLATE (asmop);
1544 }
1545
1546 /* Check if an asm_operand matches its constraints.
1547 Return > 0 if ok, = 0 if bad, < 0 if inconclusive. */
1548
1549 int
1550 asm_operand_ok (rtx op, const char *constraint)
1551 {
1552 int result = 0;
1553
1554 /* Use constrain_operands after reload. */
1555 gcc_assert (!reload_completed);
1556
1557 while (*constraint)
1558 {
1559 char c = *constraint;
1560 int len;
1561 switch (c)
1562 {
1563 case ',':
1564 constraint++;
1565 continue;
1566 case '=':
1567 case '+':
1568 case '*':
1569 case '%':
1570 case '!':
1571 case '#':
1572 case '&':
1573 case '?':
1574 break;
1575
1576 case '0': case '1': case '2': case '3': case '4':
1577 case '5': case '6': case '7': case '8': case '9':
1578 /* For best results, our caller should have given us the
1579 proper matching constraint, but we can't actually fail
1580 the check if they didn't. Indicate that results are
1581 inconclusive. */
1582 do
1583 constraint++;
1584 while (ISDIGIT (*constraint));
1585 if (! result)
1586 result = -1;
1587 continue;
1588
1589 case 'p':
1590 if (address_operand (op, VOIDmode))
1591 result = 1;
1592 break;
1593
1594 case TARGET_MEM_CONSTRAINT:
1595 case 'V': /* non-offsettable */
1596 if (memory_operand (op, VOIDmode))
1597 result = 1;
1598 break;
1599
1600 case 'o': /* offsettable */
1601 if (offsettable_nonstrict_memref_p (op))
1602 result = 1;
1603 break;
1604
1605 case '<':
1606 /* ??? Before auto-inc-dec, auto inc/dec insns are not supposed to exist,
1607 excepting those that expand_call created. Further, on some
1608 machines which do not have generalized auto inc/dec, an inc/dec
1609 is not a memory_operand.
1610
1611 Match any memory and hope things are resolved after reload. */
1612
1613 if (MEM_P (op)
1614 && (1
1615 || GET_CODE (XEXP (op, 0)) == PRE_DEC
1616 || GET_CODE (XEXP (op, 0)) == POST_DEC))
1617 result = 1;
1618 break;
1619
1620 case '>':
1621 if (MEM_P (op)
1622 && (1
1623 || GET_CODE (XEXP (op, 0)) == PRE_INC
1624 || GET_CODE (XEXP (op, 0)) == POST_INC))
1625 result = 1;
1626 break;
1627
1628 case 'E':
1629 case 'F':
1630 if (GET_CODE (op) == CONST_DOUBLE
1631 || (GET_CODE (op) == CONST_VECTOR
1632 && GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_FLOAT))
1633 result = 1;
1634 break;
1635
1636 case 'G':
1637 if (GET_CODE (op) == CONST_DOUBLE
1638 && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (op, 'G', constraint))
1639 result = 1;
1640 break;
1641 case 'H':
1642 if (GET_CODE (op) == CONST_DOUBLE
1643 && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (op, 'H', constraint))
1644 result = 1;
1645 break;
1646
1647 case 's':
1648 if (GET_CODE (op) == CONST_INT
1649 || (GET_CODE (op) == CONST_DOUBLE
1650 && GET_MODE (op) == VOIDmode))
1651 break;
1652 /* Fall through. */
1653
1654 case 'i':
1655 if (CONSTANT_P (op) && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op)))
1656 result = 1;
1657 break;
1658
1659 case 'n':
1660 if (GET_CODE (op) == CONST_INT
1661 || (GET_CODE (op) == CONST_DOUBLE
1662 && GET_MODE (op) == VOIDmode))
1663 result = 1;
1664 break;
1665
1666 case 'I':
1667 if (GET_CODE (op) == CONST_INT
1668 && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'I', constraint))
1669 result = 1;
1670 break;
1671 case 'J':
1672 if (GET_CODE (op) == CONST_INT
1673 && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'J', constraint))
1674 result = 1;
1675 break;
1676 case 'K':
1677 if (GET_CODE (op) == CONST_INT
1678 && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'K', constraint))
1679 result = 1;
1680 break;
1681 case 'L':
1682 if (GET_CODE (op) == CONST_INT
1683 && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'L', constraint))
1684 result = 1;
1685 break;
1686 case 'M':
1687 if (GET_CODE (op) == CONST_INT
1688 && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'M', constraint))
1689 result = 1;
1690 break;
1691 case 'N':
1692 if (GET_CODE (op) == CONST_INT
1693 && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'N', constraint))
1694 result = 1;
1695 break;
1696 case 'O':
1697 if (GET_CODE (op) == CONST_INT
1698 && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'O', constraint))
1699 result = 1;
1700 break;
1701 case 'P':
1702 if (GET_CODE (op) == CONST_INT
1703 && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'P', constraint))
1704 result = 1;
1705 break;
1706
1707 case 'X':
1708 result = 1;
1709 break;
1710
1711 case 'g':
1712 if (general_operand (op, VOIDmode))
1713 result = 1;
1714 break;
1715
1716 default:
1717 /* For all other letters, we first check for a register class,
1718 otherwise it is an EXTRA_CONSTRAINT. */
1719 if (REG_CLASS_FROM_CONSTRAINT (c, constraint) != NO_REGS)
1720 {
1721 case 'r':
1722 if (GET_MODE (op) == BLKmode)
1723 break;
1724 if (register_operand (op, VOIDmode))
1725 result = 1;
1726 }
1727 #ifdef EXTRA_CONSTRAINT_STR
1728 else if (EXTRA_MEMORY_CONSTRAINT (c, constraint))
1729 /* Every memory operand can be reloaded to fit. */
1730 result = result || memory_operand (op, VOIDmode);
1731 else if (EXTRA_ADDRESS_CONSTRAINT (c, constraint))
1732 /* Every address operand can be reloaded to fit. */
1733 result = result || address_operand (op, VOIDmode);
1734 else if (EXTRA_CONSTRAINT_STR (op, c, constraint))
1735 result = 1;
1736 #endif
1737 break;
1738 }
1739 len = CONSTRAINT_LEN (c, constraint);
1740 do
1741 constraint++;
1742 while (--len && *constraint);
1743 if (len)
1744 return 0;
1745 }
1746
1747 return result;
1748 }
1749 \f
1750 /* Given an rtx *P, if it is a sum containing an integer constant term,
1751 return the location (type rtx *) of the pointer to that constant term.
1752 Otherwise, return a null pointer. */
1753
1754 rtx *
1755 find_constant_term_loc (rtx *p)
1756 {
1757 rtx *tem;
1758 enum rtx_code code = GET_CODE (*p);
1759
1760 /* If *P IS such a constant term, P is its location. */
1761
1762 if (code == CONST_INT || code == SYMBOL_REF || code == LABEL_REF
1763 || code == CONST)
1764 return p;
1765
1766 /* Otherwise, if not a sum, it has no constant term. */
1767
1768 if (GET_CODE (*p) != PLUS)
1769 return 0;
1770
1771 /* If one of the summands is constant, return its location. */
1772
1773 if (XEXP (*p, 0) && CONSTANT_P (XEXP (*p, 0))
1774 && XEXP (*p, 1) && CONSTANT_P (XEXP (*p, 1)))
1775 return p;
1776
1777 /* Otherwise, check each summand for containing a constant term. */
1778
1779 if (XEXP (*p, 0) != 0)
1780 {
1781 tem = find_constant_term_loc (&XEXP (*p, 0));
1782 if (tem != 0)
1783 return tem;
1784 }
1785
1786 if (XEXP (*p, 1) != 0)
1787 {
1788 tem = find_constant_term_loc (&XEXP (*p, 1));
1789 if (tem != 0)
1790 return tem;
1791 }
1792
1793 return 0;
1794 }
1795 \f
1796 /* Return 1 if OP is a memory reference
1797 whose address contains no side effects
1798 and remains valid after the addition
1799 of a positive integer less than the
1800 size of the object being referenced.
1801
1802 We assume that the original address is valid and do not check it.
1803
1804 This uses strict_memory_address_p as a subroutine, so
1805 don't use it before reload. */
1806
1807 int
1808 offsettable_memref_p (rtx op)
1809 {
1810 return ((MEM_P (op))
1811 && offsettable_address_p (1, GET_MODE (op), XEXP (op, 0)));
1812 }
1813
1814 /* Similar, but don't require a strictly valid mem ref:
1815 consider pseudo-regs valid as index or base regs. */
1816
1817 int
1818 offsettable_nonstrict_memref_p (rtx op)
1819 {
1820 return ((MEM_P (op))
1821 && offsettable_address_p (0, GET_MODE (op), XEXP (op, 0)));
1822 }
1823
1824 /* Return 1 if Y is a memory address which contains no side effects
1825 and would remain valid after the addition of a positive integer
1826 less than the size of that mode.
1827
1828 We assume that the original address is valid and do not check it.
1829 We do check that it is valid for narrower modes.
1830
1831 If STRICTP is nonzero, we require a strictly valid address,
1832 for the sake of use in reload.c. */
1833
1834 int
1835 offsettable_address_p (int strictp, enum machine_mode mode, rtx y)
1836 {
1837 enum rtx_code ycode = GET_CODE (y);
1838 rtx z;
1839 rtx y1 = y;
1840 rtx *y2;
1841 int (*addressp) (enum machine_mode, rtx) =
1842 (strictp ? strict_memory_address_p : memory_address_p);
1843 unsigned int mode_sz = GET_MODE_SIZE (mode);
1844
1845 if (CONSTANT_ADDRESS_P (y))
1846 return 1;
1847
1848 /* Adjusting an offsettable address involves changing to a narrower mode.
1849 Make sure that's OK. */
1850
1851 if (mode_dependent_address_p (y))
1852 return 0;
1853
1854 /* ??? How much offset does an offsettable BLKmode reference need?
1855 Clearly that depends on the situation in which it's being used.
1856 However, the current situation in which we test 0xffffffff is
1857 less than ideal. Caveat user. */
1858 if (mode_sz == 0)
1859 mode_sz = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
1860
1861 /* If the expression contains a constant term,
1862 see if it remains valid when max possible offset is added. */
1863
1864 if ((ycode == PLUS) && (y2 = find_constant_term_loc (&y1)))
1865 {
1866 int good;
1867
1868 y1 = *y2;
1869 *y2 = plus_constant (*y2, mode_sz - 1);
1870 /* Use QImode because an odd displacement may be automatically invalid
1871 for any wider mode. But it should be valid for a single byte. */
1872 good = (*addressp) (QImode, y);
1873
1874 /* In any case, restore old contents of memory. */
1875 *y2 = y1;
1876 return good;
1877 }
1878
1879 if (GET_RTX_CLASS (ycode) == RTX_AUTOINC)
1880 return 0;
1881
1882 /* The offset added here is chosen as the maximum offset that
1883 any instruction could need to add when operating on something
1884 of the specified mode. We assume that if Y and Y+c are
1885 valid addresses then so is Y+d for all 0<d<c. adjust_address will
1886 go inside a LO_SUM here, so we do so as well. */
1887 if (GET_CODE (y) == LO_SUM
1888 && mode != BLKmode
1889 && mode_sz <= GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT)
1890 z = gen_rtx_LO_SUM (GET_MODE (y), XEXP (y, 0),
1891 plus_constant (XEXP (y, 1), mode_sz - 1));
1892 else
1893 z = plus_constant (y, mode_sz - 1);
1894
1895 /* Use QImode because an odd displacement may be automatically invalid
1896 for any wider mode. But it should be valid for a single byte. */
1897 return (*addressp) (QImode, z);
1898 }
1899
1900 /* Return 1 if ADDR is an address-expression whose effect depends
1901 on the mode of the memory reference it is used in.
1902
1903 Autoincrement addressing is a typical example of mode-dependence
1904 because the amount of the increment depends on the mode. */
1905
1906 int
1907 mode_dependent_address_p (rtx addr)
1908 {
1909 /* Auto-increment addressing with anything other than post_modify
1910 or pre_modify always introduces a mode dependency. Catch such
1911 cases now instead of deferring to the target. */
1912 if (GET_CODE (addr) == PRE_INC
1913 || GET_CODE (addr) == POST_INC
1914 || GET_CODE (addr) == PRE_DEC
1915 || GET_CODE (addr) == POST_DEC)
1916 return 1;
1917
1918 GO_IF_MODE_DEPENDENT_ADDRESS (addr, win);
1919 return 0;
1920 /* Label `win' might (not) be used via GO_IF_MODE_DEPENDENT_ADDRESS. */
1921 win: ATTRIBUTE_UNUSED_LABEL
1922 return 1;
1923 }
1924 \f
1925 /* Like extract_insn, but save insn extracted and don't extract again, when
1926 called again for the same insn expecting that recog_data still contain the
1927 valid information. This is used primary by gen_attr infrastructure that
1928 often does extract insn again and again. */
1929 void
1930 extract_insn_cached (rtx insn)
1931 {
1932 if (recog_data.insn == insn && INSN_CODE (insn) >= 0)
1933 return;
1934 extract_insn (insn);
1935 recog_data.insn = insn;
1936 }
1937
1938 /* Do cached extract_insn, constrain_operands and complain about failures.
1939 Used by insn_attrtab. */
1940 void
1941 extract_constrain_insn_cached (rtx insn)
1942 {
1943 extract_insn_cached (insn);
1944 if (which_alternative == -1
1945 && !constrain_operands (reload_completed))
1946 fatal_insn_not_found (insn);
1947 }
1948
1949 /* Do cached constrain_operands and complain about failures. */
1950 int
1951 constrain_operands_cached (int strict)
1952 {
1953 if (which_alternative == -1)
1954 return constrain_operands (strict);
1955 else
1956 return 1;
1957 }
1958 \f
1959 /* Analyze INSN and fill in recog_data. */
1960
1961 void
1962 extract_insn (rtx insn)
1963 {
1964 int i;
1965 int icode;
1966 int noperands;
1967 rtx body = PATTERN (insn);
1968
1969 recog_data.n_operands = 0;
1970 recog_data.n_alternatives = 0;
1971 recog_data.n_dups = 0;
1972
1973 switch (GET_CODE (body))
1974 {
1975 case USE:
1976 case CLOBBER:
1977 case ASM_INPUT:
1978 case ADDR_VEC:
1979 case ADDR_DIFF_VEC:
1980 return;
1981
1982 case SET:
1983 if (GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
1984 goto asm_insn;
1985 else
1986 goto normal_insn;
1987 case PARALLEL:
1988 if ((GET_CODE (XVECEXP (body, 0, 0)) == SET
1989 && GET_CODE (SET_SRC (XVECEXP (body, 0, 0))) == ASM_OPERANDS)
1990 || GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
1991 goto asm_insn;
1992 else
1993 goto normal_insn;
1994 case ASM_OPERANDS:
1995 asm_insn:
1996 recog_data.n_operands = noperands = asm_noperands (body);
1997 if (noperands >= 0)
1998 {
1999 /* This insn is an `asm' with operands. */
2000
2001 /* expand_asm_operands makes sure there aren't too many operands. */
2002 gcc_assert (noperands <= MAX_RECOG_OPERANDS);
2003
2004 /* Now get the operand values and constraints out of the insn. */
2005 decode_asm_operands (body, recog_data.operand,
2006 recog_data.operand_loc,
2007 recog_data.constraints,
2008 recog_data.operand_mode, NULL);
2009 if (noperands > 0)
2010 {
2011 const char *p = recog_data.constraints[0];
2012 recog_data.n_alternatives = 1;
2013 while (*p)
2014 recog_data.n_alternatives += (*p++ == ',');
2015 }
2016 break;
2017 }
2018 fatal_insn_not_found (insn);
2019
2020 default:
2021 normal_insn:
2022 /* Ordinary insn: recognize it, get the operands via insn_extract
2023 and get the constraints. */
2024
2025 icode = recog_memoized (insn);
2026 if (icode < 0)
2027 fatal_insn_not_found (insn);
2028
2029 recog_data.n_operands = noperands = insn_data[icode].n_operands;
2030 recog_data.n_alternatives = insn_data[icode].n_alternatives;
2031 recog_data.n_dups = insn_data[icode].n_dups;
2032
2033 insn_extract (insn);
2034
2035 for (i = 0; i < noperands; i++)
2036 {
2037 recog_data.constraints[i] = insn_data[icode].operand[i].constraint;
2038 recog_data.operand_mode[i] = insn_data[icode].operand[i].mode;
2039 /* VOIDmode match_operands gets mode from their real operand. */
2040 if (recog_data.operand_mode[i] == VOIDmode)
2041 recog_data.operand_mode[i] = GET_MODE (recog_data.operand[i]);
2042 }
2043 }
2044 for (i = 0; i < noperands; i++)
2045 recog_data.operand_type[i]
2046 = (recog_data.constraints[i][0] == '=' ? OP_OUT
2047 : recog_data.constraints[i][0] == '+' ? OP_INOUT
2048 : OP_IN);
2049
2050 gcc_assert (recog_data.n_alternatives <= MAX_RECOG_ALTERNATIVES);
2051
2052 if (INSN_CODE (insn) < 0)
2053 for (i = 0; i < recog_data.n_alternatives; i++)
2054 recog_data.alternative_enabled_p[i] = true;
2055 else
2056 {
2057 recog_data.insn = insn;
2058 for (i = 0; i < recog_data.n_alternatives; i++)
2059 {
2060 which_alternative = i;
2061 recog_data.alternative_enabled_p[i] = get_attr_enabled (insn);
2062 }
2063 }
2064
2065 recog_data.insn = NULL;
2066 which_alternative = -1;
2067 }
2068
2069 /* After calling extract_insn, you can use this function to extract some
2070 information from the constraint strings into a more usable form.
2071 The collected data is stored in recog_op_alt. */
2072 void
2073 preprocess_constraints (void)
2074 {
2075 int i;
2076
2077 for (i = 0; i < recog_data.n_operands; i++)
2078 memset (recog_op_alt[i], 0, (recog_data.n_alternatives
2079 * sizeof (struct operand_alternative)));
2080
2081 for (i = 0; i < recog_data.n_operands; i++)
2082 {
2083 int j;
2084 struct operand_alternative *op_alt;
2085 const char *p = recog_data.constraints[i];
2086
2087 op_alt = recog_op_alt[i];
2088
2089 for (j = 0; j < recog_data.n_alternatives; j++)
2090 {
2091 op_alt[j].cl = NO_REGS;
2092 op_alt[j].constraint = p;
2093 op_alt[j].matches = -1;
2094 op_alt[j].matched = -1;
2095
2096 if (!recog_data.alternative_enabled_p[j])
2097 {
2098 p = skip_alternative (p);
2099 continue;
2100 }
2101
2102 if (*p == '\0' || *p == ',')
2103 {
2104 op_alt[j].anything_ok = 1;
2105 continue;
2106 }
2107
2108 for (;;)
2109 {
2110 char c = *p;
2111 if (c == '#')
2112 do
2113 c = *++p;
2114 while (c != ',' && c != '\0');
2115 if (c == ',' || c == '\0')
2116 {
2117 p++;
2118 break;
2119 }
2120
2121 switch (c)
2122 {
2123 case '=': case '+': case '*': case '%':
2124 case 'E': case 'F': case 'G': case 'H':
2125 case 's': case 'i': case 'n':
2126 case 'I': case 'J': case 'K': case 'L':
2127 case 'M': case 'N': case 'O': case 'P':
2128 /* These don't say anything we care about. */
2129 break;
2130
2131 case '?':
2132 op_alt[j].reject += 6;
2133 break;
2134 case '!':
2135 op_alt[j].reject += 600;
2136 break;
2137 case '&':
2138 op_alt[j].earlyclobber = 1;
2139 break;
2140
2141 case '0': case '1': case '2': case '3': case '4':
2142 case '5': case '6': case '7': case '8': case '9':
2143 {
2144 char *end;
2145 op_alt[j].matches = strtoul (p, &end, 10);
2146 recog_op_alt[op_alt[j].matches][j].matched = i;
2147 p = end;
2148 }
2149 continue;
2150
2151 case TARGET_MEM_CONSTRAINT:
2152 op_alt[j].memory_ok = 1;
2153 break;
2154 case '<':
2155 op_alt[j].decmem_ok = 1;
2156 break;
2157 case '>':
2158 op_alt[j].incmem_ok = 1;
2159 break;
2160 case 'V':
2161 op_alt[j].nonoffmem_ok = 1;
2162 break;
2163 case 'o':
2164 op_alt[j].offmem_ok = 1;
2165 break;
2166 case 'X':
2167 op_alt[j].anything_ok = 1;
2168 break;
2169
2170 case 'p':
2171 op_alt[j].is_address = 1;
2172 op_alt[j].cl = reg_class_subunion[(int) op_alt[j].cl]
2173 [(int) base_reg_class (VOIDmode, ADDRESS, SCRATCH)];
2174 break;
2175
2176 case 'g':
2177 case 'r':
2178 op_alt[j].cl =
2179 reg_class_subunion[(int) op_alt[j].cl][(int) GENERAL_REGS];
2180 break;
2181
2182 default:
2183 if (EXTRA_MEMORY_CONSTRAINT (c, p))
2184 {
2185 op_alt[j].memory_ok = 1;
2186 break;
2187 }
2188 if (EXTRA_ADDRESS_CONSTRAINT (c, p))
2189 {
2190 op_alt[j].is_address = 1;
2191 op_alt[j].cl
2192 = (reg_class_subunion
2193 [(int) op_alt[j].cl]
2194 [(int) base_reg_class (VOIDmode, ADDRESS,
2195 SCRATCH)]);
2196 break;
2197 }
2198
2199 op_alt[j].cl
2200 = (reg_class_subunion
2201 [(int) op_alt[j].cl]
2202 [(int) REG_CLASS_FROM_CONSTRAINT ((unsigned char) c, p)]);
2203 break;
2204 }
2205 p += CONSTRAINT_LEN (c, p);
2206 }
2207 }
2208 }
2209 }
2210
2211 /* Check the operands of an insn against the insn's operand constraints
2212 and return 1 if they are valid.
2213 The information about the insn's operands, constraints, operand modes
2214 etc. is obtained from the global variables set up by extract_insn.
2215
2216 WHICH_ALTERNATIVE is set to a number which indicates which
2217 alternative of constraints was matched: 0 for the first alternative,
2218 1 for the next, etc.
2219
2220 In addition, when two operands are required to match
2221 and it happens that the output operand is (reg) while the
2222 input operand is --(reg) or ++(reg) (a pre-inc or pre-dec),
2223 make the output operand look like the input.
2224 This is because the output operand is the one the template will print.
2225
2226 This is used in final, just before printing the assembler code and by
2227 the routines that determine an insn's attribute.
2228
2229 If STRICT is a positive nonzero value, it means that we have been
2230 called after reload has been completed. In that case, we must
2231 do all checks strictly. If it is zero, it means that we have been called
2232 before reload has completed. In that case, we first try to see if we can
2233 find an alternative that matches strictly. If not, we try again, this
2234 time assuming that reload will fix up the insn. This provides a "best
2235 guess" for the alternative and is used to compute attributes of insns prior
2236 to reload. A negative value of STRICT is used for this internal call. */
2237
2238 struct funny_match
2239 {
2240 int this_op, other;
2241 };
2242
2243 int
2244 constrain_operands (int strict)
2245 {
2246 const char *constraints[MAX_RECOG_OPERANDS];
2247 int matching_operands[MAX_RECOG_OPERANDS];
2248 int earlyclobber[MAX_RECOG_OPERANDS];
2249 int c;
2250
2251 struct funny_match funny_match[MAX_RECOG_OPERANDS];
2252 int funny_match_index;
2253
2254 which_alternative = 0;
2255 if (recog_data.n_operands == 0 || recog_data.n_alternatives == 0)
2256 return 1;
2257
2258 for (c = 0; c < recog_data.n_operands; c++)
2259 {
2260 constraints[c] = recog_data.constraints[c];
2261 matching_operands[c] = -1;
2262 }
2263
2264 do
2265 {
2266 int seen_earlyclobber_at = -1;
2267 int opno;
2268 int lose = 0;
2269 funny_match_index = 0;
2270
2271 if (!recog_data.alternative_enabled_p[which_alternative])
2272 {
2273 int i;
2274
2275 for (i = 0; i < recog_data.n_operands; i++)
2276 constraints[i] = skip_alternative (constraints[i]);
2277
2278 which_alternative++;
2279 continue;
2280 }
2281
2282 for (opno = 0; opno < recog_data.n_operands; opno++)
2283 {
2284 rtx op = recog_data.operand[opno];
2285 enum machine_mode mode = GET_MODE (op);
2286 const char *p = constraints[opno];
2287 int offset = 0;
2288 int win = 0;
2289 int val;
2290 int len;
2291
2292 earlyclobber[opno] = 0;
2293
2294 /* A unary operator may be accepted by the predicate, but it
2295 is irrelevant for matching constraints. */
2296 if (UNARY_P (op))
2297 op = XEXP (op, 0);
2298
2299 if (GET_CODE (op) == SUBREG)
2300 {
2301 if (REG_P (SUBREG_REG (op))
2302 && REGNO (SUBREG_REG (op)) < FIRST_PSEUDO_REGISTER)
2303 offset = subreg_regno_offset (REGNO (SUBREG_REG (op)),
2304 GET_MODE (SUBREG_REG (op)),
2305 SUBREG_BYTE (op),
2306 GET_MODE (op));
2307 op = SUBREG_REG (op);
2308 }
2309
2310 /* An empty constraint or empty alternative
2311 allows anything which matched the pattern. */
2312 if (*p == 0 || *p == ',')
2313 win = 1;
2314
2315 do
2316 switch (c = *p, len = CONSTRAINT_LEN (c, p), c)
2317 {
2318 case '\0':
2319 len = 0;
2320 break;
2321 case ',':
2322 c = '\0';
2323 break;
2324
2325 case '?': case '!': case '*': case '%':
2326 case '=': case '+':
2327 break;
2328
2329 case '#':
2330 /* Ignore rest of this alternative as far as
2331 constraint checking is concerned. */
2332 do
2333 p++;
2334 while (*p && *p != ',');
2335 len = 0;
2336 break;
2337
2338 case '&':
2339 earlyclobber[opno] = 1;
2340 if (seen_earlyclobber_at < 0)
2341 seen_earlyclobber_at = opno;
2342 break;
2343
2344 case '0': case '1': case '2': case '3': case '4':
2345 case '5': case '6': case '7': case '8': case '9':
2346 {
2347 /* This operand must be the same as a previous one.
2348 This kind of constraint is used for instructions such
2349 as add when they take only two operands.
2350
2351 Note that the lower-numbered operand is passed first.
2352
2353 If we are not testing strictly, assume that this
2354 constraint will be satisfied. */
2355
2356 char *end;
2357 int match;
2358
2359 match = strtoul (p, &end, 10);
2360 p = end;
2361
2362 if (strict < 0)
2363 val = 1;
2364 else
2365 {
2366 rtx op1 = recog_data.operand[match];
2367 rtx op2 = recog_data.operand[opno];
2368
2369 /* A unary operator may be accepted by the predicate,
2370 but it is irrelevant for matching constraints. */
2371 if (UNARY_P (op1))
2372 op1 = XEXP (op1, 0);
2373 if (UNARY_P (op2))
2374 op2 = XEXP (op2, 0);
2375
2376 val = operands_match_p (op1, op2);
2377 }
2378
2379 matching_operands[opno] = match;
2380 matching_operands[match] = opno;
2381
2382 if (val != 0)
2383 win = 1;
2384
2385 /* If output is *x and input is *--x, arrange later
2386 to change the output to *--x as well, since the
2387 output op is the one that will be printed. */
2388 if (val == 2 && strict > 0)
2389 {
2390 funny_match[funny_match_index].this_op = opno;
2391 funny_match[funny_match_index++].other = match;
2392 }
2393 }
2394 len = 0;
2395 break;
2396
2397 case 'p':
2398 /* p is used for address_operands. When we are called by
2399 gen_reload, no one will have checked that the address is
2400 strictly valid, i.e., that all pseudos requiring hard regs
2401 have gotten them. */
2402 if (strict <= 0
2403 || (strict_memory_address_p (recog_data.operand_mode[opno],
2404 op)))
2405 win = 1;
2406 break;
2407
2408 /* No need to check general_operand again;
2409 it was done in insn-recog.c. Well, except that reload
2410 doesn't check the validity of its replacements, but
2411 that should only matter when there's a bug. */
2412 case 'g':
2413 /* Anything goes unless it is a REG and really has a hard reg
2414 but the hard reg is not in the class GENERAL_REGS. */
2415 if (REG_P (op))
2416 {
2417 if (strict < 0
2418 || GENERAL_REGS == ALL_REGS
2419 || (reload_in_progress
2420 && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2421 || reg_fits_class_p (op, GENERAL_REGS, offset, mode))
2422 win = 1;
2423 }
2424 else if (strict < 0 || general_operand (op, mode))
2425 win = 1;
2426 break;
2427
2428 case 'X':
2429 /* This is used for a MATCH_SCRATCH in the cases when
2430 we don't actually need anything. So anything goes
2431 any time. */
2432 win = 1;
2433 break;
2434
2435 case TARGET_MEM_CONSTRAINT:
2436 /* Memory operands must be valid, to the extent
2437 required by STRICT. */
2438 if (MEM_P (op))
2439 {
2440 if (strict > 0
2441 && !strict_memory_address_p (GET_MODE (op),
2442 XEXP (op, 0)))
2443 break;
2444 if (strict == 0
2445 && !memory_address_p (GET_MODE (op), XEXP (op, 0)))
2446 break;
2447 win = 1;
2448 }
2449 /* Before reload, accept what reload can turn into mem. */
2450 else if (strict < 0 && CONSTANT_P (op))
2451 win = 1;
2452 /* During reload, accept a pseudo */
2453 else if (reload_in_progress && REG_P (op)
2454 && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2455 win = 1;
2456 break;
2457
2458 case '<':
2459 if (MEM_P (op)
2460 && (GET_CODE (XEXP (op, 0)) == PRE_DEC
2461 || GET_CODE (XEXP (op, 0)) == POST_DEC))
2462 win = 1;
2463 break;
2464
2465 case '>':
2466 if (MEM_P (op)
2467 && (GET_CODE (XEXP (op, 0)) == PRE_INC
2468 || GET_CODE (XEXP (op, 0)) == POST_INC))
2469 win = 1;
2470 break;
2471
2472 case 'E':
2473 case 'F':
2474 if (GET_CODE (op) == CONST_DOUBLE
2475 || (GET_CODE (op) == CONST_VECTOR
2476 && GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_FLOAT))
2477 win = 1;
2478 break;
2479
2480 case 'G':
2481 case 'H':
2482 if (GET_CODE (op) == CONST_DOUBLE
2483 && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (op, c, p))
2484 win = 1;
2485 break;
2486
2487 case 's':
2488 if (GET_CODE (op) == CONST_INT
2489 || (GET_CODE (op) == CONST_DOUBLE
2490 && GET_MODE (op) == VOIDmode))
2491 break;
2492 case 'i':
2493 if (CONSTANT_P (op))
2494 win = 1;
2495 break;
2496
2497 case 'n':
2498 if (GET_CODE (op) == CONST_INT
2499 || (GET_CODE (op) == CONST_DOUBLE
2500 && GET_MODE (op) == VOIDmode))
2501 win = 1;
2502 break;
2503
2504 case 'I':
2505 case 'J':
2506 case 'K':
2507 case 'L':
2508 case 'M':
2509 case 'N':
2510 case 'O':
2511 case 'P':
2512 if (GET_CODE (op) == CONST_INT
2513 && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), c, p))
2514 win = 1;
2515 break;
2516
2517 case 'V':
2518 if (MEM_P (op)
2519 && ((strict > 0 && ! offsettable_memref_p (op))
2520 || (strict < 0
2521 && !(CONSTANT_P (op) || MEM_P (op)))
2522 || (reload_in_progress
2523 && !(REG_P (op)
2524 && REGNO (op) >= FIRST_PSEUDO_REGISTER))))
2525 win = 1;
2526 break;
2527
2528 case 'o':
2529 if ((strict > 0 && offsettable_memref_p (op))
2530 || (strict == 0 && offsettable_nonstrict_memref_p (op))
2531 /* Before reload, accept what reload can handle. */
2532 || (strict < 0
2533 && (CONSTANT_P (op) || MEM_P (op)))
2534 /* During reload, accept a pseudo */
2535 || (reload_in_progress && REG_P (op)
2536 && REGNO (op) >= FIRST_PSEUDO_REGISTER))
2537 win = 1;
2538 break;
2539
2540 default:
2541 {
2542 enum reg_class cl;
2543
2544 cl = (c == 'r'
2545 ? GENERAL_REGS : REG_CLASS_FROM_CONSTRAINT (c, p));
2546 if (cl != NO_REGS)
2547 {
2548 if (strict < 0
2549 || (strict == 0
2550 && REG_P (op)
2551 && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2552 || (strict == 0 && GET_CODE (op) == SCRATCH)
2553 || (REG_P (op)
2554 && reg_fits_class_p (op, cl, offset, mode)))
2555 win = 1;
2556 }
2557 #ifdef EXTRA_CONSTRAINT_STR
2558 else if (EXTRA_CONSTRAINT_STR (op, c, p))
2559 win = 1;
2560
2561 else if (EXTRA_MEMORY_CONSTRAINT (c, p)
2562 /* Every memory operand can be reloaded to fit. */
2563 && ((strict < 0 && MEM_P (op))
2564 /* Before reload, accept what reload can turn
2565 into mem. */
2566 || (strict < 0 && CONSTANT_P (op))
2567 /* During reload, accept a pseudo */
2568 || (reload_in_progress && REG_P (op)
2569 && REGNO (op) >= FIRST_PSEUDO_REGISTER)))
2570 win = 1;
2571 else if (EXTRA_ADDRESS_CONSTRAINT (c, p)
2572 /* Every address operand can be reloaded to fit. */
2573 && strict < 0)
2574 win = 1;
2575 #endif
2576 break;
2577 }
2578 }
2579 while (p += len, c);
2580
2581 constraints[opno] = p;
2582 /* If this operand did not win somehow,
2583 this alternative loses. */
2584 if (! win)
2585 lose = 1;
2586 }
2587 /* This alternative won; the operands are ok.
2588 Change whichever operands this alternative says to change. */
2589 if (! lose)
2590 {
2591 int opno, eopno;
2592
2593 /* See if any earlyclobber operand conflicts with some other
2594 operand. */
2595
2596 if (strict > 0 && seen_earlyclobber_at >= 0)
2597 for (eopno = seen_earlyclobber_at;
2598 eopno < recog_data.n_operands;
2599 eopno++)
2600 /* Ignore earlyclobber operands now in memory,
2601 because we would often report failure when we have
2602 two memory operands, one of which was formerly a REG. */
2603 if (earlyclobber[eopno]
2604 && REG_P (recog_data.operand[eopno]))
2605 for (opno = 0; opno < recog_data.n_operands; opno++)
2606 if ((MEM_P (recog_data.operand[opno])
2607 || recog_data.operand_type[opno] != OP_OUT)
2608 && opno != eopno
2609 /* Ignore things like match_operator operands. */
2610 && *recog_data.constraints[opno] != 0
2611 && ! (matching_operands[opno] == eopno
2612 && operands_match_p (recog_data.operand[opno],
2613 recog_data.operand[eopno]))
2614 && ! safe_from_earlyclobber (recog_data.operand[opno],
2615 recog_data.operand[eopno]))
2616 lose = 1;
2617
2618 if (! lose)
2619 {
2620 while (--funny_match_index >= 0)
2621 {
2622 recog_data.operand[funny_match[funny_match_index].other]
2623 = recog_data.operand[funny_match[funny_match_index].this_op];
2624 }
2625
2626 return 1;
2627 }
2628 }
2629
2630 which_alternative++;
2631 }
2632 while (which_alternative < recog_data.n_alternatives);
2633
2634 which_alternative = -1;
2635 /* If we are about to reject this, but we are not to test strictly,
2636 try a very loose test. Only return failure if it fails also. */
2637 if (strict == 0)
2638 return constrain_operands (-1);
2639 else
2640 return 0;
2641 }
2642
2643 /* Return 1 iff OPERAND (assumed to be a REG rtx)
2644 is a hard reg in class CLASS when its regno is offset by OFFSET
2645 and changed to mode MODE.
2646 If REG occupies multiple hard regs, all of them must be in CLASS. */
2647
2648 int
2649 reg_fits_class_p (rtx operand, enum reg_class cl, int offset,
2650 enum machine_mode mode)
2651 {
2652 int regno = REGNO (operand);
2653
2654 if (cl == NO_REGS)
2655 return 0;
2656
2657 return (regno < FIRST_PSEUDO_REGISTER
2658 && in_hard_reg_set_p (reg_class_contents[(int) cl],
2659 mode, regno + offset));
2660 }
2661 \f
2662 /* Split single instruction. Helper function for split_all_insns and
2663 split_all_insns_noflow. Return last insn in the sequence if successful,
2664 or NULL if unsuccessful. */
2665
2666 static rtx
2667 split_insn (rtx insn)
2668 {
2669 /* Split insns here to get max fine-grain parallelism. */
2670 rtx first = PREV_INSN (insn);
2671 rtx last = try_split (PATTERN (insn), insn, 1);
2672 rtx insn_set, last_set, note;
2673
2674 if (last == insn)
2675 return NULL_RTX;
2676
2677 /* If the original instruction was a single set that was known to be
2678 equivalent to a constant, see if we can say the same about the last
2679 instruction in the split sequence. The two instructions must set
2680 the same destination. */
2681 insn_set = single_set (insn);
2682 if (insn_set)
2683 {
2684 last_set = single_set (last);
2685 if (last_set && rtx_equal_p (SET_DEST (last_set), SET_DEST (insn_set)))
2686 {
2687 note = find_reg_equal_equiv_note (insn);
2688 if (note && CONSTANT_P (XEXP (note, 0)))
2689 set_unique_reg_note (last, REG_EQUAL, XEXP (note, 0));
2690 else if (CONSTANT_P (SET_SRC (insn_set)))
2691 set_unique_reg_note (last, REG_EQUAL, SET_SRC (insn_set));
2692 }
2693 }
2694
2695 /* try_split returns the NOTE that INSN became. */
2696 SET_INSN_DELETED (insn);
2697
2698 /* ??? Coddle to md files that generate subregs in post-reload
2699 splitters instead of computing the proper hard register. */
2700 if (reload_completed && first != last)
2701 {
2702 first = NEXT_INSN (first);
2703 for (;;)
2704 {
2705 if (INSN_P (first))
2706 cleanup_subreg_operands (first);
2707 if (first == last)
2708 break;
2709 first = NEXT_INSN (first);
2710 }
2711 }
2712
2713 return last;
2714 }
2715
2716 /* Split all insns in the function. If UPD_LIFE, update life info after. */
2717
2718 void
2719 split_all_insns (void)
2720 {
2721 sbitmap blocks;
2722 bool changed;
2723 basic_block bb;
2724
2725 blocks = sbitmap_alloc (last_basic_block);
2726 sbitmap_zero (blocks);
2727 changed = false;
2728
2729 FOR_EACH_BB_REVERSE (bb)
2730 {
2731 rtx insn, next;
2732 bool finish = false;
2733
2734 rtl_profile_for_bb (bb);
2735 for (insn = BB_HEAD (bb); !finish ; insn = next)
2736 {
2737 /* Can't use `next_real_insn' because that might go across
2738 CODE_LABELS and short-out basic blocks. */
2739 next = NEXT_INSN (insn);
2740 finish = (insn == BB_END (bb));
2741 if (INSN_P (insn))
2742 {
2743 rtx set = single_set (insn);
2744
2745 /* Don't split no-op move insns. These should silently
2746 disappear later in final. Splitting such insns would
2747 break the code that handles LIBCALL blocks. */
2748 if (set && set_noop_p (set))
2749 {
2750 /* Nops get in the way while scheduling, so delete them
2751 now if register allocation has already been done. It
2752 is too risky to try to do this before register
2753 allocation, and there are unlikely to be very many
2754 nops then anyways. */
2755 if (reload_completed)
2756 delete_insn_and_edges (insn);
2757 }
2758 else
2759 {
2760 rtx last = split_insn (insn);
2761 if (last)
2762 {
2763 /* The split sequence may include barrier, but the
2764 BB boundary we are interested in will be set to
2765 previous one. */
2766
2767 while (BARRIER_P (last))
2768 last = PREV_INSN (last);
2769 SET_BIT (blocks, bb->index);
2770 changed = true;
2771 }
2772 }
2773 }
2774 }
2775 }
2776
2777 default_rtl_profile ();
2778 if (changed)
2779 find_many_sub_basic_blocks (blocks);
2780
2781 #ifdef ENABLE_CHECKING
2782 verify_flow_info ();
2783 #endif
2784
2785 sbitmap_free (blocks);
2786 }
2787
2788 /* Same as split_all_insns, but do not expect CFG to be available.
2789 Used by machine dependent reorg passes. */
2790
2791 unsigned int
2792 split_all_insns_noflow (void)
2793 {
2794 rtx next, insn;
2795
2796 for (insn = get_insns (); insn; insn = next)
2797 {
2798 next = NEXT_INSN (insn);
2799 if (INSN_P (insn))
2800 {
2801 /* Don't split no-op move insns. These should silently
2802 disappear later in final. Splitting such insns would
2803 break the code that handles LIBCALL blocks. */
2804 rtx set = single_set (insn);
2805 if (set && set_noop_p (set))
2806 {
2807 /* Nops get in the way while scheduling, so delete them
2808 now if register allocation has already been done. It
2809 is too risky to try to do this before register
2810 allocation, and there are unlikely to be very many
2811 nops then anyways.
2812
2813 ??? Should we use delete_insn when the CFG isn't valid? */
2814 if (reload_completed)
2815 delete_insn_and_edges (insn);
2816 }
2817 else
2818 split_insn (insn);
2819 }
2820 }
2821 return 0;
2822 }
2823 \f
2824 #ifdef HAVE_peephole2
2825 struct peep2_insn_data
2826 {
2827 rtx insn;
2828 regset live_before;
2829 };
2830
2831 static struct peep2_insn_data peep2_insn_data[MAX_INSNS_PER_PEEP2 + 1];
2832 static int peep2_current;
2833 /* The number of instructions available to match a peep2. */
2834 int peep2_current_count;
2835
2836 /* A non-insn marker indicating the last insn of the block.
2837 The live_before regset for this element is correct, indicating
2838 DF_LIVE_OUT for the block. */
2839 #define PEEP2_EOB pc_rtx
2840
2841 /* Return the Nth non-note insn after `current', or return NULL_RTX if it
2842 does not exist. Used by the recognizer to find the next insn to match
2843 in a multi-insn pattern. */
2844
2845 rtx
2846 peep2_next_insn (int n)
2847 {
2848 gcc_assert (n <= peep2_current_count);
2849
2850 n += peep2_current;
2851 if (n >= MAX_INSNS_PER_PEEP2 + 1)
2852 n -= MAX_INSNS_PER_PEEP2 + 1;
2853
2854 return peep2_insn_data[n].insn;
2855 }
2856
2857 /* Return true if REGNO is dead before the Nth non-note insn
2858 after `current'. */
2859
2860 int
2861 peep2_regno_dead_p (int ofs, int regno)
2862 {
2863 gcc_assert (ofs < MAX_INSNS_PER_PEEP2 + 1);
2864
2865 ofs += peep2_current;
2866 if (ofs >= MAX_INSNS_PER_PEEP2 + 1)
2867 ofs -= MAX_INSNS_PER_PEEP2 + 1;
2868
2869 gcc_assert (peep2_insn_data[ofs].insn != NULL_RTX);
2870
2871 return ! REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno);
2872 }
2873
2874 /* Similarly for a REG. */
2875
2876 int
2877 peep2_reg_dead_p (int ofs, rtx reg)
2878 {
2879 int regno, n;
2880
2881 gcc_assert (ofs < MAX_INSNS_PER_PEEP2 + 1);
2882
2883 ofs += peep2_current;
2884 if (ofs >= MAX_INSNS_PER_PEEP2 + 1)
2885 ofs -= MAX_INSNS_PER_PEEP2 + 1;
2886
2887 gcc_assert (peep2_insn_data[ofs].insn != NULL_RTX);
2888
2889 regno = REGNO (reg);
2890 n = hard_regno_nregs[regno][GET_MODE (reg)];
2891 while (--n >= 0)
2892 if (REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno + n))
2893 return 0;
2894 return 1;
2895 }
2896
2897 /* Try to find a hard register of mode MODE, matching the register class in
2898 CLASS_STR, which is available at the beginning of insn CURRENT_INSN and
2899 remains available until the end of LAST_INSN. LAST_INSN may be NULL_RTX,
2900 in which case the only condition is that the register must be available
2901 before CURRENT_INSN.
2902 Registers that already have bits set in REG_SET will not be considered.
2903
2904 If an appropriate register is available, it will be returned and the
2905 corresponding bit(s) in REG_SET will be set; otherwise, NULL_RTX is
2906 returned. */
2907
2908 rtx
2909 peep2_find_free_register (int from, int to, const char *class_str,
2910 enum machine_mode mode, HARD_REG_SET *reg_set)
2911 {
2912 static int search_ofs;
2913 enum reg_class cl;
2914 HARD_REG_SET live;
2915 int i;
2916
2917 gcc_assert (from < MAX_INSNS_PER_PEEP2 + 1);
2918 gcc_assert (to < MAX_INSNS_PER_PEEP2 + 1);
2919
2920 from += peep2_current;
2921 if (from >= MAX_INSNS_PER_PEEP2 + 1)
2922 from -= MAX_INSNS_PER_PEEP2 + 1;
2923 to += peep2_current;
2924 if (to >= MAX_INSNS_PER_PEEP2 + 1)
2925 to -= MAX_INSNS_PER_PEEP2 + 1;
2926
2927 gcc_assert (peep2_insn_data[from].insn != NULL_RTX);
2928 REG_SET_TO_HARD_REG_SET (live, peep2_insn_data[from].live_before);
2929
2930 while (from != to)
2931 {
2932 HARD_REG_SET this_live;
2933
2934 if (++from >= MAX_INSNS_PER_PEEP2 + 1)
2935 from = 0;
2936 gcc_assert (peep2_insn_data[from].insn != NULL_RTX);
2937 REG_SET_TO_HARD_REG_SET (this_live, peep2_insn_data[from].live_before);
2938 IOR_HARD_REG_SET (live, this_live);
2939 }
2940
2941 cl = (class_str[0] == 'r' ? GENERAL_REGS
2942 : REG_CLASS_FROM_CONSTRAINT (class_str[0], class_str));
2943
2944 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2945 {
2946 int raw_regno, regno, success, j;
2947
2948 /* Distribute the free registers as much as possible. */
2949 raw_regno = search_ofs + i;
2950 if (raw_regno >= FIRST_PSEUDO_REGISTER)
2951 raw_regno -= FIRST_PSEUDO_REGISTER;
2952 #ifdef REG_ALLOC_ORDER
2953 regno = reg_alloc_order[raw_regno];
2954 #else
2955 regno = raw_regno;
2956 #endif
2957
2958 /* Don't allocate fixed registers. */
2959 if (fixed_regs[regno])
2960 continue;
2961 /* Don't allocate global registers. */
2962 if (global_regs[regno])
2963 continue;
2964 /* Make sure the register is of the right class. */
2965 if (! TEST_HARD_REG_BIT (reg_class_contents[cl], regno))
2966 continue;
2967 /* And can support the mode we need. */
2968 if (! HARD_REGNO_MODE_OK (regno, mode))
2969 continue;
2970 /* And that we don't create an extra save/restore. */
2971 if (! call_used_regs[regno] && ! df_regs_ever_live_p (regno))
2972 continue;
2973 if (! targetm.hard_regno_scratch_ok (regno))
2974 continue;
2975
2976 /* And we don't clobber traceback for noreturn functions. */
2977 if ((regno == FRAME_POINTER_REGNUM || regno == HARD_FRAME_POINTER_REGNUM)
2978 && (! reload_completed || frame_pointer_needed))
2979 continue;
2980
2981 success = 1;
2982 for (j = hard_regno_nregs[regno][mode] - 1; j >= 0; j--)
2983 {
2984 if (TEST_HARD_REG_BIT (*reg_set, regno + j)
2985 || TEST_HARD_REG_BIT (live, regno + j))
2986 {
2987 success = 0;
2988 break;
2989 }
2990 }
2991 if (success)
2992 {
2993 add_to_hard_reg_set (reg_set, mode, regno);
2994
2995 /* Start the next search with the next register. */
2996 if (++raw_regno >= FIRST_PSEUDO_REGISTER)
2997 raw_regno = 0;
2998 search_ofs = raw_regno;
2999
3000 return gen_rtx_REG (mode, regno);
3001 }
3002 }
3003
3004 search_ofs = 0;
3005 return NULL_RTX;
3006 }
3007
3008 /* Perform the peephole2 optimization pass. */
3009
3010 static void
3011 peephole2_optimize (void)
3012 {
3013 rtx insn, prev;
3014 bitmap live;
3015 int i;
3016 basic_block bb;
3017 bool do_cleanup_cfg = false;
3018 bool do_rebuild_jump_labels = false;
3019
3020 df_set_flags (DF_LR_RUN_DCE);
3021 df_analyze ();
3022
3023 /* Initialize the regsets we're going to use. */
3024 for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3025 peep2_insn_data[i].live_before = BITMAP_ALLOC (&reg_obstack);
3026 live = BITMAP_ALLOC (&reg_obstack);
3027
3028 FOR_EACH_BB_REVERSE (bb)
3029 {
3030 rtl_profile_for_bb (bb);
3031 /* Indicate that all slots except the last holds invalid data. */
3032 for (i = 0; i < MAX_INSNS_PER_PEEP2; ++i)
3033 peep2_insn_data[i].insn = NULL_RTX;
3034 peep2_current_count = 0;
3035
3036 /* Indicate that the last slot contains live_after data. */
3037 peep2_insn_data[MAX_INSNS_PER_PEEP2].insn = PEEP2_EOB;
3038 peep2_current = MAX_INSNS_PER_PEEP2;
3039
3040 /* Start up propagation. */
3041 bitmap_copy (live, DF_LR_OUT (bb));
3042 df_simulate_artificial_refs_at_end (bb, live);
3043 bitmap_copy (peep2_insn_data[MAX_INSNS_PER_PEEP2].live_before, live);
3044
3045 for (insn = BB_END (bb); ; insn = prev)
3046 {
3047 prev = PREV_INSN (insn);
3048 if (INSN_P (insn))
3049 {
3050 rtx attempt, before_try, x;
3051 int match_len;
3052 rtx note;
3053 bool was_call = false;
3054
3055 /* Record this insn. */
3056 if (--peep2_current < 0)
3057 peep2_current = MAX_INSNS_PER_PEEP2;
3058 if (peep2_current_count < MAX_INSNS_PER_PEEP2
3059 && peep2_insn_data[peep2_current].insn == NULL_RTX)
3060 peep2_current_count++;
3061 peep2_insn_data[peep2_current].insn = insn;
3062 df_simulate_one_insn (bb, insn, live);
3063 COPY_REG_SET (peep2_insn_data[peep2_current].live_before, live);
3064
3065 if (RTX_FRAME_RELATED_P (insn))
3066 {
3067 /* If an insn has RTX_FRAME_RELATED_P set, peephole
3068 substitution would lose the
3069 REG_FRAME_RELATED_EXPR that is attached. */
3070 peep2_current_count = 0;
3071 attempt = NULL;
3072 }
3073 else
3074 /* Match the peephole. */
3075 attempt = peephole2_insns (PATTERN (insn), insn, &match_len);
3076
3077 if (attempt != NULL)
3078 {
3079 /* If we are splitting a CALL_INSN, look for the CALL_INSN
3080 in SEQ and copy our CALL_INSN_FUNCTION_USAGE and other
3081 cfg-related call notes. */
3082 for (i = 0; i <= match_len; ++i)
3083 {
3084 int j;
3085 rtx old_insn, new_insn, note;
3086
3087 j = i + peep2_current;
3088 if (j >= MAX_INSNS_PER_PEEP2 + 1)
3089 j -= MAX_INSNS_PER_PEEP2 + 1;
3090 old_insn = peep2_insn_data[j].insn;
3091 if (!CALL_P (old_insn))
3092 continue;
3093 was_call = true;
3094
3095 new_insn = attempt;
3096 while (new_insn != NULL_RTX)
3097 {
3098 if (CALL_P (new_insn))
3099 break;
3100 new_insn = NEXT_INSN (new_insn);
3101 }
3102
3103 gcc_assert (new_insn != NULL_RTX);
3104
3105 CALL_INSN_FUNCTION_USAGE (new_insn)
3106 = CALL_INSN_FUNCTION_USAGE (old_insn);
3107
3108 for (note = REG_NOTES (old_insn);
3109 note;
3110 note = XEXP (note, 1))
3111 switch (REG_NOTE_KIND (note))
3112 {
3113 case REG_NORETURN:
3114 case REG_SETJMP:
3115 add_reg_note (new_insn, REG_NOTE_KIND (note),
3116 XEXP (note, 0));
3117 break;
3118 default:
3119 /* Discard all other reg notes. */
3120 break;
3121 }
3122
3123 /* Croak if there is another call in the sequence. */
3124 while (++i <= match_len)
3125 {
3126 j = i + peep2_current;
3127 if (j >= MAX_INSNS_PER_PEEP2 + 1)
3128 j -= MAX_INSNS_PER_PEEP2 + 1;
3129 old_insn = peep2_insn_data[j].insn;
3130 gcc_assert (!CALL_P (old_insn));
3131 }
3132 break;
3133 }
3134
3135 i = match_len + peep2_current;
3136 if (i >= MAX_INSNS_PER_PEEP2 + 1)
3137 i -= MAX_INSNS_PER_PEEP2 + 1;
3138
3139 note = find_reg_note (peep2_insn_data[i].insn,
3140 REG_EH_REGION, NULL_RTX);
3141
3142 /* Replace the old sequence with the new. */
3143 attempt = emit_insn_after_setloc (attempt,
3144 peep2_insn_data[i].insn,
3145 INSN_LOCATOR (peep2_insn_data[i].insn));
3146 before_try = PREV_INSN (insn);
3147 delete_insn_chain (insn, peep2_insn_data[i].insn, false);
3148
3149 /* Re-insert the EH_REGION notes. */
3150 if (note || (was_call && nonlocal_goto_handler_labels))
3151 {
3152 edge eh_edge;
3153 edge_iterator ei;
3154
3155 FOR_EACH_EDGE (eh_edge, ei, bb->succs)
3156 if (eh_edge->flags & (EDGE_EH | EDGE_ABNORMAL_CALL))
3157 break;
3158
3159 for (x = attempt ; x != before_try ; x = PREV_INSN (x))
3160 if (CALL_P (x)
3161 || (flag_non_call_exceptions
3162 && may_trap_p (PATTERN (x))
3163 && !find_reg_note (x, REG_EH_REGION, NULL)))
3164 {
3165 if (note)
3166 add_reg_note (x, REG_EH_REGION, XEXP (note, 0));
3167
3168 if (x != BB_END (bb) && eh_edge)
3169 {
3170 edge nfte, nehe;
3171 int flags;
3172
3173 nfte = split_block (bb, x);
3174 flags = (eh_edge->flags
3175 & (EDGE_EH | EDGE_ABNORMAL));
3176 if (CALL_P (x))
3177 flags |= EDGE_ABNORMAL_CALL;
3178 nehe = make_edge (nfte->src, eh_edge->dest,
3179 flags);
3180
3181 nehe->probability = eh_edge->probability;
3182 nfte->probability
3183 = REG_BR_PROB_BASE - nehe->probability;
3184
3185 do_cleanup_cfg |= purge_dead_edges (nfte->dest);
3186 bb = nfte->src;
3187 eh_edge = nehe;
3188 }
3189 }
3190
3191 /* Converting possibly trapping insn to non-trapping is
3192 possible. Zap dummy outgoing edges. */
3193 do_cleanup_cfg |= purge_dead_edges (bb);
3194 }
3195
3196 #ifdef HAVE_conditional_execution
3197 for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3198 peep2_insn_data[i].insn = NULL_RTX;
3199 peep2_insn_data[peep2_current].insn = PEEP2_EOB;
3200 peep2_current_count = 0;
3201 #else
3202 /* Back up lifetime information past the end of the
3203 newly created sequence. */
3204 if (++i >= MAX_INSNS_PER_PEEP2 + 1)
3205 i = 0;
3206 bitmap_copy (live, peep2_insn_data[i].live_before);
3207
3208 /* Update life information for the new sequence. */
3209 x = attempt;
3210 do
3211 {
3212 if (INSN_P (x))
3213 {
3214 if (--i < 0)
3215 i = MAX_INSNS_PER_PEEP2;
3216 if (peep2_current_count < MAX_INSNS_PER_PEEP2
3217 && peep2_insn_data[i].insn == NULL_RTX)
3218 peep2_current_count++;
3219 peep2_insn_data[i].insn = x;
3220 df_insn_rescan (x);
3221 df_simulate_one_insn (bb, x, live);
3222 bitmap_copy (peep2_insn_data[i].live_before, live);
3223 }
3224 x = PREV_INSN (x);
3225 }
3226 while (x != prev);
3227
3228 peep2_current = i;
3229 #endif
3230
3231 /* If we generated a jump instruction, it won't have
3232 JUMP_LABEL set. Recompute after we're done. */
3233 for (x = attempt; x != before_try; x = PREV_INSN (x))
3234 if (JUMP_P (x))
3235 {
3236 do_rebuild_jump_labels = true;
3237 break;
3238 }
3239 }
3240 }
3241
3242 if (insn == BB_HEAD (bb))
3243 break;
3244 }
3245 }
3246
3247 default_rtl_profile ();
3248 for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3249 BITMAP_FREE (peep2_insn_data[i].live_before);
3250 BITMAP_FREE (live);
3251 if (do_rebuild_jump_labels)
3252 rebuild_jump_labels (get_insns ());
3253 }
3254 #endif /* HAVE_peephole2 */
3255
3256 /* Common predicates for use with define_bypass. */
3257
3258 /* True if the dependency between OUT_INSN and IN_INSN is on the store
3259 data not the address operand(s) of the store. IN_INSN and OUT_INSN
3260 must be either a single_set or a PARALLEL with SETs inside. */
3261
3262 int
3263 store_data_bypass_p (rtx out_insn, rtx in_insn)
3264 {
3265 rtx out_set, in_set;
3266 rtx out_pat, in_pat;
3267 rtx out_exp, in_exp;
3268 int i, j;
3269
3270 in_set = single_set (in_insn);
3271 if (in_set)
3272 {
3273 if (!MEM_P (SET_DEST (in_set)))
3274 return false;
3275
3276 out_set = single_set (out_insn);
3277 if (out_set)
3278 {
3279 if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_set)))
3280 return false;
3281 }
3282 else
3283 {
3284 out_pat = PATTERN (out_insn);
3285
3286 if (GET_CODE (out_pat) != PARALLEL)
3287 return false;
3288
3289 for (i = 0; i < XVECLEN (out_pat, 0); i++)
3290 {
3291 out_exp = XVECEXP (out_pat, 0, i);
3292
3293 if (GET_CODE (out_exp) == CLOBBER)
3294 continue;
3295
3296 gcc_assert (GET_CODE (out_exp) == SET);
3297
3298 if (reg_mentioned_p (SET_DEST (out_exp), SET_DEST (in_set)))
3299 return false;
3300 }
3301 }
3302 }
3303 else
3304 {
3305 in_pat = PATTERN (in_insn);
3306 gcc_assert (GET_CODE (in_pat) == PARALLEL);
3307
3308 for (i = 0; i < XVECLEN (in_pat, 0); i++)
3309 {
3310 in_exp = XVECEXP (in_pat, 0, i);
3311
3312 if (GET_CODE (in_exp) == CLOBBER)
3313 continue;
3314
3315 gcc_assert (GET_CODE (in_exp) == SET);
3316
3317 if (!MEM_P (SET_DEST (in_exp)))
3318 return false;
3319
3320 out_set = single_set (out_insn);
3321 if (out_set)
3322 {
3323 if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_exp)))
3324 return false;
3325 }
3326 else
3327 {
3328 out_pat = PATTERN (out_insn);
3329 gcc_assert (GET_CODE (out_pat) == PARALLEL);
3330
3331 for (j = 0; j < XVECLEN (out_pat, 0); j++)
3332 {
3333 out_exp = XVECEXP (out_pat, 0, j);
3334
3335 if (GET_CODE (out_exp) == CLOBBER)
3336 continue;
3337
3338 gcc_assert (GET_CODE (out_exp) == SET);
3339
3340 if (reg_mentioned_p (SET_DEST (out_exp), SET_DEST (in_exp)))
3341 return false;
3342 }
3343 }
3344 }
3345 }
3346
3347 return true;
3348 }
3349
3350 /* True if the dependency between OUT_INSN and IN_INSN is in the IF_THEN_ELSE
3351 condition, and not the THEN or ELSE branch. OUT_INSN may be either a single
3352 or multiple set; IN_INSN should be single_set for truth, but for convenience
3353 of insn categorization may be any JUMP or CALL insn. */
3354
3355 int
3356 if_test_bypass_p (rtx out_insn, rtx in_insn)
3357 {
3358 rtx out_set, in_set;
3359
3360 in_set = single_set (in_insn);
3361 if (! in_set)
3362 {
3363 gcc_assert (JUMP_P (in_insn) || CALL_P (in_insn));
3364 return false;
3365 }
3366
3367 if (GET_CODE (SET_SRC (in_set)) != IF_THEN_ELSE)
3368 return false;
3369 in_set = SET_SRC (in_set);
3370
3371 out_set = single_set (out_insn);
3372 if (out_set)
3373 {
3374 if (reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 1))
3375 || reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 2)))
3376 return false;
3377 }
3378 else
3379 {
3380 rtx out_pat;
3381 int i;
3382
3383 out_pat = PATTERN (out_insn);
3384 gcc_assert (GET_CODE (out_pat) == PARALLEL);
3385
3386 for (i = 0; i < XVECLEN (out_pat, 0); i++)
3387 {
3388 rtx exp = XVECEXP (out_pat, 0, i);
3389
3390 if (GET_CODE (exp) == CLOBBER)
3391 continue;
3392
3393 gcc_assert (GET_CODE (exp) == SET);
3394
3395 if (reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 1))
3396 || reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 2)))
3397 return false;
3398 }
3399 }
3400
3401 return true;
3402 }
3403 \f
3404 static bool
3405 gate_handle_peephole2 (void)
3406 {
3407 return (optimize > 0 && flag_peephole2);
3408 }
3409
3410 static unsigned int
3411 rest_of_handle_peephole2 (void)
3412 {
3413 #ifdef HAVE_peephole2
3414 peephole2_optimize ();
3415 #endif
3416 return 0;
3417 }
3418
3419 struct rtl_opt_pass pass_peephole2 =
3420 {
3421 {
3422 RTL_PASS,
3423 "peephole2", /* name */
3424 gate_handle_peephole2, /* gate */
3425 rest_of_handle_peephole2, /* execute */
3426 NULL, /* sub */
3427 NULL, /* next */
3428 0, /* static_pass_number */
3429 TV_PEEPHOLE2, /* tv_id */
3430 0, /* properties_required */
3431 0, /* properties_provided */
3432 0, /* properties_destroyed */
3433 0, /* todo_flags_start */
3434 TODO_df_finish | TODO_verify_rtl_sharing |
3435 TODO_dump_func /* todo_flags_finish */
3436 }
3437 };
3438
3439 static unsigned int
3440 rest_of_handle_split_all_insns (void)
3441 {
3442 split_all_insns ();
3443 return 0;
3444 }
3445
3446 struct rtl_opt_pass pass_split_all_insns =
3447 {
3448 {
3449 RTL_PASS,
3450 "split1", /* name */
3451 NULL, /* gate */
3452 rest_of_handle_split_all_insns, /* execute */
3453 NULL, /* sub */
3454 NULL, /* next */
3455 0, /* static_pass_number */
3456 0, /* tv_id */
3457 0, /* properties_required */
3458 0, /* properties_provided */
3459 0, /* properties_destroyed */
3460 0, /* todo_flags_start */
3461 TODO_dump_func /* todo_flags_finish */
3462 }
3463 };
3464
3465 static unsigned int
3466 rest_of_handle_split_after_reload (void)
3467 {
3468 /* If optimizing, then go ahead and split insns now. */
3469 #ifndef STACK_REGS
3470 if (optimize > 0)
3471 #endif
3472 split_all_insns ();
3473 return 0;
3474 }
3475
3476 struct rtl_opt_pass pass_split_after_reload =
3477 {
3478 {
3479 RTL_PASS,
3480 "split2", /* name */
3481 NULL, /* gate */
3482 rest_of_handle_split_after_reload, /* execute */
3483 NULL, /* sub */
3484 NULL, /* next */
3485 0, /* static_pass_number */
3486 0, /* tv_id */
3487 0, /* properties_required */
3488 0, /* properties_provided */
3489 0, /* properties_destroyed */
3490 0, /* todo_flags_start */
3491 TODO_dump_func /* todo_flags_finish */
3492 }
3493 };
3494
3495 static bool
3496 gate_handle_split_before_regstack (void)
3497 {
3498 #if defined (HAVE_ATTR_length) && defined (STACK_REGS)
3499 /* If flow2 creates new instructions which need splitting
3500 and scheduling after reload is not done, they might not be
3501 split until final which doesn't allow splitting
3502 if HAVE_ATTR_length. */
3503 # ifdef INSN_SCHEDULING
3504 return (optimize && !flag_schedule_insns_after_reload);
3505 # else
3506 return (optimize);
3507 # endif
3508 #else
3509 return 0;
3510 #endif
3511 }
3512
3513 static unsigned int
3514 rest_of_handle_split_before_regstack (void)
3515 {
3516 split_all_insns ();
3517 return 0;
3518 }
3519
3520 struct rtl_opt_pass pass_split_before_regstack =
3521 {
3522 {
3523 RTL_PASS,
3524 "split3", /* name */
3525 gate_handle_split_before_regstack, /* gate */
3526 rest_of_handle_split_before_regstack, /* execute */
3527 NULL, /* sub */
3528 NULL, /* next */
3529 0, /* static_pass_number */
3530 0, /* tv_id */
3531 0, /* properties_required */
3532 0, /* properties_provided */
3533 0, /* properties_destroyed */
3534 0, /* todo_flags_start */
3535 TODO_dump_func /* todo_flags_finish */
3536 }
3537 };
3538
3539 static bool
3540 gate_handle_split_before_sched2 (void)
3541 {
3542 #ifdef INSN_SCHEDULING
3543 return optimize > 0 && flag_schedule_insns_after_reload;
3544 #else
3545 return 0;
3546 #endif
3547 }
3548
3549 static unsigned int
3550 rest_of_handle_split_before_sched2 (void)
3551 {
3552 #ifdef INSN_SCHEDULING
3553 split_all_insns ();
3554 #endif
3555 return 0;
3556 }
3557
3558 struct rtl_opt_pass pass_split_before_sched2 =
3559 {
3560 {
3561 RTL_PASS,
3562 "split4", /* name */
3563 gate_handle_split_before_sched2, /* gate */
3564 rest_of_handle_split_before_sched2, /* execute */
3565 NULL, /* sub */
3566 NULL, /* next */
3567 0, /* static_pass_number */
3568 0, /* tv_id */
3569 0, /* properties_required */
3570 0, /* properties_provided */
3571 0, /* properties_destroyed */
3572 0, /* todo_flags_start */
3573 TODO_verify_flow |
3574 TODO_dump_func /* todo_flags_finish */
3575 }
3576 };
3577
3578 /* The placement of the splitting that we do for shorten_branches
3579 depends on whether regstack is used by the target or not. */
3580 static bool
3581 gate_do_final_split (void)
3582 {
3583 #if defined (HAVE_ATTR_length) && !defined (STACK_REGS)
3584 return 1;
3585 #else
3586 return 0;
3587 #endif
3588 }
3589
3590 struct rtl_opt_pass pass_split_for_shorten_branches =
3591 {
3592 {
3593 RTL_PASS,
3594 "split5", /* name */
3595 gate_do_final_split, /* gate */
3596 split_all_insns_noflow, /* execute */
3597 NULL, /* sub */
3598 NULL, /* next */
3599 0, /* static_pass_number */
3600 0, /* tv_id */
3601 0, /* properties_required */
3602 0, /* properties_provided */
3603 0, /* properties_destroyed */
3604 0, /* todo_flags_start */
3605 TODO_dump_func | TODO_verify_rtl_sharing /* todo_flags_finish */
3606 }
3607 };
3608
3609