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