bn/asm/sparcv9-mont.pl: fix squaring code path.
[openssl.git] / crypto / bn / asm / sparcv9-mont.pl
index c08d8223f7d9318e5bca9472afa0dce532f2f5ab..2697965b3f28050f64f1f5b713038a0d5896bd35 100644 (file)
@@ -1,4 +1,11 @@
-#!/usr/bin/env perl
+#! /usr/bin/env perl
+# Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved.
+#
+# Licensed under the OpenSSL license (the "License").  You may not use
+# this file except in compliance with the License.  You can obtain a copy
+# in the file LICENSE in the source distribution or at
+# https://www.openssl.org/source/license.html
+
 
 # ====================================================================
 # Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
 
 # ====================================================================
 # Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
@@ -13,7 +20,7 @@
 # for undertaken effort are multiple. First of all, UltraSPARC is not
 # the whole SPARCv9 universe and other VIS-free implementations deserve
 # optimized code as much. Secondly, newly introduced UltraSPARC T1,
 # for undertaken effort are multiple. First of all, UltraSPARC is not
 # the whole SPARCv9 universe and other VIS-free implementations deserve
 # optimized code as much. Secondly, newly introduced UltraSPARC T1,
-# a.k.a. Niagara, has shared FPU and concurrent FPU-intensive pathes,
+# a.k.a. Niagara, has shared FPU and concurrent FPU-intensive paths,
 # such as sparcv9a-mont, will simply sink it. Yes, T1 is equipped with
 # several integrated RSA/DSA accelerator circuits accessible through
 # kernel driver [only(*)], but having decent user-land software
 # such as sparcv9a-mont, will simply sink it. Yes, T1 is equipped with
 # several integrated RSA/DSA accelerator circuits accessible through
 # kernel driver [only(*)], but having decent user-land software
@@ -53,10 +60,8 @@ $np="%i3";   # const BN_ULONG *np,
 $n0="%i4";     # const BN_ULONG *n0,
 $num="%i5";    # int num);
 
 $n0="%i4";     # const BN_ULONG *n0,
 $num="%i5";    # int num);
 
-$bits=32;
-for (@ARGV)    { $bits=64 if (/\-m64/ || /\-xarch\=v9/); }
-if ($bits==64) { $bias=2047; $frame=192; }
-else           { $bias=0;    $frame=128; }
+$frame="STACK_FRAME";
+$bias="STACK_BIAS";
 
 $car0="%o0";
 $car1="%o1";
 
 $car0="%o0";
 $car1="%o1";
@@ -79,6 +84,8 @@ $tpj="%l7";
 $fname="bn_mul_mont_int";
 
 $code=<<___;
 $fname="bn_mul_mont_int";
 
 $code=<<___;
+#include "sparc_arch.h"
+
 .section       ".text",#alloc,#execinstr
 
 .global        $fname
 .section       ".text",#alloc,#execinstr
 
 .global        $fname
@@ -108,7 +115,7 @@ $fname:
        ld      [$np],$car1             ! np[0]
        sub     %o7,$bias,%sp           ! alloca
        ld      [$np+4],$npj            ! np[1]
        ld      [$np],$car1             ! np[0]
        sub     %o7,$bias,%sp           ! alloca
        ld      [$np+4],$npj            ! np[1]
-       be,pt   `$bits==32?"%icc":"%xcc"`,.Lbn_sqr_mont
+       be,pt   SIZE_T_CC,.Lbn_sqr_mont
        mov     12,$j
 
        mulx    $car0,$mul0,$car0       ! ap[0]*bp[0]
        mov     12,$j
 
        mulx    $car0,$mul0,$car0       ! ap[0]*bp[0]
@@ -293,7 +300,7 @@ ___
 ######## .Lbn_sqr_mont gives up to 20% *overall* improvement over
 ######## code without following dedicated squaring procedure.
 ########
 ######## .Lbn_sqr_mont gives up to 20% *overall* improvement over
 ######## code without following dedicated squaring procedure.
 ########
-$sbit="%i2";           # re-use $bp!
+$sbit="%o5";
 
 $code.=<<___;
 .align 32
 
 $code.=<<___;
 .align 32
@@ -406,7 +413,7 @@ $code.=<<___;
        mulx    $apj,$mul0,$acc0
        mulx    $npj,$mul1,$acc1
        add     $acc0,$car0,$car0
        mulx    $apj,$mul0,$acc0
        mulx    $npj,$mul1,$acc1
        add     $acc0,$car0,$car0
-       add     $tpj,$car1,$car1
+       add     $tpj,$sbit,$sbit
        ld      [$ap+$j],$apj                   ! ap[j]
        and     $car0,$mask,$acc0
        ld      [$np+$j],$npj                   ! np[j]
        ld      [$ap+$j],$apj                   ! ap[j]
        and     $car0,$mask,$acc0
        ld      [$np+$j],$npj                   ! np[j]
@@ -415,7 +422,7 @@ $code.=<<___;
        ld      [$tp+8],$tpj                    ! tp[j]
        add     $acc0,$acc0,$acc0
        add     $j,4,$j                         ! j++
        ld      [$tp+8],$tpj                    ! tp[j]
        add     $acc0,$acc0,$acc0
        add     $j,4,$j                         ! j++
-       or      $sbit,$acc0,$acc0
+       add     $sbit,$acc0,$acc0
        srlx    $acc0,32,$sbit
        and     $acc0,$mask,$acc0
        cmp     $j,$num
        srlx    $acc0,32,$sbit
        and     $acc0,$mask,$acc0
        cmp     $j,$num
@@ -429,12 +436,12 @@ $code.=<<___;
        mulx    $apj,$mul0,$acc0
        mulx    $npj,$mul1,$acc1
        add     $acc0,$car0,$car0
        mulx    $apj,$mul0,$acc0
        mulx    $npj,$mul1,$acc1
        add     $acc0,$car0,$car0
-       add     $tpj,$car1,$car1
+       add     $tpj,$sbit,$sbit
        and     $car0,$mask,$acc0
        srlx    $car0,32,$car0
        add     $acc1,$car1,$car1
        add     $acc0,$acc0,$acc0
        and     $car0,$mask,$acc0
        srlx    $car0,32,$car0
        add     $acc1,$car1,$car1
        add     $acc0,$acc0,$acc0
-       or      $sbit,$acc0,$acc0
+       add     $sbit,$acc0,$acc0
        srlx    $acc0,32,$sbit
        and     $acc0,$mask,$acc0
        add     $acc0,$car1,$car1
        srlx    $acc0,32,$sbit
        and     $acc0,$mask,$acc0
        add     $acc0,$car1,$car1
@@ -442,7 +449,7 @@ $code.=<<___;
        srlx    $car1,32,$car1
 
        add     $car0,$car0,$car0
        srlx    $car1,32,$car1
 
        add     $car0,$car0,$car0
-       or      $sbit,$car0,$car0
+       add     $sbit,$car0,$car0
        add     $car0,$car1,$car1
        add     $car2,$car1,$car1
        st      $car1,[$tp+4]
        add     $car0,$car1,$car1
        add     $car2,$car1,$car1
        st      $car1,[$tp+4]
@@ -502,7 +509,7 @@ $code.=<<___;
 .Lsqr_inner2:
        mulx    $apj,$mul0,$acc0
        mulx    $npj,$mul1,$acc1
 .Lsqr_inner2:
        mulx    $apj,$mul0,$acc0
        mulx    $npj,$mul1,$acc1
-       add     $tpj,$car1,$car1
+       add     $tpj,$sbit,$sbit
        add     $acc0,$car0,$car0
        ld      [$ap+$j],$apj                   ! ap[j]
        and     $car0,$mask,$acc0
        add     $acc0,$car0,$car0
        ld      [$ap+$j],$apj                   ! ap[j]
        and     $car0,$mask,$acc0
@@ -510,7 +517,7 @@ $code.=<<___;
        srlx    $car0,32,$car0
        add     $acc0,$acc0,$acc0
        ld      [$tp+8],$tpj                    ! tp[j]
        srlx    $car0,32,$car0
        add     $acc0,$acc0,$acc0
        ld      [$tp+8],$tpj                    ! tp[j]
-       or      $sbit,$acc0,$acc0
+       add     $sbit,$acc0,$acc0
        add     $j,4,$j                         ! j++
        srlx    $acc0,32,$sbit
        and     $acc0,$mask,$acc0
        add     $j,4,$j                         ! j++
        srlx    $acc0,32,$sbit
        and     $acc0,$mask,$acc0
@@ -525,12 +532,12 @@ $code.=<<___;
 .Lsqr_no_inner2:
        mulx    $apj,$mul0,$acc0
        mulx    $npj,$mul1,$acc1
 .Lsqr_no_inner2:
        mulx    $apj,$mul0,$acc0
        mulx    $npj,$mul1,$acc1
-       add     $tpj,$car1,$car1
+       add     $tpj,$sbit,$sbit
        add     $acc0,$car0,$car0
        and     $car0,$mask,$acc0
        srlx    $car0,32,$car0
        add     $acc0,$acc0,$acc0
        add     $acc0,$car0,$car0
        and     $car0,$mask,$acc0
        srlx    $car0,32,$car0
        add     $acc0,$acc0,$acc0
-       or      $sbit,$acc0,$acc0
+       add     $sbit,$acc0,$acc0
        srlx    $acc0,32,$sbit
        and     $acc0,$mask,$acc0
        add     $acc0,$car1,$car1
        srlx    $acc0,32,$sbit
        and     $acc0,$mask,$acc0
        add     $acc0,$car1,$car1
@@ -539,7 +546,7 @@ $code.=<<___;
        srlx    $car1,32,$car1
 
        add     $car0,$car0,$car0
        srlx    $car1,32,$car1
 
        add     $car0,$car0,$car0
-       or      $sbit,$car0,$car0
+       add     $sbit,$car0,$car0
        add     $car0,$car1,$car1
        add     $car2,$car1,$car1
        st      $car1,[$tp+4]
        add     $car0,$car1,$car1
        add     $car2,$car1,$car1
        st      $car1,[$tp+4]
@@ -584,14 +591,17 @@ $code.=<<___;
 !.Lsqr_last
 
        mulx    $npj,$mul1,$acc1
 !.Lsqr_last
 
        mulx    $npj,$mul1,$acc1
-       add     $tpj,$car1,$car1
+       add     $tpj,$acc0,$acc0
+       srlx    $acc0,32,$tmp0
+       and     $acc0,$mask,$acc0
+       add     $tmp0,$sbit,$sbit
        add     $acc0,$car1,$car1
        add     $acc1,$car1,$car1
        st      $car1,[$tp]
        srlx    $car1,32,$car1
 
        add     $car0,$car0,$car0               ! recover $car0
        add     $acc0,$car1,$car1
        add     $acc1,$car1,$car1
        st      $car1,[$tp]
        srlx    $car1,32,$car1
 
        add     $car0,$car0,$car0               ! recover $car0
-       or      $sbit,$car0,$car0
+       add     $sbit,$car0,$car0
        add     $car0,$car1,$car1
        add     $car2,$car1,$car1
        st      $car1,[$tp+4]
        add     $car0,$car1,$car1
        add     $car2,$car1,$car1
        st      $car1,[$tp+4]