shader: implement RDNA2 frexp exponent

This commit is contained in:
nmzik
2026-08-17 07:47:28 +02:00
parent 8ce06ccdf6
commit 1be9568a02
7 changed files with 63 additions and 0 deletions
+39
View File
@@ -13527,6 +13527,44 @@ TestCase VectorFloatConversionOps() {
O::SEndpgm}};
}
TestCase VectorFrexpExpI32F32Edges() {
using O = ShaderOpcode;
const std::vector<u32> inputs = {
0x00000000u, 0x80000000u, 0x3f000000u, 0xbf800000u,
0x40800000u, 0xc1000000u, 0x00800000u, 0x007fffffu,
0x00000001u, 0x7f800000u, 0x7fc00000u,
};
std::vector<u32> code;
for (u32 i = 0; i < static_cast<u32>(inputs.size()); i++) {
AppendVMovU32(&code, 31, i * sizeof(u32));
AppendBufferLoadDword(&code, i == 3u ? 23u : i, 31);
}
for (u32 i = 0; i < static_cast<u32>(inputs.size()); i++) {
const auto dst = 16u + i;
if (dst == 19u) {
code.push_back(0x7e267ef9u); // captured v_frexp_exp_i32_f32 v19, abs(v23)
code.push_back(0x00260617u);
} else {
code.push_back(EncodeVop1(0x3f, dst, Vgpr(i)));
}
AppendStoreVgpr(&code, dst, i);
}
AppendEnd(&code);
TestCase test;
test.name = "VectorFrexpExpI32F32Edges";
test.code = std::move(code);
test.initial = inputs;
test.expected = {0u, 0u, 0u, 1u, 3u, 4u,
0xffffff83u, 0xffffff82u, 0xffffff6cu, 0u, 0u};
test.opcodes = {O::VMovB32, O::BufferLoadDword, O::VFrexpExpI32F32,
O::BufferStoreDword, O::SEndpgm};
test.decoded_counts = {{"v_frexp_exp_i32_f32", inputs.size()}};
test.required_spirv = {"FindUMsb", "OpBitFieldUExtract"};
return test;
}
TestCase CvtF32ToIntSaturatesNaNAndOutOfRange() {
using O = ShaderOpcode;
@@ -17842,6 +17880,7 @@ std::vector<TestCase> MakeCases() {
AddCase(VectorMinMaxF32NanAndSignedZeroEdges);
AddCase(VectorMed3F32NanUsesMin3Path);
AddCase(VectorFloatConversionOps);
AddCase(VectorFrexpExpI32F32Edges);
AddCase(CvtF32ToIntSaturatesNaNAndOutOfRange);
AddCase(VectorSpecialF32FlushesDenormalInputs);
AddCase(VectorRcpIflagF32IntegerReciprocal);