ec/asm/ecp_nistz256-*.pl: get corner case logic right.
[openssl.git] / crypto / ec / asm / ecp_nistz256-armv4.pl
index 3a636eae6cb61d8ab7830c6b7770db4d4e7d619f..ab11a8782e298e81ebad6fda5c15794394499818 100755 (executable)
@@ -1252,6 +1252,7 @@ ecp_nistz256_point_double:
        stmdb   sp!,{r0-r12,lr}         @ push from r0, unusual, but intentional
        sub     sp,sp,#32*5
 
+.Lpoint_double_shortcut:
        add     r3,sp,#$in_x
        ldmia   $a_ptr!,{r4-r11}        @ copy in_x
        stmia   r3,{r4-r11}
@@ -1371,7 +1372,7 @@ $code.=<<___;
 .align 5
 ecp_nistz256_point_add:
        stmdb   sp!,{r0-r12,lr}         @ push from r0, unusual, but intentional
-       sub     sp,sp,#32*18
+       sub     sp,sp,#32*18+16
 
        ldmia   $b_ptr!,{r4-r11}        @ copy in2
        add     r3,sp,#$in2_x
@@ -1504,9 +1505,9 @@ ecp_nistz256_point_add:
        tst     $t0,$t1
        beq     .Ladd_proceed           @ (in1infty || in2infty)?
        tst     $t2,$t2
-       beq     .Ladd_proceed           @ is_equal(S1,S2)?
+       beq     .Ladd_double            @ is_equal(S1,S2)?
 
-       ldr     $r_ptr,[sp,#32*18]
+       ldr     $r_ptr,[sp,#32*18+16]
        eor     r4,r4,r4
        eor     r5,r5,r5
        eor     r6,r6,r6
@@ -1520,6 +1521,12 @@ ecp_nistz256_point_add:
        stmia   $r_ptr!,{r4-r11}
        b       .Ladd_done
 
+.align 4
+.Ladd_double:
+       ldr     $a_ptr,[sp,#32*18+20]
+       add     sp,sp,#32*(18-5)+16     @ difference in frame sizes
+       b       .Lpoint_double_shortcut
+
 .align 4
 .Ladd_proceed:
        add     $a_ptr,sp,#$R
@@ -1588,7 +1595,7 @@ ecp_nistz256_point_add:
        add     r3,sp,#$in1_x
        and     r11,r11,r12
        mvn     r12,r12
-       ldr     $r_ptr,[sp,#32*18]
+       ldr     $r_ptr,[sp,#32*18+16]
 ___
 for($i=0;$i<96;$i+=8) {                        # conditional moves
 $code.=<<___;
@@ -1610,7 +1617,7 @@ ___
 }
 $code.=<<___;
 .Ladd_done:
-       add     sp,sp,#32*18+16         @ +16 means "skip even over saved r0-r3"
+       add     sp,sp,#32*18+16+16      @ +16 means "skip even over saved r0-r3"
 #if __ARM_ARCH__>=5 || defined(__thumb__)
        ldmia   sp!,{r4-r12,pc}
 #else