INSTALL.md: Restore $ as command prompt indicator
[oweals/openssl.git] / crypto / ec / asm / ecp_nistz256-armv8.pl
index 2705d7cf063d43f9030562662f44fe534ac23a91..81ee3947d7e44adb5102563903d68bfdaf6a5669 100644 (file)
@@ -1,7 +1,7 @@
 #! /usr/bin/env perl
-# Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved.
+# Copyright 2015-2020 The OpenSSL Project Authors. All Rights Reserved.
 #
-# Licensed under the OpenSSL license (the "License").  You may not use
+# Licensed under the Apache License 2.0 (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
 # on benchmark. Lower coefficients are for ECDSA sign, server-side
 # operation. Keep in mind that +400% means 5x improvement.
 
-$flavour = shift;
-while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
+# $output is the last argument if it looks like a file (it has an extension)
+# $flavour is the first argument if it doesn't look like a file
+$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
+$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
 ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
 die "can't locate arm-xlate.pl";
 
-open OUT,"| \"$^X\" $xlate $flavour $output";
+open OUT,"| \"$^X\" $xlate $flavour \"$output\""
+    or die "can't call $xlate: $!";
 *STDOUT=*OUT;
 
 {
@@ -119,6 +122,7 @@ $code.=<<___;
 .type  ecp_nistz256_to_mont,%function
 .align 6
 ecp_nistz256_to_mont:
+       .inst   0xd503233f              // paciasp
        stp     x29,x30,[sp,#-32]!
        add     x29,sp,#0
        stp     x19,x20,[sp,#16]
@@ -134,6 +138,7 @@ ecp_nistz256_to_mont:
 
        ldp     x19,x20,[sp,#16]
        ldp     x29,x30,[sp],#32
+       .inst   0xd50323bf              // autiasp
        ret
 .size  ecp_nistz256_to_mont,.-ecp_nistz256_to_mont
 
@@ -142,6 +147,7 @@ ecp_nistz256_to_mont:
 .type  ecp_nistz256_from_mont,%function
 .align 4
 ecp_nistz256_from_mont:
+       .inst   0xd503233f              // paciasp
        stp     x29,x30,[sp,#-32]!
        add     x29,sp,#0
        stp     x19,x20,[sp,#16]
@@ -157,6 +163,7 @@ ecp_nistz256_from_mont:
 
        ldp     x19,x20,[sp,#16]
        ldp     x29,x30,[sp],#32
+       .inst   0xd50323bf              // autiasp
        ret
 .size  ecp_nistz256_from_mont,.-ecp_nistz256_from_mont
 
@@ -166,6 +173,7 @@ ecp_nistz256_from_mont:
 .type  ecp_nistz256_mul_mont,%function
 .align 4
 ecp_nistz256_mul_mont:
+       .inst   0xd503233f              // paciasp
        stp     x29,x30,[sp,#-32]!
        add     x29,sp,#0
        stp     x19,x20,[sp,#16]
@@ -180,6 +188,7 @@ ecp_nistz256_mul_mont:
 
        ldp     x19,x20,[sp,#16]
        ldp     x29,x30,[sp],#32
+       .inst   0xd50323bf              // autiasp
        ret
 .size  ecp_nistz256_mul_mont,.-ecp_nistz256_mul_mont
 
@@ -188,6 +197,7 @@ ecp_nistz256_mul_mont:
 .type  ecp_nistz256_sqr_mont,%function
 .align 4
 ecp_nistz256_sqr_mont:
+       .inst   0xd503233f              // paciasp
        stp     x29,x30,[sp,#-32]!
        add     x29,sp,#0
        stp     x19,x20,[sp,#16]
@@ -201,6 +211,7 @@ ecp_nistz256_sqr_mont:
 
        ldp     x19,x20,[sp,#16]
        ldp     x29,x30,[sp],#32
+       .inst   0xd50323bf              // autiasp
        ret
 .size  ecp_nistz256_sqr_mont,.-ecp_nistz256_sqr_mont
 
@@ -210,6 +221,7 @@ ecp_nistz256_sqr_mont:
 .type  ecp_nistz256_add,%function
 .align 4
 ecp_nistz256_add:
+       .inst   0xd503233f              // paciasp
        stp     x29,x30,[sp,#-16]!
        add     x29,sp,#0
 
@@ -223,6 +235,7 @@ ecp_nistz256_add:
        bl      __ecp_nistz256_add
 
        ldp     x29,x30,[sp],#16
+       .inst   0xd50323bf              // autiasp
        ret
 .size  ecp_nistz256_add,.-ecp_nistz256_add
 
@@ -231,6 +244,7 @@ ecp_nistz256_add:
 .type  ecp_nistz256_div_by_2,%function
 .align 4
 ecp_nistz256_div_by_2:
+       .inst   0xd503233f              // paciasp
        stp     x29,x30,[sp,#-16]!
        add     x29,sp,#0
 
@@ -242,6 +256,7 @@ ecp_nistz256_div_by_2:
        bl      __ecp_nistz256_div_by_2
 
        ldp     x29,x30,[sp],#16
+       .inst   0xd50323bf              //  autiasp
        ret
 .size  ecp_nistz256_div_by_2,.-ecp_nistz256_div_by_2
 
@@ -250,6 +265,7 @@ ecp_nistz256_div_by_2:
 .type  ecp_nistz256_mul_by_2,%function
 .align 4
 ecp_nistz256_mul_by_2:
+       .inst   0xd503233f              // paciasp
        stp     x29,x30,[sp,#-16]!
        add     x29,sp,#0
 
@@ -265,6 +281,7 @@ ecp_nistz256_mul_by_2:
        bl      __ecp_nistz256_add      // ret = a+a    // 2*a
 
        ldp     x29,x30,[sp],#16
+       .inst   0xd50323bf              // autiasp
        ret
 .size  ecp_nistz256_mul_by_2,.-ecp_nistz256_mul_by_2
 
@@ -273,6 +290,7 @@ ecp_nistz256_mul_by_2:
 .type  ecp_nistz256_mul_by_3,%function
 .align 4
 ecp_nistz256_mul_by_3:
+       .inst   0xd503233f              // paciasp
        stp     x29,x30,[sp,#-16]!
        add     x29,sp,#0
 
@@ -299,6 +317,7 @@ ecp_nistz256_mul_by_3:
        bl      __ecp_nistz256_add      // ret += a     // 2*a+a=3*a
 
        ldp     x29,x30,[sp],#16
+       .inst   0xd50323bf              // autiasp
        ret
 .size  ecp_nistz256_mul_by_3,.-ecp_nistz256_mul_by_3
 
@@ -308,6 +327,7 @@ ecp_nistz256_mul_by_3:
 .type  ecp_nistz256_sub,%function
 .align 4
 ecp_nistz256_sub:
+       .inst   0xd503233f              // paciasp
        stp     x29,x30,[sp,#-16]!
        add     x29,sp,#0
 
@@ -319,6 +339,7 @@ ecp_nistz256_sub:
        bl      __ecp_nistz256_sub_from
 
        ldp     x29,x30,[sp],#16
+       .inst   0xd50323bf              // autiasp
        ret
 .size  ecp_nistz256_sub,.-ecp_nistz256_sub
 
@@ -327,6 +348,7 @@ ecp_nistz256_sub:
 .type  ecp_nistz256_neg,%function
 .align 4
 ecp_nistz256_neg:
+       .inst   0xd503233f              // paciasp
        stp     x29,x30,[sp,#-16]!
        add     x29,sp,#0
 
@@ -341,6 +363,7 @@ ecp_nistz256_neg:
        bl      __ecp_nistz256_sub_from
 
        ldp     x29,x30,[sp],#16
+       .inst   0xd50323bf              // autiasp
        ret
 .size  ecp_nistz256_neg,.-ecp_nistz256_neg
 
@@ -701,7 +724,8 @@ $code.=<<___;
 .type  ecp_nistz256_point_double,%function
 .align 5
 ecp_nistz256_point_double:
-       stp     x29,x30,[sp,#-80]!
+       .inst   0xd503233f              // paciasp
+       stp     x29,x30,[sp,#-96]!
        add     x29,sp,#0
        stp     x19,x20,[sp,#16]
        stp     x21,x22,[sp,#32]
@@ -834,7 +858,8 @@ ecp_nistz256_point_double:
        add     sp,x29,#0               // destroy frame
        ldp     x19,x20,[x29,#16]
        ldp     x21,x22,[x29,#32]
-       ldp     x29,x30,[sp],#80
+       ldp     x29,x30,[sp],#96
+       .inst   0xd50323bf              // autiasp
        ret
 .size  ecp_nistz256_point_double,.-ecp_nistz256_point_double
 ___
@@ -850,19 +875,21 @@ my ($res_x,$res_y,$res_z,
 my ($Z1sqr, $Z2sqr) = ($Hsqr, $Rsqr);
 # above map() describes stack layout with 12 temporary
 # 256-bit vectors on top.
-my ($rp_real,$ap_real,$bp_real,$in1infty,$in2infty,$temp)=map("x$_",(21..26));
+my ($rp_real,$ap_real,$bp_real,$in1infty,$in2infty,$temp0,$temp1,$temp2)=map("x$_",(21..28));
 
 $code.=<<___;
 .globl ecp_nistz256_point_add
 .type  ecp_nistz256_point_add,%function
 .align 5
 ecp_nistz256_point_add:
-       stp     x29,x30,[sp,#-80]!
+       .inst   0xd503233f              // paciasp
+       stp     x29,x30,[sp,#-96]!
        add     x29,sp,#0
        stp     x19,x20,[sp,#16]
        stp     x21,x22,[sp,#32]
        stp     x23,x24,[sp,#48]
        stp     x25,x26,[sp,#64]
+       stp     x27,x28,[sp,#80]
        sub     sp,sp,#32*12
 
        ldp     $a0,$a1,[$bp,#64]       // in2_z
@@ -876,7 +903,7 @@ ecp_nistz256_point_add:
        orr     $t2,$a2,$a3
        orr     $in2infty,$t0,$t2
        cmp     $in2infty,#0
-       csetm   $in2infty,ne            // !in2infty
+       csetm   $in2infty,ne            // ~in2infty
        add     $rp,sp,#$Z2sqr
        bl      __ecp_nistz256_sqr_mont // p256_sqr_mont(Z2sqr, in2_z);
 
@@ -886,7 +913,7 @@ ecp_nistz256_point_add:
        orr     $t2,$a2,$a3
        orr     $in1infty,$t0,$t2
        cmp     $in1infty,#0
-       csetm   $in1infty,ne            // !in1infty
+       csetm   $in1infty,ne            // ~in1infty
        add     $rp,sp,#$Z1sqr
        bl      __ecp_nistz256_sqr_mont // p256_sqr_mont(Z1sqr, in1_z);
 
@@ -927,7 +954,7 @@ ecp_nistz256_point_add:
 
        orr     $acc0,$acc0,$acc1       // see if result is zero
        orr     $acc2,$acc2,$acc3
-       orr     $temp,$acc0,$acc2
+       orr     $temp0,$acc0,$acc2      // ~is_equal(S1,S2)
 
        add     $bp,sp,#$Z2sqr
        add     $rp,sp,#$U1
@@ -948,32 +975,21 @@ ecp_nistz256_point_add:
 
        orr     $acc0,$acc0,$acc1       // see if result is zero
        orr     $acc2,$acc2,$acc3
-       orr     $acc0,$acc0,$acc2
-       tst     $acc0,$acc0
-       b.ne    .Ladd_proceed           // is_equal(U1,U2)?
+       orr     $acc0,$acc0,$acc2       // ~is_equal(U1,U2)
 
-       tst     $in1infty,$in2infty
-       b.eq    .Ladd_proceed           // (in1infty || in2infty)?
+       mvn     $temp1,$in1infty        // -1/0 -> 0/-1
+       mvn     $temp2,$in2infty        // -1/0 -> 0/-1
+       orr     $acc0,$acc0,$temp1
+       orr     $acc0,$acc0,$temp2
+       orr     $acc0,$acc0,$temp0
+       cbnz    $acc0,.Ladd_proceed     // if(~is_equal(U1,U2) | in1infty | in2infty | ~is_equal(S1,S2))
 
-       tst     $temp,$temp
-       b.eq    .Ladd_double            // is_equal(S1,S2)?
-
-       eor     $a0,$a0,$a0
-       eor     $a1,$a1,$a1
-       stp     $a0,$a1,[$rp_real]
-       stp     $a0,$a1,[$rp_real,#16]
-       stp     $a0,$a1,[$rp_real,#32]
-       stp     $a0,$a1,[$rp_real,#48]
-       stp     $a0,$a1,[$rp_real,#64]
-       stp     $a0,$a1,[$rp_real,#80]
-       b       .Ladd_done
-
-.align 4
 .Ladd_double:
        mov     $ap,$ap_real
        mov     $rp,$rp_real
        ldp     x23,x24,[x29,#48]
        ldp     x25,x26,[x29,#64]
+       ldp     x27,x28,[x29,#80]
        add     sp,sp,#32*(12-4)        // difference in stack frames
        b       .Ldouble_shortcut
 
@@ -1058,14 +1074,14 @@ ___
 for($i=0;$i<64;$i+=32) {               # conditional moves
 $code.=<<___;
        ldp     $acc0,$acc1,[$ap_real,#$i]      // in1
-       cmp     $in1infty,#0                    // !$in1intfy, remember?
+       cmp     $in1infty,#0                    // ~$in1intfy, remember?
        ldp     $acc2,$acc3,[$ap_real,#$i+16]
        csel    $t0,$a0,$t0,ne
        csel    $t1,$a1,$t1,ne
        ldp     $a0,$a1,[sp,#$res_x+$i+32]      // res
        csel    $t2,$a2,$t2,ne
        csel    $t3,$a3,$t3,ne
-       cmp     $in2infty,#0                    // !$in2intfy, remember?
+       cmp     $in2infty,#0                    // ~$in2intfy, remember?
        ldp     $a2,$a3,[sp,#$res_x+$i+48]
        csel    $acc0,$t0,$acc0,ne
        csel    $acc1,$t1,$acc1,ne
@@ -1079,13 +1095,13 @@ ___
 }
 $code.=<<___;
        ldp     $acc0,$acc1,[$ap_real,#$i]      // in1
-       cmp     $in1infty,#0                    // !$in1intfy, remember?
+       cmp     $in1infty,#0                    // ~$in1intfy, remember?
        ldp     $acc2,$acc3,[$ap_real,#$i+16]
        csel    $t0,$a0,$t0,ne
        csel    $t1,$a1,$t1,ne
        csel    $t2,$a2,$t2,ne
        csel    $t3,$a3,$t3,ne
-       cmp     $in2infty,#0                    // !$in2intfy, remember?
+       cmp     $in2infty,#0                    // ~$in2intfy, remember?
        csel    $acc0,$t0,$acc0,ne
        csel    $acc1,$t1,$acc1,ne
        csel    $acc2,$t2,$acc2,ne
@@ -1094,12 +1110,14 @@ $code.=<<___;
        stp     $acc2,$acc3,[$rp_real,#$i+16]
 
 .Ladd_done:
-       add     sp,x29,#0       // destroy frame
+       add     sp,x29,#0               // destroy frame
        ldp     x19,x20,[x29,#16]
        ldp     x21,x22,[x29,#32]
        ldp     x23,x24,[x29,#48]
        ldp     x25,x26,[x29,#64]
-       ldp     x29,x30,[sp],#80
+       ldp     x27,x28,[x29,#80]
+       ldp     x29,x30,[sp],#96
+       .inst   0xd50323bf              // autiasp
        ret
 .size  ecp_nistz256_point_add,.-ecp_nistz256_point_add
 ___
@@ -1121,6 +1139,7 @@ $code.=<<___;
 .type  ecp_nistz256_point_add_affine,%function
 .align 5
 ecp_nistz256_point_add_affine:
+       .inst   0xd503233f              // paciasp
        stp     x29,x30,[sp,#-80]!
        add     x29,sp,#0
        stp     x19,x20,[sp,#16]
@@ -1141,7 +1160,7 @@ ecp_nistz256_point_add_affine:
        orr     $t2,$a2,$a3
        orr     $in1infty,$t0,$t2
        cmp     $in1infty,#0
-       csetm   $in1infty,ne            // !in1infty
+       csetm   $in1infty,ne            // ~in1infty
 
        ldp     $acc0,$acc1,[$bp]       // in2_x
        ldp     $acc2,$acc3,[$bp,#16]
@@ -1155,7 +1174,7 @@ ecp_nistz256_point_add_affine:
        orr     $t0,$t0,$t2
        orr     $in2infty,$acc0,$t0
        cmp     $in2infty,#0
-       csetm   $in2infty,ne            // !in2infty
+       csetm   $in2infty,ne            // ~in2infty
 
        add     $rp,sp,#$Z1sqr
        bl      __ecp_nistz256_sqr_mont // p256_sqr_mont(Z1sqr, in1_z);
@@ -1265,14 +1284,14 @@ ___
 for($i=0;$i<64;$i+=32) {               # conditional moves
 $code.=<<___;
        ldp     $acc0,$acc1,[$ap_real,#$i]      // in1
-       cmp     $in1infty,#0                    // !$in1intfy, remember?
+       cmp     $in1infty,#0                    // ~$in1intfy, remember?
        ldp     $acc2,$acc3,[$ap_real,#$i+16]
        csel    $t0,$a0,$t0,ne
        csel    $t1,$a1,$t1,ne
        ldp     $a0,$a1,[sp,#$res_x+$i+32]      // res
        csel    $t2,$a2,$t2,ne
        csel    $t3,$a3,$t3,ne
-       cmp     $in2infty,#0                    // !$in2intfy, remember?
+       cmp     $in2infty,#0                    // ~$in2intfy, remember?
        ldp     $a2,$a3,[sp,#$res_x+$i+48]
        csel    $acc0,$t0,$acc0,ne
        csel    $acc1,$t1,$acc1,ne
@@ -1289,13 +1308,13 @@ ___
 }
 $code.=<<___;
        ldp     $acc0,$acc1,[$ap_real,#$i]      // in1
-       cmp     $in1infty,#0                    // !$in1intfy, remember?
+       cmp     $in1infty,#0                    // ~$in1intfy, remember?
        ldp     $acc2,$acc3,[$ap_real,#$i+16]
        csel    $t0,$a0,$t0,ne
        csel    $t1,$a1,$t1,ne
        csel    $t2,$a2,$t2,ne
        csel    $t3,$a3,$t3,ne
-       cmp     $in2infty,#0                    // !$in2intfy, remember?
+       cmp     $in2infty,#0                    // ~$in2intfy, remember?
        csel    $acc0,$t0,$acc0,ne
        csel    $acc1,$t1,$acc1,ne
        csel    $acc2,$t2,$acc2,ne
@@ -1309,6 +1328,7 @@ $code.=<<___;
        ldp     x23,x24,[x29,#48]
        ldp     x25,x26,[x29,#64]
        ldp     x29,x30,[sp],#80
+       .inst   0xd50323bf              // autiasp
        ret
 .size  ecp_nistz256_point_add_affine,.-ecp_nistz256_point_add_affine
 ___
@@ -1462,7 +1482,7 @@ $code.=<<___;
 
 ////////////////////////////////////////////////////////////////////////
 // void ecp_nistz256_ord_sqr_mont(uint64_t res[4], uint64_t a[4],
-//                                int rep);
+//                                uint64_t rep);
 .globl ecp_nistz256_ord_sqr_mont
 .type  ecp_nistz256_ord_sqr_mont,%function
 .align 4
@@ -1628,7 +1648,7 @@ ecp_nistz256_scatter_w5:
 
        ldp     x4,x5,[$inp]            // X
        ldp     x6,x7,[$inp,#16]
-       st    w4,[$out,#64*0-4]
+       stur    w4,[$out,#64*0-4]
        lsr     x4,x4,#32
        str     w5,[$out,#64*1-4]
        lsr     x5,x5,#32
@@ -1644,7 +1664,7 @@ ecp_nistz256_scatter_w5:
 
        ldp     x4,x5,[$inp,#32]        // Y
        ldp     x6,x7,[$inp,#48]
-       st    w4,[$out,#64*0-4]
+       stur    w4,[$out,#64*0-4]
        lsr     x4,x4,#32
        str     w5,[$out,#64*1-4]
        lsr     x5,x5,#32
@@ -1660,7 +1680,7 @@ ecp_nistz256_scatter_w5:
 
        ldp     x4,x5,[$inp,#64]        // Z
        ldp     x6,x7,[$inp,#80]
-       st    w4,[$out,#64*0-4]
+       stur    w4,[$out,#64*0-4]
        lsr     x4,x4,#32
        str     w5,[$out,#64*1-4]
        lsr     x5,x5,#32
@@ -1776,21 +1796,21 @@ ecp_nistz256_scatter_w7:
        prfm    pstl1strm,[$out,#4096+64*5]
        prfm    pstl1strm,[$out,#4096+64*6]
        prfm    pstl1strm,[$out,#4096+64*7]
-       strb    w3,[$out,#64*0-1]
+       strb    w3,[$out,#64*0]
        lsr     x3,x3,#8
-       strb    w3,[$out,#64*1-1]
+       strb    w3,[$out,#64*1]
        lsr     x3,x3,#8
-       strb    w3,[$out,#64*2-1]
+       strb    w3,[$out,#64*2]
        lsr     x3,x3,#8
-       strb    w3,[$out,#64*3-1]
+       strb    w3,[$out,#64*3]
        lsr     x3,x3,#8
-       strb    w3,[$out,#64*4-1]
+       strb    w3,[$out,#64*4]
        lsr     x3,x3,#8
-       strb    w3,[$out,#64*5-1]
+       strb    w3,[$out,#64*5]
        lsr     x3,x3,#8
-       strb    w3,[$out,#64*6-1]
+       strb    w3,[$out,#64*6]
        lsr     x3,x3,#8
-       strb    w3,[$out,#64*7-1]
+       strb    w3,[$out,#64*7]
        add     $out,$out,#64*8
        b.ne    .Loop_scatter_w7
 
@@ -1854,4 +1874,4 @@ foreach (split("\n",$code)) {
 
        print $_,"\n";
 }
-close STDOUT;  # enforce flush
+close STDOUT or die "error closing STDOUT: $!";        # enforce flush