1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2011 Christoph Bumiller
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included in
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all copies or substantial portions of the Software.
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir.h"
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir_target.h"
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace nv50_ir {
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum TextStyle
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TXT_DEFAULT,
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TXT_GPR,
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TXT_REGISTER,
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TXT_FLAGS,
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TXT_MEM,
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TXT_IMMD,
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TXT_BRA,
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TXT_INSN
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *_colour[8] =
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "\x1b[00m",
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "\x1b[34m",
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "\x1b[35m",
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "\x1b[35m",
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "\x1b[36m",
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "\x1b[33m",
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "\x1b[37m",
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "\x1b[32m"
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *_nocolour[8] =
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "", "", "", "", "", "", "", ""
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char **colour;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void init_colours()
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (getenv("NV50_PROG_DEBUG_NO_COLORS") != NULL)
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      colour = _nocolour;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      colour = _colour;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *OpClassStr[OPCLASS_OTHER + 1] =
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "MOVE",
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "LOAD",
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "STORE",
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "ARITH",
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "SHIFT",
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "SFU",
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "LOGIC",
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "COMPARE",
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "CONVERT",
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "ATOMIC",
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "TEXTURE",
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "SURFACE",
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "FLOW",
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "(INVALID)",
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "PSEUDO",
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "OTHER"
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst char *operationStr[OP_LAST + 1] =
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "nop",
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "phi",
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "union",
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "split",
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "merge",
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "consec",
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "mov",
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "ld",
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "st",
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "add",
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "sub",
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "mul",
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "div",
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "mod",
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "mad",
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "fma",
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "sad",
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "abs",
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "neg",
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "not",
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "and",
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "or",
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "xor",
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "shl",
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "shr",
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "max",
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "min",
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "sat",
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "ceil",
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "floor",
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "trunc",
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "cvt",
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "set and",
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "set or",
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "set xor",
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "set",
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "selp",
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "slct",
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "rcp",
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "rsq",
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "lg2",
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "sin",
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "cos",
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "ex2",
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "exp",
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "log",
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "presin",
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "preex2",
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "sqrt",
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "pow",
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "bra",
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "call",
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "ret",
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "cont",
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "break",
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "preret",
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "precont",
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "prebreak",
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "brkpt",
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "joinat",
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "join",
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "discard",
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "exit",
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "barrier",
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "vfetch",
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "pfetch",
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "export",
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "linterp",
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "pinterp",
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "emit",
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "restart",
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "tex",
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "texbias",
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "texlod",
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "texfetch",
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "texquery",
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "texgrad",
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "texgather",
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "texcsaa",
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "suld",
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "sust",
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "dfdx",
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "dfdy",
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "rdsv",
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "wrsv",
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "pixld",
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "quadop",
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "quadon",
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "quadpop",
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "popcnt",
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "insbf",
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "extbf",
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "texbar",
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "(invalid)"
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *DataTypeStr[] =
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "-",
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "u8", "s8",
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "u16", "s16",
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "u32", "s32",
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "u64", "s64",
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "f16", "f32", "f64",
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "b96", "b128"
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *RoundModeStr[] =
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "", "rm", "rz", "rp", "rni", "rmi", "rzi", "rpi"
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *CondCodeStr[] =
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "never",
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "lt",
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "eq",
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "le",
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "gt",
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "ne",
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "ge",
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "",
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "(invalid)",
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "ltu",
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "equ",
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "leu",
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "gtu",
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "neu",
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "geu",
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "",
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "no",
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "nc",
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "ns",
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "na",
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "a",
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "s",
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "c",
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "o"
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *SemanticStr[SV_LAST + 1] =
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "POSITION",
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "VERTEX_ID",
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "INSTANCE_ID",
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "INVOCATION_ID",
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "PRIMITIVE_ID",
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "VERTEX_COUNT",
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "LAYER",
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "VIEWPORT_INDEX",
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "Y_DIR",
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "FACE",
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "POINT_SIZE",
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "POINT_COORD",
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "CLIP_DISTANCE",
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "SAMPLE_INDEX",
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "TESS_FACTOR",
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "TESS_COORD",
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "TID",
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "CTAID",
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "NTID",
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "GRIDID",
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "NCTAID",
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "LANEID",
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "PHYSID",
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "NPHYSID",
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "CLOCK",
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "LBASE",
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "SBASE",
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "?",
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "(INVALID)"
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *interpStr[16] =
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "pass",
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "mul",
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "flat",
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "sc",
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "cent pass",
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "cent mul",
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "cent flat",
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "cent sc",
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "off pass",
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "off mul",
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "off flat",
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "off sc",
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "samp pass",
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "samp mul",
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "samp flat",
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "samp sc"
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PRINT(args...)                                \
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {                                               \
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pos += snprintf(&buf[pos], size - pos, args);   \
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while(0)
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SPACE_PRINT(cond, args...)                      \
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {                                                 \
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (cond)                                         \
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         buf[pos++] = ' ';                              \
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pos += snprintf(&buf[pos], size - pos, args);     \
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while(0)
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SPACE()                                    \
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {                                            \
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pos < size)                              \
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         buf[pos++] = ' ';                         \
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while(0)
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint Modifier::print(char *buf, size_t size) const
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t pos = 0;
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (bits)
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("%s", colour[TXT_INSN]);
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t base = pos;
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (bits & NV50_IR_MOD_NOT)
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("not");
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (bits & NV50_IR_MOD_SAT)
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SPACE_PRINT(pos > base && pos < size, "sat");
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (bits & NV50_IR_MOD_NEG)
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SPACE_PRINT(pos > base && pos < size, "neg");
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (bits & NV50_IR_MOD_ABS)
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SPACE_PRINT(pos > base && pos < size, "abs");
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return pos;
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint LValue::print(char *buf, size_t size, DataType ty) const
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *postFix = "";
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t pos = 0;
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int idx = join->reg.data.id >= 0 ? join->reg.data.id : id;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char p = join->reg.data.id >= 0 ? '$' : '%';
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char r;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int col = TXT_DEFAULT;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (reg.file) {
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_GPR:
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r = 'r'; col = TXT_GPR;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (reg.size == 2) {
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (p == '$') {
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            postFix = (idx & 1) ? "h" : "l";
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            idx /= 2;
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         } else {
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            postFix = "s";
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (reg.size == 8) {
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         postFix = "d";
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (reg.size == 16) {
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         postFix = "q";
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (reg.size == 12) {
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         postFix = "t";
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_PREDICATE:
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r = 'p'; col = TXT_REGISTER;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (reg.size == 2)
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         postFix = "d";
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (reg.size == 4)
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         postFix = "q";
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_FLAGS:
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r = 'c'; col = TXT_FLAGS;
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_ADDRESS:
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r = 'a'; col = TXT_REGISTER;
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid file for lvalue");
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r = '?';
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRINT("%s%c%c%i%s", colour[col], p, r, idx, postFix);
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return pos;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint ImmediateValue::print(char *buf, size_t size, DataType ty) const
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t pos = 0;
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRINT("%s", colour[TXT_IMMD]);
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (ty) {
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_F32: PRINT("%f", reg.data.f32); break;
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_F64: PRINT("%f", reg.data.f64); break;
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U8:  PRINT("0x%02x", reg.data.u8); break;
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S8:  PRINT("%i", reg.data.s8); break;
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U16: PRINT("0x%04x", reg.data.u16); break;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S16: PRINT("%i", reg.data.s16); break;
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U32: PRINT("0x%08x", reg.data.u32); break;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S32: PRINT("%i", reg.data.s32); break;
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U64:
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S64:
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("0x%016lx", reg.data.u64);
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return pos;
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint Symbol::print(char *buf, size_t size, DataType ty) const
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return print(buf, size, NULL, NULL, ty);
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint Symbol::print(char *buf, size_t size,
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  Value *rel, Value *dimRel, DataType ty) const
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t pos = 0;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char c;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ty == TYPE_NONE)
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ty = typeOfSize(reg.size);
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (reg.file == FILE_SYSTEM_VALUE) {
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("%ssv[%s%s:%i%s", colour[TXT_MEM],
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            colour[TXT_REGISTER],
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            SemanticStr[reg.data.sv.sv], reg.data.sv.index, colour[TXT_MEM]);
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (rel) {
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PRINT("%s+", colour[TXT_DEFAULT]);
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pos += rel->print(&buf[pos], size - pos);
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("%s]", colour[TXT_MEM]);
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return pos;
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (reg.file) {
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_MEMORY_CONST:  c = 'c'; break;
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_SHADER_INPUT:  c = 'a'; break;
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_SHADER_OUTPUT: c = 'o'; break;
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_MEMORY_GLOBAL: c = 'g'; break;
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_MEMORY_SHARED: c = 's'; break;
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_MEMORY_LOCAL:  c = 'l'; break;
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid file");
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c = '?';
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c == 'c')
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("%s%c%i[", colour[TXT_MEM], c, reg.fileIndex);
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("%s%c[", colour[TXT_MEM], c);
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dimRel) {
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pos += dimRel->print(&buf[pos], size - pos, TYPE_S32);
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("%s][", colour[TXT_MEM]);
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rel) {
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pos += rel->print(&buf[pos], size - pos);
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("%s%c", colour[TXT_DEFAULT], (reg.data.offset < 0) ? '-' : '+');
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(reg.data.offset >= 0);
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRINT("%s0x%x%s]", colour[TXT_IMMD], abs(reg.data.offset), colour[TXT_MEM]);
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return pos;
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid Instruction::print() const
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   #define BUFSZ 512
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const size_t size = BUFSZ;
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char buf[BUFSZ];
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int s, d;
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t pos = 0;
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRINT("%s", colour[TXT_INSN]);
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (join)
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("join ");
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (predSrc >= 0) {
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const size_t pre = pos;
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (getSrc(predSrc)->reg.file == FILE_PREDICATE) {
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (cc == CC_NOT_P)
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            PRINT("not");
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PRINT("%s", CondCodeStr[cc]);
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pos > pre)
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SPACE();
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pos += getSrc(predSrc)->print(&buf[pos], BUFSZ - pos);
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT(" %s", colour[TXT_INSN]);
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (saturate)
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("sat ");
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (asFlow()) {
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("%s", operationStr[op]);
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (op == OP_CALL && asFlow()->builtin) {
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PRINT(" %sBUILTIN:%i", colour[TXT_BRA], asFlow()->target.builtin);
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (op == OP_CALL && asFlow()->target.fn) {
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PRINT(" %s%s:%i", colour[TXT_BRA],
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               asFlow()->target.fn->getName(),
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               asFlow()->target.fn->getLabel());
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (asFlow()->target.bb)
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PRINT(" %sBB:%i", colour[TXT_BRA], asFlow()->target.bb->getId());
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("%s ", operationStr[op]);
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (op == OP_LINTERP || op == OP_PINTERP)
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PRINT("%s ", interpStr[ipa]);
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (subOp)
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PRINT("(SUBOP:%u) ", subOp);
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (perPatch)
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PRINT("patch ");
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (asTex())
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PRINT("%s ", asTex()->tex.target.getName());
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (postFactor)
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PRINT("x2^%i ", postFactor);
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("%s%s", dnz ? "dnz " : (ftz ? "ftz " : ""),  DataTypeStr[dType]);
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rnd != ROUND_N)
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT(" %s", RoundModeStr[rnd]);
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (defExists(1))
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT(" {");
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (d = 0; defExists(d); ++d) {
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SPACE();
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pos += getDef(d)->print(&buf[pos], size - pos);
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (d > 1)
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT(" %s}", colour[TXT_INSN]);
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!d && !asFlow())
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT(" %s#", colour[TXT_INSN]);
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (asCmp())
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT(" %s%s", colour[TXT_INSN], CondCodeStr[asCmp()->setCond]);
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (sType != dType)
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT(" %s%s", colour[TXT_INSN], DataTypeStr[sType]);
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (s = 0; srcExists(s); ++s) {
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (s == predSrc || src(s).usedAsPtr)
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const size_t pre = pos;
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SPACE();
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pos += src(s).mod.print(&buf[pos], BUFSZ - pos);
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pos > pre + 1)
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SPACE();
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (src(s).isIndirect(0) || src(s).isIndirect(1))
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pos += getSrc(s)->asSym()->print(&buf[pos], BUFSZ - pos,
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          getIndirect(s, 0),
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          getIndirect(s, 1));
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pos += getSrc(s)->print(&buf[pos], BUFSZ - pos, sType);
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (exit)
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PRINT("%s exit", colour[TXT_INSN]);
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRINT("%s", colour[TXT_DEFAULT]);
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buf[MIN2(pos, BUFSZ - 1)] = 0;
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INFO("%s (%u)\n", buf, encSize);
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass PrintPass : public Pass
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PrintPass() : serial(0) { }
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   virtual bool visit(Function *);
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   virtual bool visit(BasicBlock *);
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   virtual bool visit(Instruction *);
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate:
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int serial;
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPrintPass::visit(Function *fn)
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INFO("\n%s:%i\n", fn->getName(), fn->getLabel());
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPrintPass::visit(BasicBlock *bb)
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INFO("---\n");
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (Graph::EdgeIterator ei = bb->cfg.incident(); !ei.end(); ei.next())
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INFO(" <- BB:%i (%s)\n",
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           BasicBlock::get(ei.getNode())->getId(),
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           ei.getEdge()->typeStr());
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INFO("BB:%i (%u instructions) - ", bb->getId(), bb->getInsnCount());
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (bb->idom())
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INFO("idom = BB:%i, ", bb->idom()->getId());
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INFO("df = { ");
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (DLList::Iterator df = bb->getDF().iterator(); !df.end(); df.next())
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INFO("BB:%i ", BasicBlock::get(df)->getId());
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INFO("}\n");
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (Graph::EdgeIterator ei = bb->cfg.outgoing(); !ei.end(); ei.next())
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INFO(" -> BB:%i (%s)\n",
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           BasicBlock::get(ei.getNode())->getId(),
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           ei.getEdge()->typeStr());
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPrintPass::visit(Instruction *insn)
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INFO("%3i: ", serial++);
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   insn->print();
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFunction::print()
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PrintPass pass;
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pass.run(this, true, false);
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgProgram::print()
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PrintPass pass;
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_colours();
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pass.run(this, true, false);
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFunction::printLiveIntervals() const
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INFO("printing live intervals ...\n");
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (ArrayList::Iterator it = allLValues.iterator(); !it.end(); it.next()) {
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const Value *lval = Value::get(it)->asLValue();
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (lval && !lval->livei.isEmpty()) {
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         INFO("livei(%%%i): ", lval->id);
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         lval->livei.print();
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // namespace nv50_ir
653