OSDN Git Service

* config/rs6000/rs6000.md: Remove ppc630 fpcompare from single
[pf3gnuchains/gcc-fork.git] / gcc / print-rtl.c
1 /* Print RTL for GNU C Compiler.
2    Copyright (C) 1987, 1988, 1992, 1997, 1998, 1999, 2000
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
23 #include "config.h"
24 #include "system.h"
25 #include "rtl.h"
26
27 /* We don't want the tree code checking code for the access to the
28    DECL_NAME to be included in the gen* programs.  */
29 #undef ENABLE_TREE_CHECKING
30 #include "tree.h"
31 #include "real.h"
32 #include "flags.h"
33 #include "hard-reg-set.h"
34 #include "basic-block.h"
35
36 /* How to print out a register name.
37    We don't use PRINT_REG because some definitions of PRINT_REG
38    don't work here.  */
39 #ifndef DEBUG_PRINT_REG
40 #define DEBUG_PRINT_REG(RTX, CODE, FILE) \
41   fprintf ((FILE), "%d %s", REGNO (RTX), reg_names[REGNO (RTX)])
42 #endif
43
44 /* Array containing all of the register names */
45
46 #ifdef DEBUG_REGISTER_NAMES
47 static const char * const debug_reg_names[] = DEBUG_REGISTER_NAMES;
48 #define reg_names debug_reg_names
49 #else
50 const char * reg_names[] = REGISTER_NAMES;
51 #endif
52
53 static FILE *outfile;
54
55 static int sawclose = 0;
56
57 static int indent;
58
59 static void print_rtx           PARAMS ((rtx));
60
61 /* String printed at beginning of each RTL when it is dumped.
62    This string is set to ASM_COMMENT_START when the RTL is dumped in
63    the assembly output file.  */
64 const char *print_rtx_head = "";
65
66 /* Nonzero means suppress output of instruction numbers and line number
67    notes in debugging dumps.
68    This must be defined here so that programs like gencodes can be linked.  */
69 int flag_dump_unnumbered = 0;
70
71 /* Nonzero means use simplified format without flags, modes, etc.  */
72 int flag_simple = 0;
73
74 /* Nonzero if we are dumping graphical description.  */
75 int dump_for_graph;
76
77 /* Nonzero to dump all call_placeholder alternatives.  */
78 static int debug_call_placeholder_verbose;
79
80 void
81 print_mem_expr (outfile, expr)
82      FILE *outfile;
83      tree expr;
84 {
85   if (TREE_CODE (expr) == COMPONENT_REF)
86     {
87       if (TREE_OPERAND (expr, 0))
88         print_mem_expr (outfile, TREE_OPERAND (expr, 0));
89       else
90         fputs (" <variable>", outfile);
91       if (DECL_NAME (TREE_OPERAND (expr, 1)))
92         fprintf (outfile, ".%s",
93                  IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (expr, 1))));
94     }
95   else if (DECL_NAME (expr))
96     fprintf (outfile, " %s", IDENTIFIER_POINTER (DECL_NAME (expr)));
97   else if (TREE_CODE (expr) == RESULT_DECL)
98     fputs (" <result>", outfile);
99   else
100     fputs (" <anonymous>", outfile);
101 }
102
103 /* Print IN_RTX onto OUTFILE.  This is the recursive part of printing.  */
104
105 static void
106 print_rtx (in_rtx)
107      rtx in_rtx;
108 {
109   int i = 0;
110   int j;
111   const char *format_ptr;
112   int is_insn;
113   rtx tem;
114
115   if (sawclose)
116     {
117       if (flag_simple)
118         fputc (' ', outfile);
119       else
120         fprintf (outfile, "\n%s%*s", print_rtx_head, indent * 2, "");
121       sawclose = 0;
122     }
123
124   if (in_rtx == 0)
125     {
126       fputs ("(nil)", outfile);
127       sawclose = 1;
128       return;
129     }
130   else if (GET_CODE (in_rtx) > NUM_RTX_CODE)
131     {
132        fprintf (outfile, "(??? bad code %d\n)", GET_CODE (in_rtx));
133        sawclose = 1;
134        return;
135     }
136
137   is_insn = INSN_P (in_rtx);
138
139   /* When printing in VCG format we write INSNs, NOTE, LABEL, and BARRIER
140      in separate nodes and therefore have to handle them special here.  */
141   if (dump_for_graph
142       && (is_insn || GET_CODE (in_rtx) == NOTE
143           || GET_CODE (in_rtx) == CODE_LABEL || GET_CODE (in_rtx) == BARRIER))
144     {
145       i = 3;
146       indent = 0;
147     }
148   else
149     {
150       /* Print name of expression code.  */
151       if (flag_simple && GET_CODE (in_rtx) == CONST_INT)
152         fputc ('(', outfile);
153       else
154         fprintf (outfile, "(%s", GET_RTX_NAME (GET_CODE (in_rtx)));
155
156       if (! flag_simple)
157         {
158           if (RTX_FLAG (in_rtx, in_struct))
159             fputs ("/s", outfile);
160
161           if (RTX_FLAG (in_rtx, volatil))
162             fputs ("/v", outfile);
163
164           if (RTX_FLAG (in_rtx, unchanging))
165             fputs ("/u", outfile);
166
167           if (RTX_FLAG (in_rtx, integrated))
168             fputs ("/i", outfile);
169
170           if (RTX_FLAG (in_rtx, frame_related))
171             fputs ("/f", outfile);
172
173           if (RTX_FLAG (in_rtx, jump))
174             fputs ("/j", outfile);
175
176           if (RTX_FLAG (in_rtx, call))
177             fputs ("/c", outfile);
178
179           if (GET_MODE (in_rtx) != VOIDmode)
180             {
181               /* Print REG_NOTE names for EXPR_LIST and INSN_LIST.  */
182               if (GET_CODE (in_rtx) == EXPR_LIST
183                   || GET_CODE (in_rtx) == INSN_LIST)
184                 fprintf (outfile, ":%s",
185                          GET_REG_NOTE_NAME (GET_MODE (in_rtx)));
186               else
187                 fprintf (outfile, ":%s", GET_MODE_NAME (GET_MODE (in_rtx)));
188             }
189         }
190     }
191
192   /* Get the format string and skip the first elements if we have handled
193      them already.  */
194   format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx)) + i;
195   for (; i < GET_RTX_LENGTH (GET_CODE (in_rtx)); i++)
196     switch (*format_ptr++)
197       {
198         const char *str;
199
200       case 'T':
201         str = XTMPL (in_rtx, i);
202         goto string;
203
204       case 'S':
205       case 's':
206         str = XSTR (in_rtx, i);
207       string:
208
209         if (str == 0)
210           fputs (dump_for_graph ? " \\\"\\\"" : " \"\"", outfile);
211         else
212           {
213             if (dump_for_graph)
214               fprintf (outfile, " (\\\"%s\\\")", str);
215             else
216               fprintf (outfile, " (\"%s\")", str);
217           }
218         sawclose = 1;
219         break;
220
221         /* 0 indicates a field for internal use that should not be printed.
222            An exception is the third field of a NOTE, where it indicates
223            that the field has several different valid contents.  */
224       case '0':
225         if (i == 1 && GET_CODE (in_rtx) == REG)
226           {
227             if (REGNO (in_rtx) != ORIGINAL_REGNO (in_rtx))
228               fprintf (outfile, " [%d]", ORIGINAL_REGNO (in_rtx));
229             break;
230           }
231         if (i == 4 && GET_CODE (in_rtx) == NOTE)
232           {
233             switch (NOTE_LINE_NUMBER (in_rtx))
234               {
235               case NOTE_INSN_EH_REGION_BEG:
236               case NOTE_INSN_EH_REGION_END:
237                 if (flag_dump_unnumbered)
238                   fprintf (outfile, " #");
239                 else
240                   fprintf (outfile, " %d", NOTE_EH_HANDLER (in_rtx));
241                 sawclose = 1;
242                 break;
243
244               case NOTE_INSN_BLOCK_BEG:
245               case NOTE_INSN_BLOCK_END:
246                 fprintf (outfile, " ");
247                 if (flag_dump_unnumbered)
248                   fprintf (outfile, "#");
249                 else
250                   fprintf (outfile, HOST_PTR_PRINTF,
251                            (char *) NOTE_BLOCK (in_rtx));
252                 sawclose = 1;
253                 break;
254
255               case NOTE_INSN_BASIC_BLOCK:
256                 {
257                   basic_block bb = NOTE_BASIC_BLOCK (in_rtx);
258                   if (bb != 0)
259                     fprintf (outfile, " [bb %d]", bb->index);
260                   break;
261                 }
262
263               case NOTE_INSN_EXPECTED_VALUE:
264                 indent += 2;
265                 if (!sawclose)
266                   fprintf (outfile, " ");
267                 print_rtx (NOTE_EXPECTED_VALUE (in_rtx));
268                 indent -= 2;
269                 break;
270
271               case NOTE_INSN_DELETED_LABEL:
272                 if (NOTE_SOURCE_FILE (in_rtx))
273                   fprintf (outfile, " (\"%s\")", NOTE_SOURCE_FILE (in_rtx));
274                 else
275                   fprintf (outfile, " \"\"");
276                 break;
277
278               case NOTE_INSN_PREDICTION:
279                 if (NOTE_PREDICTION (in_rtx))
280                   fprintf (outfile, " [ %d %d ] ",
281                            (int)NOTE_PREDICTION_ALG (in_rtx),
282                            (int) NOTE_PREDICTION_FLAGS (in_rtx));
283                 else
284                   fprintf (outfile, " [ ERROR ]");
285                 break;
286
287               default:
288                 {
289                   const char * const str = X0STR (in_rtx, i);
290
291                   if (NOTE_LINE_NUMBER (in_rtx) < 0)
292                     ;
293                   else if (str == 0)
294                     fputs (dump_for_graph ? " \\\"\\\"" : " \"\"", outfile);
295                   else
296                     {
297                       if (dump_for_graph)
298                         fprintf (outfile, " (\\\"%s\\\")", str);
299                       else
300                         fprintf (outfile, " (\"%s\")", str);
301                     }
302                   break;
303                 }
304               }
305           }
306         break;
307
308       case 'e':
309       do_e:
310         indent += 2;
311         if (!sawclose)
312           fprintf (outfile, " ");
313         print_rtx (XEXP (in_rtx, i));
314         indent -= 2;
315         break;
316
317       case 'E':
318       case 'V':
319         indent += 2;
320         if (sawclose)
321           {
322             fprintf (outfile, "\n%s%*s",
323                      print_rtx_head, indent * 2, "");
324             sawclose = 0;
325           }
326         fputs (" [", outfile);
327         if (NULL != XVEC (in_rtx, i))
328           {
329             indent += 2;
330             if (XVECLEN (in_rtx, i))
331               sawclose = 1;
332
333             for (j = 0; j < XVECLEN (in_rtx, i); j++)
334               print_rtx (XVECEXP (in_rtx, i, j));
335
336             indent -= 2;
337           }
338         if (sawclose)
339           fprintf (outfile, "\n%s%*s", print_rtx_head, indent * 2, "");
340
341         fputs ("]", outfile);
342         sawclose = 1;
343         indent -= 2;
344         break;
345
346       case 'w':
347         if (! flag_simple)
348           fprintf (outfile, " ");
349         fprintf (outfile, HOST_WIDE_INT_PRINT_DEC, XWINT (in_rtx, i));
350         if (! flag_simple)
351           {
352             fprintf (outfile, " [");
353             fprintf (outfile, HOST_WIDE_INT_PRINT_HEX, XWINT (in_rtx, i));
354             fprintf (outfile, "]");
355           }
356         break;
357
358       case 'i':
359         if (i == 6 && GET_CODE (in_rtx) == NOTE)
360           {
361             /* This field is only used for NOTE_INSN_DELETED_LABEL, and
362                other times often contains garbage from INSN->NOTE death.  */
363             if (NOTE_LINE_NUMBER (in_rtx) == NOTE_INSN_DELETED_LABEL)
364               fprintf (outfile, " %d",  XINT (in_rtx, i));
365           }
366         else
367           {
368             int value = XINT (in_rtx, i);
369             const char *name;
370
371             if (GET_CODE (in_rtx) == REG && value < FIRST_PSEUDO_REGISTER)
372               {
373                 fputc (' ', outfile);
374                 DEBUG_PRINT_REG (in_rtx, 0, outfile);
375               }
376             else if (GET_CODE (in_rtx) == REG
377                      && value <= LAST_VIRTUAL_REGISTER)
378               {
379                 if (value == VIRTUAL_INCOMING_ARGS_REGNUM)
380                   fprintf (outfile, " %d virtual-incoming-args", value);
381                 else if (value == VIRTUAL_STACK_VARS_REGNUM)
382                   fprintf (outfile, " %d virtual-stack-vars", value);
383                 else if (value == VIRTUAL_STACK_DYNAMIC_REGNUM)
384                   fprintf (outfile, " %d virtual-stack-dynamic", value);
385                 else if (value == VIRTUAL_OUTGOING_ARGS_REGNUM)
386                   fprintf (outfile, " %d virtual-outgoing-args", value);
387                 else if (value == VIRTUAL_CFA_REGNUM)
388                   fprintf (outfile, " %d virtual-cfa", value);
389                 else
390                   fprintf (outfile, " %d virtual-reg-%d", value,
391                            value-FIRST_VIRTUAL_REGISTER);
392               }
393             else if (flag_dump_unnumbered
394                      && (is_insn || GET_CODE (in_rtx) == NOTE))
395               fputc ('#', outfile);
396             else
397               fprintf (outfile, " %d", value);
398
399             if (is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, i)
400                 && XINT (in_rtx, i) >= 0
401                 && (name = get_insn_name (XINT (in_rtx, i))) != NULL)
402               fprintf (outfile, " {%s}", name);
403             sawclose = 0;
404           }
405         break;
406
407       /* Print NOTE_INSN names rather than integer codes.  */
408
409       case 'n':
410         if (XINT (in_rtx, i) >= (int) NOTE_INSN_BIAS
411             && XINT (in_rtx, i) < (int) NOTE_INSN_MAX)
412           fprintf (outfile, " %s", GET_NOTE_INSN_NAME (XINT (in_rtx, i)));
413         else
414           fprintf (outfile, " %d", XINT (in_rtx, i));
415         sawclose = 0;
416         break;
417
418       case 'u':
419         if (XEXP (in_rtx, i) != NULL)
420           {
421             rtx sub = XEXP (in_rtx, i);
422             enum rtx_code subc = GET_CODE (sub);
423
424             if (GET_CODE (in_rtx) == LABEL_REF)
425               {
426                 if (subc == NOTE
427                     && NOTE_LINE_NUMBER (sub) == NOTE_INSN_DELETED_LABEL)
428                   {
429                     if (flag_dump_unnumbered)
430                       fprintf (outfile, " [# deleted]");
431                     else
432                       fprintf (outfile, " [%d deleted]", INSN_UID (sub));
433                     sawclose = 0;
434                     break;
435                   }
436
437                 if (subc != CODE_LABEL)
438                   goto do_e;
439               }
440
441             if (flag_dump_unnumbered)
442               fputs (" #", outfile);
443             else
444               fprintf (outfile, " %d", INSN_UID (sub));
445           }
446         else
447           fputs (" 0", outfile);
448         sawclose = 0;
449         break;
450
451       case 'b':
452         if (XBITMAP (in_rtx, i) == NULL)
453           fputs (" {null}", outfile);
454         else
455           bitmap_print (outfile, XBITMAP (in_rtx, i), " {", "}");
456         sawclose = 0;
457         break;
458
459       case 't':
460         putc (' ', outfile);
461         fprintf (outfile, HOST_PTR_PRINTF, (char *) XTREE (in_rtx, i));
462         break;
463
464       case '*':
465         fputs (" Unknown", outfile);
466         sawclose = 0;
467         break;
468
469       case 'B':
470         if (XBBDEF (in_rtx, i))
471           fprintf (outfile, " %i", XBBDEF (in_rtx, i)->index);
472         break;
473
474       default:
475         fprintf (stderr,
476                  "switch format wrong in rtl.print_rtx(). format was: %c.\n",
477                  format_ptr[-1]);
478         abort ();
479       }
480
481   switch (GET_CODE (in_rtx))
482     {
483     case MEM:
484       fputs (" [", outfile);
485       fprintf (outfile, HOST_WIDE_INT_PRINT_DEC, MEM_ALIAS_SET (in_rtx));
486
487       if (MEM_EXPR (in_rtx))
488         print_mem_expr (outfile, MEM_EXPR (in_rtx));
489
490       if (MEM_OFFSET (in_rtx))
491         {
492           fputc ('+', outfile);
493           fprintf (outfile, HOST_WIDE_INT_PRINT_DEC,
494                    INTVAL (MEM_OFFSET (in_rtx)));
495         }
496
497       if (MEM_SIZE (in_rtx))
498         {
499           fputs (" S", outfile);
500           fprintf (outfile, HOST_WIDE_INT_PRINT_DEC,
501                    INTVAL (MEM_SIZE (in_rtx)));
502         }
503
504       if (MEM_ALIGN (in_rtx) != 1)
505         fprintf (outfile, " A%u", MEM_ALIGN (in_rtx));
506
507       fputc (']', outfile);
508       break;
509
510 #if 0
511     /* It would be nice to do this, but it would require real.o to
512        be linked into the MD-generator programs.  Maybe we should
513        do that.  -zw 2002-03-03  */
514     case CONST_DOUBLE:
515       if (FLOAT_MODE_P (GET_MODE (in_rtx)))
516         {
517           REAL_VALUE_TYPE val;
518           char s[30];
519
520           REAL_VALUE_FROM_CONST_DOUBLE (val, in_rtx);
521           REAL_VALUE_TO_DECIMAL (val, "%.16g", s);
522           fprintf (outfile, " [%s]", s);
523         }
524       break;
525 #endif
526
527     case CODE_LABEL:
528       fprintf (outfile, " [%d uses]", LABEL_NUSES (in_rtx));
529       switch (LABEL_KIND (in_rtx))
530         {
531           case LABEL_NORMAL: break;
532           case LABEL_STATIC_ENTRY: fputs (" [entry]", outfile); break;
533           case LABEL_GLOBAL_ENTRY: fputs (" [global entry]", outfile); break;
534           case LABEL_WEAK_ENTRY: fputs (" [weak entry]", outfile); break;
535           default: abort();
536         }
537       break;
538
539     case CALL_PLACEHOLDER:
540       if (debug_call_placeholder_verbose)
541         {
542           fputs (" (cond [\n  (const_string \"normal\") (sequence [", outfile);
543           for (tem = XEXP (in_rtx, 0); tem != 0; tem = NEXT_INSN (tem))
544             {
545               fputs ("\n    ", outfile);
546               print_inline_rtx (outfile, tem, 4);
547             }
548
549           tem = XEXP (in_rtx, 1);
550           if (tem)
551             fputs ("\n    ])\n  (const_string \"tail_call\") (sequence [",
552                    outfile);
553           for (; tem != 0; tem = NEXT_INSN (tem))
554             {
555               fputs ("\n    ", outfile);
556               print_inline_rtx (outfile, tem, 4);
557             }
558
559           tem = XEXP (in_rtx, 2);
560           if (tem)
561             fputs ("\n    ])\n  (const_string \"tail_recursion\") (sequence [",
562                    outfile);
563           for (; tem != 0; tem = NEXT_INSN (tem))
564             {
565               fputs ("\n    ", outfile);
566               print_inline_rtx (outfile, tem, 4);
567             }
568
569           fputs ("\n    ])\n  ])", outfile);
570           break;
571         }
572
573       for (tem = XEXP (in_rtx, 0); tem != 0; tem = NEXT_INSN (tem))
574         if (GET_CODE (tem) == CALL_INSN)
575           {
576             fprintf (outfile, " ");
577             print_rtx (tem);
578             break;
579           }
580       break;
581
582     default:
583       break;
584     }
585
586   if (dump_for_graph
587       && (is_insn || GET_CODE (in_rtx) == NOTE
588           || GET_CODE (in_rtx) == CODE_LABEL || GET_CODE (in_rtx) == BARRIER))
589     sawclose = 0;
590   else
591     {
592       fputc (')', outfile);
593       sawclose = 1;
594     }
595 }
596
597 /* Print an rtx on the current line of FILE.  Initially indent IND
598    characters.  */
599
600 void
601 print_inline_rtx (outf, x, ind)
602      FILE *outf;
603      rtx x;
604      int ind;
605 {
606   int oldsaw = sawclose;
607   int oldindent = indent;
608
609   sawclose = 0;
610   indent = ind;
611   outfile = outf;
612   print_rtx (x);
613   sawclose = oldsaw;
614   indent = oldindent;
615 }
616
617 /* Call this function from the debugger to see what X looks like.  */
618
619 void
620 debug_rtx (x)
621      rtx x;
622 {
623   outfile = stderr;
624   sawclose = 0;
625   print_rtx (x);
626   fprintf (stderr, "\n");
627 }
628
629 /* Count of rtx's to print with debug_rtx_list.
630    This global exists because gdb user defined commands have no arguments.  */
631
632 int debug_rtx_count = 0;        /* 0 is treated as equivalent to 1 */
633
634 /* Call this function to print list from X on.
635
636    N is a count of the rtx's to print. Positive values print from the specified
637    rtx on.  Negative values print a window around the rtx.
638    EG: -5 prints 2 rtx's on either side (in addition to the specified rtx).  */
639
640 void
641 debug_rtx_list (x, n)
642      rtx x;
643      int n;
644 {
645   int i,count;
646   rtx insn;
647
648   count = n == 0 ? 1 : n < 0 ? -n : n;
649
650   /* If we are printing a window, back up to the start.  */
651
652   if (n < 0)
653     for (i = count / 2; i > 0; i--)
654       {
655         if (PREV_INSN (x) == 0)
656           break;
657         x = PREV_INSN (x);
658       }
659
660   for (i = count, insn = x; i > 0 && insn != 0; i--, insn = NEXT_INSN (insn))
661     {
662       debug_rtx (insn);
663       fprintf (stderr, "\n");
664     }
665 }
666
667 /* Call this function to print an rtx list from START to END inclusive.  */
668
669 void
670 debug_rtx_range (start, end)
671      rtx start, end;
672 {
673   while (1)
674     {
675       debug_rtx (start);
676       fprintf (stderr, "\n");
677       if (!start || start == end)
678         break;
679       start = NEXT_INSN (start);
680     }
681 }
682
683 /* Call this function to search an rtx list to find one with insn uid UID,
684    and then call debug_rtx_list to print it, using DEBUG_RTX_COUNT.
685    The found insn is returned to enable further debugging analysis.  */
686
687 rtx
688 debug_rtx_find (x, uid)
689      rtx x;
690      int uid;
691 {
692   while (x != 0 && INSN_UID (x) != uid)
693     x = NEXT_INSN (x);
694   if (x != 0)
695     {
696       debug_rtx_list (x, debug_rtx_count);
697       return x;
698     }
699   else
700     {
701       fprintf (stderr, "insn uid %d not found\n", uid);
702       return 0;
703     }
704 }
705
706 /* External entry point for printing a chain of insns
707    starting with RTX_FIRST onto file OUTF.
708    A blank line separates insns.
709
710    If RTX_FIRST is not an insn, then it alone is printed, with no newline.  */
711
712 void
713 print_rtl (outf, rtx_first)
714      FILE *outf;
715      rtx rtx_first;
716 {
717   rtx tmp_rtx;
718
719   outfile = outf;
720   sawclose = 0;
721
722   if (rtx_first == 0)
723     {
724       fputs (print_rtx_head, outf);
725       fputs ("(nil)\n", outf);
726     }
727   else
728     switch (GET_CODE (rtx_first))
729       {
730       case INSN:
731       case JUMP_INSN:
732       case CALL_INSN:
733       case NOTE:
734       case CODE_LABEL:
735       case BARRIER:
736         for (tmp_rtx = rtx_first; tmp_rtx != 0; tmp_rtx = NEXT_INSN (tmp_rtx))
737           if (! flag_dump_unnumbered
738               || GET_CODE (tmp_rtx) != NOTE || NOTE_LINE_NUMBER (tmp_rtx) < 0)
739             {
740               fputs (print_rtx_head, outfile);
741               print_rtx (tmp_rtx);
742               fprintf (outfile, "\n");
743             }
744         break;
745
746       default:
747         fputs (print_rtx_head, outfile);
748         print_rtx (rtx_first);
749       }
750 }
751
752 /* Like print_rtx, except specify a file.  */
753 /* Return nonzero if we actually printed anything.  */
754
755 int
756 print_rtl_single (outf, x)
757      FILE *outf;
758      rtx x;
759 {
760   outfile = outf;
761   sawclose = 0;
762   if (! flag_dump_unnumbered
763       || GET_CODE (x) != NOTE || NOTE_LINE_NUMBER (x) < 0)
764     {
765       fputs (print_rtx_head, outfile);
766       print_rtx (x);
767       putc ('\n', outf);
768       return 1;
769     }
770   return 0;
771 }
772
773
774 /* Like print_rtl except without all the detail; for example,
775    if RTX is a CONST_INT then print in decimal format.  */
776
777 void
778 print_simple_rtl (outf, x)
779      FILE *outf;
780      rtx x;
781 {
782   flag_simple = 1;
783   print_rtl (outf, x);
784   flag_simple = 0;
785 }