1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2013 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker *
4*d83cc019SAndroid Build Coastguard Worker * Permission to use, copy, modify, distribute, and sell this software and its
5*d83cc019SAndroid Build Coastguard Worker * documentation for any purpose is hereby granted without fee, provided that
6*d83cc019SAndroid Build Coastguard Worker * the above copyright notice appear in all copies and that both that copyright
7*d83cc019SAndroid Build Coastguard Worker * notice and this permission notice appear in supporting documentation, and
8*d83cc019SAndroid Build Coastguard Worker * that the name of the copyright holders not be used in advertising or
9*d83cc019SAndroid Build Coastguard Worker * publicity pertaining to distribution of the software without specific,
10*d83cc019SAndroid Build Coastguard Worker * written prior permission. The copyright holders make no representations
11*d83cc019SAndroid Build Coastguard Worker * about the suitability of this software for any purpose. It is provided "as
12*d83cc019SAndroid Build Coastguard Worker * is" without express or implied warranty.
13*d83cc019SAndroid Build Coastguard Worker *
14*d83cc019SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15*d83cc019SAndroid Build Coastguard Worker * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16*d83cc019SAndroid Build Coastguard Worker * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17*d83cc019SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18*d83cc019SAndroid Build Coastguard Worker * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19*d83cc019SAndroid Build Coastguard Worker * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
20*d83cc019SAndroid Build Coastguard Worker * OF THIS SOFTWARE.
21*d83cc019SAndroid Build Coastguard Worker */
22*d83cc019SAndroid Build Coastguard Worker
23*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
24*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
25*d83cc019SAndroid Build Coastguard Worker #include <string.h>
26*d83cc019SAndroid Build Coastguard Worker #include <getopt.h>
27*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
28*d83cc019SAndroid Build Coastguard Worker #include <stdarg.h>
29*d83cc019SAndroid Build Coastguard Worker
30*d83cc019SAndroid Build Coastguard Worker #include "brw_context.h"
31*d83cc019SAndroid Build Coastguard Worker #include "brw_defines.h"
32*d83cc019SAndroid Build Coastguard Worker #include "gen8_instruction.h"
33*d83cc019SAndroid Build Coastguard Worker
34*d83cc019SAndroid Build Coastguard Worker static const struct opcode_desc *m_opcode = opcode_descs;
35*d83cc019SAndroid Build Coastguard Worker
36*d83cc019SAndroid Build Coastguard Worker static const char *const m_conditional_modifier[16] = {
37*d83cc019SAndroid Build Coastguard Worker /* [0 - BRW_CONDITIONAL_NONE] */ "",
38*d83cc019SAndroid Build Coastguard Worker /* [1 - BRW_CONDITIONAL_Z] */ ".e",
39*d83cc019SAndroid Build Coastguard Worker /* [2 - BRW_CONDITIONAL_NZ] */ ".ne",
40*d83cc019SAndroid Build Coastguard Worker /* [3 - BRW_CONDITIONAL_G] */ ".g",
41*d83cc019SAndroid Build Coastguard Worker /* [4 - BRW_CONDITIONAL_GE] */ ".ge",
42*d83cc019SAndroid Build Coastguard Worker /* [5 - BRW_CONDITIONAL_L] */ ".l",
43*d83cc019SAndroid Build Coastguard Worker /* [6 - BRW_CONDITIONAL_LE] */ ".le",
44*d83cc019SAndroid Build Coastguard Worker /* [7 - Reserved] */ NULL,
45*d83cc019SAndroid Build Coastguard Worker /* [8 - BRW_CONDITIONAL_O] */ ".o",
46*d83cc019SAndroid Build Coastguard Worker /* [9 - BRW_CONDITIONAL_U] */ ".u",
47*d83cc019SAndroid Build Coastguard Worker /* [a-f - Reserved] */
48*d83cc019SAndroid Build Coastguard Worker };
49*d83cc019SAndroid Build Coastguard Worker
50*d83cc019SAndroid Build Coastguard Worker static const char *const m_negate[2] = { "", "-" };
51*d83cc019SAndroid Build Coastguard Worker
52*d83cc019SAndroid Build Coastguard Worker static const char *const m_abs[2] = { "", "(abs)" };
53*d83cc019SAndroid Build Coastguard Worker
54*d83cc019SAndroid Build Coastguard Worker static const char *const m_vert_stride[16] = {
55*d83cc019SAndroid Build Coastguard Worker "0",
56*d83cc019SAndroid Build Coastguard Worker "1",
57*d83cc019SAndroid Build Coastguard Worker "2",
58*d83cc019SAndroid Build Coastguard Worker "4",
59*d83cc019SAndroid Build Coastguard Worker "8",
60*d83cc019SAndroid Build Coastguard Worker "16",
61*d83cc019SAndroid Build Coastguard Worker "32",
62*d83cc019SAndroid Build Coastguard Worker };
63*d83cc019SAndroid Build Coastguard Worker
64*d83cc019SAndroid Build Coastguard Worker static const char *const width[8] = {
65*d83cc019SAndroid Build Coastguard Worker "1",
66*d83cc019SAndroid Build Coastguard Worker "2",
67*d83cc019SAndroid Build Coastguard Worker "4",
68*d83cc019SAndroid Build Coastguard Worker "8",
69*d83cc019SAndroid Build Coastguard Worker "16",
70*d83cc019SAndroid Build Coastguard Worker };
71*d83cc019SAndroid Build Coastguard Worker
72*d83cc019SAndroid Build Coastguard Worker static const char *const m_horiz_stride[4] = {
73*d83cc019SAndroid Build Coastguard Worker "0",
74*d83cc019SAndroid Build Coastguard Worker "1",
75*d83cc019SAndroid Build Coastguard Worker "2",
76*d83cc019SAndroid Build Coastguard Worker "4"
77*d83cc019SAndroid Build Coastguard Worker };
78*d83cc019SAndroid Build Coastguard Worker
79*d83cc019SAndroid Build Coastguard Worker static const char *const m_chan_sel[4] = { "x", "y", "z", "w" };
80*d83cc019SAndroid Build Coastguard Worker
81*d83cc019SAndroid Build Coastguard Worker static const char *const m_debug_ctrl[2] = { "", ".breakpoint" };
82*d83cc019SAndroid Build Coastguard Worker
83*d83cc019SAndroid Build Coastguard Worker static const char *const m_saturate[2] = { "", ".sat" };
84*d83cc019SAndroid Build Coastguard Worker
85*d83cc019SAndroid Build Coastguard Worker static const char *const m_accwr[2] = { "", "AccWrEnable" };
86*d83cc019SAndroid Build Coastguard Worker
87*d83cc019SAndroid Build Coastguard Worker static const char *const m_maskctrl[2] = { "WE_normal", "WE_all" };
88*d83cc019SAndroid Build Coastguard Worker
89*d83cc019SAndroid Build Coastguard Worker static const char *const m_exec_size[8] = {
90*d83cc019SAndroid Build Coastguard Worker "1",
91*d83cc019SAndroid Build Coastguard Worker "2",
92*d83cc019SAndroid Build Coastguard Worker "4",
93*d83cc019SAndroid Build Coastguard Worker "8",
94*d83cc019SAndroid Build Coastguard Worker "16",
95*d83cc019SAndroid Build Coastguard Worker "32",
96*d83cc019SAndroid Build Coastguard Worker };
97*d83cc019SAndroid Build Coastguard Worker
98*d83cc019SAndroid Build Coastguard Worker static const char *const m_pred_inv[2] = { "+", "-" };
99*d83cc019SAndroid Build Coastguard Worker
100*d83cc019SAndroid Build Coastguard Worker static const char *const m_pred_ctrl_align16[16] = {
101*d83cc019SAndroid Build Coastguard Worker "",
102*d83cc019SAndroid Build Coastguard Worker "",
103*d83cc019SAndroid Build Coastguard Worker ".x",
104*d83cc019SAndroid Build Coastguard Worker ".y",
105*d83cc019SAndroid Build Coastguard Worker ".z",
106*d83cc019SAndroid Build Coastguard Worker ".w",
107*d83cc019SAndroid Build Coastguard Worker ".any4h",
108*d83cc019SAndroid Build Coastguard Worker ".all4h",
109*d83cc019SAndroid Build Coastguard Worker };
110*d83cc019SAndroid Build Coastguard Worker
111*d83cc019SAndroid Build Coastguard Worker static const char *const m_pred_ctrl_align1[16] = {
112*d83cc019SAndroid Build Coastguard Worker "",
113*d83cc019SAndroid Build Coastguard Worker "",
114*d83cc019SAndroid Build Coastguard Worker ".anyv",
115*d83cc019SAndroid Build Coastguard Worker ".allv",
116*d83cc019SAndroid Build Coastguard Worker ".any2h",
117*d83cc019SAndroid Build Coastguard Worker ".all2h",
118*d83cc019SAndroid Build Coastguard Worker ".any4h",
119*d83cc019SAndroid Build Coastguard Worker ".all4h",
120*d83cc019SAndroid Build Coastguard Worker ".any8h",
121*d83cc019SAndroid Build Coastguard Worker ".all8h",
122*d83cc019SAndroid Build Coastguard Worker ".any16h",
123*d83cc019SAndroid Build Coastguard Worker ".all16h",
124*d83cc019SAndroid Build Coastguard Worker ".any32h",
125*d83cc019SAndroid Build Coastguard Worker ".all32h",
126*d83cc019SAndroid Build Coastguard Worker };
127*d83cc019SAndroid Build Coastguard Worker
128*d83cc019SAndroid Build Coastguard Worker static const char *const m_thread_ctrl[4] = {
129*d83cc019SAndroid Build Coastguard Worker "",
130*d83cc019SAndroid Build Coastguard Worker "atomic",
131*d83cc019SAndroid Build Coastguard Worker "switch",
132*d83cc019SAndroid Build Coastguard Worker };
133*d83cc019SAndroid Build Coastguard Worker
134*d83cc019SAndroid Build Coastguard Worker static const char *const m_dep_ctrl[4] = {
135*d83cc019SAndroid Build Coastguard Worker "",
136*d83cc019SAndroid Build Coastguard Worker "NoDDClr",
137*d83cc019SAndroid Build Coastguard Worker "NoDDChk",
138*d83cc019SAndroid Build Coastguard Worker "NoDDClr,NoDDChk",
139*d83cc019SAndroid Build Coastguard Worker };
140*d83cc019SAndroid Build Coastguard Worker
141*d83cc019SAndroid Build Coastguard Worker static const char *const m_access_mode[2] = { "align1", "align16" };
142*d83cc019SAndroid Build Coastguard Worker
143*d83cc019SAndroid Build Coastguard Worker static const char *const m_reg_type[8] = {
144*d83cc019SAndroid Build Coastguard Worker "UD",
145*d83cc019SAndroid Build Coastguard Worker "D",
146*d83cc019SAndroid Build Coastguard Worker "UW",
147*d83cc019SAndroid Build Coastguard Worker "W",
148*d83cc019SAndroid Build Coastguard Worker "UB",
149*d83cc019SAndroid Build Coastguard Worker "B",
150*d83cc019SAndroid Build Coastguard Worker "DF",
151*d83cc019SAndroid Build Coastguard Worker "F",
152*d83cc019SAndroid Build Coastguard Worker };
153*d83cc019SAndroid Build Coastguard Worker
154*d83cc019SAndroid Build Coastguard Worker static const int reg_type_size[8] = {
155*d83cc019SAndroid Build Coastguard Worker /* UD */ 4,
156*d83cc019SAndroid Build Coastguard Worker /* D */ 4,
157*d83cc019SAndroid Build Coastguard Worker /* UW */ 2,
158*d83cc019SAndroid Build Coastguard Worker /* W */ 2,
159*d83cc019SAndroid Build Coastguard Worker /* UB */ 1,
160*d83cc019SAndroid Build Coastguard Worker /* B */ 1,
161*d83cc019SAndroid Build Coastguard Worker /* DF */ 8,
162*d83cc019SAndroid Build Coastguard Worker /* F */ 4,
163*d83cc019SAndroid Build Coastguard Worker };
164*d83cc019SAndroid Build Coastguard Worker
165*d83cc019SAndroid Build Coastguard Worker static const char *const m_reg_file[4] = {
166*d83cc019SAndroid Build Coastguard Worker "A",
167*d83cc019SAndroid Build Coastguard Worker "g",
168*d83cc019SAndroid Build Coastguard Worker NULL,
169*d83cc019SAndroid Build Coastguard Worker "imm",
170*d83cc019SAndroid Build Coastguard Worker };
171*d83cc019SAndroid Build Coastguard Worker
172*d83cc019SAndroid Build Coastguard Worker static const char *const m_writemask[16] = {
173*d83cc019SAndroid Build Coastguard Worker ".(none)",
174*d83cc019SAndroid Build Coastguard Worker ".x",
175*d83cc019SAndroid Build Coastguard Worker ".y",
176*d83cc019SAndroid Build Coastguard Worker ".xy",
177*d83cc019SAndroid Build Coastguard Worker ".z",
178*d83cc019SAndroid Build Coastguard Worker ".xz",
179*d83cc019SAndroid Build Coastguard Worker ".yz",
180*d83cc019SAndroid Build Coastguard Worker ".xyz",
181*d83cc019SAndroid Build Coastguard Worker ".w",
182*d83cc019SAndroid Build Coastguard Worker ".xw",
183*d83cc019SAndroid Build Coastguard Worker ".yw",
184*d83cc019SAndroid Build Coastguard Worker ".xyw",
185*d83cc019SAndroid Build Coastguard Worker ".zw",
186*d83cc019SAndroid Build Coastguard Worker ".xzw",
187*d83cc019SAndroid Build Coastguard Worker ".yzw",
188*d83cc019SAndroid Build Coastguard Worker "",
189*d83cc019SAndroid Build Coastguard Worker };
190*d83cc019SAndroid Build Coastguard Worker
191*d83cc019SAndroid Build Coastguard Worker static const char *const m_eot[2] = { "", "EOT" };
192*d83cc019SAndroid Build Coastguard Worker
193*d83cc019SAndroid Build Coastguard Worker static const char *const m_sfid[16] = {
194*d83cc019SAndroid Build Coastguard Worker /* [0 - BRW_SFID_NULL] */ "null",
195*d83cc019SAndroid Build Coastguard Worker /* [1 - Reserved] */ NULL,
196*d83cc019SAndroid Build Coastguard Worker /* [2 - BRW_SFID_SAMPLER] */ "sampler",
197*d83cc019SAndroid Build Coastguard Worker /* [3 - BRW_SFID_MESSAGE_GATEWAY] */ "gateway",
198*d83cc019SAndroid Build Coastguard Worker /* [4 - GEN6_SFID_DATAPORT_SAMPLER_CACHE] */ "dp/sampler_cache",
199*d83cc019SAndroid Build Coastguard Worker /* [5 - GEN6_SFID_DATAPORT_RENDER_CACHE] */ "dp/render_cache",
200*d83cc019SAndroid Build Coastguard Worker /* [6 - BRW_SFID_URB] */ "URB",
201*d83cc019SAndroid Build Coastguard Worker /* [7 - BRW_SFID_THREAD_SPAWNER] */ "thread_spawner",
202*d83cc019SAndroid Build Coastguard Worker /* [8 - BRW_SFID_VME] */ "vme",
203*d83cc019SAndroid Build Coastguard Worker /* [9 - GEN6_SFID_DATAPORT_CONSTANT_CACHE] */ "dp/constant_cache",
204*d83cc019SAndroid Build Coastguard Worker /* [a - GEN7_SFID_DATAPORT_DATA_CACHE] */ "dp/data_cache",
205*d83cc019SAndroid Build Coastguard Worker /* [b - GEN7_SFID_PI] */ "pi",
206*d83cc019SAndroid Build Coastguard Worker /* [c - HSW_SFID_DATAPORT_DATA_CACHE_1] */ "dp/data_cache:1",
207*d83cc019SAndroid Build Coastguard Worker /* [d - HSW_SFID_CRE] */ "cre",
208*d83cc019SAndroid Build Coastguard Worker /* [e-f - Reserved */ NULL, NULL,
209*d83cc019SAndroid Build Coastguard Worker };
210*d83cc019SAndroid Build Coastguard Worker
211*d83cc019SAndroid Build Coastguard Worker #if 0
212*d83cc019SAndroid Build Coastguard Worker static const char *const dp_rc_msg_type[16] = {
213*d83cc019SAndroid Build Coastguard Worker [BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ] = "OWORD block read",
214*d83cc019SAndroid Build Coastguard Worker [GEN6_DATAPORT_READ_MESSAGE_RENDER_UNORM_READ] = "RT UNORM read",
215*d83cc019SAndroid Build Coastguard Worker [GEN6_DATAPORT_READ_MESSAGE_OWORD_DUAL_BLOCK_READ] = "OWORD dual block read",
216*d83cc019SAndroid Build Coastguard Worker [GEN6_DATAPORT_READ_MESSAGE_MEDIA_BLOCK_READ] = "media block read",
217*d83cc019SAndroid Build Coastguard Worker [GEN6_DATAPORT_READ_MESSAGE_OWORD_UNALIGN_BLOCK_READ] = "OWORD unaligned block read",
218*d83cc019SAndroid Build Coastguard Worker [GEN6_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ] = "DWORD scattered read",
219*d83cc019SAndroid Build Coastguard Worker [GEN6_DATAPORT_WRITE_MESSAGE_DWORD_ATOMIC_WRITE] = "DWORD atomic write",
220*d83cc019SAndroid Build Coastguard Worker [GEN6_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE] = "OWORD block write",
221*d83cc019SAndroid Build Coastguard Worker [GEN6_DATAPORT_WRITE_MESSAGE_OWORD_DUAL_BLOCK_WRITE] = "OWORD dual block write",
222*d83cc019SAndroid Build Coastguard Worker [GEN6_DATAPORT_WRITE_MESSAGE_MEDIA_BLOCK_WRITE] = "media block write",
223*d83cc019SAndroid Build Coastguard Worker [GEN6_DATAPORT_WRITE_MESSAGE_DWORD_SCATTERED_WRITE] = "DWORD scattered write",
224*d83cc019SAndroid Build Coastguard Worker [GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE] = "RT write",
225*d83cc019SAndroid Build Coastguard Worker [GEN6_DATAPORT_WRITE_MESSAGE_STREAMED_VB_WRITE] = "streamed VB write",
226*d83cc019SAndroid Build Coastguard Worker [GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_UNORM_WRITE] = "RT UNORMc write",
227*d83cc019SAndroid Build Coastguard Worker };
228*d83cc019SAndroid Build Coastguard Worker #endif
229*d83cc019SAndroid Build Coastguard Worker
230*d83cc019SAndroid Build Coastguard Worker static const char *const m_math_function[16] = {
231*d83cc019SAndroid Build Coastguard Worker /* [0 - Reserved] */ NULL,
232*d83cc019SAndroid Build Coastguard Worker /* [1 - BRW_MATH_FUNCTION_INV] */ "inv",
233*d83cc019SAndroid Build Coastguard Worker /* [2 - BRW_MATH_FUNCTION_LOG] */ "log",
234*d83cc019SAndroid Build Coastguard Worker /* [3 - BRW_MATH_FUNCTION_EXP] */ "exp",
235*d83cc019SAndroid Build Coastguard Worker /* [4 - BRW_MATH_FUNCTION_SQRT] */ "sqrt",
236*d83cc019SAndroid Build Coastguard Worker /* [5 - BRW_MATH_FUNCTION_RSQ] */ "rsq",
237*d83cc019SAndroid Build Coastguard Worker /* [6 - BRW_MATH_FUNCTION_SIN] */ "sin",
238*d83cc019SAndroid Build Coastguard Worker /* [7 - BRW_MATH_FUNCTION_COS] */ "cos",
239*d83cc019SAndroid Build Coastguard Worker /* [8 - Reserved] */ NULL,
240*d83cc019SAndroid Build Coastguard Worker /* [9 - BRW_MATH_FUNCTION_FDIV] */ "fdiv",
241*d83cc019SAndroid Build Coastguard Worker /* [a - BRW_MATH_FUNCTION_POW] */ "pow",
242*d83cc019SAndroid Build Coastguard Worker /* [b - BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER] */ "intdivmod",
243*d83cc019SAndroid Build Coastguard Worker /* [c - BRW_MATH_FUNCTION_INT_DIV_QUOTIENT] */ "intdiv",
244*d83cc019SAndroid Build Coastguard Worker /* [d - BRW_MATH_FUNCTION_INT_DIV_REMAINDER] */ "intmod",
245*d83cc019SAndroid Build Coastguard Worker /* [e - GEN8_MATH_FUNCTION_INVM] */ "invm",
246*d83cc019SAndroid Build Coastguard Worker /* [f - GEN8_MATH_FUNCTION_RSQRTM] */ "rsqrtm",
247*d83cc019SAndroid Build Coastguard Worker };
248*d83cc019SAndroid Build Coastguard Worker
249*d83cc019SAndroid Build Coastguard Worker static const char *const m_urb_opcode[16] = {
250*d83cc019SAndroid Build Coastguard Worker /* [0] */ "write HWord",
251*d83cc019SAndroid Build Coastguard Worker /* [1] */ "write OWord",
252*d83cc019SAndroid Build Coastguard Worker /* [2] */ "read HWord",
253*d83cc019SAndroid Build Coastguard Worker /* [3] */ "read OWord",
254*d83cc019SAndroid Build Coastguard Worker /* [4] */ "atomic mov",
255*d83cc019SAndroid Build Coastguard Worker /* [5] */ "atomic inc",
256*d83cc019SAndroid Build Coastguard Worker /* [6] */ "atomic add",
257*d83cc019SAndroid Build Coastguard Worker /* [7] */ "SIMD8 write",
258*d83cc019SAndroid Build Coastguard Worker /* [8] */ "SIMD8 read",
259*d83cc019SAndroid Build Coastguard Worker /* [9-15] - reserved */
260*d83cc019SAndroid Build Coastguard Worker };
261*d83cc019SAndroid Build Coastguard Worker
262*d83cc019SAndroid Build Coastguard Worker static const char *const m_urb_interleave[2] = { "", "interleaved" };
263*d83cc019SAndroid Build Coastguard Worker
264*d83cc019SAndroid Build Coastguard Worker static int column;
265*d83cc019SAndroid Build Coastguard Worker
266*d83cc019SAndroid Build Coastguard Worker static int
string(FILE * file,const char * string)267*d83cc019SAndroid Build Coastguard Worker string(FILE *file, const char *string)
268*d83cc019SAndroid Build Coastguard Worker {
269*d83cc019SAndroid Build Coastguard Worker fputs(string, file);
270*d83cc019SAndroid Build Coastguard Worker column += strlen(string);
271*d83cc019SAndroid Build Coastguard Worker return 0;
272*d83cc019SAndroid Build Coastguard Worker }
273*d83cc019SAndroid Build Coastguard Worker
274*d83cc019SAndroid Build Coastguard Worker static int
format(FILE * f,const char * format,...)275*d83cc019SAndroid Build Coastguard Worker format(FILE *f, const char *format, ...)
276*d83cc019SAndroid Build Coastguard Worker {
277*d83cc019SAndroid Build Coastguard Worker char buf[1024];
278*d83cc019SAndroid Build Coastguard Worker va_list args;
279*d83cc019SAndroid Build Coastguard Worker va_start(args, format);
280*d83cc019SAndroid Build Coastguard Worker
281*d83cc019SAndroid Build Coastguard Worker vsnprintf(buf, sizeof(buf) - 1, format, args);
282*d83cc019SAndroid Build Coastguard Worker va_end(args);
283*d83cc019SAndroid Build Coastguard Worker string(f, buf);
284*d83cc019SAndroid Build Coastguard Worker return 0;
285*d83cc019SAndroid Build Coastguard Worker }
286*d83cc019SAndroid Build Coastguard Worker
287*d83cc019SAndroid Build Coastguard Worker static int
newline(FILE * f)288*d83cc019SAndroid Build Coastguard Worker newline(FILE *f)
289*d83cc019SAndroid Build Coastguard Worker {
290*d83cc019SAndroid Build Coastguard Worker putc('\n', f);
291*d83cc019SAndroid Build Coastguard Worker column = 0;
292*d83cc019SAndroid Build Coastguard Worker return 0;
293*d83cc019SAndroid Build Coastguard Worker }
294*d83cc019SAndroid Build Coastguard Worker
295*d83cc019SAndroid Build Coastguard Worker static int
pad(FILE * f,int c)296*d83cc019SAndroid Build Coastguard Worker pad(FILE *f, int c)
297*d83cc019SAndroid Build Coastguard Worker {
298*d83cc019SAndroid Build Coastguard Worker do
299*d83cc019SAndroid Build Coastguard Worker string(f, " ");
300*d83cc019SAndroid Build Coastguard Worker while (column < c);
301*d83cc019SAndroid Build Coastguard Worker return 0;
302*d83cc019SAndroid Build Coastguard Worker }
303*d83cc019SAndroid Build Coastguard Worker
304*d83cc019SAndroid Build Coastguard Worker static int
control(FILE * file,const char * name,const char * const ctrl[],unsigned id,int * space)305*d83cc019SAndroid Build Coastguard Worker control(FILE *file, const char *name, const char *const ctrl[],
306*d83cc019SAndroid Build Coastguard Worker unsigned id, int *space)
307*d83cc019SAndroid Build Coastguard Worker {
308*d83cc019SAndroid Build Coastguard Worker if (!ctrl[id]) {
309*d83cc019SAndroid Build Coastguard Worker fprintf(file, "*** invalid %s value %d ", name, id);
310*d83cc019SAndroid Build Coastguard Worker return 1;
311*d83cc019SAndroid Build Coastguard Worker }
312*d83cc019SAndroid Build Coastguard Worker if (ctrl[id][0])
313*d83cc019SAndroid Build Coastguard Worker {
314*d83cc019SAndroid Build Coastguard Worker if (space && *space)
315*d83cc019SAndroid Build Coastguard Worker string(file, " ");
316*d83cc019SAndroid Build Coastguard Worker string(file, ctrl[id]);
317*d83cc019SAndroid Build Coastguard Worker if (space)
318*d83cc019SAndroid Build Coastguard Worker *space = 1;
319*d83cc019SAndroid Build Coastguard Worker }
320*d83cc019SAndroid Build Coastguard Worker return 0;
321*d83cc019SAndroid Build Coastguard Worker }
322*d83cc019SAndroid Build Coastguard Worker
323*d83cc019SAndroid Build Coastguard Worker static int
print_opcode(FILE * file,int id)324*d83cc019SAndroid Build Coastguard Worker print_opcode(FILE *file, int id)
325*d83cc019SAndroid Build Coastguard Worker {
326*d83cc019SAndroid Build Coastguard Worker if (!m_opcode[id].name) {
327*d83cc019SAndroid Build Coastguard Worker format(file, "*** invalid opcode value %d ", id);
328*d83cc019SAndroid Build Coastguard Worker return 1;
329*d83cc019SAndroid Build Coastguard Worker }
330*d83cc019SAndroid Build Coastguard Worker string(file, m_opcode[id].name);
331*d83cc019SAndroid Build Coastguard Worker return 0;
332*d83cc019SAndroid Build Coastguard Worker }
333*d83cc019SAndroid Build Coastguard Worker
334*d83cc019SAndroid Build Coastguard Worker static int
reg(FILE * file,unsigned reg_file,unsigned _reg_nr)335*d83cc019SAndroid Build Coastguard Worker reg(FILE *file, unsigned reg_file, unsigned _reg_nr)
336*d83cc019SAndroid Build Coastguard Worker {
337*d83cc019SAndroid Build Coastguard Worker int err = 0;
338*d83cc019SAndroid Build Coastguard Worker
339*d83cc019SAndroid Build Coastguard Worker if (reg_file == BRW_ARCHITECTURE_REGISTER_FILE) {
340*d83cc019SAndroid Build Coastguard Worker switch (_reg_nr & 0xf0) {
341*d83cc019SAndroid Build Coastguard Worker case BRW_ARF_NULL:
342*d83cc019SAndroid Build Coastguard Worker string(file, "null");
343*d83cc019SAndroid Build Coastguard Worker return -1;
344*d83cc019SAndroid Build Coastguard Worker case BRW_ARF_ADDRESS:
345*d83cc019SAndroid Build Coastguard Worker format(file, "a%d", _reg_nr & 0x0f);
346*d83cc019SAndroid Build Coastguard Worker break;
347*d83cc019SAndroid Build Coastguard Worker case BRW_ARF_ACCUMULATOR:
348*d83cc019SAndroid Build Coastguard Worker format(file, "acc%d", _reg_nr & 0x0f);
349*d83cc019SAndroid Build Coastguard Worker break;
350*d83cc019SAndroid Build Coastguard Worker case BRW_ARF_FLAG:
351*d83cc019SAndroid Build Coastguard Worker format(file, "f%d", _reg_nr & 0x0f);
352*d83cc019SAndroid Build Coastguard Worker break;
353*d83cc019SAndroid Build Coastguard Worker case BRW_ARF_MASK:
354*d83cc019SAndroid Build Coastguard Worker format(file, "mask%d", _reg_nr & 0x0f);
355*d83cc019SAndroid Build Coastguard Worker break;
356*d83cc019SAndroid Build Coastguard Worker case BRW_ARF_MASK_STACK:
357*d83cc019SAndroid Build Coastguard Worker format(file, "msd%d", _reg_nr & 0x0f);
358*d83cc019SAndroid Build Coastguard Worker break;
359*d83cc019SAndroid Build Coastguard Worker case BRW_ARF_STATE:
360*d83cc019SAndroid Build Coastguard Worker format(file, "sr%d", _reg_nr & 0x0f);
361*d83cc019SAndroid Build Coastguard Worker break;
362*d83cc019SAndroid Build Coastguard Worker case BRW_ARF_CONTROL:
363*d83cc019SAndroid Build Coastguard Worker format(file, "cr%d", _reg_nr & 0x0f);
364*d83cc019SAndroid Build Coastguard Worker break;
365*d83cc019SAndroid Build Coastguard Worker case BRW_ARF_NOTIFICATION_COUNT:
366*d83cc019SAndroid Build Coastguard Worker format(file, "n%d", _reg_nr & 0x0f);
367*d83cc019SAndroid Build Coastguard Worker break;
368*d83cc019SAndroid Build Coastguard Worker case BRW_ARF_IP:
369*d83cc019SAndroid Build Coastguard Worker string(file, "ip");
370*d83cc019SAndroid Build Coastguard Worker return -1;
371*d83cc019SAndroid Build Coastguard Worker break;
372*d83cc019SAndroid Build Coastguard Worker default:
373*d83cc019SAndroid Build Coastguard Worker format(file, "ARF%d", _reg_nr);
374*d83cc019SAndroid Build Coastguard Worker break;
375*d83cc019SAndroid Build Coastguard Worker }
376*d83cc019SAndroid Build Coastguard Worker } else {
377*d83cc019SAndroid Build Coastguard Worker err |= control(file, "src reg file", m_reg_file, reg_file, NULL);
378*d83cc019SAndroid Build Coastguard Worker format(file, "%d", _reg_nr);
379*d83cc019SAndroid Build Coastguard Worker }
380*d83cc019SAndroid Build Coastguard Worker return err;
381*d83cc019SAndroid Build Coastguard Worker }
382*d83cc019SAndroid Build Coastguard Worker
383*d83cc019SAndroid Build Coastguard Worker static int
dest(FILE * file,struct gen8_instruction * inst)384*d83cc019SAndroid Build Coastguard Worker dest(FILE *file, struct gen8_instruction *inst)
385*d83cc019SAndroid Build Coastguard Worker {
386*d83cc019SAndroid Build Coastguard Worker int err = 0;
387*d83cc019SAndroid Build Coastguard Worker
388*d83cc019SAndroid Build Coastguard Worker if (gen8_access_mode(inst) == BRW_ALIGN_1)
389*d83cc019SAndroid Build Coastguard Worker {
390*d83cc019SAndroid Build Coastguard Worker assert(gen8_dst_address_mode(inst) == BRW_ADDRESS_DIRECT);
391*d83cc019SAndroid Build Coastguard Worker err |= reg(file, gen8_dst_reg_file(inst), gen8_dst_da_reg_nr(inst));
392*d83cc019SAndroid Build Coastguard Worker if (err == -1)
393*d83cc019SAndroid Build Coastguard Worker return 0;
394*d83cc019SAndroid Build Coastguard Worker if (gen8_dst_da1_subreg_nr(inst))
395*d83cc019SAndroid Build Coastguard Worker format(file, ".%d", gen8_dst_da1_subreg_nr(inst) /
396*d83cc019SAndroid Build Coastguard Worker reg_type_size[gen8_dst_reg_type(inst)]);
397*d83cc019SAndroid Build Coastguard Worker string(file, "<");
398*d83cc019SAndroid Build Coastguard Worker err |= control(file, "horiz stride", m_horiz_stride, gen8_dst_da1_hstride(inst), NULL);
399*d83cc019SAndroid Build Coastguard Worker string(file, ">");
400*d83cc019SAndroid Build Coastguard Worker err |= control(file, "dest reg encoding", m_reg_type, gen8_dst_reg_type(inst), NULL);
401*d83cc019SAndroid Build Coastguard Worker }
402*d83cc019SAndroid Build Coastguard Worker else
403*d83cc019SAndroid Build Coastguard Worker {
404*d83cc019SAndroid Build Coastguard Worker assert(gen8_dst_address_mode(inst) == BRW_ADDRESS_DIRECT);
405*d83cc019SAndroid Build Coastguard Worker err |= reg(file, gen8_dst_reg_file(inst), gen8_dst_da_reg_nr(inst));
406*d83cc019SAndroid Build Coastguard Worker if (err == -1)
407*d83cc019SAndroid Build Coastguard Worker return 0;
408*d83cc019SAndroid Build Coastguard Worker if (gen8_dst_da16_subreg_nr(inst))
409*d83cc019SAndroid Build Coastguard Worker format(file, ".%d", gen8_dst_da16_subreg_nr(inst) /
410*d83cc019SAndroid Build Coastguard Worker reg_type_size[gen8_dst_reg_type(inst)]);
411*d83cc019SAndroid Build Coastguard Worker string(file, "<1>");
412*d83cc019SAndroid Build Coastguard Worker err |= control(file, "writemask", m_writemask, gen8_da16_writemask(inst), NULL);
413*d83cc019SAndroid Build Coastguard Worker err |= control(file, "dest reg encoding", m_reg_type, gen8_dst_reg_type(inst), NULL);
414*d83cc019SAndroid Build Coastguard Worker }
415*d83cc019SAndroid Build Coastguard Worker
416*d83cc019SAndroid Build Coastguard Worker return 0;
417*d83cc019SAndroid Build Coastguard Worker }
418*d83cc019SAndroid Build Coastguard Worker
419*d83cc019SAndroid Build Coastguard Worker #if 0
420*d83cc019SAndroid Build Coastguard Worker static int
421*d83cc019SAndroid Build Coastguard Worker dest_3src(FILE *file, gen8_instruction *inst)
422*d83cc019SAndroid Build Coastguard Worker {
423*d83cc019SAndroid Build Coastguard Worker int err = 0;
424*d83cc019SAndroid Build Coastguard Worker uint32_t reg_file;
425*d83cc019SAndroid Build Coastguard Worker
426*d83cc019SAndroid Build Coastguard Worker if (inst->bits1.da3src.dest_reg_file)
427*d83cc019SAndroid Build Coastguard Worker reg_file = BRW_MESSAGE_REGISTER_FILE;
428*d83cc019SAndroid Build Coastguard Worker else
429*d83cc019SAndroid Build Coastguard Worker reg_file = BRW_GENERAL_REGISTER_FILE;
430*d83cc019SAndroid Build Coastguard Worker
431*d83cc019SAndroid Build Coastguard Worker err |= reg(file, reg_file, inst->bits1.da3src.dest_reg_nr);
432*d83cc019SAndroid Build Coastguard Worker if (err == -1)
433*d83cc019SAndroid Build Coastguard Worker return 0;
434*d83cc019SAndroid Build Coastguard Worker if (inst->bits1.da3src.dest_subreg_nr)
435*d83cc019SAndroid Build Coastguard Worker format(file, ".%d", inst->bits1.da3src.dest_subreg_nr);
436*d83cc019SAndroid Build Coastguard Worker string(file, "<1>");
437*d83cc019SAndroid Build Coastguard Worker err |= control(file, "writemask", m_writemask, inst->bits1.da3src.dest_writemask, NULL);
438*d83cc019SAndroid Build Coastguard Worker err |= control(file, "dest reg encoding", m_reg_type, BRW_REGISTER_TYPE_F, NULL);
439*d83cc019SAndroid Build Coastguard Worker
440*d83cc019SAndroid Build Coastguard Worker return 0;
441*d83cc019SAndroid Build Coastguard Worker }
442*d83cc019SAndroid Build Coastguard Worker #endif
443*d83cc019SAndroid Build Coastguard Worker
444*d83cc019SAndroid Build Coastguard Worker static int
src_align1_region(FILE * file,unsigned vert_stride,unsigned _width,unsigned horiz_stride)445*d83cc019SAndroid Build Coastguard Worker src_align1_region(FILE *file, unsigned vert_stride, unsigned _width,
446*d83cc019SAndroid Build Coastguard Worker unsigned horiz_stride)
447*d83cc019SAndroid Build Coastguard Worker {
448*d83cc019SAndroid Build Coastguard Worker int err = 0;
449*d83cc019SAndroid Build Coastguard Worker string(file, "<");
450*d83cc019SAndroid Build Coastguard Worker err |= control(file, "vert stride", m_vert_stride, vert_stride, NULL);
451*d83cc019SAndroid Build Coastguard Worker string(file, ",");
452*d83cc019SAndroid Build Coastguard Worker err |= control(file, "width", width, _width, NULL);
453*d83cc019SAndroid Build Coastguard Worker string(file, ",");
454*d83cc019SAndroid Build Coastguard Worker err |= control(file, "horiz_stride", m_horiz_stride, horiz_stride, NULL);
455*d83cc019SAndroid Build Coastguard Worker string(file, ">");
456*d83cc019SAndroid Build Coastguard Worker return err;
457*d83cc019SAndroid Build Coastguard Worker }
458*d83cc019SAndroid Build Coastguard Worker
459*d83cc019SAndroid Build Coastguard Worker static int
src_da1(FILE * file,unsigned type,unsigned reg_file,unsigned vert_stride,unsigned _width,unsigned horiz_stride,unsigned reg_num,unsigned sub_reg_num,unsigned _abs,unsigned negate)460*d83cc019SAndroid Build Coastguard Worker src_da1(FILE *file, unsigned type, unsigned reg_file,
461*d83cc019SAndroid Build Coastguard Worker unsigned vert_stride, unsigned _width, unsigned horiz_stride,
462*d83cc019SAndroid Build Coastguard Worker unsigned reg_num, unsigned sub_reg_num, unsigned _abs, unsigned negate)
463*d83cc019SAndroid Build Coastguard Worker {
464*d83cc019SAndroid Build Coastguard Worker int err = 0;
465*d83cc019SAndroid Build Coastguard Worker err |= control(file, "negate", m_negate, negate, NULL);
466*d83cc019SAndroid Build Coastguard Worker err |= control(file, "abs", m_abs, _abs, NULL);
467*d83cc019SAndroid Build Coastguard Worker
468*d83cc019SAndroid Build Coastguard Worker err |= reg(file, reg_file, reg_num);
469*d83cc019SAndroid Build Coastguard Worker if (err == -1)
470*d83cc019SAndroid Build Coastguard Worker return 0;
471*d83cc019SAndroid Build Coastguard Worker if (sub_reg_num)
472*d83cc019SAndroid Build Coastguard Worker format(file, ".%d", sub_reg_num / reg_type_size[type]); /* use formal style like spec */
473*d83cc019SAndroid Build Coastguard Worker src_align1_region(file, vert_stride, _width, horiz_stride);
474*d83cc019SAndroid Build Coastguard Worker err |= control(file, "src reg encoding", m_reg_type, type, NULL);
475*d83cc019SAndroid Build Coastguard Worker return err;
476*d83cc019SAndroid Build Coastguard Worker }
477*d83cc019SAndroid Build Coastguard Worker
478*d83cc019SAndroid Build Coastguard Worker static int
src_da16(FILE * file,unsigned _reg_type,unsigned reg_file,unsigned vert_stride,unsigned _reg_nr,unsigned _subreg_nr,unsigned _abs,unsigned negate,unsigned swz_x,unsigned swz_y,unsigned swz_z,unsigned swz_w)479*d83cc019SAndroid Build Coastguard Worker src_da16(FILE *file,
480*d83cc019SAndroid Build Coastguard Worker unsigned _reg_type,
481*d83cc019SAndroid Build Coastguard Worker unsigned reg_file,
482*d83cc019SAndroid Build Coastguard Worker unsigned vert_stride,
483*d83cc019SAndroid Build Coastguard Worker unsigned _reg_nr,
484*d83cc019SAndroid Build Coastguard Worker unsigned _subreg_nr,
485*d83cc019SAndroid Build Coastguard Worker unsigned _abs,
486*d83cc019SAndroid Build Coastguard Worker unsigned negate,
487*d83cc019SAndroid Build Coastguard Worker unsigned swz_x,
488*d83cc019SAndroid Build Coastguard Worker unsigned swz_y,
489*d83cc019SAndroid Build Coastguard Worker unsigned swz_z,
490*d83cc019SAndroid Build Coastguard Worker unsigned swz_w)
491*d83cc019SAndroid Build Coastguard Worker {
492*d83cc019SAndroid Build Coastguard Worker int err = 0;
493*d83cc019SAndroid Build Coastguard Worker err |= control(file, "negate", m_negate, negate, NULL);
494*d83cc019SAndroid Build Coastguard Worker err |= control(file, "abs", m_abs, _abs, NULL);
495*d83cc019SAndroid Build Coastguard Worker
496*d83cc019SAndroid Build Coastguard Worker err |= reg(file, reg_file, _reg_nr);
497*d83cc019SAndroid Build Coastguard Worker if (err == -1)
498*d83cc019SAndroid Build Coastguard Worker return 0;
499*d83cc019SAndroid Build Coastguard Worker if (_subreg_nr)
500*d83cc019SAndroid Build Coastguard Worker /* bit4 for subreg number byte addressing. Make this same meaning as
501*d83cc019SAndroid Build Coastguard Worker in da1 case, so output looks consistent. */
502*d83cc019SAndroid Build Coastguard Worker format(file, ".%d", 16 / reg_type_size[_reg_type]);
503*d83cc019SAndroid Build Coastguard Worker string(file, "<");
504*d83cc019SAndroid Build Coastguard Worker err |= control(file, "vert stride", m_vert_stride, vert_stride, NULL);
505*d83cc019SAndroid Build Coastguard Worker string(file, ",4,1>");
506*d83cc019SAndroid Build Coastguard Worker /*
507*d83cc019SAndroid Build Coastguard Worker * Three kinds of swizzle display:
508*d83cc019SAndroid Build Coastguard Worker * identity - nothing printed
509*d83cc019SAndroid Build Coastguard Worker * 1->all - print the single channel
510*d83cc019SAndroid Build Coastguard Worker * 1->1 - print the mapping
511*d83cc019SAndroid Build Coastguard Worker */
512*d83cc019SAndroid Build Coastguard Worker if (swz_x == BRW_CHANNEL_X &&
513*d83cc019SAndroid Build Coastguard Worker swz_y == BRW_CHANNEL_Y &&
514*d83cc019SAndroid Build Coastguard Worker swz_z == BRW_CHANNEL_Z &&
515*d83cc019SAndroid Build Coastguard Worker swz_w == BRW_CHANNEL_W)
516*d83cc019SAndroid Build Coastguard Worker {
517*d83cc019SAndroid Build Coastguard Worker ;
518*d83cc019SAndroid Build Coastguard Worker }
519*d83cc019SAndroid Build Coastguard Worker else if (swz_x == swz_y && swz_x == swz_z && swz_x == swz_w)
520*d83cc019SAndroid Build Coastguard Worker {
521*d83cc019SAndroid Build Coastguard Worker string(file, ".");
522*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_x, NULL);
523*d83cc019SAndroid Build Coastguard Worker }
524*d83cc019SAndroid Build Coastguard Worker else
525*d83cc019SAndroid Build Coastguard Worker {
526*d83cc019SAndroid Build Coastguard Worker string(file, ".");
527*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_x, NULL);
528*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_y, NULL);
529*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_z, NULL);
530*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_w, NULL);
531*d83cc019SAndroid Build Coastguard Worker }
532*d83cc019SAndroid Build Coastguard Worker err |= control(file, "src da16 reg type", m_reg_type, _reg_type, NULL);
533*d83cc019SAndroid Build Coastguard Worker return err;
534*d83cc019SAndroid Build Coastguard Worker }
535*d83cc019SAndroid Build Coastguard Worker
536*d83cc019SAndroid Build Coastguard Worker #if 0
537*d83cc019SAndroid Build Coastguard Worker static int
538*d83cc019SAndroid Build Coastguard Worker src0_3src(FILE *file, gen8_instruction *inst)
539*d83cc019SAndroid Build Coastguard Worker {
540*d83cc019SAndroid Build Coastguard Worker int err = 0;
541*d83cc019SAndroid Build Coastguard Worker unsigned swz_x = (inst->bits2.da3src.src0_swizzle >> 0) & 0x3;
542*d83cc019SAndroid Build Coastguard Worker unsigned swz_y = (inst->bits2.da3src.src0_swizzle >> 2) & 0x3;
543*d83cc019SAndroid Build Coastguard Worker unsigned swz_z = (inst->bits2.da3src.src0_swizzle >> 4) & 0x3;
544*d83cc019SAndroid Build Coastguard Worker unsigned swz_w = (inst->bits2.da3src.src0_swizzle >> 6) & 0x3;
545*d83cc019SAndroid Build Coastguard Worker
546*d83cc019SAndroid Build Coastguard Worker err |= control(file, "negate", m_negate, inst->bits1.da3src.src0_negate, NULL);
547*d83cc019SAndroid Build Coastguard Worker err |= control(file, "abs", m_abs, inst->bits1.da3src.src0_abs, NULL);
548*d83cc019SAndroid Build Coastguard Worker
549*d83cc019SAndroid Build Coastguard Worker err |= reg(file, BRW_GENERAL_REGISTER_FILE, inst->bits2.da3src.src0_reg_nr);
550*d83cc019SAndroid Build Coastguard Worker if (err == -1)
551*d83cc019SAndroid Build Coastguard Worker return 0;
552*d83cc019SAndroid Build Coastguard Worker if (inst->bits2.da3src.src0_subreg_nr)
553*d83cc019SAndroid Build Coastguard Worker format(file, ".%d", inst->bits2.da3src.src0_subreg_nr);
554*d83cc019SAndroid Build Coastguard Worker string(file, "<4,1,1>");
555*d83cc019SAndroid Build Coastguard Worker err |= control(file, "src da16 reg type", m_reg_type,
556*d83cc019SAndroid Build Coastguard Worker BRW_REGISTER_TYPE_F, NULL);
557*d83cc019SAndroid Build Coastguard Worker /*
558*d83cc019SAndroid Build Coastguard Worker * Three kinds of swizzle display:
559*d83cc019SAndroid Build Coastguard Worker * identity - nothing printed
560*d83cc019SAndroid Build Coastguard Worker * 1->all - print the single channel
561*d83cc019SAndroid Build Coastguard Worker * 1->1 - print the mapping
562*d83cc019SAndroid Build Coastguard Worker */
563*d83cc019SAndroid Build Coastguard Worker if (swz_x == BRW_CHANNEL_X &&
564*d83cc019SAndroid Build Coastguard Worker swz_y == BRW_CHANNEL_Y &&
565*d83cc019SAndroid Build Coastguard Worker swz_z == BRW_CHANNEL_Z &&
566*d83cc019SAndroid Build Coastguard Worker swz_w == BRW_CHANNEL_W)
567*d83cc019SAndroid Build Coastguard Worker {
568*d83cc019SAndroid Build Coastguard Worker ;
569*d83cc019SAndroid Build Coastguard Worker }
570*d83cc019SAndroid Build Coastguard Worker else if (swz_x == swz_y && swz_x == swz_z && swz_x == swz_w)
571*d83cc019SAndroid Build Coastguard Worker {
572*d83cc019SAndroid Build Coastguard Worker string(file, ".");
573*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_x, NULL);
574*d83cc019SAndroid Build Coastguard Worker }
575*d83cc019SAndroid Build Coastguard Worker else
576*d83cc019SAndroid Build Coastguard Worker {
577*d83cc019SAndroid Build Coastguard Worker string(file, ".");
578*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_x, NULL);
579*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_y, NULL);
580*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_z, NULL);
581*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_w, NULL);
582*d83cc019SAndroid Build Coastguard Worker }
583*d83cc019SAndroid Build Coastguard Worker return err;
584*d83cc019SAndroid Build Coastguard Worker }
585*d83cc019SAndroid Build Coastguard Worker
586*d83cc019SAndroid Build Coastguard Worker static int
587*d83cc019SAndroid Build Coastguard Worker src1_3src(FILE *file, gen8_instruction *inst)
588*d83cc019SAndroid Build Coastguard Worker {
589*d83cc019SAndroid Build Coastguard Worker int err = 0;
590*d83cc019SAndroid Build Coastguard Worker unsigned swz_x = (inst->bits2.da3src.src1_swizzle >> 0) & 0x3;
591*d83cc019SAndroid Build Coastguard Worker unsigned swz_y = (inst->bits2.da3src.src1_swizzle >> 2) & 0x3;
592*d83cc019SAndroid Build Coastguard Worker unsigned swz_z = (inst->bits2.da3src.src1_swizzle >> 4) & 0x3;
593*d83cc019SAndroid Build Coastguard Worker unsigned swz_w = (inst->bits2.da3src.src1_swizzle >> 6) & 0x3;
594*d83cc019SAndroid Build Coastguard Worker unsigned src1_subreg_nr = (inst->bits2.da3src.src1_subreg_nr_low |
595*d83cc019SAndroid Build Coastguard Worker (inst->bits3.da3src.src1_subreg_nr_high << 2));
596*d83cc019SAndroid Build Coastguard Worker
597*d83cc019SAndroid Build Coastguard Worker err |= control(file, "negate", m_negate, inst->bits1.da3src.src1_negate,
598*d83cc019SAndroid Build Coastguard Worker NULL);
599*d83cc019SAndroid Build Coastguard Worker err |= control(file, "abs", m_abs, inst->bits1.da3src.src1_abs, NULL);
600*d83cc019SAndroid Build Coastguard Worker
601*d83cc019SAndroid Build Coastguard Worker err |= reg(file, BRW_GENERAL_REGISTER_FILE,
602*d83cc019SAndroid Build Coastguard Worker inst->bits3.da3src.src1_reg_nr);
603*d83cc019SAndroid Build Coastguard Worker if (err == -1)
604*d83cc019SAndroid Build Coastguard Worker return 0;
605*d83cc019SAndroid Build Coastguard Worker if (src1_subreg_nr)
606*d83cc019SAndroid Build Coastguard Worker format(file, ".%d", src1_subreg_nr);
607*d83cc019SAndroid Build Coastguard Worker string(file, "<4,1,1>");
608*d83cc019SAndroid Build Coastguard Worker err |= control(file, "src da16 reg type", m_reg_type,
609*d83cc019SAndroid Build Coastguard Worker BRW_REGISTER_TYPE_F, NULL);
610*d83cc019SAndroid Build Coastguard Worker /*
611*d83cc019SAndroid Build Coastguard Worker * Three kinds of swizzle display:
612*d83cc019SAndroid Build Coastguard Worker * identity - nothing printed
613*d83cc019SAndroid Build Coastguard Worker * 1->all - print the single channel
614*d83cc019SAndroid Build Coastguard Worker * 1->1 - print the mapping
615*d83cc019SAndroid Build Coastguard Worker */
616*d83cc019SAndroid Build Coastguard Worker if (swz_x == BRW_CHANNEL_X &&
617*d83cc019SAndroid Build Coastguard Worker swz_y == BRW_CHANNEL_Y &&
618*d83cc019SAndroid Build Coastguard Worker swz_z == BRW_CHANNEL_Z &&
619*d83cc019SAndroid Build Coastguard Worker swz_w == BRW_CHANNEL_W)
620*d83cc019SAndroid Build Coastguard Worker {
621*d83cc019SAndroid Build Coastguard Worker ;
622*d83cc019SAndroid Build Coastguard Worker }
623*d83cc019SAndroid Build Coastguard Worker else if (swz_x == swz_y && swz_x == swz_z && swz_x == swz_w)
624*d83cc019SAndroid Build Coastguard Worker {
625*d83cc019SAndroid Build Coastguard Worker string(file, ".");
626*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_x, NULL);
627*d83cc019SAndroid Build Coastguard Worker }
628*d83cc019SAndroid Build Coastguard Worker else
629*d83cc019SAndroid Build Coastguard Worker {
630*d83cc019SAndroid Build Coastguard Worker string(file, ".");
631*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_x, NULL);
632*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_y, NULL);
633*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_z, NULL);
634*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_w, NULL);
635*d83cc019SAndroid Build Coastguard Worker }
636*d83cc019SAndroid Build Coastguard Worker return err;
637*d83cc019SAndroid Build Coastguard Worker }
638*d83cc019SAndroid Build Coastguard Worker
639*d83cc019SAndroid Build Coastguard Worker
640*d83cc019SAndroid Build Coastguard Worker static int
641*d83cc019SAndroid Build Coastguard Worker src2_3src(FILE *file, gen8_instruction *inst)
642*d83cc019SAndroid Build Coastguard Worker {
643*d83cc019SAndroid Build Coastguard Worker int err = 0;
644*d83cc019SAndroid Build Coastguard Worker unsigned swz_x = (inst->bits3.da3src.src2_swizzle >> 0) & 0x3;
645*d83cc019SAndroid Build Coastguard Worker unsigned swz_y = (inst->bits3.da3src.src2_swizzle >> 2) & 0x3;
646*d83cc019SAndroid Build Coastguard Worker unsigned swz_z = (inst->bits3.da3src.src2_swizzle >> 4) & 0x3;
647*d83cc019SAndroid Build Coastguard Worker unsigned swz_w = (inst->bits3.da3src.src2_swizzle >> 6) & 0x3;
648*d83cc019SAndroid Build Coastguard Worker
649*d83cc019SAndroid Build Coastguard Worker err |= control(file, "negate", m_negate, inst->bits1.da3src.src2_negate,
650*d83cc019SAndroid Build Coastguard Worker NULL);
651*d83cc019SAndroid Build Coastguard Worker err |= control(file, "abs", m_abs, inst->bits1.da3src.src2_abs, NULL);
652*d83cc019SAndroid Build Coastguard Worker
653*d83cc019SAndroid Build Coastguard Worker err |= reg(file, BRW_GENERAL_REGISTER_FILE,
654*d83cc019SAndroid Build Coastguard Worker inst->bits3.da3src.src2_reg_nr);
655*d83cc019SAndroid Build Coastguard Worker if (err == -1)
656*d83cc019SAndroid Build Coastguard Worker return 0;
657*d83cc019SAndroid Build Coastguard Worker if (inst->bits3.da3src.src2_subreg_nr)
658*d83cc019SAndroid Build Coastguard Worker format(file, ".%d", inst->bits3.da3src.src2_subreg_nr);
659*d83cc019SAndroid Build Coastguard Worker string(file, "<4,1,1>");
660*d83cc019SAndroid Build Coastguard Worker err |= control(file, "src da16 reg type", m_reg_type,
661*d83cc019SAndroid Build Coastguard Worker BRW_REGISTER_TYPE_F, NULL);
662*d83cc019SAndroid Build Coastguard Worker /*
663*d83cc019SAndroid Build Coastguard Worker * Three kinds of swizzle display:
664*d83cc019SAndroid Build Coastguard Worker * identity - nothing printed
665*d83cc019SAndroid Build Coastguard Worker * 1->all - print the single channel
666*d83cc019SAndroid Build Coastguard Worker * 1->1 - print the mapping
667*d83cc019SAndroid Build Coastguard Worker */
668*d83cc019SAndroid Build Coastguard Worker if (swz_x == BRW_CHANNEL_X &&
669*d83cc019SAndroid Build Coastguard Worker swz_y == BRW_CHANNEL_Y &&
670*d83cc019SAndroid Build Coastguard Worker swz_z == BRW_CHANNEL_Z &&
671*d83cc019SAndroid Build Coastguard Worker swz_w == BRW_CHANNEL_W)
672*d83cc019SAndroid Build Coastguard Worker {
673*d83cc019SAndroid Build Coastguard Worker ;
674*d83cc019SAndroid Build Coastguard Worker }
675*d83cc019SAndroid Build Coastguard Worker else if (swz_x == swz_y && swz_x == swz_z && swz_x == swz_w)
676*d83cc019SAndroid Build Coastguard Worker {
677*d83cc019SAndroid Build Coastguard Worker string(file, ".");
678*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_x, NULL);
679*d83cc019SAndroid Build Coastguard Worker }
680*d83cc019SAndroid Build Coastguard Worker else
681*d83cc019SAndroid Build Coastguard Worker {
682*d83cc019SAndroid Build Coastguard Worker string(file, ".");
683*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_x, NULL);
684*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_y, NULL);
685*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_z, NULL);
686*d83cc019SAndroid Build Coastguard Worker err |= control(file, "channel select", m_chan_sel, swz_w, NULL);
687*d83cc019SAndroid Build Coastguard Worker }
688*d83cc019SAndroid Build Coastguard Worker return err;
689*d83cc019SAndroid Build Coastguard Worker }
690*d83cc019SAndroid Build Coastguard Worker #endif
691*d83cc019SAndroid Build Coastguard Worker
692*d83cc019SAndroid Build Coastguard Worker static int
imm(FILE * file,unsigned type,struct gen8_instruction * inst)693*d83cc019SAndroid Build Coastguard Worker imm(FILE *file, unsigned type, struct gen8_instruction *inst)
694*d83cc019SAndroid Build Coastguard Worker {
695*d83cc019SAndroid Build Coastguard Worker switch (type) {
696*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_UD:
697*d83cc019SAndroid Build Coastguard Worker format(file, "0x%08xUD", gen8_src1_imm_ud(inst));
698*d83cc019SAndroid Build Coastguard Worker break;
699*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_D:
700*d83cc019SAndroid Build Coastguard Worker format(file, "%dD", (int) gen8_src1_imm_d(inst));
701*d83cc019SAndroid Build Coastguard Worker break;
702*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_UW:
703*d83cc019SAndroid Build Coastguard Worker format(file, "0x%04xUW", (uint16_t) gen8_src1_imm_ud(inst));
704*d83cc019SAndroid Build Coastguard Worker break;
705*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_W:
706*d83cc019SAndroid Build Coastguard Worker format(file, "%dW", (int16_t) gen8_src1_imm_d(inst));
707*d83cc019SAndroid Build Coastguard Worker break;
708*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_UB:
709*d83cc019SAndroid Build Coastguard Worker format(file, "0x%02xUB", (int8_t) gen8_src1_imm_ud(inst));
710*d83cc019SAndroid Build Coastguard Worker break;
711*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_VF:
712*d83cc019SAndroid Build Coastguard Worker format(file, "Vector Float");
713*d83cc019SAndroid Build Coastguard Worker break;
714*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_V:
715*d83cc019SAndroid Build Coastguard Worker format(file, "0x%08xV", gen8_src1_imm_ud(inst));
716*d83cc019SAndroid Build Coastguard Worker break;
717*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_F:
718*d83cc019SAndroid Build Coastguard Worker format(file, "%-gF", gen8_src1_imm_f(inst));
719*d83cc019SAndroid Build Coastguard Worker }
720*d83cc019SAndroid Build Coastguard Worker return 0;
721*d83cc019SAndroid Build Coastguard Worker }
722*d83cc019SAndroid Build Coastguard Worker
723*d83cc019SAndroid Build Coastguard Worker static int
src0(FILE * file,struct gen8_instruction * inst)724*d83cc019SAndroid Build Coastguard Worker src0(FILE *file, struct gen8_instruction *inst)
725*d83cc019SAndroid Build Coastguard Worker {
726*d83cc019SAndroid Build Coastguard Worker if (gen8_src0_reg_file(inst) == BRW_IMMEDIATE_VALUE)
727*d83cc019SAndroid Build Coastguard Worker return imm(file, gen8_src0_reg_type(inst), inst);
728*d83cc019SAndroid Build Coastguard Worker
729*d83cc019SAndroid Build Coastguard Worker if (gen8_access_mode(inst) == BRW_ALIGN_1)
730*d83cc019SAndroid Build Coastguard Worker {
731*d83cc019SAndroid Build Coastguard Worker assert(gen8_src0_address_mode(inst) == BRW_ADDRESS_DIRECT);
732*d83cc019SAndroid Build Coastguard Worker return src_da1(file,
733*d83cc019SAndroid Build Coastguard Worker gen8_src0_reg_type(inst),
734*d83cc019SAndroid Build Coastguard Worker gen8_src0_reg_file(inst),
735*d83cc019SAndroid Build Coastguard Worker gen8_src0_vert_stride(inst),
736*d83cc019SAndroid Build Coastguard Worker gen8_src0_da1_width(inst),
737*d83cc019SAndroid Build Coastguard Worker gen8_src0_da1_hstride(inst),
738*d83cc019SAndroid Build Coastguard Worker gen8_src0_da_reg_nr(inst),
739*d83cc019SAndroid Build Coastguard Worker gen8_src0_da1_subreg_nr(inst),
740*d83cc019SAndroid Build Coastguard Worker gen8_src0_abs(inst),
741*d83cc019SAndroid Build Coastguard Worker gen8_src0_negate(inst));
742*d83cc019SAndroid Build Coastguard Worker }
743*d83cc019SAndroid Build Coastguard Worker else
744*d83cc019SAndroid Build Coastguard Worker {
745*d83cc019SAndroid Build Coastguard Worker assert(gen8_src0_address_mode(inst) == BRW_ADDRESS_DIRECT);
746*d83cc019SAndroid Build Coastguard Worker return src_da16(file,
747*d83cc019SAndroid Build Coastguard Worker gen8_src0_reg_type(inst),
748*d83cc019SAndroid Build Coastguard Worker gen8_src0_reg_file(inst),
749*d83cc019SAndroid Build Coastguard Worker gen8_src0_vert_stride(inst),
750*d83cc019SAndroid Build Coastguard Worker gen8_src0_da_reg_nr(inst),
751*d83cc019SAndroid Build Coastguard Worker gen8_src0_da16_subreg_nr(inst),
752*d83cc019SAndroid Build Coastguard Worker gen8_src0_abs(inst),
753*d83cc019SAndroid Build Coastguard Worker gen8_src0_negate(inst),
754*d83cc019SAndroid Build Coastguard Worker gen8_src0_da16_swiz_x(inst),
755*d83cc019SAndroid Build Coastguard Worker gen8_src0_da16_swiz_y(inst),
756*d83cc019SAndroid Build Coastguard Worker gen8_src0_da16_swiz_z(inst),
757*d83cc019SAndroid Build Coastguard Worker gen8_src0_da16_swiz_w(inst));
758*d83cc019SAndroid Build Coastguard Worker }
759*d83cc019SAndroid Build Coastguard Worker }
760*d83cc019SAndroid Build Coastguard Worker
761*d83cc019SAndroid Build Coastguard Worker static int
src1(FILE * file,struct gen8_instruction * inst)762*d83cc019SAndroid Build Coastguard Worker src1(FILE *file, struct gen8_instruction *inst)
763*d83cc019SAndroid Build Coastguard Worker {
764*d83cc019SAndroid Build Coastguard Worker if (gen8_src1_reg_file(inst) == BRW_IMMEDIATE_VALUE)
765*d83cc019SAndroid Build Coastguard Worker return imm(file, gen8_src1_reg_type(inst), inst);
766*d83cc019SAndroid Build Coastguard Worker
767*d83cc019SAndroid Build Coastguard Worker if (gen8_access_mode(inst) == BRW_ALIGN_1)
768*d83cc019SAndroid Build Coastguard Worker {
769*d83cc019SAndroid Build Coastguard Worker assert(gen8_src1_address_mode(inst) == BRW_ADDRESS_DIRECT);
770*d83cc019SAndroid Build Coastguard Worker return src_da1(file,
771*d83cc019SAndroid Build Coastguard Worker gen8_src1_reg_type(inst),
772*d83cc019SAndroid Build Coastguard Worker gen8_src1_reg_file(inst),
773*d83cc019SAndroid Build Coastguard Worker gen8_src1_vert_stride(inst),
774*d83cc019SAndroid Build Coastguard Worker gen8_src1_da1_width(inst),
775*d83cc019SAndroid Build Coastguard Worker gen8_src1_da1_hstride(inst),
776*d83cc019SAndroid Build Coastguard Worker gen8_src1_da_reg_nr(inst),
777*d83cc019SAndroid Build Coastguard Worker gen8_src1_da1_subreg_nr(inst),
778*d83cc019SAndroid Build Coastguard Worker gen8_src1_abs(inst),
779*d83cc019SAndroid Build Coastguard Worker gen8_src1_negate(inst));
780*d83cc019SAndroid Build Coastguard Worker }
781*d83cc019SAndroid Build Coastguard Worker else
782*d83cc019SAndroid Build Coastguard Worker {
783*d83cc019SAndroid Build Coastguard Worker assert(gen8_src1_address_mode(inst) == BRW_ADDRESS_DIRECT);
784*d83cc019SAndroid Build Coastguard Worker return src_da16(file,
785*d83cc019SAndroid Build Coastguard Worker gen8_src1_reg_type(inst),
786*d83cc019SAndroid Build Coastguard Worker gen8_src1_reg_file(inst),
787*d83cc019SAndroid Build Coastguard Worker gen8_src1_vert_stride(inst),
788*d83cc019SAndroid Build Coastguard Worker gen8_src1_da_reg_nr(inst),
789*d83cc019SAndroid Build Coastguard Worker gen8_src1_da16_subreg_nr(inst),
790*d83cc019SAndroid Build Coastguard Worker gen8_src1_abs(inst),
791*d83cc019SAndroid Build Coastguard Worker gen8_src1_negate(inst),
792*d83cc019SAndroid Build Coastguard Worker gen8_src1_da16_swiz_x(inst),
793*d83cc019SAndroid Build Coastguard Worker gen8_src1_da16_swiz_y(inst),
794*d83cc019SAndroid Build Coastguard Worker gen8_src1_da16_swiz_z(inst),
795*d83cc019SAndroid Build Coastguard Worker gen8_src1_da16_swiz_w(inst));
796*d83cc019SAndroid Build Coastguard Worker }
797*d83cc019SAndroid Build Coastguard Worker }
798*d83cc019SAndroid Build Coastguard Worker
799*d83cc019SAndroid Build Coastguard Worker static int esize[6] = { 1, 2, 4, 8, 16, 32 };
800*d83cc019SAndroid Build Coastguard Worker
801*d83cc019SAndroid Build Coastguard Worker static int
qtr_ctrl(FILE * file,struct gen8_instruction * inst)802*d83cc019SAndroid Build Coastguard Worker qtr_ctrl(FILE *file, struct gen8_instruction *inst)
803*d83cc019SAndroid Build Coastguard Worker {
804*d83cc019SAndroid Build Coastguard Worker int qtr_ctl = gen8_qtr_control(inst);
805*d83cc019SAndroid Build Coastguard Worker int exec_size = esize[gen8_exec_size(inst)];
806*d83cc019SAndroid Build Coastguard Worker
807*d83cc019SAndroid Build Coastguard Worker if (exec_size == 8) {
808*d83cc019SAndroid Build Coastguard Worker switch (qtr_ctl) {
809*d83cc019SAndroid Build Coastguard Worker case 0:
810*d83cc019SAndroid Build Coastguard Worker string(file, " 1Q");
811*d83cc019SAndroid Build Coastguard Worker break;
812*d83cc019SAndroid Build Coastguard Worker case 1:
813*d83cc019SAndroid Build Coastguard Worker string(file, " 2Q");
814*d83cc019SAndroid Build Coastguard Worker break;
815*d83cc019SAndroid Build Coastguard Worker case 2:
816*d83cc019SAndroid Build Coastguard Worker string(file, " 3Q");
817*d83cc019SAndroid Build Coastguard Worker break;
818*d83cc019SAndroid Build Coastguard Worker case 3:
819*d83cc019SAndroid Build Coastguard Worker string(file, " 4Q");
820*d83cc019SAndroid Build Coastguard Worker break;
821*d83cc019SAndroid Build Coastguard Worker }
822*d83cc019SAndroid Build Coastguard Worker } else if (exec_size == 16) {
823*d83cc019SAndroid Build Coastguard Worker if (qtr_ctl < 2)
824*d83cc019SAndroid Build Coastguard Worker string(file, " 1H");
825*d83cc019SAndroid Build Coastguard Worker else
826*d83cc019SAndroid Build Coastguard Worker string(file, " 2H");
827*d83cc019SAndroid Build Coastguard Worker }
828*d83cc019SAndroid Build Coastguard Worker return 0;
829*d83cc019SAndroid Build Coastguard Worker }
830*d83cc019SAndroid Build Coastguard Worker
831*d83cc019SAndroid Build Coastguard Worker int
gen8_disassemble(FILE * file,struct gen8_instruction * insn,int gen)832*d83cc019SAndroid Build Coastguard Worker gen8_disassemble(FILE *file, struct gen8_instruction *insn, int gen)
833*d83cc019SAndroid Build Coastguard Worker {
834*d83cc019SAndroid Build Coastguard Worker int err = 0;
835*d83cc019SAndroid Build Coastguard Worker int space = 0;
836*d83cc019SAndroid Build Coastguard Worker
837*d83cc019SAndroid Build Coastguard Worker const int opcode = gen8_opcode(insn);
838*d83cc019SAndroid Build Coastguard Worker
839*d83cc019SAndroid Build Coastguard Worker if (gen8_pred_control(insn)) {
840*d83cc019SAndroid Build Coastguard Worker string(file, "(");
841*d83cc019SAndroid Build Coastguard Worker err |= control(file, "predicate inverse", m_pred_inv, gen8_pred_inv(insn), NULL);
842*d83cc019SAndroid Build Coastguard Worker format(file, "f%d", gen8_flag_reg_nr(insn));
843*d83cc019SAndroid Build Coastguard Worker if (gen8_flag_subreg_nr(insn))
844*d83cc019SAndroid Build Coastguard Worker format(file, ".%d", gen8_flag_subreg_nr(insn));
845*d83cc019SAndroid Build Coastguard Worker if (gen8_access_mode(insn) == BRW_ALIGN_1) {
846*d83cc019SAndroid Build Coastguard Worker err |= control(file, "predicate control align1", m_pred_ctrl_align1,
847*d83cc019SAndroid Build Coastguard Worker gen8_pred_control(insn), NULL);
848*d83cc019SAndroid Build Coastguard Worker } else {
849*d83cc019SAndroid Build Coastguard Worker err |= control(file, "predicate control align16", m_pred_ctrl_align16,
850*d83cc019SAndroid Build Coastguard Worker gen8_pred_control(insn), NULL);
851*d83cc019SAndroid Build Coastguard Worker }
852*d83cc019SAndroid Build Coastguard Worker string(file, ") ");
853*d83cc019SAndroid Build Coastguard Worker }
854*d83cc019SAndroid Build Coastguard Worker
855*d83cc019SAndroid Build Coastguard Worker err |= print_opcode(file, opcode);
856*d83cc019SAndroid Build Coastguard Worker err |= control(file, "saturate", m_saturate, gen8_saturate(insn), NULL);
857*d83cc019SAndroid Build Coastguard Worker err |= control(file, "debug control", m_debug_ctrl, gen8_debug_control(insn), NULL);
858*d83cc019SAndroid Build Coastguard Worker
859*d83cc019SAndroid Build Coastguard Worker if (opcode == BRW_OPCODE_MATH) {
860*d83cc019SAndroid Build Coastguard Worker string(file, " ");
861*d83cc019SAndroid Build Coastguard Worker err |= control(file, "function", m_math_function, gen8_math_function(insn),
862*d83cc019SAndroid Build Coastguard Worker NULL);
863*d83cc019SAndroid Build Coastguard Worker } else if (opcode != BRW_OPCODE_SEND && opcode != BRW_OPCODE_SENDC) {
864*d83cc019SAndroid Build Coastguard Worker err |= control(file, "conditional modifier", m_conditional_modifier,
865*d83cc019SAndroid Build Coastguard Worker gen8_cond_modifier(insn), NULL);
866*d83cc019SAndroid Build Coastguard Worker
867*d83cc019SAndroid Build Coastguard Worker /* If we're using the conditional modifier, print the flag reg used. */
868*d83cc019SAndroid Build Coastguard Worker if (gen8_cond_modifier(insn) && opcode != BRW_OPCODE_SEL) {
869*d83cc019SAndroid Build Coastguard Worker format(file, ".f%d", gen8_flag_reg_nr(insn));
870*d83cc019SAndroid Build Coastguard Worker if (gen8_flag_subreg_nr(insn))
871*d83cc019SAndroid Build Coastguard Worker format(file, ".%d", gen8_flag_subreg_nr(insn));
872*d83cc019SAndroid Build Coastguard Worker }
873*d83cc019SAndroid Build Coastguard Worker }
874*d83cc019SAndroid Build Coastguard Worker
875*d83cc019SAndroid Build Coastguard Worker if (opcode != BRW_OPCODE_NOP) {
876*d83cc019SAndroid Build Coastguard Worker string(file, "(");
877*d83cc019SAndroid Build Coastguard Worker err |= control(file, "execution size", m_exec_size, gen8_exec_size(insn), NULL);
878*d83cc019SAndroid Build Coastguard Worker string(file, ")");
879*d83cc019SAndroid Build Coastguard Worker }
880*d83cc019SAndroid Build Coastguard Worker
881*d83cc019SAndroid Build Coastguard Worker if (m_opcode[opcode].nsrc == 3) {
882*d83cc019SAndroid Build Coastguard Worker string(file, "XXX: 3-src");
883*d83cc019SAndroid Build Coastguard Worker #if 0
884*d83cc019SAndroid Build Coastguard Worker pad(file, 16);
885*d83cc019SAndroid Build Coastguard Worker err |= dest_3src(file, this);
886*d83cc019SAndroid Build Coastguard Worker
887*d83cc019SAndroid Build Coastguard Worker pad(file, 32);
888*d83cc019SAndroid Build Coastguard Worker err |= src0_3src(file, this);
889*d83cc019SAndroid Build Coastguard Worker
890*d83cc019SAndroid Build Coastguard Worker pad(file, 48);
891*d83cc019SAndroid Build Coastguard Worker err |= src1_3src(file, this);
892*d83cc019SAndroid Build Coastguard Worker
893*d83cc019SAndroid Build Coastguard Worker pad(file, 64);
894*d83cc019SAndroid Build Coastguard Worker err |= src2_3src(file, this);
895*d83cc019SAndroid Build Coastguard Worker #endif
896*d83cc019SAndroid Build Coastguard Worker } else {
897*d83cc019SAndroid Build Coastguard Worker if (m_opcode[opcode].ndst > 0) {
898*d83cc019SAndroid Build Coastguard Worker pad(file, 16);
899*d83cc019SAndroid Build Coastguard Worker err |= dest(file, insn);
900*d83cc019SAndroid Build Coastguard Worker } else if (opcode == BRW_OPCODE_ENDIF) {
901*d83cc019SAndroid Build Coastguard Worker format(file, " %d", gen8_jip(insn));
902*d83cc019SAndroid Build Coastguard Worker } else if (opcode == BRW_OPCODE_IF ||
903*d83cc019SAndroid Build Coastguard Worker opcode == BRW_OPCODE_ELSE ||
904*d83cc019SAndroid Build Coastguard Worker opcode == BRW_OPCODE_WHILE ||
905*d83cc019SAndroid Build Coastguard Worker opcode == BRW_OPCODE_BREAK ||
906*d83cc019SAndroid Build Coastguard Worker opcode == BRW_OPCODE_CONTINUE ||
907*d83cc019SAndroid Build Coastguard Worker opcode == BRW_OPCODE_HALT) {
908*d83cc019SAndroid Build Coastguard Worker format(file, " %d %d", gen8_jip(insn), gen8_uip(insn));
909*d83cc019SAndroid Build Coastguard Worker }
910*d83cc019SAndroid Build Coastguard Worker
911*d83cc019SAndroid Build Coastguard Worker if (m_opcode[opcode].nsrc > 0) {
912*d83cc019SAndroid Build Coastguard Worker pad(file, 32);
913*d83cc019SAndroid Build Coastguard Worker err |= src0(file, insn);
914*d83cc019SAndroid Build Coastguard Worker }
915*d83cc019SAndroid Build Coastguard Worker if (m_opcode[opcode].nsrc > 1) {
916*d83cc019SAndroid Build Coastguard Worker pad(file, 48);
917*d83cc019SAndroid Build Coastguard Worker err |= src1(file, insn);
918*d83cc019SAndroid Build Coastguard Worker }
919*d83cc019SAndroid Build Coastguard Worker }
920*d83cc019SAndroid Build Coastguard Worker
921*d83cc019SAndroid Build Coastguard Worker if (opcode == BRW_OPCODE_SEND || opcode == BRW_OPCODE_SENDC) {
922*d83cc019SAndroid Build Coastguard Worker const int sfid = gen8_sfid(insn);
923*d83cc019SAndroid Build Coastguard Worker
924*d83cc019SAndroid Build Coastguard Worker newline(file);
925*d83cc019SAndroid Build Coastguard Worker pad(file, 16);
926*d83cc019SAndroid Build Coastguard Worker space = 0;
927*d83cc019SAndroid Build Coastguard Worker
928*d83cc019SAndroid Build Coastguard Worker err |= control(file, "SFID", m_sfid, sfid, &space);
929*d83cc019SAndroid Build Coastguard Worker
930*d83cc019SAndroid Build Coastguard Worker switch (sfid) {
931*d83cc019SAndroid Build Coastguard Worker case BRW_SFID_SAMPLER:
932*d83cc019SAndroid Build Coastguard Worker format(file, " (%d, %d, %d, %d)",
933*d83cc019SAndroid Build Coastguard Worker gen8_binding_table_index(insn),
934*d83cc019SAndroid Build Coastguard Worker gen8_sampler(insn),
935*d83cc019SAndroid Build Coastguard Worker gen8_sampler_msg_type(insn),
936*d83cc019SAndroid Build Coastguard Worker gen8_sampler_simd_mode(insn));
937*d83cc019SAndroid Build Coastguard Worker break;
938*d83cc019SAndroid Build Coastguard Worker
939*d83cc019SAndroid Build Coastguard Worker case BRW_SFID_URB:
940*d83cc019SAndroid Build Coastguard Worker space = 1;
941*d83cc019SAndroid Build Coastguard Worker err |= control(file, "urb opcode", m_urb_opcode,
942*d83cc019SAndroid Build Coastguard Worker gen8_urb_opcode(insn), &space);
943*d83cc019SAndroid Build Coastguard Worker err |= control(file, "urb interleave", m_urb_interleave,
944*d83cc019SAndroid Build Coastguard Worker gen8_urb_interleave(insn), &space);
945*d83cc019SAndroid Build Coastguard Worker format(file, " %d %d",
946*d83cc019SAndroid Build Coastguard Worker gen8_urb_global_offset(insn), gen8_urb_per_slot_offset(insn));
947*d83cc019SAndroid Build Coastguard Worker break;
948*d83cc019SAndroid Build Coastguard Worker
949*d83cc019SAndroid Build Coastguard Worker case GEN6_SFID_DATAPORT_SAMPLER_CACHE:
950*d83cc019SAndroid Build Coastguard Worker case GEN6_SFID_DATAPORT_RENDER_CACHE:
951*d83cc019SAndroid Build Coastguard Worker case GEN6_SFID_DATAPORT_CONSTANT_CACHE:
952*d83cc019SAndroid Build Coastguard Worker case GEN7_SFID_DATAPORT_DATA_CACHE:
953*d83cc019SAndroid Build Coastguard Worker format(file, " (%d, 0x%x)",
954*d83cc019SAndroid Build Coastguard Worker gen8_binding_table_index(insn),
955*d83cc019SAndroid Build Coastguard Worker gen8_function_control(insn));
956*d83cc019SAndroid Build Coastguard Worker break;
957*d83cc019SAndroid Build Coastguard Worker
958*d83cc019SAndroid Build Coastguard Worker default:
959*d83cc019SAndroid Build Coastguard Worker format(file, "unsupported shared function ID (%d)", sfid);
960*d83cc019SAndroid Build Coastguard Worker break;
961*d83cc019SAndroid Build Coastguard Worker }
962*d83cc019SAndroid Build Coastguard Worker if (space)
963*d83cc019SAndroid Build Coastguard Worker string(file, " ");
964*d83cc019SAndroid Build Coastguard Worker format(file, "mlen %d", gen8_mlen(insn));
965*d83cc019SAndroid Build Coastguard Worker format(file, " rlen %d", gen8_rlen(insn));
966*d83cc019SAndroid Build Coastguard Worker }
967*d83cc019SAndroid Build Coastguard Worker pad(file, 64);
968*d83cc019SAndroid Build Coastguard Worker if (opcode != BRW_OPCODE_NOP) {
969*d83cc019SAndroid Build Coastguard Worker string(file, "{");
970*d83cc019SAndroid Build Coastguard Worker space = 1;
971*d83cc019SAndroid Build Coastguard Worker err |= control(file, "access mode", m_access_mode, gen8_access_mode(insn), &space);
972*d83cc019SAndroid Build Coastguard Worker err |= control(file, "mask control", m_maskctrl, gen8_mask_control(insn), &space);
973*d83cc019SAndroid Build Coastguard Worker err |= control(file, "dependency control", m_dep_ctrl, gen8_dep_control(insn), &space);
974*d83cc019SAndroid Build Coastguard Worker
975*d83cc019SAndroid Build Coastguard Worker err |= qtr_ctrl(file, insn);
976*d83cc019SAndroid Build Coastguard Worker
977*d83cc019SAndroid Build Coastguard Worker err |= control(file, "thread control", m_thread_ctrl, gen8_thread_control(insn), &space);
978*d83cc019SAndroid Build Coastguard Worker err |= control(file, "acc write control", m_accwr, gen8_acc_wr_control(insn), &space);
979*d83cc019SAndroid Build Coastguard Worker if (opcode == BRW_OPCODE_SEND || opcode == BRW_OPCODE_SENDC)
980*d83cc019SAndroid Build Coastguard Worker err |= control(file, "end of thread", m_eot, gen8_eot(insn), &space);
981*d83cc019SAndroid Build Coastguard Worker if (space)
982*d83cc019SAndroid Build Coastguard Worker string(file, " ");
983*d83cc019SAndroid Build Coastguard Worker string(file, "}");
984*d83cc019SAndroid Build Coastguard Worker }
985*d83cc019SAndroid Build Coastguard Worker string(file, ";");
986*d83cc019SAndroid Build Coastguard Worker newline(file);
987*d83cc019SAndroid Build Coastguard Worker return err;
988*d83cc019SAndroid Build Coastguard Worker }
989