pan/bi: Print the clause of branch targets
authorIcecream95 <ixn@disroot.org>
Fri, 30 Jul 2021 23:57:38 +0000 (11:57 +1200)
committerMarge Bot <eric+marge@anholt.net>
Sun, 1 Aug 2021 13:04:20 +0000 (13:04 +0000)
Rather than just printing an offset such as '(pc + 192)', print the
target of branches as a clause number that matches up with the clause
headers printed by disassemble_bifrost.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12153>

src/panfrost/bifrost/disassemble.c
src/panfrost/bifrost/disassemble.h
src/panfrost/bifrost/gen_disasm.py

index 3609d8f..392974e 100644 (file)
@@ -241,7 +241,7 @@ static void dump_const_imm(FILE *fp, uint32_t imm)
 }
 
 static void
-dump_pc_imm(FILE *fp, uint64_t imm, enum bi_constmod mod, bool high32)
+dump_pc_imm(FILE *fp, uint64_t imm, unsigned branch_offset, enum bi_constmod mod, bool high32)
 {
         if (mod == BI_CONSTMOD_PC_HI && !high32) {
                 dump_const_imm(fp, imm);
@@ -276,7 +276,8 @@ dump_pc_imm(FILE *fp, uint64_t imm, enum bi_constmod mod, bool high32)
                 unreachable("Invalid PC modifier");
         }
 
-        fprintf(fp, "(pc + %" PRId64 ")", offs);
+        assert((offs & 15) == 0);
+        fprintf(fp, "clause_%" PRId64, branch_offset + (offs / 16));
 
         if (mod == BI_CONSTMOD_PC_LO && high32)
                 fprintf(fp, " >> 32");
@@ -301,7 +302,7 @@ const_fau_to_idx(unsigned fau_value)
         return map[fau_value];
 }
 
-static void dump_fau_src(FILE *fp, struct bifrost_regs srcs, struct bi_constants *consts, bool high32)
+static void dump_fau_src(FILE *fp, struct bifrost_regs srcs, unsigned branch_offset, struct bi_constants *consts, bool high32)
 {
         if (srcs.fau_idx & 0x80) {
                 unsigned uniform = (srcs.fau_idx & 0x7f);
@@ -311,7 +312,7 @@ static void dump_fau_src(FILE *fp, struct bifrost_regs srcs, struct bi_constants
                 uint64_t imm = consts->raw[idx];
                 imm |= (srcs.fau_idx & 0xf);
                 if (consts->mods[idx] != BI_CONSTMOD_NONE)
-                        dump_pc_imm(fp, imm, consts->mods[idx], high32);
+                        dump_pc_imm(fp, imm, branch_offset, consts->mods[idx], high32);
                 else if (high32)
                         dump_const_imm(fp, imm >> 32);
                 else
@@ -362,7 +363,7 @@ static void dump_fau_src(FILE *fp, struct bifrost_regs srcs, struct bi_constants
 }
 
 void
-dump_src(FILE *fp, unsigned src, struct bifrost_regs srcs, struct bi_constants *consts, bool isFMA)
+dump_src(FILE *fp, unsigned src, struct bifrost_regs srcs, unsigned branch_offset, struct bi_constants *consts, bool isFMA)
 {
         switch (src) {
         case 0:
@@ -381,10 +382,10 @@ dump_src(FILE *fp, unsigned src, struct bifrost_regs srcs, struct bi_constants *
                         fprintf(fp, "t"); // i.e. the output of FMA this cycle
                 break;
         case 4:
-                dump_fau_src(fp, srcs, consts, false);
+                dump_fau_src(fp, srcs, branch_offset, consts, false);
                 break;
         case 5:
-                dump_fau_src(fp, srcs, consts, true);
+                dump_fau_src(fp, srcs, branch_offset, consts, true);
                 break;
         case 6:
                 fprintf(fp, "t0");
index 6eb3726..1e39c20 100644 (file)
@@ -42,6 +42,6 @@ void bi_disasm_add(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bi
 void bi_disasm_dest_fma(FILE *fp, struct bifrost_regs *next_regs, bool first);
 void bi_disasm_dest_add(FILE *fp, struct bifrost_regs *next_regs, bool first);
 
-void dump_src(FILE *fp, unsigned src, struct bifrost_regs srcs, struct bi_constants *consts, bool isFMA);
+void dump_src(FILE *fp, unsigned src, struct bifrost_regs srcs, unsigned branch_offset, struct bi_constants *consts, bool isFMA);
 
 #endif
index 11acf5a..01ab629 100644 (file)
@@ -326,7 +326,7 @@ def disasm_op(name, op):
 
     for i, (pos, mask) in enumerate(srcs):
         body += '    fputs(", ", fp);\n'
-        body += '    dump_src(fp, _BITS(bits, {}, 3), *srcs, consts, {});\n'.format(pos, "true" if is_fma else "false")
+        body += '    dump_src(fp, _BITS(bits, {}, 3), *srcs, branch_offset, consts, {});\n'.format(pos, "true" if is_fma else "false")
 
         # Error check if needed
         if (mask != 0xFF):