OSDN Git Service

Initial revision
[pf3gnuchains/gcc-fork.git] / gcc / recog.c
1 /* Subroutines used by or related to instruction recognition.
2    Copyright (C) 1987, 1988, 1991-6, 1997 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 "rtl.h"
24 #include <stdio.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
35 #ifndef STACK_PUSH_CODE
36 #ifdef STACK_GROWS_DOWNWARD
37 #define STACK_PUSH_CODE PRE_DEC
38 #else
39 #define STACK_PUSH_CODE PRE_INC
40 #endif
41 #endif
42
43 /* Import from final.c: */
44 extern rtx alter_subreg ();
45
46 int strict_memory_address_p ();
47 int memory_address_p ();
48
49 /* Nonzero means allow operands to be volatile.
50    This should be 0 if you are generating rtl, such as if you are calling
51    the functions in optabs.c and expmed.c (most of the time).
52    This should be 1 if all valid insns need to be recognized,
53    such as in regclass.c and final.c and reload.c.
54
55    init_recog and init_recog_no_volatile are responsible for setting this.  */
56
57 int volatile_ok;
58
59 /* On return from `constrain_operands', indicate which alternative
60    was satisfied.  */
61
62 int which_alternative;
63
64 /* Nonzero after end of reload pass.
65    Set to 1 or 0 by toplev.c.
66    Controls the significance of (SUBREG (MEM)).  */
67
68 int reload_completed;
69
70 /* Initialize data used by the function `recog'.
71    This must be called once in the compilation of a function
72    before any insn recognition may be done in the function.  */
73
74 void
75 init_recog_no_volatile ()
76 {
77   volatile_ok = 0;
78 }
79
80 void
81 init_recog ()
82 {
83   volatile_ok = 1;
84 }
85
86 /* Try recognizing the instruction INSN,
87    and return the code number that results.
88    Remember the code so that repeated calls do not
89    need to spend the time for actual rerecognition.
90
91    This function is the normal interface to instruction recognition.
92    The automatically-generated function `recog' is normally called
93    through this one.  (The only exception is in combine.c.)  */
94
95 int
96 recog_memoized (insn)
97      rtx insn;
98 {
99   if (INSN_CODE (insn) < 0)
100     INSN_CODE (insn) = recog (PATTERN (insn), insn, NULL_PTR);
101   return INSN_CODE (insn);
102 }
103 \f
104 /* Check that X is an insn-body for an `asm' with operands
105    and that the operands mentioned in it are legitimate.  */
106
107 int
108 check_asm_operands (x)
109      rtx x;
110 {
111   int noperands = asm_noperands (x);
112   rtx *operands;
113   int i;
114
115   if (noperands < 0)
116     return 0;
117   if (noperands == 0)
118     return 1;
119
120   operands = (rtx *) alloca (noperands * sizeof (rtx));
121   decode_asm_operands (x, operands, NULL_PTR, NULL_PTR, NULL_PTR);
122
123   for (i = 0; i < noperands; i++)
124     if (!general_operand (operands[i], VOIDmode))
125       return 0;
126
127   return 1;
128 }
129 \f
130 /* Static data for the next two routines.
131
132    The maximum number of changes supported is defined as the maximum
133    number of operands times 5.  This allows for repeated substitutions
134    inside complex indexed address, or, alternatively, changes in up
135    to 5 insns.  */
136
137 #define MAX_CHANGE_LOCS (MAX_RECOG_OPERANDS * 5)
138
139 static rtx change_objects[MAX_CHANGE_LOCS];
140 static int change_old_codes[MAX_CHANGE_LOCS];
141 static rtx *change_locs[MAX_CHANGE_LOCS];
142 static rtx change_olds[MAX_CHANGE_LOCS];
143
144 static int num_changes = 0;
145
146 /* Validate a proposed change to OBJECT.  LOC is the location in the rtl for
147    at which NEW will be placed.  If OBJECT is zero, no validation is done,
148    the change is simply made.
149
150    Two types of objects are supported:  If OBJECT is a MEM, memory_address_p
151    will be called with the address and mode as parameters.  If OBJECT is
152    an INSN, CALL_INSN, or JUMP_INSN, the insn will be re-recognized with
153    the change in place.
154
155    IN_GROUP is non-zero if this is part of a group of changes that must be
156    performed as a group.  In that case, the changes will be stored.  The
157    function `apply_change_group' will validate and apply the changes.
158
159    If IN_GROUP is zero, this is a single change.  Try to recognize the insn
160    or validate the memory reference with the change applied.  If the result
161    is not valid for the machine, suppress the change and return zero.
162    Otherwise, perform the change and return 1.  */
163
164 int
165 validate_change (object, loc, new, in_group)
166     rtx object;
167     rtx *loc;
168     rtx new;
169     int in_group;
170 {
171   rtx old = *loc;
172
173   if (old == new || rtx_equal_p (old, new))
174     return 1;
175
176   if (num_changes >= MAX_CHANGE_LOCS
177       || (in_group == 0 && num_changes != 0))
178     abort ();
179
180   *loc = new;
181
182   /* Save the information describing this change.  */
183   change_objects[num_changes] = object;
184   change_locs[num_changes] = loc;
185   change_olds[num_changes] = old;
186
187   if (object && GET_CODE (object) != MEM)
188     {
189       /* Set INSN_CODE to force rerecognition of insn.  Save old code in
190          case invalid.  */
191       change_old_codes[num_changes] = INSN_CODE (object);
192       INSN_CODE (object) = -1;
193     }
194
195   num_changes++;
196
197   /* If we are making a group of changes, return 1.  Otherwise, validate the
198      change group we made.  */
199
200   if (in_group)
201     return 1;
202   else
203     return apply_change_group ();
204 }
205
206 /* Apply a group of changes previously issued with `validate_change'.
207    Return 1 if all changes are valid, zero otherwise.  */
208
209 int
210 apply_change_group ()
211 {
212   int i;
213
214   /* The changes have been applied and all INSN_CODEs have been reset to force
215      rerecognition.
216
217      The changes are valid if we aren't given an object, or if we are
218      given a MEM and it still is a valid address, or if this is in insn
219      and it is recognized.  In the latter case, if reload has completed,
220      we also require that the operands meet the constraints for
221      the insn.  We do not allow modifying an ASM_OPERANDS after reload
222      has completed because verifying the constraints is too difficult.  */
223
224   for (i = 0; i < num_changes; i++)
225     {
226       rtx object = change_objects[i];
227
228       if (object == 0)
229         continue;
230
231       if (GET_CODE (object) == MEM)
232         {
233           if (! memory_address_p (GET_MODE (object), XEXP (object, 0)))
234             break;
235         }
236       else if ((recog_memoized (object) < 0
237                 && (asm_noperands (PATTERN (object)) < 0
238                     || ! check_asm_operands (PATTERN (object))
239                     || reload_completed))
240                || (reload_completed
241                    && (insn_extract (object),
242                        ! constrain_operands (INSN_CODE (object), 1))))
243         {
244           rtx pat = PATTERN (object);
245
246           /* Perhaps we couldn't recognize the insn because there were
247              extra CLOBBERs at the end.  If so, try to re-recognize
248              without the last CLOBBER (later iterations will cause each of
249              them to be eliminated, in turn).  But don't do this if we
250              have an ASM_OPERAND.  */
251           if (GET_CODE (pat) == PARALLEL
252               && GET_CODE (XVECEXP (pat, 0, XVECLEN (pat, 0) - 1)) == CLOBBER
253               && asm_noperands (PATTERN (object)) < 0)
254             {
255                rtx newpat;
256
257                if (XVECLEN (pat, 0) == 2)
258                  newpat = XVECEXP (pat, 0, 0);
259                else
260                  {
261                    int j;
262
263                    newpat = gen_rtx (PARALLEL, VOIDmode, 
264                                      gen_rtvec (XVECLEN (pat, 0) - 1));
265                    for (j = 0; j < XVECLEN (newpat, 0); j++)
266                      XVECEXP (newpat, 0, j) = XVECEXP (pat, 0, j);
267                  }
268
269                /* Add a new change to this group to replace the pattern
270                   with this new pattern.  Then consider this change
271                   as having succeeded.  The change we added will
272                   cause the entire call to fail if things remain invalid.
273
274                   Note that this can lose if a later change than the one
275                   we are processing specified &XVECEXP (PATTERN (object), 0, X)
276                   but this shouldn't occur.  */
277
278                validate_change (object, &PATTERN (object), newpat, 1);
279              }
280           else if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
281             /* If this insn is a CLOBBER or USE, it is always valid, but is
282                never recognized.  */
283             continue;
284           else
285             break;
286         }
287     }
288
289   if (i == num_changes)
290     {
291       num_changes = 0;
292       return 1;
293     }
294   else
295     {
296       cancel_changes (0);
297       return 0;
298     }
299 }
300
301 /* Return the number of changes so far in the current group.   */
302
303 int
304 num_validated_changes ()
305 {
306   return num_changes;
307 }
308
309 /* Retract the changes numbered NUM and up.  */
310
311 void
312 cancel_changes (num)
313      int num;
314 {
315   int i;
316
317   /* Back out all the changes.  Do this in the opposite order in which
318      they were made.  */
319   for (i = num_changes - 1; i >= num; i--)
320     {
321       *change_locs[i] = change_olds[i];
322       if (change_objects[i] && GET_CODE (change_objects[i]) != MEM)
323         INSN_CODE (change_objects[i]) = change_old_codes[i];
324     }
325   num_changes = num;
326 }
327
328 /* Replace every occurrence of FROM in X with TO.  Mark each change with
329    validate_change passing OBJECT.  */
330
331 static void
332 validate_replace_rtx_1 (loc, from, to, object)
333      rtx *loc;
334      rtx from, to, object;
335 {
336   register int i, j;
337   register char *fmt;
338   register rtx x = *loc;
339   enum rtx_code code = GET_CODE (x);
340
341   /* X matches FROM if it is the same rtx or they are both referring to the
342      same register in the same mode.  Avoid calling rtx_equal_p unless the
343      operands look similar.  */
344
345   if (x == from
346       || (GET_CODE (x) == REG && GET_CODE (from) == REG
347           && GET_MODE (x) == GET_MODE (from)
348           && REGNO (x) == REGNO (from))
349       || (GET_CODE (x) == GET_CODE (from) && GET_MODE (x) == GET_MODE (from)
350           && rtx_equal_p (x, from)))
351     {
352       validate_change (object, loc, to, 1);
353       return;
354     }
355
356   /* For commutative or comparison operations, try replacing each argument
357      separately and seeing if we made any changes.  If so, put a constant
358      argument last.*/
359   if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == 'c')
360     {
361       int prev_changes = num_changes;
362
363       validate_replace_rtx_1 (&XEXP (x, 0), from, to, object);
364       validate_replace_rtx_1 (&XEXP (x, 1), from, to, object);
365       if (prev_changes != num_changes && CONSTANT_P (XEXP (x, 0)))
366         {
367           validate_change (object, loc,
368                            gen_rtx (GET_RTX_CLASS (code) == 'c' ? code
369                                     : swap_condition (code),
370                                     GET_MODE (x), XEXP (x, 1), XEXP (x, 0)),
371                            1);
372           x = *loc;
373           code = GET_CODE (x);
374         }
375     }
376
377   /* Note that if CODE's RTX_CLASS is "c" or "<" we will have already
378      done the substitution, otherwise we won't.  */
379
380   switch (code)
381     {
382     case PLUS:
383       /* If we have have a PLUS whose second operand is now a CONST_INT, use
384          plus_constant to try to simplify it.  */
385       if (GET_CODE (XEXP (x, 1)) == CONST_INT && XEXP (x, 1) == to)
386         validate_change (object, loc, plus_constant (XEXP (x, 0), INTVAL (to)),
387                          1);
388       return;
389
390     case MINUS:
391       if (GET_CODE (to) == CONST_INT && XEXP (x, 1) == from)
392         {
393           validate_change (object, loc,
394                            plus_constant (XEXP (x, 0), - INTVAL (to)),
395                            1);
396           return;
397         }
398       break;
399       
400     case ZERO_EXTEND:
401     case SIGN_EXTEND:
402       /* In these cases, the operation to be performed depends on the mode
403          of the operand.  If we are replacing the operand with a VOIDmode
404          constant, we lose the information.  So try to simplify the operation
405          in that case.  If it fails, substitute in something that we know
406          won't be recognized.  */
407       if (GET_MODE (to) == VOIDmode
408           && (XEXP (x, 0) == from
409               || (GET_CODE (XEXP (x, 0)) == REG && GET_CODE (from) == REG
410                   && GET_MODE (XEXP (x, 0)) == GET_MODE (from)
411                   && REGNO (XEXP (x, 0)) == REGNO (from))))
412         {
413           rtx new = simplify_unary_operation (code, GET_MODE (x), to,
414                                               GET_MODE (from));
415           if (new == 0)
416             new = gen_rtx (CLOBBER, GET_MODE (x), const0_rtx);
417
418           validate_change (object, loc, new, 1);
419           return;
420         }
421       break;
422         
423     case SUBREG:
424       /* If we have a SUBREG of a register that we are replacing and we are
425          replacing it with a MEM, make a new MEM and try replacing the
426          SUBREG with it.  Don't do this if the MEM has a mode-dependent address
427          or if we would be widening it.  */
428
429       if (SUBREG_REG (x) == from
430           && GET_CODE (from) == REG
431           && GET_CODE (to) == MEM
432           && ! mode_dependent_address_p (XEXP (to, 0))
433           && ! MEM_VOLATILE_P (to)
434           && GET_MODE_SIZE (GET_MODE (x)) <= GET_MODE_SIZE (GET_MODE (to)))
435         {
436           int offset = SUBREG_WORD (x) * UNITS_PER_WORD;
437           enum machine_mode mode = GET_MODE (x);
438           rtx new;
439
440           if (BYTES_BIG_ENDIAN)
441             offset += (MIN (UNITS_PER_WORD,
442                             GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
443                        - MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)));
444
445           new = gen_rtx (MEM, mode, plus_constant (XEXP (to, 0), offset));
446           MEM_VOLATILE_P (new) = MEM_VOLATILE_P (to);
447           RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (to);
448           MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (to);
449           validate_change (object, loc, new, 1);
450           return;
451         }
452       break;
453
454     case ZERO_EXTRACT:
455     case SIGN_EXTRACT:
456       /* If we are replacing a register with memory, try to change the memory
457          to be the mode required for memory in extract operations (this isn't
458          likely to be an insertion operation; if it was, nothing bad will
459          happen, we might just fail in some cases).  */
460
461       if (XEXP (x, 0) == from && GET_CODE (from) == REG && GET_CODE (to) == MEM
462           && GET_CODE (XEXP (x, 1)) == CONST_INT
463           && GET_CODE (XEXP (x, 2)) == CONST_INT
464           && ! mode_dependent_address_p (XEXP (to, 0))
465           && ! MEM_VOLATILE_P (to))
466         {
467           enum machine_mode wanted_mode = VOIDmode;
468           enum machine_mode is_mode = GET_MODE (to);
469           int width = INTVAL (XEXP (x, 1));
470           int pos = INTVAL (XEXP (x, 2));
471
472 #ifdef HAVE_extzv
473           if (code == ZERO_EXTRACT)
474             wanted_mode = insn_operand_mode[(int) CODE_FOR_extzv][1];
475 #endif
476 #ifdef HAVE_extv
477           if (code == SIGN_EXTRACT)
478             wanted_mode = insn_operand_mode[(int) CODE_FOR_extv][1];
479 #endif
480
481           /* If we have a narrower mode, we can do something.  */
482           if (wanted_mode != VOIDmode
483               && GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
484             {
485               int offset = pos / BITS_PER_UNIT;
486               rtx newmem;
487
488                   /* If the bytes and bits are counted differently, we
489                      must adjust the offset.  */
490               if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN)
491                 offset = (GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (wanted_mode)
492                           - offset);
493
494               pos %= GET_MODE_BITSIZE (wanted_mode);
495
496               newmem = gen_rtx (MEM, wanted_mode,
497                                 plus_constant (XEXP (to, 0), offset));
498               RTX_UNCHANGING_P (newmem) = RTX_UNCHANGING_P (to);
499               MEM_VOLATILE_P (newmem) = MEM_VOLATILE_P (to);
500               MEM_IN_STRUCT_P (newmem) = MEM_IN_STRUCT_P (to);
501
502               validate_change (object, &XEXP (x, 2), GEN_INT (pos), 1);
503               validate_change (object, &XEXP (x, 0), newmem, 1);
504             }
505         }
506
507       break;
508     }
509       
510   fmt = GET_RTX_FORMAT (code);
511   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
512     {
513       if (fmt[i] == 'e')
514         validate_replace_rtx_1 (&XEXP (x, i), from, to, object);
515       else if (fmt[i] == 'E')
516         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
517           validate_replace_rtx_1 (&XVECEXP (x, i, j), from, to, object);
518     }
519 }
520
521 /* Try replacing every occurrence of FROM in INSN with TO.  After all
522    changes have been made, validate by seeing if INSN is still valid.  */
523
524 int
525 validate_replace_rtx (from, to, insn)
526      rtx from, to, insn;
527 {
528   validate_replace_rtx_1 (&PATTERN (insn), from, to, insn);
529   return apply_change_group ();
530 }
531 \f
532 #ifdef HAVE_cc0
533 /* Return 1 if the insn using CC0 set by INSN does not contain
534    any ordered tests applied to the condition codes.
535    EQ and NE tests do not count.  */
536
537 int
538 next_insn_tests_no_inequality (insn)
539      rtx insn;
540 {
541   register rtx next = next_cc0_user (insn);
542
543   /* If there is no next insn, we have to take the conservative choice.  */
544   if (next == 0)
545     return 0;
546
547   return ((GET_CODE (next) == JUMP_INSN
548            || GET_CODE (next) == INSN
549            || GET_CODE (next) == CALL_INSN)
550           && ! inequality_comparisons_p (PATTERN (next)));
551 }
552
553 #if 0  /* This is useless since the insn that sets the cc's
554           must be followed immediately by the use of them.  */
555 /* Return 1 if the CC value set up by INSN is not used.  */
556
557 int
558 next_insns_test_no_inequality (insn)
559      rtx insn;
560 {
561   register rtx next = NEXT_INSN (insn);
562
563   for (; next != 0; next = NEXT_INSN (next))
564     {
565       if (GET_CODE (next) == CODE_LABEL
566           || GET_CODE (next) == BARRIER)
567         return 1;
568       if (GET_CODE (next) == NOTE)
569         continue;
570       if (inequality_comparisons_p (PATTERN (next)))
571         return 0;
572       if (sets_cc0_p (PATTERN (next)) == 1)
573         return 1;
574       if (! reg_mentioned_p (cc0_rtx, PATTERN (next)))
575         return 1;
576     }
577   return 1;
578 }
579 #endif
580 #endif
581 \f
582 /* This is used by find_single_use to locate an rtx that contains exactly one
583    use of DEST, which is typically either a REG or CC0.  It returns a
584    pointer to the innermost rtx expression containing DEST.  Appearances of
585    DEST that are being used to totally replace it are not counted.  */
586
587 static rtx *
588 find_single_use_1 (dest, loc)
589      rtx dest;
590      rtx *loc;
591 {
592   rtx x = *loc;
593   enum rtx_code code = GET_CODE (x);
594   rtx *result = 0;
595   rtx *this_result;
596   int i;
597   char *fmt;
598
599   switch (code)
600     {
601     case CONST_INT:
602     case CONST:
603     case LABEL_REF:
604     case SYMBOL_REF:
605     case CONST_DOUBLE:
606     case CLOBBER:
607       return 0;
608
609     case SET:
610       /* If the destination is anything other than CC0, PC, a REG or a SUBREG
611          of a REG that occupies all of the REG, the insn uses DEST if
612          it is mentioned in the destination or the source.  Otherwise, we
613          need just check the source.  */
614       if (GET_CODE (SET_DEST (x)) != CC0
615           && GET_CODE (SET_DEST (x)) != PC
616           && GET_CODE (SET_DEST (x)) != REG
617           && ! (GET_CODE (SET_DEST (x)) == SUBREG
618                 && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG
619                 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
620                       + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
621                     == ((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
622                          + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))))
623         break;
624
625       return find_single_use_1 (dest, &SET_SRC (x));
626
627     case MEM:
628     case SUBREG:
629       return find_single_use_1 (dest, &XEXP (x, 0));
630     }
631
632   /* If it wasn't one of the common cases above, check each expression and
633      vector of this code.  Look for a unique usage of DEST.  */
634
635   fmt = GET_RTX_FORMAT (code);
636   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
637     {
638       if (fmt[i] == 'e')
639         {
640           if (dest == XEXP (x, i)
641               || (GET_CODE (dest) == REG && GET_CODE (XEXP (x, i)) == REG
642                   && REGNO (dest) == REGNO (XEXP (x, i))))
643             this_result = loc;
644           else
645             this_result = find_single_use_1 (dest, &XEXP (x, i));
646
647           if (result == 0)
648             result = this_result;
649           else if (this_result)
650             /* Duplicate usage.  */
651             return 0;
652         }
653       else if (fmt[i] == 'E')
654         {
655           int j;
656
657           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
658             {
659               if (XVECEXP (x, i, j) == dest
660                   || (GET_CODE (dest) == REG
661                       && GET_CODE (XVECEXP (x, i, j)) == REG
662                       && REGNO (XVECEXP (x, i, j)) == REGNO (dest)))
663                 this_result = loc;
664               else
665                 this_result = find_single_use_1 (dest, &XVECEXP (x, i, j));
666
667               if (result == 0)
668                 result = this_result;
669               else if (this_result)
670                 return 0;
671             }
672         }
673     }
674
675   return result;
676 }
677 \f
678 /* See if DEST, produced in INSN, is used only a single time in the
679    sequel.  If so, return a pointer to the innermost rtx expression in which
680    it is used.
681
682    If PLOC is non-zero, *PLOC is set to the insn containing the single use.
683
684    This routine will return usually zero either before flow is called (because
685    there will be no LOG_LINKS notes) or after reload (because the REG_DEAD
686    note can't be trusted).
687
688    If DEST is cc0_rtx, we look only at the next insn.  In that case, we don't
689    care about REG_DEAD notes or LOG_LINKS.
690
691    Otherwise, we find the single use by finding an insn that has a
692    LOG_LINKS pointing at INSN and has a REG_DEAD note for DEST.  If DEST is
693    only referenced once in that insn, we know that it must be the first
694    and last insn referencing DEST.  */
695
696 rtx *
697 find_single_use (dest, insn, ploc)
698      rtx dest;
699      rtx insn;
700      rtx *ploc;
701 {
702   rtx next;
703   rtx *result;
704   rtx link;
705
706 #ifdef HAVE_cc0
707   if (dest == cc0_rtx)
708     {
709       next = NEXT_INSN (insn);
710       if (next == 0
711           || (GET_CODE (next) != INSN && GET_CODE (next) != JUMP_INSN))
712         return 0;
713
714       result = find_single_use_1 (dest, &PATTERN (next));
715       if (result && ploc)
716         *ploc = next;
717       return result;
718     }
719 #endif
720
721   if (reload_completed || reload_in_progress || GET_CODE (dest) != REG)
722     return 0;
723
724   for (next = next_nonnote_insn (insn);
725        next != 0 && GET_CODE (next) != CODE_LABEL;
726        next = next_nonnote_insn (next))
727     if (GET_RTX_CLASS (GET_CODE (next)) == 'i' && dead_or_set_p (next, dest))
728       {
729         for (link = LOG_LINKS (next); link; link = XEXP (link, 1))
730           if (XEXP (link, 0) == insn)
731             break;
732
733         if (link)
734           {
735             result = find_single_use_1 (dest, &PATTERN (next));
736             if (ploc)
737               *ploc = next;
738             return result;
739           }
740       }
741
742   return 0;
743 }
744 \f
745 /* Return 1 if OP is a valid general operand for machine mode MODE.
746    This is either a register reference, a memory reference,
747    or a constant.  In the case of a memory reference, the address
748    is checked for general validity for the target machine.
749
750    Register and memory references must have mode MODE in order to be valid,
751    but some constants have no machine mode and are valid for any mode.
752
753    If MODE is VOIDmode, OP is checked for validity for whatever mode
754    it has.
755
756    The main use of this function is as a predicate in match_operand
757    expressions in the machine description.
758
759    For an explanation of this function's behavior for registers of
760    class NO_REGS, see the comment for `register_operand'.  */
761
762 int
763 general_operand (op, mode)
764      register rtx op;
765      enum machine_mode mode;
766 {
767   register enum rtx_code code = GET_CODE (op);
768   int mode_altering_drug = 0;
769
770   if (mode == VOIDmode)
771     mode = GET_MODE (op);
772
773   /* Don't accept CONST_INT or anything similar
774      if the caller wants something floating.  */
775   if (GET_MODE (op) == VOIDmode && mode != VOIDmode
776       && GET_MODE_CLASS (mode) != MODE_INT
777       && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
778     return 0;
779
780   if (CONSTANT_P (op))
781     return ((GET_MODE (op) == VOIDmode || GET_MODE (op) == mode)
782 #ifdef LEGITIMATE_PIC_OPERAND_P
783             && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
784 #endif
785             && LEGITIMATE_CONSTANT_P (op));
786
787   /* Except for certain constants with VOIDmode, already checked for,
788      OP's mode must match MODE if MODE specifies a mode.  */
789
790   if (GET_MODE (op) != mode)
791     return 0;
792
793   if (code == SUBREG)
794     {
795 #ifdef INSN_SCHEDULING
796       /* On machines that have insn scheduling, we want all memory
797          reference to be explicit, so outlaw paradoxical SUBREGs.  */
798       if (GET_CODE (SUBREG_REG (op)) == MEM
799           && GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))))
800         return 0;
801 #endif
802
803       op = SUBREG_REG (op);
804       code = GET_CODE (op);
805 #if 0
806       /* No longer needed, since (SUBREG (MEM...))
807          will load the MEM into a reload reg in the MEM's own mode.  */
808       mode_altering_drug = 1;
809 #endif
810     }
811
812   if (code == REG)
813     /* A register whose class is NO_REGS is not a general operand.  */
814     return (REGNO (op) >= FIRST_PSEUDO_REGISTER
815             || REGNO_REG_CLASS (REGNO (op)) != NO_REGS);
816
817   if (code == MEM)
818     {
819       register rtx y = XEXP (op, 0);
820       if (! volatile_ok && MEM_VOLATILE_P (op))
821         return 0;
822       /* Use the mem's mode, since it will be reloaded thus.  */
823       mode = GET_MODE (op);
824       GO_IF_LEGITIMATE_ADDRESS (mode, y, win);
825     }
826   return 0;
827
828  win:
829   if (mode_altering_drug)
830     return ! mode_dependent_address_p (XEXP (op, 0));
831   return 1;
832 }
833 \f
834 /* Return 1 if OP is a valid memory address for a memory reference
835    of mode MODE.
836
837    The main use of this function is as a predicate in match_operand
838    expressions in the machine description.  */
839
840 int
841 address_operand (op, mode)
842      register rtx op;
843      enum machine_mode mode;
844 {
845   return memory_address_p (mode, op);
846 }
847
848 /* Return 1 if OP is a register reference of mode MODE.
849    If MODE is VOIDmode, accept a register in any mode.
850
851    The main use of this function is as a predicate in match_operand
852    expressions in the machine description.
853
854    As a special exception, registers whose class is NO_REGS are
855    not accepted by `register_operand'.  The reason for this change
856    is to allow the representation of special architecture artifacts
857    (such as a condition code register) without extending the rtl
858    definitions.  Since registers of class NO_REGS cannot be used
859    as registers in any case where register classes are examined,
860    it is most consistent to keep this function from accepting them.  */
861
862 int
863 register_operand (op, mode)
864      register rtx op;
865      enum machine_mode mode;
866 {
867   if (GET_MODE (op) != mode && mode != VOIDmode)
868     return 0;
869
870   if (GET_CODE (op) == SUBREG)
871     {
872       /* Before reload, we can allow (SUBREG (MEM...)) as a register operand
873          because it is guaranteed to be reloaded into one.
874          Just make sure the MEM is valid in itself.
875          (Ideally, (SUBREG (MEM)...) should not exist after reload,
876          but currently it does result from (SUBREG (REG)...) where the
877          reg went on the stack.)  */
878       if (! reload_completed && GET_CODE (SUBREG_REG (op)) == MEM)
879         return general_operand (op, mode);
880
881 #ifdef CLASS_CANNOT_CHANGE_SIZE
882       if (GET_CODE (SUBREG_REG (op)) == REG
883           && REGNO (SUBREG_REG (op)) < FIRST_PSEUDO_REGISTER
884           && TEST_HARD_REG_BIT (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE],
885                                 REGNO (SUBREG_REG (op)))
886           && (GET_MODE_SIZE (mode)
887               != GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))))
888           && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op))) != MODE_COMPLEX_INT
889           && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op))) != MODE_COMPLEX_FLOAT)
890         return 0;
891 #endif
892
893       op = SUBREG_REG (op);
894     }
895
896   /* We don't consider registers whose class is NO_REGS
897      to be a register operand.  */
898   return (GET_CODE (op) == REG
899           && (REGNO (op) >= FIRST_PSEUDO_REGISTER
900               || REGNO_REG_CLASS (REGNO (op)) != NO_REGS));
901 }
902
903 /* Return 1 if OP should match a MATCH_SCRATCH, i.e., if it is a SCRATCH
904    or a hard register.  */
905
906 int
907 scratch_operand (op, mode)
908      register rtx op;
909      enum machine_mode mode;
910 {
911   return (GET_MODE (op) == mode
912           && (GET_CODE (op) == SCRATCH
913               || (GET_CODE (op) == REG
914                   && REGNO (op) < FIRST_PSEUDO_REGISTER)));
915 }
916
917 /* Return 1 if OP is a valid immediate operand for mode MODE.
918
919    The main use of this function is as a predicate in match_operand
920    expressions in the machine description.  */
921
922 int
923 immediate_operand (op, mode)
924      register rtx op;
925      enum machine_mode mode;
926 {
927   /* Don't accept CONST_INT or anything similar
928      if the caller wants something floating.  */
929   if (GET_MODE (op) == VOIDmode && mode != VOIDmode
930       && GET_MODE_CLASS (mode) != MODE_INT
931       && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
932     return 0;
933
934   return (CONSTANT_P (op)
935           && (GET_MODE (op) == mode || mode == VOIDmode
936               || GET_MODE (op) == VOIDmode)
937 #ifdef LEGITIMATE_PIC_OPERAND_P
938           && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
939 #endif
940           && LEGITIMATE_CONSTANT_P (op));
941 }
942
943 /* Returns 1 if OP is an operand that is a CONST_INT.  */
944
945 int
946 const_int_operand (op, mode)
947      register rtx op;
948      enum machine_mode mode;
949 {
950   return GET_CODE (op) == CONST_INT;
951 }
952
953 /* Returns 1 if OP is an operand that is a constant integer or constant
954    floating-point number.  */
955
956 int
957 const_double_operand (op, mode)
958      register rtx op;
959      enum machine_mode mode;
960 {
961   /* Don't accept CONST_INT or anything similar
962      if the caller wants something floating.  */
963   if (GET_MODE (op) == VOIDmode && mode != VOIDmode
964       && GET_MODE_CLASS (mode) != MODE_INT
965       && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
966     return 0;
967
968   return ((GET_CODE (op) == CONST_DOUBLE || GET_CODE (op) == CONST_INT)
969           && (mode == VOIDmode || GET_MODE (op) == mode
970               || GET_MODE (op) == VOIDmode));
971 }
972
973 /* Return 1 if OP is a general operand that is not an immediate operand.  */
974
975 int
976 nonimmediate_operand (op, mode)
977      register rtx op;
978      enum machine_mode mode;
979 {
980   return (general_operand (op, mode) && ! CONSTANT_P (op));
981 }
982
983 /* Return 1 if OP is a register reference or immediate value of mode MODE.  */
984
985 int
986 nonmemory_operand (op, mode)
987      register rtx op;
988      enum machine_mode mode;
989 {
990   if (CONSTANT_P (op))
991     {
992       /* Don't accept CONST_INT or anything similar
993          if the caller wants something floating.  */
994       if (GET_MODE (op) == VOIDmode && mode != VOIDmode
995           && GET_MODE_CLASS (mode) != MODE_INT
996           && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
997         return 0;
998
999       return ((GET_MODE (op) == VOIDmode || GET_MODE (op) == mode)
1000 #ifdef LEGITIMATE_PIC_OPERAND_P
1001               && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
1002 #endif
1003               && LEGITIMATE_CONSTANT_P (op));
1004     }
1005
1006   if (GET_MODE (op) != mode && mode != VOIDmode)
1007     return 0;
1008
1009   if (GET_CODE (op) == SUBREG)
1010     {
1011       /* Before reload, we can allow (SUBREG (MEM...)) as a register operand
1012          because it is guaranteed to be reloaded into one.
1013          Just make sure the MEM is valid in itself.
1014          (Ideally, (SUBREG (MEM)...) should not exist after reload,
1015          but currently it does result from (SUBREG (REG)...) where the
1016          reg went on the stack.)  */
1017       if (! reload_completed && GET_CODE (SUBREG_REG (op)) == MEM)
1018         return general_operand (op, mode);
1019       op = SUBREG_REG (op);
1020     }
1021
1022   /* We don't consider registers whose class is NO_REGS
1023      to be a register operand.  */
1024   return (GET_CODE (op) == REG
1025           && (REGNO (op) >= FIRST_PSEUDO_REGISTER
1026               || REGNO_REG_CLASS (REGNO (op)) != NO_REGS));
1027 }
1028
1029 /* Return 1 if OP is a valid operand that stands for pushing a
1030    value of mode MODE onto the stack.
1031
1032    The main use of this function is as a predicate in match_operand
1033    expressions in the machine description.  */
1034
1035 int
1036 push_operand (op, mode)
1037      rtx op;
1038      enum machine_mode mode;
1039 {
1040   if (GET_CODE (op) != MEM)
1041     return 0;
1042
1043   if (GET_MODE (op) != mode)
1044     return 0;
1045
1046   op = XEXP (op, 0);
1047
1048   if (GET_CODE (op) != STACK_PUSH_CODE)
1049     return 0;
1050
1051   return XEXP (op, 0) == stack_pointer_rtx;
1052 }
1053
1054 /* Return 1 if ADDR is a valid memory address for mode MODE.  */
1055
1056 int
1057 memory_address_p (mode, addr)
1058      enum machine_mode mode;
1059      register rtx addr;
1060 {
1061   GO_IF_LEGITIMATE_ADDRESS (mode, addr, win);
1062   return 0;
1063
1064  win:
1065   return 1;
1066 }
1067
1068 /* Return 1 if OP is a valid memory reference with mode MODE,
1069    including a valid address.
1070
1071    The main use of this function is as a predicate in match_operand
1072    expressions in the machine description.  */
1073
1074 int
1075 memory_operand (op, mode)
1076      register rtx op;
1077      enum machine_mode mode;
1078 {
1079   rtx inner;
1080
1081   if (! reload_completed)
1082     /* Note that no SUBREG is a memory operand before end of reload pass,
1083        because (SUBREG (MEM...)) forces reloading into a register.  */
1084     return GET_CODE (op) == MEM && general_operand (op, mode);
1085
1086   if (mode != VOIDmode && GET_MODE (op) != mode)
1087     return 0;
1088
1089   inner = op;
1090   if (GET_CODE (inner) == SUBREG)
1091     inner = SUBREG_REG (inner);
1092
1093   return (GET_CODE (inner) == MEM && general_operand (op, mode));
1094 }
1095
1096 /* Return 1 if OP is a valid indirect memory reference with mode MODE;
1097    that is, a memory reference whose address is a general_operand.  */
1098
1099 int
1100 indirect_operand (op, mode)
1101      register rtx op;
1102      enum machine_mode mode;
1103 {
1104   /* Before reload, a SUBREG isn't in memory (see memory_operand, above).  */
1105   if (! reload_completed
1106       && GET_CODE (op) == SUBREG && GET_CODE (SUBREG_REG (op)) == MEM)
1107     {
1108       register int offset = SUBREG_WORD (op) * UNITS_PER_WORD;
1109       rtx inner = SUBREG_REG (op);
1110
1111       if (BYTES_BIG_ENDIAN)
1112         offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (op)))
1113                    - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (inner))));
1114
1115       if (mode != VOIDmode && GET_MODE (op) != mode)
1116         return 0;
1117
1118       /* The only way that we can have a general_operand as the resulting
1119          address is if OFFSET is zero and the address already is an operand
1120          or if the address is (plus Y (const_int -OFFSET)) and Y is an
1121          operand.  */
1122
1123       return ((offset == 0 && general_operand (XEXP (inner, 0), Pmode))
1124               || (GET_CODE (XEXP (inner, 0)) == PLUS
1125                   && GET_CODE (XEXP (XEXP (inner, 0), 1)) == CONST_INT
1126                   && INTVAL (XEXP (XEXP (inner, 0), 1)) == -offset
1127                   && general_operand (XEXP (XEXP (inner, 0), 0), Pmode)));
1128     }
1129
1130   return (GET_CODE (op) == MEM
1131           && memory_operand (op, mode)
1132           && general_operand (XEXP (op, 0), Pmode));
1133 }
1134
1135 /* Return 1 if this is a comparison operator.  This allows the use of
1136    MATCH_OPERATOR to recognize all the branch insns.  */
1137
1138 int
1139 comparison_operator (op, mode)
1140     register rtx op;
1141     enum machine_mode mode;
1142 {
1143   return ((mode == VOIDmode || GET_MODE (op) == mode)
1144           && GET_RTX_CLASS (GET_CODE (op)) == '<');
1145 }
1146 \f
1147 /* If BODY is an insn body that uses ASM_OPERANDS,
1148    return the number of operands (both input and output) in the insn.
1149    Otherwise return -1.  */
1150
1151 int
1152 asm_noperands (body)
1153      rtx body;
1154 {
1155   if (GET_CODE (body) == ASM_OPERANDS)
1156     /* No output operands: return number of input operands.  */
1157     return ASM_OPERANDS_INPUT_LENGTH (body);
1158   if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
1159     /* Single output operand: BODY is (set OUTPUT (asm_operands ...)).  */
1160     return ASM_OPERANDS_INPUT_LENGTH (SET_SRC (body)) + 1;
1161   else if (GET_CODE (body) == PARALLEL
1162            && GET_CODE (XVECEXP (body, 0, 0)) == SET
1163            && GET_CODE (SET_SRC (XVECEXP (body, 0, 0))) == ASM_OPERANDS)
1164     {
1165       /* Multiple output operands, or 1 output plus some clobbers:
1166          body is [(set OUTPUT (asm_operands ...))... (clobber (reg ...))...].  */
1167       int i;
1168       int n_sets;
1169
1170       /* Count backwards through CLOBBERs to determine number of SETs.  */
1171       for (i = XVECLEN (body, 0); i > 0; i--)
1172         {
1173           if (GET_CODE (XVECEXP (body, 0, i - 1)) == SET)
1174             break;
1175           if (GET_CODE (XVECEXP (body, 0, i - 1)) != CLOBBER)
1176             return -1;
1177         }
1178
1179       /* N_SETS is now number of output operands.  */
1180       n_sets = i;
1181
1182       /* Verify that all the SETs we have
1183          came from a single original asm_operands insn
1184          (so that invalid combinations are blocked).  */
1185       for (i = 0; i < n_sets; i++)
1186         {
1187           rtx elt = XVECEXP (body, 0, i);
1188           if (GET_CODE (elt) != SET)
1189             return -1;
1190           if (GET_CODE (SET_SRC (elt)) != ASM_OPERANDS)
1191             return -1;
1192           /* If these ASM_OPERANDS rtx's came from different original insns
1193              then they aren't allowed together.  */
1194           if (ASM_OPERANDS_INPUT_VEC (SET_SRC (elt))
1195               != ASM_OPERANDS_INPUT_VEC (SET_SRC (XVECEXP (body, 0, 0))))
1196             return -1;
1197         }
1198       return (ASM_OPERANDS_INPUT_LENGTH (SET_SRC (XVECEXP (body, 0, 0)))
1199               + n_sets);
1200     }
1201   else if (GET_CODE (body) == PARALLEL
1202            && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
1203     {
1204       /* 0 outputs, but some clobbers:
1205          body is [(asm_operands ...) (clobber (reg ...))...].  */
1206       int i;
1207
1208       /* Make sure all the other parallel things really are clobbers.  */
1209       for (i = XVECLEN (body, 0) - 1; i > 0; i--)
1210         if (GET_CODE (XVECEXP (body, 0, i)) != CLOBBER)
1211           return -1;
1212
1213       return ASM_OPERANDS_INPUT_LENGTH (XVECEXP (body, 0, 0));
1214     }
1215   else
1216     return -1;
1217 }
1218
1219 /* Assuming BODY is an insn body that uses ASM_OPERANDS,
1220    copy its operands (both input and output) into the vector OPERANDS,
1221    the locations of the operands within the insn into the vector OPERAND_LOCS,
1222    and the constraints for the operands into CONSTRAINTS.
1223    Write the modes of the operands into MODES.
1224    Return the assembler-template.
1225
1226    If MODES, OPERAND_LOCS, CONSTRAINTS or OPERANDS is 0,
1227    we don't store that info.  */
1228
1229 char *
1230 decode_asm_operands (body, operands, operand_locs, constraints, modes)
1231      rtx body;
1232      rtx *operands;
1233      rtx **operand_locs;
1234      char **constraints;
1235      enum machine_mode *modes;
1236 {
1237   register int i;
1238   int noperands;
1239   char *template = 0;
1240
1241   if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
1242     {
1243       rtx asmop = SET_SRC (body);
1244       /* Single output operand: BODY is (set OUTPUT (asm_operands ....)).  */
1245
1246       noperands = ASM_OPERANDS_INPUT_LENGTH (asmop) + 1;
1247
1248       for (i = 1; i < noperands; i++)
1249         {
1250           if (operand_locs)
1251             operand_locs[i] = &ASM_OPERANDS_INPUT (asmop, i - 1);
1252           if (operands)
1253             operands[i] = ASM_OPERANDS_INPUT (asmop, i - 1);
1254           if (constraints)
1255             constraints[i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i - 1);
1256           if (modes)
1257             modes[i] = ASM_OPERANDS_INPUT_MODE (asmop, i - 1);
1258         }
1259
1260       /* The output is in the SET.
1261          Its constraint is in the ASM_OPERANDS itself.  */
1262       if (operands)
1263         operands[0] = SET_DEST (body);
1264       if (operand_locs)
1265         operand_locs[0] = &SET_DEST (body);
1266       if (constraints)
1267         constraints[0] = ASM_OPERANDS_OUTPUT_CONSTRAINT (asmop);
1268       if (modes)
1269         modes[0] = GET_MODE (SET_DEST (body));
1270       template = ASM_OPERANDS_TEMPLATE (asmop);
1271     }
1272   else if (GET_CODE (body) == ASM_OPERANDS)
1273     {
1274       rtx asmop = body;
1275       /* No output operands: BODY is (asm_operands ....).  */
1276
1277       noperands = ASM_OPERANDS_INPUT_LENGTH (asmop);
1278
1279       /* The input operands are found in the 1st element vector.  */
1280       /* Constraints for inputs are in the 2nd element vector.  */
1281       for (i = 0; i < noperands; i++)
1282         {
1283           if (operand_locs)
1284             operand_locs[i] = &ASM_OPERANDS_INPUT (asmop, i);
1285           if (operands)
1286             operands[i] = ASM_OPERANDS_INPUT (asmop, i);
1287           if (constraints)
1288             constraints[i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1289           if (modes)
1290             modes[i] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1291         }
1292       template = ASM_OPERANDS_TEMPLATE (asmop);
1293     }
1294   else if (GET_CODE (body) == PARALLEL
1295            && GET_CODE (XVECEXP (body, 0, 0)) == SET)
1296     {
1297       rtx asmop = SET_SRC (XVECEXP (body, 0, 0));
1298       int nparallel = XVECLEN (body, 0); /* Includes CLOBBERs.  */
1299       int nin = ASM_OPERANDS_INPUT_LENGTH (asmop);
1300       int nout = 0;             /* Does not include CLOBBERs.  */
1301
1302       /* At least one output, plus some CLOBBERs.  */
1303
1304       /* The outputs are in the SETs.
1305          Their constraints are in the ASM_OPERANDS itself.  */
1306       for (i = 0; i < nparallel; i++)
1307         {
1308           if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
1309             break;              /* Past last SET */
1310           
1311           if (operands)
1312             operands[i] = SET_DEST (XVECEXP (body, 0, i));
1313           if (operand_locs)
1314             operand_locs[i] = &SET_DEST (XVECEXP (body, 0, i));
1315           if (constraints)
1316             constraints[i] = XSTR (SET_SRC (XVECEXP (body, 0, i)), 1);
1317           if (modes)
1318             modes[i] = GET_MODE (SET_DEST (XVECEXP (body, 0, i)));
1319           nout++;
1320         }
1321
1322       for (i = 0; i < nin; i++)
1323         {
1324           if (operand_locs)
1325             operand_locs[i + nout] = &ASM_OPERANDS_INPUT (asmop, i);
1326           if (operands)
1327             operands[i + nout] = ASM_OPERANDS_INPUT (asmop, i);
1328           if (constraints)
1329             constraints[i + nout] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1330           if (modes)
1331             modes[i + nout] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1332         }
1333
1334       template = ASM_OPERANDS_TEMPLATE (asmop);
1335     }
1336   else if (GET_CODE (body) == PARALLEL
1337            && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
1338     {
1339       /* No outputs, but some CLOBBERs.  */
1340
1341       rtx asmop = XVECEXP (body, 0, 0);
1342       int nin = ASM_OPERANDS_INPUT_LENGTH (asmop);
1343
1344       for (i = 0; i < nin; i++)
1345         {
1346           if (operand_locs)
1347             operand_locs[i] = &ASM_OPERANDS_INPUT (asmop, i);
1348           if (operands)
1349             operands[i] = ASM_OPERANDS_INPUT (asmop, i);
1350           if (constraints)
1351             constraints[i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
1352           if (modes)
1353             modes[i] = ASM_OPERANDS_INPUT_MODE (asmop, i);
1354         }
1355
1356       template = ASM_OPERANDS_TEMPLATE (asmop);
1357     }
1358
1359   return template;
1360 }
1361 \f
1362 /* Given an rtx *P, if it is a sum containing an integer constant term,
1363    return the location (type rtx *) of the pointer to that constant term.
1364    Otherwise, return a null pointer.  */
1365
1366 static rtx *
1367 find_constant_term_loc (p)
1368      rtx *p;
1369 {
1370   register rtx *tem;
1371   register enum rtx_code code = GET_CODE (*p);
1372
1373   /* If *P IS such a constant term, P is its location.  */
1374
1375   if (code == CONST_INT || code == SYMBOL_REF || code == LABEL_REF
1376       || code == CONST)
1377     return p;
1378
1379   /* Otherwise, if not a sum, it has no constant term.  */
1380
1381   if (GET_CODE (*p) != PLUS)
1382     return 0;
1383
1384   /* If one of the summands is constant, return its location.  */
1385
1386   if (XEXP (*p, 0) && CONSTANT_P (XEXP (*p, 0))
1387       && XEXP (*p, 1) && CONSTANT_P (XEXP (*p, 1)))
1388     return p;
1389
1390   /* Otherwise, check each summand for containing a constant term.  */
1391
1392   if (XEXP (*p, 0) != 0)
1393     {
1394       tem = find_constant_term_loc (&XEXP (*p, 0));
1395       if (tem != 0)
1396         return tem;
1397     }
1398
1399   if (XEXP (*p, 1) != 0)
1400     {
1401       tem = find_constant_term_loc (&XEXP (*p, 1));
1402       if (tem != 0)
1403         return tem;
1404     }
1405
1406   return 0;
1407 }
1408 \f
1409 /* Return 1 if OP is a memory reference
1410    whose address contains no side effects
1411    and remains valid after the addition
1412    of a positive integer less than the
1413    size of the object being referenced.
1414
1415    We assume that the original address is valid and do not check it.
1416
1417    This uses strict_memory_address_p as a subroutine, so
1418    don't use it before reload.  */
1419
1420 int
1421 offsettable_memref_p (op)
1422      rtx op;
1423 {
1424   return ((GET_CODE (op) == MEM)
1425           && offsettable_address_p (1, GET_MODE (op), XEXP (op, 0)));
1426 }
1427
1428 /* Similar, but don't require a strictly valid mem ref:
1429    consider pseudo-regs valid as index or base regs.  */
1430
1431 int
1432 offsettable_nonstrict_memref_p (op)
1433      rtx op;
1434 {
1435   return ((GET_CODE (op) == MEM)
1436           && offsettable_address_p (0, GET_MODE (op), XEXP (op, 0)));
1437 }
1438
1439 /* Return 1 if Y is a memory address which contains no side effects
1440    and would remain valid after the addition of a positive integer
1441    less than the size of that mode.
1442
1443    We assume that the original address is valid and do not check it.
1444    We do check that it is valid for narrower modes.
1445
1446    If STRICTP is nonzero, we require a strictly valid address,
1447    for the sake of use in reload.c.  */
1448
1449 int
1450 offsettable_address_p (strictp, mode, y)
1451      int strictp;
1452      enum machine_mode mode;
1453      register rtx y;
1454 {
1455   register enum rtx_code ycode = GET_CODE (y);
1456   register rtx z;
1457   rtx y1 = y;
1458   rtx *y2;
1459   int (*addressp) () = (strictp ? strict_memory_address_p : memory_address_p);
1460
1461   if (CONSTANT_ADDRESS_P (y))
1462     return 1;
1463
1464   /* Adjusting an offsettable address involves changing to a narrower mode.
1465      Make sure that's OK.  */
1466
1467   if (mode_dependent_address_p (y))
1468     return 0;
1469
1470   /* If the expression contains a constant term,
1471      see if it remains valid when max possible offset is added.  */
1472
1473   if ((ycode == PLUS) && (y2 = find_constant_term_loc (&y1)))
1474     {
1475       int good;
1476
1477       y1 = *y2;
1478       *y2 = plus_constant (*y2, GET_MODE_SIZE (mode) - 1);
1479       /* Use QImode because an odd displacement may be automatically invalid
1480          for any wider mode.  But it should be valid for a single byte.  */
1481       good = (*addressp) (QImode, y);
1482
1483       /* In any case, restore old contents of memory.  */
1484       *y2 = y1;
1485       return good;
1486     }
1487
1488   if (ycode == PRE_DEC || ycode == PRE_INC
1489       || ycode == POST_DEC || ycode == POST_INC)
1490     return 0;
1491
1492   /* The offset added here is chosen as the maximum offset that
1493      any instruction could need to add when operating on something
1494      of the specified mode.  We assume that if Y and Y+c are
1495      valid addresses then so is Y+d for all 0<d<c.  */
1496
1497   z = plus_constant_for_output (y, GET_MODE_SIZE (mode) - 1);
1498
1499   /* Use QImode because an odd displacement may be automatically invalid
1500      for any wider mode.  But it should be valid for a single byte.  */
1501   return (*addressp) (QImode, z);
1502 }
1503
1504 /* Return 1 if ADDR is an address-expression whose effect depends
1505    on the mode of the memory reference it is used in.
1506
1507    Autoincrement addressing is a typical example of mode-dependence
1508    because the amount of the increment depends on the mode.  */
1509
1510 int
1511 mode_dependent_address_p (addr)
1512      rtx addr;
1513 {
1514   GO_IF_MODE_DEPENDENT_ADDRESS (addr, win);
1515   return 0;
1516  win:
1517   return 1;
1518 }
1519
1520 /* Return 1 if OP is a general operand
1521    other than a memory ref with a mode dependent address.  */
1522
1523 int
1524 mode_independent_operand (op, mode)
1525      enum machine_mode mode;
1526      rtx op;
1527 {
1528   rtx addr;
1529
1530   if (! general_operand (op, mode))
1531     return 0;
1532
1533   if (GET_CODE (op) != MEM)
1534     return 1;
1535
1536   addr = XEXP (op, 0);
1537   GO_IF_MODE_DEPENDENT_ADDRESS (addr, lose);
1538   return 1;
1539  lose:
1540   return 0;
1541 }
1542
1543 /* Given an operand OP that is a valid memory reference
1544    which satisfies offsettable_memref_p,
1545    return a new memory reference whose address has been adjusted by OFFSET.
1546    OFFSET should be positive and less than the size of the object referenced.
1547 */
1548
1549 rtx
1550 adj_offsettable_operand (op, offset)
1551      rtx op;
1552      int offset;
1553 {
1554   register enum rtx_code code = GET_CODE (op);
1555
1556   if (code == MEM) 
1557     {
1558       register rtx y = XEXP (op, 0);
1559       register rtx new;
1560
1561       if (CONSTANT_ADDRESS_P (y))
1562         {
1563           new = gen_rtx (MEM, GET_MODE (op), plus_constant_for_output (y, offset));
1564           RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (op);
1565           return new;
1566         }
1567
1568       if (GET_CODE (y) == PLUS)
1569         {
1570           rtx z = y;
1571           register rtx *const_loc;
1572
1573           op = copy_rtx (op);
1574           z = XEXP (op, 0);
1575           const_loc = find_constant_term_loc (&z);
1576           if (const_loc)
1577             {
1578               *const_loc = plus_constant_for_output (*const_loc, offset);
1579               return op;
1580             }
1581         }
1582
1583       new = gen_rtx (MEM, GET_MODE (op), plus_constant_for_output (y, offset));
1584       RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (op);
1585       return new;
1586     }
1587   abort ();
1588 }
1589 \f
1590 #ifdef REGISTER_CONSTRAINTS
1591
1592 /* Check the operands of an insn (found in recog_operands)
1593    against the insn's operand constraints (found via INSN_CODE_NUM)
1594    and return 1 if they are valid.
1595
1596    WHICH_ALTERNATIVE is set to a number which indicates which
1597    alternative of constraints was matched: 0 for the first alternative,
1598    1 for the next, etc.
1599
1600    In addition, when two operands are match
1601    and it happens that the output operand is (reg) while the
1602    input operand is --(reg) or ++(reg) (a pre-inc or pre-dec),
1603    make the output operand look like the input.
1604    This is because the output operand is the one the template will print.
1605
1606    This is used in final, just before printing the assembler code and by
1607    the routines that determine an insn's attribute.
1608
1609    If STRICT is a positive non-zero value, it means that we have been
1610    called after reload has been completed.  In that case, we must
1611    do all checks strictly.  If it is zero, it means that we have been called
1612    before reload has completed.  In that case, we first try to see if we can
1613    find an alternative that matches strictly.  If not, we try again, this
1614    time assuming that reload will fix up the insn.  This provides a "best
1615    guess" for the alternative and is used to compute attributes of insns prior
1616    to reload.  A negative value of STRICT is used for this internal call.  */
1617
1618 struct funny_match
1619 {
1620   int this, other;
1621 };
1622
1623 int
1624 constrain_operands (insn_code_num, strict)
1625      int insn_code_num;
1626      int strict;
1627 {
1628   char *constraints[MAX_RECOG_OPERANDS];
1629   int matching_operands[MAX_RECOG_OPERANDS];
1630   enum op_type {OP_IN, OP_OUT, OP_INOUT} op_types[MAX_RECOG_OPERANDS];
1631   int earlyclobber[MAX_RECOG_OPERANDS];
1632   register int c;
1633   int noperands = insn_n_operands[insn_code_num];
1634
1635   struct funny_match funny_match[MAX_RECOG_OPERANDS];
1636   int funny_match_index;
1637   int nalternatives = insn_n_alternatives[insn_code_num];
1638
1639   if (noperands == 0 || nalternatives == 0)
1640     return 1;
1641
1642   for (c = 0; c < noperands; c++)
1643     {
1644       constraints[c] = insn_operand_constraint[insn_code_num][c];
1645       matching_operands[c] = -1;
1646       op_types[c] = OP_IN;
1647     }
1648
1649   which_alternative = 0;
1650
1651   while (which_alternative < nalternatives)
1652     {
1653       register int opno;
1654       int lose = 0;
1655       funny_match_index = 0;
1656
1657       for (opno = 0; opno < noperands; opno++)
1658         {
1659           register rtx op = recog_operand[opno];
1660           enum machine_mode mode = GET_MODE (op);
1661           register char *p = constraints[opno];
1662           int offset = 0;
1663           int win = 0;
1664           int val;
1665
1666           earlyclobber[opno] = 0;
1667
1668           /* A unary operator may be accepted by the predicate, but it
1669              is irrelevant for matching contraints.  */
1670           if (GET_RTX_CLASS (GET_CODE (op)) == '1')
1671             op = XEXP (op, 0);
1672
1673           if (GET_CODE (op) == SUBREG)
1674             {
1675               if (GET_CODE (SUBREG_REG (op)) == REG
1676                   && REGNO (SUBREG_REG (op)) < FIRST_PSEUDO_REGISTER)
1677                 offset = SUBREG_WORD (op);
1678               op = SUBREG_REG (op);
1679             }
1680
1681           /* An empty constraint or empty alternative
1682              allows anything which matched the pattern.  */
1683           if (*p == 0 || *p == ',')
1684             win = 1;
1685
1686           while (*p && (c = *p++) != ',')
1687             switch (c)
1688               {
1689               case '?':
1690               case '!':
1691               case '*':
1692               case '%':
1693                 break;
1694
1695               case '#':
1696                 /* Ignore rest of this alternative as far as
1697                    constraint checking is concerned.  */
1698                 while (*p && *p != ',')
1699                   p++;
1700                 break;
1701
1702               case '=':
1703                 op_types[opno] = OP_OUT;
1704                 break;
1705
1706               case '+':
1707                 op_types[opno] = OP_INOUT;
1708                 break;
1709
1710               case '&':
1711                 earlyclobber[opno] = 1;
1712                 break;
1713
1714               case '0':
1715               case '1':
1716               case '2':
1717               case '3':
1718               case '4':
1719                 /* This operand must be the same as a previous one.
1720                    This kind of constraint is used for instructions such
1721                    as add when they take only two operands.
1722
1723                    Note that the lower-numbered operand is passed first.
1724
1725                    If we are not testing strictly, assume that this constraint
1726                    will be satisfied.  */
1727                 if (strict < 0)
1728                   val = 1;
1729                 else
1730                   val = operands_match_p (recog_operand[c - '0'],
1731                                           recog_operand[opno]);
1732
1733                 matching_operands[opno] = c - '0';
1734                 matching_operands[c - '0'] = opno;
1735
1736                 if (val != 0)
1737                   win = 1;
1738                 /* If output is *x and input is *--x,
1739                    arrange later to change the output to *--x as well,
1740                    since the output op is the one that will be printed.  */
1741                 if (val == 2 && strict > 0)
1742                   {
1743                     funny_match[funny_match_index].this = opno;
1744                     funny_match[funny_match_index++].other = c - '0';
1745                   }
1746                 break;
1747
1748               case 'p':
1749                 /* p is used for address_operands.  When we are called by
1750                    gen_reload, no one will have checked that the address is
1751                    strictly valid, i.e., that all pseudos requiring hard regs
1752                    have gotten them.  */
1753                 if (strict <= 0
1754                     || (strict_memory_address_p
1755                         (insn_operand_mode[insn_code_num][opno], op)))
1756                   win = 1;
1757                 break;
1758
1759                 /* No need to check general_operand again;
1760                    it was done in insn-recog.c.  */
1761               case 'g':
1762                 /* Anything goes unless it is a REG and really has a hard reg
1763                    but the hard reg is not in the class GENERAL_REGS.  */
1764                 if (strict < 0
1765                     || GENERAL_REGS == ALL_REGS
1766                     || GET_CODE (op) != REG
1767                     || (reload_in_progress
1768                         && REGNO (op) >= FIRST_PSEUDO_REGISTER)
1769                     || reg_fits_class_p (op, GENERAL_REGS, offset, mode))
1770                   win = 1;
1771                 break;
1772
1773               case 'r':
1774                 if (strict < 0
1775                     || (strict == 0
1776                         && GET_CODE (op) == REG
1777                         && REGNO (op) >= FIRST_PSEUDO_REGISTER)
1778                     || (strict == 0 && GET_CODE (op) == SCRATCH)
1779                     || (GET_CODE (op) == REG
1780                         && ((GENERAL_REGS == ALL_REGS
1781                              && REGNO (op) < FIRST_PSEUDO_REGISTER)
1782                             || reg_fits_class_p (op, GENERAL_REGS,
1783                                                  offset, mode))))
1784                   win = 1;
1785                 break;
1786
1787               case 'X':
1788                 /* This is used for a MATCH_SCRATCH in the cases when
1789                    we don't actually need anything.  So anything goes
1790                    any time.  */
1791                 win = 1;
1792                 break;
1793
1794               case 'm':
1795                 if (GET_CODE (op) == MEM
1796                     /* Before reload, accept what reload can turn into mem.  */
1797                     || (strict < 0 && CONSTANT_P (op))
1798                     /* During reload, accept a pseudo  */
1799                     || (reload_in_progress && GET_CODE (op) == REG
1800                         && REGNO (op) >= FIRST_PSEUDO_REGISTER))
1801                   win = 1;
1802                 break;
1803
1804               case '<':
1805                 if (GET_CODE (op) == MEM
1806                     && (GET_CODE (XEXP (op, 0)) == PRE_DEC
1807                         || GET_CODE (XEXP (op, 0)) == POST_DEC))
1808                   win = 1;
1809                 break;
1810
1811               case '>':
1812                 if (GET_CODE (op) == MEM
1813                     && (GET_CODE (XEXP (op, 0)) == PRE_INC
1814                         || GET_CODE (XEXP (op, 0)) == POST_INC))
1815                   win = 1;
1816                 break;
1817
1818               case 'E':
1819 #ifndef REAL_ARITHMETIC
1820                 /* Match any CONST_DOUBLE, but only if
1821                    we can examine the bits of it reliably.  */
1822                 if ((HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT
1823                      || HOST_BITS_PER_WIDE_INT != BITS_PER_WORD)
1824                     && GET_MODE (op) != VOIDmode && ! flag_pretend_float)
1825                   break;
1826 #endif
1827                 if (GET_CODE (op) == CONST_DOUBLE)
1828                   win = 1;
1829                 break;
1830
1831               case 'F':
1832                 if (GET_CODE (op) == CONST_DOUBLE)
1833                   win = 1;
1834                 break;
1835
1836               case 'G':
1837               case 'H':
1838                 if (GET_CODE (op) == CONST_DOUBLE
1839                     && CONST_DOUBLE_OK_FOR_LETTER_P (op, c))
1840                   win = 1;
1841                 break;
1842
1843               case 's':
1844                 if (GET_CODE (op) == CONST_INT
1845                     || (GET_CODE (op) == CONST_DOUBLE
1846                         && GET_MODE (op) == VOIDmode))
1847                   break;
1848               case 'i':
1849                 if (CONSTANT_P (op))
1850                   win = 1;
1851                 break;
1852
1853               case 'n':
1854                 if (GET_CODE (op) == CONST_INT
1855                     || (GET_CODE (op) == CONST_DOUBLE
1856                         && GET_MODE (op) == VOIDmode))
1857                   win = 1;
1858                 break;
1859
1860               case 'I':
1861               case 'J':
1862               case 'K':
1863               case 'L':
1864               case 'M':
1865               case 'N':
1866               case 'O':
1867               case 'P':
1868                 if (GET_CODE (op) == CONST_INT
1869                     && CONST_OK_FOR_LETTER_P (INTVAL (op), c))
1870                   win = 1;
1871                 break;
1872
1873 #ifdef EXTRA_CONSTRAINT
1874               case 'Q':
1875               case 'R':
1876               case 'S':
1877               case 'T':
1878               case 'U':
1879                 if (EXTRA_CONSTRAINT (op, c))
1880                   win = 1;
1881                 break;
1882 #endif
1883
1884               case 'V':
1885                 if (GET_CODE (op) == MEM
1886                     && ((strict > 0 && ! offsettable_memref_p (op))
1887                         || (strict < 0
1888                             && !(CONSTANT_P (op) || GET_CODE (op) == MEM))
1889                         || (reload_in_progress
1890                             && !(GET_CODE (op) == REG
1891                                  && REGNO (op) >= FIRST_PSEUDO_REGISTER))))
1892                   win = 1;
1893                 break;
1894
1895               case 'o':
1896                 if ((strict > 0 && offsettable_memref_p (op))
1897                     || (strict == 0 && offsettable_nonstrict_memref_p (op))
1898                     /* Before reload, accept what reload can handle.  */
1899                     || (strict < 0
1900                         && (CONSTANT_P (op) || GET_CODE (op) == MEM))
1901                     /* During reload, accept a pseudo  */
1902                     || (reload_in_progress && GET_CODE (op) == REG
1903                         && REGNO (op) >= FIRST_PSEUDO_REGISTER))
1904                   win = 1;
1905                 break;
1906
1907               default:
1908                 if (strict < 0
1909                     || (strict == 0
1910                         && GET_CODE (op) == REG
1911                         && REGNO (op) >= FIRST_PSEUDO_REGISTER)
1912                     || (strict == 0 && GET_CODE (op) == SCRATCH)
1913                     || (GET_CODE (op) == REG
1914                         && reg_fits_class_p (op, REG_CLASS_FROM_LETTER (c),
1915                                              offset, mode)))
1916                   win = 1;
1917               }
1918
1919           constraints[opno] = p;
1920           /* If this operand did not win somehow,
1921              this alternative loses.  */
1922           if (! win)
1923             lose = 1;
1924         }
1925       /* This alternative won; the operands are ok.
1926          Change whichever operands this alternative says to change.  */
1927       if (! lose)
1928         {
1929           int opno, eopno;
1930
1931           /* See if any earlyclobber operand conflicts with some other
1932              operand.  */
1933
1934           if (strict > 0)
1935             for (eopno = 0; eopno < noperands; eopno++)
1936               /* Ignore earlyclobber operands now in memory,
1937                  because we would often report failure when we have
1938                  two memory operands, one of which was formerly a REG.  */
1939               if (earlyclobber[eopno]
1940                   && GET_CODE (recog_operand[eopno]) == REG)
1941                 for (opno = 0; opno < noperands; opno++)
1942                   if ((GET_CODE (recog_operand[opno]) == MEM
1943                        || op_types[opno] != OP_OUT)
1944                       && opno != eopno
1945                       /* Ignore things like match_operator operands.  */
1946                       && *insn_operand_constraint[insn_code_num][opno] != 0
1947                       && ! (matching_operands[opno] == eopno
1948                             && operands_match_p (recog_operand[opno],
1949                                                  recog_operand[eopno]))
1950                       && ! safe_from_earlyclobber (recog_operand[opno],
1951                                                    recog_operand[eopno]))
1952                     lose = 1;
1953
1954           if (! lose)
1955             {
1956               while (--funny_match_index >= 0)
1957                 {
1958                   recog_operand[funny_match[funny_match_index].other]
1959                     = recog_operand[funny_match[funny_match_index].this];
1960                 }
1961
1962               return 1;
1963             }
1964         }
1965
1966       which_alternative++;
1967     }
1968
1969   /* If we are about to reject this, but we are not to test strictly,
1970      try a very loose test.  Only return failure if it fails also.  */
1971   if (strict == 0)
1972     return constrain_operands (insn_code_num, -1);
1973   else
1974     return 0;
1975 }
1976
1977 /* Return 1 iff OPERAND (assumed to be a REG rtx)
1978    is a hard reg in class CLASS when its regno is offsetted by OFFSET
1979    and changed to mode MODE.
1980    If REG occupies multiple hard regs, all of them must be in CLASS.  */
1981
1982 int
1983 reg_fits_class_p (operand, class, offset, mode)
1984      rtx operand;
1985      register enum reg_class class;
1986      int offset;
1987      enum machine_mode mode;
1988 {
1989   register int regno = REGNO (operand);
1990   if (regno < FIRST_PSEUDO_REGISTER
1991       && TEST_HARD_REG_BIT (reg_class_contents[(int) class],
1992                             regno + offset))
1993     {
1994       register int sr;
1995       regno += offset;
1996       for (sr = HARD_REGNO_NREGS (regno, mode) - 1;
1997            sr > 0; sr--)
1998         if (! TEST_HARD_REG_BIT (reg_class_contents[(int) class],
1999                                  regno + sr))
2000           break;
2001       return sr == 0;
2002     }
2003
2004   return 0;
2005 }
2006
2007 #endif /* REGISTER_CONSTRAINTS */