diff --git a/src/amd/compiler/aco_builder_h.py b/src/amd/compiler/aco_builder_h.py index 8445940dfb9..cbd26221e9f 100644 --- a/src/amd/compiler/aco_builder_h.py +++ b/src/amd/compiler/aco_builder_h.py @@ -97,14 +97,18 @@ enum sendmsg { sendmsg_gs_alloc_req = 9, /* gfx9+ */ sendmsg_get_doorbell = 10, /* gfx9 to gfx10.3 */ sendmsg_get_ddid = 11, /* gfx10 to gfx10.3 */ - sendmsg_rtn_get_doorbell = 128, /* gfx11+ */ - sendmsg_rtn_get_ddid = 129, /* gfx11+ */ - sendmsg_rtn_get_tma = 130, /* gfx11+ */ - sendmsg_rtn_get_realtime = 131, /* gfx11+ */ - sendmsg_rtn_save_wave = 132, /* gfx11+ */ - sendmsg_rtn_get_tba = 133, /* gfx11+ */ - sendmsg_id_mask_gfx6 = 0xf, - sendmsg_id_mask_gfx11 = 0xff, + sendmsg_id_mask = 0xf, +}; + +/* gfx11+ */ +enum sendmsg_rtn { + sendmsg_rtn_get_doorbell = 0, + sendmsg_rtn_get_ddid = 1, + sendmsg_rtn_get_tma = 2, + sendmsg_rtn_get_realtime = 3, + sendmsg_rtn_save_wave = 4, + sendmsg_rtn_get_tba = 5, + sendmsg_rtn_mask = 0xff, }; inline sendmsg diff --git a/src/amd/compiler/aco_print_ir.cpp b/src/amd/compiler/aco_print_ir.cpp index 9b77a6996b8..3219040a751 100644 --- a/src/amd/compiler/aco_print_ir.cpp +++ b/src/amd/compiler/aco_print_ir.cpp @@ -333,8 +333,7 @@ print_instr_format_specific(enum amd_gfx_level gfx_level, const Instruction* ins break; } case aco_opcode::s_sendmsg: { - unsigned id = - gfx_level >= GFX11 ? (imm & sendmsg_id_mask_gfx11) : (imm & sendmsg_id_mask_gfx6); + unsigned id = imm & sendmsg_id_mask; static_assert(_sendmsg_gs == sendmsg_hs_tessfactor); static_assert(_sendmsg_gs_done == sendmsg_dealloc_vgprs); switch (id) { @@ -361,12 +360,6 @@ print_instr_format_specific(enum amd_gfx_level gfx_level, const Instruction* ins case sendmsg_gs_alloc_req: fprintf(output, " sendmsg(gs_alloc_req)"); break; case sendmsg_get_doorbell: fprintf(output, " sendmsg(get_doorbell)"); break; case sendmsg_get_ddid: fprintf(output, " sendmsg(get_ddid)"); break; - case sendmsg_rtn_get_doorbell: fprintf(output, " sendmsg(rtn_get_doorbell)"); break; - case sendmsg_rtn_get_ddid: fprintf(output, " sendmsg(rtn_get_ddid)"); break; - case sendmsg_rtn_get_tma: fprintf(output, " sendmsg(rtn_get_Tma)"); break; - case sendmsg_rtn_get_realtime: fprintf(output, " sendmsg(rtn_get_realtime)"); break; - case sendmsg_rtn_save_wave: fprintf(output, " sendmsg(rtn_save_wave)"); break; - case sendmsg_rtn_get_tba: fprintf(output, " sendmsg(rtn_get_Tba)"); break; default: fprintf(output, " imm:%u", imm); } break; @@ -381,6 +374,23 @@ print_instr_format_specific(enum amd_gfx_level gfx_level, const Instruction* ins fprintf(output, " block:BB%d", instr->sopp().block); break; } + case Format::SOP1: { + if (instr->opcode == aco_opcode::s_sendmsg_rtn_b32 || + instr->opcode == aco_opcode::s_sendmsg_rtn_b64) { + unsigned id = instr->operands[0].constantValue(); + switch (id) { + case sendmsg_rtn_get_doorbell: fprintf(output, " sendmsg(rtn_get_doorbell)"); break; + case sendmsg_rtn_get_ddid: fprintf(output, " sendmsg(rtn_get_ddid)"); break; + case sendmsg_rtn_get_tma: fprintf(output, " sendmsg(rtn_get_tma)"); break; + case sendmsg_rtn_get_realtime: fprintf(output, " sendmsg(rtn_get_realtime)"); break; + case sendmsg_rtn_save_wave: fprintf(output, " sendmsg(rtn_save_wave)"); break; + case sendmsg_rtn_get_tba: fprintf(output, " sendmsg(rtn_get_tba)"); break; + default: break; + } + break; + } + break; + } case Format::SMEM: { const SMEM_instruction& smem = instr->smem(); if (smem.glc) diff --git a/src/amd/compiler/aco_scheduler.cpp b/src/amd/compiler/aco_scheduler.cpp index d588b8000e4..f5fd00c1724 100644 --- a/src/amd/compiler/aco_scheduler.cpp +++ b/src/amd/compiler/aco_scheduler.cpp @@ -424,7 +424,7 @@ bool is_done_sendmsg(amd_gfx_level gfx_level, const Instruction* instr) { if (gfx_level <= GFX10_3 && instr->opcode == aco_opcode::s_sendmsg) - return (instr->sopp().imm & sendmsg_id_mask_gfx6) == _sendmsg_gs_done; + return (instr->sopp().imm & sendmsg_id_mask) == _sendmsg_gs_done; return false; }