From 492ef353fb3e48e77469d7787d3fd2d3d8d9202d Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Sun, 8 Mar 2020 16:38:21 -0700 Subject: [PATCH] lima/gpir: improve disassembler output Print each op at new line and add unit name suffix for each op. It improves readability a bit and gives us a hint what unit was used for particular op. Reviewed-by: Andreas Baierl Signed-off-by: Vasily Khoruzhick Part-of: --- src/gallium/drivers/lima/ir/gp/disasm.c | 123 +++++++++++++++--------- 1 file changed, 78 insertions(+), 45 deletions(-) diff --git a/src/gallium/drivers/lima/ir/gp/disasm.c b/src/gallium/drivers/lima/ir/gp/disasm.c index 6b5186fa633..87fdded3f2d 100644 --- a/src/gallium/drivers/lima/ir/gp/disasm.c +++ b/src/gallium/drivers/lima/ir/gp/disasm.c @@ -243,27 +243,31 @@ print_src(gpir_codegen_src src, gp_unit unit, unsigned unit_src_num, } } -static void +static bool print_mul(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, unsigned cur_dest_index) { + bool printed = false; + switch (instr->mul_op) { case gpir_codegen_mul_op_mul: case gpir_codegen_mul_op_complex2: if (instr->mul0_src0 != gpir_codegen_src_unused && instr->mul0_src1 != gpir_codegen_src_unused) { + printed = true; + printf("\t"); if (instr->mul0_src1 == gpir_codegen_src_ident && !instr->mul0_neg) { - printf("mov "); + printf("mov.m0 "); print_dest(instr, unit_mul_0, cur_dest_index); printf(" "); print_src(instr->mul0_src0, unit_mul_0, 0, instr, prev_instr, cur_dest_index); } else { if (instr->mul_op == gpir_codegen_mul_op_complex2) - printf("complex2 "); + printf("complex2.m0 "); else - printf("mul "); + printf("mul.m0 "); print_dest(instr, unit_mul_0, cur_dest_index); printf(" "); @@ -276,20 +280,22 @@ print_mul(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, cur_dest_index); } - printf(", "); + printf("\n"); } if (instr->mul1_src0 != gpir_codegen_src_unused && instr->mul1_src1 != gpir_codegen_src_unused) { + printed = true; + printf("\t"); if (instr->mul1_src1 == gpir_codegen_src_ident && !instr->mul1_neg) { - printf("mov "); + printf("mov.m1 "); print_dest(instr, unit_mul_1, cur_dest_index); printf(" "); print_src(instr->mul1_src0, unit_mul_1, 0, instr, prev_instr, cur_dest_index); } else { - printf("mul "); + printf("mul.m1 "); print_dest(instr, unit_mul_1, cur_dest_index); printf(" "); print_src(instr->mul1_src0, unit_mul_1, 0, instr, prev_instr, @@ -300,11 +306,13 @@ print_mul(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, print_src(instr->mul1_src1, unit_mul_0, 1, instr, prev_instr, cur_dest_index); } + printf("\n"); } break; case gpir_codegen_mul_op_complex1: - printf("complex1 "); + printed = true; + printf("\tcomplex1.m01 "); print_dest(instr, unit_mul_0, cur_dest_index); printf(" "); print_src(instr->mul0_src0, unit_mul_0, 0, instr, prev_instr, @@ -318,10 +326,12 @@ print_mul(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, printf(" "); print_src(instr->mul1_src1, unit_mul_1, 1, instr, prev_instr, cur_dest_index); + printf("\n"); break; case gpir_codegen_mul_op_select: - printf("sel "); + printed = true; + printf("\tsel.m01 "); print_dest(instr, unit_mul_0, cur_dest_index); printf(" "); print_src(instr->mul0_src1, unit_mul_0, 1, instr, prev_instr, @@ -332,10 +342,12 @@ print_mul(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, printf(" "); print_src(instr->mul1_src0, unit_mul_1, 0, instr, prev_instr, cur_dest_index); + printf("\n"); break; default: - printf("unknown%u ", instr->mul_op); + printed = true; + printf("\tunknown%u.m01 ", instr->mul_op); print_dest(instr, unit_mul_0, cur_dest_index); printf(" "); print_src(instr->mul0_src0, unit_mul_0, 0, instr, prev_instr, @@ -349,10 +361,11 @@ print_mul(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, printf(" "); print_src(instr->mul1_src1, unit_mul_1, 1, instr, prev_instr, cur_dest_index); + printf("\n"); break; } - printf(", "); + return printed; } typedef struct { @@ -378,14 +391,17 @@ static const acc_op_info acc_op_infos[8] = { #undef CASE -static void +static bool print_acc(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, unsigned cur_dest_index) { + bool printed = false; const acc_op_info op = acc_op_infos[instr->acc_op]; if (instr->acc0_src0 != gpir_codegen_src_unused && instr->acc0_src1 != gpir_codegen_src_unused) { + printed = true; + printf("\t"); acc_op_info acc0_op = op; if (instr->acc0_src1 == gpir_codegen_src_ident && instr->acc0_src1_neg) { @@ -395,9 +411,9 @@ print_acc(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, } if (acc0_op.name) - printf("%s ", acc0_op.name); + printf("%s.a0 ", acc0_op.name); else - printf("op%u ", instr->acc_op); + printf("op%u.a0 ", instr->acc_op); print_dest(instr, unit_acc_0, cur_dest_index); printf(" "); @@ -413,11 +429,13 @@ print_acc(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, cur_dest_index); } - printf(", "); + printf("\n"); } if (instr->acc1_src0 != gpir_codegen_src_unused && instr->acc1_src1 != gpir_codegen_src_unused) { + printed = true; + printf("\t"); acc_op_info acc1_op = op; if (instr->acc1_src1 == gpir_codegen_src_ident && instr->acc1_src1_neg) { @@ -427,9 +445,9 @@ print_acc(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, } if (acc1_op.name) - printf("%s ", acc1_op.name); + printf("%s.a1 ", acc1_op.name); else - printf("op%u ", instr->acc_op); + printf("op%u.a1 ", instr->acc_op); print_dest(instr, unit_acc_1, cur_dest_index); printf(" "); @@ -445,32 +463,36 @@ print_acc(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, cur_dest_index); } - printf(", "); + printf("\n"); } + + return printed; } -static void +static bool print_pass(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, unsigned cur_dest_index) { if (instr->pass_src == gpir_codegen_src_unused) - return; + return false; + + printf("\t"); switch (instr->pass_op) { case gpir_codegen_pass_op_pass: - printf("mov "); + printf("mov.p "); break; case gpir_codegen_pass_op_preexp2: - printf("preexp2 "); + printf("preexp2.p "); break; case gpir_codegen_pass_op_postlog2: - printf("postlog2 "); + printf("postlog2.p "); break; case gpir_codegen_pass_op_clamp: - printf("clamp "); + printf("clamp.p "); break; default: - printf("unk%u ", instr->pass_op); + printf("unk%u.p ", instr->pass_op); } print_dest(instr, unit_pass, cur_dest_index); @@ -487,70 +509,81 @@ print_pass(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, cur_dest_index); } - printf(", "); + printf("\n"); + + return true; } -static void +static bool print_complex(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, unsigned cur_dest_index) { if (instr->complex_src == gpir_codegen_src_unused) - return; + return false; + + printf("\t"); switch (instr->complex_op) { case gpir_codegen_complex_op_nop: - return; + return false; case gpir_codegen_complex_op_exp2: - printf("exp2 "); + printf("exp2.c "); break; case gpir_codegen_complex_op_log2: - printf("log2 "); + printf("log2.c "); break; case gpir_codegen_complex_op_rsqrt: - printf("rsqrt "); + printf("rsqrt.c "); break; case gpir_codegen_complex_op_rcp: - printf("rcp "); + printf("rcp.c "); break; case gpir_codegen_complex_op_pass: case gpir_codegen_complex_op_temp_store_addr: case gpir_codegen_complex_op_temp_load_addr_0: case gpir_codegen_complex_op_temp_load_addr_1: case gpir_codegen_complex_op_temp_load_addr_2: - printf("mov "); + printf("mov.c "); break; default: - printf("unk%u ", instr->complex_op); + printf("unk%u.c ", instr->complex_op); } print_dest(instr, unit_complex, cur_dest_index); printf(" "); print_src(instr->complex_src, unit_complex, 0, instr, prev_instr, cur_dest_index); - printf(", "); + printf("\n"); + + return true; } static void print_instr(gpir_codegen_instr *instr, gpir_codegen_instr *prev_instr, unsigned instr_number, unsigned cur_dest_index) { - printf("%03d: ", instr_number); - print_mul(instr, prev_instr, cur_dest_index); - print_acc(instr, prev_instr, cur_dest_index); - print_complex(instr, prev_instr, cur_dest_index); - print_pass(instr, prev_instr, cur_dest_index); + bool printed = false; + printf("%03d:", instr_number); + printed |= print_acc(instr, prev_instr, cur_dest_index); + printed |= print_mul(instr, prev_instr, cur_dest_index); + printed |= print_complex(instr, prev_instr, cur_dest_index); + printed |= print_pass(instr, prev_instr, cur_dest_index); if (instr->branch) { + printed = true; /* The branch condition is taken from the current pass unit result */ - printf("branch ^%d %03d, ", cur_dest_index + unit_pass, + printf("\tbranch ^%d %03d\n", cur_dest_index + unit_pass, instr->branch_target + (instr->branch_target_lo ? 0 : 0x100)); } - if (instr->unknown_1 != 0) - printf("unknown_1 %u", instr->unknown_1); + if (instr->unknown_1 != 0) { + printed = true; + printf("\tunknown_1 %u\n", instr->unknown_1); + } - printf("\n"); + if (!printed) + printf("\tnop\n"); } void -- 2.30.2