提交 b5c6aab5 编写于 作者: A Andy Polyakov

x86_64-xlate.pl: allow "base-less" effective address, add palignr, move

pclmulqdq.
上级 b9b0a177
...@@ -798,35 +798,7 @@ se_handler: ...@@ -798,35 +798,7 @@ se_handler:
___ ___
} }
sub rex {
local *opcode=shift;
my ($dst,$src)=@_;
if ($dst>=8 || $src>=8) {
$rex=0x40;
$rex|=0x04 if($dst>=8);
$rex|=0x01 if($src>=8);
push @opcode,$rex;
}
}
sub pclmulqdq {
my $arg=shift;
my @opcode=(0x66);
if ($arg=~/\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) {
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;
return ".byte\t".join(',',@opcode);
}
return "pclmulqdq\t".$arg;
}
$code =~ s/\`([^\`]*)\`/eval($1)/gem; $code =~ s/\`([^\`]*)\`/eval($1)/gem;
$code =~ s/\bpclmulqdq\s+(\$.*%xmm[0-9]+).*$/pclmulqdq($1)/gem;
print $code; print $code;
......
...@@ -256,8 +256,9 @@ my %globals; ...@@ -256,8 +256,9 @@ my %globals;
$self->{label} =~ s/^___imp_/__imp__/ if ($flavour eq "mingw64"); $self->{label} =~ s/^___imp_/__imp__/ if ($flavour eq "mingw64");
if (defined($self->{index})) { if (defined($self->{index})) {
sprintf "%s%s(%%%s,%%%s,%d)",$self->{asterisk}, sprintf "%s%s(%s,%%%s,%d)",$self->{asterisk},
$self->{label},$self->{base}, $self->{label},
$self->{base}?"%$self->{base}":"",
$self->{index},$self->{scale}; $self->{index},$self->{scale};
} else { } else {
sprintf "%s%s(%%%s)", $self->{asterisk},$self->{label},$self->{base}; sprintf "%s%s(%%%s)", $self->{asterisk},$self->{label},$self->{base};
...@@ -272,10 +273,10 @@ my %globals; ...@@ -272,10 +273,10 @@ my %globals;
$sz="q" if ($self->{asterisk}); $sz="q" if ($self->{asterisk});
if (defined($self->{index})) { 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->{label}?"$self->{label}+":"",
$self->{index},$self->{scale}, $self->{index},$self->{scale},
$self->{base}; $self->{base}?"+$self->{base}":"";
} elsif ($self->{base} eq "rip") { } elsif ($self->{base} eq "rip") {
sprintf "%s[%s]",$szmap{$sz},$self->{label}; sprintf "%s[%s]",$szmap{$sz},$self->{label};
} else { } else {
...@@ -666,7 +667,7 @@ my $pinsrd = sub { ...@@ -666,7 +667,7 @@ my $pinsrd = sub {
$imm=$1; $imm=$1;
$src=$2; $src=$2;
$dst=$3; $dst=$3;
if ($src =~ /%r([0-9]+)d/) { $src = $1; } if ($src =~ /%r([0-9]+)/) { $src = $1; }
elsif ($src =~ /%e/) { $src = $regrm{$src}; } elsif ($src =~ /%e/) { $src = $regrm{$src}; }
rex(\@opcode,$dst,$src); rex(\@opcode,$dst,$src);
push @opcode,0x0f,0x3a,0x22; push @opcode,0x0f,0x3a,0x22;
...@@ -690,6 +691,33 @@ my $pshufb = sub { ...@@ -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) { if ($nasm) {
print <<___; print <<___;
default rel default rel
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册