@@ -604,6 +604,28 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL
604
604
return ;
605
605
overflow : ZEND_ATTRIBUTE_COLD_LABEL
606
606
ZVAL_DOUBLE (result , (double ) Z_LVAL_P (op1 ) + (double ) Z_LVAL_P (op2 ));
607
+ #elif defined(HAVE_ASM_GOTO ) && defined(__aarch64__ )
608
+ register int32_t tmp asm("w5" );
609
+ __asm__ goto(
610
+ "ldr %1, [%1]\n\t"
611
+ "ldr %2, [%2]\n\t"
612
+ "adds %1, %1, %2\n\t"
613
+ "bvs %l6\n\t"
614
+ "mov w5, %3\n\t"
615
+ "str %1, [%0]\n\t"
616
+ "str w5, [%0, %c4]\n"
617
+ :
618
+ : "r" (& result -> value ),
619
+ "r" (& op1 -> value ),
620
+ "r" (& op2 -> value ),
621
+ "n" (IS_LONG ),
622
+ "n" (ZVAL_OFFSETOF_TYPE ),
623
+ "r" (tmp )
624
+ : "cc" , "memory"
625
+ : overflow );
626
+ return ;
627
+ overflow : ZEND_ATTRIBUTE_COLD_LABEL
628
+ ZVAL_DOUBLE (result , (double ) Z_LVAL_P (op1 ) + (double ) Z_LVAL_P (op2 ));
607
629
#elif PHP_HAVE_BUILTIN_SADDL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG
608
630
long lresult ;
609
631
if (UNEXPECTED (__builtin_saddl_overflow (Z_LVAL_P (op1 ), Z_LVAL_P (op2 ), & lresult ))) {
@@ -694,6 +716,28 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL
694
716
return ;
695
717
overflow : ZEND_ATTRIBUTE_COLD_LABEL
696
718
ZVAL_DOUBLE (result , (double ) Z_LVAL_P (op1 ) - (double ) Z_LVAL_P (op2 ));
719
+ #elif defined(HAVE_ASM_GOTO ) && defined(__aarch64__ )
720
+ register int32_t tmp asm("w5" );
721
+ __asm__ goto(
722
+ "ldr %1, [%1]\n\t"
723
+ "ldr %2, [%2]\n\t"
724
+ "subs %1, %1, %2\n\t"
725
+ "bvs %l6\n\t"
726
+ "mov w5, %3\n\t"
727
+ "str %1, [%0]\n\t"
728
+ "str w5, [%0, %c4]\n"
729
+ :
730
+ : "r" (& result -> value ),
731
+ "r" (& op1 -> value ),
732
+ "r" (& op2 -> value ),
733
+ "n" (IS_LONG ),
734
+ "n" (ZVAL_OFFSETOF_TYPE ),
735
+ "r" (tmp )
736
+ : "cc" , "memory"
737
+ : overflow );
738
+ return ;
739
+ overflow : ZEND_ATTRIBUTE_COLD_LABEL
740
+ ZVAL_DOUBLE (result , (double ) Z_LVAL_P (op1 ) - (double ) Z_LVAL_P (op2 ));
697
741
#elif PHP_HAVE_BUILTIN_SSUBL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG
698
742
long lresult ;
699
743
if (UNEXPECTED (__builtin_ssubl_overflow (Z_LVAL_P (op1 ), Z_LVAL_P (op2 ), & lresult ))) {
0 commit comments