Add some missing cfi frame info in aesni-sha and sha-x86_64.pl
[openssl.git] / crypto / sha / asm / sha512-x86_64.pl
index bdf1d28fda29efb516f48bfee9bcd339b5befb76..e7140defb6c6ae981c6152db91227b98f4b8c246 100755 (executable)
@@ -1,7 +1,7 @@
 #! /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
+# 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
@@ -10,7 +10,7 @@
 # ====================================================================
 # Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
 # project. Rights for redistribution and usage in source and binary
-# forms are granted according to the OpenSSL license.
+# forms are granted according to the License.
 # ====================================================================
 #
 # sha256/512_block procedure for x86_64.
 # Haswell      12.2    9.28(+31%)  7.80(+56%)      7.66    5.40(+42%)
 # Skylake      11.4    9.03(+26%)  7.70(+48%)      7.25    5.20(+40%)
 # Bulldozer    21.1    13.6(+54%)  13.6(+54%(***)) 13.5    8.58(+57%)
+# Ryzen                11.0    9.02(+22%)  2.05(+440%)     7.05    5.67(+20%)
 # VIA Nano     23.0    16.5(+39%)  -               14.7    -
 # Atom         23.0    18.9(+22%)  -               14.7    -
 # Silvermont   27.4    20.6(+33%)  -               17.5    -
+# Knights L    27.4    21.0(+30%)  19.6(+40%)      17.5    12.8(+37%)
 # Goldmont     18.9    14.3(+32%)  4.16(+350%)     12.0    -
 #
 # (*)  whichever best applicable, including SHAEXT;
 #      below certain limit makes no difference/sense; to conserve
 #      space SHA256 XOP code path is therefore omitted;
 
-$flavour = shift;
-$output  = shift;
-if ($flavour =~ /\./) { $output = $flavour; undef $flavour; }
+# $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;
 
 $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/);
 
@@ -140,7 +143,8 @@ if (!$avx && `$ENV{CC} -v 2>&1` =~ /((?:^clang|LLVM) version|.*based on LLVM) ([
 $shaext=1;     ### set to zero if compiling for 1.0.1
 $avx=1         if (!$shaext && $avx);
 
-open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\"";
+open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""
+    or die "can't call $xlate: $!";
 *STDOUT=*OUT;
 
 if ($output =~ /512/) {
@@ -567,6 +571,7 @@ $code.=<<___;
 .align 64
 sha256_block_data_order_shaext:
 _shaext_shortcut:
+.cfi_startproc
 ___
 $code.=<<___ if ($win64);
        lea     `-8-5*16`(%rsp),%rsp
@@ -710,6 +715,7 @@ $code.=<<___ if ($win64);
 ___
 $code.=<<___;
        ret
+.cfi_endproc
 .size  sha256_block_data_order_shaext,.-sha256_block_data_order_shaext
 ___
 }}}
@@ -1990,7 +1996,23 @@ $code.=<<___;
        vmovdqa $t0,0x00(%rsp)
        xor     $a1,$a1
        vmovdqa $t1,0x20(%rsp)
+___
+$code.=<<___ if (!$win64);
+# temporarily use %rdi as frame pointer
+       mov     $_rsp,%rdi
+.cfi_def_cfa   %rdi,8
+___
+$code.=<<___;
        lea     -$PUSH8(%rsp),%rsp
+___
+$code.=<<___ if (!$win64);
+# the frame info is at $_rsp, but the stack is moving...
+# so a second frame pointer is saved at -8(%rsp)
+# that is in the red zone
+       mov     %rdi,-8(%rsp)
+.cfi_cfa_expression    %rsp-8,deref,+8
+___
+$code.=<<___;
        mov     $B,$a3
        vmovdqa $t2,0x00(%rsp)
        xor     $C,$a3                  # magic
@@ -2010,7 +2032,18 @@ my @X = @_;
 my @insns = (&$body,&$body,&$body,&$body);     # 96 instructions
 my $base = "+2*$PUSH8(%rsp)";
 
-       &lea    ("%rsp","-$PUSH8(%rsp)")        if (($j%2)==0);
+       if (($j%2)==0) {
+       &lea    ("%rsp","-$PUSH8(%rsp)");
+$code.=<<___ if (!$win64);
+.cfi_cfa_expression    %rsp+`$PUSH8-8`,deref,+8
+# copy secondary frame pointer to new location again at -8(%rsp)
+       pushq   $PUSH8-8(%rsp)
+.cfi_cfa_expression    %rsp,deref,+8
+       lea     8(%rsp),%rsp
+.cfi_cfa_expression    %rsp-8,deref,+8
+___
+       }
+
        foreach (Xupdate_256_AVX()) {           # 29 instructions
            eval;
            eval(shift(@insns));
@@ -2081,7 +2114,23 @@ $code.=<<___;
        vmovdqa $t2,0x40(%rsp)
        vpaddq  0x40($Tbl),@X[6],$t2
        vmovdqa $t3,0x60(%rsp)
+___
+$code.=<<___ if (!$win64);
+# temporarily use %rdi as frame pointer
+       mov     $_rsp,%rdi
+.cfi_def_cfa   %rdi,8
+___
+$code.=<<___;
        lea     -$PUSH8(%rsp),%rsp
+___
+$code.=<<___ if (!$win64);
+# the frame info is at $_rsp, but the stack is moving...
+# so a second frame pointer is saved at -8(%rsp)
+# that is in the red zone
+       mov     %rdi,-8(%rsp)
+.cfi_cfa_expression    %rsp-8,deref,+8
+___
+$code.=<<___;
        vpaddq  0x60($Tbl),@X[7],$t3
        vmovdqa $t0,0x00(%rsp)
        xor     $a1,$a1
@@ -2105,7 +2154,18 @@ my @X = @_;
 my @insns = (&$body,&$body);                   # 48 instructions
 my $base = "+2*$PUSH8(%rsp)";
 
-       &lea    ("%rsp","-$PUSH8(%rsp)")        if (($j%4)==0);
+       if (($j%4)==0) {
+       &lea    ("%rsp","-$PUSH8(%rsp)");
+$code.=<<___ if (!$win64);
+.cfi_cfa_expression    %rsp+`$PUSH8-8`,deref,+8
+# copy secondary frame pointer to new location again at -8(%rsp)
+       pushq   $PUSH8-8(%rsp)
+.cfi_cfa_expression    %rsp,deref,+8
+       lea     8(%rsp),%rsp
+.cfi_cfa_expression    %rsp-8,deref,+8
+___
+       }
+
        foreach (Xupdate_512_AVX()) {           # 23 instructions
            eval;
            if ($_ !~ /\;$/) {
@@ -2180,6 +2240,8 @@ $code.=<<___;
        add     $a1,$A
        #mov    `2*$SZ*$rounds+8`(%rsp),$inp    # $_inp
        lea     `2*$SZ*($rounds-8)`(%rsp),%rsp
+# restore frame pointer to original location at $_rsp
+.cfi_cfa_expression    $_rsp,deref,+8
 
        add     $SZ*0($ctx),$A
        add     $SZ*1($ctx),$B
@@ -2205,22 +2267,24 @@ $code.=<<___;
 
        jbe     .Loop_avx2
        lea     (%rsp),$Tbl
+# temporarily use $Tbl as index to $_rsp
+# this avoids the need to save a secondary frame pointer at -8(%rsp)
+.cfi_cfa_expression    $Tbl+`16*$SZ+3*8`,deref,+8
 
 .Ldone_avx2:
-       lea     ($Tbl),%rsp
-       mov     $_rsp,%rsi
+       mov     `16*$SZ+3*8`($Tbl),%rsi
 .cfi_def_cfa   %rsi,8
        vzeroupper
 ___
 $code.=<<___ if ($win64);
-       movaps  16*$SZ+32(%rsp),%xmm6
-       movaps  16*$SZ+48(%rsp),%xmm7
-       movaps  16*$SZ+64(%rsp),%xmm8
-       movaps  16*$SZ+80(%rsp),%xmm9
+       movaps  16*$SZ+32($Tbl),%xmm6
+       movaps  16*$SZ+48($Tbl),%xmm7
+       movaps  16*$SZ+64($Tbl),%xmm8
+       movaps  16*$SZ+80($Tbl),%xmm9
 ___
 $code.=<<___ if ($win64 && $SZ>4);
-       movaps  16*$SZ+96(%rsp),%xmm10
-       movaps  16*$SZ+112(%rsp),%xmm11
+       movaps  16*$SZ+96($Tbl),%xmm10
+       movaps  16*$SZ+112($Tbl),%xmm11
 ___
 $code.=<<___;
        mov     -48(%rsi),%r15