diff options
author | Dmitry Stogov <dmitry@zend.com> | 2019-05-07 15:42:25 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2019-05-07 15:42:25 +0300 |
commit | 40b2ffe201895438015ecdff6d7bcb04ab841a5c (patch) | |
tree | e1a1381ed77e73b38c80cd62b8836ed2c7d8f4ad | |
parent | b27f97d858e508f83477563be541defdc6b7f8a4 (diff) | |
parent | 79a84e00fad27bab2a4ca7a58ace1f68cc88be5c (diff) | |
download | php-git-40b2ffe201895438015ecdff6d7bcb04ab841a5c.tar.gz |
Merge branch 'PHP-7.4'
* PHP-7.4:
speed up increment and decrement operators with overflow detection
-rw-r--r-- | Zend/zend_operators.h | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index a7f694e88f..829d5be9c8 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -490,6 +490,19 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL return; overflow: ZEND_ATTRIBUTE_COLD_LABEL ZVAL_DOUBLE(op1, (double)ZEND_LONG_MAX + 1.0); +#elif defined(HAVE_ASM_GOTO) && defined(__aarch64__) + __asm__ goto ( + "ldr x5, [%0]\n\t" + "adds x5, x5, 1\n\t" + "bvs %l1\n" + "str x5, [%0]" + : + : "r"(&op1->value) + : "x5", "cc", "memory" + : overflow); + return; +overflow: ZEND_ATTRIBUTE_COLD_LABEL + ZVAL_DOUBLE(op1, (double)ZEND_LONG_MAX + 1.0); #elif PHP_HAVE_BUILTIN_SADDL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG long lresult; if (UNEXPECTED(__builtin_saddl_overflow(Z_LVAL_P(op1), 1, &lresult))) { @@ -540,6 +553,19 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL return; overflow: ZEND_ATTRIBUTE_COLD_LABEL ZVAL_DOUBLE(op1, (double)ZEND_LONG_MIN - 1.0); +#elif defined(HAVE_ASM_GOTO) && defined(__aarch64__) + __asm__ goto ( + "ldr x5, [%0]\n\t" + "subs x5 ,x5, 1\n\t" + "bvs %l1\n" + "str x5, [%0]" + : + : "r"(&op1->value) + : "x5", "cc", "memory" + : overflow); + return; +overflow: ZEND_ATTRIBUTE_COLD_LABEL + ZVAL_DOUBLE(op1, (double)ZEND_LONG_MIN - 1.0); #elif PHP_HAVE_BUILTIN_SSUBL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG long lresult; if (UNEXPECTED(__builtin_ssubl_overflow(Z_LVAL_P(op1), 1, &lresult))) { |