OSDN Git Service

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