diff options
-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))) { |