shader: support S_MUL_HI_I32 (SOP2 0x36) (#576)

This commit is contained in:
Frans
2026-09-12 12:56:14 +02:00
committed by GitHub
parent 7c5473400e
commit 7bcd43dbee
4 changed files with 9 additions and 0 deletions
@@ -33,6 +33,7 @@ constexpr OpcodeMap SOP2_OPCODE_LIST[] = {
{0x31u, Opcode::S_LSHL4_ADD_U32}, {0x32u, Opcode::S_PACK_LL_B32_B16}, {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}, {0x33u, Opcode::S_PACK_LH_B32_B16}, {0x34u, Opcode::S_PACK_HH_B32_B16},
{0x35u, Opcode::S_MUL_HI_U32}, {0x35u, Opcode::S_MUL_HI_U32},
{0x36u, Opcode::S_MUL_HI_I32},
}; };
constexpr OpcodeMap SOP1_OPCODE_LIST[] = { constexpr OpcodeMap SOP1_OPCODE_LIST[] = {
@@ -108,6 +108,7 @@ enum class Opcode {
S_ASHR_I32, S_ASHR_I32,
S_MUL_I32, S_MUL_I32,
S_MUL_HI_U32, S_MUL_HI_U32,
S_MUL_HI_I32,
S_MULK_I32, S_MULK_I32,
S_BFE_U32, S_BFE_U32,
S_BFE_I32, S_BFE_I32,
@@ -138,6 +138,8 @@ bool Translator::EmitScalar(const Decoder::Instruction& inst) {
return SimpleInteger(inst, IR::ValueOpcode::IMul32, IR::Type::U32, false, false, false); return SimpleInteger(inst, IR::ValueOpcode::IMul32, IR::Type::U32, false, false, false);
case O::S_MUL_HI_U32: case O::S_MUL_HI_U32:
return SimpleInteger(inst, IR::ValueOpcode::UMulHi, IR::Type::U32, false, false, false); 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: case O::S_AND_B32:
return SimpleInteger(inst, IR::ValueOpcode::BitwiseAnd32, IR::Type::U32, false, false, return SimpleInteger(inst, IR::ValueOpcode::BitwiseAnd32, IR::Type::U32, false, false,
true); true);
+5
View File
@@ -1812,6 +1812,7 @@ void TestNewShaderRecompilerScalarVectorAlu() {
EncodeSop2(0x30, 11, 10, 1), // s_lshl3_add_u32 s11, s10, s1 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(0x31, 12, 11, 1), // s_lshl4_add_u32 s12, s11, s1
EncodeSop2(0x35, 13, 12, 1), // s_mul_hi_u32 s13, s12, 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 EncodeSopc(0x08, 8, 1), // s_cmp_gt_u32 s8, s1
EncodeSop2(0x04, 14, 13, 129), // s_addc_u32 s14, s13, 1 EncodeSop2(0x04, 14, 13, 129), // s_addc_u32 s14, s13, 1
EncodeVop2(0x03, 1, 242, 0), // v_add_f32 v1, 1.0, v0 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"); "new decoder did not decode old-backed S_LSHL4_ADD_U32");
Check(Common::ContainsStr(result.decoded_dump, "s_mul_hi_u32 s13, s12, s1"), Check(Common::ContainsStr(result.decoded_dump, "s_mul_hi_u32 s13, s12, s1"),
"new decoder did not decode old-backed S_MUL_HI_U32"); "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"), Check(Common::ContainsStr(result.decoded_dump, "v_add_f32 v1"),
"new decoder did not decode VOP2 float add"); "new decoder did not decode VOP2 float add");
Check(Common::ContainsStr(result.decoded_dump, "v_cndmask_b32 v5"), 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"); "S_LSHL4_ADD_U32 did not lower through carry-writing shift-left-add IR");
Check(Common::ContainsStr(result.ir_dump, "UMulHighU32 s13, s12, s1"), Check(Common::ContainsStr(result.ir_dump, "UMulHighU32 s13, s12, s1"),
"S_MUL_HI_U32 did not lower to unsigned high-multiply IR"); "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"), Check(Common::ContainsStr(result.ir_dump, "CompareGtU32"),
"SOPC compare did not lower to IR"); "SOPC compare did not lower to IR");
Check(Common::ContainsStr(result.ir_dump, "FAddF32 v1"), Check(Common::ContainsStr(result.ir_dump, "FAddF32 v1"),