OSDN Git Service

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