1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
|
/*
// Copyright (c) 2009-2011, Jimmy Kwa,
// The University of British Columbia
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
// Redistributions in binary form must reproduce the above copyright notice, this
// list of conditions and the following disclaimer in the documentation and/or
// other materials provided with the distribution.
// Neither the name of The University of British Columbia nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
%{
#include <iostream>
#include "decudaParser.hpp"
#include <string.h>
/* not sure if this is needed*/
#define YY_NEVER_INTERACTIVE 1
void yyerror(const char*);
%}
%option noyywrap
%option yylineno
/*Regular expresions go here*/
alpha [a-zA-Z]
numeric [0-9]
hexalpha [A-Fa-f]
alphanum ({alpha}|{numeric})
hexdigit ({numeric}|{hexalpha})
whitespace [ \t]
newline [\n]
anycharbutnewline [^\n]
anychar ({newline}|{anycharbutnewline})
pipe \|
identifier ({alpha}({alphanum}|["_$"])*)|([_$%]({alphanum}|["_$"])+)
hexliteral 0[xX]{hexdigit}+U?
octliteral 0[0-7]+U?
binliteral 0[bB][01]+U?
decliteral ([1-9][0-9]*U?)|0U?
fltliteral [0-9]+\.[0-9]+
%%
/*Translation rules*/
/*Compiler directives*/
\.entry yylval.string_value = strdup(yytext); return DOTENTRY;
\.lmem yylval.string_value = strdup(yytext); return DOTLMEM;
\.smem yylval.string_value = strdup(yytext); return DOTSMEM;
\.reg yylval.string_value = strdup(yytext); return DOTREG;
\.bar yylval.string_value = strdup(yytext); return DOTBAR;
/*constant memory directives*/
\.constseg return DOTCONSTSEG;
const return CONST;
d\.u32 return DDOTU32;
d\.f32 return DDOTF32;
/*guard predicate*/
@!?\$p{numeric}+ yylval.string_value = strdup(yytext); return GUARDPRED;
/*label*/
label{numeric}+ yylval.string_value = strdup(yytext); return LABEL;
/*base instructions*/
cvt yylval.string_value = strdup(yytext); return CVT;
shl yylval.string_value = strdup(yytext); return SHL;
shr yylval.string_value = strdup(yytext); return SHR;
add yylval.string_value = strdup(yytext); return ADD;
addc yylval.string_value = strdup(yytext); return ADDC;
sub yylval.string_value = strdup(yytext); return SUB;
subr yylval.string_value = strdup(yytext); return SUBR;
movsh yylval.string_value = strdup(yytext); return MOVSH;
mov yylval.string_value = strdup(yytext); return MOV;
bar\.sync yylval.string_value = strdup(yytext); return BARSYNC;
mul yylval.string_value = strdup(yytext); return MUL;
mad24 yylval.string_value = strdup(yytext); return MAD24;
mad24c1 yylval.string_value = strdup(yytext); return MAD24C1;
set yylval.string_value = strdup(yytext); return SET;
mad yylval.string_value = strdup(yytext); return MAD;
mul24 yylval.string_value = strdup(yytext); return MUL24;
set\?{numeric}+\? yylval.string_value = strdup(yytext); return SETUNKNOWN;
rcp yylval.string_value = strdup(yytext); return RCP;
pre\.ex2 yylval.string_value = strdup(yytext); return PREEX2;
pre\.sin yylval.string_value = strdup(yytext); return PRESIN;
ex2 yylval.string_value = strdup(yytext); return EX2;
sin yylval.string_value = strdup(yytext); return SIN;
cos yylval.string_value = strdup(yytext); return COS;
lg2 yylval.string_value = strdup(yytext); return LG2;
rsqrt yylval.string_value = strdup(yytext); return RSQRT;
mac yylval.string_value = strdup(yytext); return MAC;
and yylval.string_value = strdup(yytext); return AND;
andn yylval.string_value = strdup(yytext); return ANDN;
nandn yylval.string_value = strdup(yytext); return NANDN;
xor yylval.string_value = strdup(yytext); return XOR;
or yylval.string_value = strdup(yytext); return OR;
orn yylval.string_value = strdup(yytext); return ORN;
min yylval.string_value = strdup(yytext); return MIN;
tex yylval.string_value = strdup(yytext); return TEX;
bra\.label yylval.string_value = strdup(yytext); return BRA;
join\.label yylval.string_value = strdup(yytext); return JOIN;
breakaddr.label yylval.string_value = strdup(yytext); return BREAKADDR;
nop\.end yylval.string_value = strdup(yytext); return NOPEND;
nop\.join yylval.string_value = strdup(yytext); return NOPJOIN;
nop yylval.string_value = strdup(yytext); return NOP;
call.label yylval.string_value = strdup(yytext); return CALL;
not yylval.string_value = strdup(yytext); return NOT;
max yylval.string_value = strdup(yytext); return MAX;
delta yylval.string_value = strdup(yytext); return DELTA;
break yylval.string_value = strdup(yytext); return BREAK;
inc yylval.string_value = strdup(yytext); return INC;
exch yylval.string_value = strdup(yytext); return EXCH;
cas yylval.string_value = strdup(yytext); return CAS;
norn yylval.string_value = strdup(yytext); return NORN;
nxor yylval.string_value = strdup(yytext); return NXOR;
sad yylval.string_value = strdup(yytext); return SAD;
op\.13 yylval.string_value = strdup(yytext); return OP13;
op\.e5 yylval.string_value = strdup(yytext); return OPE5;
op\.e6 yylval.string_value = strdup(yytext); return OPE6;
op\.d0 yylval.string_value = strdup(yytext); return OPD0;
return yylval.string_value = strdup(yytext); return RETURN;
/*instruction modifiers*/
\.rp yylval.string_value = strdup(yytext); return DOTRP;
\.rm yylval.string_value = strdup(yytext); return DOTRM;
\.rn yylval.string_value = strdup(yytext); return DOTRN;
\.rni yylval.string_value = strdup(yytext); return DOTRNI;
\.rz yylval.string_value = strdup(yytext); return DOTRZ;
\.rzi yylval.string_value = strdup(yytext); return DOTRZI;
\.half yylval.string_value = strdup(yytext); return DOTHALF;
\.end yylval.string_value = strdup(yytext); return DOTEND;
\.lo yylval.string_value = strdup(yytext); return DOTLO;
\.abs yylval.string_value = strdup(yytext); return DOTABS;
\.join yylval.string_value = strdup(yytext); return DOTJOIN;
\.neg yylval.string_value = strdup(yytext); return DOTNEG;
\.sat yylval.string_value = strdup(yytext); return DOTSAT;
/* comparison operators */
\.eq yylval.string_value = strdup(yytext); return DOTEQ;
\.ne yylval.string_value = strdup(yytext); return DOTNE;
\.lt yylval.string_value = strdup(yytext); return DOTLT;
\.le yylval.string_value = strdup(yytext); return DOTLE;
\.gt yylval.string_value = strdup(yytext); return DOTGT;
\.ge yylval.string_value = strdup(yytext); return DOTGE;
\.ls yylval.string_value = strdup(yytext); return DOTLS;
\.hi yylval.string_value = strdup(yytext); return DOTHI;
\.hs yylval.string_value = strdup(yytext); return DOTHS;
\.equ yylval.string_value = strdup(yytext); return DOTEQU;
\.neu yylval.string_value = strdup(yytext); return DOTNEU;
\.ltu yylval.string_value = strdup(yytext); return DOTLTU;
\.leu yylval.string_value = strdup(yytext); return DOTLEU;
\.gtu yylval.string_value = strdup(yytext); return DOTGTU;
\.geu yylval.string_value = strdup(yytext); return DOTGEU;
\.num yylval.string_value = strdup(yytext); return DOTNUM;
\.nan yylval.string_value = strdup(yytext); return DOTNAN;
\.nsf yylval.string_value = strdup(yytext); return DOTNSF;
\.sf yylval.string_value = strdup(yytext); return DOTSF;
\.cf yylval.string_value = strdup(yytext); return DOTCF;
/*operand types*/
\.s8 yylval.string_value = strdup(yytext); return DOTS8;
\.s16 yylval.string_value = strdup(yytext); return DOTS16;
\.s32 yylval.string_value = strdup(yytext); return DOTS32;
\.s64 yylval.string_value = strdup(yytext); return DOTS64;
\.u8 yylval.string_value = strdup(yytext); return DOTU8;
\.u16 yylval.string_value = strdup(yytext); return DOTU16;
\.u32 yylval.string_value = strdup(yytext); return DOTU32;
\.u64 yylval.string_value = strdup(yytext); return DOTU64;
\.b8 yylval.string_value = strdup(yytext); return DOTB8;
\.b16 yylval.string_value = strdup(yytext); return DOTB16;
\.b32 yylval.string_value = strdup(yytext); return DOTB32;
\.b64 yylval.string_value = strdup(yytext); return DOTB64;
\.b128 yylval.string_value = strdup(yytext); return DOTB128;
\.f16 yylval.string_value = strdup(yytext); return DOTF16;
\.f32 yylval.string_value = strdup(yytext); return DOTF32;
\.f64 yylval.string_value = strdup(yytext); return DOTF64;
/*geometries*/
\.1d yylval.string_value = strdup(yytext); return DOT1D;
\.2d yylval.string_value = strdup(yytext); return DOT2D;
\.3d yylval.string_value = strdup(yytext); return DOT3D;
/*register operands*/
[\-]?\$r{numeric}+ yylval.string_value = strdup(yytext); return REGISTER;
[\-]?\$r{numeric}+\.lo yylval.string_value = strdup(yytext); return REGISTERLO;
[\-]?\$r{numeric}+\.hi yylval.string_value = strdup(yytext); return REGISTERHI;
[\-]?\$ofs{numeric}+ yylval.string_value = strdup(yytext); return OFFSETREGISTER;
\$p{numeric}+ yylval.string_value = strdup(yytext); return PREDREGISTER;
\$o{numeric}+ yylval.string_value = strdup(yytext); return PREDREGISTER2;
/*tex operand*/
[\-]?\$tex{numeric}+ yylval.string_value = strdup(yytext); return TEXOP;
/*vector operands*/
\{($r{numeric}+|_)\} yylval.string_value = strdup(yytext); return VECTOR1D;
\{($r{numeric}+|_)\,($r{numeric}+|_)\} yylval.string_value = strdup(yytext); return VECTOR2D;
\{($r{numeric}+|_)\,($r{numeric}+|_)\,($r{numeric}+|_)\} yylval.string_value = strdup(yytext); return VECTOR3D;
\{($r{numeric}+|_)\,($r{numeric}+|_)\,($r{numeric}+|_)\,($r{numeric}+|_)\} yylval.string_value = strdup(yytext); return VECTOR4D;
/*special registers*/
"%ntid.x" return NTIDXREGISTER;
"%ntid.y" return NTIDYREGISTER;
"%ctaid.x" return CTAIDXREGISTER;
"%nctaid.x" return NCTAIDXREGISTER;
"%ctaid.y" return CTAIDYREGISTER;
"%nctaid.y" return NCTAIDYREGISTER;
"%clock" return CLOCKREGISTER;
/*memory location operands*/
[\-]?l\[{hexliteral}\] yylval.string_value = strdup(yytext); return LMEMLOCATION;
[\-]?l\[\$r{numeric}+\] yylval.string_value = strdup(yytext); return LMEMLOCATION;
[\-]?l\[\$ofs{numeric}+\+{hexliteral}\] yylval.string_value = strdup(yytext); return LMEMLOCATION;
[\-]?l\[\$ofs{numeric}+\+={hexliteral}\] yylval.string_value = strdup(yytext); return LMEMLOCATION;
[\-]?s\[{hexliteral}\] yylval.string_value = strdup(yytext); return SMEMLOCATION;
[\-]?s\[\$r{numeric}+\] yylval.string_value = strdup(yytext); return SMEMLOCATION;
[\-]?s\[\$ofs{numeric}+\+{hexliteral}\] yylval.string_value = strdup(yytext); return SMEMLOCATION;
[\-]?s\[\$ofs{numeric}+\+={hexliteral}\] yylval.string_value = strdup(yytext); return SMEMLOCATION;
[\-]?g\[{hexliteral}\] yylval.string_value = strdup(yytext); return GMEMLOCATION;
[\-]?g\[\$r{numeric}+\] yylval.string_value = strdup(yytext); return GMEMLOCATION;
[\-]?g\[\$ofs{numeric}+\+{hexliteral}\] yylval.string_value = strdup(yytext); return GMEMLOCATION;
[\-]?g\[\$ofs{numeric}+\+={hexliteral}\] yylval.string_value = strdup(yytext); return GMEMLOCATION;
[\-]?c{numeric}+\[{hexliteral}\] yylval.string_value = strdup(yytext); return CMEMLOCATION;
[\-]?c{numeric}+\[\$r{numeric}+\] yylval.string_value = strdup(yytext); return CMEMLOCATION;
[\-]?c{numeric}+\[\$ofs{numeric}+\+{hexliteral}\] yylval.string_value = strdup(yytext); return CMEMLOCATION;
[\-]?c{numeric}+\[\$ofs{numeric}+\+={hexliteral}\] yylval.string_value = strdup(yytext); return CMEMLOCATION;
/*identifier + literals*/
{identifier} yylval.string_value = strdup(yytext); return IDENTIFER;
{hexliteral} yylval.string_value = strdup(yytext); return HEXLITERAL; //change to int later?
{octliteral} yylval.string_value = strdup(yytext); return OCTLITERAL; //change to int later?
{binliteral} yylval.string_value = strdup(yytext); return BINLITERAL; //change to int later?
{decliteral} yylval.string_value = strdup(yytext); return DECLITERAL; //change to int later?
{fltliteral} yylval.string_value = strdup(yytext); return FLTLITERAL;
\: return COLON;
{pipe} return PIPE;
/*braces*/
\{ yylval.string_value = strdup(yytext); return LEFTBRACE;
\} yylval.string_value = strdup(yytext); return RIGHTBRACE;
/* pound sign*/
"#" yylval.string_value = strdup(yytext); return POUND;
/* comma*/
"," yylval.string_value = strdup(yytext); return COMMA;
/* underscore sign*/
"_" yylval.string_value = strdup(yytext); return UNDERSCORE;
/*Need to create to newline tokens*/
{newline}+ return NEWLINE;
/*discard whitespace*/
{whitespace}+
/*discard comments*/
"//"{anycharbutnewline}*
/*reached end of file*/
<<EOF>> return 0;
/*None of the rules matched. Throw error*/
. yyerror("Invalid token");
%%
void yyerror(const char* message)
{
printf(" "); printf(message); printf(" near \""); printf(yytext); printf("\"");
printf(" on line ");
char line[5]; sprintf(line, "%i", yylineno); printf(line);
printf("\n");
}
|