xref: /aosp_15_r20/external/igt-gpu-tools/assembler/gen8_instruction.h (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2012 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker  *
11*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker  * Software.
14*d83cc019SAndroid Build Coastguard Worker  *
15*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*d83cc019SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker  */
23*d83cc019SAndroid Build Coastguard Worker 
24*d83cc019SAndroid Build Coastguard Worker /** @file gen8_instruction.h
25*d83cc019SAndroid Build Coastguard Worker  *
26*d83cc019SAndroid Build Coastguard Worker  * A representation of a Gen8+ EU instruction, with helper methods to get
27*d83cc019SAndroid Build Coastguard Worker  * and set various fields.  This is the actual hardware format.
28*d83cc019SAndroid Build Coastguard Worker  */
29*d83cc019SAndroid Build Coastguard Worker 
30*d83cc019SAndroid Build Coastguard Worker #ifndef GEN8_INSTRUCTION_H
31*d83cc019SAndroid Build Coastguard Worker #define GEN8_INSTRUCTION_H
32*d83cc019SAndroid Build Coastguard Worker 
33*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
34*d83cc019SAndroid Build Coastguard Worker #include <stdint.h>
35*d83cc019SAndroid Build Coastguard Worker 
36*d83cc019SAndroid Build Coastguard Worker #include "brw_compat.h"
37*d83cc019SAndroid Build Coastguard Worker #include "brw_reg.h"
38*d83cc019SAndroid Build Coastguard Worker 
39*d83cc019SAndroid Build Coastguard Worker struct gen8_instruction {
40*d83cc019SAndroid Build Coastguard Worker    uint32_t data[4];
41*d83cc019SAndroid Build Coastguard Worker };
42*d83cc019SAndroid Build Coastguard Worker 
43*d83cc019SAndroid Build Coastguard Worker static inline unsigned gen8_bits(struct gen8_instruction *insn,
44*d83cc019SAndroid Build Coastguard Worker 				 unsigned high,
45*d83cc019SAndroid Build Coastguard Worker 				 unsigned low);
46*d83cc019SAndroid Build Coastguard Worker static inline void gen8_set_bits(struct gen8_instruction *insn,
47*d83cc019SAndroid Build Coastguard Worker 				 unsigned high,
48*d83cc019SAndroid Build Coastguard Worker 				 unsigned low,
49*d83cc019SAndroid Build Coastguard Worker 				 unsigned value);
50*d83cc019SAndroid Build Coastguard Worker 
51*d83cc019SAndroid Build Coastguard Worker #define F(name, high, low) \
52*d83cc019SAndroid Build Coastguard Worker    static inline void gen8_set_##name(struct gen8_instruction *insn, unsigned v) \
53*d83cc019SAndroid Build Coastguard Worker    { \
54*d83cc019SAndroid Build Coastguard Worker       gen8_set_bits(insn, high, low, v); \
55*d83cc019SAndroid Build Coastguard Worker    } \
56*d83cc019SAndroid Build Coastguard Worker    static inline unsigned gen8_##name(struct gen8_instruction *insn) \
57*d83cc019SAndroid Build Coastguard Worker    { \
58*d83cc019SAndroid Build Coastguard Worker       return gen8_bits(insn, high, low); \
59*d83cc019SAndroid Build Coastguard Worker    }
60*d83cc019SAndroid Build Coastguard Worker 
61*d83cc019SAndroid Build Coastguard Worker /**
62*d83cc019SAndroid Build Coastguard Worker * Direct addressing only:
63*d83cc019SAndroid Build Coastguard Worker *  @{
64*d83cc019SAndroid Build Coastguard Worker */
65*d83cc019SAndroid Build Coastguard Worker F(src1_da_reg_nr,      108, 101);
66*d83cc019SAndroid Build Coastguard Worker F(src0_da_reg_nr,       76,  69);
67*d83cc019SAndroid Build Coastguard Worker F(dst_da1_hstride,      62,  61);
68*d83cc019SAndroid Build Coastguard Worker F(dst_da_reg_nr,        60,  53);
69*d83cc019SAndroid Build Coastguard Worker F(dst_da16_subreg_nr,   52,  52);
70*d83cc019SAndroid Build Coastguard Worker F(dst_da1_subreg_nr,    52,  48);
71*d83cc019SAndroid Build Coastguard Worker F(da16_writemask,       51,  48); /* Dst.ChanEn */
72*d83cc019SAndroid Build Coastguard Worker /** @} */
73*d83cc019SAndroid Build Coastguard Worker 
74*d83cc019SAndroid Build Coastguard Worker F(src1_vert_stride,    120, 117)
75*d83cc019SAndroid Build Coastguard Worker F(src1_da1_width,      116, 114)
76*d83cc019SAndroid Build Coastguard Worker F(src1_da16_swiz_w,    115, 114)
77*d83cc019SAndroid Build Coastguard Worker F(src1_da16_swiz_z,    113, 112)
78*d83cc019SAndroid Build Coastguard Worker F(src1_da1_hstride,    113, 112)
79*d83cc019SAndroid Build Coastguard Worker F(src1_address_mode,   111, 111)
80*d83cc019SAndroid Build Coastguard Worker /** Src1.SrcMod @{ */
81*d83cc019SAndroid Build Coastguard Worker F(src1_negate,         110, 110)
82*d83cc019SAndroid Build Coastguard Worker F(src1_abs,            109, 109)
83*d83cc019SAndroid Build Coastguard Worker /** @} */
84*d83cc019SAndroid Build Coastguard Worker F(src1_da16_subreg_nr, 100, 100)
85*d83cc019SAndroid Build Coastguard Worker F(src1_da1_subreg_nr,  100,  96)
86*d83cc019SAndroid Build Coastguard Worker F(src1_da16_swiz_y,     99,  98)
87*d83cc019SAndroid Build Coastguard Worker F(src1_da16_swiz_x,     97,  96)
88*d83cc019SAndroid Build Coastguard Worker F(src1_reg_type,        94,  91)
89*d83cc019SAndroid Build Coastguard Worker F(src1_reg_file,        90,  89)
90*d83cc019SAndroid Build Coastguard Worker F(src0_vert_stride,     88,  85)
91*d83cc019SAndroid Build Coastguard Worker F(src0_da1_width,       84,  82)
92*d83cc019SAndroid Build Coastguard Worker F(src0_da16_swiz_w,     83,  82)
93*d83cc019SAndroid Build Coastguard Worker F(src0_da16_swiz_z,     81,  80)
94*d83cc019SAndroid Build Coastguard Worker F(src0_da1_hstride,     81,  80)
95*d83cc019SAndroid Build Coastguard Worker F(src0_address_mode,    79,  79)
96*d83cc019SAndroid Build Coastguard Worker /** Src0.SrcMod @{ */
97*d83cc019SAndroid Build Coastguard Worker F(src0_negate,          78,  78)
98*d83cc019SAndroid Build Coastguard Worker F(src0_abs,             77,  77)
99*d83cc019SAndroid Build Coastguard Worker /** @} */
100*d83cc019SAndroid Build Coastguard Worker F(src0_da16_subreg_nr,  68,  68)
101*d83cc019SAndroid Build Coastguard Worker F(src0_da1_subreg_nr,   68,  64)
102*d83cc019SAndroid Build Coastguard Worker F(src0_da16_swiz_y,     67,  66)
103*d83cc019SAndroid Build Coastguard Worker F(src0_da16_swiz_x,     65,  64)
104*d83cc019SAndroid Build Coastguard Worker F(dst_address_mode,     63,  63)
105*d83cc019SAndroid Build Coastguard Worker F(src0_reg_type,        46,  43)
106*d83cc019SAndroid Build Coastguard Worker F(src0_reg_file,        42,  41)
107*d83cc019SAndroid Build Coastguard Worker F(dst_reg_type,         40,  37)
108*d83cc019SAndroid Build Coastguard Worker F(dst_reg_file,         36,  35)
109*d83cc019SAndroid Build Coastguard Worker F(mask_control,         34,  34)
110*d83cc019SAndroid Build Coastguard Worker F(flag_reg_nr,          33,  33)
111*d83cc019SAndroid Build Coastguard Worker F(flag_subreg_nr,       32,  32)
112*d83cc019SAndroid Build Coastguard Worker F(saturate,             31,  31)
113*d83cc019SAndroid Build Coastguard Worker F(branch_control,       30,  30)
114*d83cc019SAndroid Build Coastguard Worker F(debug_control,        30,  30)
115*d83cc019SAndroid Build Coastguard Worker F(cmpt_control,         29,  29)
116*d83cc019SAndroid Build Coastguard Worker F(acc_wr_control,       28,  28)
117*d83cc019SAndroid Build Coastguard Worker F(cond_modifier,        27,  24)
118*d83cc019SAndroid Build Coastguard Worker F(exec_size,            23,  21)
119*d83cc019SAndroid Build Coastguard Worker F(pred_inv,             20,  20)
120*d83cc019SAndroid Build Coastguard Worker F(pred_control,         19,  16)
121*d83cc019SAndroid Build Coastguard Worker F(thread_control,       15,  14)
122*d83cc019SAndroid Build Coastguard Worker F(qtr_control,          13,  12)
123*d83cc019SAndroid Build Coastguard Worker F(nib_control,          11,  11)
124*d83cc019SAndroid Build Coastguard Worker F(dep_control,          10,   9)
125*d83cc019SAndroid Build Coastguard Worker F(access_mode,           8,   8)
126*d83cc019SAndroid Build Coastguard Worker /* Bit 7 is Reserve d (for future Opcode expansion) */
127*d83cc019SAndroid Build Coastguard Worker F(opcode,                6,   0)
128*d83cc019SAndroid Build Coastguard Worker 
129*d83cc019SAndroid Build Coastguard Worker /**
130*d83cc019SAndroid Build Coastguard Worker * Three-source instructions:
131*d83cc019SAndroid Build Coastguard Worker *  @{
132*d83cc019SAndroid Build Coastguard Worker */
133*d83cc019SAndroid Build Coastguard Worker F(src2_3src_reg_nr,    125, 118)
134*d83cc019SAndroid Build Coastguard Worker F(src2_3src_subreg_nr, 117, 115)
135*d83cc019SAndroid Build Coastguard Worker F(src2_3src_swizzle,   114, 107)
136*d83cc019SAndroid Build Coastguard Worker F(src2_3src_rep_ctrl,  106, 106)
137*d83cc019SAndroid Build Coastguard Worker F(src1_3src_reg_nr,    104,  97)
138*d83cc019SAndroid Build Coastguard Worker F(src1_3src_subreg_hi,  96,  96)
139*d83cc019SAndroid Build Coastguard Worker F(src1_3src_subreg_lo,  95,  94)
140*d83cc019SAndroid Build Coastguard Worker F(src1_3src_swizzle,    93,  86)
141*d83cc019SAndroid Build Coastguard Worker F(src1_3src_rep_ctrl,   85,  85)
142*d83cc019SAndroid Build Coastguard Worker F(src0_3src_reg_nr,     83,  76)
143*d83cc019SAndroid Build Coastguard Worker F(src0_3src_subreg_nr,  75,  73)
144*d83cc019SAndroid Build Coastguard Worker F(src0_3src_swizzle,    72,  65)
145*d83cc019SAndroid Build Coastguard Worker F(src0_3src_rep_ctrl,   64,  64)
146*d83cc019SAndroid Build Coastguard Worker F(dst_3src_reg_nr,      63,  56)
147*d83cc019SAndroid Build Coastguard Worker F(dst_3src_subreg_nr,   55,  53)
148*d83cc019SAndroid Build Coastguard Worker F(dst_3src_writemask,   52,  49)
149*d83cc019SAndroid Build Coastguard Worker F(dst_3src_type,        48,  46)
150*d83cc019SAndroid Build Coastguard Worker F(src_3src_type,        45,  43)
151*d83cc019SAndroid Build Coastguard Worker F(src2_3src_negate,     42,  42)
152*d83cc019SAndroid Build Coastguard Worker F(src2_3src_abs,        41,  41)
153*d83cc019SAndroid Build Coastguard Worker F(src1_3src_negate,     40,  40)
154*d83cc019SAndroid Build Coastguard Worker F(src1_3src_abs,        39,  39)
155*d83cc019SAndroid Build Coastguard Worker F(src0_3src_negate,     38,  38)
156*d83cc019SAndroid Build Coastguard Worker F(src0_3src_abs,        37,  37)
157*d83cc019SAndroid Build Coastguard Worker /** @} */
158*d83cc019SAndroid Build Coastguard Worker 
159*d83cc019SAndroid Build Coastguard Worker /**
160*d83cc019SAndroid Build Coastguard Worker * Fields for SEND messages:
161*d83cc019SAndroid Build Coastguard Worker *  @{
162*d83cc019SAndroid Build Coastguard Worker */
163*d83cc019SAndroid Build Coastguard Worker F(eot,                 127, 127)
164*d83cc019SAndroid Build Coastguard Worker F(mlen,                124, 121)
165*d83cc019SAndroid Build Coastguard Worker F(rlen,                120, 116)
166*d83cc019SAndroid Build Coastguard Worker F(header_present,      115, 115)
167*d83cc019SAndroid Build Coastguard Worker F(function_control,    114,  96)
168*d83cc019SAndroid Build Coastguard Worker F(sfid,                 27,  24)
169*d83cc019SAndroid Build Coastguard Worker F(math_function,        27,  24)
170*d83cc019SAndroid Build Coastguard Worker /** @} */
171*d83cc019SAndroid Build Coastguard Worker 
172*d83cc019SAndroid Build Coastguard Worker /**
173*d83cc019SAndroid Build Coastguard Worker * URB message function control bits:
174*d83cc019SAndroid Build Coastguard Worker *  @{
175*d83cc019SAndroid Build Coastguard Worker */
176*d83cc019SAndroid Build Coastguard Worker F(urb_per_slot_offset, 113, 113)
177*d83cc019SAndroid Build Coastguard Worker F(urb_interleave,      111, 111)
178*d83cc019SAndroid Build Coastguard Worker F(urb_global_offset,   110, 100)
179*d83cc019SAndroid Build Coastguard Worker F(urb_opcode,           99,  96)
180*d83cc019SAndroid Build Coastguard Worker /** @} */
181*d83cc019SAndroid Build Coastguard Worker 
182*d83cc019SAndroid Build Coastguard Worker /**
183*d83cc019SAndroid Build Coastguard Worker * Sampler message function control bits:
184*d83cc019SAndroid Build Coastguard Worker *  @{
185*d83cc019SAndroid Build Coastguard Worker */
186*d83cc019SAndroid Build Coastguard Worker F(sampler_simd_mode,   114, 113)
187*d83cc019SAndroid Build Coastguard Worker F(sampler_msg_type,    112, 108)
188*d83cc019SAndroid Build Coastguard Worker F(sampler,             107, 104)
189*d83cc019SAndroid Build Coastguard Worker F(binding_table_index, 103,  96)
190*d83cc019SAndroid Build Coastguard Worker /** @} */
191*d83cc019SAndroid Build Coastguard Worker 
192*d83cc019SAndroid Build Coastguard Worker /**
193*d83cc019SAndroid Build Coastguard Worker  * Data port message function control bits:
194*d83cc019SAndroid Build Coastguard Worker  *  @ {
195*d83cc019SAndroid Build Coastguard Worker  */
196*d83cc019SAndroid Build Coastguard Worker F(dp_category,            114, 114)
197*d83cc019SAndroid Build Coastguard Worker F(dp_message_type,        113, 110)
198*d83cc019SAndroid Build Coastguard Worker F(dp_message_control,     109, 104)
199*d83cc019SAndroid Build Coastguard Worker F(dp_binding_table_index, 103,  96)
200*d83cc019SAndroid Build Coastguard Worker /** @} */
201*d83cc019SAndroid Build Coastguard Worker 
202*d83cc019SAndroid Build Coastguard Worker /**
203*d83cc019SAndroid Build Coastguard Worker  * Thread Spawn message function control bits:
204*d83cc019SAndroid Build Coastguard Worker  *  @ {
205*d83cc019SAndroid Build Coastguard Worker  */
206*d83cc019SAndroid Build Coastguard Worker F(ts_resource_select,     100, 100)
207*d83cc019SAndroid Build Coastguard Worker F(ts_request_type,         97,  97)
208*d83cc019SAndroid Build Coastguard Worker F(ts_opcode,               96,  96)
209*d83cc019SAndroid Build Coastguard Worker /** @} */
210*d83cc019SAndroid Build Coastguard Worker 
211*d83cc019SAndroid Build Coastguard Worker /**
212*d83cc019SAndroid Build Coastguard Worker  * Video Motion Estimation message function control bits:
213*d83cc019SAndroid Build Coastguard Worker  *  @ {
214*d83cc019SAndroid Build Coastguard Worker  */
215*d83cc019SAndroid Build Coastguard Worker F(vme_message_type,        110, 109)
216*d83cc019SAndroid Build Coastguard Worker F(vme_binding_table_index, 103,  96)
217*d83cc019SAndroid Build Coastguard Worker /** @} */
218*d83cc019SAndroid Build Coastguard Worker 
219*d83cc019SAndroid Build Coastguard Worker /**
220*d83cc019SAndroid Build Coastguard Worker  * Check & Refinement Engine message function control bits:
221*d83cc019SAndroid Build Coastguard Worker  *  @ {
222*d83cc019SAndroid Build Coastguard Worker  */
223*d83cc019SAndroid Build Coastguard Worker F(cre_message_type,        110, 109)
224*d83cc019SAndroid Build Coastguard Worker F(cre_binding_table_index, 103,  96)
225*d83cc019SAndroid Build Coastguard Worker /** @} */
226*d83cc019SAndroid Build Coastguard Worker 
227*d83cc019SAndroid Build Coastguard Worker /* Addr Mode */
228*d83cc019SAndroid Build Coastguard Worker 
229*d83cc019SAndroid Build Coastguard Worker F(dst_addr_mode,	  63, 63)
230*d83cc019SAndroid Build Coastguard Worker F(src0_addr_mode,	  79, 79)
231*d83cc019SAndroid Build Coastguard Worker F(src1_addr_mode,	  111, 111)
232*d83cc019SAndroid Build Coastguard Worker 
233*d83cc019SAndroid Build Coastguard Worker /* Indirect access mode for Align1. */
234*d83cc019SAndroid Build Coastguard Worker F(dst_ida1_sub_nr,        60,  57)
235*d83cc019SAndroid Build Coastguard Worker F(src0_ida1_sub_nr,       76,  73)
236*d83cc019SAndroid Build Coastguard Worker F(src1_ida1_sub_nr,      108, 105)
237*d83cc019SAndroid Build Coastguard Worker 
238*d83cc019SAndroid Build Coastguard Worker /* Imm[8:0] of Immediate addr offset under Indirect mode */
239*d83cc019SAndroid Build Coastguard Worker F(dst_ida1_imm8,         56,  48)
240*d83cc019SAndroid Build Coastguard Worker F(src0_ida1_imm8,        72,  64)
241*d83cc019SAndroid Build Coastguard Worker F(src1_ida1_imm8,        104,  96)
242*d83cc019SAndroid Build Coastguard Worker 
243*d83cc019SAndroid Build Coastguard Worker /* Imm Bit9 of Immediate addr offset under Indirect mode */
244*d83cc019SAndroid Build Coastguard Worker F(dst_ida1_imm9,         47,  47)
245*d83cc019SAndroid Build Coastguard Worker F(src0_ida1_imm9,        95,  95)
246*d83cc019SAndroid Build Coastguard Worker F(src1_ida1_imm9,        121, 121)
247*d83cc019SAndroid Build Coastguard Worker 
248*d83cc019SAndroid Build Coastguard Worker #undef F
249*d83cc019SAndroid Build Coastguard Worker 
250*d83cc019SAndroid Build Coastguard Worker #define IMM8_MASK	0x1FF
251*d83cc019SAndroid Build Coastguard Worker #define IMM9_MASK	0x200
252*d83cc019SAndroid Build Coastguard Worker 
253*d83cc019SAndroid Build Coastguard Worker /**
254*d83cc019SAndroid Build Coastguard Worker * Flow control instruction bits:
255*d83cc019SAndroid Build Coastguard Worker *  @{
256*d83cc019SAndroid Build Coastguard Worker */
gen8_uip(struct gen8_instruction * insn)257*d83cc019SAndroid Build Coastguard Worker static inline unsigned gen8_uip(struct gen8_instruction *insn)
258*d83cc019SAndroid Build Coastguard Worker {
259*d83cc019SAndroid Build Coastguard Worker    return insn->data[2];
260*d83cc019SAndroid Build Coastguard Worker }
gen8_set_uip(struct gen8_instruction * insn,unsigned uip)261*d83cc019SAndroid Build Coastguard Worker static inline void gen8_set_uip(struct gen8_instruction *insn, unsigned uip)
262*d83cc019SAndroid Build Coastguard Worker {
263*d83cc019SAndroid Build Coastguard Worker    insn->data[2] = uip;
264*d83cc019SAndroid Build Coastguard Worker }
gen8_jip(struct gen8_instruction * insn)265*d83cc019SAndroid Build Coastguard Worker static inline unsigned gen8_jip(struct gen8_instruction *insn)
266*d83cc019SAndroid Build Coastguard Worker {
267*d83cc019SAndroid Build Coastguard Worker    return insn->data[3];
268*d83cc019SAndroid Build Coastguard Worker }
gen8_set_jip(struct gen8_instruction * insn,unsigned jip)269*d83cc019SAndroid Build Coastguard Worker static inline void gen8_set_jip(struct gen8_instruction *insn, unsigned jip)
270*d83cc019SAndroid Build Coastguard Worker {
271*d83cc019SAndroid Build Coastguard Worker    insn->data[3] = jip;
272*d83cc019SAndroid Build Coastguard Worker }
273*d83cc019SAndroid Build Coastguard Worker /** @} */
274*d83cc019SAndroid Build Coastguard Worker 
gen8_src1_imm_d(struct gen8_instruction * insn)275*d83cc019SAndroid Build Coastguard Worker static inline int gen8_src1_imm_d(struct gen8_instruction *insn)
276*d83cc019SAndroid Build Coastguard Worker {
277*d83cc019SAndroid Build Coastguard Worker    return insn->data[3];
278*d83cc019SAndroid Build Coastguard Worker }
gen8_src1_imm_ud(struct gen8_instruction * insn)279*d83cc019SAndroid Build Coastguard Worker static inline unsigned gen8_src1_imm_ud(struct gen8_instruction *insn)
280*d83cc019SAndroid Build Coastguard Worker {
281*d83cc019SAndroid Build Coastguard Worker    return insn->data[3];
282*d83cc019SAndroid Build Coastguard Worker }
gen8_src1_imm_f(struct gen8_instruction * insn)283*d83cc019SAndroid Build Coastguard Worker static inline float gen8_src1_imm_f(struct gen8_instruction *insn)
284*d83cc019SAndroid Build Coastguard Worker {
285*d83cc019SAndroid Build Coastguard Worker    fi_type ft;
286*d83cc019SAndroid Build Coastguard Worker 
287*d83cc019SAndroid Build Coastguard Worker    ft.u = insn->data[3];
288*d83cc019SAndroid Build Coastguard Worker    return ft.f;
289*d83cc019SAndroid Build Coastguard Worker }
290*d83cc019SAndroid Build Coastguard Worker 
291*d83cc019SAndroid Build Coastguard Worker void gen8_set_dst(struct gen8_instruction *insn, struct brw_reg reg);
292*d83cc019SAndroid Build Coastguard Worker void gen8_set_src0(struct gen8_instruction *insn, struct brw_reg reg);
293*d83cc019SAndroid Build Coastguard Worker void gen8_set_src1(struct gen8_instruction *insn, struct brw_reg reg);
294*d83cc019SAndroid Build Coastguard Worker 
295*d83cc019SAndroid Build Coastguard Worker void gen8_set_urb_message(struct gen8_instruction *insn,
296*d83cc019SAndroid Build Coastguard Worker 			  unsigned opcode, unsigned mlen, unsigned rlen,
297*d83cc019SAndroid Build Coastguard Worker 			  bool eot, unsigned offset, bool interleave);
298*d83cc019SAndroid Build Coastguard Worker 
299*d83cc019SAndroid Build Coastguard Worker void gen8_set_sampler_message(struct gen8_instruction *insn,
300*d83cc019SAndroid Build Coastguard Worker 			      unsigned binding_table_index, unsigned sampler,
301*d83cc019SAndroid Build Coastguard Worker 			      unsigned msg_type, unsigned rlen, unsigned mlen,
302*d83cc019SAndroid Build Coastguard Worker 			      bool header_present, unsigned simd_mode);
303*d83cc019SAndroid Build Coastguard Worker 
304*d83cc019SAndroid Build Coastguard Worker void gen8_set_dp_message(struct gen8_instruction *insn,
305*d83cc019SAndroid Build Coastguard Worker 			 enum brw_message_target sfid,
306*d83cc019SAndroid Build Coastguard Worker 			 unsigned binding_table_index,
307*d83cc019SAndroid Build Coastguard Worker 			 unsigned msg_type,
308*d83cc019SAndroid Build Coastguard Worker 			 unsigned msg_control,
309*d83cc019SAndroid Build Coastguard Worker 			 unsigned msg_length,
310*d83cc019SAndroid Build Coastguard Worker 			 unsigned response_length,
311*d83cc019SAndroid Build Coastguard Worker 			 bool header_present,
312*d83cc019SAndroid Build Coastguard Worker 			 bool end_of_thread);
313*d83cc019SAndroid Build Coastguard Worker 
314*d83cc019SAndroid Build Coastguard Worker /** Disassemble the instruction. */
315*d83cc019SAndroid Build Coastguard Worker int gen8_disassemble(FILE *file, struct gen8_instruction *insn, int gen);
316*d83cc019SAndroid Build Coastguard Worker 
317*d83cc019SAndroid Build Coastguard Worker 
318*d83cc019SAndroid Build Coastguard Worker /**
319*d83cc019SAndroid Build Coastguard Worker  * Fetch a set of contiguous bits from the instruction.
320*d83cc019SAndroid Build Coastguard Worker  *
321*d83cc019SAndroid Build Coastguard Worker  * Bits indexes range from 0..127; fields may not cross 32-bit boundaries.
322*d83cc019SAndroid Build Coastguard Worker  */
323*d83cc019SAndroid Build Coastguard Worker static inline unsigned
gen8_bits(struct gen8_instruction * insn,unsigned high,unsigned low)324*d83cc019SAndroid Build Coastguard Worker gen8_bits(struct gen8_instruction *insn, unsigned high, unsigned low)
325*d83cc019SAndroid Build Coastguard Worker {
326*d83cc019SAndroid Build Coastguard Worker    /* We assume the field doesn't cross 32-bit boundaries. */
327*d83cc019SAndroid Build Coastguard Worker    const unsigned word = high / 32;
328*d83cc019SAndroid Build Coastguard Worker    assert(word == low / 32);
329*d83cc019SAndroid Build Coastguard Worker 
330*d83cc019SAndroid Build Coastguard Worker    high %= 32;
331*d83cc019SAndroid Build Coastguard Worker    low %= 32;
332*d83cc019SAndroid Build Coastguard Worker 
333*d83cc019SAndroid Build Coastguard Worker    const unsigned mask = (((1 << (high - low + 1)) - 1) << low);
334*d83cc019SAndroid Build Coastguard Worker 
335*d83cc019SAndroid Build Coastguard Worker    return (insn->data[word] & mask) >> low;
336*d83cc019SAndroid Build Coastguard Worker }
337*d83cc019SAndroid Build Coastguard Worker 
338*d83cc019SAndroid Build Coastguard Worker /**
339*d83cc019SAndroid Build Coastguard Worker  * Set bits in the instruction, with proper shifting and masking.
340*d83cc019SAndroid Build Coastguard Worker  *
341*d83cc019SAndroid Build Coastguard Worker  * Bits indexes range from 0..127; fields may not cross 32-bit boundaries.
342*d83cc019SAndroid Build Coastguard Worker  */
343*d83cc019SAndroid Build Coastguard Worker static inline void
gen8_set_bits(struct gen8_instruction * insn,unsigned high,unsigned low,unsigned value)344*d83cc019SAndroid Build Coastguard Worker gen8_set_bits(struct gen8_instruction *insn,
345*d83cc019SAndroid Build Coastguard Worker 	      unsigned high,
346*d83cc019SAndroid Build Coastguard Worker 	      unsigned low,
347*d83cc019SAndroid Build Coastguard Worker 	      unsigned value)
348*d83cc019SAndroid Build Coastguard Worker {
349*d83cc019SAndroid Build Coastguard Worker    const unsigned word = high / 32;
350*d83cc019SAndroid Build Coastguard Worker    assert(word == low / 32);
351*d83cc019SAndroid Build Coastguard Worker 
352*d83cc019SAndroid Build Coastguard Worker    high %= 32;
353*d83cc019SAndroid Build Coastguard Worker    low %= 32;
354*d83cc019SAndroid Build Coastguard Worker 
355*d83cc019SAndroid Build Coastguard Worker    const unsigned mask = (((1 << (high - low + 1)) - 1) << low);
356*d83cc019SAndroid Build Coastguard Worker 
357*d83cc019SAndroid Build Coastguard Worker    insn->data[word] = (insn->data[word] & ~mask) | ((value << low) & mask);
358*d83cc019SAndroid Build Coastguard Worker }
359*d83cc019SAndroid Build Coastguard Worker 
360*d83cc019SAndroid Build Coastguard Worker void gen9_set_send_extdesc(struct gen8_instruction *insn, unsigned int value);
361*d83cc019SAndroid Build Coastguard Worker 
362*d83cc019SAndroid Build Coastguard Worker #endif
363