Loading crypto/modes/asm/ghash-x86_64.pl +0 −28 Original line number Diff line number Diff line Loading @@ -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/\bpclmulqdq\s+(\$.*%xmm[0-9]+).*$/pclmulqdq($1)/gem; print $code; Loading crypto/perlasm/x86_64-xlate.pl +33 −5 Original line number Diff line number Diff line Loading @@ -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}; Loading @@ -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 { Loading Loading @@ -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; Loading @@ -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 Loading Loading
crypto/modes/asm/ghash-x86_64.pl +0 −28 Original line number Diff line number Diff line Loading @@ -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/\bpclmulqdq\s+(\$.*%xmm[0-9]+).*$/pclmulqdq($1)/gem; print $code; Loading
crypto/perlasm/x86_64-xlate.pl +33 −5 Original line number Diff line number Diff line Loading @@ -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}; Loading @@ -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 { Loading Loading @@ -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; Loading @@ -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 Loading