#include #ifndef lint #ifdef __unused __unused #endif static char const yyrcsid[] = "$FreeBSD: src/usr.bin/yacc/skeleton.c,v 1.37 2003/02/12 18:03:55 davidc Exp $"; #endif #define YYBYACC 1 #define YYMAJOR 1 #define YYMINOR 9 #define YYLEX yylex() #define YYEMPTY -1 #define yyclearin (yychar=(YYEMPTY)) #define yyerrok (yyerrflag=0) #define YYRECOVERING() (yyerrflag!=0) #if defined(__cplusplus) || __STDC__ static int yygrowstack(void); #else static int yygrowstack(); #endif #define YYPREFIX "yy" #line 2 "gram.y" /* * Copyright © 2006 Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * Authors: * Eric Anholt * */ #include #include "gen4asm.h" #include "brw_defines.h" #line 37 "gram.y" typedef union { char *s; int integer; double number; struct brw_instruction instruction; struct brw_program program; struct region { int vert_stride, width, horiz_stride; } region; struct gen_reg { int reg_file, reg_nr, subreg_nr; } direct_gen_reg; /* XXX: naming */ double imm32; } YYSTYPE; #line 71 "y.tab.c" #define YYERRCODE 256 #define SEMICOLON 257 #define LPAREN 258 #define RPAREN 259 #define LANGLE 260 #define RANGLE 261 #define LCURLY 262 #define RCURLY 263 #define COMMA 264 #define DOT 265 #define TYPE_UD 266 #define TYPE_D 267 #define TYPE_UW 268 #define TYPE_W 269 #define TYPE_UB 270 #define TYPE_B 271 #define TYPE_VF 272 #define TYPE_HF 273 #define TYPE_V 274 #define TYPE_F 275 #define ALIGN1 276 #define ALIGN16 277 #define MASK_DISABLE 278 #define EOT 279 #define GENREG 280 #define MSGREG 281 #define ACCREG 282 #define ADDRESSREG 283 #define FLAGREG 284 #define CONTROLREG 285 #define IPREG 286 #define MOV 287 #define MUL 288 #define MAC 289 #define MACH 290 #define LINE 291 #define SAD2 292 #define SADA2 293 #define DP4 294 #define DPH 295 #define DP3 296 #define DP2 297 #define ADD 298 #define SEND 299 #define NULL_TOKEN 300 #define MATH 301 #define SAMPLER 302 #define GATEWAY 303 #define READ 304 #define WRITE 305 #define URB 306 #define THREAD_SPAWNER 307 #define NOP 308 #define MSGLEN 309 #define RETURNLEN 310 #define SATURATE 311 #define INTEGER 312 #define NUMBER 313 #define flagreg 314 #define maskreg 315 const short yylhs[] = { -1, 0, 20, 20, 20, 1, 1, 1, 1, 1, 2, 22, 3, 23, 23, 4, 24, 5, 6, 7, 41, 32, 32, 32, 32, 32, 32, 32, 32, 8, 8, 9, 10, 10, 11, 11, 17, 17, 16, 15, 15, 12, 13, 14, 31, 31, 34, 35, 37, 36, 38, 30, 33, 27, 27, 27, 27, 27, 27, 27, 28, 39, 39, 40, 29, 26, 26, 25, 18, 19, 19, 21, 21, 21, 21, }; const short yylen[] = { 2, 1, 3, 2, 3, 1, 1, 1, 1, 1, 8, 1, 9, 1, 1, 9, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 3, 2, 0, 3, 3, 3, 3, 1, 3, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, 0, 2, 0, 3, 2, 0, 1, 1, 1, 1, }; const short yydefred[] = { 0, 0, 19, 0, 0, 5, 6, 7, 8, 17, 9, 1, 0, 0, 0, 11, 13, 14, 16, 0, 67, 67, 67, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 29, 30, 0, 34, 35, 0, 33, 66, 0, 0, 0, 64, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 47, 48, 0, 0, 21, 23, 22, 24, 25, 26, 27, 28, 0, 0, 54, 55, 56, 57, 58, 59, 53, 31, 32, 61, 62, 38, 41, 36, 0, 0, 0, 42, 0, 44, 0, 43, 0, 51, 0, 10, 60, 37, 39, 0, 0, 0, 0, 0, 71, 72, 73, 74, 0, 0, 12, 40, 15, 0, 0, 68, 69, 0, 0, 0, 18, 52, }; const short yydgoto[] = { 3, 4, 5, 6, 7, 8, 9, 10, 40, 41, 42, 43, 92, 97, 93, 110, 94, 95, 106, 119, 11, 120, 20, 21, 22, 26, 32, 107, 108, 30, 60, 66, 79, 70, 57, 45, 0, 46, 47, 111, 12, 58, }; const short yysindex[] = { -254, -251, 0, 0, -246, 0, 0, 0, 0, 0, 0, 0, -268, -254, -254, 0, 0, 0, 0, -308, 0, 0, 0, 0, 0, -230, -207, -207, -207, -239, -273, -236, -230, -230, -230, -187, -238, -235, -234, 0, -204, 0, 0, -181, 0, 0, -181, 0, 0, -273, -273, -273, 0, -185, -185, -185, 0, -179, -240, -229, -253, -253, -277, -204, -204, -228, 0, 0, 0, -227, -253, 0, 0, 0, 0, 0, 0, 0, 0, -223, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -180, -253, -277, 0, -277, 0, -176, 0, -222, 0, -237, 0, 0, 0, 0, -180, -253, -180, -221, -218, 0, 0, 0, 0, -170, -237, 0, 0, 0, -175, -217, 0, 0, -216, -180, -167, 0, 0, }; const short yyrindex[] = { -255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -161, -161, -161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -162, -162, -162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; const short yygindex[] = { 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -40, 2, 36, 0, -100, -18, 32, 0, 0, 0, 0, 34, 41, -23, -8, 19, 58, 16, 0, 0, -25, 0, 0, 0, 0, 43, 0, 0, }; #define YYTABLESIZE 300 const short yytable[] = { 56, 3, 1, 36, 25, 44, 13, 36, 37, 38, 121, 14, 123, 81, 82, 83, 84, 85, 86, 15, 16, 17, 87, 98, 44, 44, 44, 39, 29, 131, 18, 19, 63, 63, 63, 90, 91, 88, 89, 115, 116, 117, 118, 63, 63, 23, 24, 102, 62, 63, 64, 49, 50, 51, 2, 27, 28, 109, 31, 109, 71, 72, 73, 74, 75, 76, 77, 78, 33, 34, 67, 68, 52, 35, 53, 48, 36, 54, 55, 59, 65, 69, 105, 80, 100, 101, 103, 104, 113, 128, 114, 124, 125, 126, 132, 129, 130, 65, 45, 70, 99, 112, 127, 122, 61, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, }; const short yycheck[] = { 40, 0, 256, 280, 312, 30, 257, 280, 281, 282, 110, 257, 112, 266, 267, 268, 269, 270, 271, 287, 288, 289, 275, 63, 49, 50, 51, 300, 258, 129, 298, 299, 287, 288, 289, 312, 313, 60, 61, 276, 277, 278, 279, 298, 299, 13, 14, 70, 49, 50, 51, 32, 33, 34, 308, 21, 22, 97, 265, 99, 300, 301, 302, 303, 304, 305, 306, 307, 27, 28, 54, 55, 259, 312, 312, 311, 280, 312, 312, 260, 265, 260, 262, 312, 312, 312, 309, 261, 264, 264, 312, 312, 310, 263, 261, 312, 312, 258, 260, 263, 64, 99, 120, 111, 46, 62, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 287, 288, 289, -1, -1, -1, -1, -1, -1, -1, -1, 298, 299, }; #define YYFINAL 3 #ifndef YYDEBUG #define YYDEBUG 0 #endif #define YYMAXTOKEN 315 #if YYDEBUG const char * const yyname[] = { "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"SEMICOLON","LPAREN","RPAREN", "LANGLE","RANGLE","LCURLY","RCURLY","COMMA","DOT","TYPE_UD","TYPE_D","TYPE_UW", "TYPE_W","TYPE_UB","TYPE_B","TYPE_VF","TYPE_HF","TYPE_V","TYPE_F","ALIGN1", "ALIGN16","MASK_DISABLE","EOT","GENREG","MSGREG","ACCREG","ADDRESSREG", "FLAGREG","CONTROLREG","IPREG","MOV","MUL","MAC","MACH","LINE","SAD2","SADA2", "DP4","DPH","DP3","DP2","ADD","SEND","NULL_TOKEN","MATH","SAMPLER","GATEWAY", "READ","WRITE","URB","THREAD_SPAWNER","NOP","MSGLEN","RETURNLEN","SATURATE", "INTEGER","NUMBER","flagreg","maskreg", }; const char * const yyrule[] = { "$accept : ROOT", "ROOT : instrseq", "instrseq : instruction SEMICOLON instrseq", "instrseq : instruction SEMICOLON", "instrseq : error SEMICOLON instrseq", "instruction : unaryinstruction", "instruction : binaryinstruction", "instruction : binaryaccinstruction", "instruction : triinstruction", "instruction : specialinstruction", "unaryinstruction : predicate unaryop conditionalmodifier saturate execsize dst srcaccimm instoptions", "unaryop : MOV", "binaryinstruction : predicate binaryop conditionalmodifier saturate execsize dst src srcimm instoptions", "binaryop : MUL", "binaryop : MAC", "binaryaccinstruction : predicate binaryaccop conditionalmodifier saturate execsize dst srcacc srcimm instoptions", "binaryaccop : ADD", "triinstruction : sendinstruction", "sendinstruction : predicate SEND INTEGER execsize dst payload msgtarget MSGLEN INTEGER RETURNLEN INTEGER instoptions", "specialinstruction : NOP", "payload : directsrcoperand", "msgtarget : NULL_TOKEN", "msgtarget : SAMPLER", "msgtarget : MATH", "msgtarget : GATEWAY", "msgtarget : READ", "msgtarget : WRITE", "msgtarget : URB", "msgtarget : THREAD_SPAWNER", "dst : dstoperand", "dst : dstoperandex", "dstoperand : dstreg dstregion regtype", "dstoperandex : accreg dstregion regtype", "dstoperandex : nullreg", "dstreg : directgenreg", "dstreg : directmsgreg", "srcaccimm : srcacc", "srcaccimm : imm32 srcimmtype", "srcacc : directsrcaccoperand", "srcimm : directsrcoperand", "srcimm : imm32 srcimmtype", "directsrcaccoperand : directsrcoperand", "src : directsrcoperand", "directsrcoperand : directgenreg region regtype", "subregnum : DOT INTEGER", "subregnum :", "directgenreg : GENREG INTEGER subregnum", "directmsgreg : MSGREG INTEGER subregnum", "accreg : ACCREG INTEGER subregnum", "addrreg : ADDRESSREG INTEGER subregnum", "nullreg : NULL_TOKEN", "dstregion : LANGLE INTEGER RANGLE", "region : LANGLE INTEGER COMMA INTEGER COMMA INTEGER RANGLE", "regtype : TYPE_F", "regtype : TYPE_UD", "regtype : TYPE_D", "regtype : TYPE_UW", "regtype : TYPE_W", "regtype : TYPE_UB", "regtype : TYPE_B", "srcimmtype : regtype", "imm32 : INTEGER", "imm32 : NUMBER", "predicate :", "execsize : LPAREN INTEGER RPAREN", "saturate :", "saturate : DOT SATURATE", "conditionalmodifier :", "instoptions : LCURLY instoption_list RCURLY", "instoption_list : instoption instoption_list", "instoption_list :", "instoption : ALIGN1", "instoption : ALIGN16", "instoption : MASK_DISABLE", "instoption : EOT", }; #endif #if YYDEBUG #include #endif #ifdef YYSTACKSIZE #undef YYMAXDEPTH #define YYMAXDEPTH YYSTACKSIZE #else #ifdef YYMAXDEPTH #define YYSTACKSIZE YYMAXDEPTH #else #define YYSTACKSIZE 10000 #define YYMAXDEPTH 10000 #endif #endif #define YYINITSTACKSIZE 200 int yydebug; int yynerrs; int yyerrflag; int yychar; short *yyssp; YYSTYPE *yyvsp; YYSTYPE yyval; YYSTYPE yylval; short *yyss; short *yysslim; YYSTYPE *yyvs; int yystacksize; #line 498 "gram.y" extern int yylineno; void yyerror (char *msg) { fprintf(stderr, "parse error \"%s\" at line %d, token \"%s\"\n", msg, yylineno, lex_text()); } /** * Fills in the destination register information in instr from the bits in dst. */ void set_instruction_dest(struct brw_instruction *instr, struct brw_instruction *dest) { instr->bits1.da1.dest_reg_file = dest->bits1.da1.dest_reg_file; instr->bits1.da1.dest_reg_type = dest->bits1.da1.dest_reg_type; instr->bits1.da1.dest_subreg_nr = dest->bits1.da1.dest_subreg_nr; instr->bits1.da1.dest_reg_nr = dest->bits1.da1.dest_reg_nr; instr->bits1.da1.dest_horiz_stride = dest->bits1.da1.dest_horiz_stride; instr->bits1.da1.dest_address_mode = dest->bits1.da1.dest_address_mode; } void set_instruction_src0(struct brw_instruction *instr, struct brw_instruction *src) { instr->bits1.da1.src0_reg_file = src->bits1.da1.src0_reg_file; instr->bits1.da1.src0_reg_type = src->bits1.da1.src0_reg_type; if (src->bits1.da1.src0_reg_file == BRW_IMMEDIATE_VALUE) { instr->bits3.ud = src->bits3.ud; } else { instr->bits2.da1.src0_subreg_nr = src->bits2.da1.src0_subreg_nr; instr->bits2.da1.src0_reg_nr = src->bits2.da1.src0_reg_nr; instr->bits2.da1.src0_vert_stride = src->bits2.da1.src0_vert_stride; instr->bits2.da1.src0_width = src->bits2.da1.src0_width; instr->bits2.da1.src0_horiz_stride = src->bits2.da1.src0_horiz_stride; } } void set_instruction_src1(struct brw_instruction *instr, struct brw_instruction *src) { instr->bits1.da1.src1_reg_file = src->bits1.da1.src0_reg_file; instr->bits1.da1.src1_reg_type = src->bits1.da1.src0_reg_type; if (src->bits1.da1.src0_reg_file == BRW_IMMEDIATE_VALUE) { instr->bits3.ud = src->bits3.ud; } else { instr->bits3.da1.src1_subreg_nr = src->bits2.da1.src0_subreg_nr; instr->bits3.da1.src1_reg_nr = src->bits2.da1.src0_reg_nr; instr->bits3.da1.src1_vert_stride = src->bits2.da1.src0_vert_stride; instr->bits3.da1.src1_width = src->bits2.da1.src0_width; instr->bits3.da1.src1_horiz_stride = src->bits2.da1.src0_horiz_stride; } } void set_instruction_options(struct brw_instruction *instr, struct brw_instruction *options) { instr->header.access_mode = options->header.access_mode; instr->header.mask_control = options->header.mask_control; instr->header.dependency_control = options->header.dependency_control; instr->header.compression_control = options->header.compression_control; } #line 477 "y.tab.c" /* allocate initial stack or double stack size, up to YYMAXDEPTH */ static int yygrowstack() { int newsize, i; short *newss; YYSTYPE *newvs; if ((newsize = yystacksize) == 0) newsize = YYINITSTACKSIZE; else if (newsize >= YYMAXDEPTH) return -1; else if ((newsize *= 2) > YYMAXDEPTH) newsize = YYMAXDEPTH; i = yyssp - yyss; newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) : (short *)malloc(newsize * sizeof *newss); if (newss == NULL) return -1; yyss = newss; yyssp = newss + i; newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) : (YYSTYPE *)malloc(newsize * sizeof *newvs); if (newvs == NULL) return -1; yyvs = newvs; yyvsp = newvs + i; yystacksize = newsize; yysslim = yyss + newsize - 1; return 0; } #define YYABORT goto yyabort #define YYREJECT goto yyabort #define YYACCEPT goto yyaccept #define YYERROR goto yyerrlab #ifndef YYPARSE_PARAM #if defined(__cplusplus) || __STDC__ #define YYPARSE_PARAM_ARG void #define YYPARSE_PARAM_DECL #else /* ! ANSI-C/C++ */ #define YYPARSE_PARAM_ARG #define YYPARSE_PARAM_DECL #endif /* ANSI-C/C++ */ #else /* YYPARSE_PARAM */ #ifndef YYPARSE_PARAM_TYPE #define YYPARSE_PARAM_TYPE void * #endif #if defined(__cplusplus) || __STDC__ #define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM #define YYPARSE_PARAM_DECL #else /* ! ANSI-C/C++ */ #define YYPARSE_PARAM_ARG YYPARSE_PARAM #define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM; #endif /* ANSI-C/C++ */ #endif /* ! YYPARSE_PARAM */ int yyparse (YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { int yym, yyn, yystate; #if YYDEBUG const char *yys; if ((yys = getenv("YYDEBUG"))) { yyn = *yys; if (yyn >= '0' && yyn <= '9') yydebug = yyn - '0'; } #endif yynerrs = 0; yyerrflag = 0; yychar = (-1); if (yyss == NULL && yygrowstack()) goto yyoverflow; yyssp = yyss; yyvsp = yyvs; *yyssp = yystate = 0; yyloop: if ((yyn = yydefred[yystate])) goto yyreduce; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, yystate, yychar, yys); } #endif } if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { #if YYDEBUG if (yydebug) printf("%sdebug: state %d, shifting to state %d\n", YYPREFIX, yystate, yytable[yyn]); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; yychar = (-1); if (yyerrflag > 0) --yyerrflag; goto yyloop; } if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { yyn = yytable[yyn]; goto yyreduce; } if (yyerrflag) goto yyinrecovery; #if defined(lint) || defined(__GNUC__) goto yynewerror; #endif yynewerror: yyerror("syntax error"); #if defined(lint) || defined(__GNUC__) goto yyerrlab; #endif yyerrlab: ++yynerrs; yyinrecovery: if (yyerrflag < 3) { yyerrflag = 3; for (;;) { if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) { #if YYDEBUG if (yydebug) printf("%sdebug: state %d, error recovery shifting\ to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; goto yyloop; } else { #if YYDEBUG if (yydebug) printf("%sdebug: error recovery discarding state %d\n", YYPREFIX, *yyssp); #endif if (yyssp <= yyss) goto yyabort; --yyssp; --yyvsp; } } } else { if (yychar == 0) goto yyabort; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, error recovery discards token %d (%s)\n", YYPREFIX, yystate, yychar, yys); } #endif yychar = (-1); goto yyloop; } yyreduce: #if YYDEBUG if (yydebug) printf("%sdebug: state %d, reducing by rule %d (%s)\n", YYPREFIX, yystate, yyn, yyrule[yyn]); #endif yym = yylen[yyn]; yyval = yyvsp[1-yym]; switch (yyn) { case 1: #line 99 "gram.y" { compiled_program = yyvsp[0].program; } break; case 2: #line 105 "gram.y" { struct brw_program_instruction *list_entry = calloc(sizeof(struct brw_program_instruction), 1); list_entry->instruction = yyvsp[-2].instruction; list_entry->next = yyvsp[0].program.first; yyvsp[0].program.first = list_entry; yyval.program = yyvsp[0].program; } break; case 3: #line 116 "gram.y" { struct brw_program_instruction *list_entry = calloc(sizeof(struct brw_program_instruction), 1); list_entry->instruction = yyvsp[-1].instruction; list_entry->next = NULL; yyval.program.first = list_entry; } break; case 4: #line 126 "gram.y" { yyval.program = yyvsp[0].program; } break; case 10: #line 142 "gram.y" { yyval.instruction.header.opcode = yyvsp[-6].integer; yyval.instruction.header.saturate = yyvsp[-5].integer; yyval.instruction.header.destreg__conditionalmod = yyvsp[-4].integer; yyval.instruction.header.execution_size = yyvsp[-3].integer; set_instruction_dest(&yyval.instruction, &yyvsp[-2].instruction); set_instruction_src0(&yyval.instruction, &yyvsp[-1].instruction); set_instruction_options(&yyval.instruction, &yyvsp[0].instruction); } break; case 11: #line 153 "gram.y" { yyval.integer = BRW_OPCODE_MOV; } break; case 12: #line 159 "gram.y" { yyval.instruction.header.opcode = yyvsp[-7].integer; yyval.instruction.header.saturate = yyvsp[-6].integer; yyval.instruction.header.destreg__conditionalmod = yyvsp[-5].integer; yyval.instruction.header.execution_size = yyvsp[-4].integer; set_instruction_dest(&yyval.instruction, &yyvsp[-3].instruction); set_instruction_src0(&yyval.instruction, &yyvsp[-2].instruction); set_instruction_src1(&yyval.instruction, &yyvsp[-1].instruction); set_instruction_options(&yyval.instruction, &yyvsp[0].instruction); } break; case 13: #line 171 "gram.y" { yyval.integer = BRW_OPCODE_MUL; } break; case 14: #line 172 "gram.y" { yyval.integer = BRW_OPCODE_MAC; } break; case 15: #line 177 "gram.y" { yyval.instruction.header.opcode = yyvsp[-7].integer; yyval.instruction.header.saturate = yyvsp[-6].integer; yyval.instruction.header.destreg__conditionalmod = yyvsp[-5].integer; yyval.instruction.header.execution_size = yyvsp[-4].integer; set_instruction_dest(&yyval.instruction, &yyvsp[-3].instruction); set_instruction_src0(&yyval.instruction, &yyvsp[-2].instruction); set_instruction_src1(&yyval.instruction, &yyvsp[-1].instruction); set_instruction_options(&yyval.instruction, &yyvsp[0].instruction); } break; case 16: #line 189 "gram.y" { yyval.integer = BRW_OPCODE_ADD; } break; case 18: #line 197 "gram.y" { yyval.instruction.header.opcode = BRW_OPCODE_SEND; yyval.instruction.header.execution_size = yyvsp[-8].integer; yyval.instruction.header.destreg__conditionalmod = yyvsp[-9].integer; } break; case 19: #line 204 "gram.y" { yyval.instruction.header.opcode = BRW_OPCODE_NOP; } break; case 21: #line 212 "gram.y" { yyval.integer = BRW_MESSAGE_TARGET_NULL; } break; case 22: #line 213 "gram.y" { yyval.integer = BRW_MESSAGE_TARGET_SAMPLER; } break; case 23: #line 214 "gram.y" { yyval.integer = BRW_MESSAGE_TARGET_MATH; } break; case 24: #line 215 "gram.y" { yyval.integer = BRW_MESSAGE_TARGET_GATEWAY; } break; case 25: #line 216 "gram.y" { yyval.integer = BRW_MESSAGE_TARGET_DATAPORT_READ; } break; case 26: #line 217 "gram.y" { yyval.integer = BRW_MESSAGE_TARGET_DATAPORT_WRITE; } break; case 27: #line 218 "gram.y" { yyval.integer = BRW_MESSAGE_TARGET_URB; } break; case 28: #line 219 "gram.y" { yyval.integer = BRW_MESSAGE_TARGET_THREAD_SPAWNER; } break; case 31: #line 228 "gram.y" { /* Returns an instruction with just the destination register * filled in. */ yyval.instruction.bits1 = yyvsp[-2].instruction.bits1; yyval.instruction.bits1.da1.dest_reg_type = yyvsp[-1].integer; /* XXX */ /* XXX: $3 */ } break; case 32: #line 239 "gram.y" { /* Returns an instruction with just the destination register * filled in. */ yyval.instruction.bits1.da1.dest_reg_file = yyvsp[-2].direct_gen_reg.reg_file; yyval.instruction.bits1.da1.dest_reg_nr = yyvsp[-2].direct_gen_reg.reg_nr; yyval.instruction.bits1.da1.dest_subreg_nr = yyvsp[-2].direct_gen_reg.subreg_nr; /* XXX: $2 $3 */ } break; case 33: #line 249 "gram.y" { /* Returns an instruction with just the destination register * filled in. */ yyval.instruction.bits1.da1.dest_reg_file = yyvsp[0].direct_gen_reg.reg_file; yyval.instruction.bits1.da1.dest_reg_nr = yyvsp[0].direct_gen_reg.reg_nr; yyval.instruction.bits1.da1.dest_subreg_nr = yyvsp[0].direct_gen_reg.subreg_nr; } break; case 34: #line 261 "gram.y" { yyval.instruction.bits1.da1.dest_reg_file = yyvsp[0].direct_gen_reg.reg_file; yyval.instruction.bits1.da1.dest_reg_nr = yyvsp[0].direct_gen_reg.reg_nr; yyval.instruction.bits1.da1.dest_subreg_nr = yyvsp[0].direct_gen_reg.subreg_nr; } break; case 37: #line 273 "gram.y" { yyval.instruction.bits1.da1.src0_reg_file = BRW_IMMEDIATE_VALUE; switch (yyvsp[0].integer) { case BRW_REGISTER_TYPE_UD: yyval.instruction.bits3.ud = yyvsp[-1].imm32; break; case BRW_REGISTER_TYPE_D: yyval.instruction.bits3.id = yyvsp[-1].imm32; break; case BRW_REGISTER_TYPE_F: yyval.instruction.bits3.fd = yyvsp[-1].imm32; break; } } break; case 40: #line 295 "gram.y" { yyval.instruction.bits1.da1.src0_reg_file = BRW_IMMEDIATE_VALUE; switch (yyvsp[0].integer) { case BRW_REGISTER_TYPE_UD: yyval.instruction.bits3.ud = yyvsp[-1].imm32; break; case BRW_REGISTER_TYPE_D: yyval.instruction.bits3.id = yyvsp[-1].imm32; break; case BRW_REGISTER_TYPE_F: yyval.instruction.bits3.fd = yyvsp[-1].imm32; break; } } break; case 43: #line 321 "gram.y" { /* Returns a source operand in the src0 fields of an * instruction. */ yyval.instruction.bits1.da1.src0_reg_file = yyvsp[-2].direct_gen_reg.reg_file; yyval.instruction.bits1.da1.src0_reg_type = yyvsp[0].integer; yyval.instruction.bits2.da1.src0_subreg_nr = yyvsp[-2].direct_gen_reg.subreg_nr; yyval.instruction.bits2.da1.src0_reg_nr = yyvsp[-2].direct_gen_reg.reg_nr; yyval.instruction.bits2.da1.src0_vert_stride = yyvsp[-1].region.vert_stride; yyval.instruction.bits2.da1.src0_width = yyvsp[-1].region.width; yyval.instruction.bits2.da1.src0_horiz_stride = yyvsp[-1].region.horiz_stride; } break; case 44: #line 336 "gram.y" { yyval.integer = yyvsp[0].integer; } break; case 45: #line 340 "gram.y" { /* Default to subreg 0 if unspecified. */ yyval.integer = 0; } break; case 46: #line 348 "gram.y" { /* Returns an instruction with just the destination register * fields filled in. */ yyval.direct_gen_reg.reg_file = BRW_GENERAL_REGISTER_FILE; yyval.direct_gen_reg.reg_nr = yyvsp[-1].integer; yyval.direct_gen_reg.subreg_nr = yyvsp[0].integer; } break; case 47: #line 358 "gram.y" { /* Returns an instruction with just the destination register * fields filled in. */ yyval.direct_gen_reg.reg_file = BRW_GENERAL_REGISTER_FILE; yyval.direct_gen_reg.reg_nr = yyvsp[-1].integer; yyval.direct_gen_reg.subreg_nr = yyvsp[0].integer; } break; case 48: #line 369 "gram.y" { /* Returns an instruction with just the destination register * fields filled in. */ yyval.direct_gen_reg.reg_file = BRW_ARCHITECTURE_REGISTER_FILE; yyval.direct_gen_reg.reg_nr = BRW_ARF_ACCUMULATOR | yyvsp[-1].integer; yyval.direct_gen_reg.subreg_nr = yyvsp[0].integer; } break; case 49: #line 380 "gram.y" { /* Returns an instruction with just the destination register * fields filled in. */ yyval.direct_gen_reg.reg_file = BRW_ARCHITECTURE_REGISTER_FILE; yyval.direct_gen_reg.reg_nr = BRW_ARF_ADDRESS | yyvsp[-1].integer; yyval.direct_gen_reg.subreg_nr = yyvsp[0].integer; } break; case 50: #line 391 "gram.y" { yyval.direct_gen_reg.reg_file = BRW_ARCHITECTURE_REGISTER_FILE; yyval.direct_gen_reg.reg_nr = BRW_ARF_NULL; yyval.direct_gen_reg.subreg_nr = 0; } break; case 51: #line 400 "gram.y" { /* Returns a value for a horiz_stride field of an * instruction. */ if (yyvsp[-1].integer != 1 && yyvsp[-1].integer != 2 && yyvsp[-1].integer != 4) { fprintf(stderr, "Invalid horiz size %d\n", yyvsp[-1].integer); } yyval.integer = ffs(yyvsp[-1].integer) - 1; } break; case 52: #line 412 "gram.y" { yyval.region.vert_stride = ffs(yyvsp[-5].integer); yyval.region.width = ffs(yyvsp[-3].integer) - 1; yyval.region.horiz_stride = ffs(yyvsp[-1].integer) - 1; } break; case 53: #line 424 "gram.y" { yyval.integer = BRW_REGISTER_TYPE_F; } break; case 54: #line 425 "gram.y" { yyval.integer = BRW_REGISTER_TYPE_UD; } break; case 55: #line 426 "gram.y" { yyval.integer = BRW_REGISTER_TYPE_D; } break; case 56: #line 427 "gram.y" { yyval.integer = BRW_REGISTER_TYPE_UW; } break; case 57: #line 428 "gram.y" { yyval.integer = BRW_REGISTER_TYPE_UW; } break; case 58: #line 429 "gram.y" { yyval.integer = BRW_REGISTER_TYPE_UB; } break; case 59: #line 430 "gram.y" { yyval.integer = BRW_REGISTER_TYPE_B; } break; case 61: #line 436 "gram.y" { yyval.imm32 = yyvsp[0].integer; } break; case 62: #line 437 "gram.y" { yyval.imm32 = yyvsp[0].number; } break; case 64: #line 444 "gram.y" { /* Returns a value for the execution_size field of an * instruction. */ if (yyvsp[-1].integer != 1 && yyvsp[-1].integer != 2 && yyvsp[-1].integer != 4 && yyvsp[-1].integer != 8 && yyvsp[-1].integer != 16 && yyvsp[-1].integer != 32) { fprintf(stderr, "Invalid execution size %d\n", yyvsp[-1].integer); YYERROR; } yyval.integer = ffs(yyvsp[-1].integer) - 1; } break; case 65: #line 457 "gram.y" { yyval.integer = BRW_INSTRUCTION_NORMAL; } break; case 66: #line 458 "gram.y" { yyval.integer = BRW_INSTRUCTION_SATURATE; } break; case 68: #line 467 "gram.y" { yyval.instruction = yyvsp[-1].instruction; } break; case 69: #line 471 "gram.y" { yyval.instruction = yyvsp[0].instruction; switch (yyvsp[-1].integer) { case ALIGN1: yyval.instruction.header.access_mode = BRW_ALIGN_1; break; case ALIGN16: yyval.instruction.header.access_mode = BRW_ALIGN_16; break; case MASK_DISABLE: yyval.instruction.header.mask_control = BRW_MASK_DISABLE; break; case EOT: /* XXX: EOT shouldn't be here */ break; } } break; #line 1067 "y.tab.c" } yyssp -= yym; yystate = *yyssp; yyvsp -= yym; yym = yylhs[yyn]; if (yystate == 0 && yym == 0) { #if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state 0 to\ state %d\n", YYPREFIX, YYFINAL); #endif yystate = YYFINAL; *++yyssp = YYFINAL; *++yyvsp = yyval; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, YYFINAL, yychar, yys); } #endif } if (yychar == 0) goto yyaccept; goto yyloop; } if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yystate) yystate = yytable[yyn]; else yystate = yydgoto[yym]; #if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state %d \ to state %d\n", YYPREFIX, *yyssp, yystate); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate; *++yyvsp = yyval; goto yyloop; yyoverflow: yyerror("yacc stack overflow"); yyabort: return (1); yyaccept: return (0); }