diff --git a/src/amd/compiler/aco_assembler.cpp b/src/amd/compiler/aco_assembler.cpp index f19f731b090..9da9dd30068 100644 --- a/src/amd/compiler/aco_assembler.cpp +++ b/src/amd/compiler/aco_assembler.cpp @@ -126,7 +126,7 @@ emit_instruction(asm_context& ctx, std::vector& out, Instruction* inst FILE* const memf = u_memstream_get(&mem); fprintf(memf, "Unsupported opcode: "); - aco_print_instr(instr, memf); + aco_print_instr(ctx.gfx_level, instr, memf); u_memstream_close(&mem); aco_err(ctx.program, outmem); diff --git a/src/amd/compiler/aco_ir.h b/src/amd/compiler/aco_ir.h index 57e7834a997..fbdea652c66 100644 --- a/src/amd/compiler/aco_ir.h +++ b/src/amd/compiler/aco_ir.h @@ -2320,7 +2320,8 @@ enum print_flags { }; void aco_print_operand(const Operand* operand, FILE* output, unsigned flags = 0); -void aco_print_instr(const Instruction* instr, FILE* output, unsigned flags = 0); +void aco_print_instr(enum amd_gfx_level gfx_level, const Instruction* instr, FILE* output, + unsigned flags = 0); void aco_print_program(const Program* program, FILE* output, unsigned flags = 0); void aco_print_program(const Program* program, FILE* output, const live& live_vars, unsigned flags = 0); diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp index 945da8879ba..96d5eddf77e 100644 --- a/src/amd/compiler/aco_optimizer.cpp +++ b/src/amd/compiler/aco_optimizer.cpp @@ -46,7 +46,7 @@ perfwarn(Program* program, bool cond, const char* msg, Instruction* instr) FILE* const memf = u_memstream_get(&mem); fprintf(memf, "%s: ", msg); - aco_print_instr(instr, memf); + aco_print_instr(program->gfx_level, instr, memf); u_memstream_close(&mem); aco_perfwarn(program, out); diff --git a/src/amd/compiler/aco_print_ir.cpp b/src/amd/compiler/aco_print_ir.cpp index b45ad118590..dee0f891ca1 100644 --- a/src/amd/compiler/aco_print_ir.cpp +++ b/src/amd/compiler/aco_print_ir.cpp @@ -277,7 +277,7 @@ print_sync(memory_sync_info sync, FILE* output) } static void -print_instr_format_specific(const Instruction* instr, FILE* output) +print_instr_format_specific(enum amd_gfx_level gfx_level, const Instruction* instr, FILE* output) { switch (instr->format) { case Format::SOPK: { @@ -289,15 +289,13 @@ print_instr_format_specific(const Instruction* instr, FILE* output) uint16_t imm = instr->sopp().imm; switch (instr->opcode) { case aco_opcode::s_waitcnt: { - /* we usually should check the gfx level for vmcnt/lgkm, but - * insert_waitcnt() should fill it in regardless. */ - unsigned vmcnt = (imm & 0xF) | ((imm & (0x3 << 14)) >> 10); - if (vmcnt != 63) - fprintf(output, " vmcnt(%d)", vmcnt); - if (((imm >> 4) & 0x7) < 0x7) - fprintf(output, " expcnt(%d)", (imm >> 4) & 0x7); - if (((imm >> 8) & 0x3F) < 0x3F) - fprintf(output, " lgkmcnt(%d)", (imm >> 8) & 0x3F); + wait_imm unpacked(gfx_level, imm); + if (unpacked.vm != wait_imm::unset_counter) + fprintf(output, " vmcnt(%d)", unpacked.vm); + if (unpacked.exp != wait_imm::unset_counter) + fprintf(output, " expcnt(%d)", unpacked.exp); + if (unpacked.lgkm != wait_imm::unset_counter) + fprintf(output, " lgkmcnt(%d)", unpacked.lgkm); break; } case aco_opcode::s_waitcnt_depctr: { @@ -700,7 +698,8 @@ print_instr_format_specific(const Instruction* instr, FILE* output) } void -aco_print_instr(const Instruction* instr, FILE* output, unsigned flags) +aco_print_instr(enum amd_gfx_level gfx_level, const Instruction* instr, FILE* output, + unsigned flags) { if (!instr->definitions.empty()) { for (unsigned i = 0; i < instr->definitions.size(); ++i) { @@ -797,7 +796,7 @@ aco_print_instr(const Instruction* instr, FILE* output, unsigned flags) } } } - print_instr_format_specific(instr, output); + print_instr_format_specific(gfx_level, instr, output); } static void @@ -883,7 +882,8 @@ print_stage(Stage stage, FILE* output) } void -aco_print_block(const Block* block, FILE* output, unsigned flags, const live& live_vars) +aco_print_block(enum amd_gfx_level gfx_level, const Block* block, FILE* output, unsigned flags, + const live& live_vars) { fprintf(output, "BB%d\n", block->index); fprintf(output, "/* logical preds: "); @@ -916,7 +916,7 @@ aco_print_block(const Block* block, FILE* output, unsigned flags, const live& li if (flags & print_perf_info) fprintf(output, "(%3u clk) ", instr->pass_flags); - aco_print_instr(instr.get(), output, flags); + aco_print_instr(gfx_level, instr.get(), output, flags); fprintf(output, "\n"); index++; } @@ -937,7 +937,7 @@ aco_print_program(const Program* program, FILE* output, const live& live_vars, u print_stage(program->stage, output); for (Block const& block : program->blocks) - aco_print_block(&block, output, flags, live_vars); + aco_print_block(program->gfx_level, &block, output, flags, live_vars); if (program->constant_data.size()) { fprintf(output, "\n/* constant data */\n"); diff --git a/src/amd/compiler/aco_validate.cpp b/src/amd/compiler/aco_validate.cpp index abfb0b2d242..fef525df462 100644 --- a/src/amd/compiler/aco_validate.cpp +++ b/src/amd/compiler/aco_validate.cpp @@ -91,7 +91,7 @@ validate_ir(Program* program) FILE* const memf = u_memstream_get(&mem); fprintf(memf, "%s: ", msg); - aco_print_instr(instr, memf); + aco_print_instr(program->gfx_level, instr, memf); u_memstream_close(&mem); aco_err(program, "%s", out); @@ -776,14 +776,14 @@ ra_fail(Program* program, Location loc, Location loc2, const char* fmt, ...) fprintf(memf, "RA error found at instruction in BB%d:\n", loc.block->index); if (loc.instr) { - aco_print_instr(loc.instr, memf); + aco_print_instr(program->gfx_level, loc.instr, memf); fprintf(memf, "\n%s", msg); } else { fprintf(memf, "%s", msg); } if (loc2.block) { fprintf(memf, " in BB%d:\n", loc2.block->index); - aco_print_instr(loc2.instr, memf); + aco_print_instr(program->gfx_level, loc2.instr, memf); } fprintf(memf, "\n\n"); u_memstream_close(&mem); diff --git a/src/amd/compiler/tests/test_regalloc.cpp b/src/amd/compiler/tests/test_regalloc.cpp index 78f5db0564d..7d9bf38413b 100644 --- a/src/amd/compiler/tests/test_regalloc.cpp +++ b/src/amd/compiler/tests/test_regalloc.cpp @@ -272,7 +272,7 @@ BEGIN_TEST(regalloc.linear_vgpr.live_range_split.get_reg_impl) //>> lv1: %5:v[2] = p_parallelcopy %3:v[1] scc:1 scratch:s1 Pseudo_instruction& parallelcopy = program->blocks[0].instructions[3]->pseudo(); - aco_print_instr(¶llelcopy, output); + aco_print_instr(program->gfx_level, ¶llelcopy, output); fprintf(output, " scc:%u scratch:s%u\n", parallelcopy.tmp_in_scc, parallelcopy.scratch_sgpr.reg()); END_TEST