diff --git a/assembler/src/brw_defines.h b/assembler/src/brw_defines.h index 1c5c2791..60ab7703 100644 --- a/assembler/src/brw_defines.h +++ b/assembler/src/brw_defines.h @@ -707,6 +707,7 @@ #define BRW_MESSAGE_TARGET_DATAPORT_WRITE 5 #define BRW_MESSAGE_TARGET_URB 6 #define BRW_MESSAGE_TARGET_THREAD_SPAWNER 7 +#define BRW_MESSAGE_TARGET_VME 8 #define BRW_SAMPLER_RETURN_FORMAT_FLOAT32 0 #define BRW_SAMPLER_RETURN_FORMAT_UINT32 2 diff --git a/assembler/src/brw_structs.h b/assembler/src/brw_structs.h index 6a0ad5b5..1618cf3b 100644 --- a/assembler/src/brw_structs.h +++ b/assembler/src/brw_structs.h @@ -1454,6 +1454,15 @@ struct brw_instruction GLuint end_of_thread:1; } thread_spawner_gen5; + struct { + GLuint binding_table_index:8; + GLuint search_path_index:3; + GLuint lut_subindex:2; + GLuint message_type:2; + GLuint pad0:4; + GLuint header_present:1; + } vme_gen6; + struct { GLuint pad:19; GLuint header_present:1; diff --git a/assembler/src/gram.y b/assembler/src/gram.y index 70a4a2d5..7ec67c61 100644 --- a/assembler/src/gram.y +++ b/assembler/src/gram.y @@ -111,7 +111,7 @@ void set_direct_src_operand(struct src_operand *src, struct direct_reg *reg, %token PUSH MREST POP WAIT DO ENDIF ILLEGAL %token MATH_INST -%token NULL_TOKEN MATH SAMPLER GATEWAY READ WRITE URB THREAD_SPAWNER +%token NULL_TOKEN MATH SAMPLER GATEWAY READ WRITE URB THREAD_SPAWNER VME %token MSGLEN RETURNLEN %token ALLOCATE USED COMPLETE TRANSPOSE INTERLEAVE @@ -1118,6 +1118,24 @@ msgtarget: NULL_TOKEN $$.bits3.thread_spawner.resource_select = $7; } } + | VME LPAREN INTEGER COMMA INTEGER COMMA INTEGER COMMA INTEGER RPAREN + { + $$.bits3.generic.msg_target = + BRW_MESSAGE_TARGET_VME; + + if (gen_level == 6) { + $$.bits2.send_gen5.sfid = + BRW_MESSAGE_TARGET_VME; + $$.bits3.vme_gen6.binding_table_index = $3; + $$.bits3.vme_gen6.search_path_index = $5; + $$.bits3.vme_gen6.lut_subindex = $7; + $$.bits3.vme_gen6.message_type = $9; + $$.bits3.generic_gen5.header_present = 1; + } else { + fprintf (stderr, "Gen6- donesn't have vme function\n"); + YYERROR; + } + } ; urb_allocate: ALLOCATE { $$ = 1; } diff --git a/assembler/src/lex.l b/assembler/src/lex.l index adfb73e5..910b555d 100644 --- a/assembler/src/lex.l +++ b/assembler/src/lex.l @@ -136,6 +136,7 @@ yylval.integer = BRW_CHANNEL_W; "write" { return WRITE; } "urb" { return URB; } "thread_spawner" { return THREAD_SPAWNER; } +"vme" { return VME; } "allocate" { return ALLOCATE; } "used" { return USED; }