From: Andy Polyakov Date: Mon, 31 Jul 2006 22:26:40 +0000 (+0000) Subject: perlasm/x86unix.pl update. X-Git-Tag: OpenSSL_0_9_8k^2~1178 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=0cc46efa09ced06dc1992da2feee561f6342aed8;p=oweals%2Fopenssl.git perlasm/x86unix.pl update. --- diff --git a/crypto/perlasm/x86unix.pl b/crypto/perlasm/x86unix.pl index e71050b6bc..6b90848497 100644 --- a/crypto/perlasm/x86unix.pl +++ b/crypto/perlasm/x86unix.pl @@ -234,6 +234,15 @@ sub main'movq { { push(@out,"\tpshufw\t\$0xe4,%$p2,%$p1\n"); } else { &out2("movq",@_); } } +sub main'pshufw { + local ($dst,$src,$magic)=@_; + push(@out,"\tpshufw\t\$$magic,%$src,%$dst\n"); + } +sub main'punpckldq { &out2("punpckldq",@_); } +sub main'pcmpgtb { &out2("pcmpgtb",@_); } +sub main'paddb { &out2("paddb",@_); } +sub main'psrld { &out2("psrld",@_); } +sub main'pslld { &out2("pslld",@_); } # The bswapl instruction is new for the 486. Emulate if i386. sub main'bswap @@ -690,10 +699,14 @@ sub popvars sub main'picmeup { - local($dst,$sym)=@_; + local($dst,$sym,$base,$label)=@_; + if ($main'cpp) { - local($tmp)=<<___; + local($tmp); + if (!defined($base)) + { + $tmp=<<___; #if (defined(ELF) || defined(SOL)) && defined(PIC) call 1f 1: popl $regs{$dst} @@ -703,15 +716,34 @@ sub main'picmeup leal $sym,$regs{$dst} #endif ___ + } + else { + $tmp=<<___; +#if (defined(ELF) || defined(SOL)) && defined(PIC) + leal _GLOBAL_OFFSET_TABLE_+[.-$label]($regs{$base}),$regs{$dst} + movl $sym\@GOT($regs{$dst}),$regs{$dst} +#else + leal $sym,$regs{$dst} +#endif +___ + } push(@out,$tmp); } elsif ($main'pic && ($main'elf || $main'aout)) { - &main'call(&main'label("PIC_me_up")); - &main'set_label("PIC_me_up"); - &main'blindpop($dst); - &main'add($dst,"\$${under}_GLOBAL_OFFSET_TABLE_+[.-". + if (!defined($base)) + { + &main'call(&main'label("PIC_me_up")); + &main'set_label("PIC_me_up"); + &main'blindpop($dst); + &main'add($dst,"\$${under}_GLOBAL_OFFSET_TABLE_+[.-". &main'label("PIC_me_up") . "]"); + } + else { + &main'lea($dst,&main'DWP( + "${under}_GLOBAL_OFFSET_TABLE_+[.-$label]", + $base)); + } &main'mov($dst,&main'DWP($under.$sym."\@GOT",$dst)); } else