OSDN Git Service

* basic-block.h (find_sub_basic_blocks): Use sbitmap parameter.
[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     {
1559       rtx asmop = SET_SRC (XVECEXP (body, 0, 0));
1560       int nparallel = XVECLEN (body, 0); /* Includes CLOBBERs.  */
1561       int nin = ASM_OPERANDS_INPUT_LENGTH (asmop);
1562       int nout = 0;             /* Does not include CLOBBERs.  */
1563
1564       /* At least one output, plus some CLOBBERs.  */
1565
1566       /* The outputs are in the SETs.
1567          Their constraints are in the ASM_OPERANDS itself.  */
1568       for (i = 0; i < nparallel; i++)
1569         {
1570           if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
1571             break;              /* Past last SET */
1572           
1573           if (operands)
1574             operands[i] = SET_DEST (XVECEXP (body, 0, i));
1575           if (operand_locs)
1576             operand_locs[i] = &SET_DEST (XVECEXP (body, 0, i));
1577           if (constraints)
1578             constraints[i] = XSTR (SET_SRC (XVECEXP (body, 0, i)), 1);
1579           if (modes)
1580             modes[i] = GET_MODE (SET_DEST (XVECEXP (body, 0, i)));
1581           nout++;
1582         }
1583
1584       for (i = 0; i < nin; i++)
1585         {
1586           if (operand_locs)
1587             operand_locs[i + nout] = &ASM_OPERANDS_INPUT (asmop, i);
1588           if (operands)
1589             operands[i + nout] = ASM_OPERANDS_INPUT (asmop, i);
1590           if (constraints)
1591             constraints[i + nout] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1592           if (modes)
1593             modes[i + nout] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1594         }
1595
1596       template = ASM_OPERANDS_TEMPLATE (asmop);
1597     }
1598   else if (GET_CODE (body) == PARALLEL
1599            && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
1600     {
1601       /* No outputs, but some CLOBBERs.  */
1602
1603       rtx asmop = XVECEXP (body, 0, 0);
1604       int nin = ASM_OPERANDS_INPUT_LENGTH (asmop);
1605
1606       for (i = 0; i < nin; i++)
1607         {
1608           if (operand_locs)
1609             operand_locs[i] = &ASM_OPERANDS_INPUT (asmop, i);
1610           if (operands)
1611             operands[i] = ASM_OPERANDS_INPUT (asmop, i);
1612           if (constraints)
1613             constraints[i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1614           if (modes)
1615             modes[i] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1616         }
1617
1618       template = ASM_OPERANDS_TEMPLATE (asmop);
1619     }
1620
1621   return template;
1622 }
1623
1624 /* Check if an asm_operand matches it's constraints. 
1625    Return > 0 if ok, = 0 if bad, < 0 if inconclusive.  */
1626
1627 int
1628 asm_operand_ok (op, constraint)
1629      rtx op;
1630      const char *constraint;
1631 {
1632   int result = 0;
1633
1634   /* Use constrain_operands after reload.  */
1635   if (reload_completed)
1636     abort ();
1637
1638   while (*constraint)
1639     {
1640       char c = *constraint++;
1641       switch (c)
1642         {
1643         case '=':
1644         case '+':
1645         case '*':
1646         case '%':
1647         case '?':
1648         case '!':
1649         case '#':
1650         case '&':
1651         case ',':
1652           break;
1653
1654         case '0': case '1': case '2': case '3': case '4':
1655         case '5': case '6': case '7': case '8': case '9':
1656           /* For best results, our caller should have given us the
1657              proper matching constraint, but we can't actually fail
1658              the check if they didn't.  Indicate that results are
1659              inconclusive.  */
1660           while (*constraint >= '0' && *constraint <= '9')
1661             constraint++;
1662           result = -1;
1663           break;
1664
1665         case 'p':
1666           if (address_operand (op, VOIDmode))
1667             return 1;
1668           break;
1669
1670         case 'm':
1671         case 'V': /* non-offsettable */
1672           if (memory_operand (op, VOIDmode))
1673             return 1;
1674           break;
1675
1676         case 'o': /* offsettable */
1677           if (offsettable_nonstrict_memref_p (op))
1678             return 1;
1679           break;
1680
1681         case '<':
1682           /* ??? Before flow, auto inc/dec insns are not supposed to exist,
1683              excepting those that expand_call created.  Further, on some
1684              machines which do not have generalized auto inc/dec, an inc/dec
1685              is not a memory_operand.
1686
1687              Match any memory and hope things are resolved after reload.  */
1688
1689           if (GET_CODE (op) == MEM
1690               && (1
1691                   || GET_CODE (XEXP (op, 0)) == PRE_DEC
1692                   || GET_CODE (XEXP (op, 0)) == POST_DEC))
1693             return 1;
1694           break;
1695
1696         case '>':
1697           if (GET_CODE (op) == MEM
1698               && (1
1699                   || GET_CODE (XEXP (op, 0)) == PRE_INC
1700                   || GET_CODE (XEXP (op, 0)) == POST_INC))
1701             return 1;
1702           break;
1703
1704         case 'E':
1705 #ifndef REAL_ARITHMETIC
1706           /* Match any floating double constant, but only if
1707              we can examine the bits of it reliably.  */
1708           if ((HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT
1709                || HOST_BITS_PER_WIDE_INT != BITS_PER_WORD)
1710               && GET_MODE (op) != VOIDmode && ! flag_pretend_float)
1711             break;
1712 #endif
1713           /* FALLTHRU */
1714
1715         case 'F':
1716           if (GET_CODE (op) == CONST_DOUBLE)
1717             return 1;
1718           break;
1719
1720         case 'G':
1721           if (GET_CODE (op) == CONST_DOUBLE
1722               && CONST_DOUBLE_OK_FOR_LETTER_P (op, 'G'))
1723             return 1;
1724           break;
1725         case 'H':
1726           if (GET_CODE (op) == CONST_DOUBLE
1727               && CONST_DOUBLE_OK_FOR_LETTER_P (op, 'H'))
1728             return 1;
1729           break;
1730
1731         case 's':
1732           if (GET_CODE (op) == CONST_INT
1733               || (GET_CODE (op) == CONST_DOUBLE
1734                   && GET_MODE (op) == VOIDmode))
1735             break;
1736           /* FALLTHRU */
1737
1738         case 'i':
1739           if (CONSTANT_P (op)
1740 #ifdef LEGITIMATE_PIC_OPERAND_P
1741               && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
1742 #endif
1743               )
1744             return 1;
1745           break;
1746
1747         case 'n':
1748           if (GET_CODE (op) == CONST_INT
1749               || (GET_CODE (op) == CONST_DOUBLE
1750                   && GET_MODE (op) == VOIDmode))
1751             return 1;
1752           break;
1753
1754         case 'I':
1755           if (GET_CODE (op) == CONST_INT
1756               && CONST_OK_FOR_LETTER_P (INTVAL (op), 'I'))
1757             return 1;
1758           break;
1759         case 'J':
1760           if (GET_CODE (op) == CONST_INT
1761               && CONST_OK_FOR_LETTER_P (INTVAL (op), 'J'))
1762             return 1;
1763           break;
1764         case 'K':
1765           if (GET_CODE (op) == CONST_INT
1766               && CONST_OK_FOR_LETTER_P (INTVAL (op), 'K'))
1767             return 1;
1768           break;
1769         case 'L':
1770           if (GET_CODE (op) == CONST_INT
1771               && CONST_OK_FOR_LETTER_P (INTVAL (op), 'L'))
1772             return 1;
1773           break;
1774         case 'M':
1775           if (GET_CODE (op) == CONST_INT
1776               && CONST_OK_FOR_LETTER_P (INTVAL (op), 'M'))
1777             return 1;
1778           break;
1779         case 'N':
1780           if (GET_CODE (op) == CONST_INT
1781               && CONST_OK_FOR_LETTER_P (INTVAL (op), 'N'))
1782             return 1;
1783           break;
1784         case 'O':
1785           if (GET_CODE (op) == CONST_INT
1786               && CONST_OK_FOR_LETTER_P (INTVAL (op), 'O'))
1787             return 1;
1788           break;
1789         case 'P':
1790           if (GET_CODE (op) == CONST_INT
1791               && CONST_OK_FOR_LETTER_P (INTVAL (op), 'P'))
1792             return 1;
1793           break;
1794
1795         case 'X':
1796           return 1;
1797
1798         case 'g':
1799           if (general_operand (op, VOIDmode))
1800             return 1;
1801           break;
1802
1803         default:
1804           /* For all other letters, we first check for a register class,
1805              otherwise it is an EXTRA_CONSTRAINT.  */
1806           if (REG_CLASS_FROM_LETTER (c) != NO_REGS)
1807             {
1808             case 'r':
1809               if (GET_MODE (op) == BLKmode)
1810                 break;
1811               if (register_operand (op, VOIDmode))
1812                 return 1;
1813             }
1814 #ifdef EXTRA_CONSTRAINT
1815           if (EXTRA_CONSTRAINT (op, c))
1816             return 1;
1817 #endif
1818           break;
1819         }
1820     }
1821
1822   return result;
1823 }
1824 \f
1825 /* Given an rtx *P, if it is a sum containing an integer constant term,
1826    return the location (type rtx *) of the pointer to that constant term.
1827    Otherwise, return a null pointer.  */
1828
1829 rtx *
1830 find_constant_term_loc (p)
1831      rtx *p;
1832 {
1833   rtx *tem;
1834   enum rtx_code code = GET_CODE (*p);
1835
1836   /* If *P IS such a constant term, P is its location.  */
1837
1838   if (code == CONST_INT || code == SYMBOL_REF || code == LABEL_REF
1839       || code == CONST)
1840     return p;
1841
1842   /* Otherwise, if not a sum, it has no constant term.  */
1843
1844   if (GET_CODE (*p) != PLUS)
1845     return 0;
1846
1847   /* If one of the summands is constant, return its location.  */
1848
1849   if (XEXP (*p, 0) && CONSTANT_P (XEXP (*p, 0))
1850       && XEXP (*p, 1) && CONSTANT_P (XEXP (*p, 1)))
1851     return p;
1852
1853   /* Otherwise, check each summand for containing a constant term.  */
1854
1855   if (XEXP (*p, 0) != 0)
1856     {
1857       tem = find_constant_term_loc (&XEXP (*p, 0));
1858       if (tem != 0)
1859         return tem;
1860     }
1861
1862   if (XEXP (*p, 1) != 0)
1863     {
1864       tem = find_constant_term_loc (&XEXP (*p, 1));
1865       if (tem != 0)
1866         return tem;
1867     }
1868
1869   return 0;
1870 }
1871 \f
1872 /* Return 1 if OP is a memory reference
1873    whose address contains no side effects
1874    and remains valid after the addition
1875    of a positive integer less than the
1876    size of the object being referenced.
1877
1878    We assume that the original address is valid and do not check it.
1879
1880    This uses strict_memory_address_p as a subroutine, so
1881    don't use it before reload.  */
1882
1883 int
1884 offsettable_memref_p (op)
1885      rtx op;
1886 {
1887   return ((GET_CODE (op) == MEM)
1888           && offsettable_address_p (1, GET_MODE (op), XEXP (op, 0)));
1889 }
1890
1891 /* Similar, but don't require a strictly valid mem ref:
1892    consider pseudo-regs valid as index or base regs.  */
1893
1894 int
1895 offsettable_nonstrict_memref_p (op)
1896      rtx op;
1897 {
1898   return ((GET_CODE (op) == MEM)
1899           && offsettable_address_p (0, GET_MODE (op), XEXP (op, 0)));
1900 }
1901
1902 /* Return 1 if Y is a memory address which contains no side effects
1903    and would remain valid after the addition of a positive integer
1904    less than the size of that mode.
1905
1906    We assume that the original address is valid and do not check it.
1907    We do check that it is valid for narrower modes.
1908
1909    If STRICTP is nonzero, we require a strictly valid address,
1910    for the sake of use in reload.c.  */
1911
1912 int
1913 offsettable_address_p (strictp, mode, y)
1914      int strictp;
1915      enum machine_mode mode;
1916      rtx y;
1917 {
1918   enum rtx_code ycode = GET_CODE (y);
1919   rtx z;
1920   rtx y1 = y;
1921   rtx *y2;
1922   int (*addressp) PARAMS ((enum machine_mode, rtx)) =
1923     (strictp ? strict_memory_address_p : memory_address_p);
1924   unsigned int mode_sz = GET_MODE_SIZE (mode);
1925
1926   if (CONSTANT_ADDRESS_P (y))
1927     return 1;
1928
1929   /* Adjusting an offsettable address involves changing to a narrower mode.
1930      Make sure that's OK.  */
1931
1932   if (mode_dependent_address_p (y))
1933     return 0;
1934
1935   /* ??? How much offset does an offsettable BLKmode reference need?
1936      Clearly that depends on the situation in which it's being used.
1937      However, the current situation in which we test 0xffffffff is
1938      less than ideal.  Caveat user.  */
1939   if (mode_sz == 0)
1940     mode_sz = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
1941
1942   /* If the expression contains a constant term,
1943      see if it remains valid when max possible offset is added.  */
1944
1945   if ((ycode == PLUS) && (y2 = find_constant_term_loc (&y1)))
1946     {
1947       int good;
1948
1949       y1 = *y2;
1950       *y2 = plus_constant (*y2, mode_sz - 1);
1951       /* Use QImode because an odd displacement may be automatically invalid
1952          for any wider mode.  But it should be valid for a single byte.  */
1953       good = (*addressp) (QImode, y);
1954
1955       /* In any case, restore old contents of memory.  */
1956       *y2 = y1;
1957       return good;
1958     }
1959
1960   if (GET_RTX_CLASS (ycode) == 'a')
1961     return 0;
1962
1963   /* The offset added here is chosen as the maximum offset that
1964      any instruction could need to add when operating on something
1965      of the specified mode.  We assume that if Y and Y+c are
1966      valid addresses then so is Y+d for all 0<d<c.  adjust_address will
1967      go inside a LO_SUM here, so we do so as well.  */
1968   if (GET_CODE (y) == LO_SUM)
1969     z = gen_rtx_LO_SUM (GET_MODE (y), XEXP (y, 0),
1970                         plus_constant (XEXP (y, 1), mode_sz - 1));
1971   else
1972     z = plus_constant (y, mode_sz - 1);
1973
1974   /* Use QImode because an odd displacement may be automatically invalid
1975      for any wider mode.  But it should be valid for a single byte.  */
1976   return (*addressp) (QImode, z);
1977 }
1978
1979 /* Return 1 if ADDR is an address-expression whose effect depends
1980    on the mode of the memory reference it is used in.
1981
1982    Autoincrement addressing is a typical example of mode-dependence
1983    because the amount of the increment depends on the mode.  */
1984
1985 int
1986 mode_dependent_address_p (addr)
1987   rtx addr ATTRIBUTE_UNUSED; /* Maybe used in GO_IF_MODE_DEPENDENT_ADDRESS.  */
1988 {
1989   GO_IF_MODE_DEPENDENT_ADDRESS (addr, win);
1990   return 0;
1991   /* Label `win' might (not) be used via GO_IF_MODE_DEPENDENT_ADDRESS.  */
1992  win: ATTRIBUTE_UNUSED_LABEL
1993   return 1;
1994 }
1995
1996 /* Return 1 if OP is a general operand
1997    other than a memory ref with a mode dependent address.  */
1998
1999 int
2000 mode_independent_operand (op, mode)
2001      enum machine_mode mode;
2002      rtx op;
2003 {
2004   rtx addr;
2005
2006   if (! general_operand (op, mode))
2007     return 0;
2008
2009   if (GET_CODE (op) != MEM)
2010     return 1;
2011
2012   addr = XEXP (op, 0);
2013   GO_IF_MODE_DEPENDENT_ADDRESS (addr, lose);
2014   return 1;
2015   /* Label `lose' might (not) be used via GO_IF_MODE_DEPENDENT_ADDRESS.  */
2016  lose: ATTRIBUTE_UNUSED_LABEL
2017   return 0;
2018 }
2019 \f
2020 /* Like extract_insn, but save insn extracted and don't extract again, when
2021    called again for the same insn expecting that recog_data still contain the
2022    valid information.  This is used primary by gen_attr infrastructure that
2023    often does extract insn again and again.  */
2024 void
2025 extract_insn_cached (insn)
2026      rtx insn;
2027 {
2028   if (recog_data.insn == insn && INSN_CODE (insn) >= 0)
2029     return;
2030   extract_insn (insn);
2031   recog_data.insn = insn;
2032 }
2033 /* Do cached extract_insn, constrain_operand and complain about failures.
2034    Used by insn_attrtab.  */
2035 void
2036 extract_constrain_insn_cached (insn)
2037      rtx insn;
2038 {
2039   extract_insn_cached (insn);
2040   if (which_alternative == -1
2041       && !constrain_operands (reload_completed))
2042     fatal_insn_not_found (insn);
2043 }
2044 /* Do cached constrain_operand and complain about failures.  */
2045 int
2046 constrain_operands_cached (strict)
2047         int strict;
2048 {
2049   if (which_alternative == -1)
2050     return constrain_operands (strict);
2051   else
2052     return 1;
2053 }
2054 \f
2055 /* Analyze INSN and fill in recog_data.  */
2056
2057 void
2058 extract_insn (insn)
2059      rtx insn;
2060 {
2061   int i;
2062   int icode;
2063   int noperands;
2064   rtx body = PATTERN (insn);
2065
2066   recog_data.insn = NULL;
2067   recog_data.n_operands = 0;
2068   recog_data.n_alternatives = 0;
2069   recog_data.n_dups = 0;
2070   which_alternative = -1;
2071
2072   switch (GET_CODE (body))
2073     {
2074     case USE:
2075     case CLOBBER:
2076     case ASM_INPUT:
2077     case ADDR_VEC:
2078     case ADDR_DIFF_VEC:
2079       return;
2080
2081     case SET:
2082       if (GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
2083         goto asm_insn;
2084       else
2085         goto normal_insn;
2086     case PARALLEL:
2087       if ((GET_CODE (XVECEXP (body, 0, 0)) == SET
2088            && GET_CODE (SET_SRC (XVECEXP (body, 0, 0))) == ASM_OPERANDS)
2089           || GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
2090         goto asm_insn;
2091       else
2092         goto normal_insn;
2093     case ASM_OPERANDS:
2094     asm_insn:
2095       recog_data.n_operands = noperands = asm_noperands (body);
2096       if (noperands >= 0)
2097         {
2098           /* This insn is an `asm' with operands.  */
2099
2100           /* expand_asm_operands makes sure there aren't too many operands.  */
2101           if (noperands > MAX_RECOG_OPERANDS)
2102             abort ();
2103
2104           /* Now get the operand values and constraints out of the insn.  */
2105           decode_asm_operands (body, recog_data.operand,
2106                                recog_data.operand_loc,
2107                                recog_data.constraints,
2108                                recog_data.operand_mode);
2109           if (noperands > 0)
2110             {
2111               const char *p =  recog_data.constraints[0];
2112               recog_data.n_alternatives = 1;
2113               while (*p)
2114                 recog_data.n_alternatives += (*p++ == ',');
2115             }
2116           break;
2117         }
2118       fatal_insn_not_found (insn);
2119
2120     default:
2121     normal_insn:
2122       /* Ordinary insn: recognize it, get the operands via insn_extract
2123          and get the constraints.  */
2124
2125       icode = recog_memoized (insn);
2126       if (icode < 0)
2127         fatal_insn_not_found (insn);
2128
2129       recog_data.n_operands = noperands = insn_data[icode].n_operands;
2130       recog_data.n_alternatives = insn_data[icode].n_alternatives;
2131       recog_data.n_dups = insn_data[icode].n_dups;
2132
2133       insn_extract (insn);
2134
2135       for (i = 0; i < noperands; i++)
2136         {
2137           recog_data.constraints[i] = insn_data[icode].operand[i].constraint;
2138           recog_data.operand_mode[i] = insn_data[icode].operand[i].mode;
2139           /* VOIDmode match_operands gets mode from their real operand.  */
2140           if (recog_data.operand_mode[i] == VOIDmode)
2141             recog_data.operand_mode[i] = GET_MODE (recog_data.operand[i]);
2142         }
2143     }
2144   for (i = 0; i < noperands; i++)
2145     recog_data.operand_type[i]
2146       = (recog_data.constraints[i][0] == '=' ? OP_OUT
2147          : recog_data.constraints[i][0] == '+' ? OP_INOUT
2148          : OP_IN);
2149
2150   if (recog_data.n_alternatives > MAX_RECOG_ALTERNATIVES)
2151     abort ();
2152 }
2153
2154 /* After calling extract_insn, you can use this function to extract some
2155    information from the constraint strings into a more usable form.
2156    The collected data is stored in recog_op_alt.  */
2157 void
2158 preprocess_constraints ()
2159 {
2160   int i;
2161
2162   memset (recog_op_alt, 0, sizeof recog_op_alt);
2163   for (i = 0; i < recog_data.n_operands; i++)
2164     {
2165       int j;
2166       struct operand_alternative *op_alt;
2167       const char *p = recog_data.constraints[i];
2168
2169       op_alt = recog_op_alt[i];
2170
2171       for (j = 0; j < recog_data.n_alternatives; j++)
2172         {
2173           op_alt[j].class = NO_REGS;
2174           op_alt[j].constraint = p;
2175           op_alt[j].matches = -1;
2176           op_alt[j].matched = -1;
2177
2178           if (*p == '\0' || *p == ',')
2179             {
2180               op_alt[j].anything_ok = 1;
2181               continue;
2182             }
2183
2184           for (;;)
2185             {
2186               char c = *p++;
2187               if (c == '#')
2188                 do
2189                   c = *p++;
2190                 while (c != ',' && c != '\0');
2191               if (c == ',' || c == '\0')
2192                 break;
2193
2194               switch (c)
2195                 {
2196                 case '=': case '+': case '*': case '%':
2197                 case 'E': case 'F': case 'G': case 'H':
2198                 case 's': case 'i': case 'n':
2199                 case 'I': case 'J': case 'K': case 'L':
2200                 case 'M': case 'N': case 'O': case 'P':
2201                   /* These don't say anything we care about.  */
2202                   break;
2203
2204                 case '?':
2205                   op_alt[j].reject += 6;
2206                   break;
2207                 case '!':
2208                   op_alt[j].reject += 600;
2209                   break;
2210                 case '&':
2211                   op_alt[j].earlyclobber = 1;
2212                   break;                  
2213
2214                 case '0': case '1': case '2': case '3': case '4':
2215                 case '5': case '6': case '7': case '8': case '9':
2216                   {
2217                     char *end;
2218                     op_alt[j].matches = strtoul (p - 1, &end, 10);
2219                     recog_op_alt[op_alt[j].matches][j].matched = i;
2220                     p = end;
2221                   }
2222                   break;
2223
2224                 case 'm':
2225                   op_alt[j].memory_ok = 1;
2226                   break;
2227                 case '<':
2228                   op_alt[j].decmem_ok = 1;
2229                   break;
2230                 case '>':
2231                   op_alt[j].incmem_ok = 1;
2232                   break;
2233                 case 'V':
2234                   op_alt[j].nonoffmem_ok = 1;
2235                   break;
2236                 case 'o':
2237                   op_alt[j].offmem_ok = 1;
2238                   break;
2239                 case 'X':
2240                   op_alt[j].anything_ok = 1;
2241                   break;
2242
2243                 case 'p':
2244                   op_alt[j].is_address = 1;
2245                   op_alt[j].class = reg_class_subunion[(int) op_alt[j].class][(int) BASE_REG_CLASS];
2246                   break;
2247
2248                 case 'g': case 'r':
2249                   op_alt[j].class = reg_class_subunion[(int) op_alt[j].class][(int) GENERAL_REGS];
2250                   break;
2251
2252                 default:
2253                   op_alt[j].class = reg_class_subunion[(int) op_alt[j].class][(int) REG_CLASS_FROM_LETTER ((unsigned char)c)];
2254                   break;
2255                 }
2256             }
2257         }
2258     }
2259 }
2260  
2261 /* Check the operands of an insn against the insn's operand constraints
2262    and return 1 if they are valid.
2263    The information about the insn's operands, constraints, operand modes
2264    etc. is obtained from the global variables set up by extract_insn.
2265
2266    WHICH_ALTERNATIVE is set to a number which indicates which
2267    alternative of constraints was matched: 0 for the first alternative,
2268    1 for the next, etc.
2269
2270    In addition, when two operands are match
2271    and it happens that the output operand is (reg) while the
2272    input operand is --(reg) or ++(reg) (a pre-inc or pre-dec),
2273    make the output operand look like the input.
2274    This is because the output operand is the one the template will print.
2275
2276    This is used in final, just before printing the assembler code and by
2277    the routines that determine an insn's attribute.
2278
2279    If STRICT is a positive non-zero value, it means that we have been
2280    called after reload has been completed.  In that case, we must
2281    do all checks strictly.  If it is zero, it means that we have been called
2282    before reload has completed.  In that case, we first try to see if we can
2283    find an alternative that matches strictly.  If not, we try again, this
2284    time assuming that reload will fix up the insn.  This provides a "best
2285    guess" for the alternative and is used to compute attributes of insns prior
2286    to reload.  A negative value of STRICT is used for this internal call.  */
2287
2288 struct funny_match
2289 {
2290   int this, other;
2291 };
2292
2293 int
2294 constrain_operands (strict)
2295      int strict;
2296 {
2297   const char *constraints[MAX_RECOG_OPERANDS];
2298   int matching_operands[MAX_RECOG_OPERANDS];
2299   int earlyclobber[MAX_RECOG_OPERANDS];
2300   int c;
2301
2302   struct funny_match funny_match[MAX_RECOG_OPERANDS];
2303   int funny_match_index;
2304
2305   which_alternative = 0;
2306   if (recog_data.n_operands == 0 || recog_data.n_alternatives == 0)
2307     return 1;
2308
2309   for (c = 0; c < recog_data.n_operands; c++)
2310     {
2311       constraints[c] = recog_data.constraints[c];
2312       matching_operands[c] = -1;
2313     }
2314
2315   do
2316     {
2317       int opno;
2318       int lose = 0;
2319       funny_match_index = 0;
2320
2321       for (opno = 0; opno < recog_data.n_operands; opno++)
2322         {
2323           rtx op = recog_data.operand[opno];
2324           enum machine_mode mode = GET_MODE (op);
2325           const char *p = constraints[opno];
2326           int offset = 0;
2327           int win = 0;
2328           int val;
2329
2330           earlyclobber[opno] = 0;
2331
2332           /* A unary operator may be accepted by the predicate, but it
2333              is irrelevant for matching constraints.  */
2334           if (GET_RTX_CLASS (GET_CODE (op)) == '1')
2335             op = XEXP (op, 0);
2336
2337           if (GET_CODE (op) == SUBREG)
2338             {
2339               if (GET_CODE (SUBREG_REG (op)) == REG
2340                   && REGNO (SUBREG_REG (op)) < FIRST_PSEUDO_REGISTER)
2341                 offset = subreg_regno_offset (REGNO (SUBREG_REG (op)),
2342                                               GET_MODE (SUBREG_REG (op)),
2343                                               SUBREG_BYTE (op),
2344                                               GET_MODE (op));
2345               op = SUBREG_REG (op);
2346             }
2347
2348           /* An empty constraint or empty alternative
2349              allows anything which matched the pattern.  */
2350           if (*p == 0 || *p == ',')
2351             win = 1;
2352
2353           while (*p && (c = *p++) != ',')
2354             switch (c)
2355               {
2356               case '?':  case '!': case '*':  case '%':
2357               case '=':  case '+':
2358                 break;
2359
2360               case '#':
2361                 /* Ignore rest of this alternative as far as
2362                    constraint checking is concerned.  */
2363                 while (*p && *p != ',')
2364                   p++;
2365                 break;
2366
2367               case '&':
2368                 earlyclobber[opno] = 1;
2369                 break;
2370
2371               case '0':  case '1':  case '2':  case '3':  case '4':
2372               case '5':  case '6':  case '7':  case '8':  case '9':
2373                 {
2374                   /* This operand must be the same as a previous one.
2375                      This kind of constraint is used for instructions such
2376                      as add when they take only two operands.
2377
2378                      Note that the lower-numbered operand is passed first.
2379
2380                      If we are not testing strictly, assume that this
2381                      constraint will be satisfied.  */
2382
2383                   char *end;
2384                   int match;
2385
2386                   match = strtoul (p - 1, &end, 10);
2387                   p = end;
2388
2389                   if (strict < 0)
2390                     val = 1;
2391                   else
2392                     {
2393                       rtx op1 = recog_data.operand[match];
2394                       rtx op2 = recog_data.operand[opno];
2395
2396                       /* A unary operator may be accepted by the predicate,
2397                          but it is irrelevant for matching constraints.  */
2398                       if (GET_RTX_CLASS (GET_CODE (op1)) == '1')
2399                         op1 = XEXP (op1, 0);
2400                       if (GET_RTX_CLASS (GET_CODE (op2)) == '1')
2401                         op2 = XEXP (op2, 0);
2402
2403                       val = operands_match_p (op1, op2);
2404                     }
2405
2406                   matching_operands[opno] = match;
2407                   matching_operands[match] = opno;
2408
2409                   if (val != 0)
2410                     win = 1;
2411
2412                   /* If output is *x and input is *--x, arrange later
2413                      to change the output to *--x as well, since the
2414                      output op is the one that will be printed.  */
2415                   if (val == 2 && strict > 0)
2416                     {
2417                       funny_match[funny_match_index].this = opno;
2418                       funny_match[funny_match_index++].other = match;
2419                     }
2420                 }
2421                 break;
2422
2423               case 'p':
2424                 /* p is used for address_operands.  When we are called by
2425                    gen_reload, no one will have checked that the address is
2426                    strictly valid, i.e., that all pseudos requiring hard regs
2427                    have gotten them.  */
2428                 if (strict <= 0
2429                     || (strict_memory_address_p (recog_data.operand_mode[opno],
2430                                                  op)))
2431                   win = 1;
2432                 break;
2433
2434                 /* No need to check general_operand again;
2435                    it was done in insn-recog.c.  */
2436               case 'g':
2437                 /* Anything goes unless it is a REG and really has a hard reg
2438                    but the hard reg is not in the class GENERAL_REGS.  */
2439                 if (strict < 0
2440                     || GENERAL_REGS == ALL_REGS
2441                     || GET_CODE (op) != REG
2442                     || (reload_in_progress
2443                         && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2444                     || reg_fits_class_p (op, GENERAL_REGS, offset, mode))
2445                   win = 1;
2446                 break;
2447
2448               case 'X':
2449                 /* This is used for a MATCH_SCRATCH in the cases when
2450                    we don't actually need anything.  So anything goes
2451                    any time.  */
2452                 win = 1;
2453                 break;
2454
2455               case 'm':
2456                 if (GET_CODE (op) == MEM
2457                     /* Before reload, accept what reload can turn into mem.  */
2458                     || (strict < 0 && CONSTANT_P (op))
2459                     /* During reload, accept a pseudo  */
2460                     || (reload_in_progress && GET_CODE (op) == REG
2461                         && REGNO (op) >= FIRST_PSEUDO_REGISTER))
2462                   win = 1;
2463                 break;
2464
2465               case '<':
2466                 if (GET_CODE (op) == MEM
2467                     && (GET_CODE (XEXP (op, 0)) == PRE_DEC
2468                         || GET_CODE (XEXP (op, 0)) == POST_DEC))
2469                   win = 1;
2470                 break;
2471
2472               case '>':
2473                 if (GET_CODE (op) == MEM
2474                     && (GET_CODE (XEXP (op, 0)) == PRE_INC
2475                         || GET_CODE (XEXP (op, 0)) == POST_INC))
2476                   win = 1;
2477                 break;
2478
2479               case 'E':
2480 #ifndef REAL_ARITHMETIC
2481                 /* Match any CONST_DOUBLE, but only if
2482                    we can examine the bits of it reliably.  */
2483                 if ((HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT
2484                      || HOST_BITS_PER_WIDE_INT != BITS_PER_WORD)
2485                     && GET_MODE (op) != VOIDmode && ! flag_pretend_float)
2486                   break;
2487 #endif
2488                 if (GET_CODE (op) == CONST_DOUBLE)
2489                   win = 1;
2490                 break;
2491
2492               case 'F':
2493                 if (GET_CODE (op) == CONST_DOUBLE)
2494                   win = 1;
2495                 break;
2496
2497               case 'G':
2498               case 'H':
2499                 if (GET_CODE (op) == CONST_DOUBLE
2500                     && CONST_DOUBLE_OK_FOR_LETTER_P (op, c))
2501                   win = 1;
2502                 break;
2503
2504               case 's':
2505                 if (GET_CODE (op) == CONST_INT
2506                     || (GET_CODE (op) == CONST_DOUBLE
2507                         && GET_MODE (op) == VOIDmode))
2508                   break;
2509               case 'i':
2510                 if (CONSTANT_P (op))
2511                   win = 1;
2512                 break;
2513
2514               case 'n':
2515                 if (GET_CODE (op) == CONST_INT
2516                     || (GET_CODE (op) == CONST_DOUBLE
2517                         && GET_MODE (op) == VOIDmode))
2518                   win = 1;
2519                 break;
2520
2521               case 'I':
2522               case 'J':
2523               case 'K':
2524               case 'L':
2525               case 'M':
2526               case 'N':
2527               case 'O':
2528               case 'P':
2529                 if (GET_CODE (op) == CONST_INT
2530                     && CONST_OK_FOR_LETTER_P (INTVAL (op), c))
2531                   win = 1;
2532                 break;
2533
2534               case 'V':
2535                 if (GET_CODE (op) == MEM
2536                     && ((strict > 0 && ! offsettable_memref_p (op))
2537                         || (strict < 0
2538                             && !(CONSTANT_P (op) || GET_CODE (op) == MEM))
2539                         || (reload_in_progress
2540                             && !(GET_CODE (op) == REG
2541                                  && REGNO (op) >= FIRST_PSEUDO_REGISTER))))
2542                   win = 1;
2543                 break;
2544
2545               case 'o':
2546                 if ((strict > 0 && offsettable_memref_p (op))
2547                     || (strict == 0 && offsettable_nonstrict_memref_p (op))
2548                     /* Before reload, accept what reload can handle.  */
2549                     || (strict < 0
2550                         && (CONSTANT_P (op) || GET_CODE (op) == MEM))
2551                     /* During reload, accept a pseudo  */
2552                     || (reload_in_progress && GET_CODE (op) == REG
2553                         && REGNO (op) >= FIRST_PSEUDO_REGISTER))
2554                   win = 1;
2555                 break;
2556
2557               default:
2558                 {
2559                   enum reg_class class;
2560
2561                   class = (c == 'r' ? GENERAL_REGS : REG_CLASS_FROM_LETTER (c));
2562                   if (class != NO_REGS)
2563                     {
2564                       if (strict < 0
2565                           || (strict == 0
2566                               && GET_CODE (op) == REG
2567                               && REGNO (op) >= FIRST_PSEUDO_REGISTER)
2568                           || (strict == 0 && GET_CODE (op) == SCRATCH)
2569                           || (GET_CODE (op) == REG
2570                               && reg_fits_class_p (op, class, offset, mode)))
2571                         win = 1;
2572                     }
2573 #ifdef EXTRA_CONSTRAINT
2574                   else if (EXTRA_CONSTRAINT (op, c))
2575                     win = 1;
2576 #endif
2577                   break;
2578                 }
2579               }
2580
2581           constraints[opno] = p;
2582           /* If this operand did not win somehow,
2583              this alternative loses.  */
2584           if (! win)
2585             lose = 1;
2586         }
2587       /* This alternative won; the operands are ok.
2588          Change whichever operands this alternative says to change.  */
2589       if (! lose)
2590         {
2591           int opno, eopno;
2592
2593           /* See if any earlyclobber operand conflicts with some other
2594              operand.  */
2595
2596           if (strict > 0)
2597             for (eopno = 0; eopno < recog_data.n_operands; eopno++)
2598               /* Ignore earlyclobber operands now in memory,
2599                  because we would often report failure when we have
2600                  two memory operands, one of which was formerly a REG.  */
2601               if (earlyclobber[eopno]
2602                   && GET_CODE (recog_data.operand[eopno]) == REG)
2603                 for (opno = 0; opno < recog_data.n_operands; opno++)
2604                   if ((GET_CODE (recog_data.operand[opno]) == MEM
2605                        || recog_data.operand_type[opno] != OP_OUT)
2606                       && opno != eopno
2607                       /* Ignore things like match_operator operands.  */
2608                       && *recog_data.constraints[opno] != 0
2609                       && ! (matching_operands[opno] == eopno
2610                             && operands_match_p (recog_data.operand[opno],
2611                                                  recog_data.operand[eopno]))
2612                       && ! safe_from_earlyclobber (recog_data.operand[opno],
2613                                                    recog_data.operand[eopno]))
2614                     lose = 1;
2615
2616           if (! lose)
2617             {
2618               while (--funny_match_index >= 0)
2619                 {
2620                   recog_data.operand[funny_match[funny_match_index].other]
2621                     = recog_data.operand[funny_match[funny_match_index].this];
2622                 }
2623
2624               return 1;
2625             }
2626         }
2627
2628       which_alternative++;
2629     }
2630   while (which_alternative < recog_data.n_alternatives);
2631
2632   which_alternative = -1;
2633   /* If we are about to reject this, but we are not to test strictly,
2634      try a very loose test.  Only return failure if it fails also.  */
2635   if (strict == 0)
2636     return constrain_operands (-1);
2637   else
2638     return 0;
2639 }
2640
2641 /* Return 1 iff OPERAND (assumed to be a REG rtx)
2642    is a hard reg in class CLASS when its regno is offset by OFFSET
2643    and changed to mode MODE.
2644    If REG occupies multiple hard regs, all of them must be in CLASS.  */
2645
2646 int
2647 reg_fits_class_p (operand, class, offset, mode)
2648      rtx operand;
2649      enum reg_class class;
2650      int offset;
2651      enum machine_mode mode;
2652 {
2653   int regno = REGNO (operand);
2654   if (regno < FIRST_PSEUDO_REGISTER
2655       && TEST_HARD_REG_BIT (reg_class_contents[(int) class],
2656                             regno + offset))
2657     {
2658       int sr;
2659       regno += offset;
2660       for (sr = HARD_REGNO_NREGS (regno, mode) - 1;
2661            sr > 0; sr--)
2662         if (! TEST_HARD_REG_BIT (reg_class_contents[(int) class],
2663                                  regno + sr))
2664           break;
2665       return sr == 0;
2666     }
2667
2668   return 0;
2669 }
2670 \f
2671 /* Split single instruction.  Helper function for split_all_insns.
2672    Return last insn in the sequence if successful, or NULL if unsuccessful.  */
2673 static rtx
2674 split_insn (insn)
2675      rtx insn;
2676 {
2677   rtx set;
2678   if (!INSN_P (insn))
2679     ;
2680   /* Don't split no-op move insns.  These should silently
2681      disappear later in final.  Splitting such insns would
2682      break the code that handles REG_NO_CONFLICT blocks.  */
2683
2684   else if ((set = single_set (insn)) != NULL && set_noop_p (set))
2685     {
2686       /* Nops get in the way while scheduling, so delete them
2687          now if register allocation has already been done.  It
2688          is too risky to try to do this before register
2689          allocation, and there are unlikely to be very many
2690          nops then anyways.  */
2691       if (reload_completed)
2692         {
2693           PUT_CODE (insn, NOTE);
2694           NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
2695           NOTE_SOURCE_FILE (insn) = 0;
2696         }
2697     }
2698   else
2699     {
2700       /* Split insns here to get max fine-grain parallelism.  */
2701       rtx first = PREV_INSN (insn);
2702       rtx last = try_split (PATTERN (insn), insn, 1);
2703
2704       if (last != insn)
2705         {
2706           /* try_split returns the NOTE that INSN became.  */
2707           PUT_CODE (insn, NOTE);
2708           NOTE_SOURCE_FILE (insn) = 0;
2709           NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
2710
2711           /* ??? Coddle to md files that generate subregs in post-
2712              reload splitters instead of computing the proper 
2713              hard register.  */
2714           if (reload_completed && first != last)
2715             {
2716               first = NEXT_INSN (first);
2717               while (1)
2718                 {
2719                   if (INSN_P (first))
2720                     cleanup_subreg_operands (first);
2721                   if (first == last)
2722                     break;
2723                   first = NEXT_INSN (first);
2724                 }
2725             }
2726           return last;
2727         }
2728     }
2729   return NULL_RTX;
2730 }
2731 /* Split all insns in the function.  If UPD_LIFE, update life info after.  */
2732
2733 void
2734 split_all_insns (upd_life)
2735      int upd_life;
2736 {
2737   sbitmap blocks;
2738   int changed;
2739   int i;
2740
2741   blocks = sbitmap_alloc (n_basic_blocks);
2742   sbitmap_zero (blocks);
2743   changed = 0;
2744
2745   for (i = n_basic_blocks - 1; i >= 0; --i)
2746     {
2747       basic_block bb = BASIC_BLOCK (i);
2748       rtx insn, next;
2749
2750       for (insn = bb->head; insn ; insn = next)
2751         {
2752           rtx last;
2753
2754           /* Can't use `next_real_insn' because that might go across
2755              CODE_LABELS and short-out basic blocks.  */
2756           next = NEXT_INSN (insn);
2757           last = split_insn (insn);
2758           if (last)
2759             {
2760               /* The split sequence may include barrier, but the
2761                  BB boundary we are interested in will be set to previous
2762                  one.  */
2763
2764               while (GET_CODE (last) == BARRIER)
2765                 last = PREV_INSN (last);
2766               SET_BIT (blocks, i);
2767               changed = 1;
2768               insn = last;
2769             }
2770
2771           if (insn == bb->end)
2772             break;
2773         }
2774
2775       if (insn == NULL)
2776         abort ();
2777     }
2778
2779   if (changed)
2780     {
2781       find_many_sub_basic_blocks (blocks);
2782     }
2783
2784   if (changed && upd_life)
2785     {
2786       count_or_remove_death_notes (blocks, 1);
2787       update_life_info (blocks, UPDATE_LIFE_LOCAL, PROP_DEATH_NOTES);
2788     }
2789 #ifdef ENABLE_CHECKING
2790   verify_flow_info ();
2791 #endif
2792
2793   sbitmap_free (blocks);
2794 }
2795
2796 /* Same as split_all_insns, but do not expect CFG to be available. 
2797    Used by machine depedent reorg passes.  */
2798
2799 void
2800 split_all_insns_noflow ()
2801 {
2802   rtx next, insn;
2803
2804   for (insn = get_insns (); insn; insn = next)
2805     {
2806       next = NEXT_INSN (insn);
2807       split_insn (insn);
2808     }
2809   return;
2810 }
2811 \f
2812 #ifdef HAVE_peephole2
2813 struct peep2_insn_data
2814 {
2815   rtx insn;
2816   regset live_before;
2817 };
2818
2819 static struct peep2_insn_data peep2_insn_data[MAX_INSNS_PER_PEEP2 + 1];
2820 static int peep2_current;
2821
2822 /* A non-insn marker indicating the last insn of the block.
2823    The live_before regset for this element is correct, indicating
2824    global_live_at_end for the block.  */
2825 #define PEEP2_EOB       pc_rtx
2826
2827 /* Return the Nth non-note insn after `current', or return NULL_RTX if it
2828    does not exist.  Used by the recognizer to find the next insn to match
2829    in a multi-insn pattern.  */
2830
2831 rtx
2832 peep2_next_insn (n)
2833      int n;
2834 {
2835   if (n >= MAX_INSNS_PER_PEEP2 + 1)
2836     abort ();
2837
2838   n += peep2_current;
2839   if (n >= MAX_INSNS_PER_PEEP2 + 1)
2840     n -= MAX_INSNS_PER_PEEP2 + 1;
2841
2842   if (peep2_insn_data[n].insn == PEEP2_EOB)
2843     return NULL_RTX;
2844   return peep2_insn_data[n].insn;
2845 }
2846
2847 /* Return true if REGNO is dead before the Nth non-note insn
2848    after `current'.  */
2849
2850 int
2851 peep2_regno_dead_p (ofs, regno)
2852      int ofs;
2853      int regno;
2854 {
2855   if (ofs >= MAX_INSNS_PER_PEEP2 + 1)
2856     abort ();
2857
2858   ofs += peep2_current;
2859   if (ofs >= MAX_INSNS_PER_PEEP2 + 1)
2860     ofs -= MAX_INSNS_PER_PEEP2 + 1;
2861
2862   if (peep2_insn_data[ofs].insn == NULL_RTX)
2863     abort ();
2864
2865   return ! REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno);
2866 }
2867
2868 /* Similarly for a REG.  */
2869
2870 int
2871 peep2_reg_dead_p (ofs, reg)
2872      int ofs;
2873      rtx reg;
2874 {
2875   int regno, n;
2876
2877   if (ofs >= MAX_INSNS_PER_PEEP2 + 1)
2878     abort ();
2879
2880   ofs += peep2_current;
2881   if (ofs >= MAX_INSNS_PER_PEEP2 + 1)
2882     ofs -= MAX_INSNS_PER_PEEP2 + 1;
2883
2884   if (peep2_insn_data[ofs].insn == NULL_RTX)
2885     abort ();
2886
2887   regno = REGNO (reg);
2888   n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
2889   while (--n >= 0)
2890     if (REGNO_REG_SET_P (peep2_insn_data[ofs].live_before, regno + n))
2891       return 0;
2892   return 1;
2893 }
2894
2895 /* Try to find a hard register of mode MODE, matching the register class in
2896    CLASS_STR, which is available at the beginning of insn CURRENT_INSN and
2897    remains available until the end of LAST_INSN.  LAST_INSN may be NULL_RTX,
2898    in which case the only condition is that the register must be available
2899    before CURRENT_INSN.
2900    Registers that already have bits set in REG_SET will not be considered.
2901
2902    If an appropriate register is available, it will be returned and the
2903    corresponding bit(s) in REG_SET will be set; otherwise, NULL_RTX is
2904    returned.  */
2905
2906 rtx
2907 peep2_find_free_register (from, to, class_str, mode, reg_set)
2908      int from, to;
2909      const char *class_str;
2910      enum machine_mode mode;
2911      HARD_REG_SET *reg_set;
2912 {
2913   static int search_ofs;
2914   enum reg_class class;
2915   HARD_REG_SET live;
2916   int i;
2917
2918   if (from >= MAX_INSNS_PER_PEEP2 + 1 || to >= MAX_INSNS_PER_PEEP2 + 1)
2919     abort ();
2920
2921   from += peep2_current;
2922   if (from >= MAX_INSNS_PER_PEEP2 + 1)
2923     from -= MAX_INSNS_PER_PEEP2 + 1;
2924   to += peep2_current;
2925   if (to >= MAX_INSNS_PER_PEEP2 + 1)
2926     to -= MAX_INSNS_PER_PEEP2 + 1;
2927
2928   if (peep2_insn_data[from].insn == NULL_RTX)
2929     abort ();
2930   REG_SET_TO_HARD_REG_SET (live, peep2_insn_data[from].live_before);
2931
2932   while (from != to)
2933     {
2934       HARD_REG_SET this_live;
2935
2936       if (++from >= MAX_INSNS_PER_PEEP2 + 1)
2937         from = 0;
2938       if (peep2_insn_data[from].insn == NULL_RTX)
2939         abort ();
2940       REG_SET_TO_HARD_REG_SET (this_live, peep2_insn_data[from].live_before);
2941       IOR_HARD_REG_SET (live, this_live);
2942     }
2943
2944   class = (class_str[0] == 'r' ? GENERAL_REGS
2945            : REG_CLASS_FROM_LETTER (class_str[0]));
2946
2947   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2948     {
2949       int raw_regno, regno, success, j;
2950
2951       /* Distribute the free registers as much as possible.  */
2952       raw_regno = search_ofs + i;
2953       if (raw_regno >= FIRST_PSEUDO_REGISTER)
2954         raw_regno -= FIRST_PSEUDO_REGISTER;
2955 #ifdef REG_ALLOC_ORDER
2956       regno = reg_alloc_order[raw_regno];
2957 #else
2958       regno = raw_regno;
2959 #endif
2960
2961       /* Don't allocate fixed registers.  */
2962       if (fixed_regs[regno])
2963         continue;
2964       /* Make sure the register is of the right class.  */
2965       if (! TEST_HARD_REG_BIT (reg_class_contents[class], regno))
2966         continue;
2967       /* And can support the mode we need.  */
2968       if (! HARD_REGNO_MODE_OK (regno, mode))
2969         continue;
2970       /* And that we don't create an extra save/restore.  */
2971       if (! call_used_regs[regno] && ! regs_ever_live[regno])
2972         continue;
2973       /* And we don't clobber traceback for noreturn functions.  */
2974       if ((regno == FRAME_POINTER_REGNUM || regno == HARD_FRAME_POINTER_REGNUM)
2975           && (! reload_completed || frame_pointer_needed))
2976         continue;
2977
2978       success = 1;
2979       for (j = HARD_REGNO_NREGS (regno, mode) - 1; j >= 0; j--)
2980         {
2981           if (TEST_HARD_REG_BIT (*reg_set, regno + j)
2982               || TEST_HARD_REG_BIT (live, regno + j))
2983             {
2984               success = 0;
2985               break;
2986             }
2987         }
2988       if (success)
2989         {
2990           for (j = HARD_REGNO_NREGS (regno, mode) - 1; j >= 0; j--)
2991             SET_HARD_REG_BIT (*reg_set, regno + j);
2992
2993           /* Start the next search with the next register.  */
2994           if (++raw_regno >= FIRST_PSEUDO_REGISTER)
2995             raw_regno = 0;
2996           search_ofs = raw_regno;
2997
2998           return gen_rtx_REG (mode, regno);
2999         }
3000     }
3001
3002   search_ofs = 0;
3003   return NULL_RTX;
3004 }
3005
3006 /* Perform the peephole2 optimization pass.  */
3007
3008 void
3009 peephole2_optimize (dump_file)
3010      FILE *dump_file ATTRIBUTE_UNUSED;
3011 {
3012   regset_head rs_heads[MAX_INSNS_PER_PEEP2 + 2];
3013   rtx insn, prev;
3014   regset live;
3015   int i, b;
3016 #ifdef HAVE_conditional_execution
3017   sbitmap blocks;
3018   int changed;
3019 #endif
3020
3021   /* Initialize the regsets we're going to use.  */
3022   for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3023     peep2_insn_data[i].live_before = INITIALIZE_REG_SET (rs_heads[i]);
3024   live = INITIALIZE_REG_SET (rs_heads[i]);
3025
3026 #ifdef HAVE_conditional_execution
3027   blocks = sbitmap_alloc (n_basic_blocks);
3028   sbitmap_zero (blocks);
3029   changed = 0;
3030 #else
3031   count_or_remove_death_notes (NULL, 1);
3032 #endif
3033
3034   for (b = n_basic_blocks - 1; b >= 0; --b)
3035     {
3036       basic_block bb = BASIC_BLOCK (b);
3037       struct propagate_block_info *pbi;
3038
3039       /* Indicate that all slots except the last holds invalid data.  */
3040       for (i = 0; i < MAX_INSNS_PER_PEEP2; ++i)
3041         peep2_insn_data[i].insn = NULL_RTX;
3042
3043       /* Indicate that the last slot contains live_after data.  */
3044       peep2_insn_data[MAX_INSNS_PER_PEEP2].insn = PEEP2_EOB;
3045       peep2_current = MAX_INSNS_PER_PEEP2;
3046
3047       /* Start up propagation.  */
3048       COPY_REG_SET (live, bb->global_live_at_end);
3049       COPY_REG_SET (peep2_insn_data[MAX_INSNS_PER_PEEP2].live_before, live);
3050
3051 #ifdef HAVE_conditional_execution
3052       pbi = init_propagate_block_info (bb, live, NULL, NULL, 0);
3053 #else
3054       pbi = init_propagate_block_info (bb, live, NULL, NULL, PROP_DEATH_NOTES);
3055 #endif
3056
3057       for (insn = bb->end; ; insn = prev)
3058         {
3059           prev = PREV_INSN (insn);
3060           if (INSN_P (insn))
3061             {
3062               rtx try;
3063               int match_len;
3064
3065               /* Record this insn.  */
3066               if (--peep2_current < 0)
3067                 peep2_current = MAX_INSNS_PER_PEEP2;
3068               peep2_insn_data[peep2_current].insn = insn;
3069               propagate_one_insn (pbi, insn);
3070               COPY_REG_SET (peep2_insn_data[peep2_current].live_before, live);
3071
3072               /* Match the peephole.  */
3073               try = peephole2_insns (PATTERN (insn), insn, &match_len);
3074               if (try != NULL)
3075                 {
3076                   /* If we are splitting a CALL_INSN, look for the CALL_INSN
3077                      in SEQ and copy our CALL_INSN_FUNCTION_USAGE and other
3078                      cfg-related call notes.  */
3079                   for (i = 0; i <= match_len; ++i)
3080                     {
3081                       int j, k;
3082                       rtx old_insn, new_insn, note;
3083
3084                       j = i + peep2_current;
3085                       if (j >= MAX_INSNS_PER_PEEP2 + 1)
3086                         j -= MAX_INSNS_PER_PEEP2 + 1;
3087                       old_insn = peep2_insn_data[j].insn;
3088                       if (GET_CODE (old_insn) != CALL_INSN)
3089                         continue;
3090
3091                       new_insn = NULL_RTX;
3092                       if (GET_CODE (try) == SEQUENCE)
3093                         for (k = XVECLEN (try, 0) - 1; k >= 0; k--)
3094                           {
3095                             rtx x = XVECEXP (try, 0, k);
3096                             if (GET_CODE (x) == CALL_INSN)
3097                               {
3098                                 new_insn = x;
3099                                 break;
3100                               }
3101                           }
3102                       else if (GET_CODE (try) == CALL_INSN)
3103                         new_insn = try;
3104                       if (! new_insn)
3105                         abort ();
3106
3107                       CALL_INSN_FUNCTION_USAGE (new_insn)
3108                         = CALL_INSN_FUNCTION_USAGE (old_insn);
3109
3110                       for (note = REG_NOTES (old_insn);
3111                            note;
3112                            note = XEXP (note, 1))
3113                         switch (REG_NOTE_KIND (note))
3114                           {
3115                           case REG_EH_REGION:
3116                           case REG_NORETURN:
3117                           case REG_SETJMP:
3118                           case REG_ALWAYS_RETURN:
3119                             REG_NOTES (new_insn)
3120                               = gen_rtx_EXPR_LIST (REG_NOTE_KIND (note),
3121                                                    XEXP (note, 0),
3122                                                    REG_NOTES (new_insn));
3123                             break;
3124                           }
3125
3126                       /* Croak if there is another call in the sequence.  */
3127                       while (++i <= match_len)
3128                         {
3129                           j = i + peep2_current;
3130                           if (j >= MAX_INSNS_PER_PEEP2 + 1)
3131                             j -= MAX_INSNS_PER_PEEP2 + 1;
3132                           old_insn = peep2_insn_data[j].insn;
3133                           if (GET_CODE (old_insn) == CALL_INSN)
3134                             abort ();
3135                         }
3136                       break;
3137                     }
3138
3139                   i = match_len + peep2_current;
3140                   if (i >= MAX_INSNS_PER_PEEP2 + 1)
3141                     i -= MAX_INSNS_PER_PEEP2 + 1;
3142
3143                   /* Replace the old sequence with the new.  */
3144                   try = emit_insn_after (try, peep2_insn_data[i].insn);
3145                   delete_insn_chain (insn, peep2_insn_data[i].insn);
3146
3147 #ifdef HAVE_conditional_execution
3148                   /* With conditional execution, we cannot back up the
3149                      live information so easily, since the conditional
3150                      death data structures are not so self-contained.
3151                      So record that we've made a modification to this
3152                      block and update life information at the end.  */
3153                   SET_BIT (blocks, b);
3154                   changed = 1;
3155
3156                   for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3157                     peep2_insn_data[i].insn = NULL_RTX;
3158                   peep2_insn_data[peep2_current].insn = PEEP2_EOB;
3159 #else
3160                   /* Back up lifetime information past the end of the
3161                      newly created sequence.  */
3162                   if (++i >= MAX_INSNS_PER_PEEP2 + 1)
3163                     i = 0;
3164                   COPY_REG_SET (live, peep2_insn_data[i].live_before);
3165
3166                   /* Update life information for the new sequence.  */
3167                   do
3168                     {
3169                       if (INSN_P (try))
3170                         {
3171                           if (--i < 0)
3172                             i = MAX_INSNS_PER_PEEP2;
3173                           peep2_insn_data[i].insn = try;
3174                           propagate_one_insn (pbi, try);
3175                           COPY_REG_SET (peep2_insn_data[i].live_before, live);
3176                         }
3177                       try = PREV_INSN (try);
3178                     }
3179                   while (try != prev);
3180
3181                   /* ??? Should verify that LIVE now matches what we
3182                      had before the new sequence.  */
3183
3184                   peep2_current = i;
3185 #endif
3186                 }
3187             }
3188
3189           if (insn == bb->head)
3190             break;
3191         }
3192
3193       free_propagate_block_info (pbi);
3194     }
3195
3196   for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
3197     FREE_REG_SET (peep2_insn_data[i].live_before);
3198   FREE_REG_SET (live);
3199
3200 #ifdef HAVE_conditional_execution
3201   count_or_remove_death_notes (blocks, 1);
3202   update_life_info (blocks, UPDATE_LIFE_LOCAL, PROP_DEATH_NOTES);
3203   sbitmap_free (blocks);
3204 #endif
3205 }
3206 #endif /* HAVE_peephole2 */