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