1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker Copyright (C) Intel Corp. 2006. All Rights Reserved.
3*d83cc019SAndroid Build Coastguard Worker Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
4*d83cc019SAndroid Build Coastguard Worker develop this 3D driver.
5*d83cc019SAndroid Build Coastguard Worker
6*d83cc019SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining
7*d83cc019SAndroid Build Coastguard Worker a copy of this software and associated documentation files (the
8*d83cc019SAndroid Build Coastguard Worker "Software"), to deal in the Software without restriction, including
9*d83cc019SAndroid Build Coastguard Worker without limitation the rights to use, copy, modify, merge, publish,
10*d83cc019SAndroid Build Coastguard Worker distribute, sublicense, and/or sell copies of the Software, and to
11*d83cc019SAndroid Build Coastguard Worker permit persons to whom the Software is furnished to do so, subject to
12*d83cc019SAndroid Build Coastguard Worker the following conditions:
13*d83cc019SAndroid Build Coastguard Worker
14*d83cc019SAndroid Build Coastguard Worker The above copyright notice and this permission notice (including the
15*d83cc019SAndroid Build Coastguard Worker next paragraph) shall be included in all copies or substantial
16*d83cc019SAndroid Build Coastguard Worker portions of the Software.
17*d83cc019SAndroid Build Coastguard Worker
18*d83cc019SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19*d83cc019SAndroid Build Coastguard Worker EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*d83cc019SAndroid Build Coastguard Worker MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21*d83cc019SAndroid Build Coastguard Worker IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22*d83cc019SAndroid Build Coastguard Worker LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23*d83cc019SAndroid Build Coastguard Worker OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24*d83cc019SAndroid Build Coastguard Worker WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25*d83cc019SAndroid Build Coastguard Worker
26*d83cc019SAndroid Build Coastguard Worker **********************************************************************/
27*d83cc019SAndroid Build Coastguard Worker /*
28*d83cc019SAndroid Build Coastguard Worker * Authors:
29*d83cc019SAndroid Build Coastguard Worker * Keith Whitwell <[email protected]>
30*d83cc019SAndroid Build Coastguard Worker */
31*d83cc019SAndroid Build Coastguard Worker
32*d83cc019SAndroid Build Coastguard Worker /** @file brw_reg.h
33*d83cc019SAndroid Build Coastguard Worker *
34*d83cc019SAndroid Build Coastguard Worker * This file defines struct brw_reg, which is our representation for EU
35*d83cc019SAndroid Build Coastguard Worker * registers. They're not a hardware specific format, just an abstraction
36*d83cc019SAndroid Build Coastguard Worker * that intends to capture the full flexibility of the hardware registers.
37*d83cc019SAndroid Build Coastguard Worker *
38*d83cc019SAndroid Build Coastguard Worker * The brw_eu_emit.c layer's brw_set_dest/brw_set_src[01] functions encode
39*d83cc019SAndroid Build Coastguard Worker * the abstract brw_reg type into the actual hardware instruction encoding.
40*d83cc019SAndroid Build Coastguard Worker */
41*d83cc019SAndroid Build Coastguard Worker
42*d83cc019SAndroid Build Coastguard Worker #ifndef BRW_REG_H
43*d83cc019SAndroid Build Coastguard Worker #define BRW_REG_H
44*d83cc019SAndroid Build Coastguard Worker
45*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
46*d83cc019SAndroid Build Coastguard Worker #include <assert.h>
47*d83cc019SAndroid Build Coastguard Worker #include "brw_defines.h"
48*d83cc019SAndroid Build Coastguard Worker
49*d83cc019SAndroid Build Coastguard Worker #ifdef __cplusplus
50*d83cc019SAndroid Build Coastguard Worker extern "C" {
51*d83cc019SAndroid Build Coastguard Worker #endif
52*d83cc019SAndroid Build Coastguard Worker
53*d83cc019SAndroid Build Coastguard Worker /** Number of general purpose registers (VS, WM, etc) */
54*d83cc019SAndroid Build Coastguard Worker #define BRW_MAX_GRF 128
55*d83cc019SAndroid Build Coastguard Worker
56*d83cc019SAndroid Build Coastguard Worker /**
57*d83cc019SAndroid Build Coastguard Worker * First GRF used for the MRF hack.
58*d83cc019SAndroid Build Coastguard Worker *
59*d83cc019SAndroid Build Coastguard Worker * On gen7, MRFs are no longer used, and contiguous GRFs are used instead. We
60*d83cc019SAndroid Build Coastguard Worker * haven't converted our compiler to be aware of this, so it asks for MRFs and
61*d83cc019SAndroid Build Coastguard Worker * brw_eu_emit.c quietly converts them to be accesses of the top GRFs. The
62*d83cc019SAndroid Build Coastguard Worker * register allocators have to be careful of this to avoid corrupting the "MRF"s
63*d83cc019SAndroid Build Coastguard Worker * with actual GRF allocations.
64*d83cc019SAndroid Build Coastguard Worker */
65*d83cc019SAndroid Build Coastguard Worker #define GEN7_MRF_HACK_START 112
66*d83cc019SAndroid Build Coastguard Worker
67*d83cc019SAndroid Build Coastguard Worker /** Number of message register file registers */
68*d83cc019SAndroid Build Coastguard Worker #define BRW_MAX_MRF 16
69*d83cc019SAndroid Build Coastguard Worker
70*d83cc019SAndroid Build Coastguard Worker #define BRW_SWIZZLE4(a,b,c,d) (((a)<<0) | ((b)<<2) | ((c)<<4) | ((d)<<6))
71*d83cc019SAndroid Build Coastguard Worker #define BRW_GET_SWZ(swz, idx) (((swz) >> ((idx)*2)) & 0x3)
72*d83cc019SAndroid Build Coastguard Worker
73*d83cc019SAndroid Build Coastguard Worker #define BRW_SWIZZLE_NOOP BRW_SWIZZLE4(0,1,2,3)
74*d83cc019SAndroid Build Coastguard Worker #define BRW_SWIZZLE_XYZW BRW_SWIZZLE4(0,1,2,3)
75*d83cc019SAndroid Build Coastguard Worker #define BRW_SWIZZLE_XXXX BRW_SWIZZLE4(0,0,0,0)
76*d83cc019SAndroid Build Coastguard Worker #define BRW_SWIZZLE_YYYY BRW_SWIZZLE4(1,1,1,1)
77*d83cc019SAndroid Build Coastguard Worker #define BRW_SWIZZLE_ZZZZ BRW_SWIZZLE4(2,2,2,2)
78*d83cc019SAndroid Build Coastguard Worker #define BRW_SWIZZLE_WWWW BRW_SWIZZLE4(3,3,3,3)
79*d83cc019SAndroid Build Coastguard Worker #define BRW_SWIZZLE_XYXY BRW_SWIZZLE4(0,1,0,1)
80*d83cc019SAndroid Build Coastguard Worker
81*d83cc019SAndroid Build Coastguard Worker static inline bool
brw_is_single_value_swizzle(int swiz)82*d83cc019SAndroid Build Coastguard Worker brw_is_single_value_swizzle(int swiz)
83*d83cc019SAndroid Build Coastguard Worker {
84*d83cc019SAndroid Build Coastguard Worker return (swiz == BRW_SWIZZLE_XXXX ||
85*d83cc019SAndroid Build Coastguard Worker swiz == BRW_SWIZZLE_YYYY ||
86*d83cc019SAndroid Build Coastguard Worker swiz == BRW_SWIZZLE_ZZZZ ||
87*d83cc019SAndroid Build Coastguard Worker swiz == BRW_SWIZZLE_WWWW);
88*d83cc019SAndroid Build Coastguard Worker }
89*d83cc019SAndroid Build Coastguard Worker
90*d83cc019SAndroid Build Coastguard Worker #define BRW_WRITEMASK_X 0x1
91*d83cc019SAndroid Build Coastguard Worker #define BRW_WRITEMASK_Y 0x2
92*d83cc019SAndroid Build Coastguard Worker #define BRW_WRITEMASK_Z 0x4
93*d83cc019SAndroid Build Coastguard Worker #define BRW_WRITEMASK_W 0x8
94*d83cc019SAndroid Build Coastguard Worker
95*d83cc019SAndroid Build Coastguard Worker #define BRW_WRITEMASK_XY (BRW_WRITEMASK_X | BRW_WRITEMASK_Y)
96*d83cc019SAndroid Build Coastguard Worker #define BRW_WRITEMASK_XZ (BRW_WRITEMASK_X | BRW_WRITEMASK_Z)
97*d83cc019SAndroid Build Coastguard Worker #define BRW_WRITEMASK_XW (BRW_WRITEMASK_X | BRW_WRITEMASK_W)
98*d83cc019SAndroid Build Coastguard Worker #define BRW_WRITEMASK_YW (BRW_WRITEMASK_Y | BRW_WRITEMASK_W)
99*d83cc019SAndroid Build Coastguard Worker #define BRW_WRITEMASK_ZW (BRW_WRITEMASK_Z | BRW_WRITEMASK_W)
100*d83cc019SAndroid Build Coastguard Worker #define BRW_WRITEMASK_XYZ (BRW_WRITEMASK_X | BRW_WRITEMASK_Y | BRW_WRITEMASK_Z)
101*d83cc019SAndroid Build Coastguard Worker #define BRW_WRITEMASK_XYZW (BRW_WRITEMASK_X | BRW_WRITEMASK_Y | \
102*d83cc019SAndroid Build Coastguard Worker BRW_WRITEMASK_Z | BRW_WRITEMASK_W)
103*d83cc019SAndroid Build Coastguard Worker
104*d83cc019SAndroid Build Coastguard Worker #define REG_SIZE (8*4)
105*d83cc019SAndroid Build Coastguard Worker
106*d83cc019SAndroid Build Coastguard Worker /* These aren't hardware structs, just something useful for us to pass around:
107*d83cc019SAndroid Build Coastguard Worker *
108*d83cc019SAndroid Build Coastguard Worker * Align1 operation has a lot of control over input ranges. Used in
109*d83cc019SAndroid Build Coastguard Worker * WM programs to implement shaders decomposed into "channel serial"
110*d83cc019SAndroid Build Coastguard Worker * or "structure of array" form:
111*d83cc019SAndroid Build Coastguard Worker */
112*d83cc019SAndroid Build Coastguard Worker struct brw_reg {
113*d83cc019SAndroid Build Coastguard Worker unsigned type:4;
114*d83cc019SAndroid Build Coastguard Worker unsigned file:2;
115*d83cc019SAndroid Build Coastguard Worker unsigned nr:8;
116*d83cc019SAndroid Build Coastguard Worker unsigned subnr:5; /* :1 in align16 */
117*d83cc019SAndroid Build Coastguard Worker unsigned negate:1; /* source only */
118*d83cc019SAndroid Build Coastguard Worker unsigned abs:1; /* source only */
119*d83cc019SAndroid Build Coastguard Worker unsigned vstride:4; /* source only */
120*d83cc019SAndroid Build Coastguard Worker unsigned width:3; /* src only, align1 only */
121*d83cc019SAndroid Build Coastguard Worker unsigned hstride:2; /* align1 only */
122*d83cc019SAndroid Build Coastguard Worker unsigned address_mode:1; /* relative addressing, hopefully! */
123*d83cc019SAndroid Build Coastguard Worker unsigned pad0:1;
124*d83cc019SAndroid Build Coastguard Worker
125*d83cc019SAndroid Build Coastguard Worker union {
126*d83cc019SAndroid Build Coastguard Worker struct {
127*d83cc019SAndroid Build Coastguard Worker unsigned swizzle:8; /* src only, align16 only */
128*d83cc019SAndroid Build Coastguard Worker unsigned writemask:4; /* dest only, align16 only */
129*d83cc019SAndroid Build Coastguard Worker int indirect_offset:10; /* relative addressing offset */
130*d83cc019SAndroid Build Coastguard Worker unsigned pad1:10; /* two dwords total */
131*d83cc019SAndroid Build Coastguard Worker } bits;
132*d83cc019SAndroid Build Coastguard Worker
133*d83cc019SAndroid Build Coastguard Worker float f;
134*d83cc019SAndroid Build Coastguard Worker int d;
135*d83cc019SAndroid Build Coastguard Worker unsigned ud;
136*d83cc019SAndroid Build Coastguard Worker } dw1;
137*d83cc019SAndroid Build Coastguard Worker };
138*d83cc019SAndroid Build Coastguard Worker
139*d83cc019SAndroid Build Coastguard Worker
140*d83cc019SAndroid Build Coastguard Worker struct brw_indirect {
141*d83cc019SAndroid Build Coastguard Worker unsigned addr_subnr:4;
142*d83cc019SAndroid Build Coastguard Worker int addr_offset:10;
143*d83cc019SAndroid Build Coastguard Worker unsigned pad:18;
144*d83cc019SAndroid Build Coastguard Worker };
145*d83cc019SAndroid Build Coastguard Worker
146*d83cc019SAndroid Build Coastguard Worker
147*d83cc019SAndroid Build Coastguard Worker static inline int
type_sz(unsigned type)148*d83cc019SAndroid Build Coastguard Worker type_sz(unsigned type)
149*d83cc019SAndroid Build Coastguard Worker {
150*d83cc019SAndroid Build Coastguard Worker switch(type) {
151*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_UD:
152*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_D:
153*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_F:
154*d83cc019SAndroid Build Coastguard Worker return 4;
155*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_HF:
156*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_UW:
157*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_W:
158*d83cc019SAndroid Build Coastguard Worker return 2;
159*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_UB:
160*d83cc019SAndroid Build Coastguard Worker case BRW_REGISTER_TYPE_B:
161*d83cc019SAndroid Build Coastguard Worker return 1;
162*d83cc019SAndroid Build Coastguard Worker default:
163*d83cc019SAndroid Build Coastguard Worker return 0;
164*d83cc019SAndroid Build Coastguard Worker }
165*d83cc019SAndroid Build Coastguard Worker }
166*d83cc019SAndroid Build Coastguard Worker
167*d83cc019SAndroid Build Coastguard Worker /**
168*d83cc019SAndroid Build Coastguard Worker * Construct a brw_reg.
169*d83cc019SAndroid Build Coastguard Worker * \param file one of the BRW_x_REGISTER_FILE values
170*d83cc019SAndroid Build Coastguard Worker * \param nr register number/index
171*d83cc019SAndroid Build Coastguard Worker * \param subnr register sub number
172*d83cc019SAndroid Build Coastguard Worker * \param type one of BRW_REGISTER_TYPE_x
173*d83cc019SAndroid Build Coastguard Worker * \param vstride one of BRW_VERTICAL_STRIDE_x
174*d83cc019SAndroid Build Coastguard Worker * \param width one of BRW_WIDTH_x
175*d83cc019SAndroid Build Coastguard Worker * \param hstride one of BRW_HORIZONTAL_STRIDE_x
176*d83cc019SAndroid Build Coastguard Worker * \param swizzle one of BRW_SWIZZLE_x
177*d83cc019SAndroid Build Coastguard Worker * \param writemask BRW_WRITEMASK_X/Y/Z/W bitfield
178*d83cc019SAndroid Build Coastguard Worker */
179*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_reg(unsigned file,unsigned nr,unsigned subnr,unsigned type,unsigned vstride,unsigned width,unsigned hstride,unsigned swizzle,unsigned writemask)180*d83cc019SAndroid Build Coastguard Worker brw_reg(unsigned file,
181*d83cc019SAndroid Build Coastguard Worker unsigned nr,
182*d83cc019SAndroid Build Coastguard Worker unsigned subnr,
183*d83cc019SAndroid Build Coastguard Worker unsigned type,
184*d83cc019SAndroid Build Coastguard Worker unsigned vstride,
185*d83cc019SAndroid Build Coastguard Worker unsigned width,
186*d83cc019SAndroid Build Coastguard Worker unsigned hstride,
187*d83cc019SAndroid Build Coastguard Worker unsigned swizzle,
188*d83cc019SAndroid Build Coastguard Worker unsigned writemask)
189*d83cc019SAndroid Build Coastguard Worker {
190*d83cc019SAndroid Build Coastguard Worker struct brw_reg reg;
191*d83cc019SAndroid Build Coastguard Worker if (file == BRW_GENERAL_REGISTER_FILE)
192*d83cc019SAndroid Build Coastguard Worker assert(nr < BRW_MAX_GRF);
193*d83cc019SAndroid Build Coastguard Worker else if (file == BRW_MESSAGE_REGISTER_FILE)
194*d83cc019SAndroid Build Coastguard Worker assert((nr & ~(1 << 7)) < BRW_MAX_MRF);
195*d83cc019SAndroid Build Coastguard Worker else if (file == BRW_ARCHITECTURE_REGISTER_FILE)
196*d83cc019SAndroid Build Coastguard Worker assert(nr <= BRW_ARF_TIMESTAMP);
197*d83cc019SAndroid Build Coastguard Worker
198*d83cc019SAndroid Build Coastguard Worker reg.type = type;
199*d83cc019SAndroid Build Coastguard Worker reg.file = file;
200*d83cc019SAndroid Build Coastguard Worker reg.nr = nr;
201*d83cc019SAndroid Build Coastguard Worker reg.subnr = subnr * type_sz(type);
202*d83cc019SAndroid Build Coastguard Worker reg.negate = 0;
203*d83cc019SAndroid Build Coastguard Worker reg.abs = 0;
204*d83cc019SAndroid Build Coastguard Worker reg.vstride = vstride;
205*d83cc019SAndroid Build Coastguard Worker reg.width = width;
206*d83cc019SAndroid Build Coastguard Worker reg.hstride = hstride;
207*d83cc019SAndroid Build Coastguard Worker reg.address_mode = BRW_ADDRESS_DIRECT;
208*d83cc019SAndroid Build Coastguard Worker reg.pad0 = 0;
209*d83cc019SAndroid Build Coastguard Worker
210*d83cc019SAndroid Build Coastguard Worker /* Could do better: If the reg is r5.3<0;1,0>, we probably want to
211*d83cc019SAndroid Build Coastguard Worker * set swizzle and writemask to W, as the lower bits of subnr will
212*d83cc019SAndroid Build Coastguard Worker * be lost when converted to align16. This is probably too much to
213*d83cc019SAndroid Build Coastguard Worker * keep track of as you'd want it adjusted by suboffset(), etc.
214*d83cc019SAndroid Build Coastguard Worker * Perhaps fix up when converting to align16?
215*d83cc019SAndroid Build Coastguard Worker */
216*d83cc019SAndroid Build Coastguard Worker reg.dw1.bits.swizzle = swizzle;
217*d83cc019SAndroid Build Coastguard Worker reg.dw1.bits.writemask = writemask;
218*d83cc019SAndroid Build Coastguard Worker reg.dw1.bits.indirect_offset = 0;
219*d83cc019SAndroid Build Coastguard Worker reg.dw1.bits.pad1 = 0;
220*d83cc019SAndroid Build Coastguard Worker return reg;
221*d83cc019SAndroid Build Coastguard Worker }
222*d83cc019SAndroid Build Coastguard Worker
223*d83cc019SAndroid Build Coastguard Worker /** Construct float[16] register */
224*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec16_reg(unsigned file,unsigned nr,unsigned subnr)225*d83cc019SAndroid Build Coastguard Worker brw_vec16_reg(unsigned file, unsigned nr, unsigned subnr)
226*d83cc019SAndroid Build Coastguard Worker {
227*d83cc019SAndroid Build Coastguard Worker return brw_reg(file,
228*d83cc019SAndroid Build Coastguard Worker nr,
229*d83cc019SAndroid Build Coastguard Worker subnr,
230*d83cc019SAndroid Build Coastguard Worker BRW_REGISTER_TYPE_F,
231*d83cc019SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_16,
232*d83cc019SAndroid Build Coastguard Worker BRW_WIDTH_16,
233*d83cc019SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_1,
234*d83cc019SAndroid Build Coastguard Worker BRW_SWIZZLE_XYZW,
235*d83cc019SAndroid Build Coastguard Worker BRW_WRITEMASK_XYZW);
236*d83cc019SAndroid Build Coastguard Worker }
237*d83cc019SAndroid Build Coastguard Worker
238*d83cc019SAndroid Build Coastguard Worker /** Construct float[8] register */
239*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec8_reg(unsigned file,unsigned nr,unsigned subnr)240*d83cc019SAndroid Build Coastguard Worker brw_vec8_reg(unsigned file, unsigned nr, unsigned subnr)
241*d83cc019SAndroid Build Coastguard Worker {
242*d83cc019SAndroid Build Coastguard Worker return brw_reg(file,
243*d83cc019SAndroid Build Coastguard Worker nr,
244*d83cc019SAndroid Build Coastguard Worker subnr,
245*d83cc019SAndroid Build Coastguard Worker BRW_REGISTER_TYPE_F,
246*d83cc019SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_8,
247*d83cc019SAndroid Build Coastguard Worker BRW_WIDTH_8,
248*d83cc019SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_1,
249*d83cc019SAndroid Build Coastguard Worker BRW_SWIZZLE_XYZW,
250*d83cc019SAndroid Build Coastguard Worker BRW_WRITEMASK_XYZW);
251*d83cc019SAndroid Build Coastguard Worker }
252*d83cc019SAndroid Build Coastguard Worker
253*d83cc019SAndroid Build Coastguard Worker /** Construct float[4] register */
254*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec4_reg(unsigned file,unsigned nr,unsigned subnr)255*d83cc019SAndroid Build Coastguard Worker brw_vec4_reg(unsigned file, unsigned nr, unsigned subnr)
256*d83cc019SAndroid Build Coastguard Worker {
257*d83cc019SAndroid Build Coastguard Worker return brw_reg(file,
258*d83cc019SAndroid Build Coastguard Worker nr,
259*d83cc019SAndroid Build Coastguard Worker subnr,
260*d83cc019SAndroid Build Coastguard Worker BRW_REGISTER_TYPE_F,
261*d83cc019SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_4,
262*d83cc019SAndroid Build Coastguard Worker BRW_WIDTH_4,
263*d83cc019SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_1,
264*d83cc019SAndroid Build Coastguard Worker BRW_SWIZZLE_XYZW,
265*d83cc019SAndroid Build Coastguard Worker BRW_WRITEMASK_XYZW);
266*d83cc019SAndroid Build Coastguard Worker }
267*d83cc019SAndroid Build Coastguard Worker
268*d83cc019SAndroid Build Coastguard Worker /** Construct float[2] register */
269*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec2_reg(unsigned file,unsigned nr,unsigned subnr)270*d83cc019SAndroid Build Coastguard Worker brw_vec2_reg(unsigned file, unsigned nr, unsigned subnr)
271*d83cc019SAndroid Build Coastguard Worker {
272*d83cc019SAndroid Build Coastguard Worker return brw_reg(file,
273*d83cc019SAndroid Build Coastguard Worker nr,
274*d83cc019SAndroid Build Coastguard Worker subnr,
275*d83cc019SAndroid Build Coastguard Worker BRW_REGISTER_TYPE_F,
276*d83cc019SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_2,
277*d83cc019SAndroid Build Coastguard Worker BRW_WIDTH_2,
278*d83cc019SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_1,
279*d83cc019SAndroid Build Coastguard Worker BRW_SWIZZLE_XYXY,
280*d83cc019SAndroid Build Coastguard Worker BRW_WRITEMASK_XY);
281*d83cc019SAndroid Build Coastguard Worker }
282*d83cc019SAndroid Build Coastguard Worker
283*d83cc019SAndroid Build Coastguard Worker /** Construct float[1] register */
284*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec1_reg(unsigned file,unsigned nr,unsigned subnr)285*d83cc019SAndroid Build Coastguard Worker brw_vec1_reg(unsigned file, unsigned nr, unsigned subnr)
286*d83cc019SAndroid Build Coastguard Worker {
287*d83cc019SAndroid Build Coastguard Worker return brw_reg(file,
288*d83cc019SAndroid Build Coastguard Worker nr,
289*d83cc019SAndroid Build Coastguard Worker subnr,
290*d83cc019SAndroid Build Coastguard Worker BRW_REGISTER_TYPE_F,
291*d83cc019SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_0,
292*d83cc019SAndroid Build Coastguard Worker BRW_WIDTH_1,
293*d83cc019SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_0,
294*d83cc019SAndroid Build Coastguard Worker BRW_SWIZZLE_XXXX,
295*d83cc019SAndroid Build Coastguard Worker BRW_WRITEMASK_X);
296*d83cc019SAndroid Build Coastguard Worker }
297*d83cc019SAndroid Build Coastguard Worker
298*d83cc019SAndroid Build Coastguard Worker
299*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
retype(struct brw_reg reg,unsigned type)300*d83cc019SAndroid Build Coastguard Worker retype(struct brw_reg reg, unsigned type)
301*d83cc019SAndroid Build Coastguard Worker {
302*d83cc019SAndroid Build Coastguard Worker reg.type = type;
303*d83cc019SAndroid Build Coastguard Worker return reg;
304*d83cc019SAndroid Build Coastguard Worker }
305*d83cc019SAndroid Build Coastguard Worker
306*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
sechalf(struct brw_reg reg)307*d83cc019SAndroid Build Coastguard Worker sechalf(struct brw_reg reg)
308*d83cc019SAndroid Build Coastguard Worker {
309*d83cc019SAndroid Build Coastguard Worker if (reg.vstride)
310*d83cc019SAndroid Build Coastguard Worker reg.nr++;
311*d83cc019SAndroid Build Coastguard Worker return reg;
312*d83cc019SAndroid Build Coastguard Worker }
313*d83cc019SAndroid Build Coastguard Worker
314*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
suboffset(struct brw_reg reg,unsigned delta)315*d83cc019SAndroid Build Coastguard Worker suboffset(struct brw_reg reg, unsigned delta)
316*d83cc019SAndroid Build Coastguard Worker {
317*d83cc019SAndroid Build Coastguard Worker reg.subnr += delta * type_sz(reg.type);
318*d83cc019SAndroid Build Coastguard Worker return reg;
319*d83cc019SAndroid Build Coastguard Worker }
320*d83cc019SAndroid Build Coastguard Worker
321*d83cc019SAndroid Build Coastguard Worker
322*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
offset(struct brw_reg reg,unsigned delta)323*d83cc019SAndroid Build Coastguard Worker offset(struct brw_reg reg, unsigned delta)
324*d83cc019SAndroid Build Coastguard Worker {
325*d83cc019SAndroid Build Coastguard Worker reg.nr += delta;
326*d83cc019SAndroid Build Coastguard Worker return reg;
327*d83cc019SAndroid Build Coastguard Worker }
328*d83cc019SAndroid Build Coastguard Worker
329*d83cc019SAndroid Build Coastguard Worker
330*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
byte_offset(struct brw_reg reg,unsigned bytes)331*d83cc019SAndroid Build Coastguard Worker byte_offset(struct brw_reg reg, unsigned bytes)
332*d83cc019SAndroid Build Coastguard Worker {
333*d83cc019SAndroid Build Coastguard Worker unsigned newoffset = reg.nr * REG_SIZE + reg.subnr + bytes;
334*d83cc019SAndroid Build Coastguard Worker reg.nr = newoffset / REG_SIZE;
335*d83cc019SAndroid Build Coastguard Worker reg.subnr = newoffset % REG_SIZE;
336*d83cc019SAndroid Build Coastguard Worker return reg;
337*d83cc019SAndroid Build Coastguard Worker }
338*d83cc019SAndroid Build Coastguard Worker
339*d83cc019SAndroid Build Coastguard Worker
340*d83cc019SAndroid Build Coastguard Worker /** Construct unsigned word[16] register */
341*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_uw16_reg(unsigned file,unsigned nr,unsigned subnr)342*d83cc019SAndroid Build Coastguard Worker brw_uw16_reg(unsigned file, unsigned nr, unsigned subnr)
343*d83cc019SAndroid Build Coastguard Worker {
344*d83cc019SAndroid Build Coastguard Worker return suboffset(retype(brw_vec16_reg(file, nr, 0), BRW_REGISTER_TYPE_UW), subnr);
345*d83cc019SAndroid Build Coastguard Worker }
346*d83cc019SAndroid Build Coastguard Worker
347*d83cc019SAndroid Build Coastguard Worker /** Construct unsigned word[8] register */
348*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_uw8_reg(unsigned file,unsigned nr,unsigned subnr)349*d83cc019SAndroid Build Coastguard Worker brw_uw8_reg(unsigned file, unsigned nr, unsigned subnr)
350*d83cc019SAndroid Build Coastguard Worker {
351*d83cc019SAndroid Build Coastguard Worker return suboffset(retype(brw_vec8_reg(file, nr, 0), BRW_REGISTER_TYPE_UW), subnr);
352*d83cc019SAndroid Build Coastguard Worker }
353*d83cc019SAndroid Build Coastguard Worker
354*d83cc019SAndroid Build Coastguard Worker /** Construct unsigned word[1] register */
355*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_uw1_reg(unsigned file,unsigned nr,unsigned subnr)356*d83cc019SAndroid Build Coastguard Worker brw_uw1_reg(unsigned file, unsigned nr, unsigned subnr)
357*d83cc019SAndroid Build Coastguard Worker {
358*d83cc019SAndroid Build Coastguard Worker return suboffset(retype(brw_vec1_reg(file, nr, 0), BRW_REGISTER_TYPE_UW), subnr);
359*d83cc019SAndroid Build Coastguard Worker }
360*d83cc019SAndroid Build Coastguard Worker
361*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_reg(unsigned type)362*d83cc019SAndroid Build Coastguard Worker brw_imm_reg(unsigned type)
363*d83cc019SAndroid Build Coastguard Worker {
364*d83cc019SAndroid Build Coastguard Worker return brw_reg(BRW_IMMEDIATE_VALUE,
365*d83cc019SAndroid Build Coastguard Worker 0,
366*d83cc019SAndroid Build Coastguard Worker 0,
367*d83cc019SAndroid Build Coastguard Worker type,
368*d83cc019SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_0,
369*d83cc019SAndroid Build Coastguard Worker BRW_WIDTH_1,
370*d83cc019SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_0,
371*d83cc019SAndroid Build Coastguard Worker 0,
372*d83cc019SAndroid Build Coastguard Worker 0);
373*d83cc019SAndroid Build Coastguard Worker }
374*d83cc019SAndroid Build Coastguard Worker
375*d83cc019SAndroid Build Coastguard Worker /** Construct float immediate register */
376*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_f(float f)377*d83cc019SAndroid Build Coastguard Worker brw_imm_f(float f)
378*d83cc019SAndroid Build Coastguard Worker {
379*d83cc019SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_F);
380*d83cc019SAndroid Build Coastguard Worker imm.dw1.f = f;
381*d83cc019SAndroid Build Coastguard Worker return imm;
382*d83cc019SAndroid Build Coastguard Worker }
383*d83cc019SAndroid Build Coastguard Worker
384*d83cc019SAndroid Build Coastguard Worker /** Construct integer immediate register */
385*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_d(int d)386*d83cc019SAndroid Build Coastguard Worker brw_imm_d(int d)
387*d83cc019SAndroid Build Coastguard Worker {
388*d83cc019SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_D);
389*d83cc019SAndroid Build Coastguard Worker imm.dw1.d = d;
390*d83cc019SAndroid Build Coastguard Worker return imm;
391*d83cc019SAndroid Build Coastguard Worker }
392*d83cc019SAndroid Build Coastguard Worker
393*d83cc019SAndroid Build Coastguard Worker /** Construct uint immediate register */
394*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_ud(unsigned ud)395*d83cc019SAndroid Build Coastguard Worker brw_imm_ud(unsigned ud)
396*d83cc019SAndroid Build Coastguard Worker {
397*d83cc019SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_UD);
398*d83cc019SAndroid Build Coastguard Worker imm.dw1.ud = ud;
399*d83cc019SAndroid Build Coastguard Worker return imm;
400*d83cc019SAndroid Build Coastguard Worker }
401*d83cc019SAndroid Build Coastguard Worker
402*d83cc019SAndroid Build Coastguard Worker /** Construct ushort immediate register */
403*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_uw(uint16_t uw)404*d83cc019SAndroid Build Coastguard Worker brw_imm_uw(uint16_t uw)
405*d83cc019SAndroid Build Coastguard Worker {
406*d83cc019SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_UW);
407*d83cc019SAndroid Build Coastguard Worker imm.dw1.ud = uw | (uw << 16);
408*d83cc019SAndroid Build Coastguard Worker return imm;
409*d83cc019SAndroid Build Coastguard Worker }
410*d83cc019SAndroid Build Coastguard Worker
411*d83cc019SAndroid Build Coastguard Worker /** Construct short immediate register */
412*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_w(int16_t w)413*d83cc019SAndroid Build Coastguard Worker brw_imm_w(int16_t w)
414*d83cc019SAndroid Build Coastguard Worker {
415*d83cc019SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_W);
416*d83cc019SAndroid Build Coastguard Worker imm.dw1.d = w | (w << 16);
417*d83cc019SAndroid Build Coastguard Worker return imm;
418*d83cc019SAndroid Build Coastguard Worker }
419*d83cc019SAndroid Build Coastguard Worker
420*d83cc019SAndroid Build Coastguard Worker /* brw_imm_b and brw_imm_ub aren't supported by hardware - the type
421*d83cc019SAndroid Build Coastguard Worker * numbers alias with _V and _VF below:
422*d83cc019SAndroid Build Coastguard Worker */
423*d83cc019SAndroid Build Coastguard Worker
424*d83cc019SAndroid Build Coastguard Worker /** Construct vector of eight signed half-byte values */
425*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_v(unsigned v)426*d83cc019SAndroid Build Coastguard Worker brw_imm_v(unsigned v)
427*d83cc019SAndroid Build Coastguard Worker {
428*d83cc019SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_V);
429*d83cc019SAndroid Build Coastguard Worker imm.vstride = BRW_VERTICAL_STRIDE_0;
430*d83cc019SAndroid Build Coastguard Worker imm.width = BRW_WIDTH_8;
431*d83cc019SAndroid Build Coastguard Worker imm.hstride = BRW_HORIZONTAL_STRIDE_1;
432*d83cc019SAndroid Build Coastguard Worker imm.dw1.ud = v;
433*d83cc019SAndroid Build Coastguard Worker return imm;
434*d83cc019SAndroid Build Coastguard Worker }
435*d83cc019SAndroid Build Coastguard Worker
436*d83cc019SAndroid Build Coastguard Worker /** Construct vector of four 8-bit float values */
437*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_vf(unsigned v)438*d83cc019SAndroid Build Coastguard Worker brw_imm_vf(unsigned v)
439*d83cc019SAndroid Build Coastguard Worker {
440*d83cc019SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_VF);
441*d83cc019SAndroid Build Coastguard Worker imm.vstride = BRW_VERTICAL_STRIDE_0;
442*d83cc019SAndroid Build Coastguard Worker imm.width = BRW_WIDTH_4;
443*d83cc019SAndroid Build Coastguard Worker imm.hstride = BRW_HORIZONTAL_STRIDE_1;
444*d83cc019SAndroid Build Coastguard Worker imm.dw1.ud = v;
445*d83cc019SAndroid Build Coastguard Worker return imm;
446*d83cc019SAndroid Build Coastguard Worker }
447*d83cc019SAndroid Build Coastguard Worker
448*d83cc019SAndroid Build Coastguard Worker #define VF_ZERO 0x0
449*d83cc019SAndroid Build Coastguard Worker #define VF_ONE 0x30
450*d83cc019SAndroid Build Coastguard Worker #define VF_NEG (1<<7)
451*d83cc019SAndroid Build Coastguard Worker
452*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_vf4(unsigned v0,unsigned v1,unsigned v2,unsigned v3)453*d83cc019SAndroid Build Coastguard Worker brw_imm_vf4(unsigned v0, unsigned v1, unsigned v2, unsigned v3)
454*d83cc019SAndroid Build Coastguard Worker {
455*d83cc019SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_VF);
456*d83cc019SAndroid Build Coastguard Worker imm.vstride = BRW_VERTICAL_STRIDE_0;
457*d83cc019SAndroid Build Coastguard Worker imm.width = BRW_WIDTH_4;
458*d83cc019SAndroid Build Coastguard Worker imm.hstride = BRW_HORIZONTAL_STRIDE_1;
459*d83cc019SAndroid Build Coastguard Worker imm.dw1.ud = ((v0 << 0) | (v1 << 8) | (v2 << 16) | (v3 << 24));
460*d83cc019SAndroid Build Coastguard Worker return imm;
461*d83cc019SAndroid Build Coastguard Worker }
462*d83cc019SAndroid Build Coastguard Worker
463*d83cc019SAndroid Build Coastguard Worker
464*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_address(struct brw_reg reg)465*d83cc019SAndroid Build Coastguard Worker brw_address(struct brw_reg reg)
466*d83cc019SAndroid Build Coastguard Worker {
467*d83cc019SAndroid Build Coastguard Worker return brw_imm_uw(reg.nr * REG_SIZE + reg.subnr);
468*d83cc019SAndroid Build Coastguard Worker }
469*d83cc019SAndroid Build Coastguard Worker
470*d83cc019SAndroid Build Coastguard Worker /** Construct float[1] general-purpose register */
471*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec1_grf(unsigned nr,unsigned subnr)472*d83cc019SAndroid Build Coastguard Worker brw_vec1_grf(unsigned nr, unsigned subnr)
473*d83cc019SAndroid Build Coastguard Worker {
474*d83cc019SAndroid Build Coastguard Worker return brw_vec1_reg(BRW_GENERAL_REGISTER_FILE, nr, subnr);
475*d83cc019SAndroid Build Coastguard Worker }
476*d83cc019SAndroid Build Coastguard Worker
477*d83cc019SAndroid Build Coastguard Worker /** Construct float[2] general-purpose register */
478*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec2_grf(unsigned nr,unsigned subnr)479*d83cc019SAndroid Build Coastguard Worker brw_vec2_grf(unsigned nr, unsigned subnr)
480*d83cc019SAndroid Build Coastguard Worker {
481*d83cc019SAndroid Build Coastguard Worker return brw_vec2_reg(BRW_GENERAL_REGISTER_FILE, nr, subnr);
482*d83cc019SAndroid Build Coastguard Worker }
483*d83cc019SAndroid Build Coastguard Worker
484*d83cc019SAndroid Build Coastguard Worker /** Construct float[4] general-purpose register */
485*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec4_grf(unsigned nr,unsigned subnr)486*d83cc019SAndroid Build Coastguard Worker brw_vec4_grf(unsigned nr, unsigned subnr)
487*d83cc019SAndroid Build Coastguard Worker {
488*d83cc019SAndroid Build Coastguard Worker return brw_vec4_reg(BRW_GENERAL_REGISTER_FILE, nr, subnr);
489*d83cc019SAndroid Build Coastguard Worker }
490*d83cc019SAndroid Build Coastguard Worker
491*d83cc019SAndroid Build Coastguard Worker /** Construct float[8] general-purpose register */
492*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec8_grf(unsigned nr,unsigned subnr)493*d83cc019SAndroid Build Coastguard Worker brw_vec8_grf(unsigned nr, unsigned subnr)
494*d83cc019SAndroid Build Coastguard Worker {
495*d83cc019SAndroid Build Coastguard Worker return brw_vec8_reg(BRW_GENERAL_REGISTER_FILE, nr, subnr);
496*d83cc019SAndroid Build Coastguard Worker }
497*d83cc019SAndroid Build Coastguard Worker
498*d83cc019SAndroid Build Coastguard Worker
499*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_uw8_grf(unsigned nr,unsigned subnr)500*d83cc019SAndroid Build Coastguard Worker brw_uw8_grf(unsigned nr, unsigned subnr)
501*d83cc019SAndroid Build Coastguard Worker {
502*d83cc019SAndroid Build Coastguard Worker return brw_uw8_reg(BRW_GENERAL_REGISTER_FILE, nr, subnr);
503*d83cc019SAndroid Build Coastguard Worker }
504*d83cc019SAndroid Build Coastguard Worker
505*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_uw16_grf(unsigned nr,unsigned subnr)506*d83cc019SAndroid Build Coastguard Worker brw_uw16_grf(unsigned nr, unsigned subnr)
507*d83cc019SAndroid Build Coastguard Worker {
508*d83cc019SAndroid Build Coastguard Worker return brw_uw16_reg(BRW_GENERAL_REGISTER_FILE, nr, subnr);
509*d83cc019SAndroid Build Coastguard Worker }
510*d83cc019SAndroid Build Coastguard Worker
511*d83cc019SAndroid Build Coastguard Worker
512*d83cc019SAndroid Build Coastguard Worker /** Construct null register (usually used for setting condition codes) */
513*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_null_reg(void)514*d83cc019SAndroid Build Coastguard Worker brw_null_reg(void)
515*d83cc019SAndroid Build Coastguard Worker {
516*d83cc019SAndroid Build Coastguard Worker return brw_vec8_reg(BRW_ARCHITECTURE_REGISTER_FILE, BRW_ARF_NULL, 0);
517*d83cc019SAndroid Build Coastguard Worker }
518*d83cc019SAndroid Build Coastguard Worker
519*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_address_reg(unsigned subnr)520*d83cc019SAndroid Build Coastguard Worker brw_address_reg(unsigned subnr)
521*d83cc019SAndroid Build Coastguard Worker {
522*d83cc019SAndroid Build Coastguard Worker return brw_uw1_reg(BRW_ARCHITECTURE_REGISTER_FILE, BRW_ARF_ADDRESS, subnr);
523*d83cc019SAndroid Build Coastguard Worker }
524*d83cc019SAndroid Build Coastguard Worker
525*d83cc019SAndroid Build Coastguard Worker /* If/else instructions break in align16 mode if writemask & swizzle
526*d83cc019SAndroid Build Coastguard Worker * aren't xyzw. This goes against the convention for other scalar
527*d83cc019SAndroid Build Coastguard Worker * regs:
528*d83cc019SAndroid Build Coastguard Worker */
529*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_ip_reg(void)530*d83cc019SAndroid Build Coastguard Worker brw_ip_reg(void)
531*d83cc019SAndroid Build Coastguard Worker {
532*d83cc019SAndroid Build Coastguard Worker return brw_reg(BRW_ARCHITECTURE_REGISTER_FILE,
533*d83cc019SAndroid Build Coastguard Worker BRW_ARF_IP,
534*d83cc019SAndroid Build Coastguard Worker 0,
535*d83cc019SAndroid Build Coastguard Worker BRW_REGISTER_TYPE_UD,
536*d83cc019SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_4, /* ? */
537*d83cc019SAndroid Build Coastguard Worker BRW_WIDTH_1,
538*d83cc019SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_0,
539*d83cc019SAndroid Build Coastguard Worker BRW_SWIZZLE_XYZW, /* NOTE! */
540*d83cc019SAndroid Build Coastguard Worker BRW_WRITEMASK_XYZW); /* NOTE! */
541*d83cc019SAndroid Build Coastguard Worker }
542*d83cc019SAndroid Build Coastguard Worker
543*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_acc_reg(void)544*d83cc019SAndroid Build Coastguard Worker brw_acc_reg(void)
545*d83cc019SAndroid Build Coastguard Worker {
546*d83cc019SAndroid Build Coastguard Worker return brw_vec8_reg(BRW_ARCHITECTURE_REGISTER_FILE, BRW_ARF_ACCUMULATOR, 0);
547*d83cc019SAndroid Build Coastguard Worker }
548*d83cc019SAndroid Build Coastguard Worker
549*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_notification_1_reg(void)550*d83cc019SAndroid Build Coastguard Worker brw_notification_1_reg(void)
551*d83cc019SAndroid Build Coastguard Worker {
552*d83cc019SAndroid Build Coastguard Worker
553*d83cc019SAndroid Build Coastguard Worker return brw_reg(BRW_ARCHITECTURE_REGISTER_FILE,
554*d83cc019SAndroid Build Coastguard Worker BRW_ARF_NOTIFICATION_COUNT,
555*d83cc019SAndroid Build Coastguard Worker 1,
556*d83cc019SAndroid Build Coastguard Worker BRW_REGISTER_TYPE_UD,
557*d83cc019SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_0,
558*d83cc019SAndroid Build Coastguard Worker BRW_WIDTH_1,
559*d83cc019SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_0,
560*d83cc019SAndroid Build Coastguard Worker BRW_SWIZZLE_XXXX,
561*d83cc019SAndroid Build Coastguard Worker BRW_WRITEMASK_X);
562*d83cc019SAndroid Build Coastguard Worker }
563*d83cc019SAndroid Build Coastguard Worker
564*d83cc019SAndroid Build Coastguard Worker
565*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_flag_reg(int reg,int subreg)566*d83cc019SAndroid Build Coastguard Worker brw_flag_reg(int reg, int subreg)
567*d83cc019SAndroid Build Coastguard Worker {
568*d83cc019SAndroid Build Coastguard Worker return brw_uw1_reg(BRW_ARCHITECTURE_REGISTER_FILE,
569*d83cc019SAndroid Build Coastguard Worker BRW_ARF_FLAG + reg, subreg);
570*d83cc019SAndroid Build Coastguard Worker }
571*d83cc019SAndroid Build Coastguard Worker
572*d83cc019SAndroid Build Coastguard Worker
573*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_mask_reg(unsigned subnr)574*d83cc019SAndroid Build Coastguard Worker brw_mask_reg(unsigned subnr)
575*d83cc019SAndroid Build Coastguard Worker {
576*d83cc019SAndroid Build Coastguard Worker return brw_uw1_reg(BRW_ARCHITECTURE_REGISTER_FILE, BRW_ARF_MASK, subnr);
577*d83cc019SAndroid Build Coastguard Worker }
578*d83cc019SAndroid Build Coastguard Worker
579*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_message_reg(unsigned nr)580*d83cc019SAndroid Build Coastguard Worker brw_message_reg(unsigned nr)
581*d83cc019SAndroid Build Coastguard Worker {
582*d83cc019SAndroid Build Coastguard Worker assert((nr & ~(1 << 7)) < BRW_MAX_MRF);
583*d83cc019SAndroid Build Coastguard Worker return brw_vec8_reg(BRW_MESSAGE_REGISTER_FILE, nr, 0);
584*d83cc019SAndroid Build Coastguard Worker }
585*d83cc019SAndroid Build Coastguard Worker
586*d83cc019SAndroid Build Coastguard Worker
587*d83cc019SAndroid Build Coastguard Worker /* This is almost always called with a numeric constant argument, so
588*d83cc019SAndroid Build Coastguard Worker * make things easy to evaluate at compile time:
589*d83cc019SAndroid Build Coastguard Worker */
cvt(unsigned val)590*d83cc019SAndroid Build Coastguard Worker static inline unsigned cvt(unsigned val)
591*d83cc019SAndroid Build Coastguard Worker {
592*d83cc019SAndroid Build Coastguard Worker switch (val) {
593*d83cc019SAndroid Build Coastguard Worker case 0: return 0;
594*d83cc019SAndroid Build Coastguard Worker case 1: return 1;
595*d83cc019SAndroid Build Coastguard Worker case 2: return 2;
596*d83cc019SAndroid Build Coastguard Worker case 4: return 3;
597*d83cc019SAndroid Build Coastguard Worker case 8: return 4;
598*d83cc019SAndroid Build Coastguard Worker case 16: return 5;
599*d83cc019SAndroid Build Coastguard Worker case 32: return 6;
600*d83cc019SAndroid Build Coastguard Worker }
601*d83cc019SAndroid Build Coastguard Worker return 0;
602*d83cc019SAndroid Build Coastguard Worker }
603*d83cc019SAndroid Build Coastguard Worker
604*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
stride(struct brw_reg reg,unsigned vstride,unsigned width,unsigned hstride)605*d83cc019SAndroid Build Coastguard Worker stride(struct brw_reg reg, unsigned vstride, unsigned width, unsigned hstride)
606*d83cc019SAndroid Build Coastguard Worker {
607*d83cc019SAndroid Build Coastguard Worker reg.vstride = cvt(vstride);
608*d83cc019SAndroid Build Coastguard Worker reg.width = cvt(width) - 1;
609*d83cc019SAndroid Build Coastguard Worker reg.hstride = cvt(hstride);
610*d83cc019SAndroid Build Coastguard Worker return reg;
611*d83cc019SAndroid Build Coastguard Worker }
612*d83cc019SAndroid Build Coastguard Worker
613*d83cc019SAndroid Build Coastguard Worker
614*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
vec16(struct brw_reg reg)615*d83cc019SAndroid Build Coastguard Worker vec16(struct brw_reg reg)
616*d83cc019SAndroid Build Coastguard Worker {
617*d83cc019SAndroid Build Coastguard Worker return stride(reg, 16,16,1);
618*d83cc019SAndroid Build Coastguard Worker }
619*d83cc019SAndroid Build Coastguard Worker
620*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
vec8(struct brw_reg reg)621*d83cc019SAndroid Build Coastguard Worker vec8(struct brw_reg reg)
622*d83cc019SAndroid Build Coastguard Worker {
623*d83cc019SAndroid Build Coastguard Worker return stride(reg, 8,8,1);
624*d83cc019SAndroid Build Coastguard Worker }
625*d83cc019SAndroid Build Coastguard Worker
626*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
vec4(struct brw_reg reg)627*d83cc019SAndroid Build Coastguard Worker vec4(struct brw_reg reg)
628*d83cc019SAndroid Build Coastguard Worker {
629*d83cc019SAndroid Build Coastguard Worker return stride(reg, 4,4,1);
630*d83cc019SAndroid Build Coastguard Worker }
631*d83cc019SAndroid Build Coastguard Worker
632*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
vec2(struct brw_reg reg)633*d83cc019SAndroid Build Coastguard Worker vec2(struct brw_reg reg)
634*d83cc019SAndroid Build Coastguard Worker {
635*d83cc019SAndroid Build Coastguard Worker return stride(reg, 2,2,1);
636*d83cc019SAndroid Build Coastguard Worker }
637*d83cc019SAndroid Build Coastguard Worker
638*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
vec1(struct brw_reg reg)639*d83cc019SAndroid Build Coastguard Worker vec1(struct brw_reg reg)
640*d83cc019SAndroid Build Coastguard Worker {
641*d83cc019SAndroid Build Coastguard Worker return stride(reg, 0,1,0);
642*d83cc019SAndroid Build Coastguard Worker }
643*d83cc019SAndroid Build Coastguard Worker
644*d83cc019SAndroid Build Coastguard Worker
645*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
get_element(struct brw_reg reg,unsigned elt)646*d83cc019SAndroid Build Coastguard Worker get_element(struct brw_reg reg, unsigned elt)
647*d83cc019SAndroid Build Coastguard Worker {
648*d83cc019SAndroid Build Coastguard Worker return vec1(suboffset(reg, elt));
649*d83cc019SAndroid Build Coastguard Worker }
650*d83cc019SAndroid Build Coastguard Worker
651*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
get_element_ud(struct brw_reg reg,unsigned elt)652*d83cc019SAndroid Build Coastguard Worker get_element_ud(struct brw_reg reg, unsigned elt)
653*d83cc019SAndroid Build Coastguard Worker {
654*d83cc019SAndroid Build Coastguard Worker return vec1(suboffset(retype(reg, BRW_REGISTER_TYPE_UD), elt));
655*d83cc019SAndroid Build Coastguard Worker }
656*d83cc019SAndroid Build Coastguard Worker
657*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
get_element_d(struct brw_reg reg,unsigned elt)658*d83cc019SAndroid Build Coastguard Worker get_element_d(struct brw_reg reg, unsigned elt)
659*d83cc019SAndroid Build Coastguard Worker {
660*d83cc019SAndroid Build Coastguard Worker return vec1(suboffset(retype(reg, BRW_REGISTER_TYPE_D), elt));
661*d83cc019SAndroid Build Coastguard Worker }
662*d83cc019SAndroid Build Coastguard Worker
663*d83cc019SAndroid Build Coastguard Worker
664*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_swizzle(struct brw_reg reg,unsigned x,unsigned y,unsigned z,unsigned w)665*d83cc019SAndroid Build Coastguard Worker brw_swizzle(struct brw_reg reg, unsigned x, unsigned y, unsigned z, unsigned w)
666*d83cc019SAndroid Build Coastguard Worker {
667*d83cc019SAndroid Build Coastguard Worker assert(reg.file != BRW_IMMEDIATE_VALUE);
668*d83cc019SAndroid Build Coastguard Worker
669*d83cc019SAndroid Build Coastguard Worker reg.dw1.bits.swizzle = BRW_SWIZZLE4(BRW_GET_SWZ(reg.dw1.bits.swizzle, x),
670*d83cc019SAndroid Build Coastguard Worker BRW_GET_SWZ(reg.dw1.bits.swizzle, y),
671*d83cc019SAndroid Build Coastguard Worker BRW_GET_SWZ(reg.dw1.bits.swizzle, z),
672*d83cc019SAndroid Build Coastguard Worker BRW_GET_SWZ(reg.dw1.bits.swizzle, w));
673*d83cc019SAndroid Build Coastguard Worker return reg;
674*d83cc019SAndroid Build Coastguard Worker }
675*d83cc019SAndroid Build Coastguard Worker
676*d83cc019SAndroid Build Coastguard Worker
677*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_swizzle1(struct brw_reg reg,unsigned x)678*d83cc019SAndroid Build Coastguard Worker brw_swizzle1(struct brw_reg reg, unsigned x)
679*d83cc019SAndroid Build Coastguard Worker {
680*d83cc019SAndroid Build Coastguard Worker return brw_swizzle(reg, x, x, x, x);
681*d83cc019SAndroid Build Coastguard Worker }
682*d83cc019SAndroid Build Coastguard Worker
683*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_writemask(struct brw_reg reg,unsigned mask)684*d83cc019SAndroid Build Coastguard Worker brw_writemask(struct brw_reg reg, unsigned mask)
685*d83cc019SAndroid Build Coastguard Worker {
686*d83cc019SAndroid Build Coastguard Worker assert(reg.file != BRW_IMMEDIATE_VALUE);
687*d83cc019SAndroid Build Coastguard Worker reg.dw1.bits.writemask &= mask;
688*d83cc019SAndroid Build Coastguard Worker return reg;
689*d83cc019SAndroid Build Coastguard Worker }
690*d83cc019SAndroid Build Coastguard Worker
691*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_set_writemask(struct brw_reg reg,unsigned mask)692*d83cc019SAndroid Build Coastguard Worker brw_set_writemask(struct brw_reg reg, unsigned mask)
693*d83cc019SAndroid Build Coastguard Worker {
694*d83cc019SAndroid Build Coastguard Worker assert(reg.file != BRW_IMMEDIATE_VALUE);
695*d83cc019SAndroid Build Coastguard Worker reg.dw1.bits.writemask = mask;
696*d83cc019SAndroid Build Coastguard Worker return reg;
697*d83cc019SAndroid Build Coastguard Worker }
698*d83cc019SAndroid Build Coastguard Worker
699*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
negate(struct brw_reg reg)700*d83cc019SAndroid Build Coastguard Worker negate(struct brw_reg reg)
701*d83cc019SAndroid Build Coastguard Worker {
702*d83cc019SAndroid Build Coastguard Worker reg.negate ^= 1;
703*d83cc019SAndroid Build Coastguard Worker return reg;
704*d83cc019SAndroid Build Coastguard Worker }
705*d83cc019SAndroid Build Coastguard Worker
706*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_abs(struct brw_reg reg)707*d83cc019SAndroid Build Coastguard Worker brw_abs(struct brw_reg reg)
708*d83cc019SAndroid Build Coastguard Worker {
709*d83cc019SAndroid Build Coastguard Worker reg.abs = 1;
710*d83cc019SAndroid Build Coastguard Worker reg.negate = 0;
711*d83cc019SAndroid Build Coastguard Worker return reg;
712*d83cc019SAndroid Build Coastguard Worker }
713*d83cc019SAndroid Build Coastguard Worker
714*d83cc019SAndroid Build Coastguard Worker /************************************************************************/
715*d83cc019SAndroid Build Coastguard Worker
716*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec4_indirect(unsigned subnr,int offset)717*d83cc019SAndroid Build Coastguard Worker brw_vec4_indirect(unsigned subnr, int offset)
718*d83cc019SAndroid Build Coastguard Worker {
719*d83cc019SAndroid Build Coastguard Worker struct brw_reg reg = brw_vec4_grf(0, 0);
720*d83cc019SAndroid Build Coastguard Worker reg.subnr = subnr;
721*d83cc019SAndroid Build Coastguard Worker reg.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER;
722*d83cc019SAndroid Build Coastguard Worker reg.dw1.bits.indirect_offset = offset;
723*d83cc019SAndroid Build Coastguard Worker return reg;
724*d83cc019SAndroid Build Coastguard Worker }
725*d83cc019SAndroid Build Coastguard Worker
726*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec1_indirect(unsigned subnr,int offset)727*d83cc019SAndroid Build Coastguard Worker brw_vec1_indirect(unsigned subnr, int offset)
728*d83cc019SAndroid Build Coastguard Worker {
729*d83cc019SAndroid Build Coastguard Worker struct brw_reg reg = brw_vec1_grf(0, 0);
730*d83cc019SAndroid Build Coastguard Worker reg.subnr = subnr;
731*d83cc019SAndroid Build Coastguard Worker reg.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER;
732*d83cc019SAndroid Build Coastguard Worker reg.dw1.bits.indirect_offset = offset;
733*d83cc019SAndroid Build Coastguard Worker return reg;
734*d83cc019SAndroid Build Coastguard Worker }
735*d83cc019SAndroid Build Coastguard Worker
736*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
deref_4f(struct brw_indirect ptr,int offset)737*d83cc019SAndroid Build Coastguard Worker deref_4f(struct brw_indirect ptr, int offset)
738*d83cc019SAndroid Build Coastguard Worker {
739*d83cc019SAndroid Build Coastguard Worker return brw_vec4_indirect(ptr.addr_subnr, ptr.addr_offset + offset);
740*d83cc019SAndroid Build Coastguard Worker }
741*d83cc019SAndroid Build Coastguard Worker
742*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
deref_1f(struct brw_indirect ptr,int offset)743*d83cc019SAndroid Build Coastguard Worker deref_1f(struct brw_indirect ptr, int offset)
744*d83cc019SAndroid Build Coastguard Worker {
745*d83cc019SAndroid Build Coastguard Worker return brw_vec1_indirect(ptr.addr_subnr, ptr.addr_offset + offset);
746*d83cc019SAndroid Build Coastguard Worker }
747*d83cc019SAndroid Build Coastguard Worker
748*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
deref_4b(struct brw_indirect ptr,int offset)749*d83cc019SAndroid Build Coastguard Worker deref_4b(struct brw_indirect ptr, int offset)
750*d83cc019SAndroid Build Coastguard Worker {
751*d83cc019SAndroid Build Coastguard Worker return retype(deref_4f(ptr, offset), BRW_REGISTER_TYPE_B);
752*d83cc019SAndroid Build Coastguard Worker }
753*d83cc019SAndroid Build Coastguard Worker
754*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
deref_1uw(struct brw_indirect ptr,int offset)755*d83cc019SAndroid Build Coastguard Worker deref_1uw(struct brw_indirect ptr, int offset)
756*d83cc019SAndroid Build Coastguard Worker {
757*d83cc019SAndroid Build Coastguard Worker return retype(deref_1f(ptr, offset), BRW_REGISTER_TYPE_UW);
758*d83cc019SAndroid Build Coastguard Worker }
759*d83cc019SAndroid Build Coastguard Worker
760*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
deref_1d(struct brw_indirect ptr,int offset)761*d83cc019SAndroid Build Coastguard Worker deref_1d(struct brw_indirect ptr, int offset)
762*d83cc019SAndroid Build Coastguard Worker {
763*d83cc019SAndroid Build Coastguard Worker return retype(deref_1f(ptr, offset), BRW_REGISTER_TYPE_D);
764*d83cc019SAndroid Build Coastguard Worker }
765*d83cc019SAndroid Build Coastguard Worker
766*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
deref_1ud(struct brw_indirect ptr,int offset)767*d83cc019SAndroid Build Coastguard Worker deref_1ud(struct brw_indirect ptr, int offset)
768*d83cc019SAndroid Build Coastguard Worker {
769*d83cc019SAndroid Build Coastguard Worker return retype(deref_1f(ptr, offset), BRW_REGISTER_TYPE_UD);
770*d83cc019SAndroid Build Coastguard Worker }
771*d83cc019SAndroid Build Coastguard Worker
772*d83cc019SAndroid Build Coastguard Worker static inline struct brw_reg
get_addr_reg(struct brw_indirect ptr)773*d83cc019SAndroid Build Coastguard Worker get_addr_reg(struct brw_indirect ptr)
774*d83cc019SAndroid Build Coastguard Worker {
775*d83cc019SAndroid Build Coastguard Worker return brw_address_reg(ptr.addr_subnr);
776*d83cc019SAndroid Build Coastguard Worker }
777*d83cc019SAndroid Build Coastguard Worker
778*d83cc019SAndroid Build Coastguard Worker static inline struct brw_indirect
brw_indirect_offset(struct brw_indirect ptr,int offset)779*d83cc019SAndroid Build Coastguard Worker brw_indirect_offset(struct brw_indirect ptr, int offset)
780*d83cc019SAndroid Build Coastguard Worker {
781*d83cc019SAndroid Build Coastguard Worker ptr.addr_offset += offset;
782*d83cc019SAndroid Build Coastguard Worker return ptr;
783*d83cc019SAndroid Build Coastguard Worker }
784*d83cc019SAndroid Build Coastguard Worker
785*d83cc019SAndroid Build Coastguard Worker static inline struct brw_indirect
brw_indirect(unsigned addr_subnr,int offset)786*d83cc019SAndroid Build Coastguard Worker brw_indirect(unsigned addr_subnr, int offset)
787*d83cc019SAndroid Build Coastguard Worker {
788*d83cc019SAndroid Build Coastguard Worker struct brw_indirect ptr;
789*d83cc019SAndroid Build Coastguard Worker ptr.addr_subnr = addr_subnr;
790*d83cc019SAndroid Build Coastguard Worker ptr.addr_offset = offset;
791*d83cc019SAndroid Build Coastguard Worker ptr.pad = 0;
792*d83cc019SAndroid Build Coastguard Worker return ptr;
793*d83cc019SAndroid Build Coastguard Worker }
794*d83cc019SAndroid Build Coastguard Worker
795*d83cc019SAndroid Build Coastguard Worker /** Do two brw_regs refer to the same register? */
796*d83cc019SAndroid Build Coastguard Worker static inline bool
brw_same_reg(struct brw_reg r1,struct brw_reg r2)797*d83cc019SAndroid Build Coastguard Worker brw_same_reg(struct brw_reg r1, struct brw_reg r2)
798*d83cc019SAndroid Build Coastguard Worker {
799*d83cc019SAndroid Build Coastguard Worker return r1.file == r2.file && r1.nr == r2.nr;
800*d83cc019SAndroid Build Coastguard Worker }
801*d83cc019SAndroid Build Coastguard Worker
802*d83cc019SAndroid Build Coastguard Worker void brw_print_reg(struct brw_reg reg);
803*d83cc019SAndroid Build Coastguard Worker
804*d83cc019SAndroid Build Coastguard Worker #ifdef __cplusplus
805*d83cc019SAndroid Build Coastguard Worker }
806*d83cc019SAndroid Build Coastguard Worker #endif
807*d83cc019SAndroid Build Coastguard Worker
808*d83cc019SAndroid Build Coastguard Worker #endif
809