}
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: {
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: {
}
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) {
}
}
}
- print_instr_format_specific(instr, output);
+ print_instr_format_specific(gfx_level, instr, output);
}
static void
}
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: ");
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++;
}
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");
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);
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);