xref: /dflybsd-src/contrib/gcc-4.7/gcc/sched-vis.c (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino /* Instruction scheduling pass.
2*e4b17023SJohn Marino    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3*e4b17023SJohn Marino    2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010
4*e4b17023SJohn Marino    Free Software Foundation, Inc.
5*e4b17023SJohn Marino    Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
6*e4b17023SJohn Marino    and currently maintained by, Jim Wilson (wilson@cygnus.com)
7*e4b17023SJohn Marino 
8*e4b17023SJohn Marino This file is part of GCC.
9*e4b17023SJohn Marino 
10*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under
11*e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free
12*e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later
13*e4b17023SJohn Marino version.
14*e4b17023SJohn Marino 
15*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16*e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or
17*e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18*e4b17023SJohn Marino for more details.
19*e4b17023SJohn Marino 
20*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
21*e4b17023SJohn Marino along with GCC; see the file COPYING3.  If not see
22*e4b17023SJohn Marino <http://www.gnu.org/licenses/>.  */
23*e4b17023SJohn Marino 
24*e4b17023SJohn Marino #include "config.h"
25*e4b17023SJohn Marino #include "system.h"
26*e4b17023SJohn Marino #include "coretypes.h"
27*e4b17023SJohn Marino #include "tm.h"
28*e4b17023SJohn Marino #include "rtl.h"
29*e4b17023SJohn Marino #include "obstack.h"
30*e4b17023SJohn Marino #include "hard-reg-set.h"
31*e4b17023SJohn Marino #include "basic-block.h"
32*e4b17023SJohn Marino #include "insn-attr.h"
33*e4b17023SJohn Marino #include "sched-int.h"
34*e4b17023SJohn Marino #include "tree-pass.h"
35*e4b17023SJohn Marino 
36*e4b17023SJohn Marino static char *safe_concat (char *, char *, const char *);
37*e4b17023SJohn Marino 
38*e4b17023SJohn Marino #define BUF_LEN 2048
39*e4b17023SJohn Marino 
40*e4b17023SJohn Marino static char *
safe_concat(char * buf,char * cur,const char * str)41*e4b17023SJohn Marino safe_concat (char *buf, char *cur, const char *str)
42*e4b17023SJohn Marino {
43*e4b17023SJohn Marino   char *end = buf + BUF_LEN - 2;	/* Leave room for null.  */
44*e4b17023SJohn Marino   int c;
45*e4b17023SJohn Marino 
46*e4b17023SJohn Marino   if (cur > end)
47*e4b17023SJohn Marino     {
48*e4b17023SJohn Marino       *end = '\0';
49*e4b17023SJohn Marino       return end;
50*e4b17023SJohn Marino     }
51*e4b17023SJohn Marino 
52*e4b17023SJohn Marino   while (cur < end && (c = *str++) != '\0')
53*e4b17023SJohn Marino     *cur++ = c;
54*e4b17023SJohn Marino 
55*e4b17023SJohn Marino   *cur = '\0';
56*e4b17023SJohn Marino   return cur;
57*e4b17023SJohn Marino }
58*e4b17023SJohn Marino 
59*e4b17023SJohn Marino /* This recognizes rtx, I classified as expressions.  These are always
60*e4b17023SJohn Marino    represent some action on values or results of other expression, that
61*e4b17023SJohn Marino    may be stored in objects representing values.  */
62*e4b17023SJohn Marino 
63*e4b17023SJohn Marino static void
print_exp(char * buf,const_rtx x,int verbose)64*e4b17023SJohn Marino print_exp (char *buf, const_rtx x, int verbose)
65*e4b17023SJohn Marino {
66*e4b17023SJohn Marino   char tmp[BUF_LEN];
67*e4b17023SJohn Marino   const char *st[4];
68*e4b17023SJohn Marino   char *cur = buf;
69*e4b17023SJohn Marino   const char *fun = (char *) 0;
70*e4b17023SJohn Marino   const char *sep;
71*e4b17023SJohn Marino   rtx op[4];
72*e4b17023SJohn Marino   int i;
73*e4b17023SJohn Marino 
74*e4b17023SJohn Marino   for (i = 0; i < 4; i++)
75*e4b17023SJohn Marino     {
76*e4b17023SJohn Marino       st[i] = (char *) 0;
77*e4b17023SJohn Marino       op[i] = NULL_RTX;
78*e4b17023SJohn Marino     }
79*e4b17023SJohn Marino 
80*e4b17023SJohn Marino   switch (GET_CODE (x))
81*e4b17023SJohn Marino     {
82*e4b17023SJohn Marino     case PLUS:
83*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
84*e4b17023SJohn Marino       if (CONST_INT_P (XEXP (x, 1))
85*e4b17023SJohn Marino 	  && INTVAL (XEXP (x, 1)) < 0)
86*e4b17023SJohn Marino 	{
87*e4b17023SJohn Marino 	  st[1] = "-";
88*e4b17023SJohn Marino 	  op[1] = GEN_INT (-INTVAL (XEXP (x, 1)));
89*e4b17023SJohn Marino 	}
90*e4b17023SJohn Marino       else
91*e4b17023SJohn Marino 	{
92*e4b17023SJohn Marino 	  st[1] = "+";
93*e4b17023SJohn Marino 	  op[1] = XEXP (x, 1);
94*e4b17023SJohn Marino 	}
95*e4b17023SJohn Marino       break;
96*e4b17023SJohn Marino     case LO_SUM:
97*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
98*e4b17023SJohn Marino       st[1] = "+low(";
99*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
100*e4b17023SJohn Marino       st[2] = ")";
101*e4b17023SJohn Marino       break;
102*e4b17023SJohn Marino     case MINUS:
103*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
104*e4b17023SJohn Marino       st[1] = "-";
105*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
106*e4b17023SJohn Marino       break;
107*e4b17023SJohn Marino     case COMPARE:
108*e4b17023SJohn Marino       fun = "cmp";
109*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
110*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
111*e4b17023SJohn Marino       break;
112*e4b17023SJohn Marino     case NEG:
113*e4b17023SJohn Marino       st[0] = "-";
114*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
115*e4b17023SJohn Marino       break;
116*e4b17023SJohn Marino     case MULT:
117*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
118*e4b17023SJohn Marino       st[1] = "*";
119*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
120*e4b17023SJohn Marino       break;
121*e4b17023SJohn Marino     case DIV:
122*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
123*e4b17023SJohn Marino       st[1] = "/";
124*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
125*e4b17023SJohn Marino       break;
126*e4b17023SJohn Marino     case UDIV:
127*e4b17023SJohn Marino       fun = "udiv";
128*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
129*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
130*e4b17023SJohn Marino       break;
131*e4b17023SJohn Marino     case MOD:
132*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
133*e4b17023SJohn Marino       st[1] = "%";
134*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
135*e4b17023SJohn Marino       break;
136*e4b17023SJohn Marino     case UMOD:
137*e4b17023SJohn Marino       fun = "umod";
138*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
139*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
140*e4b17023SJohn Marino       break;
141*e4b17023SJohn Marino     case SMIN:
142*e4b17023SJohn Marino       fun = "smin";
143*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
144*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
145*e4b17023SJohn Marino       break;
146*e4b17023SJohn Marino     case SMAX:
147*e4b17023SJohn Marino       fun = "smax";
148*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
149*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
150*e4b17023SJohn Marino       break;
151*e4b17023SJohn Marino     case UMIN:
152*e4b17023SJohn Marino       fun = "umin";
153*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
154*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
155*e4b17023SJohn Marino       break;
156*e4b17023SJohn Marino     case UMAX:
157*e4b17023SJohn Marino       fun = "umax";
158*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
159*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
160*e4b17023SJohn Marino       break;
161*e4b17023SJohn Marino     case NOT:
162*e4b17023SJohn Marino       st[0] = "!";
163*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
164*e4b17023SJohn Marino       break;
165*e4b17023SJohn Marino     case AND:
166*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
167*e4b17023SJohn Marino       st[1] = "&";
168*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
169*e4b17023SJohn Marino       break;
170*e4b17023SJohn Marino     case IOR:
171*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
172*e4b17023SJohn Marino       st[1] = "|";
173*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
174*e4b17023SJohn Marino       break;
175*e4b17023SJohn Marino     case XOR:
176*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
177*e4b17023SJohn Marino       st[1] = "^";
178*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
179*e4b17023SJohn Marino       break;
180*e4b17023SJohn Marino     case ASHIFT:
181*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
182*e4b17023SJohn Marino       st[1] = "<<";
183*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
184*e4b17023SJohn Marino       break;
185*e4b17023SJohn Marino     case LSHIFTRT:
186*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
187*e4b17023SJohn Marino       st[1] = " 0>>";
188*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
189*e4b17023SJohn Marino       break;
190*e4b17023SJohn Marino     case ASHIFTRT:
191*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
192*e4b17023SJohn Marino       st[1] = ">>";
193*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
194*e4b17023SJohn Marino       break;
195*e4b17023SJohn Marino     case ROTATE:
196*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
197*e4b17023SJohn Marino       st[1] = "<-<";
198*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
199*e4b17023SJohn Marino       break;
200*e4b17023SJohn Marino     case ROTATERT:
201*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
202*e4b17023SJohn Marino       st[1] = ">->";
203*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
204*e4b17023SJohn Marino       break;
205*e4b17023SJohn Marino     case ABS:
206*e4b17023SJohn Marino       fun = "abs";
207*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
208*e4b17023SJohn Marino       break;
209*e4b17023SJohn Marino     case SQRT:
210*e4b17023SJohn Marino       fun = "sqrt";
211*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
212*e4b17023SJohn Marino       break;
213*e4b17023SJohn Marino     case FFS:
214*e4b17023SJohn Marino       fun = "ffs";
215*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
216*e4b17023SJohn Marino       break;
217*e4b17023SJohn Marino     case EQ:
218*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
219*e4b17023SJohn Marino       st[1] = "==";
220*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
221*e4b17023SJohn Marino       break;
222*e4b17023SJohn Marino     case NE:
223*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
224*e4b17023SJohn Marino       st[1] = "!=";
225*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
226*e4b17023SJohn Marino       break;
227*e4b17023SJohn Marino     case GT:
228*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
229*e4b17023SJohn Marino       st[1] = ">";
230*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
231*e4b17023SJohn Marino       break;
232*e4b17023SJohn Marino     case GTU:
233*e4b17023SJohn Marino       fun = "gtu";
234*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
235*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
236*e4b17023SJohn Marino       break;
237*e4b17023SJohn Marino     case LT:
238*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
239*e4b17023SJohn Marino       st[1] = "<";
240*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
241*e4b17023SJohn Marino       break;
242*e4b17023SJohn Marino     case LTU:
243*e4b17023SJohn Marino       fun = "ltu";
244*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
245*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
246*e4b17023SJohn Marino       break;
247*e4b17023SJohn Marino     case GE:
248*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
249*e4b17023SJohn Marino       st[1] = ">=";
250*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
251*e4b17023SJohn Marino       break;
252*e4b17023SJohn Marino     case GEU:
253*e4b17023SJohn Marino       fun = "geu";
254*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
255*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
256*e4b17023SJohn Marino       break;
257*e4b17023SJohn Marino     case LE:
258*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
259*e4b17023SJohn Marino       st[1] = "<=";
260*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
261*e4b17023SJohn Marino       break;
262*e4b17023SJohn Marino     case LEU:
263*e4b17023SJohn Marino       fun = "leu";
264*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
265*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
266*e4b17023SJohn Marino       break;
267*e4b17023SJohn Marino     case SIGN_EXTRACT:
268*e4b17023SJohn Marino       fun = (verbose) ? "sign_extract" : "sxt";
269*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
270*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
271*e4b17023SJohn Marino       op[2] = XEXP (x, 2);
272*e4b17023SJohn Marino       break;
273*e4b17023SJohn Marino     case ZERO_EXTRACT:
274*e4b17023SJohn Marino       fun = (verbose) ? "zero_extract" : "zxt";
275*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
276*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
277*e4b17023SJohn Marino       op[2] = XEXP (x, 2);
278*e4b17023SJohn Marino       break;
279*e4b17023SJohn Marino     case SIGN_EXTEND:
280*e4b17023SJohn Marino       fun = (verbose) ? "sign_extend" : "sxn";
281*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
282*e4b17023SJohn Marino       break;
283*e4b17023SJohn Marino     case ZERO_EXTEND:
284*e4b17023SJohn Marino       fun = (verbose) ? "zero_extend" : "zxn";
285*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
286*e4b17023SJohn Marino       break;
287*e4b17023SJohn Marino     case FLOAT_EXTEND:
288*e4b17023SJohn Marino       fun = (verbose) ? "float_extend" : "fxn";
289*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
290*e4b17023SJohn Marino       break;
291*e4b17023SJohn Marino     case TRUNCATE:
292*e4b17023SJohn Marino       fun = (verbose) ? "trunc" : "trn";
293*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
294*e4b17023SJohn Marino       break;
295*e4b17023SJohn Marino     case FLOAT_TRUNCATE:
296*e4b17023SJohn Marino       fun = (verbose) ? "float_trunc" : "ftr";
297*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
298*e4b17023SJohn Marino       break;
299*e4b17023SJohn Marino     case FLOAT:
300*e4b17023SJohn Marino       fun = (verbose) ? "float" : "flt";
301*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
302*e4b17023SJohn Marino       break;
303*e4b17023SJohn Marino     case UNSIGNED_FLOAT:
304*e4b17023SJohn Marino       fun = (verbose) ? "uns_float" : "ufl";
305*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
306*e4b17023SJohn Marino       break;
307*e4b17023SJohn Marino     case FIX:
308*e4b17023SJohn Marino       fun = "fix";
309*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
310*e4b17023SJohn Marino       break;
311*e4b17023SJohn Marino     case UNSIGNED_FIX:
312*e4b17023SJohn Marino       fun = (verbose) ? "uns_fix" : "ufx";
313*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
314*e4b17023SJohn Marino       break;
315*e4b17023SJohn Marino     case PRE_DEC:
316*e4b17023SJohn Marino       st[0] = "--";
317*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
318*e4b17023SJohn Marino       break;
319*e4b17023SJohn Marino     case PRE_INC:
320*e4b17023SJohn Marino       st[0] = "++";
321*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
322*e4b17023SJohn Marino       break;
323*e4b17023SJohn Marino     case POST_DEC:
324*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
325*e4b17023SJohn Marino       st[1] = "--";
326*e4b17023SJohn Marino       break;
327*e4b17023SJohn Marino     case POST_INC:
328*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
329*e4b17023SJohn Marino       st[1] = "++";
330*e4b17023SJohn Marino       break;
331*e4b17023SJohn Marino     case PRE_MODIFY:
332*e4b17023SJohn Marino       st[0] = "pre ";
333*e4b17023SJohn Marino       op[0] = XEXP (XEXP (x, 1), 0);
334*e4b17023SJohn Marino       st[1] = "+=";
335*e4b17023SJohn Marino       op[1] = XEXP (XEXP (x, 1), 1);
336*e4b17023SJohn Marino       break;
337*e4b17023SJohn Marino     case POST_MODIFY:
338*e4b17023SJohn Marino       st[0] = "post ";
339*e4b17023SJohn Marino       op[0] = XEXP (XEXP (x, 1), 0);
340*e4b17023SJohn Marino       st[1] = "+=";
341*e4b17023SJohn Marino       op[1] = XEXP (XEXP (x, 1), 1);
342*e4b17023SJohn Marino       break;
343*e4b17023SJohn Marino     case CALL:
344*e4b17023SJohn Marino       st[0] = "call ";
345*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
346*e4b17023SJohn Marino       if (verbose)
347*e4b17023SJohn Marino 	{
348*e4b17023SJohn Marino 	  st[1] = " argc:";
349*e4b17023SJohn Marino 	  op[1] = XEXP (x, 1);
350*e4b17023SJohn Marino 	}
351*e4b17023SJohn Marino       break;
352*e4b17023SJohn Marino     case IF_THEN_ELSE:
353*e4b17023SJohn Marino       st[0] = "{(";
354*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
355*e4b17023SJohn Marino       st[1] = ")?";
356*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
357*e4b17023SJohn Marino       st[2] = ":";
358*e4b17023SJohn Marino       op[2] = XEXP (x, 2);
359*e4b17023SJohn Marino       st[3] = "}";
360*e4b17023SJohn Marino       break;
361*e4b17023SJohn Marino     case TRAP_IF:
362*e4b17023SJohn Marino       fun = "trap_if";
363*e4b17023SJohn Marino       op[0] = TRAP_CONDITION (x);
364*e4b17023SJohn Marino       break;
365*e4b17023SJohn Marino     case PREFETCH:
366*e4b17023SJohn Marino       fun = "prefetch";
367*e4b17023SJohn Marino       op[0] = XEXP (x, 0);
368*e4b17023SJohn Marino       op[1] = XEXP (x, 1);
369*e4b17023SJohn Marino       op[2] = XEXP (x, 2);
370*e4b17023SJohn Marino       break;
371*e4b17023SJohn Marino     case UNSPEC:
372*e4b17023SJohn Marino     case UNSPEC_VOLATILE:
373*e4b17023SJohn Marino       {
374*e4b17023SJohn Marino 	cur = safe_concat (buf, cur, "unspec");
375*e4b17023SJohn Marino 	if (GET_CODE (x) == UNSPEC_VOLATILE)
376*e4b17023SJohn Marino 	  cur = safe_concat (buf, cur, "/v");
377*e4b17023SJohn Marino 	cur = safe_concat (buf, cur, "[");
378*e4b17023SJohn Marino 	sep = "";
379*e4b17023SJohn Marino 	for (i = 0; i < XVECLEN (x, 0); i++)
380*e4b17023SJohn Marino 	  {
381*e4b17023SJohn Marino 	    print_pattern (tmp, XVECEXP (x, 0, i), verbose);
382*e4b17023SJohn Marino 	    cur = safe_concat (buf, cur, sep);
383*e4b17023SJohn Marino 	    cur = safe_concat (buf, cur, tmp);
384*e4b17023SJohn Marino 	    sep = ",";
385*e4b17023SJohn Marino 	  }
386*e4b17023SJohn Marino 	cur = safe_concat (buf, cur, "] ");
387*e4b17023SJohn Marino 	sprintf (tmp, "%d", XINT (x, 1));
388*e4b17023SJohn Marino 	cur = safe_concat (buf, cur, tmp);
389*e4b17023SJohn Marino       }
390*e4b17023SJohn Marino       break;
391*e4b17023SJohn Marino     default:
392*e4b17023SJohn Marino       /* If (verbose) debug_rtx (x);  */
393*e4b17023SJohn Marino       st[0] = GET_RTX_NAME (GET_CODE (x));
394*e4b17023SJohn Marino       break;
395*e4b17023SJohn Marino     }
396*e4b17023SJohn Marino 
397*e4b17023SJohn Marino   /* Print this as a function?  */
398*e4b17023SJohn Marino   if (fun)
399*e4b17023SJohn Marino     {
400*e4b17023SJohn Marino       cur = safe_concat (buf, cur, fun);
401*e4b17023SJohn Marino       cur = safe_concat (buf, cur, "(");
402*e4b17023SJohn Marino     }
403*e4b17023SJohn Marino 
404*e4b17023SJohn Marino   for (i = 0; i < 4; i++)
405*e4b17023SJohn Marino     {
406*e4b17023SJohn Marino       if (st[i])
407*e4b17023SJohn Marino 	cur = safe_concat (buf, cur, st[i]);
408*e4b17023SJohn Marino 
409*e4b17023SJohn Marino       if (op[i])
410*e4b17023SJohn Marino 	{
411*e4b17023SJohn Marino 	  if (fun && i != 0)
412*e4b17023SJohn Marino 	    cur = safe_concat (buf, cur, ",");
413*e4b17023SJohn Marino 
414*e4b17023SJohn Marino 	  print_value (tmp, op[i], verbose);
415*e4b17023SJohn Marino 	  cur = safe_concat (buf, cur, tmp);
416*e4b17023SJohn Marino 	}
417*e4b17023SJohn Marino     }
418*e4b17023SJohn Marino 
419*e4b17023SJohn Marino   if (fun)
420*e4b17023SJohn Marino     cur = safe_concat (buf, cur, ")");
421*e4b17023SJohn Marino }		/* print_exp */
422*e4b17023SJohn Marino 
423*e4b17023SJohn Marino /* Prints rtxes, I customarily classified as values.  They're constants,
424*e4b17023SJohn Marino    registers, labels, symbols and memory accesses.  */
425*e4b17023SJohn Marino 
426*e4b17023SJohn Marino void
print_value(char * buf,const_rtx x,int verbose)427*e4b17023SJohn Marino print_value (char *buf, const_rtx x, int verbose)
428*e4b17023SJohn Marino {
429*e4b17023SJohn Marino   char t[BUF_LEN];
430*e4b17023SJohn Marino   char *cur = buf;
431*e4b17023SJohn Marino 
432*e4b17023SJohn Marino   if (!x)
433*e4b17023SJohn Marino     {
434*e4b17023SJohn Marino       safe_concat (buf, buf, "(nil)");
435*e4b17023SJohn Marino       return;
436*e4b17023SJohn Marino     }
437*e4b17023SJohn Marino   switch (GET_CODE (x))
438*e4b17023SJohn Marino     {
439*e4b17023SJohn Marino     case CONST_INT:
440*e4b17023SJohn Marino       sprintf (t, HOST_WIDE_INT_PRINT_HEX,
441*e4b17023SJohn Marino 	       (unsigned HOST_WIDE_INT) INTVAL (x));
442*e4b17023SJohn Marino       cur = safe_concat (buf, cur, t);
443*e4b17023SJohn Marino       break;
444*e4b17023SJohn Marino     case CONST_DOUBLE:
445*e4b17023SJohn Marino       if (FLOAT_MODE_P (GET_MODE (x)))
446*e4b17023SJohn Marino 	real_to_decimal (t, CONST_DOUBLE_REAL_VALUE (x), sizeof (t), 0, 1);
447*e4b17023SJohn Marino       else
448*e4b17023SJohn Marino 	sprintf (t,
449*e4b17023SJohn Marino 		 "<" HOST_WIDE_INT_PRINT_HEX "," HOST_WIDE_INT_PRINT_HEX ">",
450*e4b17023SJohn Marino 		 (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (x),
451*e4b17023SJohn Marino 		 (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (x));
452*e4b17023SJohn Marino       cur = safe_concat (buf, cur, t);
453*e4b17023SJohn Marino       break;
454*e4b17023SJohn Marino     case CONST_FIXED:
455*e4b17023SJohn Marino       fixed_to_decimal (t, CONST_FIXED_VALUE (x), sizeof (t));
456*e4b17023SJohn Marino       cur = safe_concat (buf, cur, t);
457*e4b17023SJohn Marino       break;
458*e4b17023SJohn Marino     case CONST_STRING:
459*e4b17023SJohn Marino       cur = safe_concat (buf, cur, "\"");
460*e4b17023SJohn Marino       cur = safe_concat (buf, cur, XSTR (x, 0));
461*e4b17023SJohn Marino       cur = safe_concat (buf, cur, "\"");
462*e4b17023SJohn Marino       break;
463*e4b17023SJohn Marino     case SYMBOL_REF:
464*e4b17023SJohn Marino       cur = safe_concat (buf, cur, "`");
465*e4b17023SJohn Marino       cur = safe_concat (buf, cur, XSTR (x, 0));
466*e4b17023SJohn Marino       cur = safe_concat (buf, cur, "'");
467*e4b17023SJohn Marino       break;
468*e4b17023SJohn Marino     case LABEL_REF:
469*e4b17023SJohn Marino       sprintf (t, "L%d", INSN_UID (XEXP (x, 0)));
470*e4b17023SJohn Marino       cur = safe_concat (buf, cur, t);
471*e4b17023SJohn Marino       break;
472*e4b17023SJohn Marino     case CONST:
473*e4b17023SJohn Marino       print_value (t, XEXP (x, 0), verbose);
474*e4b17023SJohn Marino       cur = safe_concat (buf, cur, "const(");
475*e4b17023SJohn Marino       cur = safe_concat (buf, cur, t);
476*e4b17023SJohn Marino       cur = safe_concat (buf, cur, ")");
477*e4b17023SJohn Marino       break;
478*e4b17023SJohn Marino     case HIGH:
479*e4b17023SJohn Marino       print_value (t, XEXP (x, 0), verbose);
480*e4b17023SJohn Marino       cur = safe_concat (buf, cur, "high(");
481*e4b17023SJohn Marino       cur = safe_concat (buf, cur, t);
482*e4b17023SJohn Marino       cur = safe_concat (buf, cur, ")");
483*e4b17023SJohn Marino       break;
484*e4b17023SJohn Marino     case REG:
485*e4b17023SJohn Marino       if (REGNO (x) < FIRST_PSEUDO_REGISTER)
486*e4b17023SJohn Marino 	{
487*e4b17023SJohn Marino 	  int c = reg_names[REGNO (x)][0];
488*e4b17023SJohn Marino 	  if (ISDIGIT (c))
489*e4b17023SJohn Marino 	    cur = safe_concat (buf, cur, "%");
490*e4b17023SJohn Marino 
491*e4b17023SJohn Marino 	  cur = safe_concat (buf, cur, reg_names[REGNO (x)]);
492*e4b17023SJohn Marino 	}
493*e4b17023SJohn Marino       else
494*e4b17023SJohn Marino 	{
495*e4b17023SJohn Marino 	  sprintf (t, "r%d", REGNO (x));
496*e4b17023SJohn Marino 	  cur = safe_concat (buf, cur, t);
497*e4b17023SJohn Marino 	}
498*e4b17023SJohn Marino       if (verbose
499*e4b17023SJohn Marino #ifdef INSN_SCHEDULING
500*e4b17023SJohn Marino 	  && !current_sched_info
501*e4b17023SJohn Marino #endif
502*e4b17023SJohn Marino 	 )
503*e4b17023SJohn Marino 	{
504*e4b17023SJohn Marino 	  sprintf (t, ":%s", GET_MODE_NAME (GET_MODE (x)));
505*e4b17023SJohn Marino 	  cur = safe_concat (buf, cur, t);
506*e4b17023SJohn Marino 	}
507*e4b17023SJohn Marino       break;
508*e4b17023SJohn Marino     case SUBREG:
509*e4b17023SJohn Marino       print_value (t, SUBREG_REG (x), verbose);
510*e4b17023SJohn Marino       cur = safe_concat (buf, cur, t);
511*e4b17023SJohn Marino       sprintf (t, "#%d", SUBREG_BYTE (x));
512*e4b17023SJohn Marino       cur = safe_concat (buf, cur, t);
513*e4b17023SJohn Marino       break;
514*e4b17023SJohn Marino     case STRICT_LOW_PART:
515*e4b17023SJohn Marino       print_value (t, XEXP (x, 0), verbose);
516*e4b17023SJohn Marino       cur = safe_concat (buf, cur, "strict_low_part(");
517*e4b17023SJohn Marino       cur = safe_concat (buf, cur, t);
518*e4b17023SJohn Marino       cur = safe_concat (buf, cur, ")");
519*e4b17023SJohn Marino       break;
520*e4b17023SJohn Marino     case SCRATCH:
521*e4b17023SJohn Marino       cur = safe_concat (buf, cur, "scratch");
522*e4b17023SJohn Marino       break;
523*e4b17023SJohn Marino     case CC0:
524*e4b17023SJohn Marino       cur = safe_concat (buf, cur, "cc0");
525*e4b17023SJohn Marino       break;
526*e4b17023SJohn Marino     case PC:
527*e4b17023SJohn Marino       cur = safe_concat (buf, cur, "pc");
528*e4b17023SJohn Marino       break;
529*e4b17023SJohn Marino     case MEM:
530*e4b17023SJohn Marino       print_value (t, XEXP (x, 0), verbose);
531*e4b17023SJohn Marino       cur = safe_concat (buf, cur, "[");
532*e4b17023SJohn Marino       cur = safe_concat (buf, cur, t);
533*e4b17023SJohn Marino       cur = safe_concat (buf, cur, "]");
534*e4b17023SJohn Marino       break;
535*e4b17023SJohn Marino     case DEBUG_EXPR:
536*e4b17023SJohn Marino       sprintf (t, "D#%i", DEBUG_TEMP_UID (DEBUG_EXPR_TREE_DECL (x)));
537*e4b17023SJohn Marino       cur = safe_concat (buf, cur, t);
538*e4b17023SJohn Marino       break;
539*e4b17023SJohn Marino     default:
540*e4b17023SJohn Marino       print_exp (t, x, verbose);
541*e4b17023SJohn Marino       cur = safe_concat (buf, cur, t);
542*e4b17023SJohn Marino       break;
543*e4b17023SJohn Marino     }
544*e4b17023SJohn Marino }				/* print_value */
545*e4b17023SJohn Marino 
546*e4b17023SJohn Marino /* The next step in insn detalization, its pattern recognition.  */
547*e4b17023SJohn Marino 
548*e4b17023SJohn Marino void
print_pattern(char * buf,const_rtx x,int verbose)549*e4b17023SJohn Marino print_pattern (char *buf, const_rtx x, int verbose)
550*e4b17023SJohn Marino {
551*e4b17023SJohn Marino   char t1[BUF_LEN], t2[BUF_LEN], t3[BUF_LEN];
552*e4b17023SJohn Marino 
553*e4b17023SJohn Marino   switch (GET_CODE (x))
554*e4b17023SJohn Marino     {
555*e4b17023SJohn Marino     case SET:
556*e4b17023SJohn Marino       print_value (t1, SET_DEST (x), verbose);
557*e4b17023SJohn Marino       print_value (t2, SET_SRC (x), verbose);
558*e4b17023SJohn Marino       sprintf (buf, "%s=%s", t1, t2);
559*e4b17023SJohn Marino       break;
560*e4b17023SJohn Marino     case RETURN:
561*e4b17023SJohn Marino       sprintf (buf, "return");
562*e4b17023SJohn Marino       break;
563*e4b17023SJohn Marino     case SIMPLE_RETURN:
564*e4b17023SJohn Marino       sprintf (buf, "simple_return");
565*e4b17023SJohn Marino       break;
566*e4b17023SJohn Marino     case CALL:
567*e4b17023SJohn Marino       print_exp (buf, x, verbose);
568*e4b17023SJohn Marino       break;
569*e4b17023SJohn Marino     case CLOBBER:
570*e4b17023SJohn Marino       print_value (t1, XEXP (x, 0), verbose);
571*e4b17023SJohn Marino       sprintf (buf, "clobber %s", t1);
572*e4b17023SJohn Marino       break;
573*e4b17023SJohn Marino     case USE:
574*e4b17023SJohn Marino       print_value (t1, XEXP (x, 0), verbose);
575*e4b17023SJohn Marino       sprintf (buf, "use %s", t1);
576*e4b17023SJohn Marino       break;
577*e4b17023SJohn Marino     case VAR_LOCATION:
578*e4b17023SJohn Marino       print_value (t1, PAT_VAR_LOCATION_LOC (x), verbose);
579*e4b17023SJohn Marino       sprintf (buf, "loc %s", t1);
580*e4b17023SJohn Marino       break;
581*e4b17023SJohn Marino     case COND_EXEC:
582*e4b17023SJohn Marino       if (GET_CODE (COND_EXEC_TEST (x)) == NE
583*e4b17023SJohn Marino 	  && XEXP (COND_EXEC_TEST (x), 1) == const0_rtx)
584*e4b17023SJohn Marino 	print_value (t1, XEXP (COND_EXEC_TEST (x), 0), verbose);
585*e4b17023SJohn Marino       else if (GET_CODE (COND_EXEC_TEST (x)) == EQ
586*e4b17023SJohn Marino 	       && XEXP (COND_EXEC_TEST (x), 1) == const0_rtx)
587*e4b17023SJohn Marino 	{
588*e4b17023SJohn Marino 	  t1[0] = '!';
589*e4b17023SJohn Marino 	  print_value (t1 + 1, XEXP (COND_EXEC_TEST (x), 0), verbose);
590*e4b17023SJohn Marino 	}
591*e4b17023SJohn Marino       else
592*e4b17023SJohn Marino 	print_value (t1, COND_EXEC_TEST (x), verbose);
593*e4b17023SJohn Marino       print_pattern (t2, COND_EXEC_CODE (x), verbose);
594*e4b17023SJohn Marino       sprintf (buf, "(%s) %s", t1, t2);
595*e4b17023SJohn Marino       break;
596*e4b17023SJohn Marino     case PARALLEL:
597*e4b17023SJohn Marino       {
598*e4b17023SJohn Marino 	int i;
599*e4b17023SJohn Marino 
600*e4b17023SJohn Marino 	sprintf (t1, "{");
601*e4b17023SJohn Marino 	for (i = 0; i < XVECLEN (x, 0); i++)
602*e4b17023SJohn Marino 	  {
603*e4b17023SJohn Marino 	    print_pattern (t2, XVECEXP (x, 0, i), verbose);
604*e4b17023SJohn Marino 	    sprintf (t3, "%s%s;", t1, t2);
605*e4b17023SJohn Marino 	    strcpy (t1, t3);
606*e4b17023SJohn Marino 	  }
607*e4b17023SJohn Marino 	sprintf (buf, "%s}", t1);
608*e4b17023SJohn Marino       }
609*e4b17023SJohn Marino       break;
610*e4b17023SJohn Marino     case SEQUENCE:
611*e4b17023SJohn Marino       /* Should never see SEQUENCE codes until after reorg.  */
612*e4b17023SJohn Marino       gcc_unreachable ();
613*e4b17023SJohn Marino     case ASM_INPUT:
614*e4b17023SJohn Marino       sprintf (buf, "asm {%s}", XSTR (x, 0));
615*e4b17023SJohn Marino       break;
616*e4b17023SJohn Marino     case ADDR_VEC:
617*e4b17023SJohn Marino       /* Fall through.  */
618*e4b17023SJohn Marino     case ADDR_DIFF_VEC:
619*e4b17023SJohn Marino       print_value (buf, XEXP (x, 0), verbose);
620*e4b17023SJohn Marino       break;
621*e4b17023SJohn Marino     case TRAP_IF:
622*e4b17023SJohn Marino       print_value (t1, TRAP_CONDITION (x), verbose);
623*e4b17023SJohn Marino       sprintf (buf, "trap_if %s", t1);
624*e4b17023SJohn Marino       break;
625*e4b17023SJohn Marino     case UNSPEC:
626*e4b17023SJohn Marino       {
627*e4b17023SJohn Marino 	int i;
628*e4b17023SJohn Marino 
629*e4b17023SJohn Marino 	sprintf (t1, "unspec{");
630*e4b17023SJohn Marino 	for (i = 0; i < XVECLEN (x, 0); i++)
631*e4b17023SJohn Marino 	  {
632*e4b17023SJohn Marino 	    print_pattern (t2, XVECEXP (x, 0, i), verbose);
633*e4b17023SJohn Marino 	    sprintf (t3, "%s%s;", t1, t2);
634*e4b17023SJohn Marino 	    strcpy (t1, t3);
635*e4b17023SJohn Marino 	  }
636*e4b17023SJohn Marino 	sprintf (buf, "%s}", t1);
637*e4b17023SJohn Marino       }
638*e4b17023SJohn Marino       break;
639*e4b17023SJohn Marino     case UNSPEC_VOLATILE:
640*e4b17023SJohn Marino       {
641*e4b17023SJohn Marino 	int i;
642*e4b17023SJohn Marino 
643*e4b17023SJohn Marino 	sprintf (t1, "unspec/v{");
644*e4b17023SJohn Marino 	for (i = 0; i < XVECLEN (x, 0); i++)
645*e4b17023SJohn Marino 	  {
646*e4b17023SJohn Marino 	    print_pattern (t2, XVECEXP (x, 0, i), verbose);
647*e4b17023SJohn Marino 	    sprintf (t3, "%s%s;", t1, t2);
648*e4b17023SJohn Marino 	    strcpy (t1, t3);
649*e4b17023SJohn Marino 	  }
650*e4b17023SJohn Marino 	sprintf (buf, "%s}", t1);
651*e4b17023SJohn Marino       }
652*e4b17023SJohn Marino       break;
653*e4b17023SJohn Marino     default:
654*e4b17023SJohn Marino       print_value (buf, x, verbose);
655*e4b17023SJohn Marino     }
656*e4b17023SJohn Marino }				/* print_pattern */
657*e4b17023SJohn Marino 
658*e4b17023SJohn Marino /* This is the main function in rtl visualization mechanism. It
659*e4b17023SJohn Marino    accepts an rtx and tries to recognize it as an insn, then prints it
660*e4b17023SJohn Marino    properly in human readable form, resembling assembler mnemonics.
661*e4b17023SJohn Marino    For every insn it prints its UID and BB the insn belongs too.
662*e4b17023SJohn Marino    (Probably the last "option" should be extended somehow, since it
663*e4b17023SJohn Marino    depends now on sched.c inner variables ...)  */
664*e4b17023SJohn Marino 
665*e4b17023SJohn Marino void
print_insn(char * buf,const_rtx x,int verbose)666*e4b17023SJohn Marino print_insn (char *buf, const_rtx x, int verbose)
667*e4b17023SJohn Marino {
668*e4b17023SJohn Marino   char t[BUF_LEN];
669*e4b17023SJohn Marino   const_rtx insn = x;
670*e4b17023SJohn Marino 
671*e4b17023SJohn Marino   switch (GET_CODE (x))
672*e4b17023SJohn Marino     {
673*e4b17023SJohn Marino     case INSN:
674*e4b17023SJohn Marino       print_pattern (t, PATTERN (x), verbose);
675*e4b17023SJohn Marino #ifdef INSN_SCHEDULING
676*e4b17023SJohn Marino       if (verbose && current_sched_info)
677*e4b17023SJohn Marino 	sprintf (buf, "%s: %s", (*current_sched_info->print_insn) (x, 1),
678*e4b17023SJohn Marino 		 t);
679*e4b17023SJohn Marino       else
680*e4b17023SJohn Marino #endif
681*e4b17023SJohn Marino 	sprintf (buf, " %4d %s", INSN_UID (x), t);
682*e4b17023SJohn Marino       break;
683*e4b17023SJohn Marino 
684*e4b17023SJohn Marino     case DEBUG_INSN:
685*e4b17023SJohn Marino       {
686*e4b17023SJohn Marino 	const char *name = "?";
687*e4b17023SJohn Marino 
688*e4b17023SJohn Marino 	if (DECL_P (INSN_VAR_LOCATION_DECL (insn)))
689*e4b17023SJohn Marino 	  {
690*e4b17023SJohn Marino 	    tree id = DECL_NAME (INSN_VAR_LOCATION_DECL (insn));
691*e4b17023SJohn Marino 	    char idbuf[32];
692*e4b17023SJohn Marino 	    if (id)
693*e4b17023SJohn Marino 	      name = IDENTIFIER_POINTER (id);
694*e4b17023SJohn Marino 	    else if (TREE_CODE (INSN_VAR_LOCATION_DECL (insn))
695*e4b17023SJohn Marino 		     == DEBUG_EXPR_DECL)
696*e4b17023SJohn Marino 	      {
697*e4b17023SJohn Marino 		sprintf (idbuf, "D#%i",
698*e4b17023SJohn Marino 			 DEBUG_TEMP_UID (INSN_VAR_LOCATION_DECL (insn)));
699*e4b17023SJohn Marino 		name = idbuf;
700*e4b17023SJohn Marino 	      }
701*e4b17023SJohn Marino 	    else
702*e4b17023SJohn Marino 	      {
703*e4b17023SJohn Marino 		sprintf (idbuf, "D.%i",
704*e4b17023SJohn Marino 			 DECL_UID (INSN_VAR_LOCATION_DECL (insn)));
705*e4b17023SJohn Marino 		name = idbuf;
706*e4b17023SJohn Marino 	      }
707*e4b17023SJohn Marino 	  }
708*e4b17023SJohn Marino 	if (VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)))
709*e4b17023SJohn Marino 	  sprintf (buf, " %4d: debug %s optimized away", INSN_UID (insn), name);
710*e4b17023SJohn Marino 	else
711*e4b17023SJohn Marino 	  {
712*e4b17023SJohn Marino 	    print_pattern (t, INSN_VAR_LOCATION_LOC (insn), verbose);
713*e4b17023SJohn Marino 	    sprintf (buf, " %4d: debug %s => %s", INSN_UID (insn), name, t);
714*e4b17023SJohn Marino 	  }
715*e4b17023SJohn Marino       }
716*e4b17023SJohn Marino       break;
717*e4b17023SJohn Marino 
718*e4b17023SJohn Marino     case JUMP_INSN:
719*e4b17023SJohn Marino       print_pattern (t, PATTERN (x), verbose);
720*e4b17023SJohn Marino #ifdef INSN_SCHEDULING
721*e4b17023SJohn Marino       if (verbose && current_sched_info)
722*e4b17023SJohn Marino 	sprintf (buf, "%s: jump %s", (*current_sched_info->print_insn) (x, 1),
723*e4b17023SJohn Marino 		 t);
724*e4b17023SJohn Marino       else
725*e4b17023SJohn Marino #endif
726*e4b17023SJohn Marino 	sprintf (buf, " %4d %s", INSN_UID (x), t);
727*e4b17023SJohn Marino       break;
728*e4b17023SJohn Marino     case CALL_INSN:
729*e4b17023SJohn Marino       x = PATTERN (insn);
730*e4b17023SJohn Marino       if (GET_CODE (x) == PARALLEL)
731*e4b17023SJohn Marino 	{
732*e4b17023SJohn Marino 	  x = XVECEXP (x, 0, 0);
733*e4b17023SJohn Marino 	  print_pattern (t, x, verbose);
734*e4b17023SJohn Marino 	}
735*e4b17023SJohn Marino       else
736*e4b17023SJohn Marino 	strcpy (t, "call <...>");
737*e4b17023SJohn Marino #ifdef INSN_SCHEDULING
738*e4b17023SJohn Marino       if (verbose && current_sched_info)
739*e4b17023SJohn Marino 	sprintf (buf, "%s: %s", (*current_sched_info->print_insn) (insn, 1), t);
740*e4b17023SJohn Marino       else
741*e4b17023SJohn Marino #endif
742*e4b17023SJohn Marino 	sprintf (buf, " %4d %s", INSN_UID (insn), t);
743*e4b17023SJohn Marino       break;
744*e4b17023SJohn Marino     case CODE_LABEL:
745*e4b17023SJohn Marino       sprintf (buf, "L%d:", INSN_UID (x));
746*e4b17023SJohn Marino       break;
747*e4b17023SJohn Marino     case BARRIER:
748*e4b17023SJohn Marino       sprintf (buf, "i%4d: barrier", INSN_UID (x));
749*e4b17023SJohn Marino       break;
750*e4b17023SJohn Marino     case NOTE:
751*e4b17023SJohn Marino       sprintf (buf, " %4d %s", INSN_UID (x),
752*e4b17023SJohn Marino 	       GET_NOTE_INSN_NAME (NOTE_KIND (x)));
753*e4b17023SJohn Marino       break;
754*e4b17023SJohn Marino     default:
755*e4b17023SJohn Marino       sprintf (buf, "i%4d  <What %s?>", INSN_UID (x),
756*e4b17023SJohn Marino 	       GET_RTX_NAME (GET_CODE (x)));
757*e4b17023SJohn Marino     }
758*e4b17023SJohn Marino }				/* print_insn */
759*e4b17023SJohn Marino 
760*e4b17023SJohn Marino /* Emit a slim dump of X (an insn) to the file F, including any register
761*e4b17023SJohn Marino    note attached to the instruction.  */
762*e4b17023SJohn Marino void
dump_insn_slim(FILE * f,rtx x)763*e4b17023SJohn Marino dump_insn_slim (FILE *f, rtx x)
764*e4b17023SJohn Marino {
765*e4b17023SJohn Marino   char t[BUF_LEN + 32];
766*e4b17023SJohn Marino   rtx note;
767*e4b17023SJohn Marino 
768*e4b17023SJohn Marino   print_insn (t, x, 1);
769*e4b17023SJohn Marino   fputs (t, f);
770*e4b17023SJohn Marino   putc ('\n', f);
771*e4b17023SJohn Marino   if (INSN_P (x) && REG_NOTES (x))
772*e4b17023SJohn Marino     for (note = REG_NOTES (x); note; note = XEXP (note, 1))
773*e4b17023SJohn Marino       {
774*e4b17023SJohn Marino         print_value (t, XEXP (note, 0), 1);
775*e4b17023SJohn Marino 	fprintf (f, "      %s: %s\n",
776*e4b17023SJohn Marino 		 GET_REG_NOTE_NAME (REG_NOTE_KIND (note)), t);
777*e4b17023SJohn Marino       }
778*e4b17023SJohn Marino }
779*e4b17023SJohn Marino 
780*e4b17023SJohn Marino /* Emit a slim dump of X (an insn) to stderr.  */
781*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_insn_slim(rtx x)782*e4b17023SJohn Marino debug_insn_slim (rtx x)
783*e4b17023SJohn Marino {
784*e4b17023SJohn Marino   dump_insn_slim (stderr, x);
785*e4b17023SJohn Marino }
786*e4b17023SJohn Marino 
787*e4b17023SJohn Marino /* Provide a slim dump the instruction chain starting at FIRST to F, honoring
788*e4b17023SJohn Marino    the dump flags given in FLAGS.  Currently, TDF_BLOCKS and TDF_DETAILS
789*e4b17023SJohn Marino    include more information on the basic blocks.  */
790*e4b17023SJohn Marino void
print_rtl_slim_with_bb(FILE * f,rtx first,int flags)791*e4b17023SJohn Marino print_rtl_slim_with_bb (FILE *f, rtx first, int flags)
792*e4b17023SJohn Marino {
793*e4b17023SJohn Marino   print_rtl_slim (f, first, NULL, -1, flags);
794*e4b17023SJohn Marino }
795*e4b17023SJohn Marino 
796*e4b17023SJohn Marino /* Same as above, but stop at LAST or when COUNT == 0.
797*e4b17023SJohn Marino    If COUNT < 0 it will stop only at LAST or NULL rtx.  */
798*e4b17023SJohn Marino void
print_rtl_slim(FILE * f,rtx first,rtx last,int count,int flags)799*e4b17023SJohn Marino print_rtl_slim (FILE *f, rtx first, rtx last, int count, int flags)
800*e4b17023SJohn Marino {
801*e4b17023SJohn Marino   basic_block current_bb = NULL;
802*e4b17023SJohn Marino   rtx insn, tail;
803*e4b17023SJohn Marino 
804*e4b17023SJohn Marino   tail = last ? NEXT_INSN (last) : NULL_RTX;
805*e4b17023SJohn Marino   for (insn = first;
806*e4b17023SJohn Marino        (insn != NULL) && (insn != tail) && (count != 0);
807*e4b17023SJohn Marino        insn = NEXT_INSN (insn))
808*e4b17023SJohn Marino     {
809*e4b17023SJohn Marino       if ((flags & TDF_BLOCKS)
810*e4b17023SJohn Marino 	  && (INSN_P (insn) || NOTE_P (insn))
811*e4b17023SJohn Marino 	  && BLOCK_FOR_INSN (insn)
812*e4b17023SJohn Marino 	  && !current_bb)
813*e4b17023SJohn Marino 	{
814*e4b17023SJohn Marino 	  current_bb = BLOCK_FOR_INSN (insn);
815*e4b17023SJohn Marino 	  dump_bb_info (current_bb, true, false, flags, ";; ", f);
816*e4b17023SJohn Marino 	}
817*e4b17023SJohn Marino 
818*e4b17023SJohn Marino       dump_insn_slim (f, insn);
819*e4b17023SJohn Marino 
820*e4b17023SJohn Marino       if ((flags & TDF_BLOCKS)
821*e4b17023SJohn Marino 	  && current_bb
822*e4b17023SJohn Marino 	  && insn == BB_END (current_bb))
823*e4b17023SJohn Marino 	{
824*e4b17023SJohn Marino 	  dump_bb_info (current_bb, false, true, flags, ";; ", f);
825*e4b17023SJohn Marino 	  current_bb = NULL;
826*e4b17023SJohn Marino 	}
827*e4b17023SJohn Marino       if (count > 0)
828*e4b17023SJohn Marino         count--;
829*e4b17023SJohn Marino     }
830*e4b17023SJohn Marino }
831*e4b17023SJohn Marino 
832*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_bb_slim(struct basic_block_def * bb)833*e4b17023SJohn Marino debug_bb_slim (struct basic_block_def *bb)
834*e4b17023SJohn Marino {
835*e4b17023SJohn Marino   print_rtl_slim (stderr, BB_HEAD (bb), BB_END (bb), -1, 32);
836*e4b17023SJohn Marino }
837*e4b17023SJohn Marino 
838*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_bb_n_slim(int n)839*e4b17023SJohn Marino debug_bb_n_slim (int n)
840*e4b17023SJohn Marino {
841*e4b17023SJohn Marino   struct basic_block_def *bb = BASIC_BLOCK (n);
842*e4b17023SJohn Marino   debug_bb_slim (bb);
843*e4b17023SJohn Marino }
844*e4b17023SJohn Marino 
845