[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