Get the wm program to parse.

This commit is contained in:
Eric Anholt 2006-08-22 11:54:19 -07:00 committed by Damien Lespiau
parent 22a1063cc0
commit 6c98c8d578
7 changed files with 957 additions and 511 deletions

View File

@ -8,4 +8,5 @@ lextest: ${SOURCES}
cc -o lextest ${SOURCES} cc -o lextest ${SOURCES}
clean: clean:
rm -f gram.c lex.c
rm -f *.o lextest rm -f *.o lextest

View File

@ -1053,7 +1053,7 @@ struct brw_instruction
GLuint predicate_control:4; GLuint predicate_control:4;
GLuint predicate_inverse:1; GLuint predicate_inverse:1;
GLuint execution_size:3; GLuint execution_size:3;
GLuint destreg__conditonalmod:4; /* destreg - send, conditionalmod - others */ GLuint destreg__conditionalmod:4; /* destreg - send, conditionalmod - others */
GLuint pad0:2; GLuint pad0:2;
GLuint debug_control:1; GLuint debug_control:1;
GLuint saturate:1; GLuint saturate:1;

View File

@ -89,113 +89,140 @@ typedef union {
#define TYPE_V 274 #define TYPE_V 274
#define TYPE_F 275 #define TYPE_F 275
#define ALIGN1 276 #define ALIGN1 276
#define GENREGFILE 277 #define ALIGN16 277
#define MSGREGFILE 278 #define MASK_DISABLE 278
#define MOV 279 #define EOT 279
#define MUL 280 #define GENREG 280
#define MAC 281 #define MSGREG 281
#define MACH 282 #define ACCREG 282
#define LINE 283 #define ADDRESSREG 283
#define SAD2 284 #define FLAGREG 284
#define SADA2 285 #define CONTROLREG 285
#define DP4 286 #define IPREG 286
#define DPH 287 #define MOV 287
#define DP3 288 #define MUL 288
#define DP2 289 #define MAC 289
#define ADD 290 #define MACH 290
#define SEND 291 #define LINE 291
#define NULL_TOKEN 292 #define SAD2 292
#define MATH 293 #define SADA2 293
#define SAMPLER 294 #define DP4 294
#define GATEWAY 295 #define DPH 295
#define READ 296 #define DP3 296
#define WRITE 297 #define DP2 297
#define URB 298 #define ADD 298
#define THREAD_SPAWNER 299 #define SEND 299
#define MSGLEN 300 #define NULL_TOKEN 300
#define RETURNLEN 301 #define MATH 301
#define INTEGER 302 #define SAMPLER 302
#define NUMBER 303 #define GATEWAY 303
#define accreg 304 #define READ 304
#define triop 305 #define WRITE 305
#define URB 306
#define THREAD_SPAWNER 307
#define MSGLEN 308
#define RETURNLEN 309
#define SATURATE 310
#define INTEGER 311
#define NUMBER 312
#define flagreg 313
#define maskreg 314
#define NOP 315
const short yylhs[] = { -1, const short yylhs[] = { -1,
0, 16, 16, 16, 1, 1, 1, 1, 2, 17, 0, 21, 21, 21, 1, 1, 1, 1, 1, 2,
3, 18, 4, 19, 5, 6, 34, 35, 26, 26, 22, 3, 23, 23, 4, 24, 5, 6, 7, 41,
26, 26, 26, 26, 26, 26, 32, 7, 8, 9, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40,
9, 15, 15, 14, 13, 13, 10, 11, 12, 28, 8, 9, 9, 10, 10, 17, 17, 16, 15, 15,
24, 24, 29, 25, 23, 27, 20, 20, 20, 20, 12, 13, 14, 31, 31, 34, 35, 11, 36, 37,
20, 20, 20, 21, 30, 30, 31, 22, 33, 36, 30, 33, 27, 27, 27, 27, 27, 27, 27, 28,
38, 38, 39, 29, 26, 26, 25, 18, 19, 19,
20, 20, 20, 20,
}; };
const short yylen[] = { 2, const short yylen[] = { 2,
1, 3, 2, 3, 1, 1, 1, 1, 6, 1, 1, 3, 2, 3, 1, 1, 1, 1, 1, 8,
7, 1, 7, 1, 1, 12, 1, 1, 1, 1, 1, 9, 1, 1, 9, 1, 1, 12, 1, 1,
1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 2, 1, 1, 2, 1, 1, 3, 3, 3, 3, 1, 1, 1, 1, 2, 1, 1, 2,
2, 0, 3, 1, 3, 7, 1, 1, 1, 1, 1, 1, 3, 2, 0, 3, 3, 3, 3, 1,
1, 1, 1, 1, 1, 1, 0, 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, const short yydefred[] = { 0,
0, 0, 0, 5, 6, 7, 8, 15, 1, 0, 0, 19, 0, 0, 5, 6, 7, 8, 17, 9,
0, 0, 10, 12, 14, 0, 0, 0, 0, 4, 1, 0, 0, 0, 11, 13, 14, 16, 0, 67,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 67, 4, 2, 0, 0, 0, 0, 0, 0,
27, 0, 30, 31, 0, 0, 0, 17, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 50, 29,
0, 0, 0, 0, 55, 56, 34, 37, 32, 0, 30, 0, 0, 34, 35, 33, 0, 66, 0, 0,
0, 0, 0, 38, 0, 18, 0, 0, 40, 44, 0, 64, 0, 0, 0, 0, 0, 0, 20, 0,
43, 0, 48, 49, 50, 51, 52, 53, 47, 28, 0, 0, 0, 0, 0, 46, 47, 48, 0, 54,
0, 9, 0, 0, 54, 33, 35, 0, 0, 0, 55, 56, 57, 58, 59, 53, 31, 32, 0, 0,
19, 21, 20, 22, 23, 24, 25, 26, 0, 41, 21, 23, 22, 24, 25, 26, 27, 28, 0, 61,
45, 60, 0, 0, 39, 11, 36, 13, 0, 59, 62, 38, 41, 36, 0, 0, 0, 42, 0, 44,
0, 0, 0, 0, 0, 0, 0, 16, 46, 51, 0, 43, 0, 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[] = { 2, const short yydgoto[] = { 3,
3, 4, 5, 6, 7, 8, 31, 0, 32, 47, 4, 5, 6, 7, 8, 9, 10, 40, 41, 42,
53, 48, 78, 49, 50, 9, 17, 18, 19, 75, 43, 92, 97, 93, 110, 94, 95, 106, 119, 120,
76, 24, 44, 59, 61, 89, 74, 51, 34, 79, 11, 20, 21, 22, 26, 32, 107, 108, 30, 57,
10, 35, 72, 39, 57, 93, 66, 89, 80, 60, 45, 0, 46, 111, 12, 47,
61,
}; };
const short yysindex[] = { -246, const short yysindex[] = { -256,
-251, 0, -239, 0, 0, 0, 0, 0, 0, -271, -244, 0, 0, -218, 0, 0, 0, 0, 0, 0,
-246, -246, 0, 0, 0, -280, -232, -232, -232, 0, 0, -266, -256, -256, 0, 0, 0, 0, -265, 0,
0, -232, -273, -261, -261, -261, -261, -219, -245, -244, 0, 0, 0, 0, -205, -194, -194, -194, -239, -274,
0, -204, 0, 0, -275, -218, -218, 0, -218, 0, -237, -205, -205, -205, -185, -236, -235, -234, 0, 0,
-205, -205, -241, -234, 0, 0, 0, 0, 0, -200, 0, -182, -182, 0, 0, 0, -201, 0, -274, -274,
-197, -234, -275, 0, -275, 0, -250, -238, 0, 0, -274, 0, -184, -184, -184, -231, -226, -226, 0, -178,
0, -196, 0, 0, 0, 0, 0, 0, 0, 0, -240, -277, -201, -201, -228, 0, 0, 0, -177, 0,
-210, 0, -235, -234, 0, 0, 0, -200, -234, -200, 0, 0, 0, 0, 0, 0, 0, 0, -225, -226,
0, 0, 0, 0, 0, 0, 0, 0, -231, 0, 0, 0, 0, 0, 0, 0, 0, 0, -223, 0,
0, 0, -195, -194, 0, 0, 0, 0, -230, 0, 0, 0, 0, 0, -175, -226, -277, 0, -277, 0,
-229, -227, -193, -226, -225, -200, -186, 0, 0, 0, -176, 0, -222, -221, 0, 0, 0, 0, -175,
-226, -175, -220, -219, 0, 0, 0, 0, -171, -221,
0, 0, 0, -170, -216, 0, 0, -215, -175, -168,
0, 0,
}; };
const short yyrindex[] = { -266, const short yyrindex[] = { -251,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-266, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -251, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-182, -182, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
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, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
}; };
const short yygindex[] = { 0, const short yygindex[] = { 0,
0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, -32, 25, 44, 0, 27, 0, 0, 0, -44, 0, 0, 0, -45, 2, 36, 0, -98, -18, 0,
3, -7, 0, 41, 0, 0, 0, 26, 0, 49, -3, 0, 0, 0, -2, 23, -53, -8, -17, 61,
0, 29, -75, 0, 0, 0, -30, 0, 0, -21, 0, 0, 0, 43, 0, 19,
0,
}; };
#define YYTABLESIZE 292 #define YYTABLESIZE 300
const short yytable[] = { 70, const short yytable[] = { 1,
3, 29, 96, 54, 98, 11, 56, 13, 14, 1, 3, 59, 36, 77, 78, 36, 37, 38, 44, 23,
25, 26, 57, 57, 27, 29, 30, 12, 15, 16, 24, 121, 13, 123, 49, 50, 51, 98, 27, 28,
77, 22, 77, 57, 57, 23, 45, 46, 28, 95, 15, 16, 17, 67, 68, 39, 103, 44, 44, 44,
108, 63, 64, 65, 66, 67, 68, 20, 21, 40, 131, 18, 19, 90, 91, 63, 63, 63, 14, 70,
69, 81, 82, 83, 84, 85, 86, 87, 88, 33, 71, 72, 73, 74, 75, 25, 63, 63, 76, 33,
33, 33, 33, 36, 37, 43, 41, 42, 29, 58, 34, 109, 29, 109, 115, 116, 117, 118, 2, 81,
62, 71, 73, 90, 91, 92, 94, 100, 99, 101, 82, 83, 84, 85, 86, 87, 88, 62, 63, 64,
105, 102, 103, 104, 109, 106, 107, 42, 38, 80, 31, 35, 48, 52, 53, 54, 55, 56, 36, 69,
55, 97, 60, 52, 0, 0, 0, 0, 0, 0, 65, 79, 100, 101, 104, 102, 105, 113, 114, 125,
124, 126, 132, 128, 129, 130, 65, 45, 70, 99,
112, 127, 122, 58, 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,
@ -213,21 +240,21 @@ const short yytable[] = { 70,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 63, 63,
57, 0, 0, 0, 0, 0, 0, 0, 0, 0,
57, 57,
}; };
const short yycheck[] = { 44, const short yycheck[] = { 256,
0, 277, 78, 36, 80, 257, 39, 279, 280, 256, 0, 47, 280, 57, 58, 280, 281, 282, 30, 13,
18, 19, 279, 280, 22, 277, 278, 257, 290, 291, 14, 110, 257, 112, 32, 33, 34, 63, 21, 22,
53, 302, 55, 290, 291, 258, 302, 303, 302, 74, 287, 288, 289, 54, 55, 300, 80, 49, 50, 51,
106, 266, 267, 268, 269, 270, 271, 11, 12, 259, 129, 298, 299, 311, 312, 287, 288, 289, 257, 266,
275, 292, 293, 294, 295, 296, 297, 298, 299, 24, 267, 268, 269, 270, 271, 311, 298, 299, 275, 27,
25, 26, 27, 25, 26, 260, 302, 302, 277, 265, 28, 97, 258, 99, 276, 277, 278, 279, 315, 300,
302, 262, 260, 302, 261, 276, 302, 263, 300, 264, 301, 302, 303, 304, 305, 306, 307, 49, 50, 51,
264, 302, 302, 301, 261, 302, 302, 260, 27, 55, 265, 311, 310, 259, 311, 311, 311, 260, 280, 311,
37, 79, 42, 35, -1, -1, -1, -1, -1, -1, 265, 260, 311, 261, 308, 311, 262, 264, 311, 309,
311, 263, 261, 264, 311, 311, 258, 260, 263, 64,
99, 120, 111, 43, 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,
@ -245,16 +272,14 @@ const short yycheck[] = { 44,
-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, -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, 298, 299,
280, -1, -1, -1, -1, -1, -1, -1, -1, -1,
290, 291,
}; };
#define YYFINAL 2 #define YYFINAL 3
#ifndef YYDEBUG #ifndef YYDEBUG
#define YYDEBUG 0 #define YYDEBUG 0
#endif #endif
#define YYMAXTOKEN 305 #define YYMAXTOKEN 315
#if YYDEBUG #if YYDEBUG
const char * const yyname[] = { 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, "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,
@ -266,10 +291,11 @@ const char * const yyname[] = {
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", 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", "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", "TYPE_W","TYPE_UB","TYPE_B","TYPE_VF","TYPE_HF","TYPE_V","TYPE_F","ALIGN1",
"GENREGFILE","MSGREGFILE","MOV","MUL","MAC","MACH","LINE","SAD2","SADA2","DP4", "ALIGN16","MASK_DISABLE","EOT","GENREG","MSGREG","ACCREG","ADDRESSREG",
"DPH","DP3","DP2","ADD","SEND","NULL_TOKEN","MATH","SAMPLER","GATEWAY","READ", "FLAGREG","CONTROLREG","IPREG","MOV","MUL","MAC","MACH","LINE","SAD2","SADA2",
"WRITE","URB","THREAD_SPAWNER","MSGLEN","RETURNLEN","INTEGER","NUMBER","accreg", "DP4","DPH","DP3","DP2","ADD","SEND","NULL_TOKEN","MATH","SAMPLER","GATEWAY",
"triop", "READ","WRITE","URB","THREAD_SPAWNER","MSGLEN","RETURNLEN","SATURATE","INTEGER",
"NUMBER","flagreg","maskreg","NOP",
}; };
const char * const yyrule[] = { const char * const yyrule[] = {
"$accept : ROOT", "$accept : ROOT",
@ -281,16 +307,18 @@ const char * const yyrule[] = {
"instruction : binaryinstruction", "instruction : binaryinstruction",
"instruction : binaryaccinstruction", "instruction : binaryaccinstruction",
"instruction : triinstruction", "instruction : triinstruction",
"unaryinstruction : predicate unaryop execsize dst srcaccimm instoptions", "instruction : specialinstruction",
"unaryinstruction : predicate unaryop conditionalmodifier saturate execsize dst srcaccimm instoptions",
"unaryop : MOV", "unaryop : MOV",
"binaryinstruction : predicate binaryop execsize dst src srcimm instoptions", "binaryinstruction : predicate binaryop conditionalmodifier saturate execsize dst src srcimm instoptions",
"binaryop : MUL", "binaryop : MUL",
"binaryaccinstruction : predicate binaryaccop execsize dst srcacc srcimm instoptions", "binaryop : MAC",
"binaryaccinstruction : predicate binaryaccop conditionalmodifier saturate execsize dst srcacc srcimm instoptions",
"binaryaccop : ADD", "binaryaccop : ADD",
"triinstruction : sendinstruction", "triinstruction : sendinstruction",
"sendinstruction : predicate SEND INTEGER execsize postdst curdst msgtarget MSGLEN INTEGER RETURNLEN INTEGER instoptions", "sendinstruction : predicate SEND INTEGER execsize dst payload msgtarget MSGLEN INTEGER RETURNLEN INTEGER instoptions",
"postdst : dstoperand", "specialinstruction : NOP",
"curdst : directsrcoperand", "payload : directsrcoperand",
"msgtarget : NULL_TOKEN", "msgtarget : NULL_TOKEN",
"msgtarget : SAMPLER", "msgtarget : SAMPLER",
"msgtarget : MATH", "msgtarget : MATH",
@ -300,8 +328,10 @@ const char * const yyrule[] = {
"msgtarget : URB", "msgtarget : URB",
"msgtarget : THREAD_SPAWNER", "msgtarget : THREAD_SPAWNER",
"dst : dstoperand", "dst : dstoperand",
"dst : dstoperandex",
"dstoperand : dstreg dstregion regtype", "dstoperand : dstreg dstregion regtype",
"dstoperandex : accreg dstregion regtype", "dstoperandex : accreg dstregion regtype",
"dstoperandex : nullreg",
"dstreg : directgenreg", "dstreg : directgenreg",
"dstreg : directmsgreg", "dstreg : directmsgreg",
"srcaccimm : srcacc", "srcaccimm : srcacc",
@ -312,11 +342,13 @@ const char * const yyrule[] = {
"directsrcaccoperand : directsrcoperand", "directsrcaccoperand : directsrcoperand",
"src : directsrcoperand", "src : directsrcoperand",
"directsrcoperand : directgenreg region regtype", "directsrcoperand : directgenreg region regtype",
"directgenreg : GENREGFILE INTEGER gensubregnum", "subregnum : DOT INTEGER",
"gensubregnum : DOT INTEGER", "subregnum :",
"gensubregnum :", "directgenreg : GENREG INTEGER subregnum",
"directmsgreg : MSGREGFILE INTEGER msgsubregnum", "directmsgreg : MSGREG INTEGER subregnum",
"msgsubregnum : gensubregnum", "accreg : ACCREG INTEGER subregnum",
"addrreg : ADDRESSREG INTEGER subregnum",
"nullreg : NULL_TOKEN",
"dstregion : LANGLE INTEGER RANGLE", "dstregion : LANGLE INTEGER RANGLE",
"region : LANGLE INTEGER COMMA INTEGER COMMA INTEGER RANGLE", "region : LANGLE INTEGER COMMA INTEGER COMMA INTEGER RANGLE",
"regtype : TYPE_F", "regtype : TYPE_F",
@ -331,8 +363,16 @@ const char * const yyrule[] = {
"imm32 : NUMBER", "imm32 : NUMBER",
"predicate :", "predicate :",
"execsize : LPAREN INTEGER RPAREN", "execsize : LPAREN INTEGER RPAREN",
"instoptions : LCURLY instoption RCURLY", "saturate :",
"saturate : DOT SATURATE",
"conditionalmodifier :",
"instoptions : LCURLY instoption_list RCURLY",
"instoption_list : instoption instoption_list",
"instoption_list :",
"instoption : ALIGN1", "instoption : ALIGN1",
"instoption : ALIGN16",
"instoption : MASK_DISABLE",
"instoption : EOT",
}; };
#endif #endif
#if YYDEBUG #if YYDEBUG
@ -362,7 +402,7 @@ short *yyss;
short *yysslim; short *yysslim;
YYSTYPE *yyvs; YYSTYPE *yyvs;
int yystacksize; int yystacksize;
#line 395 "gram.y" #line 470 "gram.y"
extern int yylineno; extern int yylineno;
void yyerror (char *msg) void yyerror (char *msg)
@ -371,7 +411,7 @@ void yyerror (char *msg)
msg, yylineno, lex_text()); msg, yylineno, lex_text());
} }
#line 375 "y.tab.c" #line 415 "y.tab.c"
/* allocate initial stack or double stack size, up to YYMAXDEPTH */ /* allocate initial stack or double stack size, up to YYMAXDEPTH */
static int yygrowstack() static int yygrowstack()
{ {
@ -567,13 +607,13 @@ yyreduce:
switch (yyn) switch (yyn)
{ {
case 1: case 1:
#line 92 "gram.y" #line 97 "gram.y"
{ {
compiled_program = yyvsp[0].program; compiled_program = yyvsp[0].program;
} }
break; break;
case 2: case 2:
#line 98 "gram.y" #line 103 "gram.y"
{ {
struct brw_program_instruction *list_entry = struct brw_program_instruction *list_entry =
calloc(sizeof(struct brw_program_instruction), 1); calloc(sizeof(struct brw_program_instruction), 1);
@ -586,7 +626,7 @@ case 2:
} }
break; break;
case 3: case 3:
#line 109 "gram.y" #line 114 "gram.y"
{ {
struct brw_program_instruction *list_entry = struct brw_program_instruction *list_entry =
calloc(sizeof(struct brw_program_instruction), 1); calloc(sizeof(struct brw_program_instruction), 1);
@ -598,114 +638,147 @@ case 3:
} }
break; break;
case 4: case 4:
#line 119 "gram.y" #line 124 "gram.y"
{ {
yyval.program = yyvsp[0].program; yyval.program = yyvsp[0].program;
} }
break; break;
case 9:
#line 132 "gram.y"
{
yyval.instruction.header.opcode = yyvsp[-4].integer;
yyval.instruction.header.execution_size = yyvsp[-3].integer;
}
break;
case 10: case 10:
#line 138 "gram.y" #line 140 "gram.y"
{ yyval.integer = BRW_OPCODE_MOV; } {
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;
yyval.instruction.bits1 = yyvsp[-1].instruction.bits1;
/* XXX: more */
}
break; break;
case 11: case 11:
#line 143 "gram.y" #line 150 "gram.y"
{ { yyval.integer = BRW_OPCODE_MOV; }
yyval.instruction.header.opcode = yyvsp[-5].integer;
yyval.instruction.header.execution_size = yyvsp[-4].integer;
}
break; break;
case 12: case 12:
#line 149 "gram.y" #line 156 "gram.y"
{ yyval.integer = BRW_OPCODE_MUL; } {
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;
/* XXX: more */
}
break; break;
case 13: case 13:
#line 153 "gram.y" #line 165 "gram.y"
{ yyval.integer = BRW_OPCODE_MUL; }
break;
case 14:
#line 166 "gram.y"
{ yyval.integer = BRW_OPCODE_MAC; }
break;
case 15:
#line 171 "gram.y"
{ {
yyval.instruction.header.opcode = yyvsp[-5].integer; 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; yyval.instruction.header.execution_size = yyvsp[-4].integer;
} }
break; break;
case 14: case 16:
#line 159 "gram.y" #line 179 "gram.y"
{ yyval.integer = BRW_OPCODE_ADD; } { yyval.integer = BRW_OPCODE_ADD; }
break; break;
case 16: case 18:
#line 167 "gram.y" #line 187 "gram.y"
{ {
yyval.instruction.header.opcode = BRW_OPCODE_SEND; yyval.instruction.header.opcode = BRW_OPCODE_SEND;
yyval.instruction.header.execution_size = yyvsp[-8].integer; yyval.instruction.header.execution_size = yyvsp[-8].integer;
yyval.instruction.header.destreg__conditonalmod = yyvsp[-9].integer; yyval.instruction.header.destreg__conditionalmod = yyvsp[-9].integer;
} }
break; break;
case 19: case 19:
#line 181 "gram.y" #line 194 "gram.y"
{ yyval.integer = BRW_MESSAGE_TARGET_NULL; } {
break; yyval.instruction.header.opcode = BRW_OPCODE_NOP;
case 20: }
#line 182 "gram.y"
{ yyval.integer = BRW_MESSAGE_TARGET_SAMPLER; }
break; break;
case 21: case 21:
#line 183 "gram.y" #line 202 "gram.y"
{ yyval.integer = BRW_MESSAGE_TARGET_MATH; } { yyval.integer = BRW_MESSAGE_TARGET_NULL; }
break; break;
case 22: case 22:
#line 184 "gram.y" #line 203 "gram.y"
{ yyval.integer = BRW_MESSAGE_TARGET_GATEWAY; } { yyval.integer = BRW_MESSAGE_TARGET_SAMPLER; }
break; break;
case 23: case 23:
#line 185 "gram.y" #line 204 "gram.y"
{ yyval.integer = BRW_MESSAGE_TARGET_DATAPORT_READ; } { yyval.integer = BRW_MESSAGE_TARGET_MATH; }
break; break;
case 24: case 24:
#line 186 "gram.y" #line 205 "gram.y"
{ yyval.integer = BRW_MESSAGE_TARGET_DATAPORT_WRITE; } { yyval.integer = BRW_MESSAGE_TARGET_GATEWAY; }
break; break;
case 25: case 25:
#line 187 "gram.y" #line 206 "gram.y"
{ yyval.integer = BRW_MESSAGE_TARGET_URB; } { yyval.integer = BRW_MESSAGE_TARGET_DATAPORT_READ; }
break; break;
case 26: case 26:
#line 188 "gram.y" #line 207 "gram.y"
{ yyval.integer = BRW_MESSAGE_TARGET_THREAD_SPAWNER; } { yyval.integer = BRW_MESSAGE_TARGET_DATAPORT_WRITE; }
break;
case 27:
#line 208 "gram.y"
{ yyval.integer = BRW_MESSAGE_TARGET_URB; }
break; break;
case 28: case 28:
#line 198 "gram.y" #line 209 "gram.y"
{ yyval.integer = BRW_MESSAGE_TARGET_THREAD_SPAWNER; }
break;
case 31:
#line 218 "gram.y"
{ {
/* Returns an instruction with just the destination register /* Returns an instruction with just the destination register
* filled in. * filled in.
*/ */
yyval.instruction.bits1 = yyvsp[-2].instruction.bits1; yyval.instruction.bits1 = yyvsp[-2].instruction.bits1;
yyval.instruction.bits1.da1.dest_reg_type = yyvsp[-1].integer; yyval.instruction.bits1.da1.dest_reg_type = yyvsp[-1].integer; /* XXX */
/* XXX: $3 */
} }
break; break;
case 29: case 32:
#line 207 "gram.y" #line 229 "gram.y"
{ {
/* Returns an instruction with just the destination register /* Returns an instruction with just the destination register
* filled in. * filled in.
*/ */
yyval.instruction.bits1 = yyvsp[-2].instruction.bits1; yyval.instruction.bits1.da1.dest_reg_file = yyvsp[-2].direct_gen_reg.reg_file;
yyval.instruction.bits1.da1.dest_reg_type = yyvsp[-1].integer; 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; break;
case 30: case 33:
#line 217 "gram.y" #line 239 "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 251 "gram.y"
{ {
yyval.instruction.bits1.da1.dest_reg_file = yyvsp[0].direct_gen_reg.reg_file; 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_reg_nr = yyvsp[0].direct_gen_reg.reg_nr;
yyval.instruction.bits1.da1.dest_subreg_nr = yyvsp[0].direct_gen_reg.subreg_nr; yyval.instruction.bits1.da1.dest_subreg_nr = yyvsp[0].direct_gen_reg.subreg_nr;
} }
break; break;
case 33: case 37:
#line 229 "gram.y" #line 263 "gram.y"
{ {
yyval.instruction.bits1.da1.src0_reg_file = BRW_IMMEDIATE_VALUE; yyval.instruction.bits1.da1.src0_reg_file = BRW_IMMEDIATE_VALUE;
switch (yyvsp[0].integer) { switch (yyvsp[0].integer) {
@ -721,8 +794,8 @@ case 33:
} }
} }
break; break;
case 36: case 40:
#line 251 "gram.y" #line 285 "gram.y"
{ {
yyval.instruction.bits1.da1.src0_reg_file = BRW_IMMEDIATE_VALUE; yyval.instruction.bits1.da1.src0_reg_file = BRW_IMMEDIATE_VALUE;
switch (yyvsp[0].integer) { switch (yyvsp[0].integer) {
@ -738,8 +811,8 @@ case 36:
} }
} }
break; break;
case 39: case 43:
#line 277 "gram.y" #line 311 "gram.y"
{ {
/* Returns a source operand in the src0 fields of an /* Returns a source operand in the src0 fields of an
* instruction. * instruction.
@ -753,32 +826,21 @@ case 39:
yyval.instruction.bits2.da1.src0_horiz_stride = yyvsp[-1].region.horiz_stride; yyval.instruction.bits2.da1.src0_horiz_stride = yyvsp[-1].region.horiz_stride;
} }
break; break;
case 40: case 44:
#line 293 "gram.y" #line 326 "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 41:
#line 303 "gram.y"
{ {
yyval.integer = yyvsp[0].integer; yyval.integer = yyvsp[0].integer;
} }
break; break;
case 42: case 45:
#line 307 "gram.y" #line 330 "gram.y"
{ {
/* Default to subreg 0 if unspecified. */ /* Default to subreg 0 if unspecified. */
yyval.integer = 0; yyval.integer = 0;
} }
break; break;
case 43: case 46:
#line 314 "gram.y" #line 338 "gram.y"
{ {
/* Returns an instruction with just the destination register /* Returns an instruction with just the destination register
* fields filled in. * fields filled in.
@ -788,8 +850,49 @@ case 43:
yyval.direct_gen_reg.subreg_nr = yyvsp[0].integer; yyval.direct_gen_reg.subreg_nr = yyvsp[0].integer;
} }
break; break;
case 45: case 47:
#line 329 "gram.y" #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 48:
#line 359 "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 370 "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 381 "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 390 "gram.y"
{ {
/* Returns a value for a horiz_stride field of an /* Returns a value for a horiz_stride field of an
* instruction. * instruction.
@ -800,44 +903,44 @@ case 45:
yyval.integer = ffs(yyvsp[-1].integer); yyval.integer = ffs(yyvsp[-1].integer);
} }
break; break;
case 46: case 52:
#line 341 "gram.y" #line 402 "gram.y"
{ {
yyval.region.vert_stride = yyvsp[-5].integer; yyval.region.vert_stride = yyvsp[-5].integer;
yyval.region.width = yyvsp[-3].integer; yyval.region.width = yyvsp[-3].integer;
yyval.region.horiz_stride = yyvsp[-1].integer; yyval.region.horiz_stride = yyvsp[-1].integer;
} }
break; break;
case 47: case 53:
#line 353 "gram.y" #line 414 "gram.y"
{ yyval.integer = BRW_REGISTER_TYPE_F; } { yyval.integer = BRW_REGISTER_TYPE_F; }
break; break;
case 48: case 54:
#line 354 "gram.y" #line 415 "gram.y"
{ yyval.integer = BRW_REGISTER_TYPE_UD; } { yyval.integer = BRW_REGISTER_TYPE_UD; }
break; break;
case 49: case 55:
#line 355 "gram.y" #line 416 "gram.y"
{ yyval.integer = BRW_REGISTER_TYPE_D; } { yyval.integer = BRW_REGISTER_TYPE_D; }
break; break;
case 50: case 56:
#line 356 "gram.y" #line 417 "gram.y"
{ yyval.integer = BRW_REGISTER_TYPE_UW; } { yyval.integer = BRW_REGISTER_TYPE_UW; }
break; break;
case 51: case 57:
#line 357 "gram.y" #line 418 "gram.y"
{ yyval.integer = BRW_REGISTER_TYPE_UW; } { yyval.integer = BRW_REGISTER_TYPE_UW; }
break; break;
case 52:
#line 358 "gram.y"
{ yyval.integer = BRW_REGISTER_TYPE_UB; }
break;
case 53:
#line 359 "gram.y"
{ yyval.integer = BRW_REGISTER_TYPE_B; }
break;
case 58: case 58:
#line 372 "gram.y" #line 419 "gram.y"
{ yyval.integer = BRW_REGISTER_TYPE_UB; }
break;
case 59:
#line 420 "gram.y"
{ yyval.integer = BRW_REGISTER_TYPE_B; }
break;
case 64:
#line 433 "gram.y"
{ {
/* Returns a value for the execution_size field of an /* Returns a value for the execution_size field of an
* instruction. * instruction.
@ -850,7 +953,19 @@ case 58:
yyval.integer = ffs(yyvsp[-1].integer); yyval.integer = ffs(yyvsp[-1].integer);
} }
break; break;
#line 854 "y.tab.c" case 65:
#line 446 "gram.y"
{ yyval.integer = 0; }
break;
case 66:
#line 447 "gram.y"
{ yyval.integer = 1; }
break;
case 68:
#line 456 "gram.y"
{ yyval.instruction = yyvsp[-1].instruction; }
break;
#line 969 "y.tab.c"
} }
yyssp -= yym; yyssp -= yym;
yystate = *yyssp; yystate = *yyssp;

View File

@ -59,9 +59,9 @@
%token TYPE_UD, TYPE_D, TYPE_UW, TYPE_W, TYPE_UB, TYPE_B, %token TYPE_UD, TYPE_D, TYPE_UW, TYPE_W, TYPE_UB, TYPE_B,
%token TYPE_VF, TYPE_HF, TYPE_V, TYPE_F %token TYPE_VF, TYPE_HF, TYPE_V, TYPE_F
%token ALIGN1 %token ALIGN1 ALIGN16 MASK_DISABLE EOT
%token GENREGFILE MSGREGFILE %token GENREG MSGREG ACCREG ADDRESSREG FLAGREG CONTROLREG IPREG
%token MOV %token MOV
%token MUL MAC MACH LINE SAD2 SADA2 DP4 DPH DP3 DP2 %token MUL MAC MACH LINE SAD2 SADA2 DP4 DPH DP3 DP2
@ -69,21 +69,26 @@
%token SEND NULL_TOKEN MATH SAMPLER GATEWAY READ WRITE URB THREAD_SPAWNER %token SEND NULL_TOKEN MATH SAMPLER GATEWAY READ WRITE URB THREAD_SPAWNER
%token MSGLEN RETURNLEN %token MSGLEN RETURNLEN
%token SATURATE
%token <integer> INTEGER %token <integer> INTEGER
%token <number> NUMBER %token <number> NUMBER
%type <instruction> instruction unaryinstruction binaryinstruction %type <instruction> instruction unaryinstruction binaryinstruction
%type <instruction> binaryaccinstruction triinstruction sendinstruction %type <instruction> binaryaccinstruction triinstruction sendinstruction
%type <instruction> specialinstruction
%type <instruction> dstoperand dstoperandex dstreg accreg %type <instruction> dstoperand dstoperandex dstreg accreg
%type <instruction> directsrcaccoperand src directsrcoperand srcimm %type <instruction> directsrcaccoperand src directsrcoperand srcimm
%type <instruction> srcacc srcaccimm %type <instruction> srcacc srcaccimm
%type <instruction> instoptions instoption_list instoption
%type <program> instrseq %type <program> instrseq
%type <integer> unaryop binaryop binaryaccop triop %type <integer> unaryop binaryop binaryaccop
%type <integer> conditionalmodifier saturate
%type <integer> regtype srcimmtype execsize dstregion %type <integer> regtype srcimmtype execsize dstregion
%type <integer> gensubregnum msgsubregnum msgtarget %type <integer> subregnum msgtarget
%type <region> region %type <region> region
%type <direct_gen_reg> directgenreg directmsgreg %type <direct_gen_reg> directgenreg directmsgreg addrreg accreg flagreg maskreg
%type <direct_gen_reg> nullreg
%type <imm32> imm32 %type <imm32> imm32
%% %%
@ -126,12 +131,19 @@ instruction: unaryinstruction
| binaryinstruction | binaryinstruction
| binaryaccinstruction | binaryaccinstruction
| triinstruction | triinstruction
| specialinstruction
; ;
unaryinstruction: predicate unaryop execsize dst srcaccimm instoptions unaryinstruction:
predicate unaryop conditionalmodifier saturate execsize
dst srcaccimm instoptions
{ {
$$.header.opcode = $2; $$.header.opcode = $2;
$$.header.execution_size = $3; $$.header.saturate = $3;
$$.header.destreg__conditionalmod = $4;
$$.header.execution_size = $5;
$$.bits1 = $7.bits1;
/* XXX: more */
} }
; ;
@ -139,20 +151,28 @@ unaryop: MOV { $$ = BRW_OPCODE_MOV; }
; ;
binaryinstruction: binaryinstruction:
predicate binaryop execsize dst src srcimm instoptions predicate binaryop conditionalmodifier saturate execsize
dst src srcimm instoptions
{ {
$$.header.opcode = $2; $$.header.opcode = $2;
$$.header.execution_size = $3; $$.header.saturate = $3;
$$.header.destreg__conditionalmod = $4;
$$.header.execution_size = $5;
/* XXX: more */
} }
; ;
binaryop: MUL { $$ = BRW_OPCODE_MUL; } binaryop: MUL { $$ = BRW_OPCODE_MUL; }
| MAC { $$ = BRW_OPCODE_MAC; }
binaryaccinstruction: binaryaccinstruction:
predicate binaryaccop execsize dst srcacc srcimm instoptions predicate binaryaccop conditionalmodifier saturate execsize
dst srcacc srcimm instoptions
{ {
$$.header.opcode = $2; $$.header.opcode = $2;
$$.header.execution_size = $3; $$.header.saturate = $3;
$$.header.destreg__conditionalmod = $4;
$$.header.execution_size = $5;
} }
; ;
@ -162,20 +182,21 @@ binaryaccop: ADD { $$ = BRW_OPCODE_ADD; }
triinstruction: sendinstruction triinstruction: sendinstruction
/* XXX formatting of this instruction */ /* XXX formatting of this instruction */
sendinstruction: predicate SEND INTEGER execsize postdst curdst msgtarget sendinstruction: predicate SEND INTEGER execsize dst payload msgtarget
MSGLEN INTEGER RETURNLEN INTEGER instoptions MSGLEN INTEGER RETURNLEN INTEGER instoptions
{ {
$$.header.opcode = BRW_OPCODE_SEND; $$.header.opcode = BRW_OPCODE_SEND;
$$.header.execution_size = $4; $$.header.execution_size = $4;
$$.header.destreg__conditonalmod = $3; $$.header.destreg__conditionalmod = $3;
}
specialinstruction: NOP
{
$$.header.opcode = BRW_OPCODE_NOP;
} }
/* XXX! */ /* XXX! */
postdst: dstoperand payload: directsrcoperand
;
/* XXX! */
curdst: directsrcoperand
; ;
msgtarget: NULL_TOKEN { $$ = BRW_MESSAGE_TARGET_NULL; } msgtarget: NULL_TOKEN { $$ = BRW_MESSAGE_TARGET_NULL; }
@ -190,8 +211,7 @@ msgtarget: NULL_TOKEN { $$ = BRW_MESSAGE_TARGET_NULL; }
/* 1.4.2: Destination register */ /* 1.4.2: Destination register */
/** XXX: dstoperandex */ dst: dstoperand | dstoperandex
dst: dstoperand
/* XXX: dstregion writemask */ /* XXX: dstregion writemask */
dstoperand: dstreg dstregion regtype dstoperand: dstreg dstregion regtype
@ -200,17 +220,31 @@ dstoperand: dstreg dstregion regtype
* filled in. * filled in.
*/ */
$$.bits1 = $1.bits1; $$.bits1 = $1.bits1;
$$.bits1.da1.dest_reg_type = $2; $$.bits1.da1.dest_reg_type = $2; /* XXX */
/* XXX: $3 */
} }
;
dstoperandex: accreg dstregion regtype dstoperandex: accreg dstregion regtype
{ {
/* Returns an instruction with just the destination register /* Returns an instruction with just the destination register
* filled in. * filled in.
*/ */
$$.bits1 = $1.bits1; $$.bits1.da1.dest_reg_file = $1.reg_file;
$$.bits1.da1.dest_reg_type = $2; $$.bits1.da1.dest_reg_nr = $1.reg_nr;
$$.bits1.da1.dest_subreg_nr = $1.subreg_nr;
/* XXX: $2 $3 */
} }
| nullreg
{
/* Returns an instruction with just the destination register
* filled in.
*/
$$.bits1.da1.dest_reg_file = $1.reg_file;
$$.bits1.da1.dest_reg_nr = $1.reg_nr;
$$.bits1.da1.dest_subreg_nr = $1.subreg_nr;
}
;
/* XXX: indirectgenreg, directmsgreg, indirectmsgreg */ /* XXX: indirectgenreg, directmsgreg, indirectmsgreg */
dstreg: directgenreg dstreg: directgenreg
@ -288,18 +322,7 @@ directsrcoperand: directgenreg region regtype
} }
; ;
/* 1.4.5: Register files and register numbers */ subregnum: DOT INTEGER
directgenreg: GENREGFILE INTEGER gensubregnum
{
/* Returns an instruction with just the destination register
* fields filled in.
*/
$$.reg_file = BRW_GENERAL_REGISTER_FILE;
$$.reg_nr = $2;
$$.subreg_nr = $3;
}
gensubregnum: DOT INTEGER
{ {
$$ = $2; $$ = $2;
} }
@ -310,7 +333,18 @@ gensubregnum: DOT INTEGER
} }
; ;
directmsgreg: MSGREGFILE INTEGER msgsubregnum /* 1.4.5: Register files and register numbers */
directgenreg: GENREG INTEGER subregnum
{
/* Returns an instruction with just the destination register
* fields filled in.
*/
$$.reg_file = BRW_GENERAL_REGISTER_FILE;
$$.reg_nr = $2;
$$.subreg_nr = $3;
}
directmsgreg: MSGREG INTEGER subregnum
{ {
/* Returns an instruction with just the destination register /* Returns an instruction with just the destination register
* fields filled in. * fields filled in.
@ -321,7 +355,34 @@ directmsgreg: MSGREGFILE INTEGER msgsubregnum
} }
; ;
msgsubregnum: gensubregnum accreg: ACCREG INTEGER subregnum
{
/* Returns an instruction with just the destination register
* fields filled in.
*/
$$.reg_file = BRW_ARCHITECTURE_REGISTER_FILE;
$$.reg_nr = BRW_ARF_ACCUMULATOR | $2;
$$.subreg_nr = $3;
}
;
addrreg: ADDRESSREG INTEGER subregnum
{
/* Returns an instruction with just the destination register
* fields filled in.
*/
$$.reg_file = BRW_ARCHITECTURE_REGISTER_FILE;
$$.reg_nr = BRW_ARF_ADDRESS | $2;
$$.subreg_nr = $3;
}
;
nullreg: NULL_TOKEN
{
$$.reg_file = BRW_ARCHITECTURE_REGISTER_FILE;
$$.reg_nr = BRW_ARF_NULL;
$$.subreg_nr = 0;
}
; ;
/* 1.4.7: Regions */ /* 1.4.7: Regions */
@ -382,14 +443,28 @@ execsize: LPAREN INTEGER RPAREN
} }
; ;
saturate: /* empty */ { $$ = 0; }
| DOT SATURATE { $$ = 1; }
;
conditionalmodifier:
;
/* 1.4.13: Instruction options */ /* 1.4.13: Instruction options */
/* XXX: this is a comma-separated list, really. */ /* XXX: this is a comma-separated list, really. */
instoptions: LCURLY instoption RCURLY instoptions: LCURLY instoption_list RCURLY
{ $$ = $2; }
;
instoption_list: instoption instoption_list
|
;
/* XXX: fill me in. alignctrl, comprctrl, threadctrl, depctrl, maskctrl, /* XXX: fill me in. alignctrl, comprctrl, threadctrl, depctrl, maskctrl,
* debugctrl, sendctrl * debugctrl, sendctrl
*/ */
instoption: ALIGN1 instoption: ALIGN1 | ALIGN16 | MASK_DISABLE | EOT
;
%% %%
extern int yylineno; extern int yylineno;

View File

@ -293,42 +293,47 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
*yy_cp = '\0'; \ *yy_cp = '\0'; \
yy_c_buf_p = yy_cp; yy_c_buf_p = yy_cp;
#define YY_NUM_RULES 48 #define YY_NUM_RULES 62
#define YY_END_OF_BUFFER 49 #define YY_END_OF_BUFFER 63
static yyconst short int yy_acclist[122] = static yyconst short int yy_acclist[151] =
{ 0, { 0,
44, 44, 44, 44, 49, 47, 48, 46, 47, 48, 58, 58, 58, 58, 63, 61, 62, 60, 61, 62,
46, 48, 26, 47, 48, 27, 47, 48, 32, 47, 60, 62, 31, 61, 62, 32, 61, 62, 37, 61,
48, 47, 48, 33, 47, 48, 47, 48, 44, 47, 62, 61, 62, 38, 61, 62, 61, 62, 58, 61,
48, 25, 47, 48, 28, 47, 48, 29, 47, 48, 62, 30, 61, 62, 33, 61, 62, 34, 61, 62,
41, 47, 48, 37, 47, 48, 42, 47, 48, 47, 51, 61, 62, 47, 61, 62, 61, 62, 52, 61,
48, 39, 47, 48, 47, 48, 47, 48, 35, 47, 62, 61, 62, 49, 61, 62, 40, 61, 62, 61,
48, 47, 48, 34, 47, 48, 47, 48, 35, 47, 62, 61, 62, 42, 61, 62, 43, 61, 62, 61,
48, 47, 48, 47, 48, 47, 48, 47, 48, 30, 62, 61, 62, 41, 61, 62, 61, 62, 43, 61,
47, 48, 31, 47, 48, 44, 47, 48, 46, 44, 62, 61, 62, 61, 62, 61, 62, 61, 62, 35,
40, 36, 38, 44, 1, 1, 45, 13, 12, 11, 61, 62, 36, 61, 62, 58, 61, 62, 4, 62,
9, 10, 4, 2, 3, 23, 6, 5, 18, 15, 5, 62, 4, 5, 62, 4, 62, 60, 2, 58,
17, 21, 16, 7, 14, 8, 22, 43, 20, 19, 50, 46, 48, 44, 45, 58, 3, 1, 1, 59,
24 57, 39, 18, 17, 16, 14, 15, 9, 7, 8,
19, 53, 28, 11, 10, 23, 21, 6, 26, 22,
12, 20, 13, 27, 54, 55, 25, 24, 56, 29
} ; } ;
static yyconst short int yy_accept[127] = static yyconst short int yy_accept[159] =
{ 0, { 0,
1, 2, 3, 4, 5, 6, 8, 11, 13, 16, 1, 2, 3, 4, 5, 5, 5, 6, 8, 11,
19, 22, 24, 27, 29, 32, 35, 38, 41, 44, 13, 16, 19, 22, 24, 27, 29, 32, 35, 38,
47, 50, 52, 55, 57, 59, 62, 64, 67, 69, 41, 44, 47, 49, 52, 54, 57, 60, 62, 64,
72, 74, 76, 78, 80, 83, 86, 89, 90, 90, 67, 70, 72, 74, 77, 79, 82, 84, 86, 88,
90, 90, 91, 92, 93, 94, 94, 94, 94, 94, 90, 93, 96, 99, 101, 103, 106, 108, 109, 109,
94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 110, 110, 110, 111, 111, 112, 113, 114, 114, 114,
94, 94, 94, 95, 95, 96, 97, 98, 99, 99, 114, 115, 115, 115, 116, 116, 116, 116, 116, 116,
100, 101, 102, 103, 103, 103, 104, 104, 104, 105, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117,
106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 118, 118, 119, 120, 121, 122, 123, 124, 124, 125,
107, 107, 108, 109, 110, 111, 112, 113, 114, 115, 126, 127, 128, 128, 128, 129, 129, 129, 129, 130,
115, 115, 116, 116, 116, 116, 116, 117, 117, 117, 131, 132, 132, 132, 132, 132, 132, 133, 133, 133,
118, 119, 119, 119, 119, 120, 121, 121, 121, 121, 134, 134, 134, 134, 135, 136, 136, 137, 138, 139,
121, 121, 121, 121, 122, 122 140, 141, 142, 142, 142, 143, 143, 143, 143, 143,
143, 144, 144, 144, 145, 146, 146, 146, 146, 146,
147, 148, 148, 149, 149, 149, 149, 149, 149, 149,
149, 149, 149, 150, 150, 150, 151, 151
} ; } ;
static yyconst int yy_ec[256] = static yyconst int yy_ec[256] =
@ -337,16 +342,16 @@ static yyconst int yy_ec[256] =
1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 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, 2, 1, 1, 1, 1, 1, 1, 1, 5, 1, 2, 1, 1, 1, 1, 1, 1, 1, 5,
6, 1, 1, 7, 8, 9, 10, 11, 12, 13, 6, 7, 1, 8, 9, 10, 11, 12, 13, 14,
14, 15, 11, 11, 11, 11, 11, 1, 16, 17, 15, 16, 12, 17, 12, 12, 12, 1, 18, 19,
1, 18, 1, 1, 1, 19, 1, 20, 1, 21, 1, 20, 1, 1, 1, 21, 1, 22, 23, 24,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 1,
1, 1, 1, 1, 22, 1, 23, 1, 1, 1, 1, 1, 1, 26, 27, 1, 28, 1, 1, 1,
1, 1, 1, 1, 24, 1, 25, 26, 27, 28, 1, 1, 1, 1, 29, 1, 30, 31, 32, 33,
29, 1, 30, 31, 32, 1, 1, 33, 34, 35, 34, 35, 36, 37, 38, 1, 39, 40, 41, 42,
36, 37, 1, 38, 39, 40, 41, 42, 43, 1, 43, 44, 1, 45, 46, 47, 48, 49, 50, 1,
44, 1, 45, 1, 46, 1, 1, 1, 1, 1, 51, 1, 52, 1, 53, 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,
@ -363,109 +368,130 @@ static yyconst int yy_ec[256] =
1, 1, 1, 1, 1 1, 1, 1, 1, 1
} ; } ;
static yyconst int yy_meta[47] = static yyconst int yy_meta[54] =
{ 0, { 0,
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
} ; } ;
static yyconst short int yy_base[127] = static yyconst short int yy_base[160] =
{ 0, { 0,
0, 0, 39, 47, 193, 194, 46, 54, 194, 194, 0, 0, 45, 54, 69, 71, 239, 240, 53, 62,
194, 52, 194, 182, 59, 194, 194, 194, 194, 194, 240, 240, 240, 67, 240, 78, 78, 240, 240, 240,
194, 56, 194, 49, 154, 165, 157, 53, 147, 51, 240, 240, 213, 240, 75, 240, 66, 192, 192, 240,
56, 156, 148, 147, 194, 194, 84, 85, 91, 87, 205, 190, 195, 70, 59, 71, 74, 195, 186, 185,
96, 103, 194, 194, 194, 156, 151, 106, 142, 146, 240, 240, 107, 240, 240, 240, 218, 84, 115, 240,
86, 151, 137, 145, 144, 151, 146, 94, 139, 135, 111, 121, 129, 202, 240, 240, 240, 195, 193, 187,
146, 139, 118, 89, 194, 120, 127, 194, 140, 194, 240, 133, 177, 240, 181, 108, 188, 172, 180, 175,
194, 194, 194, 140, 139, 136, 135, 130, 194, 194, 178, 187, 182, 117, 173, 169, 182, 174, 159, 240,
131, 135, 127, 121, 124, 132, 130, 194, 118, 122, 113, 240, 148, 165, 240, 240, 240, 175, 240, 240,
113, 194, 194, 194, 194, 194, 194, 194, 194, 142, 240, 240, 176, 175, 171, 168, 169, 163, 240, 240,
121, 194, 128, 123, 139, 125, 194, 120, 120, 194, 240, 164, 170, 160, 139, 157, 240, 167, 165, 240,
194, 103, 107, 120, 194, 194, 104, 99, 110, 84, 151, 155, 146, 240, 240, 166, 240, 240, 240, 240,
90, 72, 45, 194, 194, 68 240, 240, 180, 153, 240, 162, 157, 177, 159, 155,
240, 153, 153, 240, 168, 133, 145, 123, 138, 240,
240, 120, 240, 119, 133, 118, 130, 130, 119, 107,
122, 84, 240, 78, 64, 240, 240, 100, 76
} ; } ;
static yyconst short int yy_def[127] = static yyconst short int yy_def[160] =
{ 0, { 0,
125, 1, 1, 1, 125, 125, 125, 125, 125, 125, 157, 1, 1, 1, 158, 158, 157, 157, 157, 157,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 159, 157, 157, 157, 157, 157, 157, 157, 157, 157,
125, 125, 125, 126, 125, 126, 125, 125, 125, 125, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 159, 157, 159, 157, 157, 157, 157, 157, 157, 157,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
125, 125, 125, 125, 0, 125 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
157, 157, 157, 157, 157, 157, 0, 157, 157
} ; } ;
static yyconst short int yy_nxt[241] = static yyconst short int yy_nxt[294] =
{ 0, { 0,
6, 7, 8, 6, 9, 10, 11, 12, 13, 14, 8, 9, 10, 8, 11, 12, 8, 13, 14, 15,
15, 15, 15, 15, 15, 16, 17, 18, 19, 20, 16, 17, 17, 17, 17, 17, 17, 18, 19, 20,
21, 22, 23, 6, 24, 6, 6, 25, 6, 26, 21, 22, 23, 24, 8, 8, 25, 26, 8, 27,
6, 6, 27, 28, 29, 6, 6, 30, 31, 32, 8, 28, 29, 8, 30, 31, 8, 32, 8, 33,
33, 6, 34, 6, 35, 36, 6, 38, 38, 37, 34, 35, 8, 8, 36, 37, 38, 39, 8, 40,
37, 37, 37, 37, 6, 38, 38, 37, 37, 37, 8, 41, 42, 8, 48, 48, 43, 43, 43, 43,
37, 37, 39, 39, 39, 39, 39, 41, 64, 42, 43, 43, 8, 48, 48, 43, 43, 43, 43, 43,
42, 42, 42, 42, 43, 44, 46, 51, 45, 56, 43, 45, 46, 45, 46, 47, 81, 47, 49, 49,
58, 47, 124, 57, 59, 52, 38, 38, 53, 65, 49, 49, 49, 49, 50, 48, 48, 52, 51, 53,
66, 65, 66, 54, 63, 63, 63, 63, 63, 41, 53, 53, 53, 53, 53, 55, 56, 58, 59, 66,
123, 39, 39, 39, 39, 39, 67, 67, 67, 67, 44, 70, 57, 74, 72, 60, 71, 75, 156, 67,
67, 41, 76, 42, 42, 42, 42, 42, 70, 71, 73, 155, 68, 82, 83, 82, 83, 69, 79, 79,
72, 84, 65, 66, 122, 77, 121, 85, 63, 63, 79, 79, 79, 79, 52, 154, 49, 49, 49, 49,
63, 63, 63, 99, 120, 119, 73, 67, 67, 67, 49, 49, 84, 84, 84, 84, 84, 84, 52, 95,
67, 67, 118, 117, 116, 100, 115, 114, 113, 112, 53, 53, 53, 53, 53, 53, 89, 90, 91, 105,
111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 82, 83, 122, 96, 97, 153, 152, 106, 151, 150,
101, 98, 97, 96, 95, 94, 93, 92, 91, 90, 149, 148, 147, 107, 146, 145, 144, 143, 123, 92,
89, 88, 87, 86, 83, 82, 81, 80, 79, 78, 79, 79, 79, 79, 79, 79, 84, 84, 84, 84,
75, 74, 69, 68, 62, 61, 60, 55, 50, 49, 84, 84, 142, 141, 140, 139, 138, 137, 136, 135,
48, 40, 125, 5, 125, 125, 125, 125, 125, 125, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125,
124, 121, 120, 119, 118, 117, 116, 115, 114, 113,
112, 111, 110, 109, 108, 104, 103, 102, 101, 100,
99, 98, 94, 93, 88, 87, 86, 85, 80, 78,
77, 76, 65, 64, 63, 62, 61, 54, 157, 7,
157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
157, 157, 157
125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125
} ; } ;
static yyconst short int yy_chk[241] = static yyconst short int yy_chk[294] =
{ 0, { 0,
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, 3, 7, 7, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
3, 3, 3, 3, 4, 8, 8, 4, 4, 4, 1, 1, 1, 3, 9, 9, 3, 3, 3, 3,
4, 4, 12, 12, 12, 12, 12, 15, 126, 15, 3, 3, 4, 10, 10, 4, 4, 4, 4, 4,
15, 15, 15, 15, 22, 22, 24, 28, 22, 30, 4, 5, 5, 6, 6, 5, 159, 6, 14, 14,
31, 24, 123, 30, 31, 28, 38, 38, 28, 40, 14, 14, 14, 14, 16, 48, 48, 17, 16, 17,
40, 64, 64, 28, 37, 37, 37, 37, 37, 39, 17, 17, 17, 17, 17, 25, 25, 27, 27, 34,
122, 39, 39, 39, 39, 39, 41, 41, 41, 41, 158, 35, 25, 37, 36, 27, 35, 37, 155, 34,
41, 42, 51, 42, 42, 42, 42, 42, 48, 48, 36, 154, 34, 51, 51, 81, 81, 34, 43, 43,
48, 58, 66, 66, 121, 51, 120, 58, 63, 63, 43, 43, 43, 43, 49, 152, 49, 49, 49, 49,
63, 63, 63, 84, 119, 118, 48, 67, 67, 67, 49, 49, 52, 52, 52, 52, 52, 52, 53, 66,
67, 67, 117, 114, 113, 84, 112, 109, 108, 106, 53, 53, 53, 53, 53, 53, 62, 62, 62, 74,
105, 104, 103, 101, 100, 91, 90, 89, 87, 86, 83, 83, 105, 66, 66, 151, 150, 74, 149, 148,
85, 83, 82, 81, 78, 77, 76, 75, 74, 69, 147, 146, 145, 74, 144, 142, 139, 138, 105, 62,
62, 61, 60, 59, 57, 56, 55, 54, 53, 52, 79, 79, 79, 79, 79, 79, 84, 84, 84, 84,
50, 49, 47, 46, 34, 33, 32, 29, 27, 26, 84, 84, 137, 136, 135, 133, 132, 130, 129, 128,
25, 14, 5, 125, 125, 125, 125, 125, 125, 125, 127, 126, 124, 123, 116, 113, 112, 111, 109, 108,
106, 104, 103, 102, 98, 97, 96, 95, 94, 93,
88, 78, 77, 76, 75, 73, 72, 71, 70, 69,
68, 67, 65, 63, 60, 59, 58, 54, 47, 40,
39, 38, 33, 32, 31, 29, 28, 23, 7, 157,
157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
157, 157, 157
125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
125, 125, 125, 125, 125, 125, 125, 125, 125, 125
} ; } ;
static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;
@ -487,8 +513,13 @@ char *yytext;
#line 3 "lex.l" #line 3 "lex.l"
#include "gen4asm.h" #include "gen4asm.h"
#include "y.tab.h" #include "y.tab.h"
int saved_state = INITIAL;
#define IN_REG 1 #define IN_REG 1
#define BLOCK_COMMENT 2
/* Macros after this point can all be overridden by user definitions in /* Macros after this point can all be overridden by user definitions in
* section 1. * section 1.
@ -639,7 +670,7 @@ YY_DECL
register char *yy_cp, *yy_bp; register char *yy_cp, *yy_bp;
register int yy_act; register int yy_act;
#line 8 "lex.l" #line 12 "lex.l"
if ( yy_init ) if ( yy_init )
@ -688,14 +719,14 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{ {
yy_current_state = (int) yy_def[yy_current_state]; yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 126 ) if ( yy_current_state >= 158 )
yy_c = yy_meta[(unsigned int) yy_c]; yy_c = yy_meta[(unsigned int) yy_c];
} }
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
*yy_state_ptr++ = yy_current_state; *yy_state_ptr++ = yy_current_state;
++yy_cp; ++yy_cp;
} }
while ( yy_base[yy_current_state] != 194 ); while ( yy_base[yy_current_state] != 240 );
yy_find_action: yy_find_action:
yy_current_state = *--yy_state_ptr; yy_current_state = *--yy_state_ptr;
@ -734,261 +765,361 @@ do_action: /* This label is used only to access EOF actions. */
{ /* beginning of action switch */ { /* beginning of action switch */
case 1: case 1:
YY_RULE_SETUP YY_RULE_SETUP
#line 9 "lex.l" #line 13 "lex.l"
{ } /* eat up single-line comments */ { } /* eat up single-line comments */
YY_BREAK YY_BREAK
/* eat up multi-line comments, non-nesting. */
case 2: case 2:
YY_RULE_SETUP YY_RULE_SETUP
#line 11 "lex.l" #line 16 "lex.l"
{ return MOV; } {
saved_state = YYSTATE;
BEGIN(BLOCK_COMMENT);
}
YY_BREAK YY_BREAK
case 3: case 3:
YY_RULE_SETUP YY_RULE_SETUP
#line 13 "lex.l" #line 20 "lex.l"
{ return MUL; } {
BEGIN(saved_state);
}
YY_BREAK YY_BREAK
case 4: case 4:
YY_RULE_SETUP YY_RULE_SETUP
#line 14 "lex.l" #line 23 "lex.l"
{ return MAC; } { }
YY_BREAK YY_BREAK
case 5: case 5:
YY_RULE_SETUP YY_RULE_SETUP
#line 15 "lex.l" #line 24 "lex.l"
{ return MACH; } { }
YY_BREAK YY_BREAK
/* used for both null send and null register. */
case 6: case 6:
YY_RULE_SETUP YY_RULE_SETUP
#line 16 "lex.l" #line 27 "lex.l"
{ return LINE; } { return NULL_TOKEN; }
YY_BREAK YY_BREAK
/* opcodes */
case 7: case 7:
YY_RULE_SETUP YY_RULE_SETUP
#line 17 "lex.l" #line 30 "lex.l"
{ return SAD2; } { return MOV; }
YY_BREAK YY_BREAK
case 8: case 8:
YY_RULE_SETUP YY_RULE_SETUP
#line 18 "lex.l" #line 32 "lex.l"
{ return SADA2; } { return MUL; }
YY_BREAK YY_BREAK
case 9: case 9:
YY_RULE_SETUP YY_RULE_SETUP
#line 19 "lex.l" #line 33 "lex.l"
{ return DP4; } { return MAC; }
YY_BREAK YY_BREAK
case 10: case 10:
YY_RULE_SETUP YY_RULE_SETUP
#line 20 "lex.l" #line 34 "lex.l"
{ return DPH; } { return MACH; }
YY_BREAK YY_BREAK
case 11: case 11:
YY_RULE_SETUP YY_RULE_SETUP
#line 21 "lex.l" #line 35 "lex.l"
{ return DP3; } { return LINE; }
YY_BREAK YY_BREAK
case 12: case 12:
YY_RULE_SETUP YY_RULE_SETUP
#line 22 "lex.l" #line 36 "lex.l"
{ return DP2; } { return SAD2; }
YY_BREAK YY_BREAK
case 13: case 13:
YY_RULE_SETUP YY_RULE_SETUP
#line 24 "lex.l" #line 37 "lex.l"
{ return ADD; } { return SADA2; }
YY_BREAK YY_BREAK
case 14: case 14:
YY_RULE_SETUP YY_RULE_SETUP
#line 26 "lex.l" #line 38 "lex.l"
{ return SEND; } { return DP4; }
YY_BREAK YY_BREAK
case 15: case 15:
YY_RULE_SETUP YY_RULE_SETUP
#line 27 "lex.l" #line 39 "lex.l"
{ return MSGLEN; } { return DPH; }
YY_BREAK YY_BREAK
case 16: case 16:
YY_RULE_SETUP YY_RULE_SETUP
#line 28 "lex.l" #line 40 "lex.l"
{ return RETURNLEN; } { return DP3; }
YY_BREAK YY_BREAK
case 17: case 17:
YY_RULE_SETUP YY_RULE_SETUP
#line 29 "lex.l" #line 41 "lex.l"
{ return NULL_TOKEN; } { return DP2; }
YY_BREAK YY_BREAK
case 18: case 18:
YY_RULE_SETUP YY_RULE_SETUP
#line 30 "lex.l" #line 43 "lex.l"
{ return MATH; } { return ADD; }
YY_BREAK YY_BREAK
case 19: case 19:
YY_RULE_SETUP YY_RULE_SETUP
#line 31 "lex.l" #line 45 "lex.l"
{ return SAMPLER; } { return NOP; }
YY_BREAK YY_BREAK
case 20: case 20:
YY_RULE_SETUP YY_RULE_SETUP
#line 32 "lex.l" #line 47 "lex.l"
{ return GATEWAY; } { return SEND; }
YY_BREAK YY_BREAK
case 21: case 21:
YY_RULE_SETUP YY_RULE_SETUP
#line 33 "lex.l" #line 48 "lex.l"
{ return READ; } { return MSGLEN; }
YY_BREAK YY_BREAK
case 22: case 22:
YY_RULE_SETUP YY_RULE_SETUP
#line 34 "lex.l" #line 49 "lex.l"
{ return WRITE; } { return RETURNLEN; }
YY_BREAK YY_BREAK
case 23: case 23:
YY_RULE_SETUP YY_RULE_SETUP
#line 35 "lex.l" #line 50 "lex.l"
{ return URB; } { return MATH; }
YY_BREAK YY_BREAK
case 24: case 24:
YY_RULE_SETUP YY_RULE_SETUP
#line 36 "lex.l" #line 51 "lex.l"
{ return THREAD_SPAWNER; } { return SAMPLER; }
YY_BREAK YY_BREAK
case 25: case 25:
YY_RULE_SETUP YY_RULE_SETUP
#line 38 "lex.l" #line 52 "lex.l"
{ return SEMICOLON; } { return GATEWAY; }
YY_BREAK YY_BREAK
case 26: case 26:
YY_RULE_SETUP YY_RULE_SETUP
#line 39 "lex.l" #line 53 "lex.l"
{ return LPAREN; } { return READ; }
YY_BREAK YY_BREAK
case 27: case 27:
YY_RULE_SETUP YY_RULE_SETUP
#line 40 "lex.l" #line 54 "lex.l"
{ return RPAREN; } { return WRITE; }
YY_BREAK YY_BREAK
case 28: case 28:
YY_RULE_SETUP YY_RULE_SETUP
#line 41 "lex.l" #line 55 "lex.l"
{ return LANGLE; } { return URB; }
YY_BREAK YY_BREAK
case 29: case 29:
YY_RULE_SETUP YY_RULE_SETUP
#line 42 "lex.l" #line 56 "lex.l"
{ return RANGLE; } { return THREAD_SPAWNER; }
YY_BREAK YY_BREAK
case 30: case 30:
YY_RULE_SETUP YY_RULE_SETUP
#line 43 "lex.l" #line 58 "lex.l"
{ return LCURLY; } { return SEMICOLON; }
YY_BREAK YY_BREAK
case 31: case 31:
YY_RULE_SETUP YY_RULE_SETUP
#line 44 "lex.l" #line 59 "lex.l"
{ return RCURLY; } { return LPAREN; }
YY_BREAK YY_BREAK
case 32: case 32:
YY_RULE_SETUP YY_RULE_SETUP
#line 45 "lex.l" #line 60 "lex.l"
{ return COMMA; } { return RPAREN; }
YY_BREAK YY_BREAK
case 33: case 33:
YY_RULE_SETUP YY_RULE_SETUP
#line 46 "lex.l" #line 61 "lex.l"
{ return DOT; } { return LANGLE; }
YY_BREAK YY_BREAK
/* XXX: this lexing of register files is shady */
case 34: case 34:
YY_RULE_SETUP YY_RULE_SETUP
#line 49 "lex.l" #line 62 "lex.l"
{ BEGIN(IN_REG); return MSGREGFILE; } { return RANGLE; }
YY_BREAK YY_BREAK
case 35: case 35:
YY_RULE_SETUP YY_RULE_SETUP
#line 50 "lex.l" #line 63 "lex.l"
{ BEGIN(IN_REG); return GENREGFILE; } { return LCURLY; }
YY_BREAK
case 36:
YY_RULE_SETUP
#line 64 "lex.l"
{ return RCURLY; }
YY_BREAK
case 37:
YY_RULE_SETUP
#line 65 "lex.l"
{ return COMMA; }
YY_BREAK
case 38:
YY_RULE_SETUP
#line 66 "lex.l"
{ return DOT; }
YY_BREAK
/* XXX: this lexing of register files is shady */
case 39:
YY_RULE_SETUP
#line 69 "lex.l"
{
BEGIN(IN_REG);
return ACCREG;
}
YY_BREAK
case 40:
YY_RULE_SETUP
#line 73 "lex.l"
{
BEGIN(IN_REG);
return ADDRESSREG;
}
YY_BREAK
case 41:
YY_RULE_SETUP
#line 77 "lex.l"
{
BEGIN(IN_REG);
return MSGREG;
}
YY_BREAK
case 42:
YY_RULE_SETUP
#line 81 "lex.l"
{
BEGIN(IN_REG);
return FLAGREG;
}
YY_BREAK
case 43:
YY_RULE_SETUP
#line 85 "lex.l"
{
BEGIN(IN_REG);
return GENREG;
}
YY_BREAK
case 44:
YY_RULE_SETUP
#line 89 "lex.l"
{
BEGIN(IN_REG);
return CONTROLREG;
}
YY_BREAK
case 45:
YY_RULE_SETUP
#line 93 "lex.l"
{
BEGIN(IN_REG);
return IPREG;
}
YY_BREAK YY_BREAK
/* /*
* Lexing of register types should probably require the ":" symbol specified * Lexing of register types should probably require the ":" symbol specified
* in the BNF of the assembly, but our existing source didn't use that syntax. * in the BNF of the assembly, but our existing source didn't use that syntax.
*/ */
case 36: case 46:
YY_RULE_SETUP YY_RULE_SETUP
#line 56 "lex.l" #line 102 "lex.l"
{ BEGIN(INITIAL); return TYPE_UD; } { BEGIN(INITIAL); return TYPE_UD; }
YY_BREAK YY_BREAK
case 37: case 47:
YY_RULE_SETUP YY_RULE_SETUP
#line 57 "lex.l" #line 103 "lex.l"
{ BEGIN(INITIAL); return TYPE_D; } { BEGIN(INITIAL); return TYPE_D; }
YY_BREAK YY_BREAK
case 38: case 48:
YY_RULE_SETUP YY_RULE_SETUP
#line 58 "lex.l" #line 104 "lex.l"
{ BEGIN(INITIAL); return TYPE_UW; } { BEGIN(INITIAL); return TYPE_UW; }
YY_BREAK YY_BREAK
case 39: case 49:
YY_RULE_SETUP YY_RULE_SETUP
#line 59 "lex.l" #line 105 "lex.l"
{ BEGIN(INITIAL); return TYPE_W; } { BEGIN(INITIAL); return TYPE_W; }
YY_BREAK YY_BREAK
case 40: case 50:
YY_RULE_SETUP YY_RULE_SETUP
#line 60 "lex.l" #line 106 "lex.l"
{ BEGIN(INITIAL); return TYPE_UB; } { BEGIN(INITIAL); return TYPE_UB; }
YY_BREAK YY_BREAK
case 41: case 51:
YY_RULE_SETUP YY_RULE_SETUP
#line 61 "lex.l" #line 107 "lex.l"
{ BEGIN(INITIAL); return TYPE_B; } { BEGIN(INITIAL); return TYPE_B; }
YY_BREAK YY_BREAK
case 42: case 52:
YY_RULE_SETUP YY_RULE_SETUP
#line 62 "lex.l" #line 108 "lex.l"
{ BEGIN(INITIAL); return TYPE_F; } { BEGIN(INITIAL); return TYPE_F; }
YY_BREAK YY_BREAK
case 43: case 53:
YY_RULE_SETUP YY_RULE_SETUP
#line 64 "lex.l" #line 110 "lex.l"
{ return SATURATE; }
YY_BREAK
case 54:
YY_RULE_SETUP
#line 111 "lex.l"
{ return ALIGN1; } { return ALIGN1; }
YY_BREAK YY_BREAK
case 44: case 55:
YY_RULE_SETUP YY_RULE_SETUP
#line 66 "lex.l" #line 112 "lex.l"
{ return ALIGN16; }
YY_BREAK
case 56:
YY_RULE_SETUP
#line 113 "lex.l"
{ return MASK_DISABLE; }
YY_BREAK
case 57:
YY_RULE_SETUP
#line 114 "lex.l"
{ return EOT; }
YY_BREAK
case 58:
YY_RULE_SETUP
#line 116 "lex.l"
{ {
yylval.integer = atoi(yytext); yylval.integer = atoi(yytext);
return INTEGER; return INTEGER;
} }
YY_BREAK YY_BREAK
case 45: case 59:
YY_RULE_SETUP YY_RULE_SETUP
#line 71 "lex.l" #line 121 "lex.l"
{ {
yylval.number = strtod(yytext, NULL); yylval.number = strtod(yytext, NULL);
return NUMBER; return NUMBER;
} }
YY_BREAK YY_BREAK
case 46: case 60:
YY_RULE_SETUP YY_RULE_SETUP
#line 76 "lex.l" #line 126 "lex.l"
{ } /* eat up whitespace */ { } /* eat up whitespace */
YY_BREAK YY_BREAK
case 47: case 61:
YY_RULE_SETUP YY_RULE_SETUP
#line 78 "lex.l" #line 128 "lex.l"
{ {
printf("parse error at line %d: unexpected \"%s\"\n", printf("parse error at line %d: unexpected \"%s\"\n",
yylineno, yytext); yylineno, yytext);
exit(1); exit(1);
} }
YY_BREAK YY_BREAK
case 48: case 62:
YY_RULE_SETUP YY_RULE_SETUP
#line 83 "lex.l" #line 133 "lex.l"
ECHO; ECHO;
YY_BREAK YY_BREAK
case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(IN_REG): case YY_STATE_EOF(IN_REG):
case YY_STATE_EOF(BLOCK_COMMENT):
yyterminate(); yyterminate();
case YY_END_OF_BUFFER: case YY_END_OF_BUFFER:
@ -1276,7 +1407,7 @@ static yy_state_type yy_get_previous_state()
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{ {
yy_current_state = (int) yy_def[yy_current_state]; yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 126 ) if ( yy_current_state >= 158 )
yy_c = yy_meta[(unsigned int) yy_c]; yy_c = yy_meta[(unsigned int) yy_c];
} }
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@ -1306,11 +1437,11 @@ yy_state_type yy_current_state;
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{ {
yy_current_state = (int) yy_def[yy_current_state]; yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 126 ) if ( yy_current_state >= 158 )
yy_c = yy_meta[(unsigned int) yy_c]; yy_c = yy_meta[(unsigned int) yy_c];
} }
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
yy_is_jam = (yy_current_state == 125); yy_is_jam = (yy_current_state == 157);
if ( ! yy_is_jam ) if ( ! yy_is_jam )
*yy_state_ptr++ = yy_current_state; *yy_state_ptr++ = yy_current_state;
@ -1871,7 +2002,7 @@ int main()
return 0; return 0;
} }
#endif #endif
#line 83 "lex.l" #line 133 "lex.l"
char * char *

View File

@ -2,12 +2,31 @@
%{ %{
#include "gen4asm.h" #include "gen4asm.h"
#include "y.tab.h" #include "y.tab.h"
int saved_state = INITIAL;
%} %}
%start IN_REG %s IN_REG
%x BLOCK_COMMENT
%% %%
\/\/.*[\r\n] { } /* eat up single-line comments */ \/\/.*[\r\n] { } /* eat up single-line comments */
/* eat up multi-line comments, non-nesting. */
\/\* {
saved_state = YYSTATE;
BEGIN(BLOCK_COMMENT);
}
<BLOCK_COMMENT>\*\/ {
BEGIN(saved_state);
}
<BLOCK_COMMENT>. { }
<BLOCK_COMMENT>[\r\n] { }
/* used for both null send and null register. */
"null" { return NULL_TOKEN; }
/* opcodes */
"mov" { return MOV; } "mov" { return MOV; }
"mul" { return MUL; } "mul" { return MUL; }
@ -23,10 +42,11 @@
"add" { return ADD; } "add" { return ADD; }
"nop" { return NOP; }
"send" { return SEND; } "send" { return SEND; }
"mlen" { return MSGLEN; } "mlen" { return MSGLEN; }
"rlen" { return RETURNLEN; } "rlen" { return RETURNLEN; }
"null" { return NULL_TOKEN; }
"math" { return MATH; } "math" { return MATH; }
"sampler" { return SAMPLER; } "sampler" { return SAMPLER; }
"gateway" { return GATEWAY; } "gateway" { return GATEWAY; }
@ -46,8 +66,34 @@
"." { return DOT; } "." { return DOT; }
/* XXX: this lexing of register files is shady */ /* XXX: this lexing of register files is shady */
"m" { BEGIN(IN_REG); return MSGREGFILE; } "acc" {
[gr] { BEGIN(IN_REG); return GENREGFILE; } BEGIN(IN_REG);
return ACCREG;
}
"a" {
BEGIN(IN_REG);
return ADDRESSREG;
}
"m" {
BEGIN(IN_REG);
return MSGREG;
}
"f" {
BEGIN(IN_REG);
return FLAGREG;
}
[gr] {
BEGIN(IN_REG);
return GENREG;
}
"cr" {
BEGIN(IN_REG);
return CONTROLREG;
}
"ip" {
BEGIN(IN_REG);
return IPREG;
}
/* /*
* Lexing of register types should probably require the ":" symbol specified * Lexing of register types should probably require the ":" symbol specified
@ -61,7 +107,11 @@
"B" { BEGIN(INITIAL); return TYPE_B; } "B" { BEGIN(INITIAL); return TYPE_B; }
"F" { BEGIN(INITIAL); return TYPE_F; } "F" { BEGIN(INITIAL); return TYPE_F; }
"sat" { return SATURATE; }
"align1" { return ALIGN1; } "align1" { return ALIGN1; }
"align16" { return ALIGN16; }
"mask_disable" { return MASK_DISABLE; }
"EOT" { return EOT; }
[0-9]* { [0-9]* {
yylval.integer = atoi(yytext); yylval.integer = atoi(yytext);

View File

@ -1,82 +1,156 @@
/* The initial payload of the thread is always g0.
* WM_URB (incoming URB entries) is g3
* X0_R is g4
* X1_R is g5
* Y0_R is g6
* Y1_R is g7
*/
/* Set up the X/Y screen coordinates of the pixels in our 4 subspans. Each
* subspan is a 2x2 rectangle, and the screen x/y of the upper left of each
* subspan are given in GRF register 1.2 through 1.5 (which, with the word
* addressing below, are 1.4 through 1.11).
*
* The result is WM_X*_R and WM_Y*R being:
*
* X0: {ss0.x, ss0.x+1, ss0.x, ss0.x+1, ss1.x, ss1.x+1, ss1.x, ss1.x+y}
* Y0: {ss0.y, ss0.y, ss0.y+1, ss0.y+1, ss1.y, ss1.y, ss1.y+1, ss1.y+1}
* X1: {ss2.x, ss2.x+1, ss2.x, ss2.x+1, ss3.x, ss3.x+1, ss3.x, ss3.x+y}
* Y1: {ss2.y, ss2.y, ss2.y+1, ss2.y+1, ss3.y, ss3.y, ss3.y+1, ss3.y+1}
*/
/* Set up ss0.x coordinates*/
mov (1) g4<1>F g1.8<0,1,0>UW { align1 }; mov (1) g4<1>F g1.8<0,1,0>UW { align1 };
add (1) g4.4<1>F g1.8<0,1,0>UW 1UB { align1 }; add (1) g4.4<1>F g1.8<0,1,0>UW 1UB { align1 };
mov (1) g4.8<1>F g1.8<0,1,0>UW { align1 }; mov (1) g4.8<1>F g1.8<0,1,0>UW { align1 };
add (1) g4.12<1>F g1.8<0,1,0>UW 1UB { align1 }; add (1) g4.12<1>F g1.8<0,1,0>UW 1UB { align1 };
/* Set up ss0.y coordinates */
mov (1) g6<1>F g1.10<0,1,0>UW { align1 }; mov (1) g6<1>F g1.10<0,1,0>UW { align1 };
mov (1) g6.4<1>F g1.10<0,1,0>UW { align1 }; mov (1) g6.4<1>F g1.10<0,1,0>UW { align1 };
add (1) g6.8<1>F g1.10<0,1,0>UW 1UB { align1 }; add (1) g6.8<1>F g1.10<0,1,0>UW 1UB { align1 };
add (1) g6.12<1>F g1.10<0,1,0>UW 1UB { align1 }; add (1) g6.12<1>F g1.10<0,1,0>UW 1UB { align1 };
/* set up ss1.x coordinates */
mov (1) g4.16<1>F g1.12<0,1,0>UW { align1 }; mov (1) g4.16<1>F g1.12<0,1,0>UW { align1 };
add (1) g4.20<1>F g1.12<0,1,0>UW 1UB { align1 }; add (1) g4.20<1>F g1.12<0,1,0>UW 1UB { align1 };
mov (1) g4.24<1>F g1.12<0,1,0>UW { align1 }; mov (1) g4.24<1>F g1.12<0,1,0>UW { align1 };
add (1) g4.28<1>F g1.12<0,1,0>UW 1UB { align1 }; add (1) g4.28<1>F g1.12<0,1,0>UW 1UB { align1 };
/* set up ss1.y coordinates */
mov (1) g6.16<1>F g1.14<0,1,0>UW { align1 }; mov (1) g6.16<1>F g1.14<0,1,0>UW { align1 };
mov (1) g6.20<1>F g1.14<0,1,0>UW { align1 }; mov (1) g6.20<1>F g1.14<0,1,0>UW { align1 };
add (1) g6.24<1>F g1.14<0,1,0>UW 1UB { align1 }; add (1) g6.24<1>F g1.14<0,1,0>UW 1UB { align1 };
add (1) g6.28<1>F g1.14<0,1,0>UW 1UB { align1 }; add (1) g6.28<1>F g1.14<0,1,0>UW 1UB { align1 };
/* Set up ss2.x coordinates */
mov (1) g5<1>F g1.16<0,1,0>UW { align1 }; mov (1) g5<1>F g1.16<0,1,0>UW { align1 };
add (1) g5.4<1>F g1.16<0,1,0>UW 1UB { align1 }; add (1) g5.4<1>F g1.16<0,1,0>UW 1UB { align1 };
mov (1) g5.8<1>F g1.16<0,1,0>UW { align1 }; mov (1) g5.8<1>F g1.16<0,1,0>UW { align1 };
add (1) g5.12<1>F g1.16<0,1,0>UW 1UB { align1 }; add (1) g5.12<1>F g1.16<0,1,0>UW 1UB { align1 };
/* Set up ss2.y coordinates */
mov (1) g7<1>F g1.18<0,1,0>UW { align1 }; mov (1) g7<1>F g1.18<0,1,0>UW { align1 };
mov (1) g7.4<1>F g1.18<0,1,0>UW { align1 }; mov (1) g7.4<1>F g1.18<0,1,0>UW { align1 };
add (1) g7.8<1>F g1.18<0,1,0>UW 1UB { align1 }; add (1) g7.8<1>F g1.18<0,1,0>UW 1UB { align1 };
add (1) g7.12<1>F g1.18<0,1,0>UW 1UB { align1 }; add (1) g7.12<1>F g1.18<0,1,0>UW 1UB { align1 };
/* Set up ss3.x coordinates */
mov (1) g5.16<1>F g1.20<0,1,0>UW { align1 }; mov (1) g5.16<1>F g1.20<0,1,0>UW { align1 };
add (1) g5.20<1>F g1.20<0,1,0>UW 1UB { align1 }; add (1) g5.20<1>F g1.20<0,1,0>UW 1UB { align1 };
mov (1) g5.24<1>F g1.20<0,1,0>UW { align1 }; mov (1) g5.24<1>F g1.20<0,1,0>UW { align1 };
add (1) g5.28<1>F g1.20<0,1,0>UW 1UB { align1 }; add (1) g5.28<1>F g1.20<0,1,0>UW 1UB { align1 };
/* Set up ss3.y coordinates */
mov (1) g7.16<1>F g1.22<0,1,0>UW { align1 }; mov (1) g7.16<1>F g1.22<0,1,0>UW { align1 };
mov (1) g7.20<1>F g1.22<0,1,0>UW { align1 }; mov (1) g7.20<1>F g1.22<0,1,0>UW { align1 };
add (1) g7.24<1>F g1.22<0,1,0>UW 1UB { align1 }; add (1) g7.24<1>F g1.22<0,1,0>UW 1UB { align1 };
add (1) g7.28<1>F g1.22<0,1,0>UW 1UB { align1 }; add (1) g7.28<1>F g1.22<0,1,0>UW 1UB { align1 };
/* Now, map these screen space coordinates into texture coordinates. */
/* subtract screen-space X origin of vertex 0. */
add (8) g4<1>F g4<8,8,1>F g1<0,1,0>F { align1 }; add (8) g4<1>F g4<8,8,1>F g1<0,1,0>F { align1 };
add (8) g5<1>F g5<8,8,1>F g1<0,1,0>F { align1 }; add (8) g5<1>F g5<8,8,1>F g1<0,1,0>F { align1 };
/* scale by texture X increment */
mul (8) g4<1>F g4<8,8,1>F g3<0,1,0>F { align1 }; mul (8) g4<1>F g4<8,8,1>F g3<0,1,0>F { align1 };
mul (8) g5<1>F g5<8,8,1>F g3<0,1,0>F { align1 }; mul (8) g5<1>F g5<8,8,1>F g3<0,1,0>F { align1 };
/* add in texture X offset */
add (8) g4<1>F g4<8,8,1>F g3.12<0,1,0>F { align1 }; add (8) g4<1>F g4<8,8,1>F g3.12<0,1,0>F { align1 };
add (8) g5<1>F g5<8,8,1>F g3.12<0,1,0>F { align1 }; add (8) g5<1>F g5<8,8,1>F g3.12<0,1,0>F { align1 };
/* subtract screen-space Y origin of vertex 0. */
add (8) g6<1>F g6<8,8,1>F g1.4<0,1,0>F { align1 }; add (8) g6<1>F g6<8,8,1>F g1.4<0,1,0>F { align1 };
add (8) g7<1>F g7<8,8,1>F g1.4<0,1,0>F { align1 }; add (8) g7<1>F g7<8,8,1>F g1.4<0,1,0>F { align1 };
/* scale by texture Y increment */
mul (8) g6<1>F g6<8,8,1>F g3.20<0,1,0>F { align1 }; mul (8) g6<1>F g6<8,8,1>F g3.20<0,1,0>F { align1 };
mul (8) g7<1>F g7<8,8,1>F g3.20<0,1,0>F { align1 }; mul (8) g7<1>F g7<8,8,1>F g3.20<0,1,0>F { align1 };
/* add in texture Y offset */
add (8) g6<1>F g6<8,8,1>F g3.28<0,1,0>F { align1 }; add (8) g6<1>F g6<8,8,1>F g3.28<0,1,0>F { align1 };
add (8) g7<1>F g7<8,8,1>F g3.28<0,1,0>F { align1 }; add (8) g7<1>F g7<8,8,1>F g3.28<0,1,0>F { align1 };
/* sampler */
mov (8) m1<1>F g4<8,8,1>F { align1 }; mov (8) m1<1>F g4<8,8,1>F { align1 };
mov (8) m2<1>F g5<8,8,1>F { align1 }; mov (8) m2<1>F g5<8,8,1>F { align1 };
mov (8) m3<1>F g6<8,8,1>F { align1 }; mov (8) m3<1>F g6<8,8,1>F { align1 };
mov (8) m4<1>F g7<8,8,1>F { align1 }; mov (8) m4<1>F g7<8,8,1>F { align1 };
/*
* g0 holds the PS thread payload, which (oddly) contains
* precisely what the sampler wants to see in m0
*/
send 0 (16) g12<1>UW g0<8,8,1>UW sampler mlen 5 rlen 8 { align1 }; send 0 (16) g12<1>UW g0<8,8,1>UW sampler mlen 5 rlen 8 { align1 };
mov (8) g19<1>UW g19<8,8,1>UW { align1 }; mov (8) g19<1>UW g19<8,8,1>UW { align1 };
/* color space conversion function:
* R = Clamp ( 1.164(Y-16/255) + 1.596(Cr-128/255), 0, 1)
* G = Clamp ( 1.164(Y-16/255) - 0.813(Cr-128/255) - 0.392(Cb-128/255), 0, 1)
* B = Clamp ( 1.164(Y-16/255) + 2.017(Cb-128/255), 0, 1)
*
* Y is g14, g15.
* Cr is g12, g13.
* Cb is g16, g17.
*
* R is g2, g6.
* G is g3, g7.
* B is g4, g8.
*/
/* Y = Y - 16/255 */
add (8) g14<1>F g14<8,8,1>F -0.0627451F { align1 }; add (8) g14<1>F g14<8,8,1>F -0.0627451F { align1 };
/* Cr = Cr - 128/255 */
add (8) g12<1>F g12<8,8,1>F -0.501961F { align1 }; add (8) g12<1>F g12<8,8,1>F -0.501961F { align1 };
/* Cb = Cb - 128 / 255 */
add (8) g16<1>F g16<8,8,1>F -0.501961F { align1 }; add (8) g16<1>F g16<8,8,1>F -0.501961F { align1 };
/* Y = Y * 1.164 */
mul (8) g14<1>F g14<8,8,1>F 1.164F { align1 }; mul (8) g14<1>F g14<8,8,1>F 1.164F { align1 };
mul (8) a0<1>F g12<8,8,1>F 1.596F { align1 }; /* acc = 1.596 * Cr */
mac (8) m2<1>F g14<8,8,1>F 1F { align1Saturate }; mul (8) acc0<1>F g12<8,8,1>F 1.596F { align1 };
mul (8) a0<1>F g12<8,8,1>F -0.813F { align1 }; /* R = acc + Y */
mac (8) a0<1>F g16<8,8,1>F -0.392F { align1 }; mac.sat (8) m2<1>F g14<8,8,1>F 1F { align1 };
mac (8) m3<1>F g14<8,8,1>F 1F { align1Saturate }; /* acc = Cr * -0.813 */
mul (8) a0<1>F g16<8,8,1>F 2.017F { align1 }; mul (8) acc0<1>F g12<8,8,1>F -0.813F { align1 };
mac (8) m4<1>F g14<8,8,1>F 1F { align1Saturate }; /* acc += Cb * -0.392 */
mac (8) acc0<1>F g16<8,8,1>F -0.392F { align1 };
/* G = acc + Y */
mac.sat (8) m3<1>F g14<8,8,1>F 1F { align1 };
/* acc = Cb * 2.017 */
mul (8) acc0<1>F g16<8,8,1>F 2.017F { align1 };
/* B = acc + Y */
mac.sat (8) m4<1>F g14<8,8,1>F 1F { align1 };
/* and do it again */
add (8) g15<1>F g15<8,8,1>F -0.0627451F { align1 }; add (8) g15<1>F g15<8,8,1>F -0.0627451F { align1 };
add (8) g13<1>F g13<8,8,1>F -0.501961F { align1 }; add (8) g13<1>F g13<8,8,1>F -0.501961F { align1 };
add (8) g17<1>F g17<8,8,1>F -0.501961F { align1 }; add (8) g17<1>F g17<8,8,1>F -0.501961F { align1 };
mul (8) g15<1>F g15<8,8,1>F 1.164F { align1 }; mul (8) g15<1>F g15<8,8,1>F 1.164F { align1 };
mul (8) a0<1>F g13<8,8,1>F 1.596F { align1 }; mul (8) acc0<1>F g13<8,8,1>F 1.596F { align1 };
mac (8) m6<1>F g15<8,8,1>F 1F { align1Saturate }; mac.sat (8) m6<1>F g15<8,8,1>F 1F { align1 };
mul (8) a0<1>F g13<8,8,1>F -0.813F { align1 }; mul (8) acc0<1>F g13<8,8,1>F -0.813F { align1 };
mac (8) a0<1>F g17<8,8,1>F -0.392F { align1 }; mac (8) acc0<1>F g17<8,8,1>F -0.392F { align1 };
mac (8) m7<1>F g15<8,8,1>F 1F { align1Saturate }; mac.sat (8) m7<1>F g15<8,8,1>F 1F { align1 };
mul (8) a0<1>F g17<8,8,1>F 2.017F { align1 }; mul (8) acc0<1>F g17<8,8,1>F 2.017F { align1 };
mac (8) m8<1>F g15<8,8,1>F 1F { align1Saturate }; mac.sat (8) m8<1>F g15<8,8,1>F 1F { align1 };
/* Pass through control information:
*/
mov (8) m1<1>UD g1<8,8,1>UD { align1 mask_disable }; mov (8) m1<1>UD g1<8,8,1>UD { align1 mask_disable };
send 0 (16) a0<1>UW g0<8,8,1>UW write mlen 10 rlen 0 EOT{ align1 }; /* Send framebuffer write message: XXX: acc0? */
nop (4) g0<1>UD { align1 }; send 0 (16) null g0<8,8,1>UW write mlen 10 rlen 0 { align1 EOT };
nop (4) g0<1>UD { align1 }; /* padding */
nop (4) g0<1>UD { align1 }; nop;
nop (4) g0<1>UD { align1 }; nop;
nop (4) g0<1>UD { align1 }; nop;
nop (4) g0<1>UD { align1 }; nop;
nop (4) g0<1>UD { align1 }; nop;
nop (4) g0<1>UD { align1 }; nop;
nop;
nop;