[Intel-gfx] [PATCH] gen4asm: add support for GEN5

Xiang, Haihao haihao.xiang at intel.com
Wed Jun 24 09:56:25 CEST 2009


add a new option [-g n], n=4(GEN4),5(GEN5). If don't use -g,
the default value is 4(GEN4)
---
 src/brw_structs.h |  101 ++++++++++++++++++++++++++
 src/gram.y        |  209 ++++++++++++++++++++++++++++++++++++++---------------
 src/main.c        |   17 ++++-
 3 files changed, 265 insertions(+), 62 deletions(-)

diff --git a/src/brw_structs.h b/src/brw_structs.h
index 61f7b34..4bd38e9 100644
--- a/src/brw_structs.h
+++ b/src/brw_structs.h
@@ -1185,6 +1185,14 @@ struct brw_instruction
 	 GLuint pad1:6;
       } ia16;
 
+       struct 
+       {
+           GLuint pad:26;
+           GLuint end_of_thread:1;
+           GLuint pad1:1;
+           GLuint sfid:4;
+       } send_gen5;  /* for GEN5 only */
+
    } bits2;
 
    union
@@ -1332,6 +1340,99 @@ struct brw_instruction
 	 GLuint end_of_thread:1;
       } generic;
 
+       struct {
+           GLuint function:4;
+           GLuint int_type:1;
+           GLuint precision:1;
+           GLuint saturate:1;
+           GLuint data_type:1;
+           GLuint snapshot:1;
+           GLuint pad0:10;
+           GLuint header_present:1;
+           GLuint response_length:5;
+           GLuint msg_length:4;
+           GLuint pad1:2;
+           GLuint end_of_thread:1;
+       } math_gen5;
+
+       struct {
+           GLuint opcode:4;
+           GLuint offset:6;
+           GLuint swizzle_control:2; 
+           GLuint pad:1;
+           GLuint allocate:1;
+           GLuint used:1;
+           GLuint complete:1;
+           GLuint pad0:3;
+           GLuint header_present:1;
+           GLuint response_length:5;
+           GLuint msg_length:4;
+           GLuint pad1:2;
+           GLuint end_of_thread:1;
+       } urb_gen5;
+
+       struct {
+           GLuint binding_table_index:8;
+           GLuint sampler:4;
+           GLuint msg_type:4;
+           GLuint simd_mode:2;
+           GLuint pad0:1;
+           GLuint header_present:1;
+           GLuint response_length:5;
+           GLuint msg_length:4;
+           GLuint pad1:2;
+           GLuint end_of_thread:1;
+       } sampler_gen5;
+
+       struct {
+           GLuint binding_table_index:8;
+           GLuint msg_control:3;  
+           GLuint msg_type:3;  
+           GLuint target_cache:2;    
+           GLuint pad0:3;
+           GLuint header_present:1;
+           GLuint response_length:5;
+           GLuint msg_length:4;
+           GLuint pad1:2;
+           GLuint end_of_thread:1;
+       } dp_read_gen5;
+
+       struct {
+           GLuint binding_table_index:8;
+           GLuint msg_control:3;
+           GLuint pixel_scoreboard_clear:1;
+           GLuint msg_type:3;    
+           GLuint send_commit_msg:1;
+           GLuint pad0:3;
+           GLuint header_present:1;
+           GLuint response_length:5;
+           GLuint msg_length:4;
+           GLuint pad1:2;
+           GLuint end_of_thread:1;
+       } dp_write_gen5;
+
+       struct {
+           GLuint opcode:1;
+           GLuint requester_type:1;
+           GLuint pad0:2;
+           GLuint resource_select:1;
+           GLuint pad1:14;
+           GLuint header_present:1;
+           GLuint response_length:5;
+           GLuint msg_length:4;
+           GLuint pad2:2;
+           GLuint end_of_thread:1;
+       } thread_spawner_gen5;
+
+       struct {
+           GLuint pad:19;
+           GLuint header_present:1;
+           GLuint response_length:5;
+           GLuint msg_length:4;
+           GLuint pad1:2;
+           GLuint end_of_thread:1;
+       } generic_gen5;
+
       GLuint ud;
       GLint id;
       GLfloat fd;
diff --git a/src/gram.y b/src/gram.y
index 15f28af..d840719 100644
--- a/src/gram.y
+++ b/src/gram.y
@@ -32,6 +32,8 @@
 #include "gen4asm.h"
 #include "brw_defines.h"
 
+extern long int gen_level;
+
 int set_instruction_dest(struct brw_instruction *instr,
 			 struct dst_operand *dest);
 int set_instruction_src0(struct brw_instruction *instr,
@@ -308,11 +310,22 @@ sendinstruction: predicate SEND execsize INTEGER post_dst payload msgtarget
 		    YYERROR;
 		  $$.bits1.da1.src1_reg_file = BRW_IMMEDIATE_VALUE;
 		  $$.bits1.da1.src1_reg_type = BRW_REGISTER_TYPE_D;
-		  $$.bits3.generic = $7.bits3.generic;
-		  $$.bits3.generic.msg_length = $9;
-		  $$.bits3.generic.response_length = $11;
-		  $$.bits3.generic.end_of_thread =
-		    $12.bits3.generic.end_of_thread;
+
+                  if (gen_level == 5) {
+                      $$.bits2.send_gen5.sfid = $7.bits2.send_gen5.sfid;
+                      $$.bits2.send_gen5.end_of_thread = $12.bits3.generic_gen5.end_of_thread;
+                      $$.bits3.generic_gen5 = $7.bits3.generic_gen5;
+                      $$.bits3.generic_gen5.msg_length = $9;
+                      $$.bits3.generic_gen5.response_length = $11;
+                      $$.bits3.generic_gen5.end_of_thread =
+                          $12.bits3.generic_gen5.end_of_thread;
+                  } else {
+                      $$.bits3.generic = $7.bits3.generic;
+                      $$.bits3.generic.msg_length = $9;
+                      $$.bits3.generic.response_length = $11;
+                      $$.bits3.generic.end_of_thread =
+                          $12.bits3.generic.end_of_thread;
+                  }
 		}
 ;
 
@@ -518,89 +531,165 @@ post_dst:	dst
 
 msgtarget:	NULL_TOKEN
 		{
-		  $$.bits3.generic.msg_target = BRW_MESSAGE_TARGET_NULL;
+                  if (gen_level == 5) {
+                      $$.bits2.send_gen5.sfid= BRW_MESSAGE_TARGET_NULL;
+                      $$.bits3.generic_gen5.header_present = 0;  /* ??? */
+                  } else {
+                      $$.bits3.generic.msg_target = BRW_MESSAGE_TARGET_NULL;
+                  }
 		}
 		| SAMPLER LPAREN INTEGER COMMA INTEGER COMMA
 		sampler_datatype RPAREN
 		{
-		  $$.bits3.generic.msg_target = BRW_MESSAGE_TARGET_SAMPLER;
-		  $$.bits3.sampler.binding_table_index = $3;
-		  $$.bits3.sampler.sampler = $5;
-		  switch ($7) {
-		  case TYPE_F:
-		    $$.bits3.sampler.return_format =
-		      BRW_SAMPLER_RETURN_FORMAT_FLOAT32;
-		    break;
-		  case TYPE_UD:
-		    $$.bits3.sampler.return_format =
-		      BRW_SAMPLER_RETURN_FORMAT_UINT32;
-		    break;
-		  case TYPE_D:
-		    $$.bits3.sampler.return_format =
-		      BRW_SAMPLER_RETURN_FORMAT_SINT32;
-		    break;
-		  }
+                  if (gen_level == 5) {
+                      $$.bits2.send_gen5.sfid = BRW_MESSAGE_TARGET_SAMPLER;
+                      $$.bits3.generic_gen5.header_present = 1;   /* ??? */
+                      $$.bits3.sampler_gen5.binding_table_index = $3;
+                      $$.bits3.sampler_gen5.sampler = $5;
+                      $$.bits3.sampler_gen5.simd_mode = 2; /* SIMD16, maybe we should add a new parameter */
+                  } else {
+                      $$.bits3.generic.msg_target = BRW_MESSAGE_TARGET_SAMPLER;	
+                      $$.bits3.sampler.binding_table_index = $3;
+                      $$.bits3.sampler.sampler = $5;
+                      switch ($7) {
+                      case TYPE_F:
+                          $$.bits3.sampler.return_format =
+                              BRW_SAMPLER_RETURN_FORMAT_FLOAT32;
+                          break;
+                      case TYPE_UD:
+                          $$.bits3.sampler.return_format =
+                              BRW_SAMPLER_RETURN_FORMAT_UINT32;
+                          break;
+                      case TYPE_D:
+                          $$.bits3.sampler.return_format =
+                              BRW_SAMPLER_RETURN_FORMAT_SINT32;
+                          break;
+                      }
+                  }
 		}
 		| MATH math_function saturate math_signed math_scalar
 		{
-		  $$.bits3.generic.msg_target = BRW_MESSAGE_TARGET_MATH;
-		  $$.bits3.math.function = $2;
-		  if ($3 == BRW_INSTRUCTION_SATURATE)
-		    $$.bits3.math.saturate = 1;
-		  else
-		    $$.bits3.math.saturate = 0;
-		  $$.bits3.math.int_type = $4;
-		  $$.bits3.math.precision = BRW_MATH_PRECISION_FULL;
-		  $$.bits3.math.data_type = $5;
+                  if (gen_level == 5) {
+                      $$.bits2.send_gen5.sfid = BRW_MESSAGE_TARGET_MATH;
+                      $$.bits3.generic_gen5.header_present = 0;
+                      $$.bits3.math_gen5.function = $2;
+                      if ($3 == BRW_INSTRUCTION_SATURATE)
+                          $$.bits3.math_gen5.saturate = 1;
+                      else
+                          $$.bits3.math_gen5.saturate = 0;
+                      $$.bits3.math_gen5.int_type = $4;
+                      $$.bits3.math_gen5.precision = BRW_MATH_PRECISION_FULL;
+                      $$.bits3.math_gen5.data_type = $5;
+                  } else {
+                      $$.bits3.generic.msg_target = BRW_MESSAGE_TARGET_MATH;
+                      $$.bits3.math.function = $2;
+                      if ($3 == BRW_INSTRUCTION_SATURATE)
+                          $$.bits3.math.saturate = 1;
+                      else
+                          $$.bits3.math.saturate = 0;
+                      $$.bits3.math.int_type = $4;
+                      $$.bits3.math.precision = BRW_MATH_PRECISION_FULL;
+                      $$.bits3.math.data_type = $5;
+                  }
 		}
 		| GATEWAY
 		{
-		  $$.bits3.generic.msg_target = BRW_MESSAGE_TARGET_GATEWAY;
+                  if (gen_level == 5) {
+                      $$.bits2.send_gen5.sfid = BRW_MESSAGE_TARGET_GATEWAY;
+                      $$.bits3.generic_gen5.header_present = 0;  /* ??? */
+                  } else {
+                      $$.bits3.generic.msg_target = BRW_MESSAGE_TARGET_GATEWAY;
+                  }
 		}
 		| READ  LPAREN INTEGER COMMA INTEGER COMMA INTEGER COMMA
                 INTEGER RPAREN
 		{
-		  $$.bits3.generic.msg_target =
-		    BRW_MESSAGE_TARGET_DATAPORT_READ;
-		  $$.bits3.dp_read.binding_table_index = $3;
-		  $$.bits3.dp_read.target_cache = $5;
-                  $$.bits3.dp_read.msg_control = $7;
-                  $$.bits3.dp_read.msg_type = $9;
+                  if (gen_level == 5) {
+                      $$.bits2.send_gen5.sfid = 
+                          BRW_MESSAGE_TARGET_DATAPORT_READ;
+                      $$.bits3.generic_gen5.header_present = 1;
+                      $$.bits3.dp_read_gen5.binding_table_index = $3;
+                      $$.bits3.dp_read_gen5.target_cache = $5;
+                      $$.bits3.dp_read_gen5.msg_control = $7;
+                      $$.bits3.dp_read_gen5.msg_type = $9;
+                  } else {
+                      $$.bits3.generic.msg_target =
+                          BRW_MESSAGE_TARGET_DATAPORT_READ;
+                      $$.bits3.dp_read.binding_table_index = $3;
+                      $$.bits3.dp_read.target_cache = $5;
+                      $$.bits3.dp_read.msg_control = $7;
+                      $$.bits3.dp_read.msg_type = $9;
+                  }
 		}
 		| WRITE LPAREN INTEGER COMMA INTEGER COMMA INTEGER COMMA
 		INTEGER RPAREN
 		{
-		  $$.bits3.generic.msg_target =
-		    BRW_MESSAGE_TARGET_DATAPORT_WRITE;
-		  $$.bits3.dp_write.binding_table_index = $3;
-		  /* The msg control field of brw_struct.h is split into
-		   * msg control and pixel_scoreboard_clear, even though
-		   * pixel_scoreboard_clear isn't common to all write messages.
-		   */
-		  $$.bits3.dp_write.pixel_scoreboard_clear = ($5 & 0x8) >> 3;
-		  $$.bits3.dp_write.msg_control = $5 & 0x7;
-		  $$.bits3.dp_write.msg_type = $7;
-		  $$.bits3.dp_write.send_commit_msg = $9;
+                  if (gen_level == 5) {
+                      $$.bits2.send_gen5.sfid =
+                          BRW_MESSAGE_TARGET_DATAPORT_WRITE;
+                      $$.bits3.generic_gen5.header_present = 1;
+                      $$.bits3.dp_write_gen5.binding_table_index = $3;
+                      $$.bits3.dp_write_gen5.pixel_scoreboard_clear = ($5 & 0x8) >> 3;
+                      $$.bits3.dp_write_gen5.msg_control = $5 & 0x7;
+                      $$.bits3.dp_write_gen5.msg_type = $7;
+                      $$.bits3.dp_write_gen5.send_commit_msg = $9;
+                  } else {
+                      $$.bits3.generic.msg_target =
+                          BRW_MESSAGE_TARGET_DATAPORT_WRITE;
+                      $$.bits3.dp_write.binding_table_index = $3;
+                      /* The msg control field of brw_struct.h is split into
+                       * msg control and pixel_scoreboard_clear, even though
+                       * pixel_scoreboard_clear isn't common to all write messages.
+                       */
+                      $$.bits3.dp_write.pixel_scoreboard_clear = ($5 & 0x8) >> 3;
+                      $$.bits3.dp_write.msg_control = $5 & 0x7;
+                      $$.bits3.dp_write.msg_type = $7;
+                      $$.bits3.dp_write.send_commit_msg = $9;
+                  }
 		}
 		| URB INTEGER urb_swizzle urb_allocate urb_used urb_complete
 		{
 		  $$.bits3.generic.msg_target = BRW_MESSAGE_TARGET_URB;
-		  $$.bits3.urb.opcode = BRW_URB_OPCODE_WRITE;
-		  $$.bits3.urb.offset = $2;
-		  $$.bits3.urb.swizzle_control = $3;
-		  $$.bits3.urb.pad = 0;
-		  $$.bits3.urb.allocate = $4;
-		  $$.bits3.urb.used = $5;
-		  $$.bits3.urb.complete = $6;
+                  if (gen_level == 5) {
+                      $$.bits2.send_gen5.sfid = BRW_MESSAGE_TARGET_URB;
+                      $$.bits3.generic_gen5.header_present = 1;
+                      $$.bits3.urb_gen5.opcode = BRW_URB_OPCODE_WRITE;
+                      $$.bits3.urb_gen5.offset = $2;
+                      $$.bits3.urb_gen5.swizzle_control = $3;
+                      $$.bits3.urb_gen5.pad = 0;
+                      $$.bits3.urb_gen5.allocate = $4;
+                      $$.bits3.urb_gen5.used = $5;
+                      $$.bits3.urb_gen5.complete = $6;
+                  } else {
+                      $$.bits3.generic.msg_target = BRW_MESSAGE_TARGET_URB;
+                      $$.bits3.urb.opcode = BRW_URB_OPCODE_WRITE;
+                      $$.bits3.urb.offset = $2;
+                      $$.bits3.urb.swizzle_control = $3;
+                      $$.bits3.urb.pad = 0;
+                      $$.bits3.urb.allocate = $4;
+                      $$.bits3.urb.used = $5;
+                      $$.bits3.urb.complete = $6;
+                  }
 		}
 		| THREAD_SPAWNER  LPAREN INTEGER COMMA INTEGER COMMA
                         INTEGER RPAREN
 		{
 		  $$.bits3.generic.msg_target =
 		    BRW_MESSAGE_TARGET_THREAD_SPAWNER;
-                  $$.bits3.thread_spawner.opcode = $3;
-                  $$.bits3.thread_spawner.requester_type  = $5;
-                  $$.bits3.thread_spawner.resource_select = $7;
+                  if (gen_level == 5) {
+                      $$.bits2.send_gen5.sfid = 
+                          BRW_MESSAGE_TARGET_THREAD_SPAWNER;
+                      $$.bits3.generic_gen5.header_present = 0;
+                      $$.bits3.thread_spawner_gen5.opcode = $3;
+                      $$.bits3.thread_spawner_gen5.requester_type  = $5;
+                      $$.bits3.thread_spawner_gen5.resource_select = $7;
+                  } else {
+                      $$.bits3.generic.msg_target =
+                          BRW_MESSAGE_TARGET_THREAD_SPAWNER;
+                      $$.bits3.thread_spawner.opcode = $3;
+                      $$.bits3.thread_spawner.requester_type  = $5;
+                      $$.bits3.thread_spawner.resource_select = $7;
+                  }
 		}
 ;
 
diff --git a/src/main.c b/src/main.c
index bfaef0e..ab8c87f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -38,6 +38,7 @@ extern FILE *yyin;
 
 extern int errors;
 
+long int gen_level = 4;
 char *input_filename = "<stdin>";
 
 struct brw_program compiled_program;
@@ -48,7 +49,7 @@ static const struct option longopts[] = {
 
 static void usage(void)
 {
-	fprintf(stderr, "usage: intel-gen4asm [-o outputfile] inputfile\n");
+	fprintf(stderr, "usage: intel-gen4asm [-o outputfile] [-g <4|5>] inputfile\n");
 }
 
 int main(int argc, char **argv)
@@ -59,12 +60,24 @@ int main(int argc, char **argv)
 	int err, inst_offset;
 	char o;
 
-	while ((o = getopt_long(argc, argv, "o:", longopts, NULL)) != -1) {
+	while ((o = getopt_long(argc, argv, "o:g:", longopts, NULL)) != -1) {
 		switch (o) {
 		case 'o':
 			if (strcmp(optarg, "-") != 0)
 				output_file = optarg;
 			break;
+
+                case 'g':
+                        if (strcmp(optarg, "-") != 0)
+                                gen_level = strtol(optarg, NULL, 0);
+
+                        if (gen_level < 4 || gen_level > 5) {
+                                usage();
+                                exit(1);
+                        }
+
+                        break;
+
 		default:
 			usage();
 			exit(1);
-- 
1.5.4




More information about the Intel-gfx mailing list