OSDN Git Service

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