xref: /aosp_15_r20/external/igt-gpu-tools/assembler/gram.y (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker %{
2*d83cc019SAndroid Build Coastguard Worker /*
3*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2006 Intel Corporation
4*d83cc019SAndroid Build Coastguard Worker  *
5*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
6*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
7*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
8*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
10*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
11*d83cc019SAndroid Build Coastguard Worker  *
12*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
13*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
14*d83cc019SAndroid Build Coastguard Worker  * Software.
15*d83cc019SAndroid Build Coastguard Worker  *
16*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*d83cc019SAndroid Build Coastguard Worker  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*d83cc019SAndroid Build Coastguard Worker  * SOFTWARE.
23*d83cc019SAndroid Build Coastguard Worker  *
24*d83cc019SAndroid Build Coastguard Worker  * Authors:
25*d83cc019SAndroid Build Coastguard Worker  *    Eric Anholt <[email protected]>
26*d83cc019SAndroid Build Coastguard Worker  *
27*d83cc019SAndroid Build Coastguard Worker  */
28*d83cc019SAndroid Build Coastguard Worker 
29*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
30*d83cc019SAndroid Build Coastguard Worker #include <string.h>
31*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
32*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
33*d83cc019SAndroid Build Coastguard Worker #include <stdarg.h>
34*d83cc019SAndroid Build Coastguard Worker #include <assert.h>
35*d83cc019SAndroid Build Coastguard Worker #include "gen4asm.h"
36*d83cc019SAndroid Build Coastguard Worker #include "brw_eu.h"
37*d83cc019SAndroid Build Coastguard Worker #include "gen8_instruction.h"
38*d83cc019SAndroid Build Coastguard Worker 
39*d83cc019SAndroid Build Coastguard Worker #define DEFAULT_EXECSIZE (ffs(program_defaults.execute_size) - 1)
40*d83cc019SAndroid Build Coastguard Worker #define DEFAULT_DSTREGION -1
41*d83cc019SAndroid Build Coastguard Worker 
42*d83cc019SAndroid Build Coastguard Worker #define SWIZZLE(reg) (reg.dw1.bits.swizzle)
43*d83cc019SAndroid Build Coastguard Worker 
44*d83cc019SAndroid Build Coastguard Worker #define GEN(i)	(&(i)->insn.gen)
45*d83cc019SAndroid Build Coastguard Worker #define GEN8(i)	(&(i)->insn.gen8)
46*d83cc019SAndroid Build Coastguard Worker 
47*d83cc019SAndroid Build Coastguard Worker #define YYLTYPE YYLTYPE
48*d83cc019SAndroid Build Coastguard Worker typedef struct YYLTYPE
49*d83cc019SAndroid Build Coastguard Worker {
50*d83cc019SAndroid Build Coastguard Worker  int first_line;
51*d83cc019SAndroid Build Coastguard Worker  int first_column;
52*d83cc019SAndroid Build Coastguard Worker  int last_line;
53*d83cc019SAndroid Build Coastguard Worker  int last_column;
54*d83cc019SAndroid Build Coastguard Worker } YYLTYPE;
55*d83cc019SAndroid Build Coastguard Worker 
56*d83cc019SAndroid Build Coastguard Worker extern int need_export;
57*d83cc019SAndroid Build Coastguard Worker static struct src_operand src_null_reg =
58*d83cc019SAndroid Build Coastguard Worker {
59*d83cc019SAndroid Build Coastguard Worker     .reg.file = BRW_ARCHITECTURE_REGISTER_FILE,
60*d83cc019SAndroid Build Coastguard Worker     .reg.nr = BRW_ARF_NULL,
61*d83cc019SAndroid Build Coastguard Worker     .reg.type = BRW_REGISTER_TYPE_UD,
62*d83cc019SAndroid Build Coastguard Worker };
63*d83cc019SAndroid Build Coastguard Worker static struct brw_reg dst_null_reg =
64*d83cc019SAndroid Build Coastguard Worker {
65*d83cc019SAndroid Build Coastguard Worker     .file = BRW_ARCHITECTURE_REGISTER_FILE,
66*d83cc019SAndroid Build Coastguard Worker     .nr = BRW_ARF_NULL,
67*d83cc019SAndroid Build Coastguard Worker };
68*d83cc019SAndroid Build Coastguard Worker static struct brw_reg ip_dst =
69*d83cc019SAndroid Build Coastguard Worker {
70*d83cc019SAndroid Build Coastguard Worker     .file = BRW_ARCHITECTURE_REGISTER_FILE,
71*d83cc019SAndroid Build Coastguard Worker     .nr = BRW_ARF_IP,
72*d83cc019SAndroid Build Coastguard Worker     .type = BRW_REGISTER_TYPE_UD,
73*d83cc019SAndroid Build Coastguard Worker     .address_mode = BRW_ADDRESS_DIRECT,
74*d83cc019SAndroid Build Coastguard Worker     .hstride = 1,
75*d83cc019SAndroid Build Coastguard Worker     .dw1.bits.writemask = BRW_WRITEMASK_XYZW,
76*d83cc019SAndroid Build Coastguard Worker };
77*d83cc019SAndroid Build Coastguard Worker static struct src_operand ip_src =
78*d83cc019SAndroid Build Coastguard Worker {
79*d83cc019SAndroid Build Coastguard Worker     .reg.file = BRW_ARCHITECTURE_REGISTER_FILE,
80*d83cc019SAndroid Build Coastguard Worker     .reg.nr = BRW_ARF_IP,
81*d83cc019SAndroid Build Coastguard Worker     .reg.type = BRW_REGISTER_TYPE_UD,
82*d83cc019SAndroid Build Coastguard Worker     .reg.address_mode = BRW_ADDRESS_DIRECT,
83*d83cc019SAndroid Build Coastguard Worker     .reg.dw1.bits.swizzle = BRW_SWIZZLE_NOOP,
84*d83cc019SAndroid Build Coastguard Worker };
85*d83cc019SAndroid Build Coastguard Worker 
86*d83cc019SAndroid Build Coastguard Worker static int get_type_size(unsigned type);
87*d83cc019SAndroid Build Coastguard Worker static void set_instruction_opcode(struct brw_program_instruction *instr,
88*d83cc019SAndroid Build Coastguard Worker 				   unsigned opcode);
89*d83cc019SAndroid Build Coastguard Worker static int set_instruction_dest(struct brw_program_instruction *instr,
90*d83cc019SAndroid Build Coastguard Worker 				struct brw_reg *dest);
91*d83cc019SAndroid Build Coastguard Worker static int set_instruction_src0(struct brw_program_instruction *instr,
92*d83cc019SAndroid Build Coastguard Worker 				struct src_operand *src,
93*d83cc019SAndroid Build Coastguard Worker 				YYLTYPE *location);
94*d83cc019SAndroid Build Coastguard Worker static int set_instruction_src1(struct brw_program_instruction *instr,
95*d83cc019SAndroid Build Coastguard Worker 				struct src_operand *src,
96*d83cc019SAndroid Build Coastguard Worker 				YYLTYPE *location);
97*d83cc019SAndroid Build Coastguard Worker static int set_instruction_dest_three_src(struct brw_program_instruction *instr,
98*d83cc019SAndroid Build Coastguard Worker 					  struct brw_reg *dest);
99*d83cc019SAndroid Build Coastguard Worker static int set_instruction_src0_three_src(struct brw_program_instruction *instr,
100*d83cc019SAndroid Build Coastguard Worker 					  struct src_operand *src);
101*d83cc019SAndroid Build Coastguard Worker static int set_instruction_src1_three_src(struct brw_program_instruction *instr,
102*d83cc019SAndroid Build Coastguard Worker 					  struct src_operand *src);
103*d83cc019SAndroid Build Coastguard Worker static int set_instruction_src2_three_src(struct brw_program_instruction *instr,
104*d83cc019SAndroid Build Coastguard Worker 					  struct src_operand *src);
105*d83cc019SAndroid Build Coastguard Worker static void set_instruction_saturate(struct brw_program_instruction *instr,
106*d83cc019SAndroid Build Coastguard Worker 				     int saturate);
107*d83cc019SAndroid Build Coastguard Worker static void set_instruction_options(struct brw_program_instruction *instr,
108*d83cc019SAndroid Build Coastguard Worker 				    struct options options);
109*d83cc019SAndroid Build Coastguard Worker static void set_instruction_predicate(struct brw_program_instruction *instr,
110*d83cc019SAndroid Build Coastguard Worker 				      struct predicate *p);
111*d83cc019SAndroid Build Coastguard Worker static void set_instruction_pred_cond(struct brw_program_instruction *instr,
112*d83cc019SAndroid Build Coastguard Worker 				      struct predicate *p,
113*d83cc019SAndroid Build Coastguard Worker 				      struct condition *c,
114*d83cc019SAndroid Build Coastguard Worker 				      YYLTYPE *location);
115*d83cc019SAndroid Build Coastguard Worker static void set_direct_dst_operand(struct brw_reg *dst, struct brw_reg *reg,
116*d83cc019SAndroid Build Coastguard Worker 				   int type);
117*d83cc019SAndroid Build Coastguard Worker static void set_direct_src_operand(struct src_operand *src, struct brw_reg *reg,
118*d83cc019SAndroid Build Coastguard Worker 				   int type);
119*d83cc019SAndroid Build Coastguard Worker 
120*d83cc019SAndroid Build Coastguard Worker void set_branch_two_offsets(struct brw_program_instruction *insn, int jip_offset, int uip_offset);
121*d83cc019SAndroid Build Coastguard Worker void set_branch_one_offset(struct brw_program_instruction *insn, int jip_offset);
122*d83cc019SAndroid Build Coastguard Worker 
123*d83cc019SAndroid Build Coastguard Worker enum message_level {
124*d83cc019SAndroid Build Coastguard Worker     WARN,
125*d83cc019SAndroid Build Coastguard Worker     ERROR,
126*d83cc019SAndroid Build Coastguard Worker };
127*d83cc019SAndroid Build Coastguard Worker 
message(enum message_level level,YYLTYPE * location,const char * fmt,...)128*d83cc019SAndroid Build Coastguard Worker static void message(enum message_level level, YYLTYPE *location,
129*d83cc019SAndroid Build Coastguard Worker 		    const char *fmt, ...)
130*d83cc019SAndroid Build Coastguard Worker {
131*d83cc019SAndroid Build Coastguard Worker     static const char *level_str[] = { "warning", "error" };
132*d83cc019SAndroid Build Coastguard Worker     va_list args;
133*d83cc019SAndroid Build Coastguard Worker 
134*d83cc019SAndroid Build Coastguard Worker     if (location)
135*d83cc019SAndroid Build Coastguard Worker 	fprintf(stderr, "%s:%d:%d: %s: ", input_filename, location->first_line,
136*d83cc019SAndroid Build Coastguard Worker 		location->first_column, level_str[level]);
137*d83cc019SAndroid Build Coastguard Worker     else
138*d83cc019SAndroid Build Coastguard Worker 	fprintf(stderr, "%s:%s: ", input_filename, level_str[level]);
139*d83cc019SAndroid Build Coastguard Worker 
140*d83cc019SAndroid Build Coastguard Worker     va_start(args, fmt);
141*d83cc019SAndroid Build Coastguard Worker     vfprintf(stderr, fmt, args);
142*d83cc019SAndroid Build Coastguard Worker     va_end(args);
143*d83cc019SAndroid Build Coastguard Worker }
144*d83cc019SAndroid Build Coastguard Worker 
145*d83cc019SAndroid Build Coastguard Worker #define warn(flag, l, fmt, ...)					\
146*d83cc019SAndroid Build Coastguard Worker     do {							\
147*d83cc019SAndroid Build Coastguard Worker 	if (warning_flags & WARN_ ## flag)			\
148*d83cc019SAndroid Build Coastguard Worker 	    message(WARN, l, fmt, ## __VA_ARGS__);	\
149*d83cc019SAndroid Build Coastguard Worker     } while(0)
150*d83cc019SAndroid Build Coastguard Worker 
151*d83cc019SAndroid Build Coastguard Worker #define error(l, fmt, ...)			\
152*d83cc019SAndroid Build Coastguard Worker     do {					\
153*d83cc019SAndroid Build Coastguard Worker 	message(ERROR, l, fmt, ## __VA_ARGS__);	\
154*d83cc019SAndroid Build Coastguard Worker     } while(0)
155*d83cc019SAndroid Build Coastguard Worker 
156*d83cc019SAndroid Build Coastguard Worker /* like strcmp, but handles NULL pointers */
strcmp0(const char * s1,const char * s2)157*d83cc019SAndroid Build Coastguard Worker static bool strcmp0(const char *s1, const char* s2)
158*d83cc019SAndroid Build Coastguard Worker {
159*d83cc019SAndroid Build Coastguard Worker     if (!s1)
160*d83cc019SAndroid Build Coastguard Worker 	return -(s1 != s2);
161*d83cc019SAndroid Build Coastguard Worker     if (!s2)
162*d83cc019SAndroid Build Coastguard Worker 	return s1 != s2;
163*d83cc019SAndroid Build Coastguard Worker     return strcmp (s1, s2);
164*d83cc019SAndroid Build Coastguard Worker }
165*d83cc019SAndroid Build Coastguard Worker 
region_equal(struct region * r1,struct region * r2)166*d83cc019SAndroid Build Coastguard Worker static bool region_equal(struct region *r1, struct region *r2)
167*d83cc019SAndroid Build Coastguard Worker {
168*d83cc019SAndroid Build Coastguard Worker     return memcmp(r1, r2, sizeof(struct region)) == 0;
169*d83cc019SAndroid Build Coastguard Worker }
170*d83cc019SAndroid Build Coastguard Worker 
reg_equal(struct brw_reg * r1,struct brw_reg * r2)171*d83cc019SAndroid Build Coastguard Worker static bool reg_equal(struct brw_reg *r1, struct brw_reg *r2)
172*d83cc019SAndroid Build Coastguard Worker {
173*d83cc019SAndroid Build Coastguard Worker     return memcmp(r1, r2, sizeof(struct brw_reg)) == 0;
174*d83cc019SAndroid Build Coastguard Worker }
175*d83cc019SAndroid Build Coastguard Worker 
declared_register_equal(struct declared_register * r1,struct declared_register * r2)176*d83cc019SAndroid Build Coastguard Worker static bool declared_register_equal(struct declared_register *r1,
177*d83cc019SAndroid Build Coastguard Worker 				     struct declared_register *r2)
178*d83cc019SAndroid Build Coastguard Worker {
179*d83cc019SAndroid Build Coastguard Worker     if (strcmp0(r1->name, r2->name) != 0)
180*d83cc019SAndroid Build Coastguard Worker 	return false;
181*d83cc019SAndroid Build Coastguard Worker 
182*d83cc019SAndroid Build Coastguard Worker     if (!reg_equal(&r1->reg, &r2->reg))
183*d83cc019SAndroid Build Coastguard Worker 	return false;
184*d83cc019SAndroid Build Coastguard Worker 
185*d83cc019SAndroid Build Coastguard Worker     if (!region_equal(&r1->src_region, &r2->src_region))
186*d83cc019SAndroid Build Coastguard Worker 	return false;
187*d83cc019SAndroid Build Coastguard Worker 
188*d83cc019SAndroid Build Coastguard Worker     if (r1->element_size != r2->element_size ||
189*d83cc019SAndroid Build Coastguard Worker         r1->dst_region != r2->dst_region)
190*d83cc019SAndroid Build Coastguard Worker 	return false;
191*d83cc019SAndroid Build Coastguard Worker 
192*d83cc019SAndroid Build Coastguard Worker     return true;
193*d83cc019SAndroid Build Coastguard Worker }
194*d83cc019SAndroid Build Coastguard Worker 
brw_program_init(struct brw_program * p)195*d83cc019SAndroid Build Coastguard Worker static void brw_program_init(struct brw_program *p)
196*d83cc019SAndroid Build Coastguard Worker {
197*d83cc019SAndroid Build Coastguard Worker    memset(p, 0, sizeof(struct brw_program));
198*d83cc019SAndroid Build Coastguard Worker }
199*d83cc019SAndroid Build Coastguard Worker 
brw_program_append_entry(struct brw_program * p,struct brw_program_instruction * entry)200*d83cc019SAndroid Build Coastguard Worker static void brw_program_append_entry(struct brw_program *p,
201*d83cc019SAndroid Build Coastguard Worker 				     struct brw_program_instruction *entry)
202*d83cc019SAndroid Build Coastguard Worker {
203*d83cc019SAndroid Build Coastguard Worker     entry->next = NULL;
204*d83cc019SAndroid Build Coastguard Worker     if (p->last)
205*d83cc019SAndroid Build Coastguard Worker 	p->last->next = entry;
206*d83cc019SAndroid Build Coastguard Worker     else
207*d83cc019SAndroid Build Coastguard Worker 	p->first = entry;
208*d83cc019SAndroid Build Coastguard Worker     p->last = entry;
209*d83cc019SAndroid Build Coastguard Worker }
210*d83cc019SAndroid Build Coastguard Worker 
211*d83cc019SAndroid Build Coastguard Worker static void
brw_program_add_instruction(struct brw_program * p,struct brw_program_instruction * instruction)212*d83cc019SAndroid Build Coastguard Worker brw_program_add_instruction(struct brw_program *p,
213*d83cc019SAndroid Build Coastguard Worker 			    struct brw_program_instruction *instruction)
214*d83cc019SAndroid Build Coastguard Worker {
215*d83cc019SAndroid Build Coastguard Worker     struct brw_program_instruction *list_entry;
216*d83cc019SAndroid Build Coastguard Worker 
217*d83cc019SAndroid Build Coastguard Worker     list_entry = calloc(sizeof(struct brw_program_instruction), 1);
218*d83cc019SAndroid Build Coastguard Worker     list_entry->type = GEN4ASM_INSTRUCTION_GEN;
219*d83cc019SAndroid Build Coastguard Worker     list_entry->insn.gen = instruction->insn.gen;
220*d83cc019SAndroid Build Coastguard Worker     brw_program_append_entry(p, list_entry);
221*d83cc019SAndroid Build Coastguard Worker }
222*d83cc019SAndroid Build Coastguard Worker 
223*d83cc019SAndroid Build Coastguard Worker static void
brw_program_add_relocatable(struct brw_program * p,struct brw_program_instruction * instruction)224*d83cc019SAndroid Build Coastguard Worker brw_program_add_relocatable(struct brw_program *p,
225*d83cc019SAndroid Build Coastguard Worker 			    struct brw_program_instruction *instruction)
226*d83cc019SAndroid Build Coastguard Worker {
227*d83cc019SAndroid Build Coastguard Worker     struct brw_program_instruction *list_entry;
228*d83cc019SAndroid Build Coastguard Worker 
229*d83cc019SAndroid Build Coastguard Worker     list_entry = calloc(sizeof(struct brw_program_instruction), 1);
230*d83cc019SAndroid Build Coastguard Worker     list_entry->type = GEN4ASM_INSTRUCTION_GEN_RELOCATABLE;
231*d83cc019SAndroid Build Coastguard Worker     list_entry->insn.gen = instruction->insn.gen;
232*d83cc019SAndroid Build Coastguard Worker     list_entry->reloc = instruction->reloc;
233*d83cc019SAndroid Build Coastguard Worker     brw_program_append_entry(p, list_entry);
234*d83cc019SAndroid Build Coastguard Worker }
235*d83cc019SAndroid Build Coastguard Worker 
brw_program_add_label(struct brw_program * p,const char * label)236*d83cc019SAndroid Build Coastguard Worker static void brw_program_add_label(struct brw_program *p, const char *label)
237*d83cc019SAndroid Build Coastguard Worker {
238*d83cc019SAndroid Build Coastguard Worker     struct brw_program_instruction *list_entry;
239*d83cc019SAndroid Build Coastguard Worker 
240*d83cc019SAndroid Build Coastguard Worker     list_entry = calloc(sizeof(struct brw_program_instruction), 1);
241*d83cc019SAndroid Build Coastguard Worker     list_entry->type = GEN4ASM_INSTRUCTION_LABEL;
242*d83cc019SAndroid Build Coastguard Worker     list_entry->insn.label.name = strdup(label);
243*d83cc019SAndroid Build Coastguard Worker     brw_program_append_entry(p, list_entry);
244*d83cc019SAndroid Build Coastguard Worker }
245*d83cc019SAndroid Build Coastguard Worker 
resolve_dst_region(struct declared_register * reference,int region)246*d83cc019SAndroid Build Coastguard Worker static int resolve_dst_region(struct declared_register *reference, int region)
247*d83cc019SAndroid Build Coastguard Worker {
248*d83cc019SAndroid Build Coastguard Worker     int resolved = region;
249*d83cc019SAndroid Build Coastguard Worker 
250*d83cc019SAndroid Build Coastguard Worker     if (resolved == DEFAULT_DSTREGION) {
251*d83cc019SAndroid Build Coastguard Worker 	if (reference)
252*d83cc019SAndroid Build Coastguard Worker 	    resolved = reference->dst_region;
253*d83cc019SAndroid Build Coastguard Worker         else
254*d83cc019SAndroid Build Coastguard Worker             resolved = 1;
255*d83cc019SAndroid Build Coastguard Worker     }
256*d83cc019SAndroid Build Coastguard Worker 
257*d83cc019SAndroid Build Coastguard Worker     assert(resolved == 1 || resolved == 2 || resolved == 3);
258*d83cc019SAndroid Build Coastguard Worker     return resolved;
259*d83cc019SAndroid Build Coastguard Worker }
260*d83cc019SAndroid Build Coastguard Worker 
access_mode(struct brw_program_instruction * insn)261*d83cc019SAndroid Build Coastguard Worker static inline int access_mode(struct brw_program_instruction *insn)
262*d83cc019SAndroid Build Coastguard Worker {
263*d83cc019SAndroid Build Coastguard Worker     if (IS_GENp(8))
264*d83cc019SAndroid Build Coastguard Worker 	return gen8_access_mode(GEN8(insn));
265*d83cc019SAndroid Build Coastguard Worker     else
266*d83cc019SAndroid Build Coastguard Worker 	return GEN(insn)->header.access_mode;
267*d83cc019SAndroid Build Coastguard Worker }
268*d83cc019SAndroid Build Coastguard Worker 
exec_size(struct brw_program_instruction * insn)269*d83cc019SAndroid Build Coastguard Worker static inline int exec_size(struct brw_program_instruction *insn)
270*d83cc019SAndroid Build Coastguard Worker {
271*d83cc019SAndroid Build Coastguard Worker     if (IS_GENp(8))
272*d83cc019SAndroid Build Coastguard Worker 	return gen8_exec_size(GEN8(insn));
273*d83cc019SAndroid Build Coastguard Worker     else
274*d83cc019SAndroid Build Coastguard Worker 	return GEN(insn)->header.execution_size;
275*d83cc019SAndroid Build Coastguard Worker }
276*d83cc019SAndroid Build Coastguard Worker 
set_execsize(struct brw_program_instruction * insn,int execsize)277*d83cc019SAndroid Build Coastguard Worker static void set_execsize(struct brw_program_instruction *insn, int execsize)
278*d83cc019SAndroid Build Coastguard Worker {
279*d83cc019SAndroid Build Coastguard Worker     if (IS_GENp(8))
280*d83cc019SAndroid Build Coastguard Worker 	gen8_set_exec_size(GEN8(insn), execsize);
281*d83cc019SAndroid Build Coastguard Worker     else
282*d83cc019SAndroid Build Coastguard Worker 	GEN(insn)->header.execution_size = execsize;
283*d83cc019SAndroid Build Coastguard Worker }
284*d83cc019SAndroid Build Coastguard Worker 
validate_dst_reg(struct brw_program_instruction * insn,struct brw_reg * reg)285*d83cc019SAndroid Build Coastguard Worker static bool validate_dst_reg(struct brw_program_instruction *insn, struct brw_reg *reg)
286*d83cc019SAndroid Build Coastguard Worker {
287*d83cc019SAndroid Build Coastguard Worker 
288*d83cc019SAndroid Build Coastguard Worker     if (reg->address_mode == BRW_ADDRESS_DIRECT &&
289*d83cc019SAndroid Build Coastguard Worker 	access_mode(insn) == BRW_ALIGN_1 &&
290*d83cc019SAndroid Build Coastguard Worker 	reg->dw1.bits.writemask != 0 &&
291*d83cc019SAndroid Build Coastguard Worker 	reg->dw1.bits.writemask != BRW_WRITEMASK_XYZW)
292*d83cc019SAndroid Build Coastguard Worker     {
293*d83cc019SAndroid Build Coastguard Worker 	fprintf(stderr, "error: write mask set in align1 instruction\n");
294*d83cc019SAndroid Build Coastguard Worker 	return false;
295*d83cc019SAndroid Build Coastguard Worker     }
296*d83cc019SAndroid Build Coastguard Worker 
297*d83cc019SAndroid Build Coastguard Worker     if (reg->address_mode == BRW_ADDRESS_REGISTER_INDIRECT_REGISTER &&
298*d83cc019SAndroid Build Coastguard Worker 	access_mode(insn) == BRW_ALIGN_16) {
299*d83cc019SAndroid Build Coastguard Worker 	fprintf(stderr, "error: indirect Dst addr mode in align16 instruction\n");
300*d83cc019SAndroid Build Coastguard Worker 	return false;
301*d83cc019SAndroid Build Coastguard Worker     }
302*d83cc019SAndroid Build Coastguard Worker 
303*d83cc019SAndroid Build Coastguard Worker     return true;
304*d83cc019SAndroid Build Coastguard Worker }
305*d83cc019SAndroid Build Coastguard Worker 
validate_src_reg(struct brw_program_instruction * insn,struct brw_reg reg,YYLTYPE * location)306*d83cc019SAndroid Build Coastguard Worker static bool validate_src_reg(struct brw_program_instruction *insn,
307*d83cc019SAndroid Build Coastguard Worker 			     struct brw_reg reg,
308*d83cc019SAndroid Build Coastguard Worker 			     YYLTYPE *location)
309*d83cc019SAndroid Build Coastguard Worker {
310*d83cc019SAndroid Build Coastguard Worker     int hstride_for_reg[] = {0, 1, 2, 4};
311*d83cc019SAndroid Build Coastguard Worker     int vstride_for_reg[] = {0, 1, 2, 4, 8, 16, 32, 64, 128, 256};
312*d83cc019SAndroid Build Coastguard Worker     int width_for_reg[] = {1, 2, 4, 8, 16};
313*d83cc019SAndroid Build Coastguard Worker     int execsize_for_reg[] = {1, 2, 4, 8, 16, 32};
314*d83cc019SAndroid Build Coastguard Worker     int width, hstride, vstride, execsize;
315*d83cc019SAndroid Build Coastguard Worker 
316*d83cc019SAndroid Build Coastguard Worker     if (reg.file == BRW_IMMEDIATE_VALUE)
317*d83cc019SAndroid Build Coastguard Worker 	return true;
318*d83cc019SAndroid Build Coastguard Worker 
319*d83cc019SAndroid Build Coastguard Worker     if (access_mode(insn) == BRW_ALIGN_1 &&
320*d83cc019SAndroid Build Coastguard Worker 	SWIZZLE(reg) && SWIZZLE(reg) != BRW_SWIZZLE_NOOP)
321*d83cc019SAndroid Build Coastguard Worker     {
322*d83cc019SAndroid Build Coastguard Worker 	error(location, "swizzle bits set in align1 instruction\n");
323*d83cc019SAndroid Build Coastguard Worker 	return false;
324*d83cc019SAndroid Build Coastguard Worker     }
325*d83cc019SAndroid Build Coastguard Worker 
326*d83cc019SAndroid Build Coastguard Worker     if (reg.address_mode == BRW_ADDRESS_REGISTER_INDIRECT_REGISTER &&
327*d83cc019SAndroid Build Coastguard Worker 	access_mode(insn) == BRW_ALIGN_16) {
328*d83cc019SAndroid Build Coastguard Worker 	fprintf(stderr, "error: indirect Source addr mode in align16 instruction\n");
329*d83cc019SAndroid Build Coastguard Worker 	return false;
330*d83cc019SAndroid Build Coastguard Worker     }
331*d83cc019SAndroid Build Coastguard Worker 
332*d83cc019SAndroid Build Coastguard Worker     assert(reg.hstride >= 0 && reg.hstride < ARRAY_SIZE(hstride_for_reg));
333*d83cc019SAndroid Build Coastguard Worker     hstride = hstride_for_reg[reg.hstride];
334*d83cc019SAndroid Build Coastguard Worker 
335*d83cc019SAndroid Build Coastguard Worker     if (reg.vstride == 0xf) {
336*d83cc019SAndroid Build Coastguard Worker 	vstride = -1;
337*d83cc019SAndroid Build Coastguard Worker     } else {
338*d83cc019SAndroid Build Coastguard Worker 	assert(reg.vstride >= 0 && reg.vstride < ARRAY_SIZE(vstride_for_reg));
339*d83cc019SAndroid Build Coastguard Worker 	vstride = vstride_for_reg[reg.vstride];
340*d83cc019SAndroid Build Coastguard Worker     }
341*d83cc019SAndroid Build Coastguard Worker 
342*d83cc019SAndroid Build Coastguard Worker     assert(reg.width >= 0 && reg.width < ARRAY_SIZE(width_for_reg));
343*d83cc019SAndroid Build Coastguard Worker     width = width_for_reg[reg.width];
344*d83cc019SAndroid Build Coastguard Worker 
345*d83cc019SAndroid Build Coastguard Worker     assert(exec_size(insn) >= 0 &&
346*d83cc019SAndroid Build Coastguard Worker 	   exec_size(insn) < ARRAY_SIZE(execsize_for_reg));
347*d83cc019SAndroid Build Coastguard Worker     execsize = execsize_for_reg[exec_size(insn)];
348*d83cc019SAndroid Build Coastguard Worker 
349*d83cc019SAndroid Build Coastguard Worker     /* Register Region Restrictions */
350*d83cc019SAndroid Build Coastguard Worker 
351*d83cc019SAndroid Build Coastguard Worker     /* B. If ExecSize = Width and HorzStride ≠ 0, VertStride must be set to
352*d83cc019SAndroid Build Coastguard Worker      * Width * HorzStride. */
353*d83cc019SAndroid Build Coastguard Worker     if (execsize == width && hstride != 0) {
354*d83cc019SAndroid Build Coastguard Worker 	if (vstride != -1 && vstride != width * hstride)
355*d83cc019SAndroid Build Coastguard Worker 	    warn(ALL, location, "execution size == width and hstride != 0 but "
356*d83cc019SAndroid Build Coastguard Worker 		 "vstride is not width * hstride\n");
357*d83cc019SAndroid Build Coastguard Worker     }
358*d83cc019SAndroid Build Coastguard Worker 
359*d83cc019SAndroid Build Coastguard Worker     /* D. If Width = 1, HorzStride must be 0 regardless of the values of
360*d83cc019SAndroid Build Coastguard Worker      * ExecSize and VertStride.
361*d83cc019SAndroid Build Coastguard Worker      *
362*d83cc019SAndroid Build Coastguard Worker      * FIXME: In "advanced mode" hstride is set to 1, this is probably a bug
363*d83cc019SAndroid Build Coastguard Worker      * to fix, but it changes the generated opcodes and thus needs validation.
364*d83cc019SAndroid Build Coastguard Worker      */
365*d83cc019SAndroid Build Coastguard Worker     if (width == 1 && hstride != 0)
366*d83cc019SAndroid Build Coastguard Worker 	warn(ALL, location, "region width is 1 but horizontal stride is %d "
367*d83cc019SAndroid Build Coastguard Worker 	     " (should be 0)\n", hstride);
368*d83cc019SAndroid Build Coastguard Worker 
369*d83cc019SAndroid Build Coastguard Worker     /* E. If ExecSize = Width = 1, both VertStride and HorzStride must be 0.
370*d83cc019SAndroid Build Coastguard Worker      * This defines a scalar. */
371*d83cc019SAndroid Build Coastguard Worker     if (execsize == 1 && width == 1) {
372*d83cc019SAndroid Build Coastguard Worker         if (hstride != 0)
373*d83cc019SAndroid Build Coastguard Worker 	    warn(ALL, location, "execution size and region width are 1 but "
374*d83cc019SAndroid Build Coastguard Worker 		 "horizontal stride is %d (should be 0)\n", hstride);
375*d83cc019SAndroid Build Coastguard Worker         if (vstride != 0)
376*d83cc019SAndroid Build Coastguard Worker 	    warn(ALL, location, "execution size and region width are 1 but "
377*d83cc019SAndroid Build Coastguard Worker 		 "vertical stride is %d (should be 0)\n", vstride);
378*d83cc019SAndroid Build Coastguard Worker     }
379*d83cc019SAndroid Build Coastguard Worker 
380*d83cc019SAndroid Build Coastguard Worker     return true;
381*d83cc019SAndroid Build Coastguard Worker }
382*d83cc019SAndroid Build Coastguard Worker 
get_subreg_address(unsigned regfile,unsigned type,unsigned subreg,unsigned address_mode)383*d83cc019SAndroid Build Coastguard Worker static int get_subreg_address(unsigned regfile, unsigned type, unsigned subreg, unsigned address_mode)
384*d83cc019SAndroid Build Coastguard Worker {
385*d83cc019SAndroid Build Coastguard Worker     int unit_size = 1;
386*d83cc019SAndroid Build Coastguard Worker 
387*d83cc019SAndroid Build Coastguard Worker     assert(address_mode == BRW_ADDRESS_DIRECT);
388*d83cc019SAndroid Build Coastguard Worker     assert(regfile != BRW_IMMEDIATE_VALUE);
389*d83cc019SAndroid Build Coastguard Worker 
390*d83cc019SAndroid Build Coastguard Worker     if (advanced_flag)
391*d83cc019SAndroid Build Coastguard Worker 	unit_size = get_type_size(type);
392*d83cc019SAndroid Build Coastguard Worker 
393*d83cc019SAndroid Build Coastguard Worker     return subreg * unit_size;
394*d83cc019SAndroid Build Coastguard Worker }
395*d83cc019SAndroid Build Coastguard Worker 
396*d83cc019SAndroid Build Coastguard Worker /* only used in indirect address mode.
397*d83cc019SAndroid Build Coastguard Worker  * input: sub-register number of an address register
398*d83cc019SAndroid Build Coastguard Worker  * output: the value of AddrSubRegNum in the instruction binary code
399*d83cc019SAndroid Build Coastguard Worker  *
400*d83cc019SAndroid Build Coastguard Worker  * input  output(advanced_flag==0)  output(advanced_flag==1)
401*d83cc019SAndroid Build Coastguard Worker  *  a0.0             0                         0
402*d83cc019SAndroid Build Coastguard Worker  *  a0.1        invalid input                  1
403*d83cc019SAndroid Build Coastguard Worker  *  a0.2             1                         2
404*d83cc019SAndroid Build Coastguard Worker  *  a0.3        invalid input                  3
405*d83cc019SAndroid Build Coastguard Worker  *  a0.4             2                         4
406*d83cc019SAndroid Build Coastguard Worker  *  a0.5        invalid input                  5
407*d83cc019SAndroid Build Coastguard Worker  *  a0.6             3                         6
408*d83cc019SAndroid Build Coastguard Worker  *  a0.7        invalid input                  7
409*d83cc019SAndroid Build Coastguard Worker  *  a0.8             4                  invalid input
410*d83cc019SAndroid Build Coastguard Worker  *  a0.10            5                  invalid input
411*d83cc019SAndroid Build Coastguard Worker  *  a0.12            6                  invalid input
412*d83cc019SAndroid Build Coastguard Worker  *  a0.14            7                  invalid input
413*d83cc019SAndroid Build Coastguard Worker  */
get_indirect_subreg_address(unsigned subreg)414*d83cc019SAndroid Build Coastguard Worker static int get_indirect_subreg_address(unsigned subreg)
415*d83cc019SAndroid Build Coastguard Worker {
416*d83cc019SAndroid Build Coastguard Worker     return advanced_flag == 0 ? subreg / 2 : subreg;
417*d83cc019SAndroid Build Coastguard Worker }
418*d83cc019SAndroid Build Coastguard Worker 
resolve_subnr(struct brw_reg * reg)419*d83cc019SAndroid Build Coastguard Worker static void resolve_subnr(struct brw_reg *reg)
420*d83cc019SAndroid Build Coastguard Worker {
421*d83cc019SAndroid Build Coastguard Worker    if (reg->file == BRW_IMMEDIATE_VALUE)
422*d83cc019SAndroid Build Coastguard Worker 	return;
423*d83cc019SAndroid Build Coastguard Worker 
424*d83cc019SAndroid Build Coastguard Worker    if (reg->address_mode == BRW_ADDRESS_DIRECT)
425*d83cc019SAndroid Build Coastguard Worker 	reg->subnr = get_subreg_address(reg->file, reg->type, reg->subnr,
426*d83cc019SAndroid Build Coastguard Worker 					reg->address_mode);
427*d83cc019SAndroid Build Coastguard Worker    else
428*d83cc019SAndroid Build Coastguard Worker         reg->subnr = get_indirect_subreg_address(reg->subnr);
429*d83cc019SAndroid Build Coastguard Worker }
430*d83cc019SAndroid Build Coastguard Worker 
431*d83cc019SAndroid Build Coastguard Worker 
432*d83cc019SAndroid Build Coastguard Worker %}
433*d83cc019SAndroid Build Coastguard Worker %locations
434*d83cc019SAndroid Build Coastguard Worker 
435*d83cc019SAndroid Build Coastguard Worker %start ROOT
436*d83cc019SAndroid Build Coastguard Worker 
437*d83cc019SAndroid Build Coastguard Worker %union {
438*d83cc019SAndroid Build Coastguard Worker 	char *string;
439*d83cc019SAndroid Build Coastguard Worker 	int integer;
440*d83cc019SAndroid Build Coastguard Worker 	double number;
441*d83cc019SAndroid Build Coastguard Worker 	struct brw_program_instruction instruction;
442*d83cc019SAndroid Build Coastguard Worker 	struct brw_program program;
443*d83cc019SAndroid Build Coastguard Worker 	struct region region;
444*d83cc019SAndroid Build Coastguard Worker 	struct regtype regtype;
445*d83cc019SAndroid Build Coastguard Worker 	struct brw_reg reg;
446*d83cc019SAndroid Build Coastguard Worker 	struct condition condition;
447*d83cc019SAndroid Build Coastguard Worker 	struct predicate predicate;
448*d83cc019SAndroid Build Coastguard Worker 	struct options options;
449*d83cc019SAndroid Build Coastguard Worker 	struct declared_register symbol_reg;
450*d83cc019SAndroid Build Coastguard Worker 	imm32_t imm32;
451*d83cc019SAndroid Build Coastguard Worker 
452*d83cc019SAndroid Build Coastguard Worker 	struct src_operand src_operand;
453*d83cc019SAndroid Build Coastguard Worker }
454*d83cc019SAndroid Build Coastguard Worker 
455*d83cc019SAndroid Build Coastguard Worker %token COLON
456*d83cc019SAndroid Build Coastguard Worker %token SEMICOLON
457*d83cc019SAndroid Build Coastguard Worker %token LPAREN RPAREN
458*d83cc019SAndroid Build Coastguard Worker %token LANGLE RANGLE
459*d83cc019SAndroid Build Coastguard Worker %token LCURLY RCURLY
460*d83cc019SAndroid Build Coastguard Worker %token LSQUARE RSQUARE
461*d83cc019SAndroid Build Coastguard Worker %token COMMA EQ
462*d83cc019SAndroid Build Coastguard Worker %token ABS DOT
463*d83cc019SAndroid Build Coastguard Worker %token PLUS MINUS MULTIPLY DIVIDE
464*d83cc019SAndroid Build Coastguard Worker 
465*d83cc019SAndroid Build Coastguard Worker %token <integer> TYPE_UD TYPE_D TYPE_UW TYPE_W TYPE_UB TYPE_B
466*d83cc019SAndroid Build Coastguard Worker %token <integer> TYPE_VF TYPE_HF TYPE_V TYPE_F
467*d83cc019SAndroid Build Coastguard Worker 
468*d83cc019SAndroid Build Coastguard Worker %token ALIGN1 ALIGN16 SECHALF COMPR SWITCH ATOMIC NODDCHK NODDCLR
469*d83cc019SAndroid Build Coastguard Worker %token MASK_DISABLE BREAKPOINT ACCWRCTRL EOT
470*d83cc019SAndroid Build Coastguard Worker 
471*d83cc019SAndroid Build Coastguard Worker %token SEQ ANY2H ALL2H ANY4H ALL4H ANY8H ALL8H ANY16H ALL16H ANYV ALLV
472*d83cc019SAndroid Build Coastguard Worker %token <integer> ZERO EQUAL NOT_ZERO NOT_EQUAL GREATER GREATER_EQUAL LESS LESS_EQUAL
473*d83cc019SAndroid Build Coastguard Worker %token <integer> ROUND_INCREMENT OVERFLOW UNORDERED
474*d83cc019SAndroid Build Coastguard Worker %token <integer> GENREG MSGREG ADDRESSREG ACCREG FLAGREG
475*d83cc019SAndroid Build Coastguard Worker %token <integer> MASKREG AMASK IMASK LMASK CMASK
476*d83cc019SAndroid Build Coastguard Worker %token <integer> MASKSTACKREG LMS IMS MASKSTACKDEPTHREG IMSD LMSD
477*d83cc019SAndroid Build Coastguard Worker %token <integer> NOTIFYREG STATEREG CONTROLREG IPREG
478*d83cc019SAndroid Build Coastguard Worker %token GENREGFILE MSGREGFILE
479*d83cc019SAndroid Build Coastguard Worker 
480*d83cc019SAndroid Build Coastguard Worker %token <integer> MOV FRC RNDU RNDD RNDE RNDZ NOT LZD
481*d83cc019SAndroid Build Coastguard Worker %token <integer> MUL MAC MACH LINE SAD2 SADA2 DP4 DPH DP3 DP2
482*d83cc019SAndroid Build Coastguard Worker %token <integer> AVG ADD SEL AND OR XOR SHR SHL ASR CMP CMPN PLN
483*d83cc019SAndroid Build Coastguard Worker %token <integer> ADDC BFI1 BFREV CBIT F16TO32 F32TO16 FBH FBL
484*d83cc019SAndroid Build Coastguard Worker %token <integer> SEND SENDC NOP JMPI IF IFF WHILE ELSE BREAK CONT HALT MSAVE
485*d83cc019SAndroid Build Coastguard Worker %token <integer> PUSH MREST POP WAIT DO ENDIF ILLEGAL
486*d83cc019SAndroid Build Coastguard Worker %token <integer> MATH_INST
487*d83cc019SAndroid Build Coastguard Worker %token <integer> MAD LRP BFE BFI2 SUBB
488*d83cc019SAndroid Build Coastguard Worker %token <integer> CALL RET
489*d83cc019SAndroid Build Coastguard Worker %token <integer> BRD BRC
490*d83cc019SAndroid Build Coastguard Worker 
491*d83cc019SAndroid Build Coastguard Worker %token NULL_TOKEN MATH SAMPLER GATEWAY READ WRITE URB THREAD_SPAWNER VME DATA_PORT CRE
492*d83cc019SAndroid Build Coastguard Worker 
493*d83cc019SAndroid Build Coastguard Worker %token MSGLEN RETURNLEN
494*d83cc019SAndroid Build Coastguard Worker %token <integer> ALLOCATE USED COMPLETE TRANSPOSE INTERLEAVE
495*d83cc019SAndroid Build Coastguard Worker %token SATURATE
496*d83cc019SAndroid Build Coastguard Worker 
497*d83cc019SAndroid Build Coastguard Worker %token <integer> INTEGER
498*d83cc019SAndroid Build Coastguard Worker %token <string> STRING
499*d83cc019SAndroid Build Coastguard Worker %token <number> NUMBER
500*d83cc019SAndroid Build Coastguard Worker 
501*d83cc019SAndroid Build Coastguard Worker %token <integer> INV LOG EXP SQRT RSQ POW SIN COS SINCOS INTDIV INTMOD
502*d83cc019SAndroid Build Coastguard Worker %token <integer> INTDIVMOD
503*d83cc019SAndroid Build Coastguard Worker %token SIGNED SCALAR
504*d83cc019SAndroid Build Coastguard Worker 
505*d83cc019SAndroid Build Coastguard Worker %token <integer> X Y Z W
506*d83cc019SAndroid Build Coastguard Worker 
507*d83cc019SAndroid Build Coastguard Worker %token <integer> KERNEL_PRAGMA END_KERNEL_PRAGMA CODE_PRAGMA END_CODE_PRAGMA
508*d83cc019SAndroid Build Coastguard Worker %token <integer> REG_COUNT_PAYLOAD_PRAGMA REG_COUNT_TOTAL_PRAGMA DECLARE_PRAGMA
509*d83cc019SAndroid Build Coastguard Worker %token <integer> BASE ELEMENTSIZE SRCREGION DSTREGION TYPE
510*d83cc019SAndroid Build Coastguard Worker 
511*d83cc019SAndroid Build Coastguard Worker %token <integer> DEFAULT_EXEC_SIZE_PRAGMA DEFAULT_REG_TYPE_PRAGMA
512*d83cc019SAndroid Build Coastguard Worker %precedence SUBREGNUM
513*d83cc019SAndroid Build Coastguard Worker %precedence SNDOPR
514*d83cc019SAndroid Build Coastguard Worker %left  PLUS MINUS
515*d83cc019SAndroid Build Coastguard Worker %left  MULTIPLY DIVIDE
516*d83cc019SAndroid Build Coastguard Worker %precedence UMINUS
517*d83cc019SAndroid Build Coastguard Worker %precedence DOT
518*d83cc019SAndroid Build Coastguard Worker %precedence STR_SYMBOL_REG
519*d83cc019SAndroid Build Coastguard Worker %precedence EMPTEXECSIZE
520*d83cc019SAndroid Build Coastguard Worker %precedence LPAREN
521*d83cc019SAndroid Build Coastguard Worker 
522*d83cc019SAndroid Build Coastguard Worker %type <integer> exp sndopr
523*d83cc019SAndroid Build Coastguard Worker %type <integer> simple_int
524*d83cc019SAndroid Build Coastguard Worker %type <instruction> instruction unaryinstruction binaryinstruction
525*d83cc019SAndroid Build Coastguard Worker %type <instruction> binaryaccinstruction trinaryinstruction sendinstruction
526*d83cc019SAndroid Build Coastguard Worker %type <instruction> syncinstruction
527*d83cc019SAndroid Build Coastguard Worker %type <instruction> msgtarget
528*d83cc019SAndroid Build Coastguard Worker %type <instruction> mathinstruction
529*d83cc019SAndroid Build Coastguard Worker %type <instruction> nopinstruction
530*d83cc019SAndroid Build Coastguard Worker %type <instruction> relocatableinstruction breakinstruction
531*d83cc019SAndroid Build Coastguard Worker %type <instruction> ifelseinstruction loopinstruction haltinstruction
532*d83cc019SAndroid Build Coastguard Worker %type <instruction> multibranchinstruction subroutineinstruction jumpinstruction
533*d83cc019SAndroid Build Coastguard Worker %type <string> label
534*d83cc019SAndroid Build Coastguard Worker %type <program> instrseq
535*d83cc019SAndroid Build Coastguard Worker %type <integer> instoption
536*d83cc019SAndroid Build Coastguard Worker %type <integer> unaryop binaryop binaryaccop breakop
537*d83cc019SAndroid Build Coastguard Worker %type <integer> trinaryop
538*d83cc019SAndroid Build Coastguard Worker %type <integer> sendop
539*d83cc019SAndroid Build Coastguard Worker %type <condition> conditionalmodifier
540*d83cc019SAndroid Build Coastguard Worker %type <predicate> predicate
541*d83cc019SAndroid Build Coastguard Worker %type <options> instoptions instoption_list
542*d83cc019SAndroid Build Coastguard Worker %type <integer> condition saturate negate abs chansel
543*d83cc019SAndroid Build Coastguard Worker %type <integer> writemask_x writemask_y writemask_z writemask_w
544*d83cc019SAndroid Build Coastguard Worker %type <integer> srcimmtype execsize dstregion immaddroffset
545*d83cc019SAndroid Build Coastguard Worker %type <integer> subregnum sampler_datatype
546*d83cc019SAndroid Build Coastguard Worker %type <integer> urb_swizzle urb_allocate urb_used urb_complete
547*d83cc019SAndroid Build Coastguard Worker %type <integer> math_function math_signed math_scalar
548*d83cc019SAndroid Build Coastguard Worker %type <integer> predctrl predstate
549*d83cc019SAndroid Build Coastguard Worker %type <region> region region_wh indirectregion declare_srcregion;
550*d83cc019SAndroid Build Coastguard Worker %type <regtype> regtype
551*d83cc019SAndroid Build Coastguard Worker %type <reg> directgenreg directmsgreg addrreg accreg flagreg maskreg
552*d83cc019SAndroid Build Coastguard Worker %type <reg> maskstackreg notifyreg
553*d83cc019SAndroid Build Coastguard Worker /* %type <reg>  maskstackdepthreg */
554*d83cc019SAndroid Build Coastguard Worker %type <reg> statereg controlreg ipreg nullreg
555*d83cc019SAndroid Build Coastguard Worker %type <reg> dstoperandex_typed srcarchoperandex_typed
556*d83cc019SAndroid Build Coastguard Worker %type <reg> sendleadreg
557*d83cc019SAndroid Build Coastguard Worker %type <reg> indirectgenreg indirectmsgreg addrparam
558*d83cc019SAndroid Build Coastguard Worker %type <integer> mask_subreg maskstack_subreg
559*d83cc019SAndroid Build Coastguard Worker %type <integer> declare_elementsize declare_dstregion declare_type
560*d83cc019SAndroid Build Coastguard Worker /* %type <intger> maskstackdepth_subreg */
561*d83cc019SAndroid Build Coastguard Worker %type <symbol_reg> symbol_reg symbol_reg_p;
562*d83cc019SAndroid Build Coastguard Worker %type <imm32> imm32
563*d83cc019SAndroid Build Coastguard Worker %type <reg> dst dstoperand dstoperandex dstreg post_dst writemask
564*d83cc019SAndroid Build Coastguard Worker %type <reg> declare_base
565*d83cc019SAndroid Build Coastguard Worker %type <src_operand> directsrcoperand srcarchoperandex directsrcaccoperand
566*d83cc019SAndroid Build Coastguard Worker %type <src_operand> indirectsrcoperand
567*d83cc019SAndroid Build Coastguard Worker %type <src_operand> src srcimm imm32reg payload srcacc srcaccimm swizzle
568*d83cc019SAndroid Build Coastguard Worker %type <src_operand> relativelocation relativelocation2
569*d83cc019SAndroid Build Coastguard Worker 
570*d83cc019SAndroid Build Coastguard Worker %code {
571*d83cc019SAndroid Build Coastguard Worker 
572*d83cc019SAndroid Build Coastguard Worker #undef error
573*d83cc019SAndroid Build Coastguard Worker #define error(l, fmt, ...)			\
574*d83cc019SAndroid Build Coastguard Worker     do {					\
575*d83cc019SAndroid Build Coastguard Worker 	message(ERROR, l, fmt, ## __VA_ARGS__);	\
576*d83cc019SAndroid Build Coastguard Worker 	YYERROR;				\
577*d83cc019SAndroid Build Coastguard Worker     } while(0)
578*d83cc019SAndroid Build Coastguard Worker 
add_option(struct options * options,int option)579*d83cc019SAndroid Build Coastguard Worker static void add_option(struct options *options, int option)
580*d83cc019SAndroid Build Coastguard Worker {
581*d83cc019SAndroid Build Coastguard Worker     switch (option) {
582*d83cc019SAndroid Build Coastguard Worker     case ALIGN1:
583*d83cc019SAndroid Build Coastguard Worker 	options->access_mode = BRW_ALIGN_1;
584*d83cc019SAndroid Build Coastguard Worker 	break;
585*d83cc019SAndroid Build Coastguard Worker     case ALIGN16:
586*d83cc019SAndroid Build Coastguard Worker 	options->access_mode = BRW_ALIGN_16;
587*d83cc019SAndroid Build Coastguard Worker 	break;
588*d83cc019SAndroid Build Coastguard Worker     case SECHALF:
589*d83cc019SAndroid Build Coastguard Worker 	options->compression_control |= BRW_COMPRESSION_2NDHALF;
590*d83cc019SAndroid Build Coastguard Worker 	break;
591*d83cc019SAndroid Build Coastguard Worker     case COMPR:
592*d83cc019SAndroid Build Coastguard Worker 	if (!IS_GENp(6))
593*d83cc019SAndroid Build Coastguard Worker 	    options->compression_control |= BRW_COMPRESSION_COMPRESSED;
594*d83cc019SAndroid Build Coastguard Worker 	break;
595*d83cc019SAndroid Build Coastguard Worker     case SWITCH:
596*d83cc019SAndroid Build Coastguard Worker 	options->thread_control |= BRW_THREAD_SWITCH;
597*d83cc019SAndroid Build Coastguard Worker 	break;
598*d83cc019SAndroid Build Coastguard Worker     case ATOMIC:
599*d83cc019SAndroid Build Coastguard Worker 	options->thread_control |= BRW_THREAD_ATOMIC;
600*d83cc019SAndroid Build Coastguard Worker 	break;
601*d83cc019SAndroid Build Coastguard Worker     case NODDCHK:
602*d83cc019SAndroid Build Coastguard Worker 	options->dependency_control |= BRW_DEPENDENCY_NOTCHECKED;
603*d83cc019SAndroid Build Coastguard Worker 	break;
604*d83cc019SAndroid Build Coastguard Worker     case NODDCLR:
605*d83cc019SAndroid Build Coastguard Worker 	options->dependency_control |= BRW_DEPENDENCY_NOTCLEARED;
606*d83cc019SAndroid Build Coastguard Worker 	break;
607*d83cc019SAndroid Build Coastguard Worker     case MASK_DISABLE:
608*d83cc019SAndroid Build Coastguard Worker 	options->mask_control = BRW_MASK_DISABLE;
609*d83cc019SAndroid Build Coastguard Worker 	break;
610*d83cc019SAndroid Build Coastguard Worker     case BREAKPOINT:
611*d83cc019SAndroid Build Coastguard Worker 	options->debug_control = BRW_DEBUG_BREAKPOINT;
612*d83cc019SAndroid Build Coastguard Worker 	break;
613*d83cc019SAndroid Build Coastguard Worker     case ACCWRCTRL:
614*d83cc019SAndroid Build Coastguard Worker 	options->acc_wr_control = BRW_ACCUMULATOR_WRITE_ENABLE;
615*d83cc019SAndroid Build Coastguard Worker 	break;
616*d83cc019SAndroid Build Coastguard Worker     case EOT:
617*d83cc019SAndroid Build Coastguard Worker 	options->end_of_thread = 1;
618*d83cc019SAndroid Build Coastguard Worker 	break;
619*d83cc019SAndroid Build Coastguard Worker     }
620*d83cc019SAndroid Build Coastguard Worker }
621*d83cc019SAndroid Build Coastguard Worker 
622*d83cc019SAndroid Build Coastguard Worker }
623*d83cc019SAndroid Build Coastguard Worker 
624*d83cc019SAndroid Build Coastguard Worker %%
625*d83cc019SAndroid Build Coastguard Worker simple_int:     INTEGER { $$ = $1; }
626*d83cc019SAndroid Build Coastguard Worker 		| MINUS INTEGER { $$ = -$2;}
627*d83cc019SAndroid Build Coastguard Worker ;
628*d83cc019SAndroid Build Coastguard Worker 
629*d83cc019SAndroid Build Coastguard Worker exp:		INTEGER { $$ = $1; }
630*d83cc019SAndroid Build Coastguard Worker 		| exp PLUS exp { $$ = $1 + $3; }
631*d83cc019SAndroid Build Coastguard Worker 		| exp MINUS exp { $$ = $1 - $3; }
632*d83cc019SAndroid Build Coastguard Worker 		| exp MULTIPLY exp { $$ = $1 * $3; }
633*d83cc019SAndroid Build Coastguard Worker 		| exp DIVIDE exp { if ($3) $$ = $1 / $3; else YYERROR;}
634*d83cc019SAndroid Build Coastguard Worker 		| MINUS exp %prec UMINUS { $$ = -$2;}
635*d83cc019SAndroid Build Coastguard Worker 		| LPAREN exp RPAREN { $$ = $2; }
636*d83cc019SAndroid Build Coastguard Worker 		;
637*d83cc019SAndroid Build Coastguard Worker 
638*d83cc019SAndroid Build Coastguard Worker ROOT:		instrseq
639*d83cc019SAndroid Build Coastguard Worker 		{
640*d83cc019SAndroid Build Coastguard Worker 		  compiled_program = $1;
641*d83cc019SAndroid Build Coastguard Worker 		}
642*d83cc019SAndroid Build Coastguard Worker ;
643*d83cc019SAndroid Build Coastguard Worker 
644*d83cc019SAndroid Build Coastguard Worker 
645*d83cc019SAndroid Build Coastguard Worker label:          STRING COLON
646*d83cc019SAndroid Build Coastguard Worker ;
647*d83cc019SAndroid Build Coastguard Worker 
648*d83cc019SAndroid Build Coastguard Worker declare_base:  	BASE EQ dstreg
649*d83cc019SAndroid Build Coastguard Worker 	       	{
650*d83cc019SAndroid Build Coastguard Worker 		   $$ = $3;
651*d83cc019SAndroid Build Coastguard Worker 	       	}
652*d83cc019SAndroid Build Coastguard Worker ;
653*d83cc019SAndroid Build Coastguard Worker declare_elementsize:  ELEMENTSIZE EQ exp
654*d83cc019SAndroid Build Coastguard Worker 		{
655*d83cc019SAndroid Build Coastguard Worker 		   $$ = $3;
656*d83cc019SAndroid Build Coastguard Worker 		}
657*d83cc019SAndroid Build Coastguard Worker ;
658*d83cc019SAndroid Build Coastguard Worker declare_srcregion: %empty /* empty */
659*d83cc019SAndroid Build Coastguard Worker 		{
660*d83cc019SAndroid Build Coastguard Worker 		  /* XXX is this default correct?*/
661*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
662*d83cc019SAndroid Build Coastguard Worker 		  $$.vert_stride = ffs(0);
663*d83cc019SAndroid Build Coastguard Worker 		  $$.width = BRW_WIDTH_1;
664*d83cc019SAndroid Build Coastguard Worker 		  $$.horiz_stride = ffs(0);
665*d83cc019SAndroid Build Coastguard Worker 		}
666*d83cc019SAndroid Build Coastguard Worker 		| SRCREGION EQ region
667*d83cc019SAndroid Build Coastguard Worker 		{
668*d83cc019SAndroid Build Coastguard Worker 		    $$ = $3;
669*d83cc019SAndroid Build Coastguard Worker 		}
670*d83cc019SAndroid Build Coastguard Worker ;
671*d83cc019SAndroid Build Coastguard Worker declare_dstregion: %empty /* empty */
672*d83cc019SAndroid Build Coastguard Worker 		{
673*d83cc019SAndroid Build Coastguard Worker 		    $$ = 1;
674*d83cc019SAndroid Build Coastguard Worker 		}
675*d83cc019SAndroid Build Coastguard Worker 		| DSTREGION EQ dstregion
676*d83cc019SAndroid Build Coastguard Worker 		{
677*d83cc019SAndroid Build Coastguard Worker 		    $$ = $3;
678*d83cc019SAndroid Build Coastguard Worker 		}
679*d83cc019SAndroid Build Coastguard Worker ;
680*d83cc019SAndroid Build Coastguard Worker declare_type:	TYPE EQ regtype
681*d83cc019SAndroid Build Coastguard Worker 		{
682*d83cc019SAndroid Build Coastguard Worker 		    $$ = $3.type;
683*d83cc019SAndroid Build Coastguard Worker 		}
684*d83cc019SAndroid Build Coastguard Worker ;
685*d83cc019SAndroid Build Coastguard Worker declare_pragma:	DECLARE_PRAGMA STRING declare_base declare_elementsize declare_srcregion declare_dstregion declare_type
686*d83cc019SAndroid Build Coastguard Worker 		{
687*d83cc019SAndroid Build Coastguard Worker 		    struct declared_register reg, *found, *new_reg;
688*d83cc019SAndroid Build Coastguard Worker 
689*d83cc019SAndroid Build Coastguard Worker 		    reg.name = $2;
690*d83cc019SAndroid Build Coastguard Worker 		    reg.reg = $3;
691*d83cc019SAndroid Build Coastguard Worker 		    reg.element_size = $4;
692*d83cc019SAndroid Build Coastguard Worker 		    reg.src_region = $5;
693*d83cc019SAndroid Build Coastguard Worker 		    reg.dst_region = $6;
694*d83cc019SAndroid Build Coastguard Worker 		    reg.reg.type = $7;
695*d83cc019SAndroid Build Coastguard Worker 
696*d83cc019SAndroid Build Coastguard Worker 		    found = find_register($2);
697*d83cc019SAndroid Build Coastguard Worker 		    if (found) {
698*d83cc019SAndroid Build Coastguard Worker 		        if (!declared_register_equal(&reg, found))
699*d83cc019SAndroid Build Coastguard Worker 			    error(&@1, "%s already defined and definitions "
700*d83cc019SAndroid Build Coastguard Worker 				  "don't agree\n", $2);
701*d83cc019SAndroid Build Coastguard Worker 			free($2); // $2 has been malloc'ed by strdup
702*d83cc019SAndroid Build Coastguard Worker 		    } else {
703*d83cc019SAndroid Build Coastguard Worker 			new_reg = malloc(sizeof(struct declared_register));
704*d83cc019SAndroid Build Coastguard Worker 			*new_reg = reg;
705*d83cc019SAndroid Build Coastguard Worker 			insert_register(new_reg);
706*d83cc019SAndroid Build Coastguard Worker 		    }
707*d83cc019SAndroid Build Coastguard Worker 		}
708*d83cc019SAndroid Build Coastguard Worker ;
709*d83cc019SAndroid Build Coastguard Worker 
710*d83cc019SAndroid Build Coastguard Worker reg_count_total_pragma: 	REG_COUNT_TOTAL_PRAGMA exp
711*d83cc019SAndroid Build Coastguard Worker ;
712*d83cc019SAndroid Build Coastguard Worker reg_count_payload_pragma: 	REG_COUNT_PAYLOAD_PRAGMA exp
713*d83cc019SAndroid Build Coastguard Worker ;
714*d83cc019SAndroid Build Coastguard Worker 
715*d83cc019SAndroid Build Coastguard Worker default_exec_size_pragma:	DEFAULT_EXEC_SIZE_PRAGMA exp
716*d83cc019SAndroid Build Coastguard Worker 				{
717*d83cc019SAndroid Build Coastguard Worker 				    program_defaults.execute_size = $2;
718*d83cc019SAndroid Build Coastguard Worker 				}
719*d83cc019SAndroid Build Coastguard Worker ;
720*d83cc019SAndroid Build Coastguard Worker default_reg_type_pragma:	DEFAULT_REG_TYPE_PRAGMA regtype
721*d83cc019SAndroid Build Coastguard Worker 				{
722*d83cc019SAndroid Build Coastguard Worker 				    program_defaults.register_type = $2.type;
723*d83cc019SAndroid Build Coastguard Worker 				}
724*d83cc019SAndroid Build Coastguard Worker ;
725*d83cc019SAndroid Build Coastguard Worker pragma:		reg_count_total_pragma
726*d83cc019SAndroid Build Coastguard Worker 		|reg_count_payload_pragma
727*d83cc019SAndroid Build Coastguard Worker 		|default_exec_size_pragma
728*d83cc019SAndroid Build Coastguard Worker 		|default_reg_type_pragma
729*d83cc019SAndroid Build Coastguard Worker 		|declare_pragma
730*d83cc019SAndroid Build Coastguard Worker ;
731*d83cc019SAndroid Build Coastguard Worker 
732*d83cc019SAndroid Build Coastguard Worker instrseq:	instrseq pragma
733*d83cc019SAndroid Build Coastguard Worker 		{
734*d83cc019SAndroid Build Coastguard Worker 		    $$ = $1;
735*d83cc019SAndroid Build Coastguard Worker 		}
736*d83cc019SAndroid Build Coastguard Worker 		| instrseq instruction SEMICOLON
737*d83cc019SAndroid Build Coastguard Worker 		{
738*d83cc019SAndroid Build Coastguard Worker 		  brw_program_add_instruction(&$1, &$2);
739*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
740*d83cc019SAndroid Build Coastguard Worker 		}
741*d83cc019SAndroid Build Coastguard Worker 		| instruction SEMICOLON
742*d83cc019SAndroid Build Coastguard Worker 		{
743*d83cc019SAndroid Build Coastguard Worker 		  brw_program_init(&$$);
744*d83cc019SAndroid Build Coastguard Worker 		  brw_program_add_instruction(&$$, &$1);
745*d83cc019SAndroid Build Coastguard Worker 		}
746*d83cc019SAndroid Build Coastguard Worker 		| instrseq relocatableinstruction SEMICOLON
747*d83cc019SAndroid Build Coastguard Worker 		{
748*d83cc019SAndroid Build Coastguard Worker 		  brw_program_add_relocatable(&$1, &$2);
749*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
750*d83cc019SAndroid Build Coastguard Worker 		}
751*d83cc019SAndroid Build Coastguard Worker 		| relocatableinstruction SEMICOLON
752*d83cc019SAndroid Build Coastguard Worker 		{
753*d83cc019SAndroid Build Coastguard Worker 		  brw_program_init(&$$);
754*d83cc019SAndroid Build Coastguard Worker 		  brw_program_add_relocatable(&$$, &$1);
755*d83cc019SAndroid Build Coastguard Worker 		}
756*d83cc019SAndroid Build Coastguard Worker 		| instrseq SEMICOLON
757*d83cc019SAndroid Build Coastguard Worker 		{
758*d83cc019SAndroid Build Coastguard Worker 		    $$ = $1;
759*d83cc019SAndroid Build Coastguard Worker 		}
760*d83cc019SAndroid Build Coastguard Worker 		| instrseq label
761*d83cc019SAndroid Build Coastguard Worker         	{
762*d83cc019SAndroid Build Coastguard Worker 		  brw_program_add_label(&$1, $2);
763*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
764*d83cc019SAndroid Build Coastguard Worker                 }
765*d83cc019SAndroid Build Coastguard Worker 		| label
766*d83cc019SAndroid Build Coastguard Worker 		{
767*d83cc019SAndroid Build Coastguard Worker 		  brw_program_init(&$$);
768*d83cc019SAndroid Build Coastguard Worker 		  brw_program_add_label(&$$, $1);
769*d83cc019SAndroid Build Coastguard Worker 		}
770*d83cc019SAndroid Build Coastguard Worker 		| pragma
771*d83cc019SAndroid Build Coastguard Worker 		{
772*d83cc019SAndroid Build Coastguard Worker 		  $$.first = NULL;
773*d83cc019SAndroid Build Coastguard Worker 		  $$.last = NULL;
774*d83cc019SAndroid Build Coastguard Worker 		}
775*d83cc019SAndroid Build Coastguard Worker 		| instrseq error SEMICOLON {
776*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
777*d83cc019SAndroid Build Coastguard Worker 		}
778*d83cc019SAndroid Build Coastguard Worker ;
779*d83cc019SAndroid Build Coastguard Worker 
780*d83cc019SAndroid Build Coastguard Worker /* 1.4.1: Instruction groups */
781*d83cc019SAndroid Build Coastguard Worker // binaryinstruction:    Source operands cannot be accumulators
782*d83cc019SAndroid Build Coastguard Worker // binaryaccinstruction: Source operands can be accumulators
783*d83cc019SAndroid Build Coastguard Worker instruction:	unaryinstruction
784*d83cc019SAndroid Build Coastguard Worker 		| binaryinstruction
785*d83cc019SAndroid Build Coastguard Worker 		| binaryaccinstruction
786*d83cc019SAndroid Build Coastguard Worker 		| trinaryinstruction
787*d83cc019SAndroid Build Coastguard Worker 		| sendinstruction
788*d83cc019SAndroid Build Coastguard Worker 		| syncinstruction
789*d83cc019SAndroid Build Coastguard Worker 		| mathinstruction
790*d83cc019SAndroid Build Coastguard Worker 		| nopinstruction
791*d83cc019SAndroid Build Coastguard Worker ;
792*d83cc019SAndroid Build Coastguard Worker 
793*d83cc019SAndroid Build Coastguard Worker /* relocatableinstruction are instructions that needs a relocation pass */
794*d83cc019SAndroid Build Coastguard Worker relocatableinstruction:	ifelseinstruction
795*d83cc019SAndroid Build Coastguard Worker 			| loopinstruction
796*d83cc019SAndroid Build Coastguard Worker 			| haltinstruction
797*d83cc019SAndroid Build Coastguard Worker 			| multibranchinstruction
798*d83cc019SAndroid Build Coastguard Worker 			| subroutineinstruction
799*d83cc019SAndroid Build Coastguard Worker 			| jumpinstruction
800*d83cc019SAndroid Build Coastguard Worker 			| breakinstruction
801*d83cc019SAndroid Build Coastguard Worker ;
802*d83cc019SAndroid Build Coastguard Worker 
803*d83cc019SAndroid Build Coastguard Worker ifelseinstruction: ENDIF
804*d83cc019SAndroid Build Coastguard Worker 		{
805*d83cc019SAndroid Build Coastguard Worker 		  // for Gen4
806*d83cc019SAndroid Build Coastguard Worker 		  if(IS_GENp(6)) // For gen6+.
807*d83cc019SAndroid Build Coastguard Worker 		    error(&@1, "should be 'ENDIF execsize relativelocation'\n");
808*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
809*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $1);
810*d83cc019SAndroid Build Coastguard Worker 		  GEN(&$$)->header.thread_control |= BRW_THREAD_SWITCH;
811*d83cc019SAndroid Build Coastguard Worker 		  GEN(&$$)->bits1.da1.dest_horiz_stride = 1;
812*d83cc019SAndroid Build Coastguard Worker 		  GEN(&$$)->bits1.da1.src1_reg_file = BRW_ARCHITECTURE_REGISTER_FILE;
813*d83cc019SAndroid Build Coastguard Worker 		  GEN(&$$)->bits1.da1.src1_reg_type = BRW_REGISTER_TYPE_UD;
814*d83cc019SAndroid Build Coastguard Worker 		}
815*d83cc019SAndroid Build Coastguard Worker 		| ENDIF execsize relativelocation instoptions
816*d83cc019SAndroid Build Coastguard Worker 		{
817*d83cc019SAndroid Build Coastguard Worker 		  // for Gen6+
818*d83cc019SAndroid Build Coastguard Worker 		  /* Gen6, Gen7 bspec: predication is prohibited */
819*d83cc019SAndroid Build Coastguard Worker 		  if(!IS_GENp(6)) // for gen6-
820*d83cc019SAndroid Build Coastguard Worker 		    error(&@1, "ENDIF Syntax error: should be 'ENDIF'\n");
821*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
822*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $1);
823*d83cc019SAndroid Build Coastguard Worker 		  set_execsize(&$$, $2);
824*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_target = $3.reloc_target;
825*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_offset = $3.imm32;
826*d83cc019SAndroid Build Coastguard Worker 		}
827*d83cc019SAndroid Build Coastguard Worker 		| ELSE execsize relativelocation instoptions
828*d83cc019SAndroid Build Coastguard Worker 		{
829*d83cc019SAndroid Build Coastguard Worker 		  if(!IS_GENp(6)) {
830*d83cc019SAndroid Build Coastguard Worker 		    // for Gen4, Gen5. gen_level < 60
831*d83cc019SAndroid Build Coastguard Worker 		    /* Set the istack pop count, which must always be 1. */
832*d83cc019SAndroid Build Coastguard Worker 		    $3.imm32 |= (1 << 16);
833*d83cc019SAndroid Build Coastguard Worker 
834*d83cc019SAndroid Build Coastguard Worker 		    memset(&$$, 0, sizeof($$));
835*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_opcode(&$$, $1);
836*d83cc019SAndroid Build Coastguard Worker 		    GEN(&$$)->header.thread_control |= BRW_THREAD_SWITCH;
837*d83cc019SAndroid Build Coastguard Worker 		    ip_dst.width = $2;
838*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_dest(&$$, &ip_dst);
839*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_src0(&$$, &ip_src, NULL);
840*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_src1(&$$, &$3, NULL);
841*d83cc019SAndroid Build Coastguard Worker 		    $$.reloc.first_reloc_target = $3.reloc_target;
842*d83cc019SAndroid Build Coastguard Worker 		    $$.reloc.first_reloc_offset = $3.imm32;
843*d83cc019SAndroid Build Coastguard Worker 		  } else if(IS_GENp(6)) {
844*d83cc019SAndroid Build Coastguard Worker 		    memset(&$$, 0, sizeof($$));
845*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_opcode(&$$, $1);
846*d83cc019SAndroid Build Coastguard Worker 		    set_execsize(&$$, $2);
847*d83cc019SAndroid Build Coastguard Worker 		    $$.reloc.first_reloc_target = $3.reloc_target;
848*d83cc019SAndroid Build Coastguard Worker 		    $$.reloc.first_reloc_offset = $3.imm32;
849*d83cc019SAndroid Build Coastguard Worker 		  } else {
850*d83cc019SAndroid Build Coastguard Worker 		    error(&@1, "'ELSE' instruction is not implemented.\n");
851*d83cc019SAndroid Build Coastguard Worker 		  }
852*d83cc019SAndroid Build Coastguard Worker 		}
853*d83cc019SAndroid Build Coastguard Worker 		| predicate IF execsize relativelocation
854*d83cc019SAndroid Build Coastguard Worker 		{
855*d83cc019SAndroid Build Coastguard Worker 		  /* The branch instructions require that the IP register
856*d83cc019SAndroid Build Coastguard Worker 		   * be the destination and first source operand, while the
857*d83cc019SAndroid Build Coastguard Worker 		   * offset is the second source operand.  The offset is added
858*d83cc019SAndroid Build Coastguard Worker 		   * to the pre-incremented IP.
859*d83cc019SAndroid Build Coastguard Worker 		   */
860*d83cc019SAndroid Build Coastguard Worker 		  if(IS_GENp(7)) /* Error in Gen7+. */
861*d83cc019SAndroid Build Coastguard Worker 		    error(&@2, "IF should be 'IF execsize JIP UIP'\n");
862*d83cc019SAndroid Build Coastguard Worker 
863*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
864*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
865*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
866*d83cc019SAndroid Build Coastguard Worker 		  if(!IS_GENp(6)) {
867*d83cc019SAndroid Build Coastguard Worker 		    GEN(&$$)->header.thread_control |= BRW_THREAD_SWITCH;
868*d83cc019SAndroid Build Coastguard Worker 		    ip_dst.width = $3;
869*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_dest(&$$, &ip_dst);
870*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_src0(&$$, &ip_src, NULL);
871*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_src1(&$$, &$4, NULL);
872*d83cc019SAndroid Build Coastguard Worker 		  }
873*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_target = $4.reloc_target;
874*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_offset = $4.imm32;
875*d83cc019SAndroid Build Coastguard Worker 		}
876*d83cc019SAndroid Build Coastguard Worker 		| predicate IF execsize relativelocation relativelocation
877*d83cc019SAndroid Build Coastguard Worker 		{
878*d83cc019SAndroid Build Coastguard Worker 		  /* for Gen7+ */
879*d83cc019SAndroid Build Coastguard Worker 		  if(!IS_GENp(7))
880*d83cc019SAndroid Build Coastguard Worker 		    error(&@2, "IF should be 'IF execsize relativelocation'\n");
881*d83cc019SAndroid Build Coastguard Worker 
882*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
883*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
884*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
885*d83cc019SAndroid Build Coastguard Worker 		  set_execsize(&$$, $3);
886*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_target = $4.reloc_target;
887*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_offset = $4.imm32;
888*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.second_reloc_target = $5.reloc_target;
889*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.second_reloc_offset = $5.imm32;
890*d83cc019SAndroid Build Coastguard Worker 		}
891*d83cc019SAndroid Build Coastguard Worker ;
892*d83cc019SAndroid Build Coastguard Worker 
893*d83cc019SAndroid Build Coastguard Worker loopinstruction: predicate WHILE execsize relativelocation instoptions
894*d83cc019SAndroid Build Coastguard Worker 		{
895*d83cc019SAndroid Build Coastguard Worker 		  if(!IS_GENp(6)) {
896*d83cc019SAndroid Build Coastguard Worker 		    /* The branch instructions require that the IP register
897*d83cc019SAndroid Build Coastguard Worker 		     * be the destination and first source operand, while the
898*d83cc019SAndroid Build Coastguard Worker 		     * offset is the second source operand.  The offset is added
899*d83cc019SAndroid Build Coastguard Worker 		     * to the pre-incremented IP.
900*d83cc019SAndroid Build Coastguard Worker 		     */
901*d83cc019SAndroid Build Coastguard Worker 		    ip_dst.width = $3;
902*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_dest(&$$, &ip_dst);
903*d83cc019SAndroid Build Coastguard Worker 		    memset(&$$, 0, sizeof($$));
904*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_predicate(&$$, &$1);
905*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_opcode(&$$, $2);
906*d83cc019SAndroid Build Coastguard Worker 		    GEN(&$$)->header.thread_control |= BRW_THREAD_SWITCH;
907*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_src0(&$$, &ip_src, NULL);
908*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_src1(&$$, &$4, NULL);
909*d83cc019SAndroid Build Coastguard Worker 		    $$.reloc.first_reloc_target = $4.reloc_target;
910*d83cc019SAndroid Build Coastguard Worker 		    $$.reloc.first_reloc_offset = $4.imm32;
911*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENp(6)) {
912*d83cc019SAndroid Build Coastguard Worker 		    /* Gen6 spec:
913*d83cc019SAndroid Build Coastguard Worker 		         dest must have the same element size as src0.
914*d83cc019SAndroid Build Coastguard Worker 		         dest horizontal stride must be 1. */
915*d83cc019SAndroid Build Coastguard Worker 		    memset(&$$, 0, sizeof($$));
916*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_predicate(&$$, &$1);
917*d83cc019SAndroid Build Coastguard Worker 		    set_instruction_opcode(&$$, $2);
918*d83cc019SAndroid Build Coastguard Worker 		    set_execsize(&$$, $3);
919*d83cc019SAndroid Build Coastguard Worker 		    $$.reloc.first_reloc_target = $4.reloc_target;
920*d83cc019SAndroid Build Coastguard Worker 		    $$.reloc.first_reloc_offset = $4.imm32;
921*d83cc019SAndroid Build Coastguard Worker 		  } else {
922*d83cc019SAndroid Build Coastguard Worker 		    error(&@2, "'WHILE' instruction is not implemented!\n");
923*d83cc019SAndroid Build Coastguard Worker 		  }
924*d83cc019SAndroid Build Coastguard Worker 		}
925*d83cc019SAndroid Build Coastguard Worker 		| DO
926*d83cc019SAndroid Build Coastguard Worker 		{
927*d83cc019SAndroid Build Coastguard Worker 		  // deprecated
928*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
929*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $1);
930*d83cc019SAndroid Build Coastguard Worker 		};
931*d83cc019SAndroid Build Coastguard Worker 
932*d83cc019SAndroid Build Coastguard Worker haltinstruction: predicate HALT execsize relativelocation relativelocation instoptions
933*d83cc019SAndroid Build Coastguard Worker 		{
934*d83cc019SAndroid Build Coastguard Worker 		  // for Gen6, Gen7
935*d83cc019SAndroid Build Coastguard Worker 		  /* Gen6, Gen7 bspec: dst and src0 must be the null reg. */
936*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
937*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
938*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
939*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_target = $4.reloc_target;
940*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_offset = $4.imm32;
941*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.second_reloc_target = $5.reloc_target;
942*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.second_reloc_offset = $5.imm32;
943*d83cc019SAndroid Build Coastguard Worker 		  dst_null_reg.width = $3;
944*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_dest(&$$, &dst_null_reg);
945*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_src0(&$$, &src_null_reg, NULL);
946*d83cc019SAndroid Build Coastguard Worker 		};
947*d83cc019SAndroid Build Coastguard Worker 
948*d83cc019SAndroid Build Coastguard Worker multibranchinstruction:
949*d83cc019SAndroid Build Coastguard Worker 		predicate BRD execsize relativelocation instoptions
950*d83cc019SAndroid Build Coastguard Worker 		{
951*d83cc019SAndroid Build Coastguard Worker 		  /* Gen7 bspec: dest must be null. use Switch option */
952*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
953*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
954*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
955*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(8))
956*d83cc019SAndroid Build Coastguard Worker                       gen8_set_thread_control(GEN8(&$$), gen8_thread_control(GEN8(&$$)) | BRW_THREAD_SWITCH);
957*d83cc019SAndroid Build Coastguard Worker 		  else
958*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->header.thread_control |= BRW_THREAD_SWITCH;
959*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_target = $4.reloc_target;
960*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_offset = $4.imm32;
961*d83cc019SAndroid Build Coastguard Worker 		  dst_null_reg.width = $3;
962*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_dest(&$$, &dst_null_reg);
963*d83cc019SAndroid Build Coastguard Worker 		}
964*d83cc019SAndroid Build Coastguard Worker 		| predicate BRC execsize relativelocation relativelocation instoptions
965*d83cc019SAndroid Build Coastguard Worker 		{
966*d83cc019SAndroid Build Coastguard Worker 		  /* Gen7 bspec: dest must be null. src0 must be null. use Switch option */
967*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
968*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
969*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
970*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(8))
971*d83cc019SAndroid Build Coastguard Worker                       gen8_set_thread_control(GEN8(&$$), gen8_thread_control(GEN8(&$$)) | BRW_THREAD_SWITCH);
972*d83cc019SAndroid Build Coastguard Worker 		  else
973*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->header.thread_control |= BRW_THREAD_SWITCH;
974*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_target = $4.reloc_target;
975*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_offset = $4.imm32;
976*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.second_reloc_target = $5.reloc_target;
977*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.second_reloc_offset = $5.imm32;
978*d83cc019SAndroid Build Coastguard Worker 		  dst_null_reg.width = $3;
979*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_dest(&$$, &dst_null_reg);
980*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_src0(&$$, &src_null_reg, NULL);
981*d83cc019SAndroid Build Coastguard Worker 		}
982*d83cc019SAndroid Build Coastguard Worker ;
983*d83cc019SAndroid Build Coastguard Worker 
984*d83cc019SAndroid Build Coastguard Worker subroutineinstruction:
985*d83cc019SAndroid Build Coastguard Worker 		predicate CALL execsize dst relativelocation instoptions
986*d83cc019SAndroid Build Coastguard Worker 		{
987*d83cc019SAndroid Build Coastguard Worker 		  /*
988*d83cc019SAndroid Build Coastguard Worker 		    Gen6 bspec:
989*d83cc019SAndroid Build Coastguard Worker 		       source, dest type should be DWORD.
990*d83cc019SAndroid Build Coastguard Worker 		       dest must be QWord aligned.
991*d83cc019SAndroid Build Coastguard Worker 		       source0 region control must be <2,2,1>.
992*d83cc019SAndroid Build Coastguard Worker 		       execution size must be 2.
993*d83cc019SAndroid Build Coastguard Worker 		       QtrCtrl is prohibited.
994*d83cc019SAndroid Build Coastguard Worker 		       JIP is an immediate operand, must be of type W.
995*d83cc019SAndroid Build Coastguard Worker 		    Gen7 bspec:
996*d83cc019SAndroid Build Coastguard Worker 		       source, dest type should be DWORD.
997*d83cc019SAndroid Build Coastguard Worker 		       dest must be QWord aligned.
998*d83cc019SAndroid Build Coastguard Worker 		       source0 region control must be <2,2,1>.
999*d83cc019SAndroid Build Coastguard Worker 		       execution size must be 2.
1000*d83cc019SAndroid Build Coastguard Worker 		   */
1001*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1002*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
1003*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1004*d83cc019SAndroid Build Coastguard Worker 
1005*d83cc019SAndroid Build Coastguard Worker 		  $4.type = BRW_REGISTER_TYPE_D; /* dest type should be DWORD */
1006*d83cc019SAndroid Build Coastguard Worker 		  $4.width = BRW_WIDTH_2; /* execution size must be 2. */
1007*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_dest(&$$, &$4);
1008*d83cc019SAndroid Build Coastguard Worker 
1009*d83cc019SAndroid Build Coastguard Worker 		  struct src_operand src0;
1010*d83cc019SAndroid Build Coastguard Worker 		  memset(&src0, 0, sizeof(src0));
1011*d83cc019SAndroid Build Coastguard Worker 		  src0.reg.type = BRW_REGISTER_TYPE_D; /* source type should be DWORD */
1012*d83cc019SAndroid Build Coastguard Worker 		  /* source0 region control must be <2,2,1>. */
1013*d83cc019SAndroid Build Coastguard Worker 		  src0.reg.hstride = 1; /*encoded 1*/
1014*d83cc019SAndroid Build Coastguard Worker 		  src0.reg.width = BRW_WIDTH_2;
1015*d83cc019SAndroid Build Coastguard Worker 		  src0.reg.vstride = 2; /*encoded 2*/
1016*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_src0(&$$, &src0, NULL);
1017*d83cc019SAndroid Build Coastguard Worker 
1018*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_target = $5.reloc_target;
1019*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_offset = $5.imm32;
1020*d83cc019SAndroid Build Coastguard Worker 		}
1021*d83cc019SAndroid Build Coastguard Worker 		| predicate RET execsize dstoperandex src instoptions
1022*d83cc019SAndroid Build Coastguard Worker 		{
1023*d83cc019SAndroid Build Coastguard Worker 		  /*
1024*d83cc019SAndroid Build Coastguard Worker 		     Gen6, 7:
1025*d83cc019SAndroid Build Coastguard Worker 		       source cannot be accumulator.
1026*d83cc019SAndroid Build Coastguard Worker 		       dest must be null.
1027*d83cc019SAndroid Build Coastguard Worker 		       src0 region control must be <2,2,1> (not specified clearly. should be same as CALL)
1028*d83cc019SAndroid Build Coastguard Worker 		   */
1029*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1030*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
1031*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1032*d83cc019SAndroid Build Coastguard Worker 		  dst_null_reg.width = BRW_WIDTH_2; /* execution size of RET should be 2 */
1033*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_dest(&$$, &dst_null_reg);
1034*d83cc019SAndroid Build Coastguard Worker 		  $5.reg.type = BRW_REGISTER_TYPE_D;
1035*d83cc019SAndroid Build Coastguard Worker 		  $5.reg.hstride = 1; /*encoded 1*/
1036*d83cc019SAndroid Build Coastguard Worker 		  $5.reg.width = BRW_WIDTH_2;
1037*d83cc019SAndroid Build Coastguard Worker 		  $5.reg.vstride = 2; /*encoded 2*/
1038*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_src0(&$$, &$5, NULL);
1039*d83cc019SAndroid Build Coastguard Worker 		}
1040*d83cc019SAndroid Build Coastguard Worker ;
1041*d83cc019SAndroid Build Coastguard Worker 
1042*d83cc019SAndroid Build Coastguard Worker unaryinstruction:
1043*d83cc019SAndroid Build Coastguard Worker 		predicate unaryop conditionalmodifier saturate execsize
1044*d83cc019SAndroid Build Coastguard Worker 		dst srcaccimm instoptions
1045*d83cc019SAndroid Build Coastguard Worker 		{
1046*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1047*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1048*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_saturate(&$$, $4);
1049*d83cc019SAndroid Build Coastguard Worker 		  $6.width = $5;
1050*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_options(&$$, $8);
1051*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_pred_cond(&$$, &$1, &$3, &@3);
1052*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_dest(&$$, &$6) != 0)
1053*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1054*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src0(&$$, &$7, &@7) != 0)
1055*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1056*d83cc019SAndroid Build Coastguard Worker 
1057*d83cc019SAndroid Build Coastguard Worker 		  if (!IS_GENp(6) &&
1058*d83cc019SAndroid Build Coastguard Worker 				get_type_size(GEN(&$$)->bits1.da1.dest_reg_type) * (1 << $6.width) == 64)
1059*d83cc019SAndroid Build Coastguard Worker 		    GEN(&$$)->header.compression_control = BRW_COMPRESSION_COMPRESSED;
1060*d83cc019SAndroid Build Coastguard Worker 		}
1061*d83cc019SAndroid Build Coastguard Worker ;
1062*d83cc019SAndroid Build Coastguard Worker 
1063*d83cc019SAndroid Build Coastguard Worker unaryop:	MOV | FRC | RNDU | RNDD | RNDE | RNDZ | NOT | LZD | BFREV | CBIT
1064*d83cc019SAndroid Build Coastguard Worker           | F16TO32 | F32TO16 | FBH | FBL
1065*d83cc019SAndroid Build Coastguard Worker ;
1066*d83cc019SAndroid Build Coastguard Worker 
1067*d83cc019SAndroid Build Coastguard Worker // Source operands cannot be accumulators
1068*d83cc019SAndroid Build Coastguard Worker binaryinstruction:
1069*d83cc019SAndroid Build Coastguard Worker 		predicate binaryop conditionalmodifier saturate execsize
1070*d83cc019SAndroid Build Coastguard Worker 		dst src srcimm instoptions
1071*d83cc019SAndroid Build Coastguard Worker 		{
1072*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1073*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1074*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_saturate(&$$, $4);
1075*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_options(&$$, $9);
1076*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_pred_cond(&$$, &$1, &$3, &@3);
1077*d83cc019SAndroid Build Coastguard Worker 		  $6.width = $5;
1078*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_dest(&$$, &$6) != 0)
1079*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1080*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src0(&$$, &$7, &@7) != 0)
1081*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1082*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src1(&$$, &$8, &@8) != 0)
1083*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1084*d83cc019SAndroid Build Coastguard Worker 
1085*d83cc019SAndroid Build Coastguard Worker 		  if (!IS_GENp(6) &&
1086*d83cc019SAndroid Build Coastguard Worker 				get_type_size(GEN(&$$)->bits1.da1.dest_reg_type) * (1 << $6.width) == 64)
1087*d83cc019SAndroid Build Coastguard Worker 		    GEN(&$$)->header.compression_control = BRW_COMPRESSION_COMPRESSED;
1088*d83cc019SAndroid Build Coastguard Worker 		}
1089*d83cc019SAndroid Build Coastguard Worker ;
1090*d83cc019SAndroid Build Coastguard Worker 
1091*d83cc019SAndroid Build Coastguard Worker /* bspec: BFI1 should not access accumulator. */
1092*d83cc019SAndroid Build Coastguard Worker binaryop:	MUL | MAC | MACH | LINE | SAD2 | SADA2 | DP4 | DPH | DP3 | DP2 | PLN | BFI1
1093*d83cc019SAndroid Build Coastguard Worker ;
1094*d83cc019SAndroid Build Coastguard Worker 
1095*d83cc019SAndroid Build Coastguard Worker // Source operands can be accumulators
1096*d83cc019SAndroid Build Coastguard Worker binaryaccinstruction:
1097*d83cc019SAndroid Build Coastguard Worker 		predicate binaryaccop conditionalmodifier saturate execsize
1098*d83cc019SAndroid Build Coastguard Worker 		dst srcacc srcimm instoptions
1099*d83cc019SAndroid Build Coastguard Worker 		{
1100*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1101*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1102*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_saturate(&$$, $4);
1103*d83cc019SAndroid Build Coastguard Worker 		  $6.width = $5;
1104*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_options(&$$, $9);
1105*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_pred_cond(&$$, &$1, &$3, &@3);
1106*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_dest(&$$, &$6) != 0)
1107*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1108*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src0(&$$, &$7, &@7) != 0)
1109*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1110*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src1(&$$, &$8, &@8) != 0)
1111*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1112*d83cc019SAndroid Build Coastguard Worker 
1113*d83cc019SAndroid Build Coastguard Worker 		  if (!IS_GENp(6) &&
1114*d83cc019SAndroid Build Coastguard Worker 				get_type_size(GEN(&$$)->bits1.da1.dest_reg_type) * (1 << $6.width) == 64)
1115*d83cc019SAndroid Build Coastguard Worker 		    GEN(&$$)->header.compression_control = BRW_COMPRESSION_COMPRESSED;
1116*d83cc019SAndroid Build Coastguard Worker 		}
1117*d83cc019SAndroid Build Coastguard Worker ;
1118*d83cc019SAndroid Build Coastguard Worker 
1119*d83cc019SAndroid Build Coastguard Worker /* TODO: bspec says ADDC/SUBB/CMP/CMPN/SHL/BFI1 cannot use accumulator as dest. */
1120*d83cc019SAndroid Build Coastguard Worker binaryaccop:	AVG | ADD | SEL | AND | OR | XOR | SHR | SHL | ASR | CMP | CMPN | ADDC | SUBB
1121*d83cc019SAndroid Build Coastguard Worker ;
1122*d83cc019SAndroid Build Coastguard Worker 
1123*d83cc019SAndroid Build Coastguard Worker trinaryop:	MAD | LRP | BFE | BFI2
1124*d83cc019SAndroid Build Coastguard Worker ;
1125*d83cc019SAndroid Build Coastguard Worker 
1126*d83cc019SAndroid Build Coastguard Worker trinaryinstruction:
1127*d83cc019SAndroid Build Coastguard Worker 		predicate trinaryop conditionalmodifier saturate execsize
1128*d83cc019SAndroid Build Coastguard Worker 		dst src src src instoptions
1129*d83cc019SAndroid Build Coastguard Worker {
1130*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1131*d83cc019SAndroid Build Coastguard Worker 
1132*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_pred_cond(&$$, &$1, &$3, &@3);
1133*d83cc019SAndroid Build Coastguard Worker 
1134*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1135*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_saturate(&$$, $4);
1136*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_options(&$$, $10);
1137*d83cc019SAndroid Build Coastguard Worker 
1138*d83cc019SAndroid Build Coastguard Worker 		  $6.width = $5;
1139*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_dest_three_src(&$$, &$6))
1140*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1141*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src0_three_src(&$$, &$7))
1142*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1143*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src1_three_src(&$$, &$8))
1144*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1145*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src2_three_src(&$$, &$9))
1146*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1147*d83cc019SAndroid Build Coastguard Worker }
1148*d83cc019SAndroid Build Coastguard Worker ;
1149*d83cc019SAndroid Build Coastguard Worker 
1150*d83cc019SAndroid Build Coastguard Worker sendop:		SEND | SENDC
1151*d83cc019SAndroid Build Coastguard Worker ;
1152*d83cc019SAndroid Build Coastguard Worker 
1153*d83cc019SAndroid Build Coastguard Worker sendinstruction: predicate sendop execsize exp post_dst payload msgtarget
1154*d83cc019SAndroid Build Coastguard Worker 		MSGLEN exp RETURNLEN exp instoptions
1155*d83cc019SAndroid Build Coastguard Worker 		{
1156*d83cc019SAndroid Build Coastguard Worker 		  /* Send instructions are messy.  The first argument is the
1157*d83cc019SAndroid Build Coastguard Worker 		   * post destination -- the grf register that the response
1158*d83cc019SAndroid Build Coastguard Worker 		   * starts from.  The second argument is the current
1159*d83cc019SAndroid Build Coastguard Worker 		   * destination, which is the start of the message arguments
1160*d83cc019SAndroid Build Coastguard Worker 		   * to the shared function, and where src0 payload is loaded
1161*d83cc019SAndroid Build Coastguard Worker 		   * to if not null.  The payload is typically based on the
1162*d83cc019SAndroid Build Coastguard Worker 		   * grf 0 thread payload of your current thread, and is
1163*d83cc019SAndroid Build Coastguard Worker 		   * implicitly loaded if non-null.
1164*d83cc019SAndroid Build Coastguard Worker 		   */
1165*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1166*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1167*d83cc019SAndroid Build Coastguard Worker 		  $5.width = $3;
1168*d83cc019SAndroid Build Coastguard Worker 		  GEN(&$$)->header.destreg__conditionalmod = $4; /* msg reg index */
1169*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
1170*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_dest(&$$, &$5) != 0)
1171*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1172*d83cc019SAndroid Build Coastguard Worker 
1173*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(6)) {
1174*d83cc019SAndroid Build Coastguard Worker                       struct src_operand src0;
1175*d83cc019SAndroid Build Coastguard Worker 
1176*d83cc019SAndroid Build Coastguard Worker                       memset(&src0, 0, sizeof(src0));
1177*d83cc019SAndroid Build Coastguard Worker                       src0.reg.address_mode = BRW_ADDRESS_DIRECT;
1178*d83cc019SAndroid Build Coastguard Worker 
1179*d83cc019SAndroid Build Coastguard Worker                       if (IS_GENp(7))
1180*d83cc019SAndroid Build Coastguard Worker                           src0.reg.file = BRW_GENERAL_REGISTER_FILE;
1181*d83cc019SAndroid Build Coastguard Worker                       else
1182*d83cc019SAndroid Build Coastguard Worker                           src0.reg.file = BRW_MESSAGE_REGISTER_FILE;
1183*d83cc019SAndroid Build Coastguard Worker 
1184*d83cc019SAndroid Build Coastguard Worker                       src0.reg.type = BRW_REGISTER_TYPE_D;
1185*d83cc019SAndroid Build Coastguard Worker                       src0.reg.nr = $4;
1186*d83cc019SAndroid Build Coastguard Worker                       src0.reg.subnr = 0;
1187*d83cc019SAndroid Build Coastguard Worker                       set_instruction_src0(&$$, &src0, NULL);
1188*d83cc019SAndroid Build Coastguard Worker 		  } else {
1189*d83cc019SAndroid Build Coastguard Worker                       if (set_instruction_src0(&$$, &$6, &@6) != 0)
1190*d83cc019SAndroid Build Coastguard Worker                           YYERROR;
1191*d83cc019SAndroid Build Coastguard Worker 		  }
1192*d83cc019SAndroid Build Coastguard Worker 
1193*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(9)) {
1194*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_src1_reg_file(GEN8(&$$), BRW_IMMEDIATE_VALUE);
1195*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_src1_reg_type(GEN8(&$$), BRW_REGISTER_TYPE_D);
1196*d83cc019SAndroid Build Coastguard Worker 		      gen9_set_send_extdesc(GEN8(&$$), 0);
1197*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENp(8)) {
1198*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_src1_reg_file(GEN8(&$$), BRW_IMMEDIATE_VALUE);
1199*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_src1_reg_type(GEN8(&$$), BRW_REGISTER_TYPE_D);
1200*d83cc019SAndroid Build Coastguard Worker 		  } else {
1201*d83cc019SAndroid Build Coastguard Worker 		      GEN(&$$)->bits1.da1.src1_reg_file = BRW_IMMEDIATE_VALUE;
1202*d83cc019SAndroid Build Coastguard Worker 		      GEN(&$$)->bits1.da1.src1_reg_type = BRW_REGISTER_TYPE_D;
1203*d83cc019SAndroid Build Coastguard Worker 		  }
1204*d83cc019SAndroid Build Coastguard Worker 
1205*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(8)) {
1206*d83cc019SAndroid Build Coastguard Worker 		      GEN8(&$$)->data[3] = GEN8(&$7)->data[3];
1207*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_sfid(GEN8(&$$), gen8_sfid(GEN8(&$7)));
1208*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_mlen(GEN8(&$$), $9);
1209*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_rlen(GEN8(&$$), $11);
1210*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_eot(GEN8(&$$), $12.end_of_thread);
1211*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENp(5)) {
1212*d83cc019SAndroid Build Coastguard Worker                       if (IS_GENp(6)) {
1213*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->header.destreg__conditionalmod = GEN(&$7)->bits2.send_gen5.sfid;
1214*d83cc019SAndroid Build Coastguard Worker                       } else {
1215*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->header.destreg__conditionalmod = $4; /* msg reg index */
1216*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits2.send_gen5.sfid = GEN(&$7)->bits2.send_gen5.sfid;
1217*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits2.send_gen5.end_of_thread = $12.end_of_thread;
1218*d83cc019SAndroid Build Coastguard Worker                       }
1219*d83cc019SAndroid Build Coastguard Worker 
1220*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5 = GEN(&$7)->bits3.generic_gen5;
1221*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.msg_length = $9;
1222*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.response_length = $11;
1223*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.end_of_thread = $12.end_of_thread;
1224*d83cc019SAndroid Build Coastguard Worker 		  } else {
1225*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->header.destreg__conditionalmod = $4; /* msg reg index */
1226*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic = GEN(&$7)->bits3.generic;
1227*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic.msg_length = $9;
1228*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic.response_length = $11;
1229*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic.end_of_thread = $12.end_of_thread;
1230*d83cc019SAndroid Build Coastguard Worker 		  }
1231*d83cc019SAndroid Build Coastguard Worker 		}
1232*d83cc019SAndroid Build Coastguard Worker 		| predicate sendop execsize dst sendleadreg payload directsrcoperand instoptions
1233*d83cc019SAndroid Build Coastguard Worker 		{
1234*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(6))
1235*d83cc019SAndroid Build Coastguard Worker                       error(&@2, "invalid syntax for send on gen6+\n");
1236*d83cc019SAndroid Build Coastguard Worker 
1237*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1238*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1239*d83cc019SAndroid Build Coastguard Worker 		  GEN(&$$)->header.destreg__conditionalmod = $5.nr; /* msg reg index */
1240*d83cc019SAndroid Build Coastguard Worker 
1241*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
1242*d83cc019SAndroid Build Coastguard Worker 
1243*d83cc019SAndroid Build Coastguard Worker 		  $4.width = $3;
1244*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_dest(&$$, &$4) != 0)
1245*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1246*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src0(&$$, &$6, &@6) != 0)
1247*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1248*d83cc019SAndroid Build Coastguard Worker 		  /* XXX is this correct? */
1249*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src1(&$$, &$7, &@7) != 0)
1250*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1251*d83cc019SAndroid Build Coastguard Worker 
1252*d83cc019SAndroid Build Coastguard Worker 		  }
1253*d83cc019SAndroid Build Coastguard Worker 		| predicate sendop execsize dst sendleadreg payload imm32reg instoptions
1254*d83cc019SAndroid Build Coastguard Worker                 {
1255*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(6))
1256*d83cc019SAndroid Build Coastguard Worker                       error(&@2, "invalid syntax for send on gen6+\n");
1257*d83cc019SAndroid Build Coastguard Worker 
1258*d83cc019SAndroid Build Coastguard Worker 		  if ($7.reg.type != BRW_REGISTER_TYPE_UD &&
1259*d83cc019SAndroid Build Coastguard Worker 		      $7.reg.type != BRW_REGISTER_TYPE_D &&
1260*d83cc019SAndroid Build Coastguard Worker 		      $7.reg.type != BRW_REGISTER_TYPE_V) {
1261*d83cc019SAndroid Build Coastguard Worker 		    error (&@7, "non-int D/UD/V representation: %d,"
1262*d83cc019SAndroid Build Coastguard Worker 			   "type=%d\n", $7.reg.dw1.ud, $7.reg.type);
1263*d83cc019SAndroid Build Coastguard Worker 		  }
1264*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1265*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1266*d83cc019SAndroid Build Coastguard Worker 		  GEN(&$$)->header.destreg__conditionalmod = $5.nr; /* msg reg index */
1267*d83cc019SAndroid Build Coastguard Worker 
1268*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
1269*d83cc019SAndroid Build Coastguard Worker 		  $4.width = $3;
1270*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_dest(&$$, &$4) != 0)
1271*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1272*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src0(&$$, &$6, &@6) != 0)
1273*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1274*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src1(&$$, &$7, &@7) != 0)
1275*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1276*d83cc019SAndroid Build Coastguard Worker                 }
1277*d83cc019SAndroid Build Coastguard Worker 		| predicate sendop execsize dst sendleadreg sndopr imm32reg instoptions
1278*d83cc019SAndroid Build Coastguard Worker 		{
1279*d83cc019SAndroid Build Coastguard Worker 		  struct src_operand src0;
1280*d83cc019SAndroid Build Coastguard Worker 
1281*d83cc019SAndroid Build Coastguard Worker 		  if (!IS_GENp(6))
1282*d83cc019SAndroid Build Coastguard Worker                       error(&@2, "invalid syntax for send on gen6+\n");
1283*d83cc019SAndroid Build Coastguard Worker 
1284*d83cc019SAndroid Build Coastguard Worker 		  if ($7.reg.type != BRW_REGISTER_TYPE_UD &&
1285*d83cc019SAndroid Build Coastguard Worker                       $7.reg.type != BRW_REGISTER_TYPE_D &&
1286*d83cc019SAndroid Build Coastguard Worker                       $7.reg.type != BRW_REGISTER_TYPE_V) {
1287*d83cc019SAndroid Build Coastguard Worker                       error(&@7,"non-int D/UD/V representation: %d,"
1288*d83cc019SAndroid Build Coastguard Worker 			    "type=%d\n", $7.reg.dw1.ud, $7.reg.type);
1289*d83cc019SAndroid Build Coastguard Worker 		  }
1290*d83cc019SAndroid Build Coastguard Worker 
1291*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1292*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1293*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
1294*d83cc019SAndroid Build Coastguard Worker 
1295*d83cc019SAndroid Build Coastguard Worker 		  $4.width = $3;
1296*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_dest(&$$, &$4) != 0)
1297*d83cc019SAndroid Build Coastguard Worker                       YYERROR;
1298*d83cc019SAndroid Build Coastguard Worker 
1299*d83cc019SAndroid Build Coastguard Worker                   memset(&src0, 0, sizeof(src0));
1300*d83cc019SAndroid Build Coastguard Worker                   src0.reg.address_mode = BRW_ADDRESS_DIRECT;
1301*d83cc019SAndroid Build Coastguard Worker 
1302*d83cc019SAndroid Build Coastguard Worker                   if (IS_GENp(7)) {
1303*d83cc019SAndroid Build Coastguard Worker                       src0.reg.file = BRW_GENERAL_REGISTER_FILE;
1304*d83cc019SAndroid Build Coastguard Worker                       src0.reg.type = BRW_REGISTER_TYPE_UB;
1305*d83cc019SAndroid Build Coastguard Worker                   } else {
1306*d83cc019SAndroid Build Coastguard Worker                       src0.reg.file = BRW_MESSAGE_REGISTER_FILE;
1307*d83cc019SAndroid Build Coastguard Worker                       src0.reg.type = BRW_REGISTER_TYPE_D;
1308*d83cc019SAndroid Build Coastguard Worker                   }
1309*d83cc019SAndroid Build Coastguard Worker 
1310*d83cc019SAndroid Build Coastguard Worker                   src0.reg.nr = $5.nr;
1311*d83cc019SAndroid Build Coastguard Worker                   src0.reg.subnr = 0;
1312*d83cc019SAndroid Build Coastguard Worker                   set_instruction_src0(&$$, &src0, NULL);
1313*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_src1(&$$, &$7, NULL);
1314*d83cc019SAndroid Build Coastguard Worker 
1315*d83cc019SAndroid Build Coastguard Worker                   if (IS_GENp(9)) {
1316*d83cc019SAndroid Build Coastguard Worker                       gen8_set_sfid(GEN8(&$$), $6 & EX_DESC_SFID_MASK);
1317*d83cc019SAndroid Build Coastguard Worker                       gen8_set_eot(GEN8(&$$), !!($6 & EX_DESC_EOT_MASK));
1318*d83cc019SAndroid Build Coastguard Worker                       gen9_set_send_extdesc(GEN8(&$$), $6 & EX_DESC_FUNC_MASK);
1319*d83cc019SAndroid Build Coastguard Worker                   } else if (IS_GENp(8)) {
1320*d83cc019SAndroid Build Coastguard Worker                       gen8_set_sfid(GEN8(&$$), $6 & EX_DESC_SFID_MASK);
1321*d83cc019SAndroid Build Coastguard Worker                       gen8_set_eot(GEN8(&$$), !!($6 & EX_DESC_EOT_MASK));
1322*d83cc019SAndroid Build Coastguard Worker 		  } else {
1323*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->header.destreg__conditionalmod = ($6 & EX_DESC_SFID_MASK); /* SFID */
1324*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.end_of_thread = !!($6 & EX_DESC_EOT_MASK);
1325*d83cc019SAndroid Build Coastguard Worker                   }
1326*d83cc019SAndroid Build Coastguard Worker 		}
1327*d83cc019SAndroid Build Coastguard Worker 		| predicate sendop execsize dst sendleadreg sndopr directsrcoperand instoptions
1328*d83cc019SAndroid Build Coastguard Worker 		{
1329*d83cc019SAndroid Build Coastguard Worker 		  struct src_operand src0;
1330*d83cc019SAndroid Build Coastguard Worker 
1331*d83cc019SAndroid Build Coastguard Worker 		  if (!IS_GENp(6))
1332*d83cc019SAndroid Build Coastguard Worker                       error(&@2, "invalid syntax for send on gen6+\n");
1333*d83cc019SAndroid Build Coastguard Worker 
1334*d83cc019SAndroid Build Coastguard Worker                   if ($7.reg.file != BRW_ARCHITECTURE_REGISTER_FILE ||
1335*d83cc019SAndroid Build Coastguard Worker                       ($7.reg.nr & 0xF0) != BRW_ARF_ADDRESS ||
1336*d83cc019SAndroid Build Coastguard Worker                       ($7.reg.nr & 0x0F) != 0 ||
1337*d83cc019SAndroid Build Coastguard Worker                       $7.reg.subnr != 0) {
1338*d83cc019SAndroid Build Coastguard Worker                       error (&@7, "scalar register must be a0.0<0;1,0>:ud\n");
1339*d83cc019SAndroid Build Coastguard Worker 		  }
1340*d83cc019SAndroid Build Coastguard Worker 
1341*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1342*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1343*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
1344*d83cc019SAndroid Build Coastguard Worker 
1345*d83cc019SAndroid Build Coastguard Worker 		  $4.width = $3;
1346*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_dest(&$$, &$4) != 0)
1347*d83cc019SAndroid Build Coastguard Worker                       YYERROR;
1348*d83cc019SAndroid Build Coastguard Worker 
1349*d83cc019SAndroid Build Coastguard Worker                   memset(&src0, 0, sizeof(src0));
1350*d83cc019SAndroid Build Coastguard Worker                   src0.reg.address_mode = BRW_ADDRESS_DIRECT;
1351*d83cc019SAndroid Build Coastguard Worker 
1352*d83cc019SAndroid Build Coastguard Worker                   if (IS_GENp(7)) {
1353*d83cc019SAndroid Build Coastguard Worker                       src0.reg.file = BRW_GENERAL_REGISTER_FILE;
1354*d83cc019SAndroid Build Coastguard Worker                       src0.reg.type = BRW_REGISTER_TYPE_UB;
1355*d83cc019SAndroid Build Coastguard Worker                   } else {
1356*d83cc019SAndroid Build Coastguard Worker                       src0.reg.file = BRW_MESSAGE_REGISTER_FILE;
1357*d83cc019SAndroid Build Coastguard Worker                       src0.reg.type = BRW_REGISTER_TYPE_D;
1358*d83cc019SAndroid Build Coastguard Worker                   }
1359*d83cc019SAndroid Build Coastguard Worker 
1360*d83cc019SAndroid Build Coastguard Worker                   src0.reg.nr = $5.nr;
1361*d83cc019SAndroid Build Coastguard Worker                   src0.reg.subnr = 0;
1362*d83cc019SAndroid Build Coastguard Worker                   set_instruction_src0(&$$, &src0, NULL);
1363*d83cc019SAndroid Build Coastguard Worker 
1364*d83cc019SAndroid Build Coastguard Worker                   set_instruction_src1(&$$, &$7, &@7);
1365*d83cc019SAndroid Build Coastguard Worker 
1366*d83cc019SAndroid Build Coastguard Worker                   if (IS_GENp(8)) {
1367*d83cc019SAndroid Build Coastguard Worker                       gen8_set_sfid(GEN8(&$$), $6 & EX_DESC_SFID_MASK);
1368*d83cc019SAndroid Build Coastguard Worker                       gen8_set_eot(GEN8(&$$), !!($6 & EX_DESC_EOT_MASK));
1369*d83cc019SAndroid Build Coastguard Worker                       gen9_set_send_extdesc(GEN8(&$$), $6 & EX_DESC_FUNC_MASK);
1370*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENp(8)) {
1371*d83cc019SAndroid Build Coastguard Worker                       gen8_set_sfid(GEN8(&$$), $6 & EX_DESC_SFID_MASK);
1372*d83cc019SAndroid Build Coastguard Worker                       gen8_set_eot(GEN8(&$$), !!($6 & EX_DESC_EOT_MASK));
1373*d83cc019SAndroid Build Coastguard Worker 		  } else {
1374*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->header.destreg__conditionalmod = ($6 & EX_DESC_SFID_MASK); /* SFID */
1375*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.end_of_thread = !!($6 & EX_DESC_EOT_MASK);
1376*d83cc019SAndroid Build Coastguard Worker                   }
1377*d83cc019SAndroid Build Coastguard Worker 		}
1378*d83cc019SAndroid Build Coastguard Worker 		| predicate sendop execsize dst sendleadreg payload sndopr imm32reg instoptions
1379*d83cc019SAndroid Build Coastguard Worker 		{
1380*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(6))
1381*d83cc019SAndroid Build Coastguard Worker                       error(&@2, "invalid syntax for send on gen6+\n");
1382*d83cc019SAndroid Build Coastguard Worker 
1383*d83cc019SAndroid Build Coastguard Worker 		  if ($8.reg.type != BRW_REGISTER_TYPE_UD &&
1384*d83cc019SAndroid Build Coastguard Worker 		      $8.reg.type != BRW_REGISTER_TYPE_D &&
1385*d83cc019SAndroid Build Coastguard Worker 		      $8.reg.type != BRW_REGISTER_TYPE_V) {
1386*d83cc019SAndroid Build Coastguard Worker 		    error(&@8, "non-int D/UD/V representation: %d,"
1387*d83cc019SAndroid Build Coastguard Worker 			  "type=%d\n", $8.reg.dw1.ud, $8.reg.type);
1388*d83cc019SAndroid Build Coastguard Worker 		  }
1389*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1390*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1391*d83cc019SAndroid Build Coastguard Worker 		  GEN(&$$)->header.destreg__conditionalmod = $5.nr; /* msg reg index */
1392*d83cc019SAndroid Build Coastguard Worker 
1393*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
1394*d83cc019SAndroid Build Coastguard Worker 		  $4.width = $3;
1395*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_dest(&$$, &$4) != 0)
1396*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1397*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src0(&$$, &$6, &@6) != 0)
1398*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1399*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src1(&$$, &$8, &@8) != 0)
1400*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1401*d83cc019SAndroid Build Coastguard Worker 
1402*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENx(5)) {
1403*d83cc019SAndroid Build Coastguard Worker 		      GEN(&$$)->bits2.send_gen5.sfid = ($7 & EX_DESC_SFID_MASK);
1404*d83cc019SAndroid Build Coastguard Worker 		      GEN(&$$)->bits3.generic_gen5.end_of_thread = !!($7 & EX_DESC_EOT_MASK);
1405*d83cc019SAndroid Build Coastguard Worker 		  }
1406*d83cc019SAndroid Build Coastguard Worker 		}
1407*d83cc019SAndroid Build Coastguard Worker 		| predicate sendop execsize dst sendleadreg payload exp directsrcoperand instoptions
1408*d83cc019SAndroid Build Coastguard Worker 		{
1409*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(6))
1410*d83cc019SAndroid Build Coastguard Worker                       error(&@2, "invalid syntax for send on gen6+\n");
1411*d83cc019SAndroid Build Coastguard Worker 
1412*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1413*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1414*d83cc019SAndroid Build Coastguard Worker 		  GEN(&$$)->header.destreg__conditionalmod = $5.nr; /* msg reg index */
1415*d83cc019SAndroid Build Coastguard Worker 
1416*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
1417*d83cc019SAndroid Build Coastguard Worker 
1418*d83cc019SAndroid Build Coastguard Worker 		  $4.width = $3;
1419*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_dest(&$$, &$4) != 0)
1420*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1421*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src0(&$$, &$6, &@6) != 0)
1422*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1423*d83cc019SAndroid Build Coastguard Worker 		  /* XXX is this correct? */
1424*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src1(&$$, &$8, &@8) != 0)
1425*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1426*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENx(5)) {
1427*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid = $7;
1428*d83cc019SAndroid Build Coastguard Worker 		  }
1429*d83cc019SAndroid Build Coastguard Worker 		}
1430*d83cc019SAndroid Build Coastguard Worker 
1431*d83cc019SAndroid Build Coastguard Worker ;
1432*d83cc019SAndroid Build Coastguard Worker 
1433*d83cc019SAndroid Build Coastguard Worker sndopr: exp %prec SNDOPR
1434*d83cc019SAndroid Build Coastguard Worker 		{
1435*d83cc019SAndroid Build Coastguard Worker 			$$ = $1;
1436*d83cc019SAndroid Build Coastguard Worker 		}
1437*d83cc019SAndroid Build Coastguard Worker ;
1438*d83cc019SAndroid Build Coastguard Worker 
1439*d83cc019SAndroid Build Coastguard Worker jumpinstruction: predicate JMPI execsize relativelocation2
1440*d83cc019SAndroid Build Coastguard Worker 		{
1441*d83cc019SAndroid Build Coastguard Worker 		  /* The jump instruction requires that the IP register
1442*d83cc019SAndroid Build Coastguard Worker 		   * be the destination and first source operand, while the
1443*d83cc019SAndroid Build Coastguard Worker 		   * offset is the second source operand.  The next instruction
1444*d83cc019SAndroid Build Coastguard Worker 		   * is the post-incremented IP plus the offset.
1445*d83cc019SAndroid Build Coastguard Worker 		   */
1446*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1447*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1448*d83cc019SAndroid Build Coastguard Worker 		  if(advanced_flag) {
1449*d83cc019SAndroid Build Coastguard Worker                       if (IS_GENp(8))
1450*d83cc019SAndroid Build Coastguard Worker                           gen8_set_mask_control(GEN8(&$$), BRW_MASK_DISABLE);
1451*d83cc019SAndroid Build Coastguard Worker                       else
1452*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->header.mask_control = BRW_MASK_DISABLE;
1453*d83cc019SAndroid Build Coastguard Worker 		  }
1454*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
1455*d83cc019SAndroid Build Coastguard Worker 		  ip_dst.width = BRW_WIDTH_1;
1456*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_dest(&$$, &ip_dst);
1457*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_src0(&$$, &ip_src, NULL);
1458*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_src1(&$$, &$4, NULL);
1459*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_target = $4.reloc_target;
1460*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_offset = $4.imm32;
1461*d83cc019SAndroid Build Coastguard Worker 		}
1462*d83cc019SAndroid Build Coastguard Worker ;
1463*d83cc019SAndroid Build Coastguard Worker 
1464*d83cc019SAndroid Build Coastguard Worker mathinstruction: predicate MATH_INST execsize dst src srcimm math_function instoptions
1465*d83cc019SAndroid Build Coastguard Worker 		{
1466*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1467*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1468*d83cc019SAndroid Build Coastguard Worker 
1469*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(8))
1470*d83cc019SAndroid Build Coastguard Worker                       gen8_set_math_function(GEN8(&$$), $7);
1471*d83cc019SAndroid Build Coastguard Worker 		  else
1472*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->header.destreg__conditionalmod = $7;
1473*d83cc019SAndroid Build Coastguard Worker 
1474*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_options(&$$, $8);
1475*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
1476*d83cc019SAndroid Build Coastguard Worker 		  $4.width = $3;
1477*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_dest(&$$, &$4) != 0)
1478*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1479*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src0(&$$, &$5, &@5) != 0)
1480*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1481*d83cc019SAndroid Build Coastguard Worker 		  if (set_instruction_src1(&$$, &$6, &@6) != 0)
1482*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
1483*d83cc019SAndroid Build Coastguard Worker 		}
1484*d83cc019SAndroid Build Coastguard Worker ;
1485*d83cc019SAndroid Build Coastguard Worker 
1486*d83cc019SAndroid Build Coastguard Worker breakinstruction: predicate breakop execsize relativelocation relativelocation instoptions
1487*d83cc019SAndroid Build Coastguard Worker 		{
1488*d83cc019SAndroid Build Coastguard Worker 		  // for Gen6, Gen7
1489*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1490*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_predicate(&$$, &$1);
1491*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1492*d83cc019SAndroid Build Coastguard Worker 		  set_execsize(&$$, $3);
1493*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_target = $4.reloc_target;
1494*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.first_reloc_offset = $4.imm32;
1495*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.second_reloc_target = $5.reloc_target;
1496*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc.second_reloc_offset = $5.imm32;
1497*d83cc019SAndroid Build Coastguard Worker 		}
1498*d83cc019SAndroid Build Coastguard Worker ;
1499*d83cc019SAndroid Build Coastguard Worker 
1500*d83cc019SAndroid Build Coastguard Worker breakop:	BREAK | CONT
1501*d83cc019SAndroid Build Coastguard Worker ;
1502*d83cc019SAndroid Build Coastguard Worker 
1503*d83cc019SAndroid Build Coastguard Worker /*
1504*d83cc019SAndroid Build Coastguard Worker maskpushop:	MSAVE | PUSH
1505*d83cc019SAndroid Build Coastguard Worker ;
1506*d83cc019SAndroid Build Coastguard Worker  */
1507*d83cc019SAndroid Build Coastguard Worker 
1508*d83cc019SAndroid Build Coastguard Worker syncinstruction: predicate WAIT notifyreg
1509*d83cc019SAndroid Build Coastguard Worker 		{
1510*d83cc019SAndroid Build Coastguard Worker 		  struct brw_reg notify_dst;
1511*d83cc019SAndroid Build Coastguard Worker 		  struct src_operand notify_src;
1512*d83cc019SAndroid Build Coastguard Worker 
1513*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1514*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $2);
1515*d83cc019SAndroid Build Coastguard Worker 		  set_direct_dst_operand(&notify_dst, &$3, BRW_REGISTER_TYPE_D);
1516*d83cc019SAndroid Build Coastguard Worker 		  notify_dst.width = BRW_WIDTH_1;
1517*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_dest(&$$, &notify_dst);
1518*d83cc019SAndroid Build Coastguard Worker 		  set_direct_src_operand(&notify_src, &$3, BRW_REGISTER_TYPE_D);
1519*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_src0(&$$, &notify_src, NULL);
1520*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_src1(&$$, &src_null_reg, NULL);
1521*d83cc019SAndroid Build Coastguard Worker 		}
1522*d83cc019SAndroid Build Coastguard Worker 
1523*d83cc019SAndroid Build Coastguard Worker ;
1524*d83cc019SAndroid Build Coastguard Worker 
1525*d83cc019SAndroid Build Coastguard Worker nopinstruction: NOP
1526*d83cc019SAndroid Build Coastguard Worker 		{
1527*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
1528*d83cc019SAndroid Build Coastguard Worker 		  set_instruction_opcode(&$$, $1);
1529*d83cc019SAndroid Build Coastguard Worker 		};
1530*d83cc019SAndroid Build Coastguard Worker 
1531*d83cc019SAndroid Build Coastguard Worker /* XXX! */
1532*d83cc019SAndroid Build Coastguard Worker payload: directsrcoperand
1533*d83cc019SAndroid Build Coastguard Worker ;
1534*d83cc019SAndroid Build Coastguard Worker 
1535*d83cc019SAndroid Build Coastguard Worker post_dst:	dst
1536*d83cc019SAndroid Build Coastguard Worker ;
1537*d83cc019SAndroid Build Coastguard Worker 
1538*d83cc019SAndroid Build Coastguard Worker msgtarget:	NULL_TOKEN
1539*d83cc019SAndroid Build Coastguard Worker 		{
1540*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(8)) {
1541*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_sfid(GEN8(&$$), BRW_SFID_NULL);
1542*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_header_present(GEN8(&$$), 0);
1543*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENp(5)) {
1544*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid= BRW_SFID_NULL;
1545*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = 0;  /* ??? */
1546*d83cc019SAndroid Build Coastguard Worker 		  } else {
1547*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic.msg_target = BRW_SFID_NULL;
1548*d83cc019SAndroid Build Coastguard Worker 		  }
1549*d83cc019SAndroid Build Coastguard Worker 		}
1550*d83cc019SAndroid Build Coastguard Worker 		| SAMPLER LPAREN INTEGER COMMA INTEGER COMMA
1551*d83cc019SAndroid Build Coastguard Worker 		sampler_datatype RPAREN
1552*d83cc019SAndroid Build Coastguard Worker 		{
1553*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(8)) {
1554*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_sfid(GEN8(&$$), BRW_SFID_SAMPLER);
1555*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_header_present(GEN8(&$$), 1); /* ??? */
1556*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_binding_table_index(GEN8(&$$), $3);
1557*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_sampler(GEN8(&$$), $5);
1558*d83cc019SAndroid Build Coastguard Worker 		      gen8_set_sampler_simd_mode(GEN8(&$$), 2); /* SIMD16 */
1559*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENp(7)) {
1560*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid = BRW_SFID_SAMPLER;
1561*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = 1;   /* ??? */
1562*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.sampler_gen7.binding_table_index = $3;
1563*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.sampler_gen7.sampler = $5;
1564*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.sampler_gen7.simd_mode = 2; /* SIMD16, maybe we should add a new parameter */
1565*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENp(5)) {
1566*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid = BRW_SFID_SAMPLER;
1567*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = 1;   /* ??? */
1568*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.sampler_gen5.binding_table_index = $3;
1569*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.sampler_gen5.sampler = $5;
1570*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.sampler_gen5.simd_mode = 2; /* SIMD16, maybe we should add a new parameter */
1571*d83cc019SAndroid Build Coastguard Worker 		  } else {
1572*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic.msg_target = BRW_SFID_SAMPLER;
1573*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.sampler.binding_table_index = $3;
1574*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.sampler.sampler = $5;
1575*d83cc019SAndroid Build Coastguard Worker                       switch ($7) {
1576*d83cc019SAndroid Build Coastguard Worker                       case TYPE_F:
1577*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.sampler.return_format =
1578*d83cc019SAndroid Build Coastguard Worker                               BRW_SAMPLER_RETURN_FORMAT_FLOAT32;
1579*d83cc019SAndroid Build Coastguard Worker                           break;
1580*d83cc019SAndroid Build Coastguard Worker                       case TYPE_UD:
1581*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.sampler.return_format =
1582*d83cc019SAndroid Build Coastguard Worker                               BRW_SAMPLER_RETURN_FORMAT_UINT32;
1583*d83cc019SAndroid Build Coastguard Worker                           break;
1584*d83cc019SAndroid Build Coastguard Worker                       case TYPE_D:
1585*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.sampler.return_format =
1586*d83cc019SAndroid Build Coastguard Worker                               BRW_SAMPLER_RETURN_FORMAT_SINT32;
1587*d83cc019SAndroid Build Coastguard Worker                           break;
1588*d83cc019SAndroid Build Coastguard Worker                       }
1589*d83cc019SAndroid Build Coastguard Worker 		  }
1590*d83cc019SAndroid Build Coastguard Worker 		}
1591*d83cc019SAndroid Build Coastguard Worker 		| MATH math_function saturate math_signed math_scalar
1592*d83cc019SAndroid Build Coastguard Worker 		{
1593*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(6)) {
1594*d83cc019SAndroid Build Coastguard Worker                       error (&@1, "Gen6+ doesn't have math function\n");
1595*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENx(5)) {
1596*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid = BRW_SFID_MATH;
1597*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = 0;
1598*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.math_gen5.function = $2;
1599*d83cc019SAndroid Build Coastguard Worker 		      set_instruction_saturate(&$$, $3);
1600*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.math_gen5.int_type = $4;
1601*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.math_gen5.precision = BRW_MATH_PRECISION_FULL;
1602*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.math_gen5.data_type = $5;
1603*d83cc019SAndroid Build Coastguard Worker 		  } else {
1604*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic.msg_target = BRW_SFID_MATH;
1605*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.math.function = $2;
1606*d83cc019SAndroid Build Coastguard Worker 		      set_instruction_saturate(&$$, $3);
1607*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.math.int_type = $4;
1608*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.math.precision = BRW_MATH_PRECISION_FULL;
1609*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.math.data_type = $5;
1610*d83cc019SAndroid Build Coastguard Worker 		  }
1611*d83cc019SAndroid Build Coastguard Worker 		}
1612*d83cc019SAndroid Build Coastguard Worker 		| GATEWAY
1613*d83cc019SAndroid Build Coastguard Worker 		{
1614*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(5)) {
1615*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid = BRW_SFID_MESSAGE_GATEWAY;
1616*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = 0;  /* ??? */
1617*d83cc019SAndroid Build Coastguard Worker 		  } else {
1618*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic.msg_target = BRW_SFID_MESSAGE_GATEWAY;
1619*d83cc019SAndroid Build Coastguard Worker 		  }
1620*d83cc019SAndroid Build Coastguard Worker 		}
1621*d83cc019SAndroid Build Coastguard Worker 		| READ  LPAREN INTEGER COMMA INTEGER COMMA INTEGER COMMA
1622*d83cc019SAndroid Build Coastguard Worker                 INTEGER RPAREN
1623*d83cc019SAndroid Build Coastguard Worker 		{
1624*d83cc019SAndroid Build Coastguard Worker                   if (IS_GENp(9)) {
1625*d83cc019SAndroid Build Coastguard Worker                       if ($5 != 0 &&
1626*d83cc019SAndroid Build Coastguard Worker 			  $5 != GEN6_SFID_DATAPORT_RENDER_CACHE &&
1627*d83cc019SAndroid Build Coastguard Worker 			  $5 != GEN7_SFID_DATAPORT_DATA_CACHE &&
1628*d83cc019SAndroid Build Coastguard Worker 			  $5 != HSW_SFID_DATAPORT_DATA_CACHE1 &&
1629*d83cc019SAndroid Build Coastguard Worker 			  $5 != SKL_SFID_DATAPORT_DCR0 &&
1630*d83cc019SAndroid Build Coastguard Worker 			  $5 != SKL_SFID_DATAPORT_DATA_CACHE2) {
1631*d83cc019SAndroid Build Coastguard Worker 			  error (&@9, "error: wrong cache type\n");
1632*d83cc019SAndroid Build Coastguard Worker 		      }
1633*d83cc019SAndroid Build Coastguard Worker 
1634*d83cc019SAndroid Build Coastguard Worker 		      if ($5 == 0)
1635*d83cc019SAndroid Build Coastguard Worker 			  gen8_set_sfid(GEN8(&$$), HSW_SFID_DATAPORT_DATA_CACHE1);
1636*d83cc019SAndroid Build Coastguard Worker 		      else
1637*d83cc019SAndroid Build Coastguard Worker 			  gen8_set_sfid(GEN8(&$$), $5);
1638*d83cc019SAndroid Build Coastguard Worker 
1639*d83cc019SAndroid Build Coastguard Worker                       gen8_set_header_present(GEN8(&$$), 1);
1640*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_binding_table_index(GEN8(&$$), $3);
1641*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_message_control(GEN8(&$$), $7);
1642*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_message_type(GEN8(&$$), $9);
1643*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_category(GEN8(&$$), 0);
1644*d83cc019SAndroid Build Coastguard Worker                   } else if (IS_GENp(8)) {
1645*d83cc019SAndroid Build Coastguard Worker                       gen8_set_sfid(GEN8(&$$), GEN6_SFID_DATAPORT_SAMPLER_CACHE);
1646*d83cc019SAndroid Build Coastguard Worker                       gen8_set_header_present(GEN8(&$$), 1);
1647*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_binding_table_index(GEN8(&$$), $3);
1648*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_message_control(GEN8(&$$), $7);
1649*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_message_type(GEN8(&$$), $9);
1650*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_category(GEN8(&$$), 0);
1651*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENx(7)) {
1652*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid =
1653*d83cc019SAndroid Build Coastguard Worker                           GEN6_SFID_DATAPORT_SAMPLER_CACHE;
1654*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = 1;
1655*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen7_dp.binding_table_index = $3;
1656*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen7_dp.msg_control = $7;
1657*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen7_dp.msg_type = $9;
1658*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENx(6)) {
1659*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid =
1660*d83cc019SAndroid Build Coastguard Worker                           GEN6_SFID_DATAPORT_SAMPLER_CACHE;
1661*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = 1;
1662*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen6_dp_sampler_const_cache.binding_table_index = $3;
1663*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen6_dp_sampler_const_cache.msg_control = $7;
1664*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen6_dp_sampler_const_cache.msg_type = $9;
1665*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENx(5)) {
1666*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid =
1667*d83cc019SAndroid Build Coastguard Worker                           BRW_SFID_DATAPORT_READ;
1668*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = 1;
1669*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_read_gen5.binding_table_index = $3;
1670*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_read_gen5.target_cache = $5;
1671*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_read_gen5.msg_control = $7;
1672*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_read_gen5.msg_type = $9;
1673*d83cc019SAndroid Build Coastguard Worker 		  } else {
1674*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic.msg_target =
1675*d83cc019SAndroid Build Coastguard Worker                           BRW_SFID_DATAPORT_READ;
1676*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_read.binding_table_index = $3;
1677*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_read.target_cache = $5;
1678*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_read.msg_control = $7;
1679*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_read.msg_type = $9;
1680*d83cc019SAndroid Build Coastguard Worker 		  }
1681*d83cc019SAndroid Build Coastguard Worker 		}
1682*d83cc019SAndroid Build Coastguard Worker 		| WRITE LPAREN INTEGER COMMA INTEGER COMMA INTEGER COMMA
1683*d83cc019SAndroid Build Coastguard Worker 		INTEGER RPAREN
1684*d83cc019SAndroid Build Coastguard Worker 		{
1685*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(8)) {
1686*d83cc019SAndroid Build Coastguard Worker                       if (IS_GENp(9)) {
1687*d83cc019SAndroid Build Coastguard Worker                           if ($9 != 0 &&
1688*d83cc019SAndroid Build Coastguard Worker 			      $9 != GEN6_SFID_DATAPORT_RENDER_CACHE &&
1689*d83cc019SAndroid Build Coastguard Worker 			      $9 != GEN7_SFID_DATAPORT_DATA_CACHE &&
1690*d83cc019SAndroid Build Coastguard Worker 			      $9 != HSW_SFID_DATAPORT_DATA_CACHE1 &&
1691*d83cc019SAndroid Build Coastguard Worker 			      $9 != SKL_SFID_DATAPORT_DATA_CACHE2) {
1692*d83cc019SAndroid Build Coastguard Worker 			      error (&@9, "error: wrong cache type\n");
1693*d83cc019SAndroid Build Coastguard Worker                           }
1694*d83cc019SAndroid Build Coastguard Worker                       } else {
1695*d83cc019SAndroid Build Coastguard Worker                           if ($9 != 0 &&
1696*d83cc019SAndroid Build Coastguard Worker 			      $9 != GEN6_SFID_DATAPORT_RENDER_CACHE &&
1697*d83cc019SAndroid Build Coastguard Worker 			      $9 != GEN7_SFID_DATAPORT_DATA_CACHE &&
1698*d83cc019SAndroid Build Coastguard Worker 			      $9 != HSW_SFID_DATAPORT_DATA_CACHE1) {
1699*d83cc019SAndroid Build Coastguard Worker 			      error (&@9, "error: wrong cache type\n");
1700*d83cc019SAndroid Build Coastguard Worker                           }
1701*d83cc019SAndroid Build Coastguard Worker 		      }
1702*d83cc019SAndroid Build Coastguard Worker 
1703*d83cc019SAndroid Build Coastguard Worker 		      if ($9 == 0)
1704*d83cc019SAndroid Build Coastguard Worker 			  gen8_set_sfid(GEN8(&$$), GEN6_SFID_DATAPORT_RENDER_CACHE);
1705*d83cc019SAndroid Build Coastguard Worker 		      else
1706*d83cc019SAndroid Build Coastguard Worker 			  gen8_set_sfid(GEN8(&$$), $9);
1707*d83cc019SAndroid Build Coastguard Worker 
1708*d83cc019SAndroid Build Coastguard Worker                       gen8_set_header_present(GEN8(&$$), 1);
1709*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_binding_table_index(GEN8(&$$), $3);
1710*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_message_control(GEN8(&$$), $5);
1711*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_message_type(GEN8(&$$), $7);
1712*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_category(GEN8(&$$), 0);
1713*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENx(7)) {
1714*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid = GEN6_SFID_DATAPORT_RENDER_CACHE;
1715*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = 1;
1716*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen7_dp.binding_table_index = $3;
1717*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen7_dp.msg_control = $5;
1718*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen7_dp.msg_type = $7;
1719*d83cc019SAndroid Build Coastguard Worker                   } else if (IS_GENx(6)) {
1720*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid = GEN6_SFID_DATAPORT_RENDER_CACHE;
1721*d83cc019SAndroid Build Coastguard Worker                       /* Sandybridge supports headerlesss message for render target write.
1722*d83cc019SAndroid Build Coastguard Worker                        * Currently the GFX assembler doesn't support it. so the program must provide
1723*d83cc019SAndroid Build Coastguard Worker                        * message header
1724*d83cc019SAndroid Build Coastguard Worker                        */
1725*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = 1;
1726*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen6_dp.binding_table_index = $3;
1727*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen6_dp.msg_control = $5;
1728*d83cc019SAndroid Build Coastguard Worker                      GEN(&$$)->bits3.gen6_dp.msg_type = $7;
1729*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen6_dp.send_commit_msg = $9;
1730*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENx(5)) {
1731*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid =
1732*d83cc019SAndroid Build Coastguard Worker                           BRW_SFID_DATAPORT_WRITE;
1733*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = 1;
1734*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write_gen5.binding_table_index = $3;
1735*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write_gen5.last_render_target = ($5 & 0x8) >> 3;
1736*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write_gen5.msg_control = $5 & 0x7;
1737*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write_gen5.msg_type = $7;
1738*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write_gen5.send_commit_msg = $9;
1739*d83cc019SAndroid Build Coastguard Worker 		  } else {
1740*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic.msg_target =
1741*d83cc019SAndroid Build Coastguard Worker                           BRW_SFID_DATAPORT_WRITE;
1742*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write.binding_table_index = $3;
1743*d83cc019SAndroid Build Coastguard Worker                       /* The msg control field of brw_struct.h is split into
1744*d83cc019SAndroid Build Coastguard Worker                        * msg control and last_render_target, even though
1745*d83cc019SAndroid Build Coastguard Worker                        * last_render_target isn't common to all write messages.
1746*d83cc019SAndroid Build Coastguard Worker                        */
1747*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write.last_render_target = ($5 & 0x8) >> 3;
1748*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write.msg_control = $5 & 0x7;
1749*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write.msg_type = $7;
1750*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write.send_commit_msg = $9;
1751*d83cc019SAndroid Build Coastguard Worker 		  }
1752*d83cc019SAndroid Build Coastguard Worker 		}
1753*d83cc019SAndroid Build Coastguard Worker 		| WRITE LPAREN INTEGER COMMA INTEGER COMMA INTEGER COMMA
1754*d83cc019SAndroid Build Coastguard Worker 		INTEGER COMMA INTEGER RPAREN
1755*d83cc019SAndroid Build Coastguard Worker 		{
1756*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(8)) {
1757*d83cc019SAndroid Build Coastguard Worker                       if (IS_GENp(9)) {
1758*d83cc019SAndroid Build Coastguard Worker                           if ($9 != 0 &&
1759*d83cc019SAndroid Build Coastguard Worker 			      $9 != GEN6_SFID_DATAPORT_RENDER_CACHE &&
1760*d83cc019SAndroid Build Coastguard Worker 			      $9 != GEN7_SFID_DATAPORT_DATA_CACHE &&
1761*d83cc019SAndroid Build Coastguard Worker 			      $9 != HSW_SFID_DATAPORT_DATA_CACHE1 &&
1762*d83cc019SAndroid Build Coastguard Worker 			      $9 != SKL_SFID_DATAPORT_DATA_CACHE2) {
1763*d83cc019SAndroid Build Coastguard Worker 			      error (&@9, "error: wrong cache type\n");
1764*d83cc019SAndroid Build Coastguard Worker                           }
1765*d83cc019SAndroid Build Coastguard Worker                       } else {
1766*d83cc019SAndroid Build Coastguard Worker                           if ($9 != 0 &&
1767*d83cc019SAndroid Build Coastguard Worker 			      $9 != GEN6_SFID_DATAPORT_RENDER_CACHE &&
1768*d83cc019SAndroid Build Coastguard Worker 			      $9 != GEN7_SFID_DATAPORT_DATA_CACHE &&
1769*d83cc019SAndroid Build Coastguard Worker 			      $9 != HSW_SFID_DATAPORT_DATA_CACHE1) {
1770*d83cc019SAndroid Build Coastguard Worker 			      error (&@9, "error: wrong cache type\n");
1771*d83cc019SAndroid Build Coastguard Worker                           }
1772*d83cc019SAndroid Build Coastguard Worker 		      }
1773*d83cc019SAndroid Build Coastguard Worker 
1774*d83cc019SAndroid Build Coastguard Worker 		      if ($9 == 0)
1775*d83cc019SAndroid Build Coastguard Worker 			  gen8_set_sfid(GEN8(&$$), GEN6_SFID_DATAPORT_RENDER_CACHE);
1776*d83cc019SAndroid Build Coastguard Worker 		      else
1777*d83cc019SAndroid Build Coastguard Worker 			  gen8_set_sfid(GEN8(&$$), $9);
1778*d83cc019SAndroid Build Coastguard Worker 
1779*d83cc019SAndroid Build Coastguard Worker                       gen8_set_header_present(GEN8(&$$), ($11 != 0));
1780*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_binding_table_index(GEN8(&$$), $3);
1781*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_message_control(GEN8(&$$), $5);
1782*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_message_type(GEN8(&$$), $7);
1783*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_category(GEN8(&$$), 0);
1784*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENx(7)) {
1785*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid = GEN6_SFID_DATAPORT_RENDER_CACHE;
1786*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = ($11 != 0);
1787*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen7_dp.binding_table_index = $3;
1788*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen7_dp.msg_control = $5;
1789*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen7_dp.msg_type = $7;
1790*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENx(6)) {
1791*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid = GEN6_SFID_DATAPORT_RENDER_CACHE;
1792*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = ($11 != 0);
1793*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen6_dp.binding_table_index = $3;
1794*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen6_dp.msg_control = $5;
1795*d83cc019SAndroid Build Coastguard Worker                      GEN(&$$)->bits3.gen6_dp.msg_type = $7;
1796*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.gen6_dp.send_commit_msg = $9;
1797*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENx(5)) {
1798*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid =
1799*d83cc019SAndroid Build Coastguard Worker                           BRW_SFID_DATAPORT_WRITE;
1800*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = ($11 != 0);
1801*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write_gen5.binding_table_index = $3;
1802*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write_gen5.last_render_target = ($5 & 0x8) >> 3;
1803*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write_gen5.msg_control = $5 & 0x7;
1804*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write_gen5.msg_type = $7;
1805*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write_gen5.send_commit_msg = $9;
1806*d83cc019SAndroid Build Coastguard Worker 		  } else {
1807*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic.msg_target =
1808*d83cc019SAndroid Build Coastguard Worker                           BRW_SFID_DATAPORT_WRITE;
1809*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write.binding_table_index = $3;
1810*d83cc019SAndroid Build Coastguard Worker                       /* The msg control field of brw_struct.h is split into
1811*d83cc019SAndroid Build Coastguard Worker                        * msg control and last_render_target, even though
1812*d83cc019SAndroid Build Coastguard Worker                        * last_render_target isn't common to all write messages.
1813*d83cc019SAndroid Build Coastguard Worker                        */
1814*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write.last_render_target = ($5 & 0x8) >> 3;
1815*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write.msg_control = $5 & 0x7;
1816*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write.msg_type = $7;
1817*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.dp_write.send_commit_msg = $9;
1818*d83cc019SAndroid Build Coastguard Worker 		  }
1819*d83cc019SAndroid Build Coastguard Worker 		}
1820*d83cc019SAndroid Build Coastguard Worker 		| URB INTEGER urb_swizzle urb_allocate urb_used urb_complete
1821*d83cc019SAndroid Build Coastguard Worker 		{
1822*d83cc019SAndroid Build Coastguard Worker 		  GEN(&$$)->bits3.generic.msg_target = BRW_SFID_URB;
1823*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(5)) {
1824*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid = BRW_SFID_URB;
1825*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = 1;
1826*d83cc019SAndroid Build Coastguard Worker 		      set_instruction_opcode(&$$, BRW_URB_OPCODE_WRITE);
1827*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.urb_gen5.offset = $2;
1828*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.urb_gen5.swizzle_control = $3;
1829*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.urb_gen5.pad = 0;
1830*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.urb_gen5.allocate = $4;
1831*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.urb_gen5.used = $5;
1832*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.urb_gen5.complete = $6;
1833*d83cc019SAndroid Build Coastguard Worker 		  } else {
1834*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic.msg_target = BRW_SFID_URB;
1835*d83cc019SAndroid Build Coastguard Worker 		      set_instruction_opcode(&$$, BRW_URB_OPCODE_WRITE);
1836*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.urb.offset = $2;
1837*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.urb.swizzle_control = $3;
1838*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.urb.pad = 0;
1839*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.urb.allocate = $4;
1840*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.urb.used = $5;
1841*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.urb.complete = $6;
1842*d83cc019SAndroid Build Coastguard Worker 		  }
1843*d83cc019SAndroid Build Coastguard Worker 		}
1844*d83cc019SAndroid Build Coastguard Worker 		| THREAD_SPAWNER  LPAREN INTEGER COMMA INTEGER COMMA
1845*d83cc019SAndroid Build Coastguard Worker                         INTEGER RPAREN
1846*d83cc019SAndroid Build Coastguard Worker 		{
1847*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(8)) {
1848*d83cc019SAndroid Build Coastguard Worker                       gen8_set_sfid(GEN8(&$$), BRW_SFID_THREAD_SPAWNER);
1849*d83cc019SAndroid Build Coastguard Worker                       gen8_set_header_present(GEN8(&$$), 0); /* Must be 0 */
1850*d83cc019SAndroid Build Coastguard Worker                       gen8_set_ts_opcode(GEN8(&$$), $3);
1851*d83cc019SAndroid Build Coastguard Worker                       gen8_set_ts_request_type(GEN8(&$$), $5);
1852*d83cc019SAndroid Build Coastguard Worker                       gen8_set_ts_resource_select(GEN8(&$$), $7);
1853*d83cc019SAndroid Build Coastguard Worker 		  } else {
1854*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic.msg_target =
1855*d83cc019SAndroid Build Coastguard Worker                           BRW_SFID_THREAD_SPAWNER;
1856*d83cc019SAndroid Build Coastguard Worker                       if (IS_GENp(5)) {
1857*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits2.send_gen5.sfid =
1858*d83cc019SAndroid Build Coastguard Worker                               BRW_SFID_THREAD_SPAWNER;
1859*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.generic_gen5.header_present = 0;
1860*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.thread_spawner_gen5.opcode = $3;
1861*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.thread_spawner_gen5.requester_type  = $5;
1862*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.thread_spawner_gen5.resource_select = $7;
1863*d83cc019SAndroid Build Coastguard Worker                       } else {
1864*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.generic.msg_target =
1865*d83cc019SAndroid Build Coastguard Worker                               BRW_SFID_THREAD_SPAWNER;
1866*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.thread_spawner.opcode = $3;
1867*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.thread_spawner.requester_type  = $5;
1868*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.thread_spawner.resource_select = $7;
1869*d83cc019SAndroid Build Coastguard Worker                       }
1870*d83cc019SAndroid Build Coastguard Worker 		  }
1871*d83cc019SAndroid Build Coastguard Worker 		}
1872*d83cc019SAndroid Build Coastguard Worker 		| VME  LPAREN INTEGER COMMA INTEGER COMMA INTEGER COMMA INTEGER RPAREN
1873*d83cc019SAndroid Build Coastguard Worker 		{
1874*d83cc019SAndroid Build Coastguard Worker 		  GEN(&$$)->bits3.generic.msg_target = GEN6_SFID_VME;
1875*d83cc019SAndroid Build Coastguard Worker 
1876*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(8)) {
1877*d83cc019SAndroid Build Coastguard Worker                       gen8_set_sfid(GEN8(&$$), GEN6_SFID_VME);
1878*d83cc019SAndroid Build Coastguard Worker                       gen8_set_header_present(GEN8(&$$), 1); /* Must be 1 */
1879*d83cc019SAndroid Build Coastguard Worker                       gen8_set_vme_binding_table_index(GEN8(&$$), $3);
1880*d83cc019SAndroid Build Coastguard Worker                       gen8_set_vme_message_type(GEN8(&$$), $9);
1881*d83cc019SAndroid Build Coastguard Worker 		  } else if (IS_GENp(6)) {
1882*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid = GEN6_SFID_VME;
1883*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.vme_gen6.binding_table_index = $3;
1884*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.vme_gen6.search_path_index = $5;
1885*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.vme_gen6.lut_subindex = $7;
1886*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.vme_gen6.message_type = $9;
1887*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = 1;
1888*d83cc019SAndroid Build Coastguard Worker 		  } else {
1889*d83cc019SAndroid Build Coastguard Worker                       error (&@1, "Gen6- doesn't have vme function\n");
1890*d83cc019SAndroid Build Coastguard Worker 		  }
1891*d83cc019SAndroid Build Coastguard Worker 		}
1892*d83cc019SAndroid Build Coastguard Worker 		| CRE LPAREN INTEGER COMMA INTEGER RPAREN
1893*d83cc019SAndroid Build Coastguard Worker 		{
1894*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(8)) {
1895*d83cc019SAndroid Build Coastguard Worker                       gen8_set_sfid(GEN8(&$$), HSW_SFID_CRE);
1896*d83cc019SAndroid Build Coastguard Worker                       gen8_set_header_present(GEN8(&$$), 1); /* Must be 1 */
1897*d83cc019SAndroid Build Coastguard Worker                       gen8_set_cre_binding_table_index(GEN8(&$$), $3);
1898*d83cc019SAndroid Build Coastguard Worker                       gen8_set_cre_message_type(GEN8(&$$), $5);
1899*d83cc019SAndroid Build Coastguard Worker 		  } else {
1900*d83cc019SAndroid Build Coastguard Worker                       if (gen_level < 75)
1901*d83cc019SAndroid Build Coastguard Worker                           error (&@1, "Below Gen7.5 doesn't have CRE function\n");
1902*d83cc019SAndroid Build Coastguard Worker 
1903*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic.msg_target = HSW_SFID_CRE;
1904*d83cc019SAndroid Build Coastguard Worker 
1905*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid = HSW_SFID_CRE;
1906*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.cre_gen75.binding_table_index = $3;
1907*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.cre_gen75.message_type = $5;
1908*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = 1;
1909*d83cc019SAndroid Build Coastguard Worker 		  }
1910*d83cc019SAndroid Build Coastguard Worker 		}
1911*d83cc019SAndroid Build Coastguard Worker 
1912*d83cc019SAndroid Build Coastguard Worker 		| DATA_PORT LPAREN INTEGER COMMA INTEGER COMMA INTEGER COMMA
1913*d83cc019SAndroid Build Coastguard Worker                 INTEGER COMMA INTEGER COMMA INTEGER RPAREN
1914*d83cc019SAndroid Build Coastguard Worker 		{
1915*d83cc019SAndroid Build Coastguard Worker 		  if (IS_GENp(8)) {
1916*d83cc019SAndroid Build Coastguard Worker                       if ($3 != GEN6_SFID_DATAPORT_SAMPLER_CACHE &&
1917*d83cc019SAndroid Build Coastguard Worker                           $3 != GEN6_SFID_DATAPORT_RENDER_CACHE &&
1918*d83cc019SAndroid Build Coastguard Worker                           $3 != GEN6_SFID_DATAPORT_CONSTANT_CACHE &&
1919*d83cc019SAndroid Build Coastguard Worker                           $3 != GEN7_SFID_DATAPORT_DATA_CACHE &&
1920*d83cc019SAndroid Build Coastguard Worker                           $3 != HSW_SFID_DATAPORT_DATA_CACHE1) {
1921*d83cc019SAndroid Build Coastguard Worker                           error (&@3, "error: wrong cache type\n");
1922*d83cc019SAndroid Build Coastguard Worker                       }
1923*d83cc019SAndroid Build Coastguard Worker 
1924*d83cc019SAndroid Build Coastguard Worker                       gen8_set_sfid(GEN8(&$$), $3);
1925*d83cc019SAndroid Build Coastguard Worker                       gen8_set_header_present(GEN8(&$$), ($13 != 0));
1926*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_binding_table_index(GEN8(&$$), $9);
1927*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_message_control(GEN8(&$$), $7);
1928*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_message_type(GEN8(&$$), $5);
1929*d83cc019SAndroid Build Coastguard Worker                       gen8_set_dp_category(GEN8(&$$), $11);
1930*d83cc019SAndroid Build Coastguard Worker 		  } else {
1931*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits2.send_gen5.sfid = $3;
1932*d83cc019SAndroid Build Coastguard Worker                       GEN(&$$)->bits3.generic_gen5.header_present = ($13 != 0);
1933*d83cc019SAndroid Build Coastguard Worker 
1934*d83cc019SAndroid Build Coastguard Worker                       if (IS_GENp(7)) {
1935*d83cc019SAndroid Build Coastguard Worker                           if ($3 != GEN6_SFID_DATAPORT_SAMPLER_CACHE &&
1936*d83cc019SAndroid Build Coastguard Worker                               $3 != GEN6_SFID_DATAPORT_RENDER_CACHE &&
1937*d83cc019SAndroid Build Coastguard Worker                               $3 != GEN6_SFID_DATAPORT_CONSTANT_CACHE &&
1938*d83cc019SAndroid Build Coastguard Worker                               $3 != GEN7_SFID_DATAPORT_DATA_CACHE) {
1939*d83cc019SAndroid Build Coastguard Worker                               error (&@3, "error: wrong cache type\n");
1940*d83cc019SAndroid Build Coastguard Worker                           }
1941*d83cc019SAndroid Build Coastguard Worker 
1942*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.gen7_dp.category = $11;
1943*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.gen7_dp.binding_table_index = $9;
1944*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.gen7_dp.msg_control = $7;
1945*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.gen7_dp.msg_type = $5;
1946*d83cc019SAndroid Build Coastguard Worker                       } else if (IS_GENx(6)) {
1947*d83cc019SAndroid Build Coastguard Worker                           if ($3 != GEN6_SFID_DATAPORT_SAMPLER_CACHE &&
1948*d83cc019SAndroid Build Coastguard Worker                               $3 != GEN6_SFID_DATAPORT_RENDER_CACHE &&
1949*d83cc019SAndroid Build Coastguard Worker                               $3 != GEN6_SFID_DATAPORT_CONSTANT_CACHE) {
1950*d83cc019SAndroid Build Coastguard Worker                               error (&@3, "error: wrong cache type\n");
1951*d83cc019SAndroid Build Coastguard Worker                           }
1952*d83cc019SAndroid Build Coastguard Worker 
1953*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.gen6_dp.send_commit_msg = $11;
1954*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.gen6_dp.binding_table_index = $9;
1955*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.gen6_dp.msg_control = $7;
1956*d83cc019SAndroid Build Coastguard Worker                           GEN(&$$)->bits3.gen6_dp.msg_type = $5;
1957*d83cc019SAndroid Build Coastguard Worker                       } else if (!IS_GENp(5)) {
1958*d83cc019SAndroid Build Coastguard Worker                           error (&@1, "Gen6- doesn't support data port for sampler/render/constant/data cache\n");
1959*d83cc019SAndroid Build Coastguard Worker                       }
1960*d83cc019SAndroid Build Coastguard Worker                   }
1961*d83cc019SAndroid Build Coastguard Worker 		}
1962*d83cc019SAndroid Build Coastguard Worker ;
1963*d83cc019SAndroid Build Coastguard Worker 
1964*d83cc019SAndroid Build Coastguard Worker urb_allocate:	ALLOCATE { $$ = 1; }
1965*d83cc019SAndroid Build Coastguard Worker 		| %empty /* empty */ { $$ = 0; }
1966*d83cc019SAndroid Build Coastguard Worker ;
1967*d83cc019SAndroid Build Coastguard Worker 
1968*d83cc019SAndroid Build Coastguard Worker urb_used:	USED { $$ = 1; }
1969*d83cc019SAndroid Build Coastguard Worker 		| %empty /* empty */ { $$ = 0; }
1970*d83cc019SAndroid Build Coastguard Worker ;
1971*d83cc019SAndroid Build Coastguard Worker 
1972*d83cc019SAndroid Build Coastguard Worker urb_complete:	COMPLETE { $$ = 1; }
1973*d83cc019SAndroid Build Coastguard Worker 		| %empty /* empty */ { $$ = 0; }
1974*d83cc019SAndroid Build Coastguard Worker ;
1975*d83cc019SAndroid Build Coastguard Worker 
1976*d83cc019SAndroid Build Coastguard Worker urb_swizzle:	TRANSPOSE { $$ = BRW_URB_SWIZZLE_TRANSPOSE; }
1977*d83cc019SAndroid Build Coastguard Worker 		| INTERLEAVE { $$ = BRW_URB_SWIZZLE_INTERLEAVE; }
1978*d83cc019SAndroid Build Coastguard Worker 		| %empty /* empty */ { $$ = BRW_URB_SWIZZLE_NONE; }
1979*d83cc019SAndroid Build Coastguard Worker ;
1980*d83cc019SAndroid Build Coastguard Worker 
1981*d83cc019SAndroid Build Coastguard Worker sampler_datatype:
1982*d83cc019SAndroid Build Coastguard Worker 		TYPE_F
1983*d83cc019SAndroid Build Coastguard Worker 		| TYPE_UD
1984*d83cc019SAndroid Build Coastguard Worker 		| TYPE_D
1985*d83cc019SAndroid Build Coastguard Worker ;
1986*d83cc019SAndroid Build Coastguard Worker 
1987*d83cc019SAndroid Build Coastguard Worker math_function:	INV | LOG | EXP | SQRT | POW | SIN | COS | SINCOS | INTDIV
1988*d83cc019SAndroid Build Coastguard Worker 		| INTMOD | INTDIVMOD | RSQ
1989*d83cc019SAndroid Build Coastguard Worker ;
1990*d83cc019SAndroid Build Coastguard Worker 
1991*d83cc019SAndroid Build Coastguard Worker math_signed:	%empty /* empty */ { $$ = 0; }
1992*d83cc019SAndroid Build Coastguard Worker 		| SIGNED { $$ = 1; }
1993*d83cc019SAndroid Build Coastguard Worker ;
1994*d83cc019SAndroid Build Coastguard Worker 
1995*d83cc019SAndroid Build Coastguard Worker math_scalar:	%empty /* empty */ { $$ = 0; }
1996*d83cc019SAndroid Build Coastguard Worker 		| SCALAR { $$ = 1; }
1997*d83cc019SAndroid Build Coastguard Worker ;
1998*d83cc019SAndroid Build Coastguard Worker 
1999*d83cc019SAndroid Build Coastguard Worker /* 1.4.2: Destination register */
2000*d83cc019SAndroid Build Coastguard Worker 
2001*d83cc019SAndroid Build Coastguard Worker dst:		dstoperand | dstoperandex
2002*d83cc019SAndroid Build Coastguard Worker ;
2003*d83cc019SAndroid Build Coastguard Worker 
2004*d83cc019SAndroid Build Coastguard Worker dstoperand:	symbol_reg dstregion
2005*d83cc019SAndroid Build Coastguard Worker 		{
2006*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1.reg;
2007*d83cc019SAndroid Build Coastguard Worker 	          $$.hstride = resolve_dst_region(&$1, $2);
2008*d83cc019SAndroid Build Coastguard Worker 		}
2009*d83cc019SAndroid Build Coastguard Worker 		| dstreg dstregion writemask regtype
2010*d83cc019SAndroid Build Coastguard Worker 		{
2011*d83cc019SAndroid Build Coastguard Worker 		  /* Returns an instruction with just the destination register
2012*d83cc019SAndroid Build Coastguard Worker 		   * filled in.
2013*d83cc019SAndroid Build Coastguard Worker 		   */
2014*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
2015*d83cc019SAndroid Build Coastguard Worker 	          $$.hstride = resolve_dst_region(NULL, $2);
2016*d83cc019SAndroid Build Coastguard Worker 		  $$.dw1.bits.writemask = $3.dw1.bits.writemask;
2017*d83cc019SAndroid Build Coastguard Worker 		  $$.type = $4.type;
2018*d83cc019SAndroid Build Coastguard Worker 		}
2019*d83cc019SAndroid Build Coastguard Worker ;
2020*d83cc019SAndroid Build Coastguard Worker 
2021*d83cc019SAndroid Build Coastguard Worker /* The dstoperandex returns an instruction with just the destination register
2022*d83cc019SAndroid Build Coastguard Worker  * filled in.
2023*d83cc019SAndroid Build Coastguard Worker  */
2024*d83cc019SAndroid Build Coastguard Worker dstoperandex:	dstoperandex_typed dstregion regtype
2025*d83cc019SAndroid Build Coastguard Worker 		{
2026*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
2027*d83cc019SAndroid Build Coastguard Worker 	          $$.hstride = resolve_dst_region(NULL, $2);
2028*d83cc019SAndroid Build Coastguard Worker 		  $$.type = $3.type;
2029*d83cc019SAndroid Build Coastguard Worker 		}
2030*d83cc019SAndroid Build Coastguard Worker 		| maskstackreg
2031*d83cc019SAndroid Build Coastguard Worker 		{
2032*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
2033*d83cc019SAndroid Build Coastguard Worker 		  $$.hstride = 1;
2034*d83cc019SAndroid Build Coastguard Worker 		  $$.type = BRW_REGISTER_TYPE_UW;
2035*d83cc019SAndroid Build Coastguard Worker 		}
2036*d83cc019SAndroid Build Coastguard Worker 		| controlreg
2037*d83cc019SAndroid Build Coastguard Worker 		{
2038*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
2039*d83cc019SAndroid Build Coastguard Worker 		  $$.hstride = 1;
2040*d83cc019SAndroid Build Coastguard Worker 		  $$.type = BRW_REGISTER_TYPE_UD;
2041*d83cc019SAndroid Build Coastguard Worker 		}
2042*d83cc019SAndroid Build Coastguard Worker 		| ipreg
2043*d83cc019SAndroid Build Coastguard Worker 		{
2044*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
2045*d83cc019SAndroid Build Coastguard Worker 		  $$.hstride = 1;
2046*d83cc019SAndroid Build Coastguard Worker 		  $$.type = BRW_REGISTER_TYPE_UD;
2047*d83cc019SAndroid Build Coastguard Worker 		}
2048*d83cc019SAndroid Build Coastguard Worker 		| nullreg dstregion regtype
2049*d83cc019SAndroid Build Coastguard Worker 		{
2050*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
2051*d83cc019SAndroid Build Coastguard Worker 	          $$.hstride = resolve_dst_region(NULL, $2);
2052*d83cc019SAndroid Build Coastguard Worker 		  $$.type = $3.type;
2053*d83cc019SAndroid Build Coastguard Worker 		}
2054*d83cc019SAndroid Build Coastguard Worker ;
2055*d83cc019SAndroid Build Coastguard Worker 
2056*d83cc019SAndroid Build Coastguard Worker dstoperandex_typed: accreg | flagreg | addrreg | maskreg
2057*d83cc019SAndroid Build Coastguard Worker ;
2058*d83cc019SAndroid Build Coastguard Worker 
2059*d83cc019SAndroid Build Coastguard Worker symbol_reg:	STRING %prec STR_SYMBOL_REG
2060*d83cc019SAndroid Build Coastguard Worker 		{
2061*d83cc019SAndroid Build Coastguard Worker 		    struct declared_register *dcl_reg = find_register($1);
2062*d83cc019SAndroid Build Coastguard Worker 
2063*d83cc019SAndroid Build Coastguard Worker 		    if (dcl_reg == NULL)
2064*d83cc019SAndroid Build Coastguard Worker 			error(&@1, "can't find register %s\n", $1);
2065*d83cc019SAndroid Build Coastguard Worker 
2066*d83cc019SAndroid Build Coastguard Worker 		    memcpy(&$$, dcl_reg, sizeof(*dcl_reg));
2067*d83cc019SAndroid Build Coastguard Worker 		    free($1); // $1 has been malloc'ed by strdup
2068*d83cc019SAndroid Build Coastguard Worker 		}
2069*d83cc019SAndroid Build Coastguard Worker 		| symbol_reg_p
2070*d83cc019SAndroid Build Coastguard Worker 		{
2071*d83cc019SAndroid Build Coastguard Worker 			$$=$1;
2072*d83cc019SAndroid Build Coastguard Worker 		}
2073*d83cc019SAndroid Build Coastguard Worker ;
2074*d83cc019SAndroid Build Coastguard Worker 
2075*d83cc019SAndroid Build Coastguard Worker symbol_reg_p: STRING LPAREN exp RPAREN
2076*d83cc019SAndroid Build Coastguard Worker 		{
2077*d83cc019SAndroid Build Coastguard Worker 		    struct declared_register *dcl_reg = find_register($1);
2078*d83cc019SAndroid Build Coastguard Worker 
2079*d83cc019SAndroid Build Coastguard Worker 		    if (dcl_reg == NULL)
2080*d83cc019SAndroid Build Coastguard Worker 			error(&@1, "can't find register %s\n", $1);
2081*d83cc019SAndroid Build Coastguard Worker 
2082*d83cc019SAndroid Build Coastguard Worker 		    memcpy(&$$, dcl_reg, sizeof(*dcl_reg));
2083*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.nr += $3;
2084*d83cc019SAndroid Build Coastguard Worker 		    free($1);
2085*d83cc019SAndroid Build Coastguard Worker 		}
2086*d83cc019SAndroid Build Coastguard Worker 		| STRING LPAREN exp COMMA exp RPAREN
2087*d83cc019SAndroid Build Coastguard Worker 		{
2088*d83cc019SAndroid Build Coastguard Worker 		    struct declared_register *dcl_reg = find_register($1);
2089*d83cc019SAndroid Build Coastguard Worker 
2090*d83cc019SAndroid Build Coastguard Worker 		    if (dcl_reg == NULL)
2091*d83cc019SAndroid Build Coastguard Worker 			error(&@1, "can't find register %s\n", $1);
2092*d83cc019SAndroid Build Coastguard Worker 
2093*d83cc019SAndroid Build Coastguard Worker 		    memcpy(&$$, dcl_reg, sizeof(*dcl_reg));
2094*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.nr += $3;
2095*d83cc019SAndroid Build Coastguard Worker 		    if(advanced_flag) {
2096*d83cc019SAndroid Build Coastguard Worker 			int size = get_type_size(dcl_reg->reg.type);
2097*d83cc019SAndroid Build Coastguard Worker 		        $$.reg.nr += ($$.reg.subnr + $5) / (32 / size);
2098*d83cc019SAndroid Build Coastguard Worker 		        $$.reg.subnr = ($$.reg.subnr + $5) % (32 / size);
2099*d83cc019SAndroid Build Coastguard Worker 		    } else {
2100*d83cc019SAndroid Build Coastguard Worker 		        $$.reg.nr += ($$.reg.subnr + $5) / 32;
2101*d83cc019SAndroid Build Coastguard Worker 		        $$.reg.subnr = ($$.reg.subnr + $5) % 32;
2102*d83cc019SAndroid Build Coastguard Worker 		    }
2103*d83cc019SAndroid Build Coastguard Worker 		    free($1);
2104*d83cc019SAndroid Build Coastguard Worker 		}
2105*d83cc019SAndroid Build Coastguard Worker ;
2106*d83cc019SAndroid Build Coastguard Worker /* Returns a partially complete destination register consisting of the
2107*d83cc019SAndroid Build Coastguard Worker  * direct or indirect register addressing fields, but not stride or writemask.
2108*d83cc019SAndroid Build Coastguard Worker  */
2109*d83cc019SAndroid Build Coastguard Worker dstreg:		directgenreg
2110*d83cc019SAndroid Build Coastguard Worker 		{
2111*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
2112*d83cc019SAndroid Build Coastguard Worker 		  $$.address_mode = BRW_ADDRESS_DIRECT;
2113*d83cc019SAndroid Build Coastguard Worker 		}
2114*d83cc019SAndroid Build Coastguard Worker 		| directmsgreg
2115*d83cc019SAndroid Build Coastguard Worker 		{
2116*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
2117*d83cc019SAndroid Build Coastguard Worker 		  $$.address_mode = BRW_ADDRESS_DIRECT;
2118*d83cc019SAndroid Build Coastguard Worker 		}
2119*d83cc019SAndroid Build Coastguard Worker 		| indirectgenreg
2120*d83cc019SAndroid Build Coastguard Worker 		{
2121*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
2122*d83cc019SAndroid Build Coastguard Worker 		  $$.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER;
2123*d83cc019SAndroid Build Coastguard Worker 		}
2124*d83cc019SAndroid Build Coastguard Worker 		| indirectmsgreg
2125*d83cc019SAndroid Build Coastguard Worker 		{
2126*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
2127*d83cc019SAndroid Build Coastguard Worker 		  $$.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER;
2128*d83cc019SAndroid Build Coastguard Worker 		}
2129*d83cc019SAndroid Build Coastguard Worker ;
2130*d83cc019SAndroid Build Coastguard Worker 
2131*d83cc019SAndroid Build Coastguard Worker /* 1.4.3: Source register */
2132*d83cc019SAndroid Build Coastguard Worker srcaccimm:	srcacc | imm32reg
2133*d83cc019SAndroid Build Coastguard Worker ;
2134*d83cc019SAndroid Build Coastguard Worker 
2135*d83cc019SAndroid Build Coastguard Worker srcacc:		directsrcaccoperand | indirectsrcoperand
2136*d83cc019SAndroid Build Coastguard Worker ;
2137*d83cc019SAndroid Build Coastguard Worker 
2138*d83cc019SAndroid Build Coastguard Worker srcimm:		directsrcoperand | indirectsrcoperand| imm32reg
2139*d83cc019SAndroid Build Coastguard Worker ;
2140*d83cc019SAndroid Build Coastguard Worker 
2141*d83cc019SAndroid Build Coastguard Worker imm32reg:	imm32 srcimmtype
2142*d83cc019SAndroid Build Coastguard Worker 		{
2143*d83cc019SAndroid Build Coastguard Worker 		  union {
2144*d83cc019SAndroid Build Coastguard Worker 		    int i;
2145*d83cc019SAndroid Build Coastguard Worker 		    float f;
2146*d83cc019SAndroid Build Coastguard Worker 		  } intfloat;
2147*d83cc019SAndroid Build Coastguard Worker 		  uint32_t	d;
2148*d83cc019SAndroid Build Coastguard Worker 
2149*d83cc019SAndroid Build Coastguard Worker 		  switch ($2) {
2150*d83cc019SAndroid Build Coastguard Worker 		  case BRW_REGISTER_TYPE_UD:
2151*d83cc019SAndroid Build Coastguard Worker 		  case BRW_REGISTER_TYPE_D:
2152*d83cc019SAndroid Build Coastguard Worker 		  case BRW_REGISTER_TYPE_V:
2153*d83cc019SAndroid Build Coastguard Worker 		  case BRW_REGISTER_TYPE_VF:
2154*d83cc019SAndroid Build Coastguard Worker 		    switch ($1.r) {
2155*d83cc019SAndroid Build Coastguard Worker 		    case imm32_d:
2156*d83cc019SAndroid Build Coastguard Worker 		      d = $1.u.d;
2157*d83cc019SAndroid Build Coastguard Worker 		      break;
2158*d83cc019SAndroid Build Coastguard Worker 		    default:
2159*d83cc019SAndroid Build Coastguard Worker 		      error (&@2, "non-int D/UD/V/VF representation: %d,type=%d\n", $1.r, $2);
2160*d83cc019SAndroid Build Coastguard Worker 		    }
2161*d83cc019SAndroid Build Coastguard Worker 		    break;
2162*d83cc019SAndroid Build Coastguard Worker 		  case BRW_REGISTER_TYPE_UW:
2163*d83cc019SAndroid Build Coastguard Worker 		  case BRW_REGISTER_TYPE_W:
2164*d83cc019SAndroid Build Coastguard Worker 		    switch ($1.r) {
2165*d83cc019SAndroid Build Coastguard Worker 		    case imm32_d:
2166*d83cc019SAndroid Build Coastguard Worker 		      d = $1.u.d;
2167*d83cc019SAndroid Build Coastguard Worker 		      break;
2168*d83cc019SAndroid Build Coastguard Worker 		    default:
2169*d83cc019SAndroid Build Coastguard Worker 		      error (&@2, "non-int W/UW representation\n");
2170*d83cc019SAndroid Build Coastguard Worker 		    }
2171*d83cc019SAndroid Build Coastguard Worker 		    d &= 0xffff;
2172*d83cc019SAndroid Build Coastguard Worker 		    d |= d << 16;
2173*d83cc019SAndroid Build Coastguard Worker 		    break;
2174*d83cc019SAndroid Build Coastguard Worker 		  case BRW_REGISTER_TYPE_F:
2175*d83cc019SAndroid Build Coastguard Worker 		    switch ($1.r) {
2176*d83cc019SAndroid Build Coastguard Worker 		    case imm32_f:
2177*d83cc019SAndroid Build Coastguard Worker 		      intfloat.f = $1.u.f;
2178*d83cc019SAndroid Build Coastguard Worker 		      break;
2179*d83cc019SAndroid Build Coastguard Worker 		    case imm32_d:
2180*d83cc019SAndroid Build Coastguard Worker 		      intfloat.f = (float) $1.u.d;
2181*d83cc019SAndroid Build Coastguard Worker 		      break;
2182*d83cc019SAndroid Build Coastguard Worker 		    default:
2183*d83cc019SAndroid Build Coastguard Worker 		      error (&@2, "non-float F representation\n");
2184*d83cc019SAndroid Build Coastguard Worker 		    }
2185*d83cc019SAndroid Build Coastguard Worker 		    d = intfloat.i;
2186*d83cc019SAndroid Build Coastguard Worker 		    break;
2187*d83cc019SAndroid Build Coastguard Worker #if 0
2188*d83cc019SAndroid Build Coastguard Worker 		  case BRW_REGISTER_TYPE_VF:
2189*d83cc019SAndroid Build Coastguard Worker 		    fprintf (stderr, "Immediate type VF not supported yet\n");
2190*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
2191*d83cc019SAndroid Build Coastguard Worker #endif
2192*d83cc019SAndroid Build Coastguard Worker 		  default:
2193*d83cc019SAndroid Build Coastguard Worker 		    error(&@2, "unknown immediate type %d\n", $2);
2194*d83cc019SAndroid Build Coastguard Worker 		  }
2195*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2196*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.file = BRW_IMMEDIATE_VALUE;
2197*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.type = $2;
2198*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.dw1.ud = d;
2199*d83cc019SAndroid Build Coastguard Worker 		}
2200*d83cc019SAndroid Build Coastguard Worker ;
2201*d83cc019SAndroid Build Coastguard Worker 
2202*d83cc019SAndroid Build Coastguard Worker directsrcaccoperand:	directsrcoperand
2203*d83cc019SAndroid Build Coastguard Worker 		| accreg region regtype
2204*d83cc019SAndroid Build Coastguard Worker 		{
2205*d83cc019SAndroid Build Coastguard Worker 		  set_direct_src_operand(&$$, &$1, $3.type);
2206*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.vstride = $2.vert_stride;
2207*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.width = $2.width;
2208*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.hstride = $2.horiz_stride;
2209*d83cc019SAndroid Build Coastguard Worker 		  $$.default_region = $2.is_default;
2210*d83cc019SAndroid Build Coastguard Worker 		}
2211*d83cc019SAndroid Build Coastguard Worker ;
2212*d83cc019SAndroid Build Coastguard Worker 
2213*d83cc019SAndroid Build Coastguard Worker /* Returns a source operand in the src0 fields of an instruction. */
2214*d83cc019SAndroid Build Coastguard Worker srcarchoperandex: srcarchoperandex_typed region regtype
2215*d83cc019SAndroid Build Coastguard Worker 		{
2216*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2217*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.file = $1.file;
2218*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.type = $3.type;
2219*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.subnr = $1.subnr;
2220*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.nr = $1.nr;
2221*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.vstride = $2.vert_stride;
2222*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.width = $2.width;
2223*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.hstride = $2.horiz_stride;
2224*d83cc019SAndroid Build Coastguard Worker 		  $$.default_region = $2.is_default;
2225*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.negate = 0;
2226*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.abs = 0;
2227*d83cc019SAndroid Build Coastguard Worker 		}
2228*d83cc019SAndroid Build Coastguard Worker 		| maskstackreg
2229*d83cc019SAndroid Build Coastguard Worker 		{
2230*d83cc019SAndroid Build Coastguard Worker 		  set_direct_src_operand(&$$, &$1, BRW_REGISTER_TYPE_UB);
2231*d83cc019SAndroid Build Coastguard Worker 		}
2232*d83cc019SAndroid Build Coastguard Worker 		| controlreg
2233*d83cc019SAndroid Build Coastguard Worker 		{
2234*d83cc019SAndroid Build Coastguard Worker 		  set_direct_src_operand(&$$, &$1, BRW_REGISTER_TYPE_UD);
2235*d83cc019SAndroid Build Coastguard Worker 		}
2236*d83cc019SAndroid Build Coastguard Worker /*		| statereg
2237*d83cc019SAndroid Build Coastguard Worker 		{
2238*d83cc019SAndroid Build Coastguard Worker 		  set_direct_src_operand(&$$, &$1, BRW_REGISTER_TYPE_UD);
2239*d83cc019SAndroid Build Coastguard Worker 		}*/
2240*d83cc019SAndroid Build Coastguard Worker 		| notifyreg
2241*d83cc019SAndroid Build Coastguard Worker 		{
2242*d83cc019SAndroid Build Coastguard Worker 		  set_direct_src_operand(&$$, &$1, BRW_REGISTER_TYPE_UD);
2243*d83cc019SAndroid Build Coastguard Worker 		}
2244*d83cc019SAndroid Build Coastguard Worker 		| ipreg
2245*d83cc019SAndroid Build Coastguard Worker 		{
2246*d83cc019SAndroid Build Coastguard Worker 		  set_direct_src_operand(&$$, &$1, BRW_REGISTER_TYPE_UD);
2247*d83cc019SAndroid Build Coastguard Worker 		}
2248*d83cc019SAndroid Build Coastguard Worker 		| nullreg region regtype
2249*d83cc019SAndroid Build Coastguard Worker 		{
2250*d83cc019SAndroid Build Coastguard Worker 		  if ($3.is_default) {
2251*d83cc019SAndroid Build Coastguard Worker 		    set_direct_src_operand(&$$, &$1, BRW_REGISTER_TYPE_UD);
2252*d83cc019SAndroid Build Coastguard Worker 		  } else {
2253*d83cc019SAndroid Build Coastguard Worker 		    set_direct_src_operand(&$$, &$1, $3.type);
2254*d83cc019SAndroid Build Coastguard Worker 		  }
2255*d83cc019SAndroid Build Coastguard Worker 		  $$.default_region = 1;
2256*d83cc019SAndroid Build Coastguard Worker 		}
2257*d83cc019SAndroid Build Coastguard Worker ;
2258*d83cc019SAndroid Build Coastguard Worker 
2259*d83cc019SAndroid Build Coastguard Worker srcarchoperandex_typed: flagreg | addrreg | maskreg
2260*d83cc019SAndroid Build Coastguard Worker ;
2261*d83cc019SAndroid Build Coastguard Worker 
2262*d83cc019SAndroid Build Coastguard Worker sendleadreg: symbol_reg
2263*d83cc019SAndroid Build Coastguard Worker              {
2264*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2265*d83cc019SAndroid Build Coastguard Worker 		  $$.file = $1.reg.file;
2266*d83cc019SAndroid Build Coastguard Worker 		  $$.nr = $1.reg.nr;
2267*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $1.reg.subnr;
2268*d83cc019SAndroid Build Coastguard Worker              }
2269*d83cc019SAndroid Build Coastguard Worker              | directgenreg | directmsgreg
2270*d83cc019SAndroid Build Coastguard Worker ;
2271*d83cc019SAndroid Build Coastguard Worker 
2272*d83cc019SAndroid Build Coastguard Worker src:		directsrcoperand | indirectsrcoperand
2273*d83cc019SAndroid Build Coastguard Worker ;
2274*d83cc019SAndroid Build Coastguard Worker 
2275*d83cc019SAndroid Build Coastguard Worker directsrcoperand:	negate abs symbol_reg region regtype
2276*d83cc019SAndroid Build Coastguard Worker 		{
2277*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2278*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.address_mode = BRW_ADDRESS_DIRECT;
2279*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.file = $3.reg.file;
2280*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.nr = $3.reg.nr;
2281*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.subnr = $3.reg.subnr;
2282*d83cc019SAndroid Build Coastguard Worker 		  if ($5.is_default) {
2283*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.type = $3.reg.type;
2284*d83cc019SAndroid Build Coastguard Worker 		  } else {
2285*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.type = $5.type;
2286*d83cc019SAndroid Build Coastguard Worker 		  }
2287*d83cc019SAndroid Build Coastguard Worker 		  if ($4.is_default) {
2288*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.vstride = $3.src_region.vert_stride;
2289*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.width = $3.src_region.width;
2290*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.hstride = $3.src_region.horiz_stride;
2291*d83cc019SAndroid Build Coastguard Worker 		  } else {
2292*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.vstride = $4.vert_stride;
2293*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.width = $4.width;
2294*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.hstride = $4.horiz_stride;
2295*d83cc019SAndroid Build Coastguard Worker 		  }
2296*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.negate = $1;
2297*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.abs = $2;
2298*d83cc019SAndroid Build Coastguard Worker 		}
2299*d83cc019SAndroid Build Coastguard Worker 		| statereg region regtype
2300*d83cc019SAndroid Build Coastguard Worker 		{
2301*d83cc019SAndroid Build Coastguard Worker 		  if($2.is_default ==1 && $3.is_default == 1)
2302*d83cc019SAndroid Build Coastguard Worker 		  {
2303*d83cc019SAndroid Build Coastguard Worker 		    set_direct_src_operand(&$$, &$1, BRW_REGISTER_TYPE_UD);
2304*d83cc019SAndroid Build Coastguard Worker 		  }
2305*d83cc019SAndroid Build Coastguard Worker 		  else{
2306*d83cc019SAndroid Build Coastguard Worker 		    memset (&$$, '\0', sizeof ($$));
2307*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.address_mode = BRW_ADDRESS_DIRECT;
2308*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.file = $1.file;
2309*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.nr = $1.nr;
2310*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.subnr = $1.subnr;
2311*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.vstride = $2.vert_stride;
2312*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.width = $2.width;
2313*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.hstride = $2.horiz_stride;
2314*d83cc019SAndroid Build Coastguard Worker 		    $$.reg.type = $3.type;
2315*d83cc019SAndroid Build Coastguard Worker 		  }
2316*d83cc019SAndroid Build Coastguard Worker 		}
2317*d83cc019SAndroid Build Coastguard Worker 		| negate abs directgenreg region swizzle regtype
2318*d83cc019SAndroid Build Coastguard Worker 		{
2319*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2320*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.address_mode = BRW_ADDRESS_DIRECT;
2321*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.file = $3.file;
2322*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.nr = $3.nr;
2323*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.subnr = $3.subnr;
2324*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.type = $6.type;
2325*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.vstride = $4.vert_stride;
2326*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.width = $4.width;
2327*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.hstride = $4.horiz_stride;
2328*d83cc019SAndroid Build Coastguard Worker 		  $$.default_region = $4.is_default;
2329*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.negate = $1;
2330*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.abs = $2;
2331*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.dw1.bits.swizzle = $5.reg.dw1.bits.swizzle;
2332*d83cc019SAndroid Build Coastguard Worker 		}
2333*d83cc019SAndroid Build Coastguard Worker 		| srcarchoperandex
2334*d83cc019SAndroid Build Coastguard Worker ;
2335*d83cc019SAndroid Build Coastguard Worker 
2336*d83cc019SAndroid Build Coastguard Worker indirectsrcoperand:
2337*d83cc019SAndroid Build Coastguard Worker 		negate abs indirectgenreg indirectregion regtype swizzle
2338*d83cc019SAndroid Build Coastguard Worker 		{
2339*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2340*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER;
2341*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.file = $3.file;
2342*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.subnr = $3.subnr;
2343*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.dw1.bits.indirect_offset = $3.dw1.bits.indirect_offset;
2344*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.type = $5.type;
2345*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.vstride = $4.vert_stride;
2346*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.width = $4.width;
2347*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.hstride = $4.horiz_stride;
2348*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.negate = $1;
2349*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.abs = $2;
2350*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.dw1.bits.swizzle = $6.reg.dw1.bits.swizzle;
2351*d83cc019SAndroid Build Coastguard Worker 		}
2352*d83cc019SAndroid Build Coastguard Worker ;
2353*d83cc019SAndroid Build Coastguard Worker 
2354*d83cc019SAndroid Build Coastguard Worker /* 1.4.4: Address Registers */
2355*d83cc019SAndroid Build Coastguard Worker /* Returns a partially-completed struct brw_reg consisting of the address
2356*d83cc019SAndroid Build Coastguard Worker  * register fields for register-indirect access.
2357*d83cc019SAndroid Build Coastguard Worker  */
2358*d83cc019SAndroid Build Coastguard Worker addrparam:	addrreg COMMA immaddroffset
2359*d83cc019SAndroid Build Coastguard Worker 		{
2360*d83cc019SAndroid Build Coastguard Worker 		  if ($3 < -512 || $3 > 511)
2361*d83cc019SAndroid Build Coastguard Worker 		    error(&@3, "Address immediate offset %d out of range\n", $3);
2362*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2363*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $1.subnr;
2364*d83cc019SAndroid Build Coastguard Worker 		  $$.dw1.bits.indirect_offset = $3;
2365*d83cc019SAndroid Build Coastguard Worker 		}
2366*d83cc019SAndroid Build Coastguard Worker 		| addrreg
2367*d83cc019SAndroid Build Coastguard Worker 		{
2368*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2369*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $1.subnr;
2370*d83cc019SAndroid Build Coastguard Worker 		  $$.dw1.bits.indirect_offset = 0;
2371*d83cc019SAndroid Build Coastguard Worker 		}
2372*d83cc019SAndroid Build Coastguard Worker ;
2373*d83cc019SAndroid Build Coastguard Worker 
2374*d83cc019SAndroid Build Coastguard Worker /* The immaddroffset provides an immediate offset value added to the addresses
2375*d83cc019SAndroid Build Coastguard Worker  * from the address register in register-indirect register access.
2376*d83cc019SAndroid Build Coastguard Worker  */
2377*d83cc019SAndroid Build Coastguard Worker immaddroffset:	%empty /* empty */ { $$ = 0; }
2378*d83cc019SAndroid Build Coastguard Worker 		| exp
2379*d83cc019SAndroid Build Coastguard Worker ;
2380*d83cc019SAndroid Build Coastguard Worker 
2381*d83cc019SAndroid Build Coastguard Worker 
2382*d83cc019SAndroid Build Coastguard Worker /* 1.4.5: Register files and register numbers */
2383*d83cc019SAndroid Build Coastguard Worker subregnum:	DOT exp
2384*d83cc019SAndroid Build Coastguard Worker 		{
2385*d83cc019SAndroid Build Coastguard Worker 		  $$ = $2;
2386*d83cc019SAndroid Build Coastguard Worker 		}
2387*d83cc019SAndroid Build Coastguard Worker 		|  %empty %prec SUBREGNUM
2388*d83cc019SAndroid Build Coastguard Worker 		{
2389*d83cc019SAndroid Build Coastguard Worker 		  /* Default to subreg 0 if unspecified. */
2390*d83cc019SAndroid Build Coastguard Worker 		  $$ = 0;
2391*d83cc019SAndroid Build Coastguard Worker 		}
2392*d83cc019SAndroid Build Coastguard Worker ;
2393*d83cc019SAndroid Build Coastguard Worker 
2394*d83cc019SAndroid Build Coastguard Worker directgenreg:	GENREG subregnum
2395*d83cc019SAndroid Build Coastguard Worker 		{
2396*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2397*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_GENERAL_REGISTER_FILE;
2398*d83cc019SAndroid Build Coastguard Worker 		  $$.nr = $1;
2399*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $2;
2400*d83cc019SAndroid Build Coastguard Worker 		}
2401*d83cc019SAndroid Build Coastguard Worker ;
2402*d83cc019SAndroid Build Coastguard Worker 
2403*d83cc019SAndroid Build Coastguard Worker indirectgenreg: GENREGFILE LSQUARE addrparam RSQUARE
2404*d83cc019SAndroid Build Coastguard Worker 		{
2405*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2406*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_GENERAL_REGISTER_FILE;
2407*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $3.subnr;
2408*d83cc019SAndroid Build Coastguard Worker 		  $$.dw1.bits.indirect_offset = $3.dw1.bits.indirect_offset;
2409*d83cc019SAndroid Build Coastguard Worker 		}
2410*d83cc019SAndroid Build Coastguard Worker ;
2411*d83cc019SAndroid Build Coastguard Worker 
2412*d83cc019SAndroid Build Coastguard Worker directmsgreg:	MSGREG subregnum
2413*d83cc019SAndroid Build Coastguard Worker 		{
2414*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2415*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_MESSAGE_REGISTER_FILE;
2416*d83cc019SAndroid Build Coastguard Worker 		  $$.nr = $1;
2417*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $2;
2418*d83cc019SAndroid Build Coastguard Worker 		}
2419*d83cc019SAndroid Build Coastguard Worker ;
2420*d83cc019SAndroid Build Coastguard Worker 
2421*d83cc019SAndroid Build Coastguard Worker indirectmsgreg: MSGREGFILE LSQUARE addrparam RSQUARE
2422*d83cc019SAndroid Build Coastguard Worker 		{
2423*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2424*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_MESSAGE_REGISTER_FILE;
2425*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $3.subnr;
2426*d83cc019SAndroid Build Coastguard Worker 		  $$.dw1.bits.indirect_offset = $3.dw1.bits.indirect_offset;
2427*d83cc019SAndroid Build Coastguard Worker 		}
2428*d83cc019SAndroid Build Coastguard Worker ;
2429*d83cc019SAndroid Build Coastguard Worker 
2430*d83cc019SAndroid Build Coastguard Worker addrreg:	ADDRESSREG subregnum
2431*d83cc019SAndroid Build Coastguard Worker 		{
2432*d83cc019SAndroid Build Coastguard Worker 		  if ($1 != 0)
2433*d83cc019SAndroid Build Coastguard Worker 		    error(&@2, "address register number %d out of range", $1);
2434*d83cc019SAndroid Build Coastguard Worker 
2435*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2436*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_ARCHITECTURE_REGISTER_FILE;
2437*d83cc019SAndroid Build Coastguard Worker 		  $$.nr = BRW_ARF_ADDRESS | $1;
2438*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $2;
2439*d83cc019SAndroid Build Coastguard Worker 		}
2440*d83cc019SAndroid Build Coastguard Worker ;
2441*d83cc019SAndroid Build Coastguard Worker 
2442*d83cc019SAndroid Build Coastguard Worker accreg:		ACCREG subregnum
2443*d83cc019SAndroid Build Coastguard Worker 		{
2444*d83cc019SAndroid Build Coastguard Worker 		  if ($1 > 1)
2445*d83cc019SAndroid Build Coastguard Worker 		    error(&@1, "accumulator register number %d out of range", $1);
2446*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2447*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_ARCHITECTURE_REGISTER_FILE;
2448*d83cc019SAndroid Build Coastguard Worker 		  $$.nr = BRW_ARF_ACCUMULATOR | $1;
2449*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $2;
2450*d83cc019SAndroid Build Coastguard Worker 		}
2451*d83cc019SAndroid Build Coastguard Worker ;
2452*d83cc019SAndroid Build Coastguard Worker 
2453*d83cc019SAndroid Build Coastguard Worker flagreg:	FLAGREG subregnum
2454*d83cc019SAndroid Build Coastguard Worker 		{
2455*d83cc019SAndroid Build Coastguard Worker 		  if ((!IS_GENp(7) && $1 > 0) ||
2456*d83cc019SAndroid Build Coastguard Worker 		      (IS_GENp(7) && $1 > 1)) {
2457*d83cc019SAndroid Build Coastguard Worker                     error(&@2, "flag register number %d out of range\n", $1);
2458*d83cc019SAndroid Build Coastguard Worker 		  }
2459*d83cc019SAndroid Build Coastguard Worker 
2460*d83cc019SAndroid Build Coastguard Worker 		  if ($2 > 1)
2461*d83cc019SAndroid Build Coastguard Worker 		    error(&@2, "flag subregister number %d out of range\n", $1);
2462*d83cc019SAndroid Build Coastguard Worker 
2463*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2464*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_ARCHITECTURE_REGISTER_FILE;
2465*d83cc019SAndroid Build Coastguard Worker 		  $$.nr = BRW_ARF_FLAG | $1;
2466*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $2;
2467*d83cc019SAndroid Build Coastguard Worker 		}
2468*d83cc019SAndroid Build Coastguard Worker ;
2469*d83cc019SAndroid Build Coastguard Worker 
2470*d83cc019SAndroid Build Coastguard Worker maskreg:	MASKREG subregnum
2471*d83cc019SAndroid Build Coastguard Worker 		{
2472*d83cc019SAndroid Build Coastguard Worker 		  if ($1 > 0)
2473*d83cc019SAndroid Build Coastguard Worker 		    error(&@1, "mask register number %d out of range", $1);
2474*d83cc019SAndroid Build Coastguard Worker 
2475*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2476*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_ARCHITECTURE_REGISTER_FILE;
2477*d83cc019SAndroid Build Coastguard Worker 		  $$.nr = BRW_ARF_MASK;
2478*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $2;
2479*d83cc019SAndroid Build Coastguard Worker 		}
2480*d83cc019SAndroid Build Coastguard Worker 		| mask_subreg
2481*d83cc019SAndroid Build Coastguard Worker 		{
2482*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2483*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_ARCHITECTURE_REGISTER_FILE;
2484*d83cc019SAndroid Build Coastguard Worker 		  $$.nr = BRW_ARF_MASK;
2485*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $1;
2486*d83cc019SAndroid Build Coastguard Worker 		}
2487*d83cc019SAndroid Build Coastguard Worker ;
2488*d83cc019SAndroid Build Coastguard Worker 
2489*d83cc019SAndroid Build Coastguard Worker mask_subreg:	AMASK | IMASK | LMASK | CMASK
2490*d83cc019SAndroid Build Coastguard Worker ;
2491*d83cc019SAndroid Build Coastguard Worker 
2492*d83cc019SAndroid Build Coastguard Worker maskstackreg:	MASKSTACKREG subregnum
2493*d83cc019SAndroid Build Coastguard Worker 		{
2494*d83cc019SAndroid Build Coastguard Worker 		  if ($1 > 0)
2495*d83cc019SAndroid Build Coastguard Worker 		    error(&@1, "mask stack register number %d out of range", $1);
2496*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2497*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_ARCHITECTURE_REGISTER_FILE;
2498*d83cc019SAndroid Build Coastguard Worker 		  $$.nr = BRW_ARF_MASK_STACK;
2499*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $2;
2500*d83cc019SAndroid Build Coastguard Worker 		}
2501*d83cc019SAndroid Build Coastguard Worker 		| maskstack_subreg
2502*d83cc019SAndroid Build Coastguard Worker 		{
2503*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2504*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_ARCHITECTURE_REGISTER_FILE;
2505*d83cc019SAndroid Build Coastguard Worker 		  $$.nr = BRW_ARF_MASK_STACK;
2506*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $1;
2507*d83cc019SAndroid Build Coastguard Worker 		}
2508*d83cc019SAndroid Build Coastguard Worker ;
2509*d83cc019SAndroid Build Coastguard Worker 
2510*d83cc019SAndroid Build Coastguard Worker maskstack_subreg: IMS | LMS
2511*d83cc019SAndroid Build Coastguard Worker ;
2512*d83cc019SAndroid Build Coastguard Worker 
2513*d83cc019SAndroid Build Coastguard Worker /*
2514*d83cc019SAndroid Build Coastguard Worker maskstackdepthreg: MASKSTACKDEPTHREG subregnum
2515*d83cc019SAndroid Build Coastguard Worker 		{
2516*d83cc019SAndroid Build Coastguard Worker 		  if ($1 > 0)
2517*d83cc019SAndroid Build Coastguard Worker 		    error(&@1, "mask stack register number %d out of range", $1);
2518*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2519*d83cc019SAndroid Build Coastguard Worker 		  $$.reg_file = BRW_ARCHITECTURE_REGISTER_FILE;
2520*d83cc019SAndroid Build Coastguard Worker 		  $$.reg_nr = BRW_ARF_MASK_STACK_DEPTH;
2521*d83cc019SAndroid Build Coastguard Worker 		  $$.subreg_nr = $2;
2522*d83cc019SAndroid Build Coastguard Worker 		}
2523*d83cc019SAndroid Build Coastguard Worker 		| maskstackdepth_subreg
2524*d83cc019SAndroid Build Coastguard Worker 		{
2525*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2526*d83cc019SAndroid Build Coastguard Worker 		  $$.reg_file = BRW_ARCHITECTURE_REGISTER_FILE;
2527*d83cc019SAndroid Build Coastguard Worker 		  $$.reg_nr = BRW_ARF_MASK_STACK_DEPTH;
2528*d83cc019SAndroid Build Coastguard Worker 		  $$.subreg_nr = $1;
2529*d83cc019SAndroid Build Coastguard Worker 		}
2530*d83cc019SAndroid Build Coastguard Worker ;
2531*d83cc019SAndroid Build Coastguard Worker 
2532*d83cc019SAndroid Build Coastguard Worker maskstackdepth_subreg: IMSD | LMSD
2533*d83cc019SAndroid Build Coastguard Worker ;
2534*d83cc019SAndroid Build Coastguard Worker  */
2535*d83cc019SAndroid Build Coastguard Worker 
2536*d83cc019SAndroid Build Coastguard Worker notifyreg:	NOTIFYREG regtype
2537*d83cc019SAndroid Build Coastguard Worker 		{
2538*d83cc019SAndroid Build Coastguard Worker 		  int num_notifyreg = (IS_GENp(6)) ? 3 : 2;
2539*d83cc019SAndroid Build Coastguard Worker 
2540*d83cc019SAndroid Build Coastguard Worker 		  if ($1 > num_notifyreg)
2541*d83cc019SAndroid Build Coastguard Worker 		    error(&@1, "notification register number %d out of range",
2542*d83cc019SAndroid Build Coastguard Worker 			  $1);
2543*d83cc019SAndroid Build Coastguard Worker 
2544*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2545*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_ARCHITECTURE_REGISTER_FILE;
2546*d83cc019SAndroid Build Coastguard Worker 
2547*d83cc019SAndroid Build Coastguard Worker                   if (IS_GENp(6)) {
2548*d83cc019SAndroid Build Coastguard Worker 		    $$.nr = BRW_ARF_NOTIFICATION_COUNT;
2549*d83cc019SAndroid Build Coastguard Worker                     $$.subnr = $1;
2550*d83cc019SAndroid Build Coastguard Worker                   } else {
2551*d83cc019SAndroid Build Coastguard Worker 		    $$.nr = BRW_ARF_NOTIFICATION_COUNT | $1;
2552*d83cc019SAndroid Build Coastguard Worker                     $$.subnr = 0;
2553*d83cc019SAndroid Build Coastguard Worker                   }
2554*d83cc019SAndroid Build Coastguard Worker 		}
2555*d83cc019SAndroid Build Coastguard Worker /*
2556*d83cc019SAndroid Build Coastguard Worker 		| NOTIFYREG regtype
2557*d83cc019SAndroid Build Coastguard Worker 		{
2558*d83cc019SAndroid Build Coastguard Worker 		  if ($1 > 1) {
2559*d83cc019SAndroid Build Coastguard Worker 		    fprintf(stderr,
2560*d83cc019SAndroid Build Coastguard Worker 			    "notification register number %d out of range",
2561*d83cc019SAndroid Build Coastguard Worker 			    $1);
2562*d83cc019SAndroid Build Coastguard Worker 		    YYERROR;
2563*d83cc019SAndroid Build Coastguard Worker 		  }
2564*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2565*d83cc019SAndroid Build Coastguard Worker 		  $$.reg_file = BRW_ARCHITECTURE_REGISTER_FILE;
2566*d83cc019SAndroid Build Coastguard Worker 		  $$.reg_nr = BRW_ARF_NOTIFICATION_COUNT;
2567*d83cc019SAndroid Build Coastguard Worker 		  $$.subreg_nr = 0;
2568*d83cc019SAndroid Build Coastguard Worker 		}
2569*d83cc019SAndroid Build Coastguard Worker */
2570*d83cc019SAndroid Build Coastguard Worker ;
2571*d83cc019SAndroid Build Coastguard Worker 
2572*d83cc019SAndroid Build Coastguard Worker statereg:	STATEREG subregnum
2573*d83cc019SAndroid Build Coastguard Worker 		{
2574*d83cc019SAndroid Build Coastguard Worker 		  if ($1 > 0)
2575*d83cc019SAndroid Build Coastguard Worker 		    error(&@1, "state register number %d out of range", $1);
2576*d83cc019SAndroid Build Coastguard Worker 
2577*d83cc019SAndroid Build Coastguard Worker 		  if ($2 > 1)
2578*d83cc019SAndroid Build Coastguard Worker 		    error(&@2, "state subregister number %d out of range", $1);
2579*d83cc019SAndroid Build Coastguard Worker 
2580*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2581*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_ARCHITECTURE_REGISTER_FILE;
2582*d83cc019SAndroid Build Coastguard Worker 		  $$.nr = BRW_ARF_STATE | $1;
2583*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $2;
2584*d83cc019SAndroid Build Coastguard Worker 		}
2585*d83cc019SAndroid Build Coastguard Worker ;
2586*d83cc019SAndroid Build Coastguard Worker 
2587*d83cc019SAndroid Build Coastguard Worker controlreg:	CONTROLREG subregnum
2588*d83cc019SAndroid Build Coastguard Worker 		{
2589*d83cc019SAndroid Build Coastguard Worker 		  if ($1 > 0)
2590*d83cc019SAndroid Build Coastguard Worker 		    error(&@1, "control register number %d out of range", $1);
2591*d83cc019SAndroid Build Coastguard Worker 
2592*d83cc019SAndroid Build Coastguard Worker 		  if ($2 > 2)
2593*d83cc019SAndroid Build Coastguard Worker 		    error(&@2, "control subregister number %d out of range", $1);
2594*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2595*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_ARCHITECTURE_REGISTER_FILE;
2596*d83cc019SAndroid Build Coastguard Worker 		  $$.nr = BRW_ARF_CONTROL | $1;
2597*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = $2;
2598*d83cc019SAndroid Build Coastguard Worker 		}
2599*d83cc019SAndroid Build Coastguard Worker ;
2600*d83cc019SAndroid Build Coastguard Worker 
2601*d83cc019SAndroid Build Coastguard Worker ipreg:		IPREG regtype
2602*d83cc019SAndroid Build Coastguard Worker 		{
2603*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2604*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_ARCHITECTURE_REGISTER_FILE;
2605*d83cc019SAndroid Build Coastguard Worker 		  $$.nr = BRW_ARF_IP;
2606*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = 0;
2607*d83cc019SAndroid Build Coastguard Worker 		}
2608*d83cc019SAndroid Build Coastguard Worker ;
2609*d83cc019SAndroid Build Coastguard Worker 
2610*d83cc019SAndroid Build Coastguard Worker nullreg:	NULL_TOKEN
2611*d83cc019SAndroid Build Coastguard Worker 		{
2612*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2613*d83cc019SAndroid Build Coastguard Worker 		  $$.file = BRW_ARCHITECTURE_REGISTER_FILE;
2614*d83cc019SAndroid Build Coastguard Worker 		  $$.nr = BRW_ARF_NULL;
2615*d83cc019SAndroid Build Coastguard Worker 		  $$.subnr = 0;
2616*d83cc019SAndroid Build Coastguard Worker 		}
2617*d83cc019SAndroid Build Coastguard Worker ;
2618*d83cc019SAndroid Build Coastguard Worker 
2619*d83cc019SAndroid Build Coastguard Worker /* 1.4.6: Relative locations */
2620*d83cc019SAndroid Build Coastguard Worker relativelocation:
2621*d83cc019SAndroid Build Coastguard Worker 		simple_int
2622*d83cc019SAndroid Build Coastguard Worker 		{
2623*d83cc019SAndroid Build Coastguard Worker 		  if (($1 > 32767) || ($1 < -32768))
2624*d83cc019SAndroid Build Coastguard Worker 		    error(&@1, "error: relative offset %d out of range \n", $1);
2625*d83cc019SAndroid Build Coastguard Worker 
2626*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2627*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.file = BRW_IMMEDIATE_VALUE;
2628*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.type = BRW_REGISTER_TYPE_D;
2629*d83cc019SAndroid Build Coastguard Worker 		  $$.imm32 = $1 & 0x0000ffff;
2630*d83cc019SAndroid Build Coastguard Worker 		}
2631*d83cc019SAndroid Build Coastguard Worker 		| STRING
2632*d83cc019SAndroid Build Coastguard Worker 		{
2633*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2634*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.file = BRW_IMMEDIATE_VALUE;
2635*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.type = BRW_REGISTER_TYPE_D;
2636*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc_target = $1;
2637*d83cc019SAndroid Build Coastguard Worker 		}
2638*d83cc019SAndroid Build Coastguard Worker ;
2639*d83cc019SAndroid Build Coastguard Worker 
2640*d83cc019SAndroid Build Coastguard Worker relativelocation2:
2641*d83cc019SAndroid Build Coastguard Worker 		  STRING
2642*d83cc019SAndroid Build Coastguard Worker 		{
2643*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2644*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.file = BRW_IMMEDIATE_VALUE;
2645*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.type = BRW_REGISTER_TYPE_D;
2646*d83cc019SAndroid Build Coastguard Worker 		  $$.reloc_target = $1;
2647*d83cc019SAndroid Build Coastguard Worker 		}
2648*d83cc019SAndroid Build Coastguard Worker 		| exp
2649*d83cc019SAndroid Build Coastguard Worker 		{
2650*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2651*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.file = BRW_IMMEDIATE_VALUE;
2652*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.type = BRW_REGISTER_TYPE_D;
2653*d83cc019SAndroid Build Coastguard Worker 		  $$.imm32 = $1;
2654*d83cc019SAndroid Build Coastguard Worker 		}
2655*d83cc019SAndroid Build Coastguard Worker 		| directgenreg region regtype
2656*d83cc019SAndroid Build Coastguard Worker 		{
2657*d83cc019SAndroid Build Coastguard Worker 		  set_direct_src_operand(&$$, &$1, $3.type);
2658*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.vstride = $2.vert_stride;
2659*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.width = $2.width;
2660*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.hstride = $2.horiz_stride;
2661*d83cc019SAndroid Build Coastguard Worker 		  $$.default_region = $2.is_default;
2662*d83cc019SAndroid Build Coastguard Worker 		}
2663*d83cc019SAndroid Build Coastguard Worker 		| symbol_reg_p
2664*d83cc019SAndroid Build Coastguard Worker 		{
2665*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2666*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.address_mode = BRW_ADDRESS_DIRECT;
2667*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.file = $1.reg.file;
2668*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.nr = $1.reg.nr;
2669*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.subnr = $1.reg.subnr;
2670*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.type = $1.reg.type;
2671*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.vstride = $1.src_region.vert_stride;
2672*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.width = $1.src_region.width;
2673*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.hstride = $1.src_region.horiz_stride;
2674*d83cc019SAndroid Build Coastguard Worker 		}
2675*d83cc019SAndroid Build Coastguard Worker 		| indirectgenreg indirectregion regtype
2676*d83cc019SAndroid Build Coastguard Worker 		{
2677*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2678*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER;
2679*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.file = $1.file;
2680*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.subnr = $1.subnr;
2681*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.dw1.bits.indirect_offset = $1.dw1.bits.indirect_offset;
2682*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.type = $3.type;
2683*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.vstride = $2.vert_stride;
2684*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.width = $2.width;
2685*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.hstride = $2.horiz_stride;
2686*d83cc019SAndroid Build Coastguard Worker 		}
2687*d83cc019SAndroid Build Coastguard Worker ;
2688*d83cc019SAndroid Build Coastguard Worker 
2689*d83cc019SAndroid Build Coastguard Worker /* 1.4.7: Regions */
2690*d83cc019SAndroid Build Coastguard Worker dstregion:	%empty /* empty */
2691*d83cc019SAndroid Build Coastguard Worker 		{
2692*d83cc019SAndroid Build Coastguard Worker 		  $$ = DEFAULT_DSTREGION;
2693*d83cc019SAndroid Build Coastguard Worker 		}
2694*d83cc019SAndroid Build Coastguard Worker 		|LANGLE exp RANGLE
2695*d83cc019SAndroid Build Coastguard Worker 		{
2696*d83cc019SAndroid Build Coastguard Worker 		  /* Returns a value for a horiz_stride field of an
2697*d83cc019SAndroid Build Coastguard Worker 		   * instruction.
2698*d83cc019SAndroid Build Coastguard Worker 		   */
2699*d83cc019SAndroid Build Coastguard Worker 		  if ($2 != 1 && $2 != 2 && $2 != 4)
2700*d83cc019SAndroid Build Coastguard Worker 		    error(&@2, "Invalid horiz size %d\n", $2);
2701*d83cc019SAndroid Build Coastguard Worker 
2702*d83cc019SAndroid Build Coastguard Worker 		  $$ = ffs($2);
2703*d83cc019SAndroid Build Coastguard Worker 		}
2704*d83cc019SAndroid Build Coastguard Worker ;
2705*d83cc019SAndroid Build Coastguard Worker 
2706*d83cc019SAndroid Build Coastguard Worker region:		%empty /* empty */
2707*d83cc019SAndroid Build Coastguard Worker 		{
2708*d83cc019SAndroid Build Coastguard Worker 		  /* XXX is this default value correct?*/
2709*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2710*d83cc019SAndroid Build Coastguard Worker 		  $$.vert_stride = ffs(0);
2711*d83cc019SAndroid Build Coastguard Worker 		  $$.width = BRW_WIDTH_1;
2712*d83cc019SAndroid Build Coastguard Worker 		  $$.horiz_stride = ffs(0);
2713*d83cc019SAndroid Build Coastguard Worker 		  $$.is_default = 1;
2714*d83cc019SAndroid Build Coastguard Worker 		}
2715*d83cc019SAndroid Build Coastguard Worker 		|LANGLE exp RANGLE
2716*d83cc019SAndroid Build Coastguard Worker 		{
2717*d83cc019SAndroid Build Coastguard Worker 		  /* XXX is this default value correct for accreg?*/
2718*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2719*d83cc019SAndroid Build Coastguard Worker 		  $$.vert_stride = ffs($2);
2720*d83cc019SAndroid Build Coastguard Worker 		  $$.width = BRW_WIDTH_1;
2721*d83cc019SAndroid Build Coastguard Worker 		  $$.horiz_stride = ffs(0);
2722*d83cc019SAndroid Build Coastguard Worker 		}
2723*d83cc019SAndroid Build Coastguard Worker 		|LANGLE exp COMMA exp COMMA exp RANGLE
2724*d83cc019SAndroid Build Coastguard Worker 		{
2725*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2726*d83cc019SAndroid Build Coastguard Worker 		  $$.vert_stride = ffs($2);
2727*d83cc019SAndroid Build Coastguard Worker 		  $$.width = ffs($4) - 1;
2728*d83cc019SAndroid Build Coastguard Worker 		  $$.horiz_stride = ffs($6);
2729*d83cc019SAndroid Build Coastguard Worker 		}
2730*d83cc019SAndroid Build Coastguard Worker 		| LANGLE exp SEMICOLON exp COMMA exp RANGLE
2731*d83cc019SAndroid Build Coastguard Worker 		{
2732*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2733*d83cc019SAndroid Build Coastguard Worker 		  $$.vert_stride = ffs($2);
2734*d83cc019SAndroid Build Coastguard Worker 		  $$.width = ffs($4) - 1;
2735*d83cc019SAndroid Build Coastguard Worker 		  $$.horiz_stride = ffs($6);
2736*d83cc019SAndroid Build Coastguard Worker 		}
2737*d83cc019SAndroid Build Coastguard Worker 
2738*d83cc019SAndroid Build Coastguard Worker ;
2739*d83cc019SAndroid Build Coastguard Worker /* region_wh is used in specifying indirect operands where rather than having
2740*d83cc019SAndroid Build Coastguard Worker  * a vertical stride, you use subsequent address registers to get a new base
2741*d83cc019SAndroid Build Coastguard Worker  * offset for the next row.
2742*d83cc019SAndroid Build Coastguard Worker  */
2743*d83cc019SAndroid Build Coastguard Worker region_wh:	LANGLE exp COMMA exp RANGLE
2744*d83cc019SAndroid Build Coastguard Worker 		{
2745*d83cc019SAndroid Build Coastguard Worker 		  memset (&$$, '\0', sizeof ($$));
2746*d83cc019SAndroid Build Coastguard Worker 		  $$.vert_stride = BRW_VERTICAL_STRIDE_ONE_DIMENSIONAL;
2747*d83cc019SAndroid Build Coastguard Worker 		  $$.width = ffs($2) - 1;
2748*d83cc019SAndroid Build Coastguard Worker 		  $$.horiz_stride = ffs($4);
2749*d83cc019SAndroid Build Coastguard Worker 		}
2750*d83cc019SAndroid Build Coastguard Worker ;
2751*d83cc019SAndroid Build Coastguard Worker 
2752*d83cc019SAndroid Build Coastguard Worker indirectregion:	region | region_wh
2753*d83cc019SAndroid Build Coastguard Worker ;
2754*d83cc019SAndroid Build Coastguard Worker 
2755*d83cc019SAndroid Build Coastguard Worker /* 1.4.8: Types */
2756*d83cc019SAndroid Build Coastguard Worker 
2757*d83cc019SAndroid Build Coastguard Worker /* regtype returns an integer register type suitable for inserting into an
2758*d83cc019SAndroid Build Coastguard Worker  * instruction.
2759*d83cc019SAndroid Build Coastguard Worker  */
2760*d83cc019SAndroid Build Coastguard Worker regtype:	%empty /* empty */
2761*d83cc019SAndroid Build Coastguard Worker 		{ $$.type = program_defaults.register_type;$$.is_default = 1;}
2762*d83cc019SAndroid Build Coastguard Worker 		| TYPE_F { $$.type = BRW_REGISTER_TYPE_F;$$.is_default = 0; }
2763*d83cc019SAndroid Build Coastguard Worker 		| TYPE_UD { $$.type = BRW_REGISTER_TYPE_UD;$$.is_default = 0; }
2764*d83cc019SAndroid Build Coastguard Worker 		| TYPE_D { $$.type = BRW_REGISTER_TYPE_D;$$.is_default = 0; }
2765*d83cc019SAndroid Build Coastguard Worker 		| TYPE_UW { $$.type = BRW_REGISTER_TYPE_UW;$$.is_default = 0; }
2766*d83cc019SAndroid Build Coastguard Worker 		| TYPE_W { $$.type = BRW_REGISTER_TYPE_W;$$.is_default = 0; }
2767*d83cc019SAndroid Build Coastguard Worker 		| TYPE_UB { $$.type = BRW_REGISTER_TYPE_UB;$$.is_default = 0; }
2768*d83cc019SAndroid Build Coastguard Worker 		| TYPE_B { $$.type = BRW_REGISTER_TYPE_B;$$.is_default = 0; }
2769*d83cc019SAndroid Build Coastguard Worker ;
2770*d83cc019SAndroid Build Coastguard Worker 
2771*d83cc019SAndroid Build Coastguard Worker srcimmtype:	%empty /* empty */
2772*d83cc019SAndroid Build Coastguard Worker 		{
2773*d83cc019SAndroid Build Coastguard Worker 		    /* XXX change to default when pragma parse is done */
2774*d83cc019SAndroid Build Coastguard Worker 		   $$ = BRW_REGISTER_TYPE_D;
2775*d83cc019SAndroid Build Coastguard Worker 		}
2776*d83cc019SAndroid Build Coastguard Worker 		|TYPE_F { $$ = BRW_REGISTER_TYPE_F; }
2777*d83cc019SAndroid Build Coastguard Worker 		| TYPE_UD { $$ = BRW_REGISTER_TYPE_UD; }
2778*d83cc019SAndroid Build Coastguard Worker 		| TYPE_D { $$ = BRW_REGISTER_TYPE_D; }
2779*d83cc019SAndroid Build Coastguard Worker 		| TYPE_UW { $$ = BRW_REGISTER_TYPE_UW; }
2780*d83cc019SAndroid Build Coastguard Worker 		| TYPE_W { $$ = BRW_REGISTER_TYPE_W; }
2781*d83cc019SAndroid Build Coastguard Worker 		| TYPE_V { $$ = BRW_REGISTER_TYPE_V; }
2782*d83cc019SAndroid Build Coastguard Worker 		| TYPE_VF { $$ = BRW_REGISTER_TYPE_VF; }
2783*d83cc019SAndroid Build Coastguard Worker ;
2784*d83cc019SAndroid Build Coastguard Worker 
2785*d83cc019SAndroid Build Coastguard Worker /* 1.4.10: Swizzle control */
2786*d83cc019SAndroid Build Coastguard Worker /* Returns the swizzle control for an align16 instruction's source operand
2787*d83cc019SAndroid Build Coastguard Worker  * in the src0 fields.
2788*d83cc019SAndroid Build Coastguard Worker  */
2789*d83cc019SAndroid Build Coastguard Worker swizzle:	%empty /* empty */
2790*d83cc019SAndroid Build Coastguard Worker 		{
2791*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.dw1.bits.swizzle = BRW_SWIZZLE_NOOP;
2792*d83cc019SAndroid Build Coastguard Worker 		}
2793*d83cc019SAndroid Build Coastguard Worker 		| DOT chansel
2794*d83cc019SAndroid Build Coastguard Worker 		{
2795*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.dw1.bits.swizzle = BRW_SWIZZLE4($2, $2, $2, $2);
2796*d83cc019SAndroid Build Coastguard Worker 		}
2797*d83cc019SAndroid Build Coastguard Worker 		| DOT chansel chansel chansel chansel
2798*d83cc019SAndroid Build Coastguard Worker 		{
2799*d83cc019SAndroid Build Coastguard Worker 		  $$.reg.dw1.bits.swizzle = BRW_SWIZZLE4($2, $3, $4, $5);
2800*d83cc019SAndroid Build Coastguard Worker 		}
2801*d83cc019SAndroid Build Coastguard Worker ;
2802*d83cc019SAndroid Build Coastguard Worker 
2803*d83cc019SAndroid Build Coastguard Worker chansel:	X | Y | Z | W
2804*d83cc019SAndroid Build Coastguard Worker ;
2805*d83cc019SAndroid Build Coastguard Worker 
2806*d83cc019SAndroid Build Coastguard Worker /* 1.4.9: Write mask */
2807*d83cc019SAndroid Build Coastguard Worker /* Returns a partially completed struct brw_reg, with just the writemask bits
2808*d83cc019SAndroid Build Coastguard Worker  * filled out.
2809*d83cc019SAndroid Build Coastguard Worker  */
2810*d83cc019SAndroid Build Coastguard Worker writemask:	%empty /* empty */
2811*d83cc019SAndroid Build Coastguard Worker 		{
2812*d83cc019SAndroid Build Coastguard Worker 		  $$.dw1.bits.writemask = BRW_WRITEMASK_XYZW;
2813*d83cc019SAndroid Build Coastguard Worker 		}
2814*d83cc019SAndroid Build Coastguard Worker 		| DOT writemask_x writemask_y writemask_z writemask_w
2815*d83cc019SAndroid Build Coastguard Worker 		{
2816*d83cc019SAndroid Build Coastguard Worker 		  $$.dw1.bits.writemask = $2 | $3 | $4 | $5;
2817*d83cc019SAndroid Build Coastguard Worker 		}
2818*d83cc019SAndroid Build Coastguard Worker ;
2819*d83cc019SAndroid Build Coastguard Worker 
2820*d83cc019SAndroid Build Coastguard Worker writemask_x:	%empty /* empty */ { $$ = 0; }
2821*d83cc019SAndroid Build Coastguard Worker 		 | X { $$ = 1 << BRW_CHANNEL_X; }
2822*d83cc019SAndroid Build Coastguard Worker ;
2823*d83cc019SAndroid Build Coastguard Worker 
2824*d83cc019SAndroid Build Coastguard Worker writemask_y:	%empty /* empty */ { $$ = 0; }
2825*d83cc019SAndroid Build Coastguard Worker 		 | Y { $$ = 1 << BRW_CHANNEL_Y; }
2826*d83cc019SAndroid Build Coastguard Worker ;
2827*d83cc019SAndroid Build Coastguard Worker 
2828*d83cc019SAndroid Build Coastguard Worker writemask_z:	%empty /* empty */ { $$ = 0; }
2829*d83cc019SAndroid Build Coastguard Worker 		 | Z { $$ = 1 << BRW_CHANNEL_Z; }
2830*d83cc019SAndroid Build Coastguard Worker ;
2831*d83cc019SAndroid Build Coastguard Worker 
2832*d83cc019SAndroid Build Coastguard Worker writemask_w:	%empty /* empty */ { $$ = 0; }
2833*d83cc019SAndroid Build Coastguard Worker 		 | W { $$ = 1 << BRW_CHANNEL_W; }
2834*d83cc019SAndroid Build Coastguard Worker ;
2835*d83cc019SAndroid Build Coastguard Worker 
2836*d83cc019SAndroid Build Coastguard Worker /* 1.4.11: Immediate values */
2837*d83cc019SAndroid Build Coastguard Worker imm32:		exp { $$.r = imm32_d; $$.u.d = $1; }
2838*d83cc019SAndroid Build Coastguard Worker 		| NUMBER { $$.r = imm32_f; $$.u.f = $1; }
2839*d83cc019SAndroid Build Coastguard Worker ;
2840*d83cc019SAndroid Build Coastguard Worker 
2841*d83cc019SAndroid Build Coastguard Worker /* 1.4.12: Predication and modifiers */
2842*d83cc019SAndroid Build Coastguard Worker predicate:	%empty /* empty */
2843*d83cc019SAndroid Build Coastguard Worker 		{
2844*d83cc019SAndroid Build Coastguard Worker 		  $$.pred_control = BRW_PREDICATE_NONE;
2845*d83cc019SAndroid Build Coastguard Worker 		  $$.flag_reg_nr = 0;
2846*d83cc019SAndroid Build Coastguard Worker 		  $$.flag_subreg_nr = 0;
2847*d83cc019SAndroid Build Coastguard Worker 		  $$.pred_inverse = 0;
2848*d83cc019SAndroid Build Coastguard Worker 		}
2849*d83cc019SAndroid Build Coastguard Worker 		| LPAREN predstate flagreg predctrl RPAREN
2850*d83cc019SAndroid Build Coastguard Worker 		{
2851*d83cc019SAndroid Build Coastguard Worker 		  $$.pred_control = $4;
2852*d83cc019SAndroid Build Coastguard Worker 		  $$.flag_reg_nr = $3.nr;
2853*d83cc019SAndroid Build Coastguard Worker 		  $$.flag_subreg_nr = $3.subnr;
2854*d83cc019SAndroid Build Coastguard Worker 		  $$.pred_inverse = $2;
2855*d83cc019SAndroid Build Coastguard Worker 		}
2856*d83cc019SAndroid Build Coastguard Worker ;
2857*d83cc019SAndroid Build Coastguard Worker 
2858*d83cc019SAndroid Build Coastguard Worker predstate:	%empty /* empty */ { $$ = 0; }
2859*d83cc019SAndroid Build Coastguard Worker 		| PLUS { $$ = 0; }
2860*d83cc019SAndroid Build Coastguard Worker 		| MINUS { $$ = 1; }
2861*d83cc019SAndroid Build Coastguard Worker ;
2862*d83cc019SAndroid Build Coastguard Worker 
2863*d83cc019SAndroid Build Coastguard Worker predctrl:	%empty /* empty */ { $$ = BRW_PREDICATE_NORMAL; }
2864*d83cc019SAndroid Build Coastguard Worker 		| DOT X { $$ = BRW_PREDICATE_ALIGN16_REPLICATE_X; }
2865*d83cc019SAndroid Build Coastguard Worker 		| DOT Y { $$ = BRW_PREDICATE_ALIGN16_REPLICATE_Y; }
2866*d83cc019SAndroid Build Coastguard Worker 		| DOT Z { $$ = BRW_PREDICATE_ALIGN16_REPLICATE_Z; }
2867*d83cc019SAndroid Build Coastguard Worker 		| DOT W { $$ = BRW_PREDICATE_ALIGN16_REPLICATE_W; }
2868*d83cc019SAndroid Build Coastguard Worker 		| ANYV { $$ = BRW_PREDICATE_ALIGN1_ANYV; }
2869*d83cc019SAndroid Build Coastguard Worker 		| ALLV { $$ = BRW_PREDICATE_ALIGN1_ALLV; }
2870*d83cc019SAndroid Build Coastguard Worker 		| ANY2H { $$ = BRW_PREDICATE_ALIGN1_ANY2H; }
2871*d83cc019SAndroid Build Coastguard Worker 		| ALL2H { $$ = BRW_PREDICATE_ALIGN1_ALL2H; }
2872*d83cc019SAndroid Build Coastguard Worker 		| ANY4H { $$ = BRW_PREDICATE_ALIGN1_ANY4H; }
2873*d83cc019SAndroid Build Coastguard Worker 		| ALL4H { $$ = BRW_PREDICATE_ALIGN1_ALL4H; }
2874*d83cc019SAndroid Build Coastguard Worker 		| ANY8H { $$ = BRW_PREDICATE_ALIGN1_ANY8H; }
2875*d83cc019SAndroid Build Coastguard Worker 		| ALL8H { $$ = BRW_PREDICATE_ALIGN1_ALL8H; }
2876*d83cc019SAndroid Build Coastguard Worker 		| ANY16H { $$ = BRW_PREDICATE_ALIGN1_ANY16H; }
2877*d83cc019SAndroid Build Coastguard Worker 		| ALL16H { $$ = BRW_PREDICATE_ALIGN1_ALL16H; }
2878*d83cc019SAndroid Build Coastguard Worker ;
2879*d83cc019SAndroid Build Coastguard Worker 
2880*d83cc019SAndroid Build Coastguard Worker negate:		%empty /* empty */ { $$ = 0; }
2881*d83cc019SAndroid Build Coastguard Worker 		| MINUS { $$ = 1; }
2882*d83cc019SAndroid Build Coastguard Worker ;
2883*d83cc019SAndroid Build Coastguard Worker 
2884*d83cc019SAndroid Build Coastguard Worker abs:		%empty /* empty */ { $$ = 0; }
2885*d83cc019SAndroid Build Coastguard Worker 		| ABS { $$ = 1; }
2886*d83cc019SAndroid Build Coastguard Worker ;
2887*d83cc019SAndroid Build Coastguard Worker 
2888*d83cc019SAndroid Build Coastguard Worker execsize:	%empty /* empty */ %prec EMPTEXECSIZE
2889*d83cc019SAndroid Build Coastguard Worker 		{
2890*d83cc019SAndroid Build Coastguard Worker 		  $$ = ffs(program_defaults.execute_size) - 1;
2891*d83cc019SAndroid Build Coastguard Worker 		}
2892*d83cc019SAndroid Build Coastguard Worker 		|LPAREN exp RPAREN
2893*d83cc019SAndroid Build Coastguard Worker 		{
2894*d83cc019SAndroid Build Coastguard Worker 		  /* Returns a value for the execution_size field of an
2895*d83cc019SAndroid Build Coastguard Worker 		   * instruction.
2896*d83cc019SAndroid Build Coastguard Worker 		   */
2897*d83cc019SAndroid Build Coastguard Worker 		  if ($2 != 1 && $2 != 2 && $2 != 4 && $2 != 8 && $2 != 16 &&
2898*d83cc019SAndroid Build Coastguard Worker 		      $2 != 32)
2899*d83cc019SAndroid Build Coastguard Worker 		    error(&@2, "Invalid execution size %d\n", $2);
2900*d83cc019SAndroid Build Coastguard Worker 
2901*d83cc019SAndroid Build Coastguard Worker 		  $$ = ffs($2) - 1;
2902*d83cc019SAndroid Build Coastguard Worker 		}
2903*d83cc019SAndroid Build Coastguard Worker ;
2904*d83cc019SAndroid Build Coastguard Worker 
2905*d83cc019SAndroid Build Coastguard Worker saturate:	%empty /* empty */ { $$ = BRW_INSTRUCTION_NORMAL; }
2906*d83cc019SAndroid Build Coastguard Worker 		| SATURATE { $$ = BRW_INSTRUCTION_SATURATE; }
2907*d83cc019SAndroid Build Coastguard Worker ;
2908*d83cc019SAndroid Build Coastguard Worker conditionalmodifier: condition
2909*d83cc019SAndroid Build Coastguard Worker 		{
2910*d83cc019SAndroid Build Coastguard Worker 		    $$.cond = $1;
2911*d83cc019SAndroid Build Coastguard Worker 		    $$.flag_reg_nr = 0;
2912*d83cc019SAndroid Build Coastguard Worker 		    $$.flag_subreg_nr = -1;
2913*d83cc019SAndroid Build Coastguard Worker 		}
2914*d83cc019SAndroid Build Coastguard Worker 		| condition DOT flagreg
2915*d83cc019SAndroid Build Coastguard Worker 		{
2916*d83cc019SAndroid Build Coastguard Worker 		    $$.cond = $1;
2917*d83cc019SAndroid Build Coastguard Worker 		    $$.flag_reg_nr = ($3.nr & 0xF);
2918*d83cc019SAndroid Build Coastguard Worker 		    $$.flag_subreg_nr = $3.subnr;
2919*d83cc019SAndroid Build Coastguard Worker 		}
2920*d83cc019SAndroid Build Coastguard Worker 
2921*d83cc019SAndroid Build Coastguard Worker condition: %empty /* empty */    { $$ = BRW_CONDITIONAL_NONE; }
2922*d83cc019SAndroid Build Coastguard Worker 		| ZERO
2923*d83cc019SAndroid Build Coastguard Worker 		| EQUAL
2924*d83cc019SAndroid Build Coastguard Worker 		| NOT_ZERO
2925*d83cc019SAndroid Build Coastguard Worker 		| NOT_EQUAL
2926*d83cc019SAndroid Build Coastguard Worker 		| GREATER
2927*d83cc019SAndroid Build Coastguard Worker 		| GREATER_EQUAL
2928*d83cc019SAndroid Build Coastguard Worker 		| LESS
2929*d83cc019SAndroid Build Coastguard Worker 		| LESS_EQUAL
2930*d83cc019SAndroid Build Coastguard Worker 		| ROUND_INCREMENT
2931*d83cc019SAndroid Build Coastguard Worker 		| OVERFLOW
2932*d83cc019SAndroid Build Coastguard Worker 		| UNORDERED
2933*d83cc019SAndroid Build Coastguard Worker ;
2934*d83cc019SAndroid Build Coastguard Worker 
2935*d83cc019SAndroid Build Coastguard Worker /* 1.4.13: Instruction options */
2936*d83cc019SAndroid Build Coastguard Worker instoptions:	%empty /* empty */
2937*d83cc019SAndroid Build Coastguard Worker 		{ memset(&$$, 0, sizeof($$)); }
2938*d83cc019SAndroid Build Coastguard Worker 		| LCURLY instoption_list RCURLY
2939*d83cc019SAndroid Build Coastguard Worker 		{ $$ = $2; }
2940*d83cc019SAndroid Build Coastguard Worker ;
2941*d83cc019SAndroid Build Coastguard Worker 
2942*d83cc019SAndroid Build Coastguard Worker instoption_list:instoption_list COMMA instoption
2943*d83cc019SAndroid Build Coastguard Worker 		{
2944*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
2945*d83cc019SAndroid Build Coastguard Worker 		  add_option(&$$, $3);
2946*d83cc019SAndroid Build Coastguard Worker 		}
2947*d83cc019SAndroid Build Coastguard Worker 		| instoption_list instoption
2948*d83cc019SAndroid Build Coastguard Worker 		{
2949*d83cc019SAndroid Build Coastguard Worker 		  $$ = $1;
2950*d83cc019SAndroid Build Coastguard Worker 		  add_option(&$$, $2);
2951*d83cc019SAndroid Build Coastguard Worker 		}
2952*d83cc019SAndroid Build Coastguard Worker 		| %empty /* empty, header defaults to zeroes. */
2953*d83cc019SAndroid Build Coastguard Worker 		{
2954*d83cc019SAndroid Build Coastguard Worker 		  memset(&$$, 0, sizeof($$));
2955*d83cc019SAndroid Build Coastguard Worker 		}
2956*d83cc019SAndroid Build Coastguard Worker ;
2957*d83cc019SAndroid Build Coastguard Worker 
2958*d83cc019SAndroid Build Coastguard Worker instoption:	ALIGN1 { $$ = ALIGN1; }
2959*d83cc019SAndroid Build Coastguard Worker 		| ALIGN16 { $$ = ALIGN16; }
2960*d83cc019SAndroid Build Coastguard Worker 		| SECHALF { $$ = SECHALF; }
2961*d83cc019SAndroid Build Coastguard Worker 		| COMPR { $$ = COMPR; }
2962*d83cc019SAndroid Build Coastguard Worker 		| SWITCH { $$ = SWITCH; }
2963*d83cc019SAndroid Build Coastguard Worker 		| ATOMIC { $$ = ATOMIC; }
2964*d83cc019SAndroid Build Coastguard Worker 		| NODDCHK { $$ = NODDCHK; }
2965*d83cc019SAndroid Build Coastguard Worker 		| NODDCLR { $$ = NODDCLR; }
2966*d83cc019SAndroid Build Coastguard Worker 		| MASK_DISABLE { $$ = MASK_DISABLE; }
2967*d83cc019SAndroid Build Coastguard Worker 		| BREAKPOINT { $$ = BREAKPOINT; }
2968*d83cc019SAndroid Build Coastguard Worker 		| ACCWRCTRL { $$ = ACCWRCTRL; }
2969*d83cc019SAndroid Build Coastguard Worker 		| EOT { $$ = EOT; }
2970*d83cc019SAndroid Build Coastguard Worker ;
2971*d83cc019SAndroid Build Coastguard Worker 
2972*d83cc019SAndroid Build Coastguard Worker %%
2973*d83cc019SAndroid Build Coastguard Worker extern int yylineno;
2974*d83cc019SAndroid Build Coastguard Worker 
yyerror(char * msg)2975*d83cc019SAndroid Build Coastguard Worker void yyerror (char *msg)
2976*d83cc019SAndroid Build Coastguard Worker {
2977*d83cc019SAndroid Build Coastguard Worker 	fprintf(stderr, "%s: %d: %s at \"%s\"\n",
2978*d83cc019SAndroid Build Coastguard Worker 		input_filename, yylineno, msg, lex_text());
2979*d83cc019SAndroid Build Coastguard Worker 	++errors;
2980*d83cc019SAndroid Build Coastguard Worker }
2981*d83cc019SAndroid Build Coastguard Worker 
get_type_size(unsigned type)2982*d83cc019SAndroid Build Coastguard Worker static int get_type_size(unsigned type)
2983*d83cc019SAndroid Build Coastguard Worker {
2984*d83cc019SAndroid Build Coastguard Worker     int size = 1;
2985*d83cc019SAndroid Build Coastguard Worker 
2986*d83cc019SAndroid Build Coastguard Worker     switch (type) {
2987*d83cc019SAndroid Build Coastguard Worker     case BRW_REGISTER_TYPE_F:
2988*d83cc019SAndroid Build Coastguard Worker     case BRW_REGISTER_TYPE_UD:
2989*d83cc019SAndroid Build Coastguard Worker     case BRW_REGISTER_TYPE_D:
2990*d83cc019SAndroid Build Coastguard Worker         size = 4;
2991*d83cc019SAndroid Build Coastguard Worker         break;
2992*d83cc019SAndroid Build Coastguard Worker 
2993*d83cc019SAndroid Build Coastguard Worker     case BRW_REGISTER_TYPE_UW:
2994*d83cc019SAndroid Build Coastguard Worker     case BRW_REGISTER_TYPE_W:
2995*d83cc019SAndroid Build Coastguard Worker         size = 2;
2996*d83cc019SAndroid Build Coastguard Worker         break;
2997*d83cc019SAndroid Build Coastguard Worker 
2998*d83cc019SAndroid Build Coastguard Worker     case BRW_REGISTER_TYPE_UB:
2999*d83cc019SAndroid Build Coastguard Worker     case BRW_REGISTER_TYPE_B:
3000*d83cc019SAndroid Build Coastguard Worker         size = 1;
3001*d83cc019SAndroid Build Coastguard Worker         break;
3002*d83cc019SAndroid Build Coastguard Worker 
3003*d83cc019SAndroid Build Coastguard Worker     default:
3004*d83cc019SAndroid Build Coastguard Worker         assert(0);
3005*d83cc019SAndroid Build Coastguard Worker         size = 1;
3006*d83cc019SAndroid Build Coastguard Worker         break;
3007*d83cc019SAndroid Build Coastguard Worker     }
3008*d83cc019SAndroid Build Coastguard Worker 
3009*d83cc019SAndroid Build Coastguard Worker     return size;
3010*d83cc019SAndroid Build Coastguard Worker }
3011*d83cc019SAndroid Build Coastguard Worker 
reset_instruction_src_region(struct brw_instruction * instr,struct src_operand * src)3012*d83cc019SAndroid Build Coastguard Worker static void reset_instruction_src_region(struct brw_instruction *instr,
3013*d83cc019SAndroid Build Coastguard Worker                                          struct src_operand *src)
3014*d83cc019SAndroid Build Coastguard Worker {
3015*d83cc019SAndroid Build Coastguard Worker     if (IS_GENp(8))
3016*d83cc019SAndroid Build Coastguard Worker 	return;
3017*d83cc019SAndroid Build Coastguard Worker 
3018*d83cc019SAndroid Build Coastguard Worker     if (!src->default_region)
3019*d83cc019SAndroid Build Coastguard Worker         return;
3020*d83cc019SAndroid Build Coastguard Worker 
3021*d83cc019SAndroid Build Coastguard Worker     if (src->reg.file == BRW_ARCHITECTURE_REGISTER_FILE &&
3022*d83cc019SAndroid Build Coastguard Worker         ((src->reg.nr & 0xF0) == BRW_ARF_ADDRESS)) {
3023*d83cc019SAndroid Build Coastguard Worker         src->reg.vstride = ffs(0);
3024*d83cc019SAndroid Build Coastguard Worker         src->reg.width = BRW_WIDTH_1;
3025*d83cc019SAndroid Build Coastguard Worker         src->reg.hstride = ffs(0);
3026*d83cc019SAndroid Build Coastguard Worker     } else if (src->reg.file == BRW_ARCHITECTURE_REGISTER_FILE &&
3027*d83cc019SAndroid Build Coastguard Worker                ((src->reg.nr & 0xF0) == BRW_ARF_ACCUMULATOR)) {
3028*d83cc019SAndroid Build Coastguard Worker         int horiz_stride = 1, width, vert_stride;
3029*d83cc019SAndroid Build Coastguard Worker         if (instr->header.compression_control == BRW_COMPRESSION_COMPRESSED) {
3030*d83cc019SAndroid Build Coastguard Worker             width = 16;
3031*d83cc019SAndroid Build Coastguard Worker         } else {
3032*d83cc019SAndroid Build Coastguard Worker             width = 8;
3033*d83cc019SAndroid Build Coastguard Worker         }
3034*d83cc019SAndroid Build Coastguard Worker 
3035*d83cc019SAndroid Build Coastguard Worker         if (width > (1 << instr->header.execution_size))
3036*d83cc019SAndroid Build Coastguard Worker             width = (1 << instr->header.execution_size);
3037*d83cc019SAndroid Build Coastguard Worker 
3038*d83cc019SAndroid Build Coastguard Worker         vert_stride = horiz_stride * width;
3039*d83cc019SAndroid Build Coastguard Worker         src->reg.vstride = ffs(vert_stride);
3040*d83cc019SAndroid Build Coastguard Worker         src->reg.width = ffs(width) - 1;
3041*d83cc019SAndroid Build Coastguard Worker         src->reg.hstride = ffs(horiz_stride);
3042*d83cc019SAndroid Build Coastguard Worker     } else if ((src->reg.file == BRW_ARCHITECTURE_REGISTER_FILE) &&
3043*d83cc019SAndroid Build Coastguard Worker                (src->reg.nr == BRW_ARF_NULL) &&
3044*d83cc019SAndroid Build Coastguard Worker                (instr->header.opcode == BRW_OPCODE_SEND)) {
3045*d83cc019SAndroid Build Coastguard Worker         src->reg.vstride = ffs(8);
3046*d83cc019SAndroid Build Coastguard Worker         src->reg.width = BRW_WIDTH_8;
3047*d83cc019SAndroid Build Coastguard Worker         src->reg.hstride = ffs(1);
3048*d83cc019SAndroid Build Coastguard Worker     } else {
3049*d83cc019SAndroid Build Coastguard Worker 
3050*d83cc019SAndroid Build Coastguard Worker         int horiz_stride = 1, width, vert_stride;
3051*d83cc019SAndroid Build Coastguard Worker 
3052*d83cc019SAndroid Build Coastguard Worker         if (instr->header.execution_size == 0) { /* scalar */
3053*d83cc019SAndroid Build Coastguard Worker             horiz_stride = 0;
3054*d83cc019SAndroid Build Coastguard Worker             width = 1;
3055*d83cc019SAndroid Build Coastguard Worker             vert_stride = 0;
3056*d83cc019SAndroid Build Coastguard Worker         } else {
3057*d83cc019SAndroid Build Coastguard Worker             if ((instr->header.opcode == BRW_OPCODE_MUL) ||
3058*d83cc019SAndroid Build Coastguard Worker                 (instr->header.opcode == BRW_OPCODE_MAC) ||
3059*d83cc019SAndroid Build Coastguard Worker                 (instr->header.opcode == BRW_OPCODE_CMP) ||
3060*d83cc019SAndroid Build Coastguard Worker                 (instr->header.opcode == BRW_OPCODE_ASR) ||
3061*d83cc019SAndroid Build Coastguard Worker                 (instr->header.opcode == BRW_OPCODE_ADD) ||
3062*d83cc019SAndroid Build Coastguard Worker 				(instr->header.opcode == BRW_OPCODE_SHL)) {
3063*d83cc019SAndroid Build Coastguard Worker                 horiz_stride = 0;
3064*d83cc019SAndroid Build Coastguard Worker                 width = 1;
3065*d83cc019SAndroid Build Coastguard Worker                 vert_stride = 0;
3066*d83cc019SAndroid Build Coastguard Worker             } else {
3067*d83cc019SAndroid Build Coastguard Worker                 width = (1 << instr->header.execution_size) / horiz_stride;
3068*d83cc019SAndroid Build Coastguard Worker                 vert_stride = horiz_stride * width;
3069*d83cc019SAndroid Build Coastguard Worker 
3070*d83cc019SAndroid Build Coastguard Worker                 if (get_type_size(src->reg.type) * (width + src->reg.subnr) > 32) {
3071*d83cc019SAndroid Build Coastguard Worker                     horiz_stride = 0;
3072*d83cc019SAndroid Build Coastguard Worker                     width = 1;
3073*d83cc019SAndroid Build Coastguard Worker                     vert_stride = 0;
3074*d83cc019SAndroid Build Coastguard Worker                 }
3075*d83cc019SAndroid Build Coastguard Worker             }
3076*d83cc019SAndroid Build Coastguard Worker         }
3077*d83cc019SAndroid Build Coastguard Worker 
3078*d83cc019SAndroid Build Coastguard Worker         src->reg.vstride = ffs(vert_stride);
3079*d83cc019SAndroid Build Coastguard Worker         src->reg.width = ffs(width) - 1;
3080*d83cc019SAndroid Build Coastguard Worker         src->reg.hstride = ffs(horiz_stride);
3081*d83cc019SAndroid Build Coastguard Worker     }
3082*d83cc019SAndroid Build Coastguard Worker }
3083*d83cc019SAndroid Build Coastguard Worker 
set_instruction_opcode(struct brw_program_instruction * instr,unsigned opcode)3084*d83cc019SAndroid Build Coastguard Worker static void set_instruction_opcode(struct brw_program_instruction *instr,
3085*d83cc019SAndroid Build Coastguard Worker 				  unsigned opcode)
3086*d83cc019SAndroid Build Coastguard Worker {
3087*d83cc019SAndroid Build Coastguard Worker     if (IS_GENp(8))
3088*d83cc019SAndroid Build Coastguard Worker 	gen8_set_opcode(GEN8(instr), opcode);
3089*d83cc019SAndroid Build Coastguard Worker     else
3090*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->header.opcode = opcode;
3091*d83cc019SAndroid Build Coastguard Worker }
3092*d83cc019SAndroid Build Coastguard Worker 
3093*d83cc019SAndroid Build Coastguard Worker /**
3094*d83cc019SAndroid Build Coastguard Worker  * Fills in the destination register information in instr from the bits in dst.
3095*d83cc019SAndroid Build Coastguard Worker  */
set_instruction_dest(struct brw_program_instruction * instr,struct brw_reg * dest)3096*d83cc019SAndroid Build Coastguard Worker static int set_instruction_dest(struct brw_program_instruction *instr,
3097*d83cc019SAndroid Build Coastguard Worker 				struct brw_reg *dest)
3098*d83cc019SAndroid Build Coastguard Worker {
3099*d83cc019SAndroid Build Coastguard Worker 	if (!validate_dst_reg(instr, dest))
3100*d83cc019SAndroid Build Coastguard Worker 		return 1;
3101*d83cc019SAndroid Build Coastguard Worker 
3102*d83cc019SAndroid Build Coastguard Worker 	/* the assembler support expressing subnr in bytes or in number of
3103*d83cc019SAndroid Build Coastguard Worker 	 * elements. */
3104*d83cc019SAndroid Build Coastguard Worker 	resolve_subnr(dest);
3105*d83cc019SAndroid Build Coastguard Worker 
3106*d83cc019SAndroid Build Coastguard Worker 	if (IS_GENp(8)) {
3107*d83cc019SAndroid Build Coastguard Worker 		gen8_set_exec_size(GEN8(instr), dest->width);
3108*d83cc019SAndroid Build Coastguard Worker 		gen8_set_dst(GEN8(instr), *dest);
3109*d83cc019SAndroid Build Coastguard Worker 	} else {
3110*d83cc019SAndroid Build Coastguard Worker 		brw_set_dest(&genasm_compile, GEN(instr), *dest);
3111*d83cc019SAndroid Build Coastguard Worker 	}
3112*d83cc019SAndroid Build Coastguard Worker 
3113*d83cc019SAndroid Build Coastguard Worker 	return 0;
3114*d83cc019SAndroid Build Coastguard Worker }
3115*d83cc019SAndroid Build Coastguard Worker 
3116*d83cc019SAndroid Build Coastguard Worker /* Sets the first source operand for the instruction.  Returns 0 on success. */
set_instruction_src0(struct brw_program_instruction * instr,struct src_operand * src,YYLTYPE * location)3117*d83cc019SAndroid Build Coastguard Worker static int set_instruction_src0(struct brw_program_instruction *instr,
3118*d83cc019SAndroid Build Coastguard Worker 				struct src_operand *src,
3119*d83cc019SAndroid Build Coastguard Worker 				YYLTYPE *location)
3120*d83cc019SAndroid Build Coastguard Worker {
3121*d83cc019SAndroid Build Coastguard Worker 
3122*d83cc019SAndroid Build Coastguard Worker 	if (advanced_flag)
3123*d83cc019SAndroid Build Coastguard Worker 		reset_instruction_src_region(GEN(instr), src);
3124*d83cc019SAndroid Build Coastguard Worker 
3125*d83cc019SAndroid Build Coastguard Worker 	if (!validate_src_reg(instr, src->reg, location))
3126*d83cc019SAndroid Build Coastguard Worker 		return 1;
3127*d83cc019SAndroid Build Coastguard Worker 
3128*d83cc019SAndroid Build Coastguard Worker 	/* the assembler support expressing subnr in bytes or in number of
3129*d83cc019SAndroid Build Coastguard Worker 	 * elements. */
3130*d83cc019SAndroid Build Coastguard Worker 	resolve_subnr(&src->reg);
3131*d83cc019SAndroid Build Coastguard Worker 
3132*d83cc019SAndroid Build Coastguard Worker 	if (IS_GENp(8))
3133*d83cc019SAndroid Build Coastguard Worker 		gen8_set_src0(GEN8(instr), src->reg);
3134*d83cc019SAndroid Build Coastguard Worker 	else
3135*d83cc019SAndroid Build Coastguard Worker 		brw_set_src0(&genasm_compile, GEN(instr), src->reg);
3136*d83cc019SAndroid Build Coastguard Worker 
3137*d83cc019SAndroid Build Coastguard Worker 	return 0;
3138*d83cc019SAndroid Build Coastguard Worker }
3139*d83cc019SAndroid Build Coastguard Worker 
3140*d83cc019SAndroid Build Coastguard Worker /* Sets the second source operand for the instruction.  Returns 0 on success.
3141*d83cc019SAndroid Build Coastguard Worker  */
set_instruction_src1(struct brw_program_instruction * instr,struct src_operand * src,YYLTYPE * location)3142*d83cc019SAndroid Build Coastguard Worker static int set_instruction_src1(struct brw_program_instruction *instr,
3143*d83cc019SAndroid Build Coastguard Worker 				struct src_operand *src,
3144*d83cc019SAndroid Build Coastguard Worker 				YYLTYPE *location)
3145*d83cc019SAndroid Build Coastguard Worker {
3146*d83cc019SAndroid Build Coastguard Worker 	if (advanced_flag)
3147*d83cc019SAndroid Build Coastguard Worker 		reset_instruction_src_region(GEN(instr), src);
3148*d83cc019SAndroid Build Coastguard Worker 
3149*d83cc019SAndroid Build Coastguard Worker 	if (!validate_src_reg(instr, src->reg, location))
3150*d83cc019SAndroid Build Coastguard Worker 		return 1;
3151*d83cc019SAndroid Build Coastguard Worker 
3152*d83cc019SAndroid Build Coastguard Worker 	/* the assembler support expressing subnr in bytes or in number of
3153*d83cc019SAndroid Build Coastguard Worker 	 * elements. */
3154*d83cc019SAndroid Build Coastguard Worker 	resolve_subnr(&src->reg);
3155*d83cc019SAndroid Build Coastguard Worker 
3156*d83cc019SAndroid Build Coastguard Worker 	if (IS_GENp(8))
3157*d83cc019SAndroid Build Coastguard Worker 		gen8_set_src1(GEN8(instr), src->reg);
3158*d83cc019SAndroid Build Coastguard Worker 	else
3159*d83cc019SAndroid Build Coastguard Worker 		brw_set_src1(&genasm_compile, GEN(instr), src->reg);
3160*d83cc019SAndroid Build Coastguard Worker 
3161*d83cc019SAndroid Build Coastguard Worker 	return 0;
3162*d83cc019SAndroid Build Coastguard Worker }
3163*d83cc019SAndroid Build Coastguard Worker 
set_instruction_dest_three_src(struct brw_program_instruction * instr,struct brw_reg * dest)3164*d83cc019SAndroid Build Coastguard Worker static int set_instruction_dest_three_src(struct brw_program_instruction *instr,
3165*d83cc019SAndroid Build Coastguard Worker 					  struct brw_reg *dest)
3166*d83cc019SAndroid Build Coastguard Worker {
3167*d83cc019SAndroid Build Coastguard Worker     resolve_subnr(dest);
3168*d83cc019SAndroid Build Coastguard Worker     brw_set_3src_dest(&genasm_compile, GEN(instr), *dest);
3169*d83cc019SAndroid Build Coastguard Worker     return 0;
3170*d83cc019SAndroid Build Coastguard Worker }
3171*d83cc019SAndroid Build Coastguard Worker 
set_instruction_src0_three_src(struct brw_program_instruction * instr,struct src_operand * src)3172*d83cc019SAndroid Build Coastguard Worker static int set_instruction_src0_three_src(struct brw_program_instruction *instr,
3173*d83cc019SAndroid Build Coastguard Worker 					  struct src_operand *src)
3174*d83cc019SAndroid Build Coastguard Worker {
3175*d83cc019SAndroid Build Coastguard Worker     if (advanced_flag)
3176*d83cc019SAndroid Build Coastguard Worker 	reset_instruction_src_region(GEN(instr), src);
3177*d83cc019SAndroid Build Coastguard Worker 
3178*d83cc019SAndroid Build Coastguard Worker     resolve_subnr(&src->reg);
3179*d83cc019SAndroid Build Coastguard Worker 
3180*d83cc019SAndroid Build Coastguard Worker     // TODO: src0 modifier, src0 rep_ctrl
3181*d83cc019SAndroid Build Coastguard Worker     brw_set_3src_src0(&genasm_compile, GEN(instr), src->reg);
3182*d83cc019SAndroid Build Coastguard Worker     return 0;
3183*d83cc019SAndroid Build Coastguard Worker }
3184*d83cc019SAndroid Build Coastguard Worker 
set_instruction_src1_three_src(struct brw_program_instruction * instr,struct src_operand * src)3185*d83cc019SAndroid Build Coastguard Worker static int set_instruction_src1_three_src(struct brw_program_instruction *instr,
3186*d83cc019SAndroid Build Coastguard Worker 					  struct src_operand *src)
3187*d83cc019SAndroid Build Coastguard Worker {
3188*d83cc019SAndroid Build Coastguard Worker     if (advanced_flag)
3189*d83cc019SAndroid Build Coastguard Worker 	reset_instruction_src_region(GEN(instr), src);
3190*d83cc019SAndroid Build Coastguard Worker 
3191*d83cc019SAndroid Build Coastguard Worker     resolve_subnr(&src->reg);
3192*d83cc019SAndroid Build Coastguard Worker 
3193*d83cc019SAndroid Build Coastguard Worker     // TODO: src1 modifier, src1 rep_ctrl
3194*d83cc019SAndroid Build Coastguard Worker     brw_set_3src_src1(&genasm_compile, GEN(instr), src->reg);
3195*d83cc019SAndroid Build Coastguard Worker     return 0;
3196*d83cc019SAndroid Build Coastguard Worker }
3197*d83cc019SAndroid Build Coastguard Worker 
set_instruction_src2_three_src(struct brw_program_instruction * instr,struct src_operand * src)3198*d83cc019SAndroid Build Coastguard Worker static int set_instruction_src2_three_src(struct brw_program_instruction *instr,
3199*d83cc019SAndroid Build Coastguard Worker 					  struct src_operand *src)
3200*d83cc019SAndroid Build Coastguard Worker {
3201*d83cc019SAndroid Build Coastguard Worker     if (advanced_flag)
3202*d83cc019SAndroid Build Coastguard Worker 	reset_instruction_src_region(GEN(instr), src);
3203*d83cc019SAndroid Build Coastguard Worker 
3204*d83cc019SAndroid Build Coastguard Worker     resolve_subnr(&src->reg);
3205*d83cc019SAndroid Build Coastguard Worker 
3206*d83cc019SAndroid Build Coastguard Worker     // TODO: src2 modifier, src2 rep_ctrl
3207*d83cc019SAndroid Build Coastguard Worker     brw_set_3src_src2(&genasm_compile, GEN(instr), src->reg);
3208*d83cc019SAndroid Build Coastguard Worker     return 0;
3209*d83cc019SAndroid Build Coastguard Worker }
3210*d83cc019SAndroid Build Coastguard Worker 
set_instruction_saturate(struct brw_program_instruction * instr,int saturate)3211*d83cc019SAndroid Build Coastguard Worker static void set_instruction_saturate(struct brw_program_instruction *instr,
3212*d83cc019SAndroid Build Coastguard Worker 				     int saturate)
3213*d83cc019SAndroid Build Coastguard Worker {
3214*d83cc019SAndroid Build Coastguard Worker     if (IS_GENp(8))
3215*d83cc019SAndroid Build Coastguard Worker 	gen8_set_saturate(GEN8(instr), saturate);
3216*d83cc019SAndroid Build Coastguard Worker     else
3217*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->header.saturate = saturate;
3218*d83cc019SAndroid Build Coastguard Worker }
3219*d83cc019SAndroid Build Coastguard Worker 
set_instruction_options(struct brw_program_instruction * instr,struct options options)3220*d83cc019SAndroid Build Coastguard Worker static void set_instruction_options(struct brw_program_instruction *instr,
3221*d83cc019SAndroid Build Coastguard Worker 				    struct options options)
3222*d83cc019SAndroid Build Coastguard Worker {
3223*d83cc019SAndroid Build Coastguard Worker     if (IS_GENp(8)) {
3224*d83cc019SAndroid Build Coastguard Worker 	gen8_set_access_mode(GEN8(instr), options.access_mode);
3225*d83cc019SAndroid Build Coastguard Worker 	gen8_set_thread_control(GEN8(instr), options.thread_control);
3226*d83cc019SAndroid Build Coastguard Worker 	gen8_set_dep_control(GEN8(instr), options.dependency_control);
3227*d83cc019SAndroid Build Coastguard Worker 	gen8_set_mask_control(GEN8(instr), options.mask_control);
3228*d83cc019SAndroid Build Coastguard Worker 	gen8_set_debug_control(GEN8(instr), options.debug_control);
3229*d83cc019SAndroid Build Coastguard Worker 	gen8_set_acc_wr_control(GEN8(instr), options.acc_wr_control);
3230*d83cc019SAndroid Build Coastguard Worker 	gen8_set_eot(GEN8(instr), options.end_of_thread);
3231*d83cc019SAndroid Build Coastguard Worker     } else {
3232*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->header.access_mode = options.access_mode;
3233*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->header.compression_control = options.compression_control;
3234*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->header.thread_control = options.thread_control;
3235*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->header.dependency_control = options.dependency_control;
3236*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->header.mask_control = options.mask_control;
3237*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->header.debug_control = options.debug_control;
3238*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->header.acc_wr_control = options.acc_wr_control;
3239*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->bits3.generic.end_of_thread = options.end_of_thread;
3240*d83cc019SAndroid Build Coastguard Worker     }
3241*d83cc019SAndroid Build Coastguard Worker }
3242*d83cc019SAndroid Build Coastguard Worker 
set_instruction_predicate(struct brw_program_instruction * instr,struct predicate * p)3243*d83cc019SAndroid Build Coastguard Worker static void set_instruction_predicate(struct brw_program_instruction *instr,
3244*d83cc019SAndroid Build Coastguard Worker 				      struct predicate *p)
3245*d83cc019SAndroid Build Coastguard Worker {
3246*d83cc019SAndroid Build Coastguard Worker     if (IS_GENp(8)) {
3247*d83cc019SAndroid Build Coastguard Worker 	gen8_set_pred_control(GEN8(instr), p->pred_control);
3248*d83cc019SAndroid Build Coastguard Worker 	gen8_set_pred_inv(GEN8(instr), p->pred_inverse);
3249*d83cc019SAndroid Build Coastguard Worker 	gen8_set_flag_reg_nr(GEN8(instr), p->flag_reg_nr);
3250*d83cc019SAndroid Build Coastguard Worker 	gen8_set_flag_subreg_nr(GEN8(instr), p->flag_subreg_nr);
3251*d83cc019SAndroid Build Coastguard Worker     } else {
3252*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->header.predicate_control = p->pred_control;
3253*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->header.predicate_inverse = p->pred_inverse;
3254*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->bits2.da1.flag_reg_nr = p->flag_reg_nr;
3255*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->bits2.da1.flag_subreg_nr = p->flag_subreg_nr;
3256*d83cc019SAndroid Build Coastguard Worker     }
3257*d83cc019SAndroid Build Coastguard Worker }
3258*d83cc019SAndroid Build Coastguard Worker 
set_instruction_pred_cond(struct brw_program_instruction * instr,struct predicate * p,struct condition * c,YYLTYPE * location)3259*d83cc019SAndroid Build Coastguard Worker static void set_instruction_pred_cond(struct brw_program_instruction *instr,
3260*d83cc019SAndroid Build Coastguard Worker 				      struct predicate *p,
3261*d83cc019SAndroid Build Coastguard Worker 				      struct condition *c,
3262*d83cc019SAndroid Build Coastguard Worker 				      YYLTYPE *location)
3263*d83cc019SAndroid Build Coastguard Worker {
3264*d83cc019SAndroid Build Coastguard Worker     set_instruction_predicate(instr, p);
3265*d83cc019SAndroid Build Coastguard Worker 
3266*d83cc019SAndroid Build Coastguard Worker     if (IS_GENp(8))
3267*d83cc019SAndroid Build Coastguard Worker 	gen8_set_cond_modifier(GEN8(instr), c->cond);
3268*d83cc019SAndroid Build Coastguard Worker     else
3269*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->header.destreg__conditionalmod = c->cond;
3270*d83cc019SAndroid Build Coastguard Worker 
3271*d83cc019SAndroid Build Coastguard Worker     if (c->flag_subreg_nr == -1)
3272*d83cc019SAndroid Build Coastguard Worker 	return;
3273*d83cc019SAndroid Build Coastguard Worker 
3274*d83cc019SAndroid Build Coastguard Worker     if (p->pred_control != BRW_PREDICATE_NONE &&
3275*d83cc019SAndroid Build Coastguard Worker 	(p->flag_reg_nr != c->flag_reg_nr ||
3276*d83cc019SAndroid Build Coastguard Worker 	 p->flag_subreg_nr != c->flag_subreg_nr))
3277*d83cc019SAndroid Build Coastguard Worker     {
3278*d83cc019SAndroid Build Coastguard Worker 	warn(ALWAYS, location, "must use the same flag register if both "
3279*d83cc019SAndroid Build Coastguard Worker 	     "prediction and conditional modifier are enabled\n");
3280*d83cc019SAndroid Build Coastguard Worker     }
3281*d83cc019SAndroid Build Coastguard Worker 
3282*d83cc019SAndroid Build Coastguard Worker     if (IS_GENp(8)) {
3283*d83cc019SAndroid Build Coastguard Worker 	gen8_set_flag_reg_nr(GEN8(instr), c->flag_reg_nr);
3284*d83cc019SAndroid Build Coastguard Worker 	gen8_set_flag_subreg_nr(GEN8(instr), c->flag_subreg_nr);
3285*d83cc019SAndroid Build Coastguard Worker     } else {
3286*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->bits2.da1.flag_reg_nr = c->flag_reg_nr;
3287*d83cc019SAndroid Build Coastguard Worker 	GEN(instr)->bits2.da1.flag_subreg_nr = c->flag_subreg_nr;
3288*d83cc019SAndroid Build Coastguard Worker     }
3289*d83cc019SAndroid Build Coastguard Worker }
3290*d83cc019SAndroid Build Coastguard Worker 
set_direct_dst_operand(struct brw_reg * dst,struct brw_reg * reg,int type)3291*d83cc019SAndroid Build Coastguard Worker static void set_direct_dst_operand(struct brw_reg *dst, struct brw_reg *reg,
3292*d83cc019SAndroid Build Coastguard Worker 				   int type)
3293*d83cc019SAndroid Build Coastguard Worker {
3294*d83cc019SAndroid Build Coastguard Worker 	*dst = *reg;
3295*d83cc019SAndroid Build Coastguard Worker 	dst->address_mode = BRW_ADDRESS_DIRECT;
3296*d83cc019SAndroid Build Coastguard Worker 	dst->type = type;
3297*d83cc019SAndroid Build Coastguard Worker 	dst->hstride = 1;
3298*d83cc019SAndroid Build Coastguard Worker 	dst->dw1.bits.writemask = BRW_WRITEMASK_XYZW;
3299*d83cc019SAndroid Build Coastguard Worker }
3300*d83cc019SAndroid Build Coastguard Worker 
set_direct_src_operand(struct src_operand * src,struct brw_reg * reg,int type)3301*d83cc019SAndroid Build Coastguard Worker static void set_direct_src_operand(struct src_operand *src, struct brw_reg *reg,
3302*d83cc019SAndroid Build Coastguard Worker 				   int type)
3303*d83cc019SAndroid Build Coastguard Worker {
3304*d83cc019SAndroid Build Coastguard Worker 	memset(src, 0, sizeof(*src));
3305*d83cc019SAndroid Build Coastguard Worker 	src->reg.address_mode = BRW_ADDRESS_DIRECT;
3306*d83cc019SAndroid Build Coastguard Worker 	src->reg.file = reg->file;
3307*d83cc019SAndroid Build Coastguard Worker 	src->reg.type = type;
3308*d83cc019SAndroid Build Coastguard Worker 	src->reg.subnr = reg->subnr;
3309*d83cc019SAndroid Build Coastguard Worker 	src->reg.nr = reg->nr;
3310*d83cc019SAndroid Build Coastguard Worker 	src->reg.vstride = 0;
3311*d83cc019SAndroid Build Coastguard Worker 	src->reg.width = 0;
3312*d83cc019SAndroid Build Coastguard Worker 	src->reg.hstride = 0;
3313*d83cc019SAndroid Build Coastguard Worker 	src->reg.negate = 0;
3314*d83cc019SAndroid Build Coastguard Worker 	src->reg.abs = 0;
3315*d83cc019SAndroid Build Coastguard Worker 	SWIZZLE(src->reg) = BRW_SWIZZLE_NOOP;
3316*d83cc019SAndroid Build Coastguard Worker }
3317*d83cc019SAndroid Build Coastguard Worker 
instruction_opcode(struct brw_program_instruction * insn)3318*d83cc019SAndroid Build Coastguard Worker static inline int instruction_opcode(struct brw_program_instruction *insn)
3319*d83cc019SAndroid Build Coastguard Worker {
3320*d83cc019SAndroid Build Coastguard Worker     if (IS_GENp(8))
3321*d83cc019SAndroid Build Coastguard Worker 	return gen8_opcode(GEN8(insn));
3322*d83cc019SAndroid Build Coastguard Worker     else
3323*d83cc019SAndroid Build Coastguard Worker 	return GEN(insn)->header.opcode;
3324*d83cc019SAndroid Build Coastguard Worker }
3325*d83cc019SAndroid Build Coastguard Worker 
3326*d83cc019SAndroid Build Coastguard Worker /*
3327*d83cc019SAndroid Build Coastguard Worker  * return the offset used in native flow control (branch) instructions
3328*d83cc019SAndroid Build Coastguard Worker  */
branch_offset(struct brw_program_instruction * insn,int offset)3329*d83cc019SAndroid Build Coastguard Worker static inline int branch_offset(struct brw_program_instruction *insn, int offset)
3330*d83cc019SAndroid Build Coastguard Worker {
3331*d83cc019SAndroid Build Coastguard Worker     /*
3332*d83cc019SAndroid Build Coastguard Worker      * bspec: Unlike other flow control instructions, the offset used by JMPI
3333*d83cc019SAndroid Build Coastguard Worker      * is relative to the incremented instruction pointer rather than the IP
3334*d83cc019SAndroid Build Coastguard Worker      * value for the instruction itself.
3335*d83cc019SAndroid Build Coastguard Worker      */
3336*d83cc019SAndroid Build Coastguard Worker     if (instruction_opcode(insn) == BRW_OPCODE_JMPI)
3337*d83cc019SAndroid Build Coastguard Worker         offset--;
3338*d83cc019SAndroid Build Coastguard Worker 
3339*d83cc019SAndroid Build Coastguard Worker     /*
3340*d83cc019SAndroid Build Coastguard Worker      * Gen4- bspec: the jump distance is in number of sixteen-byte units
3341*d83cc019SAndroid Build Coastguard Worker      * Gen5+ bspec: the jump distance is in number of eight-byte units
3342*d83cc019SAndroid Build Coastguard Worker      * Gen7.5+: the offset is in unit of 8bits for JMPI, 64bits for other flow
3343*d83cc019SAndroid Build Coastguard Worker      * control instructions
3344*d83cc019SAndroid Build Coastguard Worker      */
3345*d83cc019SAndroid Build Coastguard Worker     if (gen_level >= 75 &&
3346*d83cc019SAndroid Build Coastguard Worker         (instruction_opcode(insn) == BRW_OPCODE_JMPI))
3347*d83cc019SAndroid Build Coastguard Worker         offset *= 16;
3348*d83cc019SAndroid Build Coastguard Worker     else if (gen_level >= 50)
3349*d83cc019SAndroid Build Coastguard Worker         offset *= 2;
3350*d83cc019SAndroid Build Coastguard Worker 
3351*d83cc019SAndroid Build Coastguard Worker     return offset;
3352*d83cc019SAndroid Build Coastguard Worker }
3353*d83cc019SAndroid Build Coastguard Worker 
set_branch_two_offsets(struct brw_program_instruction * insn,int jip_offset,int uip_offset)3354*d83cc019SAndroid Build Coastguard Worker void set_branch_two_offsets(struct brw_program_instruction *insn, int jip_offset, int uip_offset)
3355*d83cc019SAndroid Build Coastguard Worker {
3356*d83cc019SAndroid Build Coastguard Worker     int jip = branch_offset(insn, jip_offset);
3357*d83cc019SAndroid Build Coastguard Worker     int uip = branch_offset(insn, uip_offset);
3358*d83cc019SAndroid Build Coastguard Worker 
3359*d83cc019SAndroid Build Coastguard Worker     assert(instruction_opcode(insn) != BRW_OPCODE_JMPI);
3360*d83cc019SAndroid Build Coastguard Worker 
3361*d83cc019SAndroid Build Coastguard Worker     if (IS_GENp(8)) {
3362*d83cc019SAndroid Build Coastguard Worker         gen8_set_jip(GEN8(insn), jip);
3363*d83cc019SAndroid Build Coastguard Worker 	gen8_set_uip(GEN8(insn), uip);
3364*d83cc019SAndroid Build Coastguard Worker     } else {
3365*d83cc019SAndroid Build Coastguard Worker         GEN(insn)->bits3.break_cont.jip = jip;
3366*d83cc019SAndroid Build Coastguard Worker         GEN(insn)->bits3.break_cont.uip = uip;
3367*d83cc019SAndroid Build Coastguard Worker     }
3368*d83cc019SAndroid Build Coastguard Worker }
3369*d83cc019SAndroid Build Coastguard Worker 
set_branch_one_offset(struct brw_program_instruction * insn,int jip_offset)3370*d83cc019SAndroid Build Coastguard Worker void set_branch_one_offset(struct brw_program_instruction *insn, int jip_offset)
3371*d83cc019SAndroid Build Coastguard Worker {
3372*d83cc019SAndroid Build Coastguard Worker     int jip = branch_offset(insn, jip_offset);
3373*d83cc019SAndroid Build Coastguard Worker 
3374*d83cc019SAndroid Build Coastguard Worker     if (IS_GENp(8)) {
3375*d83cc019SAndroid Build Coastguard Worker         gen8_set_jip(GEN8(insn), jip);
3376*d83cc019SAndroid Build Coastguard Worker     } else if (IS_GENx(7)) {
3377*d83cc019SAndroid Build Coastguard Worker         /* Gen7 JMPI Restrictions in bspec:
3378*d83cc019SAndroid Build Coastguard Worker          * The JIP data type must be Signed DWord
3379*d83cc019SAndroid Build Coastguard Worker          */
3380*d83cc019SAndroid Build Coastguard Worker         if (instruction_opcode(insn) == BRW_OPCODE_JMPI)
3381*d83cc019SAndroid Build Coastguard Worker             GEN(insn)->bits3.JIP = jip;
3382*d83cc019SAndroid Build Coastguard Worker         else
3383*d83cc019SAndroid Build Coastguard Worker             GEN(insn)->bits3.break_cont.jip = jip;
3384*d83cc019SAndroid Build Coastguard Worker     } else if (IS_GENx(6)) {
3385*d83cc019SAndroid Build Coastguard Worker         if ((instruction_opcode(insn) == BRW_OPCODE_CALL) ||
3386*d83cc019SAndroid Build Coastguard Worker             (instruction_opcode(insn) == BRW_OPCODE_JMPI))
3387*d83cc019SAndroid Build Coastguard Worker             GEN(insn)->bits3.JIP = jip;
3388*d83cc019SAndroid Build Coastguard Worker         else
3389*d83cc019SAndroid Build Coastguard Worker             GEN(insn)->bits1.branch_gen6.jump_count = jip; // for CASE,ELSE,FORK,IF,WHILE
3390*d83cc019SAndroid Build Coastguard Worker     } else {
3391*d83cc019SAndroid Build Coastguard Worker         GEN(insn)->bits3.JIP = jip;
3392*d83cc019SAndroid Build Coastguard Worker 
3393*d83cc019SAndroid Build Coastguard Worker         if (instruction_opcode(insn) == BRW_OPCODE_ELSE)
3394*d83cc019SAndroid Build Coastguard Worker             GEN(insn)->bits3.break_cont.uip = 1; // Set the istack pop count, which must always be 1.
3395*d83cc019SAndroid Build Coastguard Worker     }
3396*d83cc019SAndroid Build Coastguard Worker }
3397