shader: support S_QUADMASK_B32

This commit is contained in:
nmzik committed 2026-10-28 22:31:16 +01:00
1 parent 963aaeb3b6
commit 138d5b86c4
8 files changed
+69 -9

No files matched your search

+49
View File
@@ -23748,6 +23748,46 @@ TestCase ScalarNotB64UpdatesScc() {
O::S_ENDPGM}};
}
TestCase ScalarQuadmaskB32(u32 wave_size) {
using O = ShaderOpcode;
TestCase test;
test.name = wave_size == 32 ? "ScalarQuadmaskB32Wave32" : "ScalarQuadmaskB32Wave64";
test.initial = {0, 0xffffffffu, 0x80000011u, 0x01010101u};
for (u32 bit = 0; bit < 32; ++bit) test.initial.push_back(1u << bit);
test.expected = test.initial;
auto &code = test.code;
for (u32 i = 0; i < test.initial.size(); ++i) {
u32 quads = 0;
for (u32 q = 0; q < 8; ++q) {
if ((test.initial[i] >> (4 * q)) & 15u) quads |= 1u << q;
}
AppendVMovU32(&code, 30, i * sizeof(u32));
AppendBufferLoadDword(&code, 2, 30);
for (u32 dst : {12u, 106u}) {
code.push_back(EncodeVop1(0x02, dst, Vgpr(2)));
AppendSMovLiteral(&code, dst + 1, 0xdeadbeefu);
code.push_back(EncodeSopc(0x06, InlineU32(quads == 0), InlineU32(1)));
code.push_back(EncodeSop1(0x2c, dst, dst));
code.push_back(EncodeSop2(0x0a, 14, InlineU32(1), InlineU32(0)));
AppendStoreSgpr(&code, dst, static_cast<u32>(test.expected.size()));
AppendStoreSgpr(&code, dst + 1, static_cast<u32>(test.expected.size()) + 1);
AppendStoreSgpr(&code, 14, static_cast<u32>(test.expected.size()) + 2);
test.expected.insert(test.expected.end(), {quads, 0xdeadbeefu, quads != 0});
}
}
code.push_back(EncodeSop1(0x2c, 12, 255));
code.push_back(0x000f000fu);
AppendStoreSgpr(&code, 12, static_cast<u32>(test.expected.size()));
test.expected.push_back(0x11u);
AppendEnd(&code);
test.opcodes = {O::S_QUADMASK_B32, O::S_CMP_EQ_U32, O::S_CSELECT_B32, O::S_MOV_B32,
O::V_READFIRSTLANE_B32, O::V_MOV_B32, O::BUFFER_LOAD_DWORD,
O::BUFFER_STORE_DWORD, O::S_ENDPGM};
test.compute_info.wave_size = wave_size;
test.has_compute_info = true;
return test;
}
TestCase ScalarQuadmaskB64() {
using O = ShaderOpcode;
@@ -46047,6 +46087,8 @@ std::vector<TestCase> MakeCases() {
AddCase(ScalarCompareOps);
AddCase(ScalarShiftAddAndMaskOps);
AddCase(ScalarNotB64UpdatesScc);
cases.push_back(ScalarQuadmaskB32(32));
cases.push_back(ScalarQuadmaskB32(64));
AddCase(ScalarQuadmaskB64);
AddCase(ScalarFlbitI32B64Gpu);
AddCase(ScalarFlbitI32B32Gpu);
@@ -52562,6 +52604,13 @@ int main(int argc, char **argv) {
std::setvbuf(stdout, nullptr, _IONBF, 0);
EnsureConfigInitialized();
CheckLeastRecentlyUsedCacheOrdering();
if (argc == 2 && std::strcmp(argv[1], "--quadmask-only") == 0) {
VulkanHarness vulkan;
RunCase(&vulkan, ScalarQuadmaskB32(32));
RunCase(&vulkan, ScalarQuadmaskB32(64));
RunCase(&vulkan, ScalarQuadmaskB64());
return 0;
}
if (argc == 2 && std::strcmp(argv[1], "--vop3-conversions-only") == 0) {
VulkanHarness vulkan;
RunCase(&vulkan, Vop3FloatConversions(32));