diff --git a/src/graphics/shader/recompiler/frontend/decode/ScalarAluOps.cpp b/src/graphics/shader/recompiler/frontend/decode/ScalarAluOps.cpp index d8c78e038..67351efea 100644 --- a/src/graphics/shader/recompiler/frontend/decode/ScalarAluOps.cpp +++ b/src/graphics/shader/recompiler/frontend/decode/ScalarAluOps.cpp @@ -116,7 +116,9 @@ constexpr OpcodeMap SOPP_OPCODE_LIST[] = { {0x12u, Opcode::S_TRAP}, {0x16u, Opcode::S_TTRACEDATA}, {0x17u, Opcode::S_CBRANCH_CDBGSYS}, + {0x18u, Opcode::S_CBRANCH_CDBGUSER}, {0x19u, Opcode::S_CBRANCH_CDBGSYS_OR_USER}, + {0x1au, Opcode::S_CBRANCH_CDBGSYS_AND_USER}, {0x20u, Opcode::S_INST_PREFETCH}, {0x23u, Opcode::S_WAITCNT_DEPCTR}, }; diff --git a/src/graphics/shader/recompiler/frontend/decode/ShaderDecoder.cpp b/src/graphics/shader/recompiler/frontend/decode/ShaderDecoder.cpp index 0df4218db..331984b25 100644 --- a/src/graphics/shader/recompiler/frontend/decode/ShaderDecoder.cpp +++ b/src/graphics/shader/recompiler/frontend/decode/ShaderDecoder.cpp @@ -186,7 +186,9 @@ bool IsConditionalBranch(Opcode opcode) { switch (opcode) { // Conditional shader debugging is disabled. case Opcode::S_CBRANCH_CDBGSYS: - case Opcode::S_CBRANCH_CDBGSYS_OR_USER: return false; + case Opcode::S_CBRANCH_CDBGUSER: + case Opcode::S_CBRANCH_CDBGSYS_OR_USER: + case Opcode::S_CBRANCH_CDBGSYS_AND_USER: return false; case Opcode::S_CBRANCH_SCC0: case Opcode::S_CBRANCH_SCC1: case Opcode::S_CBRANCH_VCCZ: @@ -575,7 +577,9 @@ std::string InstructionToString(const Instruction& inst) { case Opcode::S_CBRANCH_EXECZ: case Opcode::S_CBRANCH_EXECNZ: case Opcode::S_CBRANCH_CDBGSYS: + case Opcode::S_CBRANCH_CDBGUSER: case Opcode::S_CBRANCH_CDBGSYS_OR_USER: + case Opcode::S_CBRANCH_CDBGSYS_AND_USER: return WithUnsupportedReason(inst, fmt::format("0x{:08x}: {} 0x{:08x}", inst.pc, magic_enum::enum_name(inst.opcode), inst.branch_target)); diff --git a/src/graphics/shader/recompiler/frontend/decode/ShaderDecoder.h b/src/graphics/shader/recompiler/frontend/decode/ShaderDecoder.h index 4277374c7..bceb52a10 100644 --- a/src/graphics/shader/recompiler/frontend/decode/ShaderDecoder.h +++ b/src/graphics/shader/recompiler/frontend/decode/ShaderDecoder.h @@ -714,7 +714,9 @@ enum class Opcode { S_CBRANCH_EXECZ, S_CBRANCH_EXECNZ, S_CBRANCH_CDBGSYS, + S_CBRANCH_CDBGUSER, S_CBRANCH_CDBGSYS_OR_USER, + S_CBRANCH_CDBGSYS_AND_USER, S_SENDMSG, S_GETREG_B32, S_SETREG_B32, diff --git a/src/graphics/shader/recompiler/frontend/translate/Scalar.cpp b/src/graphics/shader/recompiler/frontend/translate/Scalar.cpp index 519014fcb..abbca7f83 100644 --- a/src/graphics/shader/recompiler/frontend/translate/Scalar.cpp +++ b/src/graphics/shader/recompiler/frontend/translate/Scalar.cpp @@ -279,7 +279,9 @@ void Translator::EmitScalar(const Decoder::Instruction& inst) { case O::S_CBRANCH_EXECZ: case O::S_CBRANCH_EXECNZ: case O::S_CBRANCH_CDBGSYS: + case O::S_CBRANCH_CDBGUSER: case O::S_CBRANCH_CDBGSYS_OR_USER: + case O::S_CBRANCH_CDBGSYS_AND_USER: case O::S_ENDPGM: return; default: return FailMissingTranslation(inst); } diff --git a/tests/shaderCfgTests.cpp b/tests/shaderCfgTests.cpp index 2ff46bc9a..b5f708ad9 100644 --- a/tests/shaderCfgTests.cpp +++ b/tests/shaderCfgTests.cpp @@ -1945,14 +1945,18 @@ void TestSopkCompareImmediateExtension() { void TestDisabledDebugBranches() { using namespace ShaderRecompiler; - // Both debug branches fall through when conditional shader debugging is disabled. + // Debug branches fall through when conditional shader debugging is disabled. // Retain the post-ENDPGM helper displacement from PPSA08709 and exercise the // OR_USER variant encountered in PPSA03671 with the same body. - for (const auto opcode : {Decoder::Opcode::S_CBRANCH_CDBGSYS, - Decoder::Opcode::S_CBRANCH_CDBGSYS_OR_USER}) { + const std::pair branches[] = { + {0x17, Decoder::Opcode::S_CBRANCH_CDBGSYS}, + {0x18, Decoder::Opcode::S_CBRANCH_CDBGUSER}, + {0x19, Decoder::Opcode::S_CBRANCH_CDBGSYS_OR_USER}, + {0x1a, Decoder::Opcode::S_CBRANCH_CDBGSYS_AND_USER}}; + for (const auto [encoding, opcode] : branches) { std::array shader; shader.fill(EncodeSopp(0x00)); - shader[0] = EncodeSopp(opcode == Decoder::Opcode::S_CBRANCH_CDBGSYS ? 0x17 : 0x19, 0x10f); + shader[0] = EncodeSopp(encoding, 0x10f); shader[1] = EncodeVop1(0x01, 1, 129); shader[2] = EncodeMubuf0(0x1c, 0, false); shader[3] = EncodeMubuf1(1, 0, 0); @@ -1962,6 +1966,7 @@ void TestDisabledDebugBranches() { Decoder::Program decoded; Decoder::DecodeProgram(shader, decoded); Check(decoded.instructions.front().opcode == opcode && + decoded.instructions.front().opcode_id == encoding && decoded.instructions.front().branch_target == 0x440u && decoded.instructions.back().pc == 0x43cu && decoded.instructions.back().opcode == Decoder::Opcode::S_ENDPGM,