diff --git a/core/libs/prx/libc/src/Math.cpp b/core/libs/prx/libc/src/Math.cpp index 9d6a8aebd..70757c8b4 100644 --- a/core/libs/prx/libc/src/Math.cpp +++ b/core/libs/prx/libc/src/Math.cpp @@ -127,7 +127,12 @@ float APS5_VABI logf_nid_postfix(float x) { return std::log(x); } float APS5_VABI log2f_nid_postfix(float x) { return std::log2(x); } double APS5_VABI log10_nid_postfix(double x) { return std::log10(x); } float APS5_VABI ldexpf_nid_postfix(float x, int exp) { return std::ldexp(x, exp); } -double APS5_VABI fmod_nid_postfix(double x, double y) { return std::fmod(x, y); } +double APS5_VABI fmod_nid_postfix(double x, double y) { + int saved_errno = errno; + double result = std::fmod(x, y); + errno = saved_errno; + return result; +} float APS5_VABI roundf_nid_postfix(float x) { return std::round(x); } double APS5_VABI round_nid_postfix(double x) { return std::round(x); } float APS5_VABI cbrtf_nid_postfix(float x) { return std::cbrt(x); } diff --git a/core/libs/tests/GuestMath.cpp b/core/libs/tests/GuestMath.cpp index 6d56671b5..b136655ec 100644 --- a/core/libs/tests/GuestMath.cpp +++ b/core/libs/tests/GuestMath.cpp @@ -38,6 +38,7 @@ extern LibcFloatConstant _FNan_nid_postfix; short APS5_VABI _FDtest_nid_postfix(const float*); int APS5_VABI __fpclassifyf_nid_postfix(float); float APS5_VABI fmodf_nid_postfix(float, float); +double APS5_VABI fmod_nid_postfix(double, double); float APS5_VABI asinf_nid_postfix(float); float APS5_VABI acosf_nid_postfix(float); float APS5_VABI atan2f_nid_postfix(float, float); @@ -150,6 +151,13 @@ static void CheckLongDouble() { Require(std::isnan(frexpl_nid_postfix(NAN, &exponent)) && exponent == 77); } +static void CheckFmodErrno() { + errno = 0; + (void)fmod_nid_postfix(1.0, 0.0); + Require(errno == 0); + Require(fmod_nid_postfix(1e300, 3.0) == std::fmod(1e300, 3.0)); +} + static void CheckIntegerConversions() { for (const long long numerator : {4294967301LL, -4294967301LL}) { for (const long long denominator : {3LL, -3LL}) { @@ -493,4 +501,5 @@ int main() { Require(abs_nid_postfix(std::numeric_limits::min()) == std::numeric_limits::min()); CheckHyperbolic(); CheckHypotSpecialValue(); + CheckFmodErrno(); }