ec/asm/ecp_nistz256-sparcv9.pl: get corner logic right.
[openssl.git] / crypto / ec / asm / ecp_nistz256-sparcv9.pl
index 29a089b4a2706ae6bd8acdd520691f5c0902fd31..bd69eea9a031d3ca28bc9805e8fa34ddff517d0c 100755 (executable)
@@ -722,6 +722,7 @@ ecp_nistz256_point_double:
        mov     $rp,$rp_real
        mov     $ap,$ap_real
 
+.Lpoint_double_shortcut:
        ld      [$ap+32],@acc[0]
        ld      [$ap+32+4],@acc[1]
        ld      [$ap+32+8],@acc[2]
@@ -994,7 +995,7 @@ ecp_nistz256_point_add:
        be,pt   %icc,.Ladd_proceed      ! (in1infty || in2infty)?
        nop
        andcc   $t2,$t2,%g0
-       be,pt   %icc,.Ladd_proceed      ! is_equal(S1,S2)?
+       be,pt   %icc,.Ladd_double       ! is_equal(S1,S2)?
        nop
 
        ldx     [%fp+STACK_BIAS-8],$rp
@@ -1025,6 +1026,13 @@ ecp_nistz256_point_add:
        b       .Ladd_done
        nop
 
+.align 16
+.Ladd_double:
+       ldx     [%fp+STACK_BIAS-8],$rp_real
+       mov     $ap_real,$ap
+       b       .Lpoint_double_shortcut
+       add     %sp,32*(12-4)+32,%sp    ! difference in frame sizes
+
 .align 16
 .Ladd_proceed:
        add     %sp,LOCALS+$R,$bp
@@ -2016,6 +2024,7 @@ ecp_nistz256_point_double_vis3:
        save    %sp,-STACK64_FRAME-32*10,%sp
 
        mov     $rp,$rp_real
+.Ldouble_shortcut_vis3:
        mov     -1,$minus1
        mov     -2,$poly3
        sllx    $minus1,32,$poly1               ! 0xFFFFFFFF00000000
@@ -2536,8 +2545,8 @@ ecp_nistz256_point_add_vis3:
        be,pt   %xcc,.Ladd_proceed_vis3         ! (in1infty || in2infty)?
        nop
        andcc   $t2,$t2,%g0
-       be,pt   %xcc,.Ladd_proceed_vis3         ! is_equal(S1,S2)?
-       nop
+       be,a,pt %xcc,.Ldouble_shortcut_vis3     ! is_equal(S1,S2)?
+       add     %sp,32*(12-10)+32,%sp           ! difference in frame sizes
 
        st      %g0,[$rp_real]
        st      %g0,[$rp_real+4]