aboutsummaryrefslogtreecommitdiff
path: root/crypto/perlasm/x86_64-xlate.pl
diff options
context:
space:
mode:
authorAndy Polyakov <appro@openssl.org>2011-05-16 17:44:38 +0000
committerAndy Polyakov <appro@openssl.org>2011-05-16 17:44:38 +0000
commitb5c6aab57e71015c00d5149f1cf6d03dab1d67ec (patch)
tree0d6d203300cbe43ecc76fae9f6610f024357bdc1 /crypto/perlasm/x86_64-xlate.pl
parentb9b0a177f853cb01ab48881383f81afb08058460 (diff)
downloadopenssl-b5c6aab57e71015c00d5149f1cf6d03dab1d67ec.zip
openssl-b5c6aab57e71015c00d5149f1cf6d03dab1d67ec.tar.gz
openssl-b5c6aab57e71015c00d5149f1cf6d03dab1d67ec.tar.bz2
x86_64-xlate.pl: allow "base-less" effective address, add palignr, move
pclmulqdq.
Diffstat (limited to 'crypto/perlasm/x86_64-xlate.pl')
-rwxr-xr-xcrypto/perlasm/x86_64-xlate.pl38
1 files changed, 33 insertions, 5 deletions
diff --git a/crypto/perlasm/x86_64-xlate.pl b/crypto/perlasm/x86_64-xlate.pl
index 3acac96..61d77d9 100755
--- a/crypto/perlasm/x86_64-xlate.pl
+++ b/crypto/perlasm/x86_64-xlate.pl
@@ -256,8 +256,9 @@ my %globals;
$self->{label} =~ s/^___imp_/__imp__/ if ($flavour eq "mingw64");
if (defined($self->{index})) {
- sprintf "%s%s(%%%s,%%%s,%d)",$self->{asterisk},
- $self->{label},$self->{base},
+ sprintf "%s%s(%s,%%%s,%d)",$self->{asterisk},
+ $self->{label},
+ $self->{base}?"%$self->{base}":"",
$self->{index},$self->{scale};
} else {
sprintf "%s%s(%%%s)", $self->{asterisk},$self->{label},$self->{base};
@@ -272,10 +273,10 @@ my %globals;
$sz="q" if ($self->{asterisk});
if (defined($self->{index})) {
- sprintf "%s[%s%s*%d+%s]",$szmap{$sz},
+ sprintf "%s[%s%s*%d%s]",$szmap{$sz},
$self->{label}?"$self->{label}+":"",
$self->{index},$self->{scale},
- $self->{base};
+ $self->{base}?"+$self->{base}":"";
} elsif ($self->{base} eq "rip") {
sprintf "%s[%s]",$szmap{$sz},$self->{label};
} else {
@@ -666,7 +667,7 @@ my $pinsrd = sub {
$imm=$1;
$src=$2;
$dst=$3;
- if ($src =~ /%r([0-9]+)d/) { $src = $1; }
+ if ($src =~ /%r([0-9]+)/) { $src = $1; }
elsif ($src =~ /%e/) { $src = $regrm{$src}; }
rex(\@opcode,$dst,$src);
push @opcode,0x0f,0x3a,0x22;
@@ -690,6 +691,33 @@ my $pshufb = sub {
}
};
+my $palignr = sub {
+ if (shift =~ /\$([0-9]+),%xmm([0-9]+),%xmm([0-9]+)/) {
+ my @opcode=(0x66);
+ rex(\@opcode,$3,$2);
+ push @opcode,0x0f,0x3a,0x0f;
+ push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M
+ push @opcode,$1;
+ @opcode;
+ } else {
+ ();
+ }
+};
+
+my $pclmulqdq = sub {
+ if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) {
+ my @opcode=(0x66);
+ rex(\@opcode,$3,$2);
+ push @opcode,0x0f,0x3a,0x44;
+ 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