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