OSDN Git Service

* system.h (strerror): Poison.
[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-error.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 "basic-block.h"
39 #include "output.h"
40 #include "reload.h"
41 #include "target.h"
42 #include "timevar.h"
43 #include "tree-pass.h"
44 #include "df.h"
45 #include "toplev.h" /* exact_log2 may be used by targets */
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     return immediate_operand (op, mode);
1162
1163   if (GET_MODE (op) != mode && mode != VOIDmode)
1164     return 0;
1165
1166   if (GET_CODE (op) == SUBREG)
1167     {
1168       /* Before reload, we can allow (SUBREG (MEM...)) as a register operand
1169          because it is guaranteed to be reloaded into one.
1170          Just make sure the MEM is valid in itself.
1171          (Ideally, (SUBREG (MEM)...) should not exist after reload,
1172          but currently it does result from (SUBREG (REG)...) where the
1173          reg went on the stack.)  */
1174       if (! reload_completed && MEM_P (SUBREG_REG (op)))
1175         return general_operand (op, mode);
1176       op = SUBREG_REG (op);
1177     }
1178
1179   /* We don't consider registers whose class is NO_REGS
1180      to be a register operand.  */
1181   return (REG_P (op)
1182           && (REGNO (op) >= FIRST_PSEUDO_REGISTER
1183               || REGNO_REG_CLASS (REGNO (op)) != NO_REGS));
1184 }
1185
1186 /* Return 1 if OP is a valid operand that stands for pushing a
1187    value of mode MODE onto the stack.
1188
1189    The main use of this function is as a predicate in match_operand
1190    expressions in the machine description.  */
1191
1192 int
1193 push_operand (rtx op, enum machine_mode mode)
1194 {
1195   unsigned int rounded_size = GET_MODE_SIZE (mode);
1196
1197 #ifdef PUSH_ROUNDING
1198   rounded_size = PUSH_ROUNDING (rounded_size);
1199 #endif
1200
1201   if (!MEM_P (op))
1202     return 0;
1203
1204   if (mode != VOIDmode && GET_MODE (op) != mode)
1205     return 0;
1206
1207   op = XEXP (op, 0);
1208
1209   if (rounded_size == GET_MODE_SIZE (mode))
1210     {
1211       if (GET_CODE (op) != STACK_PUSH_CODE)
1212         return 0;
1213     }
1214   else
1215     {
1216       if (GET_CODE (op) != PRE_MODIFY
1217           || GET_CODE (XEXP (op, 1)) != PLUS
1218           || XEXP (XEXP (op, 1), 0) != XEXP (op, 0)
1219           || !CONST_INT_P (XEXP (XEXP (op, 1), 1))
1220 #ifdef STACK_GROWS_DOWNWARD
1221           || INTVAL (XEXP (XEXP (op, 1), 1)) != - (int) rounded_size
1222 #else
1223           || INTVAL (XEXP (XEXP (op, 1), 1)) != (int) rounded_size
1224 #endif
1225           )
1226         return 0;
1227     }
1228
1229   return XEXP (op, 0) == stack_pointer_rtx;
1230 }
1231
1232 /* Return 1 if OP is a valid operand that stands for popping a
1233    value of mode MODE off the stack.
1234
1235    The main use of this function is as a predicate in match_operand
1236    expressions in the machine description.  */
1237
1238 int
1239 pop_operand (rtx op, enum machine_mode mode)
1240 {
1241   if (!MEM_P (op))
1242     return 0;
1243
1244   if (mode != VOIDmode && GET_MODE (op) != mode)
1245     return 0;
1246
1247   op = XEXP (op, 0);
1248
1249   if (GET_CODE (op) != STACK_POP_CODE)
1250     return 0;
1251
1252   return XEXP (op, 0) == stack_pointer_rtx;
1253 }
1254
1255 /* Return 1 if ADDR is a valid memory address
1256    for mode MODE in address space AS.  */
1257
1258 int
1259 memory_address_addr_space_p (enum machine_mode mode ATTRIBUTE_UNUSED,
1260                              rtx addr, addr_space_t as)
1261 {
1262 #ifdef GO_IF_LEGITIMATE_ADDRESS
1263   gcc_assert (ADDR_SPACE_GENERIC_P (as));
1264   GO_IF_LEGITIMATE_ADDRESS (mode, addr, win);
1265   return 0;
1266
1267  win:
1268   return 1;
1269 #else
1270   return targetm.addr_space.legitimate_address_p (mode, addr, 0, as);
1271 #endif
1272 }
1273
1274 /* Return 1 if OP is a valid memory reference with mode MODE,
1275    including a valid address.
1276
1277    The main use of this function is as a predicate in match_operand
1278    expressions in the machine description.  */
1279
1280 int
1281 memory_operand (rtx op, enum machine_mode mode)
1282 {
1283   rtx inner;
1284
1285   if (! reload_completed)
1286     /* Note that no SUBREG is a memory operand before end of reload pass,
1287        because (SUBREG (MEM...)) forces reloading into a register.  */
1288     return MEM_P (op) && general_operand (op, mode);
1289
1290   if (mode != VOIDmode && GET_MODE (op) != mode)
1291     return 0;
1292
1293   inner = op;
1294   if (GET_CODE (inner) == SUBREG)
1295     inner = SUBREG_REG (inner);
1296
1297   return (MEM_P (inner) && general_operand (op, mode));
1298 }
1299
1300 /* Return 1 if OP is a valid indirect memory reference with mode MODE;
1301    that is, a memory reference whose address is a general_operand.  */
1302
1303 int
1304 indirect_operand (rtx op, enum machine_mode mode)
1305 {
1306   /* Before reload, a SUBREG isn't in memory (see memory_operand, above).  */
1307   if (! reload_completed
1308       && GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op)))
1309     {
1310       int offset = SUBREG_BYTE (op);
1311       rtx inner = SUBREG_REG (op);
1312
1313       if (mode != VOIDmode && GET_MODE (op) != mode)
1314         return 0;
1315
1316       /* The only way that we can have a general_operand as the resulting
1317          address is if OFFSET is zero and the address already is an operand
1318          or if the address is (plus Y (const_int -OFFSET)) and Y is an
1319          operand.  */
1320
1321       return ((offset == 0 && general_operand (XEXP (inner, 0), Pmode))
1322               || (GET_CODE (XEXP (inner, 0)) == PLUS
1323                   && CONST_INT_P (XEXP (XEXP (inner, 0), 1))
1324                   && INTVAL (XEXP (XEXP (inner, 0), 1)) == -offset
1325                   && general_operand (XEXP (XEXP (inner, 0), 0), Pmode)));
1326     }
1327
1328   return (MEM_P (op)
1329           && memory_operand (op, mode)
1330           && general_operand (XEXP (op, 0), Pmode));
1331 }
1332
1333 /* Return 1 if this is an ordered comparison operator (not including
1334    ORDERED and UNORDERED).  */
1335
1336 int
1337 ordered_comparison_operator (rtx op, enum machine_mode mode)
1338 {
1339   if (mode != VOIDmode && GET_MODE (op) != mode)
1340     return false;
1341   switch (GET_CODE (op))
1342     {
1343     case EQ:
1344     case NE:
1345     case LT:
1346     case LTU:
1347     case LE:
1348     case LEU:
1349     case GT:
1350     case GTU:
1351     case GE:
1352     case GEU:
1353       return true;
1354     default:
1355       return false;
1356     }
1357 }
1358
1359 /* Return 1 if this is a comparison operator.  This allows the use of
1360    MATCH_OPERATOR to recognize all the branch insns.  */
1361
1362 int
1363 comparison_operator (rtx op, enum machine_mode mode)
1364 {
1365   return ((mode == VOIDmode || GET_MODE (op) == mode)
1366           && COMPARISON_P (op));
1367 }
1368 \f
1369 /* If BODY is an insn body that uses ASM_OPERANDS, return it.  */
1370
1371 rtx
1372 extract_asm_operands (rtx body)
1373 {
1374   rtx tmp;
1375   switch (GET_CODE (body))
1376     {
1377     case ASM_OPERANDS:
1378       return body;
1379
1380     case SET:
1381       /* Single output operand: BODY is (set OUTPUT (asm_operands ...)).  */
1382       tmp = SET_SRC (body);
1383       if (GET_CODE (tmp) == ASM_OPERANDS)
1384         return tmp;
1385       break;
1386
1387     case PARALLEL:
1388       tmp = XVECEXP (body, 0, 0);
1389       if (GET_CODE (tmp) == ASM_OPERANDS)
1390         return tmp;
1391       if (GET_CODE (tmp) == SET)
1392         {
1393           tmp = SET_SRC (tmp);
1394           if (GET_CODE (tmp) == ASM_OPERANDS)
1395             return tmp;
1396         }
1397       break;
1398
1399     default:
1400       break;
1401     }
1402   return NULL;
1403 }
1404
1405 /* If BODY is an insn body that uses ASM_OPERANDS,
1406    return the number of operands (both input and output) in the insn.
1407    Otherwise return -1.  */
1408
1409 int
1410 asm_noperands (const_rtx body)
1411 {
1412   rtx asm_op = extract_asm_operands (CONST_CAST_RTX (body));
1413   int n_sets = 0;
1414
1415   if (asm_op == NULL)
1416     return -1;
1417
1418   if (GET_CODE (body) == SET)
1419     n_sets = 1;
1420   else if (GET_CODE (body) == PARALLEL)
1421     {
1422       int i;
1423       if (GET_CODE (XVECEXP (body, 0, 0)) == SET)
1424         {
1425           /* Multiple output operands, or 1 output plus some clobbers:
1426              body is
1427              [(set OUTPUT (asm_operands ...))... (clobber (reg ...))...].  */
1428           /* Count backwards through CLOBBERs to determine number of SETs.  */
1429           for (i = XVECLEN (body, 0); i > 0; i--)
1430             {
1431               if (GET_CODE (XVECEXP (body, 0, i - 1)) == SET)
1432                 break;
1433               if (GET_CODE (XVECEXP (body, 0, i - 1)) != CLOBBER)
1434                 return -1;
1435             }
1436
1437           /* N_SETS is now number of output operands.  */
1438           n_sets = i;
1439
1440           /* Verify that all the SETs we have
1441              came from a single original asm_operands insn
1442              (so that invalid combinations are blocked).  */
1443           for (i = 0; i < n_sets; i++)
1444             {
1445               rtx elt = XVECEXP (body, 0, i);
1446               if (GET_CODE (elt) != SET)
1447                 return -1;
1448               if (GET_CODE (SET_SRC (elt)) != ASM_OPERANDS)
1449                 return -1;
1450               /* If these ASM_OPERANDS rtx's came from different original insns
1451                  then they aren't allowed together.  */
1452               if (ASM_OPERANDS_INPUT_VEC (SET_SRC (elt))
1453                   != ASM_OPERANDS_INPUT_VEC (asm_op))
1454                 return -1;
1455             }
1456         }
1457       else
1458         {
1459           /* 0 outputs, but some clobbers:
1460              body is [(asm_operands ...) (clobber (reg ...))...].  */
1461           /* Make sure all the other parallel things really are clobbers.  */
1462           for (i = XVECLEN (body, 0) - 1; i > 0; i--)
1463             if (GET_CODE (XVECEXP (body, 0, i)) != CLOBBER)
1464               return -1;
1465         }
1466     }
1467
1468   return (ASM_OPERANDS_INPUT_LENGTH (asm_op)
1469           + ASM_OPERANDS_LABEL_LENGTH (asm_op) + n_sets);
1470 }
1471
1472 /* Assuming BODY is an insn body that uses ASM_OPERANDS,
1473    copy its operands (both input and output) into the vector OPERANDS,
1474    the locations of the operands within the insn into the vector OPERAND_LOCS,
1475    and the constraints for the operands into CONSTRAINTS.
1476    Write the modes of the operands into MODES.
1477    Return the assembler-template.
1478
1479    If MODES, OPERAND_LOCS, CONSTRAINTS or OPERANDS is 0,
1480    we don't store that info.  */
1481
1482 const char *
1483 decode_asm_operands (rtx body, rtx *operands, rtx **operand_locs,
1484                      const char **constraints, enum machine_mode *modes,
1485                      location_t *loc)
1486 {
1487   int nbase = 0, n, i;
1488   rtx asmop;
1489
1490   switch (GET_CODE (body))
1491     {
1492     case ASM_OPERANDS:
1493       /* Zero output asm: BODY is (asm_operands ...).  */
1494       asmop = body;
1495       break;
1496
1497     case SET:
1498       /* Single output asm: BODY is (set OUTPUT (asm_operands ...)).  */
1499       asmop = SET_SRC (body);
1500
1501       /* The output is in the SET.
1502          Its constraint is in the ASM_OPERANDS itself.  */
1503       if (operands)
1504         operands[0] = SET_DEST (body);
1505       if (operand_locs)
1506         operand_locs[0] = &SET_DEST (body);
1507       if (constraints)
1508         constraints[0] = ASM_OPERANDS_OUTPUT_CONSTRAINT (asmop);
1509       if (modes)
1510         modes[0] = GET_MODE (SET_DEST (body));
1511       nbase = 1;
1512       break;
1513
1514     case PARALLEL:
1515       {
1516         int nparallel = XVECLEN (body, 0); /* Includes CLOBBERs.  */
1517
1518         asmop = XVECEXP (body, 0, 0);
1519         if (GET_CODE (asmop) == SET)
1520           {
1521             asmop = SET_SRC (asmop);
1522
1523             /* At least one output, plus some CLOBBERs.  The outputs are in
1524                the SETs.  Their constraints are in the ASM_OPERANDS itself.  */
1525             for (i = 0; i < nparallel; i++)
1526               {
1527                 if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
1528                   break;                /* Past last SET */
1529                 if (operands)
1530                   operands[i] = SET_DEST (XVECEXP (body, 0, i));
1531                 if (operand_locs)
1532                   operand_locs[i] = &SET_DEST (XVECEXP (body, 0, i));
1533                 if (constraints)
1534                   constraints[i] = XSTR (SET_SRC (XVECEXP (body, 0, i)), 1);
1535                 if (modes)
1536                   modes[i] = GET_MODE (SET_DEST (XVECEXP (body, 0, i)));
1537               }
1538             nbase = i;
1539           }
1540         break;
1541       }
1542
1543     default:
1544       gcc_unreachable ();
1545     }
1546
1547   n = ASM_OPERANDS_INPUT_LENGTH (asmop);
1548   for (i = 0; i < n; i++)
1549     {
1550       if (operand_locs)
1551         operand_locs[nbase + i] = &ASM_OPERANDS_INPUT (asmop, i);
1552       if (operands)
1553         operands[nbase + i] = ASM_OPERANDS_INPUT (asmop, i);
1554       if (constraints)
1555         constraints[nbase + i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1556       if (modes)
1557         modes[nbase + i] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1558     }
1559   nbase += n;
1560
1561   n = ASM_OPERANDS_LABEL_LENGTH (asmop);
1562   for (i = 0; i < n; i++)
1563     {
1564       if (operand_locs)
1565         operand_locs[nbase + i] = &ASM_OPERANDS_LABEL (asmop, i);
1566       if (operands)
1567         operands[nbase + i] = ASM_OPERANDS_LABEL (asmop, i);
1568       if (constraints)
1569         constraints[nbase + i] = "";
1570       if (modes)
1571         modes[nbase + i] = Pmode;
1572     }
1573
1574   if (loc)
1575     *loc = ASM_OPERANDS_SOURCE_LOCATION (asmop);
1576
1577   return ASM_OPERANDS_TEMPLATE (asmop);
1578 }
1579
1580 /* Check if an asm_operand matches its constraints.
1581    Return > 0 if ok, = 0 if bad, < 0 if inconclusive.  */
1582
1583 int
1584 asm_operand_ok (rtx op, const char *constraint, const char **constraints)
1585 {
1586   int result = 0;
1587 #ifdef AUTO_INC_DEC
1588   bool incdec_ok = false;
1589 #endif
1590
1591   /* Use constrain_operands after reload.  */
1592   gcc_assert (!reload_completed);
1593
1594   /* Empty constraint string is the same as "X,...,X", i.e. X for as
1595      many alternatives as required to match the other operands.  */
1596   if (*constraint == '\0')
1597     result = 1;
1598
1599   while (*constraint)
1600     {
1601       char c = *constraint;
1602       int len;
1603       switch (c)
1604         {
1605         case ',':
1606           constraint++;
1607           continue;
1608         case '=':
1609         case '+':
1610         case '*':
1611         case '%':
1612         case '!':
1613         case '#':
1614         case '&':
1615         case '?':
1616           break;
1617
1618         case '0': case '1': case '2': case '3': case '4':
1619         case '5': case '6': case '7': case '8': case '9':
1620           /* If caller provided constraints pointer, look up
1621              the maching constraint.  Otherwise, our caller should have
1622              given us the proper matching constraint, but we can't
1623              actually fail the check if they didn't.  Indicate that
1624              results are inconclusive.  */
1625           if (constraints)
1626             {
1627               char *end;
1628               unsigned long match;
1629
1630               match = strtoul (constraint, &end, 10);
1631               if (!result)
1632                 result = asm_operand_ok (op, constraints[match], NULL);
1633               constraint = (const char *) end;
1634             }
1635           else
1636             {
1637               do
1638                 constraint++;
1639               while (ISDIGIT (*constraint));
1640               if (! result)
1641                 result = -1;
1642             }
1643           continue;
1644
1645         case 'p':
1646           if (address_operand (op, VOIDmode))
1647             result = 1;
1648           break;
1649
1650         case TARGET_MEM_CONSTRAINT:
1651         case 'V': /* non-offsettable */
1652           if (memory_operand (op, VOIDmode))
1653             result = 1;
1654           break;
1655
1656         case 'o': /* offsettable */
1657           if (offsettable_nonstrict_memref_p (op))
1658             result = 1;
1659           break;
1660
1661         case '<':
1662           /* ??? Before auto-inc-dec, auto inc/dec insns are not supposed to exist,
1663              excepting those that expand_call created.  Further, on some
1664              machines which do not have generalized auto inc/dec, an inc/dec
1665              is not a memory_operand.
1666
1667              Match any memory and hope things are resolved after reload.  */
1668
1669           if (MEM_P (op)
1670               && (1
1671                   || GET_CODE (XEXP (op, 0)) == PRE_DEC
1672                   || GET_CODE (XEXP (op, 0)) == POST_DEC))
1673             result = 1;
1674 #ifdef AUTO_INC_DEC
1675           incdec_ok = true;
1676 #endif
1677           break;
1678
1679         case '>':
1680           if (MEM_P (op)
1681               && (1
1682                   || GET_CODE (XEXP (op, 0)) == PRE_INC
1683                   || GET_CODE (XEXP (op, 0)) == POST_INC))
1684             result = 1;
1685 #ifdef AUTO_INC_DEC
1686           incdec_ok = true;
1687 #endif
1688           break;
1689
1690         case 'E':
1691         case 'F':
1692           if (GET_CODE (op) == CONST_DOUBLE
1693               || (GET_CODE (op) == CONST_VECTOR
1694                   && GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_FLOAT))
1695             result = 1;
1696           break;
1697
1698         case 'G':
1699           if (GET_CODE (op) == CONST_DOUBLE
1700               && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (op, 'G', constraint))
1701             result = 1;
1702           break;
1703         case 'H':
1704           if (GET_CODE (op) == CONST_DOUBLE
1705               && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (op, 'H', constraint))
1706             result = 1;
1707           break;
1708
1709         case 's':
1710           if (CONST_INT_P (op)
1711               || (GET_CODE (op) == CONST_DOUBLE
1712                   && GET_MODE (op) == VOIDmode))
1713             break;
1714           /* Fall through.  */
1715
1716         case 'i':
1717           if (CONSTANT_P (op) && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op)))
1718             result = 1;
1719           break;
1720
1721         case 'n':
1722           if (CONST_INT_P (op)
1723               || (GET_CODE (op) == CONST_DOUBLE
1724                   && GET_MODE (op) == VOIDmode))
1725             result = 1;
1726           break;
1727
1728         case 'I':
1729           if (CONST_INT_P (op)
1730               && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'I', constraint))
1731             result = 1;
1732           break;
1733         case 'J':
1734           if (CONST_INT_P (op)
1735               && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'J', constraint))
1736             result = 1;
1737           break;
1738         case 'K':
1739           if (CONST_INT_P (op)
1740               && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'K', constraint))
1741             result = 1;
1742           break;
1743         case 'L':
1744           if (CONST_INT_P (op)
1745               && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'L', constraint))
1746             result = 1;
1747           break;
1748         case 'M':
1749           if (CONST_INT_P (op)
1750               && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'M', constraint))
1751             result = 1;
1752           break;
1753         case 'N':
1754           if (CONST_INT_P (op)
1755               && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'N', constraint))
1756             result = 1;
1757           break;
1758         case 'O':
1759           if (CONST_INT_P (op)
1760               && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'O', constraint))
1761             result = 1;
1762           break;
1763         case 'P':
1764           if (CONST_INT_P (op)
1765               && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), 'P', constraint))
1766             result = 1;
1767           break;
1768
1769         case 'X':
1770           result = 1;
1771           break;
1772
1773         case 'g':
1774           if (general_operand (op, VOIDmode))
1775             result = 1;
1776           break;
1777
1778         default:
1779           /* For all other letters, we first check for a register class,
1780              otherwise it is an EXTRA_CONSTRAINT.  */
1781           if (REG_CLASS_FROM_CONSTRAINT (c, constraint) != NO_REGS)
1782             {
1783             case 'r':
1784               if (GET_MODE (op) == BLKmode)
1785                 break;
1786               if (register_operand (op, VOIDmode))
1787                 result = 1;
1788             }
1789 #ifdef EXTRA_CONSTRAINT_STR
1790           else if (EXTRA_MEMORY_CONSTRAINT (c, constraint))
1791             /* Every memory operand can be reloaded to fit.  */
1792             result = result || memory_operand (op, VOIDmode);
1793           else if (EXTRA_ADDRESS_CONSTRAINT (c, constraint))
1794             /* Every address operand can be reloaded to fit.  */
1795             result = result || address_operand (op, VOIDmode);
1796           else if (EXTRA_CONSTRAINT_STR (op, c, constraint))
1797             result = 1;
1798 #endif
1799           break;
1800         }
1801       len = CONSTRAINT_LEN (c, constraint);
1802       do
1803         constraint++;
1804       while (--len && *constraint);
1805       if (len)
1806         return 0;
1807     }
1808
1809 #ifdef AUTO_INC_DEC
1810   /* For operands without < or > constraints reject side-effects.  */
1811   if (!incdec_ok && result && MEM_P (op))
1812     switch (GET_CODE (XEXP (op, 0)))
1813       {
1814       case PRE_INC:
1815       case POST_INC:
1816       case PRE_DEC:
1817       case POST_DEC:
1818       case PRE_MODIFY:
1819       case POST_MODIFY:
1820         return 0;
1821       default:
1822         break;
1823       }
1824 #endif
1825
1826   return result;
1827 }
1828 \f
1829 /* Given an rtx *P, if it is a sum containing an integer constant term,
1830    return the location (type rtx *) of the pointer to that constant term.
1831    Otherwise, return a null pointer.  */
1832
1833 rtx *
1834 find_constant_term_loc (rtx *p)
1835 {
1836   rtx *tem;
1837   enum rtx_code code = GET_CODE (*p);
1838
1839   /* If *P IS such a constant term, P is its location.  */
1840
1841   if (code == CONST_INT || code == SYMBOL_REF || code == LABEL_REF
1842       || code == CONST)
1843     return p;
1844
1845   /* Otherwise, if not a sum, it has no constant term.  */
1846
1847   if (GET_CODE (*p) != PLUS)
1848     return 0;
1849
1850   /* If one of the summands is constant, return its location.  */
1851
1852   if (XEXP (*p, 0) && CONSTANT_P (XEXP (*p, 0))
1853       && XEXP (*p, 1) && CONSTANT_P (XEXP (*p, 1)))
1854     return p;
1855
1856   /* Otherwise, check each summand for containing a constant term.  */
1857
1858   if (XEXP (*p, 0) != 0)
1859     {
1860       tem = find_constant_term_loc (&XEXP (*p, 0));
1861       if (tem != 0)
1862         return tem;
1863     }
1864
1865   if (XEXP (*p, 1) != 0)
1866     {
1867       tem = find_constant_term_loc (&XEXP (*p, 1));
1868       if (tem != 0)
1869         return tem;
1870     }
1871
1872   return 0;
1873 }
1874 \f
1875 /* Return 1 if OP is a memory reference
1876    whose address contains no side effects
1877    and remains valid after the addition
1878    of a positive integer less than the
1879    size of the object being referenced.
1880
1881    We assume that the original address is valid and do not check it.
1882
1883    This uses strict_memory_address_p as a subroutine, so
1884    don't use it before reload.  */
1885
1886 int
1887 offsettable_memref_p (rtx op)
1888 {
1889   return ((MEM_P (op))
1890           && offsettable_address_addr_space_p (1, GET_MODE (op), XEXP (op, 0),
1891                                                MEM_ADDR_SPACE (op)));
1892 }
1893
1894 /* Similar, but don't require a strictly valid mem ref:
1895    consider pseudo-regs valid as index or base regs.  */
1896
1897 int
1898 offsettable_nonstrict_memref_p (rtx op)
1899 {
1900   return ((MEM_P (op))
1901           && offsettable_address_addr_space_p (0, GET_MODE (op), XEXP (op, 0),
1902                                                MEM_ADDR_SPACE (op)));
1903 }
1904
1905 /* Return 1 if Y is a memory address which contains no side effects
1906    and would remain valid for address space AS after the addition of
1907    a positive integer less than the size of that mode.
1908
1909    We assume that the original address is valid and do not check it.
1910    We do check that it is valid for narrower modes.
1911
1912    If STRICTP is nonzero, we require a strictly valid address,
1913    for the sake of use in reload.c.  */
1914
1915 int
1916 offsettable_address_addr_space_p (int strictp, enum machine_mode mode, rtx y,
1917                                   addr_space_t as)
1918 {
1919   enum rtx_code ycode = GET_CODE (y);
1920   rtx z;
1921   rtx y1 = y;
1922   rtx *y2;
1923   int (*addressp) (enum machine_mode, rtx, addr_space_t) =
1924     (strictp ? strict_memory_address_addr_space_p
1925              : memory_address_addr_space_p);
1926   unsigned int mode_sz = GET_MODE_SIZE (mode);
1927
1928   if (CONSTANT_ADDRESS_P (y))
1929     return 1;
1930
1931   /* Adjusting an offsettable address involves changing to a narrower mode.
1932      Make sure that's OK.  */
1933
1934   if (mode_dependent_address_p (y))
1935     return 0;
1936
1937   /* ??? How much offset does an offsettable BLKmode reference need?
1938      Clearly that depends on the situation in which it's being used.
1939      However, the current situation in which we test 0xffffffff is
1940      less than ideal.  Caveat user.  */
1941   if (mode_sz == 0)
1942     mode_sz = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
1943
1944   /* If the expression contains a constant term,
1945      see if it remains valid when max possible offset is added.  */
1946
1947   if ((ycode == PLUS) && (y2 = find_constant_term_loc (&y1)))
1948     {
1949       int good;
1950
1951       y1 = *y2;
1952       *y2 = plus_constant (*y2, mode_sz - 1);
1953       /* Use QImode because an odd displacement may be automatically invalid
1954          for any wider mode.  But it should be valid for a single byte.  */
1955       good = (*addressp) (QImode, y, as);
1956
1957       /* In any case, restore old contents of memory.  */
1958       *y2 = y1;
1959       return good;
1960     }
1961
1962   if (GET_RTX_CLASS (ycode) == RTX_AUTOINC)
1963     return 0;
1964
1965   /* The offset added here is chosen as the maximum offset that
1966      any instruction could need to add when operating on something
1967      of the specified mode.  We assume that if Y and Y+c are
1968      valid addresses then so is Y+d for all 0<d<c.  adjust_address will
1969      go inside a LO_SUM here, so we do so as well.  */
1970   if (GET_CODE (y) == LO_SUM
1971       && mode != BLKmode
1972       && mode_sz <= GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT)
1973     z = gen_rtx_LO_SUM (GET_MODE (y), XEXP (y, 0),
1974                         plus_constant (XEXP (y, 1), mode_sz - 1));
1975   else
1976     z = plus_constant (y, mode_sz - 1);
1977
1978   /* Use QImode because an odd displacement may be automatically invalid
1979      for any wider mode.  But it should be valid for a single byte.  */
1980   return (*addressp) (QImode, z, as);
1981 }
1982
1983 /* Return 1 if ADDR is an address-expression whose effect depends
1984    on the mode of the memory reference it is used in.
1985
1986    Autoincrement addressing is a typical example of mode-dependence
1987    because the amount of the increment depends on the mode.  */
1988
1989 bool
1990 mode_dependent_address_p (rtx addr)
1991 {
1992   /* Auto-increment addressing with anything other than post_modify
1993      or pre_modify always introduces a mode dependency.  Catch such
1994      cases now instead of deferring to the target.  */
1995   if (GET_CODE (addr) == PRE_INC
1996       || GET_CODE (addr) == POST_INC
1997       || GET_CODE (addr) == PRE_DEC
1998       || GET_CODE (addr) == POST_DEC)
1999     return true;
2000
2001   return targetm.mode_dependent_address_p (addr);
2002 }
2003 \f
2004 /* Like extract_insn, but save insn extracted and don't extract again, when
2005    called again for the same insn expecting that recog_data still contain the
2006    valid information.  This is used primary by gen_attr infrastructure that
2007    often does extract insn again and again.  */
2008 void
2009 extract_insn_cached (rtx insn)
2010 {
2011   if (recog_data.insn == insn && INSN_CODE (insn) >= 0)
2012     return;
2013   extract_insn (insn);
2014   recog_data.insn = insn;
2015 }
2016
2017 /* Do cached extract_insn, constrain_operands and complain about failures.
2018    Used by insn_attrtab.  */
2019 void
2020 extract_constrain_insn_cached (rtx insn)
2021 {
2022   extract_insn_cached (insn);
2023   if (which_alternative == -1
2024       && !constrain_operands (reload_completed))
2025     fatal_insn_not_found (insn);
2026 }
2027
2028 /* Do cached constrain_operands and complain about failures.  */
2029 int
2030 constrain_operands_cached (int strict)
2031 {
2032   if (which_alternative == -1)
2033     return constrain_operands (strict);
2034   else
2035     return 1;
2036 }
2037 \f
2038 /* Analyze INSN and fill in recog_data.  */
2039
2040 void
2041 extract_insn (rtx insn)
2042 {
2043   int i;
2044   int icode;
2045   int noperands;
2046   rtx body = PATTERN (insn);
2047
2048   recog_data.n_operands = 0;
2049   recog_data.n_alternatives = 0;
2050   recog_data.n_dups = 0;
2051   recog_data.is_asm = false;
2052
2053   switch (GET_CODE (body))
2054     {
2055     case USE:
2056     case CLOBBER:
2057     case ASM_INPUT:
2058     case ADDR_VEC:
2059     case ADDR_DIFF_VEC:
2060     case VAR_LOCATION:
2061       return;
2062
2063     case SET:
2064       if (GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
2065         goto asm_insn;
2066       else
2067         goto normal_insn;
2068     case PARALLEL:
2069       if ((GET_CODE (XVECEXP (body, 0, 0)) == SET
2070            && GET_CODE (SET_SRC (XVECEXP (body, 0, 0))) == ASM_OPERANDS)
2071           || GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
2072         goto asm_insn;
2073       else
2074         goto normal_insn;
2075     case ASM_OPERANDS:
2076     asm_insn:
2077       recog_data.n_operands = noperands = asm_noperands (body);
2078       if (noperands >= 0)
2079         {
2080           /* This insn is an `asm' with operands.  */
2081
2082           /* expand_asm_operands makes sure there aren't too many operands.  */
2083           gcc_assert (noperands <= MAX_RECOG_OPERANDS);
2084
2085           /* Now get the operand values and constraints out of the insn.  */
2086           decode_asm_operands (body, recog_data.operand,
2087                                recog_data.operand_loc,
2088                                recog_data.constraints,
2089                                recog_data.operand_mode, NULL);
2090           memset (recog_data.is_operator, 0, sizeof recog_data.is_operator);
2091           if (noperands > 0)
2092             {
2093               const char *p =  recog_data.constraints[0];
2094               recog_data.n_alternatives = 1;
2095               while (*p)
2096                 recog_data.n_alternatives += (*p++ == ',');
2097             }
2098           recog_data.is_asm = true;
2099           break;
2100         }
2101       fatal_insn_not_found (insn);
2102
2103     default:
2104     normal_insn:
2105       /* Ordinary insn: recognize it, get the operands via insn_extract
2106          and get the constraints.  */
2107
2108       icode = recog_memoized (insn);
2109       if (icode < 0)
2110         fatal_insn_not_found (insn);
2111
2112       recog_data.n_operands = noperands = insn_data[icode].n_operands;
2113       recog_data.n_alternatives = insn_data[icode].n_alternatives;
2114       recog_data.n_dups = insn_data[icode].n_dups;
2115
2116       insn_extract (insn);
2117
2118       for (i = 0; i < noperands; i++)
2119         {
2120           recog_data.constraints[i] = insn_data[icode].operand[i].constraint;
2121           recog_data.is_operator[i] = insn_data[icode].operand[i].is_operator;
2122           recog_data.operand_mode[i] = insn_data[icode].operand[i].mode;
2123           /* VOIDmode match_operands gets mode from their real operand.  */
2124           if (recog_data.operand_mode[i] == VOIDmode)
2125             recog_data.operand_mode[i] = GET_MODE (recog_data.operand[i]);
2126         }
2127     }
2128   for (i = 0; i < noperands; i++)
2129     recog_data.operand_type[i]
2130       = (recog_data.constraints[i][0] == '=' ? OP_OUT
2131          : recog_data.constraints[i][0] == '+' ? OP_INOUT
2132          : OP_IN);
2133
2134   gcc_assert (recog_data.n_alternatives <= MAX_RECOG_ALTERNATIVES);
2135
2136   if (INSN_CODE (insn) < 0)
2137     for (i = 0; i < recog_data.n_alternatives; i++)
2138       recog_data.alternative_enabled_p[i] = true;
2139   else
2140     {
2141       recog_data.insn = insn;
2142       for (i = 0; i < recog_data.n_alternatives; i++)
2143         {
2144           which_alternative = i;
2145           recog_data.alternative_enabled_p[i] = get_attr_enabled (insn);
2146         }
2147     }
2148
2149   recog_data.insn = NULL;
2150   which_alternative = -1;
2151 }
2152
2153 /* After calling extract_insn, you can use this function to extract some
2154    information from the constraint strings into a more usable form.
2155    The collected data is stored in recog_op_alt.  */
2156 void
2157 preprocess_constraints (void)
2158 {
2159   int i;
2160
2161   for (i = 0; i < recog_data.n_operands; i++)
2162     memset (recog_op_alt[i], 0, (recog_data.n_alternatives
2163                                  * sizeof (struct operand_alternative)));
2164
2165   for (i = 0; i < recog_data.n_operands; i++)
2166     {
2167       int j;
2168       struct operand_alternative *op_alt;
2169       const char *p = recog_data.constraints[i];
2170
2171       op_alt = recog_op_alt[i];
2172
2173       for (j = 0; j < recog_data.n_alternatives; j++)
2174         {
2175           op_alt[j].cl = NO_REGS;
2176           op_alt[j].constraint = p;
2177           op_alt[j].matches = -1;
2178           op_alt[j].matched = -1;
2179
2180           if (!recog_data.alternative_enabled_p[j])
2181             {
2182               p = skip_alternative (p);
2183               continue;
2184             }
2185
2186           if (*p == '\0' || *p == ',')
2187             {
2188               op_alt[j].anything_ok = 1;
2189               continue;
2190             }
2191
2192           for (;;)
2193             {
2194               char c = *p;
2195               if (c == '#')
2196                 do
2197                   c = *++p;
2198                 while (c != ',' && c != '\0');
2199               if (c == ',' || c == '\0')
2200                 {
2201                   p++;
2202                   break;
2203                 }
2204
2205               switch (c)
2206                 {
2207                 case '=': case '+': case '*': case '%':
2208                 case 'E': case 'F': case 'G': case 'H':
2209                 case 's': case 'i': case 'n':
2210                 case 'I': case 'J': case 'K': case 'L':
2211                 case 'M': case 'N': case 'O': case 'P':
2212                   /* These don't say anything we care about.  */
2213                   break;
2214
2215                 case '?':
2216                   op_alt[j].reject += 6;
2217                   break;
2218                 case '!':
2219                   op_alt[j].reject += 600;
2220                   break;
2221                 case '&':
2222                   op_alt[j].earlyclobber = 1;
2223                   break;
2224
2225                 case '0': case '1': case '2': case '3': case '4':
2226                 case '5': case '6': case '7': case '8': case '9':
2227                   {
2228                     char *end;
2229                     op_alt[j].matches = strtoul (p, &end, 10);
2230                     recog_op_alt[op_alt[j].matches][j].matched = i;
2231                     p = end;
2232                   }
2233                   continue;
2234
2235                 case TARGET_MEM_CONSTRAINT:
2236                   op_alt[j].memory_ok = 1;
2237                   break;
2238                 case '<':
2239                   op_alt[j].decmem_ok = 1;
2240                   break;
2241                 case '>':
2242                   op_alt[j].incmem_ok = 1;
2243                   break;
2244                 case 'V':
2245                   op_alt[j].nonoffmem_ok = 1;
2246                   break;
2247                 case 'o':
2248                   op_alt[j].offmem_ok = 1;
2249                   break;
2250                 case 'X':
2251                   op_alt[j].anything_ok = 1;
2252                   break;
2253
2254                 case 'p':
2255                   op_alt[j].is_address = 1;
2256                   op_alt[j].cl = reg_class_subunion[(int) op_alt[j].cl]
2257                       [(int) base_reg_class (VOIDmode, ADDRESS, SCRATCH)];
2258                   break;
2259
2260                 case 'g':
2261                 case 'r':
2262                   op_alt[j].cl =
2263                    reg_class_subunion[(int) op_alt[j].cl][(int) GENERAL_REGS];
2264                   break;
2265
2266                 default:
2267                   if (EXTRA_MEMORY_CONSTRAINT (c, p))
2268                     {
2269                       op_alt[j].memory_ok = 1;
2270                       break;
2271                     }
2272                   if (EXTRA_ADDRESS_CONSTRAINT (c, p))
2273                     {
2274                       op_alt[j].is_address = 1;
2275                       op_alt[j].cl
2276                         = (reg_class_subunion
2277                            [(int) op_alt[j].cl]
2278                            [(int) base_reg_class (VOIDmode, ADDRESS,
2279                                                   SCRATCH)]);
2280                       break;
2281                     }
2282
2283                   op_alt[j].cl
2284                     = (reg_class_subunion
2285                        [(int) op_alt[j].cl]
2286                        [(int) REG_CLASS_FROM_CONSTRAINT ((unsigned char) c, p)]);
2287                   break;
2288                 }
2289               p += CONSTRAINT_LEN (c, p);
2290             }
2291         }
2292     }
2293 }
2294
2295 /* Check the operands of an insn against the insn's operand constraints
2296    and return 1 if they are valid.
2297    The information about the insn's operands, constraints, operand modes
2298    etc. is obtained from the global variables set up by extract_insn.
2299
2300    WHICH_ALTERNATIVE is set to a number which indicates which
2301    alternative of constraints was matched: 0 for the first alternative,
2302    1 for the next, etc.
2303
2304    In addition, when two operands are required to match
2305    and it happens that the output operand is (reg) while the
2306    input operand is --(reg) or ++(reg) (a pre-inc or pre-dec),
2307    make the output operand look like the input.
2308    This is because the output operand is the one the template will print.
2309
2310    This is used in final, just before printing the assembler code and by
2311    the routines that determine an insn's attribute.
2312
2313    If STRICT is a positive nonzero value, it means that we have been
2314    called after reload has been completed.  In that case, we must
2315    do all checks strictly.  If it is zero, it means that we have been called
2316    before reload has completed.  In that case, we first try to see if we can
2317    find an alternative that matches strictly.  If not, we try again, this
2318    time assuming that reload will fix up the insn.  This provides a "best
2319    guess" for the alternative and is used to compute attributes of insns prior
2320    to reload.  A negative value of STRICT is used for this internal call.  */
2321
2322 struct funny_match
2323 {
2324   int this_op, other;
2325 };
2326
2327 int
2328 constrain_operands (int strict)
2329 {
2330   const char *constraints[MAX_RECOG_OPERANDS];
2331   int matching_operands[MAX_RECOG_OPERANDS];
2332   int earlyclobber[MAX_RECOG_OPERANDS];
2333   int c;
2334
2335   struct funny_match funny_match[MAX_RECOG_OPERANDS];
2336   int funny_match_index;
2337
2338   which_alternative = 0;
2339   if (recog_data.n_operands == 0 || recog_data.n_alternatives == 0)
2340     return 1;
2341
2342   for (c = 0; c < recog_data.n_operands; c++)
2343     {
2344       constraints[c] = recog_data.constraints[c];
2345       matching_operands[c] = -1;
2346     }
2347
2348   do
2349     {
2350       int seen_earlyclobber_at = -1;
2351       int opno;
2352       int lose = 0;
2353       funny_match_index = 0;
2354
2355       if (!recog_data.alternative_enabled_p[which_alternative])
2356         {
2357           int i;
2358
2359           for (i = 0; i < recog_data.n_operands; i++)
2360             constraints[i] = skip_alternative (constraints[i]);
2361
2362           which_alternative++;
2363           continue;
2364         }
2365
2366       for (opno = 0; opno < recog_data.n_operands; opno++)
2367         {
2368           rtx op = recog_data.operand[opno];
2369           enum machine_mode mode = GET_MODE (op);
2370           const char *p = constraints[opno];
2371           int offset = 0;
2372           int win = 0;
2373           int val;
2374           int len;
2375
2376           earlyclobber[opno] = 0;
2377
2378           /* A unary operator may be accepted by the predicate, but it
2379              is irrelevant for matching constraints.  */
2380           if (UNARY_P (op))
2381             op = XEXP (op, 0);
2382
2383           if (GET_CODE (op) == SUBREG)
2384             {
2385               if (REG_P (SUBREG_REG (op))
2386                   && REGNO (SUBREG_REG (op)) < FIRST_PSEUDO_REGISTER)
2387                 offset = subreg_regno_offset (REGNO (SUBREG_REG (op)),
2388                                               GET_MODE (SUBREG_REG (op)),
2389                                               SUBREG_BYTE (op),
2390                                               GET_MODE (op));
2391               op = SUBREG_REG (op);
2392             }
2393
2394           /* An empty constraint or empty alternative
2395              allows anything which matched the pattern.  */
2396           if (*p == 0 || *p == ',')
2397             win = 1;
2398
2399           do
2400             switch (c = *p, len = CONSTRAINT_LEN (c, p), c)
2401               {
2402               case '\0':
2403                 len = 0;
2404                 break;
2405               case ',':
2406                 c = '\0';
2407                 break;
2408
2409               case '?':  case '!': case '*':  case '%':
2410               case '=':  case '+':
2411                 break;
2412
2413               case '#':
2414                 /* Ignore rest of this alternative as far as
2415                    constraint checking is concerned.  */
2416                 do
2417                   p++;
2418                 while (*p && *p != ',');
2419                 len = 0;
2420                 break;
2421
2422               case '&':
2423                 earlyclobber[opno] = 1;
2424                 if (seen_earlyclobber_at < 0)
2425                   seen_earlyclobber_at = opno;
2426                 break;
2427
2428               case '0':  case '1':  case '2':  case '3':  case '4':
2429               case '5':  case '6':  case '7':  case '8':  case '9':
2430                 {
2431                   /* This operand must be the same as a previous one.
2432                      This kind of constraint is used for instructions such
2433                      as add when they take only two operands.
2434
2435                      Note that the lower-numbered operand is passed first.
2436
2437                      If we are not testing strictly, assume that this
2438                      constraint will be satisfied.  */
2439
2440                   char *end;
2441                   int match;
2442
2443                   match = strtoul (p, &end, 10);
2444                   p = end;
2445
2446                   if (strict < 0)
2447                     val = 1;
2448                   else
2449                     {
2450                       rtx op1 = recog_data.operand[match];
2451                       rtx op2 = recog_data.operand[opno];
2452
2453                       /* A unary operator may be accepted by the predicate,
2454                          but it is irrelevant for matching constraints.  */
2455                       if (UNARY_P (op1))
2456                         op1 = XEXP (op1, 0);
2457                       if (UNARY_P (op2))
2458                         op2 = XEXP (op2, 0);
2459
2460                       val = operands_match_p (op1, op2);
2461                     }
2462
2463                   matching_operands[opno] = match;
2464                   matching_operands[match] = opno;
2465
2466                   if (val != 0)
2467                     win = 1;
2468
2469                   /* If output is *x and input is *--x, arrange later
2470                      to change the output to *--x as well, since the
2471                      output op is the one that will be printed.  */
2472                   if (val == 2 && strict > 0)
2473                     {
2474                       funny_match[funny_match_index].this_op = opno;
2475                       funny_match[funny_match_index++].other = match;
2476                     }
2477                 }
2478                 len = 0;
2479                 break;
2480
2481               case 'p':
2482                 /* p is used for address_operands.  When we are called by
2483                    gen_reload, no one will have checked that the address is
2484                    strictly valid, i.e., that all pseudos requiring hard regs
2485                    have gotten them.  */
2486                 if (strict <= 0
2487                     || (strict_memory_address_p (recog_data.operand_mode[opno],
2488                                                  op)))
2489                   win = 1;
2490                 break;
2491
2492                 /* No need to check general_operand again;
2493                    it was done in insn-recog.c.  Well, except that reload
2494                    doesn't check the validity of its replacements, but
2495                    that should only matter when there's a bug.  */
2496               case 'g':
2497                 /* Anything goes unless it is a REG and really has a hard reg
2498                    but the hard reg is not in the class GENERAL_REGS.  */
2499                 if (REG_P (op))
2500                   {
2501                     if (strict < 0
2502                         || GENERAL_REGS == ALL_REGS
2503                         || (reload_in_progress
2504                             && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2505                         || reg_fits_class_p (op, GENERAL_REGS, offset, mode))
2506                       win = 1;
2507                   }
2508                 else if (strict < 0 || general_operand (op, mode))
2509                   win = 1;
2510                 break;
2511
2512               case 'X':
2513                 /* This is used for a MATCH_SCRATCH in the cases when
2514                    we don't actually need anything.  So anything goes
2515                    any time.  */
2516                 win = 1;
2517                 break;
2518
2519               case TARGET_MEM_CONSTRAINT:
2520                 /* Memory operands must be valid, to the extent
2521                    required by STRICT.  */
2522                 if (MEM_P (op))
2523                   {
2524                     if (strict > 0
2525                         && !strict_memory_address_addr_space_p
2526                              (GET_MODE (op), XEXP (op, 0),
2527                               MEM_ADDR_SPACE (op)))
2528                       break;
2529                     if (strict == 0
2530                         && !memory_address_addr_space_p
2531                              (GET_MODE (op), XEXP (op, 0),
2532                               MEM_ADDR_SPACE (op)))
2533                       break;
2534                     win = 1;
2535                   }
2536                 /* Before reload, accept what reload can turn into mem.  */
2537                 else if (strict < 0 && CONSTANT_P (op))
2538                   win = 1;
2539                 /* During reload, accept a pseudo  */
2540                 else if (reload_in_progress && REG_P (op)
2541                          && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2542                   win = 1;
2543                 break;
2544
2545               case '<':
2546                 if (MEM_P (op)
2547                     && (GET_CODE (XEXP (op, 0)) == PRE_DEC
2548                         || GET_CODE (XEXP (op, 0)) == POST_DEC))
2549                   win = 1;
2550                 break;
2551
2552               case '>':
2553                 if (MEM_P (op)
2554                     && (GET_CODE (XEXP (op, 0)) == PRE_INC
2555                         || GET_CODE (XEXP (op, 0)) == POST_INC))
2556                   win = 1;
2557                 break;
2558
2559               case 'E':
2560               case 'F':
2561                 if (GET_CODE (op) == CONST_DOUBLE
2562                     || (GET_CODE (op) == CONST_VECTOR
2563                         && GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_FLOAT))
2564                   win = 1;
2565                 break;
2566
2567               case 'G':
2568               case 'H':
2569                 if (GET_CODE (op) == CONST_DOUBLE
2570                     && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (op, c, p))
2571                   win = 1;
2572                 break;
2573
2574               case 's':
2575                 if (CONST_INT_P (op)
2576                     || (GET_CODE (op) == CONST_DOUBLE
2577                         && GET_MODE (op) == VOIDmode))
2578                   break;
2579               case 'i':
2580                 if (CONSTANT_P (op))
2581                   win = 1;
2582                 break;
2583
2584               case 'n':
2585                 if (CONST_INT_P (op)
2586                     || (GET_CODE (op) == CONST_DOUBLE
2587                         && GET_MODE (op) == VOIDmode))
2588                   win = 1;
2589                 break;
2590
2591               case 'I':
2592               case 'J':
2593               case 'K':
2594               case 'L':
2595               case 'M':
2596               case 'N':
2597               case 'O':
2598               case 'P':
2599                 if (CONST_INT_P (op)
2600                     && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), c, p))
2601                   win = 1;
2602                 break;
2603
2604               case 'V':
2605                 if (MEM_P (op)
2606                     && ((strict > 0 && ! offsettable_memref_p (op))
2607                         || (strict < 0
2608                             && !(CONSTANT_P (op) || MEM_P (op)))
2609                         || (reload_in_progress
2610                             && !(REG_P (op)
2611                                  && REGNO (op) >= FIRST_PSEUDO_REGISTER))))
2612                   win = 1;
2613                 break;
2614
2615               case 'o':
2616                 if ((strict > 0 && offsettable_memref_p (op))
2617                     || (strict == 0 && offsettable_nonstrict_memref_p (op))
2618                     /* Before reload, accept what reload can handle.  */
2619                     || (strict < 0
2620                         && (CONSTANT_P (op) || MEM_P (op)))
2621                     /* During reload, accept a pseudo  */
2622                     || (reload_in_progress && REG_P (op)
2623                         && REGNO (op) >= FIRST_PSEUDO_REGISTER))
2624                   win = 1;
2625                 break;
2626
2627               default:
2628                 {
2629                   enum reg_class cl;
2630
2631                   cl = (c == 'r'
2632                            ? GENERAL_REGS : REG_CLASS_FROM_CONSTRAINT (c, p));
2633                   if (cl != NO_REGS)
2634                     {
2635                       if (strict < 0
2636                           || (strict == 0
2637                               && REG_P (op)
2638                               && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2639                           || (strict == 0 && GET_CODE (op) == SCRATCH)
2640                           || (REG_P (op)
2641                               && reg_fits_class_p (op, cl, offset, mode)))
2642                         win = 1;
2643                     }
2644 #ifdef EXTRA_CONSTRAINT_STR
2645                   else if (EXTRA_CONSTRAINT_STR (op, c, p))
2646                     win = 1;
2647
2648                   else if (EXTRA_MEMORY_CONSTRAINT (c, p)
2649                            /* Every memory operand can be reloaded to fit.  */
2650                            && ((strict < 0 && MEM_P (op))
2651                                /* Before reload, accept what reload can turn
2652                                   into mem.  */
2653                                || (strict < 0 && CONSTANT_P (op))
2654                                /* During reload, accept a pseudo  */
2655                                || (reload_in_progress && REG_P (op)
2656                                    && REGNO (op) >= FIRST_PSEUDO_REGISTER)))
2657                     win = 1;
2658                   else if (EXTRA_ADDRESS_CONSTRAINT (c, p)
2659                            /* Every address operand can be reloaded to fit.  */
2660                            && strict < 0)
2661                     win = 1;
2662 #endif
2663                   break;
2664                 }
2665               }
2666           while (p += len, c);
2667
2668           constraints[opno] = p;
2669           /* If this operand did not win somehow,
2670              this alternative loses.  */
2671           if (! win)
2672             lose = 1;
2673         }
2674       /* This alternative won; the operands are ok.
2675          Change whichever operands this alternative says to change.  */
2676       if (! lose)
2677         {
2678           int opno, eopno;
2679
2680           /* See if any earlyclobber operand conflicts with some other
2681              operand.  */
2682
2683           if (strict > 0  && seen_earlyclobber_at >= 0)
2684             for (eopno = seen_earlyclobber_at;
2685                  eopno < recog_data.n_operands;
2686                  eopno++)
2687               /* Ignore earlyclobber operands now in memory,
2688                  because we would often report failure when we have
2689                  two memory operands, one of which was formerly a REG.  */
2690               if (earlyclobber[eopno]
2691                   && REG_P (recog_data.operand[eopno]))
2692                 for (opno = 0; opno < recog_data.n_operands; opno++)
2693                   if ((MEM_P (recog_data.operand[opno])
2694                        || recog_data.operand_type[opno] != OP_OUT)
2695                       && opno != eopno
2696                       /* Ignore things like match_operator operands.  */
2697                       && *recog_data.constraints[opno] != 0
2698                       && ! (matching_operands[opno] == eopno
2699                             && operands_match_p (recog_data.operand[opno],
2700                                                  recog_data.operand[eopno]))
2701                       && ! safe_from_earlyclobber (recog_data.operand[opno],
2702                                                    recog_data.operand[eopno]))
2703                     lose = 1;
2704
2705           if (! lose)
2706             {
2707               while (--funny_match_index >= 0)
2708                 {
2709                   recog_data.operand[funny_match[funny_match_index].other]
2710                     = recog_data.operand[funny_match[funny_match_index].this_op];
2711                 }
2712
2713 #ifdef AUTO_INC_DEC
2714               /* For operands without < or > constraints reject side-effects.  */
2715               if (recog_data.is_asm)
2716                 {
2717                   for (opno = 0; opno < recog_data.n_operands; opno++)
2718                     if (MEM_P (recog_data.operand[opno]))
2719                       switch (GET_CODE (XEXP (recog_data.operand[opno], 0)))
2720                         {
2721                         case PRE_INC:
2722                         case POST_INC:
2723                         case PRE_DEC:
2724                         case POST_DEC:
2725                         case PRE_MODIFY:
2726                         case POST_MODIFY:
2727                           if (strchr (recog_data.constraints[opno], '<') == NULL
2728                               && strchr (recog_data.constraints[opno], '>')
2729                                  == NULL)
2730                             return 0;
2731                           break;
2732                         default:
2733                           break;
2734                         }
2735                 }
2736 #endif
2737               return 1;
2738             }
2739         }
2740
2741       which_alternative++;
2742     }
2743   while (which_alternative < recog_data.n_alternatives);
2744
2745   which_alternative = -1;
2746   /* If we are about to reject this, but we are not to test strictly,
2747      try a very loose test.  Only return failure if it fails also.  */
2748   if (strict == 0)
2749     return constrain_operands (-1);
2750   else
2751     return 0;
2752 }
2753
2754 /* Return true iff OPERAND (assumed to be a REG rtx)
2755    is a hard reg in class CLASS when its regno is offset by OFFSET
2756    and changed to mode MODE.
2757    If REG occupies multiple hard regs, all of them must be in CLASS.  */
2758
2759 bool
2760 reg_fits_class_p (const_rtx operand, reg_class_t cl, int offset,
2761                   enum machine_mode mode)
2762 {
2763   int regno = REGNO (operand);
2764
2765   if (cl == NO_REGS)
2766     return false;
2767
2768   return (HARD_REGISTER_NUM_P (regno)
2769           && in_hard_reg_set_p (reg_class_contents[(int) cl],
2770                                 mode, regno + offset));
2771 }
2772 \f
2773 /* Split single instruction.  Helper function for split_all_insns and
2774    split_all_insns_noflow.  Return last insn in the sequence if successful,
2775    or NULL if unsuccessful.  */
2776
2777 static rtx
2778 split_insn (rtx insn)
2779 {
2780   /* Split insns here to get max fine-grain parallelism.  */
2781   rtx first = PREV_INSN (insn);
2782   rtx last = try_split (PATTERN (insn), insn, 1);
2783   rtx insn_set, last_set, note;
2784
2785   if (last == insn)
2786     return NULL_RTX;
2787
2788   /* If the original instruction was a single set that was known to be
2789      equivalent to a constant, see if we can say the same about the last
2790      instruction in the split sequence.  The two instructions must set
2791      the same destination.  */
2792   insn_set = single_set (insn);
2793   if (insn_set)
2794     {
2795       last_set = single_set (last);
2796       if (last_set && rtx_equal_p (SET_DEST (last_set), SET_DEST (insn_set)))
2797         {
2798           note = find_reg_equal_equiv_note (insn);
2799           if (note && CONSTANT_P (XEXP (note, 0)))
2800             set_unique_reg_note (last, REG_EQUAL, XEXP (note, 0));
2801           else if (CONSTANT_P (SET_SRC (insn_set)))
2802             set_unique_reg_note (last, REG_EQUAL, SET_SRC (insn_set));
2803         }
2804     }
2805
2806   /* try_split returns the NOTE that INSN became.  */
2807   SET_INSN_DELETED (insn);
2808
2809   /* ??? Coddle to md files that generate subregs in post-reload
2810      splitters instead of computing the proper hard register.  */
2811   if (reload_completed && first != last)
2812     {
2813       first = NEXT_INSN (first);
2814       for (;;)
2815         {
2816           if (INSN_P (first))
2817             cleanup_subreg_operands (first);
2818           if (first == last)
2819             break;
2820           first = NEXT_INSN (first);
2821         }
2822     }
2823
2824   return last;
2825 }
2826
2827 /* Split all insns in the function.  If UPD_LIFE, update life info after.  */
2828
2829 void
2830 split_all_insns (void)
2831 {
2832   sbitmap blocks;
2833   bool changed;
2834   basic_block bb;
2835
2836   blocks = sbitmap_alloc (last_basic_block);
2837   sbitmap_zero (blocks);
2838   changed = false;
2839
2840   FOR_EACH_BB_REVERSE (bb)
2841     {
2842       rtx insn, next;
2843       bool finish = false;
2844
2845       rtl_profile_for_bb (bb);
2846       for (insn = BB_HEAD (bb); !finish ; insn = next)
2847         {
2848           /* Can't use `next_real_insn' because that might go across
2849              CODE_LABELS and short-out basic blocks.  */
2850           next = NEXT_INSN (insn);
2851           finish = (insn == BB_END (bb));
2852           if (INSN_P (insn))
2853             {
2854               rtx set = single_set (insn);
2855
2856               /* Don't split no-op move insns.  These should silently
2857                  disappear later in final.  Splitting such insns would
2858                  break the code that handles LIBCALL blocks.  */
2859               if (set && set_noop_p (set))
2860                 {
2861                   /* Nops get in the way while scheduling, so delete them
2862                      now if register allocation has already been done.  It
2863                      is too risky to try to do this before register
2864                      allocation, and there are unlikely to be very many
2865                      nops then anyways.  */
2866                   if (reload_completed)
2867                       delete_insn_and_edges (insn);
2868                 }
2869               else
2870                 {
2871                   if (split_insn (insn))
2872                     {
2873                       SET_BIT (blocks, bb->index);
2874                       changed = true;
2875                     }
2876                 }
2877             }
2878         }
2879     }
2880
2881   default_rtl_profile ();
2882   if (changed)
2883     find_many_sub_basic_blocks (blocks);
2884
2885 #ifdef ENABLE_CHECKING
2886   verify_flow_info ();
2887 #endif
2888
2889   sbitmap_free (blocks);
2890 }
2891
2892 /* Same as split_all_insns, but do not expect CFG to be available.
2893    Used by machine dependent reorg passes.  */
2894
2895 unsigned int
2896 split_all_insns_noflow (void)
2897 {
2898   rtx next, insn;
2899
2900   for (insn = get_insns (); insn; insn = next)
2901     {
2902       next = NEXT_INSN (insn);
2903       if (INSN_P (insn))
2904         {
2905           /* Don't split no-op move insns.  These should silently
2906              disappear later in final.  Splitting such insns would
2907              break the code that handles LIBCALL blocks.  */
2908           rtx set = single_set (insn);
2909           if (set && set_noop_p (set))
2910             {
2911               /* Nops get in the way while scheduling, so delete them
2912                  now if register allocation has already been done.  It
2913                  is too risky to try to do this before register
2914                  allocation, and there are unlikely to be very many
2915                  nops then anyways.
2916
2917                  ??? Should we use delete_insn when the CFG isn't valid?  */
2918               if (reload_completed)
2919                 delete_insn_and_edges (insn);
2920             }
2921           else
2922             split_insn (insn);
2923         }
2924     }
2925   return 0;
2926 }
2927 \f
2928 #ifdef HAVE_peephole2
2929 struct peep2_insn_data
2930 {
2931   rtx insn;
2932   regset live_before;
2933 };
2934
2935 static struct peep2_insn_data peep2_insn_data[MAX_INSNS_PER_PEEP2 + 1];
2936 static int peep2_current;
2937
2938 static bool peep2_do_rebuild_jump_labels;
2939 static bool peep2_do_cleanup_cfg;
2940
2941 /* The number of instructions available to match a peep2.  */
2942 int peep2_current_count;
2943
2944 /* A non-insn marker indicating the last insn of the block.
2945    The live_before regset for this element is correct, indicating
2946    DF_LIVE_OUT for the block.  */
2947 #define PEEP2_EOB       pc_rtx
2948
2949 /* Wrap N to fit into the peep2_insn_data buffer.  */
2950
2951 static int
2952 peep2_buf_position (int n)
2953 {
2954   if (n >= MAX_INSNS_PER_PEEP2 + 1)
2955     n -= MAX_INSNS_PER_PEEP2 + 1;
2956   return n;
2957 }
2958
2959 /* Return the Nth non-note insn after `current', or return NULL_RTX if it
2960    does not exist.  Used by the recognizer to find the next insn to match
2961    in a multi-insn pattern.  */
2962
2963 rtx
2964 peep2_next_insn (int n)
2965 {
2966   gcc_assert (n <= peep2_current_count);
2967
2968   n = peep2_buf_position (peep2_current + n);
2969
2970   return peep2_insn_data[n].insn;
2971 }
2972
2973 /* Return true if REGNO is dead before the Nth non-note insn
2974    after `current'.  */
2975
2976 int
2977 peep2_regno_dead_p (int ofs, int regno)
2978 {
2979   gcc_assert (ofs < MAX_INSNS_PER_PEEP2 + 1);
2980
2981   ofs = peep2_buf_position (peep2_current + ofs);
2982
2983   gcc_assert (peep2_insn_data[ofs].insn != NULL_RTX);
2984
2985   return ! REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno);
2986 }
2987
2988 /* Similarly for a REG.  */
2989
2990 int
2991 peep2_reg_dead_p (int ofs, rtx reg)
2992 {
2993   int regno, n;
2994
2995   gcc_assert (ofs < MAX_INSNS_PER_PEEP2 + 1);
2996
2997   ofs = peep2_buf_position (peep2_current + ofs);
2998
2999   gcc_assert (peep2_insn_data[ofs].insn != NULL_RTX);
3000
3001   regno = REGNO (reg);
3002   n = hard_regno_nregs[regno][GET_MODE (reg)];
3003   while (--n >= 0)
3004     if (REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno + n))
3005       return 0;
3006   return 1;
3007 }
3008
3009 /* Try to find a hard register of mode MODE, matching the register class in
3010    CLASS_STR, which is available at the beginning of insn CURRENT_INSN and
3011    remains available until the end of LAST_INSN.  LAST_INSN may be NULL_RTX,
3012    in which case the only condition is that the register must be available
3013    before CURRENT_INSN.
3014    Registers that already have bits set in REG_SET will not be considered.
3015
3016    If an appropriate register is available, it will be returned and the
3017    corresponding bit(s) in REG_SET will be set; otherwise, NULL_RTX is
3018    returned.  */
3019
3020 rtx
3021 peep2_find_free_register (int from, int to, const char *class_str,
3022                           enum machine_mode mode, HARD_REG_SET *reg_set)
3023 {
3024   static int search_ofs;
3025   enum reg_class cl;
3026   HARD_REG_SET live;
3027   int i;
3028
3029   gcc_assert (from < MAX_INSNS_PER_PEEP2 + 1);
3030   gcc_assert (to < MAX_INSNS_PER_PEEP2 + 1);
3031
3032   from = peep2_buf_position (peep2_current + from);
3033   to = peep2_buf_position (peep2_current + to);
3034
3035   gcc_assert (peep2_insn_data[from].insn != NULL_RTX);
3036   REG_SET_TO_HARD_REG_SET (live, peep2_insn_data[from].live_before);
3037
3038   while (from != to)
3039     {
3040       HARD_REG_SET this_live;
3041
3042       from = peep2_buf_position (from + 1);
3043       gcc_assert (peep2_insn_data[from].insn != NULL_RTX);
3044       REG_SET_TO_HARD_REG_SET (this_live, peep2_insn_data[from].live_before);
3045       IOR_HARD_REG_SET (live, this_live);
3046     }
3047
3048   cl = (class_str[0] == 'r' ? GENERAL_REGS
3049            : REG_CLASS_FROM_CONSTRAINT (class_str[0], class_str));
3050
3051   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3052     {
3053       int raw_regno, regno, success, j;
3054
3055       /* Distribute the free registers as much as possible.  */
3056       raw_regno = search_ofs + i;
3057       if (raw_regno >= FIRST_PSEUDO_REGISTER)
3058         raw_regno -= FIRST_PSEUDO_REGISTER;
3059 #ifdef REG_ALLOC_ORDER
3060       regno = reg_alloc_order[raw_regno];
3061 #else
3062       regno = raw_regno;
3063 #endif
3064
3065       /* Don't allocate fixed registers.  */
3066       if (fixed_regs[regno])
3067         continue;
3068       /* Don't allocate global registers.  */
3069       if (global_regs[regno])
3070         continue;
3071       /* Make sure the register is of the right class.  */
3072       if (! TEST_HARD_REG_BIT (reg_class_contents[cl], regno))
3073         continue;
3074       /* And can support the mode we need.  */
3075       if (! HARD_REGNO_MODE_OK (regno, mode))
3076         continue;
3077       /* And that we don't create an extra save/restore.  */
3078       if (! call_used_regs[regno] && ! df_regs_ever_live_p (regno))
3079         continue;
3080       if (! targetm.hard_regno_scratch_ok (regno))
3081         continue;
3082
3083       /* And we don't clobber traceback for noreturn functions.  */
3084       if ((regno == FRAME_POINTER_REGNUM || regno == HARD_FRAME_POINTER_REGNUM)
3085           && (! reload_completed || frame_pointer_needed))
3086         continue;
3087
3088       success = 1;
3089       for (j = hard_regno_nregs[regno][mode] - 1; j >= 0; j--)
3090         {
3091           if (TEST_HARD_REG_BIT (*reg_set, regno + j)
3092               || TEST_HARD_REG_BIT (live, regno + j))
3093             {
3094               success = 0;
3095               break;
3096             }
3097         }
3098       if (success)
3099         {
3100           add_to_hard_reg_set (reg_set, mode, regno);
3101
3102           /* Start the next search with the next register.  */
3103           if (++raw_regno >= FIRST_PSEUDO_REGISTER)
3104             raw_regno = 0;
3105           search_ofs = raw_regno;
3106
3107           return gen_rtx_REG (mode, regno);
3108         }
3109     }
3110
3111   search_ofs = 0;
3112   return NULL_RTX;
3113 }
3114
3115 /* Forget all currently tracked instructions, only remember current
3116    LIVE regset.  */
3117
3118 static void
3119 peep2_reinit_state (regset live)
3120 {
3121   int i;
3122
3123   /* Indicate that all slots except the last holds invalid data.  */
3124   for (i = 0; i < MAX_INSNS_PER_PEEP2; ++i)
3125     peep2_insn_data[i].insn = NULL_RTX;
3126   peep2_current_count = 0;
3127
3128   /* Indicate that the last slot contains live_after data.  */
3129   peep2_insn_data[MAX_INSNS_PER_PEEP2].insn = PEEP2_EOB;
3130   peep2_current = MAX_INSNS_PER_PEEP2;
3131
3132   COPY_REG_SET (peep2_insn_data[MAX_INSNS_PER_PEEP2].live_before, live);
3133 }
3134
3135 /* While scanning basic block BB, we found a match of length MATCH_LEN,
3136    starting at INSN.  Perform the replacement, removing the old insns and
3137    replacing them with ATTEMPT.  Returns the last insn emitted, or NULL
3138    if the replacement is rejected.  */
3139
3140 static rtx
3141 peep2_attempt (basic_block bb, rtx insn, int match_len, rtx attempt)
3142 {
3143   int i;
3144   rtx last, note, before_try, x;
3145   rtx old_insn, new_insn;
3146   bool was_call = false;
3147
3148   /* If we are splittind an RTX_FRAME_RELATED_P insn, do not allow it to
3149      match more than one insn, or to be split into more than one insn.  */
3150   old_insn = peep2_insn_data[peep2_current].insn;
3151   if (RTX_FRAME_RELATED_P (old_insn))
3152     {
3153       bool any_note = false;
3154
3155       if (match_len != 0)
3156         return NULL;
3157
3158       /* Look for one "active" insn.  I.e. ignore any "clobber" insns that
3159          may be in the stream for the purpose of register allocation.  */
3160       if (active_insn_p (attempt))
3161         new_insn = attempt;
3162       else
3163         new_insn = next_active_insn (attempt);
3164       if (next_active_insn (new_insn))
3165         return NULL;
3166
3167       /* We have a 1-1 replacement.  Copy over any frame-related info.  */
3168       RTX_FRAME_RELATED_P (new_insn) = 1;
3169
3170       /* Allow the backend to fill in a note during the split.  */
3171       for (note = REG_NOTES (new_insn); note ; note = XEXP (note, 1))
3172         switch (REG_NOTE_KIND (note))
3173           {
3174           case REG_FRAME_RELATED_EXPR:
3175           case REG_CFA_DEF_CFA:
3176           case REG_CFA_ADJUST_CFA:
3177           case REG_CFA_OFFSET:
3178           case REG_CFA_REGISTER:
3179           case REG_CFA_EXPRESSION:
3180           case REG_CFA_RESTORE:
3181           case REG_CFA_SET_VDRAP:
3182             any_note = true;
3183             break;
3184           default:
3185             break;
3186           }
3187
3188       /* If the backend didn't supply a note, copy one over.  */
3189       if (!any_note)
3190         for (note = REG_NOTES (old_insn); note ; note = XEXP (note, 1))
3191           switch (REG_NOTE_KIND (note))
3192             {
3193             case REG_FRAME_RELATED_EXPR:
3194             case REG_CFA_DEF_CFA:
3195             case REG_CFA_ADJUST_CFA:
3196             case REG_CFA_OFFSET:
3197             case REG_CFA_REGISTER:
3198             case REG_CFA_EXPRESSION:
3199             case REG_CFA_RESTORE:
3200             case REG_CFA_SET_VDRAP:
3201               add_reg_note (new_insn, REG_NOTE_KIND (note), XEXP (note, 0));
3202               any_note = true;
3203               break;
3204             default:
3205               break;
3206             }
3207
3208       /* If there still isn't a note, make sure the unwind info sees the
3209          same expression as before the split.  */
3210       if (!any_note)
3211         {
3212           rtx old_set, new_set;
3213
3214           /* The old insn had better have been simple, or annotated.  */
3215           old_set = single_set (old_insn);
3216           gcc_assert (old_set != NULL);
3217
3218           new_set = single_set (new_insn);
3219           if (!new_set || !rtx_equal_p (new_set, old_set))
3220             add_reg_note (new_insn, REG_FRAME_RELATED_EXPR, old_set);
3221         }
3222
3223       /* Copy prologue/epilogue status.  This is required in order to keep
3224          proper placement of EPILOGUE_BEG and the DW_CFA_remember_state.  */
3225       maybe_copy_prologue_epilogue_insn (old_insn, new_insn);
3226     }
3227
3228   /* If we are splitting a CALL_INSN, look for the CALL_INSN
3229      in SEQ and copy our CALL_INSN_FUNCTION_USAGE and other
3230      cfg-related call notes.  */
3231   for (i = 0; i <= match_len; ++i)
3232     {
3233       int j;
3234
3235       j = peep2_buf_position (peep2_current + i);
3236       old_insn = peep2_insn_data[j].insn;
3237       if (!CALL_P (old_insn))
3238         continue;
3239       was_call = true;
3240
3241       new_insn = attempt;
3242       while (new_insn != NULL_RTX)
3243         {
3244           if (CALL_P (new_insn))
3245             break;
3246           new_insn = NEXT_INSN (new_insn);
3247         }
3248
3249       gcc_assert (new_insn != NULL_RTX);
3250
3251       CALL_INSN_FUNCTION_USAGE (new_insn)
3252         = CALL_INSN_FUNCTION_USAGE (old_insn);
3253
3254       for (note = REG_NOTES (old_insn);
3255            note;
3256            note = XEXP (note, 1))
3257         switch (REG_NOTE_KIND (note))
3258           {
3259           case REG_NORETURN:
3260           case REG_SETJMP:
3261             add_reg_note (new_insn, REG_NOTE_KIND (note),
3262                           XEXP (note, 0));
3263             break;
3264           default:
3265             /* Discard all other reg notes.  */
3266             break;
3267           }
3268
3269       /* Croak if there is another call in the sequence.  */
3270       while (++i <= match_len)
3271         {
3272           j = peep2_buf_position (peep2_current + i);
3273           old_insn = peep2_insn_data[j].insn;
3274           gcc_assert (!CALL_P (old_insn));
3275         }
3276       break;
3277     }
3278
3279   i = peep2_buf_position (peep2_current + match_len);
3280
3281   note = find_reg_note (peep2_insn_data[i].insn, REG_EH_REGION, NULL_RTX);
3282
3283   /* Replace the old sequence with the new.  */
3284   last = emit_insn_after_setloc (attempt,
3285                                  peep2_insn_data[i].insn,
3286                                  INSN_LOCATOR (peep2_insn_data[i].insn));
3287   before_try = PREV_INSN (insn);
3288   delete_insn_chain (insn, peep2_insn_data[i].insn, false);
3289
3290   /* Re-insert the EH_REGION notes.  */
3291   if (note || (was_call && nonlocal_goto_handler_labels))
3292     {
3293       edge eh_edge;
3294       edge_iterator ei;
3295
3296       FOR_EACH_EDGE (eh_edge, ei, bb->succs)
3297         if (eh_edge->flags & (EDGE_EH | EDGE_ABNORMAL_CALL))
3298           break;
3299
3300       if (note)
3301         copy_reg_eh_region_note_backward (note, last, before_try);
3302
3303       if (eh_edge)
3304         for (x = last; x != before_try; x = PREV_INSN (x))
3305           if (x != BB_END (bb)
3306               && (can_throw_internal (x)
3307                   || can_nonlocal_goto (x)))
3308             {
3309               edge nfte, nehe;
3310               int flags;
3311
3312               nfte = split_block (bb, x);
3313               flags = (eh_edge->flags
3314                        & (EDGE_EH | EDGE_ABNORMAL));
3315               if (CALL_P (x))
3316                 flags |= EDGE_ABNORMAL_CALL;
3317               nehe = make_edge (nfte->src, eh_edge->dest,
3318                                 flags);
3319
3320               nehe->probability = eh_edge->probability;
3321               nfte->probability
3322                 = REG_BR_PROB_BASE - nehe->probability;
3323
3324               peep2_do_cleanup_cfg |= purge_dead_edges (nfte->dest);
3325               bb = nfte->src;
3326               eh_edge = nehe;
3327             }
3328
3329       /* Converting possibly trapping insn to non-trapping is
3330          possible.  Zap dummy outgoing edges.  */
3331       peep2_do_cleanup_cfg |= purge_dead_edges (bb);
3332     }
3333
3334   /* If we generated a jump instruction, it won't have
3335      JUMP_LABEL set.  Recompute after we're done.  */
3336   for (x = last; x != before_try; x = PREV_INSN (x))
3337     if (JUMP_P (x))
3338       {
3339         peep2_do_rebuild_jump_labels = true;
3340         break;
3341       }
3342
3343   return last;
3344 }
3345
3346 /* After performing a replacement in basic block BB, fix up the life
3347    information in our buffer.  LAST is the last of the insns that we
3348    emitted as a replacement.  PREV is the insn before the start of
3349    the replacement.  MATCH_LEN is the number of instructions that were
3350    matched, and which now need to be replaced in the buffer.  */
3351
3352 static void
3353 peep2_update_life (basic_block bb, int match_len, rtx last, rtx prev)
3354 {
3355   int i = peep2_buf_position (peep2_current + match_len + 1);
3356   rtx x;
3357   regset_head live;
3358
3359   INIT_REG_SET (&live);
3360   COPY_REG_SET (&live, peep2_insn_data[i].live_before);
3361
3362   gcc_assert (peep2_current_count >= match_len + 1);
3363   peep2_current_count -= match_len + 1;
3364
3365   x = last;
3366   do
3367     {
3368       if (INSN_P (x))
3369         {
3370           df_insn_rescan (x);
3371           if (peep2_current_count < MAX_INSNS_PER_PEEP2)
3372             {
3373               peep2_current_count++;
3374               if (--i < 0)
3375                 i = MAX_INSNS_PER_PEEP2;
3376               peep2_insn_data[i].insn = x;
3377               df_simulate_one_insn_backwards (bb, x, &live);
3378               COPY_REG_SET (peep2_insn_data[i].live_before, &live);
3379             }
3380         }
3381       x = PREV_INSN (x);
3382     }
3383   while (x != prev);
3384   CLEAR_REG_SET (&live);
3385
3386   peep2_current = i;
3387 }
3388
3389 /* Add INSN, which is in BB, at the end of the peep2 insn buffer if possible.
3390    Return true if we added it, false otherwise.  The caller will try to match
3391    peepholes against the buffer if we return false; otherwise it will try to
3392    add more instructions to the buffer.  */
3393
3394 static bool
3395 peep2_fill_buffer (basic_block bb, rtx insn, regset live)
3396 {
3397   int pos;
3398
3399   /* Once we have filled the maximum number of insns the buffer can hold,
3400      allow the caller to match the insns against peepholes.  We wait until
3401      the buffer is full in case the target has similar peepholes of different
3402      length; we always want to match the longest if possible.  */
3403   if (peep2_current_count == MAX_INSNS_PER_PEEP2)
3404     return false;
3405
3406   /* If an insn has RTX_FRAME_RELATED_P set, do not allow it to be matched with
3407      any other pattern, lest it change the semantics of the frame info.  */
3408   if (RTX_FRAME_RELATED_P (insn))
3409     {
3410       /* Let the buffer drain first.  */
3411       if (peep2_current_count > 0)
3412         return false;
3413       /* Now the insn will be the only thing in the buffer.  */
3414     }
3415
3416   pos = peep2_buf_position (peep2_current + peep2_current_count);
3417   peep2_insn_data[pos].insn = insn;
3418   COPY_REG_SET (peep2_insn_data[pos].live_before, live);
3419   peep2_current_count++;
3420
3421   df_simulate_one_insn_forwards (bb, insn, live);
3422   return true;
3423 }
3424
3425 /* Perform the peephole2 optimization pass.  */
3426
3427 static void
3428 peephole2_optimize (void)
3429 {
3430   rtx insn;
3431   bitmap live;
3432   int i;
3433   basic_block bb;
3434
3435   peep2_do_cleanup_cfg = false;
3436   peep2_do_rebuild_jump_labels = false;
3437
3438   df_set_flags (DF_LR_RUN_DCE);
3439   df_note_add_problem ();
3440   df_analyze ();
3441
3442   /* Initialize the regsets we're going to use.  */
3443   for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3444     peep2_insn_data[i].live_before = BITMAP_ALLOC (&reg_obstack);
3445   live = BITMAP_ALLOC (&reg_obstack);
3446
3447   FOR_EACH_BB_REVERSE (bb)
3448     {
3449       bool past_end = false;
3450       int pos;
3451
3452       rtl_profile_for_bb (bb);
3453
3454       /* Start up propagation.  */
3455       bitmap_copy (live, DF_LR_IN (bb));
3456       df_simulate_initialize_forwards (bb, live);
3457       peep2_reinit_state (live);
3458
3459       insn = BB_HEAD (bb);
3460       for (;;)
3461         {
3462           rtx attempt, head;
3463           int match_len;
3464
3465           if (!past_end && !NONDEBUG_INSN_P (insn))
3466             {
3467             next_insn:
3468               insn = NEXT_INSN (insn);
3469               if (insn == NEXT_INSN (BB_END (bb)))
3470                 past_end = true;
3471               continue;
3472             }
3473           if (!past_end && peep2_fill_buffer (bb, insn, live))
3474             goto next_insn;
3475
3476           /* If we did not fill an empty buffer, it signals the end of the
3477              block.  */
3478           if (peep2_current_count == 0)
3479             break;
3480
3481           /* The buffer filled to the current maximum, so try to match.  */
3482
3483           pos = peep2_buf_position (peep2_current + peep2_current_count);
3484           peep2_insn_data[pos].insn = PEEP2_EOB;
3485           COPY_REG_SET (peep2_insn_data[pos].live_before, live);
3486
3487           /* Match the peephole.  */
3488           head = peep2_insn_data[peep2_current].insn;
3489           attempt = peephole2_insns (PATTERN (head), head, &match_len);
3490           if (attempt != NULL)
3491             {
3492               rtx last = peep2_attempt (bb, head, match_len, attempt);
3493               if (last)
3494                 {
3495                   peep2_update_life (bb, match_len, last, PREV_INSN (attempt));
3496                   continue;
3497                 }
3498             }
3499
3500           /* No match: advance the buffer by one insn.  */
3501           peep2_current = peep2_buf_position (peep2_current + 1);
3502           peep2_current_count--;
3503         }
3504     }
3505
3506   default_rtl_profile ();
3507   for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3508     BITMAP_FREE (peep2_insn_data[i].live_before);
3509   BITMAP_FREE (live);
3510   if (peep2_do_rebuild_jump_labels)
3511     rebuild_jump_labels (get_insns ());
3512 }
3513 #endif /* HAVE_peephole2 */
3514
3515 /* Common predicates for use with define_bypass.  */
3516
3517 /* True if the dependency between OUT_INSN and IN_INSN is on the store
3518    data not the address operand(s) of the store.  IN_INSN and OUT_INSN
3519    must be either a single_set or a PARALLEL with SETs inside.  */
3520
3521 int
3522 store_data_bypass_p (rtx out_insn, rtx in_insn)
3523 {
3524   rtx out_set, in_set;
3525   rtx out_pat, in_pat;
3526   rtx out_exp, in_exp;
3527   int i, j;
3528
3529   in_set = single_set (in_insn);
3530   if (in_set)
3531     {
3532       if (!MEM_P (SET_DEST (in_set)))
3533         return false;
3534
3535       out_set = single_set (out_insn);
3536       if (out_set)
3537         {
3538           if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_set)))
3539             return false;
3540         }
3541       else
3542         {
3543           out_pat = PATTERN (out_insn);
3544
3545           if (GET_CODE (out_pat) != PARALLEL)
3546             return false;
3547
3548           for (i = 0; i < XVECLEN (out_pat, 0); i++)
3549           {
3550             out_exp = XVECEXP (out_pat, 0, i);
3551
3552             if (GET_CODE (out_exp) == CLOBBER)
3553               continue;
3554
3555             gcc_assert (GET_CODE (out_exp) == SET);
3556
3557             if (reg_mentioned_p (SET_DEST (out_exp), SET_DEST (in_set)))
3558               return false;
3559           }
3560       }
3561     }
3562   else
3563     {
3564       in_pat = PATTERN (in_insn);
3565       gcc_assert (GET_CODE (in_pat) == PARALLEL);
3566
3567       for (i = 0; i < XVECLEN (in_pat, 0); i++)
3568         {
3569           in_exp = XVECEXP (in_pat, 0, i);
3570
3571           if (GET_CODE (in_exp) == CLOBBER)
3572             continue;
3573
3574           gcc_assert (GET_CODE (in_exp) == SET);
3575
3576           if (!MEM_P (SET_DEST (in_exp)))
3577             return false;
3578
3579           out_set = single_set (out_insn);
3580           if (out_set)
3581             {
3582               if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_exp)))
3583                 return false;
3584             }
3585           else
3586             {
3587               out_pat = PATTERN (out_insn);
3588               gcc_assert (GET_CODE (out_pat) == PARALLEL);
3589
3590               for (j = 0; j < XVECLEN (out_pat, 0); j++)
3591                 {
3592                   out_exp = XVECEXP (out_pat, 0, j);
3593
3594                   if (GET_CODE (out_exp) == CLOBBER)
3595                     continue;
3596
3597                   gcc_assert (GET_CODE (out_exp) == SET);
3598
3599                   if (reg_mentioned_p (SET_DEST (out_exp), SET_DEST (in_exp)))
3600                     return false;
3601                 }
3602             }
3603         }
3604     }
3605
3606   return true;
3607 }
3608
3609 /* True if the dependency between OUT_INSN and IN_INSN is in the IF_THEN_ELSE
3610    condition, and not the THEN or ELSE branch.  OUT_INSN may be either a single
3611    or multiple set; IN_INSN should be single_set for truth, but for convenience
3612    of insn categorization may be any JUMP or CALL insn.  */
3613
3614 int
3615 if_test_bypass_p (rtx out_insn, rtx in_insn)
3616 {
3617   rtx out_set, in_set;
3618
3619   in_set = single_set (in_insn);
3620   if (! in_set)
3621     {
3622       gcc_assert (JUMP_P (in_insn) || CALL_P (in_insn));
3623       return false;
3624     }
3625
3626   if (GET_CODE (SET_SRC (in_set)) != IF_THEN_ELSE)
3627     return false;
3628   in_set = SET_SRC (in_set);
3629
3630   out_set = single_set (out_insn);
3631   if (out_set)
3632     {
3633       if (reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 1))
3634           || reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 2)))
3635         return false;
3636     }
3637   else
3638     {
3639       rtx out_pat;
3640       int i;
3641
3642       out_pat = PATTERN (out_insn);
3643       gcc_assert (GET_CODE (out_pat) == PARALLEL);
3644
3645       for (i = 0; i < XVECLEN (out_pat, 0); i++)
3646         {
3647           rtx exp = XVECEXP (out_pat, 0, i);
3648
3649           if (GET_CODE (exp) == CLOBBER)
3650             continue;
3651
3652           gcc_assert (GET_CODE (exp) == SET);
3653
3654           if (reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 1))
3655               || reg_mentioned_p (SET_DEST (out_set), XEXP (in_set, 2)))
3656             return false;
3657         }
3658     }
3659
3660   return true;
3661 }
3662 \f
3663 static bool
3664 gate_handle_peephole2 (void)
3665 {
3666   return (optimize > 0 && flag_peephole2);
3667 }
3668
3669 static unsigned int
3670 rest_of_handle_peephole2 (void)
3671 {
3672 #ifdef HAVE_peephole2
3673   peephole2_optimize ();
3674 #endif
3675   return 0;
3676 }
3677
3678 struct rtl_opt_pass pass_peephole2 =
3679 {
3680  {
3681   RTL_PASS,
3682   "peephole2",                          /* name */
3683   gate_handle_peephole2,                /* gate */
3684   rest_of_handle_peephole2,             /* execute */
3685   NULL,                                 /* sub */
3686   NULL,                                 /* next */
3687   0,                                    /* static_pass_number */
3688   TV_PEEPHOLE2,                         /* tv_id */
3689   0,                                    /* properties_required */
3690   0,                                    /* properties_provided */
3691   0,                                    /* properties_destroyed */
3692   0,                                    /* todo_flags_start */
3693   TODO_df_finish | TODO_verify_rtl_sharing |
3694   TODO_dump_func                       /* todo_flags_finish */
3695  }
3696 };
3697
3698 static unsigned int
3699 rest_of_handle_split_all_insns (void)
3700 {
3701   split_all_insns ();
3702   return 0;
3703 }
3704
3705 struct rtl_opt_pass pass_split_all_insns =
3706 {
3707  {
3708   RTL_PASS,
3709   "split1",                             /* name */
3710   NULL,                                 /* gate */
3711   rest_of_handle_split_all_insns,       /* execute */
3712   NULL,                                 /* sub */
3713   NULL,                                 /* next */
3714   0,                                    /* static_pass_number */
3715   TV_NONE,                              /* tv_id */
3716   0,                                    /* properties_required */
3717   0,                                    /* properties_provided */
3718   0,                                    /* properties_destroyed */
3719   0,                                    /* todo_flags_start */
3720   TODO_dump_func                        /* todo_flags_finish */
3721  }
3722 };
3723
3724 static unsigned int
3725 rest_of_handle_split_after_reload (void)
3726 {
3727   /* If optimizing, then go ahead and split insns now.  */
3728 #ifndef STACK_REGS
3729   if (optimize > 0)
3730 #endif
3731     split_all_insns ();
3732   return 0;
3733 }
3734
3735 struct rtl_opt_pass pass_split_after_reload =
3736 {
3737  {
3738   RTL_PASS,
3739   "split2",                             /* name */
3740   NULL,                                 /* gate */
3741   rest_of_handle_split_after_reload,    /* execute */
3742   NULL,                                 /* sub */
3743   NULL,                                 /* next */
3744   0,                                    /* static_pass_number */
3745   TV_NONE,                              /* tv_id */
3746   0,                                    /* properties_required */
3747   0,                                    /* properties_provided */
3748   0,                                    /* properties_destroyed */
3749   0,                                    /* todo_flags_start */
3750   TODO_dump_func                        /* todo_flags_finish */
3751  }
3752 };
3753
3754 static bool
3755 gate_handle_split_before_regstack (void)
3756 {
3757 #if defined (HAVE_ATTR_length) && defined (STACK_REGS)
3758   /* If flow2 creates new instructions which need splitting
3759      and scheduling after reload is not done, they might not be
3760      split until final which doesn't allow splitting
3761      if HAVE_ATTR_length.  */
3762 # ifdef INSN_SCHEDULING
3763   return (optimize && !flag_schedule_insns_after_reload);
3764 # else
3765   return (optimize);
3766 # endif
3767 #else
3768   return 0;
3769 #endif
3770 }
3771
3772 static unsigned int
3773 rest_of_handle_split_before_regstack (void)
3774 {
3775   split_all_insns ();
3776   return 0;
3777 }
3778
3779 struct rtl_opt_pass pass_split_before_regstack =
3780 {
3781  {
3782   RTL_PASS,
3783   "split3",                             /* name */
3784   gate_handle_split_before_regstack,    /* gate */
3785   rest_of_handle_split_before_regstack, /* execute */
3786   NULL,                                 /* sub */
3787   NULL,                                 /* next */
3788   0,                                    /* static_pass_number */
3789   TV_NONE,                              /* tv_id */
3790   0,                                    /* properties_required */
3791   0,                                    /* properties_provided */
3792   0,                                    /* properties_destroyed */
3793   0,                                    /* todo_flags_start */
3794   TODO_dump_func                        /* todo_flags_finish */
3795  }
3796 };
3797
3798 static bool
3799 gate_handle_split_before_sched2 (void)
3800 {
3801 #ifdef INSN_SCHEDULING
3802   return optimize > 0 && flag_schedule_insns_after_reload;
3803 #else
3804   return 0;
3805 #endif
3806 }
3807
3808 static unsigned int
3809 rest_of_handle_split_before_sched2 (void)
3810 {
3811 #ifdef INSN_SCHEDULING
3812   split_all_insns ();
3813 #endif
3814   return 0;
3815 }
3816
3817 struct rtl_opt_pass pass_split_before_sched2 =
3818 {
3819  {
3820   RTL_PASS,
3821   "split4",                             /* name */
3822   gate_handle_split_before_sched2,      /* gate */
3823   rest_of_handle_split_before_sched2,   /* execute */
3824   NULL,                                 /* sub */
3825   NULL,                                 /* next */
3826   0,                                    /* static_pass_number */
3827   TV_NONE,                              /* tv_id */
3828   0,                                    /* properties_required */
3829   0,                                    /* properties_provided */
3830   0,                                    /* properties_destroyed */
3831   0,                                    /* todo_flags_start */
3832   TODO_verify_flow |
3833   TODO_dump_func                        /* todo_flags_finish */
3834  }
3835 };
3836
3837 /* The placement of the splitting that we do for shorten_branches
3838    depends on whether regstack is used by the target or not.  */
3839 static bool
3840 gate_do_final_split (void)
3841 {
3842 #if defined (HAVE_ATTR_length) && !defined (STACK_REGS)
3843   return 1;
3844 #else
3845   return 0;
3846 #endif
3847 }
3848
3849 struct rtl_opt_pass pass_split_for_shorten_branches =
3850 {
3851  {
3852   RTL_PASS,
3853   "split5",                             /* name */
3854   gate_do_final_split,                  /* gate */
3855   split_all_insns_noflow,               /* execute */
3856   NULL,                                 /* sub */
3857   NULL,                                 /* next */
3858   0,                                    /* static_pass_number */
3859   TV_NONE,                              /* tv_id */
3860   0,                                    /* properties_required */
3861   0,                                    /* properties_provided */
3862   0,                                    /* properties_destroyed */
3863   0,                                    /* todo_flags_start */
3864   TODO_dump_func | TODO_verify_rtl_sharing /* todo_flags_finish */
3865  }
3866 };