OSDN Git Service

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