diff options
Diffstat (limited to 'src/panfrost/midgard/disassemble.c')
-rw-r--r-- | src/panfrost/midgard/disassemble.c | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/src/panfrost/midgard/disassemble.c b/src/panfrost/midgard/disassemble.c index 8f2020c4c4c..382b4af7cbf 100644 --- a/src/panfrost/midgard/disassemble.c +++ b/src/panfrost/midgard/disassemble.c @@ -42,6 +42,10 @@ static bool is_instruction_int = false; +/* Stats */ + +static unsigned nr_ins = 0; + /* Prints a short form of the tag for branching, the minimum needed to be * legible and unambiguous */ @@ -541,6 +545,7 @@ print_vector_field(const char *name, uint16_t *words, uint16_t reg_word, reg_info->src2_reg, override, is_int); } + nr_ins++; printf("\n"); } @@ -621,6 +626,7 @@ print_scalar_field(const char *name, uint16_t *words, uint16_t reg_word, } else print_scalar_src(alu_field->src2, reg_info->src2_reg); + nr_ins++; printf("\n"); } @@ -728,6 +734,8 @@ print_compact_branch_writeout_field(uint16_t word) break; } } + + nr_ins++; } static void @@ -764,6 +772,8 @@ print_extended_branch_writeout_field(uint8_t *words) printf("%d -> ", br.offset); print_tag_short(br.dest_tag); printf("\n"); + + nr_ins++; } static unsigned @@ -1034,6 +1044,8 @@ print_load_store_instr(uint64_t data, printf(", "); print_load_store_arg(word->arg_2, 1); printf(" /* %X */\n", word->varying_parameters); + + nr_ins++; } static void @@ -1291,10 +1303,12 @@ print_texture_word(uint32_t *word, unsigned tabs) printf("// unknownA = 0x%x\n", texture->unknownA); printf("// unknown8 = 0x%x\n", texture->unknown8); } + + nr_ins++; } void -disassemble_midgard(uint8_t *code, size_t size) +disassemble_midgard(uint8_t *code, size_t size, bool stats, unsigned nr_registers) { uint32_t *words = (uint32_t *) code; unsigned num_words = size / 4; @@ -1306,6 +1320,11 @@ disassemble_midgard(uint8_t *code, size_t size) unsigned i = 0; + /* Stats for shader-db */ + unsigned nr_bundles = 0; + unsigned nr_quadwords = 0; + nr_ins = 0; + while (i < num_words) { unsigned tag = words[i] & 0xF; unsigned next_tag = (words[i] >> 4) & 0xF; @@ -1361,6 +1380,10 @@ disassemble_midgard(uint8_t *code, size_t size) i += 4 * num_quad_words; + /* We are parsing per bundle anyway */ + nr_bundles++; + nr_quadwords += num_quad_words; + /* Break based on instruction prefetch flag */ if (i < num_words && next == 1) { @@ -1371,5 +1394,18 @@ disassemble_midgard(uint8_t *code, size_t size) } } - return; + if (stats) { + unsigned nr_threads = + (nr_registers <= 4) ? 4 : + (nr_registers <= 8) ? 2 : + 1; + + printf("%s shader: " + "%u inst, %u bundles, %u quadwords, " + "%u registers, %u threads, 0 loops\n", + "FRAGMENT", /* TODO */ + nr_ins, nr_bundles, nr_quadwords, + nr_registers, nr_threads); + + } } |