Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/crypto/external/bsd/openssl/dist/crypto bring newer versions...



details:   https://anonhg.NetBSD.org/src/rev/371dc2f1a1f8
branches:  trunk
changeset: 344300:371dc2f1a1f8
user:      christos <christos%NetBSD.org@localhost>
date:      Sun Mar 20 22:26:56 2016 +0000

description:
bring newer versions from 1.1.0-pre4

diffstat:

 crypto/external/bsd/openssl/dist/crypto/sha/asm/sha1-x86_64.pl |  1240 ++++++++-
 crypto/external/bsd/openssl/dist/crypto/x86_64cpuid.pl         |   119 +-
 2 files changed, 1142 insertions(+), 217 deletions(-)

diffs (truncated from 1980 to 300 lines):

diff -r 64d2caf73eac -r 371dc2f1a1f8 crypto/external/bsd/openssl/dist/crypto/sha/asm/sha1-x86_64.pl
--- a/crypto/external/bsd/openssl/dist/crypto/sha/asm/sha1-x86_64.pl    Sun Mar 20 22:18:43 2016 +0000
+++ b/crypto/external/bsd/openssl/dist/crypto/sha/asm/sha1-x86_64.pl    Sun Mar 20 22:26:56 2016 +0000
@@ -1,7 +1,7 @@
 #!/usr/bin/env perl
 #
 # ====================================================================
-# Written by Andy Polyakov <appro%fy.chalmers.se@localhost> for the OpenSSL
+# Written by Andy Polyakov <appro%openssl.org@localhost> for the OpenSSL
 # project. The module is, however, dual licensed under OpenSSL and
 # CRYPTOGAMS licenses depending on where you obtain it. For further
 # details see http://www.openssl.org/~appro/cryptogams/.
@@ -49,17 +49,38 @@
 #
 # Add AVX code path. See sha1-586.pl for further information.
 
+# May 2013.
+#
+# Add AVX2+BMI code path. Initial attempt (utilizing BMI instructions
+# and loading pair of consecutive blocks to 256-bit %ymm registers)
+# did not provide impressive performance improvement till a crucial
+# hint regarding the number of Xupdate iterations to pre-compute in
+# advance was provided by Ilya Albrekht of Intel Corp.
+
+# March 2014.
+#
+# Add support for Intel SHA Extensions.
+
 ######################################################################
 # Current performance is summarized in following table. Numbers are
 # CPU clock cycles spent to process single byte (less is better).
 #
-#              x86_64          SSSE3           AVX
-# P4           9.8             -
-# Opteron      6.6             -
-# Core2                6.7             6.1/+10%        -
-# Atom         11.0            9.7/+13%        -
-# Westmere     7.1             5.6/+27%        -
-# Sandy Bridge 7.9             6.3/+25%        5.2/+51%
+#              x86_64          SSSE3           AVX[2]
+# P4           9.05            -
+# Opteron      6.26            -
+# Core2                6.55            6.05/+8%        -
+# Westmere     6.73            5.30/+27%       -
+# Sandy Bridge 7.70            6.10/+26%       4.99/+54%
+# Ivy Bridge   6.06            4.67/+30%       4.60/+32%
+# Haswell      5.45            4.15/+31%       3.57/+53%
+# Skylake      5.18            4.06/+28%       3.54/+46%
+# Bulldozer    9.11            5.95/+53%
+# VIA Nano     9.32            7.15/+30%
+# Atom         10.3            9.17/+12%
+# Silvermont   13.1(*)         9.37/+40%
+#
+# (*)  obviously suboptimal result, nothing was done about it,
+#      because SSSE3 code is compiled unconditionally;
 
 $flavour = shift;
 $output  = shift;
@@ -72,15 +93,27 @@
 ( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 die "can't locate x86_64-xlate.pl";
 
-$avx=1 if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1`
-               =~ /GNU assembler version ([2-9]\.[0-9]+)/ &&
-          $1>=2.19);
-$avx=1 if (!$avx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) &&
-          `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)/ &&
-          $1>=2.09);
-$avx=1 if (!$avx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
-          `ml64 2>&1` =~ /Version ([0-9]+)\./ &&
-          $1>=10);
+if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1`
+               =~ /GNU assembler version ([2-9]\.[0-9]+)/) {
+       $avx = ($1>=2.19) + ($1>=2.22);
+}
+
+if (!$avx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) &&
+          `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)/) {
+       $avx = ($1>=2.09) + ($1>=2.10);
+}
+
+if (!$avx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
+          `ml64 2>&1` =~ /Version ([0-9]+)\./) {
+       $avx = ($1>=10) + ($1>=11);
+}
+
+if (!$avx && `$ENV{CC} -v 2>&1` =~ /((?:^clang|LLVM) version|.*based on LLVM) ([2-9]\.[0-9]+)/) {
+       $avx = ($2>=3.0) + ($2>3.0);
+}
+
+$shaext=1;     ### set to zero if compiling for 1.0.1
+$avx=1         if (!$shaext && $avx);
 
 open OUT,"| \"$^X\" $xlate $flavour $output";
 *STDOUT=*OUT;
@@ -97,7 +130,7 @@
 $t0="%eax";
 $t1="%ebx";
 $t2="%ecx";
-@xi=("%edx","%ebp");
+@xi=("%edx","%ebp","%r14d");
 $A="%esi";
 $B="%edi";
 $C="%r11d";
@@ -112,42 +145,40 @@
 $code.=<<___ if ($i==0);
        mov     `4*$i`($inp),$xi[0]
        bswap   $xi[0]
-       mov     $xi[0],`4*$i`(%rsp)
 ___
 $code.=<<___ if ($i<15);
-       mov     $c,$t0
        mov     `4*$j`($inp),$xi[1]
+       mov     $d,$t0
+       mov     $xi[0],`4*$i`(%rsp)
        mov     $a,$t2
-       xor     $d,$t0
        bswap   $xi[1]
+       xor     $c,$t0
        rol     \$5,$t2
+       and     $b,$t0
        lea     0x5a827999($xi[0],$e),$e
-       and     $b,$t0
-       mov     $xi[1],`4*$j`(%rsp)
        add     $t2,$e
        xor     $d,$t0
        rol     \$30,$b
        add     $t0,$e
 ___
 $code.=<<___ if ($i>=15);
-       mov     `4*($j%16)`(%rsp),$xi[1]
-       mov     $c,$t0
+       xor     `4*($j%16)`(%rsp),$xi[1]
+       mov     $d,$t0
+       mov     $xi[0],`4*($i%16)`(%rsp)
        mov     $a,$t2
        xor     `4*(($j+2)%16)`(%rsp),$xi[1]
-       xor     $d,$t0
+       xor     $c,$t0
        rol     \$5,$t2
        xor     `4*(($j+8)%16)`(%rsp),$xi[1]
        and     $b,$t0
        lea     0x5a827999($xi[0],$e),$e
-       xor     `4*(($j+13)%16)`(%rsp),$xi[1]
+       rol     \$30,$b
        xor     $d,$t0
+       add     $t2,$e
        rol     \$1,$xi[1]
-       add     $t2,$e
-       rol     \$30,$b
-       mov     $xi[1],`4*($j%16)`(%rsp)
        add     $t0,$e
 ___
-unshift(@xi,pop(@xi));
+push(@xi,shift(@xi));
 }
 
 sub BODY_20_39 {
@@ -155,62 +186,58 @@
 my $j=$i+1;
 my $K=($i<40)?0x6ed9eba1:0xca62c1d6;
 $code.=<<___ if ($i<79);
-       mov     `4*($j%16)`(%rsp),$xi[1]
-       mov     $c,$t0
+       xor     `4*($j%16)`(%rsp),$xi[1]
+       mov     $b,$t0
+       `"mov   $xi[0],".4*($i%16)."(%rsp)"     if ($i<72)`
        mov     $a,$t2
        xor     `4*(($j+2)%16)`(%rsp),$xi[1]
-       xor     $b,$t0
+       xor     $d,$t0
        rol     \$5,$t2
-       lea     $K($xi[0],$e),$e
        xor     `4*(($j+8)%16)`(%rsp),$xi[1]
-       xor     $d,$t0
+       lea     $K($xi[0],$e),$e
+       xor     $c,$t0
        add     $t2,$e
-       xor     `4*(($j+13)%16)`(%rsp),$xi[1]
        rol     \$30,$b
        add     $t0,$e
        rol     \$1,$xi[1]
 ___
-$code.=<<___ if ($i<76);
-       mov     $xi[1],`4*($j%16)`(%rsp)
-___
 $code.=<<___ if ($i==79);
-       mov     $c,$t0
+       mov     $b,$t0
        mov     $a,$t2
-       xor     $b,$t0
+       xor     $d,$t0
        lea     $K($xi[0],$e),$e
        rol     \$5,$t2
-       xor     $d,$t0
+       xor     $c,$t0
        add     $t2,$e
        rol     \$30,$b
        add     $t0,$e
 ___
-unshift(@xi,pop(@xi));
+push(@xi,shift(@xi));
 }
 
 sub BODY_40_59 {
 my ($i,$a,$b,$c,$d,$e)=@_;
 my $j=$i+1;
 $code.=<<___;
-       mov     `4*($j%16)`(%rsp),$xi[1]
-       mov     $c,$t0
-       mov     $c,$t1
+       xor     `4*($j%16)`(%rsp),$xi[1]
+       mov     $d,$t0
+       mov     $xi[0],`4*($i%16)`(%rsp)
+       mov     $d,$t1
        xor     `4*(($j+2)%16)`(%rsp),$xi[1]
-       and     $d,$t0
+       and     $c,$t0
        mov     $a,$t2
        xor     `4*(($j+8)%16)`(%rsp),$xi[1]
-       xor     $d,$t1
        lea     0x8f1bbcdc($xi[0],$e),$e
+       xor     $c,$t1
        rol     \$5,$t2
-       xor     `4*(($j+13)%16)`(%rsp),$xi[1]
        add     $t0,$e
-       and     $b,$t1
        rol     \$1,$xi[1]
-       add     $t1,$e
+       and     $b,$t1
+       add     $t2,$e
        rol     \$30,$b
-       mov     $xi[1],`4*($j%16)`(%rsp)
-       add     $t2,$e
+       add     $t1,$e
 ___
-unshift(@xi,pop(@xi));
+push(@xi,shift(@xi));
 }
 
 $code.=<<___;
@@ -221,31 +248,45 @@
 .type  sha1_block_data_order,\@function,3
 .align 16
 sha1_block_data_order:
-       mov     OPENSSL_ia32cap_P+0(%rip),%r8
-       mov     4(%r8),%r8d
-       bt      \$9,%r8d
-       jnc     .Lialu
+       mov     OPENSSL_ia32cap_P+0(%rip),%r9d
+       mov     OPENSSL_ia32cap_P+4(%rip),%r8d
+       mov     OPENSSL_ia32cap_P+8(%rip),%r10d
+       test    \$`1<<9`,%r8d           # check SSSE3 bit
+       jz      .Lialu
+___
+$code.=<<___ if ($shaext);
+       test    \$`1<<29`,%r10d         # check SHA bit 
+       jnz     _shaext_shortcut
+___
+$code.=<<___ if ($avx>1);
+       and     \$`1<<3|1<<5|1<<8`,%r10d        # check AVX2+BMI1+BMI2
+       cmp     \$`1<<3|1<<5|1<<8`,%r10d
+       je      _avx2_shortcut
 ___
 $code.=<<___ if ($avx);
-       bt      \$28,%r8d
-       jc      _avx_shortcut
+       and     \$`1<<28`,%r8d          # mask AVX bit
+       and     \$`1<<30`,%r9d          # mask "Intel CPU" bit
+       or      %r9d,%r8d
+       cmp     \$`1<<28|1<<30`,%r8d
+       je      _avx_shortcut
 ___
 $code.=<<___;
        jmp     _ssse3_shortcut
 
 .align 16
 .Lialu:
+       mov     %rsp,%rax
        push    %rbx
        push    %rbp
        push    %r12
        push    %r13
-       mov     %rsp,%r11
+       push    %r14
        mov     %rdi,$ctx       # reassigned argument
        sub     \$`8+16*4`,%rsp
        mov     %rsi,$inp       # reassigned argument
        and     \$-64,%rsp
        mov     %rdx,$num       # reassigned argument
-       mov     %r11,`16*4`(%rsp)
+       mov     %rax,`16*4`(%rsp)
 .Lprologue:
 
        mov     0($ctx),$A
@@ -279,53 +320,187 @@
        jnz     .Lloop
 
        mov     `16*4`(%rsp),%rsi
-       mov     (%rsi),%r13



Home | Main Index | Thread Index | Old Index