summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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))) {