OSDN Git Service

7d70059cbba1b2de40ea979f6b5d7fb128c99c76
[pf3gnuchains/gcc-fork.git] / gcc / rtl.c
1 /* RTL utility routines.
2    Copyright (C) 1987, 1988, 1991, 1994, 1997, 1998, 1999, 2000, 2001, 2002
3    Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "rtl.h"
25 #include "real.h"
26 #include "ggc.h"
27 #include "errors.h"
28
29 \f
30 /* Calculate the format for CONST_DOUBLE.  This depends on the relative
31    widths of HOST_WIDE_INT and REAL_VALUE_TYPE.
32
33    We need to go out to 0wwwww, since real.c assumes 16 bits per element
34    in REAL_VALUE_TYPE.
35
36    This is duplicated in gengenrtl.c.
37
38    A number of places assume that there are always at least two 'w'
39    slots in a CONST_DOUBLE, so we provide them even if one would suffice.  */
40
41 #if MAX_LONG_DOUBLE_TYPE_SIZE == 96
42 # define REAL_WIDTH     \
43      (11*8 + HOST_BITS_PER_WIDE_INT)/HOST_BITS_PER_WIDE_INT
44 #else
45 # if MAX_LONG_DOUBLE_TYPE_SIZE == 128
46 #  define REAL_WIDTH    \
47       (19*8 + HOST_BITS_PER_WIDE_INT)/HOST_BITS_PER_WIDE_INT
48 # else
49 #  if HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT
50 #   define REAL_WIDTH   \
51        (7*8 + HOST_BITS_PER_WIDE_INT)/HOST_BITS_PER_WIDE_INT
52 #  endif
53 # endif
54 #endif
55
56 #ifndef REAL_WIDTH
57 # if HOST_BITS_PER_WIDE_INT*2 >= MAX_LONG_DOUBLE_TYPE_SIZE
58 #  define REAL_WIDTH    2
59 # else
60 #  if HOST_BITS_PER_WIDE_INT*3 >= MAX_LONG_DOUBLE_TYPE_SIZE
61 #   define REAL_WIDTH   3
62 #  else
63 #   if HOST_BITS_PER_WIDE_INT*4 >= MAX_LONG_DOUBLE_TYPE_SIZE
64 #    define REAL_WIDTH  4
65 #   endif
66 #  endif
67 # endif
68 #endif /* REAL_WIDTH */
69
70 #if REAL_WIDTH == 1
71 # define CONST_DOUBLE_FORMAT    "0ww"
72 #else
73 # if REAL_WIDTH == 2
74 #  define CONST_DOUBLE_FORMAT   "0ww"
75 # else
76 #  if REAL_WIDTH == 3
77 #   define CONST_DOUBLE_FORMAT  "0www"
78 #  else
79 #   if REAL_WIDTH == 4
80 #    define CONST_DOUBLE_FORMAT "0wwww"
81 #   else
82 #    if REAL_WIDTH == 5
83 #     define CONST_DOUBLE_FORMAT        "0wwwww"
84 #    else
85 #     define CONST_DOUBLE_FORMAT        /* nothing - will cause syntax error */
86 #    endif
87 #   endif
88 #  endif
89 # endif
90 #endif
91
92 /* Indexed by rtx code, gives number of operands for an rtx with that code.
93    Does NOT include rtx header data (code and links).  */
94
95 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   sizeof FORMAT - 1 ,
96
97 const unsigned char rtx_length[NUM_RTX_CODE] = {
98 #include "rtl.def"
99 };
100
101 #undef DEF_RTL_EXPR
102
103 /* Indexed by rtx code, gives the name of that kind of rtx, as a C string.  */
104
105 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   NAME ,
106
107 const char * const rtx_name[NUM_RTX_CODE] = {
108 #include "rtl.def"              /* rtl expressions are documented here */
109 };
110
111 #undef DEF_RTL_EXPR
112
113 /* Indexed by machine mode, gives the name of that machine mode.
114    This name does not include the letters "mode".  */
115
116 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  NAME,
117
118 const char * const mode_name[NUM_MACHINE_MODES] = {
119 #include "machmode.def"
120 };
121
122 #undef DEF_MACHMODE
123
124 /* Indexed by machine mode, gives the class mode for GET_MODE_CLASS.  */
125
126 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  CLASS,
127
128 const enum mode_class mode_class[NUM_MACHINE_MODES] = {
129 #include "machmode.def"
130 };
131
132 #undef DEF_MACHMODE
133
134 /* Indexed by machine mode, gives the length of the mode, in bits.
135    GET_MODE_BITSIZE uses this.  */
136
137 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  BITSIZE,
138
139 const unsigned short mode_bitsize[NUM_MACHINE_MODES] = {
140 #include "machmode.def"
141 };
142
143 #undef DEF_MACHMODE
144
145 /* Indexed by machine mode, gives the length of the mode, in bytes.
146    GET_MODE_SIZE uses this.  */
147
148 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  SIZE,
149
150 const unsigned char mode_size[NUM_MACHINE_MODES] = {
151 #include "machmode.def"
152 };
153
154 #undef DEF_MACHMODE
155
156 /* Indexed by machine mode, gives the length of the mode's subunit.
157    GET_MODE_UNIT_SIZE uses this.  */
158
159 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  UNIT,
160
161 const unsigned char mode_unit_size[NUM_MACHINE_MODES] = {
162 #include "machmode.def"         /* machine modes are documented here */
163 };
164
165 #undef DEF_MACHMODE
166
167 /* Indexed by machine mode, gives next wider natural mode
168    (QI -> HI -> SI -> DI, etc.)  Widening multiply instructions
169    use this.  */
170
171 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  \
172   (unsigned char) WIDER,
173
174 const unsigned char mode_wider_mode[NUM_MACHINE_MODES] = {
175 #include "machmode.def"         /* machine modes are documented here */
176 };
177
178 #undef DEF_MACHMODE
179
180 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER)  \
181   ((BITSIZE) >= HOST_BITS_PER_WIDE_INT) ? ~(unsigned HOST_WIDE_INT) 0 : ((unsigned HOST_WIDE_INT) 1 << (BITSIZE)) - 1,
182
183 /* Indexed by machine mode, gives mask of significant bits in mode.  */
184
185 const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES] = {
186 #include "machmode.def"
187 };
188
189 #undef DEF_MACHMODE
190
191 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) INNER,
192
193 /* Indexed by machine mode, gives the mode of the inner elements in a
194    vector type.  */
195
196 const enum machine_mode inner_mode_array[NUM_MACHINE_MODES] = {
197 #include "machmode.def"
198 };
199
200 /* Indexed by mode class, gives the narrowest mode for each class.
201    The Q modes are always of width 1 (2 for complex) - it is impossible
202    for any mode to be narrower.
203
204    Note that we use QImode instead of BImode for MODE_INT, since
205    otherwise the middle end will try to use it for bitfields in
206    structures and the like, which we do not want.  Only the target
207    md file should generate BImode widgets.  */
208
209 const enum machine_mode class_narrowest_mode[(int) MAX_MODE_CLASS] = {
210     /* MODE_RANDOM */           VOIDmode,
211     /* MODE_INT */              QImode,
212     /* MODE_FLOAT */            QFmode,
213     /* MODE_PARTIAL_INT */      PQImode,
214     /* MODE_CC */               CCmode,
215     /* MODE_COMPLEX_INT */      CQImode,
216     /* MODE_COMPLEX_FLOAT */    QCmode,
217     /* MODE_VECTOR_INT */       V2QImode,
218     /* MODE_VECTOR_FLOAT */     V2SFmode
219 };
220
221
222 /* Indexed by rtx code, gives a sequence of operand-types for
223    rtx's of that code.  The sequence is a C string in which
224    each character describes one operand.  */
225
226 const char * const rtx_format[NUM_RTX_CODE] = {
227   /* "*" undefined.
228          can cause a warning message
229      "0" field is unused (or used in a phase-dependent manner)
230          prints nothing
231      "i" an integer
232          prints the integer
233      "n" like "i", but prints entries from `note_insn_name'
234      "w" an integer of width HOST_BITS_PER_WIDE_INT
235          prints the integer
236      "s" a pointer to a string
237          prints the string
238      "S" like "s", but optional:
239          the containing rtx may end before this operand
240      "T" like "s", but treated specially by the RTL reader;
241          only found in machine description patterns.
242      "e" a pointer to an rtl expression
243          prints the expression
244      "E" a pointer to a vector that points to a number of rtl expressions
245          prints a list of the rtl expressions
246      "V" like "E", but optional:
247          the containing rtx may end before this operand
248      "u" a pointer to another insn
249          prints the uid of the insn.
250      "b" is a pointer to a bitmap header.
251      "t" is a tree pointer.  */
252
253 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   FORMAT ,
254 #include "rtl.def"              /* rtl expressions are defined here */
255 #undef DEF_RTL_EXPR
256 };
257
258 /* Indexed by rtx code, gives a character representing the "class" of
259    that rtx code.  See rtl.def for documentation on the defined classes.  */
260
261 const char rtx_class[NUM_RTX_CODE] = {
262 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   CLASS,
263 #include "rtl.def"              /* rtl expressions are defined here */
264 #undef DEF_RTL_EXPR
265 };
266
267 /* Names for kinds of NOTEs and REG_NOTEs.  */
268
269 const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS] =
270 {
271   "", "NOTE_INSN_DELETED",
272   "NOTE_INSN_BLOCK_BEG", "NOTE_INSN_BLOCK_END",
273   "NOTE_INSN_LOOP_BEG", "NOTE_INSN_LOOP_END",
274   "NOTE_INSN_LOOP_CONT", "NOTE_INSN_LOOP_VTOP",
275   "NOTE_INSN_LOOP_END_TOP_COND", "NOTE_INSN_FUNCTION_END",
276   "NOTE_INSN_PROLOGUE_END", "NOTE_INSN_EPILOGUE_BEG",
277   "NOTE_INSN_DELETED_LABEL", "NOTE_INSN_FUNCTION_BEG",
278   "NOTE_INSN_EH_REGION_BEG", "NOTE_INSN_EH_REGION_END",
279   "NOTE_INSN_REPEATED_LINE_NUMBER", "NOTE_INSN_RANGE_BEG",
280   "NOTE_INSN_RANGE_END", "NOTE_INSN_LIVE",
281   "NOTE_INSN_BASIC_BLOCK", "NOTE_INSN_EXPECTED_VALUE"
282 };
283
284 const char * const reg_note_name[] =
285 {
286   "", "REG_DEAD", "REG_INC", "REG_EQUIV", "REG_EQUAL",
287   "REG_WAS_0", "REG_RETVAL", "REG_LIBCALL", "REG_NONNEG",
288   "REG_NO_CONFLICT", "REG_UNUSED", "REG_CC_SETTER", "REG_CC_USER",
289   "REG_LABEL", "REG_DEP_ANTI", "REG_DEP_OUTPUT", "REG_BR_PROB",
290   "REG_EXEC_COUNT", "REG_NOALIAS", "REG_SAVE_AREA", "REG_BR_PRED",
291   "REG_FRAME_RELATED_EXPR", "REG_EH_CONTEXT", "REG_EH_REGION",
292   "REG_SAVE_NOTE", "REG_MAYBE_DEAD", "REG_NORETURN",
293   "REG_NON_LOCAL_GOTO", "REG_SETJMP", "REG_ALWAYS_RETURN",
294   "REG_VTABLE_REF"
295 };
296
297 \f
298 /* Allocate an rtx vector of N elements.
299    Store the length, and initialize all elements to zero.  */
300
301 rtvec
302 rtvec_alloc (n)
303      int n;
304 {
305   rtvec rt;
306
307   rt = ggc_alloc_rtvec (n);
308   /* clear out the vector */
309   memset (&rt->elem[0], 0, n * sizeof (rtx));
310
311   PUT_NUM_ELEM (rt, n);
312   return rt;
313 }
314
315 /* Allocate an rtx of code CODE.  The CODE is stored in the rtx;
316    all the rest is initialized to zero.  */
317
318 rtx
319 rtx_alloc (code)
320   RTX_CODE code;
321 {
322   rtx rt;
323   int n = GET_RTX_LENGTH (code);
324
325   rt = ggc_alloc_rtx (n);
326
327   /* We want to clear everything up to the FLD array.  Normally, this
328      is one int, but we don't want to assume that and it isn't very
329      portable anyway; this is.  */
330
331   memset (rt, 0, sizeof (struct rtx_def) - sizeof (rtunion));
332   PUT_CODE (rt, code);
333   return rt;
334 }
335
336 \f
337 /* Create a new copy of an rtx.
338    Recursively copies the operands of the rtx,
339    except for those few rtx codes that are sharable.  */
340
341 rtx
342 copy_rtx (orig)
343      rtx orig;
344 {
345   rtx copy;
346   int i, j;
347   RTX_CODE code;
348   const char *format_ptr;
349
350   code = GET_CODE (orig);
351
352   switch (code)
353     {
354     case REG:
355     case QUEUED:
356     case CONST_INT:
357     case CONST_DOUBLE:
358     case CONST_VECTOR:
359     case SYMBOL_REF:
360     case CODE_LABEL:
361     case PC:
362     case CC0:
363     case SCRATCH:
364       /* SCRATCH must be shared because they represent distinct values.  */
365     case ADDRESSOF:
366       return orig;
367
368     case CONST:
369       /* CONST can be shared if it contains a SYMBOL_REF.  If it contains
370          a LABEL_REF, it isn't sharable.  */
371       if (GET_CODE (XEXP (orig, 0)) == PLUS
372           && GET_CODE (XEXP (XEXP (orig, 0), 0)) == SYMBOL_REF
373           && GET_CODE (XEXP (XEXP (orig, 0), 1)) == CONST_INT)
374         return orig;
375       break;
376
377       /* A MEM with a constant address is not sharable.  The problem is that
378          the constant address may need to be reloaded.  If the mem is shared,
379          then reloading one copy of this mem will cause all copies to appear
380          to have been reloaded.  */
381
382     default:
383       break;
384     }
385
386   copy = rtx_alloc (code);
387
388   /* Copy the various flags, and other information.  We assume that
389      all fields need copying, and then clear the fields that should
390      not be copied.  That is the sensible default behavior, and forces
391      us to explicitly document why we are *not* copying a flag.  */
392   memcpy (copy, orig, sizeof (struct rtx_def) - sizeof (rtunion));
393
394   /* We do not copy the USED flag, which is used as a mark bit during
395      walks over the RTL.  */
396   copy->used = 0;
397
398   /* We do not copy FRAME_RELATED for INSNs.  */
399   if (GET_RTX_CLASS (code) == 'i')
400     copy->frame_related = 0;
401   copy->jump = orig->jump;
402   copy->call = orig->call;
403
404   format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
405
406   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
407     {
408       copy->fld[i] = orig->fld[i];
409       switch (*format_ptr++)
410         {
411         case 'e':
412           if (XEXP (orig, i) != NULL)
413             XEXP (copy, i) = copy_rtx (XEXP (orig, i));
414           break;
415
416         case 'E':
417         case 'V':
418           if (XVEC (orig, i) != NULL)
419             {
420               XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
421               for (j = 0; j < XVECLEN (copy, i); j++)
422                 XVECEXP (copy, i, j) = copy_rtx (XVECEXP (orig, i, j));
423             }
424           break;
425
426         case 't':
427         case 'w':
428         case 'i':
429         case 's':
430         case 'S':
431         case 'T':
432         case 'u':
433         case '0':
434           /* These are left unchanged.  */
435           break;
436
437         default:
438           abort ();
439         }
440     }
441   return copy;
442 }
443
444 /* Create a new copy of an rtx.  Only copy just one level.  */
445
446 rtx
447 shallow_copy_rtx (orig)
448      rtx orig;
449 {
450   int i;
451   RTX_CODE code = GET_CODE (orig);
452   rtx copy = rtx_alloc (code);
453
454   PUT_MODE (copy, GET_MODE (orig));
455   copy->in_struct = orig->in_struct;
456   copy->volatil = orig->volatil;
457   copy->unchanging = orig->unchanging;
458   copy->integrated = orig->integrated;
459   copy->frame_related = orig->frame_related;
460
461   for (i = 0; i < GET_RTX_LENGTH (code); i++)
462     copy->fld[i] = orig->fld[i];
463
464   return copy;
465 }
466
467 /* Return the alignment of MODE. This will be bounded by 1 and
468    BIGGEST_ALIGNMENT.  */
469
470 unsigned int
471 get_mode_alignment (mode)
472      enum machine_mode mode;
473 {
474   unsigned int alignment;
475
476   if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
477       || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
478     alignment = GET_MODE_UNIT_SIZE (mode);
479   else
480     alignment = GET_MODE_SIZE (mode);
481   
482   /* Extract the LSB of the size.  */
483   alignment = alignment & -alignment;
484   alignment *= BITS_PER_UNIT;
485
486   alignment = MIN (BIGGEST_ALIGNMENT, MAX (1, alignment));
487   return alignment;
488 }
489 \f
490 /* This is 1 until after the rtl generation pass.  */
491 int rtx_equal_function_value_matters;
492
493 /* Nonzero when we are generating CONCATs.  */
494 int generating_concat_p;
495 \f
496 /* Return 1 if X and Y are identical-looking rtx's.
497    This is the Lisp function EQUAL for rtx arguments.  */
498
499 int
500 rtx_equal_p (x, y)
501      rtx x, y;
502 {
503   int i;
504   int j;
505   enum rtx_code code;
506   const char *fmt;
507
508   if (x == y)
509     return 1;
510   if (x == 0 || y == 0)
511     return 0;
512
513   code = GET_CODE (x);
514   /* Rtx's of different codes cannot be equal.  */
515   if (code != GET_CODE (y))
516     return 0;
517
518   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
519      (REG:SI x) and (REG:HI x) are NOT equivalent.  */
520
521   if (GET_MODE (x) != GET_MODE (y))
522     return 0;
523
524   /* Some RTL can be compared nonrecursively.  */
525   switch (code)
526     {
527     case REG:
528       /* Until rtl generation is complete, don't consider a reference
529          to the return register of the current function the same as
530          the return from a called function.  This eases the job of
531          function integration.  Once the distinction is no longer
532          needed, they can be considered equivalent.  */
533       return (REGNO (x) == REGNO (y)
534               && (! rtx_equal_function_value_matters
535                   || REG_FUNCTION_VALUE_P (x) == REG_FUNCTION_VALUE_P (y)));
536
537     case LABEL_REF:
538       return XEXP (x, 0) == XEXP (y, 0);
539
540     case SYMBOL_REF:
541       return XSTR (x, 0) == XSTR (y, 0);
542
543     case SCRATCH:
544     case CONST_DOUBLE:
545     case CONST_INT:
546     case CONST_VECTOR:
547       return 0;
548
549     default:
550       break;
551     }
552
553   /* Compare the elements.  If any pair of corresponding elements
554      fail to match, return 0 for the whole things.  */
555
556   fmt = GET_RTX_FORMAT (code);
557   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
558     {
559       switch (fmt[i])
560         {
561         case 'w':
562           if (XWINT (x, i) != XWINT (y, i))
563             return 0;
564           break;
565
566         case 'n':
567         case 'i':
568           if (XINT (x, i) != XINT (y, i))
569             return 0;
570           break;
571
572         case 'V':
573         case 'E':
574           /* Two vectors must have the same length.  */
575           if (XVECLEN (x, i) != XVECLEN (y, i))
576             return 0;
577
578           /* And the corresponding elements must match.  */
579           for (j = 0; j < XVECLEN (x, i); j++)
580             if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
581               return 0;
582           break;
583
584         case 'e':
585           if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0)
586             return 0;
587           break;
588
589         case 'S':
590         case 's':
591           if ((XSTR (x, i) || XSTR (y, i))
592               && (! XSTR (x, i) || ! XSTR (y, i)
593                   || strcmp (XSTR (x, i), XSTR (y, i))))
594             return 0;
595           break;
596
597         case 'u':
598           /* These are just backpointers, so they don't matter.  */
599           break;
600
601         case '0':
602         case 't':
603           break;
604
605           /* It is believed that rtx's at this level will never
606              contain anything but integers and other rtx's,
607              except for within LABEL_REFs and SYMBOL_REFs.  */
608         default:
609           abort ();
610         }
611     }
612   return 1;
613 }
614 \f
615 #if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
616 void
617 rtl_check_failed_bounds (r, n, file, line, func)
618     rtx r;
619     int n;
620     const char *file;
621     int line;
622     const char *func;
623 {
624   internal_error
625     ("RTL check: access of elt %d of `%s' with last elt %d in %s, at %s:%d",
626      n, GET_RTX_NAME (GET_CODE (r)), GET_RTX_LENGTH (GET_CODE (r)) - 1,
627      func, trim_filename (file), line);
628 }
629
630 void
631 rtl_check_failed_type1 (r, n, c1, file, line, func)
632     rtx r;
633     int n;
634     int c1;
635     const char *file;
636     int line;
637     const char *func;
638 {
639   internal_error
640     ("RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d",
641      n, c1, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
642      func, trim_filename (file), line);
643 }
644
645 void
646 rtl_check_failed_type2 (r, n, c1, c2, file, line, func)
647     rtx r;
648     int n;
649     int c1;
650     int c2;
651     const char *file;
652     int line;
653     const char *func;
654 {
655   internal_error
656     ("RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d",
657      n, c1, c2, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
658      func, trim_filename (file), line);
659 }
660
661 void
662 rtl_check_failed_code1 (r, code, file, line, func)
663     rtx r;
664     enum rtx_code code;
665     const char *file;
666     int line;
667     const char *func;
668 {
669   internal_error ("RTL check: expected code `%s', have `%s' in %s, at %s:%d",
670                   GET_RTX_NAME (code), GET_RTX_NAME (GET_CODE (r)), func,
671                   trim_filename (file), line);
672 }
673
674 void
675 rtl_check_failed_code2 (r, code1, code2, file, line, func)
676     rtx r;
677     enum rtx_code code1, code2;
678     const char *file;
679     int line;
680     const char *func;
681 {
682   internal_error
683     ("RTL check: expected code `%s' or `%s', have `%s' in %s, at %s:%d",
684      GET_RTX_NAME (code1), GET_RTX_NAME (code2), GET_RTX_NAME (GET_CODE (r)),
685      func, trim_filename (file), line);
686 }
687
688 /* XXX Maybe print the vector?  */
689 void
690 rtvec_check_failed_bounds (r, n, file, line, func)
691     rtvec r;
692     int n;
693     const char *file;
694     int line;
695     const char *func;
696 {
697   internal_error
698     ("RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d",
699      n, GET_NUM_ELEM (r) - 1, func, trim_filename (file), line);
700 }
701 #endif /* ENABLE_RTL_CHECKING */