summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rwxr-xr-xsrc/lib/libcrypto/perlasm/x86_64-xlate.pl79
-rwxr-xr-xsrc/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl79
2 files changed, 134 insertions, 24 deletions
diff --git a/src/lib/libcrypto/perlasm/x86_64-xlate.pl b/src/lib/libcrypto/perlasm/x86_64-xlate.pl
index 82992f41e5..4bd53da33d 100755
--- a/src/lib/libcrypto/perlasm/x86_64-xlate.pl
+++ b/src/lib/libcrypto/perlasm/x86_64-xlate.pl
@@ -662,6 +662,32 @@ 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
665if ($flavour ne "openbsd") {
666
667$movq = sub { # elderly gas can't handle inter-register movq
668 my $arg = shift;
669 my @opcode=(0x66);
670 if ($arg =~ /%xmm([0-9]+),\s*%r(\w+)/) {
671 my ($src,$dst)=($1,$2);
672 if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; }
673 rex(\@opcode,$src,$dst,0x8);
674 push @opcode,0x0f,0x7e;
675 push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M
676 @opcode;
677 } elsif ($arg =~ /%r(\w+),\s*%xmm([0-9]+)/) {
678 my ($src,$dst)=($2,$1);
679 if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; }
680 rex(\@opcode,$src,$dst,0x8);
681 push @opcode,0x0f,0x6e;
682 push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M
683 @opcode;
684 } else {
685 ();
686 }
687};
688
689}
690
665my $pextrd = sub { 691my $pextrd = sub {
666 if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*(%\w+)/) { 692 if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*(%\w+)/) {
667 my @opcode=(0x66); 693 my @opcode=(0x66);
@@ -698,20 +724,49 @@ my $pinsrd = sub {
698 } 724 }
699}; 725};
700 726
701my $pclmulqdq = sub { 727if ($flavour ne "openbsd") {
702 if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { 728
703 my @opcode=(0x66); 729$pshufb = sub {
704 rex(\@opcode,$3,$2); 730 if (shift =~ /%xmm([0-9]+),\s*%xmm([0-9]+)/) {
705 push @opcode,0x0f,0x3a,0x44; 731 my @opcode=(0x66);
706 push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M 732 rex(\@opcode,$2,$1);
707 my $c=$1; 733 push @opcode,0x0f,0x38,0x00;
708 push @opcode,$c=~/^0/?oct($c):$c; 734 push @opcode,0xc0|($1&7)|(($2&7)<<3); # ModR/M
709 @opcode; 735 @opcode;
710 } else { 736 } else {
711 (); 737 ();
712 } 738 }
739};
740
741$palignr = sub {
742 if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) {
743 my @opcode=(0x66);
744 rex(\@opcode,$3,$2);
745 push @opcode,0x0f,0x3a,0x0f;
746 push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M
747 push @opcode,$1;
748 @opcode;
749 } else {
750 ();
751 }
713}; 752};
714 753
754$pclmulqdq = sub {
755 if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) {
756 my @opcode=(0x66);
757 rex(\@opcode,$3,$2);
758 push @opcode,0x0f,0x3a,0x44;
759 push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M
760 my $c=$1;
761 push @opcode,$c=~/^0/?oct($c):$c;
762 @opcode;
763 } else {
764 ();
765 }
766};
767
768}
769
715if ($nasm) { 770if ($nasm) {
716 print <<___; 771 print <<___;
717default rel 772default rel
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 82992f41e5..4bd53da33d 100755
--- a/src/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl
+++ b/src/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl
@@ -662,6 +662,32 @@ 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
665if ($flavour ne "openbsd") {
666
667$movq = sub { # elderly gas can't handle inter-register movq
668 my $arg = shift;
669 my @opcode=(0x66);
670 if ($arg =~ /%xmm([0-9]+),\s*%r(\w+)/) {
671 my ($src,$dst)=($1,$2);
672 if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; }
673 rex(\@opcode,$src,$dst,0x8);
674 push @opcode,0x0f,0x7e;
675 push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M
676 @opcode;
677 } elsif ($arg =~ /%r(\w+),\s*%xmm([0-9]+)/) {
678 my ($src,$dst)=($2,$1);
679 if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; }
680 rex(\@opcode,$src,$dst,0x8);
681 push @opcode,0x0f,0x6e;
682 push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M
683 @opcode;
684 } else {
685 ();
686 }
687};
688
689}
690
665my $pextrd = sub { 691my $pextrd = sub {
666 if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*(%\w+)/) { 692 if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*(%\w+)/) {
667 my @opcode=(0x66); 693 my @opcode=(0x66);
@@ -698,20 +724,49 @@ my $pinsrd = sub {
698 } 724 }
699}; 725};
700 726
701my $pclmulqdq = sub { 727if ($flavour ne "openbsd") {
702 if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { 728
703 my @opcode=(0x66); 729$pshufb = sub {
704 rex(\@opcode,$3,$2); 730 if (shift =~ /%xmm([0-9]+),\s*%xmm([0-9]+)/) {
705 push @opcode,0x0f,0x3a,0x44; 731 my @opcode=(0x66);
706 push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M 732 rex(\@opcode,$2,$1);
707 my $c=$1; 733 push @opcode,0x0f,0x38,0x00;
708 push @opcode,$c=~/^0/?oct($c):$c; 734 push @opcode,0xc0|($1&7)|(($2&7)<<3); # ModR/M
709 @opcode; 735 @opcode;
710 } else { 736 } else {
711 (); 737 ();
712 } 738 }
739};
740
741$palignr = sub {
742 if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) {
743 my @opcode=(0x66);
744 rex(\@opcode,$3,$2);
745 push @opcode,0x0f,0x3a,0x0f;
746 push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M
747 push @opcode,$1;
748 @opcode;
749 } else {
750 ();
751 }
713}; 752};
714 753
754$pclmulqdq = sub {
755 if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) {
756 my @opcode=(0x66);
757 rex(\@opcode,$3,$2);
758 push @opcode,0x0f,0x3a,0x44;
759 push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M
760 my $c=$1;
761 push @opcode,$c=~/^0/?oct($c):$c;
762 @opcode;
763 } else {
764 ();
765 }
766};
767
768}
769
715if ($nasm) { 770if ($nasm) {
716 print <<___; 771 print <<___;
717default rel 772default rel