summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2019-05-07 15:42:25 +0300
committerDmitry Stogov <dmitry@zend.com>2019-05-07 15:42:25 +0300
commit40b2ffe201895438015ecdff6d7bcb04ab841a5c (patch)
treee1a1381ed77e73b38c80cd62b8836ed2c7d8f4ad
parentb27f97d858e508f83477563be541defdc6b7f8a4 (diff)
parent79a84e00fad27bab2a4ca7a58ace1f68cc88be5c (diff)
downloadphp-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.h26
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))) {