summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormiod <>2015-07-19 02:26:32 +0000
committermiod <>2015-07-19 02:26:32 +0000
commitc03d4338a4ce59cb92570b8110f33544b704535d (patch)
tree2c3789d7df2cd56cc7daf8c517ccacf9a3603c95
parent7d27977505dcf038edc3626f5af535a007e188a1 (diff)
downloadopenbsd-c03d4338a4ce59cb92570b8110f33544b704535d.tar.gz
openbsd-c03d4338a4ce59cb92570b8110f33544b704535d.tar.bz2
openbsd-c03d4338a4ce59cb92570b8110f33544b704535d.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@
-rw-r--r--src/lib/libcrypto/aes/asm/aesni-sha1-x86_64.pl18
-rw-r--r--src/lib/libcrypto/aes/asm/aesni-x86_64.pl28
-rwxr-xr-xsrc/lib/libcrypto/perlasm/x86_64-xlate.pl61
-rw-r--r--src/lib/libssl/src/crypto/aes/asm/aesni-sha1-x86_64.pl18
-rw-r--r--src/lib/libssl/src/crypto/aes/asm/aesni-x86_64.pl28
-rwxr-xr-xsrc/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl61
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
1229sub 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
1249print $code; 1231print $code;
1250close STDOUT; 1232close 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
3037sub 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
3067print $code; 3039print $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 {
662my %regrm = ( "%eax"=>0, "%ecx"=>1, "%edx"=>2, "%ebx"=>3, 662my %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
665my $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
687my $pextrd = sub { 665my $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
723my $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
735my $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
748my $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
762if ($nasm) { 701if ($nasm) {
763 print <<___; 702 print <<___;
764default rel 703default 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
1229sub 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
1249print $code; 1231print $code;
1250close STDOUT; 1232close 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
3037sub 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
3067print $code; 3039print $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 {
662my %regrm = ( "%eax"=>0, "%ecx"=>1, "%edx"=>2, "%ebx"=>3, 662my %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
665my $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
687my $pextrd = sub { 665my $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
723my $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
735my $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
748my $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
762if ($nasm) { 701if ($nasm) {
763 print <<___; 702 print <<___;
764default rel 703default rel