From a6faaea815cc0f9d685556ae748b93a72e4155ae Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Mon, 25 May 2020 10:33:58 +0200 Subject: [PATCH 1/3] Fix #79595: zend_init_fpu() alters FPU precision On startup, PHP deliberately changes the floating point control word to enforce binary64 format for the calculations for best consistency across platforms. However, this is unnessary for x86_64 architectures, because in this case SSE instructions are used by default, and there is no good reason to pass `-mfpmath=i387` or such. Therefore, we can skip the modification, which has the benefit that system libraries are free to work in the mode of their liking. --- Zend/zend_float.h | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/Zend/zend_float.h b/Zend/zend_float.h index 78d55d27ae19c..f093a02fccf03 100644 --- a/Zend/zend_float.h +++ b/Zend/zend_float.h @@ -55,10 +55,9 @@ END_EXTERN_C() Implementation notes: x86_64: - - Since all x86_64 compilers use SSE by default, it is probably unnecessary - to use these macros there. We define them anyway since we are too lazy - to differentiate the architecture. Also, the compiler option -mfpmath=i387 - justifies this decision. + - Since all x86_64 compilers use SSE by default, we do not define these + macros there. We ignore the compiler option -mfpmath=i387, because there is + no reason to use it on x86_64. General: - It would be nice if one could detect whether SSE if used for math via some @@ -67,9 +66,7 @@ END_EXTERN_C() MS Visual C: - Since MSVC users typically don't use autoconf or CMake, we will detect - MSVC via compile time define. Floating point precision change isn't - supported on 64 bit platforms, so it's NOP. See - http://msdn.microsoft.com/en-us/library/c9676k6h(v=vs.110).aspx + MSVC via compile time define. */ /* MSVC detection (MSVC people usually don't use autoconf) */ @@ -77,7 +74,7 @@ END_EXTERN_C() # define HAVE__CONTROLFP_S #endif /* _MSC_VER */ -#ifdef HAVE__CONTROLFP_S +#ifdef HAVE__CONTROLFP_S && !defined(__x86_64__) /* float.h defines _controlfp_s */ # include @@ -141,7 +138,7 @@ END_EXTERN_C() return _xpfpa_result; \ } while (0) -#elif defined(HAVE__CONTROLFP) +#elif defined(HAVE__CONTROLFP) && !defined(__x86_64__) /* float.h defines _controlfp */ # include @@ -200,7 +197,7 @@ END_EXTERN_C() return _xpfpa_result; \ } while (0) -#elif defined(HAVE__FPU_SETCW) /* glibc systems */ +#elif defined(HAVE__FPU_SETCW) && !defined(__x86_64__) /* glibc systems */ /* fpu_control.h defines _FPU_[GS]ETCW */ # include @@ -259,7 +256,7 @@ END_EXTERN_C() return _xpfpa_result; \ } while (0) -#elif defined(HAVE_FPSETPREC) /* FreeBSD */ +#elif defined(HAVE_FPSETPREC) && !defined(__x86_64__) /* FreeBSD */ /* fpu_control.h defines _FPU_[GS]ETCW */ # include From aef39f347caffea90a2657ec5a36659701f2d66a Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Mon, 25 May 2020 13:27:55 +0200 Subject: [PATCH 2/3] Fix CPP conditional --- Zend/zend_float.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_float.h b/Zend/zend_float.h index f093a02fccf03..95c66c817c464 100644 --- a/Zend/zend_float.h +++ b/Zend/zend_float.h @@ -74,7 +74,7 @@ END_EXTERN_C() # define HAVE__CONTROLFP_S #endif /* _MSC_VER */ -#ifdef HAVE__CONTROLFP_S && !defined(__x86_64__) +#if defined(HAVE__CONTROLFP_S) && !defined(__x86_64__) /* float.h defines _controlfp_s */ # include From c3fe3f7424b7e9a793ef4b55f197de9e2b6593af Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 26 May 2020 08:57:31 +0200 Subject: [PATCH 3/3] Add missing guard --- Zend/zend_float.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_float.h b/Zend/zend_float.h index 95c66c817c464..c8e91122a3590 100644 --- a/Zend/zend_float.h +++ b/Zend/zend_float.h @@ -312,7 +312,7 @@ END_EXTERN_C() return _xpfpa_result; \ } while (0) -#elif defined(HAVE_FPU_INLINE_ASM_X86) +#elif defined(HAVE_FPU_INLINE_ASM_X86) && !defined(__x86_64__) /* Custom x86 inline assembler implementation.