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