diff --git a/assembler/src/brw_defines.h b/assembler/src/brw_defines.h index 7e8650aa..1bff9c47 100644 --- a/assembler/src/brw_defines.h +++ b/assembler/src/brw_defines.h @@ -584,6 +584,7 @@ #define BRW_OPCODE_POP 47 #define BRW_OPCODE_WAIT 48 #define BRW_OPCODE_SEND 49 +#define BRW_OPCODE_MATH 56 #define BRW_OPCODE_ADD 64 #define BRW_OPCODE_MUL 65 #define BRW_OPCODE_AVG 66 diff --git a/assembler/src/gram.y b/assembler/src/gram.y index d50e6fa0..18fc394c 100644 --- a/assembler/src/gram.y +++ b/assembler/src/gram.y @@ -104,6 +104,7 @@ void set_direct_src_operand(struct src_operand *src, struct direct_reg *reg, %token AVG ADD SEL AND OR XOR SHR SHL ASR CMP CMPN PLN %token SEND NOP JMPI IF IFF WHILE ELSE BREAK CONT HALT MSAVE %token PUSH MREST POP WAIT DO ENDIF ILLEGAL +%token MATH_INST %token NULL_TOKEN MATH SAMPLER GATEWAY READ WRITE URB THREAD_SPAWNER @@ -128,6 +129,7 @@ void set_direct_src_operand(struct src_operand *src, struct direct_reg *reg, %type breakinstruction syncinstruction specialinstruction %type msgtarget %type instoptions instoption_list predicate +%type mathinstruction %type label %type instrseq %type instoption @@ -235,6 +237,7 @@ instruction: unaryinstruction | breakinstruction | syncinstruction | specialinstruction + | mathinstruction ; unaryinstruction: @@ -483,6 +486,23 @@ elseinstruction: ELSE relativelocation } ; +mathinstruction: predicate MATH_INST execsize dst src srcimm math_function instoptions + { + bzero(&$$, sizeof($$)); + $$.header.opcode = $2; + $$.header.sfid_destreg__conditionalmod = $7; + $$.header.execution_size = $3; + set_instruction_options(&$$, &$8); + set_instruction_predicate(&$$, &$1); + if (set_instruction_dest(&$$, &$4) != 0) + YYERROR; + if (set_instruction_src0(&$$, &$5) != 0) + YYERROR; + if (set_instruction_src1(&$$, &$6) != 0) + YYERROR; + } +; + breakinstruction: breakop locationstackcontrol { struct direct_reg dst; diff --git a/assembler/src/lex.l b/assembler/src/lex.l index 482d68e3..23b5f4b4 100644 --- a/assembler/src/lex.l +++ b/assembler/src/lex.l @@ -8,7 +8,7 @@ #include "string.h" int saved_state = 0; extern char *input_filename; - +extern long int gen_level; %} %x BLOCK_COMMENT %x LINENUMBER @@ -101,7 +101,7 @@ extern char *input_filename; /* send argument tokens */ "mlen" { return MSGLEN; } "rlen" { return RETURNLEN; } -"math" { return MATH; } +"math" { if (gen_level >= 6) { yylval.integer = BRW_OPCODE_MATH; return MATH_INST; } else return MATH; } "sampler" { return SAMPLER; } "gateway" { return GATEWAY; } "read" { return READ; }