php-src/Zend/zend_float.c
Christoph M. Becker 88dfc475c5 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 when compiling under
`__SSE__`, because in this case the x87 instructions are not used.
Therefore, we can skip the modification, which has the benefit that
system libraries are free to work in the mode of their liking.
2020-05-22 15:46:13 +02:00

60 lines
1.9 KiB
C

/*
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
| Copyright (c) Zend Technologies Ltd. (http://www.zend.com) |
+----------------------------------------------------------------------+
| This source file is subject to version 2.00 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.zend.com/license/2_00.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Christian Seiler <chris_se@gmx.net> |
+----------------------------------------------------------------------+
*/
#include "zend.h"
#include "zend_compile.h"
#include "zend_float.h"
ZEND_API void zend_init_fpu(void) /* {{{ */
{
/* under __SSE__ the FPCW is irrelevant; no need to change it */
#if XPFPA_HAVE_CW && !defined(__SSE__)
XPFPA_DECLARE
if (!EG(saved_fpu_cw_ptr)) {
EG(saved_fpu_cw_ptr) = (void*)&EG(saved_fpu_cw);
}
XPFPA_STORE_CW(EG(saved_fpu_cw_ptr));
XPFPA_SWITCH_DOUBLE();
#else
EG(saved_fpu_cw_ptr) = NULL;
#endif
}
/* }}} */
ZEND_API void zend_shutdown_fpu(void) /* {{{ */
{
#if XPFPA_HAVE_CW && !defined(__SSE__)
if (EG(saved_fpu_cw_ptr)) {
XPFPA_RESTORE_CW(EG(saved_fpu_cw_ptr));
}
#endif
EG(saved_fpu_cw_ptr) = NULL;
}
/* }}} */
ZEND_API void zend_ensure_fpu_mode(void) /* {{{ */
{
#ifndef __SSE__
XPFPA_DECLARE
XPFPA_SWITCH_DOUBLE();
#endif
}
/* }}} */