1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2008 Keith Packard
3*61046927SAndroid Build Coastguard Worker * Copyright © 2014 Intel Corporation
4*61046927SAndroid Build Coastguard Worker *
5*61046927SAndroid Build Coastguard Worker * Permission to use, copy, modify, distribute, and sell this software and its
6*61046927SAndroid Build Coastguard Worker * documentation for any purpose is hereby granted without fee, provided that
7*61046927SAndroid Build Coastguard Worker * the above copyright notice appear in all copies and that both that copyright
8*61046927SAndroid Build Coastguard Worker * notice and this permission notice appear in supporting documentation, and
9*61046927SAndroid Build Coastguard Worker * that the name of the copyright holders not be used in advertising or
10*61046927SAndroid Build Coastguard Worker * publicity pertaining to distribution of the software without specific,
11*61046927SAndroid Build Coastguard Worker * written prior permission. The copyright holders make no representations
12*61046927SAndroid Build Coastguard Worker * about the suitability of this software for any purpose. It is provided "as
13*61046927SAndroid Build Coastguard Worker * is" without express or implied warranty.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16*61046927SAndroid Build Coastguard Worker * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
17*61046927SAndroid Build Coastguard Worker * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
18*61046927SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
19*61046927SAndroid Build Coastguard Worker * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
20*61046927SAndroid Build Coastguard Worker * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
21*61046927SAndroid Build Coastguard Worker * OF THIS SOFTWARE.
22*61046927SAndroid Build Coastguard Worker */
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
25*61046927SAndroid Build Coastguard Worker #include <stdarg.h>
26*61046927SAndroid Build Coastguard Worker #include <stdio.h>
27*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
28*61046927SAndroid Build Coastguard Worker #include <string.h>
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker #include "brw_disasm.h"
31*61046927SAndroid Build Coastguard Worker #include "brw_disasm_info.h"
32*61046927SAndroid Build Coastguard Worker #include "brw_eu_defines.h"
33*61046927SAndroid Build Coastguard Worker #include "brw_eu.h"
34*61046927SAndroid Build Coastguard Worker #include "brw_inst.h"
35*61046927SAndroid Build Coastguard Worker #include "brw_isa_info.h"
36*61046927SAndroid Build Coastguard Worker #include "brw_reg.h"
37*61046927SAndroid Build Coastguard Worker #include "util/half_float.h"
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker bool
brw_has_jip(const struct intel_device_info * devinfo,enum opcode opcode)40*61046927SAndroid Build Coastguard Worker brw_has_jip(const struct intel_device_info *devinfo, enum opcode opcode)
41*61046927SAndroid Build Coastguard Worker {
42*61046927SAndroid Build Coastguard Worker return opcode == BRW_OPCODE_IF ||
43*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_ELSE ||
44*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_ENDIF ||
45*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_WHILE ||
46*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_BREAK ||
47*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_CONTINUE ||
48*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_HALT;
49*61046927SAndroid Build Coastguard Worker }
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker bool
brw_has_uip(const struct intel_device_info * devinfo,enum opcode opcode)52*61046927SAndroid Build Coastguard Worker brw_has_uip(const struct intel_device_info *devinfo, enum opcode opcode)
53*61046927SAndroid Build Coastguard Worker {
54*61046927SAndroid Build Coastguard Worker return opcode == BRW_OPCODE_IF ||
55*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_ELSE ||
56*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_BREAK ||
57*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_CONTINUE ||
58*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_HALT;
59*61046927SAndroid Build Coastguard Worker }
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker static bool
has_branch_ctrl(const struct intel_device_info * devinfo,enum opcode opcode)62*61046927SAndroid Build Coastguard Worker has_branch_ctrl(const struct intel_device_info *devinfo, enum opcode opcode)
63*61046927SAndroid Build Coastguard Worker {
64*61046927SAndroid Build Coastguard Worker return opcode == BRW_OPCODE_IF ||
65*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_ELSE;
66*61046927SAndroid Build Coastguard Worker }
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker static bool
is_logic_instruction(unsigned opcode)69*61046927SAndroid Build Coastguard Worker is_logic_instruction(unsigned opcode)
70*61046927SAndroid Build Coastguard Worker {
71*61046927SAndroid Build Coastguard Worker return opcode == BRW_OPCODE_AND ||
72*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_NOT ||
73*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_OR ||
74*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_XOR;
75*61046927SAndroid Build Coastguard Worker }
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker static bool
is_send(unsigned opcode)78*61046927SAndroid Build Coastguard Worker is_send(unsigned opcode)
79*61046927SAndroid Build Coastguard Worker {
80*61046927SAndroid Build Coastguard Worker return opcode == BRW_OPCODE_SEND ||
81*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_SENDC ||
82*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_SENDS ||
83*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_SENDSC;
84*61046927SAndroid Build Coastguard Worker }
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker static bool
is_split_send(UNUSED const struct intel_device_info * devinfo,unsigned opcode)87*61046927SAndroid Build Coastguard Worker is_split_send(UNUSED const struct intel_device_info *devinfo, unsigned opcode)
88*61046927SAndroid Build Coastguard Worker {
89*61046927SAndroid Build Coastguard Worker if (devinfo->ver >= 12)
90*61046927SAndroid Build Coastguard Worker return is_send(opcode);
91*61046927SAndroid Build Coastguard Worker else
92*61046927SAndroid Build Coastguard Worker return opcode == BRW_OPCODE_SENDS ||
93*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_SENDSC;
94*61046927SAndroid Build Coastguard Worker }
95*61046927SAndroid Build Coastguard Worker
96*61046927SAndroid Build Coastguard Worker const char *const conditional_modifier[16] = {
97*61046927SAndroid Build Coastguard Worker [BRW_CONDITIONAL_NONE] = "",
98*61046927SAndroid Build Coastguard Worker [BRW_CONDITIONAL_Z] = ".z",
99*61046927SAndroid Build Coastguard Worker [BRW_CONDITIONAL_NZ] = ".nz",
100*61046927SAndroid Build Coastguard Worker [BRW_CONDITIONAL_G] = ".g",
101*61046927SAndroid Build Coastguard Worker [BRW_CONDITIONAL_GE] = ".ge",
102*61046927SAndroid Build Coastguard Worker [BRW_CONDITIONAL_L] = ".l",
103*61046927SAndroid Build Coastguard Worker [BRW_CONDITIONAL_LE] = ".le",
104*61046927SAndroid Build Coastguard Worker [BRW_CONDITIONAL_R] = ".r",
105*61046927SAndroid Build Coastguard Worker [BRW_CONDITIONAL_O] = ".o",
106*61046927SAndroid Build Coastguard Worker [BRW_CONDITIONAL_U] = ".u",
107*61046927SAndroid Build Coastguard Worker };
108*61046927SAndroid Build Coastguard Worker
109*61046927SAndroid Build Coastguard Worker static const char *const m_negate[2] = {
110*61046927SAndroid Build Coastguard Worker [0] = "",
111*61046927SAndroid Build Coastguard Worker [1] = "-",
112*61046927SAndroid Build Coastguard Worker };
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard Worker static const char *const _abs[2] = {
115*61046927SAndroid Build Coastguard Worker [0] = "",
116*61046927SAndroid Build Coastguard Worker [1] = "(abs)",
117*61046927SAndroid Build Coastguard Worker };
118*61046927SAndroid Build Coastguard Worker
119*61046927SAndroid Build Coastguard Worker static const char *const m_bitnot[2] = { "", "~" };
120*61046927SAndroid Build Coastguard Worker
121*61046927SAndroid Build Coastguard Worker static const char *const vert_stride[16] = {
122*61046927SAndroid Build Coastguard Worker [0] = "0",
123*61046927SAndroid Build Coastguard Worker [1] = "1",
124*61046927SAndroid Build Coastguard Worker [2] = "2",
125*61046927SAndroid Build Coastguard Worker [3] = "4",
126*61046927SAndroid Build Coastguard Worker [4] = "8",
127*61046927SAndroid Build Coastguard Worker [5] = "16",
128*61046927SAndroid Build Coastguard Worker [6] = "32",
129*61046927SAndroid Build Coastguard Worker [15] = "VxH",
130*61046927SAndroid Build Coastguard Worker };
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker static const char *const width[8] = {
133*61046927SAndroid Build Coastguard Worker [0] = "1",
134*61046927SAndroid Build Coastguard Worker [1] = "2",
135*61046927SAndroid Build Coastguard Worker [2] = "4",
136*61046927SAndroid Build Coastguard Worker [3] = "8",
137*61046927SAndroid Build Coastguard Worker [4] = "16",
138*61046927SAndroid Build Coastguard Worker };
139*61046927SAndroid Build Coastguard Worker
140*61046927SAndroid Build Coastguard Worker static const char *const horiz_stride[4] = {
141*61046927SAndroid Build Coastguard Worker [0] = "0",
142*61046927SAndroid Build Coastguard Worker [1] = "1",
143*61046927SAndroid Build Coastguard Worker [2] = "2",
144*61046927SAndroid Build Coastguard Worker [3] = "4"
145*61046927SAndroid Build Coastguard Worker };
146*61046927SAndroid Build Coastguard Worker
147*61046927SAndroid Build Coastguard Worker static const char *const chan_sel[4] = {
148*61046927SAndroid Build Coastguard Worker [0] = "x",
149*61046927SAndroid Build Coastguard Worker [1] = "y",
150*61046927SAndroid Build Coastguard Worker [2] = "z",
151*61046927SAndroid Build Coastguard Worker [3] = "w",
152*61046927SAndroid Build Coastguard Worker };
153*61046927SAndroid Build Coastguard Worker
154*61046927SAndroid Build Coastguard Worker static const char *const debug_ctrl[2] = {
155*61046927SAndroid Build Coastguard Worker [0] = "",
156*61046927SAndroid Build Coastguard Worker [1] = ".breakpoint"
157*61046927SAndroid Build Coastguard Worker };
158*61046927SAndroid Build Coastguard Worker
159*61046927SAndroid Build Coastguard Worker static const char *const saturate[2] = {
160*61046927SAndroid Build Coastguard Worker [0] = "",
161*61046927SAndroid Build Coastguard Worker [1] = ".sat"
162*61046927SAndroid Build Coastguard Worker };
163*61046927SAndroid Build Coastguard Worker
164*61046927SAndroid Build Coastguard Worker static const char *const cmpt_ctrl[2] = {
165*61046927SAndroid Build Coastguard Worker [0] = "",
166*61046927SAndroid Build Coastguard Worker [1] = "compacted"
167*61046927SAndroid Build Coastguard Worker };
168*61046927SAndroid Build Coastguard Worker
169*61046927SAndroid Build Coastguard Worker static const char *const accwr[2] = {
170*61046927SAndroid Build Coastguard Worker [0] = "",
171*61046927SAndroid Build Coastguard Worker [1] = "AccWrEnable"
172*61046927SAndroid Build Coastguard Worker };
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard Worker static const char *const branch_ctrl[2] = {
175*61046927SAndroid Build Coastguard Worker [0] = "",
176*61046927SAndroid Build Coastguard Worker [1] = "BranchCtrl"
177*61046927SAndroid Build Coastguard Worker };
178*61046927SAndroid Build Coastguard Worker
179*61046927SAndroid Build Coastguard Worker static const char *const wectrl[2] = {
180*61046927SAndroid Build Coastguard Worker [0] = "",
181*61046927SAndroid Build Coastguard Worker [1] = "WE_all"
182*61046927SAndroid Build Coastguard Worker };
183*61046927SAndroid Build Coastguard Worker
184*61046927SAndroid Build Coastguard Worker static const char *const exec_size[8] = {
185*61046927SAndroid Build Coastguard Worker [0] = "1",
186*61046927SAndroid Build Coastguard Worker [1] = "2",
187*61046927SAndroid Build Coastguard Worker [2] = "4",
188*61046927SAndroid Build Coastguard Worker [3] = "8",
189*61046927SAndroid Build Coastguard Worker [4] = "16",
190*61046927SAndroid Build Coastguard Worker [5] = "32"
191*61046927SAndroid Build Coastguard Worker };
192*61046927SAndroid Build Coastguard Worker
193*61046927SAndroid Build Coastguard Worker static const char *const pred_inv[2] = {
194*61046927SAndroid Build Coastguard Worker [0] = "+",
195*61046927SAndroid Build Coastguard Worker [1] = "-"
196*61046927SAndroid Build Coastguard Worker };
197*61046927SAndroid Build Coastguard Worker
198*61046927SAndroid Build Coastguard Worker const char *const pred_ctrl_align16[16] = {
199*61046927SAndroid Build Coastguard Worker [1] = "",
200*61046927SAndroid Build Coastguard Worker [2] = ".x",
201*61046927SAndroid Build Coastguard Worker [3] = ".y",
202*61046927SAndroid Build Coastguard Worker [4] = ".z",
203*61046927SAndroid Build Coastguard Worker [5] = ".w",
204*61046927SAndroid Build Coastguard Worker [6] = ".any4h",
205*61046927SAndroid Build Coastguard Worker [7] = ".all4h",
206*61046927SAndroid Build Coastguard Worker };
207*61046927SAndroid Build Coastguard Worker
208*61046927SAndroid Build Coastguard Worker static const char *const pred_ctrl_align1[16] = {
209*61046927SAndroid Build Coastguard Worker [BRW_PREDICATE_NORMAL] = "",
210*61046927SAndroid Build Coastguard Worker [BRW_PREDICATE_ALIGN1_ANYV] = ".anyv",
211*61046927SAndroid Build Coastguard Worker [BRW_PREDICATE_ALIGN1_ALLV] = ".allv",
212*61046927SAndroid Build Coastguard Worker [BRW_PREDICATE_ALIGN1_ANY2H] = ".any2h",
213*61046927SAndroid Build Coastguard Worker [BRW_PREDICATE_ALIGN1_ALL2H] = ".all2h",
214*61046927SAndroid Build Coastguard Worker [BRW_PREDICATE_ALIGN1_ANY4H] = ".any4h",
215*61046927SAndroid Build Coastguard Worker [BRW_PREDICATE_ALIGN1_ALL4H] = ".all4h",
216*61046927SAndroid Build Coastguard Worker [BRW_PREDICATE_ALIGN1_ANY8H] = ".any8h",
217*61046927SAndroid Build Coastguard Worker [BRW_PREDICATE_ALIGN1_ALL8H] = ".all8h",
218*61046927SAndroid Build Coastguard Worker [BRW_PREDICATE_ALIGN1_ANY16H] = ".any16h",
219*61046927SAndroid Build Coastguard Worker [BRW_PREDICATE_ALIGN1_ALL16H] = ".all16h",
220*61046927SAndroid Build Coastguard Worker [BRW_PREDICATE_ALIGN1_ANY32H] = ".any32h",
221*61046927SAndroid Build Coastguard Worker [BRW_PREDICATE_ALIGN1_ALL32H] = ".all32h",
222*61046927SAndroid Build Coastguard Worker };
223*61046927SAndroid Build Coastguard Worker
224*61046927SAndroid Build Coastguard Worker static const char *const xe2_pred_ctrl[4] = {
225*61046927SAndroid Build Coastguard Worker [BRW_PREDICATE_NORMAL] = "",
226*61046927SAndroid Build Coastguard Worker [XE2_PREDICATE_ANY] = ".any",
227*61046927SAndroid Build Coastguard Worker [XE2_PREDICATE_ALL] = ".all",
228*61046927SAndroid Build Coastguard Worker };
229*61046927SAndroid Build Coastguard Worker
230*61046927SAndroid Build Coastguard Worker static const char *const thread_ctrl[4] = {
231*61046927SAndroid Build Coastguard Worker [BRW_THREAD_NORMAL] = "",
232*61046927SAndroid Build Coastguard Worker [BRW_THREAD_ATOMIC] = "atomic",
233*61046927SAndroid Build Coastguard Worker [BRW_THREAD_SWITCH] = "switch",
234*61046927SAndroid Build Coastguard Worker };
235*61046927SAndroid Build Coastguard Worker
236*61046927SAndroid Build Coastguard Worker static const char *const dep_ctrl[4] = {
237*61046927SAndroid Build Coastguard Worker [0] = "",
238*61046927SAndroid Build Coastguard Worker [1] = "NoDDClr",
239*61046927SAndroid Build Coastguard Worker [2] = "NoDDChk",
240*61046927SAndroid Build Coastguard Worker [3] = "NoDDClr,NoDDChk",
241*61046927SAndroid Build Coastguard Worker };
242*61046927SAndroid Build Coastguard Worker
243*61046927SAndroid Build Coastguard Worker static const char *const access_mode[2] = {
244*61046927SAndroid Build Coastguard Worker [0] = "align1",
245*61046927SAndroid Build Coastguard Worker [1] = "align16",
246*61046927SAndroid Build Coastguard Worker };
247*61046927SAndroid Build Coastguard Worker
248*61046927SAndroid Build Coastguard Worker static const char *const reg_file[4] = {
249*61046927SAndroid Build Coastguard Worker [ARF] = "A",
250*61046927SAndroid Build Coastguard Worker [FIXED_GRF] = "g",
251*61046927SAndroid Build Coastguard Worker [IMM] = "imm",
252*61046927SAndroid Build Coastguard Worker };
253*61046927SAndroid Build Coastguard Worker
254*61046927SAndroid Build Coastguard Worker static const char *const writemask[16] = {
255*61046927SAndroid Build Coastguard Worker [0x0] = ".",
256*61046927SAndroid Build Coastguard Worker [0x1] = ".x",
257*61046927SAndroid Build Coastguard Worker [0x2] = ".y",
258*61046927SAndroid Build Coastguard Worker [0x3] = ".xy",
259*61046927SAndroid Build Coastguard Worker [0x4] = ".z",
260*61046927SAndroid Build Coastguard Worker [0x5] = ".xz",
261*61046927SAndroid Build Coastguard Worker [0x6] = ".yz",
262*61046927SAndroid Build Coastguard Worker [0x7] = ".xyz",
263*61046927SAndroid Build Coastguard Worker [0x8] = ".w",
264*61046927SAndroid Build Coastguard Worker [0x9] = ".xw",
265*61046927SAndroid Build Coastguard Worker [0xa] = ".yw",
266*61046927SAndroid Build Coastguard Worker [0xb] = ".xyw",
267*61046927SAndroid Build Coastguard Worker [0xc] = ".zw",
268*61046927SAndroid Build Coastguard Worker [0xd] = ".xzw",
269*61046927SAndroid Build Coastguard Worker [0xe] = ".yzw",
270*61046927SAndroid Build Coastguard Worker [0xf] = "",
271*61046927SAndroid Build Coastguard Worker };
272*61046927SAndroid Build Coastguard Worker
273*61046927SAndroid Build Coastguard Worker static const char *const end_of_thread[2] = {
274*61046927SAndroid Build Coastguard Worker [0] = "",
275*61046927SAndroid Build Coastguard Worker [1] = "EOT"
276*61046927SAndroid Build Coastguard Worker };
277*61046927SAndroid Build Coastguard Worker
278*61046927SAndroid Build Coastguard Worker static const char *const gfx6_sfid[16] = {
279*61046927SAndroid Build Coastguard Worker [BRW_SFID_NULL] = "null",
280*61046927SAndroid Build Coastguard Worker [BRW_SFID_SAMPLER] = "sampler",
281*61046927SAndroid Build Coastguard Worker [BRW_SFID_MESSAGE_GATEWAY] = "gateway",
282*61046927SAndroid Build Coastguard Worker [BRW_SFID_URB] = "urb",
283*61046927SAndroid Build Coastguard Worker [BRW_SFID_THREAD_SPAWNER] = "thread_spawner",
284*61046927SAndroid Build Coastguard Worker [GFX6_SFID_DATAPORT_SAMPLER_CACHE] = "dp_sampler",
285*61046927SAndroid Build Coastguard Worker [GFX6_SFID_DATAPORT_RENDER_CACHE] = "render",
286*61046927SAndroid Build Coastguard Worker [GFX6_SFID_DATAPORT_CONSTANT_CACHE] = "const",
287*61046927SAndroid Build Coastguard Worker [GFX7_SFID_DATAPORT_DATA_CACHE] = "data",
288*61046927SAndroid Build Coastguard Worker [GFX7_SFID_PIXEL_INTERPOLATOR] = "pixel interp",
289*61046927SAndroid Build Coastguard Worker [HSW_SFID_DATAPORT_DATA_CACHE_1] = "dp data 1",
290*61046927SAndroid Build Coastguard Worker [HSW_SFID_CRE] = "cre",
291*61046927SAndroid Build Coastguard Worker [GEN_RT_SFID_RAY_TRACE_ACCELERATOR] = "rt accel",
292*61046927SAndroid Build Coastguard Worker [GFX12_SFID_SLM] = "slm",
293*61046927SAndroid Build Coastguard Worker [GFX12_SFID_TGM] = "tgm",
294*61046927SAndroid Build Coastguard Worker [GFX12_SFID_UGM] = "ugm",
295*61046927SAndroid Build Coastguard Worker };
296*61046927SAndroid Build Coastguard Worker
297*61046927SAndroid Build Coastguard Worker static const char *const gfx7_gateway_subfuncid[8] = {
298*61046927SAndroid Build Coastguard Worker [BRW_MESSAGE_GATEWAY_SFID_OPEN_GATEWAY] = "open",
299*61046927SAndroid Build Coastguard Worker [BRW_MESSAGE_GATEWAY_SFID_CLOSE_GATEWAY] = "close",
300*61046927SAndroid Build Coastguard Worker [BRW_MESSAGE_GATEWAY_SFID_FORWARD_MSG] = "forward msg",
301*61046927SAndroid Build Coastguard Worker [BRW_MESSAGE_GATEWAY_SFID_GET_TIMESTAMP] = "get timestamp",
302*61046927SAndroid Build Coastguard Worker [BRW_MESSAGE_GATEWAY_SFID_BARRIER_MSG] = "barrier msg",
303*61046927SAndroid Build Coastguard Worker [BRW_MESSAGE_GATEWAY_SFID_UPDATE_GATEWAY_STATE] = "update state",
304*61046927SAndroid Build Coastguard Worker [BRW_MESSAGE_GATEWAY_SFID_MMIO_READ_WRITE] = "mmio read/write",
305*61046927SAndroid Build Coastguard Worker };
306*61046927SAndroid Build Coastguard Worker
307*61046927SAndroid Build Coastguard Worker static const char *const dp_rc_msg_type_gfx9[16] = {
308*61046927SAndroid Build Coastguard Worker [GFX9_DATAPORT_RC_RENDER_TARGET_WRITE] = "RT write",
309*61046927SAndroid Build Coastguard Worker [GFX9_DATAPORT_RC_RENDER_TARGET_READ] = "RT read"
310*61046927SAndroid Build Coastguard Worker };
311*61046927SAndroid Build Coastguard Worker
312*61046927SAndroid Build Coastguard Worker static const char *const *
dp_rc_msg_type(const struct intel_device_info * devinfo)313*61046927SAndroid Build Coastguard Worker dp_rc_msg_type(const struct intel_device_info *devinfo)
314*61046927SAndroid Build Coastguard Worker {
315*61046927SAndroid Build Coastguard Worker return dp_rc_msg_type_gfx9;
316*61046927SAndroid Build Coastguard Worker }
317*61046927SAndroid Build Coastguard Worker
318*61046927SAndroid Build Coastguard Worker static const char *const m_rt_write_subtype[] = {
319*61046927SAndroid Build Coastguard Worker [0b000] = "SIMD16",
320*61046927SAndroid Build Coastguard Worker [0b001] = "SIMD16/RepData",
321*61046927SAndroid Build Coastguard Worker [0b010] = "SIMD8/DualSrcLow",
322*61046927SAndroid Build Coastguard Worker [0b011] = "SIMD8/DualSrcHigh",
323*61046927SAndroid Build Coastguard Worker [0b100] = "SIMD8",
324*61046927SAndroid Build Coastguard Worker [0b101] = "SIMD8/ImageWrite", /* Gfx6+ */
325*61046927SAndroid Build Coastguard Worker [0b111] = "SIMD16/RepData-111", /* no idea how this is different than 1 */
326*61046927SAndroid Build Coastguard Worker };
327*61046927SAndroid Build Coastguard Worker
328*61046927SAndroid Build Coastguard Worker static const char *const m_rt_write_subtype_xe2[] = {
329*61046927SAndroid Build Coastguard Worker [0b000] = "SIMD16",
330*61046927SAndroid Build Coastguard Worker [0b001] = "SIMD32",
331*61046927SAndroid Build Coastguard Worker [0b010] = "SIMD16/DualSrc",
332*61046927SAndroid Build Coastguard Worker [0b011] = "invalid",
333*61046927SAndroid Build Coastguard Worker [0b100] = "invalid",
334*61046927SAndroid Build Coastguard Worker [0b101] = "invalid",
335*61046927SAndroid Build Coastguard Worker [0b111] = "invalid",
336*61046927SAndroid Build Coastguard Worker };
337*61046927SAndroid Build Coastguard Worker
338*61046927SAndroid Build Coastguard Worker static const char *const dp_dc0_msg_type_gfx7[16] = {
339*61046927SAndroid Build Coastguard Worker [GFX7_DATAPORT_DC_OWORD_BLOCK_READ] = "DC OWORD block read",
340*61046927SAndroid Build Coastguard Worker [GFX7_DATAPORT_DC_UNALIGNED_OWORD_BLOCK_READ] =
341*61046927SAndroid Build Coastguard Worker "DC unaligned OWORD block read",
342*61046927SAndroid Build Coastguard Worker [GFX7_DATAPORT_DC_OWORD_DUAL_BLOCK_READ] = "DC OWORD dual block read",
343*61046927SAndroid Build Coastguard Worker [GFX7_DATAPORT_DC_DWORD_SCATTERED_READ] = "DC DWORD scattered read",
344*61046927SAndroid Build Coastguard Worker [GFX7_DATAPORT_DC_BYTE_SCATTERED_READ] = "DC byte scattered read",
345*61046927SAndroid Build Coastguard Worker [GFX7_DATAPORT_DC_UNTYPED_SURFACE_READ] = "DC untyped surface read",
346*61046927SAndroid Build Coastguard Worker [GFX7_DATAPORT_DC_UNTYPED_ATOMIC_OP] = "DC untyped atomic",
347*61046927SAndroid Build Coastguard Worker [GFX7_DATAPORT_DC_MEMORY_FENCE] = "DC mfence",
348*61046927SAndroid Build Coastguard Worker [GFX7_DATAPORT_DC_OWORD_BLOCK_WRITE] = "DC OWORD block write",
349*61046927SAndroid Build Coastguard Worker [GFX7_DATAPORT_DC_OWORD_DUAL_BLOCK_WRITE] = "DC OWORD dual block write",
350*61046927SAndroid Build Coastguard Worker [GFX7_DATAPORT_DC_DWORD_SCATTERED_WRITE] = "DC DWORD scatterd write",
351*61046927SAndroid Build Coastguard Worker [GFX7_DATAPORT_DC_BYTE_SCATTERED_WRITE] = "DC byte scattered write",
352*61046927SAndroid Build Coastguard Worker [GFX7_DATAPORT_DC_UNTYPED_SURFACE_WRITE] = "DC untyped surface write",
353*61046927SAndroid Build Coastguard Worker };
354*61046927SAndroid Build Coastguard Worker
355*61046927SAndroid Build Coastguard Worker static const char *const dp_oword_block_rw[8] = {
356*61046927SAndroid Build Coastguard Worker [BRW_DATAPORT_OWORD_BLOCK_1_OWORDLOW] = "1-low",
357*61046927SAndroid Build Coastguard Worker [BRW_DATAPORT_OWORD_BLOCK_1_OWORDHIGH] = "1-high",
358*61046927SAndroid Build Coastguard Worker [BRW_DATAPORT_OWORD_BLOCK_2_OWORDS] = "2",
359*61046927SAndroid Build Coastguard Worker [BRW_DATAPORT_OWORD_BLOCK_4_OWORDS] = "4",
360*61046927SAndroid Build Coastguard Worker [BRW_DATAPORT_OWORD_BLOCK_8_OWORDS] = "8",
361*61046927SAndroid Build Coastguard Worker };
362*61046927SAndroid Build Coastguard Worker
363*61046927SAndroid Build Coastguard Worker static const char *const dp_dc1_msg_type_hsw[32] = {
364*61046927SAndroid Build Coastguard Worker [HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_READ] = "untyped surface read",
365*61046927SAndroid Build Coastguard Worker [HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP] = "DC untyped atomic op",
366*61046927SAndroid Build Coastguard Worker [HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP_SIMD4X2] =
367*61046927SAndroid Build Coastguard Worker "DC untyped 4x2 atomic op",
368*61046927SAndroid Build Coastguard Worker [HSW_DATAPORT_DC_PORT1_MEDIA_BLOCK_READ] = "DC media block read",
369*61046927SAndroid Build Coastguard Worker [HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_READ] = "DC typed surface read",
370*61046927SAndroid Build Coastguard Worker [HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP] = "DC typed atomic",
371*61046927SAndroid Build Coastguard Worker [HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP_SIMD4X2] = "DC typed 4x2 atomic op",
372*61046927SAndroid Build Coastguard Worker [HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_WRITE] = "DC untyped surface write",
373*61046927SAndroid Build Coastguard Worker [HSW_DATAPORT_DC_PORT1_MEDIA_BLOCK_WRITE] = "DC media block write",
374*61046927SAndroid Build Coastguard Worker [HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP] = "DC atomic counter op",
375*61046927SAndroid Build Coastguard Worker [HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP_SIMD4X2] =
376*61046927SAndroid Build Coastguard Worker "DC 4x2 atomic counter op",
377*61046927SAndroid Build Coastguard Worker [HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_WRITE] = "DC typed surface write",
378*61046927SAndroid Build Coastguard Worker [GFX9_DATAPORT_DC_PORT1_A64_SCATTERED_READ] = "DC A64 scattered read",
379*61046927SAndroid Build Coastguard Worker [GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_READ] = "DC A64 untyped surface read",
380*61046927SAndroid Build Coastguard Worker [GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_OP] = "DC A64 untyped atomic op",
381*61046927SAndroid Build Coastguard Worker [GFX9_DATAPORT_DC_PORT1_A64_OWORD_BLOCK_READ] = "DC A64 oword block read",
382*61046927SAndroid Build Coastguard Worker [GFX9_DATAPORT_DC_PORT1_A64_OWORD_BLOCK_WRITE] = "DC A64 oword block write",
383*61046927SAndroid Build Coastguard Worker [GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_WRITE] = "DC A64 untyped surface write",
384*61046927SAndroid Build Coastguard Worker [GFX8_DATAPORT_DC_PORT1_A64_SCATTERED_WRITE] = "DC A64 scattered write",
385*61046927SAndroid Build Coastguard Worker [GFX9_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_FLOAT_OP] =
386*61046927SAndroid Build Coastguard Worker "DC untyped atomic float op",
387*61046927SAndroid Build Coastguard Worker [GFX9_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_FLOAT_OP] =
388*61046927SAndroid Build Coastguard Worker "DC A64 untyped atomic float op",
389*61046927SAndroid Build Coastguard Worker [GFX12_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_HALF_INT_OP] =
390*61046927SAndroid Build Coastguard Worker "DC A64 untyped atomic half-integer op",
391*61046927SAndroid Build Coastguard Worker [GFX12_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_HALF_FLOAT_OP] =
392*61046927SAndroid Build Coastguard Worker "DC A64 untyped atomic half-float op",
393*61046927SAndroid Build Coastguard Worker };
394*61046927SAndroid Build Coastguard Worker
395*61046927SAndroid Build Coastguard Worker static const char *const aop[16] = {
396*61046927SAndroid Build Coastguard Worker [BRW_AOP_AND] = "and",
397*61046927SAndroid Build Coastguard Worker [BRW_AOP_OR] = "or",
398*61046927SAndroid Build Coastguard Worker [BRW_AOP_XOR] = "xor",
399*61046927SAndroid Build Coastguard Worker [BRW_AOP_MOV] = "mov",
400*61046927SAndroid Build Coastguard Worker [BRW_AOP_INC] = "inc",
401*61046927SAndroid Build Coastguard Worker [BRW_AOP_DEC] = "dec",
402*61046927SAndroid Build Coastguard Worker [BRW_AOP_ADD] = "add",
403*61046927SAndroid Build Coastguard Worker [BRW_AOP_SUB] = "sub",
404*61046927SAndroid Build Coastguard Worker [BRW_AOP_REVSUB] = "revsub",
405*61046927SAndroid Build Coastguard Worker [BRW_AOP_IMAX] = "imax",
406*61046927SAndroid Build Coastguard Worker [BRW_AOP_IMIN] = "imin",
407*61046927SAndroid Build Coastguard Worker [BRW_AOP_UMAX] = "umax",
408*61046927SAndroid Build Coastguard Worker [BRW_AOP_UMIN] = "umin",
409*61046927SAndroid Build Coastguard Worker [BRW_AOP_CMPWR] = "cmpwr",
410*61046927SAndroid Build Coastguard Worker [BRW_AOP_PREDEC] = "predec",
411*61046927SAndroid Build Coastguard Worker };
412*61046927SAndroid Build Coastguard Worker
413*61046927SAndroid Build Coastguard Worker static const char *const aop_float[5] = {
414*61046927SAndroid Build Coastguard Worker [BRW_AOP_FMAX] = "fmax",
415*61046927SAndroid Build Coastguard Worker [BRW_AOP_FMIN] = "fmin",
416*61046927SAndroid Build Coastguard Worker [BRW_AOP_FCMPWR] = "fcmpwr",
417*61046927SAndroid Build Coastguard Worker [BRW_AOP_FADD] = "fadd",
418*61046927SAndroid Build Coastguard Worker };
419*61046927SAndroid Build Coastguard Worker
420*61046927SAndroid Build Coastguard Worker static const char * const pixel_interpolator_msg_types[4] = {
421*61046927SAndroid Build Coastguard Worker [GFX7_PIXEL_INTERPOLATOR_LOC_SHARED_OFFSET] = "per_message_offset",
422*61046927SAndroid Build Coastguard Worker [GFX7_PIXEL_INTERPOLATOR_LOC_SAMPLE] = "sample_position",
423*61046927SAndroid Build Coastguard Worker [GFX7_PIXEL_INTERPOLATOR_LOC_CENTROID] = "centroid",
424*61046927SAndroid Build Coastguard Worker [GFX7_PIXEL_INTERPOLATOR_LOC_PER_SLOT_OFFSET] = "per_slot_offset",
425*61046927SAndroid Build Coastguard Worker };
426*61046927SAndroid Build Coastguard Worker
427*61046927SAndroid Build Coastguard Worker static const char *const math_function[16] = {
428*61046927SAndroid Build Coastguard Worker [BRW_MATH_FUNCTION_INV] = "inv",
429*61046927SAndroid Build Coastguard Worker [BRW_MATH_FUNCTION_LOG] = "log",
430*61046927SAndroid Build Coastguard Worker [BRW_MATH_FUNCTION_EXP] = "exp",
431*61046927SAndroid Build Coastguard Worker [BRW_MATH_FUNCTION_SQRT] = "sqrt",
432*61046927SAndroid Build Coastguard Worker [BRW_MATH_FUNCTION_RSQ] = "rsq",
433*61046927SAndroid Build Coastguard Worker [BRW_MATH_FUNCTION_SIN] = "sin",
434*61046927SAndroid Build Coastguard Worker [BRW_MATH_FUNCTION_COS] = "cos",
435*61046927SAndroid Build Coastguard Worker [BRW_MATH_FUNCTION_FDIV] = "fdiv",
436*61046927SAndroid Build Coastguard Worker [BRW_MATH_FUNCTION_POW] = "pow",
437*61046927SAndroid Build Coastguard Worker [BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER] = "intdivmod",
438*61046927SAndroid Build Coastguard Worker [BRW_MATH_FUNCTION_INT_DIV_QUOTIENT] = "intdiv",
439*61046927SAndroid Build Coastguard Worker [BRW_MATH_FUNCTION_INT_DIV_REMAINDER] = "intmod",
440*61046927SAndroid Build Coastguard Worker [GFX8_MATH_FUNCTION_INVM] = "invm",
441*61046927SAndroid Build Coastguard Worker [GFX8_MATH_FUNCTION_RSQRTM] = "rsqrtm",
442*61046927SAndroid Build Coastguard Worker };
443*61046927SAndroid Build Coastguard Worker
444*61046927SAndroid Build Coastguard Worker static const char *const sync_function[16] = {
445*61046927SAndroid Build Coastguard Worker [TGL_SYNC_NOP] = "nop",
446*61046927SAndroid Build Coastguard Worker [TGL_SYNC_ALLRD] = "allrd",
447*61046927SAndroid Build Coastguard Worker [TGL_SYNC_ALLWR] = "allwr",
448*61046927SAndroid Build Coastguard Worker [TGL_SYNC_FENCE] = "fence",
449*61046927SAndroid Build Coastguard Worker [TGL_SYNC_BAR] = "bar",
450*61046927SAndroid Build Coastguard Worker [TGL_SYNC_HOST] = "host",
451*61046927SAndroid Build Coastguard Worker };
452*61046927SAndroid Build Coastguard Worker
453*61046927SAndroid Build Coastguard Worker static const char *const gfx7_urb_opcode[] = {
454*61046927SAndroid Build Coastguard Worker [GFX7_URB_OPCODE_ATOMIC_MOV] = "atomic mov", /* Gfx7+ */
455*61046927SAndroid Build Coastguard Worker [GFX7_URB_OPCODE_ATOMIC_INC] = "atomic inc", /* Gfx7+ */
456*61046927SAndroid Build Coastguard Worker [GFX8_URB_OPCODE_ATOMIC_ADD] = "atomic add", /* Gfx8+ */
457*61046927SAndroid Build Coastguard Worker [GFX8_URB_OPCODE_SIMD8_WRITE] = "SIMD8 write", /* Gfx8+ */
458*61046927SAndroid Build Coastguard Worker [GFX8_URB_OPCODE_SIMD8_READ] = "SIMD8 read", /* Gfx8+ */
459*61046927SAndroid Build Coastguard Worker [GFX125_URB_OPCODE_FENCE] = "fence", /* Gfx12.5+ */
460*61046927SAndroid Build Coastguard Worker /* [10-15] - reserved */
461*61046927SAndroid Build Coastguard Worker };
462*61046927SAndroid Build Coastguard Worker
463*61046927SAndroid Build Coastguard Worker static const char *const urb_swizzle[4] = {
464*61046927SAndroid Build Coastguard Worker [BRW_URB_SWIZZLE_NONE] = "",
465*61046927SAndroid Build Coastguard Worker [BRW_URB_SWIZZLE_INTERLEAVE] = "interleave",
466*61046927SAndroid Build Coastguard Worker [BRW_URB_SWIZZLE_TRANSPOSE] = "transpose",
467*61046927SAndroid Build Coastguard Worker };
468*61046927SAndroid Build Coastguard Worker
469*61046927SAndroid Build Coastguard Worker static const char *const gfx5_sampler_msg_type[] = {
470*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE] = "sample",
471*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_BIAS] = "sample_b",
472*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_LOD] = "sample_l",
473*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_COMPARE] = "sample_c",
474*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_DERIVS] = "sample_d",
475*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_BIAS_COMPARE] = "sample_b_c",
476*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_LOD_COMPARE] = "sample_l_c",
477*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_LD] = "ld",
478*61046927SAndroid Build Coastguard Worker [GFX7_SAMPLER_MESSAGE_SAMPLE_GATHER4] = "gather4",
479*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_LOD] = "lod",
480*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_RESINFO] = "resinfo",
481*61046927SAndroid Build Coastguard Worker [GFX6_SAMPLER_MESSAGE_SAMPLE_SAMPLEINFO] = "sampleinfo",
482*61046927SAndroid Build Coastguard Worker [GFX7_SAMPLER_MESSAGE_SAMPLE_GATHER4_C] = "gather4_c",
483*61046927SAndroid Build Coastguard Worker [GFX7_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO] = "gather4_po",
484*61046927SAndroid Build Coastguard Worker [GFX7_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO_C] = "gather4_po_c",
485*61046927SAndroid Build Coastguard Worker [HSW_SAMPLER_MESSAGE_SAMPLE_DERIV_COMPARE] = "sample_d_c",
486*61046927SAndroid Build Coastguard Worker [GFX9_SAMPLER_MESSAGE_SAMPLE_LZ] = "sample_lz",
487*61046927SAndroid Build Coastguard Worker [GFX9_SAMPLER_MESSAGE_SAMPLE_C_LZ] = "sample_c_lz",
488*61046927SAndroid Build Coastguard Worker [GFX9_SAMPLER_MESSAGE_SAMPLE_LD_LZ] = "ld_lz",
489*61046927SAndroid Build Coastguard Worker [GFX9_SAMPLER_MESSAGE_SAMPLE_LD2DMS_W] = "ld2dms_w",
490*61046927SAndroid Build Coastguard Worker [GFX7_SAMPLER_MESSAGE_SAMPLE_LD_MCS] = "ld_mcs",
491*61046927SAndroid Build Coastguard Worker [GFX7_SAMPLER_MESSAGE_SAMPLE_LD2DMS] = "ld2dms",
492*61046927SAndroid Build Coastguard Worker [GFX7_SAMPLER_MESSAGE_SAMPLE_LD2DSS] = "ld2dss",
493*61046927SAndroid Build Coastguard Worker };
494*61046927SAndroid Build Coastguard Worker
495*61046927SAndroid Build Coastguard Worker static const char *const xe2_sampler_msg_type[] = {
496*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE] = "sample",
497*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_BIAS] = "sample_b",
498*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_LOD] = "sample_l",
499*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_COMPARE] = "sample_c",
500*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_DERIVS] = "sample_d",
501*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_BIAS_COMPARE] = "sample_b_c",
502*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_LOD_COMPARE] = "sample_l_c",
503*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_LD] = "ld",
504*61046927SAndroid Build Coastguard Worker [GFX7_SAMPLER_MESSAGE_SAMPLE_GATHER4] = "gather4",
505*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_LOD] = "lod",
506*61046927SAndroid Build Coastguard Worker [GFX5_SAMPLER_MESSAGE_SAMPLE_RESINFO] = "resinfo",
507*61046927SAndroid Build Coastguard Worker [GFX6_SAMPLER_MESSAGE_SAMPLE_SAMPLEINFO] = "sampleinfo",
508*61046927SAndroid Build Coastguard Worker [GFX7_SAMPLER_MESSAGE_SAMPLE_GATHER4_C] = "gather4_c",
509*61046927SAndroid Build Coastguard Worker [GFX7_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO] = "gather4_po",
510*61046927SAndroid Build Coastguard Worker [XE2_SAMPLER_MESSAGE_SAMPLE_MLOD] = "sample_mlod",
511*61046927SAndroid Build Coastguard Worker [XE2_SAMPLER_MESSAGE_SAMPLE_COMPARE_MLOD] = "sample_c_mlod",
512*61046927SAndroid Build Coastguard Worker [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_I] = "gather4_i",
513*61046927SAndroid Build Coastguard Worker [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_L] = "gather4_l",
514*61046927SAndroid Build Coastguard Worker [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_B] = "gather4_b",
515*61046927SAndroid Build Coastguard Worker [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_I_C] = "gather4_i_c",
516*61046927SAndroid Build Coastguard Worker [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_L_C] = "gather4_l_c",
517*61046927SAndroid Build Coastguard Worker [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO_L] = "gather4_po_l",
518*61046927SAndroid Build Coastguard Worker [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO_L_C] = "gather4_po_l_c",
519*61046927SAndroid Build Coastguard Worker [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO_B] = "gather4_po_b",
520*61046927SAndroid Build Coastguard Worker [HSW_SAMPLER_MESSAGE_SAMPLE_DERIV_COMPARE] = "sample_d_c",
521*61046927SAndroid Build Coastguard Worker [GFX9_SAMPLER_MESSAGE_SAMPLE_LZ] = "sample_lz",
522*61046927SAndroid Build Coastguard Worker [GFX9_SAMPLER_MESSAGE_SAMPLE_C_LZ] = "sample_c_lz",
523*61046927SAndroid Build Coastguard Worker [GFX9_SAMPLER_MESSAGE_SAMPLE_LD_LZ] = "ld_lz",
524*61046927SAndroid Build Coastguard Worker [GFX9_SAMPLER_MESSAGE_SAMPLE_LD2DMS_W] = "ld2dms_w",
525*61046927SAndroid Build Coastguard Worker [GFX7_SAMPLER_MESSAGE_SAMPLE_LD_MCS] = "ld_mcs",
526*61046927SAndroid Build Coastguard Worker [GFX7_SAMPLER_MESSAGE_SAMPLE_LD2DMS] = "ld2dms",
527*61046927SAndroid Build Coastguard Worker [GFX7_SAMPLER_MESSAGE_SAMPLE_LD2DSS] = "ld2dss",
528*61046927SAndroid Build Coastguard Worker };
529*61046927SAndroid Build Coastguard Worker
530*61046927SAndroid Build Coastguard Worker static const char *const gfx5_sampler_simd_mode[7] = {
531*61046927SAndroid Build Coastguard Worker [BRW_SAMPLER_SIMD_MODE_SIMD4X2] = "SIMD4x2",
532*61046927SAndroid Build Coastguard Worker [BRW_SAMPLER_SIMD_MODE_SIMD8] = "SIMD8",
533*61046927SAndroid Build Coastguard Worker [BRW_SAMPLER_SIMD_MODE_SIMD16] = "SIMD16",
534*61046927SAndroid Build Coastguard Worker [BRW_SAMPLER_SIMD_MODE_SIMD32_64] = "SIMD32/64",
535*61046927SAndroid Build Coastguard Worker [GFX10_SAMPLER_SIMD_MODE_SIMD8H] = "SIMD8H",
536*61046927SAndroid Build Coastguard Worker [GFX10_SAMPLER_SIMD_MODE_SIMD16H] = "SIMD16H",
537*61046927SAndroid Build Coastguard Worker };
538*61046927SAndroid Build Coastguard Worker
539*61046927SAndroid Build Coastguard Worker static const char *const xe2_sampler_simd_mode[7] = {
540*61046927SAndroid Build Coastguard Worker [XE2_SAMPLER_SIMD_MODE_SIMD16] = "SIMD16",
541*61046927SAndroid Build Coastguard Worker [XE2_SAMPLER_SIMD_MODE_SIMD32] = "SIMD32",
542*61046927SAndroid Build Coastguard Worker [XE2_SAMPLER_SIMD_MODE_SIMD16H] = "SIMD16H",
543*61046927SAndroid Build Coastguard Worker [XE2_SAMPLER_SIMD_MODE_SIMD32H] = "SIMD32H",
544*61046927SAndroid Build Coastguard Worker };
545*61046927SAndroid Build Coastguard Worker
546*61046927SAndroid Build Coastguard Worker static const char *const lsc_operation[] = {
547*61046927SAndroid Build Coastguard Worker [LSC_OP_LOAD] = "load",
548*61046927SAndroid Build Coastguard Worker [LSC_OP_LOAD_CMASK] = "load_cmask",
549*61046927SAndroid Build Coastguard Worker [LSC_OP_STORE] = "store",
550*61046927SAndroid Build Coastguard Worker [LSC_OP_STORE_CMASK] = "store_cmask",
551*61046927SAndroid Build Coastguard Worker [LSC_OP_FENCE] = "fence",
552*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_INC] = "atomic_inc",
553*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_DEC] = "atomic_dec",
554*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_LOAD] = "atomic_load",
555*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_STORE] = "atomic_store",
556*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_ADD] = "atomic_add",
557*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_SUB] = "atomic_sub",
558*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_MIN] = "atomic_min",
559*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_MAX] = "atomic_max",
560*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_UMIN] = "atomic_umin",
561*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_UMAX] = "atomic_umax",
562*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_CMPXCHG] = "atomic_cmpxchg",
563*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_FADD] = "atomic_fadd",
564*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_FSUB] = "atomic_fsub",
565*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_FMIN] = "atomic_fmin",
566*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_FMAX] = "atomic_fmax",
567*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_FCMPXCHG] = "atomic_fcmpxchg",
568*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_AND] = "atomic_and",
569*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_OR] = "atomic_or",
570*61046927SAndroid Build Coastguard Worker [LSC_OP_ATOMIC_XOR] = "atomic_xor",
571*61046927SAndroid Build Coastguard Worker };
572*61046927SAndroid Build Coastguard Worker
573*61046927SAndroid Build Coastguard Worker const char *
brw_lsc_op_to_string(unsigned op)574*61046927SAndroid Build Coastguard Worker brw_lsc_op_to_string(unsigned op)
575*61046927SAndroid Build Coastguard Worker {
576*61046927SAndroid Build Coastguard Worker assert(op < ARRAY_SIZE(lsc_operation));
577*61046927SAndroid Build Coastguard Worker return lsc_operation[op];
578*61046927SAndroid Build Coastguard Worker }
579*61046927SAndroid Build Coastguard Worker
580*61046927SAndroid Build Coastguard Worker static const char *const lsc_addr_surface_type[] = {
581*61046927SAndroid Build Coastguard Worker [LSC_ADDR_SURFTYPE_FLAT] = "flat",
582*61046927SAndroid Build Coastguard Worker [LSC_ADDR_SURFTYPE_BSS] = "bss",
583*61046927SAndroid Build Coastguard Worker [LSC_ADDR_SURFTYPE_SS] = "ss",
584*61046927SAndroid Build Coastguard Worker [LSC_ADDR_SURFTYPE_BTI] = "bti",
585*61046927SAndroid Build Coastguard Worker };
586*61046927SAndroid Build Coastguard Worker
587*61046927SAndroid Build Coastguard Worker const char *
brw_lsc_addr_surftype_to_string(unsigned t)588*61046927SAndroid Build Coastguard Worker brw_lsc_addr_surftype_to_string(unsigned t)
589*61046927SAndroid Build Coastguard Worker {
590*61046927SAndroid Build Coastguard Worker assert(t < ARRAY_SIZE(lsc_addr_surface_type));
591*61046927SAndroid Build Coastguard Worker return lsc_addr_surface_type[t];
592*61046927SAndroid Build Coastguard Worker }
593*61046927SAndroid Build Coastguard Worker
594*61046927SAndroid Build Coastguard Worker static const char* const lsc_fence_scope[] = {
595*61046927SAndroid Build Coastguard Worker [LSC_FENCE_THREADGROUP] = "threadgroup",
596*61046927SAndroid Build Coastguard Worker [LSC_FENCE_LOCAL] = "local",
597*61046927SAndroid Build Coastguard Worker [LSC_FENCE_TILE] = "tile",
598*61046927SAndroid Build Coastguard Worker [LSC_FENCE_GPU] = "gpu",
599*61046927SAndroid Build Coastguard Worker [LSC_FENCE_ALL_GPU] = "all_gpu",
600*61046927SAndroid Build Coastguard Worker [LSC_FENCE_SYSTEM_RELEASE] = "system_release",
601*61046927SAndroid Build Coastguard Worker [LSC_FENCE_SYSTEM_ACQUIRE] = "system_acquire",
602*61046927SAndroid Build Coastguard Worker };
603*61046927SAndroid Build Coastguard Worker
604*61046927SAndroid Build Coastguard Worker static const char* const lsc_flush_type[] = {
605*61046927SAndroid Build Coastguard Worker [LSC_FLUSH_TYPE_NONE] = "none",
606*61046927SAndroid Build Coastguard Worker [LSC_FLUSH_TYPE_EVICT] = "evict",
607*61046927SAndroid Build Coastguard Worker [LSC_FLUSH_TYPE_INVALIDATE] = "invalidate",
608*61046927SAndroid Build Coastguard Worker [LSC_FLUSH_TYPE_DISCARD] = "discard",
609*61046927SAndroid Build Coastguard Worker [LSC_FLUSH_TYPE_CLEAN] = "clean",
610*61046927SAndroid Build Coastguard Worker [LSC_FLUSH_TYPE_L3ONLY] = "l3only",
611*61046927SAndroid Build Coastguard Worker [LSC_FLUSH_TYPE_NONE_6] = "none_6",
612*61046927SAndroid Build Coastguard Worker };
613*61046927SAndroid Build Coastguard Worker
614*61046927SAndroid Build Coastguard Worker static const char* const lsc_addr_size[] = {
615*61046927SAndroid Build Coastguard Worker [LSC_ADDR_SIZE_A16] = "a16",
616*61046927SAndroid Build Coastguard Worker [LSC_ADDR_SIZE_A32] = "a32",
617*61046927SAndroid Build Coastguard Worker [LSC_ADDR_SIZE_A64] = "a64",
618*61046927SAndroid Build Coastguard Worker };
619*61046927SAndroid Build Coastguard Worker
620*61046927SAndroid Build Coastguard Worker static const char* const lsc_backup_fence_routing[] = {
621*61046927SAndroid Build Coastguard Worker [LSC_NORMAL_ROUTING] = "normal_routing",
622*61046927SAndroid Build Coastguard Worker [LSC_ROUTE_TO_LSC] = "route_to_lsc",
623*61046927SAndroid Build Coastguard Worker };
624*61046927SAndroid Build Coastguard Worker
625*61046927SAndroid Build Coastguard Worker static const char* const lsc_data_size[] = {
626*61046927SAndroid Build Coastguard Worker [LSC_DATA_SIZE_D8] = "d8",
627*61046927SAndroid Build Coastguard Worker [LSC_DATA_SIZE_D16] = "d16",
628*61046927SAndroid Build Coastguard Worker [LSC_DATA_SIZE_D32] = "d32",
629*61046927SAndroid Build Coastguard Worker [LSC_DATA_SIZE_D64] = "d64",
630*61046927SAndroid Build Coastguard Worker [LSC_DATA_SIZE_D8U32] = "d8u32",
631*61046927SAndroid Build Coastguard Worker [LSC_DATA_SIZE_D16U32] = "d16u32",
632*61046927SAndroid Build Coastguard Worker [LSC_DATA_SIZE_D16BF32] = "d16bf32",
633*61046927SAndroid Build Coastguard Worker };
634*61046927SAndroid Build Coastguard Worker
635*61046927SAndroid Build Coastguard Worker const char *
brw_lsc_data_size_to_string(unsigned s)636*61046927SAndroid Build Coastguard Worker brw_lsc_data_size_to_string(unsigned s)
637*61046927SAndroid Build Coastguard Worker {
638*61046927SAndroid Build Coastguard Worker assert(s < ARRAY_SIZE(lsc_data_size));
639*61046927SAndroid Build Coastguard Worker return lsc_data_size[s];
640*61046927SAndroid Build Coastguard Worker }
641*61046927SAndroid Build Coastguard Worker
642*61046927SAndroid Build Coastguard Worker static const char* const lsc_vect_size_str[] = {
643*61046927SAndroid Build Coastguard Worker [LSC_VECT_SIZE_V1] = "V1",
644*61046927SAndroid Build Coastguard Worker [LSC_VECT_SIZE_V2] = "V2",
645*61046927SAndroid Build Coastguard Worker [LSC_VECT_SIZE_V3] = "V3",
646*61046927SAndroid Build Coastguard Worker [LSC_VECT_SIZE_V4] = "V4",
647*61046927SAndroid Build Coastguard Worker [LSC_VECT_SIZE_V8] = "V8",
648*61046927SAndroid Build Coastguard Worker [LSC_VECT_SIZE_V16] = "V16",
649*61046927SAndroid Build Coastguard Worker [LSC_VECT_SIZE_V32] = "V32",
650*61046927SAndroid Build Coastguard Worker [LSC_VECT_SIZE_V64] = "V64",
651*61046927SAndroid Build Coastguard Worker };
652*61046927SAndroid Build Coastguard Worker
653*61046927SAndroid Build Coastguard Worker static const char* const lsc_cmask_str[] = {
654*61046927SAndroid Build Coastguard Worker [LSC_CMASK_X] = "x",
655*61046927SAndroid Build Coastguard Worker [LSC_CMASK_Y] = "y",
656*61046927SAndroid Build Coastguard Worker [LSC_CMASK_XY] = "xy",
657*61046927SAndroid Build Coastguard Worker [LSC_CMASK_Z] = "z",
658*61046927SAndroid Build Coastguard Worker [LSC_CMASK_XZ] = "xz",
659*61046927SAndroid Build Coastguard Worker [LSC_CMASK_YZ] = "yz",
660*61046927SAndroid Build Coastguard Worker [LSC_CMASK_XYZ] = "xyz",
661*61046927SAndroid Build Coastguard Worker [LSC_CMASK_W] = "w",
662*61046927SAndroid Build Coastguard Worker [LSC_CMASK_XW] = "xw",
663*61046927SAndroid Build Coastguard Worker [LSC_CMASK_YW] = "yw",
664*61046927SAndroid Build Coastguard Worker [LSC_CMASK_XYW] = "xyw",
665*61046927SAndroid Build Coastguard Worker [LSC_CMASK_ZW] = "zw",
666*61046927SAndroid Build Coastguard Worker [LSC_CMASK_XZW] = "xzw",
667*61046927SAndroid Build Coastguard Worker [LSC_CMASK_YZW] = "yzw",
668*61046927SAndroid Build Coastguard Worker [LSC_CMASK_XYZW] = "xyzw",
669*61046927SAndroid Build Coastguard Worker };
670*61046927SAndroid Build Coastguard Worker
671*61046927SAndroid Build Coastguard Worker static const char* const lsc_cache_load[] = {
672*61046927SAndroid Build Coastguard Worker [LSC_CACHE_LOAD_L1STATE_L3MOCS] = "L1STATE_L3MOCS",
673*61046927SAndroid Build Coastguard Worker [LSC_CACHE_LOAD_L1UC_L3UC] = "L1UC_L3UC",
674*61046927SAndroid Build Coastguard Worker [LSC_CACHE_LOAD_L1UC_L3C] = "L1UC_L3C",
675*61046927SAndroid Build Coastguard Worker [LSC_CACHE_LOAD_L1C_L3UC] = "L1C_L3UC",
676*61046927SAndroid Build Coastguard Worker [LSC_CACHE_LOAD_L1C_L3C] = "L1C_L3C",
677*61046927SAndroid Build Coastguard Worker [LSC_CACHE_LOAD_L1S_L3UC] = "L1S_L3UC",
678*61046927SAndroid Build Coastguard Worker [LSC_CACHE_LOAD_L1S_L3C] = "L1S_L3C",
679*61046927SAndroid Build Coastguard Worker [LSC_CACHE_LOAD_L1IAR_L3C] = "L1IAR_L3C",
680*61046927SAndroid Build Coastguard Worker };
681*61046927SAndroid Build Coastguard Worker
682*61046927SAndroid Build Coastguard Worker static const char* const lsc_cache_store[] = {
683*61046927SAndroid Build Coastguard Worker [LSC_CACHE_STORE_L1STATE_L3MOCS] = "L1STATE_L3MOCS",
684*61046927SAndroid Build Coastguard Worker [LSC_CACHE_STORE_L1UC_L3UC] = "L1UC_L3UC",
685*61046927SAndroid Build Coastguard Worker [LSC_CACHE_STORE_L1UC_L3WB] = "L1UC_L3WB",
686*61046927SAndroid Build Coastguard Worker [LSC_CACHE_STORE_L1WT_L3UC] = "L1WT_L3UC",
687*61046927SAndroid Build Coastguard Worker [LSC_CACHE_STORE_L1WT_L3WB] = "L1WT_L3WB",
688*61046927SAndroid Build Coastguard Worker [LSC_CACHE_STORE_L1S_L3UC] = "L1S_L3UC",
689*61046927SAndroid Build Coastguard Worker [LSC_CACHE_STORE_L1S_L3WB] = "L1S_L3WB",
690*61046927SAndroid Build Coastguard Worker [LSC_CACHE_STORE_L1WB_L3WB] = "L1WB_L3WB",
691*61046927SAndroid Build Coastguard Worker };
692*61046927SAndroid Build Coastguard Worker
693*61046927SAndroid Build Coastguard Worker static const char* const xe2_lsc_cache_load[] = {
694*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_LOAD_L1STATE_L3MOCS] = "L1STATE_L3MOCS",
695*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_LOAD_L1UC_L3UC] = "L1UC_L3UC",
696*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_LOAD_L1UC_L3C] = "L1UC_L3C",
697*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_LOAD_L1UC_L3CC] = "L1UC_L3CC",
698*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_LOAD_L1C_L3UC] = "L1C_L3UC",
699*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_LOAD_L1C_L3C] = "L1C_L3C",
700*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_LOAD_L1C_L3CC] = "L1C_L3CC",
701*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_LOAD_L1S_L3UC] = "L1S_L3UC",
702*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_LOAD_L1S_L3C] = "L1S_L3C",
703*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_LOAD_L1IAR_L3IAR] = "L1IAR_L3IAR",
704*61046927SAndroid Build Coastguard Worker };
705*61046927SAndroid Build Coastguard Worker
706*61046927SAndroid Build Coastguard Worker static const char* const xe2_lsc_cache_store[] = {
707*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_STORE_L1STATE_L3MOCS] = "L1STATE_L3MOCS",
708*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_STORE_L1UC_L3UC] = "L1UC_L3UC",
709*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_STORE_L1UC_L3WB] = "L1UC_L3WB",
710*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_STORE_L1WT_L3UC] = "L1WT_L3UC",
711*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_STORE_L1WT_L3WB] = "L1WT_L3WB",
712*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_STORE_L1S_L3UC] = "L1S_L3UC",
713*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_STORE_L1S_L3WB] = "L1S_L3WB",
714*61046927SAndroid Build Coastguard Worker [XE2_LSC_CACHE_STORE_L1WB_L3WB] = "L1WB_L3WB",
715*61046927SAndroid Build Coastguard Worker };
716*61046927SAndroid Build Coastguard Worker
717*61046927SAndroid Build Coastguard Worker static const char* const dpas_systolic_depth[4] = {
718*61046927SAndroid Build Coastguard Worker [0] = "16",
719*61046927SAndroid Build Coastguard Worker [1] = "2",
720*61046927SAndroid Build Coastguard Worker [2] = "4",
721*61046927SAndroid Build Coastguard Worker [3] = "8"
722*61046927SAndroid Build Coastguard Worker };
723*61046927SAndroid Build Coastguard Worker
724*61046927SAndroid Build Coastguard Worker static int column;
725*61046927SAndroid Build Coastguard Worker
726*61046927SAndroid Build Coastguard Worker static int
string(FILE * file,const char * string)727*61046927SAndroid Build Coastguard Worker string(FILE *file, const char *string)
728*61046927SAndroid Build Coastguard Worker {
729*61046927SAndroid Build Coastguard Worker fputs(string, file);
730*61046927SAndroid Build Coastguard Worker column += strlen(string);
731*61046927SAndroid Build Coastguard Worker return 0;
732*61046927SAndroid Build Coastguard Worker }
733*61046927SAndroid Build Coastguard Worker
734*61046927SAndroid Build Coastguard Worker static int
735*61046927SAndroid Build Coastguard Worker format(FILE *f, const char *format, ...) PRINTFLIKE(2, 3);
736*61046927SAndroid Build Coastguard Worker
737*61046927SAndroid Build Coastguard Worker static int
format(FILE * f,const char * format,...)738*61046927SAndroid Build Coastguard Worker format(FILE *f, const char *format, ...)
739*61046927SAndroid Build Coastguard Worker {
740*61046927SAndroid Build Coastguard Worker char buf[1024];
741*61046927SAndroid Build Coastguard Worker va_list args;
742*61046927SAndroid Build Coastguard Worker va_start(args, format);
743*61046927SAndroid Build Coastguard Worker
744*61046927SAndroid Build Coastguard Worker vsnprintf(buf, sizeof(buf) - 1, format, args);
745*61046927SAndroid Build Coastguard Worker va_end(args);
746*61046927SAndroid Build Coastguard Worker string(f, buf);
747*61046927SAndroid Build Coastguard Worker return 0;
748*61046927SAndroid Build Coastguard Worker }
749*61046927SAndroid Build Coastguard Worker
750*61046927SAndroid Build Coastguard Worker static int
newline(FILE * f)751*61046927SAndroid Build Coastguard Worker newline(FILE *f)
752*61046927SAndroid Build Coastguard Worker {
753*61046927SAndroid Build Coastguard Worker putc('\n', f);
754*61046927SAndroid Build Coastguard Worker column = 0;
755*61046927SAndroid Build Coastguard Worker return 0;
756*61046927SAndroid Build Coastguard Worker }
757*61046927SAndroid Build Coastguard Worker
758*61046927SAndroid Build Coastguard Worker static int
pad(FILE * f,int c)759*61046927SAndroid Build Coastguard Worker pad(FILE *f, int c)
760*61046927SAndroid Build Coastguard Worker {
761*61046927SAndroid Build Coastguard Worker do
762*61046927SAndroid Build Coastguard Worker string(f, " ");
763*61046927SAndroid Build Coastguard Worker while (column < c);
764*61046927SAndroid Build Coastguard Worker return 0;
765*61046927SAndroid Build Coastguard Worker }
766*61046927SAndroid Build Coastguard Worker
767*61046927SAndroid Build Coastguard Worker static int
control(FILE * file,const char * name,const char * const ctrl[],unsigned id,int * space)768*61046927SAndroid Build Coastguard Worker control(FILE *file, const char *name, const char *const ctrl[],
769*61046927SAndroid Build Coastguard Worker unsigned id, int *space)
770*61046927SAndroid Build Coastguard Worker {
771*61046927SAndroid Build Coastguard Worker if (!ctrl[id]) {
772*61046927SAndroid Build Coastguard Worker fprintf(file, "*** invalid %s value %d ", name, id);
773*61046927SAndroid Build Coastguard Worker return 1;
774*61046927SAndroid Build Coastguard Worker }
775*61046927SAndroid Build Coastguard Worker if (ctrl[id][0]) {
776*61046927SAndroid Build Coastguard Worker if (space && *space)
777*61046927SAndroid Build Coastguard Worker string(file, " ");
778*61046927SAndroid Build Coastguard Worker string(file, ctrl[id]);
779*61046927SAndroid Build Coastguard Worker if (space)
780*61046927SAndroid Build Coastguard Worker *space = 1;
781*61046927SAndroid Build Coastguard Worker }
782*61046927SAndroid Build Coastguard Worker return 0;
783*61046927SAndroid Build Coastguard Worker }
784*61046927SAndroid Build Coastguard Worker
785*61046927SAndroid Build Coastguard Worker static int
print_opcode(FILE * file,const struct brw_isa_info * isa,enum opcode id)786*61046927SAndroid Build Coastguard Worker print_opcode(FILE *file, const struct brw_isa_info *isa,
787*61046927SAndroid Build Coastguard Worker enum opcode id)
788*61046927SAndroid Build Coastguard Worker {
789*61046927SAndroid Build Coastguard Worker const struct opcode_desc *desc = brw_opcode_desc(isa, id);
790*61046927SAndroid Build Coastguard Worker if (!desc) {
791*61046927SAndroid Build Coastguard Worker format(file, "*** invalid opcode value %d ", id);
792*61046927SAndroid Build Coastguard Worker return 1;
793*61046927SAndroid Build Coastguard Worker }
794*61046927SAndroid Build Coastguard Worker string(file, desc->name);
795*61046927SAndroid Build Coastguard Worker return 0;
796*61046927SAndroid Build Coastguard Worker }
797*61046927SAndroid Build Coastguard Worker
798*61046927SAndroid Build Coastguard Worker static int
reg(FILE * file,unsigned _reg_file,unsigned _reg_nr)799*61046927SAndroid Build Coastguard Worker reg(FILE *file, unsigned _reg_file, unsigned _reg_nr)
800*61046927SAndroid Build Coastguard Worker {
801*61046927SAndroid Build Coastguard Worker int err = 0;
802*61046927SAndroid Build Coastguard Worker
803*61046927SAndroid Build Coastguard Worker if (_reg_file == ARF) {
804*61046927SAndroid Build Coastguard Worker switch (_reg_nr & 0xf0) {
805*61046927SAndroid Build Coastguard Worker case BRW_ARF_NULL:
806*61046927SAndroid Build Coastguard Worker string(file, "null");
807*61046927SAndroid Build Coastguard Worker break;
808*61046927SAndroid Build Coastguard Worker case BRW_ARF_ADDRESS:
809*61046927SAndroid Build Coastguard Worker format(file, "a%d", _reg_nr & 0x0f);
810*61046927SAndroid Build Coastguard Worker break;
811*61046927SAndroid Build Coastguard Worker case BRW_ARF_ACCUMULATOR:
812*61046927SAndroid Build Coastguard Worker format(file, "acc%d", _reg_nr & 0x0f);
813*61046927SAndroid Build Coastguard Worker break;
814*61046927SAndroid Build Coastguard Worker case BRW_ARF_FLAG:
815*61046927SAndroid Build Coastguard Worker format(file, "f%d", _reg_nr & 0x0f);
816*61046927SAndroid Build Coastguard Worker break;
817*61046927SAndroid Build Coastguard Worker case BRW_ARF_MASK:
818*61046927SAndroid Build Coastguard Worker format(file, "mask%d", _reg_nr & 0x0f);
819*61046927SAndroid Build Coastguard Worker break;
820*61046927SAndroid Build Coastguard Worker case BRW_ARF_STATE:
821*61046927SAndroid Build Coastguard Worker format(file, "sr%d", _reg_nr & 0x0f);
822*61046927SAndroid Build Coastguard Worker break;
823*61046927SAndroid Build Coastguard Worker case BRW_ARF_CONTROL:
824*61046927SAndroid Build Coastguard Worker format(file, "cr%d", _reg_nr & 0x0f);
825*61046927SAndroid Build Coastguard Worker break;
826*61046927SAndroid Build Coastguard Worker case BRW_ARF_NOTIFICATION_COUNT:
827*61046927SAndroid Build Coastguard Worker format(file, "n%d", _reg_nr & 0x0f);
828*61046927SAndroid Build Coastguard Worker break;
829*61046927SAndroid Build Coastguard Worker case BRW_ARF_IP:
830*61046927SAndroid Build Coastguard Worker string(file, "ip");
831*61046927SAndroid Build Coastguard Worker return -1;
832*61046927SAndroid Build Coastguard Worker break;
833*61046927SAndroid Build Coastguard Worker case BRW_ARF_TDR:
834*61046927SAndroid Build Coastguard Worker format(file, "tdr0");
835*61046927SAndroid Build Coastguard Worker return -1;
836*61046927SAndroid Build Coastguard Worker case BRW_ARF_TIMESTAMP:
837*61046927SAndroid Build Coastguard Worker format(file, "tm%d", _reg_nr & 0x0f);
838*61046927SAndroid Build Coastguard Worker break;
839*61046927SAndroid Build Coastguard Worker default:
840*61046927SAndroid Build Coastguard Worker format(file, "ARF%d", _reg_nr);
841*61046927SAndroid Build Coastguard Worker break;
842*61046927SAndroid Build Coastguard Worker }
843*61046927SAndroid Build Coastguard Worker } else {
844*61046927SAndroid Build Coastguard Worker err |= control(file, "src reg file", reg_file, _reg_file, NULL);
845*61046927SAndroid Build Coastguard Worker format(file, "%d", _reg_nr);
846*61046927SAndroid Build Coastguard Worker }
847*61046927SAndroid Build Coastguard Worker return err;
848*61046927SAndroid Build Coastguard Worker }
849*61046927SAndroid Build Coastguard Worker
850*61046927SAndroid Build Coastguard Worker static int
dest(FILE * file,const struct brw_isa_info * isa,const brw_inst * inst)851*61046927SAndroid Build Coastguard Worker dest(FILE *file, const struct brw_isa_info *isa, const brw_inst *inst)
852*61046927SAndroid Build Coastguard Worker {
853*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo = isa->devinfo;
854*61046927SAndroid Build Coastguard Worker enum brw_reg_type type = brw_inst_dst_type(devinfo, inst);
855*61046927SAndroid Build Coastguard Worker unsigned elem_size = brw_type_size_bytes(type);
856*61046927SAndroid Build Coastguard Worker int err = 0;
857*61046927SAndroid Build Coastguard Worker
858*61046927SAndroid Build Coastguard Worker if (is_split_send(devinfo, brw_inst_opcode(isa, inst))) {
859*61046927SAndroid Build Coastguard Worker /* These are fixed for split sends */
860*61046927SAndroid Build Coastguard Worker type = BRW_TYPE_UD;
861*61046927SAndroid Build Coastguard Worker elem_size = 4;
862*61046927SAndroid Build Coastguard Worker if (devinfo->ver >= 12) {
863*61046927SAndroid Build Coastguard Worker err |= reg(file, brw_inst_send_dst_reg_file(devinfo, inst),
864*61046927SAndroid Build Coastguard Worker brw_inst_dst_da_reg_nr(devinfo, inst));
865*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
866*61046927SAndroid Build Coastguard Worker } else if (brw_inst_dst_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
867*61046927SAndroid Build Coastguard Worker err |= reg(file, brw_inst_send_dst_reg_file(devinfo, inst),
868*61046927SAndroid Build Coastguard Worker brw_inst_dst_da_reg_nr(devinfo, inst));
869*61046927SAndroid Build Coastguard Worker unsigned subreg_nr = brw_inst_dst_da16_subreg_nr(devinfo, inst);
870*61046927SAndroid Build Coastguard Worker if (subreg_nr)
871*61046927SAndroid Build Coastguard Worker format(file, ".%u", subreg_nr);
872*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
873*61046927SAndroid Build Coastguard Worker } else {
874*61046927SAndroid Build Coastguard Worker string(file, "g[a0");
875*61046927SAndroid Build Coastguard Worker if (brw_inst_dst_ia_subreg_nr(devinfo, inst))
876*61046927SAndroid Build Coastguard Worker format(file, ".%"PRIu64, brw_inst_dst_ia_subreg_nr(devinfo, inst) /
877*61046927SAndroid Build Coastguard Worker elem_size);
878*61046927SAndroid Build Coastguard Worker if (brw_inst_send_dst_ia16_addr_imm(devinfo, inst))
879*61046927SAndroid Build Coastguard Worker format(file, " %d", brw_inst_send_dst_ia16_addr_imm(devinfo, inst));
880*61046927SAndroid Build Coastguard Worker string(file, "]<");
881*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
882*61046927SAndroid Build Coastguard Worker }
883*61046927SAndroid Build Coastguard Worker } else if (brw_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
884*61046927SAndroid Build Coastguard Worker if (brw_inst_dst_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
885*61046927SAndroid Build Coastguard Worker err |= reg(file, brw_inst_dst_reg_file(devinfo, inst),
886*61046927SAndroid Build Coastguard Worker brw_inst_dst_da_reg_nr(devinfo, inst));
887*61046927SAndroid Build Coastguard Worker if (err == -1)
888*61046927SAndroid Build Coastguard Worker return 0;
889*61046927SAndroid Build Coastguard Worker if (brw_inst_dst_da1_subreg_nr(devinfo, inst))
890*61046927SAndroid Build Coastguard Worker format(file, ".%"PRIu64, brw_inst_dst_da1_subreg_nr(devinfo, inst) /
891*61046927SAndroid Build Coastguard Worker elem_size);
892*61046927SAndroid Build Coastguard Worker string(file, "<");
893*61046927SAndroid Build Coastguard Worker err |= control(file, "horiz stride", horiz_stride,
894*61046927SAndroid Build Coastguard Worker brw_inst_dst_hstride(devinfo, inst), NULL);
895*61046927SAndroid Build Coastguard Worker string(file, ">");
896*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
897*61046927SAndroid Build Coastguard Worker } else {
898*61046927SAndroid Build Coastguard Worker string(file, "g[a0");
899*61046927SAndroid Build Coastguard Worker if (brw_inst_dst_ia_subreg_nr(devinfo, inst))
900*61046927SAndroid Build Coastguard Worker format(file, ".%"PRIu64, brw_inst_dst_ia_subreg_nr(devinfo, inst) /
901*61046927SAndroid Build Coastguard Worker elem_size);
902*61046927SAndroid Build Coastguard Worker if (brw_inst_dst_ia1_addr_imm(devinfo, inst))
903*61046927SAndroid Build Coastguard Worker format(file, " %d", brw_inst_dst_ia1_addr_imm(devinfo, inst));
904*61046927SAndroid Build Coastguard Worker string(file, "]<");
905*61046927SAndroid Build Coastguard Worker err |= control(file, "horiz stride", horiz_stride,
906*61046927SAndroid Build Coastguard Worker brw_inst_dst_hstride(devinfo, inst), NULL);
907*61046927SAndroid Build Coastguard Worker string(file, ">");
908*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
909*61046927SAndroid Build Coastguard Worker }
910*61046927SAndroid Build Coastguard Worker } else {
911*61046927SAndroid Build Coastguard Worker if (brw_inst_dst_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
912*61046927SAndroid Build Coastguard Worker err |= reg(file, brw_inst_dst_reg_file(devinfo, inst),
913*61046927SAndroid Build Coastguard Worker brw_inst_dst_da_reg_nr(devinfo, inst));
914*61046927SAndroid Build Coastguard Worker if (err == -1)
915*61046927SAndroid Build Coastguard Worker return 0;
916*61046927SAndroid Build Coastguard Worker if (brw_inst_dst_da16_subreg_nr(devinfo, inst))
917*61046927SAndroid Build Coastguard Worker format(file, ".%u", 16 / elem_size);
918*61046927SAndroid Build Coastguard Worker string(file, "<1>");
919*61046927SAndroid Build Coastguard Worker err |= control(file, "writemask", writemask,
920*61046927SAndroid Build Coastguard Worker brw_inst_da16_writemask(devinfo, inst), NULL);
921*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
922*61046927SAndroid Build Coastguard Worker } else {
923*61046927SAndroid Build Coastguard Worker err = 1;
924*61046927SAndroid Build Coastguard Worker string(file, "Indirect align16 address mode not supported");
925*61046927SAndroid Build Coastguard Worker }
926*61046927SAndroid Build Coastguard Worker }
927*61046927SAndroid Build Coastguard Worker
928*61046927SAndroid Build Coastguard Worker return 0;
929*61046927SAndroid Build Coastguard Worker }
930*61046927SAndroid Build Coastguard Worker
931*61046927SAndroid Build Coastguard Worker static int
dest_3src(FILE * file,const struct intel_device_info * devinfo,const brw_inst * inst)932*61046927SAndroid Build Coastguard Worker dest_3src(FILE *file, const struct intel_device_info *devinfo,
933*61046927SAndroid Build Coastguard Worker const brw_inst *inst)
934*61046927SAndroid Build Coastguard Worker {
935*61046927SAndroid Build Coastguard Worker bool is_align1 = brw_inst_3src_access_mode(devinfo, inst) == BRW_ALIGN_1;
936*61046927SAndroid Build Coastguard Worker int err = 0;
937*61046927SAndroid Build Coastguard Worker uint32_t reg_file;
938*61046927SAndroid Build Coastguard Worker unsigned subreg_nr;
939*61046927SAndroid Build Coastguard Worker enum brw_reg_type type;
940*61046927SAndroid Build Coastguard Worker
941*61046927SAndroid Build Coastguard Worker if (devinfo->ver < 10 && is_align1)
942*61046927SAndroid Build Coastguard Worker return 0;
943*61046927SAndroid Build Coastguard Worker
944*61046927SAndroid Build Coastguard Worker if (devinfo->ver >= 12)
945*61046927SAndroid Build Coastguard Worker reg_file = brw_inst_3src_a1_dst_reg_file(devinfo, inst);
946*61046927SAndroid Build Coastguard Worker else if (is_align1 && brw_inst_3src_a1_dst_reg_file(devinfo, inst))
947*61046927SAndroid Build Coastguard Worker reg_file = ARF;
948*61046927SAndroid Build Coastguard Worker else
949*61046927SAndroid Build Coastguard Worker reg_file = FIXED_GRF;
950*61046927SAndroid Build Coastguard Worker
951*61046927SAndroid Build Coastguard Worker err |= reg(file, reg_file, brw_inst_3src_dst_reg_nr(devinfo, inst));
952*61046927SAndroid Build Coastguard Worker if (err == -1)
953*61046927SAndroid Build Coastguard Worker return 0;
954*61046927SAndroid Build Coastguard Worker
955*61046927SAndroid Build Coastguard Worker if (is_align1) {
956*61046927SAndroid Build Coastguard Worker type = brw_inst_3src_a1_dst_type(devinfo, inst);
957*61046927SAndroid Build Coastguard Worker subreg_nr = brw_inst_3src_a1_dst_subreg_nr(devinfo, inst);
958*61046927SAndroid Build Coastguard Worker } else {
959*61046927SAndroid Build Coastguard Worker type = brw_inst_3src_a16_dst_type(devinfo, inst);
960*61046927SAndroid Build Coastguard Worker subreg_nr = brw_inst_3src_a16_dst_subreg_nr(devinfo, inst) * 4;
961*61046927SAndroid Build Coastguard Worker }
962*61046927SAndroid Build Coastguard Worker subreg_nr /= brw_type_size_bytes(type);
963*61046927SAndroid Build Coastguard Worker
964*61046927SAndroid Build Coastguard Worker if (subreg_nr)
965*61046927SAndroid Build Coastguard Worker format(file, ".%u", subreg_nr);
966*61046927SAndroid Build Coastguard Worker string(file, "<1>");
967*61046927SAndroid Build Coastguard Worker
968*61046927SAndroid Build Coastguard Worker if (!is_align1) {
969*61046927SAndroid Build Coastguard Worker err |= control(file, "writemask", writemask,
970*61046927SAndroid Build Coastguard Worker brw_inst_3src_a16_dst_writemask(devinfo, inst), NULL);
971*61046927SAndroid Build Coastguard Worker }
972*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
973*61046927SAndroid Build Coastguard Worker
974*61046927SAndroid Build Coastguard Worker return 0;
975*61046927SAndroid Build Coastguard Worker }
976*61046927SAndroid Build Coastguard Worker
977*61046927SAndroid Build Coastguard Worker static int
dest_dpas_3src(FILE * file,const struct intel_device_info * devinfo,const brw_inst * inst)978*61046927SAndroid Build Coastguard Worker dest_dpas_3src(FILE *file, const struct intel_device_info *devinfo,
979*61046927SAndroid Build Coastguard Worker const brw_inst *inst)
980*61046927SAndroid Build Coastguard Worker {
981*61046927SAndroid Build Coastguard Worker uint32_t reg_file = brw_inst_dpas_3src_dst_reg_file(devinfo, inst);
982*61046927SAndroid Build Coastguard Worker
983*61046927SAndroid Build Coastguard Worker if (reg(file, reg_file, brw_inst_dpas_3src_dst_reg_nr(devinfo, inst)) == -1)
984*61046927SAndroid Build Coastguard Worker return 0;
985*61046927SAndroid Build Coastguard Worker
986*61046927SAndroid Build Coastguard Worker enum brw_reg_type type = brw_inst_dpas_3src_dst_type(devinfo, inst);
987*61046927SAndroid Build Coastguard Worker unsigned subreg_nr = brw_inst_dpas_3src_dst_subreg_nr(devinfo, inst);
988*61046927SAndroid Build Coastguard Worker
989*61046927SAndroid Build Coastguard Worker if (subreg_nr)
990*61046927SAndroid Build Coastguard Worker format(file, ".%u", subreg_nr);
991*61046927SAndroid Build Coastguard Worker string(file, "<1>");
992*61046927SAndroid Build Coastguard Worker
993*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
994*61046927SAndroid Build Coastguard Worker
995*61046927SAndroid Build Coastguard Worker return 0;
996*61046927SAndroid Build Coastguard Worker }
997*61046927SAndroid Build Coastguard Worker
998*61046927SAndroid Build Coastguard Worker static int
src_align1_region(FILE * file,unsigned _vert_stride,unsigned _width,unsigned _horiz_stride)999*61046927SAndroid Build Coastguard Worker src_align1_region(FILE *file,
1000*61046927SAndroid Build Coastguard Worker unsigned _vert_stride, unsigned _width,
1001*61046927SAndroid Build Coastguard Worker unsigned _horiz_stride)
1002*61046927SAndroid Build Coastguard Worker {
1003*61046927SAndroid Build Coastguard Worker int err = 0;
1004*61046927SAndroid Build Coastguard Worker string(file, "<");
1005*61046927SAndroid Build Coastguard Worker err |= control(file, "vert stride", vert_stride, _vert_stride, NULL);
1006*61046927SAndroid Build Coastguard Worker string(file, ",");
1007*61046927SAndroid Build Coastguard Worker err |= control(file, "width", width, _width, NULL);
1008*61046927SAndroid Build Coastguard Worker string(file, ",");
1009*61046927SAndroid Build Coastguard Worker err |= control(file, "horiz_stride", horiz_stride, _horiz_stride, NULL);
1010*61046927SAndroid Build Coastguard Worker string(file, ">");
1011*61046927SAndroid Build Coastguard Worker return err;
1012*61046927SAndroid Build Coastguard Worker }
1013*61046927SAndroid Build Coastguard Worker
1014*61046927SAndroid Build Coastguard Worker static int
src_da1(FILE * file,const struct intel_device_info * devinfo,unsigned opcode,enum brw_reg_type type,unsigned _reg_file,unsigned _vert_stride,unsigned _width,unsigned _horiz_stride,unsigned reg_num,unsigned sub_reg_num,unsigned __abs,unsigned _negate)1015*61046927SAndroid Build Coastguard Worker src_da1(FILE *file,
1016*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo,
1017*61046927SAndroid Build Coastguard Worker unsigned opcode,
1018*61046927SAndroid Build Coastguard Worker enum brw_reg_type type, unsigned _reg_file,
1019*61046927SAndroid Build Coastguard Worker unsigned _vert_stride, unsigned _width, unsigned _horiz_stride,
1020*61046927SAndroid Build Coastguard Worker unsigned reg_num, unsigned sub_reg_num, unsigned __abs,
1021*61046927SAndroid Build Coastguard Worker unsigned _negate)
1022*61046927SAndroid Build Coastguard Worker {
1023*61046927SAndroid Build Coastguard Worker int err = 0;
1024*61046927SAndroid Build Coastguard Worker
1025*61046927SAndroid Build Coastguard Worker if (is_logic_instruction(opcode))
1026*61046927SAndroid Build Coastguard Worker err |= control(file, "bitnot", m_bitnot, _negate, NULL);
1027*61046927SAndroid Build Coastguard Worker else
1028*61046927SAndroid Build Coastguard Worker err |= control(file, "negate", m_negate, _negate, NULL);
1029*61046927SAndroid Build Coastguard Worker
1030*61046927SAndroid Build Coastguard Worker err |= control(file, "abs", _abs, __abs, NULL);
1031*61046927SAndroid Build Coastguard Worker
1032*61046927SAndroid Build Coastguard Worker err |= reg(file, _reg_file, reg_num);
1033*61046927SAndroid Build Coastguard Worker if (err == -1)
1034*61046927SAndroid Build Coastguard Worker return 0;
1035*61046927SAndroid Build Coastguard Worker if (sub_reg_num) {
1036*61046927SAndroid Build Coastguard Worker unsigned elem_size = brw_type_size_bytes(type);
1037*61046927SAndroid Build Coastguard Worker format(file, ".%d", sub_reg_num / elem_size); /* use formal style like spec */
1038*61046927SAndroid Build Coastguard Worker }
1039*61046927SAndroid Build Coastguard Worker src_align1_region(file, _vert_stride, _width, _horiz_stride);
1040*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
1041*61046927SAndroid Build Coastguard Worker return err;
1042*61046927SAndroid Build Coastguard Worker }
1043*61046927SAndroid Build Coastguard Worker
1044*61046927SAndroid Build Coastguard Worker static int
src_ia1(FILE * file,const struct intel_device_info * devinfo,unsigned opcode,enum brw_reg_type type,int _addr_imm,unsigned _addr_subreg_nr,unsigned _negate,unsigned __abs,unsigned _horiz_stride,unsigned _width,unsigned _vert_stride)1045*61046927SAndroid Build Coastguard Worker src_ia1(FILE *file,
1046*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo,
1047*61046927SAndroid Build Coastguard Worker unsigned opcode,
1048*61046927SAndroid Build Coastguard Worker enum brw_reg_type type,
1049*61046927SAndroid Build Coastguard Worker int _addr_imm,
1050*61046927SAndroid Build Coastguard Worker unsigned _addr_subreg_nr,
1051*61046927SAndroid Build Coastguard Worker unsigned _negate,
1052*61046927SAndroid Build Coastguard Worker unsigned __abs,
1053*61046927SAndroid Build Coastguard Worker unsigned _horiz_stride, unsigned _width, unsigned _vert_stride)
1054*61046927SAndroid Build Coastguard Worker {
1055*61046927SAndroid Build Coastguard Worker int err = 0;
1056*61046927SAndroid Build Coastguard Worker
1057*61046927SAndroid Build Coastguard Worker if (is_logic_instruction(opcode))
1058*61046927SAndroid Build Coastguard Worker err |= control(file, "bitnot", m_bitnot, _negate, NULL);
1059*61046927SAndroid Build Coastguard Worker else
1060*61046927SAndroid Build Coastguard Worker err |= control(file, "negate", m_negate, _negate, NULL);
1061*61046927SAndroid Build Coastguard Worker
1062*61046927SAndroid Build Coastguard Worker err |= control(file, "abs", _abs, __abs, NULL);
1063*61046927SAndroid Build Coastguard Worker
1064*61046927SAndroid Build Coastguard Worker string(file, "g[a0");
1065*61046927SAndroid Build Coastguard Worker if (_addr_subreg_nr)
1066*61046927SAndroid Build Coastguard Worker format(file, ".%d", _addr_subreg_nr);
1067*61046927SAndroid Build Coastguard Worker if (_addr_imm)
1068*61046927SAndroid Build Coastguard Worker format(file, " %d", _addr_imm);
1069*61046927SAndroid Build Coastguard Worker string(file, "]");
1070*61046927SAndroid Build Coastguard Worker src_align1_region(file, _vert_stride, _width, _horiz_stride);
1071*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
1072*61046927SAndroid Build Coastguard Worker return err;
1073*61046927SAndroid Build Coastguard Worker }
1074*61046927SAndroid Build Coastguard Worker
1075*61046927SAndroid Build Coastguard Worker static int
src_swizzle(FILE * file,unsigned swiz)1076*61046927SAndroid Build Coastguard Worker src_swizzle(FILE *file, unsigned swiz)
1077*61046927SAndroid Build Coastguard Worker {
1078*61046927SAndroid Build Coastguard Worker unsigned x = BRW_GET_SWZ(swiz, BRW_CHANNEL_X);
1079*61046927SAndroid Build Coastguard Worker unsigned y = BRW_GET_SWZ(swiz, BRW_CHANNEL_Y);
1080*61046927SAndroid Build Coastguard Worker unsigned z = BRW_GET_SWZ(swiz, BRW_CHANNEL_Z);
1081*61046927SAndroid Build Coastguard Worker unsigned w = BRW_GET_SWZ(swiz, BRW_CHANNEL_W);
1082*61046927SAndroid Build Coastguard Worker int err = 0;
1083*61046927SAndroid Build Coastguard Worker
1084*61046927SAndroid Build Coastguard Worker if (x == y && x == z && x == w) {
1085*61046927SAndroid Build Coastguard Worker string(file, ".");
1086*61046927SAndroid Build Coastguard Worker err |= control(file, "channel select", chan_sel, x, NULL);
1087*61046927SAndroid Build Coastguard Worker } else if (swiz != BRW_SWIZZLE_XYZW) {
1088*61046927SAndroid Build Coastguard Worker string(file, ".");
1089*61046927SAndroid Build Coastguard Worker err |= control(file, "channel select", chan_sel, x, NULL);
1090*61046927SAndroid Build Coastguard Worker err |= control(file, "channel select", chan_sel, y, NULL);
1091*61046927SAndroid Build Coastguard Worker err |= control(file, "channel select", chan_sel, z, NULL);
1092*61046927SAndroid Build Coastguard Worker err |= control(file, "channel select", chan_sel, w, NULL);
1093*61046927SAndroid Build Coastguard Worker }
1094*61046927SAndroid Build Coastguard Worker return err;
1095*61046927SAndroid Build Coastguard Worker }
1096*61046927SAndroid Build Coastguard Worker
1097*61046927SAndroid Build Coastguard Worker static int
src_da16(FILE * file,const struct intel_device_info * devinfo,unsigned opcode,enum brw_reg_type 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)1098*61046927SAndroid Build Coastguard Worker src_da16(FILE *file,
1099*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo,
1100*61046927SAndroid Build Coastguard Worker unsigned opcode,
1101*61046927SAndroid Build Coastguard Worker enum brw_reg_type type,
1102*61046927SAndroid Build Coastguard Worker unsigned _reg_file,
1103*61046927SAndroid Build Coastguard Worker unsigned _vert_stride,
1104*61046927SAndroid Build Coastguard Worker unsigned _reg_nr,
1105*61046927SAndroid Build Coastguard Worker unsigned _subreg_nr,
1106*61046927SAndroid Build Coastguard Worker unsigned __abs,
1107*61046927SAndroid Build Coastguard Worker unsigned _negate,
1108*61046927SAndroid Build Coastguard Worker unsigned swz_x, unsigned swz_y, unsigned swz_z, unsigned swz_w)
1109*61046927SAndroid Build Coastguard Worker {
1110*61046927SAndroid Build Coastguard Worker int err = 0;
1111*61046927SAndroid Build Coastguard Worker
1112*61046927SAndroid Build Coastguard Worker if (is_logic_instruction(opcode))
1113*61046927SAndroid Build Coastguard Worker err |= control(file, "bitnot", m_bitnot, _negate, NULL);
1114*61046927SAndroid Build Coastguard Worker else
1115*61046927SAndroid Build Coastguard Worker err |= control(file, "negate", m_negate, _negate, NULL);
1116*61046927SAndroid Build Coastguard Worker
1117*61046927SAndroid Build Coastguard Worker err |= control(file, "abs", _abs, __abs, NULL);
1118*61046927SAndroid Build Coastguard Worker
1119*61046927SAndroid Build Coastguard Worker err |= reg(file, _reg_file, _reg_nr);
1120*61046927SAndroid Build Coastguard Worker if (err == -1)
1121*61046927SAndroid Build Coastguard Worker return 0;
1122*61046927SAndroid Build Coastguard Worker if (_subreg_nr) {
1123*61046927SAndroid Build Coastguard Worker unsigned elem_size = brw_type_size_bytes(type);
1124*61046927SAndroid Build Coastguard Worker
1125*61046927SAndroid Build Coastguard Worker /* bit4 for subreg number byte addressing. Make this same meaning as
1126*61046927SAndroid Build Coastguard Worker in da1 case, so output looks consistent. */
1127*61046927SAndroid Build Coastguard Worker format(file, ".%d", 16 / elem_size);
1128*61046927SAndroid Build Coastguard Worker }
1129*61046927SAndroid Build Coastguard Worker string(file, "<");
1130*61046927SAndroid Build Coastguard Worker err |= control(file, "vert stride", vert_stride, _vert_stride, NULL);
1131*61046927SAndroid Build Coastguard Worker string(file, ">");
1132*61046927SAndroid Build Coastguard Worker err |= src_swizzle(file, BRW_SWIZZLE4(swz_x, swz_y, swz_z, swz_w));
1133*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
1134*61046927SAndroid Build Coastguard Worker return err;
1135*61046927SAndroid Build Coastguard Worker }
1136*61046927SAndroid Build Coastguard Worker
1137*61046927SAndroid Build Coastguard Worker static enum brw_vertical_stride
vstride_from_align1_3src_vstride(const struct intel_device_info * devinfo,enum gfx10_align1_3src_vertical_stride vstride)1138*61046927SAndroid Build Coastguard Worker vstride_from_align1_3src_vstride(const struct intel_device_info *devinfo,
1139*61046927SAndroid Build Coastguard Worker enum gfx10_align1_3src_vertical_stride vstride)
1140*61046927SAndroid Build Coastguard Worker {
1141*61046927SAndroid Build Coastguard Worker switch (vstride) {
1142*61046927SAndroid Build Coastguard Worker case BRW_ALIGN1_3SRC_VERTICAL_STRIDE_0: return BRW_VERTICAL_STRIDE_0;
1143*61046927SAndroid Build Coastguard Worker case BRW_ALIGN1_3SRC_VERTICAL_STRIDE_2:
1144*61046927SAndroid Build Coastguard Worker if (devinfo->ver >= 12)
1145*61046927SAndroid Build Coastguard Worker return BRW_VERTICAL_STRIDE_1;
1146*61046927SAndroid Build Coastguard Worker else
1147*61046927SAndroid Build Coastguard Worker return BRW_VERTICAL_STRIDE_2;
1148*61046927SAndroid Build Coastguard Worker case BRW_ALIGN1_3SRC_VERTICAL_STRIDE_4: return BRW_VERTICAL_STRIDE_4;
1149*61046927SAndroid Build Coastguard Worker case BRW_ALIGN1_3SRC_VERTICAL_STRIDE_8: return BRW_VERTICAL_STRIDE_8;
1150*61046927SAndroid Build Coastguard Worker default:
1151*61046927SAndroid Build Coastguard Worker unreachable("not reached");
1152*61046927SAndroid Build Coastguard Worker }
1153*61046927SAndroid Build Coastguard Worker }
1154*61046927SAndroid Build Coastguard Worker
1155*61046927SAndroid Build Coastguard Worker static enum brw_horizontal_stride
hstride_from_align1_3src_hstride(enum gfx10_align1_3src_src_horizontal_stride hstride)1156*61046927SAndroid Build Coastguard Worker hstride_from_align1_3src_hstride(enum gfx10_align1_3src_src_horizontal_stride hstride)
1157*61046927SAndroid Build Coastguard Worker {
1158*61046927SAndroid Build Coastguard Worker switch (hstride) {
1159*61046927SAndroid Build Coastguard Worker case BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_0: return BRW_HORIZONTAL_STRIDE_0;
1160*61046927SAndroid Build Coastguard Worker case BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_1: return BRW_HORIZONTAL_STRIDE_1;
1161*61046927SAndroid Build Coastguard Worker case BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_2: return BRW_HORIZONTAL_STRIDE_2;
1162*61046927SAndroid Build Coastguard Worker case BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_4: return BRW_HORIZONTAL_STRIDE_4;
1163*61046927SAndroid Build Coastguard Worker default:
1164*61046927SAndroid Build Coastguard Worker unreachable("not reached");
1165*61046927SAndroid Build Coastguard Worker }
1166*61046927SAndroid Build Coastguard Worker }
1167*61046927SAndroid Build Coastguard Worker
1168*61046927SAndroid Build Coastguard Worker static enum brw_vertical_stride
vstride_from_align1_3src_hstride(enum gfx10_align1_3src_src_horizontal_stride hstride)1169*61046927SAndroid Build Coastguard Worker vstride_from_align1_3src_hstride(enum gfx10_align1_3src_src_horizontal_stride hstride)
1170*61046927SAndroid Build Coastguard Worker {
1171*61046927SAndroid Build Coastguard Worker switch (hstride) {
1172*61046927SAndroid Build Coastguard Worker case BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_0: return BRW_VERTICAL_STRIDE_0;
1173*61046927SAndroid Build Coastguard Worker case BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_1: return BRW_VERTICAL_STRIDE_1;
1174*61046927SAndroid Build Coastguard Worker case BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_2: return BRW_VERTICAL_STRIDE_2;
1175*61046927SAndroid Build Coastguard Worker case BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_4: return BRW_VERTICAL_STRIDE_4;
1176*61046927SAndroid Build Coastguard Worker default:
1177*61046927SAndroid Build Coastguard Worker unreachable("not reached");
1178*61046927SAndroid Build Coastguard Worker }
1179*61046927SAndroid Build Coastguard Worker }
1180*61046927SAndroid Build Coastguard Worker
1181*61046927SAndroid Build Coastguard Worker /* From "GFX10 Regioning Rules for Align1 Ternary Operations" in the
1182*61046927SAndroid Build Coastguard Worker * "Register Region Restrictions" documentation
1183*61046927SAndroid Build Coastguard Worker */
1184*61046927SAndroid Build Coastguard Worker static enum brw_width
implied_width(enum brw_vertical_stride _vert_stride,enum brw_horizontal_stride _horiz_stride)1185*61046927SAndroid Build Coastguard Worker implied_width(enum brw_vertical_stride _vert_stride,
1186*61046927SAndroid Build Coastguard Worker enum brw_horizontal_stride _horiz_stride)
1187*61046927SAndroid Build Coastguard Worker {
1188*61046927SAndroid Build Coastguard Worker /* "1. Width is 1 when Vertical and Horizontal Strides are both zero." */
1189*61046927SAndroid Build Coastguard Worker if (_vert_stride == BRW_VERTICAL_STRIDE_0 &&
1190*61046927SAndroid Build Coastguard Worker _horiz_stride == BRW_HORIZONTAL_STRIDE_0) {
1191*61046927SAndroid Build Coastguard Worker return BRW_WIDTH_1;
1192*61046927SAndroid Build Coastguard Worker
1193*61046927SAndroid Build Coastguard Worker /* "2. Width is equal to vertical stride when Horizontal Stride is zero." */
1194*61046927SAndroid Build Coastguard Worker } else if (_horiz_stride == BRW_HORIZONTAL_STRIDE_0) {
1195*61046927SAndroid Build Coastguard Worker switch (_vert_stride) {
1196*61046927SAndroid Build Coastguard Worker case BRW_VERTICAL_STRIDE_1: return BRW_WIDTH_1;
1197*61046927SAndroid Build Coastguard Worker case BRW_VERTICAL_STRIDE_2: return BRW_WIDTH_2;
1198*61046927SAndroid Build Coastguard Worker case BRW_VERTICAL_STRIDE_4: return BRW_WIDTH_4;
1199*61046927SAndroid Build Coastguard Worker case BRW_VERTICAL_STRIDE_8: return BRW_WIDTH_8;
1200*61046927SAndroid Build Coastguard Worker case BRW_VERTICAL_STRIDE_0:
1201*61046927SAndroid Build Coastguard Worker default:
1202*61046927SAndroid Build Coastguard Worker unreachable("not reached");
1203*61046927SAndroid Build Coastguard Worker }
1204*61046927SAndroid Build Coastguard Worker
1205*61046927SAndroid Build Coastguard Worker } else {
1206*61046927SAndroid Build Coastguard Worker /* FINISHME: Implement these: */
1207*61046927SAndroid Build Coastguard Worker
1208*61046927SAndroid Build Coastguard Worker /* "3. Width is equal to Vertical Stride/Horizontal Stride when both
1209*61046927SAndroid Build Coastguard Worker * Strides are non-zero.
1210*61046927SAndroid Build Coastguard Worker *
1211*61046927SAndroid Build Coastguard Worker * 4. Vertical Stride must not be zero if Horizontal Stride is non-zero.
1212*61046927SAndroid Build Coastguard Worker * This implies Vertical Stride is always greater than Horizontal
1213*61046927SAndroid Build Coastguard Worker * Stride."
1214*61046927SAndroid Build Coastguard Worker *
1215*61046927SAndroid Build Coastguard Worker * Given these statements and the knowledge that the stride and width
1216*61046927SAndroid Build Coastguard Worker * values are encoded in logarithmic form, we can perform the division
1217*61046927SAndroid Build Coastguard Worker * by just subtracting.
1218*61046927SAndroid Build Coastguard Worker */
1219*61046927SAndroid Build Coastguard Worker return _vert_stride - _horiz_stride;
1220*61046927SAndroid Build Coastguard Worker }
1221*61046927SAndroid Build Coastguard Worker }
1222*61046927SAndroid Build Coastguard Worker
1223*61046927SAndroid Build Coastguard Worker static int
src0_3src(FILE * file,const struct intel_device_info * devinfo,const brw_inst * inst)1224*61046927SAndroid Build Coastguard Worker src0_3src(FILE *file, const struct intel_device_info *devinfo,
1225*61046927SAndroid Build Coastguard Worker const brw_inst *inst)
1226*61046927SAndroid Build Coastguard Worker {
1227*61046927SAndroid Build Coastguard Worker int err = 0;
1228*61046927SAndroid Build Coastguard Worker unsigned reg_nr, subreg_nr;
1229*61046927SAndroid Build Coastguard Worker enum brw_reg_file _file;
1230*61046927SAndroid Build Coastguard Worker enum brw_reg_type type;
1231*61046927SAndroid Build Coastguard Worker enum brw_vertical_stride _vert_stride;
1232*61046927SAndroid Build Coastguard Worker enum brw_width _width;
1233*61046927SAndroid Build Coastguard Worker enum brw_horizontal_stride _horiz_stride;
1234*61046927SAndroid Build Coastguard Worker bool is_scalar_region;
1235*61046927SAndroid Build Coastguard Worker bool is_align1 = brw_inst_3src_access_mode(devinfo, inst) == BRW_ALIGN_1;
1236*61046927SAndroid Build Coastguard Worker
1237*61046927SAndroid Build Coastguard Worker if (devinfo->ver < 10 && is_align1)
1238*61046927SAndroid Build Coastguard Worker return 0;
1239*61046927SAndroid Build Coastguard Worker
1240*61046927SAndroid Build Coastguard Worker if (is_align1) {
1241*61046927SAndroid Build Coastguard Worker _file = brw_inst_3src_a1_src0_reg_file(devinfo, inst);
1242*61046927SAndroid Build Coastguard Worker if (_file == IMM) {
1243*61046927SAndroid Build Coastguard Worker uint16_t imm_val = brw_inst_3src_a1_src0_imm(devinfo, inst);
1244*61046927SAndroid Build Coastguard Worker enum brw_reg_type type = brw_inst_3src_a1_src0_type(devinfo, inst);
1245*61046927SAndroid Build Coastguard Worker
1246*61046927SAndroid Build Coastguard Worker if (type == BRW_TYPE_W) {
1247*61046927SAndroid Build Coastguard Worker format(file, "%dW", imm_val);
1248*61046927SAndroid Build Coastguard Worker } else if (type == BRW_TYPE_UW) {
1249*61046927SAndroid Build Coastguard Worker format(file, "0x%04xUW", imm_val);
1250*61046927SAndroid Build Coastguard Worker } else if (type == BRW_TYPE_HF) {
1251*61046927SAndroid Build Coastguard Worker format(file, "0x%04xHF", imm_val);
1252*61046927SAndroid Build Coastguard Worker }
1253*61046927SAndroid Build Coastguard Worker return 0;
1254*61046927SAndroid Build Coastguard Worker }
1255*61046927SAndroid Build Coastguard Worker
1256*61046927SAndroid Build Coastguard Worker reg_nr = brw_inst_3src_src0_reg_nr(devinfo, inst);
1257*61046927SAndroid Build Coastguard Worker subreg_nr = brw_inst_3src_a1_src0_subreg_nr(devinfo, inst);
1258*61046927SAndroid Build Coastguard Worker type = brw_inst_3src_a1_src0_type(devinfo, inst);
1259*61046927SAndroid Build Coastguard Worker _vert_stride = vstride_from_align1_3src_vstride(
1260*61046927SAndroid Build Coastguard Worker devinfo, brw_inst_3src_a1_src0_vstride(devinfo, inst));
1261*61046927SAndroid Build Coastguard Worker _horiz_stride = hstride_from_align1_3src_hstride(
1262*61046927SAndroid Build Coastguard Worker brw_inst_3src_a1_src0_hstride(devinfo, inst));
1263*61046927SAndroid Build Coastguard Worker _width = implied_width(_vert_stride, _horiz_stride);
1264*61046927SAndroid Build Coastguard Worker } else {
1265*61046927SAndroid Build Coastguard Worker _file = FIXED_GRF;
1266*61046927SAndroid Build Coastguard Worker reg_nr = brw_inst_3src_src0_reg_nr(devinfo, inst);
1267*61046927SAndroid Build Coastguard Worker subreg_nr = brw_inst_3src_a16_src0_subreg_nr(devinfo, inst) * 4;
1268*61046927SAndroid Build Coastguard Worker type = brw_inst_3src_a16_src_type(devinfo, inst);
1269*61046927SAndroid Build Coastguard Worker
1270*61046927SAndroid Build Coastguard Worker if (brw_inst_3src_a16_src0_rep_ctrl(devinfo, inst)) {
1271*61046927SAndroid Build Coastguard Worker _vert_stride = BRW_VERTICAL_STRIDE_0;
1272*61046927SAndroid Build Coastguard Worker _width = BRW_WIDTH_1;
1273*61046927SAndroid Build Coastguard Worker _horiz_stride = BRW_HORIZONTAL_STRIDE_0;
1274*61046927SAndroid Build Coastguard Worker } else {
1275*61046927SAndroid Build Coastguard Worker _vert_stride = BRW_VERTICAL_STRIDE_4;
1276*61046927SAndroid Build Coastguard Worker _width = BRW_WIDTH_4;
1277*61046927SAndroid Build Coastguard Worker _horiz_stride = BRW_HORIZONTAL_STRIDE_1;
1278*61046927SAndroid Build Coastguard Worker }
1279*61046927SAndroid Build Coastguard Worker }
1280*61046927SAndroid Build Coastguard Worker is_scalar_region = _vert_stride == BRW_VERTICAL_STRIDE_0 &&
1281*61046927SAndroid Build Coastguard Worker _width == BRW_WIDTH_1 &&
1282*61046927SAndroid Build Coastguard Worker _horiz_stride == BRW_HORIZONTAL_STRIDE_0;
1283*61046927SAndroid Build Coastguard Worker
1284*61046927SAndroid Build Coastguard Worker subreg_nr /= brw_type_size_bytes(type);
1285*61046927SAndroid Build Coastguard Worker
1286*61046927SAndroid Build Coastguard Worker err |= control(file, "negate", m_negate,
1287*61046927SAndroid Build Coastguard Worker brw_inst_3src_src0_negate(devinfo, inst), NULL);
1288*61046927SAndroid Build Coastguard Worker err |= control(file, "abs", _abs, brw_inst_3src_src0_abs(devinfo, inst), NULL);
1289*61046927SAndroid Build Coastguard Worker
1290*61046927SAndroid Build Coastguard Worker err |= reg(file, _file, reg_nr);
1291*61046927SAndroid Build Coastguard Worker if (err == -1)
1292*61046927SAndroid Build Coastguard Worker return 0;
1293*61046927SAndroid Build Coastguard Worker if (subreg_nr || is_scalar_region)
1294*61046927SAndroid Build Coastguard Worker format(file, ".%d", subreg_nr);
1295*61046927SAndroid Build Coastguard Worker src_align1_region(file, _vert_stride, _width, _horiz_stride);
1296*61046927SAndroid Build Coastguard Worker if (!is_scalar_region && !is_align1)
1297*61046927SAndroid Build Coastguard Worker err |= src_swizzle(file, brw_inst_3src_a16_src0_swizzle(devinfo, inst));
1298*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
1299*61046927SAndroid Build Coastguard Worker return err;
1300*61046927SAndroid Build Coastguard Worker }
1301*61046927SAndroid Build Coastguard Worker
1302*61046927SAndroid Build Coastguard Worker static int
src1_3src(FILE * file,const struct intel_device_info * devinfo,const brw_inst * inst)1303*61046927SAndroid Build Coastguard Worker src1_3src(FILE *file, const struct intel_device_info *devinfo,
1304*61046927SAndroid Build Coastguard Worker const brw_inst *inst)
1305*61046927SAndroid Build Coastguard Worker {
1306*61046927SAndroid Build Coastguard Worker int err = 0;
1307*61046927SAndroid Build Coastguard Worker unsigned reg_nr, subreg_nr;
1308*61046927SAndroid Build Coastguard Worker enum brw_reg_file _file;
1309*61046927SAndroid Build Coastguard Worker enum brw_reg_type type;
1310*61046927SAndroid Build Coastguard Worker enum brw_vertical_stride _vert_stride;
1311*61046927SAndroid Build Coastguard Worker enum brw_width _width;
1312*61046927SAndroid Build Coastguard Worker enum brw_horizontal_stride _horiz_stride;
1313*61046927SAndroid Build Coastguard Worker bool is_scalar_region;
1314*61046927SAndroid Build Coastguard Worker bool is_align1 = brw_inst_3src_access_mode(devinfo, inst) == BRW_ALIGN_1;
1315*61046927SAndroid Build Coastguard Worker
1316*61046927SAndroid Build Coastguard Worker if (devinfo->ver < 10 && is_align1)
1317*61046927SAndroid Build Coastguard Worker return 0;
1318*61046927SAndroid Build Coastguard Worker
1319*61046927SAndroid Build Coastguard Worker if (is_align1) {
1320*61046927SAndroid Build Coastguard Worker _file = brw_inst_3src_a1_src1_reg_file(devinfo, inst);
1321*61046927SAndroid Build Coastguard Worker reg_nr = brw_inst_3src_src1_reg_nr(devinfo, inst);
1322*61046927SAndroid Build Coastguard Worker subreg_nr = brw_inst_3src_a1_src1_subreg_nr(devinfo, inst);
1323*61046927SAndroid Build Coastguard Worker type = brw_inst_3src_a1_src1_type(devinfo, inst);
1324*61046927SAndroid Build Coastguard Worker
1325*61046927SAndroid Build Coastguard Worker _vert_stride = vstride_from_align1_3src_vstride(
1326*61046927SAndroid Build Coastguard Worker devinfo, brw_inst_3src_a1_src1_vstride(devinfo, inst));
1327*61046927SAndroid Build Coastguard Worker _horiz_stride = hstride_from_align1_3src_hstride(
1328*61046927SAndroid Build Coastguard Worker brw_inst_3src_a1_src1_hstride(devinfo, inst));
1329*61046927SAndroid Build Coastguard Worker _width = implied_width(_vert_stride, _horiz_stride);
1330*61046927SAndroid Build Coastguard Worker } else {
1331*61046927SAndroid Build Coastguard Worker _file = FIXED_GRF;
1332*61046927SAndroid Build Coastguard Worker reg_nr = brw_inst_3src_src1_reg_nr(devinfo, inst);
1333*61046927SAndroid Build Coastguard Worker subreg_nr = brw_inst_3src_a16_src1_subreg_nr(devinfo, inst) * 4;
1334*61046927SAndroid Build Coastguard Worker type = brw_inst_3src_a16_src_type(devinfo, inst);
1335*61046927SAndroid Build Coastguard Worker
1336*61046927SAndroid Build Coastguard Worker if (brw_inst_3src_a16_src1_rep_ctrl(devinfo, inst)) {
1337*61046927SAndroid Build Coastguard Worker _vert_stride = BRW_VERTICAL_STRIDE_0;
1338*61046927SAndroid Build Coastguard Worker _width = BRW_WIDTH_1;
1339*61046927SAndroid Build Coastguard Worker _horiz_stride = BRW_HORIZONTAL_STRIDE_0;
1340*61046927SAndroid Build Coastguard Worker } else {
1341*61046927SAndroid Build Coastguard Worker _vert_stride = BRW_VERTICAL_STRIDE_4;
1342*61046927SAndroid Build Coastguard Worker _width = BRW_WIDTH_4;
1343*61046927SAndroid Build Coastguard Worker _horiz_stride = BRW_HORIZONTAL_STRIDE_1;
1344*61046927SAndroid Build Coastguard Worker }
1345*61046927SAndroid Build Coastguard Worker }
1346*61046927SAndroid Build Coastguard Worker is_scalar_region = _vert_stride == BRW_VERTICAL_STRIDE_0 &&
1347*61046927SAndroid Build Coastguard Worker _width == BRW_WIDTH_1 &&
1348*61046927SAndroid Build Coastguard Worker _horiz_stride == BRW_HORIZONTAL_STRIDE_0;
1349*61046927SAndroid Build Coastguard Worker
1350*61046927SAndroid Build Coastguard Worker subreg_nr /= brw_type_size_bytes(type);
1351*61046927SAndroid Build Coastguard Worker
1352*61046927SAndroid Build Coastguard Worker err |= control(file, "negate", m_negate,
1353*61046927SAndroid Build Coastguard Worker brw_inst_3src_src1_negate(devinfo, inst), NULL);
1354*61046927SAndroid Build Coastguard Worker err |= control(file, "abs", _abs, brw_inst_3src_src1_abs(devinfo, inst), NULL);
1355*61046927SAndroid Build Coastguard Worker
1356*61046927SAndroid Build Coastguard Worker err |= reg(file, _file, reg_nr);
1357*61046927SAndroid Build Coastguard Worker if (err == -1)
1358*61046927SAndroid Build Coastguard Worker return 0;
1359*61046927SAndroid Build Coastguard Worker if (subreg_nr || is_scalar_region)
1360*61046927SAndroid Build Coastguard Worker format(file, ".%d", subreg_nr);
1361*61046927SAndroid Build Coastguard Worker src_align1_region(file, _vert_stride, _width, _horiz_stride);
1362*61046927SAndroid Build Coastguard Worker if (!is_scalar_region && !is_align1)
1363*61046927SAndroid Build Coastguard Worker err |= src_swizzle(file, brw_inst_3src_a16_src1_swizzle(devinfo, inst));
1364*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
1365*61046927SAndroid Build Coastguard Worker return err;
1366*61046927SAndroid Build Coastguard Worker }
1367*61046927SAndroid Build Coastguard Worker
1368*61046927SAndroid Build Coastguard Worker static int
src2_3src(FILE * file,const struct intel_device_info * devinfo,const brw_inst * inst)1369*61046927SAndroid Build Coastguard Worker src2_3src(FILE *file, const struct intel_device_info *devinfo,
1370*61046927SAndroid Build Coastguard Worker const brw_inst *inst)
1371*61046927SAndroid Build Coastguard Worker {
1372*61046927SAndroid Build Coastguard Worker int err = 0;
1373*61046927SAndroid Build Coastguard Worker unsigned reg_nr, subreg_nr;
1374*61046927SAndroid Build Coastguard Worker enum brw_reg_file _file;
1375*61046927SAndroid Build Coastguard Worker enum brw_reg_type type;
1376*61046927SAndroid Build Coastguard Worker enum brw_vertical_stride _vert_stride;
1377*61046927SAndroid Build Coastguard Worker enum brw_width _width;
1378*61046927SAndroid Build Coastguard Worker enum brw_horizontal_stride _horiz_stride;
1379*61046927SAndroid Build Coastguard Worker bool is_scalar_region;
1380*61046927SAndroid Build Coastguard Worker bool is_align1 = brw_inst_3src_access_mode(devinfo, inst) == BRW_ALIGN_1;
1381*61046927SAndroid Build Coastguard Worker
1382*61046927SAndroid Build Coastguard Worker if (devinfo->ver < 10 && is_align1)
1383*61046927SAndroid Build Coastguard Worker return 0;
1384*61046927SAndroid Build Coastguard Worker
1385*61046927SAndroid Build Coastguard Worker if (is_align1) {
1386*61046927SAndroid Build Coastguard Worker _file = brw_inst_3src_a1_src2_reg_file(devinfo, inst);
1387*61046927SAndroid Build Coastguard Worker if (_file == IMM) {
1388*61046927SAndroid Build Coastguard Worker uint16_t imm_val = brw_inst_3src_a1_src2_imm(devinfo, inst);
1389*61046927SAndroid Build Coastguard Worker enum brw_reg_type type = brw_inst_3src_a1_src2_type(devinfo, inst);
1390*61046927SAndroid Build Coastguard Worker
1391*61046927SAndroid Build Coastguard Worker if (type == BRW_TYPE_W) {
1392*61046927SAndroid Build Coastguard Worker format(file, "%dW", imm_val);
1393*61046927SAndroid Build Coastguard Worker } else if (type == BRW_TYPE_UW) {
1394*61046927SAndroid Build Coastguard Worker format(file, "0x%04xUW", imm_val);
1395*61046927SAndroid Build Coastguard Worker } else if (type == BRW_TYPE_HF) {
1396*61046927SAndroid Build Coastguard Worker format(file, "0x%04xHF", imm_val);
1397*61046927SAndroid Build Coastguard Worker }
1398*61046927SAndroid Build Coastguard Worker return 0;
1399*61046927SAndroid Build Coastguard Worker }
1400*61046927SAndroid Build Coastguard Worker
1401*61046927SAndroid Build Coastguard Worker reg_nr = brw_inst_3src_src2_reg_nr(devinfo, inst);
1402*61046927SAndroid Build Coastguard Worker subreg_nr = brw_inst_3src_a1_src2_subreg_nr(devinfo, inst);
1403*61046927SAndroid Build Coastguard Worker type = brw_inst_3src_a1_src2_type(devinfo, inst);
1404*61046927SAndroid Build Coastguard Worker /* FINISHME: No vertical stride on src2. Is using the hstride in place
1405*61046927SAndroid Build Coastguard Worker * correct? Doesn't seem like it, since there's hstride=1 but
1406*61046927SAndroid Build Coastguard Worker * no vstride=1.
1407*61046927SAndroid Build Coastguard Worker */
1408*61046927SAndroid Build Coastguard Worker _vert_stride = vstride_from_align1_3src_hstride(
1409*61046927SAndroid Build Coastguard Worker brw_inst_3src_a1_src2_hstride(devinfo, inst));
1410*61046927SAndroid Build Coastguard Worker _horiz_stride = hstride_from_align1_3src_hstride(
1411*61046927SAndroid Build Coastguard Worker brw_inst_3src_a1_src2_hstride(devinfo, inst));
1412*61046927SAndroid Build Coastguard Worker _width = implied_width(_vert_stride, _horiz_stride);
1413*61046927SAndroid Build Coastguard Worker } else {
1414*61046927SAndroid Build Coastguard Worker _file = FIXED_GRF;
1415*61046927SAndroid Build Coastguard Worker reg_nr = brw_inst_3src_src2_reg_nr(devinfo, inst);
1416*61046927SAndroid Build Coastguard Worker subreg_nr = brw_inst_3src_a16_src2_subreg_nr(devinfo, inst) * 4;
1417*61046927SAndroid Build Coastguard Worker type = brw_inst_3src_a16_src_type(devinfo, inst);
1418*61046927SAndroid Build Coastguard Worker
1419*61046927SAndroid Build Coastguard Worker if (brw_inst_3src_a16_src2_rep_ctrl(devinfo, inst)) {
1420*61046927SAndroid Build Coastguard Worker _vert_stride = BRW_VERTICAL_STRIDE_0;
1421*61046927SAndroid Build Coastguard Worker _width = BRW_WIDTH_1;
1422*61046927SAndroid Build Coastguard Worker _horiz_stride = BRW_HORIZONTAL_STRIDE_0;
1423*61046927SAndroid Build Coastguard Worker } else {
1424*61046927SAndroid Build Coastguard Worker _vert_stride = BRW_VERTICAL_STRIDE_4;
1425*61046927SAndroid Build Coastguard Worker _width = BRW_WIDTH_4;
1426*61046927SAndroid Build Coastguard Worker _horiz_stride = BRW_HORIZONTAL_STRIDE_1;
1427*61046927SAndroid Build Coastguard Worker }
1428*61046927SAndroid Build Coastguard Worker }
1429*61046927SAndroid Build Coastguard Worker is_scalar_region = _vert_stride == BRW_VERTICAL_STRIDE_0 &&
1430*61046927SAndroid Build Coastguard Worker _width == BRW_WIDTH_1 &&
1431*61046927SAndroid Build Coastguard Worker _horiz_stride == BRW_HORIZONTAL_STRIDE_0;
1432*61046927SAndroid Build Coastguard Worker
1433*61046927SAndroid Build Coastguard Worker subreg_nr /= brw_type_size_bytes(type);
1434*61046927SAndroid Build Coastguard Worker
1435*61046927SAndroid Build Coastguard Worker err |= control(file, "negate", m_negate,
1436*61046927SAndroid Build Coastguard Worker brw_inst_3src_src2_negate(devinfo, inst), NULL);
1437*61046927SAndroid Build Coastguard Worker err |= control(file, "abs", _abs, brw_inst_3src_src2_abs(devinfo, inst), NULL);
1438*61046927SAndroid Build Coastguard Worker
1439*61046927SAndroid Build Coastguard Worker err |= reg(file, _file, reg_nr);
1440*61046927SAndroid Build Coastguard Worker if (err == -1)
1441*61046927SAndroid Build Coastguard Worker return 0;
1442*61046927SAndroid Build Coastguard Worker if (subreg_nr || is_scalar_region)
1443*61046927SAndroid Build Coastguard Worker format(file, ".%d", subreg_nr);
1444*61046927SAndroid Build Coastguard Worker src_align1_region(file, _vert_stride, _width, _horiz_stride);
1445*61046927SAndroid Build Coastguard Worker if (!is_scalar_region && !is_align1)
1446*61046927SAndroid Build Coastguard Worker err |= src_swizzle(file, brw_inst_3src_a16_src2_swizzle(devinfo, inst));
1447*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
1448*61046927SAndroid Build Coastguard Worker return err;
1449*61046927SAndroid Build Coastguard Worker }
1450*61046927SAndroid Build Coastguard Worker
1451*61046927SAndroid Build Coastguard Worker static int
src0_dpas_3src(FILE * file,const struct intel_device_info * devinfo,const brw_inst * inst)1452*61046927SAndroid Build Coastguard Worker src0_dpas_3src(FILE *file, const struct intel_device_info *devinfo,
1453*61046927SAndroid Build Coastguard Worker const brw_inst *inst)
1454*61046927SAndroid Build Coastguard Worker {
1455*61046927SAndroid Build Coastguard Worker uint32_t reg_file = brw_inst_dpas_3src_src0_reg_file(devinfo, inst);
1456*61046927SAndroid Build Coastguard Worker
1457*61046927SAndroid Build Coastguard Worker if (reg(file, reg_file, brw_inst_dpas_3src_src0_reg_nr(devinfo, inst)) == -1)
1458*61046927SAndroid Build Coastguard Worker return 0;
1459*61046927SAndroid Build Coastguard Worker
1460*61046927SAndroid Build Coastguard Worker unsigned subreg_nr = brw_inst_dpas_3src_src0_subreg_nr(devinfo, inst);
1461*61046927SAndroid Build Coastguard Worker enum brw_reg_type type = brw_inst_dpas_3src_src0_type(devinfo, inst);
1462*61046927SAndroid Build Coastguard Worker
1463*61046927SAndroid Build Coastguard Worker if (subreg_nr)
1464*61046927SAndroid Build Coastguard Worker format(file, ".%d", subreg_nr);
1465*61046927SAndroid Build Coastguard Worker src_align1_region(file,
1466*61046927SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_1,
1467*61046927SAndroid Build Coastguard Worker BRW_WIDTH_1,
1468*61046927SAndroid Build Coastguard Worker BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_0);
1469*61046927SAndroid Build Coastguard Worker
1470*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
1471*61046927SAndroid Build Coastguard Worker
1472*61046927SAndroid Build Coastguard Worker return 0;
1473*61046927SAndroid Build Coastguard Worker }
1474*61046927SAndroid Build Coastguard Worker
1475*61046927SAndroid Build Coastguard Worker static int
src1_dpas_3src(FILE * file,const struct intel_device_info * devinfo,const brw_inst * inst)1476*61046927SAndroid Build Coastguard Worker src1_dpas_3src(FILE *file, const struct intel_device_info *devinfo,
1477*61046927SAndroid Build Coastguard Worker const brw_inst *inst)
1478*61046927SAndroid Build Coastguard Worker {
1479*61046927SAndroid Build Coastguard Worker uint32_t reg_file = brw_inst_dpas_3src_src1_reg_file(devinfo, inst);
1480*61046927SAndroid Build Coastguard Worker
1481*61046927SAndroid Build Coastguard Worker if (reg(file, reg_file, brw_inst_dpas_3src_src1_reg_nr(devinfo, inst)) == -1)
1482*61046927SAndroid Build Coastguard Worker return 0;
1483*61046927SAndroid Build Coastguard Worker
1484*61046927SAndroid Build Coastguard Worker unsigned subreg_nr = brw_inst_dpas_3src_src1_subreg_nr(devinfo, inst);
1485*61046927SAndroid Build Coastguard Worker enum brw_reg_type type = brw_inst_dpas_3src_src1_type(devinfo, inst);
1486*61046927SAndroid Build Coastguard Worker
1487*61046927SAndroid Build Coastguard Worker if (subreg_nr)
1488*61046927SAndroid Build Coastguard Worker format(file, ".%d", subreg_nr);
1489*61046927SAndroid Build Coastguard Worker src_align1_region(file,
1490*61046927SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_1,
1491*61046927SAndroid Build Coastguard Worker BRW_WIDTH_1,
1492*61046927SAndroid Build Coastguard Worker BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_0);
1493*61046927SAndroid Build Coastguard Worker
1494*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
1495*61046927SAndroid Build Coastguard Worker
1496*61046927SAndroid Build Coastguard Worker return 0;
1497*61046927SAndroid Build Coastguard Worker }
1498*61046927SAndroid Build Coastguard Worker
1499*61046927SAndroid Build Coastguard Worker static int
src2_dpas_3src(FILE * file,const struct intel_device_info * devinfo,const brw_inst * inst)1500*61046927SAndroid Build Coastguard Worker src2_dpas_3src(FILE *file, const struct intel_device_info *devinfo,
1501*61046927SAndroid Build Coastguard Worker const brw_inst *inst)
1502*61046927SAndroid Build Coastguard Worker {
1503*61046927SAndroid Build Coastguard Worker uint32_t reg_file = brw_inst_dpas_3src_src2_reg_file(devinfo, inst);
1504*61046927SAndroid Build Coastguard Worker
1505*61046927SAndroid Build Coastguard Worker if (reg(file, reg_file, brw_inst_dpas_3src_src2_reg_nr(devinfo, inst)) == -1)
1506*61046927SAndroid Build Coastguard Worker return 0;
1507*61046927SAndroid Build Coastguard Worker
1508*61046927SAndroid Build Coastguard Worker unsigned subreg_nr = brw_inst_dpas_3src_src2_subreg_nr(devinfo, inst);
1509*61046927SAndroid Build Coastguard Worker enum brw_reg_type type = brw_inst_dpas_3src_src2_type(devinfo, inst);
1510*61046927SAndroid Build Coastguard Worker
1511*61046927SAndroid Build Coastguard Worker if (subreg_nr)
1512*61046927SAndroid Build Coastguard Worker format(file, ".%d", subreg_nr);
1513*61046927SAndroid Build Coastguard Worker src_align1_region(file,
1514*61046927SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_1,
1515*61046927SAndroid Build Coastguard Worker BRW_WIDTH_1,
1516*61046927SAndroid Build Coastguard Worker BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_0);
1517*61046927SAndroid Build Coastguard Worker
1518*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
1519*61046927SAndroid Build Coastguard Worker
1520*61046927SAndroid Build Coastguard Worker return 0;
1521*61046927SAndroid Build Coastguard Worker }
1522*61046927SAndroid Build Coastguard Worker
1523*61046927SAndroid Build Coastguard Worker static int
imm(FILE * file,const struct brw_isa_info * isa,enum brw_reg_type type,const brw_inst * inst)1524*61046927SAndroid Build Coastguard Worker imm(FILE *file, const struct brw_isa_info *isa, enum brw_reg_type type,
1525*61046927SAndroid Build Coastguard Worker const brw_inst *inst)
1526*61046927SAndroid Build Coastguard Worker {
1527*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo = isa->devinfo;
1528*61046927SAndroid Build Coastguard Worker
1529*61046927SAndroid Build Coastguard Worker switch (type) {
1530*61046927SAndroid Build Coastguard Worker case BRW_TYPE_UQ:
1531*61046927SAndroid Build Coastguard Worker format(file, "0x%016"PRIx64"UQ", brw_inst_imm_uq(devinfo, inst));
1532*61046927SAndroid Build Coastguard Worker break;
1533*61046927SAndroid Build Coastguard Worker case BRW_TYPE_Q:
1534*61046927SAndroid Build Coastguard Worker format(file, "0x%016"PRIx64"Q", brw_inst_imm_uq(devinfo, inst));
1535*61046927SAndroid Build Coastguard Worker break;
1536*61046927SAndroid Build Coastguard Worker case BRW_TYPE_UD:
1537*61046927SAndroid Build Coastguard Worker format(file, "0x%08xUD", brw_inst_imm_ud(devinfo, inst));
1538*61046927SAndroid Build Coastguard Worker break;
1539*61046927SAndroid Build Coastguard Worker case BRW_TYPE_D:
1540*61046927SAndroid Build Coastguard Worker format(file, "%dD", brw_inst_imm_d(devinfo, inst));
1541*61046927SAndroid Build Coastguard Worker break;
1542*61046927SAndroid Build Coastguard Worker case BRW_TYPE_UW:
1543*61046927SAndroid Build Coastguard Worker format(file, "0x%04xUW", (uint16_t) brw_inst_imm_ud(devinfo, inst));
1544*61046927SAndroid Build Coastguard Worker break;
1545*61046927SAndroid Build Coastguard Worker case BRW_TYPE_W:
1546*61046927SAndroid Build Coastguard Worker format(file, "%dW", (int16_t) brw_inst_imm_d(devinfo, inst));
1547*61046927SAndroid Build Coastguard Worker break;
1548*61046927SAndroid Build Coastguard Worker case BRW_TYPE_UV:
1549*61046927SAndroid Build Coastguard Worker format(file, "0x%08xUV", brw_inst_imm_ud(devinfo, inst));
1550*61046927SAndroid Build Coastguard Worker break;
1551*61046927SAndroid Build Coastguard Worker case BRW_TYPE_VF:
1552*61046927SAndroid Build Coastguard Worker format(file, "0x%"PRIx64"VF", brw_inst_bits(inst, 127, 96));
1553*61046927SAndroid Build Coastguard Worker pad(file, 48);
1554*61046927SAndroid Build Coastguard Worker format(file, "/* [%-gF, %-gF, %-gF, %-gF]VF */",
1555*61046927SAndroid Build Coastguard Worker brw_vf_to_float(brw_inst_imm_ud(devinfo, inst)),
1556*61046927SAndroid Build Coastguard Worker brw_vf_to_float(brw_inst_imm_ud(devinfo, inst) >> 8),
1557*61046927SAndroid Build Coastguard Worker brw_vf_to_float(brw_inst_imm_ud(devinfo, inst) >> 16),
1558*61046927SAndroid Build Coastguard Worker brw_vf_to_float(brw_inst_imm_ud(devinfo, inst) >> 24));
1559*61046927SAndroid Build Coastguard Worker break;
1560*61046927SAndroid Build Coastguard Worker case BRW_TYPE_V:
1561*61046927SAndroid Build Coastguard Worker format(file, "0x%08xV", brw_inst_imm_ud(devinfo, inst));
1562*61046927SAndroid Build Coastguard Worker break;
1563*61046927SAndroid Build Coastguard Worker case BRW_TYPE_F:
1564*61046927SAndroid Build Coastguard Worker /* The DIM instruction's src0 uses an F type but contains a
1565*61046927SAndroid Build Coastguard Worker * 64-bit immediate
1566*61046927SAndroid Build Coastguard Worker */
1567*61046927SAndroid Build Coastguard Worker format(file, "0x%"PRIx64"F", brw_inst_bits(inst, 127, 96));
1568*61046927SAndroid Build Coastguard Worker pad(file, 48);
1569*61046927SAndroid Build Coastguard Worker format(file, " /* %-gF */", brw_inst_imm_f(devinfo, inst));
1570*61046927SAndroid Build Coastguard Worker break;
1571*61046927SAndroid Build Coastguard Worker case BRW_TYPE_DF:
1572*61046927SAndroid Build Coastguard Worker format(file, "0x%016"PRIx64"DF", brw_inst_imm_uq(devinfo, inst));
1573*61046927SAndroid Build Coastguard Worker pad(file, 48);
1574*61046927SAndroid Build Coastguard Worker format(file, "/* %-gDF */", brw_inst_imm_df(devinfo, inst));
1575*61046927SAndroid Build Coastguard Worker break;
1576*61046927SAndroid Build Coastguard Worker case BRW_TYPE_HF:
1577*61046927SAndroid Build Coastguard Worker format(file, "0x%04xHF",
1578*61046927SAndroid Build Coastguard Worker (uint16_t) brw_inst_imm_ud(devinfo, inst));
1579*61046927SAndroid Build Coastguard Worker pad(file, 48);
1580*61046927SAndroid Build Coastguard Worker format(file, "/* %-gHF */",
1581*61046927SAndroid Build Coastguard Worker _mesa_half_to_float((uint16_t) brw_inst_imm_ud(devinfo, inst)));
1582*61046927SAndroid Build Coastguard Worker break;
1583*61046927SAndroid Build Coastguard Worker case BRW_TYPE_UB:
1584*61046927SAndroid Build Coastguard Worker case BRW_TYPE_B:
1585*61046927SAndroid Build Coastguard Worker default:
1586*61046927SAndroid Build Coastguard Worker format(file, "*** invalid immediate type %d ", type);
1587*61046927SAndroid Build Coastguard Worker }
1588*61046927SAndroid Build Coastguard Worker return 0;
1589*61046927SAndroid Build Coastguard Worker }
1590*61046927SAndroid Build Coastguard Worker
1591*61046927SAndroid Build Coastguard Worker static int
src_sends_da(FILE * file,const struct intel_device_info * devinfo,enum brw_reg_type type,enum brw_reg_file _reg_file,unsigned _reg_nr,unsigned _reg_subnr)1592*61046927SAndroid Build Coastguard Worker src_sends_da(FILE *file,
1593*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo,
1594*61046927SAndroid Build Coastguard Worker enum brw_reg_type type,
1595*61046927SAndroid Build Coastguard Worker enum brw_reg_file _reg_file,
1596*61046927SAndroid Build Coastguard Worker unsigned _reg_nr,
1597*61046927SAndroid Build Coastguard Worker unsigned _reg_subnr)
1598*61046927SAndroid Build Coastguard Worker {
1599*61046927SAndroid Build Coastguard Worker int err = 0;
1600*61046927SAndroid Build Coastguard Worker
1601*61046927SAndroid Build Coastguard Worker err |= reg(file, _reg_file, _reg_nr);
1602*61046927SAndroid Build Coastguard Worker if (err == -1)
1603*61046927SAndroid Build Coastguard Worker return 0;
1604*61046927SAndroid Build Coastguard Worker if (_reg_subnr)
1605*61046927SAndroid Build Coastguard Worker format(file, ".1");
1606*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
1607*61046927SAndroid Build Coastguard Worker
1608*61046927SAndroid Build Coastguard Worker return err;
1609*61046927SAndroid Build Coastguard Worker }
1610*61046927SAndroid Build Coastguard Worker
1611*61046927SAndroid Build Coastguard Worker static int
src_sends_ia(FILE * file,const struct intel_device_info * devinfo,enum brw_reg_type type,int _addr_imm,unsigned _addr_subreg_nr)1612*61046927SAndroid Build Coastguard Worker src_sends_ia(FILE *file,
1613*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo,
1614*61046927SAndroid Build Coastguard Worker enum brw_reg_type type,
1615*61046927SAndroid Build Coastguard Worker int _addr_imm,
1616*61046927SAndroid Build Coastguard Worker unsigned _addr_subreg_nr)
1617*61046927SAndroid Build Coastguard Worker {
1618*61046927SAndroid Build Coastguard Worker string(file, "g[a0");
1619*61046927SAndroid Build Coastguard Worker if (_addr_subreg_nr)
1620*61046927SAndroid Build Coastguard Worker format(file, ".1");
1621*61046927SAndroid Build Coastguard Worker if (_addr_imm)
1622*61046927SAndroid Build Coastguard Worker format(file, " %d", _addr_imm);
1623*61046927SAndroid Build Coastguard Worker string(file, "]");
1624*61046927SAndroid Build Coastguard Worker string(file, brw_reg_type_to_letters(type));
1625*61046927SAndroid Build Coastguard Worker
1626*61046927SAndroid Build Coastguard Worker return 0;
1627*61046927SAndroid Build Coastguard Worker }
1628*61046927SAndroid Build Coastguard Worker
1629*61046927SAndroid Build Coastguard Worker static int
src_send_desc_ia(FILE * file,const struct intel_device_info * devinfo,unsigned _addr_subreg_nr)1630*61046927SAndroid Build Coastguard Worker src_send_desc_ia(FILE *file,
1631*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo,
1632*61046927SAndroid Build Coastguard Worker unsigned _addr_subreg_nr)
1633*61046927SAndroid Build Coastguard Worker {
1634*61046927SAndroid Build Coastguard Worker string(file, "a0");
1635*61046927SAndroid Build Coastguard Worker if (_addr_subreg_nr)
1636*61046927SAndroid Build Coastguard Worker format(file, ".%d", _addr_subreg_nr);
1637*61046927SAndroid Build Coastguard Worker format(file, "<0>UD");
1638*61046927SAndroid Build Coastguard Worker
1639*61046927SAndroid Build Coastguard Worker return 0;
1640*61046927SAndroid Build Coastguard Worker }
1641*61046927SAndroid Build Coastguard Worker
1642*61046927SAndroid Build Coastguard Worker static int
src0(FILE * file,const struct brw_isa_info * isa,const brw_inst * inst)1643*61046927SAndroid Build Coastguard Worker src0(FILE *file, const struct brw_isa_info *isa, const brw_inst *inst)
1644*61046927SAndroid Build Coastguard Worker {
1645*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo = isa->devinfo;
1646*61046927SAndroid Build Coastguard Worker
1647*61046927SAndroid Build Coastguard Worker if (is_split_send(devinfo, brw_inst_opcode(isa, inst))) {
1648*61046927SAndroid Build Coastguard Worker if (devinfo->ver >= 12) {
1649*61046927SAndroid Build Coastguard Worker return src_sends_da(file,
1650*61046927SAndroid Build Coastguard Worker devinfo,
1651*61046927SAndroid Build Coastguard Worker BRW_TYPE_UD,
1652*61046927SAndroid Build Coastguard Worker brw_inst_send_src0_reg_file(devinfo, inst),
1653*61046927SAndroid Build Coastguard Worker brw_inst_src0_da_reg_nr(devinfo, inst),
1654*61046927SAndroid Build Coastguard Worker 0);
1655*61046927SAndroid Build Coastguard Worker } else if (brw_inst_send_src0_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
1656*61046927SAndroid Build Coastguard Worker return src_sends_da(file,
1657*61046927SAndroid Build Coastguard Worker devinfo,
1658*61046927SAndroid Build Coastguard Worker BRW_TYPE_UD,
1659*61046927SAndroid Build Coastguard Worker FIXED_GRF,
1660*61046927SAndroid Build Coastguard Worker brw_inst_src0_da_reg_nr(devinfo, inst),
1661*61046927SAndroid Build Coastguard Worker brw_inst_src0_da16_subreg_nr(devinfo, inst));
1662*61046927SAndroid Build Coastguard Worker } else {
1663*61046927SAndroid Build Coastguard Worker return src_sends_ia(file,
1664*61046927SAndroid Build Coastguard Worker devinfo,
1665*61046927SAndroid Build Coastguard Worker BRW_TYPE_UD,
1666*61046927SAndroid Build Coastguard Worker brw_inst_send_src0_ia16_addr_imm(devinfo, inst),
1667*61046927SAndroid Build Coastguard Worker brw_inst_src0_ia_subreg_nr(devinfo, inst));
1668*61046927SAndroid Build Coastguard Worker }
1669*61046927SAndroid Build Coastguard Worker } else if (brw_inst_src0_reg_file(devinfo, inst) == IMM) {
1670*61046927SAndroid Build Coastguard Worker return imm(file, isa, brw_inst_src0_type(devinfo, inst), inst);
1671*61046927SAndroid Build Coastguard Worker } else if (brw_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
1672*61046927SAndroid Build Coastguard Worker if (brw_inst_src0_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
1673*61046927SAndroid Build Coastguard Worker return src_da1(file,
1674*61046927SAndroid Build Coastguard Worker devinfo,
1675*61046927SAndroid Build Coastguard Worker brw_inst_opcode(isa, inst),
1676*61046927SAndroid Build Coastguard Worker brw_inst_src0_type(devinfo, inst),
1677*61046927SAndroid Build Coastguard Worker brw_inst_src0_reg_file(devinfo, inst),
1678*61046927SAndroid Build Coastguard Worker brw_inst_src0_vstride(devinfo, inst),
1679*61046927SAndroid Build Coastguard Worker brw_inst_src0_width(devinfo, inst),
1680*61046927SAndroid Build Coastguard Worker brw_inst_src0_hstride(devinfo, inst),
1681*61046927SAndroid Build Coastguard Worker brw_inst_src0_da_reg_nr(devinfo, inst),
1682*61046927SAndroid Build Coastguard Worker brw_inst_src0_da1_subreg_nr(devinfo, inst),
1683*61046927SAndroid Build Coastguard Worker brw_inst_src0_abs(devinfo, inst),
1684*61046927SAndroid Build Coastguard Worker brw_inst_src0_negate(devinfo, inst));
1685*61046927SAndroid Build Coastguard Worker } else {
1686*61046927SAndroid Build Coastguard Worker return src_ia1(file,
1687*61046927SAndroid Build Coastguard Worker devinfo,
1688*61046927SAndroid Build Coastguard Worker brw_inst_opcode(isa, inst),
1689*61046927SAndroid Build Coastguard Worker brw_inst_src0_type(devinfo, inst),
1690*61046927SAndroid Build Coastguard Worker brw_inst_src0_ia1_addr_imm(devinfo, inst),
1691*61046927SAndroid Build Coastguard Worker brw_inst_src0_ia_subreg_nr(devinfo, inst),
1692*61046927SAndroid Build Coastguard Worker brw_inst_src0_negate(devinfo, inst),
1693*61046927SAndroid Build Coastguard Worker brw_inst_src0_abs(devinfo, inst),
1694*61046927SAndroid Build Coastguard Worker brw_inst_src0_hstride(devinfo, inst),
1695*61046927SAndroid Build Coastguard Worker brw_inst_src0_width(devinfo, inst),
1696*61046927SAndroid Build Coastguard Worker brw_inst_src0_vstride(devinfo, inst));
1697*61046927SAndroid Build Coastguard Worker }
1698*61046927SAndroid Build Coastguard Worker } else {
1699*61046927SAndroid Build Coastguard Worker if (brw_inst_src0_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
1700*61046927SAndroid Build Coastguard Worker return src_da16(file,
1701*61046927SAndroid Build Coastguard Worker devinfo,
1702*61046927SAndroid Build Coastguard Worker brw_inst_opcode(isa, inst),
1703*61046927SAndroid Build Coastguard Worker brw_inst_src0_type(devinfo, inst),
1704*61046927SAndroid Build Coastguard Worker brw_inst_src0_reg_file(devinfo, inst),
1705*61046927SAndroid Build Coastguard Worker brw_inst_src0_vstride(devinfo, inst),
1706*61046927SAndroid Build Coastguard Worker brw_inst_src0_da_reg_nr(devinfo, inst),
1707*61046927SAndroid Build Coastguard Worker brw_inst_src0_da16_subreg_nr(devinfo, inst),
1708*61046927SAndroid Build Coastguard Worker brw_inst_src0_abs(devinfo, inst),
1709*61046927SAndroid Build Coastguard Worker brw_inst_src0_negate(devinfo, inst),
1710*61046927SAndroid Build Coastguard Worker brw_inst_src0_da16_swiz_x(devinfo, inst),
1711*61046927SAndroid Build Coastguard Worker brw_inst_src0_da16_swiz_y(devinfo, inst),
1712*61046927SAndroid Build Coastguard Worker brw_inst_src0_da16_swiz_z(devinfo, inst),
1713*61046927SAndroid Build Coastguard Worker brw_inst_src0_da16_swiz_w(devinfo, inst));
1714*61046927SAndroid Build Coastguard Worker } else {
1715*61046927SAndroid Build Coastguard Worker string(file, "Indirect align16 address mode not supported");
1716*61046927SAndroid Build Coastguard Worker return 1;
1717*61046927SAndroid Build Coastguard Worker }
1718*61046927SAndroid Build Coastguard Worker }
1719*61046927SAndroid Build Coastguard Worker }
1720*61046927SAndroid Build Coastguard Worker
1721*61046927SAndroid Build Coastguard Worker static int
src1(FILE * file,const struct brw_isa_info * isa,const brw_inst * inst)1722*61046927SAndroid Build Coastguard Worker src1(FILE *file, const struct brw_isa_info *isa, const brw_inst *inst)
1723*61046927SAndroid Build Coastguard Worker {
1724*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo = isa->devinfo;
1725*61046927SAndroid Build Coastguard Worker
1726*61046927SAndroid Build Coastguard Worker if (is_split_send(devinfo, brw_inst_opcode(isa, inst))) {
1727*61046927SAndroid Build Coastguard Worker return src_sends_da(file,
1728*61046927SAndroid Build Coastguard Worker devinfo,
1729*61046927SAndroid Build Coastguard Worker BRW_TYPE_UD,
1730*61046927SAndroid Build Coastguard Worker brw_inst_send_src1_reg_file(devinfo, inst),
1731*61046927SAndroid Build Coastguard Worker brw_inst_send_src1_reg_nr(devinfo, inst),
1732*61046927SAndroid Build Coastguard Worker 0 /* subreg_nr */);
1733*61046927SAndroid Build Coastguard Worker } else if (brw_inst_src1_reg_file(devinfo, inst) == IMM) {
1734*61046927SAndroid Build Coastguard Worker return imm(file, isa, brw_inst_src1_type(devinfo, inst), inst);
1735*61046927SAndroid Build Coastguard Worker } else if (brw_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
1736*61046927SAndroid Build Coastguard Worker if (brw_inst_src1_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
1737*61046927SAndroid Build Coastguard Worker return src_da1(file,
1738*61046927SAndroid Build Coastguard Worker devinfo,
1739*61046927SAndroid Build Coastguard Worker brw_inst_opcode(isa, inst),
1740*61046927SAndroid Build Coastguard Worker brw_inst_src1_type(devinfo, inst),
1741*61046927SAndroid Build Coastguard Worker brw_inst_src1_reg_file(devinfo, inst),
1742*61046927SAndroid Build Coastguard Worker brw_inst_src1_vstride(devinfo, inst),
1743*61046927SAndroid Build Coastguard Worker brw_inst_src1_width(devinfo, inst),
1744*61046927SAndroid Build Coastguard Worker brw_inst_src1_hstride(devinfo, inst),
1745*61046927SAndroid Build Coastguard Worker brw_inst_src1_da_reg_nr(devinfo, inst),
1746*61046927SAndroid Build Coastguard Worker brw_inst_src1_da1_subreg_nr(devinfo, inst),
1747*61046927SAndroid Build Coastguard Worker brw_inst_src1_abs(devinfo, inst),
1748*61046927SAndroid Build Coastguard Worker brw_inst_src1_negate(devinfo, inst));
1749*61046927SAndroid Build Coastguard Worker } else {
1750*61046927SAndroid Build Coastguard Worker return src_ia1(file,
1751*61046927SAndroid Build Coastguard Worker devinfo,
1752*61046927SAndroid Build Coastguard Worker brw_inst_opcode(isa, inst),
1753*61046927SAndroid Build Coastguard Worker brw_inst_src1_type(devinfo, inst),
1754*61046927SAndroid Build Coastguard Worker brw_inst_src1_ia1_addr_imm(devinfo, inst),
1755*61046927SAndroid Build Coastguard Worker brw_inst_src1_ia_subreg_nr(devinfo, inst),
1756*61046927SAndroid Build Coastguard Worker brw_inst_src1_negate(devinfo, inst),
1757*61046927SAndroid Build Coastguard Worker brw_inst_src1_abs(devinfo, inst),
1758*61046927SAndroid Build Coastguard Worker brw_inst_src1_hstride(devinfo, inst),
1759*61046927SAndroid Build Coastguard Worker brw_inst_src1_width(devinfo, inst),
1760*61046927SAndroid Build Coastguard Worker brw_inst_src1_vstride(devinfo, inst));
1761*61046927SAndroid Build Coastguard Worker }
1762*61046927SAndroid Build Coastguard Worker } else {
1763*61046927SAndroid Build Coastguard Worker if (brw_inst_src1_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
1764*61046927SAndroid Build Coastguard Worker return src_da16(file,
1765*61046927SAndroid Build Coastguard Worker devinfo,
1766*61046927SAndroid Build Coastguard Worker brw_inst_opcode(isa, inst),
1767*61046927SAndroid Build Coastguard Worker brw_inst_src1_type(devinfo, inst),
1768*61046927SAndroid Build Coastguard Worker brw_inst_src1_reg_file(devinfo, inst),
1769*61046927SAndroid Build Coastguard Worker brw_inst_src1_vstride(devinfo, inst),
1770*61046927SAndroid Build Coastguard Worker brw_inst_src1_da_reg_nr(devinfo, inst),
1771*61046927SAndroid Build Coastguard Worker brw_inst_src1_da16_subreg_nr(devinfo, inst),
1772*61046927SAndroid Build Coastguard Worker brw_inst_src1_abs(devinfo, inst),
1773*61046927SAndroid Build Coastguard Worker brw_inst_src1_negate(devinfo, inst),
1774*61046927SAndroid Build Coastguard Worker brw_inst_src1_da16_swiz_x(devinfo, inst),
1775*61046927SAndroid Build Coastguard Worker brw_inst_src1_da16_swiz_y(devinfo, inst),
1776*61046927SAndroid Build Coastguard Worker brw_inst_src1_da16_swiz_z(devinfo, inst),
1777*61046927SAndroid Build Coastguard Worker brw_inst_src1_da16_swiz_w(devinfo, inst));
1778*61046927SAndroid Build Coastguard Worker } else {
1779*61046927SAndroid Build Coastguard Worker string(file, "Indirect align16 address mode not supported");
1780*61046927SAndroid Build Coastguard Worker return 1;
1781*61046927SAndroid Build Coastguard Worker }
1782*61046927SAndroid Build Coastguard Worker }
1783*61046927SAndroid Build Coastguard Worker }
1784*61046927SAndroid Build Coastguard Worker
1785*61046927SAndroid Build Coastguard Worker static int
qtr_ctrl(FILE * file,const struct intel_device_info * devinfo,const brw_inst * inst)1786*61046927SAndroid Build Coastguard Worker qtr_ctrl(FILE *file, const struct intel_device_info *devinfo,
1787*61046927SAndroid Build Coastguard Worker const brw_inst *inst)
1788*61046927SAndroid Build Coastguard Worker {
1789*61046927SAndroid Build Coastguard Worker int qtr_ctl = brw_inst_qtr_control(devinfo, inst);
1790*61046927SAndroid Build Coastguard Worker int exec_size = 1 << brw_inst_exec_size(devinfo, inst);
1791*61046927SAndroid Build Coastguard Worker const unsigned nib_ctl = devinfo->ver >= 20 ? 0 :
1792*61046927SAndroid Build Coastguard Worker brw_inst_nib_control(devinfo, inst);
1793*61046927SAndroid Build Coastguard Worker
1794*61046927SAndroid Build Coastguard Worker if (exec_size < 8 || nib_ctl) {
1795*61046927SAndroid Build Coastguard Worker format(file, " %dN", qtr_ctl * 2 + nib_ctl + 1);
1796*61046927SAndroid Build Coastguard Worker } else if (exec_size == 8) {
1797*61046927SAndroid Build Coastguard Worker switch (qtr_ctl) {
1798*61046927SAndroid Build Coastguard Worker case 0:
1799*61046927SAndroid Build Coastguard Worker string(file, " 1Q");
1800*61046927SAndroid Build Coastguard Worker break;
1801*61046927SAndroid Build Coastguard Worker case 1:
1802*61046927SAndroid Build Coastguard Worker string(file, " 2Q");
1803*61046927SAndroid Build Coastguard Worker break;
1804*61046927SAndroid Build Coastguard Worker case 2:
1805*61046927SAndroid Build Coastguard Worker string(file, " 3Q");
1806*61046927SAndroid Build Coastguard Worker break;
1807*61046927SAndroid Build Coastguard Worker case 3:
1808*61046927SAndroid Build Coastguard Worker string(file, " 4Q");
1809*61046927SAndroid Build Coastguard Worker break;
1810*61046927SAndroid Build Coastguard Worker }
1811*61046927SAndroid Build Coastguard Worker } else if (exec_size == 16) {
1812*61046927SAndroid Build Coastguard Worker if (qtr_ctl < 2)
1813*61046927SAndroid Build Coastguard Worker string(file, " 1H");
1814*61046927SAndroid Build Coastguard Worker else
1815*61046927SAndroid Build Coastguard Worker string(file, " 2H");
1816*61046927SAndroid Build Coastguard Worker }
1817*61046927SAndroid Build Coastguard Worker return 0;
1818*61046927SAndroid Build Coastguard Worker }
1819*61046927SAndroid Build Coastguard Worker
1820*61046927SAndroid Build Coastguard Worker static bool
inst_has_type(const struct brw_isa_info * isa,const brw_inst * inst,enum brw_reg_type type)1821*61046927SAndroid Build Coastguard Worker inst_has_type(const struct brw_isa_info *isa,
1822*61046927SAndroid Build Coastguard Worker const brw_inst *inst,
1823*61046927SAndroid Build Coastguard Worker enum brw_reg_type type)
1824*61046927SAndroid Build Coastguard Worker {
1825*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo = isa->devinfo;
1826*61046927SAndroid Build Coastguard Worker const unsigned num_sources = brw_num_sources_from_inst(isa, inst);
1827*61046927SAndroid Build Coastguard Worker
1828*61046927SAndroid Build Coastguard Worker if (brw_inst_dst_type(devinfo, inst) == type)
1829*61046927SAndroid Build Coastguard Worker return true;
1830*61046927SAndroid Build Coastguard Worker
1831*61046927SAndroid Build Coastguard Worker if (num_sources >= 3) {
1832*61046927SAndroid Build Coastguard Worker if (brw_inst_3src_access_mode(devinfo, inst) == BRW_ALIGN_1)
1833*61046927SAndroid Build Coastguard Worker return brw_inst_3src_a1_src0_type(devinfo, inst) == type ||
1834*61046927SAndroid Build Coastguard Worker brw_inst_3src_a1_src1_type(devinfo, inst) == type ||
1835*61046927SAndroid Build Coastguard Worker brw_inst_3src_a1_src2_type(devinfo, inst) == type;
1836*61046927SAndroid Build Coastguard Worker else
1837*61046927SAndroid Build Coastguard Worker return brw_inst_3src_a16_src_type(devinfo, inst) == type;
1838*61046927SAndroid Build Coastguard Worker } else if (num_sources == 2) {
1839*61046927SAndroid Build Coastguard Worker return brw_inst_src0_type(devinfo, inst) == type ||
1840*61046927SAndroid Build Coastguard Worker brw_inst_src1_type(devinfo, inst) == type;
1841*61046927SAndroid Build Coastguard Worker } else {
1842*61046927SAndroid Build Coastguard Worker return brw_inst_src0_type(devinfo, inst) == type;
1843*61046927SAndroid Build Coastguard Worker }
1844*61046927SAndroid Build Coastguard Worker }
1845*61046927SAndroid Build Coastguard Worker
1846*61046927SAndroid Build Coastguard Worker static int
swsb(FILE * file,const struct brw_isa_info * isa,const brw_inst * inst)1847*61046927SAndroid Build Coastguard Worker swsb(FILE *file, const struct brw_isa_info *isa, const brw_inst *inst)
1848*61046927SAndroid Build Coastguard Worker {
1849*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo = isa->devinfo;
1850*61046927SAndroid Build Coastguard Worker const enum opcode opcode = brw_inst_opcode(isa, inst);
1851*61046927SAndroid Build Coastguard Worker const uint32_t x = brw_inst_swsb(devinfo, inst);
1852*61046927SAndroid Build Coastguard Worker const bool is_unordered =
1853*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_SEND || opcode == BRW_OPCODE_SENDC ||
1854*61046927SAndroid Build Coastguard Worker opcode == BRW_OPCODE_MATH || opcode == BRW_OPCODE_DPAS ||
1855*61046927SAndroid Build Coastguard Worker (devinfo->has_64bit_float_via_math_pipe &&
1856*61046927SAndroid Build Coastguard Worker inst_has_type(isa, inst, BRW_TYPE_DF));
1857*61046927SAndroid Build Coastguard Worker const struct tgl_swsb swsb = tgl_swsb_decode(devinfo, is_unordered, x, opcode);
1858*61046927SAndroid Build Coastguard Worker if (swsb.regdist)
1859*61046927SAndroid Build Coastguard Worker format(file, " %s@%d",
1860*61046927SAndroid Build Coastguard Worker (swsb.pipe == TGL_PIPE_FLOAT ? "F" :
1861*61046927SAndroid Build Coastguard Worker swsb.pipe == TGL_PIPE_INT ? "I" :
1862*61046927SAndroid Build Coastguard Worker swsb.pipe == TGL_PIPE_LONG ? "L" :
1863*61046927SAndroid Build Coastguard Worker swsb.pipe == TGL_PIPE_ALL ? "A" :
1864*61046927SAndroid Build Coastguard Worker swsb.pipe == TGL_PIPE_MATH ? "M" : "" ),
1865*61046927SAndroid Build Coastguard Worker swsb.regdist);
1866*61046927SAndroid Build Coastguard Worker if (swsb.mode)
1867*61046927SAndroid Build Coastguard Worker format(file, " $%d%s", swsb.sbid,
1868*61046927SAndroid Build Coastguard Worker (swsb.mode & TGL_SBID_SET ? "" :
1869*61046927SAndroid Build Coastguard Worker swsb.mode & TGL_SBID_DST ? ".dst" : ".src"));
1870*61046927SAndroid Build Coastguard Worker return 0;
1871*61046927SAndroid Build Coastguard Worker }
1872*61046927SAndroid Build Coastguard Worker
1873*61046927SAndroid Build Coastguard Worker #if MESA_DEBUG
1874*61046927SAndroid Build Coastguard Worker static __attribute__((__unused__)) int
brw_disassemble_imm(const struct brw_isa_info * isa,uint32_t dw3,uint32_t dw2,uint32_t dw1,uint32_t dw0)1875*61046927SAndroid Build Coastguard Worker brw_disassemble_imm(const struct brw_isa_info *isa,
1876*61046927SAndroid Build Coastguard Worker uint32_t dw3, uint32_t dw2, uint32_t dw1, uint32_t dw0)
1877*61046927SAndroid Build Coastguard Worker {
1878*61046927SAndroid Build Coastguard Worker brw_inst inst;
1879*61046927SAndroid Build Coastguard Worker inst.data[0] = (((uint64_t) dw1) << 32) | ((uint64_t) dw0);
1880*61046927SAndroid Build Coastguard Worker inst.data[1] = (((uint64_t) dw3) << 32) | ((uint64_t) dw2);
1881*61046927SAndroid Build Coastguard Worker return brw_disassemble_inst(stderr, isa, &inst, false, 0, NULL);
1882*61046927SAndroid Build Coastguard Worker }
1883*61046927SAndroid Build Coastguard Worker #endif
1884*61046927SAndroid Build Coastguard Worker
1885*61046927SAndroid Build Coastguard Worker static void
write_label(FILE * file,const struct intel_device_info * devinfo,const struct brw_label * root_label,int offset,int jump)1886*61046927SAndroid Build Coastguard Worker write_label(FILE *file, const struct intel_device_info *devinfo,
1887*61046927SAndroid Build Coastguard Worker const struct brw_label *root_label,
1888*61046927SAndroid Build Coastguard Worker int offset, int jump)
1889*61046927SAndroid Build Coastguard Worker {
1890*61046927SAndroid Build Coastguard Worker if (root_label != NULL) {
1891*61046927SAndroid Build Coastguard Worker int to_bytes_scale = sizeof(brw_inst) / brw_jump_scale(devinfo);
1892*61046927SAndroid Build Coastguard Worker const struct brw_label *label =
1893*61046927SAndroid Build Coastguard Worker brw_find_label(root_label, offset + jump * to_bytes_scale);
1894*61046927SAndroid Build Coastguard Worker if (label != NULL) {
1895*61046927SAndroid Build Coastguard Worker format(file, " LABEL%d", label->number);
1896*61046927SAndroid Build Coastguard Worker }
1897*61046927SAndroid Build Coastguard Worker }
1898*61046927SAndroid Build Coastguard Worker }
1899*61046927SAndroid Build Coastguard Worker
1900*61046927SAndroid Build Coastguard Worker static void
lsc_disassemble_ex_desc(const struct intel_device_info * devinfo,uint32_t imm_desc,uint32_t imm_ex_desc,FILE * file)1901*61046927SAndroid Build Coastguard Worker lsc_disassemble_ex_desc(const struct intel_device_info *devinfo,
1902*61046927SAndroid Build Coastguard Worker uint32_t imm_desc,
1903*61046927SAndroid Build Coastguard Worker uint32_t imm_ex_desc,
1904*61046927SAndroid Build Coastguard Worker FILE *file)
1905*61046927SAndroid Build Coastguard Worker {
1906*61046927SAndroid Build Coastguard Worker const unsigned addr_type = lsc_msg_desc_addr_type(devinfo, imm_desc);
1907*61046927SAndroid Build Coastguard Worker switch (addr_type) {
1908*61046927SAndroid Build Coastguard Worker case LSC_ADDR_SURFTYPE_FLAT:
1909*61046927SAndroid Build Coastguard Worker format(file, " base_offset %u ",
1910*61046927SAndroid Build Coastguard Worker lsc_flat_ex_desc_base_offset(devinfo, imm_ex_desc));
1911*61046927SAndroid Build Coastguard Worker break;
1912*61046927SAndroid Build Coastguard Worker case LSC_ADDR_SURFTYPE_BSS:
1913*61046927SAndroid Build Coastguard Worker case LSC_ADDR_SURFTYPE_SS:
1914*61046927SAndroid Build Coastguard Worker format(file, " surface_state_index %u ",
1915*61046927SAndroid Build Coastguard Worker lsc_bss_ex_desc_index(devinfo, imm_ex_desc));
1916*61046927SAndroid Build Coastguard Worker break;
1917*61046927SAndroid Build Coastguard Worker case LSC_ADDR_SURFTYPE_BTI:
1918*61046927SAndroid Build Coastguard Worker format(file, " BTI %u ",
1919*61046927SAndroid Build Coastguard Worker lsc_bti_ex_desc_index(devinfo, imm_ex_desc));
1920*61046927SAndroid Build Coastguard Worker format(file, " base_offset %u ",
1921*61046927SAndroid Build Coastguard Worker lsc_bti_ex_desc_base_offset(devinfo, imm_ex_desc));
1922*61046927SAndroid Build Coastguard Worker break;
1923*61046927SAndroid Build Coastguard Worker default:
1924*61046927SAndroid Build Coastguard Worker format(file, "unsupported address surface type %d", addr_type);
1925*61046927SAndroid Build Coastguard Worker break;
1926*61046927SAndroid Build Coastguard Worker }
1927*61046927SAndroid Build Coastguard Worker }
1928*61046927SAndroid Build Coastguard Worker
1929*61046927SAndroid Build Coastguard Worker static inline bool
brw_sfid_is_lsc(unsigned sfid)1930*61046927SAndroid Build Coastguard Worker brw_sfid_is_lsc(unsigned sfid)
1931*61046927SAndroid Build Coastguard Worker {
1932*61046927SAndroid Build Coastguard Worker switch (sfid) {
1933*61046927SAndroid Build Coastguard Worker case GFX12_SFID_UGM:
1934*61046927SAndroid Build Coastguard Worker case GFX12_SFID_SLM:
1935*61046927SAndroid Build Coastguard Worker case GFX12_SFID_TGM:
1936*61046927SAndroid Build Coastguard Worker return true;
1937*61046927SAndroid Build Coastguard Worker default:
1938*61046927SAndroid Build Coastguard Worker break;
1939*61046927SAndroid Build Coastguard Worker }
1940*61046927SAndroid Build Coastguard Worker
1941*61046927SAndroid Build Coastguard Worker return false;
1942*61046927SAndroid Build Coastguard Worker }
1943*61046927SAndroid Build Coastguard Worker
1944*61046927SAndroid Build Coastguard Worker int
brw_disassemble_inst(FILE * file,const struct brw_isa_info * isa,const brw_inst * inst,bool is_compacted,int offset,const struct brw_label * root_label)1945*61046927SAndroid Build Coastguard Worker brw_disassemble_inst(FILE *file, const struct brw_isa_info *isa,
1946*61046927SAndroid Build Coastguard Worker const brw_inst *inst, bool is_compacted,
1947*61046927SAndroid Build Coastguard Worker int offset, const struct brw_label *root_label)
1948*61046927SAndroid Build Coastguard Worker {
1949*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo = isa->devinfo;
1950*61046927SAndroid Build Coastguard Worker
1951*61046927SAndroid Build Coastguard Worker int err = 0;
1952*61046927SAndroid Build Coastguard Worker int space = 0;
1953*61046927SAndroid Build Coastguard Worker
1954*61046927SAndroid Build Coastguard Worker const enum opcode opcode = brw_inst_opcode(isa, inst);
1955*61046927SAndroid Build Coastguard Worker const struct opcode_desc *desc = brw_opcode_desc(isa, opcode);
1956*61046927SAndroid Build Coastguard Worker
1957*61046927SAndroid Build Coastguard Worker if (brw_inst_pred_control(devinfo, inst)) {
1958*61046927SAndroid Build Coastguard Worker string(file, "(");
1959*61046927SAndroid Build Coastguard Worker err |= control(file, "predicate inverse", pred_inv,
1960*61046927SAndroid Build Coastguard Worker brw_inst_pred_inv(devinfo, inst), NULL);
1961*61046927SAndroid Build Coastguard Worker format(file, "f%"PRIu64".%"PRIu64,
1962*61046927SAndroid Build Coastguard Worker brw_inst_flag_reg_nr(devinfo, inst),
1963*61046927SAndroid Build Coastguard Worker brw_inst_flag_subreg_nr(devinfo, inst));
1964*61046927SAndroid Build Coastguard Worker if (devinfo->ver >= 20) {
1965*61046927SAndroid Build Coastguard Worker err |= control(file, "predicate control", xe2_pred_ctrl,
1966*61046927SAndroid Build Coastguard Worker brw_inst_pred_control(devinfo, inst), NULL);
1967*61046927SAndroid Build Coastguard Worker } else if (brw_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
1968*61046927SAndroid Build Coastguard Worker err |= control(file, "predicate control align1", pred_ctrl_align1,
1969*61046927SAndroid Build Coastguard Worker brw_inst_pred_control(devinfo, inst), NULL);
1970*61046927SAndroid Build Coastguard Worker } else {
1971*61046927SAndroid Build Coastguard Worker err |= control(file, "predicate control align16", pred_ctrl_align16,
1972*61046927SAndroid Build Coastguard Worker brw_inst_pred_control(devinfo, inst), NULL);
1973*61046927SAndroid Build Coastguard Worker }
1974*61046927SAndroid Build Coastguard Worker string(file, ") ");
1975*61046927SAndroid Build Coastguard Worker }
1976*61046927SAndroid Build Coastguard Worker
1977*61046927SAndroid Build Coastguard Worker err |= print_opcode(file, isa, opcode);
1978*61046927SAndroid Build Coastguard Worker
1979*61046927SAndroid Build Coastguard Worker if (!is_send(opcode))
1980*61046927SAndroid Build Coastguard Worker err |= control(file, "saturate", saturate, brw_inst_saturate(devinfo, inst),
1981*61046927SAndroid Build Coastguard Worker NULL);
1982*61046927SAndroid Build Coastguard Worker
1983*61046927SAndroid Build Coastguard Worker err |= control(file, "debug control", debug_ctrl,
1984*61046927SAndroid Build Coastguard Worker brw_inst_debug_control(devinfo, inst), NULL);
1985*61046927SAndroid Build Coastguard Worker
1986*61046927SAndroid Build Coastguard Worker if (opcode == BRW_OPCODE_MATH) {
1987*61046927SAndroid Build Coastguard Worker string(file, " ");
1988*61046927SAndroid Build Coastguard Worker err |= control(file, "function", math_function,
1989*61046927SAndroid Build Coastguard Worker brw_inst_math_function(devinfo, inst), NULL);
1990*61046927SAndroid Build Coastguard Worker
1991*61046927SAndroid Build Coastguard Worker } else if (opcode == BRW_OPCODE_SYNC) {
1992*61046927SAndroid Build Coastguard Worker string(file, " ");
1993*61046927SAndroid Build Coastguard Worker err |= control(file, "function", sync_function,
1994*61046927SAndroid Build Coastguard Worker brw_inst_cond_modifier(devinfo, inst), NULL);
1995*61046927SAndroid Build Coastguard Worker
1996*61046927SAndroid Build Coastguard Worker } else if (opcode == BRW_OPCODE_DPAS) {
1997*61046927SAndroid Build Coastguard Worker string(file, ".");
1998*61046927SAndroid Build Coastguard Worker
1999*61046927SAndroid Build Coastguard Worker err |= control(file, "systolic depth", dpas_systolic_depth,
2000*61046927SAndroid Build Coastguard Worker brw_inst_dpas_3src_sdepth(devinfo, inst), NULL);
2001*61046927SAndroid Build Coastguard Worker
2002*61046927SAndroid Build Coastguard Worker const unsigned rcount = brw_inst_dpas_3src_rcount(devinfo, inst) + 1;
2003*61046927SAndroid Build Coastguard Worker
2004*61046927SAndroid Build Coastguard Worker format(file, "x%d", rcount);
2005*61046927SAndroid Build Coastguard Worker } else if (!is_send(opcode) &&
2006*61046927SAndroid Build Coastguard Worker (devinfo->ver < 12 ||
2007*61046927SAndroid Build Coastguard Worker brw_inst_src0_reg_file(devinfo, inst) != IMM ||
2008*61046927SAndroid Build Coastguard Worker brw_type_size_bytes(brw_inst_src0_type(devinfo, inst)) < 8)) {
2009*61046927SAndroid Build Coastguard Worker err |= control(file, "conditional modifier", conditional_modifier,
2010*61046927SAndroid Build Coastguard Worker brw_inst_cond_modifier(devinfo, inst), NULL);
2011*61046927SAndroid Build Coastguard Worker
2012*61046927SAndroid Build Coastguard Worker /* If we're using the conditional modifier, print which flags reg is
2013*61046927SAndroid Build Coastguard Worker * used for it. Note that on gfx6+, the embedded-condition SEL and
2014*61046927SAndroid Build Coastguard Worker * control flow doesn't update flags.
2015*61046927SAndroid Build Coastguard Worker */
2016*61046927SAndroid Build Coastguard Worker if (brw_inst_cond_modifier(devinfo, inst) &&
2017*61046927SAndroid Build Coastguard Worker (opcode != BRW_OPCODE_SEL &&
2018*61046927SAndroid Build Coastguard Worker opcode != BRW_OPCODE_CSEL &&
2019*61046927SAndroid Build Coastguard Worker opcode != BRW_OPCODE_IF &&
2020*61046927SAndroid Build Coastguard Worker opcode != BRW_OPCODE_WHILE)) {
2021*61046927SAndroid Build Coastguard Worker format(file, ".f%"PRIu64".%"PRIu64,
2022*61046927SAndroid Build Coastguard Worker brw_inst_flag_reg_nr(devinfo, inst),
2023*61046927SAndroid Build Coastguard Worker brw_inst_flag_subreg_nr(devinfo, inst));
2024*61046927SAndroid Build Coastguard Worker }
2025*61046927SAndroid Build Coastguard Worker }
2026*61046927SAndroid Build Coastguard Worker
2027*61046927SAndroid Build Coastguard Worker if (opcode != BRW_OPCODE_NOP) {
2028*61046927SAndroid Build Coastguard Worker string(file, "(");
2029*61046927SAndroid Build Coastguard Worker err |= control(file, "execution size", exec_size,
2030*61046927SAndroid Build Coastguard Worker brw_inst_exec_size(devinfo, inst), NULL);
2031*61046927SAndroid Build Coastguard Worker string(file, ")");
2032*61046927SAndroid Build Coastguard Worker }
2033*61046927SAndroid Build Coastguard Worker
2034*61046927SAndroid Build Coastguard Worker if (brw_has_uip(devinfo, opcode)) {
2035*61046927SAndroid Build Coastguard Worker /* Instructions that have UIP also have JIP. */
2036*61046927SAndroid Build Coastguard Worker pad(file, 16);
2037*61046927SAndroid Build Coastguard Worker string(file, "JIP: ");
2038*61046927SAndroid Build Coastguard Worker write_label(file, devinfo, root_label, offset, brw_inst_jip(devinfo, inst));
2039*61046927SAndroid Build Coastguard Worker
2040*61046927SAndroid Build Coastguard Worker pad(file, 38);
2041*61046927SAndroid Build Coastguard Worker string(file, "UIP: ");
2042*61046927SAndroid Build Coastguard Worker write_label(file, devinfo, root_label, offset, brw_inst_uip(devinfo, inst));
2043*61046927SAndroid Build Coastguard Worker } else if (brw_has_jip(devinfo, opcode)) {
2044*61046927SAndroid Build Coastguard Worker int jip = brw_inst_jip(devinfo, inst);
2045*61046927SAndroid Build Coastguard Worker
2046*61046927SAndroid Build Coastguard Worker pad(file, 16);
2047*61046927SAndroid Build Coastguard Worker string(file, "JIP: ");
2048*61046927SAndroid Build Coastguard Worker write_label(file, devinfo, root_label, offset, jip);
2049*61046927SAndroid Build Coastguard Worker } else if (opcode == BRW_OPCODE_JMPI) {
2050*61046927SAndroid Build Coastguard Worker pad(file, 16);
2051*61046927SAndroid Build Coastguard Worker err |= src1(file, isa, inst);
2052*61046927SAndroid Build Coastguard Worker } else if (opcode == BRW_OPCODE_DPAS) {
2053*61046927SAndroid Build Coastguard Worker pad(file, 16);
2054*61046927SAndroid Build Coastguard Worker err |= dest_dpas_3src(file, devinfo, inst);
2055*61046927SAndroid Build Coastguard Worker
2056*61046927SAndroid Build Coastguard Worker pad(file, 32);
2057*61046927SAndroid Build Coastguard Worker err |= src0_dpas_3src(file, devinfo, inst);
2058*61046927SAndroid Build Coastguard Worker
2059*61046927SAndroid Build Coastguard Worker pad(file, 48);
2060*61046927SAndroid Build Coastguard Worker err |= src1_dpas_3src(file, devinfo, inst);
2061*61046927SAndroid Build Coastguard Worker
2062*61046927SAndroid Build Coastguard Worker pad(file, 64);
2063*61046927SAndroid Build Coastguard Worker err |= src2_dpas_3src(file, devinfo, inst);
2064*61046927SAndroid Build Coastguard Worker
2065*61046927SAndroid Build Coastguard Worker } else if (desc && desc->nsrc == 3) {
2066*61046927SAndroid Build Coastguard Worker pad(file, 16);
2067*61046927SAndroid Build Coastguard Worker err |= dest_3src(file, devinfo, inst);
2068*61046927SAndroid Build Coastguard Worker
2069*61046927SAndroid Build Coastguard Worker pad(file, 32);
2070*61046927SAndroid Build Coastguard Worker err |= src0_3src(file, devinfo, inst);
2071*61046927SAndroid Build Coastguard Worker
2072*61046927SAndroid Build Coastguard Worker pad(file, 48);
2073*61046927SAndroid Build Coastguard Worker err |= src1_3src(file, devinfo, inst);
2074*61046927SAndroid Build Coastguard Worker
2075*61046927SAndroid Build Coastguard Worker pad(file, 64);
2076*61046927SAndroid Build Coastguard Worker err |= src2_3src(file, devinfo, inst);
2077*61046927SAndroid Build Coastguard Worker } else if (desc) {
2078*61046927SAndroid Build Coastguard Worker if (desc->ndst > 0) {
2079*61046927SAndroid Build Coastguard Worker pad(file, 16);
2080*61046927SAndroid Build Coastguard Worker err |= dest(file, isa, inst);
2081*61046927SAndroid Build Coastguard Worker }
2082*61046927SAndroid Build Coastguard Worker
2083*61046927SAndroid Build Coastguard Worker if (desc->nsrc > 0) {
2084*61046927SAndroid Build Coastguard Worker pad(file, 32);
2085*61046927SAndroid Build Coastguard Worker err |= src0(file, isa, inst);
2086*61046927SAndroid Build Coastguard Worker }
2087*61046927SAndroid Build Coastguard Worker
2088*61046927SAndroid Build Coastguard Worker if (desc->nsrc > 1) {
2089*61046927SAndroid Build Coastguard Worker pad(file, 48);
2090*61046927SAndroid Build Coastguard Worker err |= src1(file, isa, inst);
2091*61046927SAndroid Build Coastguard Worker }
2092*61046927SAndroid Build Coastguard Worker }
2093*61046927SAndroid Build Coastguard Worker
2094*61046927SAndroid Build Coastguard Worker if (is_send(opcode)) {
2095*61046927SAndroid Build Coastguard Worker enum brw_message_target sfid = brw_inst_sfid(devinfo, inst);
2096*61046927SAndroid Build Coastguard Worker
2097*61046927SAndroid Build Coastguard Worker bool has_imm_desc = false, has_imm_ex_desc = false;
2098*61046927SAndroid Build Coastguard Worker uint32_t imm_desc = 0, imm_ex_desc = 0;
2099*61046927SAndroid Build Coastguard Worker if (is_split_send(devinfo, opcode)) {
2100*61046927SAndroid Build Coastguard Worker pad(file, 64);
2101*61046927SAndroid Build Coastguard Worker if (brw_inst_send_sel_reg32_desc(devinfo, inst)) {
2102*61046927SAndroid Build Coastguard Worker /* show the indirect descriptor source */
2103*61046927SAndroid Build Coastguard Worker err |= src_send_desc_ia(file, devinfo, 0);
2104*61046927SAndroid Build Coastguard Worker } else {
2105*61046927SAndroid Build Coastguard Worker has_imm_desc = true;
2106*61046927SAndroid Build Coastguard Worker imm_desc = brw_inst_send_desc(devinfo, inst);
2107*61046927SAndroid Build Coastguard Worker fprintf(file, "0x%08"PRIx32, imm_desc);
2108*61046927SAndroid Build Coastguard Worker }
2109*61046927SAndroid Build Coastguard Worker
2110*61046927SAndroid Build Coastguard Worker pad(file, 80);
2111*61046927SAndroid Build Coastguard Worker if (brw_inst_send_sel_reg32_ex_desc(devinfo, inst)) {
2112*61046927SAndroid Build Coastguard Worker /* show the indirect descriptor source */
2113*61046927SAndroid Build Coastguard Worker err |= src_send_desc_ia(file, devinfo,
2114*61046927SAndroid Build Coastguard Worker brw_inst_send_ex_desc_ia_subreg_nr(devinfo, inst));
2115*61046927SAndroid Build Coastguard Worker } else {
2116*61046927SAndroid Build Coastguard Worker has_imm_ex_desc = true;
2117*61046927SAndroid Build Coastguard Worker imm_ex_desc = brw_inst_sends_ex_desc(devinfo, inst);
2118*61046927SAndroid Build Coastguard Worker fprintf(file, "0x%08"PRIx32, imm_ex_desc);
2119*61046927SAndroid Build Coastguard Worker }
2120*61046927SAndroid Build Coastguard Worker } else {
2121*61046927SAndroid Build Coastguard Worker if (brw_inst_src1_reg_file(devinfo, inst) != IMM) {
2122*61046927SAndroid Build Coastguard Worker /* show the indirect descriptor source */
2123*61046927SAndroid Build Coastguard Worker pad(file, 48);
2124*61046927SAndroid Build Coastguard Worker err |= src1(file, isa, inst);
2125*61046927SAndroid Build Coastguard Worker pad(file, 64);
2126*61046927SAndroid Build Coastguard Worker } else {
2127*61046927SAndroid Build Coastguard Worker has_imm_desc = true;
2128*61046927SAndroid Build Coastguard Worker imm_desc = brw_inst_send_desc(devinfo, inst);
2129*61046927SAndroid Build Coastguard Worker pad(file, 48);
2130*61046927SAndroid Build Coastguard Worker }
2131*61046927SAndroid Build Coastguard Worker
2132*61046927SAndroid Build Coastguard Worker /* Print message descriptor as immediate source */
2133*61046927SAndroid Build Coastguard Worker fprintf(file, "0x%08"PRIx64, inst->data[1] >> 32);
2134*61046927SAndroid Build Coastguard Worker }
2135*61046927SAndroid Build Coastguard Worker
2136*61046927SAndroid Build Coastguard Worker newline(file);
2137*61046927SAndroid Build Coastguard Worker pad(file, 16);
2138*61046927SAndroid Build Coastguard Worker space = 0;
2139*61046927SAndroid Build Coastguard Worker
2140*61046927SAndroid Build Coastguard Worker fprintf(file, " ");
2141*61046927SAndroid Build Coastguard Worker err |= control(file, "SFID", gfx6_sfid, sfid, &space);
2142*61046927SAndroid Build Coastguard Worker string(file, " MsgDesc:");
2143*61046927SAndroid Build Coastguard Worker
2144*61046927SAndroid Build Coastguard Worker if (!has_imm_desc) {
2145*61046927SAndroid Build Coastguard Worker format(file, " indirect");
2146*61046927SAndroid Build Coastguard Worker } else {
2147*61046927SAndroid Build Coastguard Worker bool unsupported = false;
2148*61046927SAndroid Build Coastguard Worker switch (sfid) {
2149*61046927SAndroid Build Coastguard Worker case BRW_SFID_SAMPLER:
2150*61046927SAndroid Build Coastguard Worker if (devinfo->ver >= 20) {
2151*61046927SAndroid Build Coastguard Worker err |= control(file, "sampler message", xe2_sampler_msg_type,
2152*61046927SAndroid Build Coastguard Worker brw_sampler_desc_msg_type(devinfo, imm_desc),
2153*61046927SAndroid Build Coastguard Worker &space);
2154*61046927SAndroid Build Coastguard Worker err |= control(file, "sampler simd mode", xe2_sampler_simd_mode,
2155*61046927SAndroid Build Coastguard Worker brw_sampler_desc_simd_mode(devinfo, imm_desc),
2156*61046927SAndroid Build Coastguard Worker &space);
2157*61046927SAndroid Build Coastguard Worker if (brw_sampler_desc_return_format(devinfo, imm_desc)) {
2158*61046927SAndroid Build Coastguard Worker string(file, " HP");
2159*61046927SAndroid Build Coastguard Worker }
2160*61046927SAndroid Build Coastguard Worker format(file, " Surface = %u Sampler = %u",
2161*61046927SAndroid Build Coastguard Worker brw_sampler_desc_binding_table_index(devinfo, imm_desc),
2162*61046927SAndroid Build Coastguard Worker brw_sampler_desc_sampler(devinfo, imm_desc));
2163*61046927SAndroid Build Coastguard Worker } else {
2164*61046927SAndroid Build Coastguard Worker err |= control(file, "sampler message", gfx5_sampler_msg_type,
2165*61046927SAndroid Build Coastguard Worker brw_sampler_desc_msg_type(devinfo, imm_desc),
2166*61046927SAndroid Build Coastguard Worker &space);
2167*61046927SAndroid Build Coastguard Worker err |= control(file, "sampler simd mode",
2168*61046927SAndroid Build Coastguard Worker devinfo->ver >= 20 ? xe2_sampler_simd_mode :
2169*61046927SAndroid Build Coastguard Worker gfx5_sampler_simd_mode,
2170*61046927SAndroid Build Coastguard Worker brw_sampler_desc_simd_mode(devinfo, imm_desc),
2171*61046927SAndroid Build Coastguard Worker &space);
2172*61046927SAndroid Build Coastguard Worker if (brw_sampler_desc_return_format(devinfo, imm_desc)) {
2173*61046927SAndroid Build Coastguard Worker string(file, " HP");
2174*61046927SAndroid Build Coastguard Worker }
2175*61046927SAndroid Build Coastguard Worker format(file, " Surface = %u Sampler = %u",
2176*61046927SAndroid Build Coastguard Worker brw_sampler_desc_binding_table_index(devinfo, imm_desc),
2177*61046927SAndroid Build Coastguard Worker brw_sampler_desc_sampler(devinfo, imm_desc));
2178*61046927SAndroid Build Coastguard Worker }
2179*61046927SAndroid Build Coastguard Worker break;
2180*61046927SAndroid Build Coastguard Worker case GFX6_SFID_DATAPORT_SAMPLER_CACHE:
2181*61046927SAndroid Build Coastguard Worker case GFX6_SFID_DATAPORT_CONSTANT_CACHE:
2182*61046927SAndroid Build Coastguard Worker format(file, " (bti %u, msg_ctrl %u, msg_type %u)",
2183*61046927SAndroid Build Coastguard Worker brw_dp_desc_binding_table_index(devinfo, imm_desc),
2184*61046927SAndroid Build Coastguard Worker brw_dp_desc_msg_control(devinfo, imm_desc),
2185*61046927SAndroid Build Coastguard Worker brw_dp_desc_msg_type(devinfo, imm_desc));
2186*61046927SAndroid Build Coastguard Worker break;
2187*61046927SAndroid Build Coastguard Worker
2188*61046927SAndroid Build Coastguard Worker case GFX6_SFID_DATAPORT_RENDER_CACHE: {
2189*61046927SAndroid Build Coastguard Worker /* aka BRW_SFID_DATAPORT_WRITE on Gfx4-5 */
2190*61046927SAndroid Build Coastguard Worker unsigned msg_type = brw_fb_desc_msg_type(devinfo, imm_desc);
2191*61046927SAndroid Build Coastguard Worker
2192*61046927SAndroid Build Coastguard Worker err |= control(file, "DP rc message type",
2193*61046927SAndroid Build Coastguard Worker dp_rc_msg_type(devinfo), msg_type, &space);
2194*61046927SAndroid Build Coastguard Worker
2195*61046927SAndroid Build Coastguard Worker bool is_rt_write = msg_type ==
2196*61046927SAndroid Build Coastguard Worker GFX6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE;
2197*61046927SAndroid Build Coastguard Worker
2198*61046927SAndroid Build Coastguard Worker if (is_rt_write) {
2199*61046927SAndroid Build Coastguard Worker err |= control(file, "RT message type",
2200*61046927SAndroid Build Coastguard Worker devinfo->ver >= 20 ? m_rt_write_subtype_xe2 : m_rt_write_subtype,
2201*61046927SAndroid Build Coastguard Worker brw_inst_rt_message_type(devinfo, inst), &space);
2202*61046927SAndroid Build Coastguard Worker if (brw_inst_rt_slot_group(devinfo, inst))
2203*61046927SAndroid Build Coastguard Worker string(file, " Hi");
2204*61046927SAndroid Build Coastguard Worker if (brw_fb_write_desc_last_render_target(devinfo, imm_desc))
2205*61046927SAndroid Build Coastguard Worker string(file, " LastRT");
2206*61046927SAndroid Build Coastguard Worker if (devinfo->ver >= 10 &&
2207*61046927SAndroid Build Coastguard Worker brw_fb_write_desc_coarse_write(devinfo, imm_desc))
2208*61046927SAndroid Build Coastguard Worker string(file, " CoarseWrite");
2209*61046927SAndroid Build Coastguard Worker } else {
2210*61046927SAndroid Build Coastguard Worker format(file, " MsgCtrl = 0x%u",
2211*61046927SAndroid Build Coastguard Worker brw_fb_desc_msg_control(devinfo, imm_desc));
2212*61046927SAndroid Build Coastguard Worker }
2213*61046927SAndroid Build Coastguard Worker
2214*61046927SAndroid Build Coastguard Worker format(file, " Surface = %u",
2215*61046927SAndroid Build Coastguard Worker brw_fb_desc_binding_table_index(devinfo, imm_desc));
2216*61046927SAndroid Build Coastguard Worker break;
2217*61046927SAndroid Build Coastguard Worker }
2218*61046927SAndroid Build Coastguard Worker
2219*61046927SAndroid Build Coastguard Worker case BRW_SFID_URB: {
2220*61046927SAndroid Build Coastguard Worker if (devinfo->ver >= 20) {
2221*61046927SAndroid Build Coastguard Worker format(file, " (");
2222*61046927SAndroid Build Coastguard Worker const enum lsc_opcode op = lsc_msg_desc_opcode(devinfo, imm_desc);
2223*61046927SAndroid Build Coastguard Worker err |= control(file, "operation", lsc_operation,
2224*61046927SAndroid Build Coastguard Worker op, &space);
2225*61046927SAndroid Build Coastguard Worker format(file, ",");
2226*61046927SAndroid Build Coastguard Worker err |= control(file, "addr_size", lsc_addr_size,
2227*61046927SAndroid Build Coastguard Worker lsc_msg_desc_addr_size(devinfo, imm_desc),
2228*61046927SAndroid Build Coastguard Worker &space);
2229*61046927SAndroid Build Coastguard Worker
2230*61046927SAndroid Build Coastguard Worker format(file, ",");
2231*61046927SAndroid Build Coastguard Worker err |= control(file, "data_size", lsc_data_size,
2232*61046927SAndroid Build Coastguard Worker lsc_msg_desc_data_size(devinfo, imm_desc),
2233*61046927SAndroid Build Coastguard Worker &space);
2234*61046927SAndroid Build Coastguard Worker format(file, ",");
2235*61046927SAndroid Build Coastguard Worker if (lsc_opcode_has_cmask(op)) {
2236*61046927SAndroid Build Coastguard Worker err |= control(file, "component_mask",
2237*61046927SAndroid Build Coastguard Worker lsc_cmask_str,
2238*61046927SAndroid Build Coastguard Worker lsc_msg_desc_cmask(devinfo, imm_desc),
2239*61046927SAndroid Build Coastguard Worker &space);
2240*61046927SAndroid Build Coastguard Worker } else {
2241*61046927SAndroid Build Coastguard Worker err |= control(file, "vector_size",
2242*61046927SAndroid Build Coastguard Worker lsc_vect_size_str,
2243*61046927SAndroid Build Coastguard Worker lsc_msg_desc_vect_size(devinfo, imm_desc),
2244*61046927SAndroid Build Coastguard Worker &space);
2245*61046927SAndroid Build Coastguard Worker if (lsc_msg_desc_transpose(devinfo, imm_desc))
2246*61046927SAndroid Build Coastguard Worker format(file, ", transpose");
2247*61046927SAndroid Build Coastguard Worker }
2248*61046927SAndroid Build Coastguard Worker switch(op) {
2249*61046927SAndroid Build Coastguard Worker case LSC_OP_LOAD_CMASK:
2250*61046927SAndroid Build Coastguard Worker case LSC_OP_LOAD:
2251*61046927SAndroid Build Coastguard Worker format(file, ",");
2252*61046927SAndroid Build Coastguard Worker err |= control(file, "cache_load",
2253*61046927SAndroid Build Coastguard Worker devinfo->ver >= 20 ?
2254*61046927SAndroid Build Coastguard Worker xe2_lsc_cache_load :
2255*61046927SAndroid Build Coastguard Worker lsc_cache_load,
2256*61046927SAndroid Build Coastguard Worker lsc_msg_desc_cache_ctrl(devinfo, imm_desc),
2257*61046927SAndroid Build Coastguard Worker &space);
2258*61046927SAndroid Build Coastguard Worker break;
2259*61046927SAndroid Build Coastguard Worker default:
2260*61046927SAndroid Build Coastguard Worker format(file, ",");
2261*61046927SAndroid Build Coastguard Worker err |= control(file, "cache_store",
2262*61046927SAndroid Build Coastguard Worker devinfo->ver >= 20 ?
2263*61046927SAndroid Build Coastguard Worker xe2_lsc_cache_store :
2264*61046927SAndroid Build Coastguard Worker lsc_cache_store,
2265*61046927SAndroid Build Coastguard Worker lsc_msg_desc_cache_ctrl(devinfo, imm_desc),
2266*61046927SAndroid Build Coastguard Worker &space);
2267*61046927SAndroid Build Coastguard Worker break;
2268*61046927SAndroid Build Coastguard Worker }
2269*61046927SAndroid Build Coastguard Worker
2270*61046927SAndroid Build Coastguard Worker format(file, " dst_len = %u,",
2271*61046927SAndroid Build Coastguard Worker brw_message_desc_rlen(devinfo, imm_desc) / reg_unit(devinfo));
2272*61046927SAndroid Build Coastguard Worker format(file, " src0_len = %u,",
2273*61046927SAndroid Build Coastguard Worker brw_message_desc_mlen(devinfo, imm_desc) / reg_unit(devinfo));
2274*61046927SAndroid Build Coastguard Worker format(file, " src1_len = %d",
2275*61046927SAndroid Build Coastguard Worker brw_message_ex_desc_ex_mlen(devinfo, imm_ex_desc) / reg_unit(devinfo));
2276*61046927SAndroid Build Coastguard Worker err |= control(file, "address_type", lsc_addr_surface_type,
2277*61046927SAndroid Build Coastguard Worker lsc_msg_desc_addr_type(devinfo, imm_desc), &space);
2278*61046927SAndroid Build Coastguard Worker format(file, " )");
2279*61046927SAndroid Build Coastguard Worker } else {
2280*61046927SAndroid Build Coastguard Worker unsigned urb_opcode = brw_inst_urb_opcode(devinfo, inst);
2281*61046927SAndroid Build Coastguard Worker
2282*61046927SAndroid Build Coastguard Worker format(file, " offset %"PRIu64, brw_inst_urb_global_offset(devinfo, inst));
2283*61046927SAndroid Build Coastguard Worker
2284*61046927SAndroid Build Coastguard Worker space = 1;
2285*61046927SAndroid Build Coastguard Worker
2286*61046927SAndroid Build Coastguard Worker err |= control(file, "urb opcode",
2287*61046927SAndroid Build Coastguard Worker gfx7_urb_opcode, urb_opcode, &space);
2288*61046927SAndroid Build Coastguard Worker
2289*61046927SAndroid Build Coastguard Worker if (brw_inst_urb_per_slot_offset(devinfo, inst)) {
2290*61046927SAndroid Build Coastguard Worker string(file, " per-slot");
2291*61046927SAndroid Build Coastguard Worker }
2292*61046927SAndroid Build Coastguard Worker
2293*61046927SAndroid Build Coastguard Worker if (urb_opcode == GFX8_URB_OPCODE_SIMD8_WRITE ||
2294*61046927SAndroid Build Coastguard Worker urb_opcode == GFX8_URB_OPCODE_SIMD8_READ) {
2295*61046927SAndroid Build Coastguard Worker if (brw_inst_urb_channel_mask_present(devinfo, inst))
2296*61046927SAndroid Build Coastguard Worker string(file, " masked");
2297*61046927SAndroid Build Coastguard Worker } else if (urb_opcode != GFX125_URB_OPCODE_FENCE) {
2298*61046927SAndroid Build Coastguard Worker err |= control(file, "urb swizzle", urb_swizzle,
2299*61046927SAndroid Build Coastguard Worker brw_inst_urb_swizzle_control(devinfo, inst),
2300*61046927SAndroid Build Coastguard Worker &space);
2301*61046927SAndroid Build Coastguard Worker }
2302*61046927SAndroid Build Coastguard Worker }
2303*61046927SAndroid Build Coastguard Worker break;
2304*61046927SAndroid Build Coastguard Worker }
2305*61046927SAndroid Build Coastguard Worker case BRW_SFID_THREAD_SPAWNER:
2306*61046927SAndroid Build Coastguard Worker break;
2307*61046927SAndroid Build Coastguard Worker
2308*61046927SAndroid Build Coastguard Worker case BRW_SFID_MESSAGE_GATEWAY:
2309*61046927SAndroid Build Coastguard Worker format(file, " (%s)",
2310*61046927SAndroid Build Coastguard Worker gfx7_gateway_subfuncid[brw_inst_gateway_subfuncid(devinfo, inst)]);
2311*61046927SAndroid Build Coastguard Worker break;
2312*61046927SAndroid Build Coastguard Worker
2313*61046927SAndroid Build Coastguard Worker case GFX12_SFID_SLM:
2314*61046927SAndroid Build Coastguard Worker case GFX12_SFID_TGM:
2315*61046927SAndroid Build Coastguard Worker case GFX12_SFID_UGM: {
2316*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
2317*61046927SAndroid Build Coastguard Worker format(file, " (");
2318*61046927SAndroid Build Coastguard Worker const enum lsc_opcode op = lsc_msg_desc_opcode(devinfo, imm_desc);
2319*61046927SAndroid Build Coastguard Worker err |= control(file, "operation", lsc_operation,
2320*61046927SAndroid Build Coastguard Worker op, &space);
2321*61046927SAndroid Build Coastguard Worker format(file, ",");
2322*61046927SAndroid Build Coastguard Worker err |= control(file, "addr_size", lsc_addr_size,
2323*61046927SAndroid Build Coastguard Worker lsc_msg_desc_addr_size(devinfo, imm_desc),
2324*61046927SAndroid Build Coastguard Worker &space);
2325*61046927SAndroid Build Coastguard Worker
2326*61046927SAndroid Build Coastguard Worker if (op == LSC_OP_FENCE) {
2327*61046927SAndroid Build Coastguard Worker format(file, ",");
2328*61046927SAndroid Build Coastguard Worker err |= control(file, "scope", lsc_fence_scope,
2329*61046927SAndroid Build Coastguard Worker lsc_fence_msg_desc_scope(devinfo, imm_desc),
2330*61046927SAndroid Build Coastguard Worker &space);
2331*61046927SAndroid Build Coastguard Worker format(file, ",");
2332*61046927SAndroid Build Coastguard Worker err |= control(file, "flush_type", lsc_flush_type,
2333*61046927SAndroid Build Coastguard Worker lsc_fence_msg_desc_flush_type(devinfo, imm_desc),
2334*61046927SAndroid Build Coastguard Worker &space);
2335*61046927SAndroid Build Coastguard Worker format(file, ",");
2336*61046927SAndroid Build Coastguard Worker err |= control(file, "backup_mode_fence_routing",
2337*61046927SAndroid Build Coastguard Worker lsc_backup_fence_routing,
2338*61046927SAndroid Build Coastguard Worker lsc_fence_msg_desc_backup_routing(devinfo, imm_desc),
2339*61046927SAndroid Build Coastguard Worker &space);
2340*61046927SAndroid Build Coastguard Worker } else {
2341*61046927SAndroid Build Coastguard Worker format(file, ",");
2342*61046927SAndroid Build Coastguard Worker err |= control(file, "data_size", lsc_data_size,
2343*61046927SAndroid Build Coastguard Worker lsc_msg_desc_data_size(devinfo, imm_desc),
2344*61046927SAndroid Build Coastguard Worker &space);
2345*61046927SAndroid Build Coastguard Worker format(file, ",");
2346*61046927SAndroid Build Coastguard Worker if (lsc_opcode_has_cmask(op)) {
2347*61046927SAndroid Build Coastguard Worker err |= control(file, "component_mask",
2348*61046927SAndroid Build Coastguard Worker lsc_cmask_str,
2349*61046927SAndroid Build Coastguard Worker lsc_msg_desc_cmask(devinfo, imm_desc),
2350*61046927SAndroid Build Coastguard Worker &space);
2351*61046927SAndroid Build Coastguard Worker } else {
2352*61046927SAndroid Build Coastguard Worker err |= control(file, "vector_size",
2353*61046927SAndroid Build Coastguard Worker lsc_vect_size_str,
2354*61046927SAndroid Build Coastguard Worker lsc_msg_desc_vect_size(devinfo, imm_desc),
2355*61046927SAndroid Build Coastguard Worker &space);
2356*61046927SAndroid Build Coastguard Worker if (lsc_msg_desc_transpose(devinfo, imm_desc))
2357*61046927SAndroid Build Coastguard Worker format(file, ", transpose");
2358*61046927SAndroid Build Coastguard Worker }
2359*61046927SAndroid Build Coastguard Worker switch(op) {
2360*61046927SAndroid Build Coastguard Worker case LSC_OP_LOAD_CMASK:
2361*61046927SAndroid Build Coastguard Worker case LSC_OP_LOAD:
2362*61046927SAndroid Build Coastguard Worker format(file, ",");
2363*61046927SAndroid Build Coastguard Worker err |= control(file, "cache_load",
2364*61046927SAndroid Build Coastguard Worker devinfo->ver >= 20 ?
2365*61046927SAndroid Build Coastguard Worker xe2_lsc_cache_load :
2366*61046927SAndroid Build Coastguard Worker lsc_cache_load,
2367*61046927SAndroid Build Coastguard Worker lsc_msg_desc_cache_ctrl(devinfo, imm_desc),
2368*61046927SAndroid Build Coastguard Worker &space);
2369*61046927SAndroid Build Coastguard Worker break;
2370*61046927SAndroid Build Coastguard Worker default:
2371*61046927SAndroid Build Coastguard Worker format(file, ",");
2372*61046927SAndroid Build Coastguard Worker err |= control(file, "cache_store",
2373*61046927SAndroid Build Coastguard Worker devinfo->ver >= 20 ?
2374*61046927SAndroid Build Coastguard Worker xe2_lsc_cache_store :
2375*61046927SAndroid Build Coastguard Worker lsc_cache_store,
2376*61046927SAndroid Build Coastguard Worker lsc_msg_desc_cache_ctrl(devinfo, imm_desc),
2377*61046927SAndroid Build Coastguard Worker &space);
2378*61046927SAndroid Build Coastguard Worker break;
2379*61046927SAndroid Build Coastguard Worker }
2380*61046927SAndroid Build Coastguard Worker }
2381*61046927SAndroid Build Coastguard Worker format(file, " dst_len = %u,",
2382*61046927SAndroid Build Coastguard Worker brw_message_desc_rlen(devinfo, imm_desc) / reg_unit(devinfo));
2383*61046927SAndroid Build Coastguard Worker format(file, " src0_len = %u,",
2384*61046927SAndroid Build Coastguard Worker brw_message_desc_mlen(devinfo, imm_desc) / reg_unit(devinfo));
2385*61046927SAndroid Build Coastguard Worker
2386*61046927SAndroid Build Coastguard Worker if (!brw_inst_send_sel_reg32_ex_desc(devinfo, inst))
2387*61046927SAndroid Build Coastguard Worker format(file, " src1_len = %d",
2388*61046927SAndroid Build Coastguard Worker brw_message_ex_desc_ex_mlen(devinfo, imm_ex_desc) / reg_unit(devinfo));
2389*61046927SAndroid Build Coastguard Worker
2390*61046927SAndroid Build Coastguard Worker err |= control(file, "address_type", lsc_addr_surface_type,
2391*61046927SAndroid Build Coastguard Worker lsc_msg_desc_addr_type(devinfo, imm_desc), &space);
2392*61046927SAndroid Build Coastguard Worker format(file, " )");
2393*61046927SAndroid Build Coastguard Worker break;
2394*61046927SAndroid Build Coastguard Worker }
2395*61046927SAndroid Build Coastguard Worker
2396*61046927SAndroid Build Coastguard Worker case GFX7_SFID_DATAPORT_DATA_CACHE:
2397*61046927SAndroid Build Coastguard Worker format(file, " (");
2398*61046927SAndroid Build Coastguard Worker space = 0;
2399*61046927SAndroid Build Coastguard Worker
2400*61046927SAndroid Build Coastguard Worker err |= control(file, "DP DC0 message type",
2401*61046927SAndroid Build Coastguard Worker dp_dc0_msg_type_gfx7,
2402*61046927SAndroid Build Coastguard Worker brw_dp_desc_msg_type(devinfo, imm_desc), &space);
2403*61046927SAndroid Build Coastguard Worker
2404*61046927SAndroid Build Coastguard Worker format(file, ", bti %u, ",
2405*61046927SAndroid Build Coastguard Worker brw_dp_desc_binding_table_index(devinfo, imm_desc));
2406*61046927SAndroid Build Coastguard Worker
2407*61046927SAndroid Build Coastguard Worker switch (brw_inst_dp_msg_type(devinfo, inst)) {
2408*61046927SAndroid Build Coastguard Worker case GFX7_DATAPORT_DC_UNTYPED_ATOMIC_OP:
2409*61046927SAndroid Build Coastguard Worker control(file, "atomic op", aop,
2410*61046927SAndroid Build Coastguard Worker brw_dp_desc_msg_control(devinfo, imm_desc) & 0xf,
2411*61046927SAndroid Build Coastguard Worker &space);
2412*61046927SAndroid Build Coastguard Worker break;
2413*61046927SAndroid Build Coastguard Worker case GFX7_DATAPORT_DC_OWORD_BLOCK_READ:
2414*61046927SAndroid Build Coastguard Worker case GFX7_DATAPORT_DC_OWORD_BLOCK_WRITE: {
2415*61046927SAndroid Build Coastguard Worker unsigned msg_ctrl = brw_dp_desc_msg_control(devinfo, imm_desc);
2416*61046927SAndroid Build Coastguard Worker assert(dp_oword_block_rw[msg_ctrl & 7]);
2417*61046927SAndroid Build Coastguard Worker format(file, "owords = %s, aligned = %d",
2418*61046927SAndroid Build Coastguard Worker dp_oword_block_rw[msg_ctrl & 7], (msg_ctrl >> 3) & 3);
2419*61046927SAndroid Build Coastguard Worker break;
2420*61046927SAndroid Build Coastguard Worker }
2421*61046927SAndroid Build Coastguard Worker default:
2422*61046927SAndroid Build Coastguard Worker format(file, "%u",
2423*61046927SAndroid Build Coastguard Worker brw_dp_desc_msg_control(devinfo, imm_desc));
2424*61046927SAndroid Build Coastguard Worker }
2425*61046927SAndroid Build Coastguard Worker format(file, ")");
2426*61046927SAndroid Build Coastguard Worker break;
2427*61046927SAndroid Build Coastguard Worker
2428*61046927SAndroid Build Coastguard Worker case HSW_SFID_DATAPORT_DATA_CACHE_1: {
2429*61046927SAndroid Build Coastguard Worker format(file, " (");
2430*61046927SAndroid Build Coastguard Worker space = 0;
2431*61046927SAndroid Build Coastguard Worker
2432*61046927SAndroid Build Coastguard Worker unsigned msg_ctrl = brw_dp_desc_msg_control(devinfo, imm_desc);
2433*61046927SAndroid Build Coastguard Worker
2434*61046927SAndroid Build Coastguard Worker err |= control(file, "DP DC1 message type",
2435*61046927SAndroid Build Coastguard Worker dp_dc1_msg_type_hsw,
2436*61046927SAndroid Build Coastguard Worker brw_dp_desc_msg_type(devinfo, imm_desc), &space);
2437*61046927SAndroid Build Coastguard Worker
2438*61046927SAndroid Build Coastguard Worker format(file, ", Surface = %u, ",
2439*61046927SAndroid Build Coastguard Worker brw_dp_desc_binding_table_index(devinfo, imm_desc));
2440*61046927SAndroid Build Coastguard Worker
2441*61046927SAndroid Build Coastguard Worker switch (brw_inst_dp_msg_type(devinfo, inst)) {
2442*61046927SAndroid Build Coastguard Worker case HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP:
2443*61046927SAndroid Build Coastguard Worker case HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP:
2444*61046927SAndroid Build Coastguard Worker case HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP:
2445*61046927SAndroid Build Coastguard Worker format(file, "SIMD%d,", (msg_ctrl & (1 << 4)) ? 8 : 16);
2446*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2447*61046927SAndroid Build Coastguard Worker case HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP_SIMD4X2:
2448*61046927SAndroid Build Coastguard Worker case HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP_SIMD4X2:
2449*61046927SAndroid Build Coastguard Worker case HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP_SIMD4X2:
2450*61046927SAndroid Build Coastguard Worker case GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_OP:
2451*61046927SAndroid Build Coastguard Worker case GFX12_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_HALF_INT_OP:
2452*61046927SAndroid Build Coastguard Worker control(file, "atomic op", aop, msg_ctrl & 0xf, &space);
2453*61046927SAndroid Build Coastguard Worker break;
2454*61046927SAndroid Build Coastguard Worker case HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_READ:
2455*61046927SAndroid Build Coastguard Worker case HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_WRITE:
2456*61046927SAndroid Build Coastguard Worker case HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_READ:
2457*61046927SAndroid Build Coastguard Worker case HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_WRITE:
2458*61046927SAndroid Build Coastguard Worker case GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_WRITE:
2459*61046927SAndroid Build Coastguard Worker case GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_READ: {
2460*61046927SAndroid Build Coastguard Worker static const char *simd_modes[] = { "4x2", "16", "8" };
2461*61046927SAndroid Build Coastguard Worker format(file, "SIMD%s, Mask = 0x%x",
2462*61046927SAndroid Build Coastguard Worker simd_modes[msg_ctrl >> 4], msg_ctrl & 0xf);
2463*61046927SAndroid Build Coastguard Worker break;
2464*61046927SAndroid Build Coastguard Worker }
2465*61046927SAndroid Build Coastguard Worker case GFX9_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_FLOAT_OP:
2466*61046927SAndroid Build Coastguard Worker case GFX9_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_FLOAT_OP:
2467*61046927SAndroid Build Coastguard Worker case GFX12_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_HALF_FLOAT_OP:
2468*61046927SAndroid Build Coastguard Worker format(file, "SIMD%d,", (msg_ctrl & (1 << 4)) ? 8 : 16);
2469*61046927SAndroid Build Coastguard Worker control(file, "atomic float op", aop_float, msg_ctrl & 0xf,
2470*61046927SAndroid Build Coastguard Worker &space);
2471*61046927SAndroid Build Coastguard Worker break;
2472*61046927SAndroid Build Coastguard Worker case GFX9_DATAPORT_DC_PORT1_A64_OWORD_BLOCK_WRITE:
2473*61046927SAndroid Build Coastguard Worker case GFX9_DATAPORT_DC_PORT1_A64_OWORD_BLOCK_READ:
2474*61046927SAndroid Build Coastguard Worker assert(dp_oword_block_rw[msg_ctrl & 7]);
2475*61046927SAndroid Build Coastguard Worker format(file, "owords = %s, aligned = %d",
2476*61046927SAndroid Build Coastguard Worker dp_oword_block_rw[msg_ctrl & 7], (msg_ctrl >> 3) & 3);
2477*61046927SAndroid Build Coastguard Worker break;
2478*61046927SAndroid Build Coastguard Worker default:
2479*61046927SAndroid Build Coastguard Worker format(file, "0x%x", msg_ctrl);
2480*61046927SAndroid Build Coastguard Worker }
2481*61046927SAndroid Build Coastguard Worker format(file, ")");
2482*61046927SAndroid Build Coastguard Worker break;
2483*61046927SAndroid Build Coastguard Worker }
2484*61046927SAndroid Build Coastguard Worker
2485*61046927SAndroid Build Coastguard Worker case GFX7_SFID_PIXEL_INTERPOLATOR:
2486*61046927SAndroid Build Coastguard Worker format(file, " (%s, %s, 0x%02"PRIx64")",
2487*61046927SAndroid Build Coastguard Worker brw_inst_pi_nopersp(devinfo, inst) ? "linear" : "persp",
2488*61046927SAndroid Build Coastguard Worker pixel_interpolator_msg_types[brw_inst_pi_message_type(devinfo, inst)],
2489*61046927SAndroid Build Coastguard Worker brw_inst_pi_message_data(devinfo, inst));
2490*61046927SAndroid Build Coastguard Worker break;
2491*61046927SAndroid Build Coastguard Worker
2492*61046927SAndroid Build Coastguard Worker case GEN_RT_SFID_RAY_TRACE_ACCELERATOR:
2493*61046927SAndroid Build Coastguard Worker if (devinfo->has_ray_tracing) {
2494*61046927SAndroid Build Coastguard Worker format(file, " SIMD%d,",
2495*61046927SAndroid Build Coastguard Worker brw_rt_trace_ray_desc_exec_size(devinfo, imm_desc));
2496*61046927SAndroid Build Coastguard Worker } else {
2497*61046927SAndroid Build Coastguard Worker unsupported = true;
2498*61046927SAndroid Build Coastguard Worker }
2499*61046927SAndroid Build Coastguard Worker break;
2500*61046927SAndroid Build Coastguard Worker
2501*61046927SAndroid Build Coastguard Worker default:
2502*61046927SAndroid Build Coastguard Worker unsupported = true;
2503*61046927SAndroid Build Coastguard Worker break;
2504*61046927SAndroid Build Coastguard Worker }
2505*61046927SAndroid Build Coastguard Worker
2506*61046927SAndroid Build Coastguard Worker if (unsupported)
2507*61046927SAndroid Build Coastguard Worker format(file, "unsupported shared function ID %d", sfid);
2508*61046927SAndroid Build Coastguard Worker
2509*61046927SAndroid Build Coastguard Worker if (space)
2510*61046927SAndroid Build Coastguard Worker string(file, " ");
2511*61046927SAndroid Build Coastguard Worker }
2512*61046927SAndroid Build Coastguard Worker if (devinfo->verx10 >= 125 &&
2513*61046927SAndroid Build Coastguard Worker brw_inst_send_sel_reg32_ex_desc(devinfo, inst) &&
2514*61046927SAndroid Build Coastguard Worker brw_inst_send_ex_bso(devinfo, inst)) {
2515*61046927SAndroid Build Coastguard Worker format(file, " src1_len = %u",
2516*61046927SAndroid Build Coastguard Worker (unsigned) brw_inst_send_src1_len(devinfo, inst));
2517*61046927SAndroid Build Coastguard Worker
2518*61046927SAndroid Build Coastguard Worker format(file, " ex_bso");
2519*61046927SAndroid Build Coastguard Worker }
2520*61046927SAndroid Build Coastguard Worker if (brw_sfid_is_lsc(sfid) ||
2521*61046927SAndroid Build Coastguard Worker (sfid == BRW_SFID_URB && devinfo->ver >= 20)) {
2522*61046927SAndroid Build Coastguard Worker lsc_disassemble_ex_desc(devinfo, imm_desc, imm_ex_desc, file);
2523*61046927SAndroid Build Coastguard Worker } else {
2524*61046927SAndroid Build Coastguard Worker if (has_imm_desc)
2525*61046927SAndroid Build Coastguard Worker format(file, " mlen %u", brw_message_desc_mlen(devinfo, imm_desc) / reg_unit(devinfo));
2526*61046927SAndroid Build Coastguard Worker if (has_imm_ex_desc) {
2527*61046927SAndroid Build Coastguard Worker format(file, " ex_mlen %u",
2528*61046927SAndroid Build Coastguard Worker brw_message_ex_desc_ex_mlen(devinfo, imm_ex_desc) / reg_unit(devinfo));
2529*61046927SAndroid Build Coastguard Worker }
2530*61046927SAndroid Build Coastguard Worker if (has_imm_desc)
2531*61046927SAndroid Build Coastguard Worker format(file, " rlen %u", brw_message_desc_rlen(devinfo, imm_desc) / reg_unit(devinfo));
2532*61046927SAndroid Build Coastguard Worker }
2533*61046927SAndroid Build Coastguard Worker }
2534*61046927SAndroid Build Coastguard Worker pad(file, 64);
2535*61046927SAndroid Build Coastguard Worker if (opcode != BRW_OPCODE_NOP) {
2536*61046927SAndroid Build Coastguard Worker string(file, "{");
2537*61046927SAndroid Build Coastguard Worker space = 1;
2538*61046927SAndroid Build Coastguard Worker err |= control(file, "access mode", access_mode,
2539*61046927SAndroid Build Coastguard Worker brw_inst_access_mode(devinfo, inst), &space);
2540*61046927SAndroid Build Coastguard Worker err |= control(file, "write enable control", wectrl,
2541*61046927SAndroid Build Coastguard Worker brw_inst_mask_control(devinfo, inst), &space);
2542*61046927SAndroid Build Coastguard Worker
2543*61046927SAndroid Build Coastguard Worker if (devinfo->ver < 12) {
2544*61046927SAndroid Build Coastguard Worker err |= control(file, "dependency control", dep_ctrl,
2545*61046927SAndroid Build Coastguard Worker ((brw_inst_no_dd_check(devinfo, inst) << 1) |
2546*61046927SAndroid Build Coastguard Worker brw_inst_no_dd_clear(devinfo, inst)), &space);
2547*61046927SAndroid Build Coastguard Worker }
2548*61046927SAndroid Build Coastguard Worker
2549*61046927SAndroid Build Coastguard Worker err |= qtr_ctrl(file, devinfo, inst);
2550*61046927SAndroid Build Coastguard Worker
2551*61046927SAndroid Build Coastguard Worker if (devinfo->ver >= 12)
2552*61046927SAndroid Build Coastguard Worker err |= swsb(file, isa, inst);
2553*61046927SAndroid Build Coastguard Worker
2554*61046927SAndroid Build Coastguard Worker err |= control(file, "compaction", cmpt_ctrl, is_compacted, &space);
2555*61046927SAndroid Build Coastguard Worker err |= control(file, "thread control", thread_ctrl,
2556*61046927SAndroid Build Coastguard Worker (devinfo->ver >= 12 ? brw_inst_atomic_control(devinfo, inst) :
2557*61046927SAndroid Build Coastguard Worker brw_inst_thread_control(devinfo, inst)),
2558*61046927SAndroid Build Coastguard Worker &space);
2559*61046927SAndroid Build Coastguard Worker if (has_branch_ctrl(devinfo, opcode)) {
2560*61046927SAndroid Build Coastguard Worker err |= control(file, "branch ctrl", branch_ctrl,
2561*61046927SAndroid Build Coastguard Worker brw_inst_branch_control(devinfo, inst), &space);
2562*61046927SAndroid Build Coastguard Worker } else if (devinfo->ver < 20) {
2563*61046927SAndroid Build Coastguard Worker err |= control(file, "acc write control", accwr,
2564*61046927SAndroid Build Coastguard Worker brw_inst_acc_wr_control(devinfo, inst), &space);
2565*61046927SAndroid Build Coastguard Worker }
2566*61046927SAndroid Build Coastguard Worker if (is_send(opcode))
2567*61046927SAndroid Build Coastguard Worker err |= control(file, "end of thread", end_of_thread,
2568*61046927SAndroid Build Coastguard Worker brw_inst_eot(devinfo, inst), &space);
2569*61046927SAndroid Build Coastguard Worker if (space)
2570*61046927SAndroid Build Coastguard Worker string(file, " ");
2571*61046927SAndroid Build Coastguard Worker string(file, "}");
2572*61046927SAndroid Build Coastguard Worker }
2573*61046927SAndroid Build Coastguard Worker string(file, ";");
2574*61046927SAndroid Build Coastguard Worker newline(file);
2575*61046927SAndroid Build Coastguard Worker return err;
2576*61046927SAndroid Build Coastguard Worker }
2577*61046927SAndroid Build Coastguard Worker
2578*61046927SAndroid Build Coastguard Worker int
brw_disassemble_find_end(const struct brw_isa_info * isa,const void * assembly,int start)2579*61046927SAndroid Build Coastguard Worker brw_disassemble_find_end(const struct brw_isa_info *isa,
2580*61046927SAndroid Build Coastguard Worker const void *assembly, int start)
2581*61046927SAndroid Build Coastguard Worker {
2582*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo = isa->devinfo;
2583*61046927SAndroid Build Coastguard Worker int offset = start;
2584*61046927SAndroid Build Coastguard Worker
2585*61046927SAndroid Build Coastguard Worker /* This loop exits when send-with-EOT or when opcode is 0 */
2586*61046927SAndroid Build Coastguard Worker while (true) {
2587*61046927SAndroid Build Coastguard Worker const brw_inst *insn = assembly + offset;
2588*61046927SAndroid Build Coastguard Worker
2589*61046927SAndroid Build Coastguard Worker if (brw_inst_cmpt_control(devinfo, insn)) {
2590*61046927SAndroid Build Coastguard Worker offset += 8;
2591*61046927SAndroid Build Coastguard Worker } else {
2592*61046927SAndroid Build Coastguard Worker offset += 16;
2593*61046927SAndroid Build Coastguard Worker }
2594*61046927SAndroid Build Coastguard Worker
2595*61046927SAndroid Build Coastguard Worker /* Simplistic, but efficient way to terminate disasm */
2596*61046927SAndroid Build Coastguard Worker uint32_t opcode = brw_inst_opcode(isa, insn);
2597*61046927SAndroid Build Coastguard Worker if (opcode == 0 || (is_send(opcode) && brw_inst_eot(devinfo, insn))) {
2598*61046927SAndroid Build Coastguard Worker break;
2599*61046927SAndroid Build Coastguard Worker }
2600*61046927SAndroid Build Coastguard Worker }
2601*61046927SAndroid Build Coastguard Worker
2602*61046927SAndroid Build Coastguard Worker return offset;
2603*61046927SAndroid Build Coastguard Worker }
2604*61046927SAndroid Build Coastguard Worker
2605*61046927SAndroid Build Coastguard Worker void
brw_disassemble_with_errors(const struct brw_isa_info * isa,const void * assembly,int start,FILE * out)2606*61046927SAndroid Build Coastguard Worker brw_disassemble_with_errors(const struct brw_isa_info *isa,
2607*61046927SAndroid Build Coastguard Worker const void *assembly, int start, FILE *out)
2608*61046927SAndroid Build Coastguard Worker {
2609*61046927SAndroid Build Coastguard Worker int end = brw_disassemble_find_end(isa, assembly, start);
2610*61046927SAndroid Build Coastguard Worker
2611*61046927SAndroid Build Coastguard Worker /* Make a dummy disasm structure that brw_validate_instructions
2612*61046927SAndroid Build Coastguard Worker * can work from.
2613*61046927SAndroid Build Coastguard Worker */
2614*61046927SAndroid Build Coastguard Worker struct disasm_info *disasm_info = disasm_initialize(isa, NULL);
2615*61046927SAndroid Build Coastguard Worker disasm_new_inst_group(disasm_info, start);
2616*61046927SAndroid Build Coastguard Worker disasm_new_inst_group(disasm_info, end);
2617*61046927SAndroid Build Coastguard Worker
2618*61046927SAndroid Build Coastguard Worker brw_validate_instructions(isa, assembly, start, end, disasm_info);
2619*61046927SAndroid Build Coastguard Worker
2620*61046927SAndroid Build Coastguard Worker void *mem_ctx = ralloc_context(NULL);
2621*61046927SAndroid Build Coastguard Worker const struct brw_label *root_label =
2622*61046927SAndroid Build Coastguard Worker brw_label_assembly(isa, assembly, start, end, mem_ctx);
2623*61046927SAndroid Build Coastguard Worker
2624*61046927SAndroid Build Coastguard Worker foreach_list_typed(struct inst_group, group, link,
2625*61046927SAndroid Build Coastguard Worker &disasm_info->group_list) {
2626*61046927SAndroid Build Coastguard Worker struct exec_node *next_node = exec_node_get_next(&group->link);
2627*61046927SAndroid Build Coastguard Worker if (exec_node_is_tail_sentinel(next_node))
2628*61046927SAndroid Build Coastguard Worker break;
2629*61046927SAndroid Build Coastguard Worker
2630*61046927SAndroid Build Coastguard Worker struct inst_group *next =
2631*61046927SAndroid Build Coastguard Worker exec_node_data(struct inst_group, next_node, link);
2632*61046927SAndroid Build Coastguard Worker
2633*61046927SAndroid Build Coastguard Worker int start_offset = group->offset;
2634*61046927SAndroid Build Coastguard Worker int end_offset = next->offset;
2635*61046927SAndroid Build Coastguard Worker
2636*61046927SAndroid Build Coastguard Worker brw_disassemble(isa, assembly, start_offset, end_offset,
2637*61046927SAndroid Build Coastguard Worker root_label, out);
2638*61046927SAndroid Build Coastguard Worker
2639*61046927SAndroid Build Coastguard Worker if (group->error) {
2640*61046927SAndroid Build Coastguard Worker fputs(group->error, out);
2641*61046927SAndroid Build Coastguard Worker }
2642*61046927SAndroid Build Coastguard Worker }
2643*61046927SAndroid Build Coastguard Worker
2644*61046927SAndroid Build Coastguard Worker ralloc_free(mem_ctx);
2645*61046927SAndroid Build Coastguard Worker ralloc_free(disasm_info);
2646*61046927SAndroid Build Coastguard Worker }
2647