mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-21 03:16:54 +02:00
shader: implement S_CMP_EQ_U64
This commit is contained in:
@@ -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[] = {
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -118,6 +118,7 @@ enum class Opcode {
|
||||
SCmpGeU32,
|
||||
SCmpLtU32,
|
||||
SCmpLeU32,
|
||||
SCmpEqU64,
|
||||
SCmpLgU64,
|
||||
|
||||
VNop,
|
||||
|
||||
@@ -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},
|
||||
|
||||
@@ -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<u32>(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() {
|
||||
|
||||
Reference in New Issue
Block a user