diff options
-rw-r--r-- | assembler/brw_defines.h | 1 | ||||
-rw-r--r-- | assembler/gram.y | 31 | ||||
-rw-r--r-- | assembler/lex.l | 70 |
3 files changed, 73 insertions, 29 deletions
diff --git a/assembler/brw_defines.h b/assembler/brw_defines.h index 11f20227..4ec02246 100644 --- a/assembler/brw_defines.h +++ b/assembler/brw_defines.h @@ -562,6 +562,7 @@ #define BRW_OPCODE_RSL 11 #define BRW_OPCODE_ASR 12 #define BRW_OPCODE_CMP 16 +#define BRW_OPCODE_CMPN 17 #define BRW_OPCODE_JMPI 32 #define BRW_OPCODE_IF 34 #define BRW_OPCODE_IFF 35 diff --git a/assembler/gram.y b/assembler/gram.y index 7ed2f41b..1dea59d4 100644 --- a/assembler/gram.y +++ b/assembler/gram.y @@ -66,11 +66,13 @@ %token <integer> GENREG MSGREG ACCREG ADDRESSREG %token FLAGREG CONTROLREG IPREG -%token MOV -%token MUL MAC MACH LINE SAD2 SADA2 DP4 DPH DP3 DP2 -%token ADD -%token SEND NULL_TOKEN MATH SAMPLER GATEWAY READ WRITE URB THREAD_SPAWNER -%token NOP +%token <integer> MOV FRC RNDU RNDD RNDE RNDZ NOT LZD +%token <integer> MUL MAC MACH LINE SAD2 SADA2 DP4 DPH DP3 DP2 +%token <integer> AVG ADD SEL AND OR XOR SHR SHL ASR CMP CMPN +%token <integer> SEND NOP JMPI IF IFF WHILE SEND ELSE BREAK CONT HALT MSAVE +%token <integer> PUSH MREST POP WAIT DO ENDIF ILLEGAL + +%token NULL_TOKEN MATH SAMPLER GATEWAY READ WRITE URB THREAD_SPAWNER %token MSGLEN RETURNLEN %token <integer> ALLOCATE USED COMPLETE TRANSPOSE INTERLEAVE @@ -161,7 +163,7 @@ unaryinstruction: } ; -unaryop: MOV { $$ = BRW_OPCODE_MOV; } +unaryop: MOV | FRC | RNDU | RNDD | RNDE | RNDZ | NOT | LZD ; binaryinstruction: @@ -180,8 +182,7 @@ binaryinstruction: } ; -binaryop: MUL { $$ = BRW_OPCODE_MUL; } - | MAC { $$ = BRW_OPCODE_MAC; } +binaryop: MUL | MAC | MACH | LINE | SAD2 | SADA2 | DP4 | DPH | DP3 | DP2 binaryaccinstruction: predicate binaryaccop conditionalmodifier saturate execsize @@ -199,7 +200,7 @@ binaryaccinstruction: } ; -binaryaccop: ADD { $$ = BRW_OPCODE_ADD; } +binaryaccop: AVG | ADD | SEL | AND | OR | XOR | SHR | SHL | ASR | CMP | CMPN ; triinstruction: sendinstruction @@ -217,7 +218,7 @@ sendinstruction: predicate SEND execsize INTEGER post_dst payload msgtarget * implicitly loaded if non-null. */ bzero(&$$, sizeof($$)); - $$.header.opcode = BRW_OPCODE_SEND; + $$.header.opcode = $2; $$.header.execution_size = $3; $$.header.destreg__conditionalmod = $4; /* msg reg index */ set_instruction_dest(&$$, &$5); @@ -231,10 +232,18 @@ sendinstruction: predicate SEND execsize INTEGER post_dst payload msgtarget $12.bits3.generic.end_of_thread; } +branchloopop: IF | IFF | WHILE +; + +breakop: BREAK | CONT | WAIT + +maskpushop: MSAVE | PUSH +; + specialinstruction: NOP { bzero(&$$, sizeof($$)); - $$.header.opcode = BRW_OPCODE_NOP; + $$.header.opcode = $1; } /* XXX! */ diff --git a/assembler/lex.l b/assembler/lex.l index e60b228b..ab418da2 100644 --- a/assembler/lex.l +++ b/assembler/lex.l @@ -27,24 +27,58 @@ int saved_state = INITIAL; "null" { return NULL_TOKEN; } /* opcodes */ -"mov" { return MOV; } - -"mul" { return MUL; } -"mac" { return MAC; } -"mach" { return MACH; } -"line" { return LINE; } -"sad2" { return SAD2; } -"sada2" { return SADA2; } -"dp4" { return DP4; } -"dph" { return DPH; } -"dp3" { return DP3; } -"dp2" { return DP2; } - -"add" { return ADD; } - -"nop" { return NOP; } - -"send" { return SEND; } +"mov" { yylval.integer = BRW_OPCODE_MOV; return MOV; } +"frc" { yylval.integer = BRW_OPCODE_FRC; return FRC; } +"rndu" { yylval.integer = BRW_OPCODE_RNDU; return RNDU; } +"rndd" { yylval.integer = BRW_OPCODE_RNDD; return RNDD; } +"rnde" { yylval.integer = BRW_OPCODE_RNDE; return RNDE; } +"rndz" { yylval.integer = BRW_OPCODE_RNDZ; return RNDZ; } +"not" { yylval.integer = BRW_OPCODE_NOT; return NOT; } +"lzd" { yylval.integer = BRW_OPCODE_LZD; return LZD; } + +"mul" { yylval.integer = BRW_OPCODE_MUL; return MUL; } +"mac" { yylval.integer = BRW_OPCODE_MAC; return MAC; } +"mach" { yylval.integer = BRW_OPCODE_MACH; return MACH; } +"line" { yylval.integer = BRW_OPCODE_LINE; return LINE; } +"sad2" { yylval.integer = BRW_OPCODE_SAD2; return SAD2; } +"sada2" { yylval.integer = BRW_OPCODE_SADA2; return SADA2; } +"dp4" { yylval.integer = BRW_OPCODE_DP4; return DP4; } +"dph" { yylval.integer = BRW_OPCODE_DPH; return DPH; } +"dp3" { yylval.integer = BRW_OPCODE_DP3; return DP3; } +"dp2" { yylval.integer = BRW_OPCODE_DP2; return DP2; } + +"avg" { yylval.integer = BRW_OPCODE_AVG; return AVG; } +"add" { yylval.integer = BRW_OPCODE_ADD; return ADD; } +"sel" { yylval.integer = BRW_OPCODE_SEL; return SEL; } +"and" { yylval.integer = BRW_OPCODE_AND; return AND; } +"or" { yylval.integer = BRW_OPCODE_OR; return OR; } +"xor" { yylval.integer = BRW_OPCODE_XOR; return XOR; } +"shr" { yylval.integer = BRW_OPCODE_SHR; return SHR; } +"shl" { yylval.integer = BRW_OPCODE_SHL; return SHL; } +"asr" { yylval.integer = BRW_OPCODE_ASR; return ASR; } +"cmp" { yylval.integer = BRW_OPCODE_CMP; return CMP; } +"cmpn" { yylval.integer = BRW_OPCODE_CMPN; return CMPN; } + +"send" { yylval.integer = BRW_OPCODE_SEND; return SEND; } +"nop" { yylval.integer = BRW_OPCODE_NOP; return NOP; } +"jmpi" { yylval.integer = BRW_OPCODE_JMPI; return JMPI; } +"if" { yylval.integer = BRW_OPCODE_IF; return IF; } +"iff" { yylval.integer = BRW_OPCODE_IFF; return IFF; } +"while" { yylval.integer = BRW_OPCODE_NOP; return NOP; } +"send" { yylval.integer = BRW_OPCODE_SEND; return SEND; } +"else" { yylval.integer = BRW_OPCODE_ELSE; return ELSE; } +"break" { yylval.integer = BRW_OPCODE_BREAK; return BREAK; } +"cont" { yylval.integer = BRW_OPCODE_CONTINUE; return CONT; } +"halt" { yylval.integer = BRW_OPCODE_HALT; return HALT; } +"msave" { yylval.integer = BRW_OPCODE_MSAVE; return MSAVE; } +"push" { yylval.integer = BRW_OPCODE_PUSH; return PUSH; } +"mrest" { yylval.integer = BRW_OPCODE_MRESTORE; return MREST; } +"pop" { yylval.integer = BRW_OPCODE_POP; return POP; } +"wait" { yylval.integer = BRW_OPCODE_WAIT; return WAIT; } +"do" { yylval.integer = BRW_OPCODE_DO; return DO; } +"endif" { yylval.integer = BRW_OPCODE_ENDIF; return ENDIF; } + + /* send argument tokens */ "mlen" { return MSGLEN; } "rlen" { return RETURNLEN; } "math" { return MATH; } |