mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 19:07:01 +02:00
shader: support S_MUL_HI_I32 (SOP2 0x36) (#576)
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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"),
|
||||||
|
|||||||
Reference in New Issue
Block a user