sha512-x86_64.pl: revert previous change and solve the problem through
authorAndy Polyakov <appro@openssl.org>
Mon, 13 Aug 2012 12:34:36 +0000 (12:34 +0000)
committerAndy Polyakov <appro@openssl.org>
Mon, 13 Aug 2012 12:34:36 +0000 (12:34 +0000)
perlasm/x86_64-xlate.pl instead.

crypto/perlasm/x86_64-xlate.pl
crypto/sha/asm/sha512-x86_64.pl

index 56d9b64b6fb32d6bdbd415da2b4aafcc76646ed4..444a1f617724d83ff7e3da1e375dcefea12e0663 100755 (executable)
@@ -772,6 +772,45 @@ my $rdrand = sub {
     }
 };
 
+sub rxb {
+ local *opcode=shift;
+ my ($dst,$src1,$src2,$rxb)=@_;
+
+   $rxb|=0x7<<5;
+   $rxb&=~(0x04<<5) if($dst>=8);
+   $rxb&=~(0x01<<5) if($src1>=8);
+   $rxb&=~(0x02<<5) if($src2>=8);
+   push @opcode,$rxb;
+}
+
+my $vprotd = sub {
+    if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) {
+      my @opcode=(0x8f);
+       rxb(\@opcode,$3,$2,-1,0x08);
+       push @opcode,0x78,0xc2;
+       push @opcode,0xc0|($2&7)|(($3&7)<<3);           # ModR/M
+       my $c=$1;
+       push @opcode,$c=~/^0/?oct($c):$c;
+       @opcode;
+    } else {
+       ();
+    }
+};
+
+my $vprotq = sub {
+    if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) {
+      my @opcode=(0x8f);
+       rxb(\@opcode,$3,$2,-1,0x08);
+       push @opcode,0x78,0xc3;
+       push @opcode,0xc0|($2&7)|(($3&7)<<3);           # ModR/M
+       my $c=$1;
+       push @opcode,$c=~/^0/?oct($c):$c;
+       @opcode;
+    } else {
+       ();
+    }
+};
+
 if ($nasm) {
     print <<___;
 default        rel
index 0d49bb54a16105a5d775e1cff03f492231131875..ab9a0b472de4909357943eb1d6be13585e42e1fc 100755 (executable)
@@ -95,13 +95,13 @@ 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]+)/ &&
-          (($xop = $1>=2.21) || $1>=2.19));
+          $1>=2.19);
 $avx=1 if (!$avx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) &&
           `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)/ &&
-          ($xop = $1>=2.09));
+          $1>=2.09);
 $avx=1 if (!$avx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
           `ml64 2>&1` =~ /Version ([0-9]+)\./ &&
-          ($xop = $1>=10));
+          $1>=10);
 
 open STDOUT,"| \"$^X\" $xlate $flavour $output";
 
@@ -237,7 +237,7 @@ $code.=<<___ if ($SZ==4 || $avx);
        mov     0(%r11),%r10d
        mov     4(%r11),%r11d
 ___
-$code.=<<___ if ($avx && $xop && $SZ==8);
+$code.=<<___ if ($avx && $SZ==8);
        test    \$`1<<11`,%r11d         # check for XOP
        jnz     .Lxop_shortcut
 ___
@@ -824,7 +824,7 @@ if ($avx) {{
 ######################################################################
 # XOP code path
 #
-if ($xop && $SZ==8) {  # SHA512 only
+if ($SZ==8) {  # SHA512 only
 $code.=<<___;
 .type  ${func}_xop,\@function,4
 .align 64