1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker Copyright (C) Intel Corp. 2006. All Rights Reserved.
3*61046927SAndroid Build Coastguard Worker Intel funded Tungsten Graphics to
4*61046927SAndroid Build Coastguard Worker develop this 3D driver.
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining
7*61046927SAndroid Build Coastguard Worker a copy of this software and associated documentation files (the
8*61046927SAndroid Build Coastguard Worker "Software"), to deal in the Software without restriction, including
9*61046927SAndroid Build Coastguard Worker without limitation the rights to use, copy, modify, merge, publish,
10*61046927SAndroid Build Coastguard Worker distribute, sublicense, and/or sell copies of the Software, and to
11*61046927SAndroid Build Coastguard Worker permit persons to whom the Software is furnished to do so, subject to
12*61046927SAndroid Build Coastguard Worker the following conditions:
13*61046927SAndroid Build Coastguard Worker
14*61046927SAndroid Build Coastguard Worker The above copyright notice and this permission notice (including the
15*61046927SAndroid Build Coastguard Worker next paragraph) shall be included in all copies or substantial
16*61046927SAndroid Build Coastguard Worker portions of the Software.
17*61046927SAndroid Build Coastguard Worker
18*61046927SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19*61046927SAndroid Build Coastguard Worker EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*61046927SAndroid Build Coastguard Worker MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21*61046927SAndroid Build Coastguard Worker IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22*61046927SAndroid Build Coastguard Worker LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23*61046927SAndroid Build Coastguard Worker OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24*61046927SAndroid Build Coastguard Worker WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker **********************************************************************/
27*61046927SAndroid Build Coastguard Worker /*
28*61046927SAndroid Build Coastguard Worker * Authors:
29*61046927SAndroid Build Coastguard Worker * Keith Whitwell <[email protected]>
30*61046927SAndroid Build Coastguard Worker */
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker /** @file
33*61046927SAndroid Build Coastguard Worker *
34*61046927SAndroid Build Coastguard Worker * This file defines struct brw_reg, which is our representation for EU
35*61046927SAndroid Build Coastguard Worker * registers. They're not a hardware specific format, just an abstraction
36*61046927SAndroid Build Coastguard Worker * that intends to capture the full flexibility of the hardware registers.
37*61046927SAndroid Build Coastguard Worker *
38*61046927SAndroid Build Coastguard Worker * The brw_eu_emit.c layer's brw_set_dest/brw_set_src[01] functions encode
39*61046927SAndroid Build Coastguard Worker * the abstract brw_reg type into the actual hardware instruction encoding.
40*61046927SAndroid Build Coastguard Worker */
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker #ifndef BRW_REG_H
43*61046927SAndroid Build Coastguard Worker #define BRW_REG_H
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
46*61046927SAndroid Build Coastguard Worker #include "util/compiler.h"
47*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
48*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
49*61046927SAndroid Build Coastguard Worker #include "util/rounding.h"
50*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
51*61046927SAndroid Build Coastguard Worker #include "brw_eu_defines.h"
52*61046927SAndroid Build Coastguard Worker #include "brw_reg_type.h"
53*61046927SAndroid Build Coastguard Worker
54*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
55*61046927SAndroid Build Coastguard Worker extern "C" {
56*61046927SAndroid Build Coastguard Worker #endif
57*61046927SAndroid Build Coastguard Worker
58*61046927SAndroid Build Coastguard Worker struct intel_device_info;
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker /** Size of general purpose register space in REG_SIZE units */
61*61046927SAndroid Build Coastguard Worker #define BRW_MAX_GRF 128
62*61046927SAndroid Build Coastguard Worker #define XE2_MAX_GRF 256
63*61046927SAndroid Build Coastguard Worker
64*61046927SAndroid Build Coastguard Worker /**
65*61046927SAndroid Build Coastguard Worker * BRW hardware swizzles.
66*61046927SAndroid Build Coastguard Worker * Only defines XYZW to ensure it can be contained in 2 bits
67*61046927SAndroid Build Coastguard Worker */
68*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_X 0
69*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_Y 1
70*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_Z 2
71*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_W 3
72*61046927SAndroid Build Coastguard Worker
73*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE4(a,b,c,d) (((a)<<0) | ((b)<<2) | ((c)<<4) | ((d)<<6))
74*61046927SAndroid Build Coastguard Worker #define BRW_GET_SWZ(swz, idx) (((swz) >> ((idx)*2)) & 0x3)
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_NOOP BRW_SWIZZLE4(0,1,2,3)
77*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_XYZW BRW_SWIZZLE4(0,1,2,3)
78*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_XXXX BRW_SWIZZLE4(0,0,0,0)
79*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_YYYY BRW_SWIZZLE4(1,1,1,1)
80*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_ZZZZ BRW_SWIZZLE4(2,2,2,2)
81*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_WWWW BRW_SWIZZLE4(3,3,3,3)
82*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_XYXY BRW_SWIZZLE4(0,1,0,1)
83*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_YXYX BRW_SWIZZLE4(1,0,1,0)
84*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_XZXZ BRW_SWIZZLE4(0,2,0,2)
85*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_YZXW BRW_SWIZZLE4(1,2,0,3)
86*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_YWYW BRW_SWIZZLE4(1,3,1,3)
87*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_ZXYW BRW_SWIZZLE4(2,0,1,3)
88*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_ZWZW BRW_SWIZZLE4(2,3,2,3)
89*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_WZWZ BRW_SWIZZLE4(3,2,3,2)
90*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_WZYX BRW_SWIZZLE4(3,2,1,0)
91*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_XXZZ BRW_SWIZZLE4(0,0,2,2)
92*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_YYWW BRW_SWIZZLE4(1,1,3,3)
93*61046927SAndroid Build Coastguard Worker #define BRW_SWIZZLE_YXWZ BRW_SWIZZLE4(1,0,3,2)
94*61046927SAndroid Build Coastguard Worker
95*61046927SAndroid Build Coastguard Worker #define BRW_SWZ_COMP_INPUT(comp) (BRW_SWIZZLE_XYZW >> ((comp)*2))
96*61046927SAndroid Build Coastguard Worker #define BRW_SWZ_COMP_OUTPUT(comp) (BRW_SWIZZLE_XYZW << ((comp)*2))
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker static inline bool
brw_is_single_value_swizzle(unsigned swiz)99*61046927SAndroid Build Coastguard Worker brw_is_single_value_swizzle(unsigned swiz)
100*61046927SAndroid Build Coastguard Worker {
101*61046927SAndroid Build Coastguard Worker return (swiz == BRW_SWIZZLE_XXXX ||
102*61046927SAndroid Build Coastguard Worker swiz == BRW_SWIZZLE_YYYY ||
103*61046927SAndroid Build Coastguard Worker swiz == BRW_SWIZZLE_ZZZZ ||
104*61046927SAndroid Build Coastguard Worker swiz == BRW_SWIZZLE_WWWW);
105*61046927SAndroid Build Coastguard Worker }
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard Worker /**
108*61046927SAndroid Build Coastguard Worker * Compute the swizzle obtained from the application of \p swz0 on the result
109*61046927SAndroid Build Coastguard Worker * of \p swz1. The argument ordering is expected to match function
110*61046927SAndroid Build Coastguard Worker * composition.
111*61046927SAndroid Build Coastguard Worker */
112*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_compose_swizzle(unsigned swz0,unsigned swz1)113*61046927SAndroid Build Coastguard Worker brw_compose_swizzle(unsigned swz0, unsigned swz1)
114*61046927SAndroid Build Coastguard Worker {
115*61046927SAndroid Build Coastguard Worker return BRW_SWIZZLE4(
116*61046927SAndroid Build Coastguard Worker BRW_GET_SWZ(swz1, BRW_GET_SWZ(swz0, 0)),
117*61046927SAndroid Build Coastguard Worker BRW_GET_SWZ(swz1, BRW_GET_SWZ(swz0, 1)),
118*61046927SAndroid Build Coastguard Worker BRW_GET_SWZ(swz1, BRW_GET_SWZ(swz0, 2)),
119*61046927SAndroid Build Coastguard Worker BRW_GET_SWZ(swz1, BRW_GET_SWZ(swz0, 3)));
120*61046927SAndroid Build Coastguard Worker }
121*61046927SAndroid Build Coastguard Worker
122*61046927SAndroid Build Coastguard Worker /**
123*61046927SAndroid Build Coastguard Worker * Construct an identity swizzle for the set of enabled channels given by \p
124*61046927SAndroid Build Coastguard Worker * mask. The result will only reference channels enabled in the provided \p
125*61046927SAndroid Build Coastguard Worker * mask, assuming that \p mask is non-zero. The constructed swizzle will
126*61046927SAndroid Build Coastguard Worker * satisfy the property that for any instruction OP and any mask:
127*61046927SAndroid Build Coastguard Worker *
128*61046927SAndroid Build Coastguard Worker * brw_OP(p, brw_writemask(dst, mask),
129*61046927SAndroid Build Coastguard Worker * brw_swizzle(src, brw_swizzle_for_mask(mask)));
130*61046927SAndroid Build Coastguard Worker *
131*61046927SAndroid Build Coastguard Worker * will be equivalent to the same instruction without swizzle:
132*61046927SAndroid Build Coastguard Worker *
133*61046927SAndroid Build Coastguard Worker * brw_OP(p, brw_writemask(dst, mask), src);
134*61046927SAndroid Build Coastguard Worker */
135*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_swizzle_for_mask(unsigned mask)136*61046927SAndroid Build Coastguard Worker brw_swizzle_for_mask(unsigned mask)
137*61046927SAndroid Build Coastguard Worker {
138*61046927SAndroid Build Coastguard Worker unsigned last = (mask ? ffs(mask) - 1 : 0);
139*61046927SAndroid Build Coastguard Worker unsigned swz[4];
140*61046927SAndroid Build Coastguard Worker
141*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < 4; i++)
142*61046927SAndroid Build Coastguard Worker last = swz[i] = (mask & (1 << i) ? i : last);
143*61046927SAndroid Build Coastguard Worker
144*61046927SAndroid Build Coastguard Worker return BRW_SWIZZLE4(swz[0], swz[1], swz[2], swz[3]);
145*61046927SAndroid Build Coastguard Worker }
146*61046927SAndroid Build Coastguard Worker
147*61046927SAndroid Build Coastguard Worker uint32_t brw_swizzle_immediate(enum brw_reg_type type, uint32_t x, unsigned swz);
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker #define REG_SIZE (8*4)
150*61046927SAndroid Build Coastguard Worker
151*61046927SAndroid Build Coastguard Worker /* These aren't hardware structs, just something useful for us to pass around:
152*61046927SAndroid Build Coastguard Worker *
153*61046927SAndroid Build Coastguard Worker * Align1 operation has a lot of control over input ranges. Used in
154*61046927SAndroid Build Coastguard Worker * WM programs to implement shaders decomposed into "channel serial"
155*61046927SAndroid Build Coastguard Worker * or "structure of array" form:
156*61046927SAndroid Build Coastguard Worker */
157*61046927SAndroid Build Coastguard Worker typedef struct brw_reg {
158*61046927SAndroid Build Coastguard Worker union {
159*61046927SAndroid Build Coastguard Worker struct {
160*61046927SAndroid Build Coastguard Worker enum brw_reg_type type:5;
161*61046927SAndroid Build Coastguard Worker enum brw_reg_file file:3;
162*61046927SAndroid Build Coastguard Worker unsigned negate:1; /* source only */
163*61046927SAndroid Build Coastguard Worker unsigned abs:1; /* source only */
164*61046927SAndroid Build Coastguard Worker unsigned address_mode:1; /* relative addressing, hopefully! */
165*61046927SAndroid Build Coastguard Worker unsigned pad0:16;
166*61046927SAndroid Build Coastguard Worker unsigned subnr:5; /* :1 in align16 */
167*61046927SAndroid Build Coastguard Worker };
168*61046927SAndroid Build Coastguard Worker uint32_t bits;
169*61046927SAndroid Build Coastguard Worker };
170*61046927SAndroid Build Coastguard Worker
171*61046927SAndroid Build Coastguard Worker /** Offset from the start of the virtual register in bytes. */
172*61046927SAndroid Build Coastguard Worker uint16_t offset;
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard Worker /** Register region horizontal stride of virtual registers */
175*61046927SAndroid Build Coastguard Worker uint8_t stride;
176*61046927SAndroid Build Coastguard Worker
177*61046927SAndroid Build Coastguard Worker union {
178*61046927SAndroid Build Coastguard Worker struct {
179*61046927SAndroid Build Coastguard Worker unsigned nr;
180*61046927SAndroid Build Coastguard Worker unsigned swizzle:8; /* src only, align16 only */
181*61046927SAndroid Build Coastguard Worker unsigned writemask:4; /* dest only, align16 only */
182*61046927SAndroid Build Coastguard Worker int indirect_offset:10; /* relative addressing offset */
183*61046927SAndroid Build Coastguard Worker unsigned vstride:4; /* source only */
184*61046927SAndroid Build Coastguard Worker unsigned width:3; /* src only, align1 only */
185*61046927SAndroid Build Coastguard Worker unsigned hstride:2; /* align1 only */
186*61046927SAndroid Build Coastguard Worker unsigned pad1:1;
187*61046927SAndroid Build Coastguard Worker };
188*61046927SAndroid Build Coastguard Worker
189*61046927SAndroid Build Coastguard Worker double df;
190*61046927SAndroid Build Coastguard Worker uint64_t u64;
191*61046927SAndroid Build Coastguard Worker int64_t d64;
192*61046927SAndroid Build Coastguard Worker float f;
193*61046927SAndroid Build Coastguard Worker int d;
194*61046927SAndroid Build Coastguard Worker unsigned ud;
195*61046927SAndroid Build Coastguard Worker };
196*61046927SAndroid Build Coastguard Worker
197*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
198*61046927SAndroid Build Coastguard Worker /* TODO: Remove this constructor to make this type a POD. Need
199*61046927SAndroid Build Coastguard Worker * to make sure that rest of compiler doesn't rely on type or
200*61046927SAndroid Build Coastguard Worker * stride of BAD_FILE registers.
201*61046927SAndroid Build Coastguard Worker */
brw_regbrw_reg202*61046927SAndroid Build Coastguard Worker brw_reg() {
203*61046927SAndroid Build Coastguard Worker memset((void*)this, 0, sizeof(*this));
204*61046927SAndroid Build Coastguard Worker this->type = BRW_TYPE_UD;
205*61046927SAndroid Build Coastguard Worker this->stride = 1;
206*61046927SAndroid Build Coastguard Worker this->file = BAD_FILE;
207*61046927SAndroid Build Coastguard Worker }
208*61046927SAndroid Build Coastguard Worker
209*61046927SAndroid Build Coastguard Worker bool equals(const brw_reg &r) const;
210*61046927SAndroid Build Coastguard Worker bool negative_equals(const brw_reg &r) const;
211*61046927SAndroid Build Coastguard Worker bool is_contiguous() const;
212*61046927SAndroid Build Coastguard Worker
213*61046927SAndroid Build Coastguard Worker bool is_zero() const;
214*61046927SAndroid Build Coastguard Worker bool is_one() const;
215*61046927SAndroid Build Coastguard Worker bool is_negative_one() const;
216*61046927SAndroid Build Coastguard Worker bool is_null() const;
217*61046927SAndroid Build Coastguard Worker bool is_accumulator() const;
218*61046927SAndroid Build Coastguard Worker
219*61046927SAndroid Build Coastguard Worker /**
220*61046927SAndroid Build Coastguard Worker * Return the size in bytes of a single logical component of the
221*61046927SAndroid Build Coastguard Worker * register assuming the given execution width.
222*61046927SAndroid Build Coastguard Worker */
223*61046927SAndroid Build Coastguard Worker unsigned component_size(unsigned width) const;
224*61046927SAndroid Build Coastguard Worker #endif /* __cplusplus */
225*61046927SAndroid Build Coastguard Worker } brw_reg;
226*61046927SAndroid Build Coastguard Worker
227*61046927SAndroid Build Coastguard Worker static inline unsigned
phys_nr(const struct intel_device_info * devinfo,const struct brw_reg reg)228*61046927SAndroid Build Coastguard Worker phys_nr(const struct intel_device_info *devinfo, const struct brw_reg reg)
229*61046927SAndroid Build Coastguard Worker {
230*61046927SAndroid Build Coastguard Worker if (devinfo->ver >= 20) {
231*61046927SAndroid Build Coastguard Worker if (reg.file == FIXED_GRF)
232*61046927SAndroid Build Coastguard Worker return reg.nr / 2;
233*61046927SAndroid Build Coastguard Worker else if (reg.file == ARF &&
234*61046927SAndroid Build Coastguard Worker reg.nr >= BRW_ARF_ACCUMULATOR &&
235*61046927SAndroid Build Coastguard Worker reg.nr < BRW_ARF_FLAG)
236*61046927SAndroid Build Coastguard Worker return BRW_ARF_ACCUMULATOR + (reg.nr - BRW_ARF_ACCUMULATOR) / 2;
237*61046927SAndroid Build Coastguard Worker else
238*61046927SAndroid Build Coastguard Worker return reg.nr;
239*61046927SAndroid Build Coastguard Worker } else {
240*61046927SAndroid Build Coastguard Worker return reg.nr;
241*61046927SAndroid Build Coastguard Worker }
242*61046927SAndroid Build Coastguard Worker }
243*61046927SAndroid Build Coastguard Worker
244*61046927SAndroid Build Coastguard Worker static inline unsigned
phys_subnr(const struct intel_device_info * devinfo,const struct brw_reg reg)245*61046927SAndroid Build Coastguard Worker phys_subnr(const struct intel_device_info *devinfo, const struct brw_reg reg)
246*61046927SAndroid Build Coastguard Worker {
247*61046927SAndroid Build Coastguard Worker if (devinfo->ver >= 20) {
248*61046927SAndroid Build Coastguard Worker if (reg.file == FIXED_GRF ||
249*61046927SAndroid Build Coastguard Worker (reg.file == ARF &&
250*61046927SAndroid Build Coastguard Worker reg.nr >= BRW_ARF_ACCUMULATOR &&
251*61046927SAndroid Build Coastguard Worker reg.nr < BRW_ARF_FLAG))
252*61046927SAndroid Build Coastguard Worker return (reg.nr & 1) * REG_SIZE + reg.subnr;
253*61046927SAndroid Build Coastguard Worker else
254*61046927SAndroid Build Coastguard Worker return reg.subnr;
255*61046927SAndroid Build Coastguard Worker } else {
256*61046927SAndroid Build Coastguard Worker return reg.subnr;
257*61046927SAndroid Build Coastguard Worker }
258*61046927SAndroid Build Coastguard Worker }
259*61046927SAndroid Build Coastguard Worker
260*61046927SAndroid Build Coastguard Worker static inline bool
brw_regs_equal(const struct brw_reg * a,const struct brw_reg * b)261*61046927SAndroid Build Coastguard Worker brw_regs_equal(const struct brw_reg *a, const struct brw_reg *b)
262*61046927SAndroid Build Coastguard Worker {
263*61046927SAndroid Build Coastguard Worker return a->bits == b->bits &&
264*61046927SAndroid Build Coastguard Worker a->u64 == b->u64 &&
265*61046927SAndroid Build Coastguard Worker a->offset == b->offset &&
266*61046927SAndroid Build Coastguard Worker a->stride == b->stride;
267*61046927SAndroid Build Coastguard Worker }
268*61046927SAndroid Build Coastguard Worker
269*61046927SAndroid Build Coastguard Worker static inline bool
brw_regs_negative_equal(const struct brw_reg * a,const struct brw_reg * b)270*61046927SAndroid Build Coastguard Worker brw_regs_negative_equal(const struct brw_reg *a, const struct brw_reg *b)
271*61046927SAndroid Build Coastguard Worker {
272*61046927SAndroid Build Coastguard Worker if (a->file == IMM) {
273*61046927SAndroid Build Coastguard Worker if (a->bits != b->bits)
274*61046927SAndroid Build Coastguard Worker return false;
275*61046927SAndroid Build Coastguard Worker
276*61046927SAndroid Build Coastguard Worker switch ((enum brw_reg_type) a->type) {
277*61046927SAndroid Build Coastguard Worker case BRW_TYPE_UQ:
278*61046927SAndroid Build Coastguard Worker case BRW_TYPE_Q:
279*61046927SAndroid Build Coastguard Worker return a->d64 == -b->d64;
280*61046927SAndroid Build Coastguard Worker case BRW_TYPE_DF:
281*61046927SAndroid Build Coastguard Worker return a->df == -b->df;
282*61046927SAndroid Build Coastguard Worker case BRW_TYPE_UD:
283*61046927SAndroid Build Coastguard Worker case BRW_TYPE_D:
284*61046927SAndroid Build Coastguard Worker return a->d == -b->d;
285*61046927SAndroid Build Coastguard Worker case BRW_TYPE_F:
286*61046927SAndroid Build Coastguard Worker return a->f == -b->f;
287*61046927SAndroid Build Coastguard Worker case BRW_TYPE_VF:
288*61046927SAndroid Build Coastguard Worker /* It is tempting to treat 0 as a negation of 0 (and -0 as a negation
289*61046927SAndroid Build Coastguard Worker * of -0). There are occasions where 0 or -0 is used and the exact
290*61046927SAndroid Build Coastguard Worker * bit pattern is desired. At the very least, changing this to allow
291*61046927SAndroid Build Coastguard Worker * 0 as a negation of 0 causes some fp64 tests to fail on IVB.
292*61046927SAndroid Build Coastguard Worker */
293*61046927SAndroid Build Coastguard Worker return a->ud == (b->ud ^ 0x80808080);
294*61046927SAndroid Build Coastguard Worker case BRW_TYPE_UW:
295*61046927SAndroid Build Coastguard Worker case BRW_TYPE_W:
296*61046927SAndroid Build Coastguard Worker case BRW_TYPE_UV:
297*61046927SAndroid Build Coastguard Worker case BRW_TYPE_V:
298*61046927SAndroid Build Coastguard Worker case BRW_TYPE_HF:
299*61046927SAndroid Build Coastguard Worker /* FINISHME: Implement support for these types once there is
300*61046927SAndroid Build Coastguard Worker * something in the compiler that can generate them. Until then,
301*61046927SAndroid Build Coastguard Worker * they cannot be tested.
302*61046927SAndroid Build Coastguard Worker */
303*61046927SAndroid Build Coastguard Worker return false;
304*61046927SAndroid Build Coastguard Worker case BRW_TYPE_UB:
305*61046927SAndroid Build Coastguard Worker case BRW_TYPE_B:
306*61046927SAndroid Build Coastguard Worker default:
307*61046927SAndroid Build Coastguard Worker unreachable("not reached");
308*61046927SAndroid Build Coastguard Worker }
309*61046927SAndroid Build Coastguard Worker } else {
310*61046927SAndroid Build Coastguard Worker struct brw_reg tmp = *a;
311*61046927SAndroid Build Coastguard Worker
312*61046927SAndroid Build Coastguard Worker tmp.negate = !tmp.negate;
313*61046927SAndroid Build Coastguard Worker
314*61046927SAndroid Build Coastguard Worker return brw_regs_equal(&tmp, b);
315*61046927SAndroid Build Coastguard Worker }
316*61046927SAndroid Build Coastguard Worker }
317*61046927SAndroid Build Coastguard Worker
318*61046927SAndroid Build Coastguard Worker static inline enum brw_reg_type
get_exec_type(const enum brw_reg_type type)319*61046927SAndroid Build Coastguard Worker get_exec_type(const enum brw_reg_type type)
320*61046927SAndroid Build Coastguard Worker {
321*61046927SAndroid Build Coastguard Worker switch (type) {
322*61046927SAndroid Build Coastguard Worker case BRW_TYPE_B:
323*61046927SAndroid Build Coastguard Worker case BRW_TYPE_V:
324*61046927SAndroid Build Coastguard Worker return BRW_TYPE_W;
325*61046927SAndroid Build Coastguard Worker case BRW_TYPE_UB:
326*61046927SAndroid Build Coastguard Worker case BRW_TYPE_UV:
327*61046927SAndroid Build Coastguard Worker return BRW_TYPE_UW;
328*61046927SAndroid Build Coastguard Worker case BRW_TYPE_VF:
329*61046927SAndroid Build Coastguard Worker return BRW_TYPE_F;
330*61046927SAndroid Build Coastguard Worker default:
331*61046927SAndroid Build Coastguard Worker return type;
332*61046927SAndroid Build Coastguard Worker }
333*61046927SAndroid Build Coastguard Worker }
334*61046927SAndroid Build Coastguard Worker
335*61046927SAndroid Build Coastguard Worker /**
336*61046927SAndroid Build Coastguard Worker * Return an integer type of the requested size and signedness.
337*61046927SAndroid Build Coastguard Worker */
338*61046927SAndroid Build Coastguard Worker static inline enum brw_reg_type
brw_int_type(unsigned sz,bool is_signed)339*61046927SAndroid Build Coastguard Worker brw_int_type(unsigned sz, bool is_signed)
340*61046927SAndroid Build Coastguard Worker {
341*61046927SAndroid Build Coastguard Worker switch (sz) {
342*61046927SAndroid Build Coastguard Worker case 1:
343*61046927SAndroid Build Coastguard Worker return (is_signed ? BRW_TYPE_B : BRW_TYPE_UB);
344*61046927SAndroid Build Coastguard Worker case 2:
345*61046927SAndroid Build Coastguard Worker return (is_signed ? BRW_TYPE_W : BRW_TYPE_UW);
346*61046927SAndroid Build Coastguard Worker case 4:
347*61046927SAndroid Build Coastguard Worker return (is_signed ? BRW_TYPE_D : BRW_TYPE_UD);
348*61046927SAndroid Build Coastguard Worker case 8:
349*61046927SAndroid Build Coastguard Worker return (is_signed ? BRW_TYPE_Q : BRW_TYPE_UQ);
350*61046927SAndroid Build Coastguard Worker default:
351*61046927SAndroid Build Coastguard Worker unreachable("Not reached.");
352*61046927SAndroid Build Coastguard Worker }
353*61046927SAndroid Build Coastguard Worker }
354*61046927SAndroid Build Coastguard Worker
355*61046927SAndroid Build Coastguard Worker /**
356*61046927SAndroid Build Coastguard Worker * Construct a brw_reg.
357*61046927SAndroid Build Coastguard Worker * \param file one of the BRW_x_REGISTER_FILE values
358*61046927SAndroid Build Coastguard Worker * \param nr register number/index
359*61046927SAndroid Build Coastguard Worker * \param subnr register sub number
360*61046927SAndroid Build Coastguard Worker * \param negate register negate modifier
361*61046927SAndroid Build Coastguard Worker * \param abs register abs modifier
362*61046927SAndroid Build Coastguard Worker * \param type one of BRW_TYPE_x
363*61046927SAndroid Build Coastguard Worker * \param vstride one of BRW_VERTICAL_STRIDE_x
364*61046927SAndroid Build Coastguard Worker * \param width one of BRW_WIDTH_x
365*61046927SAndroid Build Coastguard Worker * \param hstride one of BRW_HORIZONTAL_STRIDE_x
366*61046927SAndroid Build Coastguard Worker * \param swizzle one of BRW_SWIZZLE_x
367*61046927SAndroid Build Coastguard Worker * \param writemask WRITEMASK_X/Y/Z/W bitfield
368*61046927SAndroid Build Coastguard Worker */
369*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_make_reg(enum brw_reg_file file,unsigned nr,unsigned subnr,unsigned negate,unsigned abs,enum brw_reg_type type,unsigned vstride,unsigned width,unsigned hstride,unsigned swizzle,unsigned writemask)370*61046927SAndroid Build Coastguard Worker brw_make_reg(enum brw_reg_file file,
371*61046927SAndroid Build Coastguard Worker unsigned nr,
372*61046927SAndroid Build Coastguard Worker unsigned subnr,
373*61046927SAndroid Build Coastguard Worker unsigned negate,
374*61046927SAndroid Build Coastguard Worker unsigned abs,
375*61046927SAndroid Build Coastguard Worker enum brw_reg_type type,
376*61046927SAndroid Build Coastguard Worker unsigned vstride,
377*61046927SAndroid Build Coastguard Worker unsigned width,
378*61046927SAndroid Build Coastguard Worker unsigned hstride,
379*61046927SAndroid Build Coastguard Worker unsigned swizzle,
380*61046927SAndroid Build Coastguard Worker unsigned writemask)
381*61046927SAndroid Build Coastguard Worker {
382*61046927SAndroid Build Coastguard Worker struct brw_reg reg;
383*61046927SAndroid Build Coastguard Worker if (file == FIXED_GRF)
384*61046927SAndroid Build Coastguard Worker assert(nr < XE2_MAX_GRF);
385*61046927SAndroid Build Coastguard Worker else if (file == ARF)
386*61046927SAndroid Build Coastguard Worker assert(nr <= BRW_ARF_TIMESTAMP);
387*61046927SAndroid Build Coastguard Worker
388*61046927SAndroid Build Coastguard Worker reg.type = type;
389*61046927SAndroid Build Coastguard Worker reg.file = file;
390*61046927SAndroid Build Coastguard Worker reg.negate = negate;
391*61046927SAndroid Build Coastguard Worker reg.abs = abs;
392*61046927SAndroid Build Coastguard Worker reg.address_mode = BRW_ADDRESS_DIRECT;
393*61046927SAndroid Build Coastguard Worker reg.pad0 = 0;
394*61046927SAndroid Build Coastguard Worker reg.subnr = subnr * brw_type_size_bytes(type);
395*61046927SAndroid Build Coastguard Worker reg.nr = nr;
396*61046927SAndroid Build Coastguard Worker
397*61046927SAndroid Build Coastguard Worker /* Could do better: If the reg is r5.3<0;1,0>, we probably want to
398*61046927SAndroid Build Coastguard Worker * set swizzle and writemask to W, as the lower bits of subnr will
399*61046927SAndroid Build Coastguard Worker * be lost when converted to align16. This is probably too much to
400*61046927SAndroid Build Coastguard Worker * keep track of as you'd want it adjusted by suboffset(), etc.
401*61046927SAndroid Build Coastguard Worker * Perhaps fix up when converting to align16?
402*61046927SAndroid Build Coastguard Worker */
403*61046927SAndroid Build Coastguard Worker reg.swizzle = swizzle;
404*61046927SAndroid Build Coastguard Worker reg.writemask = writemask;
405*61046927SAndroid Build Coastguard Worker reg.indirect_offset = 0;
406*61046927SAndroid Build Coastguard Worker reg.vstride = vstride;
407*61046927SAndroid Build Coastguard Worker reg.width = width;
408*61046927SAndroid Build Coastguard Worker reg.hstride = hstride;
409*61046927SAndroid Build Coastguard Worker reg.pad1 = 0;
410*61046927SAndroid Build Coastguard Worker
411*61046927SAndroid Build Coastguard Worker reg.offset = 0;
412*61046927SAndroid Build Coastguard Worker reg.stride = 1;
413*61046927SAndroid Build Coastguard Worker if (file == IMM &&
414*61046927SAndroid Build Coastguard Worker type != BRW_TYPE_V &&
415*61046927SAndroid Build Coastguard Worker type != BRW_TYPE_UV &&
416*61046927SAndroid Build Coastguard Worker type != BRW_TYPE_VF) {
417*61046927SAndroid Build Coastguard Worker reg.stride = 0;
418*61046927SAndroid Build Coastguard Worker }
419*61046927SAndroid Build Coastguard Worker
420*61046927SAndroid Build Coastguard Worker return reg;
421*61046927SAndroid Build Coastguard Worker }
422*61046927SAndroid Build Coastguard Worker
423*61046927SAndroid Build Coastguard Worker /** Construct float[16] register */
424*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec16_reg(enum brw_reg_file file,unsigned nr,unsigned subnr)425*61046927SAndroid Build Coastguard Worker brw_vec16_reg(enum brw_reg_file file, unsigned nr, unsigned subnr)
426*61046927SAndroid Build Coastguard Worker {
427*61046927SAndroid Build Coastguard Worker return brw_make_reg(file,
428*61046927SAndroid Build Coastguard Worker nr,
429*61046927SAndroid Build Coastguard Worker subnr,
430*61046927SAndroid Build Coastguard Worker 0,
431*61046927SAndroid Build Coastguard Worker 0,
432*61046927SAndroid Build Coastguard Worker BRW_TYPE_F,
433*61046927SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_16,
434*61046927SAndroid Build Coastguard Worker BRW_WIDTH_16,
435*61046927SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_1,
436*61046927SAndroid Build Coastguard Worker BRW_SWIZZLE_XYZW,
437*61046927SAndroid Build Coastguard Worker WRITEMASK_XYZW);
438*61046927SAndroid Build Coastguard Worker }
439*61046927SAndroid Build Coastguard Worker
440*61046927SAndroid Build Coastguard Worker /** Construct float[8] register */
441*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec8_reg(enum brw_reg_file file,unsigned nr,unsigned subnr)442*61046927SAndroid Build Coastguard Worker brw_vec8_reg(enum brw_reg_file file, unsigned nr, unsigned subnr)
443*61046927SAndroid Build Coastguard Worker {
444*61046927SAndroid Build Coastguard Worker return brw_make_reg(file,
445*61046927SAndroid Build Coastguard Worker nr,
446*61046927SAndroid Build Coastguard Worker subnr,
447*61046927SAndroid Build Coastguard Worker 0,
448*61046927SAndroid Build Coastguard Worker 0,
449*61046927SAndroid Build Coastguard Worker BRW_TYPE_F,
450*61046927SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_8,
451*61046927SAndroid Build Coastguard Worker BRW_WIDTH_8,
452*61046927SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_1,
453*61046927SAndroid Build Coastguard Worker BRW_SWIZZLE_XYZW,
454*61046927SAndroid Build Coastguard Worker WRITEMASK_XYZW);
455*61046927SAndroid Build Coastguard Worker }
456*61046927SAndroid Build Coastguard Worker
457*61046927SAndroid Build Coastguard Worker /** Construct float[4] register */
458*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec4_reg(enum brw_reg_file file,unsigned nr,unsigned subnr)459*61046927SAndroid Build Coastguard Worker brw_vec4_reg(enum brw_reg_file file, unsigned nr, unsigned subnr)
460*61046927SAndroid Build Coastguard Worker {
461*61046927SAndroid Build Coastguard Worker return brw_make_reg(file,
462*61046927SAndroid Build Coastguard Worker nr,
463*61046927SAndroid Build Coastguard Worker subnr,
464*61046927SAndroid Build Coastguard Worker 0,
465*61046927SAndroid Build Coastguard Worker 0,
466*61046927SAndroid Build Coastguard Worker BRW_TYPE_F,
467*61046927SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_4,
468*61046927SAndroid Build Coastguard Worker BRW_WIDTH_4,
469*61046927SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_1,
470*61046927SAndroid Build Coastguard Worker BRW_SWIZZLE_XYZW,
471*61046927SAndroid Build Coastguard Worker WRITEMASK_XYZW);
472*61046927SAndroid Build Coastguard Worker }
473*61046927SAndroid Build Coastguard Worker
474*61046927SAndroid Build Coastguard Worker /** Construct float[2] register */
475*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec2_reg(enum brw_reg_file file,unsigned nr,unsigned subnr)476*61046927SAndroid Build Coastguard Worker brw_vec2_reg(enum brw_reg_file file, unsigned nr, unsigned subnr)
477*61046927SAndroid Build Coastguard Worker {
478*61046927SAndroid Build Coastguard Worker return brw_make_reg(file,
479*61046927SAndroid Build Coastguard Worker nr,
480*61046927SAndroid Build Coastguard Worker subnr,
481*61046927SAndroid Build Coastguard Worker 0,
482*61046927SAndroid Build Coastguard Worker 0,
483*61046927SAndroid Build Coastguard Worker BRW_TYPE_F,
484*61046927SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_2,
485*61046927SAndroid Build Coastguard Worker BRW_WIDTH_2,
486*61046927SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_1,
487*61046927SAndroid Build Coastguard Worker BRW_SWIZZLE_XYXY,
488*61046927SAndroid Build Coastguard Worker WRITEMASK_XY);
489*61046927SAndroid Build Coastguard Worker }
490*61046927SAndroid Build Coastguard Worker
491*61046927SAndroid Build Coastguard Worker /** Construct float[1] register */
492*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec1_reg(enum brw_reg_file file,unsigned nr,unsigned subnr)493*61046927SAndroid Build Coastguard Worker brw_vec1_reg(enum brw_reg_file file, unsigned nr, unsigned subnr)
494*61046927SAndroid Build Coastguard Worker {
495*61046927SAndroid Build Coastguard Worker return brw_make_reg(file,
496*61046927SAndroid Build Coastguard Worker nr,
497*61046927SAndroid Build Coastguard Worker subnr,
498*61046927SAndroid Build Coastguard Worker 0,
499*61046927SAndroid Build Coastguard Worker 0,
500*61046927SAndroid Build Coastguard Worker BRW_TYPE_F,
501*61046927SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_0,
502*61046927SAndroid Build Coastguard Worker BRW_WIDTH_1,
503*61046927SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_0,
504*61046927SAndroid Build Coastguard Worker BRW_SWIZZLE_XXXX,
505*61046927SAndroid Build Coastguard Worker WRITEMASK_X);
506*61046927SAndroid Build Coastguard Worker }
507*61046927SAndroid Build Coastguard Worker
508*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vecn_reg(unsigned width,enum brw_reg_file file,unsigned nr,unsigned subnr)509*61046927SAndroid Build Coastguard Worker brw_vecn_reg(unsigned width, enum brw_reg_file file,
510*61046927SAndroid Build Coastguard Worker unsigned nr, unsigned subnr)
511*61046927SAndroid Build Coastguard Worker {
512*61046927SAndroid Build Coastguard Worker switch (width) {
513*61046927SAndroid Build Coastguard Worker case 1:
514*61046927SAndroid Build Coastguard Worker return brw_vec1_reg(file, nr, subnr);
515*61046927SAndroid Build Coastguard Worker case 2:
516*61046927SAndroid Build Coastguard Worker return brw_vec2_reg(file, nr, subnr);
517*61046927SAndroid Build Coastguard Worker case 4:
518*61046927SAndroid Build Coastguard Worker return brw_vec4_reg(file, nr, subnr);
519*61046927SAndroid Build Coastguard Worker case 8:
520*61046927SAndroid Build Coastguard Worker return brw_vec8_reg(file, nr, subnr);
521*61046927SAndroid Build Coastguard Worker case 16:
522*61046927SAndroid Build Coastguard Worker return brw_vec16_reg(file, nr, subnr);
523*61046927SAndroid Build Coastguard Worker default:
524*61046927SAndroid Build Coastguard Worker unreachable("Invalid register width");
525*61046927SAndroid Build Coastguard Worker }
526*61046927SAndroid Build Coastguard Worker }
527*61046927SAndroid Build Coastguard Worker
528*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
retype(struct brw_reg reg,enum brw_reg_type type)529*61046927SAndroid Build Coastguard Worker retype(struct brw_reg reg, enum brw_reg_type type)
530*61046927SAndroid Build Coastguard Worker {
531*61046927SAndroid Build Coastguard Worker reg.type = type;
532*61046927SAndroid Build Coastguard Worker return reg;
533*61046927SAndroid Build Coastguard Worker }
534*61046927SAndroid Build Coastguard Worker
535*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
firsthalf(struct brw_reg reg)536*61046927SAndroid Build Coastguard Worker firsthalf(struct brw_reg reg)
537*61046927SAndroid Build Coastguard Worker {
538*61046927SAndroid Build Coastguard Worker return reg;
539*61046927SAndroid Build Coastguard Worker }
540*61046927SAndroid Build Coastguard Worker
541*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
sechalf(struct brw_reg reg)542*61046927SAndroid Build Coastguard Worker sechalf(struct brw_reg reg)
543*61046927SAndroid Build Coastguard Worker {
544*61046927SAndroid Build Coastguard Worker if (reg.vstride)
545*61046927SAndroid Build Coastguard Worker reg.nr++;
546*61046927SAndroid Build Coastguard Worker return reg;
547*61046927SAndroid Build Coastguard Worker }
548*61046927SAndroid Build Coastguard Worker
549*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
offset(struct brw_reg reg,unsigned delta)550*61046927SAndroid Build Coastguard Worker offset(struct brw_reg reg, unsigned delta)
551*61046927SAndroid Build Coastguard Worker {
552*61046927SAndroid Build Coastguard Worker reg.nr += delta;
553*61046927SAndroid Build Coastguard Worker return reg;
554*61046927SAndroid Build Coastguard Worker }
555*61046927SAndroid Build Coastguard Worker
556*61046927SAndroid Build Coastguard Worker
557*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
byte_offset(struct brw_reg reg,unsigned bytes)558*61046927SAndroid Build Coastguard Worker byte_offset(struct brw_reg reg, unsigned bytes)
559*61046927SAndroid Build Coastguard Worker {
560*61046927SAndroid Build Coastguard Worker switch (reg.file) {
561*61046927SAndroid Build Coastguard Worker case BAD_FILE:
562*61046927SAndroid Build Coastguard Worker break;
563*61046927SAndroid Build Coastguard Worker case VGRF:
564*61046927SAndroid Build Coastguard Worker case ATTR:
565*61046927SAndroid Build Coastguard Worker case UNIFORM:
566*61046927SAndroid Build Coastguard Worker reg.offset += bytes;
567*61046927SAndroid Build Coastguard Worker break;
568*61046927SAndroid Build Coastguard Worker case ARF:
569*61046927SAndroid Build Coastguard Worker case FIXED_GRF: {
570*61046927SAndroid Build Coastguard Worker const unsigned suboffset = reg.subnr + bytes;
571*61046927SAndroid Build Coastguard Worker reg.nr += suboffset / REG_SIZE;
572*61046927SAndroid Build Coastguard Worker reg.subnr = suboffset % REG_SIZE;
573*61046927SAndroid Build Coastguard Worker break;
574*61046927SAndroid Build Coastguard Worker }
575*61046927SAndroid Build Coastguard Worker case IMM:
576*61046927SAndroid Build Coastguard Worker default:
577*61046927SAndroid Build Coastguard Worker assert(bytes == 0);
578*61046927SAndroid Build Coastguard Worker }
579*61046927SAndroid Build Coastguard Worker return reg;
580*61046927SAndroid Build Coastguard Worker }
581*61046927SAndroid Build Coastguard Worker
582*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
suboffset(struct brw_reg reg,unsigned delta)583*61046927SAndroid Build Coastguard Worker suboffset(struct brw_reg reg, unsigned delta)
584*61046927SAndroid Build Coastguard Worker {
585*61046927SAndroid Build Coastguard Worker return byte_offset(reg, delta * brw_type_size_bytes(reg.type));
586*61046927SAndroid Build Coastguard Worker }
587*61046927SAndroid Build Coastguard Worker
588*61046927SAndroid Build Coastguard Worker /** Construct unsigned word[16] register */
589*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_uw16_reg(enum brw_reg_file file,unsigned nr,unsigned subnr)590*61046927SAndroid Build Coastguard Worker brw_uw16_reg(enum brw_reg_file file, unsigned nr, unsigned subnr)
591*61046927SAndroid Build Coastguard Worker {
592*61046927SAndroid Build Coastguard Worker return suboffset(retype(brw_vec16_reg(file, nr, 0), BRW_TYPE_UW), subnr);
593*61046927SAndroid Build Coastguard Worker }
594*61046927SAndroid Build Coastguard Worker
595*61046927SAndroid Build Coastguard Worker /** Construct unsigned word[8] register */
596*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_uw8_reg(enum brw_reg_file file,unsigned nr,unsigned subnr)597*61046927SAndroid Build Coastguard Worker brw_uw8_reg(enum brw_reg_file file, unsigned nr, unsigned subnr)
598*61046927SAndroid Build Coastguard Worker {
599*61046927SAndroid Build Coastguard Worker return suboffset(retype(brw_vec8_reg(file, nr, 0), BRW_TYPE_UW), subnr);
600*61046927SAndroid Build Coastguard Worker }
601*61046927SAndroid Build Coastguard Worker
602*61046927SAndroid Build Coastguard Worker /** Construct unsigned word[1] register */
603*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_uw1_reg(enum brw_reg_file file,unsigned nr,unsigned subnr)604*61046927SAndroid Build Coastguard Worker brw_uw1_reg(enum brw_reg_file file, unsigned nr, unsigned subnr)
605*61046927SAndroid Build Coastguard Worker {
606*61046927SAndroid Build Coastguard Worker return suboffset(retype(brw_vec1_reg(file, nr, 0), BRW_TYPE_UW), subnr);
607*61046927SAndroid Build Coastguard Worker }
608*61046927SAndroid Build Coastguard Worker
609*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_ud8_reg(enum brw_reg_file file,unsigned nr,unsigned subnr)610*61046927SAndroid Build Coastguard Worker brw_ud8_reg(enum brw_reg_file file, unsigned nr, unsigned subnr)
611*61046927SAndroid Build Coastguard Worker {
612*61046927SAndroid Build Coastguard Worker return retype(brw_vec8_reg(file, nr, subnr), BRW_TYPE_UD);
613*61046927SAndroid Build Coastguard Worker }
614*61046927SAndroid Build Coastguard Worker
615*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_ud1_reg(enum brw_reg_file file,unsigned nr,unsigned subnr)616*61046927SAndroid Build Coastguard Worker brw_ud1_reg(enum brw_reg_file file, unsigned nr, unsigned subnr)
617*61046927SAndroid Build Coastguard Worker {
618*61046927SAndroid Build Coastguard Worker return retype(brw_vec1_reg(file, nr, subnr), BRW_TYPE_UD);
619*61046927SAndroid Build Coastguard Worker }
620*61046927SAndroid Build Coastguard Worker
621*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_reg(enum brw_reg_type type)622*61046927SAndroid Build Coastguard Worker brw_imm_reg(enum brw_reg_type type)
623*61046927SAndroid Build Coastguard Worker {
624*61046927SAndroid Build Coastguard Worker return brw_make_reg(IMM,
625*61046927SAndroid Build Coastguard Worker 0,
626*61046927SAndroid Build Coastguard Worker 0,
627*61046927SAndroid Build Coastguard Worker 0,
628*61046927SAndroid Build Coastguard Worker 0,
629*61046927SAndroid Build Coastguard Worker type,
630*61046927SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_0,
631*61046927SAndroid Build Coastguard Worker BRW_WIDTH_1,
632*61046927SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_0,
633*61046927SAndroid Build Coastguard Worker 0,
634*61046927SAndroid Build Coastguard Worker 0);
635*61046927SAndroid Build Coastguard Worker }
636*61046927SAndroid Build Coastguard Worker
637*61046927SAndroid Build Coastguard Worker /** Construct float immediate register */
638*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_df(double df)639*61046927SAndroid Build Coastguard Worker brw_imm_df(double df)
640*61046927SAndroid Build Coastguard Worker {
641*61046927SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_TYPE_DF);
642*61046927SAndroid Build Coastguard Worker imm.df = df;
643*61046927SAndroid Build Coastguard Worker return imm;
644*61046927SAndroid Build Coastguard Worker }
645*61046927SAndroid Build Coastguard Worker
646*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_u64(uint64_t u64)647*61046927SAndroid Build Coastguard Worker brw_imm_u64(uint64_t u64)
648*61046927SAndroid Build Coastguard Worker {
649*61046927SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_TYPE_UQ);
650*61046927SAndroid Build Coastguard Worker imm.u64 = u64;
651*61046927SAndroid Build Coastguard Worker return imm;
652*61046927SAndroid Build Coastguard Worker }
653*61046927SAndroid Build Coastguard Worker
654*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_f(float f)655*61046927SAndroid Build Coastguard Worker brw_imm_f(float f)
656*61046927SAndroid Build Coastguard Worker {
657*61046927SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_TYPE_F);
658*61046927SAndroid Build Coastguard Worker imm.f = f;
659*61046927SAndroid Build Coastguard Worker return imm;
660*61046927SAndroid Build Coastguard Worker }
661*61046927SAndroid Build Coastguard Worker
662*61046927SAndroid Build Coastguard Worker /** Construct int64_t immediate register */
663*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_q(int64_t q)664*61046927SAndroid Build Coastguard Worker brw_imm_q(int64_t q)
665*61046927SAndroid Build Coastguard Worker {
666*61046927SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_TYPE_Q);
667*61046927SAndroid Build Coastguard Worker imm.d64 = q;
668*61046927SAndroid Build Coastguard Worker return imm;
669*61046927SAndroid Build Coastguard Worker }
670*61046927SAndroid Build Coastguard Worker
671*61046927SAndroid Build Coastguard Worker /** Construct int64_t immediate register */
672*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_uq(uint64_t uq)673*61046927SAndroid Build Coastguard Worker brw_imm_uq(uint64_t uq)
674*61046927SAndroid Build Coastguard Worker {
675*61046927SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_TYPE_UQ);
676*61046927SAndroid Build Coastguard Worker imm.u64 = uq;
677*61046927SAndroid Build Coastguard Worker return imm;
678*61046927SAndroid Build Coastguard Worker }
679*61046927SAndroid Build Coastguard Worker
680*61046927SAndroid Build Coastguard Worker /** Construct integer immediate register */
681*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_d(int d)682*61046927SAndroid Build Coastguard Worker brw_imm_d(int d)
683*61046927SAndroid Build Coastguard Worker {
684*61046927SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_TYPE_D);
685*61046927SAndroid Build Coastguard Worker imm.d = d;
686*61046927SAndroid Build Coastguard Worker return imm;
687*61046927SAndroid Build Coastguard Worker }
688*61046927SAndroid Build Coastguard Worker
689*61046927SAndroid Build Coastguard Worker /** Construct uint immediate register */
690*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_ud(unsigned ud)691*61046927SAndroid Build Coastguard Worker brw_imm_ud(unsigned ud)
692*61046927SAndroid Build Coastguard Worker {
693*61046927SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_TYPE_UD);
694*61046927SAndroid Build Coastguard Worker imm.ud = ud;
695*61046927SAndroid Build Coastguard Worker return imm;
696*61046927SAndroid Build Coastguard Worker }
697*61046927SAndroid Build Coastguard Worker
698*61046927SAndroid Build Coastguard Worker /** Construct ushort immediate register */
699*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_uw(uint16_t uw)700*61046927SAndroid Build Coastguard Worker brw_imm_uw(uint16_t uw)
701*61046927SAndroid Build Coastguard Worker {
702*61046927SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_TYPE_UW);
703*61046927SAndroid Build Coastguard Worker imm.ud = uw | ((uint32_t)uw << 16);
704*61046927SAndroid Build Coastguard Worker return imm;
705*61046927SAndroid Build Coastguard Worker }
706*61046927SAndroid Build Coastguard Worker
707*61046927SAndroid Build Coastguard Worker /** Construct short immediate register */
708*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_w(int16_t w)709*61046927SAndroid Build Coastguard Worker brw_imm_w(int16_t w)
710*61046927SAndroid Build Coastguard Worker {
711*61046927SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_TYPE_W);
712*61046927SAndroid Build Coastguard Worker imm.ud = (uint16_t)w | (uint32_t)(uint16_t)w << 16;
713*61046927SAndroid Build Coastguard Worker return imm;
714*61046927SAndroid Build Coastguard Worker }
715*61046927SAndroid Build Coastguard Worker
716*61046927SAndroid Build Coastguard Worker /* brw_imm_b and brw_imm_ub aren't supported by hardware - the type
717*61046927SAndroid Build Coastguard Worker * numbers alias with _V and _VF below:
718*61046927SAndroid Build Coastguard Worker */
719*61046927SAndroid Build Coastguard Worker
720*61046927SAndroid Build Coastguard Worker /** Construct vector of eight signed half-byte values */
721*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_v(unsigned v)722*61046927SAndroid Build Coastguard Worker brw_imm_v(unsigned v)
723*61046927SAndroid Build Coastguard Worker {
724*61046927SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_TYPE_V);
725*61046927SAndroid Build Coastguard Worker imm.ud = v;
726*61046927SAndroid Build Coastguard Worker return imm;
727*61046927SAndroid Build Coastguard Worker }
728*61046927SAndroid Build Coastguard Worker
729*61046927SAndroid Build Coastguard Worker /** Construct vector of eight unsigned half-byte values */
730*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_uv(unsigned uv)731*61046927SAndroid Build Coastguard Worker brw_imm_uv(unsigned uv)
732*61046927SAndroid Build Coastguard Worker {
733*61046927SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_TYPE_UV);
734*61046927SAndroid Build Coastguard Worker imm.ud = uv;
735*61046927SAndroid Build Coastguard Worker return imm;
736*61046927SAndroid Build Coastguard Worker }
737*61046927SAndroid Build Coastguard Worker
738*61046927SAndroid Build Coastguard Worker /** Construct vector of four 8-bit float values */
739*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_vf(unsigned v)740*61046927SAndroid Build Coastguard Worker brw_imm_vf(unsigned v)
741*61046927SAndroid Build Coastguard Worker {
742*61046927SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_TYPE_VF);
743*61046927SAndroid Build Coastguard Worker imm.ud = v;
744*61046927SAndroid Build Coastguard Worker return imm;
745*61046927SAndroid Build Coastguard Worker }
746*61046927SAndroid Build Coastguard Worker
747*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_imm_vf4(unsigned v0,unsigned v1,unsigned v2,unsigned v3)748*61046927SAndroid Build Coastguard Worker brw_imm_vf4(unsigned v0, unsigned v1, unsigned v2, unsigned v3)
749*61046927SAndroid Build Coastguard Worker {
750*61046927SAndroid Build Coastguard Worker struct brw_reg imm = brw_imm_reg(BRW_TYPE_VF);
751*61046927SAndroid Build Coastguard Worker imm.vstride = BRW_VERTICAL_STRIDE_0;
752*61046927SAndroid Build Coastguard Worker imm.width = BRW_WIDTH_4;
753*61046927SAndroid Build Coastguard Worker imm.hstride = BRW_HORIZONTAL_STRIDE_1;
754*61046927SAndroid Build Coastguard Worker imm.ud = ((v0 << 0) | (v1 << 8) | (v2 << 16) | (v3 << 24));
755*61046927SAndroid Build Coastguard Worker return imm;
756*61046927SAndroid Build Coastguard Worker }
757*61046927SAndroid Build Coastguard Worker
758*61046927SAndroid Build Coastguard Worker
759*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_address(struct brw_reg reg)760*61046927SAndroid Build Coastguard Worker brw_address(struct brw_reg reg)
761*61046927SAndroid Build Coastguard Worker {
762*61046927SAndroid Build Coastguard Worker return brw_imm_uw(reg.nr * REG_SIZE + reg.subnr);
763*61046927SAndroid Build Coastguard Worker }
764*61046927SAndroid Build Coastguard Worker
765*61046927SAndroid Build Coastguard Worker /** Construct float[1] general-purpose register */
766*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec1_grf(unsigned nr,unsigned subnr)767*61046927SAndroid Build Coastguard Worker brw_vec1_grf(unsigned nr, unsigned subnr)
768*61046927SAndroid Build Coastguard Worker {
769*61046927SAndroid Build Coastguard Worker return brw_vec1_reg(FIXED_GRF, nr, subnr);
770*61046927SAndroid Build Coastguard Worker }
771*61046927SAndroid Build Coastguard Worker
772*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
xe2_vec1_grf(unsigned nr,unsigned subnr)773*61046927SAndroid Build Coastguard Worker xe2_vec1_grf(unsigned nr, unsigned subnr)
774*61046927SAndroid Build Coastguard Worker {
775*61046927SAndroid Build Coastguard Worker return brw_vec1_reg(FIXED_GRF, 2 * nr + subnr / 8, subnr % 8);
776*61046927SAndroid Build Coastguard Worker }
777*61046927SAndroid Build Coastguard Worker
778*61046927SAndroid Build Coastguard Worker /** Construct float[2] general-purpose register */
779*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec2_grf(unsigned nr,unsigned subnr)780*61046927SAndroid Build Coastguard Worker brw_vec2_grf(unsigned nr, unsigned subnr)
781*61046927SAndroid Build Coastguard Worker {
782*61046927SAndroid Build Coastguard Worker return brw_vec2_reg(FIXED_GRF, nr, subnr);
783*61046927SAndroid Build Coastguard Worker }
784*61046927SAndroid Build Coastguard Worker
785*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
xe2_vec2_grf(unsigned nr,unsigned subnr)786*61046927SAndroid Build Coastguard Worker xe2_vec2_grf(unsigned nr, unsigned subnr)
787*61046927SAndroid Build Coastguard Worker {
788*61046927SAndroid Build Coastguard Worker return brw_vec2_reg(FIXED_GRF, 2 * nr + subnr / 8, subnr % 8);
789*61046927SAndroid Build Coastguard Worker }
790*61046927SAndroid Build Coastguard Worker
791*61046927SAndroid Build Coastguard Worker /** Construct float[4] general-purpose register */
792*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec4_grf(unsigned nr,unsigned subnr)793*61046927SAndroid Build Coastguard Worker brw_vec4_grf(unsigned nr, unsigned subnr)
794*61046927SAndroid Build Coastguard Worker {
795*61046927SAndroid Build Coastguard Worker return brw_vec4_reg(FIXED_GRF, nr, subnr);
796*61046927SAndroid Build Coastguard Worker }
797*61046927SAndroid Build Coastguard Worker
798*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
xe2_vec4_grf(unsigned nr,unsigned subnr)799*61046927SAndroid Build Coastguard Worker xe2_vec4_grf(unsigned nr, unsigned subnr)
800*61046927SAndroid Build Coastguard Worker {
801*61046927SAndroid Build Coastguard Worker return brw_vec4_reg(FIXED_GRF, 2 * nr + subnr / 8, subnr % 8);
802*61046927SAndroid Build Coastguard Worker }
803*61046927SAndroid Build Coastguard Worker
804*61046927SAndroid Build Coastguard Worker /** Construct float[8] general-purpose register */
805*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec8_grf(unsigned nr,unsigned subnr)806*61046927SAndroid Build Coastguard Worker brw_vec8_grf(unsigned nr, unsigned subnr)
807*61046927SAndroid Build Coastguard Worker {
808*61046927SAndroid Build Coastguard Worker return brw_vec8_reg(FIXED_GRF, nr, subnr);
809*61046927SAndroid Build Coastguard Worker }
810*61046927SAndroid Build Coastguard Worker
811*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
xe2_vec8_grf(unsigned nr,unsigned subnr)812*61046927SAndroid Build Coastguard Worker xe2_vec8_grf(unsigned nr, unsigned subnr)
813*61046927SAndroid Build Coastguard Worker {
814*61046927SAndroid Build Coastguard Worker return brw_vec8_reg(FIXED_GRF, 2 * nr + subnr / 8, subnr % 8);
815*61046927SAndroid Build Coastguard Worker }
816*61046927SAndroid Build Coastguard Worker
817*61046927SAndroid Build Coastguard Worker /** Construct float[16] general-purpose register */
818*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec16_grf(unsigned nr,unsigned subnr)819*61046927SAndroid Build Coastguard Worker brw_vec16_grf(unsigned nr, unsigned subnr)
820*61046927SAndroid Build Coastguard Worker {
821*61046927SAndroid Build Coastguard Worker return brw_vec16_reg(FIXED_GRF, nr, subnr);
822*61046927SAndroid Build Coastguard Worker }
823*61046927SAndroid Build Coastguard Worker
824*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
xe2_vec16_grf(unsigned nr,unsigned subnr)825*61046927SAndroid Build Coastguard Worker xe2_vec16_grf(unsigned nr, unsigned subnr)
826*61046927SAndroid Build Coastguard Worker {
827*61046927SAndroid Build Coastguard Worker return brw_vec16_reg(FIXED_GRF, 2 * nr + subnr / 8, subnr % 8);
828*61046927SAndroid Build Coastguard Worker }
829*61046927SAndroid Build Coastguard Worker
830*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vecn_grf(unsigned width,unsigned nr,unsigned subnr)831*61046927SAndroid Build Coastguard Worker brw_vecn_grf(unsigned width, unsigned nr, unsigned subnr)
832*61046927SAndroid Build Coastguard Worker {
833*61046927SAndroid Build Coastguard Worker return brw_vecn_reg(width, FIXED_GRF, nr, subnr);
834*61046927SAndroid Build Coastguard Worker }
835*61046927SAndroid Build Coastguard Worker
836*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
xe2_vecn_grf(unsigned width,unsigned nr,unsigned subnr)837*61046927SAndroid Build Coastguard Worker xe2_vecn_grf(unsigned width, unsigned nr, unsigned subnr)
838*61046927SAndroid Build Coastguard Worker {
839*61046927SAndroid Build Coastguard Worker return brw_vecn_reg(width, FIXED_GRF, nr + subnr / 8, subnr % 8);
840*61046927SAndroid Build Coastguard Worker }
841*61046927SAndroid Build Coastguard Worker
842*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_uw1_grf(unsigned nr,unsigned subnr)843*61046927SAndroid Build Coastguard Worker brw_uw1_grf(unsigned nr, unsigned subnr)
844*61046927SAndroid Build Coastguard Worker {
845*61046927SAndroid Build Coastguard Worker return brw_uw1_reg(FIXED_GRF, nr, subnr);
846*61046927SAndroid Build Coastguard Worker }
847*61046927SAndroid Build Coastguard Worker
848*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_uw8_grf(unsigned nr,unsigned subnr)849*61046927SAndroid Build Coastguard Worker brw_uw8_grf(unsigned nr, unsigned subnr)
850*61046927SAndroid Build Coastguard Worker {
851*61046927SAndroid Build Coastguard Worker return brw_uw8_reg(FIXED_GRF, nr, subnr);
852*61046927SAndroid Build Coastguard Worker }
853*61046927SAndroid Build Coastguard Worker
854*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_uw16_grf(unsigned nr,unsigned subnr)855*61046927SAndroid Build Coastguard Worker brw_uw16_grf(unsigned nr, unsigned subnr)
856*61046927SAndroid Build Coastguard Worker {
857*61046927SAndroid Build Coastguard Worker return brw_uw16_reg(FIXED_GRF, nr, subnr);
858*61046927SAndroid Build Coastguard Worker }
859*61046927SAndroid Build Coastguard Worker
860*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_ud8_grf(unsigned nr,unsigned subnr)861*61046927SAndroid Build Coastguard Worker brw_ud8_grf(unsigned nr, unsigned subnr)
862*61046927SAndroid Build Coastguard Worker {
863*61046927SAndroid Build Coastguard Worker return brw_ud8_reg(FIXED_GRF, nr, subnr);
864*61046927SAndroid Build Coastguard Worker }
865*61046927SAndroid Build Coastguard Worker
866*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_ud1_grf(unsigned nr,unsigned subnr)867*61046927SAndroid Build Coastguard Worker brw_ud1_grf(unsigned nr, unsigned subnr)
868*61046927SAndroid Build Coastguard Worker {
869*61046927SAndroid Build Coastguard Worker return brw_ud1_reg(FIXED_GRF, nr, subnr);
870*61046927SAndroid Build Coastguard Worker }
871*61046927SAndroid Build Coastguard Worker
872*61046927SAndroid Build Coastguard Worker
873*61046927SAndroid Build Coastguard Worker /** Construct null register (usually used for setting condition codes) */
874*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_null_reg(void)875*61046927SAndroid Build Coastguard Worker brw_null_reg(void)
876*61046927SAndroid Build Coastguard Worker {
877*61046927SAndroid Build Coastguard Worker return brw_vec8_reg(ARF, BRW_ARF_NULL, 0);
878*61046927SAndroid Build Coastguard Worker }
879*61046927SAndroid Build Coastguard Worker
880*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_null_vec(unsigned width)881*61046927SAndroid Build Coastguard Worker brw_null_vec(unsigned width)
882*61046927SAndroid Build Coastguard Worker {
883*61046927SAndroid Build Coastguard Worker return brw_vecn_reg(width, ARF, BRW_ARF_NULL, 0);
884*61046927SAndroid Build Coastguard Worker }
885*61046927SAndroid Build Coastguard Worker
886*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_address_reg(unsigned subnr)887*61046927SAndroid Build Coastguard Worker brw_address_reg(unsigned subnr)
888*61046927SAndroid Build Coastguard Worker {
889*61046927SAndroid Build Coastguard Worker return brw_uw1_reg(ARF, BRW_ARF_ADDRESS, subnr);
890*61046927SAndroid Build Coastguard Worker }
891*61046927SAndroid Build Coastguard Worker
892*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_tdr_reg(void)893*61046927SAndroid Build Coastguard Worker brw_tdr_reg(void)
894*61046927SAndroid Build Coastguard Worker {
895*61046927SAndroid Build Coastguard Worker return brw_uw1_reg(ARF, BRW_ARF_TDR, 0);
896*61046927SAndroid Build Coastguard Worker }
897*61046927SAndroid Build Coastguard Worker
898*61046927SAndroid Build Coastguard Worker /* If/else instructions break in align16 mode if writemask & swizzle
899*61046927SAndroid Build Coastguard Worker * aren't xyzw. This goes against the convention for other scalar
900*61046927SAndroid Build Coastguard Worker * regs:
901*61046927SAndroid Build Coastguard Worker */
902*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_ip_reg(void)903*61046927SAndroid Build Coastguard Worker brw_ip_reg(void)
904*61046927SAndroid Build Coastguard Worker {
905*61046927SAndroid Build Coastguard Worker return brw_make_reg(ARF,
906*61046927SAndroid Build Coastguard Worker BRW_ARF_IP,
907*61046927SAndroid Build Coastguard Worker 0,
908*61046927SAndroid Build Coastguard Worker 0,
909*61046927SAndroid Build Coastguard Worker 0,
910*61046927SAndroid Build Coastguard Worker BRW_TYPE_UD,
911*61046927SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_4, /* ? */
912*61046927SAndroid Build Coastguard Worker BRW_WIDTH_1,
913*61046927SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_0,
914*61046927SAndroid Build Coastguard Worker BRW_SWIZZLE_XYZW, /* NOTE! */
915*61046927SAndroid Build Coastguard Worker WRITEMASK_XYZW); /* NOTE! */
916*61046927SAndroid Build Coastguard Worker }
917*61046927SAndroid Build Coastguard Worker
918*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_notification_reg(void)919*61046927SAndroid Build Coastguard Worker brw_notification_reg(void)
920*61046927SAndroid Build Coastguard Worker {
921*61046927SAndroid Build Coastguard Worker return brw_make_reg(ARF,
922*61046927SAndroid Build Coastguard Worker BRW_ARF_NOTIFICATION_COUNT,
923*61046927SAndroid Build Coastguard Worker 0,
924*61046927SAndroid Build Coastguard Worker 0,
925*61046927SAndroid Build Coastguard Worker 0,
926*61046927SAndroid Build Coastguard Worker BRW_TYPE_UD,
927*61046927SAndroid Build Coastguard Worker BRW_VERTICAL_STRIDE_0,
928*61046927SAndroid Build Coastguard Worker BRW_WIDTH_1,
929*61046927SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_0,
930*61046927SAndroid Build Coastguard Worker BRW_SWIZZLE_XXXX,
931*61046927SAndroid Build Coastguard Worker WRITEMASK_X);
932*61046927SAndroid Build Coastguard Worker }
933*61046927SAndroid Build Coastguard Worker
934*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_cr0_reg(unsigned subnr)935*61046927SAndroid Build Coastguard Worker brw_cr0_reg(unsigned subnr)
936*61046927SAndroid Build Coastguard Worker {
937*61046927SAndroid Build Coastguard Worker return brw_ud1_reg(ARF, BRW_ARF_CONTROL, subnr);
938*61046927SAndroid Build Coastguard Worker }
939*61046927SAndroid Build Coastguard Worker
940*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_sr0_reg(unsigned subnr)941*61046927SAndroid Build Coastguard Worker brw_sr0_reg(unsigned subnr)
942*61046927SAndroid Build Coastguard Worker {
943*61046927SAndroid Build Coastguard Worker return brw_ud1_reg(ARF, BRW_ARF_STATE, subnr);
944*61046927SAndroid Build Coastguard Worker }
945*61046927SAndroid Build Coastguard Worker
946*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_acc_reg(unsigned width)947*61046927SAndroid Build Coastguard Worker brw_acc_reg(unsigned width)
948*61046927SAndroid Build Coastguard Worker {
949*61046927SAndroid Build Coastguard Worker return brw_vecn_reg(width, ARF,
950*61046927SAndroid Build Coastguard Worker BRW_ARF_ACCUMULATOR, 0);
951*61046927SAndroid Build Coastguard Worker }
952*61046927SAndroid Build Coastguard Worker
953*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_flag_reg(int reg,int subreg)954*61046927SAndroid Build Coastguard Worker brw_flag_reg(int reg, int subreg)
955*61046927SAndroid Build Coastguard Worker {
956*61046927SAndroid Build Coastguard Worker return brw_uw1_reg(ARF,
957*61046927SAndroid Build Coastguard Worker BRW_ARF_FLAG + reg, subreg);
958*61046927SAndroid Build Coastguard Worker }
959*61046927SAndroid Build Coastguard Worker
960*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_flag_subreg(unsigned subreg)961*61046927SAndroid Build Coastguard Worker brw_flag_subreg(unsigned subreg)
962*61046927SAndroid Build Coastguard Worker {
963*61046927SAndroid Build Coastguard Worker return brw_uw1_reg(ARF,
964*61046927SAndroid Build Coastguard Worker BRW_ARF_FLAG + subreg / 2, subreg % 2);
965*61046927SAndroid Build Coastguard Worker }
966*61046927SAndroid Build Coastguard Worker
967*61046927SAndroid Build Coastguard Worker /**
968*61046927SAndroid Build Coastguard Worker * Return the mask register present in Gfx4-5, or the related register present
969*61046927SAndroid Build Coastguard Worker * in Gfx7.5 and later hardware referred to as "channel enable" register in
970*61046927SAndroid Build Coastguard Worker * the documentation.
971*61046927SAndroid Build Coastguard Worker */
972*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_mask_reg(unsigned subnr)973*61046927SAndroid Build Coastguard Worker brw_mask_reg(unsigned subnr)
974*61046927SAndroid Build Coastguard Worker {
975*61046927SAndroid Build Coastguard Worker return brw_uw1_reg(ARF, BRW_ARF_MASK, subnr);
976*61046927SAndroid Build Coastguard Worker }
977*61046927SAndroid Build Coastguard Worker
978*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vmask_reg()979*61046927SAndroid Build Coastguard Worker brw_vmask_reg()
980*61046927SAndroid Build Coastguard Worker {
981*61046927SAndroid Build Coastguard Worker return brw_sr0_reg(3);
982*61046927SAndroid Build Coastguard Worker }
983*61046927SAndroid Build Coastguard Worker
984*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_dmask_reg()985*61046927SAndroid Build Coastguard Worker brw_dmask_reg()
986*61046927SAndroid Build Coastguard Worker {
987*61046927SAndroid Build Coastguard Worker return brw_sr0_reg(2);
988*61046927SAndroid Build Coastguard Worker }
989*61046927SAndroid Build Coastguard Worker
990*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vgrf(unsigned nr,enum brw_reg_type type)991*61046927SAndroid Build Coastguard Worker brw_vgrf(unsigned nr, enum brw_reg_type type)
992*61046927SAndroid Build Coastguard Worker {
993*61046927SAndroid Build Coastguard Worker struct brw_reg reg = {};
994*61046927SAndroid Build Coastguard Worker reg.file = VGRF;
995*61046927SAndroid Build Coastguard Worker reg.nr = nr;
996*61046927SAndroid Build Coastguard Worker reg.type = type;
997*61046927SAndroid Build Coastguard Worker reg.stride = 1;
998*61046927SAndroid Build Coastguard Worker return reg;
999*61046927SAndroid Build Coastguard Worker }
1000*61046927SAndroid Build Coastguard Worker
1001*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_attr_reg(unsigned nr,enum brw_reg_type type)1002*61046927SAndroid Build Coastguard Worker brw_attr_reg(unsigned nr, enum brw_reg_type type)
1003*61046927SAndroid Build Coastguard Worker {
1004*61046927SAndroid Build Coastguard Worker struct brw_reg reg = {};
1005*61046927SAndroid Build Coastguard Worker reg.file = ATTR;
1006*61046927SAndroid Build Coastguard Worker reg.nr = nr;
1007*61046927SAndroid Build Coastguard Worker reg.type = type;
1008*61046927SAndroid Build Coastguard Worker reg.stride = 1;
1009*61046927SAndroid Build Coastguard Worker return reg;
1010*61046927SAndroid Build Coastguard Worker }
1011*61046927SAndroid Build Coastguard Worker
1012*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_uniform_reg(unsigned nr,enum brw_reg_type type)1013*61046927SAndroid Build Coastguard Worker brw_uniform_reg(unsigned nr, enum brw_reg_type type)
1014*61046927SAndroid Build Coastguard Worker {
1015*61046927SAndroid Build Coastguard Worker struct brw_reg reg = {};
1016*61046927SAndroid Build Coastguard Worker reg.file = UNIFORM;
1017*61046927SAndroid Build Coastguard Worker reg.nr = nr;
1018*61046927SAndroid Build Coastguard Worker reg.type = type;
1019*61046927SAndroid Build Coastguard Worker reg.stride = 0;
1020*61046927SAndroid Build Coastguard Worker return reg;
1021*61046927SAndroid Build Coastguard Worker }
1022*61046927SAndroid Build Coastguard Worker
1023*61046927SAndroid Build Coastguard Worker /* This is almost always called with a numeric constant argument, so
1024*61046927SAndroid Build Coastguard Worker * make things easy to evaluate at compile time:
1025*61046927SAndroid Build Coastguard Worker */
cvt(unsigned val)1026*61046927SAndroid Build Coastguard Worker static inline unsigned cvt(unsigned val)
1027*61046927SAndroid Build Coastguard Worker {
1028*61046927SAndroid Build Coastguard Worker switch (val) {
1029*61046927SAndroid Build Coastguard Worker case 0: return 0;
1030*61046927SAndroid Build Coastguard Worker case 1: return 1;
1031*61046927SAndroid Build Coastguard Worker case 2: return 2;
1032*61046927SAndroid Build Coastguard Worker case 4: return 3;
1033*61046927SAndroid Build Coastguard Worker case 8: return 4;
1034*61046927SAndroid Build Coastguard Worker case 16: return 5;
1035*61046927SAndroid Build Coastguard Worker case 32: return 6;
1036*61046927SAndroid Build Coastguard Worker }
1037*61046927SAndroid Build Coastguard Worker return 0;
1038*61046927SAndroid Build Coastguard Worker }
1039*61046927SAndroid Build Coastguard Worker
1040*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
stride(struct brw_reg reg,unsigned vstride,unsigned width,unsigned hstride)1041*61046927SAndroid Build Coastguard Worker stride(struct brw_reg reg, unsigned vstride, unsigned width, unsigned hstride)
1042*61046927SAndroid Build Coastguard Worker {
1043*61046927SAndroid Build Coastguard Worker reg.vstride = cvt(vstride);
1044*61046927SAndroid Build Coastguard Worker reg.width = cvt(width) - 1;
1045*61046927SAndroid Build Coastguard Worker reg.hstride = cvt(hstride);
1046*61046927SAndroid Build Coastguard Worker return reg;
1047*61046927SAndroid Build Coastguard Worker }
1048*61046927SAndroid Build Coastguard Worker
1049*61046927SAndroid Build Coastguard Worker /**
1050*61046927SAndroid Build Coastguard Worker * Multiply the vertical and horizontal stride of a register by the given
1051*61046927SAndroid Build Coastguard Worker * factor \a s.
1052*61046927SAndroid Build Coastguard Worker */
1053*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
spread(struct brw_reg reg,unsigned s)1054*61046927SAndroid Build Coastguard Worker spread(struct brw_reg reg, unsigned s)
1055*61046927SAndroid Build Coastguard Worker {
1056*61046927SAndroid Build Coastguard Worker if (s) {
1057*61046927SAndroid Build Coastguard Worker assert(util_is_power_of_two_nonzero(s));
1058*61046927SAndroid Build Coastguard Worker
1059*61046927SAndroid Build Coastguard Worker if (reg.hstride)
1060*61046927SAndroid Build Coastguard Worker reg.hstride += cvt(s) - 1;
1061*61046927SAndroid Build Coastguard Worker
1062*61046927SAndroid Build Coastguard Worker if (reg.vstride)
1063*61046927SAndroid Build Coastguard Worker reg.vstride += cvt(s) - 1;
1064*61046927SAndroid Build Coastguard Worker
1065*61046927SAndroid Build Coastguard Worker return reg;
1066*61046927SAndroid Build Coastguard Worker } else {
1067*61046927SAndroid Build Coastguard Worker return stride(reg, 0, 1, 0);
1068*61046927SAndroid Build Coastguard Worker }
1069*61046927SAndroid Build Coastguard Worker }
1070*61046927SAndroid Build Coastguard Worker
1071*61046927SAndroid Build Coastguard Worker /**
1072*61046927SAndroid Build Coastguard Worker * Reinterpret each channel of register \p reg as a vector of values of the
1073*61046927SAndroid Build Coastguard Worker * given smaller type and take the i-th subcomponent from each.
1074*61046927SAndroid Build Coastguard Worker */
1075*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
subscript(struct brw_reg reg,enum brw_reg_type type,unsigned i)1076*61046927SAndroid Build Coastguard Worker subscript(struct brw_reg reg, enum brw_reg_type type, unsigned i)
1077*61046927SAndroid Build Coastguard Worker {
1078*61046927SAndroid Build Coastguard Worker assert((i + 1) * brw_type_size_bytes(type) <= brw_type_size_bytes(reg.type));
1079*61046927SAndroid Build Coastguard Worker
1080*61046927SAndroid Build Coastguard Worker if (reg.file == ARF || reg.file == FIXED_GRF) {
1081*61046927SAndroid Build Coastguard Worker /* The stride is encoded inconsistently for fixed GRF and ARF registers
1082*61046927SAndroid Build Coastguard Worker * as the log2 of the actual vertical and horizontal strides.
1083*61046927SAndroid Build Coastguard Worker */
1084*61046927SAndroid Build Coastguard Worker const int delta = util_logbase2(brw_type_size_bytes(reg.type)) -
1085*61046927SAndroid Build Coastguard Worker util_logbase2(brw_type_size_bytes(type));
1086*61046927SAndroid Build Coastguard Worker reg.hstride += (reg.hstride ? delta : 0);
1087*61046927SAndroid Build Coastguard Worker reg.vstride += (reg.vstride ? delta : 0);
1088*61046927SAndroid Build Coastguard Worker
1089*61046927SAndroid Build Coastguard Worker } else if (reg.file == IMM) {
1090*61046927SAndroid Build Coastguard Worker unsigned bit_size = brw_type_size_bits(type);
1091*61046927SAndroid Build Coastguard Worker reg.u64 >>= i * bit_size;
1092*61046927SAndroid Build Coastguard Worker reg.u64 &= BITFIELD64_MASK(bit_size);
1093*61046927SAndroid Build Coastguard Worker if (bit_size <= 16)
1094*61046927SAndroid Build Coastguard Worker reg.u64 |= reg.u64 << 16;
1095*61046927SAndroid Build Coastguard Worker return retype(reg, type);
1096*61046927SAndroid Build Coastguard Worker } else {
1097*61046927SAndroid Build Coastguard Worker reg.stride *= brw_type_size_bytes(reg.type) / brw_type_size_bytes(type);
1098*61046927SAndroid Build Coastguard Worker }
1099*61046927SAndroid Build Coastguard Worker
1100*61046927SAndroid Build Coastguard Worker return byte_offset(retype(reg, type), i * brw_type_size_bytes(type));
1101*61046927SAndroid Build Coastguard Worker }
1102*61046927SAndroid Build Coastguard Worker
1103*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
vec16(struct brw_reg reg)1104*61046927SAndroid Build Coastguard Worker vec16(struct brw_reg reg)
1105*61046927SAndroid Build Coastguard Worker {
1106*61046927SAndroid Build Coastguard Worker return stride(reg, 16,16,1);
1107*61046927SAndroid Build Coastguard Worker }
1108*61046927SAndroid Build Coastguard Worker
1109*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
vec8(struct brw_reg reg)1110*61046927SAndroid Build Coastguard Worker vec8(struct brw_reg reg)
1111*61046927SAndroid Build Coastguard Worker {
1112*61046927SAndroid Build Coastguard Worker return stride(reg, 8,8,1);
1113*61046927SAndroid Build Coastguard Worker }
1114*61046927SAndroid Build Coastguard Worker
1115*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
vec4(struct brw_reg reg)1116*61046927SAndroid Build Coastguard Worker vec4(struct brw_reg reg)
1117*61046927SAndroid Build Coastguard Worker {
1118*61046927SAndroid Build Coastguard Worker return stride(reg, 4,4,1);
1119*61046927SAndroid Build Coastguard Worker }
1120*61046927SAndroid Build Coastguard Worker
1121*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
vec2(struct brw_reg reg)1122*61046927SAndroid Build Coastguard Worker vec2(struct brw_reg reg)
1123*61046927SAndroid Build Coastguard Worker {
1124*61046927SAndroid Build Coastguard Worker return stride(reg, 2,2,1);
1125*61046927SAndroid Build Coastguard Worker }
1126*61046927SAndroid Build Coastguard Worker
1127*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
vec1(struct brw_reg reg)1128*61046927SAndroid Build Coastguard Worker vec1(struct brw_reg reg)
1129*61046927SAndroid Build Coastguard Worker {
1130*61046927SAndroid Build Coastguard Worker return stride(reg, 0,1,0);
1131*61046927SAndroid Build Coastguard Worker }
1132*61046927SAndroid Build Coastguard Worker
1133*61046927SAndroid Build Coastguard Worker
1134*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
get_element(struct brw_reg reg,unsigned elt)1135*61046927SAndroid Build Coastguard Worker get_element(struct brw_reg reg, unsigned elt)
1136*61046927SAndroid Build Coastguard Worker {
1137*61046927SAndroid Build Coastguard Worker return vec1(suboffset(reg, elt));
1138*61046927SAndroid Build Coastguard Worker }
1139*61046927SAndroid Build Coastguard Worker
1140*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
get_element_ud(struct brw_reg reg,unsigned elt)1141*61046927SAndroid Build Coastguard Worker get_element_ud(struct brw_reg reg, unsigned elt)
1142*61046927SAndroid Build Coastguard Worker {
1143*61046927SAndroid Build Coastguard Worker return vec1(suboffset(retype(reg, BRW_TYPE_UD), elt));
1144*61046927SAndroid Build Coastguard Worker }
1145*61046927SAndroid Build Coastguard Worker
1146*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
get_element_d(struct brw_reg reg,unsigned elt)1147*61046927SAndroid Build Coastguard Worker get_element_d(struct brw_reg reg, unsigned elt)
1148*61046927SAndroid Build Coastguard Worker {
1149*61046927SAndroid Build Coastguard Worker return vec1(suboffset(retype(reg, BRW_TYPE_D), elt));
1150*61046927SAndroid Build Coastguard Worker }
1151*61046927SAndroid Build Coastguard Worker
1152*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_swizzle(struct brw_reg reg,unsigned swz)1153*61046927SAndroid Build Coastguard Worker brw_swizzle(struct brw_reg reg, unsigned swz)
1154*61046927SAndroid Build Coastguard Worker {
1155*61046927SAndroid Build Coastguard Worker if (reg.file == IMM)
1156*61046927SAndroid Build Coastguard Worker reg.ud = brw_swizzle_immediate(reg.type, reg.ud, swz);
1157*61046927SAndroid Build Coastguard Worker else
1158*61046927SAndroid Build Coastguard Worker reg.swizzle = brw_compose_swizzle(swz, reg.swizzle);
1159*61046927SAndroid Build Coastguard Worker
1160*61046927SAndroid Build Coastguard Worker return reg;
1161*61046927SAndroid Build Coastguard Worker }
1162*61046927SAndroid Build Coastguard Worker
1163*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_writemask(struct brw_reg reg,unsigned mask)1164*61046927SAndroid Build Coastguard Worker brw_writemask(struct brw_reg reg, unsigned mask)
1165*61046927SAndroid Build Coastguard Worker {
1166*61046927SAndroid Build Coastguard Worker assert(reg.file != IMM);
1167*61046927SAndroid Build Coastguard Worker reg.writemask &= mask;
1168*61046927SAndroid Build Coastguard Worker return reg;
1169*61046927SAndroid Build Coastguard Worker }
1170*61046927SAndroid Build Coastguard Worker
1171*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_set_writemask(struct brw_reg reg,unsigned mask)1172*61046927SAndroid Build Coastguard Worker brw_set_writemask(struct brw_reg reg, unsigned mask)
1173*61046927SAndroid Build Coastguard Worker {
1174*61046927SAndroid Build Coastguard Worker assert(reg.file != IMM);
1175*61046927SAndroid Build Coastguard Worker reg.writemask = mask;
1176*61046927SAndroid Build Coastguard Worker return reg;
1177*61046927SAndroid Build Coastguard Worker }
1178*61046927SAndroid Build Coastguard Worker
1179*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_writemask_for_size(unsigned n)1180*61046927SAndroid Build Coastguard Worker brw_writemask_for_size(unsigned n)
1181*61046927SAndroid Build Coastguard Worker {
1182*61046927SAndroid Build Coastguard Worker return (1 << n) - 1;
1183*61046927SAndroid Build Coastguard Worker }
1184*61046927SAndroid Build Coastguard Worker
1185*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_writemask_for_component_packing(unsigned n,unsigned first_component)1186*61046927SAndroid Build Coastguard Worker brw_writemask_for_component_packing(unsigned n, unsigned first_component)
1187*61046927SAndroid Build Coastguard Worker {
1188*61046927SAndroid Build Coastguard Worker assert(first_component + n <= 4);
1189*61046927SAndroid Build Coastguard Worker return (((1 << n) - 1) << first_component);
1190*61046927SAndroid Build Coastguard Worker }
1191*61046927SAndroid Build Coastguard Worker
1192*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
negate(struct brw_reg reg)1193*61046927SAndroid Build Coastguard Worker negate(struct brw_reg reg)
1194*61046927SAndroid Build Coastguard Worker {
1195*61046927SAndroid Build Coastguard Worker reg.negate ^= 1;
1196*61046927SAndroid Build Coastguard Worker return reg;
1197*61046927SAndroid Build Coastguard Worker }
1198*61046927SAndroid Build Coastguard Worker
1199*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_abs(struct brw_reg reg)1200*61046927SAndroid Build Coastguard Worker brw_abs(struct brw_reg reg)
1201*61046927SAndroid Build Coastguard Worker {
1202*61046927SAndroid Build Coastguard Worker reg.abs = 1;
1203*61046927SAndroid Build Coastguard Worker reg.negate = 0;
1204*61046927SAndroid Build Coastguard Worker return reg;
1205*61046927SAndroid Build Coastguard Worker }
1206*61046927SAndroid Build Coastguard Worker
1207*61046927SAndroid Build Coastguard Worker /************************************************************************/
1208*61046927SAndroid Build Coastguard Worker
1209*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_vec1_indirect(unsigned subnr,int offset)1210*61046927SAndroid Build Coastguard Worker brw_vec1_indirect(unsigned subnr, int offset)
1211*61046927SAndroid Build Coastguard Worker {
1212*61046927SAndroid Build Coastguard Worker struct brw_reg reg = brw_vec1_grf(0, 0);
1213*61046927SAndroid Build Coastguard Worker reg.subnr = subnr;
1214*61046927SAndroid Build Coastguard Worker reg.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER;
1215*61046927SAndroid Build Coastguard Worker reg.indirect_offset = offset;
1216*61046927SAndroid Build Coastguard Worker return reg;
1217*61046927SAndroid Build Coastguard Worker }
1218*61046927SAndroid Build Coastguard Worker
1219*61046927SAndroid Build Coastguard Worker static inline struct brw_reg
brw_VxH_indirect(unsigned subnr,int offset)1220*61046927SAndroid Build Coastguard Worker brw_VxH_indirect(unsigned subnr, int offset)
1221*61046927SAndroid Build Coastguard Worker {
1222*61046927SAndroid Build Coastguard Worker struct brw_reg reg = brw_vec1_grf(0, 0);
1223*61046927SAndroid Build Coastguard Worker reg.vstride = BRW_VERTICAL_STRIDE_ONE_DIMENSIONAL;
1224*61046927SAndroid Build Coastguard Worker reg.subnr = subnr;
1225*61046927SAndroid Build Coastguard Worker reg.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER;
1226*61046927SAndroid Build Coastguard Worker reg.indirect_offset = offset;
1227*61046927SAndroid Build Coastguard Worker return reg;
1228*61046927SAndroid Build Coastguard Worker }
1229*61046927SAndroid Build Coastguard Worker
1230*61046927SAndroid Build Coastguard Worker static inline bool
region_matches(struct brw_reg reg,enum brw_vertical_stride v,enum brw_width w,enum brw_horizontal_stride h)1231*61046927SAndroid Build Coastguard Worker region_matches(struct brw_reg reg, enum brw_vertical_stride v,
1232*61046927SAndroid Build Coastguard Worker enum brw_width w, enum brw_horizontal_stride h)
1233*61046927SAndroid Build Coastguard Worker {
1234*61046927SAndroid Build Coastguard Worker return reg.vstride == v &&
1235*61046927SAndroid Build Coastguard Worker reg.width == w &&
1236*61046927SAndroid Build Coastguard Worker reg.hstride == h;
1237*61046927SAndroid Build Coastguard Worker }
1238*61046927SAndroid Build Coastguard Worker
1239*61046927SAndroid Build Coastguard Worker #define has_scalar_region(reg) \
1240*61046927SAndroid Build Coastguard Worker region_matches(reg, BRW_VERTICAL_STRIDE_0, BRW_WIDTH_1, \
1241*61046927SAndroid Build Coastguard Worker BRW_HORIZONTAL_STRIDE_0)
1242*61046927SAndroid Build Coastguard Worker
1243*61046927SAndroid Build Coastguard Worker /**
1244*61046927SAndroid Build Coastguard Worker * Return the size in bytes per data element of register \p reg on the
1245*61046927SAndroid Build Coastguard Worker * corresponding register file.
1246*61046927SAndroid Build Coastguard Worker */
1247*61046927SAndroid Build Coastguard Worker static inline unsigned
element_sz(struct brw_reg reg)1248*61046927SAndroid Build Coastguard Worker element_sz(struct brw_reg reg)
1249*61046927SAndroid Build Coastguard Worker {
1250*61046927SAndroid Build Coastguard Worker if (reg.file == IMM || has_scalar_region(reg)) {
1251*61046927SAndroid Build Coastguard Worker return brw_type_size_bytes(reg.type);
1252*61046927SAndroid Build Coastguard Worker
1253*61046927SAndroid Build Coastguard Worker } else if (reg.width == BRW_WIDTH_1 &&
1254*61046927SAndroid Build Coastguard Worker reg.hstride == BRW_HORIZONTAL_STRIDE_0) {
1255*61046927SAndroid Build Coastguard Worker assert(reg.vstride != BRW_VERTICAL_STRIDE_0);
1256*61046927SAndroid Build Coastguard Worker return brw_type_size_bytes(reg.type) << (reg.vstride - 1);
1257*61046927SAndroid Build Coastguard Worker
1258*61046927SAndroid Build Coastguard Worker } else {
1259*61046927SAndroid Build Coastguard Worker assert(reg.hstride != BRW_HORIZONTAL_STRIDE_0);
1260*61046927SAndroid Build Coastguard Worker assert(reg.vstride == reg.hstride + reg.width);
1261*61046927SAndroid Build Coastguard Worker return brw_type_size_bytes(reg.type) << (reg.hstride - 1);
1262*61046927SAndroid Build Coastguard Worker }
1263*61046927SAndroid Build Coastguard Worker }
1264*61046927SAndroid Build Coastguard Worker
1265*61046927SAndroid Build Coastguard Worker /* brw_packed_float.c */
1266*61046927SAndroid Build Coastguard Worker int brw_float_to_vf(float f);
1267*61046927SAndroid Build Coastguard Worker float brw_vf_to_float(unsigned char vf);
1268*61046927SAndroid Build Coastguard Worker
1269*61046927SAndroid Build Coastguard Worker bool brw_reg_saturate_immediate(brw_reg *reg);
1270*61046927SAndroid Build Coastguard Worker bool brw_reg_negate_immediate(brw_reg *reg);
1271*61046927SAndroid Build Coastguard Worker bool brw_reg_abs_immediate(brw_reg *reg);
1272*61046927SAndroid Build Coastguard Worker
1273*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
1274*61046927SAndroid Build Coastguard Worker }
1275*61046927SAndroid Build Coastguard Worker #endif
1276*61046927SAndroid Build Coastguard Worker
1277*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
1278*61046927SAndroid Build Coastguard Worker
1279*61046927SAndroid Build Coastguard Worker static inline brw_reg
horiz_offset(const brw_reg & reg,unsigned delta)1280*61046927SAndroid Build Coastguard Worker horiz_offset(const brw_reg ®, unsigned delta)
1281*61046927SAndroid Build Coastguard Worker {
1282*61046927SAndroid Build Coastguard Worker switch (reg.file) {
1283*61046927SAndroid Build Coastguard Worker case BAD_FILE:
1284*61046927SAndroid Build Coastguard Worker case UNIFORM:
1285*61046927SAndroid Build Coastguard Worker case IMM:
1286*61046927SAndroid Build Coastguard Worker /* These only have a single component that is implicitly splatted. A
1287*61046927SAndroid Build Coastguard Worker * horizontal offset should be a harmless no-op.
1288*61046927SAndroid Build Coastguard Worker * XXX - Handle vector immediates correctly.
1289*61046927SAndroid Build Coastguard Worker */
1290*61046927SAndroid Build Coastguard Worker return reg;
1291*61046927SAndroid Build Coastguard Worker case VGRF:
1292*61046927SAndroid Build Coastguard Worker case ATTR:
1293*61046927SAndroid Build Coastguard Worker return byte_offset(reg, delta * reg.stride * brw_type_size_bytes(reg.type));
1294*61046927SAndroid Build Coastguard Worker case ARF:
1295*61046927SAndroid Build Coastguard Worker case FIXED_GRF:
1296*61046927SAndroid Build Coastguard Worker if (reg.is_null()) {
1297*61046927SAndroid Build Coastguard Worker return reg;
1298*61046927SAndroid Build Coastguard Worker } else {
1299*61046927SAndroid Build Coastguard Worker const unsigned hstride = reg.hstride ? 1 << (reg.hstride - 1) : 0;
1300*61046927SAndroid Build Coastguard Worker const unsigned vstride = reg.vstride ? 1 << (reg.vstride - 1) : 0;
1301*61046927SAndroid Build Coastguard Worker const unsigned width = 1 << reg.width;
1302*61046927SAndroid Build Coastguard Worker
1303*61046927SAndroid Build Coastguard Worker if (delta % width == 0) {
1304*61046927SAndroid Build Coastguard Worker return byte_offset(reg, delta / width * vstride * brw_type_size_bytes(reg.type));
1305*61046927SAndroid Build Coastguard Worker } else {
1306*61046927SAndroid Build Coastguard Worker assert(vstride == hstride * width);
1307*61046927SAndroid Build Coastguard Worker return byte_offset(reg, delta * hstride * brw_type_size_bytes(reg.type));
1308*61046927SAndroid Build Coastguard Worker }
1309*61046927SAndroid Build Coastguard Worker }
1310*61046927SAndroid Build Coastguard Worker }
1311*61046927SAndroid Build Coastguard Worker unreachable("Invalid register file");
1312*61046927SAndroid Build Coastguard Worker }
1313*61046927SAndroid Build Coastguard Worker
1314*61046927SAndroid Build Coastguard Worker static inline brw_reg
offset(brw_reg reg,unsigned width,unsigned delta)1315*61046927SAndroid Build Coastguard Worker offset(brw_reg reg, unsigned width, unsigned delta)
1316*61046927SAndroid Build Coastguard Worker {
1317*61046927SAndroid Build Coastguard Worker switch (reg.file) {
1318*61046927SAndroid Build Coastguard Worker case BAD_FILE:
1319*61046927SAndroid Build Coastguard Worker break;
1320*61046927SAndroid Build Coastguard Worker case ARF:
1321*61046927SAndroid Build Coastguard Worker case FIXED_GRF:
1322*61046927SAndroid Build Coastguard Worker case VGRF:
1323*61046927SAndroid Build Coastguard Worker case ATTR:
1324*61046927SAndroid Build Coastguard Worker case UNIFORM:
1325*61046927SAndroid Build Coastguard Worker return byte_offset(reg, delta * reg.component_size(width));
1326*61046927SAndroid Build Coastguard Worker case IMM:
1327*61046927SAndroid Build Coastguard Worker assert(delta == 0);
1328*61046927SAndroid Build Coastguard Worker }
1329*61046927SAndroid Build Coastguard Worker return reg;
1330*61046927SAndroid Build Coastguard Worker }
1331*61046927SAndroid Build Coastguard Worker
1332*61046927SAndroid Build Coastguard Worker /**
1333*61046927SAndroid Build Coastguard Worker * Get the scalar channel of \p reg given by \p idx and replicate it to all
1334*61046927SAndroid Build Coastguard Worker * channels of the result.
1335*61046927SAndroid Build Coastguard Worker */
1336*61046927SAndroid Build Coastguard Worker static inline brw_reg
component(brw_reg reg,unsigned idx)1337*61046927SAndroid Build Coastguard Worker component(brw_reg reg, unsigned idx)
1338*61046927SAndroid Build Coastguard Worker {
1339*61046927SAndroid Build Coastguard Worker reg = horiz_offset(reg, idx);
1340*61046927SAndroid Build Coastguard Worker reg.stride = 0;
1341*61046927SAndroid Build Coastguard Worker if (reg.file == ARF || reg.file == FIXED_GRF) {
1342*61046927SAndroid Build Coastguard Worker reg.vstride = BRW_VERTICAL_STRIDE_0;
1343*61046927SAndroid Build Coastguard Worker reg.width = BRW_WIDTH_1;
1344*61046927SAndroid Build Coastguard Worker reg.hstride = BRW_HORIZONTAL_STRIDE_0;
1345*61046927SAndroid Build Coastguard Worker }
1346*61046927SAndroid Build Coastguard Worker return reg;
1347*61046927SAndroid Build Coastguard Worker }
1348*61046927SAndroid Build Coastguard Worker
1349*61046927SAndroid Build Coastguard Worker /**
1350*61046927SAndroid Build Coastguard Worker * Return an integer identifying the discrete address space a register is
1351*61046927SAndroid Build Coastguard Worker * contained in. A register is by definition fully contained in the single
1352*61046927SAndroid Build Coastguard Worker * reg_space it belongs to, so two registers with different reg_space ids are
1353*61046927SAndroid Build Coastguard Worker * guaranteed not to overlap. Most register files are a single reg_space of
1354*61046927SAndroid Build Coastguard Worker * its own, only the VGRF and ATTR files are composed of multiple discrete
1355*61046927SAndroid Build Coastguard Worker * address spaces, one for each allocation and input attribute respectively.
1356*61046927SAndroid Build Coastguard Worker */
1357*61046927SAndroid Build Coastguard Worker static inline uint32_t
reg_space(const brw_reg & r)1358*61046927SAndroid Build Coastguard Worker reg_space(const brw_reg &r)
1359*61046927SAndroid Build Coastguard Worker {
1360*61046927SAndroid Build Coastguard Worker return r.file << 16 | (r.file == VGRF || r.file == ATTR ? r.nr : 0);
1361*61046927SAndroid Build Coastguard Worker }
1362*61046927SAndroid Build Coastguard Worker
1363*61046927SAndroid Build Coastguard Worker /**
1364*61046927SAndroid Build Coastguard Worker * Return the base offset in bytes of a register relative to the start of its
1365*61046927SAndroid Build Coastguard Worker * reg_space().
1366*61046927SAndroid Build Coastguard Worker */
1367*61046927SAndroid Build Coastguard Worker static inline unsigned
reg_offset(const brw_reg & r)1368*61046927SAndroid Build Coastguard Worker reg_offset(const brw_reg &r)
1369*61046927SAndroid Build Coastguard Worker {
1370*61046927SAndroid Build Coastguard Worker return (r.file == VGRF || r.file == IMM || r.file == ATTR ? 0 : r.nr) *
1371*61046927SAndroid Build Coastguard Worker (r.file == UNIFORM ? 4 : REG_SIZE) + r.offset +
1372*61046927SAndroid Build Coastguard Worker (r.file == ARF || r.file == FIXED_GRF ? r.subnr : 0);
1373*61046927SAndroid Build Coastguard Worker }
1374*61046927SAndroid Build Coastguard Worker
1375*61046927SAndroid Build Coastguard Worker /**
1376*61046927SAndroid Build Coastguard Worker * Return the amount of padding in bytes left unused between individual
1377*61046927SAndroid Build Coastguard Worker * components of register \p r due to a (horizontal) stride value greater than
1378*61046927SAndroid Build Coastguard Worker * one, or zero if components are tightly packed in the register file.
1379*61046927SAndroid Build Coastguard Worker */
1380*61046927SAndroid Build Coastguard Worker static inline unsigned
reg_padding(const brw_reg & r)1381*61046927SAndroid Build Coastguard Worker reg_padding(const brw_reg &r)
1382*61046927SAndroid Build Coastguard Worker {
1383*61046927SAndroid Build Coastguard Worker const unsigned stride = ((r.file != ARF && r.file != FIXED_GRF) ? r.stride :
1384*61046927SAndroid Build Coastguard Worker r.hstride == 0 ? 0 :
1385*61046927SAndroid Build Coastguard Worker 1 << (r.hstride - 1));
1386*61046927SAndroid Build Coastguard Worker return (MAX2(1, stride) - 1) * brw_type_size_bytes(r.type);
1387*61046927SAndroid Build Coastguard Worker }
1388*61046927SAndroid Build Coastguard Worker
1389*61046927SAndroid Build Coastguard Worker /**
1390*61046927SAndroid Build Coastguard Worker * Return whether the register region starting at \p r and spanning \p dr
1391*61046927SAndroid Build Coastguard Worker * bytes could potentially overlap the register region starting at \p s and
1392*61046927SAndroid Build Coastguard Worker * spanning \p ds bytes.
1393*61046927SAndroid Build Coastguard Worker */
1394*61046927SAndroid Build Coastguard Worker static inline bool
regions_overlap(const brw_reg & r,unsigned dr,const brw_reg & s,unsigned ds)1395*61046927SAndroid Build Coastguard Worker regions_overlap(const brw_reg &r, unsigned dr, const brw_reg &s, unsigned ds)
1396*61046927SAndroid Build Coastguard Worker {
1397*61046927SAndroid Build Coastguard Worker if (r.file != s.file)
1398*61046927SAndroid Build Coastguard Worker return false;
1399*61046927SAndroid Build Coastguard Worker
1400*61046927SAndroid Build Coastguard Worker if (r.file == VGRF) {
1401*61046927SAndroid Build Coastguard Worker return r.nr == s.nr &&
1402*61046927SAndroid Build Coastguard Worker !(r.offset + dr <= s.offset || s.offset + ds <= r.offset);
1403*61046927SAndroid Build Coastguard Worker } else {
1404*61046927SAndroid Build Coastguard Worker return !(reg_offset(r) + dr <= reg_offset(s) ||
1405*61046927SAndroid Build Coastguard Worker reg_offset(s) + ds <= reg_offset(r));
1406*61046927SAndroid Build Coastguard Worker }
1407*61046927SAndroid Build Coastguard Worker }
1408*61046927SAndroid Build Coastguard Worker
1409*61046927SAndroid Build Coastguard Worker /**
1410*61046927SAndroid Build Coastguard Worker * Check that the register region given by r [r.offset, r.offset + dr[
1411*61046927SAndroid Build Coastguard Worker * is fully contained inside the register region given by s
1412*61046927SAndroid Build Coastguard Worker * [s.offset, s.offset + ds[.
1413*61046927SAndroid Build Coastguard Worker */
1414*61046927SAndroid Build Coastguard Worker static inline bool
region_contained_in(const brw_reg & r,unsigned dr,const brw_reg & s,unsigned ds)1415*61046927SAndroid Build Coastguard Worker region_contained_in(const brw_reg &r, unsigned dr, const brw_reg &s, unsigned ds)
1416*61046927SAndroid Build Coastguard Worker {
1417*61046927SAndroid Build Coastguard Worker return reg_space(r) == reg_space(s) &&
1418*61046927SAndroid Build Coastguard Worker reg_offset(r) >= reg_offset(s) &&
1419*61046927SAndroid Build Coastguard Worker reg_offset(r) + dr <= reg_offset(s) + ds;
1420*61046927SAndroid Build Coastguard Worker }
1421*61046927SAndroid Build Coastguard Worker
1422*61046927SAndroid Build Coastguard Worker /**
1423*61046927SAndroid Build Coastguard Worker * Return whether the given register region is n-periodic, i.e. whether the
1424*61046927SAndroid Build Coastguard Worker * original region remains invariant after shifting it by \p n scalar
1425*61046927SAndroid Build Coastguard Worker * channels.
1426*61046927SAndroid Build Coastguard Worker */
1427*61046927SAndroid Build Coastguard Worker static inline bool
is_periodic(const brw_reg & reg,unsigned n)1428*61046927SAndroid Build Coastguard Worker is_periodic(const brw_reg ®, unsigned n)
1429*61046927SAndroid Build Coastguard Worker {
1430*61046927SAndroid Build Coastguard Worker if (reg.file == BAD_FILE || reg.is_null()) {
1431*61046927SAndroid Build Coastguard Worker return true;
1432*61046927SAndroid Build Coastguard Worker
1433*61046927SAndroid Build Coastguard Worker } else if (reg.file == IMM) {
1434*61046927SAndroid Build Coastguard Worker const unsigned period = (reg.type == BRW_TYPE_UV ||
1435*61046927SAndroid Build Coastguard Worker reg.type == BRW_TYPE_V ? 8 :
1436*61046927SAndroid Build Coastguard Worker reg.type == BRW_TYPE_VF ? 4 :
1437*61046927SAndroid Build Coastguard Worker 1);
1438*61046927SAndroid Build Coastguard Worker return n % period == 0;
1439*61046927SAndroid Build Coastguard Worker
1440*61046927SAndroid Build Coastguard Worker } else if (reg.file == ARF || reg.file == FIXED_GRF) {
1441*61046927SAndroid Build Coastguard Worker const unsigned period = (reg.hstride == 0 && reg.vstride == 0 ? 1 :
1442*61046927SAndroid Build Coastguard Worker reg.vstride == 0 ? 1 << reg.width :
1443*61046927SAndroid Build Coastguard Worker ~0);
1444*61046927SAndroid Build Coastguard Worker return n % period == 0;
1445*61046927SAndroid Build Coastguard Worker
1446*61046927SAndroid Build Coastguard Worker } else {
1447*61046927SAndroid Build Coastguard Worker return reg.stride == 0;
1448*61046927SAndroid Build Coastguard Worker }
1449*61046927SAndroid Build Coastguard Worker }
1450*61046927SAndroid Build Coastguard Worker
1451*61046927SAndroid Build Coastguard Worker static inline bool
is_uniform(const brw_reg & reg)1452*61046927SAndroid Build Coastguard Worker is_uniform(const brw_reg ®)
1453*61046927SAndroid Build Coastguard Worker {
1454*61046927SAndroid Build Coastguard Worker return is_periodic(reg, 1);
1455*61046927SAndroid Build Coastguard Worker }
1456*61046927SAndroid Build Coastguard Worker
1457*61046927SAndroid Build Coastguard Worker /**
1458*61046927SAndroid Build Coastguard Worker * Get the specified 8-component quarter of a register.
1459*61046927SAndroid Build Coastguard Worker */
1460*61046927SAndroid Build Coastguard Worker static inline brw_reg
quarter(const brw_reg & reg,unsigned idx)1461*61046927SAndroid Build Coastguard Worker quarter(const brw_reg ®, unsigned idx)
1462*61046927SAndroid Build Coastguard Worker {
1463*61046927SAndroid Build Coastguard Worker assert(idx < 4);
1464*61046927SAndroid Build Coastguard Worker return horiz_offset(reg, 8 * idx);
1465*61046927SAndroid Build Coastguard Worker }
1466*61046927SAndroid Build Coastguard Worker
1467*61046927SAndroid Build Coastguard Worker static inline brw_reg
horiz_stride(brw_reg reg,unsigned s)1468*61046927SAndroid Build Coastguard Worker horiz_stride(brw_reg reg, unsigned s)
1469*61046927SAndroid Build Coastguard Worker {
1470*61046927SAndroid Build Coastguard Worker reg.stride *= s;
1471*61046927SAndroid Build Coastguard Worker return reg;
1472*61046927SAndroid Build Coastguard Worker }
1473*61046927SAndroid Build Coastguard Worker
1474*61046927SAndroid Build Coastguard Worker static const brw_reg reg_undef;
1475*61046927SAndroid Build Coastguard Worker
1476*61046927SAndroid Build Coastguard Worker /*
1477*61046927SAndroid Build Coastguard Worker * Return the stride between channels of the specified register in
1478*61046927SAndroid Build Coastguard Worker * byte units, or ~0u if the region cannot be represented with a
1479*61046927SAndroid Build Coastguard Worker * single one-dimensional stride.
1480*61046927SAndroid Build Coastguard Worker */
1481*61046927SAndroid Build Coastguard Worker static inline unsigned
byte_stride(const brw_reg & reg)1482*61046927SAndroid Build Coastguard Worker byte_stride(const brw_reg ®)
1483*61046927SAndroid Build Coastguard Worker {
1484*61046927SAndroid Build Coastguard Worker switch (reg.file) {
1485*61046927SAndroid Build Coastguard Worker case BAD_FILE:
1486*61046927SAndroid Build Coastguard Worker case UNIFORM:
1487*61046927SAndroid Build Coastguard Worker case IMM:
1488*61046927SAndroid Build Coastguard Worker case VGRF:
1489*61046927SAndroid Build Coastguard Worker case ATTR:
1490*61046927SAndroid Build Coastguard Worker return reg.stride * brw_type_size_bytes(reg.type);
1491*61046927SAndroid Build Coastguard Worker case ARF:
1492*61046927SAndroid Build Coastguard Worker case FIXED_GRF:
1493*61046927SAndroid Build Coastguard Worker if (reg.is_null()) {
1494*61046927SAndroid Build Coastguard Worker return 0;
1495*61046927SAndroid Build Coastguard Worker } else {
1496*61046927SAndroid Build Coastguard Worker const unsigned hstride = reg.hstride ? 1 << (reg.hstride - 1) : 0;
1497*61046927SAndroid Build Coastguard Worker const unsigned vstride = reg.vstride ? 1 << (reg.vstride - 1) : 0;
1498*61046927SAndroid Build Coastguard Worker const unsigned width = 1 << reg.width;
1499*61046927SAndroid Build Coastguard Worker
1500*61046927SAndroid Build Coastguard Worker if (width == 1) {
1501*61046927SAndroid Build Coastguard Worker return vstride * brw_type_size_bytes(reg.type);
1502*61046927SAndroid Build Coastguard Worker } else if (hstride * width == vstride) {
1503*61046927SAndroid Build Coastguard Worker return hstride * brw_type_size_bytes(reg.type);
1504*61046927SAndroid Build Coastguard Worker } else {
1505*61046927SAndroid Build Coastguard Worker return ~0u;
1506*61046927SAndroid Build Coastguard Worker }
1507*61046927SAndroid Build Coastguard Worker }
1508*61046927SAndroid Build Coastguard Worker default:
1509*61046927SAndroid Build Coastguard Worker unreachable("Invalid register file");
1510*61046927SAndroid Build Coastguard Worker }
1511*61046927SAndroid Build Coastguard Worker }
1512*61046927SAndroid Build Coastguard Worker
1513*61046927SAndroid Build Coastguard Worker #endif /* __cplusplus */
1514*61046927SAndroid Build Coastguard Worker
1515*61046927SAndroid Build Coastguard Worker #endif
1516