]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.1'
authorNikita Popov <nikic@php.net>
Fri, 16 Sep 2016 19:06:52 +0000 (21:06 +0200)
committerNikita Popov <nikic@php.net>
Fri, 16 Sep 2016 19:06:52 +0000 (21:06 +0200)
1  2 
Zend/zend_operators.h

index ca772c0de0f9080413fc50f8b2f99e02efc1fb53,4e5a98c1ab90d52713ee3104e53ec867f92f6002..2525ebca2bdddbc06fd4c64f9c9d7390b30071b4
@@@ -549,21 -520,10 +549,24 @@@ static zend_always_inline void fast_lon
  
  static zend_always_inline void fast_long_add_function(zval *result, zval *op1, zval *op2)
  {
 -#if defined(__GNUC__) && defined(__i386__) \
 +#if PHP_HAVE_BUILTIN_SADDL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG
 +      long lresult;
 +      if (UNEXPECTED(__builtin_saddl_overflow(Z_LVAL_P(op1), Z_LVAL_P(op2), &lresult))) {
 +              ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2));
 +      } else {
 +              ZVAL_LONG(result, lresult);
 +      }
 +#elif PHP_HAVE_BUILTIN_SADDLL_OVERFLOW && SIZEOF_LONG_LONG == SIZEOF_ZEND_LONG
 +      long long llresult;
 +      if (UNEXPECTED(__builtin_saddll_overflow(Z_LVAL_P(op1), Z_LVAL_P(op2), &llresult))) {
 +              ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2));
 +      } else {
 +              ZVAL_LONG(result, llresult);
 +      }
- #elif defined(__GNUC__) && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__)
++#elif defined(__GNUC__) && defined(__i386__) \
+       && !(4 == __GNUC__ && 8 == __GNUC_MINOR__) \
+       && !(4 == __GNUC__ && 9 == __GNUC_MINOR__ && (defined(__PIC__) || defined(__PIE__)))
+       /* Position-independent builds fail with gcc-4.9.x */
        __asm__(
                "movl   (%1), %%eax\n\t"
                "addl   (%2), %%eax\n\t"
@@@ -649,21 -609,10 +652,24 @@@ static zend_always_inline int fast_add_
  
  static zend_always_inline void fast_long_sub_function(zval *result, zval *op1, zval *op2)
  {
 -#if defined(__GNUC__) && defined(__i386__) && \
 +#if PHP_HAVE_BUILTIN_SSUBL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG
 +      long lresult;
 +      if (UNEXPECTED(__builtin_ssubl_overflow(Z_LVAL_P(op1), Z_LVAL_P(op2), &lresult))) {
 +              ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2));
 +      } else {
 +              ZVAL_LONG(result, lresult);
 +      }
 +#elif PHP_HAVE_BUILTIN_SSUBLL_OVERFLOW && SIZEOF_LONG_LONG == SIZEOF_ZEND_LONG
 +      long long llresult;
 +      if (UNEXPECTED(__builtin_ssubll_overflow(Z_LVAL_P(op1), Z_LVAL_P(op2), &llresult))) {
 +              ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2));
 +      } else {
 +              ZVAL_LONG(result, llresult);
 +      }
- #elif defined(__GNUC__) && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__)
++#elif defined(__GNUC__) && defined(__i386__) && \
+       !(4 == __GNUC__ && 8 == __GNUC_MINOR__) && \
+       !(4 == __GNUC__ && 9 == __GNUC_MINOR__ && (defined(__PIC__) || defined(__PIE__)))
+       /* Position-independent builds fail with gcc-4.9.x */
        __asm__(
                "movl   (%1), %%eax\n\t"
                "subl   (%2), %%eax\n\t"