From 494050d2ea5b35909e881ec7c850389127bfd79c Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 7 Nov 2024 15:11:19 +0100 Subject: [PATCH] aco: add a helper to dump SGPR to memory for the trap handler Signed-off-by: Samuel Pitoiset Part-of: --- .../compiler/aco_instruction_selection.cpp | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index dbce229ed43..93e00b6803a 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -12405,6 +12405,26 @@ select_program(Program* program, unsigned shader_count, struct nir_shader* const } } +void +dump_sgpr_to_mem(isel_context* ctx, Operand rsrc, Operand data, uint32_t offset) +{ + Builder bld(ctx->program, ctx->block); + + ac_hw_cache_flags cache_glc; + cache_glc.value = ac_glc; + + if (ctx->program->gfx_level >= GFX9) { + bld.copy(Definition(PhysReg{256}, v1) /* v0 */, data); + + bld.mubuf(aco_opcode::buffer_store_dword, Operand(rsrc), Operand(v1), Operand::c32(0u), + Operand(PhysReg{256}, v1) /* v0 */, offset, false /* offen */, false /* idxen */, + /* addr64 */ false, /* disable_wqm */ false, cache_glc); + } else { + bld.smem(aco_opcode::s_buffer_store_dword, Operand(rsrc), Operand::c32(offset), data, + memory_sync_info(), cache_glc); + } +} + void select_trap_handler_shader(Program* program, struct nir_shader* shader, ac_shader_config* config, const struct aco_compiler_options* options, @@ -12501,35 +12521,13 @@ select_trap_handler_shader(Program* program, struct nir_shader* shader, ac_shade bld.sopk(aco_opcode::s_getreg_b32, Definition(ttmp0_reg, s1), ((32 - 1) << 11) | hw_regs_idx[i]); - if (ctx.program->gfx_level >= GFX9) { - bld.copy(Definition(PhysReg{256}, v1) /* v0 */, Operand(ttmp0_reg, s1)); - - bld.mubuf(aco_opcode::buffer_store_dword, Operand(tma_rsrc, s4), Operand(v1), - Operand::c32(offset), Operand(PhysReg{256}, v1) /* v0 */, 0 /* offset */, - false /* offen */, false /* idxen */, /* addr64 */ false, - /* disable_wqm */ false, cache_glc); - } else { - bld.smem(aco_opcode::s_buffer_store_dword, Operand(tma_rsrc, s4), Operand::c32(offset), - Operand(ttmp0_reg, s1), memory_sync_info(), cache_glc); - } - + dump_sgpr_to_mem(&ctx, Operand(tma_rsrc, s4), Operand(ttmp0_reg, s1), offset); offset += 4; } /* Dump all SGPRs. */ for (uint32_t i = 0; i < program->dev.sgpr_limit; i++) { - if (ctx.program->gfx_level >= GFX9) { - bld.copy(Definition(PhysReg{256}, v1) /* v0 */, Operand(PhysReg{i}, s1)); - - bld.mubuf(aco_opcode::buffer_store_dword, Operand(tma_rsrc, s4), Operand(v1), - Operand::c32(0u), Operand(PhysReg{256}, v1) /* v0 */, offset, false /* offen */, - false /* idxen */, /* addr64 */ false, - /* disable_wqm */ false, cache_glc); - } else { - bld.smem(aco_opcode::s_buffer_store_dword, Operand(tma_rsrc, s4), Operand::c32(offset), - Operand(PhysReg{i}, s1), memory_sync_info(), cache_glc); - } - + dump_sgpr_to_mem(&ctx, Operand(tma_rsrc, s4), Operand(PhysReg{i}, s1), offset); offset += 4; }