From 7bcd43dbee75270ea9605091995b2d013f1e898f Mon Sep 17 00:00:00 2001 From: Frans Date: Sat, 12 Sep 2026 12:56:14 +0200 Subject: [PATCH] shader: support S_MUL_HI_I32 (SOP2 0x36) (#576) --- .../shader/recompiler/frontend/decode/ScalarAluOps.cpp | 1 + .../shader/recompiler/frontend/decode/ShaderDecoder.h | 1 + src/graphics/shader/recompiler/frontend/translate/Scalar.cpp | 2 ++ tests/shaderCfgTests.cpp | 5 +++++ 4 files changed, 9 insertions(+) diff --git a/src/graphics/shader/recompiler/frontend/decode/ScalarAluOps.cpp b/src/graphics/shader/recompiler/frontend/decode/ScalarAluOps.cpp index eb0d82d3b..787d76229 100644 --- a/src/graphics/shader/recompiler/frontend/decode/ScalarAluOps.cpp +++ b/src/graphics/shader/recompiler/frontend/decode/ScalarAluOps.cpp @@ -33,6 +33,7 @@ constexpr OpcodeMap SOP2_OPCODE_LIST[] = { {0x31u, Opcode::S_LSHL4_ADD_U32}, {0x32u, Opcode::S_PACK_LL_B32_B16}, {0x33u, Opcode::S_PACK_LH_B32_B16}, {0x34u, Opcode::S_PACK_HH_B32_B16}, {0x35u, Opcode::S_MUL_HI_U32}, + {0x36u, Opcode::S_MUL_HI_I32}, }; constexpr OpcodeMap SOP1_OPCODE_LIST[] = { diff --git a/src/graphics/shader/recompiler/frontend/decode/ShaderDecoder.h b/src/graphics/shader/recompiler/frontend/decode/ShaderDecoder.h index b5c9c41d3..aa3b334de 100644 --- a/src/graphics/shader/recompiler/frontend/decode/ShaderDecoder.h +++ b/src/graphics/shader/recompiler/frontend/decode/ShaderDecoder.h @@ -108,6 +108,7 @@ enum class Opcode { S_ASHR_I32, S_MUL_I32, S_MUL_HI_U32, + S_MUL_HI_I32, S_MULK_I32, S_BFE_U32, S_BFE_I32, diff --git a/src/graphics/shader/recompiler/frontend/translate/Scalar.cpp b/src/graphics/shader/recompiler/frontend/translate/Scalar.cpp index 0eb5bc95d..c62e0daed 100644 --- a/src/graphics/shader/recompiler/frontend/translate/Scalar.cpp +++ b/src/graphics/shader/recompiler/frontend/translate/Scalar.cpp @@ -138,6 +138,8 @@ bool Translator::EmitScalar(const Decoder::Instruction& inst) { return SimpleInteger(inst, IR::ValueOpcode::IMul32, IR::Type::U32, false, false, false); case O::S_MUL_HI_U32: return SimpleInteger(inst, IR::ValueOpcode::UMulHi, IR::Type::U32, false, false, false); + case O::S_MUL_HI_I32: + return SimpleInteger(inst, IR::ValueOpcode::SMulHi, IR::Type::U32, false, false, false); case O::S_AND_B32: return SimpleInteger(inst, IR::ValueOpcode::BitwiseAnd32, IR::Type::U32, false, false, true); diff --git a/tests/shaderCfgTests.cpp b/tests/shaderCfgTests.cpp index 8f39e254e..6f4ca66ac 100644 --- a/tests/shaderCfgTests.cpp +++ b/tests/shaderCfgTests.cpp @@ -1812,6 +1812,7 @@ void TestNewShaderRecompilerScalarVectorAlu() { EncodeSop2(0x30, 11, 10, 1), // s_lshl3_add_u32 s11, s10, s1 EncodeSop2(0x31, 12, 11, 1), // s_lshl4_add_u32 s12, s11, s1 EncodeSop2(0x35, 13, 12, 1), // s_mul_hi_u32 s13, s12, s1 + EncodeSop2(0x36, 15, 12, 1), // s_mul_hi_i32 s15, s12, s1 EncodeSopc(0x08, 8, 1), // s_cmp_gt_u32 s8, s1 EncodeSop2(0x04, 14, 13, 129), // s_addc_u32 s14, s13, 1 EncodeVop2(0x03, 1, 242, 0), // v_add_f32 v1, 1.0, v0 @@ -1848,6 +1849,8 @@ void TestNewShaderRecompilerScalarVectorAlu() { "new decoder did not decode old-backed S_LSHL4_ADD_U32"); Check(Common::ContainsStr(result.decoded_dump, "s_mul_hi_u32 s13, s12, s1"), "new decoder did not decode old-backed S_MUL_HI_U32"); + Check(Common::ContainsStr(result.decoded_dump, "s_mul_hi_i32 s15, s12, s1"), + "new decoder did not decode old-backed S_MUL_HI_I32"); Check(Common::ContainsStr(result.decoded_dump, "v_add_f32 v1"), "new decoder did not decode VOP2 float add"); Check(Common::ContainsStr(result.decoded_dump, "v_cndmask_b32 v5"), @@ -1884,6 +1887,8 @@ void TestNewShaderRecompilerScalarVectorAlu() { "S_LSHL4_ADD_U32 did not lower through carry-writing shift-left-add IR"); Check(Common::ContainsStr(result.ir_dump, "UMulHighU32 s13, s12, s1"), "S_MUL_HI_U32 did not lower to unsigned high-multiply IR"); + Check(Common::ContainsStr(result.ir_dump, "SMulHighI32 s15, s12, s1"), + "S_MUL_HI_I32 did not lower to signed high-multiply IR"); Check(Common::ContainsStr(result.ir_dump, "CompareGtU32"), "SOPC compare did not lower to IR"); Check(Common::ContainsStr(result.ir_dump, "FAddF32 v1"),