OSDN Git Service

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