OSDN Git Service

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