diff options
| author | miod <> | 2015-07-19 02:26:32 +0000 | 
|---|---|---|
| committer | miod <> | 2015-07-19 02:26:32 +0000 | 
| commit | 3a1c21ea05417cdafece6fcfc145ab3f83910695 (patch) | |
| tree | 2c3789d7df2cd56cc7daf8c517ccacf9a3603c95 /src | |
| parent | fd6d9bfbcd2deccd5544fc90cd1f003d1653b2cd (diff) | |
| download | openbsd-3a1c21ea05417cdafece6fcfc145ab3f83910695.tar.gz openbsd-3a1c21ea05417cdafece6fcfc145ab3f83910695.tar.bz2 openbsd-3a1c21ea05417cdafece6fcfc145ab3f83910695.zip | |
Remove the logic responsible for outputting most AES-NI instructions as
raw byte sequences. The toolchains have had some time to update and assemble
the instructions correctly (except for p{ins,ext}rd which are not supported
yet by as(1) under OpenBSD, but will be fixed shortly).
Inspired by a discussion between tedu@ and John-Mark Gurney.
Verified to still work on Mac OS X and average Linux distros by bcook@
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/aes/asm/aesni-sha1-x86_64.pl | 18 | ||||
| -rw-r--r-- | src/lib/libcrypto/aes/asm/aesni-x86_64.pl | 28 | ||||
| -rwxr-xr-x | src/lib/libcrypto/perlasm/x86_64-xlate.pl | 61 | ||||
| -rw-r--r-- | src/lib/libssl/src/crypto/aes/asm/aesni-sha1-x86_64.pl | 18 | ||||
| -rw-r--r-- | src/lib/libssl/src/crypto/aes/asm/aesni-x86_64.pl | 28 | ||||
| -rwxr-xr-x | src/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl | 61 | 
6 files changed, 0 insertions, 214 deletions
| diff --git a/src/lib/libcrypto/aes/asm/aesni-sha1-x86_64.pl b/src/lib/libcrypto/aes/asm/aesni-sha1-x86_64.pl index 3c8f6c19e7..39b504cbe5 100644 --- a/src/lib/libcrypto/aes/asm/aesni-sha1-x86_64.pl +++ b/src/lib/libcrypto/aes/asm/aesni-sha1-x86_64.pl | |||
| @@ -1226,25 +1226,7 @@ sub rex { | |||
| 1226 | push @opcode,$rex|0x40 if($rex); | 1226 | push @opcode,$rex|0x40 if($rex); | 
| 1227 | } | 1227 | } | 
| 1228 | 1228 | ||
| 1229 | sub aesni { | ||
| 1230 | my $line=shift; | ||
| 1231 | my @opcode=(0x66); | ||
| 1232 | |||
| 1233 | if ($line=~/(aes[a-z]+)\s+%xmm([0-9]+),\s*%xmm([0-9]+)/) { | ||
| 1234 | my %opcodelet = ( | ||
| 1235 | "aesenc" => 0xdc, "aesenclast" => 0xdd | ||
| 1236 | ); | ||
| 1237 | return undef if (!defined($opcodelet{$1})); | ||
| 1238 | rex(\@opcode,$3,$2); | ||
| 1239 | push @opcode,0x0f,0x38,$opcodelet{$1}; | ||
| 1240 | push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M | ||
| 1241 | return ".byte\t".join(',',@opcode); | ||
| 1242 | } | ||
| 1243 | return $line; | ||
| 1244 | } | ||
| 1245 | |||
| 1246 | $code =~ s/\`([^\`]*)\`/eval($1)/gem; | 1229 | $code =~ s/\`([^\`]*)\`/eval($1)/gem; | 
| 1247 | $code =~ s/\b(aes.*%xmm[0-9]+).*$/aesni($1)/gem; | ||
| 1248 | 1230 | ||
| 1249 | print $code; | 1231 | print $code; | 
| 1250 | close STDOUT; | 1232 | close STDOUT; | 
| diff --git a/src/lib/libcrypto/aes/asm/aesni-x86_64.pl b/src/lib/libcrypto/aes/asm/aesni-x86_64.pl index a53204af6c..c073667fcb 100644 --- a/src/lib/libcrypto/aes/asm/aesni-x86_64.pl +++ b/src/lib/libcrypto/aes/asm/aesni-x86_64.pl | |||
| @@ -3034,35 +3034,7 @@ sub rex { | |||
| 3034 | push @opcode,$rex|0x40 if($rex); | 3034 | push @opcode,$rex|0x40 if($rex); | 
| 3035 | } | 3035 | } | 
| 3036 | 3036 | ||
| 3037 | sub aesni { | ||
| 3038 | my $line=shift; | ||
| 3039 | my @opcode=(0x66); | ||
| 3040 | |||
| 3041 | if ($line=~/(aeskeygenassist)\s+\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { | ||
| 3042 | rex(\@opcode,$4,$3); | ||
| 3043 | push @opcode,0x0f,0x3a,0xdf; | ||
| 3044 | push @opcode,0xc0|($3&7)|(($4&7)<<3); # ModR/M | ||
| 3045 | my $c=$2; | ||
| 3046 | push @opcode,$c=~/^0/?oct($c):$c; | ||
| 3047 | return ".byte\t".join(',',@opcode); | ||
| 3048 | } | ||
| 3049 | elsif ($line=~/(aes[a-z]+)\s+%xmm([0-9]+),\s*%xmm([0-9]+)/) { | ||
| 3050 | my %opcodelet = ( | ||
| 3051 | "aesimc" => 0xdb, | ||
| 3052 | "aesenc" => 0xdc, "aesenclast" => 0xdd, | ||
| 3053 | "aesdec" => 0xde, "aesdeclast" => 0xdf | ||
| 3054 | ); | ||
| 3055 | return undef if (!defined($opcodelet{$1})); | ||
| 3056 | rex(\@opcode,$3,$2); | ||
| 3057 | push @opcode,0x0f,0x38,$opcodelet{$1}; | ||
| 3058 | push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M | ||
| 3059 | return ".byte\t".join(',',@opcode); | ||
| 3060 | } | ||
| 3061 | return $line; | ||
| 3062 | } | ||
| 3063 | |||
| 3064 | $code =~ s/\`([^\`]*)\`/eval($1)/gem; | 3037 | $code =~ s/\`([^\`]*)\`/eval($1)/gem; | 
| 3065 | $code =~ s/\b(aes.*%xmm[0-9]+).*$/aesni($1)/gem; | ||
| 3066 | 3038 | ||
| 3067 | print $code; | 3039 | print $code; | 
| 3068 | 3040 | ||
| diff --git a/src/lib/libcrypto/perlasm/x86_64-xlate.pl b/src/lib/libcrypto/perlasm/x86_64-xlate.pl index 2ad032c4ba..ed1f3ed6ab 100755 --- a/src/lib/libcrypto/perlasm/x86_64-xlate.pl +++ b/src/lib/libcrypto/perlasm/x86_64-xlate.pl | |||
| @@ -662,28 +662,6 @@ sub rex { | |||
| 662 | my %regrm = ( "%eax"=>0, "%ecx"=>1, "%edx"=>2, "%ebx"=>3, | 662 | my %regrm = ( "%eax"=>0, "%ecx"=>1, "%edx"=>2, "%ebx"=>3, | 
| 663 | "%esp"=>4, "%ebp"=>5, "%esi"=>6, "%edi"=>7 ); | 663 | "%esp"=>4, "%ebp"=>5, "%esi"=>6, "%edi"=>7 ); | 
| 664 | 664 | ||
| 665 | my $movq = sub { # elderly gas can't handle inter-register movq | ||
| 666 | my $arg = shift; | ||
| 667 | my @opcode=(0x66); | ||
| 668 | if ($arg =~ /%xmm([0-9]+),\s*%r(\w+)/) { | ||
| 669 | my ($src,$dst)=($1,$2); | ||
| 670 | if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; } | ||
| 671 | rex(\@opcode,$src,$dst,0x8); | ||
| 672 | push @opcode,0x0f,0x7e; | ||
| 673 | push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M | ||
| 674 | @opcode; | ||
| 675 | } elsif ($arg =~ /%r(\w+),\s*%xmm([0-9]+)/) { | ||
| 676 | my ($src,$dst)=($2,$1); | ||
| 677 | if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; } | ||
| 678 | rex(\@opcode,$src,$dst,0x8); | ||
| 679 | push @opcode,0x0f,0x6e; | ||
| 680 | push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M | ||
| 681 | @opcode; | ||
| 682 | } else { | ||
| 683 | (); | ||
| 684 | } | ||
| 685 | }; | ||
| 686 | |||
| 687 | my $pextrd = sub { | 665 | my $pextrd = sub { | 
| 688 | if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*(%\w+)/) { | 666 | if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*(%\w+)/) { | 
| 689 | my @opcode=(0x66); | 667 | my @opcode=(0x66); | 
| @@ -720,45 +698,6 @@ my $pinsrd = sub { | |||
| 720 | } | 698 | } | 
| 721 | }; | 699 | }; | 
| 722 | 700 | ||
| 723 | my $pshufb = sub { | ||
| 724 | if (shift =~ /%xmm([0-9]+),\s*%xmm([0-9]+)/) { | ||
| 725 | my @opcode=(0x66); | ||
| 726 | rex(\@opcode,$2,$1); | ||
| 727 | push @opcode,0x0f,0x38,0x00; | ||
| 728 | push @opcode,0xc0|($1&7)|(($2&7)<<3); # ModR/M | ||
| 729 | @opcode; | ||
| 730 | } else { | ||
| 731 | (); | ||
| 732 | } | ||
| 733 | }; | ||
| 734 | |||
| 735 | my $palignr = sub { | ||
| 736 | if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { | ||
| 737 | my @opcode=(0x66); | ||
| 738 | rex(\@opcode,$3,$2); | ||
| 739 | push @opcode,0x0f,0x3a,0x0f; | ||
| 740 | push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M | ||
| 741 | push @opcode,$1; | ||
| 742 | @opcode; | ||
| 743 | } else { | ||
| 744 | (); | ||
| 745 | } | ||
| 746 | }; | ||
| 747 | |||
| 748 | my $pclmulqdq = sub { | ||
| 749 | if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { | ||
| 750 | my @opcode=(0x66); | ||
| 751 | rex(\@opcode,$3,$2); | ||
| 752 | push @opcode,0x0f,0x3a,0x44; | ||
| 753 | push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M | ||
| 754 | my $c=$1; | ||
| 755 | push @opcode,$c=~/^0/?oct($c):$c; | ||
| 756 | @opcode; | ||
| 757 | } else { | ||
| 758 | (); | ||
| 759 | } | ||
| 760 | }; | ||
| 761 | |||
| 762 | if ($nasm) { | 701 | if ($nasm) { | 
| 763 | print <<___; | 702 | print <<___; | 
| 764 | default rel | 703 | default rel | 
| diff --git a/src/lib/libssl/src/crypto/aes/asm/aesni-sha1-x86_64.pl b/src/lib/libssl/src/crypto/aes/asm/aesni-sha1-x86_64.pl index 3c8f6c19e7..39b504cbe5 100644 --- a/src/lib/libssl/src/crypto/aes/asm/aesni-sha1-x86_64.pl +++ b/src/lib/libssl/src/crypto/aes/asm/aesni-sha1-x86_64.pl | |||
| @@ -1226,25 +1226,7 @@ sub rex { | |||
| 1226 | push @opcode,$rex|0x40 if($rex); | 1226 | push @opcode,$rex|0x40 if($rex); | 
| 1227 | } | 1227 | } | 
| 1228 | 1228 | ||
| 1229 | sub aesni { | ||
| 1230 | my $line=shift; | ||
| 1231 | my @opcode=(0x66); | ||
| 1232 | |||
| 1233 | if ($line=~/(aes[a-z]+)\s+%xmm([0-9]+),\s*%xmm([0-9]+)/) { | ||
| 1234 | my %opcodelet = ( | ||
| 1235 | "aesenc" => 0xdc, "aesenclast" => 0xdd | ||
| 1236 | ); | ||
| 1237 | return undef if (!defined($opcodelet{$1})); | ||
| 1238 | rex(\@opcode,$3,$2); | ||
| 1239 | push @opcode,0x0f,0x38,$opcodelet{$1}; | ||
| 1240 | push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M | ||
| 1241 | return ".byte\t".join(',',@opcode); | ||
| 1242 | } | ||
| 1243 | return $line; | ||
| 1244 | } | ||
| 1245 | |||
| 1246 | $code =~ s/\`([^\`]*)\`/eval($1)/gem; | 1229 | $code =~ s/\`([^\`]*)\`/eval($1)/gem; | 
| 1247 | $code =~ s/\b(aes.*%xmm[0-9]+).*$/aesni($1)/gem; | ||
| 1248 | 1230 | ||
| 1249 | print $code; | 1231 | print $code; | 
| 1250 | close STDOUT; | 1232 | close STDOUT; | 
| diff --git a/src/lib/libssl/src/crypto/aes/asm/aesni-x86_64.pl b/src/lib/libssl/src/crypto/aes/asm/aesni-x86_64.pl index a53204af6c..c073667fcb 100644 --- a/src/lib/libssl/src/crypto/aes/asm/aesni-x86_64.pl +++ b/src/lib/libssl/src/crypto/aes/asm/aesni-x86_64.pl | |||
| @@ -3034,35 +3034,7 @@ sub rex { | |||
| 3034 | push @opcode,$rex|0x40 if($rex); | 3034 | push @opcode,$rex|0x40 if($rex); | 
| 3035 | } | 3035 | } | 
| 3036 | 3036 | ||
| 3037 | sub aesni { | ||
| 3038 | my $line=shift; | ||
| 3039 | my @opcode=(0x66); | ||
| 3040 | |||
| 3041 | if ($line=~/(aeskeygenassist)\s+\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { | ||
| 3042 | rex(\@opcode,$4,$3); | ||
| 3043 | push @opcode,0x0f,0x3a,0xdf; | ||
| 3044 | push @opcode,0xc0|($3&7)|(($4&7)<<3); # ModR/M | ||
| 3045 | my $c=$2; | ||
| 3046 | push @opcode,$c=~/^0/?oct($c):$c; | ||
| 3047 | return ".byte\t".join(',',@opcode); | ||
| 3048 | } | ||
| 3049 | elsif ($line=~/(aes[a-z]+)\s+%xmm([0-9]+),\s*%xmm([0-9]+)/) { | ||
| 3050 | my %opcodelet = ( | ||
| 3051 | "aesimc" => 0xdb, | ||
| 3052 | "aesenc" => 0xdc, "aesenclast" => 0xdd, | ||
| 3053 | "aesdec" => 0xde, "aesdeclast" => 0xdf | ||
| 3054 | ); | ||
| 3055 | return undef if (!defined($opcodelet{$1})); | ||
| 3056 | rex(\@opcode,$3,$2); | ||
| 3057 | push @opcode,0x0f,0x38,$opcodelet{$1}; | ||
| 3058 | push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M | ||
| 3059 | return ".byte\t".join(',',@opcode); | ||
| 3060 | } | ||
| 3061 | return $line; | ||
| 3062 | } | ||
| 3063 | |||
| 3064 | $code =~ s/\`([^\`]*)\`/eval($1)/gem; | 3037 | $code =~ s/\`([^\`]*)\`/eval($1)/gem; | 
| 3065 | $code =~ s/\b(aes.*%xmm[0-9]+).*$/aesni($1)/gem; | ||
| 3066 | 3038 | ||
| 3067 | print $code; | 3039 | print $code; | 
| 3068 | 3040 | ||
| diff --git a/src/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl b/src/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl index 2ad032c4ba..ed1f3ed6ab 100755 --- a/src/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl +++ b/src/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl | |||
| @@ -662,28 +662,6 @@ sub rex { | |||
| 662 | my %regrm = ( "%eax"=>0, "%ecx"=>1, "%edx"=>2, "%ebx"=>3, | 662 | my %regrm = ( "%eax"=>0, "%ecx"=>1, "%edx"=>2, "%ebx"=>3, | 
| 663 | "%esp"=>4, "%ebp"=>5, "%esi"=>6, "%edi"=>7 ); | 663 | "%esp"=>4, "%ebp"=>5, "%esi"=>6, "%edi"=>7 ); | 
| 664 | 664 | ||
| 665 | my $movq = sub { # elderly gas can't handle inter-register movq | ||
| 666 | my $arg = shift; | ||
| 667 | my @opcode=(0x66); | ||
| 668 | if ($arg =~ /%xmm([0-9]+),\s*%r(\w+)/) { | ||
| 669 | my ($src,$dst)=($1,$2); | ||
| 670 | if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; } | ||
| 671 | rex(\@opcode,$src,$dst,0x8); | ||
| 672 | push @opcode,0x0f,0x7e; | ||
| 673 | push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M | ||
| 674 | @opcode; | ||
| 675 | } elsif ($arg =~ /%r(\w+),\s*%xmm([0-9]+)/) { | ||
| 676 | my ($src,$dst)=($2,$1); | ||
| 677 | if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; } | ||
| 678 | rex(\@opcode,$src,$dst,0x8); | ||
| 679 | push @opcode,0x0f,0x6e; | ||
| 680 | push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M | ||
| 681 | @opcode; | ||
| 682 | } else { | ||
| 683 | (); | ||
| 684 | } | ||
| 685 | }; | ||
| 686 | |||
| 687 | my $pextrd = sub { | 665 | my $pextrd = sub { | 
| 688 | if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*(%\w+)/) { | 666 | if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*(%\w+)/) { | 
| 689 | my @opcode=(0x66); | 667 | my @opcode=(0x66); | 
| @@ -720,45 +698,6 @@ my $pinsrd = sub { | |||
| 720 | } | 698 | } | 
| 721 | }; | 699 | }; | 
| 722 | 700 | ||
| 723 | my $pshufb = sub { | ||
| 724 | if (shift =~ /%xmm([0-9]+),\s*%xmm([0-9]+)/) { | ||
| 725 | my @opcode=(0x66); | ||
| 726 | rex(\@opcode,$2,$1); | ||
| 727 | push @opcode,0x0f,0x38,0x00; | ||
| 728 | push @opcode,0xc0|($1&7)|(($2&7)<<3); # ModR/M | ||
| 729 | @opcode; | ||
| 730 | } else { | ||
| 731 | (); | ||
| 732 | } | ||
| 733 | }; | ||
| 734 | |||
| 735 | my $palignr = sub { | ||
| 736 | if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { | ||
| 737 | my @opcode=(0x66); | ||
| 738 | rex(\@opcode,$3,$2); | ||
| 739 | push @opcode,0x0f,0x3a,0x0f; | ||
| 740 | push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M | ||
| 741 | push @opcode,$1; | ||
| 742 | @opcode; | ||
| 743 | } else { | ||
| 744 | (); | ||
| 745 | } | ||
| 746 | }; | ||
| 747 | |||
| 748 | my $pclmulqdq = sub { | ||
| 749 | if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { | ||
| 750 | my @opcode=(0x66); | ||
| 751 | rex(\@opcode,$3,$2); | ||
| 752 | push @opcode,0x0f,0x3a,0x44; | ||
| 753 | push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M | ||
| 754 | my $c=$1; | ||
| 755 | push @opcode,$c=~/^0/?oct($c):$c; | ||
| 756 | @opcode; | ||
| 757 | } else { | ||
| 758 | (); | ||
| 759 | } | ||
| 760 | }; | ||
| 761 | |||
| 762 | if ($nasm) { | 701 | if ($nasm) { | 
| 763 | print <<___; | 702 | print <<___; | 
| 764 | default rel | 703 | default rel | 
