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