diff options
| -rwxr-xr-x | src/lib/libcrypto/perlasm/x86_64-xlate.pl | 79 | ||||
| -rwxr-xr-x | src/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl | 79 |
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 { | |||
| 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 | if ($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 | |||
| 665 | my $pextrd = sub { | 691 | my $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 | ||
| 701 | my $pclmulqdq = sub { | 727 | if ($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 | |||
| 715 | if ($nasm) { | 770 | if ($nasm) { |
| 716 | print <<___; | 771 | print <<___; |
| 717 | default rel | 772 | default 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 { | |||
| 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 | if ($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 | |||
| 665 | my $pextrd = sub { | 691 | my $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 | ||
| 701 | my $pclmulqdq = sub { | 727 | if ($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 | |||
| 715 | if ($nasm) { | 770 | if ($nasm) { |
| 716 | print <<___; | 771 | print <<___; |
| 717 | default rel | 772 | default rel |
