From f1f9c89004e9106a2007deaeb5e8083deb978edd Mon Sep 17 00:00:00 2001 From: Tanner Gooding Date: Tue, 28 Aug 2018 17:28:20 -0700 Subject: [PATCH] Updating floatdouble and floatsingle to work around an incorrect result under /fp:fast Commit migrated from https://github.com/dotnet/coreclr/commit/91eeb98c500d7d841f49eec7916d8c24d61d0eed --- src/coreclr/src/classlibnative/float/floatdouble.cpp | 18 ++++++++++++++++++ src/coreclr/src/classlibnative/float/floatsingle.cpp | 9 +++++++++ 2 files changed, 27 insertions(+) diff --git a/src/coreclr/src/classlibnative/float/floatdouble.cpp b/src/coreclr/src/classlibnative/float/floatdouble.cpp index 5911901..abce73d 100644 --- a/src/coreclr/src/classlibnative/float/floatdouble.cpp +++ b/src/coreclr/src/classlibnative/float/floatdouble.cpp @@ -123,6 +123,11 @@ FCIMPL1_V(double, COMDouble::Cbrt, double x) return (double)cbrt(x); FCIMPLEND +#if defined(_MSC_VER) && defined(_TARGET_AMD64_) +// The /fp:fast form of `ceil` for AMD64 does not correctly handle: `-1.0 < value <= -0.0` +#pragma float_control(precise, on ) +#endif + /*====================================Ceil====================================== ** ==============================================================================*/ @@ -132,6 +137,10 @@ FCIMPL1_V(double, COMDouble::Ceil, double x) return (double)ceil(x); FCIMPLEND +#if defined(_MSC_VER) && defined(_TARGET_AMD64_) +#pragma float_control(precise, off) +#endif + /*=====================================Cos====================================== ** ==============================================================================*/ @@ -159,6 +168,11 @@ FCIMPL1_V(double, COMDouble::Exp, double x) return (double)exp(x); FCIMPLEND +#if defined(_MSC_VER) && defined(_TARGET_X86_) +// The /fp:fast form of `floor` for x86 does not correctly handle: `-0.0` +#pragma float_control(precise, on ) +#endif + /*====================================Floor===================================== ** ==============================================================================*/ @@ -168,6 +182,10 @@ FCIMPL1_V(double, COMDouble::Floor, double x) return (double)floor(x); FCIMPLEND +#if defined(_MSC_VER) && defined(_TARGET_X86_) +#pragma float_control(precise, off) +#endif + /*=====================================FMod===================================== ** ==============================================================================*/ diff --git a/src/coreclr/src/classlibnative/float/floatsingle.cpp b/src/coreclr/src/classlibnative/float/floatsingle.cpp index 0be1ad7..2fac42f 100644 --- a/src/coreclr/src/classlibnative/float/floatsingle.cpp +++ b/src/coreclr/src/classlibnative/float/floatsingle.cpp @@ -121,6 +121,11 @@ FCIMPL1_V(float, COMSingle::Cbrt, float x) return (float)cbrtf(x); FCIMPLEND +#if defined(_MSC_VER) && defined(_TARGET_AMD64_) +// The /fp:fast form of `ceilf` for AMD64 does not correctly handle: `-1.0 < value <= -0.0` +#pragma float_control(precise, on ) +#endif + /*====================================Ceil====================================== ** ==============================================================================*/ @@ -130,6 +135,10 @@ FCIMPL1_V(float, COMSingle::Ceil, float x) return (float)ceilf(x); FCIMPLEND +#if defined(_MSC_VER) && defined(_TARGET_AMD64_) +#pragma float_control(precise, off) +#endif + /*=====================================Cos====================================== ** ==============================================================================*/ -- 2.7.4