OSDN Git Service

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