freedreno/computerator: support bindless sampler instructions
[mesa.git] / src / freedreno / computerator / ir3_lexer.l
1 /*
2 * Copyright (c) 2013 Rob Clark <robclark@freedesktop.org>
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 * SOFTWARE.
22 */
23
24 %{
25 #include <stdlib.h>
26 #include "ir3/ir3.h"
27 #include "ir3_parser.h"
28
29 #define YY_NO_INPUT
30 #define YY_NO_UNPUT
31 #define TOKEN(t) (ir3_yylval.tok = t)
32 extern YYSTYPE ir3_yylval;
33
34 static int parse_wrmask(const char *src)
35 {
36 int i, num = 0;
37 for (i = 0; i < 4; i++) {
38 if ("xyzw"[i] == src[1]) {
39 num |= (1 << i);
40 src++;
41 }
42 }
43 return num;
44 }
45
46 static int parse_reg(const char *str)
47 {
48 int num = 0;
49 if (str[0] == 'h') {
50 str++;
51 num++;
52 }
53 str++;
54 num += strtol(str, (char **)&str, 10) << 3;
55 switch (str[1]) {
56 case 'x': num += 0; break;
57 case 'y': num += 2; break;
58 case 'z': num += 4; break;
59 case 'w': num += 6; break;
60 default: assert(0); break;
61 }
62 return num;
63 }
64 %}
65
66 %option noyywrap
67 %option prefix="ir3_yy"
68
69 %%
70 "\n" yylineno++;
71 [ \t] ; /* ignore whitespace */
72 ";"[^\n]*"\n" yylineno++; /* ignore comments */
73 [0-9]+"."[0-9]+ ir3_yylval.flt = strtod(yytext, NULL); return T_FLOAT;
74 [0-9]* ir3_yylval.num = strtoul(yytext, NULL, 0); return T_INT;
75 "0x"[0-9a-fA-F]* ir3_yylval.num = strtoul(yytext, NULL, 0); return T_HEX;
76 "@localsize" return TOKEN(T_A_LOCALSIZE);
77 "@const" return TOKEN(T_A_CONST);
78 "@buf" return TOKEN(T_A_BUF);
79 "@invocationid" return TOKEN(T_A_INVOCATIONID);
80 "@wgid" return TOKEN(T_A_WGID);
81 "@numwg" return TOKEN(T_A_NUMWG);
82 "(sy)" return TOKEN(T_SY);
83 "(ss)" return TOKEN(T_SS);
84 "(absneg)" return TOKEN(T_ABSNEG);
85 "(neg)" return TOKEN(T_NEG);
86 "(abs)" return TOKEN(T_ABS);
87 "(r)" return TOKEN(T_R);
88 "(ul)" return TOKEN(T_UL);
89 "(even)" return TOKEN(T_EVEN);
90 "(pos_infinity)" return TOKEN(T_POS_INFINITY);
91 "(ei)" return TOKEN(T_EI);
92 "(jp)" return TOKEN(T_JP);
93 "(rpt"[0-7]")" ir3_yylval.num = strtol(yytext+4, NULL, 10); return T_RPT;
94 "(nop"[0-7]")" ir3_yylval.num = strtol(yytext+4, NULL, 10); return T_NOP;
95 "("[x]?[y]?[z]?[w]?")" ir3_yylval.num = parse_wrmask(yytext); return T_WRMASK;
96
97 [h]?"r"[0-9]+"."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_REGISTER;
98 [h]?"c"[0-9]+"."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_CONSTANT;
99 "a0."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_A0;
100 "p0."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_P0;
101 "s#"[0-9]+ ir3_yylval.num = strtol(yytext+2, NULL, 10); return T_SAMP;
102 "t#"[0-9]+ ir3_yylval.num = strtol(yytext+2, NULL, 10); return T_TEX;
103
104 /* category 0: */
105 "nop" return TOKEN(T_OP_NOP);
106 "br" return TOKEN(T_OP_BR);
107 "jump" return TOKEN(T_OP_JUMP);
108 "call" return TOKEN(T_OP_CALL);
109 "ret" return TOKEN(T_OP_RET);
110 "kill" return TOKEN(T_OP_KILL);
111 "end" return TOKEN(T_OP_END);
112 "emit" return TOKEN(T_OP_EMIT);
113 "cut" return TOKEN(T_OP_CUT);
114 "chmask" return TOKEN(T_OP_CHMASK);
115 "chsh" return TOKEN(T_OP_CHSH);
116 "flow_rev" return TOKEN(T_OP_FLOW_REV);
117
118 /* category 1: */
119 "mova" return TOKEN(T_OP_MOVA);
120 "mov" return TOKEN(T_OP_MOV);
121 "cov" return TOKEN(T_OP_COV);
122
123 ("f16"|"f32"|"u16"|"u32"|"s16"|"s32"|"u8"|"s8"){2} ir3_yylval.str = yytext; return T_CAT1_TYPE_TYPE;
124
125 /* category 2: */
126 "add.f" return TOKEN(T_OP_ADD_F);
127 "min.f" return TOKEN(T_OP_MIN_F);
128 "max.f" return TOKEN(T_OP_MAX_F);
129 "mul.f" return TOKEN(T_OP_MUL_F);
130 "sign.f" return TOKEN(T_OP_SIGN_F);
131 "cmps.f" return TOKEN(T_OP_CMPS_F);
132 "absneg.f" return TOKEN(T_OP_ABSNEG_F);
133 "cmpv.f" return TOKEN(T_OP_CMPV_F);
134 "floor.f" return TOKEN(T_OP_FLOOR_F);
135 "ceil.f" return TOKEN(T_OP_CEIL_F);
136 "rndne.f" return TOKEN(T_OP_RNDNE_F);
137 "rndaz.f" return TOKEN(T_OP_RNDAZ_F);
138 "trunc.f" return TOKEN(T_OP_TRUNC_F);
139 "add.u" return TOKEN(T_OP_ADD_U);
140 "add.s" return TOKEN(T_OP_ADD_S);
141 "sub.u" return TOKEN(T_OP_SUB_U);
142 "sub.s" return TOKEN(T_OP_SUB_S);
143 "cmps.u" return TOKEN(T_OP_CMPS_U);
144 "cmps.s" return TOKEN(T_OP_CMPS_S);
145 "min.u" return TOKEN(T_OP_MIN_U);
146 "min.s" return TOKEN(T_OP_MIN_S);
147 "max.u" return TOKEN(T_OP_MAX_U);
148 "max.s" return TOKEN(T_OP_MAX_S);
149 "absneg.s" return TOKEN(T_OP_ABSNEG_S);
150 "and.b" return TOKEN(T_OP_AND_B);
151 "or.b" return TOKEN(T_OP_OR_B);
152 "not.b" return TOKEN(T_OP_NOT_B);
153 "xor.b" return TOKEN(T_OP_XOR_B);
154 "cmpv.u" return TOKEN(T_OP_CMPV_U);
155 "cmpv.s" return TOKEN(T_OP_CMPV_S);
156 "mul.u24" return TOKEN(T_OP_MUL_U24);
157 "mul.s24" return TOKEN(T_OP_MUL_S24);
158 "mull.u" return TOKEN(T_OP_MULL_U);
159 "bfrev.b" return TOKEN(T_OP_BFREV_B);
160 "clz.s" return TOKEN(T_OP_CLZ_S);
161 "clz.b" return TOKEN(T_OP_CLZ_B);
162 "shl.b" return TOKEN(T_OP_SHL_B);
163 "shr.b" return TOKEN(T_OP_SHR_B);
164 "ashr.b" return TOKEN(T_OP_ASHR_B);
165 "bary.f" return TOKEN(T_OP_BARY_F);
166 "mgen.b" return TOKEN(T_OP_MGEN_B);
167 "getbit.b" return TOKEN(T_OP_GETBIT_B);
168 "setrm" return TOKEN(T_OP_SETRM);
169 "cbits.b" return TOKEN(T_OP_CBITS_B);
170 "shb" return TOKEN(T_OP_SHB);
171 "msad" return TOKEN(T_OP_MSAD);
172
173 /* category 3: */
174 "mad.u16" return TOKEN(T_OP_MAD_U16);
175 "madsh.u16" return TOKEN(T_OP_MADSH_U16);
176 "mad.s16" return TOKEN(T_OP_MAD_S16);
177 "madsh.m16" return TOKEN(T_OP_MADSH_M16);
178 "mad.u24" return TOKEN(T_OP_MAD_U24);
179 "mad.s24" return TOKEN(T_OP_MAD_S24);
180 "mad.f16" return TOKEN(T_OP_MAD_F16);
181 "mad.f32" return TOKEN(T_OP_MAD_F32);
182 "sel.b16" return TOKEN(T_OP_SEL_B16);
183 "sel.b32" return TOKEN(T_OP_SEL_B32);
184 "sel.s16" return TOKEN(T_OP_SEL_S16);
185 "sel.s32" return TOKEN(T_OP_SEL_S32);
186 "sel.f16" return TOKEN(T_OP_SEL_F16);
187 "sel.f32" return TOKEN(T_OP_SEL_F32);
188 "sad.s16" return TOKEN(T_OP_SAD_S16);
189 "sad.s32" return TOKEN(T_OP_SAD_S32);
190
191 /* category 4: */
192 "rcp" return TOKEN(T_OP_RCP);
193 "rsq" return TOKEN(T_OP_RSQ);
194 "log2" return TOKEN(T_OP_LOG2);
195 "exp2" return TOKEN(T_OP_EXP2);
196 "sin" return TOKEN(T_OP_SIN);
197 "cos" return TOKEN(T_OP_COS);
198 "sqrt" return TOKEN(T_OP_SQRT);
199 "hrsq" return TOKEN(T_OP_HRSQ);
200 "hlog2" return TOKEN(T_OP_HLOG2);
201 "hexp2" return TOKEN(T_OP_HEXP2);
202
203 /* category 5: */
204 "isam" return TOKEN(T_OP_ISAM);
205 "isaml" return TOKEN(T_OP_ISAML);
206 "isamm" return TOKEN(T_OP_ISAMM);
207 "sam" return TOKEN(T_OP_SAM);
208 "samb" return TOKEN(T_OP_SAMB);
209 "saml" return TOKEN(T_OP_SAML);
210 "samgq" return TOKEN(T_OP_SAMGQ);
211 "getlod" return TOKEN(T_OP_GETLOD);
212 "conv" return TOKEN(T_OP_CONV);
213 "convm" return TOKEN(T_OP_CONVM);
214 "getsize" return TOKEN(T_OP_GETSIZE);
215 "getbuf" return TOKEN(T_OP_GETBUF);
216 "getpos" return TOKEN(T_OP_GETPOS);
217 "getinfo" return TOKEN(T_OP_GETINFO);
218 "dsx" return TOKEN(T_OP_DSX);
219 "dsy" return TOKEN(T_OP_DSY);
220 "gather4r" return TOKEN(T_OP_GATHER4R);
221 "gather4g" return TOKEN(T_OP_GATHER4G);
222 "gather4b" return TOKEN(T_OP_GATHER4B);
223 "gather4a" return TOKEN(T_OP_GATHER4A);
224 "samgp0" return TOKEN(T_OP_SAMGP0);
225 "samgp1" return TOKEN(T_OP_SAMGP1);
226 "samgp2" return TOKEN(T_OP_SAMGP2);
227 "samgp3" return TOKEN(T_OP_SAMGP3);
228 "dsxpp.1" return TOKEN(T_OP_DSXPP_1);
229 "dsypp.1" return TOKEN(T_OP_DSYPP_1);
230 "rgetpos" return TOKEN(T_OP_RGETPOS);
231 "rgetinfo" return TOKEN(T_OP_RGETINFO);
232
233 /* category 6: */
234 "ldg" return TOKEN(T_OP_LDG);
235 "ldl" return TOKEN(T_OP_LDL);
236 "ldp" return TOKEN(T_OP_LDP);
237 "stg" return TOKEN(T_OP_STG);
238 "stl" return TOKEN(T_OP_STL);
239 "stp" return TOKEN(T_OP_STP);
240 "ldib" return TOKEN(T_OP_LDIB);
241 "g2l" return TOKEN(T_OP_G2L);
242 "l2g" return TOKEN(T_OP_L2G);
243 "prefetch" return TOKEN(T_OP_PREFETCH);
244 "ldlw" return TOKEN(T_OP_LDLW);
245 "stlw" return TOKEN(T_OP_STLW);
246 "resfmt" return TOKEN(T_OP_RESFMT);
247 "resinf" return TOKEN(T_OP_RESINF);
248 "atomic.add" return TOKEN(T_OP_ATOMIC_ADD);
249 "atomic.sub" return TOKEN(T_OP_ATOMIC_SUB);
250 "atomic.xchg" return TOKEN(T_OP_ATOMIC_XCHG);
251 "atomic.inc" return TOKEN(T_OP_ATOMIC_INC);
252 "atomic.dec" return TOKEN(T_OP_ATOMIC_DEC);
253 "atomic.cmpxchg" return TOKEN(T_OP_ATOMIC_CMPXCHG);
254 "atomic.min" return TOKEN(T_OP_ATOMIC_MIN);
255 "atomic.max" return TOKEN(T_OP_ATOMIC_MAX);
256 "atomic.and" return TOKEN(T_OP_ATOMIC_AND);
257 "atomic.or" return TOKEN(T_OP_ATOMIC_OR);
258 "atomic.xor" return TOKEN(T_OP_ATOMIC_XOR);
259 "ldgb" return TOKEN(T_OP_LDGB);
260 "stgb" return TOKEN(T_OP_STGB);
261 "stib" return TOKEN(T_OP_STIB);
262 "ldc" return TOKEN(T_OP_LDC);
263 "ldlv" return TOKEN(T_OP_LDLV);
264
265 "f16" return TOKEN(T_TYPE_F16);
266 "f32" return TOKEN(T_TYPE_F32);
267 "u16" return TOKEN(T_TYPE_U16);
268 "u32" return TOKEN(T_TYPE_U32);
269 "s16" return TOKEN(T_TYPE_S16);
270 "s32" return TOKEN(T_TYPE_S32);
271 "u8" return TOKEN(T_TYPE_U8);
272 "s8" return TOKEN(T_TYPE_S8);
273
274 "untyped" return TOKEN(T_UNTYPED);
275 "typed" return TOKEN(T_TYPED);
276
277 "1d" return TOKEN(T_1D);
278 "2d" return TOKEN(T_2D);
279 "3d" return TOKEN(T_3D);
280 "4d" return TOKEN(T_4D);
281
282 "lt" return TOKEN(T_LT);
283 "le" return TOKEN(T_LE);
284 "gt" return TOKEN(T_GT);
285 "ge" return TOKEN(T_GE);
286 "eq" return TOKEN(T_EQ);
287 "ne" return TOKEN(T_NE);
288
289 "a" return 'a';
290 "o" return 'o';
291 "p" return 'p';
292 "s2en" return TOKEN(T_S2EN);
293 "s" return 's';
294 "base"[0-9]+ ir3_yylval.num = strtol(yytext+4, NULL, 10); return T_BASE;
295
296 "=" return '=';
297 "(" return '(';
298 ")" return ')';
299 "[" return '[';
300 "]" return ']';
301 "," return ',';
302 "." return '.';
303 "-" return '-';
304 "+" return '+';
305 "|" return '|';
306 "c" return 'c';
307 "r" return 'r';
308 "g" return 'g';
309 "l" return 'l';
310 "<" return '<';
311 ">" return '>';
312 "!" return '!';
313 "#" return '#';
314
315 "nan" return TOKEN(T_NAN);
316 "inf" return TOKEN(T_INF);
317
318 [a-zA-Z_][a-zA-Z_0-9]* ir3_yylval.str = yytext; return T_IDENTIFIER;
319 . fprintf(stderr, "error at line %d: Unknown token: %s\n", ir3_yyget_lineno(), yytext); yyterminate();
320 %%