Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> --- src/intel/tools/disasm.c | 34 ++++++++++++++++++++++++++++++++++ src/intel/tools/gen_disasm.h | 2 ++ 2 files changed, 36 insertions(+)
diff --git a/src/intel/tools/disasm.c b/src/intel/tools/disasm.c index 251acd313dc..fbf4f9e8999 100644 --- a/src/intel/tools/disasm.c +++ b/src/intel/tools/disasm.c @@ -26,6 +26,8 @@ #include "compiler/brw_inst.h" #include "compiler/brw_eu.h" +#include "common/gen_decoder.h" + #include "gen_disasm.h" uint64_t INTEL_DEBUG; @@ -43,6 +45,38 @@ is_send(uint32_t opcode) opcode == BRW_OPCODE_SENDSC ); } +uint32_t +gen_disasm_get_assembly_size(struct gen_disasm *disasm, + const struct gen_dword_reader *reader) +{ + struct gen_device_info *devinfo = &disasm->devinfo; + uint32_t size = 0; + + /* This loop exits when send-with-EOT or when opcode is 0 */ + while (true) { + union { + brw_inst insn; + uint32_t data[sizeof(brw_inst) / sizeof(uint32_t)]; + } data; + for (int i = 0; i < ARRAY_SIZE(data.data); i++) + data.data[i] = gen_read_dword(reader, size / 4 + i); + + if (brw_inst_cmpt_control(devinfo, &data.insn)) { + size += 8; + } else { + size += 16; + } + + /* Simplistic, but efficient way to terminate disasm */ + uint32_t opcode = brw_inst_opcode(devinfo, &data.insn); + if (opcode == 0 || (is_send(opcode) && brw_inst_eot(devinfo, &data.insn))) { + break; + } + } + + return size; +} + static int gen_disasm_find_end(struct gen_disasm *disasm, void *assembly, int start) { diff --git a/src/intel/tools/gen_disasm.h b/src/intel/tools/gen_disasm.h index d2764bb90b7..bf72759f410 100644 --- a/src/intel/tools/gen_disasm.h +++ b/src/intel/tools/gen_disasm.h @@ -31,6 +31,8 @@ extern "C" { struct gen_disasm; struct gen_disasm *gen_disasm_create(int pciid); +uint32_t gen_disasm_get_assembly_size(struct gen_disasm *disasm, + const struct gen_dword_reader *reader); void gen_disasm_disassemble(struct gen_disasm *disasm, void *assembly, int start, FILE *out); -- 2.15.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev