summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2014-03-31 09:23:24 -0700
committerEric Anholt <eric@anholt.net>2014-04-11 13:38:53 -0700
commit7e034a8d778a918854c4b4d5cbe205f1f31e7ece (patch)
treef24d53a788efe63cc082c10f5856e92dcca36fc6
parent99442bc7b20e4d76a5bdff72821e86a7ff5942ab (diff)
i965: Fill in a bunch of gen7/hsw data cache-related disasm.
This gets us disasm of atomic ops. v2: Fix fallthrough on pre-gen7. (bug caught by Ilia Mirkin). Reviewed-by: Matt Turner <mattst88@gmail.com>
-rw-r--r--src/mesa/drivers/dri/i965/brw_disasm.c110
1 files changed, 103 insertions, 7 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_disasm.c b/src/mesa/drivers/dri/i965/brw_disasm.c
index 8cd8a40792e..88bf24e17ee 100644
--- a/src/mesa/drivers/dri/i965/brw_disasm.c
+++ b/src/mesa/drivers/dri/i965/brw_disasm.c
@@ -309,7 +309,8 @@ static const char * const target_function[16] = {
[BRW_SFID_DATAPORT_READ] = "read",
[BRW_SFID_DATAPORT_WRITE] = "write",
[BRW_SFID_URB] = "urb",
- [BRW_SFID_THREAD_SPAWNER] = "thread_spawner"
+ [BRW_SFID_THREAD_SPAWNER] = "thread_spawner",
+ [BRW_SFID_VME] = "vme",
};
static const char * const target_function_gen6[16] = {
@@ -322,7 +323,10 @@ static const char * const target_function_gen6[16] = {
[GEN6_SFID_DATAPORT_SAMPLER_CACHE] = "sampler",
[GEN6_SFID_DATAPORT_RENDER_CACHE] = "render",
[GEN6_SFID_DATAPORT_CONSTANT_CACHE] = "const",
- [GEN7_SFID_DATAPORT_DATA_CACHE] = "data"
+ [GEN7_SFID_DATAPORT_DATA_CACHE] = "data",
+ [GEN7_SFID_PIXEL_INTERPOLATOR] = "pixel interp",
+ [HSW_SFID_DATAPORT_DATA_CACHE_1] = "dp data 1",
+ [HSW_SFID_CRE] = "cre",
};
static const char * const dp_rc_msg_type_gen6[16] = {
@@ -342,6 +346,54 @@ static const char * const dp_rc_msg_type_gen6[16] = {
[GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_UNORM_WRITE] = "RT UNORMc write",
};
+static const char *const dp_dc0_msg_type_gen7[16] = {
+ [GEN7_DATAPORT_DC_OWORD_BLOCK_READ] = "DC OWORD block read",
+ [GEN7_DATAPORT_DC_UNALIGNED_OWORD_BLOCK_READ] = "DC unaligned OWORD block read",
+ [GEN7_DATAPORT_DC_OWORD_DUAL_BLOCK_READ] = "DC OWORD dual block read",
+ [GEN7_DATAPORT_DC_DWORD_SCATTERED_READ] = "DC DWORD scattered read",
+ [GEN7_DATAPORT_DC_BYTE_SCATTERED_READ] = "DC byte scattered read",
+ [GEN7_DATAPORT_DC_UNTYPED_ATOMIC_OP] = "DC untyped atomic",
+ [GEN7_DATAPORT_DC_MEMORY_FENCE] = "DC mfence",
+ [GEN7_DATAPORT_DC_OWORD_BLOCK_WRITE] = "DC OWORD block write",
+ [GEN7_DATAPORT_DC_OWORD_DUAL_BLOCK_WRITE] = "DC OWORD dual block write",
+ [GEN7_DATAPORT_DC_DWORD_SCATTERED_WRITE] = "DC DWORD scatterd write",
+ [GEN7_DATAPORT_DC_BYTE_SCATTERED_WRITE] = "DC byte scattered write",
+ [GEN7_DATAPORT_DC_UNTYPED_SURFACE_WRITE] = "DC untyped surface write",
+};
+
+static const char *const dp_dc1_msg_type_hsw[16] = {
+ [HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_READ] = "untyped surface read",
+ [HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP] = "DC untyped atomic op",
+ [HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP_SIMD4X2] = "DC untyped 4x2 atomic op",
+ [HSW_DATAPORT_DC_PORT1_MEDIA_BLOCK_READ] = "DC media block read",
+ [HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_READ] = "DC typed surface read",
+ [HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP] = "DC typed atomic",
+ [HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP_SIMD4X2] = "DC typed 4x2 atomic op",
+ [HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_WRITE] = "DC untyped surface write",
+ [HSW_DATAPORT_DC_PORT1_MEDIA_BLOCK_WRITE] = "DC media block write",
+ [HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP] = "DC atomic counter op",
+ [HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP_SIMD4X2] = "DC 4x2 atomic counter op",
+ [HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_WRITE] = "DC typed surface write",
+};
+
+static const char * const aop[16] = {
+ [BRW_AOP_AND] = "and",
+ [BRW_AOP_OR] = "or",
+ [BRW_AOP_XOR] = "xoo",
+ [BRW_AOP_MOV] = "mov",
+ [BRW_AOP_INC] = "inc",
+ [BRW_AOP_DEC] = "dec",
+ [BRW_AOP_ADD] = "add",
+ [BRW_AOP_SUB] = "sub",
+ [BRW_AOP_REVSUB] = "revsub",
+ [BRW_AOP_IMAX] = "imax",
+ [BRW_AOP_IMIN] = "imin",
+ [BRW_AOP_UMAX] = "umax",
+ [BRW_AOP_UMIN] = "umin",
+ [BRW_AOP_CMPWR] = "cmpwr",
+ [BRW_AOP_PREDEC] = "predec",
+};
+
static const char * const math_function[16] = {
[BRW_MATH_FUNCTION_INV] = "inv",
[BRW_MATH_FUNCTION_LOG] = "log",
@@ -1312,12 +1364,56 @@ int brw_disasm (FILE *file, struct brw_instruction *inst, int gen)
case BRW_SFID_THREAD_SPAWNER:
break;
case GEN7_SFID_DATAPORT_DATA_CACHE:
- format (file, " (%d, %d, %d)",
- inst->bits3.gen7_dp.binding_table_index,
- inst->bits3.gen7_dp.msg_control,
- inst->bits3.gen7_dp.msg_type);
- break;
+ if (gen >= 7) {
+ format (file, " (");
+
+ err |= control (file, "DP DC0 message type",
+ dp_dc0_msg_type_gen7,
+ inst->bits3.gen7_dp.msg_type, &space);
+
+ format (file, ", %d, ", inst->bits3.gen7_dp.binding_table_index);
+
+ switch (inst->bits3.gen7_dp.msg_type) {
+ case GEN7_DATAPORT_DC_UNTYPED_ATOMIC_OP:
+ control (file, "atomic op", aop, inst->bits3.ud >> 8 & 0xf,
+ &space);
+ break;
+ default:
+ format (file, "%d", inst->bits3.gen7_dp.msg_control);
+ }
+ format (file, ")");
+ break;
+ }
+ /* FALLTHROUGH */
+
+ case HSW_SFID_DATAPORT_DATA_CACHE_1:
+ if (gen >= 7) {
+ format (file, " (");
+
+ err |= control (file, "DP DC1 message type",
+ dp_dc1_msg_type_hsw,
+ inst->bits3.gen7_dp.msg_type, &space);
+ format (file, ", %d, ",
+ inst->bits3.gen7_dp.binding_table_index);
+
+ switch (inst->bits3.gen7_dp.msg_type) {
+ case HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP:
+ case HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP_SIMD4X2:
+ case HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP:
+ case HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP_SIMD4X2:
+ case HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP:
+ case HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP_SIMD4X2:
+ control (file, "atomic op", aop,
+ inst->bits3.ud >> 8 & 0xf, &space);
+ break;
+ default:
+ format (file, "%d", inst->bits3.gen7_dp.msg_control);
+ }
+ format (file, ")");
+ break;
+ }
+ /* FALLTHROUGH */
default:
format (file, "unsupported target %d", target);