xref: /dragonfly/contrib/gcc-8.0/gcc/hsa-dump.c (revision 38fd1498)
1*38fd1498Szrj /* Infrastructure to dump our HSAIL IL
2*38fd1498Szrj    Copyright (C) 2013-2018 Free Software Foundation, Inc.
3*38fd1498Szrj    Contributed by Martin Jambor <mjambor@suse.cz> and
4*38fd1498Szrj    Martin Liska <mliska@suse.cz>.
5*38fd1498Szrj 
6*38fd1498Szrj This file is part of GCC.
7*38fd1498Szrj 
8*38fd1498Szrj GCC is free software; you can redistribute it and/or modify
9*38fd1498Szrj it under the terms of the GNU General Public License as published by
10*38fd1498Szrj the Free Software Foundation; either version 3, or (at your option)
11*38fd1498Szrj any later version.
12*38fd1498Szrj 
13*38fd1498Szrj GCC is distributed in the hope that it will be useful,
14*38fd1498Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of
15*38fd1498Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*38fd1498Szrj GNU General Public License for more details.
17*38fd1498Szrj 
18*38fd1498Szrj You should have received a copy of the GNU General Public License
19*38fd1498Szrj along with GCC; see the file COPYING3.  If not see
20*38fd1498Szrj <http://www.gnu.org/licenses/>.  */
21*38fd1498Szrj 
22*38fd1498Szrj #include "config.h"
23*38fd1498Szrj #include "system.h"
24*38fd1498Szrj #include "coretypes.h"
25*38fd1498Szrj #include "tm.h"
26*38fd1498Szrj #include "is-a.h"
27*38fd1498Szrj #include "vec.h"
28*38fd1498Szrj #include "tree.h"
29*38fd1498Szrj #include "basic-block.h"
30*38fd1498Szrj #include "cfg.h"
31*38fd1498Szrj #include "function.h"
32*38fd1498Szrj #include "dumpfile.h"
33*38fd1498Szrj #include "gimple-pretty-print.h"
34*38fd1498Szrj #include "cgraph.h"
35*38fd1498Szrj #include "print-tree.h"
36*38fd1498Szrj #include "symbol-summary.h"
37*38fd1498Szrj #include "hsa-common.h"
38*38fd1498Szrj 
39*38fd1498Szrj /* Return textual name of TYPE.  */
40*38fd1498Szrj 
41*38fd1498Szrj static const char *
hsa_type_name(BrigType16_t type)42*38fd1498Szrj hsa_type_name (BrigType16_t type)
43*38fd1498Szrj {
44*38fd1498Szrj   switch (type)
45*38fd1498Szrj     {
46*38fd1498Szrj     case BRIG_TYPE_NONE:
47*38fd1498Szrj       return "none";
48*38fd1498Szrj     case BRIG_TYPE_U8:
49*38fd1498Szrj       return "u8";
50*38fd1498Szrj     case BRIG_TYPE_U16:
51*38fd1498Szrj       return "u16";
52*38fd1498Szrj     case BRIG_TYPE_U32:
53*38fd1498Szrj       return "u32";
54*38fd1498Szrj     case BRIG_TYPE_U64:
55*38fd1498Szrj       return "u64";
56*38fd1498Szrj     case BRIG_TYPE_S8:
57*38fd1498Szrj       return "s8";
58*38fd1498Szrj     case BRIG_TYPE_S16:
59*38fd1498Szrj       return "s16";
60*38fd1498Szrj     case BRIG_TYPE_S32:
61*38fd1498Szrj       return "s32";
62*38fd1498Szrj     case BRIG_TYPE_S64:
63*38fd1498Szrj       return "s64";
64*38fd1498Szrj     case BRIG_TYPE_F16:
65*38fd1498Szrj       return "f16";
66*38fd1498Szrj     case BRIG_TYPE_F32:
67*38fd1498Szrj       return "f32";
68*38fd1498Szrj     case BRIG_TYPE_F64:
69*38fd1498Szrj       return "f64";
70*38fd1498Szrj     case BRIG_TYPE_B1:
71*38fd1498Szrj       return "b1";
72*38fd1498Szrj     case BRIG_TYPE_B8:
73*38fd1498Szrj       return "b8";
74*38fd1498Szrj     case BRIG_TYPE_B16:
75*38fd1498Szrj       return "b16";
76*38fd1498Szrj     case BRIG_TYPE_B32:
77*38fd1498Szrj       return "b32";
78*38fd1498Szrj     case BRIG_TYPE_B64:
79*38fd1498Szrj       return "b64";
80*38fd1498Szrj     case BRIG_TYPE_B128:
81*38fd1498Szrj       return "b128";
82*38fd1498Szrj     case BRIG_TYPE_SAMP:
83*38fd1498Szrj       return "samp";
84*38fd1498Szrj     case BRIG_TYPE_ROIMG:
85*38fd1498Szrj       return "roimg";
86*38fd1498Szrj     case BRIG_TYPE_WOIMG:
87*38fd1498Szrj       return "woimg";
88*38fd1498Szrj     case BRIG_TYPE_RWIMG:
89*38fd1498Szrj       return "rwimg";
90*38fd1498Szrj     case BRIG_TYPE_SIG32:
91*38fd1498Szrj       return "sig32";
92*38fd1498Szrj     case BRIG_TYPE_SIG64:
93*38fd1498Szrj       return "sig64";
94*38fd1498Szrj     case BRIG_TYPE_U8X4:
95*38fd1498Szrj       return "u8x4";
96*38fd1498Szrj     case BRIG_TYPE_U8X8:
97*38fd1498Szrj       return "u8x8";
98*38fd1498Szrj     case BRIG_TYPE_U8X16:
99*38fd1498Szrj       return "u8x16";
100*38fd1498Szrj     case BRIG_TYPE_U16X2:
101*38fd1498Szrj       return "u16x2";
102*38fd1498Szrj     case BRIG_TYPE_U16X4:
103*38fd1498Szrj       return "u16x4";
104*38fd1498Szrj     case BRIG_TYPE_U16X8:
105*38fd1498Szrj       return "u16x8";
106*38fd1498Szrj     case BRIG_TYPE_U32X2:
107*38fd1498Szrj       return "u32x2";
108*38fd1498Szrj     case BRIG_TYPE_U32X4:
109*38fd1498Szrj       return "u32x4";
110*38fd1498Szrj     case BRIG_TYPE_U64X2:
111*38fd1498Szrj       return "u64x2";
112*38fd1498Szrj     case BRIG_TYPE_S8X4:
113*38fd1498Szrj       return "s8x4";
114*38fd1498Szrj     case BRIG_TYPE_S8X8:
115*38fd1498Szrj       return "s8x8";
116*38fd1498Szrj     case BRIG_TYPE_S8X16:
117*38fd1498Szrj       return "s8x16";
118*38fd1498Szrj     case BRIG_TYPE_S16X2:
119*38fd1498Szrj       return "s16x2";
120*38fd1498Szrj     case BRIG_TYPE_S16X4:
121*38fd1498Szrj       return "s16x4";
122*38fd1498Szrj     case BRIG_TYPE_S16X8:
123*38fd1498Szrj       return "s16x8";
124*38fd1498Szrj     case BRIG_TYPE_S32X2:
125*38fd1498Szrj       return "s32x2";
126*38fd1498Szrj     case BRIG_TYPE_S32X4:
127*38fd1498Szrj       return "s32x4";
128*38fd1498Szrj     case BRIG_TYPE_S64X2:
129*38fd1498Szrj       return "s64x2";
130*38fd1498Szrj     case BRIG_TYPE_F16X2:
131*38fd1498Szrj       return "f16x2";
132*38fd1498Szrj     case BRIG_TYPE_F16X4:
133*38fd1498Szrj       return "f16x4";
134*38fd1498Szrj     case BRIG_TYPE_F16X8:
135*38fd1498Szrj       return "f16x8";
136*38fd1498Szrj     case BRIG_TYPE_F32X2:
137*38fd1498Szrj       return "f32x2";
138*38fd1498Szrj     case BRIG_TYPE_F32X4:
139*38fd1498Szrj       return "f32x4";
140*38fd1498Szrj     case BRIG_TYPE_F64X2:
141*38fd1498Szrj       return "f64x2";
142*38fd1498Szrj     default:
143*38fd1498Szrj       return "UNKNOWN_TYPE";
144*38fd1498Szrj     }
145*38fd1498Szrj }
146*38fd1498Szrj 
147*38fd1498Szrj /* Return textual name of OPCODE.  */
148*38fd1498Szrj 
149*38fd1498Szrj static const char *
hsa_opcode_name(BrigOpcode16_t opcode)150*38fd1498Szrj hsa_opcode_name (BrigOpcode16_t opcode)
151*38fd1498Szrj {
152*38fd1498Szrj   switch (opcode)
153*38fd1498Szrj     {
154*38fd1498Szrj     case BRIG_OPCODE_NOP:
155*38fd1498Szrj       return "nop";
156*38fd1498Szrj     case BRIG_OPCODE_ABS:
157*38fd1498Szrj       return "abs";
158*38fd1498Szrj     case BRIG_OPCODE_ADD:
159*38fd1498Szrj       return "add";
160*38fd1498Szrj     case BRIG_OPCODE_BORROW:
161*38fd1498Szrj       return "borrow";
162*38fd1498Szrj     case BRIG_OPCODE_CARRY:
163*38fd1498Szrj       return "carry";
164*38fd1498Szrj     case BRIG_OPCODE_CEIL:
165*38fd1498Szrj       return "ceil";
166*38fd1498Szrj     case BRIG_OPCODE_COPYSIGN:
167*38fd1498Szrj       return "copysign";
168*38fd1498Szrj     case BRIG_OPCODE_DIV:
169*38fd1498Szrj       return "div";
170*38fd1498Szrj     case BRIG_OPCODE_FLOOR:
171*38fd1498Szrj       return "floor";
172*38fd1498Szrj     case BRIG_OPCODE_FMA:
173*38fd1498Szrj       return "fma";
174*38fd1498Szrj     case BRIG_OPCODE_FRACT:
175*38fd1498Szrj       return "fract";
176*38fd1498Szrj     case BRIG_OPCODE_MAD:
177*38fd1498Szrj       return "mad";
178*38fd1498Szrj     case BRIG_OPCODE_MAX:
179*38fd1498Szrj       return "max";
180*38fd1498Szrj     case BRIG_OPCODE_MIN:
181*38fd1498Szrj       return "min";
182*38fd1498Szrj     case BRIG_OPCODE_MUL:
183*38fd1498Szrj       return "mul";
184*38fd1498Szrj     case BRIG_OPCODE_MULHI:
185*38fd1498Szrj       return "mulhi";
186*38fd1498Szrj     case BRIG_OPCODE_NEG:
187*38fd1498Szrj       return "neg";
188*38fd1498Szrj     case BRIG_OPCODE_REM:
189*38fd1498Szrj       return "rem";
190*38fd1498Szrj     case BRIG_OPCODE_RINT:
191*38fd1498Szrj       return "rint";
192*38fd1498Szrj     case BRIG_OPCODE_SQRT:
193*38fd1498Szrj       return "sqrt";
194*38fd1498Szrj     case BRIG_OPCODE_SUB:
195*38fd1498Szrj       return "sub";
196*38fd1498Szrj     case BRIG_OPCODE_TRUNC:
197*38fd1498Szrj       return "trunc";
198*38fd1498Szrj     case BRIG_OPCODE_MAD24:
199*38fd1498Szrj       return "mad24";
200*38fd1498Szrj     case BRIG_OPCODE_MAD24HI:
201*38fd1498Szrj       return "mad24hi";
202*38fd1498Szrj     case BRIG_OPCODE_MUL24:
203*38fd1498Szrj       return "mul24";
204*38fd1498Szrj     case BRIG_OPCODE_MUL24HI:
205*38fd1498Szrj       return "mul24hi";
206*38fd1498Szrj     case BRIG_OPCODE_SHL:
207*38fd1498Szrj       return "shl";
208*38fd1498Szrj     case BRIG_OPCODE_SHR:
209*38fd1498Szrj       return "shr";
210*38fd1498Szrj     case BRIG_OPCODE_AND:
211*38fd1498Szrj       return "and";
212*38fd1498Szrj     case BRIG_OPCODE_NOT:
213*38fd1498Szrj       return "not";
214*38fd1498Szrj     case BRIG_OPCODE_OR:
215*38fd1498Szrj       return "or";
216*38fd1498Szrj     case BRIG_OPCODE_POPCOUNT:
217*38fd1498Szrj       return "popcount";
218*38fd1498Szrj     case BRIG_OPCODE_XOR:
219*38fd1498Szrj       return "xor";
220*38fd1498Szrj     case BRIG_OPCODE_BITEXTRACT:
221*38fd1498Szrj       return "bitextract";
222*38fd1498Szrj     case BRIG_OPCODE_BITINSERT:
223*38fd1498Szrj       return "bitinsert";
224*38fd1498Szrj     case BRIG_OPCODE_BITMASK:
225*38fd1498Szrj       return "bitmask";
226*38fd1498Szrj     case BRIG_OPCODE_BITREV:
227*38fd1498Szrj       return "bitrev";
228*38fd1498Szrj     case BRIG_OPCODE_BITSELECT:
229*38fd1498Szrj       return "bitselect";
230*38fd1498Szrj     case BRIG_OPCODE_FIRSTBIT:
231*38fd1498Szrj       return "firstbit";
232*38fd1498Szrj     case BRIG_OPCODE_LASTBIT:
233*38fd1498Szrj       return "lastbit";
234*38fd1498Szrj     case BRIG_OPCODE_COMBINE:
235*38fd1498Szrj       return "combine";
236*38fd1498Szrj     case BRIG_OPCODE_EXPAND:
237*38fd1498Szrj       return "expand";
238*38fd1498Szrj     case BRIG_OPCODE_LDA:
239*38fd1498Szrj       return "lda";
240*38fd1498Szrj     case BRIG_OPCODE_MOV:
241*38fd1498Szrj       return "mov";
242*38fd1498Szrj     case BRIG_OPCODE_SHUFFLE:
243*38fd1498Szrj       return "shuffle";
244*38fd1498Szrj     case BRIG_OPCODE_UNPACKHI:
245*38fd1498Szrj       return "unpackhi";
246*38fd1498Szrj     case BRIG_OPCODE_UNPACKLO:
247*38fd1498Szrj       return "unpacklo";
248*38fd1498Szrj     case BRIG_OPCODE_PACK:
249*38fd1498Szrj       return "pack";
250*38fd1498Szrj     case BRIG_OPCODE_UNPACK:
251*38fd1498Szrj       return "unpack";
252*38fd1498Szrj     case BRIG_OPCODE_CMOV:
253*38fd1498Szrj       return "cmov";
254*38fd1498Szrj     case BRIG_OPCODE_CLASS:
255*38fd1498Szrj       return "class";
256*38fd1498Szrj     case BRIG_OPCODE_NCOS:
257*38fd1498Szrj       return "ncos";
258*38fd1498Szrj     case BRIG_OPCODE_NEXP2:
259*38fd1498Szrj       return "nexp2";
260*38fd1498Szrj     case BRIG_OPCODE_NFMA:
261*38fd1498Szrj       return "nfma";
262*38fd1498Szrj     case BRIG_OPCODE_NLOG2:
263*38fd1498Szrj       return "nlog2";
264*38fd1498Szrj     case BRIG_OPCODE_NRCP:
265*38fd1498Szrj       return "nrcp";
266*38fd1498Szrj     case BRIG_OPCODE_NRSQRT:
267*38fd1498Szrj       return "nrsqrt";
268*38fd1498Szrj     case BRIG_OPCODE_NSIN:
269*38fd1498Szrj       return "nsin";
270*38fd1498Szrj     case BRIG_OPCODE_NSQRT:
271*38fd1498Szrj       return "nsqrt";
272*38fd1498Szrj     case BRIG_OPCODE_BITALIGN:
273*38fd1498Szrj       return "bitalign";
274*38fd1498Szrj     case BRIG_OPCODE_BYTEALIGN:
275*38fd1498Szrj       return "bytealign";
276*38fd1498Szrj     case BRIG_OPCODE_PACKCVT:
277*38fd1498Szrj       return "packcvt";
278*38fd1498Szrj     case BRIG_OPCODE_UNPACKCVT:
279*38fd1498Szrj       return "unpackcvt";
280*38fd1498Szrj     case BRIG_OPCODE_LERP:
281*38fd1498Szrj       return "lerp";
282*38fd1498Szrj     case BRIG_OPCODE_SAD:
283*38fd1498Szrj       return "sad";
284*38fd1498Szrj     case BRIG_OPCODE_SADHI:
285*38fd1498Szrj       return "sadhi";
286*38fd1498Szrj     case BRIG_OPCODE_SEGMENTP:
287*38fd1498Szrj       return "segmentp";
288*38fd1498Szrj     case BRIG_OPCODE_FTOS:
289*38fd1498Szrj       return "ftos";
290*38fd1498Szrj     case BRIG_OPCODE_STOF:
291*38fd1498Szrj       return "stof";
292*38fd1498Szrj     case BRIG_OPCODE_CMP:
293*38fd1498Szrj       return "cmp";
294*38fd1498Szrj     case BRIG_OPCODE_CVT:
295*38fd1498Szrj       return "cvt";
296*38fd1498Szrj     case BRIG_OPCODE_LD:
297*38fd1498Szrj       return "ld";
298*38fd1498Szrj     case BRIG_OPCODE_ST:
299*38fd1498Szrj       return "st";
300*38fd1498Szrj     case BRIG_OPCODE_ATOMIC:
301*38fd1498Szrj       return "atomic";
302*38fd1498Szrj     case BRIG_OPCODE_ATOMICNORET:
303*38fd1498Szrj       return "atomicnoret";
304*38fd1498Szrj     case BRIG_OPCODE_SIGNAL:
305*38fd1498Szrj       return "signal";
306*38fd1498Szrj     case BRIG_OPCODE_SIGNALNORET:
307*38fd1498Szrj       return "signalnoret";
308*38fd1498Szrj     case BRIG_OPCODE_MEMFENCE:
309*38fd1498Szrj       return "memfence";
310*38fd1498Szrj     case BRIG_OPCODE_RDIMAGE:
311*38fd1498Szrj       return "rdimage";
312*38fd1498Szrj     case BRIG_OPCODE_LDIMAGE:
313*38fd1498Szrj       return "ldimage";
314*38fd1498Szrj     case BRIG_OPCODE_STIMAGE:
315*38fd1498Szrj       return "stimage";
316*38fd1498Szrj     case BRIG_OPCODE_QUERYIMAGE:
317*38fd1498Szrj       return "queryimage";
318*38fd1498Szrj     case BRIG_OPCODE_QUERYSAMPLER:
319*38fd1498Szrj       return "querysampler";
320*38fd1498Szrj     case BRIG_OPCODE_CBR:
321*38fd1498Szrj       return "cbr";
322*38fd1498Szrj     case BRIG_OPCODE_BR:
323*38fd1498Szrj       return "br";
324*38fd1498Szrj     case BRIG_OPCODE_SBR:
325*38fd1498Szrj       return "sbr";
326*38fd1498Szrj     case BRIG_OPCODE_BARRIER:
327*38fd1498Szrj       return "barrier";
328*38fd1498Szrj     case BRIG_OPCODE_WAVEBARRIER:
329*38fd1498Szrj       return "wavebarrier";
330*38fd1498Szrj     case BRIG_OPCODE_ARRIVEFBAR:
331*38fd1498Szrj       return "arrivefbar";
332*38fd1498Szrj     case BRIG_OPCODE_INITFBAR:
333*38fd1498Szrj       return "initfbar";
334*38fd1498Szrj     case BRIG_OPCODE_JOINFBAR:
335*38fd1498Szrj       return "joinfbar";
336*38fd1498Szrj     case BRIG_OPCODE_LEAVEFBAR:
337*38fd1498Szrj       return "leavefbar";
338*38fd1498Szrj     case BRIG_OPCODE_RELEASEFBAR:
339*38fd1498Szrj       return "releasefbar";
340*38fd1498Szrj     case BRIG_OPCODE_WAITFBAR:
341*38fd1498Szrj       return "waitfbar";
342*38fd1498Szrj     case BRIG_OPCODE_LDF:
343*38fd1498Szrj       return "ldf";
344*38fd1498Szrj     case BRIG_OPCODE_ACTIVELANECOUNT:
345*38fd1498Szrj       return "activelanecount";
346*38fd1498Szrj     case BRIG_OPCODE_ACTIVELANEID:
347*38fd1498Szrj       return "activelaneid";
348*38fd1498Szrj     case BRIG_OPCODE_ACTIVELANEMASK:
349*38fd1498Szrj       return "activelanemask";
350*38fd1498Szrj     case BRIG_OPCODE_CALL:
351*38fd1498Szrj       return "call";
352*38fd1498Szrj     case BRIG_OPCODE_SCALL:
353*38fd1498Szrj       return "scall";
354*38fd1498Szrj     case BRIG_OPCODE_ICALL:
355*38fd1498Szrj       return "icall";
356*38fd1498Szrj     case BRIG_OPCODE_RET:
357*38fd1498Szrj       return "ret";
358*38fd1498Szrj     case BRIG_OPCODE_ALLOCA:
359*38fd1498Szrj       return "alloca";
360*38fd1498Szrj     case BRIG_OPCODE_CURRENTWORKGROUPSIZE:
361*38fd1498Szrj       return "currentworkgroupsize";
362*38fd1498Szrj     case BRIG_OPCODE_DIM:
363*38fd1498Szrj       return "dim";
364*38fd1498Szrj     case BRIG_OPCODE_GRIDGROUPS:
365*38fd1498Szrj       return "gridgroups";
366*38fd1498Szrj     case BRIG_OPCODE_GRIDSIZE:
367*38fd1498Szrj       return "gridsize";
368*38fd1498Szrj     case BRIG_OPCODE_PACKETCOMPLETIONSIG:
369*38fd1498Szrj       return "packetcompletionsig";
370*38fd1498Szrj     case BRIG_OPCODE_PACKETID:
371*38fd1498Szrj       return "packetid";
372*38fd1498Szrj     case BRIG_OPCODE_WORKGROUPID:
373*38fd1498Szrj       return "workgroupid";
374*38fd1498Szrj     case BRIG_OPCODE_WORKGROUPSIZE:
375*38fd1498Szrj       return "workgroupsize";
376*38fd1498Szrj     case BRIG_OPCODE_WORKITEMABSID:
377*38fd1498Szrj       return "workitemabsid";
378*38fd1498Szrj     case BRIG_OPCODE_WORKITEMFLATABSID:
379*38fd1498Szrj       return "workitemflatabsid";
380*38fd1498Szrj     case BRIG_OPCODE_WORKITEMFLATID:
381*38fd1498Szrj       return "workitemflatid";
382*38fd1498Szrj     case BRIG_OPCODE_WORKITEMID:
383*38fd1498Szrj       return "workitemid";
384*38fd1498Szrj     case BRIG_OPCODE_CLEARDETECTEXCEPT:
385*38fd1498Szrj       return "cleardetectexcept";
386*38fd1498Szrj     case BRIG_OPCODE_GETDETECTEXCEPT:
387*38fd1498Szrj       return "getdetectexcept";
388*38fd1498Szrj     case BRIG_OPCODE_SETDETECTEXCEPT:
389*38fd1498Szrj       return "setdetectexcept";
390*38fd1498Szrj     case BRIG_OPCODE_ADDQUEUEWRITEINDEX:
391*38fd1498Szrj       return "addqueuewriteindex";
392*38fd1498Szrj     case BRIG_OPCODE_CASQUEUEWRITEINDEX:
393*38fd1498Szrj       return "casqueuewriteindex";
394*38fd1498Szrj     case BRIG_OPCODE_LDQUEUEREADINDEX:
395*38fd1498Szrj       return "ldqueuereadindex";
396*38fd1498Szrj     case BRIG_OPCODE_LDQUEUEWRITEINDEX:
397*38fd1498Szrj       return "ldqueuewriteindex";
398*38fd1498Szrj     case BRIG_OPCODE_STQUEUEREADINDEX:
399*38fd1498Szrj       return "stqueuereadindex";
400*38fd1498Szrj     case BRIG_OPCODE_STQUEUEWRITEINDEX:
401*38fd1498Szrj       return "stqueuewriteindex";
402*38fd1498Szrj     case BRIG_OPCODE_CLOCK:
403*38fd1498Szrj       return "clock";
404*38fd1498Szrj     case BRIG_OPCODE_CUID:
405*38fd1498Szrj       return "cuid";
406*38fd1498Szrj     case BRIG_OPCODE_DEBUGTRAP:
407*38fd1498Szrj       return "debugtrap";
408*38fd1498Szrj     case BRIG_OPCODE_GROUPBASEPTR:
409*38fd1498Szrj       return "groupbaseptr";
410*38fd1498Szrj     case BRIG_OPCODE_KERNARGBASEPTR:
411*38fd1498Szrj       return "kernargbaseptr";
412*38fd1498Szrj     case BRIG_OPCODE_LANEID:
413*38fd1498Szrj       return "laneid";
414*38fd1498Szrj     case BRIG_OPCODE_MAXCUID:
415*38fd1498Szrj       return "maxcuid";
416*38fd1498Szrj     case BRIG_OPCODE_MAXWAVEID:
417*38fd1498Szrj       return "maxwaveid";
418*38fd1498Szrj     case BRIG_OPCODE_NULLPTR:
419*38fd1498Szrj       return "nullptr";
420*38fd1498Szrj     case BRIG_OPCODE_WAVEID:
421*38fd1498Szrj       return "waveid";
422*38fd1498Szrj     default:
423*38fd1498Szrj       return "UNKNOWN_OPCODE";
424*38fd1498Szrj     }
425*38fd1498Szrj }
426*38fd1498Szrj 
427*38fd1498Szrj /* Return textual name of SEG.  */
428*38fd1498Szrj 
429*38fd1498Szrj const char *
hsa_seg_name(BrigSegment8_t seg)430*38fd1498Szrj hsa_seg_name (BrigSegment8_t seg)
431*38fd1498Szrj {
432*38fd1498Szrj   switch (seg)
433*38fd1498Szrj     {
434*38fd1498Szrj     case BRIG_SEGMENT_NONE:
435*38fd1498Szrj       return "none";
436*38fd1498Szrj     case BRIG_SEGMENT_FLAT:
437*38fd1498Szrj       return "flat";
438*38fd1498Szrj     case BRIG_SEGMENT_GLOBAL:
439*38fd1498Szrj       return "global";
440*38fd1498Szrj     case BRIG_SEGMENT_READONLY:
441*38fd1498Szrj       return "readonly";
442*38fd1498Szrj     case BRIG_SEGMENT_KERNARG:
443*38fd1498Szrj       return "kernarg";
444*38fd1498Szrj     case BRIG_SEGMENT_GROUP:
445*38fd1498Szrj       return "group";
446*38fd1498Szrj     case BRIG_SEGMENT_PRIVATE:
447*38fd1498Szrj       return "private";
448*38fd1498Szrj     case BRIG_SEGMENT_SPILL:
449*38fd1498Szrj       return "spill";
450*38fd1498Szrj     case BRIG_SEGMENT_ARG:
451*38fd1498Szrj       return "arg";
452*38fd1498Szrj     default:
453*38fd1498Szrj       return "UNKNOWN_SEGMENT";
454*38fd1498Szrj     }
455*38fd1498Szrj }
456*38fd1498Szrj 
457*38fd1498Szrj /* Return textual name of CMPOP.  */
458*38fd1498Szrj 
459*38fd1498Szrj static const char *
hsa_cmpop_name(BrigCompareOperation8_t cmpop)460*38fd1498Szrj hsa_cmpop_name (BrigCompareOperation8_t cmpop)
461*38fd1498Szrj {
462*38fd1498Szrj   switch (cmpop)
463*38fd1498Szrj     {
464*38fd1498Szrj     case BRIG_COMPARE_EQ:
465*38fd1498Szrj       return "eq";
466*38fd1498Szrj     case BRIG_COMPARE_NE:
467*38fd1498Szrj       return "ne";
468*38fd1498Szrj     case BRIG_COMPARE_LT:
469*38fd1498Szrj       return "lt";
470*38fd1498Szrj     case BRIG_COMPARE_LE:
471*38fd1498Szrj       return "le";
472*38fd1498Szrj     case BRIG_COMPARE_GT:
473*38fd1498Szrj       return "gt";
474*38fd1498Szrj     case BRIG_COMPARE_GE:
475*38fd1498Szrj       return "ge";
476*38fd1498Szrj     case BRIG_COMPARE_EQU:
477*38fd1498Szrj       return "equ";
478*38fd1498Szrj     case BRIG_COMPARE_NEU:
479*38fd1498Szrj       return "neu";
480*38fd1498Szrj     case BRIG_COMPARE_LTU:
481*38fd1498Szrj       return "ltu";
482*38fd1498Szrj     case BRIG_COMPARE_LEU:
483*38fd1498Szrj       return "leu";
484*38fd1498Szrj     case BRIG_COMPARE_GTU:
485*38fd1498Szrj       return "gtu";
486*38fd1498Szrj     case BRIG_COMPARE_GEU:
487*38fd1498Szrj       return "geu";
488*38fd1498Szrj     case BRIG_COMPARE_NUM:
489*38fd1498Szrj       return "num";
490*38fd1498Szrj     case BRIG_COMPARE_NAN:
491*38fd1498Szrj       return "nan";
492*38fd1498Szrj     case BRIG_COMPARE_SEQ:
493*38fd1498Szrj       return "seq";
494*38fd1498Szrj     case BRIG_COMPARE_SNE:
495*38fd1498Szrj       return "sne";
496*38fd1498Szrj     case BRIG_COMPARE_SLT:
497*38fd1498Szrj       return "slt";
498*38fd1498Szrj     case BRIG_COMPARE_SLE:
499*38fd1498Szrj       return "sle";
500*38fd1498Szrj     case BRIG_COMPARE_SGT:
501*38fd1498Szrj       return "sgt";
502*38fd1498Szrj     case BRIG_COMPARE_SGE:
503*38fd1498Szrj       return "sge";
504*38fd1498Szrj     case BRIG_COMPARE_SGEU:
505*38fd1498Szrj       return "sgeu";
506*38fd1498Szrj     case BRIG_COMPARE_SEQU:
507*38fd1498Szrj       return "sequ";
508*38fd1498Szrj     case BRIG_COMPARE_SNEU:
509*38fd1498Szrj       return "sneu";
510*38fd1498Szrj     case BRIG_COMPARE_SLTU:
511*38fd1498Szrj       return "sltu";
512*38fd1498Szrj     case BRIG_COMPARE_SLEU:
513*38fd1498Szrj       return "sleu";
514*38fd1498Szrj     case BRIG_COMPARE_SNUM:
515*38fd1498Szrj       return "snum";
516*38fd1498Szrj     case BRIG_COMPARE_SNAN:
517*38fd1498Szrj       return "snan";
518*38fd1498Szrj     case BRIG_COMPARE_SGTU:
519*38fd1498Szrj       return "sgtu";
520*38fd1498Szrj     default:
521*38fd1498Szrj       return "UNKNOWN_COMPARISON";
522*38fd1498Szrj     }
523*38fd1498Szrj }
524*38fd1498Szrj 
525*38fd1498Szrj /* Return textual name for memory order.  */
526*38fd1498Szrj 
527*38fd1498Szrj static const char *
hsa_memsem_name(enum BrigMemoryOrder mo)528*38fd1498Szrj hsa_memsem_name (enum BrigMemoryOrder mo)
529*38fd1498Szrj {
530*38fd1498Szrj   switch (mo)
531*38fd1498Szrj     {
532*38fd1498Szrj     case BRIG_MEMORY_ORDER_NONE:
533*38fd1498Szrj       return "";
534*38fd1498Szrj     case BRIG_MEMORY_ORDER_RELAXED:
535*38fd1498Szrj       return "rlx";
536*38fd1498Szrj     case BRIG_MEMORY_ORDER_SC_ACQUIRE:
537*38fd1498Szrj       return "scacq";
538*38fd1498Szrj     case BRIG_MEMORY_ORDER_SC_RELEASE:
539*38fd1498Szrj       return "screl";
540*38fd1498Szrj     case BRIG_MEMORY_ORDER_SC_ACQUIRE_RELEASE:
541*38fd1498Szrj       return "scar";
542*38fd1498Szrj     default:
543*38fd1498Szrj       return "UNKNOWN_MEMORY_ORDER";
544*38fd1498Szrj     }
545*38fd1498Szrj }
546*38fd1498Szrj 
547*38fd1498Szrj /* Return textual name for memory scope.  */
548*38fd1498Szrj 
549*38fd1498Szrj static const char *
hsa_memscope_name(enum BrigMemoryScope scope)550*38fd1498Szrj hsa_memscope_name (enum BrigMemoryScope scope)
551*38fd1498Szrj {
552*38fd1498Szrj   switch (scope)
553*38fd1498Szrj     {
554*38fd1498Szrj     case BRIG_MEMORY_SCOPE_NONE:
555*38fd1498Szrj       return "";
556*38fd1498Szrj     case BRIG_MEMORY_SCOPE_WORKITEM:
557*38fd1498Szrj       return "wi";
558*38fd1498Szrj     case BRIG_MEMORY_SCOPE_WAVEFRONT:
559*38fd1498Szrj       return "wave";
560*38fd1498Szrj     case BRIG_MEMORY_SCOPE_WORKGROUP:
561*38fd1498Szrj       return "wg";
562*38fd1498Szrj     case BRIG_MEMORY_SCOPE_AGENT:
563*38fd1498Szrj       return "agent";
564*38fd1498Szrj     case BRIG_MEMORY_SCOPE_SYSTEM:
565*38fd1498Szrj       return "sys";
566*38fd1498Szrj     default:
567*38fd1498Szrj       return "UNKNOWN_SCOPE";
568*38fd1498Szrj     }
569*38fd1498Szrj }
570*38fd1498Szrj 
571*38fd1498Szrj /* Return textual name for atomic operation.  */
572*38fd1498Szrj 
573*38fd1498Szrj static const char *
hsa_m_atomicop_name(enum BrigAtomicOperation op)574*38fd1498Szrj hsa_m_atomicop_name (enum BrigAtomicOperation op)
575*38fd1498Szrj {
576*38fd1498Szrj   switch (op)
577*38fd1498Szrj     {
578*38fd1498Szrj     case BRIG_ATOMIC_ADD:
579*38fd1498Szrj       return "add";
580*38fd1498Szrj     case BRIG_ATOMIC_AND:
581*38fd1498Szrj       return "and";
582*38fd1498Szrj     case BRIG_ATOMIC_CAS:
583*38fd1498Szrj       return "cas";
584*38fd1498Szrj     case BRIG_ATOMIC_EXCH:
585*38fd1498Szrj       return "exch";
586*38fd1498Szrj     case BRIG_ATOMIC_LD:
587*38fd1498Szrj       return "ld";
588*38fd1498Szrj     case BRIG_ATOMIC_MAX:
589*38fd1498Szrj       return "max";
590*38fd1498Szrj     case BRIG_ATOMIC_MIN:
591*38fd1498Szrj       return "min";
592*38fd1498Szrj     case BRIG_ATOMIC_OR:
593*38fd1498Szrj       return "or";
594*38fd1498Szrj     case BRIG_ATOMIC_ST:
595*38fd1498Szrj       return "st";
596*38fd1498Szrj     case BRIG_ATOMIC_SUB:
597*38fd1498Szrj       return "sub";
598*38fd1498Szrj     case BRIG_ATOMIC_WRAPDEC:
599*38fd1498Szrj       return "wrapdec";
600*38fd1498Szrj     case BRIG_ATOMIC_WRAPINC:
601*38fd1498Szrj       return "wrapinc";
602*38fd1498Szrj     case BRIG_ATOMIC_XOR:
603*38fd1498Szrj       return "xor";
604*38fd1498Szrj     case BRIG_ATOMIC_WAIT_EQ:
605*38fd1498Szrj       return "wait_eq";
606*38fd1498Szrj     case BRIG_ATOMIC_WAIT_NE:
607*38fd1498Szrj       return "wait_ne";
608*38fd1498Szrj     case BRIG_ATOMIC_WAIT_LT:
609*38fd1498Szrj       return "wait_lt";
610*38fd1498Szrj     case BRIG_ATOMIC_WAIT_GTE:
611*38fd1498Szrj       return "wait_gte";
612*38fd1498Szrj     case BRIG_ATOMIC_WAITTIMEOUT_EQ:
613*38fd1498Szrj       return "waittimeout_eq";
614*38fd1498Szrj     case BRIG_ATOMIC_WAITTIMEOUT_NE:
615*38fd1498Szrj       return "waittimeout_ne";
616*38fd1498Szrj     case BRIG_ATOMIC_WAITTIMEOUT_LT:
617*38fd1498Szrj       return "waittimeout_lt";
618*38fd1498Szrj     case BRIG_ATOMIC_WAITTIMEOUT_GTE:
619*38fd1498Szrj       return "waittimeout_gte";
620*38fd1498Szrj     default:
621*38fd1498Szrj       return "UNKNOWN_ATOMIC_OP";
622*38fd1498Szrj     }
623*38fd1498Szrj }
624*38fd1498Szrj 
625*38fd1498Szrj /* Return textual name for atomic operation.  */
626*38fd1498Szrj 
627*38fd1498Szrj static const char *
hsa_width_specifier_name(BrigWidth8_t width)628*38fd1498Szrj hsa_width_specifier_name (BrigWidth8_t width)
629*38fd1498Szrj {
630*38fd1498Szrj   switch (width)
631*38fd1498Szrj     {
632*38fd1498Szrj     case BRIG_WIDTH_NONE:
633*38fd1498Szrj       return "none";
634*38fd1498Szrj     case BRIG_WIDTH_1:
635*38fd1498Szrj       return "1";
636*38fd1498Szrj     case BRIG_WIDTH_2:
637*38fd1498Szrj       return "2";
638*38fd1498Szrj     case BRIG_WIDTH_4:
639*38fd1498Szrj       return "4";
640*38fd1498Szrj     case BRIG_WIDTH_8:
641*38fd1498Szrj       return "8";
642*38fd1498Szrj     case BRIG_WIDTH_16:
643*38fd1498Szrj       return "16";
644*38fd1498Szrj     case BRIG_WIDTH_32:
645*38fd1498Szrj       return "32";
646*38fd1498Szrj     case BRIG_WIDTH_64:
647*38fd1498Szrj       return "64";
648*38fd1498Szrj     case BRIG_WIDTH_128:
649*38fd1498Szrj       return "128";
650*38fd1498Szrj     case BRIG_WIDTH_256:
651*38fd1498Szrj       return "256";
652*38fd1498Szrj     case BRIG_WIDTH_512:
653*38fd1498Szrj       return "512";
654*38fd1498Szrj     case BRIG_WIDTH_1024:
655*38fd1498Szrj       return "1024";
656*38fd1498Szrj     case BRIG_WIDTH_2048:
657*38fd1498Szrj       return "2048";
658*38fd1498Szrj     case BRIG_WIDTH_4096:
659*38fd1498Szrj       return "4096";
660*38fd1498Szrj     case BRIG_WIDTH_8192:
661*38fd1498Szrj       return "8192";
662*38fd1498Szrj     case BRIG_WIDTH_16384:
663*38fd1498Szrj       return "16384";
664*38fd1498Szrj     case BRIG_WIDTH_32768:
665*38fd1498Szrj       return "32768";
666*38fd1498Szrj     case BRIG_WIDTH_65536:
667*38fd1498Szrj       return "65536";
668*38fd1498Szrj     case BRIG_WIDTH_131072:
669*38fd1498Szrj       return "131072";
670*38fd1498Szrj     case BRIG_WIDTH_262144:
671*38fd1498Szrj       return "262144";
672*38fd1498Szrj     case BRIG_WIDTH_524288:
673*38fd1498Szrj       return "524288";
674*38fd1498Szrj     case BRIG_WIDTH_1048576:
675*38fd1498Szrj       return "1048576";
676*38fd1498Szrj     case BRIG_WIDTH_2097152:
677*38fd1498Szrj       return "2097152";
678*38fd1498Szrj     case BRIG_WIDTH_4194304:
679*38fd1498Szrj       return "4194304";
680*38fd1498Szrj     case BRIG_WIDTH_8388608:
681*38fd1498Szrj       return "8388608";
682*38fd1498Szrj     case BRIG_WIDTH_16777216:
683*38fd1498Szrj       return "16777216";
684*38fd1498Szrj     case BRIG_WIDTH_33554432:
685*38fd1498Szrj       return "33554432";
686*38fd1498Szrj     case BRIG_WIDTH_67108864:
687*38fd1498Szrj       return "67108864";
688*38fd1498Szrj     case BRIG_WIDTH_134217728:
689*38fd1498Szrj       return "134217728";
690*38fd1498Szrj     case BRIG_WIDTH_268435456:
691*38fd1498Szrj       return "268435456";
692*38fd1498Szrj     case BRIG_WIDTH_536870912:
693*38fd1498Szrj       return "536870912";
694*38fd1498Szrj     case BRIG_WIDTH_1073741824:
695*38fd1498Szrj       return "1073741824";
696*38fd1498Szrj     case BRIG_WIDTH_2147483648:
697*38fd1498Szrj       return "2147483648";
698*38fd1498Szrj     case BRIG_WIDTH_WAVESIZE:
699*38fd1498Szrj       return "wavesize";
700*38fd1498Szrj     case BRIG_WIDTH_ALL:
701*38fd1498Szrj       return "all";
702*38fd1498Szrj     default:
703*38fd1498Szrj       return "UNKNOWN_WIDTH";
704*38fd1498Szrj     }
705*38fd1498Szrj }
706*38fd1498Szrj 
707*38fd1498Szrj /* Dump textual representation of HSA IL register REG to file F.  */
708*38fd1498Szrj 
709*38fd1498Szrj static void
710*38fd1498Szrj dump_hsa_reg (FILE *f, hsa_op_reg *reg, bool dump_type = false)
711*38fd1498Szrj {
712*38fd1498Szrj   if (reg->m_reg_class)
713*38fd1498Szrj     fprintf (f, "$%c%i", reg->m_reg_class, reg->m_hard_num);
714*38fd1498Szrj   else
715*38fd1498Szrj     fprintf (f, "$_%i", reg->m_order);
716*38fd1498Szrj   if (dump_type)
717*38fd1498Szrj     fprintf (f, " (%s)", hsa_type_name (reg->m_type));
718*38fd1498Szrj }
719*38fd1498Szrj 
720*38fd1498Szrj /* Dump textual representation of HSA IL immediate operand IMM to file F.  */
721*38fd1498Szrj 
722*38fd1498Szrj static void
dump_hsa_immed(FILE * f,hsa_op_immed * imm)723*38fd1498Szrj dump_hsa_immed (FILE *f, hsa_op_immed *imm)
724*38fd1498Szrj {
725*38fd1498Szrj   bool unsigned_int_type
726*38fd1498Szrj     = (BRIG_TYPE_U8 | BRIG_TYPE_U16 | BRIG_TYPE_U32 | BRIG_TYPE_U64)
727*38fd1498Szrj     & imm->m_type;
728*38fd1498Szrj 
729*38fd1498Szrj   if (imm->m_tree_value)
730*38fd1498Szrj     print_generic_expr (f, imm->m_tree_value);
731*38fd1498Szrj   else
732*38fd1498Szrj     {
733*38fd1498Szrj       if (unsigned_int_type)
734*38fd1498Szrj 	fprintf (f, HOST_WIDE_INT_PRINT_DEC, imm->m_int_value);
735*38fd1498Szrj       else
736*38fd1498Szrj 	fprintf (f, HOST_WIDE_INT_PRINT_UNSIGNED,
737*38fd1498Szrj 		 (unsigned HOST_WIDE_INT) imm->m_int_value);
738*38fd1498Szrj     }
739*38fd1498Szrj 
740*38fd1498Szrj   fprintf (f, " (%s)", hsa_type_name (imm->m_type));
741*38fd1498Szrj }
742*38fd1498Szrj 
743*38fd1498Szrj /* Dump textual representation of HSA IL address operand ADDR to file F.  */
744*38fd1498Szrj 
745*38fd1498Szrj static void
dump_hsa_address(FILE * f,hsa_op_address * addr)746*38fd1498Szrj dump_hsa_address (FILE *f, hsa_op_address *addr)
747*38fd1498Szrj {
748*38fd1498Szrj   bool sth = false;
749*38fd1498Szrj 
750*38fd1498Szrj   if (addr->m_symbol)
751*38fd1498Szrj     {
752*38fd1498Szrj       sth = true;
753*38fd1498Szrj       if (addr->m_symbol->m_name)
754*38fd1498Szrj 	fprintf (f, "[%%%s]", addr->m_symbol->m_name);
755*38fd1498Szrj       else
756*38fd1498Szrj 	fprintf (f, "[%%__%s_%i]", hsa_seg_name (addr->m_symbol->m_segment),
757*38fd1498Szrj 		 addr->m_symbol->m_name_number);
758*38fd1498Szrj     }
759*38fd1498Szrj 
760*38fd1498Szrj   if (addr->m_reg)
761*38fd1498Szrj     {
762*38fd1498Szrj       fprintf (f, "[");
763*38fd1498Szrj       dump_hsa_reg (f, addr->m_reg);
764*38fd1498Szrj       if (addr->m_imm_offset != 0)
765*38fd1498Szrj 	fprintf (f, " + " HOST_WIDE_INT_PRINT_DEC "]", addr->m_imm_offset);
766*38fd1498Szrj       else
767*38fd1498Szrj 	fprintf (f, "]");
768*38fd1498Szrj     }
769*38fd1498Szrj   else if (!sth || addr->m_imm_offset != 0)
770*38fd1498Szrj     fprintf (f, "[" HOST_WIDE_INT_PRINT_DEC "]", addr->m_imm_offset);
771*38fd1498Szrj }
772*38fd1498Szrj 
773*38fd1498Szrj /* Dump textual representation of HSA IL symbol SYMBOL to file F.  */
774*38fd1498Szrj 
775*38fd1498Szrj static void
dump_hsa_symbol(FILE * f,hsa_symbol * symbol)776*38fd1498Szrj dump_hsa_symbol (FILE *f, hsa_symbol *symbol)
777*38fd1498Szrj {
778*38fd1498Szrj   const char *name;
779*38fd1498Szrj   if (symbol->m_name)
780*38fd1498Szrj     name = symbol->m_name;
781*38fd1498Szrj   else
782*38fd1498Szrj     {
783*38fd1498Szrj       char buf[64];
784*38fd1498Szrj       sprintf (buf, "__%s_%i", hsa_seg_name (symbol->m_segment),
785*38fd1498Szrj 	       symbol->m_name_number);
786*38fd1498Szrj 
787*38fd1498Szrj       name = buf;
788*38fd1498Szrj     }
789*38fd1498Szrj 
790*38fd1498Szrj   fprintf (f, "align(%u) %s_%s %s", hsa_byte_alignment (symbol->m_align),
791*38fd1498Szrj 	   hsa_seg_name (symbol->m_segment),
792*38fd1498Szrj 	   hsa_type_name (symbol->m_type & ~BRIG_TYPE_ARRAY_MASK), name);
793*38fd1498Szrj 
794*38fd1498Szrj   if (symbol->m_type & BRIG_TYPE_ARRAY_MASK)
795*38fd1498Szrj     fprintf (f, "[%lu]", (unsigned long) symbol->m_dim);
796*38fd1498Szrj 
797*38fd1498Szrj   if (symbol->m_directive_offset)
798*38fd1498Szrj     fprintf (f, "             /* BRIG offset: %u */", symbol->m_directive_offset);
799*38fd1498Szrj }
800*38fd1498Szrj 
801*38fd1498Szrj /* Dump textual representation of HSA IL operand OP to file F.  */
802*38fd1498Szrj 
803*38fd1498Szrj static void
804*38fd1498Szrj dump_hsa_operand (FILE *f, hsa_op_base *op, bool dump_reg_type = false)
805*38fd1498Szrj {
806*38fd1498Szrj   if (is_a <hsa_op_immed *> (op))
807*38fd1498Szrj     dump_hsa_immed (f, as_a <hsa_op_immed *> (op));
808*38fd1498Szrj   else if (is_a <hsa_op_reg *> (op))
809*38fd1498Szrj     dump_hsa_reg (f, as_a <hsa_op_reg *> (op), dump_reg_type);
810*38fd1498Szrj   else if (is_a <hsa_op_address *> (op))
811*38fd1498Szrj     dump_hsa_address (f, as_a <hsa_op_address *> (op));
812*38fd1498Szrj   else
813*38fd1498Szrj     fprintf (f, "UNKNOWN_OP_KIND");
814*38fd1498Szrj }
815*38fd1498Szrj 
816*38fd1498Szrj /* Dump textual representation of HSA IL operands in VEC to file F.  */
817*38fd1498Szrj 
818*38fd1498Szrj static void
819*38fd1498Szrj dump_hsa_operands (FILE *f, hsa_insn_basic *insn, int start = 0,
820*38fd1498Szrj 		   int end = -1, bool dump_reg_type = false)
821*38fd1498Szrj {
822*38fd1498Szrj   if (end == -1)
823*38fd1498Szrj     end = insn->operand_count ();
824*38fd1498Szrj 
825*38fd1498Szrj   for (int i = start; i < end; i++)
826*38fd1498Szrj     {
827*38fd1498Szrj       dump_hsa_operand (f, insn->get_op (i), dump_reg_type);
828*38fd1498Szrj       if (i != end - 1)
829*38fd1498Szrj 	fprintf (f, ", ");
830*38fd1498Szrj     }
831*38fd1498Szrj }
832*38fd1498Szrj 
833*38fd1498Szrj /* Indent F stream with INDENT spaces.  */
834*38fd1498Szrj 
indent_stream(FILE * f,int indent)835*38fd1498Szrj static void indent_stream (FILE *f, int indent)
836*38fd1498Szrj {
837*38fd1498Szrj   for (int i = 0; i < indent; i++)
838*38fd1498Szrj     fputc (' ', f);
839*38fd1498Szrj }
840*38fd1498Szrj 
841*38fd1498Szrj /* Dump textual representation of HSA IL instruction INSN to file F.  Prepend
842*38fd1498Szrj    the instruction with *INDENT spaces and adjust the indentation for call
843*38fd1498Szrj    instructions as appropriate.  */
844*38fd1498Szrj 
845*38fd1498Szrj static void
dump_hsa_insn_1(FILE * f,hsa_insn_basic * insn,int * indent)846*38fd1498Szrj dump_hsa_insn_1 (FILE *f, hsa_insn_basic *insn, int *indent)
847*38fd1498Szrj {
848*38fd1498Szrj   gcc_checking_assert (insn);
849*38fd1498Szrj 
850*38fd1498Szrj   if (insn->m_number)
851*38fd1498Szrj     fprintf (f, "%5d: ", insn->m_number);
852*38fd1498Szrj 
853*38fd1498Szrj   indent_stream (f, *indent);
854*38fd1498Szrj 
855*38fd1498Szrj   if (is_a <hsa_insn_phi *> (insn))
856*38fd1498Szrj     {
857*38fd1498Szrj       hsa_insn_phi *phi = as_a <hsa_insn_phi *> (insn);
858*38fd1498Szrj       bool first = true;
859*38fd1498Szrj       dump_hsa_reg (f, phi->m_dest, true);
860*38fd1498Szrj       fprintf (f, " = PHI <");
861*38fd1498Szrj       unsigned count = phi->operand_count ();
862*38fd1498Szrj       for (unsigned i = 0; i < count; i++)
863*38fd1498Szrj 	{
864*38fd1498Szrj 	  if (!phi->get_op (i))
865*38fd1498Szrj 	    break;
866*38fd1498Szrj 	  if (!first)
867*38fd1498Szrj 	    fprintf (f, ", ");
868*38fd1498Szrj 	  else
869*38fd1498Szrj 	    first = false;
870*38fd1498Szrj 	  dump_hsa_operand (f, phi->get_op (i), true);
871*38fd1498Szrj 	}
872*38fd1498Szrj       fprintf (f, ">");
873*38fd1498Szrj     }
874*38fd1498Szrj   else if (is_a <hsa_insn_signal *> (insn))
875*38fd1498Szrj     {
876*38fd1498Szrj       hsa_insn_signal *mem = as_a <hsa_insn_signal *> (insn);
877*38fd1498Szrj 
878*38fd1498Szrj       fprintf (f, "%s", hsa_opcode_name (mem->m_opcode));
879*38fd1498Szrj       fprintf (f, "_%s", hsa_m_atomicop_name (mem->m_signalop));
880*38fd1498Szrj       if (mem->m_memory_order != BRIG_MEMORY_ORDER_NONE)
881*38fd1498Szrj 	fprintf (f, "_%s", hsa_memsem_name (mem->m_memory_order));
882*38fd1498Szrj       fprintf (f, "_%s ", hsa_type_name (mem->m_type));
883*38fd1498Szrj 
884*38fd1498Szrj       dump_hsa_operands (f, mem);
885*38fd1498Szrj     }
886*38fd1498Szrj 
887*38fd1498Szrj   else if (is_a <hsa_insn_atomic *> (insn))
888*38fd1498Szrj     {
889*38fd1498Szrj       hsa_insn_atomic *mem = as_a <hsa_insn_atomic *> (insn);
890*38fd1498Szrj 
891*38fd1498Szrj       /* Either operand[0] or operand[1] must be an address operand.  */
892*38fd1498Szrj       hsa_op_address *addr = NULL;
893*38fd1498Szrj       if (is_a <hsa_op_address *> (mem->get_op (0)))
894*38fd1498Szrj 	addr = as_a <hsa_op_address *> (mem->get_op (0));
895*38fd1498Szrj       else
896*38fd1498Szrj 	addr = as_a <hsa_op_address *> (mem->get_op (1));
897*38fd1498Szrj 
898*38fd1498Szrj       fprintf (f, "%s", hsa_opcode_name (mem->m_opcode));
899*38fd1498Szrj       fprintf (f, "_%s", hsa_m_atomicop_name (mem->m_atomicop));
900*38fd1498Szrj       if (addr->m_symbol)
901*38fd1498Szrj 	fprintf (f, "_%s", hsa_seg_name (addr->m_symbol->m_segment));
902*38fd1498Szrj       if (mem->m_memoryorder != BRIG_MEMORY_ORDER_NONE)
903*38fd1498Szrj 	fprintf (f, "_%s", hsa_memsem_name (mem->m_memoryorder));
904*38fd1498Szrj       if (mem->m_memoryscope != BRIG_MEMORY_SCOPE_NONE)
905*38fd1498Szrj 	fprintf (f, "_%s", hsa_memscope_name (mem->m_memoryscope));
906*38fd1498Szrj       fprintf (f, "_%s ", hsa_type_name (mem->m_type));
907*38fd1498Szrj 
908*38fd1498Szrj       dump_hsa_operands (f, mem);
909*38fd1498Szrj     }
910*38fd1498Szrj   else if (is_a <hsa_insn_mem *> (insn))
911*38fd1498Szrj     {
912*38fd1498Szrj       hsa_insn_mem *mem = as_a <hsa_insn_mem *> (insn);
913*38fd1498Szrj       hsa_op_address *addr = as_a <hsa_op_address *> (mem->get_op (1));
914*38fd1498Szrj 
915*38fd1498Szrj       fprintf (f, "%s", hsa_opcode_name (mem->m_opcode));
916*38fd1498Szrj       if (addr->m_symbol)
917*38fd1498Szrj 	fprintf (f, "_%s", hsa_seg_name (addr->m_symbol->m_segment));
918*38fd1498Szrj       if (mem->m_align != BRIG_ALIGNMENT_NONE)
919*38fd1498Szrj 	fprintf (f, "_align(%u)", hsa_byte_alignment (mem->m_align));
920*38fd1498Szrj       if (mem->m_equiv_class != 0)
921*38fd1498Szrj 	fprintf (f, "_equiv(%i)", mem->m_equiv_class);
922*38fd1498Szrj       fprintf (f, "_%s ", hsa_type_name (mem->m_type));
923*38fd1498Szrj 
924*38fd1498Szrj       dump_hsa_operand (f, mem->get_op (0));
925*38fd1498Szrj       fprintf (f, ", ");
926*38fd1498Szrj       dump_hsa_address (f, addr);
927*38fd1498Szrj     }
928*38fd1498Szrj   else if (insn->m_opcode == BRIG_OPCODE_LDA)
929*38fd1498Szrj     {
930*38fd1498Szrj       hsa_op_address *addr = as_a <hsa_op_address *> (insn->get_op (1));
931*38fd1498Szrj 
932*38fd1498Szrj       fprintf (f, "%s", hsa_opcode_name (insn->m_opcode));
933*38fd1498Szrj       if (addr->m_symbol)
934*38fd1498Szrj 	fprintf (f, "_%s", hsa_seg_name (addr->m_symbol->m_segment));
935*38fd1498Szrj       fprintf (f, "_%s ", hsa_type_name (insn->m_type));
936*38fd1498Szrj 
937*38fd1498Szrj       dump_hsa_operand (f, insn->get_op (0));
938*38fd1498Szrj       fprintf (f, ", ");
939*38fd1498Szrj       dump_hsa_address (f, addr);
940*38fd1498Szrj     }
941*38fd1498Szrj   else if (is_a <hsa_insn_seg *> (insn))
942*38fd1498Szrj     {
943*38fd1498Szrj       hsa_insn_seg *seg = as_a <hsa_insn_seg *> (insn);
944*38fd1498Szrj       fprintf (f, "%s_%s_%s_%s ", hsa_opcode_name (seg->m_opcode),
945*38fd1498Szrj 	       hsa_seg_name (seg->m_segment),
946*38fd1498Szrj 	       hsa_type_name (seg->m_type), hsa_type_name (seg->m_src_type));
947*38fd1498Szrj       dump_hsa_reg (f, as_a <hsa_op_reg *> (seg->get_op (0)));
948*38fd1498Szrj       fprintf (f, ", ");
949*38fd1498Szrj       dump_hsa_operand (f, seg->get_op (1));
950*38fd1498Szrj     }
951*38fd1498Szrj   else if (is_a <hsa_insn_cmp *> (insn))
952*38fd1498Szrj     {
953*38fd1498Szrj       hsa_insn_cmp *cmp = as_a <hsa_insn_cmp *> (insn);
954*38fd1498Szrj       BrigType16_t src_type;
955*38fd1498Szrj 
956*38fd1498Szrj       if (is_a <hsa_op_reg *> (cmp->get_op (1)))
957*38fd1498Szrj 	src_type = as_a <hsa_op_reg *> (cmp->get_op (1))->m_type;
958*38fd1498Szrj       else
959*38fd1498Szrj 	src_type = as_a <hsa_op_immed *> (cmp->get_op (1))->m_type;
960*38fd1498Szrj 
961*38fd1498Szrj       fprintf (f, "%s_%s_%s_%s ", hsa_opcode_name (cmp->m_opcode),
962*38fd1498Szrj 	       hsa_cmpop_name (cmp->m_compare),
963*38fd1498Szrj 	       hsa_type_name (cmp->m_type), hsa_type_name (src_type));
964*38fd1498Szrj       dump_hsa_reg (f, as_a <hsa_op_reg *> (cmp->get_op (0)));
965*38fd1498Szrj       fprintf (f, ", ");
966*38fd1498Szrj       dump_hsa_operand (f, cmp->get_op (1));
967*38fd1498Szrj       fprintf (f, ", ");
968*38fd1498Szrj       dump_hsa_operand (f, cmp->get_op (2));
969*38fd1498Szrj     }
970*38fd1498Szrj   else if (is_a <hsa_insn_cbr *> (insn))
971*38fd1498Szrj     {
972*38fd1498Szrj       hsa_insn_cbr *br = as_a <hsa_insn_cbr *> (insn);
973*38fd1498Szrj       basic_block target = NULL;
974*38fd1498Szrj       edge_iterator ei;
975*38fd1498Szrj       edge e;
976*38fd1498Szrj 
977*38fd1498Szrj       fprintf (f, "%s ", hsa_opcode_name (br->m_opcode));
978*38fd1498Szrj       if (br->m_opcode == BRIG_OPCODE_CBR)
979*38fd1498Szrj 	{
980*38fd1498Szrj 	  dump_hsa_reg (f, as_a <hsa_op_reg *> (br->get_op (0)));
981*38fd1498Szrj 	  fprintf (f, ", ");
982*38fd1498Szrj 	}
983*38fd1498Szrj 
984*38fd1498Szrj       FOR_EACH_EDGE (e, ei, br->m_bb->succs)
985*38fd1498Szrj 	if (e->flags & EDGE_TRUE_VALUE)
986*38fd1498Szrj 	  {
987*38fd1498Szrj 	    target = e->dest;
988*38fd1498Szrj 	    break;
989*38fd1498Szrj 	  }
990*38fd1498Szrj       fprintf (f, "BB %i", hsa_bb_for_bb (target)->m_index);
991*38fd1498Szrj     }
992*38fd1498Szrj   else if (is_a <hsa_insn_sbr *> (insn))
993*38fd1498Szrj     {
994*38fd1498Szrj       hsa_insn_sbr *sbr = as_a <hsa_insn_sbr *> (insn);
995*38fd1498Szrj 
996*38fd1498Szrj       fprintf (f, "%s ", hsa_opcode_name (sbr->m_opcode));
997*38fd1498Szrj       dump_hsa_reg (f, as_a <hsa_op_reg *> (sbr->get_op (0)));
998*38fd1498Szrj       fprintf (f, ", [");
999*38fd1498Szrj 
1000*38fd1498Szrj       for (unsigned i = 0; i < sbr->m_jump_table.length (); i++)
1001*38fd1498Szrj 	{
1002*38fd1498Szrj 	  fprintf (f, "BB %i", hsa_bb_for_bb (sbr->m_jump_table[i])->m_index);
1003*38fd1498Szrj 	  if (i != sbr->m_jump_table.length () - 1)
1004*38fd1498Szrj 	    fprintf (f, ", ");
1005*38fd1498Szrj 	}
1006*38fd1498Szrj     }
1007*38fd1498Szrj   else if (is_a <hsa_insn_br *> (insn))
1008*38fd1498Szrj     {
1009*38fd1498Szrj       hsa_insn_br *br = as_a <hsa_insn_br *> (insn);
1010*38fd1498Szrj       fprintf (f, "%s_width(%s) ", hsa_opcode_name (br->m_opcode),
1011*38fd1498Szrj 	       hsa_width_specifier_name (br->m_width));
1012*38fd1498Szrj     }
1013*38fd1498Szrj   else if (is_a <hsa_insn_arg_block *> (insn))
1014*38fd1498Szrj     {
1015*38fd1498Szrj       hsa_insn_arg_block *arg_block = as_a <hsa_insn_arg_block *> (insn);
1016*38fd1498Szrj       bool start_p = arg_block->m_kind == BRIG_KIND_DIRECTIVE_ARG_BLOCK_START;
1017*38fd1498Szrj       char c = start_p ? '{' : '}';
1018*38fd1498Szrj 
1019*38fd1498Szrj       if (start_p)
1020*38fd1498Szrj 	{
1021*38fd1498Szrj 	  *indent += 2;
1022*38fd1498Szrj 	  indent_stream (f, 2);
1023*38fd1498Szrj 	}
1024*38fd1498Szrj 
1025*38fd1498Szrj       if (!start_p)
1026*38fd1498Szrj 	*indent -= 2;
1027*38fd1498Szrj 
1028*38fd1498Szrj       fprintf (f, "%c", c);
1029*38fd1498Szrj     }
1030*38fd1498Szrj   else if (is_a <hsa_insn_call *> (insn))
1031*38fd1498Szrj     {
1032*38fd1498Szrj       hsa_insn_call *call = as_a <hsa_insn_call *> (insn);
1033*38fd1498Szrj       if (call->m_called_function)
1034*38fd1498Szrj 	{
1035*38fd1498Szrj 	  const char *name = hsa_get_declaration_name (call->m_called_function);
1036*38fd1498Szrj 	  fprintf (f, "call &%s", name);
1037*38fd1498Szrj 	}
1038*38fd1498Szrj       else
1039*38fd1498Szrj 	{
1040*38fd1498Szrj 	  char *name = call->m_called_internal_fn->name ();
1041*38fd1498Szrj 	  fprintf (f, "call &%s", name);
1042*38fd1498Szrj 	  free (name);
1043*38fd1498Szrj 	}
1044*38fd1498Szrj 
1045*38fd1498Szrj       if (call->m_output_arg)
1046*38fd1498Szrj 	fprintf (f, "(%%res) ");
1047*38fd1498Szrj 
1048*38fd1498Szrj       fprintf (f, "(");
1049*38fd1498Szrj       for (unsigned i = 0; i < call->m_input_args.length (); i++)
1050*38fd1498Szrj 	{
1051*38fd1498Szrj 	  fprintf (f, "%%__arg_%u", i);
1052*38fd1498Szrj 
1053*38fd1498Szrj 	  if (i != call->m_input_args.length () - 1)
1054*38fd1498Szrj 	    fprintf (f, ", ");
1055*38fd1498Szrj 	}
1056*38fd1498Szrj       fprintf (f, ")");
1057*38fd1498Szrj     }
1058*38fd1498Szrj   else if (is_a <hsa_insn_comment *> (insn))
1059*38fd1498Szrj     {
1060*38fd1498Szrj       hsa_insn_comment *c = as_a <hsa_insn_comment *> (insn);
1061*38fd1498Szrj       fprintf (f, "%s", c->m_comment);
1062*38fd1498Szrj     }
1063*38fd1498Szrj   else if (is_a <hsa_insn_srctype *> (insn))
1064*38fd1498Szrj     {
1065*38fd1498Szrj       hsa_insn_srctype *srctype = as_a <hsa_insn_srctype *> (insn);
1066*38fd1498Szrj 
1067*38fd1498Szrj       fprintf (f, "%s_%s_%s ", hsa_opcode_name (srctype->m_opcode),
1068*38fd1498Szrj 	       hsa_type_name (srctype->m_type),
1069*38fd1498Szrj 	       hsa_type_name (srctype->m_source_type));
1070*38fd1498Szrj 
1071*38fd1498Szrj       dump_hsa_operands (f, insn);
1072*38fd1498Szrj     }
1073*38fd1498Szrj   else if (is_a <hsa_insn_packed *> (insn))
1074*38fd1498Szrj     {
1075*38fd1498Szrj       hsa_insn_packed *packed = as_a <hsa_insn_packed *> (insn);
1076*38fd1498Szrj 
1077*38fd1498Szrj       fprintf (f, "%s_v%u_%s_%s ", hsa_opcode_name (packed->m_opcode),
1078*38fd1498Szrj 	       packed->operand_count () - 1,
1079*38fd1498Szrj 	       hsa_type_name (packed->m_type),
1080*38fd1498Szrj 	       hsa_type_name (packed->m_source_type));
1081*38fd1498Szrj 
1082*38fd1498Szrj       if (packed->m_opcode == BRIG_OPCODE_COMBINE)
1083*38fd1498Szrj 	{
1084*38fd1498Szrj 	  dump_hsa_operand (f, insn->get_op (0));
1085*38fd1498Szrj 	  fprintf (f, ", (");
1086*38fd1498Szrj 	  dump_hsa_operands (f, insn, 1);
1087*38fd1498Szrj 	  fprintf (f, ")");
1088*38fd1498Szrj 	}
1089*38fd1498Szrj       else if (packed->m_opcode == BRIG_OPCODE_EXPAND)
1090*38fd1498Szrj 	{
1091*38fd1498Szrj 	  fprintf (f, "(");
1092*38fd1498Szrj 	  dump_hsa_operands (f, insn, 0, insn->operand_count () - 1);
1093*38fd1498Szrj 	  fprintf (f, "), ");
1094*38fd1498Szrj 	  dump_hsa_operand (f, insn->get_op (insn->operand_count () - 1));
1095*38fd1498Szrj 
1096*38fd1498Szrj 	}
1097*38fd1498Szrj       else
1098*38fd1498Szrj 	gcc_unreachable ();
1099*38fd1498Szrj     }
1100*38fd1498Szrj   else if (is_a <hsa_insn_alloca *> (insn))
1101*38fd1498Szrj     {
1102*38fd1498Szrj       hsa_insn_alloca *alloca = as_a <hsa_insn_alloca *> (insn);
1103*38fd1498Szrj 
1104*38fd1498Szrj       fprintf (f, "%s_align(%u)_%s ", hsa_opcode_name (insn->m_opcode),
1105*38fd1498Szrj 	       hsa_byte_alignment (alloca->m_align),
1106*38fd1498Szrj 	       hsa_type_name (insn->m_type));
1107*38fd1498Szrj 
1108*38fd1498Szrj       dump_hsa_operands (f, insn);
1109*38fd1498Szrj     }
1110*38fd1498Szrj   else if (hsa_insn_queue *qi = dyn_cast <hsa_insn_queue *> (insn))
1111*38fd1498Szrj     {
1112*38fd1498Szrj       fprintf (f, "%s_%s_%s_%s ", hsa_opcode_name (qi->m_opcode),
1113*38fd1498Szrj 	       hsa_seg_name (qi->m_segment),
1114*38fd1498Szrj 	       hsa_memsem_name (qi->m_memory_order),
1115*38fd1498Szrj 	       hsa_type_name (qi->m_type));
1116*38fd1498Szrj 
1117*38fd1498Szrj       dump_hsa_operands (f, qi);
1118*38fd1498Szrj     }
1119*38fd1498Szrj   else
1120*38fd1498Szrj     {
1121*38fd1498Szrj       fprintf (f, "%s_%s ", hsa_opcode_name (insn->m_opcode),
1122*38fd1498Szrj 	       hsa_type_name (insn->m_type));
1123*38fd1498Szrj 
1124*38fd1498Szrj       dump_hsa_operands (f, insn);
1125*38fd1498Szrj     }
1126*38fd1498Szrj 
1127*38fd1498Szrj   if (insn->m_brig_offset)
1128*38fd1498Szrj     {
1129*38fd1498Szrj       fprintf (f, "             /* BRIG offset: %u", insn->m_brig_offset);
1130*38fd1498Szrj 
1131*38fd1498Szrj       for (unsigned i = 0; i < insn->operand_count (); i++)
1132*38fd1498Szrj 	fprintf (f, ", op%u: %u", i, insn->get_op (i)->m_brig_op_offset);
1133*38fd1498Szrj 
1134*38fd1498Szrj       fprintf (f, " */");
1135*38fd1498Szrj     }
1136*38fd1498Szrj 
1137*38fd1498Szrj   fprintf (f, "\n");
1138*38fd1498Szrj }
1139*38fd1498Szrj 
1140*38fd1498Szrj /* Dump textual representation of HSA IL instruction INSN to file F.  */
1141*38fd1498Szrj 
1142*38fd1498Szrj void
dump_hsa_insn(FILE * f,hsa_insn_basic * insn)1143*38fd1498Szrj dump_hsa_insn (FILE *f, hsa_insn_basic *insn)
1144*38fd1498Szrj {
1145*38fd1498Szrj   int indent = 0;
1146*38fd1498Szrj   dump_hsa_insn_1 (f, insn, &indent);
1147*38fd1498Szrj }
1148*38fd1498Szrj 
1149*38fd1498Szrj /* Dump textual representation of HSA IL in HBB to file F.  */
1150*38fd1498Szrj 
1151*38fd1498Szrj void
dump_hsa_bb(FILE * f,hsa_bb * hbb)1152*38fd1498Szrj dump_hsa_bb (FILE *f, hsa_bb *hbb)
1153*38fd1498Szrj {
1154*38fd1498Szrj   hsa_insn_basic *insn;
1155*38fd1498Szrj   edge_iterator ei;
1156*38fd1498Szrj   edge e;
1157*38fd1498Szrj   basic_block true_bb = NULL, other = NULL;
1158*38fd1498Szrj 
1159*38fd1498Szrj   fprintf (f, "BB %i:\n", hbb->m_index);
1160*38fd1498Szrj 
1161*38fd1498Szrj   int indent = 2;
1162*38fd1498Szrj   for (insn = hbb->m_first_phi; insn; insn = insn->m_next)
1163*38fd1498Szrj     dump_hsa_insn_1 (f, insn, &indent);
1164*38fd1498Szrj 
1165*38fd1498Szrj   for (insn = hbb->m_first_insn; insn; insn = insn->m_next)
1166*38fd1498Szrj     dump_hsa_insn_1 (f, insn, &indent);
1167*38fd1498Szrj 
1168*38fd1498Szrj   if (hbb->m_last_insn && is_a <hsa_insn_sbr *> (hbb->m_last_insn))
1169*38fd1498Szrj     goto exit;
1170*38fd1498Szrj 
1171*38fd1498Szrj   FOR_EACH_EDGE (e, ei, hbb->m_bb->succs)
1172*38fd1498Szrj     if (e->flags & EDGE_TRUE_VALUE)
1173*38fd1498Szrj       {
1174*38fd1498Szrj 	gcc_assert (!true_bb);
1175*38fd1498Szrj 	true_bb = e->dest;
1176*38fd1498Szrj       }
1177*38fd1498Szrj     else
1178*38fd1498Szrj       {
1179*38fd1498Szrj 	gcc_assert (!other);
1180*38fd1498Szrj 	other = e->dest;
1181*38fd1498Szrj       }
1182*38fd1498Szrj 
1183*38fd1498Szrj   if (true_bb)
1184*38fd1498Szrj     {
1185*38fd1498Szrj       if (!hbb->m_last_insn
1186*38fd1498Szrj 	  || hbb->m_last_insn->m_opcode != BRIG_OPCODE_CBR)
1187*38fd1498Szrj 	fprintf (f, "WARNING: No branch insn for a true edge. \n");
1188*38fd1498Szrj     }
1189*38fd1498Szrj   else if (hbb->m_last_insn
1190*38fd1498Szrj 	   && hbb->m_last_insn->m_opcode == BRIG_OPCODE_CBR)
1191*38fd1498Szrj     fprintf (f, "WARNING: No true edge for a cbr statement\n");
1192*38fd1498Szrj 
1193*38fd1498Szrj   if (other && other->aux)
1194*38fd1498Szrj     fprintf (f, "  Fall-through to BB %i\n",
1195*38fd1498Szrj 	     hsa_bb_for_bb (other)->m_index);
1196*38fd1498Szrj   else if (hbb->m_last_insn
1197*38fd1498Szrj 	   && hbb->m_last_insn->m_opcode != BRIG_OPCODE_RET)
1198*38fd1498Szrj     fprintf (f, "  WARNING: Fall through to a BB with no aux!\n");
1199*38fd1498Szrj 
1200*38fd1498Szrj exit:
1201*38fd1498Szrj   fprintf (f, "\n");
1202*38fd1498Szrj }
1203*38fd1498Szrj 
1204*38fd1498Szrj /* Dump textual representation of HSA IL of the current function to file F.  */
1205*38fd1498Szrj 
1206*38fd1498Szrj void
dump_hsa_cfun(FILE * f)1207*38fd1498Szrj dump_hsa_cfun (FILE *f)
1208*38fd1498Szrj {
1209*38fd1498Szrj   basic_block bb;
1210*38fd1498Szrj 
1211*38fd1498Szrj   if (hsa_cfun->m_global_symbols.length () > 0)
1212*38fd1498Szrj     fprintf (f, "\nHSAIL in global scope\n");
1213*38fd1498Szrj 
1214*38fd1498Szrj   for (unsigned i = 0; i < hsa_cfun->m_global_symbols.length (); i++)
1215*38fd1498Szrj     {
1216*38fd1498Szrj       fprintf (f, "  ");
1217*38fd1498Szrj       dump_hsa_symbol (f, hsa_cfun->m_global_symbols[i]);
1218*38fd1498Szrj       fprintf (f, "\n");
1219*38fd1498Szrj     }
1220*38fd1498Szrj 
1221*38fd1498Szrj   fprintf (f, "\nHSAIL IL for %s\n", hsa_cfun->m_name);
1222*38fd1498Szrj 
1223*38fd1498Szrj   for (unsigned i = 0; i < hsa_cfun->m_private_variables.length (); i++)
1224*38fd1498Szrj     {
1225*38fd1498Szrj       fprintf (f, "  ");
1226*38fd1498Szrj       dump_hsa_symbol (f, hsa_cfun->m_private_variables[i]);
1227*38fd1498Szrj       fprintf (f, "\n");
1228*38fd1498Szrj     }
1229*38fd1498Szrj 
1230*38fd1498Szrj   FOR_ALL_BB_FN (bb, cfun)
1231*38fd1498Szrj     {
1232*38fd1498Szrj       hsa_bb *hbb = (struct hsa_bb *) bb->aux;
1233*38fd1498Szrj       dump_hsa_bb (f, hbb);
1234*38fd1498Szrj     }
1235*38fd1498Szrj }
1236*38fd1498Szrj 
1237*38fd1498Szrj /* Dump textual representation of HSA IL instruction INSN to stderr.  */
1238*38fd1498Szrj 
1239*38fd1498Szrj DEBUG_FUNCTION void
debug_hsa_insn(hsa_insn_basic * insn)1240*38fd1498Szrj debug_hsa_insn (hsa_insn_basic *insn)
1241*38fd1498Szrj {
1242*38fd1498Szrj   dump_hsa_insn (stderr, insn);
1243*38fd1498Szrj }
1244*38fd1498Szrj 
1245*38fd1498Szrj /* Dump textual representation of HSA IL in HBB to stderr.  */
1246*38fd1498Szrj 
1247*38fd1498Szrj DEBUG_FUNCTION void
debug_hsa_bb(hsa_bb * hbb)1248*38fd1498Szrj debug_hsa_bb (hsa_bb *hbb)
1249*38fd1498Szrj {
1250*38fd1498Szrj   dump_hsa_bb (stderr, hbb);
1251*38fd1498Szrj }
1252*38fd1498Szrj 
1253*38fd1498Szrj /* Dump textual representation of HSA IL of the current function to stderr.  */
1254*38fd1498Szrj 
1255*38fd1498Szrj DEBUG_FUNCTION void
debug_hsa_cfun(void)1256*38fd1498Szrj debug_hsa_cfun (void)
1257*38fd1498Szrj {
1258*38fd1498Szrj   dump_hsa_cfun (stderr);
1259*38fd1498Szrj }
1260*38fd1498Szrj 
1261*38fd1498Szrj /* Dump textual representation of an HSA operand to stderr.  */
1262*38fd1498Szrj 
1263*38fd1498Szrj DEBUG_FUNCTION void
debug_hsa_operand(hsa_op_base * opc)1264*38fd1498Szrj debug_hsa_operand (hsa_op_base *opc)
1265*38fd1498Szrj {
1266*38fd1498Szrj   dump_hsa_operand (stderr, opc, true);
1267*38fd1498Szrj   fprintf (stderr, "\n");
1268*38fd1498Szrj }
1269*38fd1498Szrj 
1270*38fd1498Szrj /* Dump textual representation of as HSA symbol.  */
1271*38fd1498Szrj 
1272*38fd1498Szrj DEBUG_FUNCTION void
debug_hsa_symbol(hsa_symbol * symbol)1273*38fd1498Szrj debug_hsa_symbol (hsa_symbol *symbol)
1274*38fd1498Szrj {
1275*38fd1498Szrj   dump_hsa_symbol (stderr, symbol);
1276*38fd1498Szrj   fprintf (stderr, "\n");
1277*38fd1498Szrj }
1278