mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 10:56:58 +02:00
Revert "shader: preserve raw VCC bits in S_MOV_B64 (#418)"
This reverts commit 6758d67942.
An EXEC pair loses its mask provenance and falls into the raw high-word path. The saved all-ones high word then keeps waterfall branches true and wedges GPU work.
This commit is contained in:
@@ -12840,160 +12840,6 @@ TestCase ScalarNotB64UpdatesScc() {
|
||||
O::S_ENDPGM}};
|
||||
}
|
||||
|
||||
TestCase ScalarMovB64PreservesRawSpecialData() {
|
||||
using O = ShaderOpcode;
|
||||
|
||||
std::vector<u32> code;
|
||||
AppendSMovLiteral(&code, 0, 0x09500000u);
|
||||
AppendSMovLiteral(&code, 1, 0x81234567u);
|
||||
code.push_back(EncodeSop1(0x04, 106, 0)); // s_mov_b64 vcc, s[0:1]
|
||||
code.push_back(EncodeSop1(0x04, 2, 106)); // s_mov_b64 s[2:3], vcc
|
||||
code.push_back(EncodeSop1(0x08, 4, 2)); // s_not_b64 s[4:5], s[2:3]
|
||||
code.push_back(EncodeSop2(0x0a, 6, InlineU32(1), InlineU32(0)));
|
||||
|
||||
AppendStoreSgprPair(&code, 2, 0);
|
||||
AppendStoreSgprPair(&code, 4, 2);
|
||||
AppendStoreSgpr(&code, 6, 4);
|
||||
|
||||
AppendSMovLiteral(&code, 8, 0x09500001u);
|
||||
AppendSMovLiteral(&code, 9, 0x81234567u);
|
||||
code.push_back(EncodeSop1(0x04, 126, 8)); // s_mov_b64 exec, s[8:9]
|
||||
code.push_back(EncodeSop1(0x04, 10, 126)); // s_mov_b64 s[10:11], exec
|
||||
code.push_back(EncodeSop1(0x08, 12, 10)); // s_not_b64 s[12:13], s[10:11]
|
||||
code.push_back(EncodeSop2(0x0a, 14, InlineU32(1), InlineU32(0)));
|
||||
|
||||
AppendStoreSgprPair(&code, 10, 5);
|
||||
AppendStoreSgprPair(&code, 12, 7);
|
||||
AppendStoreSgpr(&code, 14, 9);
|
||||
AppendEnd(&code);
|
||||
|
||||
return {"ScalarMovB64PreservesRawSpecialData",
|
||||
code,
|
||||
{},
|
||||
{0x09500000u, 0x81234567u, 0xf6afffffu, 0x7edcba98u, 1u,
|
||||
0x09500001u, 0x81234567u, 0xf6affffeu, 0x7edcba98u, 1u},
|
||||
{O::S_MOV_B32, O::S_MOV_B64, O::S_NOT_B64, O::S_CSELECT_B32,
|
||||
O::V_MOV_B32, O::BUFFER_STORE_DWORD, O::S_ENDPGM}};
|
||||
}
|
||||
|
||||
TestCase Scalar64RawSpecialOps() {
|
||||
using O = ShaderOpcode;
|
||||
|
||||
std::vector<u32> code;
|
||||
const auto capture_scc = [&](u32 dst) {
|
||||
code.push_back(EncodeSop2(0x0a, dst, InlineU32(1), InlineU32(0)));
|
||||
};
|
||||
|
||||
AppendSMovLiteral(&code, 0, 0x09500001u);
|
||||
AppendSMovLiteral(&code, 1, 0x81234567u);
|
||||
AppendSMovLiteral(&code, 2, 0xff00ff01u);
|
||||
AppendSMovLiteral(&code, 3, 0x0f0f0f0fu);
|
||||
code.push_back(EncodeSop1(0x04, 126, 0));
|
||||
code.push_back(EncodeSop2(0x0f, 106, 126, 2));
|
||||
code.push_back(EncodeSop1(0x04, 4, 106));
|
||||
capture_scc(6);
|
||||
code.push_back(EncodeSop1(0x08, 106, 106));
|
||||
code.push_back(EncodeSop1(0x04, 8, 106));
|
||||
capture_scc(10);
|
||||
|
||||
AppendSMovLiteral(&code, 12, 0x80000011u);
|
||||
AppendSMovLiteral(&code, 13, 0x80000001u);
|
||||
code.push_back(EncodeSop1(0x04, 106, 12));
|
||||
code.push_back(EncodeSop1(0x0a, 106, 106));
|
||||
code.push_back(EncodeSop1(0x04, 14, 106));
|
||||
capture_scc(16);
|
||||
|
||||
code.push_back(EncodeSop1(0x0a, 26, 193u));
|
||||
capture_scc(28);
|
||||
|
||||
code.push_back(EncodeSMovB32(18, InlineU32(1)));
|
||||
code.push_back(EncodeSMovB32(19, InlineU32(0)));
|
||||
code.push_back(EncodeSopc(0x06, InlineU32(1), InlineU32(1)));
|
||||
code.push_back(EncodeSop2(0x0b, 126, 0, 18));
|
||||
code.push_back(EncodeSop1(0x04, 20, 126));
|
||||
code.push_back(EncodeSop1(0x08, 106, 126));
|
||||
code.push_back(EncodeSop1(0x04, 22, 106));
|
||||
capture_scc(24);
|
||||
code.push_back(EncodeSop1(0x04, 126, 18));
|
||||
|
||||
AppendStoreSgprPair(&code, 4, 0);
|
||||
AppendStoreSgpr(&code, 6, 2);
|
||||
AppendStoreSgprPair(&code, 8, 3);
|
||||
AppendStoreSgpr(&code, 10, 5);
|
||||
AppendStoreSgprPair(&code, 14, 6);
|
||||
AppendStoreSgpr(&code, 16, 8);
|
||||
AppendStoreSgprPair(&code, 26, 9);
|
||||
AppendStoreSgpr(&code, 28, 11);
|
||||
AppendStoreSgprPair(&code, 20, 12);
|
||||
AppendStoreSgprPair(&code, 22, 14);
|
||||
AppendStoreSgpr(&code, 24, 16);
|
||||
AppendEnd(&code);
|
||||
|
||||
return {"Scalar64RawSpecialOps",
|
||||
code,
|
||||
{},
|
||||
{0x09000001u, 0x01030507u, 1, 0xf6fffffeu, 0xfefcfaf8u, 1,
|
||||
0xf00000ffu, 0xf000000fu, 1, 0xffffffffu, 0xffffffffu, 1,
|
||||
0x09500001u, 0x81234567u, 0xf6affffeu, 0x7edcba98u, 1},
|
||||
{O::S_MOV_B32, O::S_MOV_B64, O::S_AND_B64, O::S_NOT_B64,
|
||||
O::S_CSELECT_B32, O::S_WQM_B64, O::S_CMP_EQ_U32, O::S_CSELECT_B64,
|
||||
O::V_MOV_B32, O::BUFFER_STORE_DWORD, O::S_ENDPGM}};
|
||||
}
|
||||
|
||||
TestCase ScalarMovB32SpecialAliases() {
|
||||
using O = ShaderOpcode;
|
||||
|
||||
std::vector<u32> code;
|
||||
const auto capture_scc = [&](u32 dst) {
|
||||
code.push_back(EncodeSop2(0x0a, dst, InlineU32(1), InlineU32(0)));
|
||||
};
|
||||
|
||||
AppendSMovLiteral(&code, 0, 0x09500001u);
|
||||
AppendSMovLiteral(&code, 1, 0x81234567u);
|
||||
AppendSMovLiteral(&code, 2, 0xaaaaaaaau);
|
||||
AppendSMovLiteral(&code, 3, 0xbbbbbbbbu);
|
||||
code.push_back(EncodeSMovB32(4, InlineU32(1)));
|
||||
code.push_back(EncodeSMovB32(5, InlineU32(0)));
|
||||
code.push_back(EncodeSop1(0x04, 126, 0));
|
||||
code.push_back(EncodeSop1(0x04, 106, 2));
|
||||
code.push_back(EncodeSMovB32(107, 126));
|
||||
code.push_back(EncodeSop1(0x04, 6, 106));
|
||||
code.push_back(EncodeSop1(0x08, 8, 106));
|
||||
capture_scc(10);
|
||||
|
||||
AppendSMovLiteral(&code, 12, 0x13579bdfu);
|
||||
AppendSMovLiteral(&code, 13, 0x2468ace0u);
|
||||
code.push_back(EncodeSop1(0x04, 106, 12));
|
||||
code.push_back(EncodeSMovB32(126, 106));
|
||||
code.push_back(EncodeSop1(0x04, 14, 126));
|
||||
code.push_back(EncodeSop1(0x04, 126, 4));
|
||||
|
||||
code.push_back(EncodeVopc(0xc2, InlineU32(0), 0));
|
||||
code.push_back(EncodeSMovB32(106, 106));
|
||||
code.push_back(EncodeSop1(0x08, 16, 106));
|
||||
capture_scc(18);
|
||||
code.push_back(EncodeSop1(0x04, 20, 106));
|
||||
code.push_back(EncodeSMovB32(20, 20));
|
||||
code.push_back(EncodeSop1(0x08, 22, 20));
|
||||
capture_scc(24);
|
||||
|
||||
AppendStoreSgprPair(&code, 6, 0);
|
||||
AppendStoreSgprPair(&code, 8, 2);
|
||||
AppendStoreSgpr(&code, 10, 4);
|
||||
AppendStoreSgprPair(&code, 14, 5);
|
||||
AppendStoreSgpr(&code, 18, 7);
|
||||
AppendStoreSgpr(&code, 24, 8);
|
||||
AppendEnd(&code);
|
||||
|
||||
return {"ScalarMovB32SpecialAliases",
|
||||
code,
|
||||
{},
|
||||
{0xaaaaaaaau, 0x09500001u, 0x55555555u, 0xf6affffeu, 1, 0x13579bdfu,
|
||||
0x81234567u, 0, 0},
|
||||
{O::S_MOV_B32, O::S_MOV_B64, O::S_NOT_B64, O::S_CSELECT_B32,
|
||||
O::V_CMP_EQ_U32, O::V_MOV_B32, O::BUFFER_STORE_DWORD, O::S_ENDPGM}};
|
||||
}
|
||||
|
||||
TestCase ScalarQuadmaskB64() {
|
||||
using O = ShaderOpcode;
|
||||
|
||||
@@ -13122,7 +12968,8 @@ TestCase ScalarSaveExecOps() {
|
||||
return {"ScalarSaveExecOps",
|
||||
code,
|
||||
{},
|
||||
{1, 0, 1, 0, 0xffffffffu, 0xffffffffu, 1, 1, 0, 1, 0, 0, 0},
|
||||
// EXEC and saved EXEC values are invocation-local Booleans.
|
||||
{1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0},
|
||||
{O::S_MOV_B32, O::S_AND_SAVEEXEC_B64, O::S_ORN2_SAVEEXEC_B64,
|
||||
O::S_ANDN1_SAVEEXEC_B64, O::S_AND_SAVEEXEC_B32,
|
||||
O::S_ANDN1_SAVEEXEC_B32, O::S_MOV_B64, O::V_MOV_B32,
|
||||
@@ -13149,7 +12996,7 @@ TestCase ScalarOrn2SaveexecUsesSourceOrNotExec() {
|
||||
return {"ScalarOrn2SaveexecUsesSourceOrNotExec",
|
||||
code,
|
||||
{},
|
||||
{0x0000000cu, 0x80000000u, 0xfffffff3u, 0x7fffffffu, 1},
|
||||
{1, 0, 1, 0, 1},
|
||||
{O::S_MOV_B32, O::S_ORN2_SAVEEXEC_B64, O::S_MOV_B64, O::V_MOV_B32,
|
||||
O::BUFFER_STORE_DWORD, O::S_ENDPGM}};
|
||||
}
|
||||
@@ -16835,30 +16682,6 @@ TestCase ScalarMemoryLoadVariants() {
|
||||
O::BUFFER_STORE_DWORD, O::S_ENDPGM}};
|
||||
}
|
||||
|
||||
TestCase ScalarLoadUsesRawExecAddress() {
|
||||
using O = ShaderOpcode;
|
||||
|
||||
std::vector<u32> code;
|
||||
code.push_back(EncodeSMovB32(0, InlineU32(0)));
|
||||
code.push_back(EncodeSMovB32(1, InlineU32(0)));
|
||||
code.push_back(EncodeSMovB32(2, InlineU32(4)));
|
||||
code.push_back(EncodeSMovB32(3, InlineU32(0)));
|
||||
code.push_back(EncodeSop1(0x04, 126, 2));
|
||||
code.push_back(EncodeSmem0(0x00, 20, 63));
|
||||
code.push_back(EncodeSmem1(0));
|
||||
code.push_back(EncodeSMovB32(2, InlineU32(1)));
|
||||
code.push_back(EncodeSop1(0x04, 126, 2));
|
||||
AppendStoreSgpr(&code, 20, 0);
|
||||
AppendEnd(&code);
|
||||
|
||||
return {"ScalarLoadUsesRawExecAddress",
|
||||
code,
|
||||
{0x11111111u, 0x22222222u},
|
||||
{0x22222222u, 0x22222222u},
|
||||
{O::S_MOV_B32, O::S_MOV_B64, O::S_LOAD_DWORD, O::V_MOV_B32,
|
||||
O::BUFFER_STORE_DWORD, O::S_ENDPGM}};
|
||||
}
|
||||
|
||||
TestCase ScalarLoadSignedImmediateOffsetAddsSoffset() {
|
||||
using O = ShaderOpcode;
|
||||
|
||||
@@ -21302,9 +21125,6 @@ std::vector<TestCase> MakeCases() {
|
||||
AddCase(ScalarCompareOps);
|
||||
AddCase(ScalarShiftAddAndMaskOps);
|
||||
AddCase(ScalarNotB64UpdatesScc);
|
||||
AddCase(ScalarMovB64PreservesRawSpecialData);
|
||||
AddCase(Scalar64RawSpecialOps);
|
||||
AddCase(ScalarMovB32SpecialAliases);
|
||||
AddCase(ScalarQuadmaskB64);
|
||||
AddCase(ScalarFlbitI32B64Gpu);
|
||||
AddCase(ScalarFlbitI32B32Gpu);
|
||||
@@ -21421,7 +21241,6 @@ std::vector<TestCase> MakeCases() {
|
||||
AddCase(BranchVccnzUsesInvocationMask);
|
||||
AddCase(BranchVccnzUsesCarryProducedInvocationMask);
|
||||
AddCase(ScalarMemoryLoadVariants);
|
||||
AddCase(ScalarLoadUsesRawExecAddress);
|
||||
AddCase(ScalarLoadSignedImmediateOffsetAddsSoffset);
|
||||
AddCase(ScalarLoadAlignsComponentsAndMasksAddress);
|
||||
AddCase(BufferLoadStore);
|
||||
|
||||
+11
-17
@@ -9059,12 +9059,10 @@ void TestTypedEntryStateIsMinimal() {
|
||||
translate_options);
|
||||
|
||||
uint32_t set_exec = 0;
|
||||
uint32_t set_exec_mask_tag = 0;
|
||||
uint32_t set_exec_lo = 0;
|
||||
uint32_t set_exec_hi = 0;
|
||||
uint32_t ballots = 0;
|
||||
IR::Value exec;
|
||||
IR::Value exec_mask_tag;
|
||||
IR::Value exec_lo;
|
||||
IR::Value exec_hi;
|
||||
for (const auto *block : values.blocks) {
|
||||
@@ -9077,10 +9075,6 @@ void TestTypedEntryStateIsMinimal() {
|
||||
set_exec++;
|
||||
exec = inst.Arg(0).Resolve();
|
||||
break;
|
||||
case IR::ValueOpcode::SetExecMaskTag:
|
||||
set_exec_mask_tag++;
|
||||
exec_mask_tag = inst.Arg(0).Resolve();
|
||||
break;
|
||||
case IR::ValueOpcode::SetExecLo:
|
||||
set_exec_lo++;
|
||||
exec_lo = inst.Arg(0).Resolve();
|
||||
@@ -9095,7 +9089,6 @@ void TestTypedEntryStateIsMinimal() {
|
||||
case IR::ValueOpcode::SetVectorRegister:
|
||||
case IR::ValueOpcode::SetScc:
|
||||
case IR::ValueOpcode::SetVcc:
|
||||
case IR::ValueOpcode::SetVccMaskValidTag:
|
||||
case IR::ValueOpcode::SetVccLo:
|
||||
case IR::ValueOpcode::SetVccHi:
|
||||
case IR::ValueOpcode::SetM0:
|
||||
@@ -9106,9 +9099,8 @@ void TestTypedEntryStateIsMinimal() {
|
||||
}
|
||||
}
|
||||
}
|
||||
Check(set_exec == 1u && set_exec_mask_tag == 1u && set_exec_lo == 1u &&
|
||||
set_exec_hi == 1u && ballots == 0u && exec.IsImmediate() &&
|
||||
exec.U1() && exec_mask_tag.IsImmediate() && exec_mask_tag.U1() &&
|
||||
Check(set_exec == 1u && set_exec_lo == 1u && set_exec_hi == 1u &&
|
||||
ballots == 0u && exec.IsImmediate() && exec.U1() &&
|
||||
exec_lo.IsImmediate() && exec_lo.U32() == 1u &&
|
||||
exec_hi.IsImmediate() && exec_hi.U32() == 0u,
|
||||
"typed entry is not the local {1,0} invocation mask");
|
||||
@@ -9937,16 +9929,18 @@ void TestNewShaderRecompilerPerInvocationMasksWithoutMirrors() {
|
||||
result = ShaderRecompiler::Recompile(wqm_shader, options);
|
||||
CheckSpirvBinaryValidates(result.spirv);
|
||||
const auto wqm_source = DisassembleSpirvBinary(result.spirv);
|
||||
Check(!Common::ContainsStr(wqm_source, "OpGroupNonUniformBallot"),
|
||||
"raw scalar WQM reconstructed its source from invocation provenance");
|
||||
Check(Common::ContainsStr(wqm_source, "OpCapability GroupNonUniformBallot") &&
|
||||
Common::ContainsStr(wqm_source, "OpGroupNonUniformBallot"),
|
||||
"per-invocation scalar WQM omitted its subgroup ballot capability");
|
||||
Check(SpirvInstructionOpcodeCount(result.spirv, 132u) == 2u,
|
||||
"wave64 WQM did not compact exactly two ballot words");
|
||||
|
||||
auto wave32_options = options;
|
||||
wave32_options.wave_size = 32u;
|
||||
result = ShaderRecompiler::Recompile(wqm_shader, wave32_options);
|
||||
CheckSpirvBinaryValidates(result.spirv);
|
||||
Check(!Common::ContainsStr(DisassembleSpirvBinary(result.spirv),
|
||||
"OpGroupNonUniformBallot"),
|
||||
"wave32 raw scalar WQM reconstructed invocation provenance");
|
||||
Check(SpirvInstructionOpcodeCount(result.spirv, 132u) == 1u,
|
||||
"wave32 WQM retained the unused high ballot-word expansion");
|
||||
|
||||
const uint32_t cross_lane_shader[] = {
|
||||
EncodeSop2(0x25, 126, 132, 128), // s_bfm_b64 exec, 4, 0
|
||||
@@ -11868,8 +11862,8 @@ void TestNewShaderRecompilerSpirvSizeBaselines() {
|
||||
.conditional_branches = 1,
|
||||
.ballots = 1},
|
||||
ShaderType::Vertex);
|
||||
Check(Common::ContainsStr(wqm_result.ir_dump, "WqmU64"),
|
||||
"WQM size fixture no longer reaches raw WqmU64 IR");
|
||||
Check(Common::ContainsStr(wqm_result.ir_dump, "WqmMask"),
|
||||
"WQM size fixture no longer reaches per-invocation WqmMask IR");
|
||||
|
||||
const uint32_t dispatcher[] = {
|
||||
EncodeSopp(0x05, 2), // entry -> B, fallthrough A
|
||||
|
||||
Reference in New Issue
Block a user