[Mesa-dev] [PATCH 1/2] r600g: add ISA info for RAT instructions

Vadim Girlin vadimgirlin at gmail.com
Sun May 26 15:15:21 PDT 2013


This will help to improve dumps of the compute shaders,
also it will be required for complete handling of RAT instructions in sb.

Signed-off-by: Vadim Girlin <vadimgirlin at gmail.com>
---
 src/gallium/drivers/r600/r600_isa.c |  19 ++++++
 src/gallium/drivers/r600/r600_isa.h | 132 ++++++++++++++++++++++++++++++++++++
 2 files changed, 151 insertions(+)

diff --git a/src/gallium/drivers/r600/r600_isa.c b/src/gallium/drivers/r600/r600_isa.c
index 4c6ccac..c99352f 100644
--- a/src/gallium/drivers/r600/r600_isa.c
+++ b/src/gallium/drivers/r600/r600_isa.c
@@ -81,6 +81,23 @@ int r600_isa_init(struct r600_context *ctx, struct r600_isa *isa) {
 		isa->cf_map[opc] = i + 1;
 	}
 
+	/* RAT instructions are not available on pre-evergreen */
+	if (ctx->chip_class >= EVERGREEN) {
+		unsigned column = isa->hw_class - ISA_CC_EVERGREEN;
+
+		isa->rat_map = calloc(64, sizeof(unsigned));
+		if (!isa->rat_map)
+			return -1;
+
+		for (i = 0; i < TABLE_SIZE(rat_op_table); ++i) {
+			const struct rat_op_info *op = &rat_op_table[i];
+			unsigned opc = op->opcode[column];
+			if (opc == -1)
+				continue;
+			isa->rat_map[opc] = i + 1;
+		}
+	}
+
 	return 0;
 }
 
@@ -97,6 +114,8 @@ int r600_isa_destroy(struct r600_isa *isa) {
 		free(isa->fetch_map);
 	if (isa->cf_map)
 		free(isa->cf_map);
+	if (isa->rat_map)
+		free(isa->rat_map);
 
 	free(isa);
 	return 0;
diff --git a/src/gallium/drivers/r600/r600_isa.h b/src/gallium/drivers/r600/r600_isa.h
index 8cccc9d..4055a04 100644
--- a/src/gallium/drivers/r600/r600_isa.h
+++ b/src/gallium/drivers/r600/r600_isa.h
@@ -147,6 +147,12 @@ enum cf_op_flags
 	CF_LOOP_START = (1<<14)
 };
 
+enum rat_op_flags
+{
+	RF_RTN		= (1 << 0),
+
+};
+
 /* ALU instruction info */
 struct alu_op_info
 {
@@ -182,6 +188,15 @@ struct cf_op_info
 	int flags;
 };
 
+/* CF RAT instruction info */
+struct rat_op_info
+{
+	const char * name;
+	/* 0 - EG, 1 - CM */
+	int opcode[2];
+	int flags;
+};
+
 static const struct alu_op_info alu_op_table[] = {
 		{"ADD",                       2, { 0x00, 0x00 },{  AF_VS, AF_VS, AF_VS, AF_VS},  AF_M_COMM | AF_M_ASSOC },
 		{"MUL",                       2, { 0x01, 0x01 },{  AF_VS, AF_VS, AF_VS, AF_VS},  AF_M_COMM | AF_M_ASSOC },
@@ -665,6 +680,97 @@ static const struct cf_op_info cf_op_table[] = {
 		{"CF_NATIVE",                     { 0x00, 0x00, 0x00, 0x00 },  0  }
 };
 
+static const struct rat_op_info rat_op_table[] = {
+		{"NOP",                     {0x00, 0x00}, 0},
+		{"STORE_TYPED",             {0x01, 0x01}, 0},
+		{"STORE_RAW",               {0x02,   -1}, 0},
+		{"STORE_RAW_FDENORM",       {0x03,   -1}, 0},
+		{"CMPXCHG_INT",             {0x04, 0x00}, 0},
+		{"CMPXCHG_FLT",             {0x05,   -1}, 0},
+		{"CMPXCHG_FDENORM",         {0x06,   -1}, 0},
+		{"ADD",                     {0x07, 0x07}, 0},
+		{"SUB",                     {0x08, 0x08}, 0},
+		{"RSUB",                    {0x09, 0x09}, 0},
+		{"MIN_INT",                 {0x0A, 0x0A}, 0},
+		{"MIN_UINT",                {0x0B, 0x0B}, 0},
+		{"MAX_INT",                 {0x0C, 0x0C}, 0},
+		{"MAX_UINT",                {0x0D, 0x0D}, 0},
+		{"AND",                     {0x0E, 0x0E}, 0},
+		{"OR",                      {0x0F, 0x0F}, 0},
+		{"XOR",                     {0x10, 0x10}, 0},
+		{"MSKOR",                   {0x11,   -1}, 0},
+		{"INC_UINT",                {0x12, 0x12}, 0},
+		{"DEC_UINT",                {0x13, 0x13}, 0},
+
+		{"STORE_DWORD",             {  -1, 0x14}, 0},
+		{"STORE_SHORT",             {  -1, 0x15}, 0},
+		{"STORE_BYTE",              {  -1, 0x16}, 0},
+
+		{"NOP_RTN_INTERNAL",        {0x20, 0x20}, 0},
+
+		{"XCHG_RTN",                {0x22, 0x22}, RF_RTN },
+		{"XCHG_FDENORM_RTN",        {0x23,   -1}, RF_RTN },
+		{"CMPXCHG_INT_RTN",         {0x24, 0x24}, RF_RTN },
+		{"CMPXCHG_FLT_RTN",         {0x25, 0x25}, RF_RTN },
+		{"CMPXCHG_FDENORM_RTN",     {0x26, 0x26}, RF_RTN },
+		{"ADD_RTN",                 {0x27, 0x27}, RF_RTN },
+		{"SUB_RTN",                 {0x28, 0x28}, RF_RTN },
+		{"RSUB_RTN",                {0x29, 0x29}, RF_RTN },
+		{"MIN_INT_RTN",             {0x2A, 0x2A}, RF_RTN },
+		{"MIN_UINT_RTN",            {0x2B, 0x2B}, RF_RTN },
+		{"MAX_INT_RTN",             {0x2C, 0x2C}, RF_RTN },
+		{"MAX_UINT_RTN",            {0x2D, 0x2D}, RF_RTN },
+		{"AND_RTN",                 {0x2E, 0x2E}, RF_RTN },
+		{"OR_RTN",                  {0x2F, 0x2F}, RF_RTN },
+		{"XOR_RTN",                 {0x30, 0x30}, RF_RTN },
+		{"MSKOR_RTN",               {0x31,   -1}, RF_RTN },
+		{"INC_UINT_RTN",            {0x32, 0x32}, RF_RTN },
+		{"DEC_UINT_RTN",            {0x33, 0x33}, RF_RTN },
+};
+
+#define RAT_OP_NOP                   0
+#define RAT_OP_STORE_TYPED           1
+#define RAT_OP_STORE_RAW             2
+#define RAT_OP_STORE_RAW_FDENORM     3
+#define RAT_OP_CMPXCHG_INT           4
+#define RAT_OP_CMPXCHG_FLT           5
+#define RAT_OP_CMPXCHG_FDENORM       6
+#define RAT_OP_ADD                   7
+#define RAT_OP_SUB                   8
+#define RAT_OP_RSUB                  9
+#define RAT_OP_MIN_INT              10
+#define RAT_OP_MIN_UINT             11
+#define RAT_OP_MAX_INT              12
+#define RAT_OP_MAX_UINT             13
+#define RAT_OP_AND                  14
+#define RAT_OP_OR                   15
+#define RAT_OP_XOR                  16
+#define RAT_OP_MSKOR                17
+#define RAT_OP_INC_UINT             18
+#define RAT_OP_DEC_UINT             19
+#define RAT_OP_STORE_DWORD          20
+#define RAT_OP_STORE_SHORT          21
+#define RAT_OP_STORE_BYTE           22
+#define RAT_OP_NOP_RTN_INTERNAL     23
+#define RAT_OP_XCHG_RTN             24
+#define RAT_OP_XCHG_FDENORM_RTN     25
+#define RAT_OP_CMPXCHG_INT_RTN      26
+#define RAT_OP_CMPXCHG_FLT_RTN      27
+#define RAT_OP_CMPXCHG_FDENORM_RTN  28
+#define RAT_OP_ADD_RTN              29
+#define RAT_OP_SUB_RTN              30
+#define RAT_OP_RSUB_RTN             31
+#define RAT_OP_MIN_INT_RTN          32
+#define RAT_OP_MIN_UINT_RTN         33
+#define RAT_OP_MAX_INT_RTN          34
+#define RAT_OP_MAX_UINT_RTN         35
+#define RAT_OP_AND_RTN              36
+#define RAT_OP_OR_RTN               37
+#define RAT_OP_XOR_RTN              38
+#define RAT_OP_MSKOR_RTN            39
+#define RAT_OP_INC_UINT_RTN         40
+#define RAT_OP_DEC_UINT_RTN         41
+
 
 #define ALU_OP2_ADD                             0
 #define ALU_OP2_MUL                             1
@@ -1143,6 +1249,7 @@ struct r600_isa {
 	unsigned *alu_op3_map;
 	unsigned *fetch_map;
 	unsigned *cf_map;
+	unsigned *rat_map;
 };
 
 struct r600_context;
@@ -1170,6 +1277,12 @@ r600_isa_cf(unsigned op) {
 	return &cf_op_table[op];
 }
 
+static inline const struct rat_op_info *
+r600_isa_rat(unsigned op) {
+	assert (op < TABLE_SIZE(rat_op_table));
+	return &rat_op_table[op];
+}
+
 static inline unsigned
 r600_isa_alu_opcode(enum r600_chip_class chip_class, unsigned op) {
 	int opc =  r600_isa_alu(op)->opcode[chip_class >> 1];
@@ -1199,6 +1312,15 @@ r600_isa_cf_opcode(enum r600_chip_class chip_class, unsigned op) {
 }
 
 static inline unsigned
+r600_isa_rat_opcode(enum r600_chip_class chip_class, unsigned op) {
+	int opc;
+	assert(chip_class >= ISA_CC_EVERGREEN);
+	opc = r600_isa_cf(op)->opcode[chip_class - ISA_CC_EVERGREEN];
+	assert(opc != -1);
+	return opc;
+}
+
+static inline unsigned
 r600_isa_alu_by_opcode(struct r600_isa* isa, unsigned opcode, unsigned is_op3) {
 	unsigned op;
 	if (is_op3) {
@@ -1222,6 +1344,16 @@ r600_isa_fetch_by_opcode(struct r600_isa* isa, unsigned opcode) {
 }
 
 static inline unsigned
+r600_isa_rat_by_opcode(struct r600_isa* isa, unsigned opcode) {
+	unsigned op;
+	assert(isa->rat_map);
+	op = isa->rat_map[opcode];
+	assert(op);
+	return op - 1;
+}
+
+
+static inline unsigned
 r600_isa_cf_by_opcode(struct r600_isa* isa, unsigned opcode, unsigned is_alu) {
 	unsigned op;
 	assert(isa->cf_map);
-- 
1.8.2.1



More information about the mesa-dev mailing list