From 9621400ef609f50f1e10d22d3a803c7e00aa5913 Mon Sep 17 00:00:00 2001 From: "Herman S." <429230+has207@users.noreply.github.com> Date: Sat, 21 Mar 2026 15:16:11 +0900 Subject: [PATCH] [Testing] Add denormal input/output tests for VMX128 float instructions --- src/xenia/cpu/ppc/testing/instr_vmaddfp128.s | 36 +++++++++++++++++++ src/xenia/cpu/ppc/testing/instr_vmsum3fp128.s | 16 +++++++++ src/xenia/cpu/ppc/testing/instr_vmsum4fp128.s | 16 +++++++++ src/xenia/cpu/ppc/testing/instr_vnmsubfp128.s | 18 ++++++++++ 4 files changed, 86 insertions(+) diff --git a/src/xenia/cpu/ppc/testing/instr_vmaddfp128.s b/src/xenia/cpu/ppc/testing/instr_vmaddfp128.s index e615f72e4..297f9b1dc 100644 --- a/src/xenia/cpu/ppc/testing/instr_vmaddfp128.s +++ b/src/xenia/cpu/ppc/testing/instr_vmaddfp128.s @@ -52,3 +52,39 @@ test_vmaddfp128_5: #_ REGISTER_OUT v3 [40400000, 40400000, 40400000, 40400000] #_ REGISTER_OUT v4 [BF800000, BF800000, BF800000, BF800000] #_ REGISTER_OUT v5 [40000000, 40000000, 40000000, 40000000] + +test_vmaddfp128_6: + # Denormal in VA flushed to +0.0: (denorm * 2.0) + 1.0 = (0.0 * 2.0) + 1.0 = 1.0 + #_ REGISTER_IN v3 [3F800000, 3F800000, 3F800000, 3F800000] + #_ REGISTER_IN v4 [007FFFFF, 007FFFFF, 007FFFFF, 007FFFFF] + #_ REGISTER_IN v5 [40000000, 40000000, 40000000, 40000000] + vmaddfp128 v3, v4, v5, v3 + blr + #_ REGISTER_OUT v3 [3F800000, 3F800000, 3F800000, 3F800000] + +test_vmaddfp128_7: + # Denormal in VB flushed to +0.0: (2.0 * denorm) + 1.0 = (2.0 * 0.0) + 1.0 = 1.0 + #_ REGISTER_IN v3 [3F800000, 3F800000, 3F800000, 3F800000] + #_ REGISTER_IN v4 [40000000, 40000000, 40000000, 40000000] + #_ REGISTER_IN v5 [007FFFFF, 007FFFFF, 007FFFFF, 007FFFFF] + vmaddfp128 v3, v4, v5, v3 + blr + #_ REGISTER_OUT v3 [3F800000, 3F800000, 3F800000, 3F800000] + +test_vmaddfp128_8: + # Denormal in addend flushed to +0.0: (2.0 * 3.0) + denorm = 6.0 + 0.0 = 6.0 + #_ REGISTER_IN v3 [007FFFFF, 007FFFFF, 007FFFFF, 007FFFFF] + #_ REGISTER_IN v4 [40000000, 40000000, 40000000, 40000000] + #_ REGISTER_IN v5 [40400000, 40400000, 40400000, 40400000] + vmaddfp128 v3, v4, v5, v3 + blr + #_ REGISTER_OUT v3 [40C00000, 40C00000, 40C00000, 40C00000] + +test_vmaddfp128_9: + # Negative denormal flushed to -0.0: (neg_denorm * 2.0) + 1.0 = (-0.0 * 2.0) + 1.0 = 1.0 + #_ REGISTER_IN v3 [3F800000, 3F800000, 3F800000, 3F800000] + #_ REGISTER_IN v4 [807FFFFF, 807FFFFF, 807FFFFF, 807FFFFF] + #_ REGISTER_IN v5 [40000000, 40000000, 40000000, 40000000] + vmaddfp128 v3, v4, v5, v3 + blr + #_ REGISTER_OUT v3 [3F800000, 3F800000, 3F800000, 3F800000] diff --git a/src/xenia/cpu/ppc/testing/instr_vmsum3fp128.s b/src/xenia/cpu/ppc/testing/instr_vmsum3fp128.s index f88cf8a6c..84d23ffb3 100644 --- a/src/xenia/cpu/ppc/testing/instr_vmsum3fp128.s +++ b/src/xenia/cpu/ppc/testing/instr_vmsum3fp128.s @@ -8,3 +8,19 @@ test_vmsum3fp128_1: #_ REGISTER_OUT v3 [3f800000, 3fc00000, 3f8ccccd, 01020304] #_ REGISTER_OUT v4 [40000000, 40700000, 4013d70a, 01020304] #_ REGISTER_OUT v5 [4122A7F0, 4122A7F0, 4122A7F0, 4122A7F0] + +test_vmsum3fp128_2: + # Denormal output flushed to +0.0: FLT_MIN * 0.5 + 0 + 0 = denormal -> +0.0 + #_ REGISTER_IN v3 [00800000, 00000000, 00000000, 00000000] + #_ REGISTER_IN v4 [3F000000, 00000000, 00000000, 00000000] + vmsum3fp128 v5, v3, v4 + blr + #_ REGISTER_OUT v5 [00000000, 00000000, 00000000, 00000000] + +test_vmsum3fp128_3: + # Negative denormal output flushed to -0.0: -FLT_MIN * 0.5 + 0 + 0 = neg denormal -> -0.0 + #_ REGISTER_IN v3 [80800000, 00000000, 00000000, 00000000] + #_ REGISTER_IN v4 [3F000000, 00000000, 00000000, 00000000] + vmsum3fp128 v5, v3, v4 + blr + #_ REGISTER_OUT v5 [80000000, 80000000, 80000000, 80000000] diff --git a/src/xenia/cpu/ppc/testing/instr_vmsum4fp128.s b/src/xenia/cpu/ppc/testing/instr_vmsum4fp128.s index 4243dd057..8dd32c134 100644 --- a/src/xenia/cpu/ppc/testing/instr_vmsum4fp128.s +++ b/src/xenia/cpu/ppc/testing/instr_vmsum4fp128.s @@ -6,3 +6,19 @@ test_vmsum4fp128_1: #_ REGISTER_OUT v3 [3f800000, 3fc00000, 3f8ccccd, 3ff33333] #_ REGISTER_OUT v4 [40000000, 40700000, 4013d70a, 40b051eb] #_ REGISTER_OUT v5 [41A5147B, 41A5147B, 41A5147B, 41A5147B] + +test_vmsum4fp128_2: + # Denormal output flushed to +0.0: FLT_MIN * 0.5 + 0 + 0 + 0 = denormal -> +0.0 + #_ REGISTER_IN v3 [00800000, 00000000, 00000000, 00000000] + #_ REGISTER_IN v4 [3F000000, 00000000, 00000000, 00000000] + vmsum4fp128 v5, v3, v4 + blr + #_ REGISTER_OUT v5 [00000000, 00000000, 00000000, 00000000] + +test_vmsum4fp128_3: + # Negative denormal output flushed to -0.0: -FLT_MIN * 0.5 + 0 + 0 + 0 = neg denormal -> -0.0 + #_ REGISTER_IN v3 [80800000, 00000000, 00000000, 00000000] + #_ REGISTER_IN v4 [3F000000, 00000000, 00000000, 00000000] + vmsum4fp128 v5, v3, v4 + blr + #_ REGISTER_OUT v5 [80000000, 80000000, 80000000, 80000000] diff --git a/src/xenia/cpu/ppc/testing/instr_vnmsubfp128.s b/src/xenia/cpu/ppc/testing/instr_vnmsubfp128.s index 1ea2a75cb..64f50e5e1 100644 --- a/src/xenia/cpu/ppc/testing/instr_vnmsubfp128.s +++ b/src/xenia/cpu/ppc/testing/instr_vnmsubfp128.s @@ -52,3 +52,21 @@ test_vnmsubfp128_5: #_ REGISTER_OUT v3 [C0E00000, C0E00000, C0E00000, C0E00000] #_ REGISTER_OUT v4 [40400000, 40400000, 40400000, 40400000] #_ REGISTER_OUT v5 [40400000, 40400000, 40400000, 40400000] + +test_vnmsubfp128_6: + # Denormal in VA flushed to +0.0: -((denorm * 2.0) - 1.0) = -((0.0) - 1.0) = 1.0 + #_ REGISTER_IN v3 [3F800000, 3F800000, 3F800000, 3F800000] + #_ REGISTER_IN v4 [007FFFFF, 007FFFFF, 007FFFFF, 007FFFFF] + #_ REGISTER_IN v5 [40000000, 40000000, 40000000, 40000000] + vnmsubfp128 v3, v4, v5, v3 + blr + #_ REGISTER_OUT v3 [3F800000, 3F800000, 3F800000, 3F800000] + +test_vnmsubfp128_7: + # Denormal in subtrahend flushed to +0.0: -((2.0 * 3.0) - denorm) = -(6.0 - 0.0) = -6.0 + #_ REGISTER_IN v3 [007FFFFF, 007FFFFF, 007FFFFF, 007FFFFF] + #_ REGISTER_IN v4 [40000000, 40000000, 40000000, 40000000] + #_ REGISTER_IN v5 [40400000, 40400000, 40400000, 40400000] + vnmsubfp128 v3, v4, v5, v3 + blr + #_ REGISTER_OUT v3 [C0C00000, C0C00000, C0C00000, C0C00000]