x86_64 assembly pack: improve masm support.
authorAndy Polyakov <appro@openssl.org>
Wed, 9 Jul 2014 18:08:01 +0000 (20:08 +0200)
committerAndy Polyakov <appro@openssl.org>
Wed, 9 Jul 2014 20:46:13 +0000 (22:46 +0200)
(cherry picked from commit 1b0fe79f3ee27ebd20510da3af9ec04c6ee0f800)

crypto/aes/asm/aesni-sha256-x86_64.pl
crypto/bn/asm/rsaz-x86_64.pl
crypto/bn/asm/x86_64-mont.pl
crypto/bn/asm/x86_64-mont5.pl
crypto/modes/asm/aesni-gcm-x86_64.pl
crypto/perlasm/x86_64-xlate.pl

index 6abb5e542e2d0af6ebcb9381247bf54c037c6747..c1fce89834fc3f0fa68b7f7d7373610b1efc053a 100644 (file)
@@ -56,7 +56,7 @@ if (!$avx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) &&
 
 if (!$avx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
           `ml64 2>&1` =~ /Version ([0-9]+)\./) {
-       $avx = ($1>=10) + ($1>=11);
+       $avx = ($1>=10) + ($1>=12);
 }
 
 if (!$avx && `$ENV{CC} -v 2>&1` =~ /(^clang version|based on LLVM) ([3-9]\.[0-9]+)/) {
index cd651f7e78074a8007ff2db44f4360476696c056..3a4f0c59a5c29f8964d8d8ffdac649898ad409f1 100755 (executable)
@@ -110,7 +110,7 @@ if (!$addx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) &&
 
 if (!$addx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
            `ml64 2>&1` =~ /Version ([0-9]+)\./) {
-       $addx = ($1>=11);
+       $addx = ($1>=12);
 }
 
 if (!$addx && `$ENV{CC} -v 2>&1` =~ /(^clang version|based on LLVM) ([3-9])\.([0-9]+)/) {
index 38039286be72f3e86b65c9e85e0a85727016b516..2989b58f256eaa0fe4315d9970c91161f874481a 100755 (executable)
@@ -65,7 +65,7 @@ if (!$addx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) &&
 
 if (!$addx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
            `ml64 2>&1` =~ /Version ([0-9]+)\./) {
-       $addx = ($1>=11);
+       $addx = ($1>=12);
 }
 
 # int bn_mul_mont(
@@ -742,9 +742,11 @@ my @A0=("%r10","%r11");
 my @A1=("%r12","%r13");
 my ($a0,$a1,$ai)=("%r14","%r15","%rbx");
 
+$code.=<<___   if ($addx);
+.extern        bn_sqrx8x_internal              # see x86_64-mont5 module
+___
 $code.=<<___;
 .extern        bn_sqr8x_internal               # see x86_64-mont5 module
-.extern        bn_sqrx8x_internal              # see x86_64-mont5 module
 
 .type  bn_sqr8x_mont,\@function,6
 .align 32
index c107df95f5339ddb887317d09cbf47e80c54f2ad..fa22c30b1fdd60c75926b61decf87a72cc6edcb6 100755 (executable)
@@ -50,7 +50,7 @@ if (!$addx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) &&
 
 if (!$addx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
            `ml64 2>&1` =~ /Version ([0-9]+)\./) {
-       $addx = ($1>=11);
+       $addx = ($1>=12);
 }
 
 # int bn_mul_mont_gather5(
index 4c423b2303eef13afd147ee279441fbad407497b..cfc856cf35e4d07979701218dfbf028c6de37571 100644 (file)
@@ -92,7 +92,7 @@ _aesni_ctr32_ghash_6x:
 
 .align 32
 .Loop6x:
-       add             \$6<<24,$counter
+       add             \$`6<<24`,$counter
        jc              .Lhandle_ctr32          # discard $inout[1-5]?
        vmovdqu         0x00-0x20($Xip),$Hkey   # $Hkey^1
          vpaddb        $T2,$inout5,$T1         # next counter value
@@ -520,7 +520,7 @@ _aesni_ctr32_6x:
        vmovups         0x10-0x80($key),$rndkey
        lea             0x20-0x80($key),%r12
        vpxor           $Z0,$T1,$inout0
-       add             \$6<<24,$counter
+       add             \$`6<<24`,$counter
        jc              .Lhandle_ctr32_2
        vpaddb          $T2,$T1,$inout1
        vpaddb          $T2,$inout1,$inout2
index f51184aeddae47d4908ef491dd2de7d6e2604d44..af9b74774960a55f33daf87765929f009209cd56 100755 (executable)
@@ -270,15 +270,20 @@ my %globals;
                sprintf "%s%s(%%%s)",   $self->{asterisk},$self->{label},$self->{base};
            }
        } else {
-           %szmap = (  b=>"BYTE$PTR", w=>"WORD$PTR", l=>"DWORD$PTR",
-                       q=>"QWORD$PTR",o=>"OWORD$PTR",x=>"XMMWORD$PTR",
-                       y=>"" );
+           %szmap = (  b=>"BYTE$PTR",  w=>"WORD$PTR",
+                       l=>"DWORD$PTR", d=>"DWORD$PTR",
+                       q=>"QWORD$PTR", o=>"OWORD$PTR",
+                       x=>"XMMWORD$PTR", y=>"YMMWORD$PTR", z=>"ZMMWORD$PTR" );
 
            $self->{label} =~ s/\./\$/g;
            $self->{label} =~ s/(?<![\w\$\.])0x([0-9a-f]+)/0$1h/ig;
            $self->{label} = "($self->{label})" if ($self->{label} =~ /[\*\+\-\/]/);
-           $sz="q" if ($self->{asterisk} || opcode->mnemonic() =~ /^v?movq$/);
-           $sz="l" if (opcode->mnemonic() =~ /^v?movd$/);
+
+           ($self->{asterisk})                                 && ($sz="q") ||
+           (opcode->mnemonic() =~ /^v?mov([qd])$/)             && ($sz=$1)  ||
+           (opcode->mnemonic() =~ /^v?pinsr([qdwb])$/)         && ($sz=$1)  ||
+           (opcode->mnemonic() =~ /^vpbroadcast([qdwb])$/)     && ($sz=$1)  ||
+           (opcode->mnemonic() =~ /^vinsert[fi]128$/)          && ($sz="x");
 
            if (defined($self->{index})) {
                sprintf "%s[%s%s*%d%s]",$szmap{$sz},
@@ -536,7 +541,7 @@ my %globals;
                                        $v="$current_segment\tENDS\n" if ($current_segment);
                                        $current_segment = ".text\$";
                                        $v.="$current_segment\tSEGMENT ";
-                                       $v.=$masm>=$masmref ? "ALIGN(64)" : "PAGE";
+                                       $v.=$masm>=$masmref ? "ALIGN(256)" : "PAGE";
                                        $v.=" 'CODE'";
                                    }
                                    $self->{value} = $v;
@@ -834,6 +839,8 @@ if ($nasm) {
     print <<___;
 default        rel
 %define XMMWORD
+%define YMMWORD
+%define ZMMWORD
 ___
 } elsif ($masm) {
     print <<___;
@@ -897,6 +904,7 @@ while($line=<>) {
                    # $insn.=$sz compensates for movq, pinsrw, ...
                    if ($arg =~ /^xmm[0-9]+$/) { $insn.=$sz; $sz="x" if(!$sz); last; }
                    if ($arg =~ /^ymm[0-9]+$/) { $insn.=$sz; $sz="y" if(!$sz); last; }
+                   if ($arg =~ /^zmm[0-9]+$/) { $insn.=$sz; $sz="z" if(!$sz); last; }
                    if ($arg =~ /^mm[0-9]+$/)  { $insn.=$sz; $sz="q" if(!$sz); last; }
                }
                @args = reverse(@args);