From: "Lonnberg, Toni" <toni.lonnb...@intel.com> Shader instructions which use UIP/JIP now get formatted with a label instead of an immediate value if the "disasm" flag has been set in the INTEL_DEBUG debug flags, and the jump targets themselves also get printed as labels into the shader disassembly. --- src/intel/tools/disasm.c | 49 ++++++++++++++++++++-- src/mesa/drivers/dri/i965/brw_context.h | 3 +- src/mesa/drivers/dri/i965/brw_disasm.c | 56 +++++++++++++++++++++----- src/mesa/drivers/dri/i965/brw_eu.c | 41 +++++++++++++++++-- src/mesa/drivers/dri/i965/brw_eu_compact.c | 4 +- src/mesa/drivers/dri/i965/brw_fs_generator.cpp | 10 ++++- src/mesa/drivers/dri/i965/test_eu_compact.c | 2 +- 7 files changed, 142 insertions(+), 23 deletions(-)
diff --git a/src/intel/tools/disasm.c b/src/intel/tools/disasm.c index 4ac7b90..0865718 100644 --- a/src/intel/tools/disasm.c +++ b/src/intel/tools/disasm.c @@ -49,13 +49,53 @@ gen_disasm_disassemble(struct gen_disasm *disasm, void *assembly, int start, FILE *out) { struct gen_device_info *devinfo = &disasm->devinfo; - bool dump_hex = false; + bool dump_hex = (INTEL_DEBUG & DEBUG_HEX) != 0; int offset = start; + void *mem_ctx = ralloc_context(NULL); + struct brw_label *root = NULL; + + if ((INTEL_DEBUG & DEBUG_DISASM) != 0) { + while (true) { + brw_inst *insn = assembly + offset; + brw_inst uncompacted; + + bool compacted = brw_inst_cmpt_control(devinfo, insn); + + if (compacted) { + brw_compact_inst *compacted = (void *)insn; + brw_uncompact_instruction(devinfo, &uncompacted, compacted); + insn = &uncompacted; + } + + if (brw_has_uip(devinfo, brw_inst_opcode(devinfo, insn))) + brw_create_label(&root, offset + brw_inst_uip(devinfo, insn), mem_ctx); + + if (brw_has_jip(devinfo, brw_inst_opcode(devinfo, insn))) + brw_create_label(&root, offset + brw_inst_jip(devinfo, insn), mem_ctx); + + offset += compacted ? 8 : 16; + + uint32_t opcode = brw_inst_opcode(devinfo, insn); + if (opcode == 0 || (is_send(opcode) && brw_inst_eot(devinfo, insn))) { + break; + } + } + } + /* This loop exits when send-with-EOT or when opcode is 0 */ + offset = start; while (true) { brw_inst *insn = assembly + offset; brw_inst uncompacted; + + if (root != NULL) { + const struct brw_label *label = brw_find_label(root, offset); + if (label != NULL) { + fprintf(out, "\n_label%d:\n", label->number); + } + } + bool compacted = brw_inst_cmpt_control(devinfo, insn); if (0) fprintf(out, "0x%08x: ", offset); @@ -70,7 +110,6 @@ gen_disasm_disassemble(struct gen_disasm *disasm, void *assembly, brw_uncompact_instruction(devinfo, &uncompacted, compacted); insn = &uncompacted; - offset += 8; } else { if (dump_hex) { fprintf(out, "0x%08x 0x%08x 0x%08x 0x%08x ", @@ -79,10 +118,10 @@ gen_disasm_disassemble(struct gen_disasm *disasm, void *assembly, ((uint32_t *)insn)[1], ((uint32_t *)insn)[0]); } - offset += 16; } - brw_disassemble_inst(out, devinfo, insn, compacted); + brw_disassemble_inst(out, devinfo, insn, compacted, offset, root); + offset += compacted ? 8 : 16; /* Simplistic, but efficient way to terminate disasm */ uint32_t opcode = brw_inst_opcode(devinfo, insn); @@ -90,6 +129,8 @@ gen_disasm_disassemble(struct gen_disasm *disasm, void *assembly, break; } } + + ralloc_free(mem_ctx); } struct gen_disasm * diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index ec5c16c..850d882 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1367,7 +1367,8 @@ void brw_vec4_alloc_reg_set(struct brw_compiler *compiler); /* brw_disasm.c */ int brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo, - struct brw_inst *inst, bool is_compacted); + struct brw_inst *inst, bool is_compacted, + int offset, struct brw_label *label_root); /* brw_vs.c */ gl_clip_plane *brw_select_clip_planes(struct gl_context *ctx); diff --git a/src/mesa/drivers/dri/i965/brw_disasm.c b/src/mesa/drivers/dri/i965/brw_disasm.c index 458e0db..6df3bd1 100644 --- a/src/mesa/drivers/dri/i965/brw_disasm.c +++ b/src/mesa/drivers/dri/i965/brw_disasm.c @@ -1218,13 +1218,14 @@ brw_disassemble_imm(const struct gen_device_info *devinfo, brw_inst inst; inst.data[0] = (((uint64_t) dw1) << 32) | ((uint64_t) dw0); inst.data[1] = (((uint64_t) dw3) << 32) | ((uint64_t) dw2); - return brw_disassemble_inst(stderr, devinfo, &inst, false); + return brw_disassemble_inst(stderr, devinfo, &inst, false, 0, NULL); } #endif int brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo, - brw_inst *inst, bool is_compacted) + brw_inst *inst, bool is_compacted, + int offset, struct brw_label *label_root) { int err = 0; int space = 0; @@ -1291,16 +1292,51 @@ brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo, if (brw_has_uip(devinfo, opcode)) { /* Instructions that have UIP also have JIP. */ - pad(file, 16); - format(file, "JIP: %d", brw_inst_jip(devinfo, inst)); - pad(file, 32); - format(file, "UIP: %d", brw_inst_uip(devinfo, inst)); - } else if (brw_has_jip(devinfo, opcode)) { - pad(file, 16); - if (devinfo->gen >= 7) { + if (label_root != NULL) { + const struct brw_label *branch = NULL; + + pad(file, 16); + branch = brw_find_label(label_root, offset + brw_inst_jip(devinfo, inst)); + if (branch != NULL) + format(file, "_label%d", branch->number); + else + format(file, "JIP: %d", brw_inst_jip(devinfo, inst)); + + pad(file, 32); + branch = brw_find_label(label_root, offset + brw_inst_uip(devinfo, inst)); + if (branch != NULL) + format(file, "_label%d", branch->number); + else + format(file, "UIP: %d", brw_inst_uip(devinfo, inst)); + } else { + pad(file, 16); format(file, "JIP: %d", brw_inst_jip(devinfo, inst)); + pad(file, 32); + format(file, "UIP: %d", brw_inst_uip(devinfo, inst)); + } + } else if (brw_has_jip(devinfo, opcode)) { + if (label_root != NULL) { + const struct brw_label *branch = NULL; + int jip; + + if (devinfo->gen >= 7) + jip = brw_inst_jip(devinfo, inst); + else + jip = brw_inst_gen6_jump_count(devinfo, inst); + + pad(file, 16); + branch = brw_find_label(label_root, offset + jip); + if (branch != NULL) + format(file, "_label%d", branch->number); + else + format(file, "JIP: %d", jip); } else { - format(file, "JIP: %d", brw_inst_gen6_jump_count(devinfo, inst)); + pad(file, 16); + if (devinfo->gen >= 7) { + format(file, "JIP: %d", brw_inst_jip(devinfo, inst)); + } else { + format(file, "JIP: %d", brw_inst_gen6_jump_count(devinfo, inst)); + } } } else if (devinfo->gen < 6 && (opcode == BRW_OPCODE_BREAK || opcode == BRW_OPCODE_CONTINUE || diff --git a/src/mesa/drivers/dri/i965/brw_eu.c b/src/mesa/drivers/dri/i965/brw_eu.c index 1061799..5104e55 100644 --- a/src/mesa/drivers/dri/i965/brw_eu.c +++ b/src/mesa/drivers/dri/i965/brw_eu.c @@ -417,9 +417,43 @@ brw_disassemble(const struct gen_device_info *devinfo, { bool dump_hex = (INTEL_DEBUG & DEBUG_HEX) != 0; + void *mem_ctx = ralloc_context(NULL); + struct brw_label *root = NULL; + + if ((INTEL_DEBUG & DEBUG_DISASM) != 0) { + for (int offset = start; offset < end;) { + brw_inst *insn = assembly + offset; + brw_inst uncompacted; + + bool compacted = brw_inst_cmpt_control(devinfo, insn); + + if (compacted) { + brw_compact_inst *compacted = (void *)insn; + brw_uncompact_instruction(devinfo, &uncompacted, compacted); + insn = &uncompacted; + } + + if (brw_has_uip(devinfo, brw_inst_opcode(devinfo, insn))) + brw_create_label(&root, offset + brw_inst_uip(devinfo, insn), mem_ctx); + + if (brw_has_jip(devinfo, brw_inst_opcode(devinfo, insn))) + brw_create_label(&root, offset + brw_inst_jip(devinfo, insn), mem_ctx); + + offset += compacted ? 8 : 16; + } + } + for (int offset = start; offset < end;) { brw_inst *insn = assembly + offset; brw_inst uncompacted; + + if (root != NULL) { + const struct brw_label *label = brw_find_label(root, offset); + if (label != NULL) { + fprintf(out, "\n_label%d:\n", label->number); + } + } + bool compacted = brw_inst_cmpt_control(devinfo, insn); if (0) fprintf(out, "0x%08x: ", offset); @@ -434,7 +468,6 @@ brw_disassemble(const struct gen_device_info *devinfo, brw_uncompact_instruction(devinfo, &uncompacted, compacted); insn = &uncompacted; - offset += 8; } else { if (dump_hex) { fprintf(out, "0x%08x 0x%08x 0x%08x 0x%08x ", @@ -443,11 +476,13 @@ brw_disassemble(const struct gen_device_info *devinfo, ((uint32_t *)insn)[1], ((uint32_t *)insn)[0]); } - offset += 16; } - brw_disassemble_inst(out, devinfo, insn, compacted); + brw_disassemble_inst(out, devinfo, insn, compacted, offset, root); + offset += compacted ? 8 : 16; } + + ralloc_free(mem_ctx); } enum gen { diff --git a/src/mesa/drivers/dri/i965/brw_eu_compact.c b/src/mesa/drivers/dri/i965/brw_eu_compact.c index 68321e7..d20c6d1 100644 --- a/src/mesa/drivers/dri/i965/brw_eu_compact.c +++ b/src/mesa/drivers/dri/i965/brw_eu_compact.c @@ -1262,10 +1262,10 @@ void brw_debug_compact_uncompact(const struct gen_device_info *devinfo, devinfo->gen); fprintf(stderr, " before: "); - brw_disassemble_inst(stderr, devinfo, orig, true); + brw_disassemble_inst(stderr, devinfo, orig, true, 0, NULL); fprintf(stderr, " after: "); - brw_disassemble_inst(stderr, devinfo, uncompacted, false); + brw_disassemble_inst(stderr, devinfo, uncompacted, false, 0, NULL); uint32_t *before_bits = (uint32_t *)orig; uint32_t *after_bits = (uint32_t *)uncompacted; diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp index 26ffbb1..6ea6ca8 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp @@ -2101,8 +2101,14 @@ fs_generator::generate_code(const cfg_t *cfg, int dispatch_width) spill_count, fill_count, promoted_constants, before_size, after_size, 100.0f * (before_size - after_size) / before_size); - dump_assembly(p->store, annotation.ann_count, annotation.ann, - p->devinfo); + if ((INTEL_DEBUG & DEBUG_DISASM) != 0) { + brw_disassemble(p->devinfo, p->store, start_offset, start_offset + after_size, stderr); + fprintf(stderr, "\n"); + } else { + dump_assembly(p->store, annotation.ann_count, annotation.ann, + p->devinfo); + } + ralloc_free(annotation.mem_ctx); } assert(validated); diff --git a/src/mesa/drivers/dri/i965/test_eu_compact.c b/src/mesa/drivers/dri/i965/test_eu_compact.c index 874412c..aa9cd99 100644 --- a/src/mesa/drivers/dri/i965/test_eu_compact.c +++ b/src/mesa/drivers/dri/i965/test_eu_compact.c @@ -49,7 +49,7 @@ test_compact_instruction(struct brw_codegen *p, brw_inst src) if (memcmp(&unchanged, &dst, sizeof(dst))) { fprintf(stderr, "Failed to compact, but dst changed\n"); fprintf(stderr, " Instruction: "); - brw_disassemble_inst(stderr, p->devinfo, &src, false); + brw_disassemble_inst(stderr, p->devinfo, &src, false, NULL); return false; } } -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev