xref: /aosp_15_r20/external/mesa3d/src/intel/compiler/brw_gram.y (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker %{
2*61046927SAndroid Build Coastguard Worker /*
3*61046927SAndroid Build Coastguard Worker  * Copyright © 2018 Intel Corporation
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
6*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
7*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
8*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
10*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
11*61046927SAndroid Build Coastguard Worker  *
12*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
13*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
14*61046927SAndroid Build Coastguard Worker  * Software.
15*61046927SAndroid Build Coastguard Worker  *
16*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
23*61046927SAndroid Build Coastguard Worker  */
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker #include <stdio.h>
26*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
27*61046927SAndroid Build Coastguard Worker #include <string.h>
28*61046927SAndroid Build Coastguard Worker #include <strings.h>
29*61046927SAndroid Build Coastguard Worker #include "brw_asm_internal.h"
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker #undef yyerror
32*61046927SAndroid Build Coastguard Worker #ifdef YYBYACC
33*61046927SAndroid Build Coastguard Worker struct YYLTYPE;
34*61046927SAndroid Build Coastguard Worker void yyerror (struct YYLTYPE *, char *);
35*61046927SAndroid Build Coastguard Worker #else
36*61046927SAndroid Build Coastguard Worker void yyerror (char *);
37*61046927SAndroid Build Coastguard Worker #endif
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker #undef ALIGN16
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker #define YYLTYPE YYLTYPE
42*61046927SAndroid Build Coastguard Worker typedef struct YYLTYPE
43*61046927SAndroid Build Coastguard Worker {
44*61046927SAndroid Build Coastguard Worker 	int first_line;
45*61046927SAndroid Build Coastguard Worker 	int first_column;
46*61046927SAndroid Build Coastguard Worker 	int last_line;
47*61046927SAndroid Build Coastguard Worker 	int last_column;
48*61046927SAndroid Build Coastguard Worker } YYLTYPE;
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker enum message_level {
51*61046927SAndroid Build Coastguard Worker 	WARN,
52*61046927SAndroid Build Coastguard Worker 	ERROR,
53*61046927SAndroid Build Coastguard Worker };
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker int yydebug = 1;
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker static void
message(enum message_level level,YYLTYPE * location,const char * fmt,...)58*61046927SAndroid Build Coastguard Worker message(enum message_level level, YYLTYPE *location,
59*61046927SAndroid Build Coastguard Worker 	const char *fmt, ...)
60*61046927SAndroid Build Coastguard Worker {
61*61046927SAndroid Build Coastguard Worker 	static const char *level_str[] = { "warning", "error" };
62*61046927SAndroid Build Coastguard Worker 	va_list args;
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker 	if (location)
65*61046927SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:%d:%d: %s: ", input_filename,
66*61046927SAndroid Build Coastguard Worker 		        location->first_line,
67*61046927SAndroid Build Coastguard Worker 		        location->first_column, level_str[level]);
68*61046927SAndroid Build Coastguard Worker 	else
69*61046927SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:%s: ", input_filename, level_str[level]);
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker 	va_start(args, fmt);
72*61046927SAndroid Build Coastguard Worker 	vfprintf(stderr, fmt, args);
73*61046927SAndroid Build Coastguard Worker 	va_end(args);
74*61046927SAndroid Build Coastguard Worker }
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker #define warn(flag, l, fmt, ...) 				 \
77*61046927SAndroid Build Coastguard Worker 	do {							 \
78*61046927SAndroid Build Coastguard Worker 		if (warning_flags & WARN_ ## flag)		 \
79*61046927SAndroid Build Coastguard Worker 			message(WARN, l, fmt, ## __VA_ARGS__);	 \
80*61046927SAndroid Build Coastguard Worker 	} while (0)
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker #define error(l, fmt, ...)				   	 \
83*61046927SAndroid Build Coastguard Worker 	do {						   	 \
84*61046927SAndroid Build Coastguard Worker 		message(ERROR, l, fmt, ## __VA_ARGS__);	   	 \
85*61046927SAndroid Build Coastguard Worker 	} while (0)
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker static bool
isPowerofTwo(unsigned int x)88*61046927SAndroid Build Coastguard Worker isPowerofTwo(unsigned int x)
89*61046927SAndroid Build Coastguard Worker {
90*61046927SAndroid Build Coastguard Worker 	return x && (!(x & (x - 1)));
91*61046927SAndroid Build Coastguard Worker }
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker static struct brw_reg
set_direct_src_operand(struct brw_reg * reg,int type)94*61046927SAndroid Build Coastguard Worker set_direct_src_operand(struct brw_reg *reg, int type)
95*61046927SAndroid Build Coastguard Worker {
96*61046927SAndroid Build Coastguard Worker 	return brw_make_reg(reg->file,
97*61046927SAndroid Build Coastguard Worker                             reg->nr,
98*61046927SAndroid Build Coastguard Worker                             reg->subnr,
99*61046927SAndroid Build Coastguard Worker                             0,		// negate
100*61046927SAndroid Build Coastguard Worker                             0,		// abs
101*61046927SAndroid Build Coastguard Worker                             type,
102*61046927SAndroid Build Coastguard Worker                             0,		// vstride
103*61046927SAndroid Build Coastguard Worker                             0,		// width
104*61046927SAndroid Build Coastguard Worker                             0,		// hstride
105*61046927SAndroid Build Coastguard Worker                             BRW_SWIZZLE_NOOP,
106*61046927SAndroid Build Coastguard Worker                             WRITEMASK_XYZW);
107*61046927SAndroid Build Coastguard Worker }
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker static void
i965_asm_unary_instruction(int opcode,struct brw_codegen * p,struct brw_reg dest,struct brw_reg src0)110*61046927SAndroid Build Coastguard Worker i965_asm_unary_instruction(int opcode, struct brw_codegen *p,
111*61046927SAndroid Build Coastguard Worker 		           struct brw_reg dest, struct brw_reg src0)
112*61046927SAndroid Build Coastguard Worker {
113*61046927SAndroid Build Coastguard Worker 	switch (opcode) {
114*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_BFREV:
115*61046927SAndroid Build Coastguard Worker 		brw_BFREV(p, dest, src0);
116*61046927SAndroid Build Coastguard Worker 		break;
117*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_CBIT:
118*61046927SAndroid Build Coastguard Worker 		brw_CBIT(p, dest, src0);
119*61046927SAndroid Build Coastguard Worker 		break;
120*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_MOV:
121*61046927SAndroid Build Coastguard Worker 		brw_MOV(p, dest, src0);
122*61046927SAndroid Build Coastguard Worker 		break;
123*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_FBL:
124*61046927SAndroid Build Coastguard Worker 		brw_FBL(p, dest, src0);
125*61046927SAndroid Build Coastguard Worker 		break;
126*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_FRC:
127*61046927SAndroid Build Coastguard Worker 		brw_FRC(p, dest, src0);
128*61046927SAndroid Build Coastguard Worker 		break;
129*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_FBH:
130*61046927SAndroid Build Coastguard Worker 		brw_FBH(p, dest, src0);
131*61046927SAndroid Build Coastguard Worker 		break;
132*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_NOT:
133*61046927SAndroid Build Coastguard Worker 		brw_NOT(p, dest, src0);
134*61046927SAndroid Build Coastguard Worker 		break;
135*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_RNDE:
136*61046927SAndroid Build Coastguard Worker 		brw_RNDE(p, dest, src0);
137*61046927SAndroid Build Coastguard Worker 		break;
138*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_RNDZ:
139*61046927SAndroid Build Coastguard Worker 		brw_RNDZ(p, dest, src0);
140*61046927SAndroid Build Coastguard Worker 		break;
141*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_RNDD:
142*61046927SAndroid Build Coastguard Worker 		brw_RNDD(p, dest, src0);
143*61046927SAndroid Build Coastguard Worker 		break;
144*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_LZD:
145*61046927SAndroid Build Coastguard Worker 		brw_LZD(p, dest, src0);
146*61046927SAndroid Build Coastguard Worker 		break;
147*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_RNDU:
148*61046927SAndroid Build Coastguard Worker 		fprintf(stderr, "Opcode BRW_OPCODE_RNDU unhandled\n");
149*61046927SAndroid Build Coastguard Worker 		break;
150*61046927SAndroid Build Coastguard Worker 	default:
151*61046927SAndroid Build Coastguard Worker 		fprintf(stderr, "Unsupported unary opcode\n");
152*61046927SAndroid Build Coastguard Worker 	}
153*61046927SAndroid Build Coastguard Worker }
154*61046927SAndroid Build Coastguard Worker 
155*61046927SAndroid Build Coastguard Worker static void
i965_asm_binary_instruction(int opcode,struct brw_codegen * p,struct brw_reg dest,struct brw_reg src0,struct brw_reg src1)156*61046927SAndroid Build Coastguard Worker i965_asm_binary_instruction(int opcode,
157*61046927SAndroid Build Coastguard Worker 			    struct brw_codegen *p,
158*61046927SAndroid Build Coastguard Worker 			    struct brw_reg dest,
159*61046927SAndroid Build Coastguard Worker 			    struct brw_reg src0,
160*61046927SAndroid Build Coastguard Worker 			    struct brw_reg src1)
161*61046927SAndroid Build Coastguard Worker {
162*61046927SAndroid Build Coastguard Worker 	switch (opcode) {
163*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_ADDC:
164*61046927SAndroid Build Coastguard Worker 		brw_ADDC(p, dest, src0, src1);
165*61046927SAndroid Build Coastguard Worker 		break;
166*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_BFI1:
167*61046927SAndroid Build Coastguard Worker 		brw_BFI1(p, dest, src0, src1);
168*61046927SAndroid Build Coastguard Worker 		break;
169*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_DP2:
170*61046927SAndroid Build Coastguard Worker 		brw_DP2(p, dest, src0, src1);
171*61046927SAndroid Build Coastguard Worker 		break;
172*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_DP3:
173*61046927SAndroid Build Coastguard Worker 		brw_DP3(p, dest, src0, src1);
174*61046927SAndroid Build Coastguard Worker 		break;
175*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_DP4:
176*61046927SAndroid Build Coastguard Worker 		brw_DP4(p, dest, src0, src1);
177*61046927SAndroid Build Coastguard Worker 		break;
178*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_DPH:
179*61046927SAndroid Build Coastguard Worker 		brw_DPH(p, dest, src0, src1);
180*61046927SAndroid Build Coastguard Worker 		break;
181*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_LINE:
182*61046927SAndroid Build Coastguard Worker 		brw_LINE(p, dest, src0, src1);
183*61046927SAndroid Build Coastguard Worker 		break;
184*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_MAC:
185*61046927SAndroid Build Coastguard Worker 		brw_MAC(p, dest, src0, src1);
186*61046927SAndroid Build Coastguard Worker 		break;
187*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_MACH:
188*61046927SAndroid Build Coastguard Worker 		brw_MACH(p, dest, src0, src1);
189*61046927SAndroid Build Coastguard Worker 		break;
190*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_PLN:
191*61046927SAndroid Build Coastguard Worker 		brw_PLN(p, dest, src0, src1);
192*61046927SAndroid Build Coastguard Worker 		break;
193*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_ROL:
194*61046927SAndroid Build Coastguard Worker 		brw_ROL(p, dest, src0, src1);
195*61046927SAndroid Build Coastguard Worker 		break;
196*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_ROR:
197*61046927SAndroid Build Coastguard Worker 		brw_ROR(p, dest, src0, src1);
198*61046927SAndroid Build Coastguard Worker 		break;
199*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_SUBB:
200*61046927SAndroid Build Coastguard Worker 		brw_SUBB(p, dest, src0, src1);
201*61046927SAndroid Build Coastguard Worker 		break;
202*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_ADD:
203*61046927SAndroid Build Coastguard Worker 		brw_ADD(p, dest, src0, src1);
204*61046927SAndroid Build Coastguard Worker 		break;
205*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_CMP:
206*61046927SAndroid Build Coastguard Worker 		/* Third parameter is conditional modifier
207*61046927SAndroid Build Coastguard Worker 		 * which gets updated later
208*61046927SAndroid Build Coastguard Worker 		 */
209*61046927SAndroid Build Coastguard Worker 		brw_CMP(p, dest, 0, src0, src1);
210*61046927SAndroid Build Coastguard Worker 		break;
211*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_AND:
212*61046927SAndroid Build Coastguard Worker 		brw_AND(p, dest, src0, src1);
213*61046927SAndroid Build Coastguard Worker 		break;
214*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_ASR:
215*61046927SAndroid Build Coastguard Worker 		brw_ASR(p, dest, src0, src1);
216*61046927SAndroid Build Coastguard Worker 		break;
217*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_AVG:
218*61046927SAndroid Build Coastguard Worker 		brw_AVG(p, dest, src0, src1);
219*61046927SAndroid Build Coastguard Worker 		break;
220*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_OR:
221*61046927SAndroid Build Coastguard Worker 		brw_OR(p, dest, src0, src1);
222*61046927SAndroid Build Coastguard Worker 		break;
223*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_SEL:
224*61046927SAndroid Build Coastguard Worker 		brw_SEL(p, dest, src0, src1);
225*61046927SAndroid Build Coastguard Worker 		break;
226*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_SHL:
227*61046927SAndroid Build Coastguard Worker 		brw_SHL(p, dest, src0, src1);
228*61046927SAndroid Build Coastguard Worker 		break;
229*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_SHR:
230*61046927SAndroid Build Coastguard Worker 		brw_SHR(p, dest, src0, src1);
231*61046927SAndroid Build Coastguard Worker 		break;
232*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_XOR:
233*61046927SAndroid Build Coastguard Worker 		brw_XOR(p, dest, src0, src1);
234*61046927SAndroid Build Coastguard Worker 		break;
235*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_MUL:
236*61046927SAndroid Build Coastguard Worker 		brw_MUL(p, dest, src0, src1);
237*61046927SAndroid Build Coastguard Worker 		break;
238*61046927SAndroid Build Coastguard Worker 	default:
239*61046927SAndroid Build Coastguard Worker 		fprintf(stderr, "Unsupported binary opcode\n");
240*61046927SAndroid Build Coastguard Worker 	}
241*61046927SAndroid Build Coastguard Worker }
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker static void
i965_asm_ternary_instruction(int opcode,struct brw_codegen * p,struct brw_reg dest,struct brw_reg src0,struct brw_reg src1,struct brw_reg src2)244*61046927SAndroid Build Coastguard Worker i965_asm_ternary_instruction(int opcode,
245*61046927SAndroid Build Coastguard Worker 			     struct brw_codegen *p,
246*61046927SAndroid Build Coastguard Worker 			     struct brw_reg dest,
247*61046927SAndroid Build Coastguard Worker 			     struct brw_reg src0,
248*61046927SAndroid Build Coastguard Worker 			     struct brw_reg src1,
249*61046927SAndroid Build Coastguard Worker 			     struct brw_reg src2)
250*61046927SAndroid Build Coastguard Worker {
251*61046927SAndroid Build Coastguard Worker 	switch (opcode) {
252*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_MAD:
253*61046927SAndroid Build Coastguard Worker 		brw_MAD(p, dest, src0, src1, src2);
254*61046927SAndroid Build Coastguard Worker 		break;
255*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_CSEL:
256*61046927SAndroid Build Coastguard Worker 		brw_CSEL(p, dest, src0, src1, src2);
257*61046927SAndroid Build Coastguard Worker 		break;
258*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_LRP:
259*61046927SAndroid Build Coastguard Worker 		brw_LRP(p, dest, src0, src1, src2);
260*61046927SAndroid Build Coastguard Worker 		break;
261*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_BFE:
262*61046927SAndroid Build Coastguard Worker 		brw_BFE(p, dest, src0, src1, src2);
263*61046927SAndroid Build Coastguard Worker 		break;
264*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_BFI2:
265*61046927SAndroid Build Coastguard Worker 		brw_BFI2(p, dest, src0, src1, src2);
266*61046927SAndroid Build Coastguard Worker 		break;
267*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_DP4A:
268*61046927SAndroid Build Coastguard Worker 		brw_DP4A(p, dest, src0, src1, src2);
269*61046927SAndroid Build Coastguard Worker 		break;
270*61046927SAndroid Build Coastguard Worker 	case BRW_OPCODE_ADD3:
271*61046927SAndroid Build Coastguard Worker 		brw_ADD3(p, dest, src0, src1, src2);
272*61046927SAndroid Build Coastguard Worker 		break;
273*61046927SAndroid Build Coastguard Worker 	default:
274*61046927SAndroid Build Coastguard Worker 		fprintf(stderr, "Unsupported ternary opcode\n");
275*61046927SAndroid Build Coastguard Worker 	}
276*61046927SAndroid Build Coastguard Worker }
277*61046927SAndroid Build Coastguard Worker 
278*61046927SAndroid Build Coastguard Worker static void
i965_asm_set_instruction_options(struct brw_codegen * p,struct options options)279*61046927SAndroid Build Coastguard Worker i965_asm_set_instruction_options(struct brw_codegen *p,
280*61046927SAndroid Build Coastguard Worker 				 struct options options)
281*61046927SAndroid Build Coastguard Worker {
282*61046927SAndroid Build Coastguard Worker 	brw_inst_set_access_mode(p->devinfo, brw_last_inst,
283*61046927SAndroid Build Coastguard Worker 			         options.access_mode);
284*61046927SAndroid Build Coastguard Worker 	brw_inst_set_mask_control(p->devinfo, brw_last_inst,
285*61046927SAndroid Build Coastguard Worker 				  options.mask_control);
286*61046927SAndroid Build Coastguard Worker 	if (p->devinfo->ver < 12) {
287*61046927SAndroid Build Coastguard Worker 		brw_inst_set_thread_control(p->devinfo, brw_last_inst,
288*61046927SAndroid Build Coastguard Worker 					    options.thread_control);
289*61046927SAndroid Build Coastguard Worker 		brw_inst_set_no_dd_check(p->devinfo, brw_last_inst,
290*61046927SAndroid Build Coastguard Worker 					 options.no_dd_check);
291*61046927SAndroid Build Coastguard Worker 		brw_inst_set_no_dd_clear(p->devinfo, brw_last_inst,
292*61046927SAndroid Build Coastguard Worker 					 options.no_dd_clear);
293*61046927SAndroid Build Coastguard Worker 	} else {
294*61046927SAndroid Build Coastguard Worker 		enum opcode opcode = brw_inst_opcode(p->isa, brw_last_inst);
295*61046927SAndroid Build Coastguard Worker 		brw_inst_set_swsb(p->devinfo, brw_last_inst,
296*61046927SAndroid Build Coastguard Worker 		                  tgl_swsb_encode(p->devinfo, options.depinfo,
297*61046927SAndroid Build Coastguard Worker 						  opcode));
298*61046927SAndroid Build Coastguard Worker 	}
299*61046927SAndroid Build Coastguard Worker 	brw_inst_set_debug_control(p->devinfo, brw_last_inst,
300*61046927SAndroid Build Coastguard Worker 			           options.debug_control);
301*61046927SAndroid Build Coastguard Worker 	if (p->devinfo->ver < 20) {
302*61046927SAndroid Build Coastguard Worker 		brw_inst_set_acc_wr_control(p->devinfo, brw_last_inst,
303*61046927SAndroid Build Coastguard Worker 					    options.acc_wr_control);
304*61046927SAndroid Build Coastguard Worker 	}
305*61046927SAndroid Build Coastguard Worker 	brw_inst_set_cmpt_control(p->devinfo, brw_last_inst,
306*61046927SAndroid Build Coastguard Worker 				  options.compaction);
307*61046927SAndroid Build Coastguard Worker }
308*61046927SAndroid Build Coastguard Worker 
309*61046927SAndroid Build Coastguard Worker static void
add_label(struct brw_codegen * p,const char * label_name,enum instr_label_type type)310*61046927SAndroid Build Coastguard Worker add_label(struct brw_codegen *p, const char* label_name, enum instr_label_type type)
311*61046927SAndroid Build Coastguard Worker {
312*61046927SAndroid Build Coastguard Worker 	if (!label_name) {
313*61046927SAndroid Build Coastguard Worker 		return;
314*61046927SAndroid Build Coastguard Worker 	}
315*61046927SAndroid Build Coastguard Worker 
316*61046927SAndroid Build Coastguard Worker 	struct instr_label *label = rzalloc(p->mem_ctx, struct instr_label);
317*61046927SAndroid Build Coastguard Worker 
318*61046927SAndroid Build Coastguard Worker 	label->name = ralloc_strdup(p->mem_ctx, label_name);
319*61046927SAndroid Build Coastguard Worker 	label->offset = p->next_insn_offset;
320*61046927SAndroid Build Coastguard Worker 	label->type = type;
321*61046927SAndroid Build Coastguard Worker 
322*61046927SAndroid Build Coastguard Worker 	list_addtail(&label->link, &instr_labels);
323*61046927SAndroid Build Coastguard Worker }
324*61046927SAndroid Build Coastguard Worker 
325*61046927SAndroid Build Coastguard Worker %}
326*61046927SAndroid Build Coastguard Worker 
327*61046927SAndroid Build Coastguard Worker %locations
328*61046927SAndroid Build Coastguard Worker 
329*61046927SAndroid Build Coastguard Worker %start ROOT
330*61046927SAndroid Build Coastguard Worker 
331*61046927SAndroid Build Coastguard Worker %union {
332*61046927SAndroid Build Coastguard Worker 	char *string;
333*61046927SAndroid Build Coastguard Worker 	double number;
334*61046927SAndroid Build Coastguard Worker 	int integer;
335*61046927SAndroid Build Coastguard Worker 	unsigned long long int llint;
336*61046927SAndroid Build Coastguard Worker 	struct brw_reg reg;
337*61046927SAndroid Build Coastguard Worker 	enum brw_reg_type reg_type;
338*61046927SAndroid Build Coastguard Worker 	struct brw_codegen *program;
339*61046927SAndroid Build Coastguard Worker 	struct predicate predicate;
340*61046927SAndroid Build Coastguard Worker 	struct condition condition;
341*61046927SAndroid Build Coastguard Worker 	struct options options;
342*61046927SAndroid Build Coastguard Worker 	struct instoption instoption;
343*61046927SAndroid Build Coastguard Worker 	struct msgdesc msgdesc;
344*61046927SAndroid Build Coastguard Worker 	struct tgl_swsb depinfo;
345*61046927SAndroid Build Coastguard Worker 	brw_inst *instruction;
346*61046927SAndroid Build Coastguard Worker }
347*61046927SAndroid Build Coastguard Worker 
348*61046927SAndroid Build Coastguard Worker %token ABS
349*61046927SAndroid Build Coastguard Worker %token COLON
350*61046927SAndroid Build Coastguard Worker %token COMMA
351*61046927SAndroid Build Coastguard Worker %token DOT
352*61046927SAndroid Build Coastguard Worker %token LANGLE RANGLE
353*61046927SAndroid Build Coastguard Worker %token LCURLY RCURLY
354*61046927SAndroid Build Coastguard Worker %token LPAREN RPAREN
355*61046927SAndroid Build Coastguard Worker %token LSQUARE RSQUARE
356*61046927SAndroid Build Coastguard Worker %token PLUS MINUS
357*61046927SAndroid Build Coastguard Worker %token SEMICOLON
358*61046927SAndroid Build Coastguard Worker %token ASSIGN
359*61046927SAndroid Build Coastguard Worker 
360*61046927SAndroid Build Coastguard Worker /* datatypes */
361*61046927SAndroid Build Coastguard Worker %token <integer> TYPE_B TYPE_UB
362*61046927SAndroid Build Coastguard Worker %token <integer> TYPE_W TYPE_UW
363*61046927SAndroid Build Coastguard Worker %token <integer> TYPE_D TYPE_UD
364*61046927SAndroid Build Coastguard Worker %token <integer> TYPE_Q TYPE_UQ
365*61046927SAndroid Build Coastguard Worker %token <integer> TYPE_V TYPE_UV
366*61046927SAndroid Build Coastguard Worker %token <integer> TYPE_F TYPE_HF
367*61046927SAndroid Build Coastguard Worker %token <integer> TYPE_DF
368*61046927SAndroid Build Coastguard Worker %token <integer> TYPE_VF
369*61046927SAndroid Build Coastguard Worker 
370*61046927SAndroid Build Coastguard Worker /* label */
371*61046927SAndroid Build Coastguard Worker %token <string> JUMP_LABEL
372*61046927SAndroid Build Coastguard Worker %token <string> JUMP_LABEL_TARGET
373*61046927SAndroid Build Coastguard Worker 
374*61046927SAndroid Build Coastguard Worker /* opcodes */
375*61046927SAndroid Build Coastguard Worker %token <integer> ADD ADD3 ADDC AND ASR AVG
376*61046927SAndroid Build Coastguard Worker %token <integer> BFE BFI1 BFI2 BFB BFREV BRC BRD BREAK
377*61046927SAndroid Build Coastguard Worker %token <integer> CALL CALLA CASE CBIT CMP CMPN CONT CSEL
378*61046927SAndroid Build Coastguard Worker %token <integer> DIM DO DPAS DPASW DP2 DP3 DP4 DP4A DPH
379*61046927SAndroid Build Coastguard Worker %token <integer> ELSE ENDIF FBH FBL FORK FRC
380*61046927SAndroid Build Coastguard Worker %token <integer> GOTO
381*61046927SAndroid Build Coastguard Worker %token <integer> HALT
382*61046927SAndroid Build Coastguard Worker %token <integer> IF ILLEGAL
383*61046927SAndroid Build Coastguard Worker %token <integer> JMPI JOIN
384*61046927SAndroid Build Coastguard Worker %token <integer> LINE LRP LZD
385*61046927SAndroid Build Coastguard Worker %token <integer> MAC MACH MAD MADM MATH MOV MOVI MUL MREST MSAVE
386*61046927SAndroid Build Coastguard Worker %token <integer> NENOP NOP NOT
387*61046927SAndroid Build Coastguard Worker %token <integer> OR
388*61046927SAndroid Build Coastguard Worker %token <integer> PLN POP PUSH
389*61046927SAndroid Build Coastguard Worker %token <integer> RET RNDD RNDE RNDU RNDZ ROL ROR
390*61046927SAndroid Build Coastguard Worker %token <integer> SEL SENDS SENDSC SHL SHR SMOV SUBB SYNC
391*61046927SAndroid Build Coastguard Worker %token <integer> SEND_GFX4 SENDC_GFX4 SEND_GFX12 SENDC_GFX12
392*61046927SAndroid Build Coastguard Worker %token <integer> WAIT WHILE
393*61046927SAndroid Build Coastguard Worker %token <integer> XOR
394*61046927SAndroid Build Coastguard Worker 
395*61046927SAndroid Build Coastguard Worker /* extended math functions */
396*61046927SAndroid Build Coastguard Worker %token <integer> COS EXP FDIV INV INVM INTDIV INTDIVMOD INTMOD LOG POW RSQ
397*61046927SAndroid Build Coastguard Worker %token <integer> RSQRTM SIN SINCOS SQRT
398*61046927SAndroid Build Coastguard Worker 
399*61046927SAndroid Build Coastguard Worker /* sync instruction */
400*61046927SAndroid Build Coastguard Worker %token <integer> ALLRD ALLWR FENCE BAR HOST
401*61046927SAndroid Build Coastguard Worker %type <integer> sync_function
402*61046927SAndroid Build Coastguard Worker %type <reg> sync_arg
403*61046927SAndroid Build Coastguard Worker 
404*61046927SAndroid Build Coastguard Worker /* shared functions for send */
405*61046927SAndroid Build Coastguard Worker %token CONST CRE DATA DP_DATA_1 GATEWAY PIXEL_INTERP RENDER SAMPLER
406*61046927SAndroid Build Coastguard Worker %token THREAD_SPAWNER URB VME DP_SAMPLER RT_ACCEL SLM TGM UGM
407*61046927SAndroid Build Coastguard Worker 
408*61046927SAndroid Build Coastguard Worker /* message details for send */
409*61046927SAndroid Build Coastguard Worker %token MSGDESC_BEGIN SRC1_LEN EX_BSO MSGDESC_END
410*61046927SAndroid Build Coastguard Worker %type <msgdesc> msgdesc msgdesc_parts;
411*61046927SAndroid Build Coastguard Worker 
412*61046927SAndroid Build Coastguard Worker /* Conditional modifiers */
413*61046927SAndroid Build Coastguard Worker %token <integer> EQUAL GREATER GREATER_EQUAL LESS LESS_EQUAL NOT_EQUAL
414*61046927SAndroid Build Coastguard Worker %token <integer> NOT_ZERO OVERFLOW UNORDERED ZERO
415*61046927SAndroid Build Coastguard Worker 
416*61046927SAndroid Build Coastguard Worker /* register Access Modes */
417*61046927SAndroid Build Coastguard Worker %token ALIGN1 ALIGN16
418*61046927SAndroid Build Coastguard Worker 
419*61046927SAndroid Build Coastguard Worker /* accumulator write control */
420*61046927SAndroid Build Coastguard Worker %token ACCWREN
421*61046927SAndroid Build Coastguard Worker 
422*61046927SAndroid Build Coastguard Worker /* compaction control */
423*61046927SAndroid Build Coastguard Worker %token CMPTCTRL
424*61046927SAndroid Build Coastguard Worker 
425*61046927SAndroid Build Coastguard Worker /* mask control (WeCtrl) */
426*61046927SAndroid Build Coastguard Worker %token WECTRL
427*61046927SAndroid Build Coastguard Worker 
428*61046927SAndroid Build Coastguard Worker /* debug control */
429*61046927SAndroid Build Coastguard Worker %token BREAKPOINT
430*61046927SAndroid Build Coastguard Worker 
431*61046927SAndroid Build Coastguard Worker /* dependency control */
432*61046927SAndroid Build Coastguard Worker %token NODDCLR NODDCHK
433*61046927SAndroid Build Coastguard Worker 
434*61046927SAndroid Build Coastguard Worker /* end of thread */
435*61046927SAndroid Build Coastguard Worker %token EOT
436*61046927SAndroid Build Coastguard Worker 
437*61046927SAndroid Build Coastguard Worker /* mask control */
438*61046927SAndroid Build Coastguard Worker %token MASK_DISABLE;
439*61046927SAndroid Build Coastguard Worker 
440*61046927SAndroid Build Coastguard Worker /* predicate control */
441*61046927SAndroid Build Coastguard Worker %token <integer> ANYV ALLV ANY2H ALL2H ANY4H ALL4H ANY8H ALL8H ANY16H ALL16H
442*61046927SAndroid Build Coastguard Worker %token <integer> ANY32H ALL32H
443*61046927SAndroid Build Coastguard Worker 
444*61046927SAndroid Build Coastguard Worker /* round instructions */
445*61046927SAndroid Build Coastguard Worker %token <integer> ROUND_INCREMENT
446*61046927SAndroid Build Coastguard Worker 
447*61046927SAndroid Build Coastguard Worker /* staturation */
448*61046927SAndroid Build Coastguard Worker %token SATURATE
449*61046927SAndroid Build Coastguard Worker 
450*61046927SAndroid Build Coastguard Worker /* thread control */
451*61046927SAndroid Build Coastguard Worker %token ATOMIC SWITCH
452*61046927SAndroid Build Coastguard Worker 
453*61046927SAndroid Build Coastguard Worker /* quater control */
454*61046927SAndroid Build Coastguard Worker %token QTR_2Q QTR_3Q QTR_4Q QTR_2H QTR_2N QTR_3N QTR_4N QTR_5N
455*61046927SAndroid Build Coastguard Worker %token QTR_6N QTR_7N QTR_8N
456*61046927SAndroid Build Coastguard Worker 
457*61046927SAndroid Build Coastguard Worker /* channels */
458*61046927SAndroid Build Coastguard Worker %token <integer> X Y Z W
459*61046927SAndroid Build Coastguard Worker 
460*61046927SAndroid Build Coastguard Worker /* reg files */
461*61046927SAndroid Build Coastguard Worker %token GENREGFILE
462*61046927SAndroid Build Coastguard Worker 
463*61046927SAndroid Build Coastguard Worker /* vertical stride in register region */
464*61046927SAndroid Build Coastguard Worker %token VxH
465*61046927SAndroid Build Coastguard Worker 
466*61046927SAndroid Build Coastguard Worker /* register type */
467*61046927SAndroid Build Coastguard Worker %token <integer> GENREG ADDRREG ACCREG FLAGREG NOTIFYREG STATEREG
468*61046927SAndroid Build Coastguard Worker %token <integer> CONTROLREG IPREG PERFORMANCEREG THREADREG CHANNELENABLEREG
469*61046927SAndroid Build Coastguard Worker %token <integer> MASKREG
470*61046927SAndroid Build Coastguard Worker 
471*61046927SAndroid Build Coastguard Worker %token <integer> INTEGER
472*61046927SAndroid Build Coastguard Worker %token <llint> LONG
473*61046927SAndroid Build Coastguard Worker %token NULL_TOKEN
474*61046927SAndroid Build Coastguard Worker 
475*61046927SAndroid Build Coastguard Worker %nonassoc SUBREGNUM
476*61046927SAndroid Build Coastguard Worker %left PLUS MINUS
477*61046927SAndroid Build Coastguard Worker %nonassoc DOT
478*61046927SAndroid Build Coastguard Worker %nonassoc EMPTYEXECSIZE
479*61046927SAndroid Build Coastguard Worker %nonassoc LPAREN
480*61046927SAndroid Build Coastguard Worker 
481*61046927SAndroid Build Coastguard Worker %type <integer> execsize exp
482*61046927SAndroid Build Coastguard Worker %type <llint> exp2
483*61046927SAndroid Build Coastguard Worker 
484*61046927SAndroid Build Coastguard Worker /* predicate control */
485*61046927SAndroid Build Coastguard Worker %type <integer> predctrl predstate
486*61046927SAndroid Build Coastguard Worker %type <predicate> predicate
487*61046927SAndroid Build Coastguard Worker 
488*61046927SAndroid Build Coastguard Worker /* conditional modifier */
489*61046927SAndroid Build Coastguard Worker %type <condition> cond_mod
490*61046927SAndroid Build Coastguard Worker %type <integer> condModifiers
491*61046927SAndroid Build Coastguard Worker 
492*61046927SAndroid Build Coastguard Worker /* instruction options  */
493*61046927SAndroid Build Coastguard Worker %type <options> instoptions instoption_list
494*61046927SAndroid Build Coastguard Worker %type <instoption> instoption
495*61046927SAndroid Build Coastguard Worker 
496*61046927SAndroid Build Coastguard Worker /* writemask */
497*61046927SAndroid Build Coastguard Worker %type <integer> writemask_x writemask_y writemask_z writemask_w
498*61046927SAndroid Build Coastguard Worker %type <integer> writemask
499*61046927SAndroid Build Coastguard Worker 
500*61046927SAndroid Build Coastguard Worker /* dst operand */
501*61046927SAndroid Build Coastguard Worker %type <reg> dst dstoperand dstoperandex dstoperandex_typed dstreg
502*61046927SAndroid Build Coastguard Worker %type <integer> dstregion
503*61046927SAndroid Build Coastguard Worker 
504*61046927SAndroid Build Coastguard Worker %type <integer> saturate
505*61046927SAndroid Build Coastguard Worker %type <reg> relativelocation2
506*61046927SAndroid Build Coastguard Worker 
507*61046927SAndroid Build Coastguard Worker /* src operand */
508*61046927SAndroid Build Coastguard Worker %type <reg> directsrcoperand directsrcaccoperand indirectsrcoperand srcacc
509*61046927SAndroid Build Coastguard Worker %type <reg> srcarcoperandex srcaccimm srcarcoperandex_typed srcimm
510*61046927SAndroid Build Coastguard Worker %type <reg> indirectgenreg indirectregion
511*61046927SAndroid Build Coastguard Worker %type <reg> immreg src reg32 payload directgenreg_list addrparam region
512*61046927SAndroid Build Coastguard Worker %type <reg> region_wh directgenreg
513*61046927SAndroid Build Coastguard Worker %type <reg> desc ex_desc reg32a
514*61046927SAndroid Build Coastguard Worker %type <integer> swizzle
515*61046927SAndroid Build Coastguard Worker 
516*61046927SAndroid Build Coastguard Worker /* registers */
517*61046927SAndroid Build Coastguard Worker %type <reg> accreg addrreg channelenablereg controlreg flagreg ipreg
518*61046927SAndroid Build Coastguard Worker %type <reg> notifyreg nullreg performancereg threadcontrolreg statereg maskreg
519*61046927SAndroid Build Coastguard Worker %type <integer> subregnum
520*61046927SAndroid Build Coastguard Worker 
521*61046927SAndroid Build Coastguard Worker /* register types */
522*61046927SAndroid Build Coastguard Worker %type <reg_type> reg_type imm_type
523*61046927SAndroid Build Coastguard Worker 
524*61046927SAndroid Build Coastguard Worker /* immediate values */
525*61046927SAndroid Build Coastguard Worker %type <llint> immval
526*61046927SAndroid Build Coastguard Worker 
527*61046927SAndroid Build Coastguard Worker /* instruction opcodes */
528*61046927SAndroid Build Coastguard Worker %type <integer> unaryopcodes binaryopcodes binaryaccopcodes ternaryopcodes
529*61046927SAndroid Build Coastguard Worker %type <integer> sendop sendsop
530*61046927SAndroid Build Coastguard Worker %type <instruction> sendopcode sendsopcode
531*61046927SAndroid Build Coastguard Worker 
532*61046927SAndroid Build Coastguard Worker %type <integer> negate abs chansel math_function sharedfunction
533*61046927SAndroid Build Coastguard Worker 
534*61046927SAndroid Build Coastguard Worker %type <string> jumplabeltarget
535*61046927SAndroid Build Coastguard Worker %type <string> jumplabel
536*61046927SAndroid Build Coastguard Worker 
537*61046927SAndroid Build Coastguard Worker /* SWSB */
538*61046927SAndroid Build Coastguard Worker %token <integer> REG_DIST_CURRENT
539*61046927SAndroid Build Coastguard Worker %token <integer> REG_DIST_FLOAT
540*61046927SAndroid Build Coastguard Worker %token <integer> REG_DIST_INT
541*61046927SAndroid Build Coastguard Worker %token <integer> REG_DIST_LONG
542*61046927SAndroid Build Coastguard Worker %token <integer> REG_DIST_ALL
543*61046927SAndroid Build Coastguard Worker %token <integer> SBID_ALLOC
544*61046927SAndroid Build Coastguard Worker %token <integer> SBID_WAIT_SRC
545*61046927SAndroid Build Coastguard Worker %token <integer> SBID_WAIT_DST
546*61046927SAndroid Build Coastguard Worker 
547*61046927SAndroid Build Coastguard Worker %type <depinfo> depinfo
548*61046927SAndroid Build Coastguard Worker 
549*61046927SAndroid Build Coastguard Worker %code {
550*61046927SAndroid Build Coastguard Worker 
551*61046927SAndroid Build Coastguard Worker static void
add_instruction_option(struct options * options,struct instoption opt)552*61046927SAndroid Build Coastguard Worker add_instruction_option(struct options *options, struct instoption opt)
553*61046927SAndroid Build Coastguard Worker {
554*61046927SAndroid Build Coastguard Worker 	if (opt.type == INSTOPTION_DEP_INFO) {
555*61046927SAndroid Build Coastguard Worker 		if (opt.depinfo_value.regdist) {
556*61046927SAndroid Build Coastguard Worker 			options->depinfo.regdist = opt.depinfo_value.regdist;
557*61046927SAndroid Build Coastguard Worker 			options->depinfo.pipe = opt.depinfo_value.pipe;
558*61046927SAndroid Build Coastguard Worker 		} else {
559*61046927SAndroid Build Coastguard Worker 			options->depinfo.sbid = opt.depinfo_value.sbid;
560*61046927SAndroid Build Coastguard Worker 			options->depinfo.mode = opt.depinfo_value.mode;
561*61046927SAndroid Build Coastguard Worker 		}
562*61046927SAndroid Build Coastguard Worker 		return;
563*61046927SAndroid Build Coastguard Worker 	}
564*61046927SAndroid Build Coastguard Worker 	if (opt.type == INSTOPTION_CHAN_OFFSET) {
565*61046927SAndroid Build Coastguard Worker 		options->chan_offset = opt.uint_value;
566*61046927SAndroid Build Coastguard Worker 		return;
567*61046927SAndroid Build Coastguard Worker 	}
568*61046927SAndroid Build Coastguard Worker 	switch (opt.uint_value) {
569*61046927SAndroid Build Coastguard Worker 	case ALIGN1:
570*61046927SAndroid Build Coastguard Worker 		options->access_mode = BRW_ALIGN_1;
571*61046927SAndroid Build Coastguard Worker 		break;
572*61046927SAndroid Build Coastguard Worker 	case ALIGN16:
573*61046927SAndroid Build Coastguard Worker 		options->access_mode = BRW_ALIGN_16;
574*61046927SAndroid Build Coastguard Worker 		break;
575*61046927SAndroid Build Coastguard Worker 	case SWITCH:
576*61046927SAndroid Build Coastguard Worker 		options->thread_control |= BRW_THREAD_SWITCH;
577*61046927SAndroid Build Coastguard Worker 		break;
578*61046927SAndroid Build Coastguard Worker 	case ATOMIC:
579*61046927SAndroid Build Coastguard Worker 		options->thread_control |= BRW_THREAD_ATOMIC;
580*61046927SAndroid Build Coastguard Worker 		break;
581*61046927SAndroid Build Coastguard Worker 	case NODDCHK:
582*61046927SAndroid Build Coastguard Worker 		options->no_dd_check = true;
583*61046927SAndroid Build Coastguard Worker 		break;
584*61046927SAndroid Build Coastguard Worker 	case NODDCLR:
585*61046927SAndroid Build Coastguard Worker 		options->no_dd_clear = true;
586*61046927SAndroid Build Coastguard Worker 		break;
587*61046927SAndroid Build Coastguard Worker 	case MASK_DISABLE:
588*61046927SAndroid Build Coastguard Worker 		options->mask_control |= BRW_MASK_DISABLE;
589*61046927SAndroid Build Coastguard Worker 		break;
590*61046927SAndroid Build Coastguard Worker 	case BREAKPOINT:
591*61046927SAndroid Build Coastguard Worker 		options->debug_control = BRW_DEBUG_BREAKPOINT;
592*61046927SAndroid Build Coastguard Worker 		break;
593*61046927SAndroid Build Coastguard Worker 	case WECTRL:
594*61046927SAndroid Build Coastguard Worker 		options->mask_control |= BRW_WE_ALL;
595*61046927SAndroid Build Coastguard Worker 		break;
596*61046927SAndroid Build Coastguard Worker 	case CMPTCTRL:
597*61046927SAndroid Build Coastguard Worker 		options->compaction = true;
598*61046927SAndroid Build Coastguard Worker 		break;
599*61046927SAndroid Build Coastguard Worker 	case ACCWREN:
600*61046927SAndroid Build Coastguard Worker 		options->acc_wr_control = true;
601*61046927SAndroid Build Coastguard Worker 		break;
602*61046927SAndroid Build Coastguard Worker 	case EOT:
603*61046927SAndroid Build Coastguard Worker 		options->end_of_thread = true;
604*61046927SAndroid Build Coastguard Worker 		break;
605*61046927SAndroid Build Coastguard Worker 	}
606*61046927SAndroid Build Coastguard Worker }
607*61046927SAndroid Build Coastguard Worker }
608*61046927SAndroid Build Coastguard Worker %%
609*61046927SAndroid Build Coastguard Worker 
610*61046927SAndroid Build Coastguard Worker ROOT:
611*61046927SAndroid Build Coastguard Worker 	instrseq
612*61046927SAndroid Build Coastguard Worker 	;
613*61046927SAndroid Build Coastguard Worker 
614*61046927SAndroid Build Coastguard Worker instrseq:
615*61046927SAndroid Build Coastguard Worker 	instrseq instruction SEMICOLON
616*61046927SAndroid Build Coastguard Worker 	| instrseq relocatableinstruction SEMICOLON
617*61046927SAndroid Build Coastguard Worker 	| instruction SEMICOLON
618*61046927SAndroid Build Coastguard Worker 	| relocatableinstruction SEMICOLON
619*61046927SAndroid Build Coastguard Worker 	| instrseq jumplabeltarget
620*61046927SAndroid Build Coastguard Worker 	| jumplabeltarget
621*61046927SAndroid Build Coastguard Worker 	;
622*61046927SAndroid Build Coastguard Worker 
623*61046927SAndroid Build Coastguard Worker /* Instruction Group */
624*61046927SAndroid Build Coastguard Worker instruction:
625*61046927SAndroid Build Coastguard Worker 	unaryinstruction
626*61046927SAndroid Build Coastguard Worker 	| binaryinstruction
627*61046927SAndroid Build Coastguard Worker 	| binaryaccinstruction
628*61046927SAndroid Build Coastguard Worker 	| mathinstruction
629*61046927SAndroid Build Coastguard Worker 	| nopinstruction
630*61046927SAndroid Build Coastguard Worker 	| waitinstruction
631*61046927SAndroid Build Coastguard Worker 	| ternaryinstruction
632*61046927SAndroid Build Coastguard Worker 	| sendinstruction
633*61046927SAndroid Build Coastguard Worker 	| illegalinstruction
634*61046927SAndroid Build Coastguard Worker 	| syncinstruction
635*61046927SAndroid Build Coastguard Worker 	;
636*61046927SAndroid Build Coastguard Worker 
637*61046927SAndroid Build Coastguard Worker relocatableinstruction:
638*61046927SAndroid Build Coastguard Worker 	jumpinstruction
639*61046927SAndroid Build Coastguard Worker 	| branchinstruction
640*61046927SAndroid Build Coastguard Worker 	| breakinstruction
641*61046927SAndroid Build Coastguard Worker 	| loopinstruction
642*61046927SAndroid Build Coastguard Worker 	;
643*61046927SAndroid Build Coastguard Worker 
644*61046927SAndroid Build Coastguard Worker illegalinstruction:
645*61046927SAndroid Build Coastguard Worker 	ILLEGAL execsize instoptions
646*61046927SAndroid Build Coastguard Worker 	{
647*61046927SAndroid Build Coastguard Worker 		brw_next_insn(p, $1);
648*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $2);
649*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $3);
650*61046927SAndroid Build Coastguard Worker 	}
651*61046927SAndroid Build Coastguard Worker 	;
652*61046927SAndroid Build Coastguard Worker 
653*61046927SAndroid Build Coastguard Worker /* Unary instruction */
654*61046927SAndroid Build Coastguard Worker unaryinstruction:
655*61046927SAndroid Build Coastguard Worker 	predicate unaryopcodes saturate cond_mod execsize dst srcaccimm	instoptions
656*61046927SAndroid Build Coastguard Worker 	{
657*61046927SAndroid Build Coastguard Worker 		brw_set_default_access_mode(p, $8.access_mode);
658*61046927SAndroid Build Coastguard Worker 		i965_asm_unary_instruction($2, p, $6, $7);
659*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
660*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $8);
661*61046927SAndroid Build Coastguard Worker 		brw_inst_set_cond_modifier(p->devinfo, brw_last_inst,
662*61046927SAndroid Build Coastguard Worker 					   $4.cond_modifier);
663*61046927SAndroid Build Coastguard Worker 
664*61046927SAndroid Build Coastguard Worker 		if (!brw_inst_flag_reg_nr(p->devinfo, brw_last_inst)) {
665*61046927SAndroid Build Coastguard Worker 			brw_inst_set_flag_reg_nr(p->devinfo,
666*61046927SAndroid Build Coastguard Worker 						 brw_last_inst,
667*61046927SAndroid Build Coastguard Worker 						 $4.flag_reg_nr);
668*61046927SAndroid Build Coastguard Worker 			brw_inst_set_flag_subreg_nr(p->devinfo,
669*61046927SAndroid Build Coastguard Worker 						    brw_last_inst,
670*61046927SAndroid Build Coastguard Worker 						    $4.flag_subreg_nr);
671*61046927SAndroid Build Coastguard Worker 		}
672*61046927SAndroid Build Coastguard Worker 
673*61046927SAndroid Build Coastguard Worker 		if ($7.file != IMM) {
674*61046927SAndroid Build Coastguard Worker 			brw_inst_set_src0_vstride(p->devinfo, brw_last_inst,
675*61046927SAndroid Build Coastguard Worker 						  $7.vstride);
676*61046927SAndroid Build Coastguard Worker 		}
677*61046927SAndroid Build Coastguard Worker 		brw_inst_set_saturate(p->devinfo, brw_last_inst, $3);
678*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $5);
679*61046927SAndroid Build Coastguard Worker 		brw_inst_set_group(p->devinfo, brw_last_inst, $8.chan_offset);
680*61046927SAndroid Build Coastguard Worker 	}
681*61046927SAndroid Build Coastguard Worker 	;
682*61046927SAndroid Build Coastguard Worker 
683*61046927SAndroid Build Coastguard Worker unaryopcodes:
684*61046927SAndroid Build Coastguard Worker 	BFREV
685*61046927SAndroid Build Coastguard Worker 	| CBIT
686*61046927SAndroid Build Coastguard Worker 	| DIM
687*61046927SAndroid Build Coastguard Worker 	| FBH
688*61046927SAndroid Build Coastguard Worker 	| FBL
689*61046927SAndroid Build Coastguard Worker 	| FRC
690*61046927SAndroid Build Coastguard Worker 	| LZD
691*61046927SAndroid Build Coastguard Worker 	| MOV
692*61046927SAndroid Build Coastguard Worker 	| NOT
693*61046927SAndroid Build Coastguard Worker 	| RNDD
694*61046927SAndroid Build Coastguard Worker 	| RNDE
695*61046927SAndroid Build Coastguard Worker 	| RNDU
696*61046927SAndroid Build Coastguard Worker 	| RNDZ
697*61046927SAndroid Build Coastguard Worker 	;
698*61046927SAndroid Build Coastguard Worker 
699*61046927SAndroid Build Coastguard Worker /* Binary instruction */
700*61046927SAndroid Build Coastguard Worker binaryinstruction:
701*61046927SAndroid Build Coastguard Worker 	predicate binaryopcodes saturate cond_mod execsize dst srcimm srcimm instoptions
702*61046927SAndroid Build Coastguard Worker 	{
703*61046927SAndroid Build Coastguard Worker 		brw_set_default_access_mode(p, $9.access_mode);
704*61046927SAndroid Build Coastguard Worker 		i965_asm_binary_instruction($2, p, $6, $7, $8);
705*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $9);
706*61046927SAndroid Build Coastguard Worker 		brw_inst_set_cond_modifier(p->devinfo, brw_last_inst,
707*61046927SAndroid Build Coastguard Worker 					   $4.cond_modifier);
708*61046927SAndroid Build Coastguard Worker 
709*61046927SAndroid Build Coastguard Worker 		if (!brw_inst_flag_reg_nr(p->devinfo, brw_last_inst)) {
710*61046927SAndroid Build Coastguard Worker 			brw_inst_set_flag_reg_nr(p->devinfo, brw_last_inst,
711*61046927SAndroid Build Coastguard Worker 					         $4.flag_reg_nr);
712*61046927SAndroid Build Coastguard Worker 			brw_inst_set_flag_subreg_nr(p->devinfo, brw_last_inst,
713*61046927SAndroid Build Coastguard Worker 						    $4.flag_subreg_nr);
714*61046927SAndroid Build Coastguard Worker 		}
715*61046927SAndroid Build Coastguard Worker 
716*61046927SAndroid Build Coastguard Worker 		brw_inst_set_saturate(p->devinfo, brw_last_inst, $3);
717*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $5);
718*61046927SAndroid Build Coastguard Worker 		brw_inst_set_group(p->devinfo, brw_last_inst, $9.chan_offset);
719*61046927SAndroid Build Coastguard Worker 
720*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
721*61046927SAndroid Build Coastguard Worker 	}
722*61046927SAndroid Build Coastguard Worker 	;
723*61046927SAndroid Build Coastguard Worker 
724*61046927SAndroid Build Coastguard Worker binaryopcodes:
725*61046927SAndroid Build Coastguard Worker 	ADDC
726*61046927SAndroid Build Coastguard Worker 	| BFI1
727*61046927SAndroid Build Coastguard Worker 	| DP2
728*61046927SAndroid Build Coastguard Worker 	| DP3
729*61046927SAndroid Build Coastguard Worker 	| DP4
730*61046927SAndroid Build Coastguard Worker 	| DPH
731*61046927SAndroid Build Coastguard Worker 	| LINE
732*61046927SAndroid Build Coastguard Worker 	| MAC
733*61046927SAndroid Build Coastguard Worker 	| MACH
734*61046927SAndroid Build Coastguard Worker 	| MUL
735*61046927SAndroid Build Coastguard Worker 	| PLN
736*61046927SAndroid Build Coastguard Worker 	| ROL
737*61046927SAndroid Build Coastguard Worker 	| ROR
738*61046927SAndroid Build Coastguard Worker 	| SUBB
739*61046927SAndroid Build Coastguard Worker 	;
740*61046927SAndroid Build Coastguard Worker 
741*61046927SAndroid Build Coastguard Worker /* Binary acc instruction */
742*61046927SAndroid Build Coastguard Worker binaryaccinstruction:
743*61046927SAndroid Build Coastguard Worker 	predicate binaryaccopcodes saturate cond_mod execsize dst srcacc srcimm instoptions
744*61046927SAndroid Build Coastguard Worker 	{
745*61046927SAndroid Build Coastguard Worker 		brw_set_default_access_mode(p, $9.access_mode);
746*61046927SAndroid Build Coastguard Worker 		i965_asm_binary_instruction($2, p, $6, $7, $8);
747*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
748*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $9);
749*61046927SAndroid Build Coastguard Worker 		brw_inst_set_cond_modifier(p->devinfo, brw_last_inst,
750*61046927SAndroid Build Coastguard Worker 					   $4.cond_modifier);
751*61046927SAndroid Build Coastguard Worker 
752*61046927SAndroid Build Coastguard Worker 		if (!brw_inst_flag_reg_nr(p->devinfo, brw_last_inst)) {
753*61046927SAndroid Build Coastguard Worker 			brw_inst_set_flag_reg_nr(p->devinfo,
754*61046927SAndroid Build Coastguard Worker 						 brw_last_inst,
755*61046927SAndroid Build Coastguard Worker 						 $4.flag_reg_nr);
756*61046927SAndroid Build Coastguard Worker 			brw_inst_set_flag_subreg_nr(p->devinfo,
757*61046927SAndroid Build Coastguard Worker 						    brw_last_inst,
758*61046927SAndroid Build Coastguard Worker 						    $4.flag_subreg_nr);
759*61046927SAndroid Build Coastguard Worker 		}
760*61046927SAndroid Build Coastguard Worker 
761*61046927SAndroid Build Coastguard Worker 		brw_inst_set_saturate(p->devinfo, brw_last_inst, $3);
762*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $5);
763*61046927SAndroid Build Coastguard Worker 		brw_inst_set_group(p->devinfo, brw_last_inst, $9.chan_offset);
764*61046927SAndroid Build Coastguard Worker 	}
765*61046927SAndroid Build Coastguard Worker 	;
766*61046927SAndroid Build Coastguard Worker 
767*61046927SAndroid Build Coastguard Worker binaryaccopcodes:
768*61046927SAndroid Build Coastguard Worker 	ADD
769*61046927SAndroid Build Coastguard Worker 	| AND
770*61046927SAndroid Build Coastguard Worker 	| ASR
771*61046927SAndroid Build Coastguard Worker 	| AVG
772*61046927SAndroid Build Coastguard Worker 	| CMP
773*61046927SAndroid Build Coastguard Worker 	| CMPN
774*61046927SAndroid Build Coastguard Worker 	| OR
775*61046927SAndroid Build Coastguard Worker 	| SEL
776*61046927SAndroid Build Coastguard Worker 	| SHL
777*61046927SAndroid Build Coastguard Worker 	| SHR
778*61046927SAndroid Build Coastguard Worker 	| XOR
779*61046927SAndroid Build Coastguard Worker 	;
780*61046927SAndroid Build Coastguard Worker 
781*61046927SAndroid Build Coastguard Worker /* Math instruction */
782*61046927SAndroid Build Coastguard Worker mathinstruction:
783*61046927SAndroid Build Coastguard Worker 	predicate MATH saturate math_function execsize dst src srcimm instoptions
784*61046927SAndroid Build Coastguard Worker 	{
785*61046927SAndroid Build Coastguard Worker 		brw_set_default_access_mode(p, $9.access_mode);
786*61046927SAndroid Build Coastguard Worker 		gfx6_math(p, $6, $4, $7, $8);
787*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $9);
788*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $5);
789*61046927SAndroid Build Coastguard Worker 		brw_inst_set_saturate(p->devinfo, brw_last_inst, $3);
790*61046927SAndroid Build Coastguard Worker 		brw_inst_set_group(p->devinfo, brw_last_inst, $9.chan_offset);
791*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
792*61046927SAndroid Build Coastguard Worker 	}
793*61046927SAndroid Build Coastguard Worker 	;
794*61046927SAndroid Build Coastguard Worker 
795*61046927SAndroid Build Coastguard Worker math_function:
796*61046927SAndroid Build Coastguard Worker 	COS
797*61046927SAndroid Build Coastguard Worker 	| EXP
798*61046927SAndroid Build Coastguard Worker 	| FDIV
799*61046927SAndroid Build Coastguard Worker 	| INV
800*61046927SAndroid Build Coastguard Worker 	| INVM
801*61046927SAndroid Build Coastguard Worker 	| INTDIV
802*61046927SAndroid Build Coastguard Worker 	| INTDIVMOD
803*61046927SAndroid Build Coastguard Worker 	| INTMOD
804*61046927SAndroid Build Coastguard Worker 	| LOG
805*61046927SAndroid Build Coastguard Worker 	| POW
806*61046927SAndroid Build Coastguard Worker 	| RSQ
807*61046927SAndroid Build Coastguard Worker 	| RSQRTM
808*61046927SAndroid Build Coastguard Worker 	| SIN
809*61046927SAndroid Build Coastguard Worker 	| SQRT
810*61046927SAndroid Build Coastguard Worker 	| SINCOS
811*61046927SAndroid Build Coastguard Worker 	;
812*61046927SAndroid Build Coastguard Worker 
813*61046927SAndroid Build Coastguard Worker /* NOP instruction */
814*61046927SAndroid Build Coastguard Worker nopinstruction:
815*61046927SAndroid Build Coastguard Worker 	NOP
816*61046927SAndroid Build Coastguard Worker 	{
817*61046927SAndroid Build Coastguard Worker 		brw_NOP(p);
818*61046927SAndroid Build Coastguard Worker 	}
819*61046927SAndroid Build Coastguard Worker 	;
820*61046927SAndroid Build Coastguard Worker 
821*61046927SAndroid Build Coastguard Worker /* Ternary operand instruction */
822*61046927SAndroid Build Coastguard Worker ternaryinstruction:
823*61046927SAndroid Build Coastguard Worker 	predicate ternaryopcodes saturate cond_mod execsize dst srcimm src srcimm instoptions
824*61046927SAndroid Build Coastguard Worker 	{
825*61046927SAndroid Build Coastguard Worker 		brw_set_default_access_mode(p, $10.access_mode);
826*61046927SAndroid Build Coastguard Worker 		i965_asm_ternary_instruction($2, p, $6, $7, $8, $9);
827*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
828*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $10);
829*61046927SAndroid Build Coastguard Worker 		brw_inst_set_cond_modifier(p->devinfo, brw_last_inst,
830*61046927SAndroid Build Coastguard Worker 					   $4.cond_modifier);
831*61046927SAndroid Build Coastguard Worker 
832*61046927SAndroid Build Coastguard Worker 		if (p->devinfo->ver < 12) {
833*61046927SAndroid Build Coastguard Worker 			brw_inst_set_3src_a16_flag_reg_nr(p->devinfo, brw_last_inst,
834*61046927SAndroid Build Coastguard Worker 					         $4.flag_reg_nr);
835*61046927SAndroid Build Coastguard Worker 			brw_inst_set_3src_a16_flag_subreg_nr(p->devinfo, brw_last_inst,
836*61046927SAndroid Build Coastguard Worker 						    $4.flag_subreg_nr);
837*61046927SAndroid Build Coastguard Worker 		}
838*61046927SAndroid Build Coastguard Worker 
839*61046927SAndroid Build Coastguard Worker 		brw_inst_set_saturate(p->devinfo, brw_last_inst, $3);
840*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $5);
841*61046927SAndroid Build Coastguard Worker 		brw_inst_set_group(p->devinfo, brw_last_inst, $10.chan_offset);
842*61046927SAndroid Build Coastguard Worker 	}
843*61046927SAndroid Build Coastguard Worker 	;
844*61046927SAndroid Build Coastguard Worker 
845*61046927SAndroid Build Coastguard Worker ternaryopcodes:
846*61046927SAndroid Build Coastguard Worker 	CSEL
847*61046927SAndroid Build Coastguard Worker 	| BFE
848*61046927SAndroid Build Coastguard Worker 	| BFI2
849*61046927SAndroid Build Coastguard Worker 	| LRP
850*61046927SAndroid Build Coastguard Worker 	| MAD
851*61046927SAndroid Build Coastguard Worker 	| DP4A
852*61046927SAndroid Build Coastguard Worker 	| ADD3
853*61046927SAndroid Build Coastguard Worker 	;
854*61046927SAndroid Build Coastguard Worker 
855*61046927SAndroid Build Coastguard Worker /* Wait instruction */
856*61046927SAndroid Build Coastguard Worker waitinstruction:
857*61046927SAndroid Build Coastguard Worker 	WAIT execsize dst instoptions
858*61046927SAndroid Build Coastguard Worker 	{
859*61046927SAndroid Build Coastguard Worker 		brw_next_insn(p, $1);
860*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $4);
861*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $2);
862*61046927SAndroid Build Coastguard Worker 		brw_set_default_access_mode(p, $4.access_mode);
863*61046927SAndroid Build Coastguard Worker 		struct brw_reg dest = $3;
864*61046927SAndroid Build Coastguard Worker 		dest.swizzle = brw_swizzle_for_mask(dest.writemask);
865*61046927SAndroid Build Coastguard Worker 		if (dest.file != ARF || dest.nr != BRW_ARF_NOTIFICATION_COUNT)
866*61046927SAndroid Build Coastguard Worker 			error(&@1, "WAIT must use the notification register\n");
867*61046927SAndroid Build Coastguard Worker 		brw_set_dest(p, brw_last_inst, dest);
868*61046927SAndroid Build Coastguard Worker 		brw_set_src0(p, brw_last_inst, dest);
869*61046927SAndroid Build Coastguard Worker 		brw_set_src1(p, brw_last_inst, brw_null_reg());
870*61046927SAndroid Build Coastguard Worker 		brw_inst_set_mask_control(p->devinfo, brw_last_inst, BRW_MASK_DISABLE);
871*61046927SAndroid Build Coastguard Worker 	}
872*61046927SAndroid Build Coastguard Worker 	;
873*61046927SAndroid Build Coastguard Worker 
874*61046927SAndroid Build Coastguard Worker /* Send instruction */
875*61046927SAndroid Build Coastguard Worker sendinstruction:
876*61046927SAndroid Build Coastguard Worker 	predicate sendopcode execsize dst payload exp2 sharedfunction msgdesc instoptions
877*61046927SAndroid Build Coastguard Worker 	{
878*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $9);
879*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
880*61046927SAndroid Build Coastguard Worker 		brw_set_dest(p, brw_last_inst, $4);
881*61046927SAndroid Build Coastguard Worker 		brw_set_src0(p, brw_last_inst, $5);
882*61046927SAndroid Build Coastguard Worker 		brw_inst_set_bits(brw_last_inst, 127, 96, $6);
883*61046927SAndroid Build Coastguard Worker 		brw_inst_set_src1_file_type(p->devinfo, brw_last_inst,
884*61046927SAndroid Build Coastguard Worker 				            IMM,
885*61046927SAndroid Build Coastguard Worker 					    BRW_TYPE_UD);
886*61046927SAndroid Build Coastguard Worker 		brw_inst_set_sfid(p->devinfo, brw_last_inst, $7);
887*61046927SAndroid Build Coastguard Worker 		brw_inst_set_eot(p->devinfo, brw_last_inst, $9.end_of_thread);
888*61046927SAndroid Build Coastguard Worker 		brw_inst_set_group(p->devinfo, brw_last_inst, $9.chan_offset);
889*61046927SAndroid Build Coastguard Worker 
890*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
891*61046927SAndroid Build Coastguard Worker 	}
892*61046927SAndroid Build Coastguard Worker 	| predicate sendopcode execsize dst payload payload exp2 sharedfunction msgdesc instoptions
893*61046927SAndroid Build Coastguard Worker 	{
894*61046927SAndroid Build Coastguard Worker 		assert(p->devinfo->ver < 12);
895*61046927SAndroid Build Coastguard Worker 
896*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $10);
897*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
898*61046927SAndroid Build Coastguard Worker 		brw_set_dest(p, brw_last_inst, $4);
899*61046927SAndroid Build Coastguard Worker 		brw_set_src0(p, brw_last_inst, $5);
900*61046927SAndroid Build Coastguard Worker 		brw_inst_set_bits(brw_last_inst, 127, 96, $7);
901*61046927SAndroid Build Coastguard Worker 		brw_inst_set_sfid(p->devinfo, brw_last_inst, $8);
902*61046927SAndroid Build Coastguard Worker 		brw_inst_set_eot(p->devinfo, brw_last_inst, $10.end_of_thread);
903*61046927SAndroid Build Coastguard Worker 		brw_inst_set_group(p->devinfo, brw_last_inst, $10.chan_offset);
904*61046927SAndroid Build Coastguard Worker 
905*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
906*61046927SAndroid Build Coastguard Worker 	}
907*61046927SAndroid Build Coastguard Worker 	| predicate sendsopcode execsize dst payload payload desc ex_desc sharedfunction msgdesc instoptions
908*61046927SAndroid Build Coastguard Worker 	{
909*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $11);
910*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
911*61046927SAndroid Build Coastguard Worker 		brw_set_dest(p, brw_last_inst, $4);
912*61046927SAndroid Build Coastguard Worker 		brw_set_src0(p, brw_last_inst, $5);
913*61046927SAndroid Build Coastguard Worker 		brw_set_src1(p, brw_last_inst, $6);
914*61046927SAndroid Build Coastguard Worker 
915*61046927SAndroid Build Coastguard Worker 		if ($7.file == IMM) {
916*61046927SAndroid Build Coastguard Worker 			brw_inst_set_send_sel_reg32_desc(p->devinfo, brw_last_inst, 0);
917*61046927SAndroid Build Coastguard Worker 			brw_inst_set_send_desc(p->devinfo, brw_last_inst, $7.ud);
918*61046927SAndroid Build Coastguard Worker 		} else {
919*61046927SAndroid Build Coastguard Worker 			brw_inst_set_send_sel_reg32_desc(p->devinfo, brw_last_inst, 1);
920*61046927SAndroid Build Coastguard Worker 		}
921*61046927SAndroid Build Coastguard Worker 
922*61046927SAndroid Build Coastguard Worker 		if ($8.file == IMM) {
923*61046927SAndroid Build Coastguard Worker 			brw_inst_set_send_sel_reg32_ex_desc(p->devinfo, brw_last_inst, 0);
924*61046927SAndroid Build Coastguard Worker 			brw_inst_set_sends_ex_desc(p->devinfo, brw_last_inst, $8.ud);
925*61046927SAndroid Build Coastguard Worker 		} else {
926*61046927SAndroid Build Coastguard Worker 			brw_inst_set_send_sel_reg32_ex_desc(p->devinfo, brw_last_inst, 1);
927*61046927SAndroid Build Coastguard Worker 			brw_inst_set_send_ex_desc_ia_subreg_nr(p->devinfo, brw_last_inst, $8.subnr >> 2);
928*61046927SAndroid Build Coastguard Worker 		}
929*61046927SAndroid Build Coastguard Worker 
930*61046927SAndroid Build Coastguard Worker 		brw_inst_set_sfid(p->devinfo, brw_last_inst, $9);
931*61046927SAndroid Build Coastguard Worker 		brw_inst_set_eot(p->devinfo, brw_last_inst, $11.end_of_thread);
932*61046927SAndroid Build Coastguard Worker 		brw_inst_set_group(p->devinfo, brw_last_inst, $11.chan_offset);
933*61046927SAndroid Build Coastguard Worker 
934*61046927SAndroid Build Coastguard Worker 		if (p->devinfo->verx10 >= 125 && $10.ex_bso) {
935*61046927SAndroid Build Coastguard Worker 			brw_inst_set_send_ex_bso(p->devinfo, brw_last_inst, 1);
936*61046927SAndroid Build Coastguard Worker 			brw_inst_set_send_src1_len(p->devinfo, brw_last_inst,
937*61046927SAndroid Build Coastguard Worker 						   $10.src1_len);
938*61046927SAndroid Build Coastguard Worker 		}
939*61046927SAndroid Build Coastguard Worker 
940*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
941*61046927SAndroid Build Coastguard Worker 	}
942*61046927SAndroid Build Coastguard Worker 	;
943*61046927SAndroid Build Coastguard Worker 
944*61046927SAndroid Build Coastguard Worker sendop:
945*61046927SAndroid Build Coastguard Worker 	SEND_GFX4
946*61046927SAndroid Build Coastguard Worker 	| SENDC_GFX4
947*61046927SAndroid Build Coastguard Worker 	;
948*61046927SAndroid Build Coastguard Worker 
949*61046927SAndroid Build Coastguard Worker sendsop:
950*61046927SAndroid Build Coastguard Worker 	SEND_GFX12
951*61046927SAndroid Build Coastguard Worker 	| SENDC_GFX12
952*61046927SAndroid Build Coastguard Worker 	| SENDS
953*61046927SAndroid Build Coastguard Worker 	| SENDSC
954*61046927SAndroid Build Coastguard Worker 	;
955*61046927SAndroid Build Coastguard Worker 
956*61046927SAndroid Build Coastguard Worker sendopcode:
957*61046927SAndroid Build Coastguard Worker 	sendop   { $$ = brw_next_insn(p, $1); }
958*61046927SAndroid Build Coastguard Worker 	;
959*61046927SAndroid Build Coastguard Worker 
960*61046927SAndroid Build Coastguard Worker sendsopcode:
961*61046927SAndroid Build Coastguard Worker 	sendsop  { $$ = brw_next_insn(p, $1); }
962*61046927SAndroid Build Coastguard Worker 	;
963*61046927SAndroid Build Coastguard Worker 
964*61046927SAndroid Build Coastguard Worker sharedfunction:
965*61046927SAndroid Build Coastguard Worker 	NULL_TOKEN 	        { $$ = BRW_SFID_NULL; }
966*61046927SAndroid Build Coastguard Worker 	| GATEWAY 	        { $$ = BRW_SFID_MESSAGE_GATEWAY; }
967*61046927SAndroid Build Coastguard Worker 	| URB 		        { $$ = BRW_SFID_URB; }
968*61046927SAndroid Build Coastguard Worker 	| THREAD_SPAWNER 	{ $$ = BRW_SFID_THREAD_SPAWNER; }
969*61046927SAndroid Build Coastguard Worker 	| VME 		        { $$ = BRW_SFID_VME; }
970*61046927SAndroid Build Coastguard Worker 	| RENDER 	        { $$ = GFX6_SFID_DATAPORT_RENDER_CACHE; }
971*61046927SAndroid Build Coastguard Worker 	| CONST 	        { $$ = GFX6_SFID_DATAPORT_CONSTANT_CACHE; }
972*61046927SAndroid Build Coastguard Worker 	| DATA 		        { $$ = GFX7_SFID_DATAPORT_DATA_CACHE; }
973*61046927SAndroid Build Coastguard Worker 	| PIXEL_INTERP 	        { $$ = GFX7_SFID_PIXEL_INTERPOLATOR; }
974*61046927SAndroid Build Coastguard Worker 	| DP_DATA_1 	        { $$ = HSW_SFID_DATAPORT_DATA_CACHE_1; }
975*61046927SAndroid Build Coastguard Worker 	| CRE 		        { $$ = HSW_SFID_CRE; }
976*61046927SAndroid Build Coastguard Worker 	| SAMPLER	        { $$ = BRW_SFID_SAMPLER; }
977*61046927SAndroid Build Coastguard Worker 	| DP_SAMPLER	        { $$ = GFX6_SFID_DATAPORT_SAMPLER_CACHE; }
978*61046927SAndroid Build Coastguard Worker 	| RT_ACCEL		{ $$ = GEN_RT_SFID_RAY_TRACE_ACCELERATOR; }
979*61046927SAndroid Build Coastguard Worker 	| SLM			{ $$ = GFX12_SFID_SLM; }
980*61046927SAndroid Build Coastguard Worker 	| TGM			{ $$ = GFX12_SFID_TGM; }
981*61046927SAndroid Build Coastguard Worker 	| UGM			{ $$ = GFX12_SFID_UGM; }
982*61046927SAndroid Build Coastguard Worker 	;
983*61046927SAndroid Build Coastguard Worker 
984*61046927SAndroid Build Coastguard Worker exp2:
985*61046927SAndroid Build Coastguard Worker 	LONG 		{ $$ = $1; }
986*61046927SAndroid Build Coastguard Worker 	| MINUS LONG 	{ $$ = -$2; }
987*61046927SAndroid Build Coastguard Worker 	;
988*61046927SAndroid Build Coastguard Worker 
989*61046927SAndroid Build Coastguard Worker desc:
990*61046927SAndroid Build Coastguard Worker 	reg32a
991*61046927SAndroid Build Coastguard Worker 	| exp2
992*61046927SAndroid Build Coastguard Worker 	{
993*61046927SAndroid Build Coastguard Worker 		$$ = brw_imm_ud($1);
994*61046927SAndroid Build Coastguard Worker 	}
995*61046927SAndroid Build Coastguard Worker 	;
996*61046927SAndroid Build Coastguard Worker 
997*61046927SAndroid Build Coastguard Worker ex_desc:
998*61046927SAndroid Build Coastguard Worker 	reg32a
999*61046927SAndroid Build Coastguard Worker 	| exp2
1000*61046927SAndroid Build Coastguard Worker 	{
1001*61046927SAndroid Build Coastguard Worker 		$$ = brw_imm_ud($1);
1002*61046927SAndroid Build Coastguard Worker 	}
1003*61046927SAndroid Build Coastguard Worker 	;
1004*61046927SAndroid Build Coastguard Worker 
1005*61046927SAndroid Build Coastguard Worker reg32a:
1006*61046927SAndroid Build Coastguard Worker 	addrreg region reg_type
1007*61046927SAndroid Build Coastguard Worker 	{
1008*61046927SAndroid Build Coastguard Worker 		$$ = set_direct_src_operand(&$1, $3);
1009*61046927SAndroid Build Coastguard Worker 		$$ = stride($$, $2.vstride, $2.width, $2.hstride);
1010*61046927SAndroid Build Coastguard Worker 	}
1011*61046927SAndroid Build Coastguard Worker 	;
1012*61046927SAndroid Build Coastguard Worker 
1013*61046927SAndroid Build Coastguard Worker 
1014*61046927SAndroid Build Coastguard Worker /* Jump instruction */
1015*61046927SAndroid Build Coastguard Worker jumpinstruction:
1016*61046927SAndroid Build Coastguard Worker 	predicate JMPI execsize relativelocation2 instoptions
1017*61046927SAndroid Build Coastguard Worker 	{
1018*61046927SAndroid Build Coastguard Worker 		brw_next_insn(p, $2);
1019*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $5);
1020*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
1021*61046927SAndroid Build Coastguard Worker 		brw_set_dest(p, brw_last_inst, brw_ip_reg());
1022*61046927SAndroid Build Coastguard Worker 		brw_set_src0(p, brw_last_inst, brw_ip_reg());
1023*61046927SAndroid Build Coastguard Worker 		brw_set_src1(p, brw_last_inst, $4);
1024*61046927SAndroid Build Coastguard Worker 		brw_inst_set_pred_control(p->devinfo, brw_last_inst,
1025*61046927SAndroid Build Coastguard Worker 					  brw_inst_pred_control(p->devinfo,
1026*61046927SAndroid Build Coastguard Worker 								brw_last_inst));
1027*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
1028*61046927SAndroid Build Coastguard Worker 	}
1029*61046927SAndroid Build Coastguard Worker 	;
1030*61046927SAndroid Build Coastguard Worker 
1031*61046927SAndroid Build Coastguard Worker /* branch instruction */
1032*61046927SAndroid Build Coastguard Worker branchinstruction:
1033*61046927SAndroid Build Coastguard Worker 	predicate ENDIF execsize JUMP_LABEL instoptions
1034*61046927SAndroid Build Coastguard Worker 	{
1035*61046927SAndroid Build Coastguard Worker 		add_label(p, $4, INSTR_LABEL_JIP);
1036*61046927SAndroid Build Coastguard Worker 
1037*61046927SAndroid Build Coastguard Worker 		brw_next_insn(p, $2);
1038*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $5);
1039*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
1040*61046927SAndroid Build Coastguard Worker 
1041*61046927SAndroid Build Coastguard Worker 		brw_set_src0(p, brw_last_inst, brw_imm_d(0x0));
1042*61046927SAndroid Build Coastguard Worker 
1043*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
1044*61046927SAndroid Build Coastguard Worker 	}
1045*61046927SAndroid Build Coastguard Worker 	| ELSE execsize JUMP_LABEL jumplabel instoptions
1046*61046927SAndroid Build Coastguard Worker 	{
1047*61046927SAndroid Build Coastguard Worker 		add_label(p, $3, INSTR_LABEL_JIP);
1048*61046927SAndroid Build Coastguard Worker 		add_label(p, $4, INSTR_LABEL_UIP);
1049*61046927SAndroid Build Coastguard Worker 
1050*61046927SAndroid Build Coastguard Worker 		brw_next_insn(p, $1);
1051*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $5);
1052*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $2);
1053*61046927SAndroid Build Coastguard Worker 
1054*61046927SAndroid Build Coastguard Worker 		brw_set_dest(p, brw_last_inst, retype(brw_null_reg(),
1055*61046927SAndroid Build Coastguard Worker 			     BRW_TYPE_D));
1056*61046927SAndroid Build Coastguard Worker 		if (p->devinfo->ver < 12)
1057*61046927SAndroid Build Coastguard Worker 			brw_set_src0(p, brw_last_inst, brw_imm_d(0));
1058*61046927SAndroid Build Coastguard Worker 	}
1059*61046927SAndroid Build Coastguard Worker 	| predicate IF execsize JUMP_LABEL jumplabel instoptions
1060*61046927SAndroid Build Coastguard Worker 	{
1061*61046927SAndroid Build Coastguard Worker 		add_label(p, $4, INSTR_LABEL_JIP);
1062*61046927SAndroid Build Coastguard Worker 		add_label(p, $5, INSTR_LABEL_UIP);
1063*61046927SAndroid Build Coastguard Worker 
1064*61046927SAndroid Build Coastguard Worker 		brw_next_insn(p, $2);
1065*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $6);
1066*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
1067*61046927SAndroid Build Coastguard Worker 
1068*61046927SAndroid Build Coastguard Worker 		brw_set_dest(p, brw_last_inst,
1069*61046927SAndroid Build Coastguard Worker 			     vec1(retype(brw_null_reg(),
1070*61046927SAndroid Build Coastguard Worker 			     BRW_TYPE_D)));
1071*61046927SAndroid Build Coastguard Worker 		if (p->devinfo->ver < 12)
1072*61046927SAndroid Build Coastguard Worker 			brw_set_src0(p, brw_last_inst, brw_imm_d(0x0));
1073*61046927SAndroid Build Coastguard Worker 
1074*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
1075*61046927SAndroid Build Coastguard Worker 	}
1076*61046927SAndroid Build Coastguard Worker 	;
1077*61046927SAndroid Build Coastguard Worker 
1078*61046927SAndroid Build Coastguard Worker /* break instruction */
1079*61046927SAndroid Build Coastguard Worker breakinstruction:
1080*61046927SAndroid Build Coastguard Worker 	predicate BREAK execsize JUMP_LABEL JUMP_LABEL instoptions
1081*61046927SAndroid Build Coastguard Worker 	{
1082*61046927SAndroid Build Coastguard Worker 		add_label(p, $4, INSTR_LABEL_JIP);
1083*61046927SAndroid Build Coastguard Worker 		add_label(p, $5, INSTR_LABEL_UIP);
1084*61046927SAndroid Build Coastguard Worker 
1085*61046927SAndroid Build Coastguard Worker 		brw_next_insn(p, $2);
1086*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $6);
1087*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
1088*61046927SAndroid Build Coastguard Worker 
1089*61046927SAndroid Build Coastguard Worker 		brw_set_dest(p, brw_last_inst, retype(brw_null_reg(),
1090*61046927SAndroid Build Coastguard Worker 			     BRW_TYPE_D));
1091*61046927SAndroid Build Coastguard Worker 		brw_set_src0(p, brw_last_inst, brw_imm_d(0x0));
1092*61046927SAndroid Build Coastguard Worker 
1093*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
1094*61046927SAndroid Build Coastguard Worker 	}
1095*61046927SAndroid Build Coastguard Worker 	| predicate HALT execsize JUMP_LABEL JUMP_LABEL instoptions
1096*61046927SAndroid Build Coastguard Worker 	{
1097*61046927SAndroid Build Coastguard Worker 		add_label(p, $4, INSTR_LABEL_JIP);
1098*61046927SAndroid Build Coastguard Worker 		add_label(p, $5, INSTR_LABEL_UIP);
1099*61046927SAndroid Build Coastguard Worker 
1100*61046927SAndroid Build Coastguard Worker 		brw_next_insn(p, $2);
1101*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $6);
1102*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
1103*61046927SAndroid Build Coastguard Worker 
1104*61046927SAndroid Build Coastguard Worker 		brw_set_dest(p, brw_last_inst, retype(brw_null_reg(),
1105*61046927SAndroid Build Coastguard Worker 			     BRW_TYPE_D));
1106*61046927SAndroid Build Coastguard Worker 
1107*61046927SAndroid Build Coastguard Worker 		if (p->devinfo->ver < 12) {
1108*61046927SAndroid Build Coastguard Worker 			brw_set_src0(p, brw_last_inst, brw_imm_d(0x0));
1109*61046927SAndroid Build Coastguard Worker 		}
1110*61046927SAndroid Build Coastguard Worker 
1111*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
1112*61046927SAndroid Build Coastguard Worker 	}
1113*61046927SAndroid Build Coastguard Worker 	| predicate CONT execsize JUMP_LABEL JUMP_LABEL instoptions
1114*61046927SAndroid Build Coastguard Worker 	{
1115*61046927SAndroid Build Coastguard Worker 		add_label(p, $4, INSTR_LABEL_JIP);
1116*61046927SAndroid Build Coastguard Worker 		add_label(p, $5, INSTR_LABEL_UIP);
1117*61046927SAndroid Build Coastguard Worker 
1118*61046927SAndroid Build Coastguard Worker 		brw_next_insn(p, $2);
1119*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $6);
1120*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
1121*61046927SAndroid Build Coastguard Worker 		brw_set_dest(p, brw_last_inst, brw_ip_reg());
1122*61046927SAndroid Build Coastguard Worker 
1123*61046927SAndroid Build Coastguard Worker 		brw_set_src0(p, brw_last_inst, brw_imm_d(0x0));
1124*61046927SAndroid Build Coastguard Worker 
1125*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
1126*61046927SAndroid Build Coastguard Worker 	}
1127*61046927SAndroid Build Coastguard Worker 	;
1128*61046927SAndroid Build Coastguard Worker 
1129*61046927SAndroid Build Coastguard Worker /* loop instruction */
1130*61046927SAndroid Build Coastguard Worker loopinstruction:
1131*61046927SAndroid Build Coastguard Worker 	predicate WHILE execsize JUMP_LABEL instoptions
1132*61046927SAndroid Build Coastguard Worker 	{
1133*61046927SAndroid Build Coastguard Worker 		add_label(p, $4, INSTR_LABEL_JIP);
1134*61046927SAndroid Build Coastguard Worker 
1135*61046927SAndroid Build Coastguard Worker 		brw_next_insn(p, $2);
1136*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $5);
1137*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $3);
1138*61046927SAndroid Build Coastguard Worker 
1139*61046927SAndroid Build Coastguard Worker 		brw_set_dest(p, brw_last_inst,
1140*61046927SAndroid Build Coastguard Worker 					retype(brw_null_reg(),
1141*61046927SAndroid Build Coastguard Worker 					BRW_TYPE_D));
1142*61046927SAndroid Build Coastguard Worker 		if (p->devinfo->ver < 12)
1143*61046927SAndroid Build Coastguard Worker 			brw_set_src0(p, brw_last_inst, brw_imm_d(0x0));
1144*61046927SAndroid Build Coastguard Worker 
1145*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
1146*61046927SAndroid Build Coastguard Worker 	}
1147*61046927SAndroid Build Coastguard Worker 	| DO execsize instoptions
1148*61046927SAndroid Build Coastguard Worker 	{
1149*61046927SAndroid Build Coastguard Worker 		brw_next_insn(p, $1);
1150*61046927SAndroid Build Coastguard Worker 	}
1151*61046927SAndroid Build Coastguard Worker 	;
1152*61046927SAndroid Build Coastguard Worker 
1153*61046927SAndroid Build Coastguard Worker /* sync instruction */
1154*61046927SAndroid Build Coastguard Worker syncinstruction:
1155*61046927SAndroid Build Coastguard Worker 	predicate SYNC sync_function execsize sync_arg instoptions
1156*61046927SAndroid Build Coastguard Worker 	{
1157*61046927SAndroid Build Coastguard Worker 		if (p->devinfo->ver < 12) {
1158*61046927SAndroid Build Coastguard Worker 			error(&@2, "sync instruction is supported only on gfx12+\n");
1159*61046927SAndroid Build Coastguard Worker 		}
1160*61046927SAndroid Build Coastguard Worker 
1161*61046927SAndroid Build Coastguard Worker 		if ($5.file == IMM &&
1162*61046927SAndroid Build Coastguard Worker 		    $3 != TGL_SYNC_ALLRD &&
1163*61046927SAndroid Build Coastguard Worker 		    $3 != TGL_SYNC_ALLWR) {
1164*61046927SAndroid Build Coastguard Worker 			error(&@2, "Only allrd and allwr support immediate argument\n");
1165*61046927SAndroid Build Coastguard Worker 		}
1166*61046927SAndroid Build Coastguard Worker 
1167*61046927SAndroid Build Coastguard Worker 		brw_set_default_access_mode(p, $6.access_mode);
1168*61046927SAndroid Build Coastguard Worker 		brw_SYNC(p, $3);
1169*61046927SAndroid Build Coastguard Worker 		i965_asm_set_instruction_options(p, $6);
1170*61046927SAndroid Build Coastguard Worker 		brw_inst_set_exec_size(p->devinfo, brw_last_inst, $4);
1171*61046927SAndroid Build Coastguard Worker 		brw_set_src0(p, brw_last_inst, $5);
1172*61046927SAndroid Build Coastguard Worker 		brw_inst_set_eot(p->devinfo, brw_last_inst, $6.end_of_thread);
1173*61046927SAndroid Build Coastguard Worker 		brw_inst_set_group(p->devinfo, brw_last_inst, $6.chan_offset);
1174*61046927SAndroid Build Coastguard Worker 
1175*61046927SAndroid Build Coastguard Worker 		brw_pop_insn_state(p);
1176*61046927SAndroid Build Coastguard Worker 	}
1177*61046927SAndroid Build Coastguard Worker 	;
1178*61046927SAndroid Build Coastguard Worker 
1179*61046927SAndroid Build Coastguard Worker sync_function:
1180*61046927SAndroid Build Coastguard Worker 	NOP		{ $$ = TGL_SYNC_NOP; }
1181*61046927SAndroid Build Coastguard Worker 	| ALLRD
1182*61046927SAndroid Build Coastguard Worker 	| ALLWR
1183*61046927SAndroid Build Coastguard Worker 	| FENCE
1184*61046927SAndroid Build Coastguard Worker 	| BAR
1185*61046927SAndroid Build Coastguard Worker 	| HOST
1186*61046927SAndroid Build Coastguard Worker 	;
1187*61046927SAndroid Build Coastguard Worker 
1188*61046927SAndroid Build Coastguard Worker sync_arg:
1189*61046927SAndroid Build Coastguard Worker 	nullreg region reg_type
1190*61046927SAndroid Build Coastguard Worker 	{
1191*61046927SAndroid Build Coastguard Worker 		$$ = $1;
1192*61046927SAndroid Build Coastguard Worker 		$$.vstride = $2.vstride;
1193*61046927SAndroid Build Coastguard Worker 		$$.width = $2.width;
1194*61046927SAndroid Build Coastguard Worker 		$$.hstride = $2.hstride;
1195*61046927SAndroid Build Coastguard Worker 		$$.type = $3;
1196*61046927SAndroid Build Coastguard Worker 	}
1197*61046927SAndroid Build Coastguard Worker 	| immreg
1198*61046927SAndroid Build Coastguard Worker 	;
1199*61046927SAndroid Build Coastguard Worker 
1200*61046927SAndroid Build Coastguard Worker /* Relative location */
1201*61046927SAndroid Build Coastguard Worker relativelocation2:
1202*61046927SAndroid Build Coastguard Worker 	immreg
1203*61046927SAndroid Build Coastguard Worker 	| reg32
1204*61046927SAndroid Build Coastguard Worker 	;
1205*61046927SAndroid Build Coastguard Worker 
1206*61046927SAndroid Build Coastguard Worker jumplabel:
1207*61046927SAndroid Build Coastguard Worker 	JUMP_LABEL	{ $$ = $1; }
1208*61046927SAndroid Build Coastguard Worker 	| /* empty */	{ $$ = NULL; }
1209*61046927SAndroid Build Coastguard Worker 	;
1210*61046927SAndroid Build Coastguard Worker 
1211*61046927SAndroid Build Coastguard Worker jumplabeltarget:
1212*61046927SAndroid Build Coastguard Worker 	JUMP_LABEL_TARGET
1213*61046927SAndroid Build Coastguard Worker 	{
1214*61046927SAndroid Build Coastguard Worker 		struct target_label *label = rzalloc(p->mem_ctx, struct target_label);
1215*61046927SAndroid Build Coastguard Worker 
1216*61046927SAndroid Build Coastguard Worker 		label->name = ralloc_strdup(p->mem_ctx, $1);
1217*61046927SAndroid Build Coastguard Worker 		label->offset = p->next_insn_offset;
1218*61046927SAndroid Build Coastguard Worker 
1219*61046927SAndroid Build Coastguard Worker 		list_addtail(&label->link, &target_labels);
1220*61046927SAndroid Build Coastguard Worker 	}
1221*61046927SAndroid Build Coastguard Worker 	;
1222*61046927SAndroid Build Coastguard Worker 
1223*61046927SAndroid Build Coastguard Worker /* Destination register */
1224*61046927SAndroid Build Coastguard Worker dst:
1225*61046927SAndroid Build Coastguard Worker 	dstoperand
1226*61046927SAndroid Build Coastguard Worker 	| dstoperandex
1227*61046927SAndroid Build Coastguard Worker 	;
1228*61046927SAndroid Build Coastguard Worker 
1229*61046927SAndroid Build Coastguard Worker dstoperand:
1230*61046927SAndroid Build Coastguard Worker 	dstreg dstregion writemask reg_type
1231*61046927SAndroid Build Coastguard Worker 	{
1232*61046927SAndroid Build Coastguard Worker 		$$ = $1;
1233*61046927SAndroid Build Coastguard Worker 		$$.vstride = BRW_VERTICAL_STRIDE_1;
1234*61046927SAndroid Build Coastguard Worker 		$$.width = BRW_WIDTH_1;
1235*61046927SAndroid Build Coastguard Worker 		$$.hstride = $2;
1236*61046927SAndroid Build Coastguard Worker 		$$.type = $4;
1237*61046927SAndroid Build Coastguard Worker 		$$.writemask = $3;
1238*61046927SAndroid Build Coastguard Worker 		$$.swizzle = BRW_SWIZZLE_NOOP;
1239*61046927SAndroid Build Coastguard Worker 		$$.subnr = $$.subnr * brw_type_size_bytes($4);
1240*61046927SAndroid Build Coastguard Worker 	}
1241*61046927SAndroid Build Coastguard Worker 	;
1242*61046927SAndroid Build Coastguard Worker 
1243*61046927SAndroid Build Coastguard Worker dstoperandex:
1244*61046927SAndroid Build Coastguard Worker 	dstoperandex_typed dstregion writemask reg_type
1245*61046927SAndroid Build Coastguard Worker 	{
1246*61046927SAndroid Build Coastguard Worker 		$$ = $1;
1247*61046927SAndroid Build Coastguard Worker 		$$.hstride = $2;
1248*61046927SAndroid Build Coastguard Worker 		$$.type = $4;
1249*61046927SAndroid Build Coastguard Worker 		$$.writemask = $3;
1250*61046927SAndroid Build Coastguard Worker 		$$.subnr = $$.subnr * brw_type_size_bytes($4);
1251*61046927SAndroid Build Coastguard Worker 	}
1252*61046927SAndroid Build Coastguard Worker 	/* BSpec says "When the conditional modifier is present, updates
1253*61046927SAndroid Build Coastguard Worker 	 * to the selected flag register also occur. In this case, the
1254*61046927SAndroid Build Coastguard Worker 	 * register region fields of the ‘null’ operand are valid."
1255*61046927SAndroid Build Coastguard Worker 	 */
1256*61046927SAndroid Build Coastguard Worker 	| nullreg dstregion writemask reg_type
1257*61046927SAndroid Build Coastguard Worker 	{
1258*61046927SAndroid Build Coastguard Worker 		$$ = $1;
1259*61046927SAndroid Build Coastguard Worker 		$$.vstride = BRW_VERTICAL_STRIDE_1;
1260*61046927SAndroid Build Coastguard Worker 		$$.width = BRW_WIDTH_1;
1261*61046927SAndroid Build Coastguard Worker 		$$.hstride = $2;
1262*61046927SAndroid Build Coastguard Worker 		$$.writemask = $3;
1263*61046927SAndroid Build Coastguard Worker 		$$.type = $4;
1264*61046927SAndroid Build Coastguard Worker 	}
1265*61046927SAndroid Build Coastguard Worker 	| threadcontrolreg
1266*61046927SAndroid Build Coastguard Worker 	{
1267*61046927SAndroid Build Coastguard Worker 		$$ = $1;
1268*61046927SAndroid Build Coastguard Worker 		$$.hstride = 1;
1269*61046927SAndroid Build Coastguard Worker 		$$.type = BRW_TYPE_UW;
1270*61046927SAndroid Build Coastguard Worker 	}
1271*61046927SAndroid Build Coastguard Worker 	;
1272*61046927SAndroid Build Coastguard Worker 
1273*61046927SAndroid Build Coastguard Worker dstoperandex_typed:
1274*61046927SAndroid Build Coastguard Worker 	accreg
1275*61046927SAndroid Build Coastguard Worker 	| addrreg
1276*61046927SAndroid Build Coastguard Worker 	| channelenablereg
1277*61046927SAndroid Build Coastguard Worker 	| controlreg
1278*61046927SAndroid Build Coastguard Worker 	| flagreg
1279*61046927SAndroid Build Coastguard Worker 	| ipreg
1280*61046927SAndroid Build Coastguard Worker 	| maskreg
1281*61046927SAndroid Build Coastguard Worker 	| notifyreg
1282*61046927SAndroid Build Coastguard Worker 	| performancereg
1283*61046927SAndroid Build Coastguard Worker 	| statereg
1284*61046927SAndroid Build Coastguard Worker 	;
1285*61046927SAndroid Build Coastguard Worker 
1286*61046927SAndroid Build Coastguard Worker dstreg:
1287*61046927SAndroid Build Coastguard Worker 	directgenreg
1288*61046927SAndroid Build Coastguard Worker 	{
1289*61046927SAndroid Build Coastguard Worker 		$$ = $1;
1290*61046927SAndroid Build Coastguard Worker 		$$.address_mode = BRW_ADDRESS_DIRECT;
1291*61046927SAndroid Build Coastguard Worker 	}
1292*61046927SAndroid Build Coastguard Worker 	| indirectgenreg
1293*61046927SAndroid Build Coastguard Worker 	{
1294*61046927SAndroid Build Coastguard Worker 		$$ = $1;
1295*61046927SAndroid Build Coastguard Worker 		$$.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER;
1296*61046927SAndroid Build Coastguard Worker 	}
1297*61046927SAndroid Build Coastguard Worker 	;
1298*61046927SAndroid Build Coastguard Worker 
1299*61046927SAndroid Build Coastguard Worker /* Source register */
1300*61046927SAndroid Build Coastguard Worker srcaccimm:
1301*61046927SAndroid Build Coastguard Worker 	srcacc
1302*61046927SAndroid Build Coastguard Worker 	| immreg
1303*61046927SAndroid Build Coastguard Worker 	;
1304*61046927SAndroid Build Coastguard Worker 
1305*61046927SAndroid Build Coastguard Worker immreg:
1306*61046927SAndroid Build Coastguard Worker 	immval imm_type
1307*61046927SAndroid Build Coastguard Worker 	{
1308*61046927SAndroid Build Coastguard Worker 		switch ($2) {
1309*61046927SAndroid Build Coastguard Worker 		case BRW_TYPE_UD:
1310*61046927SAndroid Build Coastguard Worker 			$$ = brw_imm_ud($1);
1311*61046927SAndroid Build Coastguard Worker 			break;
1312*61046927SAndroid Build Coastguard Worker 		case BRW_TYPE_D:
1313*61046927SAndroid Build Coastguard Worker 			$$ = brw_imm_d($1);
1314*61046927SAndroid Build Coastguard Worker 			break;
1315*61046927SAndroid Build Coastguard Worker 		case BRW_TYPE_UW:
1316*61046927SAndroid Build Coastguard Worker 			$$ = brw_imm_uw($1 | ($1 << 16));
1317*61046927SAndroid Build Coastguard Worker 			break;
1318*61046927SAndroid Build Coastguard Worker 		case BRW_TYPE_W:
1319*61046927SAndroid Build Coastguard Worker 			$$ = brw_imm_w($1);
1320*61046927SAndroid Build Coastguard Worker 			break;
1321*61046927SAndroid Build Coastguard Worker 		case BRW_TYPE_F:
1322*61046927SAndroid Build Coastguard Worker 			$$ = brw_imm_reg(BRW_TYPE_F);
1323*61046927SAndroid Build Coastguard Worker 			/* Set u64 instead of ud since DIM uses a 64-bit F-typed imm */
1324*61046927SAndroid Build Coastguard Worker 			$$.u64 = $1;
1325*61046927SAndroid Build Coastguard Worker 			break;
1326*61046927SAndroid Build Coastguard Worker 		case BRW_TYPE_V:
1327*61046927SAndroid Build Coastguard Worker 			$$ = brw_imm_v($1);
1328*61046927SAndroid Build Coastguard Worker 			break;
1329*61046927SAndroid Build Coastguard Worker 		case BRW_TYPE_UV:
1330*61046927SAndroid Build Coastguard Worker 			$$ = brw_imm_uv($1);
1331*61046927SAndroid Build Coastguard Worker 			break;
1332*61046927SAndroid Build Coastguard Worker 		case BRW_TYPE_VF:
1333*61046927SAndroid Build Coastguard Worker 			$$ = brw_imm_vf($1);
1334*61046927SAndroid Build Coastguard Worker 			break;
1335*61046927SAndroid Build Coastguard Worker 		case BRW_TYPE_Q:
1336*61046927SAndroid Build Coastguard Worker 			$$ = brw_imm_q($1);
1337*61046927SAndroid Build Coastguard Worker 			break;
1338*61046927SAndroid Build Coastguard Worker 		case BRW_TYPE_UQ:
1339*61046927SAndroid Build Coastguard Worker 			$$ = brw_imm_uq($1);
1340*61046927SAndroid Build Coastguard Worker 			break;
1341*61046927SAndroid Build Coastguard Worker 		case BRW_TYPE_DF:
1342*61046927SAndroid Build Coastguard Worker 			$$ = brw_imm_reg(BRW_TYPE_DF);
1343*61046927SAndroid Build Coastguard Worker 			$$.d64 = $1;
1344*61046927SAndroid Build Coastguard Worker 			break;
1345*61046927SAndroid Build Coastguard Worker 		case BRW_TYPE_HF:
1346*61046927SAndroid Build Coastguard Worker 			$$ = brw_imm_reg(BRW_TYPE_HF);
1347*61046927SAndroid Build Coastguard Worker 			$$.ud = $1 | ($1 << 16);
1348*61046927SAndroid Build Coastguard Worker 			break;
1349*61046927SAndroid Build Coastguard Worker 		default:
1350*61046927SAndroid Build Coastguard Worker 			error(&@2, "Unknown immediate type %s\n",
1351*61046927SAndroid Build Coastguard Worker 			      brw_reg_type_to_letters($2));
1352*61046927SAndroid Build Coastguard Worker 		}
1353*61046927SAndroid Build Coastguard Worker 	}
1354*61046927SAndroid Build Coastguard Worker 	;
1355*61046927SAndroid Build Coastguard Worker 
1356*61046927SAndroid Build Coastguard Worker reg32:
1357*61046927SAndroid Build Coastguard Worker 	directgenreg region reg_type
1358*61046927SAndroid Build Coastguard Worker 	{
1359*61046927SAndroid Build Coastguard Worker 		$$ = set_direct_src_operand(&$1, $3);
1360*61046927SAndroid Build Coastguard Worker 		$$ = stride($$, $2.vstride, $2.width, $2.hstride);
1361*61046927SAndroid Build Coastguard Worker 	}
1362*61046927SAndroid Build Coastguard Worker 	;
1363*61046927SAndroid Build Coastguard Worker 
1364*61046927SAndroid Build Coastguard Worker payload:
1365*61046927SAndroid Build Coastguard Worker 	directsrcoperand
1366*61046927SAndroid Build Coastguard Worker 	;
1367*61046927SAndroid Build Coastguard Worker 
1368*61046927SAndroid Build Coastguard Worker src:
1369*61046927SAndroid Build Coastguard Worker 	directsrcoperand
1370*61046927SAndroid Build Coastguard Worker 	| indirectsrcoperand
1371*61046927SAndroid Build Coastguard Worker 	;
1372*61046927SAndroid Build Coastguard Worker 
1373*61046927SAndroid Build Coastguard Worker srcacc:
1374*61046927SAndroid Build Coastguard Worker 	directsrcaccoperand
1375*61046927SAndroid Build Coastguard Worker 	| indirectsrcoperand
1376*61046927SAndroid Build Coastguard Worker 	;
1377*61046927SAndroid Build Coastguard Worker 
1378*61046927SAndroid Build Coastguard Worker srcimm:
1379*61046927SAndroid Build Coastguard Worker 	directsrcoperand
1380*61046927SAndroid Build Coastguard Worker 	| indirectsrcoperand
1381*61046927SAndroid Build Coastguard Worker 	| immreg
1382*61046927SAndroid Build Coastguard Worker 	;
1383*61046927SAndroid Build Coastguard Worker 
1384*61046927SAndroid Build Coastguard Worker directsrcaccoperand:
1385*61046927SAndroid Build Coastguard Worker 	directsrcoperand
1386*61046927SAndroid Build Coastguard Worker 	| negate abs accreg region reg_type
1387*61046927SAndroid Build Coastguard Worker 	{
1388*61046927SAndroid Build Coastguard Worker 		$$ = set_direct_src_operand(&$3, $5);
1389*61046927SAndroid Build Coastguard Worker 		$$.negate = $1;
1390*61046927SAndroid Build Coastguard Worker 		$$.abs = $2;
1391*61046927SAndroid Build Coastguard Worker 		$$.vstride = $4.vstride;
1392*61046927SAndroid Build Coastguard Worker 		$$.width = $4.width;
1393*61046927SAndroid Build Coastguard Worker 		$$.hstride = $4.hstride;
1394*61046927SAndroid Build Coastguard Worker 	}
1395*61046927SAndroid Build Coastguard Worker 	;
1396*61046927SAndroid Build Coastguard Worker 
1397*61046927SAndroid Build Coastguard Worker srcarcoperandex:
1398*61046927SAndroid Build Coastguard Worker 	srcarcoperandex_typed region reg_type
1399*61046927SAndroid Build Coastguard Worker 	{
1400*61046927SAndroid Build Coastguard Worker 		$$ = brw_make_reg($1.file,
1401*61046927SAndroid Build Coastguard Worker 			          $1.nr,
1402*61046927SAndroid Build Coastguard Worker 			          $1.subnr,
1403*61046927SAndroid Build Coastguard Worker 			          0,
1404*61046927SAndroid Build Coastguard Worker 			          0,
1405*61046927SAndroid Build Coastguard Worker 			          $3,
1406*61046927SAndroid Build Coastguard Worker 			          $2.vstride,
1407*61046927SAndroid Build Coastguard Worker 			          $2.width,
1408*61046927SAndroid Build Coastguard Worker 			          $2.hstride,
1409*61046927SAndroid Build Coastguard Worker 			          BRW_SWIZZLE_NOOP,
1410*61046927SAndroid Build Coastguard Worker 			          WRITEMASK_XYZW);
1411*61046927SAndroid Build Coastguard Worker 	}
1412*61046927SAndroid Build Coastguard Worker 	| nullreg region reg_type
1413*61046927SAndroid Build Coastguard Worker 	{
1414*61046927SAndroid Build Coastguard Worker 		$$ = set_direct_src_operand(&$1, $3);
1415*61046927SAndroid Build Coastguard Worker 		$$.vstride = $2.vstride;
1416*61046927SAndroid Build Coastguard Worker 		$$.width = $2.width;
1417*61046927SAndroid Build Coastguard Worker 		$$.hstride = $2.hstride;
1418*61046927SAndroid Build Coastguard Worker 	}
1419*61046927SAndroid Build Coastguard Worker 	| threadcontrolreg
1420*61046927SAndroid Build Coastguard Worker 	{
1421*61046927SAndroid Build Coastguard Worker 		$$ = set_direct_src_operand(&$1, BRW_TYPE_UW);
1422*61046927SAndroid Build Coastguard Worker 	}
1423*61046927SAndroid Build Coastguard Worker 	;
1424*61046927SAndroid Build Coastguard Worker 
1425*61046927SAndroid Build Coastguard Worker srcarcoperandex_typed:
1426*61046927SAndroid Build Coastguard Worker 	channelenablereg
1427*61046927SAndroid Build Coastguard Worker 	| controlreg
1428*61046927SAndroid Build Coastguard Worker 	| flagreg
1429*61046927SAndroid Build Coastguard Worker 	| ipreg
1430*61046927SAndroid Build Coastguard Worker 	| maskreg
1431*61046927SAndroid Build Coastguard Worker 	| statereg
1432*61046927SAndroid Build Coastguard Worker 	;
1433*61046927SAndroid Build Coastguard Worker 
1434*61046927SAndroid Build Coastguard Worker indirectsrcoperand:
1435*61046927SAndroid Build Coastguard Worker 	negate abs indirectgenreg indirectregion swizzle reg_type
1436*61046927SAndroid Build Coastguard Worker 	{
1437*61046927SAndroid Build Coastguard Worker 		$$ = brw_make_reg($3.file,
1438*61046927SAndroid Build Coastguard Worker 			          0,
1439*61046927SAndroid Build Coastguard Worker 			          $3.subnr,
1440*61046927SAndroid Build Coastguard Worker 			          $1,  // negate
1441*61046927SAndroid Build Coastguard Worker 			          $2,  // abs
1442*61046927SAndroid Build Coastguard Worker 			          $6,
1443*61046927SAndroid Build Coastguard Worker 			          $4.vstride,
1444*61046927SAndroid Build Coastguard Worker 			          $4.width,
1445*61046927SAndroid Build Coastguard Worker 			          $4.hstride,
1446*61046927SAndroid Build Coastguard Worker 			          $5,
1447*61046927SAndroid Build Coastguard Worker 			          WRITEMASK_X);
1448*61046927SAndroid Build Coastguard Worker 
1449*61046927SAndroid Build Coastguard Worker 		$$.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER;
1450*61046927SAndroid Build Coastguard Worker 		// brw_reg set indirect_offset to 0 so set it to valid value
1451*61046927SAndroid Build Coastguard Worker 		$$.indirect_offset = $3.indirect_offset;
1452*61046927SAndroid Build Coastguard Worker 	}
1453*61046927SAndroid Build Coastguard Worker 	;
1454*61046927SAndroid Build Coastguard Worker 
1455*61046927SAndroid Build Coastguard Worker directgenreg_list:
1456*61046927SAndroid Build Coastguard Worker 	directgenreg
1457*61046927SAndroid Build Coastguard Worker 	| notifyreg
1458*61046927SAndroid Build Coastguard Worker 	| addrreg
1459*61046927SAndroid Build Coastguard Worker 	| performancereg
1460*61046927SAndroid Build Coastguard Worker 	;
1461*61046927SAndroid Build Coastguard Worker 
1462*61046927SAndroid Build Coastguard Worker directsrcoperand:
1463*61046927SAndroid Build Coastguard Worker 	negate abs directgenreg_list region swizzle reg_type
1464*61046927SAndroid Build Coastguard Worker 	{
1465*61046927SAndroid Build Coastguard Worker 		$$ = brw_make_reg($3.file,
1466*61046927SAndroid Build Coastguard Worker 			          $3.nr,
1467*61046927SAndroid Build Coastguard Worker 			          $3.subnr,
1468*61046927SAndroid Build Coastguard Worker 			          $1,
1469*61046927SAndroid Build Coastguard Worker 			          $2,
1470*61046927SAndroid Build Coastguard Worker 			          $6,
1471*61046927SAndroid Build Coastguard Worker 			          $4.vstride,
1472*61046927SAndroid Build Coastguard Worker 			          $4.width,
1473*61046927SAndroid Build Coastguard Worker 			          $4.hstride,
1474*61046927SAndroid Build Coastguard Worker 			          $5,
1475*61046927SAndroid Build Coastguard Worker 			          WRITEMASK_X);
1476*61046927SAndroid Build Coastguard Worker 	}
1477*61046927SAndroid Build Coastguard Worker 	| srcarcoperandex
1478*61046927SAndroid Build Coastguard Worker 	;
1479*61046927SAndroid Build Coastguard Worker 
1480*61046927SAndroid Build Coastguard Worker /* Address register */
1481*61046927SAndroid Build Coastguard Worker addrparam:
1482*61046927SAndroid Build Coastguard Worker 	addrreg exp
1483*61046927SAndroid Build Coastguard Worker 	{
1484*61046927SAndroid Build Coastguard Worker 		memset(&$$, '\0', sizeof($$));
1485*61046927SAndroid Build Coastguard Worker 		$$.subnr = $1.subnr;
1486*61046927SAndroid Build Coastguard Worker 		$$.indirect_offset = $2;
1487*61046927SAndroid Build Coastguard Worker 	}
1488*61046927SAndroid Build Coastguard Worker 	| addrreg
1489*61046927SAndroid Build Coastguard Worker 	;
1490*61046927SAndroid Build Coastguard Worker 
1491*61046927SAndroid Build Coastguard Worker /* Register files and register numbers */
1492*61046927SAndroid Build Coastguard Worker exp:
1493*61046927SAndroid Build Coastguard Worker 	INTEGER 	{ $$ = $1; }
1494*61046927SAndroid Build Coastguard Worker 	| LONG 	        { $$ = $1; }
1495*61046927SAndroid Build Coastguard Worker 	;
1496*61046927SAndroid Build Coastguard Worker 
1497*61046927SAndroid Build Coastguard Worker subregnum:
1498*61046927SAndroid Build Coastguard Worker 	DOT exp 		        { $$ = $2; }
1499*61046927SAndroid Build Coastguard Worker 	| /* empty */ %prec SUBREGNUM 	{ $$ = 0; }
1500*61046927SAndroid Build Coastguard Worker 	;
1501*61046927SAndroid Build Coastguard Worker 
1502*61046927SAndroid Build Coastguard Worker directgenreg:
1503*61046927SAndroid Build Coastguard Worker 	GENREG subregnum
1504*61046927SAndroid Build Coastguard Worker 	{
1505*61046927SAndroid Build Coastguard Worker 		memset(&$$, '\0', sizeof($$));
1506*61046927SAndroid Build Coastguard Worker 		$$.file = FIXED_GRF;
1507*61046927SAndroid Build Coastguard Worker 		$$.nr = $1 * reg_unit(p->devinfo);
1508*61046927SAndroid Build Coastguard Worker 		$$.subnr = $2;
1509*61046927SAndroid Build Coastguard Worker 	}
1510*61046927SAndroid Build Coastguard Worker 	;
1511*61046927SAndroid Build Coastguard Worker 
1512*61046927SAndroid Build Coastguard Worker indirectgenreg:
1513*61046927SAndroid Build Coastguard Worker 	GENREGFILE LSQUARE addrparam RSQUARE
1514*61046927SAndroid Build Coastguard Worker 	{
1515*61046927SAndroid Build Coastguard Worker 		memset(&$$, '\0', sizeof($$));
1516*61046927SAndroid Build Coastguard Worker 		$$.file = FIXED_GRF;
1517*61046927SAndroid Build Coastguard Worker 		$$.subnr = $3.subnr;
1518*61046927SAndroid Build Coastguard Worker 		$$.indirect_offset = $3.indirect_offset;
1519*61046927SAndroid Build Coastguard Worker 	}
1520*61046927SAndroid Build Coastguard Worker 	;
1521*61046927SAndroid Build Coastguard Worker 
1522*61046927SAndroid Build Coastguard Worker addrreg:
1523*61046927SAndroid Build Coastguard Worker 	ADDRREG subregnum
1524*61046927SAndroid Build Coastguard Worker 	{
1525*61046927SAndroid Build Coastguard Worker 		int subnr = 16;
1526*61046927SAndroid Build Coastguard Worker 
1527*61046927SAndroid Build Coastguard Worker 		if ($2 > subnr)
1528*61046927SAndroid Build Coastguard Worker 			error(&@2, "Address sub register number %d"
1529*61046927SAndroid Build Coastguard Worker 				   "out of range\n", $2);
1530*61046927SAndroid Build Coastguard Worker 
1531*61046927SAndroid Build Coastguard Worker 		$$.file = ARF;
1532*61046927SAndroid Build Coastguard Worker 		$$.nr = BRW_ARF_ADDRESS;
1533*61046927SAndroid Build Coastguard Worker 		$$.subnr = $2;
1534*61046927SAndroid Build Coastguard Worker 	}
1535*61046927SAndroid Build Coastguard Worker 	;
1536*61046927SAndroid Build Coastguard Worker 
1537*61046927SAndroid Build Coastguard Worker accreg:
1538*61046927SAndroid Build Coastguard Worker 	ACCREG subregnum
1539*61046927SAndroid Build Coastguard Worker 	{
1540*61046927SAndroid Build Coastguard Worker 		int nr_reg = 10;
1541*61046927SAndroid Build Coastguard Worker 
1542*61046927SAndroid Build Coastguard Worker 		if ($1 > nr_reg)
1543*61046927SAndroid Build Coastguard Worker 			error(&@1, "Accumulator register number %d"
1544*61046927SAndroid Build Coastguard Worker 				   " out of range\n", $1);
1545*61046927SAndroid Build Coastguard Worker 
1546*61046927SAndroid Build Coastguard Worker 		memset(&$$, '\0', sizeof($$));
1547*61046927SAndroid Build Coastguard Worker 		$$.file = ARF;
1548*61046927SAndroid Build Coastguard Worker 		$$.nr = BRW_ARF_ACCUMULATOR;
1549*61046927SAndroid Build Coastguard Worker 		$$.subnr = $2;
1550*61046927SAndroid Build Coastguard Worker 	}
1551*61046927SAndroid Build Coastguard Worker 	;
1552*61046927SAndroid Build Coastguard Worker 
1553*61046927SAndroid Build Coastguard Worker flagreg:
1554*61046927SAndroid Build Coastguard Worker 	FLAGREG subregnum
1555*61046927SAndroid Build Coastguard Worker 	{
1556*61046927SAndroid Build Coastguard Worker 		// 2 flag reg
1557*61046927SAndroid Build Coastguard Worker 		int nr_reg = 2;
1558*61046927SAndroid Build Coastguard Worker 		int subnr = nr_reg;
1559*61046927SAndroid Build Coastguard Worker 
1560*61046927SAndroid Build Coastguard Worker 		if ($1 > nr_reg)
1561*61046927SAndroid Build Coastguard Worker 			error(&@1, "Flag register number %d"
1562*61046927SAndroid Build Coastguard Worker 				   " out of range \n", $1);
1563*61046927SAndroid Build Coastguard Worker 		if ($2 > subnr)
1564*61046927SAndroid Build Coastguard Worker 			error(&@2, "Flag subregister number %d"
1565*61046927SAndroid Build Coastguard Worker 				   " out of range\n", $2);
1566*61046927SAndroid Build Coastguard Worker 
1567*61046927SAndroid Build Coastguard Worker 		$$.file = ARF;
1568*61046927SAndroid Build Coastguard Worker 		$$.nr = BRW_ARF_FLAG | $1;
1569*61046927SAndroid Build Coastguard Worker 		$$.subnr = $2;
1570*61046927SAndroid Build Coastguard Worker 	}
1571*61046927SAndroid Build Coastguard Worker 	;
1572*61046927SAndroid Build Coastguard Worker 
1573*61046927SAndroid Build Coastguard Worker maskreg:
1574*61046927SAndroid Build Coastguard Worker 	MASKREG subregnum
1575*61046927SAndroid Build Coastguard Worker 	{
1576*61046927SAndroid Build Coastguard Worker 		if ($1 > 0)
1577*61046927SAndroid Build Coastguard Worker 			error(&@1, "Mask register number %d"
1578*61046927SAndroid Build Coastguard Worker 				   " out of range\n", $1);
1579*61046927SAndroid Build Coastguard Worker 
1580*61046927SAndroid Build Coastguard Worker 		$$.file = ARF;
1581*61046927SAndroid Build Coastguard Worker 		$$.nr = BRW_ARF_MASK;
1582*61046927SAndroid Build Coastguard Worker 		$$.subnr = $2;
1583*61046927SAndroid Build Coastguard Worker 	}
1584*61046927SAndroid Build Coastguard Worker 	;
1585*61046927SAndroid Build Coastguard Worker 
1586*61046927SAndroid Build Coastguard Worker notifyreg:
1587*61046927SAndroid Build Coastguard Worker 	NOTIFYREG subregnum
1588*61046927SAndroid Build Coastguard Worker 	{
1589*61046927SAndroid Build Coastguard Worker 		int subnr = (p->devinfo->ver >= 11) ? 2 : 3;
1590*61046927SAndroid Build Coastguard Worker 		if ($2 > subnr)
1591*61046927SAndroid Build Coastguard Worker 			error(&@2, "Notification sub register number %d"
1592*61046927SAndroid Build Coastguard Worker 				   " out of range\n", $2);
1593*61046927SAndroid Build Coastguard Worker 
1594*61046927SAndroid Build Coastguard Worker 		$$.file = ARF;
1595*61046927SAndroid Build Coastguard Worker 		$$.nr = BRW_ARF_NOTIFICATION_COUNT;
1596*61046927SAndroid Build Coastguard Worker 		$$.subnr = $2;
1597*61046927SAndroid Build Coastguard Worker 	}
1598*61046927SAndroid Build Coastguard Worker 	;
1599*61046927SAndroid Build Coastguard Worker 
1600*61046927SAndroid Build Coastguard Worker statereg:
1601*61046927SAndroid Build Coastguard Worker 	STATEREG subregnum
1602*61046927SAndroid Build Coastguard Worker 	{
1603*61046927SAndroid Build Coastguard Worker 		if ($1 > 2)
1604*61046927SAndroid Build Coastguard Worker 			error(&@1, "State register number %d"
1605*61046927SAndroid Build Coastguard Worker 				   " out of range\n", $1);
1606*61046927SAndroid Build Coastguard Worker 
1607*61046927SAndroid Build Coastguard Worker 		if ($2 > 4)
1608*61046927SAndroid Build Coastguard Worker 			error(&@2, "State sub register number %d"
1609*61046927SAndroid Build Coastguard Worker 				   " out of range\n", $2);
1610*61046927SAndroid Build Coastguard Worker 
1611*61046927SAndroid Build Coastguard Worker 		$$.file = ARF;
1612*61046927SAndroid Build Coastguard Worker 		$$.nr = BRW_ARF_STATE;
1613*61046927SAndroid Build Coastguard Worker 		$$.subnr = $2;
1614*61046927SAndroid Build Coastguard Worker 	}
1615*61046927SAndroid Build Coastguard Worker 	;
1616*61046927SAndroid Build Coastguard Worker 
1617*61046927SAndroid Build Coastguard Worker controlreg:
1618*61046927SAndroid Build Coastguard Worker 	CONTROLREG subregnum
1619*61046927SAndroid Build Coastguard Worker 	{
1620*61046927SAndroid Build Coastguard Worker 		if ($2 > 3)
1621*61046927SAndroid Build Coastguard Worker 			error(&@2, "control sub register number %d"
1622*61046927SAndroid Build Coastguard Worker 				   " out of range\n", $2);
1623*61046927SAndroid Build Coastguard Worker 
1624*61046927SAndroid Build Coastguard Worker 		$$.file = ARF;
1625*61046927SAndroid Build Coastguard Worker 		$$.nr = BRW_ARF_CONTROL;
1626*61046927SAndroid Build Coastguard Worker 		$$.subnr = $2;
1627*61046927SAndroid Build Coastguard Worker 	}
1628*61046927SAndroid Build Coastguard Worker 	;
1629*61046927SAndroid Build Coastguard Worker 
1630*61046927SAndroid Build Coastguard Worker ipreg:
1631*61046927SAndroid Build Coastguard Worker 	IPREG		{ $$ = brw_ip_reg(); }
1632*61046927SAndroid Build Coastguard Worker 	;
1633*61046927SAndroid Build Coastguard Worker 
1634*61046927SAndroid Build Coastguard Worker nullreg:
1635*61046927SAndroid Build Coastguard Worker 	NULL_TOKEN 	{ $$ = brw_null_reg(); }
1636*61046927SAndroid Build Coastguard Worker 	;
1637*61046927SAndroid Build Coastguard Worker 
1638*61046927SAndroid Build Coastguard Worker threadcontrolreg:
1639*61046927SAndroid Build Coastguard Worker 	THREADREG subregnum
1640*61046927SAndroid Build Coastguard Worker 	{
1641*61046927SAndroid Build Coastguard Worker 		if ($2 > 7)
1642*61046927SAndroid Build Coastguard Worker 			error(&@2, "Thread control sub register number %d"
1643*61046927SAndroid Build Coastguard Worker 				   " out of range\n", $2);
1644*61046927SAndroid Build Coastguard Worker 
1645*61046927SAndroid Build Coastguard Worker 		$$.file = ARF;
1646*61046927SAndroid Build Coastguard Worker 		$$.nr = BRW_ARF_TDR;
1647*61046927SAndroid Build Coastguard Worker 		$$.subnr = $2;
1648*61046927SAndroid Build Coastguard Worker 	}
1649*61046927SAndroid Build Coastguard Worker 	;
1650*61046927SAndroid Build Coastguard Worker 
1651*61046927SAndroid Build Coastguard Worker performancereg:
1652*61046927SAndroid Build Coastguard Worker 	PERFORMANCEREG subregnum
1653*61046927SAndroid Build Coastguard Worker 	{
1654*61046927SAndroid Build Coastguard Worker 		int subnr;
1655*61046927SAndroid Build Coastguard Worker 		if (p->devinfo->ver >= 10)
1656*61046927SAndroid Build Coastguard Worker 			subnr = 5;
1657*61046927SAndroid Build Coastguard Worker 		else
1658*61046927SAndroid Build Coastguard Worker 			subnr = 4;
1659*61046927SAndroid Build Coastguard Worker 
1660*61046927SAndroid Build Coastguard Worker 		if ($2 > subnr)
1661*61046927SAndroid Build Coastguard Worker 			error(&@2, "Performance sub register number %d"
1662*61046927SAndroid Build Coastguard Worker 				   " out of range\n", $2);
1663*61046927SAndroid Build Coastguard Worker 
1664*61046927SAndroid Build Coastguard Worker 		$$.file = ARF;
1665*61046927SAndroid Build Coastguard Worker 		$$.nr = BRW_ARF_TIMESTAMP;
1666*61046927SAndroid Build Coastguard Worker 		$$.subnr = $2;
1667*61046927SAndroid Build Coastguard Worker 	}
1668*61046927SAndroid Build Coastguard Worker 	;
1669*61046927SAndroid Build Coastguard Worker 
1670*61046927SAndroid Build Coastguard Worker channelenablereg:
1671*61046927SAndroid Build Coastguard Worker 	CHANNELENABLEREG subregnum
1672*61046927SAndroid Build Coastguard Worker 	{
1673*61046927SAndroid Build Coastguard Worker 		if ($1 > 0)
1674*61046927SAndroid Build Coastguard Worker 			error(&@1, "Channel enable register number %d"
1675*61046927SAndroid Build Coastguard Worker 				   " out of range\n", $1);
1676*61046927SAndroid Build Coastguard Worker 
1677*61046927SAndroid Build Coastguard Worker 		$$.file = ARF;
1678*61046927SAndroid Build Coastguard Worker 		$$.nr = BRW_ARF_MASK;
1679*61046927SAndroid Build Coastguard Worker 		$$.subnr = $2;
1680*61046927SAndroid Build Coastguard Worker 	}
1681*61046927SAndroid Build Coastguard Worker 	;
1682*61046927SAndroid Build Coastguard Worker 
1683*61046927SAndroid Build Coastguard Worker /* Immediate values */
1684*61046927SAndroid Build Coastguard Worker immval:
1685*61046927SAndroid Build Coastguard Worker 	exp2
1686*61046927SAndroid Build Coastguard Worker 	{
1687*61046927SAndroid Build Coastguard Worker 		$$ = $1;
1688*61046927SAndroid Build Coastguard Worker 	}
1689*61046927SAndroid Build Coastguard Worker 	| LSQUARE exp2 COMMA exp2 COMMA exp2 COMMA exp2 RSQUARE
1690*61046927SAndroid Build Coastguard Worker 	{
1691*61046927SAndroid Build Coastguard Worker 		$$ = ($2 << 0) | ($4 << 8) | ($6 << 16) | ($8 << 24);
1692*61046927SAndroid Build Coastguard Worker 	}
1693*61046927SAndroid Build Coastguard Worker 	;
1694*61046927SAndroid Build Coastguard Worker 
1695*61046927SAndroid Build Coastguard Worker /* Regions */
1696*61046927SAndroid Build Coastguard Worker dstregion:
1697*61046927SAndroid Build Coastguard Worker 	/* empty */
1698*61046927SAndroid Build Coastguard Worker 	{
1699*61046927SAndroid Build Coastguard Worker 		$$ = BRW_HORIZONTAL_STRIDE_1;
1700*61046927SAndroid Build Coastguard Worker 	}
1701*61046927SAndroid Build Coastguard Worker 	| LANGLE exp RANGLE
1702*61046927SAndroid Build Coastguard Worker 	{
1703*61046927SAndroid Build Coastguard Worker 		if ($2 != 0 && ($2 > 4 || !isPowerofTwo($2)))
1704*61046927SAndroid Build Coastguard Worker 			error(&@2, "Invalid Horizontal stride %d\n", $2);
1705*61046927SAndroid Build Coastguard Worker 
1706*61046927SAndroid Build Coastguard Worker 		$$ = ffs($2);
1707*61046927SAndroid Build Coastguard Worker 	}
1708*61046927SAndroid Build Coastguard Worker 	;
1709*61046927SAndroid Build Coastguard Worker 
1710*61046927SAndroid Build Coastguard Worker indirectregion:
1711*61046927SAndroid Build Coastguard Worker 	region
1712*61046927SAndroid Build Coastguard Worker 	| region_wh
1713*61046927SAndroid Build Coastguard Worker 	;
1714*61046927SAndroid Build Coastguard Worker 
1715*61046927SAndroid Build Coastguard Worker region:
1716*61046927SAndroid Build Coastguard Worker 	/* empty */
1717*61046927SAndroid Build Coastguard Worker 	{
1718*61046927SAndroid Build Coastguard Worker 		$$ = stride($$, 0, 1, 0);
1719*61046927SAndroid Build Coastguard Worker 	}
1720*61046927SAndroid Build Coastguard Worker 	| LANGLE exp RANGLE
1721*61046927SAndroid Build Coastguard Worker 	{
1722*61046927SAndroid Build Coastguard Worker 		if ($2 != 0 && ($2 > 32 || !isPowerofTwo($2)))
1723*61046927SAndroid Build Coastguard Worker 			error(&@2, "Invalid VertStride %d\n", $2);
1724*61046927SAndroid Build Coastguard Worker 
1725*61046927SAndroid Build Coastguard Worker 		$$ = stride($$, $2, 1, 0);
1726*61046927SAndroid Build Coastguard Worker 	}
1727*61046927SAndroid Build Coastguard Worker 	| LANGLE exp COMMA exp COMMA exp RANGLE
1728*61046927SAndroid Build Coastguard Worker 	{
1729*61046927SAndroid Build Coastguard Worker 
1730*61046927SAndroid Build Coastguard Worker 		if ($2 != 0 && ($2 > 32 || !isPowerofTwo($2)))
1731*61046927SAndroid Build Coastguard Worker 			error(&@2, "Invalid VertStride %d\n", $2);
1732*61046927SAndroid Build Coastguard Worker 
1733*61046927SAndroid Build Coastguard Worker 		if ($4 > 16 || !isPowerofTwo($4))
1734*61046927SAndroid Build Coastguard Worker 			error(&@4, "Invalid width %d\n", $4);
1735*61046927SAndroid Build Coastguard Worker 
1736*61046927SAndroid Build Coastguard Worker 		if ($6 != 0 && ($6 > 4 || !isPowerofTwo($6)))
1737*61046927SAndroid Build Coastguard Worker 			error(&@6, "Invalid Horizontal stride in"
1738*61046927SAndroid Build Coastguard Worker 				   "  region_wh %d\n", $6);
1739*61046927SAndroid Build Coastguard Worker 
1740*61046927SAndroid Build Coastguard Worker 		$$ = stride($$, $2, $4, $6);
1741*61046927SAndroid Build Coastguard Worker 	}
1742*61046927SAndroid Build Coastguard Worker 	| LANGLE exp SEMICOLON exp COMMA exp RANGLE
1743*61046927SAndroid Build Coastguard Worker 	{
1744*61046927SAndroid Build Coastguard Worker 		if ($2 != 0 && ($2 > 32 || !isPowerofTwo($2)))
1745*61046927SAndroid Build Coastguard Worker 			error(&@2, "Invalid VertStride %d\n", $2);
1746*61046927SAndroid Build Coastguard Worker 
1747*61046927SAndroid Build Coastguard Worker 		if ($4 > 16 || !isPowerofTwo($4))
1748*61046927SAndroid Build Coastguard Worker 			error(&@4, "Invalid width %d\n", $4);
1749*61046927SAndroid Build Coastguard Worker 
1750*61046927SAndroid Build Coastguard Worker 		if ($6 != 0 && ($6 > 4 || !isPowerofTwo($6)))
1751*61046927SAndroid Build Coastguard Worker 			error(&@6, "Invalid Horizontal stride in"
1752*61046927SAndroid Build Coastguard Worker 				   " region_wh %d\n", $6);
1753*61046927SAndroid Build Coastguard Worker 
1754*61046927SAndroid Build Coastguard Worker 		$$ = stride($$, $2, $4, $6);
1755*61046927SAndroid Build Coastguard Worker 	}
1756*61046927SAndroid Build Coastguard Worker 	| LANGLE VxH COMMA exp COMMA exp RANGLE
1757*61046927SAndroid Build Coastguard Worker 	{
1758*61046927SAndroid Build Coastguard Worker 		if ($4 > 16 || !isPowerofTwo($4))
1759*61046927SAndroid Build Coastguard Worker 			error(&@4, "Invalid width %d\n", $4);
1760*61046927SAndroid Build Coastguard Worker 
1761*61046927SAndroid Build Coastguard Worker 		if ($6 != 0 && ($6 > 4 || !isPowerofTwo($6)))
1762*61046927SAndroid Build Coastguard Worker 			error(&@6, "Invalid Horizontal stride in"
1763*61046927SAndroid Build Coastguard Worker 				   " region_wh %d\n", $6);
1764*61046927SAndroid Build Coastguard Worker 
1765*61046927SAndroid Build Coastguard Worker 		$$ = brw_VxH_indirect(0, 0);
1766*61046927SAndroid Build Coastguard Worker 	}
1767*61046927SAndroid Build Coastguard Worker 	;
1768*61046927SAndroid Build Coastguard Worker 
1769*61046927SAndroid Build Coastguard Worker region_wh:
1770*61046927SAndroid Build Coastguard Worker 	LANGLE exp COMMA exp RANGLE
1771*61046927SAndroid Build Coastguard Worker 	{
1772*61046927SAndroid Build Coastguard Worker 		if ($2 > 16 || !isPowerofTwo($2))
1773*61046927SAndroid Build Coastguard Worker 			error(&@2, "Invalid width %d\n", $2);
1774*61046927SAndroid Build Coastguard Worker 
1775*61046927SAndroid Build Coastguard Worker 		if ($4 != 0 && ($4 > 4 || !isPowerofTwo($4)))
1776*61046927SAndroid Build Coastguard Worker 			error(&@4, "Invalid Horizontal stride in"
1777*61046927SAndroid Build Coastguard Worker 				   " region_wh %d\n", $4);
1778*61046927SAndroid Build Coastguard Worker 
1779*61046927SAndroid Build Coastguard Worker 		$$ = stride($$, 0, $2, $4);
1780*61046927SAndroid Build Coastguard Worker 		$$.vstride = BRW_VERTICAL_STRIDE_ONE_DIMENSIONAL;
1781*61046927SAndroid Build Coastguard Worker 	}
1782*61046927SAndroid Build Coastguard Worker 	;
1783*61046927SAndroid Build Coastguard Worker 
1784*61046927SAndroid Build Coastguard Worker reg_type:
1785*61046927SAndroid Build Coastguard Worker 	  TYPE_F 	{ $$ = BRW_TYPE_F;  }
1786*61046927SAndroid Build Coastguard Worker 	| TYPE_UD 	{ $$ = BRW_TYPE_UD; }
1787*61046927SAndroid Build Coastguard Worker 	| TYPE_D 	{ $$ = BRW_TYPE_D;  }
1788*61046927SAndroid Build Coastguard Worker 	| TYPE_UW 	{ $$ = BRW_TYPE_UW; }
1789*61046927SAndroid Build Coastguard Worker 	| TYPE_W 	{ $$ = BRW_TYPE_W;  }
1790*61046927SAndroid Build Coastguard Worker 	| TYPE_UB 	{ $$ = BRW_TYPE_UB; }
1791*61046927SAndroid Build Coastguard Worker 	| TYPE_B 	{ $$ = BRW_TYPE_B;  }
1792*61046927SAndroid Build Coastguard Worker 	| TYPE_DF 	{ $$ = BRW_TYPE_DF; }
1793*61046927SAndroid Build Coastguard Worker 	| TYPE_UQ 	{ $$ = BRW_TYPE_UQ; }
1794*61046927SAndroid Build Coastguard Worker 	| TYPE_Q 	{ $$ = BRW_TYPE_Q;  }
1795*61046927SAndroid Build Coastguard Worker 	| TYPE_HF 	{ $$ = BRW_TYPE_HF; }
1796*61046927SAndroid Build Coastguard Worker 	;
1797*61046927SAndroid Build Coastguard Worker 
1798*61046927SAndroid Build Coastguard Worker imm_type:
1799*61046927SAndroid Build Coastguard Worker 	reg_type 	{ $$ = $1; }
1800*61046927SAndroid Build Coastguard Worker 	| TYPE_V 	{ $$ = BRW_TYPE_V;  }
1801*61046927SAndroid Build Coastguard Worker 	| TYPE_VF 	{ $$ = BRW_TYPE_VF; }
1802*61046927SAndroid Build Coastguard Worker 	| TYPE_UV 	{ $$ = BRW_TYPE_UV; }
1803*61046927SAndroid Build Coastguard Worker 	;
1804*61046927SAndroid Build Coastguard Worker 
1805*61046927SAndroid Build Coastguard Worker writemask:
1806*61046927SAndroid Build Coastguard Worker 	/* empty */
1807*61046927SAndroid Build Coastguard Worker 	{
1808*61046927SAndroid Build Coastguard Worker 		$$ = WRITEMASK_XYZW;
1809*61046927SAndroid Build Coastguard Worker 	}
1810*61046927SAndroid Build Coastguard Worker 	| DOT writemask_x writemask_y writemask_z writemask_w
1811*61046927SAndroid Build Coastguard Worker 	{
1812*61046927SAndroid Build Coastguard Worker 		$$ = $2 | $3 | $4 | $5;
1813*61046927SAndroid Build Coastguard Worker 	}
1814*61046927SAndroid Build Coastguard Worker 	;
1815*61046927SAndroid Build Coastguard Worker 
1816*61046927SAndroid Build Coastguard Worker writemask_x:
1817*61046927SAndroid Build Coastguard Worker 	/* empty */ 	{ $$ = 0; }
1818*61046927SAndroid Build Coastguard Worker 	| X 	{ $$ = 1 << BRW_CHANNEL_X; }
1819*61046927SAndroid Build Coastguard Worker 	;
1820*61046927SAndroid Build Coastguard Worker 
1821*61046927SAndroid Build Coastguard Worker writemask_y:
1822*61046927SAndroid Build Coastguard Worker 	/* empty */ 	{ $$ = 0; }
1823*61046927SAndroid Build Coastguard Worker 	| Y 	{ $$ = 1 << BRW_CHANNEL_Y; }
1824*61046927SAndroid Build Coastguard Worker 	;
1825*61046927SAndroid Build Coastguard Worker 
1826*61046927SAndroid Build Coastguard Worker writemask_z:
1827*61046927SAndroid Build Coastguard Worker 	/* empty */ 	{ $$ = 0; }
1828*61046927SAndroid Build Coastguard Worker 	| Z 	{ $$ = 1 << BRW_CHANNEL_Z; }
1829*61046927SAndroid Build Coastguard Worker 	;
1830*61046927SAndroid Build Coastguard Worker 
1831*61046927SAndroid Build Coastguard Worker writemask_w:
1832*61046927SAndroid Build Coastguard Worker 	/* empty */ 	{ $$ = 0; }
1833*61046927SAndroid Build Coastguard Worker 	| W 	{ $$ = 1 << BRW_CHANNEL_W; }
1834*61046927SAndroid Build Coastguard Worker 	;
1835*61046927SAndroid Build Coastguard Worker 
1836*61046927SAndroid Build Coastguard Worker swizzle:
1837*61046927SAndroid Build Coastguard Worker 	/* empty */
1838*61046927SAndroid Build Coastguard Worker 	{
1839*61046927SAndroid Build Coastguard Worker 		$$ = BRW_SWIZZLE_NOOP;
1840*61046927SAndroid Build Coastguard Worker 	}
1841*61046927SAndroid Build Coastguard Worker 	| DOT chansel
1842*61046927SAndroid Build Coastguard Worker 	{
1843*61046927SAndroid Build Coastguard Worker 		$$ = BRW_SWIZZLE4($2, $2, $2, $2);
1844*61046927SAndroid Build Coastguard Worker 	}
1845*61046927SAndroid Build Coastguard Worker 	| DOT chansel chansel chansel chansel
1846*61046927SAndroid Build Coastguard Worker 	{
1847*61046927SAndroid Build Coastguard Worker 		$$ = BRW_SWIZZLE4($2, $3, $4, $5);
1848*61046927SAndroid Build Coastguard Worker 	}
1849*61046927SAndroid Build Coastguard Worker 	;
1850*61046927SAndroid Build Coastguard Worker 
1851*61046927SAndroid Build Coastguard Worker chansel:
1852*61046927SAndroid Build Coastguard Worker 	X
1853*61046927SAndroid Build Coastguard Worker 	| Y
1854*61046927SAndroid Build Coastguard Worker 	| Z
1855*61046927SAndroid Build Coastguard Worker 	| W
1856*61046927SAndroid Build Coastguard Worker 	;
1857*61046927SAndroid Build Coastguard Worker 
1858*61046927SAndroid Build Coastguard Worker /* Instruction prediction and modifiers */
1859*61046927SAndroid Build Coastguard Worker predicate:
1860*61046927SAndroid Build Coastguard Worker 	/* empty */
1861*61046927SAndroid Build Coastguard Worker 	{
1862*61046927SAndroid Build Coastguard Worker 		brw_push_insn_state(p);
1863*61046927SAndroid Build Coastguard Worker 		brw_set_default_predicate_control(p, BRW_PREDICATE_NONE);
1864*61046927SAndroid Build Coastguard Worker 		brw_set_default_flag_reg(p, 0, 0);
1865*61046927SAndroid Build Coastguard Worker 		brw_set_default_predicate_inverse(p, false);
1866*61046927SAndroid Build Coastguard Worker 	}
1867*61046927SAndroid Build Coastguard Worker 	| LPAREN predstate flagreg predctrl RPAREN
1868*61046927SAndroid Build Coastguard Worker 	{
1869*61046927SAndroid Build Coastguard Worker 		brw_push_insn_state(p);
1870*61046927SAndroid Build Coastguard Worker 		brw_set_default_predicate_inverse(p, $2);
1871*61046927SAndroid Build Coastguard Worker 		brw_set_default_flag_reg(p, $3.nr, $3.subnr);
1872*61046927SAndroid Build Coastguard Worker 		brw_set_default_predicate_control(p, $4);
1873*61046927SAndroid Build Coastguard Worker 	}
1874*61046927SAndroid Build Coastguard Worker 	;
1875*61046927SAndroid Build Coastguard Worker 
1876*61046927SAndroid Build Coastguard Worker predstate:
1877*61046927SAndroid Build Coastguard Worker 	/* empty */     { $$ = 0; }
1878*61046927SAndroid Build Coastguard Worker 	| PLUS 	        { $$ = 0; }
1879*61046927SAndroid Build Coastguard Worker 	| MINUS 	{ $$ = 1; }
1880*61046927SAndroid Build Coastguard Worker 	;
1881*61046927SAndroid Build Coastguard Worker 
1882*61046927SAndroid Build Coastguard Worker predctrl:
1883*61046927SAndroid Build Coastguard Worker 	/* empty */ 	{ $$ = BRW_PREDICATE_NORMAL; }
1884*61046927SAndroid Build Coastguard Worker 	| DOT X 	{ $$ = BRW_PREDICATE_ALIGN16_REPLICATE_X; }
1885*61046927SAndroid Build Coastguard Worker 	| DOT Y 	{ $$ = BRW_PREDICATE_ALIGN16_REPLICATE_Y; }
1886*61046927SAndroid Build Coastguard Worker 	| DOT Z 	{ $$ = BRW_PREDICATE_ALIGN16_REPLICATE_Z; }
1887*61046927SAndroid Build Coastguard Worker 	| DOT W 	{ $$ = BRW_PREDICATE_ALIGN16_REPLICATE_W; }
1888*61046927SAndroid Build Coastguard Worker 	| ANYV
1889*61046927SAndroid Build Coastguard Worker 	| ALLV
1890*61046927SAndroid Build Coastguard Worker 	| ANY2H
1891*61046927SAndroid Build Coastguard Worker 	| ALL2H
1892*61046927SAndroid Build Coastguard Worker 	| ANY4H
1893*61046927SAndroid Build Coastguard Worker 	| ALL4H
1894*61046927SAndroid Build Coastguard Worker 	| ANY8H
1895*61046927SAndroid Build Coastguard Worker 	| ALL8H
1896*61046927SAndroid Build Coastguard Worker 	| ANY16H
1897*61046927SAndroid Build Coastguard Worker 	| ALL16H
1898*61046927SAndroid Build Coastguard Worker 	| ANY32H
1899*61046927SAndroid Build Coastguard Worker 	| ALL32H
1900*61046927SAndroid Build Coastguard Worker 	;
1901*61046927SAndroid Build Coastguard Worker 
1902*61046927SAndroid Build Coastguard Worker /* Source Modification */
1903*61046927SAndroid Build Coastguard Worker negate:
1904*61046927SAndroid Build Coastguard Worker 	/* empty */	{ $$ = 0; }
1905*61046927SAndroid Build Coastguard Worker 	| MINUS 	{ $$ = 1; }
1906*61046927SAndroid Build Coastguard Worker 	;
1907*61046927SAndroid Build Coastguard Worker 
1908*61046927SAndroid Build Coastguard Worker abs:
1909*61046927SAndroid Build Coastguard Worker 	/* empty */ 	{ $$ = 0; }
1910*61046927SAndroid Build Coastguard Worker 	| ABS 	{ $$ = 1; }
1911*61046927SAndroid Build Coastguard Worker 	;
1912*61046927SAndroid Build Coastguard Worker 
1913*61046927SAndroid Build Coastguard Worker /* Flag (Conditional) Modifier */
1914*61046927SAndroid Build Coastguard Worker cond_mod:
1915*61046927SAndroid Build Coastguard Worker 	condModifiers
1916*61046927SAndroid Build Coastguard Worker 	{
1917*61046927SAndroid Build Coastguard Worker 		$$.cond_modifier = $1;
1918*61046927SAndroid Build Coastguard Worker 		$$.flag_reg_nr = 0;
1919*61046927SAndroid Build Coastguard Worker 		$$.flag_subreg_nr = 0;
1920*61046927SAndroid Build Coastguard Worker 	}
1921*61046927SAndroid Build Coastguard Worker 	| condModifiers DOT flagreg
1922*61046927SAndroid Build Coastguard Worker 	{
1923*61046927SAndroid Build Coastguard Worker 		$$.cond_modifier = $1;
1924*61046927SAndroid Build Coastguard Worker 		$$.flag_reg_nr = $3.nr;
1925*61046927SAndroid Build Coastguard Worker 		$$.flag_subreg_nr = $3.subnr;
1926*61046927SAndroid Build Coastguard Worker 	}
1927*61046927SAndroid Build Coastguard Worker 	;
1928*61046927SAndroid Build Coastguard Worker 
1929*61046927SAndroid Build Coastguard Worker condModifiers:
1930*61046927SAndroid Build Coastguard Worker 	/* empty */ 	{ $$ = BRW_CONDITIONAL_NONE; }
1931*61046927SAndroid Build Coastguard Worker 	| ZERO
1932*61046927SAndroid Build Coastguard Worker 	| EQUAL
1933*61046927SAndroid Build Coastguard Worker 	| NOT_ZERO
1934*61046927SAndroid Build Coastguard Worker 	| NOT_EQUAL
1935*61046927SAndroid Build Coastguard Worker 	| GREATER
1936*61046927SAndroid Build Coastguard Worker 	| GREATER_EQUAL
1937*61046927SAndroid Build Coastguard Worker 	| LESS
1938*61046927SAndroid Build Coastguard Worker 	| LESS_EQUAL
1939*61046927SAndroid Build Coastguard Worker 	| OVERFLOW
1940*61046927SAndroid Build Coastguard Worker 	| ROUND_INCREMENT
1941*61046927SAndroid Build Coastguard Worker 	| UNORDERED
1942*61046927SAndroid Build Coastguard Worker 	;
1943*61046927SAndroid Build Coastguard Worker 
1944*61046927SAndroid Build Coastguard Worker /* message details for send */
1945*61046927SAndroid Build Coastguard Worker msgdesc:
1946*61046927SAndroid Build Coastguard Worker 	MSGDESC_BEGIN msgdesc_parts MSGDESC_END { $$ = $2; }
1947*61046927SAndroid Build Coastguard Worker 	;
1948*61046927SAndroid Build Coastguard Worker 
1949*61046927SAndroid Build Coastguard Worker msgdesc_parts:
1950*61046927SAndroid Build Coastguard Worker 	SRC1_LEN ASSIGN INTEGER msgdesc_parts
1951*61046927SAndroid Build Coastguard Worker 	{
1952*61046927SAndroid Build Coastguard Worker 		$$ = $4;
1953*61046927SAndroid Build Coastguard Worker 		$$.src1_len = $3;
1954*61046927SAndroid Build Coastguard Worker 	}
1955*61046927SAndroid Build Coastguard Worker 	| EX_BSO msgdesc_parts
1956*61046927SAndroid Build Coastguard Worker 	{
1957*61046927SAndroid Build Coastguard Worker 		$$ = $2;
1958*61046927SAndroid Build Coastguard Worker 		$$.ex_bso = 1;
1959*61046927SAndroid Build Coastguard Worker 	}
1960*61046927SAndroid Build Coastguard Worker 	| INTEGER msgdesc_parts { $$ = $2; }
1961*61046927SAndroid Build Coastguard Worker 	| ASSIGN msgdesc_parts { $$ = $2; }
1962*61046927SAndroid Build Coastguard Worker 	| /* empty */
1963*61046927SAndroid Build Coastguard Worker 	{
1964*61046927SAndroid Build Coastguard Worker 		memset(&$$, 0, sizeof($$));
1965*61046927SAndroid Build Coastguard Worker 	}
1966*61046927SAndroid Build Coastguard Worker 	;
1967*61046927SAndroid Build Coastguard Worker 
1968*61046927SAndroid Build Coastguard Worker saturate:
1969*61046927SAndroid Build Coastguard Worker 	/* empty */ 	{ $$ = BRW_INSTRUCTION_NORMAL; }
1970*61046927SAndroid Build Coastguard Worker 	| SATURATE 	{ $$ = BRW_INSTRUCTION_SATURATE; }
1971*61046927SAndroid Build Coastguard Worker 	;
1972*61046927SAndroid Build Coastguard Worker 
1973*61046927SAndroid Build Coastguard Worker /* Execution size */
1974*61046927SAndroid Build Coastguard Worker execsize:
1975*61046927SAndroid Build Coastguard Worker 	/* empty */ %prec EMPTYEXECSIZE
1976*61046927SAndroid Build Coastguard Worker 	{
1977*61046927SAndroid Build Coastguard Worker 		$$ = 0;
1978*61046927SAndroid Build Coastguard Worker 	}
1979*61046927SAndroid Build Coastguard Worker 	| LPAREN exp2 RPAREN
1980*61046927SAndroid Build Coastguard Worker 	{
1981*61046927SAndroid Build Coastguard Worker 		if ($2 > 32 || !isPowerofTwo($2))
1982*61046927SAndroid Build Coastguard Worker 			error(&@2, "Invalid execution size %llu\n", $2);
1983*61046927SAndroid Build Coastguard Worker 
1984*61046927SAndroid Build Coastguard Worker 		$$ = cvt($2) - 1;
1985*61046927SAndroid Build Coastguard Worker 	}
1986*61046927SAndroid Build Coastguard Worker 	;
1987*61046927SAndroid Build Coastguard Worker 
1988*61046927SAndroid Build Coastguard Worker /* Instruction options */
1989*61046927SAndroid Build Coastguard Worker instoptions:
1990*61046927SAndroid Build Coastguard Worker 	/* empty */
1991*61046927SAndroid Build Coastguard Worker 	{
1992*61046927SAndroid Build Coastguard Worker 		memset(&$$, 0, sizeof($$));
1993*61046927SAndroid Build Coastguard Worker 	}
1994*61046927SAndroid Build Coastguard Worker 	| LCURLY instoption_list RCURLY
1995*61046927SAndroid Build Coastguard Worker 	{
1996*61046927SAndroid Build Coastguard Worker 		memset(&$$, 0, sizeof($$));
1997*61046927SAndroid Build Coastguard Worker 		$$ = $2;
1998*61046927SAndroid Build Coastguard Worker 	}
1999*61046927SAndroid Build Coastguard Worker 	;
2000*61046927SAndroid Build Coastguard Worker 
2001*61046927SAndroid Build Coastguard Worker instoption_list:
2002*61046927SAndroid Build Coastguard Worker 	instoption_list COMMA instoption
2003*61046927SAndroid Build Coastguard Worker 	{
2004*61046927SAndroid Build Coastguard Worker 		memset(&$$, 0, sizeof($$));
2005*61046927SAndroid Build Coastguard Worker 		$$ = $1;
2006*61046927SAndroid Build Coastguard Worker 		add_instruction_option(&$$, $3);
2007*61046927SAndroid Build Coastguard Worker 	}
2008*61046927SAndroid Build Coastguard Worker 	| instoption_list instoption
2009*61046927SAndroid Build Coastguard Worker 	{
2010*61046927SAndroid Build Coastguard Worker 		memset(&$$, 0, sizeof($$));
2011*61046927SAndroid Build Coastguard Worker 		$$ = $1;
2012*61046927SAndroid Build Coastguard Worker 		add_instruction_option(&$$, $2);
2013*61046927SAndroid Build Coastguard Worker 	}
2014*61046927SAndroid Build Coastguard Worker 	| /* empty */
2015*61046927SAndroid Build Coastguard Worker 	{
2016*61046927SAndroid Build Coastguard Worker 		memset(&$$, 0, sizeof($$));
2017*61046927SAndroid Build Coastguard Worker 	}
2018*61046927SAndroid Build Coastguard Worker 	;
2019*61046927SAndroid Build Coastguard Worker 
2020*61046927SAndroid Build Coastguard Worker depinfo:
2021*61046927SAndroid Build Coastguard Worker 	REG_DIST_CURRENT
2022*61046927SAndroid Build Coastguard Worker 	{
2023*61046927SAndroid Build Coastguard Worker 		memset(&$$, 0, sizeof($$));
2024*61046927SAndroid Build Coastguard Worker 		$$.regdist = $1;
2025*61046927SAndroid Build Coastguard Worker 		$$.pipe = TGL_PIPE_NONE;
2026*61046927SAndroid Build Coastguard Worker 	}
2027*61046927SAndroid Build Coastguard Worker 	| REG_DIST_FLOAT
2028*61046927SAndroid Build Coastguard Worker 	{
2029*61046927SAndroid Build Coastguard Worker 		memset(&$$, 0, sizeof($$));
2030*61046927SAndroid Build Coastguard Worker 		$$.regdist = $1;
2031*61046927SAndroid Build Coastguard Worker 		$$.pipe = TGL_PIPE_FLOAT;
2032*61046927SAndroid Build Coastguard Worker 	}
2033*61046927SAndroid Build Coastguard Worker 	| REG_DIST_INT
2034*61046927SAndroid Build Coastguard Worker 	{
2035*61046927SAndroid Build Coastguard Worker 		memset(&$$, 0, sizeof($$));
2036*61046927SAndroid Build Coastguard Worker 		$$.regdist = $1;
2037*61046927SAndroid Build Coastguard Worker 		$$.pipe = TGL_PIPE_INT;
2038*61046927SAndroid Build Coastguard Worker 	}
2039*61046927SAndroid Build Coastguard Worker 	| REG_DIST_LONG
2040*61046927SAndroid Build Coastguard Worker 	{
2041*61046927SAndroid Build Coastguard Worker 		memset(&$$, 0, sizeof($$));
2042*61046927SAndroid Build Coastguard Worker 		$$.regdist = $1;
2043*61046927SAndroid Build Coastguard Worker 		$$.pipe = TGL_PIPE_LONG;
2044*61046927SAndroid Build Coastguard Worker 	}
2045*61046927SAndroid Build Coastguard Worker 	| REG_DIST_ALL
2046*61046927SAndroid Build Coastguard Worker 	{
2047*61046927SAndroid Build Coastguard Worker 		memset(&$$, 0, sizeof($$));
2048*61046927SAndroid Build Coastguard Worker 		$$.regdist = $1;
2049*61046927SAndroid Build Coastguard Worker 		$$.pipe = TGL_PIPE_ALL;
2050*61046927SAndroid Build Coastguard Worker 	}
2051*61046927SAndroid Build Coastguard Worker 	| SBID_ALLOC
2052*61046927SAndroid Build Coastguard Worker 	{
2053*61046927SAndroid Build Coastguard Worker 		memset(&$$, 0, sizeof($$));
2054*61046927SAndroid Build Coastguard Worker 		$$.sbid = $1;
2055*61046927SAndroid Build Coastguard Worker 		$$.mode = TGL_SBID_SET;
2056*61046927SAndroid Build Coastguard Worker 	}
2057*61046927SAndroid Build Coastguard Worker 	| SBID_WAIT_SRC
2058*61046927SAndroid Build Coastguard Worker 	{
2059*61046927SAndroid Build Coastguard Worker 		memset(&$$, 0, sizeof($$));
2060*61046927SAndroid Build Coastguard Worker 		$$.sbid = $1;
2061*61046927SAndroid Build Coastguard Worker 		$$.mode = TGL_SBID_SRC;
2062*61046927SAndroid Build Coastguard Worker 	}
2063*61046927SAndroid Build Coastguard Worker 	| SBID_WAIT_DST
2064*61046927SAndroid Build Coastguard Worker 	{
2065*61046927SAndroid Build Coastguard Worker 		memset(&$$, 0, sizeof($$));
2066*61046927SAndroid Build Coastguard Worker 		$$.sbid = $1;
2067*61046927SAndroid Build Coastguard Worker 		$$.mode = TGL_SBID_DST;
2068*61046927SAndroid Build Coastguard Worker 	}
2069*61046927SAndroid Build Coastguard Worker 
2070*61046927SAndroid Build Coastguard Worker instoption:
2071*61046927SAndroid Build Coastguard Worker 	ALIGN1 	        { $$.type = INSTOPTION_FLAG; $$.uint_value = ALIGN1;}
2072*61046927SAndroid Build Coastguard Worker 	| ALIGN16 	{ $$.type = INSTOPTION_FLAG; $$.uint_value = ALIGN16; }
2073*61046927SAndroid Build Coastguard Worker 	| ACCWREN
2074*61046927SAndroid Build Coastguard Worker 	{
2075*61046927SAndroid Build Coastguard Worker 		if (p->devinfo->ver >= 20)
2076*61046927SAndroid Build Coastguard Worker 			error(&@1, "AccWrEnable not supported in Xe2+\n");
2077*61046927SAndroid Build Coastguard Worker 		$$.type = INSTOPTION_FLAG;
2078*61046927SAndroid Build Coastguard Worker 		$$.uint_value = ACCWREN;
2079*61046927SAndroid Build Coastguard Worker 	}
2080*61046927SAndroid Build Coastguard Worker 	| BREAKPOINT 	{ $$.type = INSTOPTION_FLAG; $$.uint_value = BREAKPOINT; }
2081*61046927SAndroid Build Coastguard Worker 	| NODDCLR 	{ $$.type = INSTOPTION_FLAG; $$.uint_value = NODDCLR; }
2082*61046927SAndroid Build Coastguard Worker 	| NODDCHK 	{ $$.type = INSTOPTION_FLAG; $$.uint_value = NODDCHK; }
2083*61046927SAndroid Build Coastguard Worker 	| MASK_DISABLE 	{ $$.type = INSTOPTION_FLAG; $$.uint_value = MASK_DISABLE; }
2084*61046927SAndroid Build Coastguard Worker 	| EOT 	        { $$.type = INSTOPTION_FLAG; $$.uint_value = EOT; }
2085*61046927SAndroid Build Coastguard Worker 	| SWITCH 	{ $$.type = INSTOPTION_FLAG; $$.uint_value = SWITCH; }
2086*61046927SAndroid Build Coastguard Worker 	| ATOMIC 	{ $$.type = INSTOPTION_FLAG; $$.uint_value = ATOMIC; }
2087*61046927SAndroid Build Coastguard Worker 	| CMPTCTRL 	{ $$.type = INSTOPTION_FLAG; $$.uint_value = CMPTCTRL; }
2088*61046927SAndroid Build Coastguard Worker 	| WECTRL 	{ $$.type = INSTOPTION_FLAG; $$.uint_value = WECTRL; }
2089*61046927SAndroid Build Coastguard Worker 	| QTR_2Q 	{ $$.type = INSTOPTION_CHAN_OFFSET; $$.uint_value = 8; }
2090*61046927SAndroid Build Coastguard Worker 	| QTR_3Q 	{ $$.type = INSTOPTION_CHAN_OFFSET; $$.uint_value = 16; }
2091*61046927SAndroid Build Coastguard Worker 	| QTR_4Q 	{ $$.type = INSTOPTION_CHAN_OFFSET; $$.uint_value = 24; }
2092*61046927SAndroid Build Coastguard Worker 	| QTR_2H 	{ $$.type = INSTOPTION_CHAN_OFFSET; $$.uint_value = 16; }
2093*61046927SAndroid Build Coastguard Worker 	| QTR_2N
2094*61046927SAndroid Build Coastguard Worker         {
2095*61046927SAndroid Build Coastguard Worker 		if (p->devinfo->ver >= 20)
2096*61046927SAndroid Build Coastguard Worker 			error(&@1, "Channel offset must be multiple of 8 in Xe2+\n");
2097*61046927SAndroid Build Coastguard Worker 		$$.type = INSTOPTION_CHAN_OFFSET;
2098*61046927SAndroid Build Coastguard Worker 		$$.uint_value = 4;
2099*61046927SAndroid Build Coastguard Worker 	}
2100*61046927SAndroid Build Coastguard Worker 	| QTR_3N 	{ $$.type = INSTOPTION_CHAN_OFFSET; $$.uint_value = 8; }
2101*61046927SAndroid Build Coastguard Worker 	| QTR_4N
2102*61046927SAndroid Build Coastguard Worker 	{
2103*61046927SAndroid Build Coastguard Worker 		if (p->devinfo->ver >= 20)
2104*61046927SAndroid Build Coastguard Worker 			error(&@1, "Channel offset must be multiple of 8 in Xe2+\n");
2105*61046927SAndroid Build Coastguard Worker 		$$.type = INSTOPTION_CHAN_OFFSET; $$.uint_value = 12;
2106*61046927SAndroid Build Coastguard Worker 	}
2107*61046927SAndroid Build Coastguard Worker 	| QTR_5N 	{ $$.type = INSTOPTION_CHAN_OFFSET; $$.uint_value = 16; }
2108*61046927SAndroid Build Coastguard Worker 	| QTR_6N
2109*61046927SAndroid Build Coastguard Worker 	{
2110*61046927SAndroid Build Coastguard Worker 		if (p->devinfo->ver >= 20)
2111*61046927SAndroid Build Coastguard Worker 			error(&@1, "Channel offset must be multiple of 8 in Xe2+\n");
2112*61046927SAndroid Build Coastguard Worker 		$$.type = INSTOPTION_CHAN_OFFSET; $$.uint_value = 20;
2113*61046927SAndroid Build Coastguard Worker 	}
2114*61046927SAndroid Build Coastguard Worker 	| QTR_7N 	{ $$.type = INSTOPTION_CHAN_OFFSET; $$.uint_value = 24; }
2115*61046927SAndroid Build Coastguard Worker 	| QTR_8N
2116*61046927SAndroid Build Coastguard Worker 	{
2117*61046927SAndroid Build Coastguard Worker 		if (p->devinfo->ver >= 20)
2118*61046927SAndroid Build Coastguard Worker 			error(&@1, "Channel offset must be multiple of 8 in Xe2+\n");
2119*61046927SAndroid Build Coastguard Worker 		$$.type = INSTOPTION_CHAN_OFFSET; $$.uint_value = 28;
2120*61046927SAndroid Build Coastguard Worker 	}
2121*61046927SAndroid Build Coastguard Worker 	| depinfo	{ $$.type = INSTOPTION_DEP_INFO; $$.depinfo_value = $1; }
2122*61046927SAndroid Build Coastguard Worker 	;
2123*61046927SAndroid Build Coastguard Worker 
2124*61046927SAndroid Build Coastguard Worker %%
2125*61046927SAndroid Build Coastguard Worker 
2126*61046927SAndroid Build Coastguard Worker extern int yylineno;
2127*61046927SAndroid Build Coastguard Worker 
2128*61046927SAndroid Build Coastguard Worker #ifdef YYBYACC
2129*61046927SAndroid Build Coastguard Worker void
yyerror(YYLTYPE * ltype,char * msg)2130*61046927SAndroid Build Coastguard Worker yyerror(YYLTYPE *ltype, char *msg)
2131*61046927SAndroid Build Coastguard Worker #else
2132*61046927SAndroid Build Coastguard Worker void
2133*61046927SAndroid Build Coastguard Worker yyerror(char *msg)
2134*61046927SAndroid Build Coastguard Worker #endif
2135*61046927SAndroid Build Coastguard Worker {
2136*61046927SAndroid Build Coastguard Worker 	fprintf(stderr, "%s: %d: %s at \"%s\"\n",
2137*61046927SAndroid Build Coastguard Worker 	        input_filename, yylineno, msg, lex_text());
2138*61046927SAndroid Build Coastguard Worker 	++errors;
2139*61046927SAndroid Build Coastguard Worker }
2140