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