From c5107d50654571202ffee22a5288282ba9f0ad4b Mon Sep 17 00:00:00 2001 From: MarcZX100 Date: Thu, 8 Oct 2026 18:48:17 +0000 Subject: [PATCH] feat(libc): implement floating minmax --- core/libs/prx/libc/src/Math.cpp | 4 ++++ core/libs/tests/GuestMath.cpp | 13 +++++++++++++ 2 files changed, 17 insertions(+) diff --git a/core/libs/prx/libc/src/Math.cpp b/core/libs/prx/libc/src/Math.cpp index 1ae4fb350c7..4c7cc26d5aa 100644 --- a/core/libs/prx/libc/src/Math.cpp +++ b/core/libs/prx/libc/src/Math.cpp @@ -67,6 +67,10 @@ float APS5_VABI atanf_nid_postfix(float x) { return std::atan(x); } double APS5_VABI atan2_nid_postfix(double y, double x) { return std::atan2(y, x); } float APS5_VABI powf_nid_postfix(float base, float exp) { return std::pow(base, exp); } double APS5_VABI pow_nid_postfix(double base, double exp) { return std::pow(base, exp); } +double APS5_VABI fmin_nid_postfix(double x, double y) { return std::fmin(x, y); } +double APS5_VABI fmax_nid_postfix(double x, double y) { return std::fmax(x, y); } +float APS5_VABI fminf_nid_postfix(float x, float y) { return std::fmin(x, y); } +float APS5_VABI fmaxf_nid_postfix(float x, float y) { return std::fmax(x, y); } float APS5_VABI expf_nid_postfix(float x) { return std::exp(x); } float APS5_VABI exp2f_nid_postfix(float x) { return std::exp2(x); } float APS5_VABI logf_nid_postfix(float x) { return std::log(x); } diff --git a/core/libs/tests/GuestMath.cpp b/core/libs/tests/GuestMath.cpp index ffdc06dffa1..8c85fc4a5e1 100644 --- a/core/libs/tests/GuestMath.cpp +++ b/core/libs/tests/GuestMath.cpp @@ -30,6 +30,10 @@ float APS5_VABI tanf_nid_postfix(float); float APS5_VABI log10f_nid_postfix(float); float APS5_VABI logbf_nid_postfix(float); double APS5_VABI exp2_nid_postfix(double); +double APS5_VABI fmin_nid_postfix(double, double); +double APS5_VABI fmax_nid_postfix(double, double); +float APS5_VABI fminf_nid_postfix(float, float); +float APS5_VABI fmaxf_nid_postfix(float, float); double APS5_VABI ldexp_nid_postfix(double, int); double APS5_VABI scalbn_nid_postfix(double, int); float APS5_VABI scalbnf_nid_postfix(float, int); @@ -201,6 +205,15 @@ int main() { Require(logbf_nid_postfix(-std::numeric_limits::infinity()) == std::numeric_limits::infinity()); Require(std::isnan(logbf_nid_postfix(std::numeric_limits::quiet_NaN()))); Require(exp2_nid_postfix(-3.) == 0.125); + const double doubleNan = std::numeric_limits::quiet_NaN(); + const float floatNan = std::numeric_limits::quiet_NaN(); + Require(fmin_nid_postfix(3.0, -2.0) == -2.0 && fmax_nid_postfix(3.0, -2.0) == 3.0); + Require(fminf_nid_postfix(3.0f, -2.0f) == -2.0f && fmaxf_nid_postfix(3.0f, -2.0f) == 3.0f); + Require(fmin_nid_postfix(doubleNan, 4.0) == 4.0 && fmax_nid_postfix(4.0, doubleNan) == 4.0); + Require(fminf_nid_postfix(floatNan, 4.0f) == 4.0f && fmaxf_nid_postfix(4.0f, floatNan) == 4.0f); + Require(std::isnan(fmin_nid_postfix(doubleNan, doubleNan)) && std::isnan(fmaxf_nid_postfix(floatNan, floatNan))); + Require(std::isinf(fmin_nid_postfix(-std::numeric_limits::infinity(), 1.0))); + Require(std::isinf(fmaxf_nid_postfix(std::numeric_limits::infinity(), 1.0f))); Require(ldexp_nid_postfix(0.75, 4) == 12.); Require(scalbn_nid_postfix(0.75, -2) == 0.1875); Require(scalbnf_nid_postfix(0.75f, 4) == 12.f);