From f8e2c6497bdf71344dd6a978233e32f3f8b901fa Mon Sep 17 00:00:00 2001 From: BIGFERRY999 Date: Mon, 12 Oct 2026 22:43:46 +0100 Subject: [PATCH] feat(libc): implement floor --- core/libs/prx/libc/src/Math.cpp | 1 + core/libs/tests/GuestMath.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/core/libs/prx/libc/src/Math.cpp b/core/libs/prx/libc/src/Math.cpp index 154bfa5ae..9705bb62e 100644 --- a/core/libs/prx/libc/src/Math.cpp +++ b/core/libs/prx/libc/src/Math.cpp @@ -200,6 +200,7 @@ double APS5_VABI fabs_nid_postfix(double x) { return std::fabs(x); } int APS5_VABI abs_nid_postfix(int x) { return x < 0 ? static_cast(0u - static_cast(x)) : x; } double APS5_VABI trunc_nid_postfix(double x) { return std::trunc(x); } double APS5_VABI ceil_nid_postfix(double x) { return std::ceil(x); } +double APS5_VABI floor_nid_postfix(double x) { return std::floor(x); } double APS5_VABI fma_nid_postfix(double x, double y, double z) { return std::fma(x, y, z); } long double APS5_VABI acosl_nid_postfix(long double x) { return std::acos(x); } diff --git a/core/libs/tests/GuestMath.cpp b/core/libs/tests/GuestMath.cpp index 103c6e5bd..3931dc388 100644 --- a/core/libs/tests/GuestMath.cpp +++ b/core/libs/tests/GuestMath.cpp @@ -34,6 +34,7 @@ double APS5_VABI fabs_nid_postfix(double); int APS5_VABI abs_nid_postfix(int); double APS5_VABI trunc_nid_postfix(double); double APS5_VABI ceil_nid_postfix(double); +double APS5_VABI floor_nid_postfix(double); double APS5_VABI nearbyint_nid_postfix(double); double APS5_VABI fma_nid_postfix(double, double, double); long double APS5_VABI acosl_nid_postfix(long double); @@ -146,6 +147,15 @@ static void CheckExactOperations() { Require(std::fesetround(FE_DOWNWARD) == 0); const bool ceilIgnoresRounding = ceil_nid_postfix(2.2) == 3. && ceil_nid_postfix(-2.7) == -2.; Require(std::fesetround(FE_TONEAREST) == 0 && ceilIgnoresRounding); + Require(floor_nid_postfix(2.7) == 2. && floor_nid_postfix(-2.2) == -3. && floor_nid_postfix(5.) == 5.); + Require(std::bit_cast(floor_nid_postfix(-0.5)) == 0xbff0000000000000ull); + Require(std::bit_cast(floor_nid_postfix(-0.)) == 0x8000000000000000ull && floor_nid_postfix(-0x1p-1074) == -1.); + Require(std::bit_cast(floor_nid_postfix(0.5)) == 0); + Require(floor_nid_postfix(4503599627370495.5) == 4503599627370495. && floor_nid_postfix(-1e300) == -1e300); + Require(floor_nid_postfix(INFINITY) == INFINITY && floor_nid_postfix(-INFINITY) == -INFINITY && std::isnan(floor_nid_postfix(nan))); + Require(std::fesetround(FE_UPWARD) == 0); + const bool floorIgnoresRounding = floor_nid_postfix(2.7) == 2. && floor_nid_postfix(-2.2) == -3.; + Require(std::fesetround(FE_TONEAREST) == 0 && floorIgnoresRounding); Require(fma_nid_postfix(2., 3., 4.) == 10.); volatile double tenth = 0.1; Require(fma_nid_postfix(tenth, 10., -1.) == 0x1p-54);