mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 19:07:01 +02:00
shader: emit native integer operations and remove signedness casts
This commit is contained in:
@@ -19729,27 +19729,34 @@ TestCase ScalarAbsI32UpdatesScc() {
|
||||
code.push_back(EncodeSop2(0x0a, dst_sgpr, InlineU32(1), InlineU32(0)));
|
||||
};
|
||||
|
||||
code.push_back(EncodeSMovB32(0, InlineU32(0)));
|
||||
AppendSmemLoadOpcode(&code, 0x08, 16, 0);
|
||||
set_scc(true);
|
||||
code.push_back(EncodeSop1(0x34, 1, 0));
|
||||
capture_scc(2);
|
||||
code.push_back(EncodeSop1(0x34, 17, 16));
|
||||
capture_scc(18);
|
||||
|
||||
AppendSMovLiteral(&code, 3, 0xfffffffbu);
|
||||
AppendSmemLoadOpcode(&code, 0x08, 19, 4);
|
||||
set_scc(false);
|
||||
code.push_back(EncodeSop1(0x34, 4, 3));
|
||||
capture_scc(5);
|
||||
code.push_back(EncodeSop1(0x34, 20, 19));
|
||||
capture_scc(21);
|
||||
|
||||
AppendStoreSgpr(&code, 1, 0);
|
||||
AppendStoreSgpr(&code, 2, 1);
|
||||
AppendStoreSgpr(&code, 4, 2);
|
||||
AppendStoreSgpr(&code, 5, 3);
|
||||
AppendSmemLoadOpcode(&code, 0x08, 22, 8);
|
||||
set_scc(false);
|
||||
code.push_back(EncodeSop1(0x34, 23, 22));
|
||||
capture_scc(24);
|
||||
|
||||
AppendStoreSgpr(&code, 17, 0);
|
||||
AppendStoreSgpr(&code, 18, 1);
|
||||
AppendStoreSgpr(&code, 20, 2);
|
||||
AppendStoreSgpr(&code, 21, 3);
|
||||
AppendStoreSgpr(&code, 23, 4);
|
||||
AppendStoreSgpr(&code, 24, 5);
|
||||
AppendEnd(&code);
|
||||
|
||||
return {"ScalarAbsI32UpdatesScc",
|
||||
code,
|
||||
{},
|
||||
{0, 0, 5, 1},
|
||||
{O::S_MOV_B32, O::S_CMP_EQ_U32, O::S_ABS_I32, O::S_CSELECT_B32,
|
||||
{0, 0xfffffffbu, 0x80000000u},
|
||||
{0, 0, 5, 1, 0x80000000u, 1},
|
||||
{O::S_BUFFER_LOAD_DWORD, O::S_CMP_EQ_U32, O::S_ABS_I32, O::S_CSELECT_B32,
|
||||
O::V_MOV_B32, O::BUFFER_STORE_DWORD, O::S_ENDPGM}};
|
||||
}
|
||||
|
||||
@@ -21887,6 +21894,62 @@ TestCase VectorIntegerOps() {
|
||||
O::S_ENDPGM}};
|
||||
}
|
||||
|
||||
TestCase VectorIntegerExtremaRuntimeEdges() {
|
||||
using O = ShaderOpcode;
|
||||
constexpr std::array<std::array<u32, 3>, 8> inputs{{
|
||||
{0x80000000u, 0u, 0x7fffffffu},
|
||||
{0xffffffffu, 1u, 0x80000000u},
|
||||
{1u, 0x80000000u, 0xffffffffu},
|
||||
{1u, 0xffffffffu, 0x80000000u},
|
||||
{0x7fffffffu, 0x7fffffffu, 0x80000000u},
|
||||
{0x80000000u, 0x80000000u, 0xffffffffu},
|
||||
{0xffffffffu, 0xffffffffu, 0xffffffffu},
|
||||
{0u, 0u, 0u},
|
||||
}};
|
||||
TestCase test;
|
||||
test.name = "VectorIntegerExtremaRuntimeEdges";
|
||||
for (const auto &values : inputs)
|
||||
test.initial.insert(test.initial.end(), values.begin(), values.end());
|
||||
test.expected = test.initial;
|
||||
for (u32 i = 0; i < inputs.size(); ++i) {
|
||||
for (u32 reg = 0; reg < 3; ++reg) {
|
||||
AppendVMovU32(&test.code, 30, (i * 3u + reg) * 4u);
|
||||
AppendBufferLoadDword(&test.code, reg, 30);
|
||||
}
|
||||
for (u32 op = 0; op < 4; ++op)
|
||||
test.code.push_back(EncodeVop2(0x11u + op, 4u + op, Vgpr(0), 1));
|
||||
constexpr std::array opcodes{0x152u, 0x155u, 0x158u, 0x153u, 0x156u, 0x159u};
|
||||
for (u32 op = 0; op < opcodes.size(); ++op)
|
||||
AppendVop3(&test.code, opcodes[op], 8u + op, Vgpr(0), Vgpr(1), Vgpr(2));
|
||||
const auto output = static_cast<u32>(test.expected.size());
|
||||
for (u32 result = 0; result < 10; ++result)
|
||||
AppendStoreVgpr(&test.code, 4u + result, output + result);
|
||||
|
||||
auto unsigned_values = inputs[i];
|
||||
std::array<int32_t, 3> signed_values;
|
||||
for (u32 j = 0; j < 3; ++j)
|
||||
signed_values[j] = std::bit_cast<int32_t>(unsigned_values[j]);
|
||||
test.expected.insert(test.expected.end(), {
|
||||
static_cast<u32>(std::min(signed_values[0], signed_values[1])),
|
||||
static_cast<u32>(std::max(signed_values[0], signed_values[1])),
|
||||
std::min(unsigned_values[0], unsigned_values[1]),
|
||||
std::max(unsigned_values[0], unsigned_values[1])});
|
||||
std::sort(signed_values.begin(), signed_values.end());
|
||||
std::sort(unsigned_values.begin(), unsigned_values.end());
|
||||
test.expected.insert(test.expected.end(), {
|
||||
static_cast<u32>(signed_values[0]), static_cast<u32>(signed_values[2]),
|
||||
static_cast<u32>(signed_values[1]), unsigned_values[0],
|
||||
unsigned_values[2], unsigned_values[1]});
|
||||
}
|
||||
AppendEnd(&test.code);
|
||||
test.opcodes = {O::V_MOV_B32, O::BUFFER_LOAD_DWORD, O::V_MIN_I32, O::V_MAX_I32,
|
||||
O::V_MIN_U32, O::V_MAX_U32, O::V_MIN3_I32, O::V_MAX3_I32,
|
||||
O::V_MED3_I32, O::V_MIN3_U32, O::V_MAX3_U32, O::V_MED3_U32,
|
||||
O::BUFFER_STORE_DWORD, O::S_ENDPGM};
|
||||
test.required_spirv = {" SMin ", " SMax ", " UMin ", " UMax "};
|
||||
return test;
|
||||
}
|
||||
|
||||
TestCase VectorFfbhI32NativeAndVop3OnGpu() {
|
||||
using O = ShaderOpcode;
|
||||
|
||||
@@ -22731,7 +22794,7 @@ TestCase Vop3Min3U16CapturedAndSelectors() {
|
||||
test.opcodes = {O::V_MOV_B32, O::BUFFER_LOAD_DWORD, O::V_MIN3_U16,
|
||||
O::S_MOV_B64, O::BUFFER_STORE_DWORD, O::S_ENDPGM};
|
||||
test.decoded_counts = {{"V_MIN3_U16", cases.size()}};
|
||||
test.required_spirv = {"OpULessThan"};
|
||||
test.required_spirv = {" UMin "};
|
||||
return test;
|
||||
}
|
||||
|
||||
@@ -22757,7 +22820,7 @@ TestCase Vop3Med3I16Captured() {
|
||||
test.decoded_counts = {{"0x00000020: V_MED3_I16 v3.sdwa(sel=5,sext=0), "
|
||||
"v5.opsel(lo=1,hi=0,neghi=0), s25, s27\n",
|
||||
1}};
|
||||
test.required_spirv = {"OpSLessThan"};
|
||||
test.required_spirv = {" SMin ", " SMax "};
|
||||
return test;
|
||||
}
|
||||
|
||||
@@ -22783,7 +22846,7 @@ TestCase Vop2SdwaMinU32PreservesWordDestination() {
|
||||
test.expected = {0xa1b20007u, 0xa1b2001fu};
|
||||
test.opcodes = {O::V_MOV_B32, O::V_MIN_U32, O::BUFFER_STORE_DWORD,
|
||||
O::S_ENDPGM};
|
||||
test.required_spirv = {"OpULessThan", "OpSelect"};
|
||||
test.required_spirv = {" UMin ", "OpSelect"};
|
||||
return test;
|
||||
}
|
||||
|
||||
@@ -36327,6 +36390,7 @@ std::vector<TestCase> MakeCases() {
|
||||
AddCase(VectorMoves);
|
||||
AddCase(VectorVop3MoveAppliesFloatSourceModifiers);
|
||||
AddCase(VectorIntegerOps);
|
||||
AddCase(VectorIntegerExtremaRuntimeEdges);
|
||||
AddCase(VectorFfbhI32NativeAndVop3OnGpu);
|
||||
AddCase(Vop1SdwaBfrevSourceSelectors);
|
||||
AddCase(Vop1SdwaFfbhCapturedScalarLowWordSource);
|
||||
|
||||
Reference in New Issue
Block a user