1 %option yylineno
2 %option nounput
3 %{
4 #include <string.h>
5 #include "brw_asm.h"
6 #undef ALIGN16
7 #include "brw_gram.tab.h"
8
9 /* Locations */
10 int yycolumn = 1;
11
12 int saved_state = 0;
13 extern char *input_filename;
14
15 #define YY_NO_INPUT
16 #define YY_USER_ACTION \
17 yylloc.first_line = yylloc.last_line = yylineno; \
18 yylloc.first_column = yycolumn; \
19 yylloc.last_column = yycolumn + yyleng - 1; \
20 yycolumn += yyleng;
21 %}
22
23 %x BLOCK_COMMENT
24 %x FILENAME
25 %x CHANNEL
26 %x REG
27 %x DOTSEL
28 %x LABEL
29 %x MSGDESC
30 %%
31
32 /* eat up single line comment */
33 \/\/.*[\r\n] { yycolumn = 1; }
34
35 /* eat up multiline comment */
36 \/\* { saved_state = YYSTATE; BEGIN(BLOCK_COMMENT); }
37
38 <BLOCK_COMMENT>\*\/ { BEGIN(saved_state); }
39
40 <BLOCK_COMMENT>. { }
41 <BLOCK_COMMENT>[\r\n] { }
42
43 <FILENAME>\"[^\"]+\" {
44 char *name = malloc(yyleng - 1);
45 memmove(name, yytext + 1, yyleng - 2);
46 name[yyleng-1] = '\0';
47 input_filename = name;
48 }
49
50 /* null register */
51 null { BEGIN(REG); return NULL_TOKEN; }
52
53 /* Opcodes */
54 add { yylval.integer = BRW_OPCODE_ADD; return ADD; }
55 add3 { yylval.integer = BRW_OPCODE_ADD3; return ADD3; }
56 addc { yylval.integer = BRW_OPCODE_ADDC; return ADDC; }
57 and { yylval.integer = BRW_OPCODE_AND; return AND; }
58 asr { yylval.integer = BRW_OPCODE_ASR; return ASR; }
59 avg { yylval.integer = BRW_OPCODE_AVG; return AVG; }
60 bfe { yylval.integer = BRW_OPCODE_BFE; return BFE; }
61 bfi1 { yylval.integer = BRW_OPCODE_BFI1; return BFI1; }
62 bfi2 { yylval.integer = BRW_OPCODE_BFI2; return BFI2; }
63 bfrev { yylval.integer = BRW_OPCODE_BFREV; return BFREV; }
64 brc { yylval.integer = BRW_OPCODE_BRC; return BRC; }
65 brd { yylval.integer = BRW_OPCODE_BRD; return BRD; }
66 break { yylval.integer = BRW_OPCODE_BREAK; return BREAK; }
67 call { yylval.integer = BRW_OPCODE_CALL; return CALL; }
68 calla { yylval.integer = BRW_OPCODE_CALLA; return CALLA; }
69 cbit { yylval.integer = BRW_OPCODE_CBIT; return CBIT; }
70 cmp { yylval.integer = BRW_OPCODE_CMP; return CMP; }
71 cmpn { yylval.integer = BRW_OPCODE_CMPN; return CMPN; }
72 cont { yylval.integer = BRW_OPCODE_CONTINUE; return CONT; }
73 csel { yylval.integer = BRW_OPCODE_CSEL; return CSEL; }
74 do { yylval.integer = BRW_OPCODE_DO; return DO; }
75 dp2 { yylval.integer = BRW_OPCODE_DP2; return DP2; }
76 dp3 { yylval.integer = BRW_OPCODE_DP3; return DP3; }
77 dp4 { yylval.integer = BRW_OPCODE_DP4; return DP4; }
78 dp4a { yylval.integer = BRW_OPCODE_DP4A; return DP4A; }
79 dph { yylval.integer = BRW_OPCODE_DPH; return DPH; }
80 else { yylval.integer = BRW_OPCODE_ELSE; return ELSE; }
81 endif { yylval.integer = BRW_OPCODE_ENDIF; return ENDIF; }
82 fbh { yylval.integer = BRW_OPCODE_FBH; return FBH; }
83 fbl { yylval.integer = BRW_OPCODE_FBL; return FBL; }
84 frc { yylval.integer = BRW_OPCODE_FRC; return FRC; }
85 goto { yylval.integer = BRW_OPCODE_GOTO; return GOTO; }
86 halt { yylval.integer = BRW_OPCODE_HALT; return HALT; }
87 if { yylval.integer = BRW_OPCODE_IF; return IF; }
88 illegal { yylval.integer = BRW_OPCODE_ILLEGAL; return ILLEGAL; }
89 jmpi { yylval.integer = BRW_OPCODE_JMPI; return JMPI; }
90 line { yylval.integer = BRW_OPCODE_LINE; return LINE; }
91 lrp { yylval.integer = BRW_OPCODE_LRP; return LRP; }
92 lzd { yylval.integer = BRW_OPCODE_LZD; return LZD; }
93 mac { yylval.integer = BRW_OPCODE_MAC; return MAC; }
94 mach { yylval.integer = BRW_OPCODE_MACH; return MACH; }
95 mad { yylval.integer = BRW_OPCODE_MAD; return MAD; }
96 madm { yylval.integer = BRW_OPCODE_MADM; return MADM; }
97 mov { yylval.integer = BRW_OPCODE_MOV; return MOV; }
98 movi { yylval.integer = BRW_OPCODE_MOVI; return MOVI; }
99 mul { yylval.integer = BRW_OPCODE_MUL; return MUL; }
100 nop { yylval.integer = BRW_OPCODE_NOP; return NOP; }
101 not { yylval.integer = BRW_OPCODE_NOT; return NOT; }
102 or { yylval.integer = BRW_OPCODE_OR; return OR; }
103 pln { yylval.integer = BRW_OPCODE_PLN; return PLN; }
104 ret { yylval.integer = BRW_OPCODE_RET; return RET; }
105 rndd { yylval.integer = BRW_OPCODE_RNDD; return RNDD; }
106 rnde { yylval.integer = BRW_OPCODE_RNDE; return RNDE; }
107 rndu { yylval.integer = BRW_OPCODE_RNDU; return RNDU; }
108 rndz { yylval.integer = BRW_OPCODE_RNDZ; return RNDZ; }
109 rol { yylval.integer = BRW_OPCODE_ROL; return ROL; }
110 ror { yylval.integer = BRW_OPCODE_ROR; return ROR; }
111 sad2 { yylval.integer = BRW_OPCODE_SAD2; return SAD2; }
112 sada2 { yylval.integer = BRW_OPCODE_SADA2; return SADA2; }
113 sel { yylval.integer = BRW_OPCODE_SEL; return SEL; }
114 send {
115 yylval.integer = BRW_OPCODE_SEND;
116 return p->devinfo->ver < 12 ? SEND_GFX4 : SEND_GFX12;
117 }
118 sendc {
119 yylval.integer = BRW_OPCODE_SENDC;
120 return p->devinfo->ver < 12 ? SENDC_GFX4 : SENDC_GFX12;
121 }
122 sends { yylval.integer = BRW_OPCODE_SENDS; return SENDS; }
123 sendsc { yylval.integer = BRW_OPCODE_SENDSC; return SENDSC; }
124 shl { yylval.integer = BRW_OPCODE_SHL; return SHL; }
125 shr { yylval.integer = BRW_OPCODE_SHR; return SHR; }
126 smov { yylval.integer = BRW_OPCODE_SMOV; return SMOV; }
127 subb { yylval.integer = BRW_OPCODE_SUBB; return SUBB; }
128 wait { yylval.integer = BRW_OPCODE_WAIT; return WAIT; }
129 while { yylval.integer = BRW_OPCODE_WHILE; return WHILE; }
130 xor { yylval.integer = BRW_OPCODE_XOR; return XOR; }
131 sync { yylval.integer = BRW_OPCODE_SYNC; return SYNC; }
132
133 /* extended math functions */
134 cos { yylval.integer = BRW_MATH_FUNCTION_COS; return COS; }
135 exp { yylval.integer = BRW_MATH_FUNCTION_EXP; return EXP; }
136 fdiv { yylval.integer = BRW_MATH_FUNCTION_FDIV; return FDIV; }
137 inv { yylval.integer = BRW_MATH_FUNCTION_INV; return INV; }
138 invm { yylval.integer = GFX8_MATH_FUNCTION_INVM; return INVM; }
139 intdiv {
140 yylval.integer = BRW_MATH_FUNCTION_INT_DIV_QUOTIENT;
141 return INTDIV;
142 }
143 intdivmod {
144 yylval.integer =
145 BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER;
146 return INTDIVMOD;
147 }
148 intmod {
149 yylval.integer = BRW_MATH_FUNCTION_INT_DIV_REMAINDER;
150 return INTMOD;
151 }
152 log { yylval.integer = BRW_MATH_FUNCTION_LOG; return LOG; }
153 pow { yylval.integer = BRW_MATH_FUNCTION_POW; return POW; }
154 rsq { yylval.integer = BRW_MATH_FUNCTION_RSQ; return RSQ; }
155 rsqrtm { yylval.integer = GFX8_MATH_FUNCTION_RSQRTM; return RSQRTM; }
156 sin { yylval.integer = BRW_MATH_FUNCTION_SIN; return SIN; }
157 sqrt { yylval.integer = BRW_MATH_FUNCTION_SQRT; return SQRT; }
158 sincos { yylval.integer = BRW_MATH_FUNCTION_SINCOS; return SINCOS; }
159
160 /* sync instruction */
161 allrd { yylval.integer = TGL_SYNC_ALLRD; return ALLRD; }
162 allwr { yylval.integer = TGL_SYNC_ALLWR; return ALLWR; }
163 fence { yylval.integer = TGL_SYNC_FENCE; return FENCE; }
164 bar { yylval.integer = TGL_SYNC_BAR; return BAR; }
165 host { yylval.integer = TGL_SYNC_HOST; return HOST; }
166
167 /* shared functions for send instruction */
168 sampler { return SAMPLER; }
169 dp_sampler { return DP_SAMPLER; }
170 gateway { return GATEWAY; }
171 urb { return URB; }
172 thread_spawner { return THREAD_SPAWNER; }
173 render { return RENDER; }
174 const { return CONST; }
175 data { return DATA; }
176 cre { return CRE; }
177 math { return MATH; }
178 read { return READ; }
179 write { return WRITE; }
180 vme { return VME; }
181 "pixel interp" { return PIXEL_INTERP; }
182 "dp data 1" { return DP_DATA_1; }
183 "rt accel" { return RT_ACCEL; }
184 slm { return SLM; }
185 tgm { return TGM; }
186 ugm { return UGM; }
187
188 ";" { return SEMICOLON; }
189 ":" { return COLON; }
190 "(" { return LPAREN; }
191 ")" { return RPAREN; }
192 "{" { return LCURLY; }
193 "}" { return RCURLY; }
194 "[" { return LSQUARE; }
195 "]" { return RSQUARE; }
196 "<" { return LANGLE; }
197 ">" { return RANGLE; }
198 "," { return COMMA; }
199 "." { return DOT; }
200 "+" { return PLUS; }
201 "-" { return MINUS; }
202 "~" { return MINUS; }
203 "(abs)" { return ABS; }
204
205
206 "VxH" { return VxH; }
207 <REG>"<" { return LANGLE; }
208 <REG>[0-9][0-9]* {
209 yylval.integer = strtoul(yytext, NULL, 10);
210 return INTEGER;
211 }
212 <REG>">" { return RANGLE; }
213 <REG>"," { return COMMA; }
214 <REG>"." { BEGIN(DOTSEL); return DOT; }
215 <REG>";" { return SEMICOLON; }
216
217 <DOTSEL>"x" { yylval.integer = BRW_CHANNEL_X; return X; }
218 <DOTSEL>"y" { yylval.integer = BRW_CHANNEL_Y; return Y; }
219 <DOTSEL>"z" { yylval.integer = BRW_CHANNEL_Z; return Z; }
220 <DOTSEL>"w" { yylval.integer = BRW_CHANNEL_W; return W; }
221 <DOTSEL>[0-9][0-9]* {
222 yylval.integer = strtoul(yytext, NULL, 10);
223 BEGIN(REG);
224 return INTEGER;
225 }
226 <DOTSEL>. { yyless(0); BEGIN(INITIAL); }
227 <REG>. { yyless(0); BEGIN(INITIAL); }
228
229 /* Access mode */
230 "align1" { return ALIGN1; }
231 "align16" { return ALIGN16; }
232
233 /* Accumulator write control */
234 AccWrEnable { return ACCWREN; }
235
236 /* Mask control (formerly WECtrl/Write Enable Control) */
237 "WE_all" { return WECTRL; }
238
239 /* Compaction control */
240 compacted { return CMPTCTRL; }
241
242 /* Debug control */
243 breakpoint { return BREAKPOINT; }
244
245 /* Dependency control */
246 NoDDClr { return NODDCLR; }
247 NoDDChk { return NODDCHK; }
248
249 /* End of thread */
250 EOT { return EOT; }
251
252 /* Mask control */
253 nomask { return MASK_DISABLE; }
254
255 /* Channel */
256 <CHANNEL>"x" { yylval.integer = BRW_CHANNEL_X; return X; }
257 <CHANNEL>"y" { yylval.integer = BRW_CHANNEL_Y; return Y; }
258 <CHANNEL>"z" { yylval.integer = BRW_CHANNEL_Z; return Z; }
259 <CHANNEL>"w" { yylval.integer = BRW_CHANNEL_W; return W; }
260 <CHANNEL>[0-9][0-9]* {
261 yylval.integer = strtoul(yytext, NULL, 10);
262 return INTEGER;
263 }
264 <CHANNEL>"." { return DOT; }
265 <CHANNEL>. { yyless(0); BEGIN(INITIAL); }
266
267
268 /* Predicate Control */
269 <CHANNEL>".anyv" { yylval.integer = BRW_PREDICATE_ALIGN1_ANYV; return ANYV; }
270 <CHANNEL>".allv" { yylval.integer = BRW_PREDICATE_ALIGN1_ALLV; return ALLV; }
271 <CHANNEL>".any2h" { yylval.integer = BRW_PREDICATE_ALIGN1_ANY2H; return ANY2H; }
272 <CHANNEL>".all2h" { yylval.integer = BRW_PREDICATE_ALIGN1_ALL2H; return ALL2H; }
273 <CHANNEL>".any4h" { yylval.integer = BRW_PREDICATE_ALIGN16_ANY4H; return ANY4H; }
274 <CHANNEL>".all4h" { yylval.integer = BRW_PREDICATE_ALIGN16_ALL4H; return ALL4H; }
275 <CHANNEL>".any8h" { yylval.integer = BRW_PREDICATE_ALIGN1_ANY8H; return ANY8H; }
276 <CHANNEL>".all8h" { yylval.integer = BRW_PREDICATE_ALIGN1_ALL8H; return ALL8H; }
277 <CHANNEL>".any16h" { yylval.integer = BRW_PREDICATE_ALIGN1_ANY16H; return ANY16H; }
278 <CHANNEL>".all16h" { yylval.integer = BRW_PREDICATE_ALIGN1_ALL16H; return ALL16H; }
279 <CHANNEL>".any32h" { yylval.integer = BRW_PREDICATE_ALIGN1_ANY32H; return ANY32H; }
280 <CHANNEL>".all32h" { yylval.integer = BRW_PREDICATE_ALIGN1_ALL32H; return ALL32H; }
281
282 /* Saturation */
283 ".sat" { return SATURATE; }
284
285 /* Thread control */
286 atomic { return ATOMIC; }
287 switch { return SWITCH; }
288
289 /* Quarter Control */
290 1[HNQ] { }
291 "2Q" { return QTR_2Q; }
292 "3Q" { return QTR_3Q; }
293 "4Q" { return QTR_4Q; }
294 "2H" { return QTR_2H; }
295 "2N" { return QTR_2N; }
296 "3N" { return QTR_3N; }
297 "4N" { return QTR_4N; }
298 "5N" { return QTR_5N; }
299 "6N" { return QTR_6N; }
300 "7N" { return QTR_7N; }
301 "8N" { return QTR_8N; }
302
303 /* data types */
304 :?B { return TYPE_B; }
305 :?D { return TYPE_D; }
306 :?DF { return TYPE_DF; }
307 :?F { return TYPE_F; }
308 :?HF { return TYPE_HF; }
309 :?NF { return TYPE_NF; }
310 :?Q { return TYPE_Q; }
311 :?UB { return TYPE_UB; }
312 :?UD { return TYPE_UD; }
313 :?UW { return TYPE_UW; }
314 :?UQ { return TYPE_UQ; }
315 :?UV { return TYPE_UV; }
316 :?V { return TYPE_V; }
317 :?VF { return TYPE_VF; }
318 :?W { return TYPE_W; }
319
320 /* Address registers */
321 "a0" { return ADDRREG; }
322
323 /* accumulator registers */
324 "acc"[0-9]+ { yylval.integer = atoi(yytext + 3); return ACCREG; }
325
326 /* channel enable registers */
327 "ce0" { return CHANNELENABLEREG; }
328
329 /* control registers */
330 "cr0" { return CONTROLREG; }
331
332 /* flag registers */
333 "f"[0|1] { BEGIN(CHANNEL); yylval.integer = atoi(yytext + 1); return FLAGREG; }
334
335 /* state register */
336 sr[0-9]+ { yylval.integer = atoi(yytext + 2); return STATEREG; }
337
338 /* notification registers */
339 "n0" { BEGIN(REG); return NOTIFYREG; }
340
341 /* IP register */
342 "ip" { return IPREG; }
343
344 /* Thread control register */
345 "tdr0" { return THREADREG; }
346
347 /* performance register */
348 "tm0" { BEGIN(REG); return PERFORMANCEREG; }
349
350 [gr][0-9]+ {
351 yylval.integer = atoi(yytext + 1);
352 BEGIN(REG); return GENREG;
353 }
354 [gr] { return GENREGFILE; }
355 "mask"[0-9]+ { yylval.integer = atoi(yytext + 4); return MASKREG; }
356
357 /* Conditional modifiers */
358 ".e" { yylval.integer = BRW_CONDITIONAL_Z; return EQUAL; }
359 ".g" { yylval.integer = BRW_CONDITIONAL_G; return GREATER; }
360 ".ge" { yylval.integer = BRW_CONDITIONAL_GE; return GREATER_EQUAL; }
361 ".l" { yylval.integer = BRW_CONDITIONAL_L; return LESS; }
362 ".le" { yylval.integer = BRW_CONDITIONAL_LE; return LESS_EQUAL; }
363 ".ne" { yylval.integer = BRW_CONDITIONAL_NZ; return NOT_EQUAL; }
364 ".nz" { yylval.integer = BRW_CONDITIONAL_NZ; return NOT_ZERO; }
365 ".o" { yylval.integer = BRW_CONDITIONAL_O; return OVERFLOW; }
366 ".r" { yylval.integer = BRW_CONDITIONAL_R; return ROUND_INCREMENT; }
367 ".u" { yylval.integer = BRW_CONDITIONAL_U; return UNORDERED; }
368 ".z" { yylval.integer = BRW_CONDITIONAL_Z; return ZERO; }
369
370 /* Eat up JIP and UIP token, their values will be parsed
371 * in numeric section
372 */
373 "JIP: " { BEGIN(LABEL); }
374 "UIP: " { BEGIN(LABEL); }
375 "Jump: " { }
376 "Pop: " { }
377 [ \t]+ { }
378
379 "MsgDesc: " { BEGIN(MSGDESC); return MSGDESC_BEGIN; }
380 <MSGDESC>ex_bso { return EX_BSO; }
381 <MSGDESC>src1_len { return SRC1_LEN; }
382 <MSGDESC>"=" { return ASSIGN; }
383 <MSGDESC>[0-9][0-9]* {
384 yylval.integer = strtoul(yytext, NULL, 10);
385 return INTEGER;
386 }
387 <MSGDESC>"{" { yyless(0); BEGIN(INITIAL); return MSGDESC_END; }
388 <MSGDESC>. { }
389
390 "0x"[0-9a-f][0-9a-f]* {
391 yylval.llint = strtoull(yytext + 2, NULL, 16);
392 return LONG;
393 }
394 [0-9][0-9]* {
395 yylval.llint = strtoll(yytext, NULL, 10);
396 return LONG;
397 }
398
399 /* jump label target */
400 [a-zA-Z_][0-9a-zA-Z_]*":" {
401 yylval.string = ralloc_strdup(p->mem_ctx, yytext);
402 /* Stomp the trailing ':' */
403 yylval.string[yyleng - 1] = '\0';
404 return JUMP_LABEL_TARGET;
405 }
406
407 /* jump label */
408 <LABEL>[a-zA-Z_][0-9a-zA-Z_]* {
409 yylval.string = ralloc_strdup(p->mem_ctx, yytext);
410 BEGIN(INITIAL);
411 return JUMP_LABEL;
412 }
413
414 /* SWSB */
415 "@"[1-7] { yylval.integer = atoi(yytext + 1); return REG_DIST_CURRENT; }
416 "F@"[1-7] { yylval.integer = atoi(yytext + 2); return REG_DIST_FLOAT; }
417 "I@"[1-7] { yylval.integer = atoi(yytext + 2); return REG_DIST_INT; }
418 "L@"[1-7] { yylval.integer = atoi(yytext + 2); return REG_DIST_LONG; }
419 "A@"[1-7] { yylval.integer = atoi(yytext + 2); return REG_DIST_ALL; }
420
421 "$"[0-9]* { yylval.integer = atoi(yytext + 1); return SBID_ALLOC; }
422 "$"[0-9]*".src" { yylval.integer = atoi(yytext + 1); return SBID_WAIT_SRC; }
423 "$"[0-9]*".dst" { yylval.integer = atoi(yytext + 1); return SBID_WAIT_DST; }
424
425 \n { yycolumn = 1; }
426
427 . {
428 fprintf(stderr, "%s: %d: %s: at \"%s\"\n",
429 input_filename, yylineno,
430 "unexpected token", lex_text());
431 }
432 %%
433
434 char *
435 lex_text(void)
436 {
437 return yytext;
438 }
439
440 #ifndef yywrap
yywrap()441 int yywrap()
442 {
443 return -1;
444 }
445 #endif
446