From 05decf3638da852e54014ea0a9e2845f5ccc1420 Mon Sep 17 00:00:00 2001 From: Andy Polyakov Date: Tue, 6 Dec 2005 18:47:18 +0000 Subject: [PATCH] Perlasm update from HEAD addressing build problems on non-ELF platforms after http://cvs.openssl.org/chngview?cn=14661. --- crypto/perlasm/x86ms.pl | 29 ++++++++++++++++++++--------- crypto/perlasm/x86nasm.pl | 10 ++++++++-- crypto/perlasm/x86unix.pl | 14 +++++++++++++- crypto/x86cpuid.pl | 2 +- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/crypto/perlasm/x86ms.pl b/crypto/perlasm/x86ms.pl index d1cb7ee0ac..82538a9a9a 100644 --- a/crypto/perlasm/x86ms.pl +++ b/crypto/perlasm/x86ms.pl @@ -27,7 +27,13 @@ $label="L000"; sub main'asm_init_output { @out=(); } sub main'asm_get_output { return(@out); } sub main'get_labels { return(@labels); } -sub main'external_label { push(@labels,@_); } +sub main'external_label +{ + push(@labels,@_); + foreach (@_) { + push(@out, "EXTRN\t_$_:DWORD\n"); + } +} sub main'LB { @@ -166,6 +172,7 @@ sub main'popf { &out0("popfd"); $stack-=4; } sub main'bswap { &out1("bswap",@_); &using486(); } sub main'not { &out1("not",@_); } sub main'call { &out1("call",($_[0]=~/^\$L/?'':'_').$_[0]); } +sub main'call_ptr { &out1p("call",@_); } sub main'ret { &out0("ret"); } sub main'nop { &out0("nop"); } sub main'test { &out2("test",@_); } @@ -246,7 +253,9 @@ sub main'file local($tmp)=<<"EOF"; TITLE $file.asm .386 -.model FLAT +.model FLAT +_TEXT\$ SEGMENT PAGE 'CODE' + EOF push(@out,$tmp); } @@ -258,7 +267,6 @@ sub main'function_begin push(@labels,$func); local($tmp)=<<"EOF"; -_TEXT\$ SEGMENT PAGE 'CODE' PUBLIC _$func $extra _$func PROC NEAR @@ -276,7 +284,6 @@ sub main'function_begin_B local($func,$extra)=@_; local($tmp)=<<"EOF"; -_TEXT\$ SEGMENT PAGE 'CODE' PUBLIC _$func $extra _$func PROC NEAR @@ -296,7 +303,6 @@ sub main'function_end pop ebp ret _$func ENDP -_TEXT\$ ENDS EOF push(@out,$tmp); $stack=0; @@ -309,7 +315,6 @@ sub main'function_end_B local($tmp)=<<"EOF"; _$func ENDP -_TEXT\$ ENDS EOF push(@out,$tmp); $stack=0; @@ -339,6 +344,7 @@ sub main'file_end elsif (grep {/mm[0-7]\s*,/i} @out) { grep {s/\.[3-7]86/\.686\n\t\.MMX/} @out; } + push(@out,"_TEXT\$ ENDS\n"); push(@out,"END\n"); } @@ -411,6 +417,11 @@ sub main'set_label } } +sub main'data_byte + { + push(@out,"\tDB\t".join(',',@_)."\n"); + } + sub main'data_word { push(@out,"\tDD\t".join(',',@_)."\n"); @@ -426,7 +437,7 @@ sub out1p local($name,$p1)=@_; local($l,$t); - push(@out,"\t$name\t ".&conv($p1)."\n"); + push(@out,"\t$name\t".&conv($p1)."\n"); } sub main'picmeup @@ -442,10 +453,10 @@ sub main'initseg local($f)=@_; local($tmp)=<<___; OPTION DOTNAME -.CRT\$XIU SEGMENT DWORD PUBLIC 'DATA' +.CRT\$XCU SEGMENT DWORD PUBLIC 'DATA' EXTRN _$f:NEAR DD _$f -.CRT\$XIU ENDS +.CRT\$XCU ENDS ___ push(@out,$tmp); } diff --git a/crypto/perlasm/x86nasm.pl b/crypto/perlasm/x86nasm.pl index 331f18bb22..b6dfcbdf02 100644 --- a/crypto/perlasm/x86nasm.pl +++ b/crypto/perlasm/x86nasm.pl @@ -184,6 +184,7 @@ sub main'popf { &out0("popfd"); $stack-=4; } sub main'bswap { &out1("bswap",@_); &using486(); } sub main'not { &out1("not",@_); } sub main'call { &out1("call",($_[0]=~/^\@L/?'':$under).$_[0]); } +sub main'call_ptr { &out1p("call",@_); } sub main'ret { &out0("ret"); } sub main'nop { &out0("nop"); } sub main'test { &out2("test",@_); } @@ -401,6 +402,11 @@ sub main'set_label push(@out,"$label{$_[0]}:\n"); } +sub main'data_byte + { + push(@out,(($main'mwerks)?".byte\t":"DB\t").join(',',@_)."\n"); + } + sub main'data_word { push(@out,(($main'mwerks)?".long\t":"DD\t").join(',',@_)."\n"); @@ -417,7 +423,7 @@ sub out1p my($name,$p1)=@_; my($l,$t); - push(@out,"\t$name\t ".&conv($p1)."\n"); + push(@out,"\t$name\t".&conv($p1)."\n"); } sub main'picmeup @@ -434,7 +440,7 @@ sub main'initseg if ($main'win32) { local($tmp)=<<___; -segment .CRT\$XIU data +segment .CRT\$XCU data extern $under$f DD $under$f ___ diff --git a/crypto/perlasm/x86unix.pl b/crypto/perlasm/x86unix.pl index 9bc5c0e893..e71050b6bc 100644 --- a/crypto/perlasm/x86unix.pl +++ b/crypto/perlasm/x86unix.pl @@ -200,6 +200,7 @@ sub main'call { my $pre=$under; { if ($label{$i} eq $_[0]) { $pre=''; last; } } &out1("call",$pre.$_[0]); } +sub main'call_ptr { &out1p("call",@_); } sub main'ret { &out0("ret"); } sub main'nop { &out0("nop"); } sub main'test { &out2("testl",@_); } @@ -215,7 +216,6 @@ sub main'cld { &out0("cld"); } # SSE2 sub main'emms { &out0("emms"); } sub main'movd { &out2("movd",@_); } -sub main'movq { &out2("movq",@_); } sub main'movdqu { &out2("movdqu",@_); } sub main'movdqa { &out2("movdqa",@_); } sub main'movdq2q{ &out2("movdq2q",@_); } @@ -227,6 +227,13 @@ sub main'psllq { &out2("psllq",@_); } sub main'pxor { &out2("pxor",@_); } sub main'por { &out2("por",@_); } sub main'pand { &out2("pand",@_); } +sub main'movq { + local($p1,$p2,$optimize)=@_; + if ($optimize && $p1=~/^mm[0-7]$/ && $p2=~/^mm[0-7]$/) + # movq between mmx registers can sink Intel CPUs + { push(@out,"\tpshufw\t\$0xe4,%$p2,%$p1\n"); } + else { &out2("movq",@_); } + } # The bswapl instruction is new for the 486. Emulate if i386. sub main'bswap @@ -588,6 +595,11 @@ ___ } } +sub main'data_byte + { + push(@out,"\t.byte\t".join(',',@_)."\n"); + } + sub main'data_word { push(@out,"\t.long\t".join(',',@_)."\n"); diff --git a/crypto/x86cpuid.pl b/crypto/x86cpuid.pl index d4066e8858..c53c9bc998 100644 --- a/crypto/x86cpuid.pl +++ b/crypto/x86cpuid.pl @@ -183,7 +183,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); } &mov ("eax",&DWP(12+$i*4,"ebp")); &mov (&DWP(0+$i*4,"esp"),"eax"); } - &call (&DWP(8,"ebp"));# make the call... + &call_ptr (&DWP(8,"ebp"));# make the call... &mov ("esp","ebp"); # ... and just restore the stack pointer # without paying attention to what we called, # (__cdecl *func) or (__stdcall *one). -- 2.40.0