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