OSDN Git Service

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