From: Dmitry Stogov Date: Wed, 25 Feb 2015 22:28:47 +0000 (+0300) Subject: Don't inline slow path X-Git-Tag: PRE_PHP7_EREG_MYSQL_REMOVALS~64 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=716da71446ebbd40fa6cf2cea8a4b70f504cc3cd;p=php Don't inline slow path --- diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 0a084036b8..d8be615c16 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -2870,6 +2870,38 @@ ZEND_API const char* zend_memnrstr_ex(const char *haystack, const char *needle, } /* }}} */ +#if !ZEND_DVAL_TO_LVAL_CAST_OK +# if SIZEOF_ZEND_LONG == 4 +ZEND_API zend_long zend_dval_to_lval_slow(double d) +{ + double two_pow_32 = pow(2., 32.), + dmod; + + dmod = fmod(d, two_pow_32); + if (dmod < 0) { + /* we're going to make this number positive; call ceil() + * to simulate rounding towards 0 of the negative number */ + dmod = ceil(dmod);// + two_pow_32; + } + return (zend_long)(zend_ulong)dmod; +} +#else +ZEND_API zend_long zend_dval_to_lval_slow(double d) +{ + double two_pow_64 = pow(2., 64.), + dmod; + + dmod = fmod(d, two_pow_64); + if (dmod < 0) { + /* no need to call ceil; original double must have had no + * fractional part, hence dmod does not have one either */ + dmod += two_pow_64; + } + return (zend_long)(zend_ulong)dmod; +} +#endif +#endif + /* * Local variables: * tab-width: 4 diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index d66f82d364..31d84fc5b1 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -108,41 +108,15 @@ static zend_always_inline zend_long zend_dval_to_lval(double d) return 0; } } -#elif SIZEOF_ZEND_LONG == 4 -static zend_always_inline zend_long zend_dval_to_lval(double d) -{ - if (UNEXPECTED(!zend_finite(d)) || UNEXPECTED(zend_isnan(d))) { - return 0; - } else if (!ZEND_DOUBLE_FITS_LONG(d)) { - double two_pow_32 = pow(2., 32.), - dmod; - - dmod = fmod(d, two_pow_32); - if (dmod < 0) { - /* we're going to make this number positive; call ceil() - * to simulate rounding towards 0 of the negative number */ - dmod = ceil(dmod) + two_pow_32; - } - return (zend_long)(zend_ulong)dmod; - } - return (zend_long)d; -} #else +ZEND_API zend_long zend_dval_to_lval_slow(double d); + static zend_always_inline zend_long zend_dval_to_lval(double d) { if (UNEXPECTED(!zend_finite(d)) || UNEXPECTED(zend_isnan(d))) { return 0; } else if (!ZEND_DOUBLE_FITS_LONG(d)) { - double two_pow_64 = pow(2., 64.), - dmod; - - dmod = fmod(d, two_pow_64); - if (dmod < 0) { - /* no need to call ceil; original double must have had no - * fractional part, hence dmod does not have one either */ - dmod += two_pow_64; - } - return (zend_long)(zend_ulong)dmod; + return zend_dval_to_lval_slow(d); } return (zend_long)d; }