diff --git a/src/graphics/shader/recompiler/decompiler/ScalarAluOps.cpp b/src/graphics/shader/recompiler/decompiler/ScalarAluOps.cpp index df98f0de5..cf5ad78d4 100644 --- a/src/graphics/shader/recompiler/decompiler/ScalarAluOps.cpp +++ b/src/graphics/shader/recompiler/decompiler/ScalarAluOps.cpp @@ -58,7 +58,8 @@ constexpr OpcodeMap SOPC_OPS[] = { {0x03u, Opcode::SCmpGeI32}, {0x04u, Opcode::SCmpLtI32}, {0x05u, Opcode::SCmpLeI32}, {0x06u, Opcode::SCmpEqU32}, {0x07u, Opcode::SCmpLgU32}, {0x08u, Opcode::SCmpGtU32}, {0x09u, Opcode::SCmpGeU32}, {0x0au, Opcode::SCmpLtU32}, {0x0bu, Opcode::SCmpLeU32}, - {0x0cu, Opcode::SBitcmp0B32}, {0x0du, Opcode::SBitcmp1B32}, {0x13u, Opcode::SCmpLgU64}, + {0x0cu, Opcode::SBitcmp0B32}, {0x0du, Opcode::SBitcmp1B32}, {0x12u, Opcode::SCmpEqU64}, + {0x13u, Opcode::SCmpLgU64}, }; constexpr OpcodeMap SOPK_OPS[] = { diff --git a/src/graphics/shader/recompiler/decompiler/ShaderDecoder.cpp b/src/graphics/shader/recompiler/decompiler/ShaderDecoder.cpp index b71b5d568..4230abfcc 100644 --- a/src/graphics/shader/recompiler/decompiler/ShaderDecoder.cpp +++ b/src/graphics/shader/recompiler/decompiler/ShaderDecoder.cpp @@ -511,6 +511,7 @@ std::string OpcodeToString(Opcode opcode) { case Opcode::SCmpGeU32: return "s_cmp_ge_u32"; case Opcode::SCmpLtU32: return "s_cmp_lt_u32"; case Opcode::SCmpLeU32: return "s_cmp_le_u32"; + case Opcode::SCmpEqU64: return "s_cmp_eq_u64"; case Opcode::SCmpLgU64: return "s_cmp_lg_u64"; case Opcode::VNop: return "v_nop"; case Opcode::VMovB32: return "v_mov_b32"; @@ -1186,6 +1187,7 @@ std::string InstructionToString(const Instruction& inst) { case Opcode::SCmpLeI32: case Opcode::SBitcmp0B32: case Opcode::SBitcmp1B32: + case Opcode::SCmpEqU64: case Opcode::SCmpLgU64: return WithUnsupportedReason(inst, fmt::format("0x{:08x}: {} {}, {}", inst.pc, OpcodeToString(inst.opcode).c_str(), diff --git a/src/graphics/shader/recompiler/decompiler/ShaderDecoder.h b/src/graphics/shader/recompiler/decompiler/ShaderDecoder.h index 44df261af..72868db80 100644 --- a/src/graphics/shader/recompiler/decompiler/ShaderDecoder.h +++ b/src/graphics/shader/recompiler/decompiler/ShaderDecoder.h @@ -118,6 +118,7 @@ enum class Opcode { SCmpGeU32, SCmpLtU32, SCmpLeU32, + SCmpEqU64, SCmpLgU64, VNop, diff --git a/src/graphics/shader/recompiler/ir/ShaderIROpcodes.cpp b/src/graphics/shader/recompiler/ir/ShaderIROpcodes.cpp index 878e44c4d..61190c512 100644 --- a/src/graphics/shader/recompiler/ir/ShaderIROpcodes.cpp +++ b/src/graphics/shader/recompiler/ir/ShaderIROpcodes.cpp @@ -82,6 +82,7 @@ constexpr LowerMap LOWER_OPS[] = { {Decoder::Opcode::SCmpGeU32, Opcode::CompareGeU32}, {Decoder::Opcode::SCmpLtU32, Opcode::CompareLtU32}, {Decoder::Opcode::SCmpLeU32, Opcode::CompareLeU32}, + {Decoder::Opcode::SCmpEqU64, Opcode::CompareEqU64}, {Decoder::Opcode::SCmpLgU64, Opcode::CompareNeU64}, {Decoder::Opcode::VReadfirstlaneB32, Opcode::ReadFirstLaneU32}, {Decoder::Opcode::VReadlaneB32, Opcode::ReadLaneU32}, diff --git a/tests/ShaderRecompilerComputeTests.cpp b/tests/ShaderRecompilerComputeTests.cpp index 3317ddee5..981acd8ee 100644 --- a/tests/ShaderRecompilerComputeTests.cpp +++ b/tests/ShaderRecompilerComputeTests.cpp @@ -9580,6 +9580,8 @@ TestCase ScalarCompareOps() { code.push_back(EncodeSMovB32(11, InlineU32(0))); code.push_back(EncodeSMovB32(12, InlineU32(2))); code.push_back(EncodeSMovB32(13, InlineU32(0))); + code.push_back(EncodeSMovB32(14, InlineU32(1))); + code.push_back(EncodeSMovB32(15, InlineU32(1))); u32 dst = 20; auto append_compare = [&](u32 opcode, u32 src0, u32 src1) { @@ -9597,9 +9599,13 @@ TestCase ScalarCompareOps() { append_compare(0x08, 4, 3); append_compare(0x09, 4, 4); append_compare(0x0b, 3, 4); + append_compare(0x12, 10, 10); + append_compare(0x12, 10, 12); + append_compare(0x12, 10, 14); append_compare(0x13, 10, 12); + append_compare(0x13, 10, 14); - for (u32 i = 0; i < 11u; i++) { + for (u32 i = 0; i < 15u; i++) { AppendStoreSgpr(&code, 20u + i, i); } AppendEnd(&code); @@ -9607,10 +9613,10 @@ TestCase ScalarCompareOps() { return {"ScalarCompareOps", code, {}, - std::vector(11, 1), + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1}, {O::SMovB32, O::SCmpEqI32, O::SCmpLgI32, O::SCmpGtI32, O::SCmpGeI32, O::SCmpLtI32, - O::SCmpLeI32, O::SCmpLgU32, O::SCmpGtU32, O::SCmpGeU32, O::SCmpLeU32, O::SCmpLgU64, - O::SCselectB32, O::VMovB32, O::BufferStoreDword, O::SEndpgm}}; + O::SCmpLeI32, O::SCmpLgU32, O::SCmpGtU32, O::SCmpGeU32, O::SCmpLeU32, O::SCmpEqU64, + O::SCmpLgU64, O::SCselectB32, O::VMovB32, O::BufferStoreDword, O::SEndpgm}}; } TestCase ScalarShiftAddAndMaskOps() {