Skip to content

Commit 879004d

Browse files
committed
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.
1 parent c6fc400 commit 879004d

File tree

2 files changed

+11
-13
lines changed

2 files changed

+11
-13
lines changed

NEWS

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ PHP NEWS
22
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
33
?? ??? 2020, PHP 7.4.8
44

5-
5+
- Core:
6+
. Fixed bug #79595 (zend_init_fpu() alters FPU precision). (cmb, Nikita)
67

78
11 Jun 2020, PHP 7.4.7
89

Zend/zend_float.h

+9-12
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,9 @@ END_EXTERN_C()
5555
Implementation notes:
5656
5757
x86_64:
58-
- Since all x86_64 compilers use SSE by default, it is probably unnecessary
59-
to use these macros there. We define them anyway since we are too lazy
60-
to differentiate the architecture. Also, the compiler option -mfpmath=i387
61-
justifies this decision.
58+
- Since all x86_64 compilers use SSE by default, we do not define these
59+
macros there. We ignore the compiler option -mfpmath=i387, because there is
60+
no reason to use it on x86_64.
6261
6362
General:
6463
- It would be nice if one could detect whether SSE if used for math via some
@@ -67,17 +66,15 @@ END_EXTERN_C()
6766
6867
MS Visual C:
6968
- Since MSVC users typically don't use autoconf or CMake, we will detect
70-
MSVC via compile time define. Floating point precision change isn't
71-
supported on 64 bit platforms, so it's NOP. See
72-
http://msdn.microsoft.com/en-us/library/c9676k6h(v=vs.110).aspx
69+
MSVC via compile time define.
7370
*/
7471

7572
/* MSVC detection (MSVC people usually don't use autoconf) */
7673
#if defined(_MSC_VER) && !defined(_WIN64)
7774
# define HAVE__CONTROLFP_S
7875
#endif /* _MSC_VER */
7976

80-
#ifdef HAVE__CONTROLFP_S
77+
#if defined(HAVE__CONTROLFP_S) && !defined(__x86_64__)
8178

8279
/* float.h defines _controlfp_s */
8380
# include <float.h>
@@ -141,7 +138,7 @@ END_EXTERN_C()
141138
return _xpfpa_result; \
142139
} while (0)
143140

144-
#elif defined(HAVE__CONTROLFP)
141+
#elif defined(HAVE__CONTROLFP) && !defined(__x86_64__)
145142

146143
/* float.h defines _controlfp */
147144
# include <float.h>
@@ -200,7 +197,7 @@ END_EXTERN_C()
200197
return _xpfpa_result; \
201198
} while (0)
202199

203-
#elif defined(HAVE__FPU_SETCW) /* glibc systems */
200+
#elif defined(HAVE__FPU_SETCW) && !defined(__x86_64__) /* glibc systems */
204201

205202
/* fpu_control.h defines _FPU_[GS]ETCW */
206203
# include <fpu_control.h>
@@ -259,7 +256,7 @@ END_EXTERN_C()
259256
return _xpfpa_result; \
260257
} while (0)
261258

262-
#elif defined(HAVE_FPSETPREC) /* FreeBSD */
259+
#elif defined(HAVE_FPSETPREC) && !defined(__x86_64__) /* FreeBSD */
263260

264261
/* fpu_control.h defines _FPU_[GS]ETCW */
265262
# include <machine/ieeefp.h>
@@ -315,7 +312,7 @@ END_EXTERN_C()
315312
return _xpfpa_result; \
316313
} while (0)
317314

318-
#elif defined(HAVE_FPU_INLINE_ASM_X86)
315+
#elif defined(HAVE_FPU_INLINE_ASM_X86) && !defined(__x86_64__)
319316

320317
/*
321318
Custom x86 inline assembler implementation.

0 commit comments

Comments
 (0)