xref: /aosp_15_r20/external/mesa3d/src/intel/compiler/brw_eu.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  Copyright (C) Intel Corp.  2006.  All Rights Reserved.
3*61046927SAndroid Build Coastguard Worker  Intel funded Tungsten Graphics to
4*61046927SAndroid Build Coastguard Worker  develop this 3D driver.
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker  Permission is hereby granted, free of charge, to any person obtaining
7*61046927SAndroid Build Coastguard Worker  a copy of this software and associated documentation files (the
8*61046927SAndroid Build Coastguard Worker  "Software"), to deal in the Software without restriction, including
9*61046927SAndroid Build Coastguard Worker  without limitation the rights to use, copy, modify, merge, publish,
10*61046927SAndroid Build Coastguard Worker  distribute, sublicense, and/or sell copies of the Software, and to
11*61046927SAndroid Build Coastguard Worker  permit persons to whom the Software is furnished to do so, subject to
12*61046927SAndroid Build Coastguard Worker  the following conditions:
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker  The above copyright notice and this permission notice (including the
15*61046927SAndroid Build Coastguard Worker  next paragraph) shall be included in all copies or substantial
16*61046927SAndroid Build Coastguard Worker  portions of the Software.
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19*61046927SAndroid Build Coastguard Worker  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*61046927SAndroid Build Coastguard Worker  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21*61046927SAndroid Build Coastguard Worker  IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22*61046927SAndroid Build Coastguard Worker  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23*61046927SAndroid Build Coastguard Worker  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24*61046927SAndroid Build Coastguard Worker  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker  **********************************************************************/
27*61046927SAndroid Build Coastguard Worker  /*
28*61046927SAndroid Build Coastguard Worker   * Authors:
29*61046927SAndroid Build Coastguard Worker   *   Keith Whitwell <[email protected]>
30*61046927SAndroid Build Coastguard Worker   */
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker #include <sys/stat.h>
33*61046927SAndroid Build Coastguard Worker #include <fcntl.h>
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker #include "brw_disasm.h"
36*61046927SAndroid Build Coastguard Worker #include "brw_eu_defines.h"
37*61046927SAndroid Build Coastguard Worker #include "brw_eu.h"
38*61046927SAndroid Build Coastguard Worker #include "brw_private.h"
39*61046927SAndroid Build Coastguard Worker #include "intel_gfx_ver_enum.h"
40*61046927SAndroid Build Coastguard Worker #include "dev/intel_debug.h"
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker #include "util/u_debug.h"
43*61046927SAndroid Build Coastguard Worker #include "util/ralloc.h"
44*61046927SAndroid Build Coastguard Worker 
45*61046927SAndroid Build Coastguard Worker /* Returns a conditional modifier that negates the condition. */
46*61046927SAndroid Build Coastguard Worker enum brw_conditional_mod
brw_negate_cmod(enum brw_conditional_mod cmod)47*61046927SAndroid Build Coastguard Worker brw_negate_cmod(enum brw_conditional_mod cmod)
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker    switch (cmod) {
50*61046927SAndroid Build Coastguard Worker    case BRW_CONDITIONAL_Z:
51*61046927SAndroid Build Coastguard Worker       return BRW_CONDITIONAL_NZ;
52*61046927SAndroid Build Coastguard Worker    case BRW_CONDITIONAL_NZ:
53*61046927SAndroid Build Coastguard Worker       return BRW_CONDITIONAL_Z;
54*61046927SAndroid Build Coastguard Worker    case BRW_CONDITIONAL_G:
55*61046927SAndroid Build Coastguard Worker       return BRW_CONDITIONAL_LE;
56*61046927SAndroid Build Coastguard Worker    case BRW_CONDITIONAL_GE:
57*61046927SAndroid Build Coastguard Worker       return BRW_CONDITIONAL_L;
58*61046927SAndroid Build Coastguard Worker    case BRW_CONDITIONAL_L:
59*61046927SAndroid Build Coastguard Worker       return BRW_CONDITIONAL_GE;
60*61046927SAndroid Build Coastguard Worker    case BRW_CONDITIONAL_LE:
61*61046927SAndroid Build Coastguard Worker       return BRW_CONDITIONAL_G;
62*61046927SAndroid Build Coastguard Worker    default:
63*61046927SAndroid Build Coastguard Worker       unreachable("Can't negate this cmod");
64*61046927SAndroid Build Coastguard Worker    }
65*61046927SAndroid Build Coastguard Worker }
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker /* Returns the corresponding conditional mod for swapping src0 and
68*61046927SAndroid Build Coastguard Worker  * src1 in e.g. CMP.
69*61046927SAndroid Build Coastguard Worker  */
70*61046927SAndroid Build Coastguard Worker enum brw_conditional_mod
brw_swap_cmod(enum brw_conditional_mod cmod)71*61046927SAndroid Build Coastguard Worker brw_swap_cmod(enum brw_conditional_mod cmod)
72*61046927SAndroid Build Coastguard Worker {
73*61046927SAndroid Build Coastguard Worker    switch (cmod) {
74*61046927SAndroid Build Coastguard Worker    case BRW_CONDITIONAL_Z:
75*61046927SAndroid Build Coastguard Worker    case BRW_CONDITIONAL_NZ:
76*61046927SAndroid Build Coastguard Worker       return cmod;
77*61046927SAndroid Build Coastguard Worker    case BRW_CONDITIONAL_G:
78*61046927SAndroid Build Coastguard Worker       return BRW_CONDITIONAL_L;
79*61046927SAndroid Build Coastguard Worker    case BRW_CONDITIONAL_GE:
80*61046927SAndroid Build Coastguard Worker       return BRW_CONDITIONAL_LE;
81*61046927SAndroid Build Coastguard Worker    case BRW_CONDITIONAL_L:
82*61046927SAndroid Build Coastguard Worker       return BRW_CONDITIONAL_G;
83*61046927SAndroid Build Coastguard Worker    case BRW_CONDITIONAL_LE:
84*61046927SAndroid Build Coastguard Worker       return BRW_CONDITIONAL_GE;
85*61046927SAndroid Build Coastguard Worker    default:
86*61046927SAndroid Build Coastguard Worker       return BRW_CONDITIONAL_NONE;
87*61046927SAndroid Build Coastguard Worker    }
88*61046927SAndroid Build Coastguard Worker }
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker /**
91*61046927SAndroid Build Coastguard Worker  * Get the least significant bit offset of the i+1-th component of immediate
92*61046927SAndroid Build Coastguard Worker  * type \p type.  For \p i equal to the two's complement of j, return the
93*61046927SAndroid Build Coastguard Worker  * offset of the j-th component starting from the end of the vector.  For
94*61046927SAndroid Build Coastguard Worker  * scalar register types return zero.
95*61046927SAndroid Build Coastguard Worker  */
96*61046927SAndroid Build Coastguard Worker static unsigned
imm_shift(enum brw_reg_type type,unsigned i)97*61046927SAndroid Build Coastguard Worker imm_shift(enum brw_reg_type type, unsigned i)
98*61046927SAndroid Build Coastguard Worker {
99*61046927SAndroid Build Coastguard Worker    assert(type != BRW_TYPE_UV && type != BRW_TYPE_V &&
100*61046927SAndroid Build Coastguard Worker           "Not implemented.");
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker    if (type == BRW_TYPE_VF)
103*61046927SAndroid Build Coastguard Worker       return 8 * (i & 3);
104*61046927SAndroid Build Coastguard Worker    else
105*61046927SAndroid Build Coastguard Worker       return 0;
106*61046927SAndroid Build Coastguard Worker }
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker /**
109*61046927SAndroid Build Coastguard Worker  * Swizzle an arbitrary immediate \p x of the given type according to the
110*61046927SAndroid Build Coastguard Worker  * permutation specified as \p swz.
111*61046927SAndroid Build Coastguard Worker  */
112*61046927SAndroid Build Coastguard Worker uint32_t
brw_swizzle_immediate(enum brw_reg_type type,uint32_t x,unsigned swz)113*61046927SAndroid Build Coastguard Worker brw_swizzle_immediate(enum brw_reg_type type, uint32_t x, unsigned swz)
114*61046927SAndroid Build Coastguard Worker {
115*61046927SAndroid Build Coastguard Worker    if (imm_shift(type, 1)) {
116*61046927SAndroid Build Coastguard Worker       const unsigned n = 32 / imm_shift(type, 1);
117*61046927SAndroid Build Coastguard Worker       uint32_t y = 0;
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < n; i++) {
120*61046927SAndroid Build Coastguard Worker          /* Shift the specified component all the way to the right and left to
121*61046927SAndroid Build Coastguard Worker           * discard any undesired L/MSBs, then shift it right into component i.
122*61046927SAndroid Build Coastguard Worker           */
123*61046927SAndroid Build Coastguard Worker          y |= x >> imm_shift(type, (i & ~3) + BRW_GET_SWZ(swz, i & 3))
124*61046927SAndroid Build Coastguard Worker                 << imm_shift(type, ~0u)
125*61046927SAndroid Build Coastguard Worker                 >> imm_shift(type, ~0u - i);
126*61046927SAndroid Build Coastguard Worker       }
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker       return y;
129*61046927SAndroid Build Coastguard Worker    } else {
130*61046927SAndroid Build Coastguard Worker       return x;
131*61046927SAndroid Build Coastguard Worker    }
132*61046927SAndroid Build Coastguard Worker }
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker unsigned
brw_get_default_exec_size(struct brw_codegen * p)135*61046927SAndroid Build Coastguard Worker brw_get_default_exec_size(struct brw_codegen *p)
136*61046927SAndroid Build Coastguard Worker {
137*61046927SAndroid Build Coastguard Worker    return p->current->exec_size;
138*61046927SAndroid Build Coastguard Worker }
139*61046927SAndroid Build Coastguard Worker 
140*61046927SAndroid Build Coastguard Worker unsigned
brw_get_default_group(struct brw_codegen * p)141*61046927SAndroid Build Coastguard Worker brw_get_default_group(struct brw_codegen *p)
142*61046927SAndroid Build Coastguard Worker {
143*61046927SAndroid Build Coastguard Worker    return p->current->group;
144*61046927SAndroid Build Coastguard Worker }
145*61046927SAndroid Build Coastguard Worker 
146*61046927SAndroid Build Coastguard Worker unsigned
brw_get_default_access_mode(struct brw_codegen * p)147*61046927SAndroid Build Coastguard Worker brw_get_default_access_mode(struct brw_codegen *p)
148*61046927SAndroid Build Coastguard Worker {
149*61046927SAndroid Build Coastguard Worker    return p->current->access_mode;
150*61046927SAndroid Build Coastguard Worker }
151*61046927SAndroid Build Coastguard Worker 
152*61046927SAndroid Build Coastguard Worker struct tgl_swsb
brw_get_default_swsb(struct brw_codegen * p)153*61046927SAndroid Build Coastguard Worker brw_get_default_swsb(struct brw_codegen *p)
154*61046927SAndroid Build Coastguard Worker {
155*61046927SAndroid Build Coastguard Worker    return p->current->swsb;
156*61046927SAndroid Build Coastguard Worker }
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker void
brw_set_default_exec_size(struct brw_codegen * p,unsigned value)159*61046927SAndroid Build Coastguard Worker brw_set_default_exec_size(struct brw_codegen *p, unsigned value)
160*61046927SAndroid Build Coastguard Worker {
161*61046927SAndroid Build Coastguard Worker    p->current->exec_size = value;
162*61046927SAndroid Build Coastguard Worker }
163*61046927SAndroid Build Coastguard Worker 
brw_set_default_predicate_control(struct brw_codegen * p,enum brw_predicate pc)164*61046927SAndroid Build Coastguard Worker void brw_set_default_predicate_control(struct brw_codegen *p, enum brw_predicate pc)
165*61046927SAndroid Build Coastguard Worker {
166*61046927SAndroid Build Coastguard Worker    p->current->predicate = pc;
167*61046927SAndroid Build Coastguard Worker }
168*61046927SAndroid Build Coastguard Worker 
brw_set_default_predicate_inverse(struct brw_codegen * p,bool predicate_inverse)169*61046927SAndroid Build Coastguard Worker void brw_set_default_predicate_inverse(struct brw_codegen *p, bool predicate_inverse)
170*61046927SAndroid Build Coastguard Worker {
171*61046927SAndroid Build Coastguard Worker    p->current->pred_inv = predicate_inverse;
172*61046927SAndroid Build Coastguard Worker }
173*61046927SAndroid Build Coastguard Worker 
brw_set_default_flag_reg(struct brw_codegen * p,int reg,int subreg)174*61046927SAndroid Build Coastguard Worker void brw_set_default_flag_reg(struct brw_codegen *p, int reg, int subreg)
175*61046927SAndroid Build Coastguard Worker {
176*61046927SAndroid Build Coastguard Worker    assert(subreg < 2);
177*61046927SAndroid Build Coastguard Worker    p->current->flag_subreg = reg * 2 + subreg;
178*61046927SAndroid Build Coastguard Worker }
179*61046927SAndroid Build Coastguard Worker 
brw_set_default_access_mode(struct brw_codegen * p,unsigned access_mode)180*61046927SAndroid Build Coastguard Worker void brw_set_default_access_mode( struct brw_codegen *p, unsigned access_mode )
181*61046927SAndroid Build Coastguard Worker {
182*61046927SAndroid Build Coastguard Worker    p->current->access_mode = access_mode;
183*61046927SAndroid Build Coastguard Worker }
184*61046927SAndroid Build Coastguard Worker 
185*61046927SAndroid Build Coastguard Worker /**
186*61046927SAndroid Build Coastguard Worker  * Apply the range of channel enable signals given by
187*61046927SAndroid Build Coastguard Worker  * [group, group + exec_size) to the instruction passed as argument.
188*61046927SAndroid Build Coastguard Worker  */
189*61046927SAndroid Build Coastguard Worker void
brw_inst_set_group(const struct intel_device_info * devinfo,brw_inst * inst,unsigned group)190*61046927SAndroid Build Coastguard Worker brw_inst_set_group(const struct intel_device_info *devinfo,
191*61046927SAndroid Build Coastguard Worker                    brw_inst *inst, unsigned group)
192*61046927SAndroid Build Coastguard Worker {
193*61046927SAndroid Build Coastguard Worker    if (devinfo->ver >= 20) {
194*61046927SAndroid Build Coastguard Worker       assert(group % 8 == 0 && group < 32);
195*61046927SAndroid Build Coastguard Worker       brw_inst_set_qtr_control(devinfo, inst, group / 8);
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker    } else {
198*61046927SAndroid Build Coastguard Worker       assert(group % 4 == 0 && group < 32);
199*61046927SAndroid Build Coastguard Worker       brw_inst_set_qtr_control(devinfo, inst, group / 8);
200*61046927SAndroid Build Coastguard Worker       brw_inst_set_nib_control(devinfo, inst, (group / 4) % 2);
201*61046927SAndroid Build Coastguard Worker 
202*61046927SAndroid Build Coastguard Worker    }
203*61046927SAndroid Build Coastguard Worker }
204*61046927SAndroid Build Coastguard Worker 
205*61046927SAndroid Build Coastguard Worker void
brw_set_default_group(struct brw_codegen * p,unsigned group)206*61046927SAndroid Build Coastguard Worker brw_set_default_group(struct brw_codegen *p, unsigned group)
207*61046927SAndroid Build Coastguard Worker {
208*61046927SAndroid Build Coastguard Worker    p->current->group = group;
209*61046927SAndroid Build Coastguard Worker }
210*61046927SAndroid Build Coastguard Worker 
brw_set_default_mask_control(struct brw_codegen * p,unsigned value)211*61046927SAndroid Build Coastguard Worker void brw_set_default_mask_control( struct brw_codegen *p, unsigned value )
212*61046927SAndroid Build Coastguard Worker {
213*61046927SAndroid Build Coastguard Worker    p->current->mask_control = value;
214*61046927SAndroid Build Coastguard Worker }
215*61046927SAndroid Build Coastguard Worker 
brw_set_default_saturate(struct brw_codegen * p,bool enable)216*61046927SAndroid Build Coastguard Worker void brw_set_default_saturate( struct brw_codegen *p, bool enable )
217*61046927SAndroid Build Coastguard Worker {
218*61046927SAndroid Build Coastguard Worker    p->current->saturate = enable;
219*61046927SAndroid Build Coastguard Worker }
220*61046927SAndroid Build Coastguard Worker 
brw_set_default_acc_write_control(struct brw_codegen * p,unsigned value)221*61046927SAndroid Build Coastguard Worker void brw_set_default_acc_write_control(struct brw_codegen *p, unsigned value)
222*61046927SAndroid Build Coastguard Worker {
223*61046927SAndroid Build Coastguard Worker    p->current->acc_wr_control = value;
224*61046927SAndroid Build Coastguard Worker }
225*61046927SAndroid Build Coastguard Worker 
brw_set_default_swsb(struct brw_codegen * p,struct tgl_swsb value)226*61046927SAndroid Build Coastguard Worker void brw_set_default_swsb(struct brw_codegen *p, struct tgl_swsb value)
227*61046927SAndroid Build Coastguard Worker {
228*61046927SAndroid Build Coastguard Worker    p->current->swsb = value;
229*61046927SAndroid Build Coastguard Worker }
230*61046927SAndroid Build Coastguard Worker 
brw_push_insn_state(struct brw_codegen * p)231*61046927SAndroid Build Coastguard Worker void brw_push_insn_state( struct brw_codegen *p )
232*61046927SAndroid Build Coastguard Worker {
233*61046927SAndroid Build Coastguard Worker    assert(p->current != &p->stack[BRW_EU_MAX_INSN_STACK-1]);
234*61046927SAndroid Build Coastguard Worker    *(p->current + 1) = *p->current;
235*61046927SAndroid Build Coastguard Worker    p->current++;
236*61046927SAndroid Build Coastguard Worker }
237*61046927SAndroid Build Coastguard Worker 
brw_pop_insn_state(struct brw_codegen * p)238*61046927SAndroid Build Coastguard Worker void brw_pop_insn_state( struct brw_codegen *p )
239*61046927SAndroid Build Coastguard Worker {
240*61046927SAndroid Build Coastguard Worker    assert(p->current != p->stack);
241*61046927SAndroid Build Coastguard Worker    p->current--;
242*61046927SAndroid Build Coastguard Worker }
243*61046927SAndroid Build Coastguard Worker 
244*61046927SAndroid Build Coastguard Worker 
245*61046927SAndroid Build Coastguard Worker /***********************************************************************
246*61046927SAndroid Build Coastguard Worker  */
247*61046927SAndroid Build Coastguard Worker void
brw_init_codegen(const struct brw_isa_info * isa,struct brw_codegen * p,void * mem_ctx)248*61046927SAndroid Build Coastguard Worker brw_init_codegen(const struct brw_isa_info *isa,
249*61046927SAndroid Build Coastguard Worker                  struct brw_codegen *p, void *mem_ctx)
250*61046927SAndroid Build Coastguard Worker {
251*61046927SAndroid Build Coastguard Worker    memset(p, 0, sizeof(*p));
252*61046927SAndroid Build Coastguard Worker 
253*61046927SAndroid Build Coastguard Worker    p->isa = isa;
254*61046927SAndroid Build Coastguard Worker    p->devinfo = isa->devinfo;
255*61046927SAndroid Build Coastguard Worker    /*
256*61046927SAndroid Build Coastguard Worker     * Set the initial instruction store array size to 1024, if found that
257*61046927SAndroid Build Coastguard Worker     * isn't enough, then it will double the store size at brw_next_insn()
258*61046927SAndroid Build Coastguard Worker     * until out of memory.
259*61046927SAndroid Build Coastguard Worker     */
260*61046927SAndroid Build Coastguard Worker    p->store_size = 1024;
261*61046927SAndroid Build Coastguard Worker    p->store = rzalloc_array(mem_ctx, brw_inst, p->store_size);
262*61046927SAndroid Build Coastguard Worker    p->nr_insn = 0;
263*61046927SAndroid Build Coastguard Worker    p->current = p->stack;
264*61046927SAndroid Build Coastguard Worker    memset(p->current, 0, sizeof(p->current[0]));
265*61046927SAndroid Build Coastguard Worker 
266*61046927SAndroid Build Coastguard Worker    p->mem_ctx = mem_ctx;
267*61046927SAndroid Build Coastguard Worker 
268*61046927SAndroid Build Coastguard Worker    /* Some defaults?
269*61046927SAndroid Build Coastguard Worker     */
270*61046927SAndroid Build Coastguard Worker    brw_set_default_exec_size(p, BRW_EXECUTE_8);
271*61046927SAndroid Build Coastguard Worker    brw_set_default_mask_control(p, BRW_MASK_ENABLE); /* what does this do? */
272*61046927SAndroid Build Coastguard Worker    brw_set_default_saturate(p, 0);
273*61046927SAndroid Build Coastguard Worker 
274*61046927SAndroid Build Coastguard Worker    /* Set up control flow stack */
275*61046927SAndroid Build Coastguard Worker    p->if_stack_depth = 0;
276*61046927SAndroid Build Coastguard Worker    p->if_stack_array_size = 16;
277*61046927SAndroid Build Coastguard Worker    p->if_stack = rzalloc_array(mem_ctx, int, p->if_stack_array_size);
278*61046927SAndroid Build Coastguard Worker 
279*61046927SAndroid Build Coastguard Worker    p->loop_stack_depth = 0;
280*61046927SAndroid Build Coastguard Worker    p->loop_stack_array_size = 16;
281*61046927SAndroid Build Coastguard Worker    p->loop_stack = rzalloc_array(mem_ctx, int, p->loop_stack_array_size);
282*61046927SAndroid Build Coastguard Worker }
283*61046927SAndroid Build Coastguard Worker 
284*61046927SAndroid Build Coastguard Worker 
brw_get_program(struct brw_codegen * p,unsigned * sz)285*61046927SAndroid Build Coastguard Worker const unsigned *brw_get_program( struct brw_codegen *p,
286*61046927SAndroid Build Coastguard Worker 			       unsigned *sz )
287*61046927SAndroid Build Coastguard Worker {
288*61046927SAndroid Build Coastguard Worker    *sz = p->next_insn_offset;
289*61046927SAndroid Build Coastguard Worker    return (const unsigned *)p->store;
290*61046927SAndroid Build Coastguard Worker }
291*61046927SAndroid Build Coastguard Worker 
292*61046927SAndroid Build Coastguard Worker const struct brw_shader_reloc *
brw_get_shader_relocs(struct brw_codegen * p,unsigned * num_relocs)293*61046927SAndroid Build Coastguard Worker brw_get_shader_relocs(struct brw_codegen *p, unsigned *num_relocs)
294*61046927SAndroid Build Coastguard Worker {
295*61046927SAndroid Build Coastguard Worker    *num_relocs = p->num_relocs;
296*61046927SAndroid Build Coastguard Worker    return p->relocs;
297*61046927SAndroid Build Coastguard Worker }
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker DEBUG_GET_ONCE_OPTION(shader_bin_dump_path, "INTEL_SHADER_BIN_DUMP_PATH", NULL);
300*61046927SAndroid Build Coastguard Worker 
brw_should_dump_shader_bin(void)301*61046927SAndroid Build Coastguard Worker bool brw_should_dump_shader_bin(void)
302*61046927SAndroid Build Coastguard Worker {
303*61046927SAndroid Build Coastguard Worker    return debug_get_option_shader_bin_dump_path() != NULL;
304*61046927SAndroid Build Coastguard Worker }
305*61046927SAndroid Build Coastguard Worker 
brw_dump_shader_bin(void * assembly,int start_offset,int end_offset,const char * identifier)306*61046927SAndroid Build Coastguard Worker void brw_dump_shader_bin(void *assembly, int start_offset, int end_offset,
307*61046927SAndroid Build Coastguard Worker                          const char *identifier)
308*61046927SAndroid Build Coastguard Worker {
309*61046927SAndroid Build Coastguard Worker    char *name = ralloc_asprintf(NULL, "%s/%s.bin",
310*61046927SAndroid Build Coastguard Worker                                 debug_get_option_shader_bin_dump_path(),
311*61046927SAndroid Build Coastguard Worker                                 identifier);
312*61046927SAndroid Build Coastguard Worker 
313*61046927SAndroid Build Coastguard Worker    int fd = open(name, O_CREAT | O_WRONLY | O_TRUNC, 0644);
314*61046927SAndroid Build Coastguard Worker    ralloc_free(name);
315*61046927SAndroid Build Coastguard Worker 
316*61046927SAndroid Build Coastguard Worker    if (fd < 0)
317*61046927SAndroid Build Coastguard Worker       return;
318*61046927SAndroid Build Coastguard Worker 
319*61046927SAndroid Build Coastguard Worker    struct stat sb;
320*61046927SAndroid Build Coastguard Worker    if (fstat(fd, &sb) != 0 || (!S_ISREG(sb.st_mode))) {
321*61046927SAndroid Build Coastguard Worker       close(fd);
322*61046927SAndroid Build Coastguard Worker       return;
323*61046927SAndroid Build Coastguard Worker    }
324*61046927SAndroid Build Coastguard Worker 
325*61046927SAndroid Build Coastguard Worker    size_t to_write = end_offset - start_offset;
326*61046927SAndroid Build Coastguard Worker    void *write_ptr = assembly + start_offset;
327*61046927SAndroid Build Coastguard Worker 
328*61046927SAndroid Build Coastguard Worker    while (to_write) {
329*61046927SAndroid Build Coastguard Worker       ssize_t ret = write(fd, write_ptr, to_write);
330*61046927SAndroid Build Coastguard Worker 
331*61046927SAndroid Build Coastguard Worker       if (ret <= 0) {
332*61046927SAndroid Build Coastguard Worker          close(fd);
333*61046927SAndroid Build Coastguard Worker          return;
334*61046927SAndroid Build Coastguard Worker       }
335*61046927SAndroid Build Coastguard Worker 
336*61046927SAndroid Build Coastguard Worker       to_write -= ret;
337*61046927SAndroid Build Coastguard Worker       write_ptr += ret;
338*61046927SAndroid Build Coastguard Worker    }
339*61046927SAndroid Build Coastguard Worker 
340*61046927SAndroid Build Coastguard Worker    close(fd);
341*61046927SAndroid Build Coastguard Worker }
342*61046927SAndroid Build Coastguard Worker 
brw_try_override_assembly(struct brw_codegen * p,int start_offset,const char * identifier)343*61046927SAndroid Build Coastguard Worker bool brw_try_override_assembly(struct brw_codegen *p, int start_offset,
344*61046927SAndroid Build Coastguard Worker                                const char *identifier)
345*61046927SAndroid Build Coastguard Worker {
346*61046927SAndroid Build Coastguard Worker    const char *read_path = getenv("INTEL_SHADER_ASM_READ_PATH");
347*61046927SAndroid Build Coastguard Worker    if (!read_path) {
348*61046927SAndroid Build Coastguard Worker       return false;
349*61046927SAndroid Build Coastguard Worker    }
350*61046927SAndroid Build Coastguard Worker 
351*61046927SAndroid Build Coastguard Worker    char *name = ralloc_asprintf(NULL, "%s/%s.bin", read_path, identifier);
352*61046927SAndroid Build Coastguard Worker 
353*61046927SAndroid Build Coastguard Worker    int fd = open(name, O_RDONLY);
354*61046927SAndroid Build Coastguard Worker    ralloc_free(name);
355*61046927SAndroid Build Coastguard Worker 
356*61046927SAndroid Build Coastguard Worker    if (fd == -1) {
357*61046927SAndroid Build Coastguard Worker       return false;
358*61046927SAndroid Build Coastguard Worker    }
359*61046927SAndroid Build Coastguard Worker 
360*61046927SAndroid Build Coastguard Worker    struct stat sb;
361*61046927SAndroid Build Coastguard Worker    if (fstat(fd, &sb) != 0 || (!S_ISREG(sb.st_mode))) {
362*61046927SAndroid Build Coastguard Worker       close(fd);
363*61046927SAndroid Build Coastguard Worker       return false;
364*61046927SAndroid Build Coastguard Worker    }
365*61046927SAndroid Build Coastguard Worker 
366*61046927SAndroid Build Coastguard Worker    p->nr_insn -= (p->next_insn_offset - start_offset) / sizeof(brw_inst);
367*61046927SAndroid Build Coastguard Worker    p->nr_insn += sb.st_size / sizeof(brw_inst);
368*61046927SAndroid Build Coastguard Worker 
369*61046927SAndroid Build Coastguard Worker    p->next_insn_offset = start_offset + sb.st_size;
370*61046927SAndroid Build Coastguard Worker    p->store_size = (start_offset + sb.st_size) / sizeof(brw_inst);
371*61046927SAndroid Build Coastguard Worker    p->store = (brw_inst *)reralloc_size(p->mem_ctx, p->store, p->next_insn_offset);
372*61046927SAndroid Build Coastguard Worker    assert(p->store);
373*61046927SAndroid Build Coastguard Worker 
374*61046927SAndroid Build Coastguard Worker    ssize_t ret = read(fd, (char *)p->store + start_offset, sb.st_size);
375*61046927SAndroid Build Coastguard Worker    close(fd);
376*61046927SAndroid Build Coastguard Worker    if (ret != sb.st_size) {
377*61046927SAndroid Build Coastguard Worker       return false;
378*61046927SAndroid Build Coastguard Worker    }
379*61046927SAndroid Build Coastguard Worker 
380*61046927SAndroid Build Coastguard Worker    ASSERTED bool valid =
381*61046927SAndroid Build Coastguard Worker       brw_validate_instructions(p->isa, p->store,
382*61046927SAndroid Build Coastguard Worker                                 start_offset, p->next_insn_offset,
383*61046927SAndroid Build Coastguard Worker                                 NULL);
384*61046927SAndroid Build Coastguard Worker    assert(valid);
385*61046927SAndroid Build Coastguard Worker 
386*61046927SAndroid Build Coastguard Worker    return true;
387*61046927SAndroid Build Coastguard Worker }
388*61046927SAndroid Build Coastguard Worker 
389*61046927SAndroid Build Coastguard Worker const struct brw_label *
brw_find_label(const struct brw_label * root,int offset)390*61046927SAndroid Build Coastguard Worker brw_find_label(const struct brw_label *root, int offset)
391*61046927SAndroid Build Coastguard Worker {
392*61046927SAndroid Build Coastguard Worker    const struct brw_label *curr = root;
393*61046927SAndroid Build Coastguard Worker 
394*61046927SAndroid Build Coastguard Worker    if (curr != NULL)
395*61046927SAndroid Build Coastguard Worker    {
396*61046927SAndroid Build Coastguard Worker       do {
397*61046927SAndroid Build Coastguard Worker          if (curr->offset == offset)
398*61046927SAndroid Build Coastguard Worker             return curr;
399*61046927SAndroid Build Coastguard Worker 
400*61046927SAndroid Build Coastguard Worker          curr = curr->next;
401*61046927SAndroid Build Coastguard Worker       } while (curr != NULL);
402*61046927SAndroid Build Coastguard Worker    }
403*61046927SAndroid Build Coastguard Worker 
404*61046927SAndroid Build Coastguard Worker    return curr;
405*61046927SAndroid Build Coastguard Worker }
406*61046927SAndroid Build Coastguard Worker 
407*61046927SAndroid Build Coastguard Worker void
brw_create_label(struct brw_label ** labels,int offset,void * mem_ctx)408*61046927SAndroid Build Coastguard Worker brw_create_label(struct brw_label **labels, int offset, void *mem_ctx)
409*61046927SAndroid Build Coastguard Worker {
410*61046927SAndroid Build Coastguard Worker    if (*labels != NULL) {
411*61046927SAndroid Build Coastguard Worker       struct brw_label *curr = *labels;
412*61046927SAndroid Build Coastguard Worker       struct brw_label *prev;
413*61046927SAndroid Build Coastguard Worker 
414*61046927SAndroid Build Coastguard Worker       do {
415*61046927SAndroid Build Coastguard Worker          prev = curr;
416*61046927SAndroid Build Coastguard Worker 
417*61046927SAndroid Build Coastguard Worker          if (curr->offset == offset)
418*61046927SAndroid Build Coastguard Worker             return;
419*61046927SAndroid Build Coastguard Worker 
420*61046927SAndroid Build Coastguard Worker          curr = curr->next;
421*61046927SAndroid Build Coastguard Worker       } while (curr != NULL);
422*61046927SAndroid Build Coastguard Worker 
423*61046927SAndroid Build Coastguard Worker       curr = ralloc(mem_ctx, struct brw_label);
424*61046927SAndroid Build Coastguard Worker       curr->offset = offset;
425*61046927SAndroid Build Coastguard Worker       curr->number = prev->number + 1;
426*61046927SAndroid Build Coastguard Worker       curr->next = NULL;
427*61046927SAndroid Build Coastguard Worker       prev->next = curr;
428*61046927SAndroid Build Coastguard Worker    } else {
429*61046927SAndroid Build Coastguard Worker       struct brw_label *root = ralloc(mem_ctx, struct brw_label);
430*61046927SAndroid Build Coastguard Worker       root->number = 0;
431*61046927SAndroid Build Coastguard Worker       root->offset = offset;
432*61046927SAndroid Build Coastguard Worker       root->next = NULL;
433*61046927SAndroid Build Coastguard Worker       *labels = root;
434*61046927SAndroid Build Coastguard Worker    }
435*61046927SAndroid Build Coastguard Worker }
436*61046927SAndroid Build Coastguard Worker 
437*61046927SAndroid Build Coastguard Worker const struct brw_label *
brw_label_assembly(const struct brw_isa_info * isa,const void * assembly,int start,int end,void * mem_ctx)438*61046927SAndroid Build Coastguard Worker brw_label_assembly(const struct brw_isa_info *isa,
439*61046927SAndroid Build Coastguard Worker                    const void *assembly, int start, int end, void *mem_ctx)
440*61046927SAndroid Build Coastguard Worker {
441*61046927SAndroid Build Coastguard Worker    const struct intel_device_info *const devinfo = isa->devinfo;
442*61046927SAndroid Build Coastguard Worker 
443*61046927SAndroid Build Coastguard Worker    struct brw_label *root_label = NULL;
444*61046927SAndroid Build Coastguard Worker 
445*61046927SAndroid Build Coastguard Worker    int to_bytes_scale = sizeof(brw_inst) / brw_jump_scale(devinfo);
446*61046927SAndroid Build Coastguard Worker 
447*61046927SAndroid Build Coastguard Worker    for (int offset = start; offset < end;) {
448*61046927SAndroid Build Coastguard Worker       const brw_inst *inst = (const brw_inst *) ((const char *) assembly + offset);
449*61046927SAndroid Build Coastguard Worker       brw_inst uncompacted;
450*61046927SAndroid Build Coastguard Worker 
451*61046927SAndroid Build Coastguard Worker       bool is_compact = brw_inst_cmpt_control(devinfo, inst);
452*61046927SAndroid Build Coastguard Worker 
453*61046927SAndroid Build Coastguard Worker       if (is_compact) {
454*61046927SAndroid Build Coastguard Worker          brw_compact_inst *compacted = (brw_compact_inst *)inst;
455*61046927SAndroid Build Coastguard Worker          brw_uncompact_instruction(isa, &uncompacted, compacted);
456*61046927SAndroid Build Coastguard Worker          inst = &uncompacted;
457*61046927SAndroid Build Coastguard Worker       }
458*61046927SAndroid Build Coastguard Worker 
459*61046927SAndroid Build Coastguard Worker       if (brw_has_uip(devinfo, brw_inst_opcode(isa, inst))) {
460*61046927SAndroid Build Coastguard Worker          /* Instructions that have UIP also have JIP. */
461*61046927SAndroid Build Coastguard Worker          brw_create_label(&root_label,
462*61046927SAndroid Build Coastguard Worker             offset + brw_inst_uip(devinfo, inst) * to_bytes_scale, mem_ctx);
463*61046927SAndroid Build Coastguard Worker          brw_create_label(&root_label,
464*61046927SAndroid Build Coastguard Worker             offset + brw_inst_jip(devinfo, inst) * to_bytes_scale, mem_ctx);
465*61046927SAndroid Build Coastguard Worker       } else if (brw_has_jip(devinfo, brw_inst_opcode(isa, inst))) {
466*61046927SAndroid Build Coastguard Worker          int jip = brw_inst_jip(devinfo, inst);
467*61046927SAndroid Build Coastguard Worker 
468*61046927SAndroid Build Coastguard Worker          brw_create_label(&root_label, offset + jip * to_bytes_scale, mem_ctx);
469*61046927SAndroid Build Coastguard Worker       }
470*61046927SAndroid Build Coastguard Worker 
471*61046927SAndroid Build Coastguard Worker       if (is_compact) {
472*61046927SAndroid Build Coastguard Worker          offset += sizeof(brw_compact_inst);
473*61046927SAndroid Build Coastguard Worker       } else {
474*61046927SAndroid Build Coastguard Worker          offset += sizeof(brw_inst);
475*61046927SAndroid Build Coastguard Worker       }
476*61046927SAndroid Build Coastguard Worker    }
477*61046927SAndroid Build Coastguard Worker 
478*61046927SAndroid Build Coastguard Worker    return root_label;
479*61046927SAndroid Build Coastguard Worker }
480*61046927SAndroid Build Coastguard Worker 
481*61046927SAndroid Build Coastguard Worker void
brw_disassemble_with_labels(const struct brw_isa_info * isa,const void * assembly,int start,int end,FILE * out)482*61046927SAndroid Build Coastguard Worker brw_disassemble_with_labels(const struct brw_isa_info *isa,
483*61046927SAndroid Build Coastguard Worker                             const void *assembly, int start, int end, FILE *out)
484*61046927SAndroid Build Coastguard Worker {
485*61046927SAndroid Build Coastguard Worker    void *mem_ctx = ralloc_context(NULL);
486*61046927SAndroid Build Coastguard Worker    const struct brw_label *root_label =
487*61046927SAndroid Build Coastguard Worker       brw_label_assembly(isa, assembly, start, end, mem_ctx);
488*61046927SAndroid Build Coastguard Worker 
489*61046927SAndroid Build Coastguard Worker    brw_disassemble(isa, assembly, start, end, root_label, out);
490*61046927SAndroid Build Coastguard Worker 
491*61046927SAndroid Build Coastguard Worker    ralloc_free(mem_ctx);
492*61046927SAndroid Build Coastguard Worker }
493*61046927SAndroid Build Coastguard Worker 
494*61046927SAndroid Build Coastguard Worker void
brw_disassemble(const struct brw_isa_info * isa,const void * assembly,int start,int end,const struct brw_label * root_label,FILE * out)495*61046927SAndroid Build Coastguard Worker brw_disassemble(const struct brw_isa_info *isa,
496*61046927SAndroid Build Coastguard Worker                 const void *assembly, int start, int end,
497*61046927SAndroid Build Coastguard Worker                 const struct brw_label *root_label, FILE *out)
498*61046927SAndroid Build Coastguard Worker {
499*61046927SAndroid Build Coastguard Worker    const struct intel_device_info *devinfo = isa->devinfo;
500*61046927SAndroid Build Coastguard Worker 
501*61046927SAndroid Build Coastguard Worker    bool dump_hex = INTEL_DEBUG(DEBUG_HEX);
502*61046927SAndroid Build Coastguard Worker 
503*61046927SAndroid Build Coastguard Worker    for (int offset = start; offset < end;) {
504*61046927SAndroid Build Coastguard Worker       const brw_inst *insn = (const brw_inst *)((char *)assembly + offset);
505*61046927SAndroid Build Coastguard Worker       brw_inst uncompacted;
506*61046927SAndroid Build Coastguard Worker 
507*61046927SAndroid Build Coastguard Worker       if (root_label != NULL) {
508*61046927SAndroid Build Coastguard Worker         const struct brw_label *label = brw_find_label(root_label, offset);
509*61046927SAndroid Build Coastguard Worker         if (label != NULL) {
510*61046927SAndroid Build Coastguard Worker            fprintf(out, "\nLABEL%d:\n", label->number);
511*61046927SAndroid Build Coastguard Worker         }
512*61046927SAndroid Build Coastguard Worker       }
513*61046927SAndroid Build Coastguard Worker 
514*61046927SAndroid Build Coastguard Worker       bool compacted = brw_inst_cmpt_control(devinfo, insn);
515*61046927SAndroid Build Coastguard Worker       if (0)
516*61046927SAndroid Build Coastguard Worker          fprintf(out, "0x%08x: ", offset);
517*61046927SAndroid Build Coastguard Worker 
518*61046927SAndroid Build Coastguard Worker       if (compacted) {
519*61046927SAndroid Build Coastguard Worker          brw_compact_inst *compacted = (brw_compact_inst *)insn;
520*61046927SAndroid Build Coastguard Worker          if (dump_hex) {
521*61046927SAndroid Build Coastguard Worker             unsigned char * insn_ptr = ((unsigned char *)&insn[0]);
522*61046927SAndroid Build Coastguard Worker             const unsigned int blank_spaces = 24;
523*61046927SAndroid Build Coastguard Worker             for (int i = 0 ; i < 8; i = i + 4) {
524*61046927SAndroid Build Coastguard Worker                fprintf(out, "%02x %02x %02x %02x ",
525*61046927SAndroid Build Coastguard Worker                        insn_ptr[i],
526*61046927SAndroid Build Coastguard Worker                        insn_ptr[i + 1],
527*61046927SAndroid Build Coastguard Worker                        insn_ptr[i + 2],
528*61046927SAndroid Build Coastguard Worker                        insn_ptr[i + 3]);
529*61046927SAndroid Build Coastguard Worker             }
530*61046927SAndroid Build Coastguard Worker             /* Make compacted instructions hex value output vertically aligned
531*61046927SAndroid Build Coastguard Worker              * with uncompacted instructions hex value
532*61046927SAndroid Build Coastguard Worker              */
533*61046927SAndroid Build Coastguard Worker             fprintf(out, "%*c", blank_spaces, ' ');
534*61046927SAndroid Build Coastguard Worker          }
535*61046927SAndroid Build Coastguard Worker 
536*61046927SAndroid Build Coastguard Worker          brw_uncompact_instruction(isa, &uncompacted, compacted);
537*61046927SAndroid Build Coastguard Worker          insn = &uncompacted;
538*61046927SAndroid Build Coastguard Worker       } else {
539*61046927SAndroid Build Coastguard Worker          if (dump_hex) {
540*61046927SAndroid Build Coastguard Worker             unsigned char * insn_ptr = ((unsigned char *)&insn[0]);
541*61046927SAndroid Build Coastguard Worker             for (int i = 0 ; i < 16; i = i + 4) {
542*61046927SAndroid Build Coastguard Worker                fprintf(out, "%02x %02x %02x %02x ",
543*61046927SAndroid Build Coastguard Worker                        insn_ptr[i],
544*61046927SAndroid Build Coastguard Worker                        insn_ptr[i + 1],
545*61046927SAndroid Build Coastguard Worker                        insn_ptr[i + 2],
546*61046927SAndroid Build Coastguard Worker                        insn_ptr[i + 3]);
547*61046927SAndroid Build Coastguard Worker             }
548*61046927SAndroid Build Coastguard Worker          }
549*61046927SAndroid Build Coastguard Worker       }
550*61046927SAndroid Build Coastguard Worker 
551*61046927SAndroid Build Coastguard Worker       brw_disassemble_inst(out, isa, insn, compacted, offset, root_label);
552*61046927SAndroid Build Coastguard Worker 
553*61046927SAndroid Build Coastguard Worker       if (compacted) {
554*61046927SAndroid Build Coastguard Worker          offset += sizeof(brw_compact_inst);
555*61046927SAndroid Build Coastguard Worker       } else {
556*61046927SAndroid Build Coastguard Worker          offset += sizeof(brw_inst);
557*61046927SAndroid Build Coastguard Worker       }
558*61046927SAndroid Build Coastguard Worker    }
559*61046927SAndroid Build Coastguard Worker }
560*61046927SAndroid Build Coastguard Worker 
561*61046927SAndroid Build Coastguard Worker static const struct opcode_desc opcode_descs[] = {
562*61046927SAndroid Build Coastguard Worker    /* IR,                 HW,  name,      nsrc, ndst, gfx_vers assuming Gfx9+ */
563*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_ILLEGAL,  0,   "illegal", 0,    0,    GFX_ALL },
564*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SYNC,     1,   "sync",    1,    0,    GFX_GE(GFX12) },
565*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_MOV,      1,   "mov",     1,    1,    GFX_LT(GFX12) },
566*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_MOV,      97,  "mov",     1,    1,    GFX_GE(GFX12) },
567*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SEL,      2,   "sel",     2,    1,    GFX_LT(GFX12) },
568*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SEL,      98,  "sel",     2,    1,    GFX_GE(GFX12) },
569*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_MOVI,     3,   "movi",    2,    1,    GFX_LT(GFX12) },
570*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_MOVI,     99,  "movi",    2,    1,    GFX_GE(GFX12) },
571*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_NOT,      4,   "not",     1,    1,    GFX_LT(GFX12) },
572*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_NOT,      100, "not",     1,    1,    GFX_GE(GFX12) },
573*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_AND,      5,   "and",     2,    1,    GFX_LT(GFX12) },
574*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_AND,      101, "and",     2,    1,    GFX_GE(GFX12) },
575*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_OR,       6,   "or",      2,    1,    GFX_LT(GFX12) },
576*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_OR,       102, "or",      2,    1,    GFX_GE(GFX12) },
577*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_XOR,      7,   "xor",     2,    1,    GFX_LT(GFX12) },
578*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_XOR,      103, "xor",     2,    1,    GFX_GE(GFX12) },
579*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SHR,      8,   "shr",     2,    1,    GFX_LT(GFX12) },
580*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SHR,      104, "shr",     2,    1,    GFX_GE(GFX12) },
581*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SHL,      9,   "shl",     2,    1,    GFX_LT(GFX12) },
582*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SHL,      105, "shl",     2,    1,    GFX_GE(GFX12) },
583*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SMOV,     10,  "smov",    0,    0,    GFX_LT(GFX12) },
584*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SMOV,     106, "smov",    0,    0,    GFX_GE(GFX12) },
585*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_ASR,      12,  "asr",     2,    1,    GFX_LT(GFX12) },
586*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_ASR,      108, "asr",     2,    1,    GFX_GE(GFX12) },
587*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_ROR,      14,  "ror",     2,    1,    GFX11 },
588*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_ROR,      110, "ror",     2,    1,    GFX_GE(GFX12) },
589*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_ROL,      15,  "rol",     2,    1,    GFX11 },
590*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_ROL,      111, "rol",     2,    1,    GFX_GE(GFX12) },
591*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_CMP,      16,  "cmp",     2,    1,    GFX_LT(GFX12) },
592*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_CMP,      112, "cmp",     2,    1,    GFX_GE(GFX12) },
593*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_CMPN,     17,  "cmpn",    2,    1,    GFX_LT(GFX12) },
594*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_CMPN,     113, "cmpn",    2,    1,    GFX_GE(GFX12) },
595*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_CSEL,     18,  "csel",    3,    1,    GFX_LT(GFX12) },
596*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_CSEL,     114, "csel",    3,    1,    GFX_GE(GFX12) },
597*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_BFREV,    23,  "bfrev",   1,    1,    GFX_LT(GFX12) },
598*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_BFREV,    119, "bfrev",   1,    1,    GFX_GE(GFX12) },
599*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_BFE,      24,  "bfe",     3,    1,    GFX_LT(GFX12) },
600*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_BFE,      120, "bfe",     3,    1,    GFX_GE(GFX12) },
601*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_BFI1,     25,  "bfi1",    2,    1,    GFX_LT(GFX12) },
602*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_BFI1,     121, "bfi1",    2,    1,    GFX_GE(GFX12) },
603*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_BFI2,     26,  "bfi2",    3,    1,    GFX_LT(GFX12) },
604*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_BFI2,     122, "bfi2",    3,    1,    GFX_GE(GFX12) },
605*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_JMPI,     32,  "jmpi",    0,    0,    GFX_ALL },
606*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_BRD,      33,  "brd",     0,    0,    GFX_ALL },
607*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_IF,       34,  "if",      0,    0,    GFX_ALL },
608*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_BRC,      35,  "brc",     0,    0,    GFX_ALL },
609*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_ELSE,     36,  "else",    0,    0,    GFX_ALL },
610*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_ENDIF,    37,  "endif",   0,    0,    GFX_ALL },
611*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_DO,       38,  "do",      0,    0,    0 }, /* Pseudo opcode. */
612*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_WHILE,    39,  "while",   0,    0,    GFX_ALL },
613*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_BREAK,    40,  "break",   0,    0,    GFX_ALL },
614*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_CONTINUE, 41,  "cont",    0,    0,    GFX_ALL },
615*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_HALT,     42,  "halt",    0,    0,    GFX_ALL },
616*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_CALLA,    43,  "calla",   0,    0,    GFX_ALL },
617*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_CALL,     44,  "call",    0,    0,    GFX_ALL },
618*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_RET,      45,  "ret",     0,    0,    GFX_ALL },
619*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_GOTO,     46,  "goto",    0,    0,    GFX_ALL },
620*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_WAIT,     48,  "wait",    0,    1,    GFX_LT(GFX12) },
621*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SEND,     49,  "send",    1,    1,    GFX_LT(GFX12) },
622*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SENDC,    50,  "sendc",   1,    1,    GFX_LT(GFX12) },
623*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SEND,     49,  "send",    2,    1,    GFX_GE(GFX12) },
624*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SENDC,    50,  "sendc",   2,    1,    GFX_GE(GFX12) },
625*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SENDS,    51,  "sends",   2,    1,    GFX_LT(GFX12) },
626*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SENDSC,   52,  "sendsc",  2,    1,    GFX_LT(GFX12) },
627*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_MATH,     56,  "math",    2,    1,    GFX_ALL },
628*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_ADD,      64,  "add",     2,    1,    GFX_ALL },
629*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_MUL,      65,  "mul",     2,    1,    GFX_ALL },
630*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_AVG,      66,  "avg",     2,    1,    GFX_ALL },
631*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_FRC,      67,  "frc",     1,    1,    GFX_ALL },
632*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_RNDU,     68,  "rndu",    1,    1,    GFX_ALL },
633*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_RNDD,     69,  "rndd",    1,    1,    GFX_ALL },
634*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_RNDE,     70,  "rnde",    1,    1,    GFX_ALL },
635*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_RNDZ,     71,  "rndz",    1,    1,    GFX_ALL },
636*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_MAC,      72,  "mac",     2,    1,    GFX_ALL },
637*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_MACH,     73,  "mach",    2,    1,    GFX_ALL },
638*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_LZD,      74,  "lzd",     1,    1,    GFX_ALL },
639*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_FBH,      75,  "fbh",     1,    1,    GFX_ALL },
640*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_FBL,      76,  "fbl",     1,    1,    GFX_ALL },
641*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_CBIT,     77,  "cbit",    1,    1,    GFX_ALL },
642*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_ADDC,     78,  "addc",    2,    1,    GFX_ALL },
643*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_SUBB,     79,  "subb",    2,    1,    GFX_ALL },
644*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_ADD3,     82,  "add3",    3,    1,    GFX_GE(GFX125) },
645*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_DP4,      84,  "dp4",     2,    1,    GFX_LT(GFX11) },
646*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_DPH,      85,  "dph",     2,    1,    GFX_LT(GFX11) },
647*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_DP3,      86,  "dp3",     2,    1,    GFX_LT(GFX11) },
648*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_DP2,      87,  "dp2",     2,    1,    GFX_LT(GFX11) },
649*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_DP4A,     88,  "dp4a",    3,    1,    GFX_GE(GFX12) },
650*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_LINE,     89,  "line",    2,    1,    GFX9 },
651*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_DPAS,     89,  "dpas",    3,    1,    GFX_GE(GFX125) },
652*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_PLN,      90,  "pln",     2,    1,    GFX9 },
653*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_MAD,      91,  "mad",     3,    1,    GFX_ALL },
654*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_LRP,      92,  "lrp",     3,    1,    GFX9 },
655*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_MADM,     93,  "madm",    3,    1,    GFX_ALL },
656*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_NOP,      126, "nop",     0,    0,    GFX_LT(GFX12) },
657*61046927SAndroid Build Coastguard Worker    { BRW_OPCODE_NOP,      96,  "nop",     0,    0,    GFX_GE(GFX12) }
658*61046927SAndroid Build Coastguard Worker };
659*61046927SAndroid Build Coastguard Worker 
660*61046927SAndroid Build Coastguard Worker void
brw_init_isa_info(struct brw_isa_info * isa,const struct intel_device_info * devinfo)661*61046927SAndroid Build Coastguard Worker brw_init_isa_info(struct brw_isa_info *isa,
662*61046927SAndroid Build Coastguard Worker                   const struct intel_device_info *devinfo)
663*61046927SAndroid Build Coastguard Worker {
664*61046927SAndroid Build Coastguard Worker    assert(devinfo->ver >= 9);
665*61046927SAndroid Build Coastguard Worker 
666*61046927SAndroid Build Coastguard Worker    isa->devinfo = devinfo;
667*61046927SAndroid Build Coastguard Worker 
668*61046927SAndroid Build Coastguard Worker    enum gfx_ver ver = gfx_ver_from_devinfo(devinfo);
669*61046927SAndroid Build Coastguard Worker 
670*61046927SAndroid Build Coastguard Worker    memset(isa->ir_to_descs, 0, sizeof(isa->ir_to_descs));
671*61046927SAndroid Build Coastguard Worker    memset(isa->hw_to_descs, 0, sizeof(isa->hw_to_descs));
672*61046927SAndroid Build Coastguard Worker 
673*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < ARRAY_SIZE(opcode_descs); i++) {
674*61046927SAndroid Build Coastguard Worker       if (opcode_descs[i].gfx_vers & ver) {
675*61046927SAndroid Build Coastguard Worker          const unsigned e = opcode_descs[i].ir;
676*61046927SAndroid Build Coastguard Worker          const unsigned h = opcode_descs[i].hw;
677*61046927SAndroid Build Coastguard Worker          assert(e < ARRAY_SIZE(isa->ir_to_descs) && !isa->ir_to_descs[e]);
678*61046927SAndroid Build Coastguard Worker          assert(h < ARRAY_SIZE(isa->hw_to_descs) && !isa->hw_to_descs[h]);
679*61046927SAndroid Build Coastguard Worker          isa->ir_to_descs[e] = &opcode_descs[i];
680*61046927SAndroid Build Coastguard Worker          isa->hw_to_descs[h] = &opcode_descs[i];
681*61046927SAndroid Build Coastguard Worker       }
682*61046927SAndroid Build Coastguard Worker    }
683*61046927SAndroid Build Coastguard Worker }
684*61046927SAndroid Build Coastguard Worker 
685*61046927SAndroid Build Coastguard Worker /**
686*61046927SAndroid Build Coastguard Worker  * Return the matching opcode_desc for the specified IR opcode and hardware
687*61046927SAndroid Build Coastguard Worker  * generation, or NULL if the opcode is not supported by the device.
688*61046927SAndroid Build Coastguard Worker  */
689*61046927SAndroid Build Coastguard Worker const struct opcode_desc *
brw_opcode_desc(const struct brw_isa_info * isa,enum opcode op)690*61046927SAndroid Build Coastguard Worker brw_opcode_desc(const struct brw_isa_info *isa, enum opcode op)
691*61046927SAndroid Build Coastguard Worker {
692*61046927SAndroid Build Coastguard Worker    return op < ARRAY_SIZE(isa->ir_to_descs) ? isa->ir_to_descs[op] : NULL;
693*61046927SAndroid Build Coastguard Worker }
694*61046927SAndroid Build Coastguard Worker 
695*61046927SAndroid Build Coastguard Worker /**
696*61046927SAndroid Build Coastguard Worker  * Return the matching opcode_desc for the specified HW opcode and hardware
697*61046927SAndroid Build Coastguard Worker  * generation, or NULL if the opcode is not supported by the device.
698*61046927SAndroid Build Coastguard Worker  */
699*61046927SAndroid Build Coastguard Worker const struct opcode_desc *
brw_opcode_desc_from_hw(const struct brw_isa_info * isa,unsigned hw)700*61046927SAndroid Build Coastguard Worker brw_opcode_desc_from_hw(const struct brw_isa_info *isa, unsigned hw)
701*61046927SAndroid Build Coastguard Worker {
702*61046927SAndroid Build Coastguard Worker    return hw < ARRAY_SIZE(isa->hw_to_descs) ? isa->hw_to_descs[hw] : NULL;
703*61046927SAndroid Build Coastguard Worker }
704*61046927SAndroid Build Coastguard Worker 
705*61046927SAndroid Build Coastguard Worker unsigned
brw_num_sources_from_inst(const struct brw_isa_info * isa,const brw_inst * inst)706*61046927SAndroid Build Coastguard Worker brw_num_sources_from_inst(const struct brw_isa_info *isa,
707*61046927SAndroid Build Coastguard Worker                           const brw_inst *inst)
708*61046927SAndroid Build Coastguard Worker {
709*61046927SAndroid Build Coastguard Worker    const struct intel_device_info *devinfo = isa->devinfo;
710*61046927SAndroid Build Coastguard Worker    const struct opcode_desc *desc =
711*61046927SAndroid Build Coastguard Worker       brw_opcode_desc(isa, brw_inst_opcode(isa, inst));
712*61046927SAndroid Build Coastguard Worker    unsigned math_function;
713*61046927SAndroid Build Coastguard Worker 
714*61046927SAndroid Build Coastguard Worker    if (brw_inst_opcode(isa, inst) == BRW_OPCODE_MATH) {
715*61046927SAndroid Build Coastguard Worker       math_function = brw_inst_math_function(devinfo, inst);
716*61046927SAndroid Build Coastguard Worker    } else {
717*61046927SAndroid Build Coastguard Worker       assert(desc->nsrc < 4);
718*61046927SAndroid Build Coastguard Worker       return desc->nsrc;
719*61046927SAndroid Build Coastguard Worker    }
720*61046927SAndroid Build Coastguard Worker 
721*61046927SAndroid Build Coastguard Worker    switch (math_function) {
722*61046927SAndroid Build Coastguard Worker    case BRW_MATH_FUNCTION_INV:
723*61046927SAndroid Build Coastguard Worker    case BRW_MATH_FUNCTION_LOG:
724*61046927SAndroid Build Coastguard Worker    case BRW_MATH_FUNCTION_EXP:
725*61046927SAndroid Build Coastguard Worker    case BRW_MATH_FUNCTION_SQRT:
726*61046927SAndroid Build Coastguard Worker    case BRW_MATH_FUNCTION_RSQ:
727*61046927SAndroid Build Coastguard Worker    case BRW_MATH_FUNCTION_SIN:
728*61046927SAndroid Build Coastguard Worker    case BRW_MATH_FUNCTION_COS:
729*61046927SAndroid Build Coastguard Worker    case GFX8_MATH_FUNCTION_INVM:
730*61046927SAndroid Build Coastguard Worker    case GFX8_MATH_FUNCTION_RSQRTM:
731*61046927SAndroid Build Coastguard Worker       return 1;
732*61046927SAndroid Build Coastguard Worker    case BRW_MATH_FUNCTION_FDIV:
733*61046927SAndroid Build Coastguard Worker    case BRW_MATH_FUNCTION_POW:
734*61046927SAndroid Build Coastguard Worker    case BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER:
735*61046927SAndroid Build Coastguard Worker    case BRW_MATH_FUNCTION_INT_DIV_QUOTIENT:
736*61046927SAndroid Build Coastguard Worker    case BRW_MATH_FUNCTION_INT_DIV_REMAINDER:
737*61046927SAndroid Build Coastguard Worker       return 2;
738*61046927SAndroid Build Coastguard Worker    default:
739*61046927SAndroid Build Coastguard Worker       unreachable("not reached");
740*61046927SAndroid Build Coastguard Worker    }
741*61046927SAndroid Build Coastguard Worker }
742