X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fperlasm%2Fx86_64-xlate.pl;h=e4fc17bdbdbc8976da1b82aa99a833090e2e2f96;hp=3ed7fcd494f87eb3bbb890b9e6ecf0caea72a922;hb=ee2b8ed2f535660950ceefb21de62d880bcf7f34;hpb=4db4882402a79345a075c62a87f2fb7cfe89e283 diff --git a/crypto/perlasm/x86_64-xlate.pl b/crypto/perlasm/x86_64-xlate.pl index 3ed7fcd494..e4fc17bdbd 100755 --- a/crypto/perlasm/x86_64-xlate.pl +++ b/crypto/perlasm/x86_64-xlate.pl @@ -195,7 +195,8 @@ my %globals; $self->{value} =~ s/([0-9]+\s*[\*\/\%]\s*[0-9]+)/eval($1)/eg; sprintf "\$%s",$self->{value}; } else { - $self->{value} =~ s/0x([0-9a-f]+)/0$1h/ig; + $self->{value} =~ s/(0b[0-1]+)/oct($1)/eig; + $self->{value} =~ s/0x([0-9a-f]+)/0$1h/ig if ($masm); sprintf "%s",$self->{value}; } } @@ -240,9 +241,11 @@ my %globals; if ($gas) { # Solaris /usr/ccs/bin/as can't handle multiplications - # in $self->{label} + # in $self->{label}, new gas requires sign extension... + use integer; $self->{label} =~ s/(?{label} =~ s/([0-9]+\s*[\*\/\%]\s*[0-9]+)/eval($1)/eg; + $self->{label} =~ s/([0-9]+)/$1<<32>>32/eg; $self->{label} =~ s/^___imp_/__imp__/ if ($flavour eq "mingw64"); if (defined($self->{index})) { @@ -574,7 +577,8 @@ my %globals; my @arr = split(',',$line); my $last = pop(@arr); my $conv = sub { my $var=shift; - $var=~s/0x([0-9a-f]+)/0$1h/ig; + $var=~s/^(0b[0-1]+)/oct($1)/eig; + $var=~s/^0x([0-9a-f]+)/0$1h/ig if ($masm); if ($sz eq "D" && ($current_segment=~/.[px]data/ || $dir eq ".rva")) { $var=~s/([_a-z\$\@][_a-z0-9\$\@]*)/$nasm?"$1 wrt ..imagebase":"imagerel $1"/egi; } $var; @@ -587,6 +591,8 @@ my %globals; last; }; /\.byte/ && do { my @str=split(",",$line); + map(s/(0b[0-1]+)/oct($1)/eig,@str); + map(s/0x([0-9a-f]+)/0$1h/ig,@str) if ($masm); while ($#str>15) { $self->{value}.="DB\t" .join(",",@str[0..15])."\n"; @@ -658,11 +664,11 @@ while($line=<>) { $insn = $opcode->out($#args>=1?$args[$#args]->size():$sz); } else { $insn = $opcode->out(); + $insn .= $sz if (map($_->out() =~ /xmm|mmx/,@args)); @args = reverse(@args); undef $sz if ($nasm && $opcode->mnemonic() eq "lea"); } - for (@args) { $_ = $_->out($sz); } - printf "\t%s\t%s", $insn, join(",",@args); + printf "\t%s\t%s",$insn,join(",",map($_->out($sz),@args)); } else { printf "\t%s",$opcode->out(); } @@ -828,6 +834,7 @@ close STDOUT; # CONTEXT.R14 232 # CONTEXT.R15 240 # CONTEXT.Rip 248 +# CONTEXT.Xmm6 512 # sizeof(CONTEXT) 1232 # DISPATCHER_CONTEXT.ControlPc 0 # DISPATCHER_CONTEXT.ImageBase 8