bn/asm/rsaz-*.pl: allow spaces in Perl path name.
[openssl.git] / crypto / bn / asm / rsaz-avx2.pl
index f76ab609d1ccb8a94dfa00b6e67a83509f955f56..e608cb49da4e46e49dabe9c7b62f18f1b1238b06 100755 (executable)
@@ -78,23 +78,28 @@ die "can't locate x86_64-xlate.pl";
 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);
+       $addx = ($1>=2.23);
 }
 
 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);
+       $addx = ($1>=2.10);
 }
 
 if (!$avx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
            `ml64 2>&1` =~ /Version ([0-9]+)\./) {
        $avx = ($1>=10) + ($1>=11);
+       $addx = ($1>=11);
 }
 
-if (!$avx && `$ENV{CC} -v` =~ /LLVM ([3-9]\.[0-9]+)/) {
-       $avx = ($1>=3.0) + ($1>=3.1);
+if (!$avx && `$ENV{CC} -v 2>&1` =~ /(^clang version|based on LLVM) ([3-9])\.([0-9]+)/) {
+       my $ver = $2 + $3/100.0;        # 3.1->3.01, 3.10->3.10
+       $avx = ($ver>=3.0) + ($ver>=3.01);
+       $addx = ($ver>=3.03);
 }
 
-open OUT,"| $^X $xlate $flavour $output";
+open OUT,"| \"$^X\" $xlate $flavour $output";
 *STDOUT = *OUT;
 
 if ($avx>1) {{{
@@ -987,6 +992,7 @@ $code.=<<___;
 
        vmovdqu .Land_mask(%rip), $AND_MASK
        mov     \$9, $i
+       vmovdqu $ACC9, 32*9-128($rp)            # $ACC9 is zero after vzeroall
        jmp     .Loop_mul_1024
 
 .align 32
@@ -1677,6 +1683,15 @@ $code.=<<___;
 .align 32
 rsaz_avx2_eligible:
        mov     OPENSSL_ia32cap_P+8(%rip),%eax
+___
+$code.=<<___   if ($addx);
+       mov     \$`1<<8|1<<19`,%ecx
+       mov     \$0,%edx
+       and     %eax,%ecx
+       cmp     \$`1<<8|1<<19`,%ecx     # check for BMI2+AD*X
+       cmove   %edx,%eax
+___
+$code.=<<___;
        and     \$`1<<5`,%eax
        shr     \$5,%eax
        ret