Loading crypto/perlasm/x86ms.pl +20 −9 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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",@_); } Loading Loading @@ -247,6 +254,8 @@ sub main'file TITLE $file.asm .386 .model FLAT _TEXT\$ SEGMENT PAGE 'CODE' EOF push(@out,$tmp); } Loading @@ -258,7 +267,6 @@ sub main'function_begin push(@labels,$func); local($tmp)=<<"EOF"; _TEXT\$ SEGMENT PAGE 'CODE' PUBLIC _$func $extra _$func PROC NEAR Loading @@ -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 Loading @@ -296,7 +303,6 @@ sub main'function_end pop ebp ret _$func ENDP _TEXT\$ ENDS EOF push(@out,$tmp); $stack=0; Loading @@ -309,7 +315,6 @@ sub main'function_end_B local($tmp)=<<"EOF"; _$func ENDP _TEXT\$ ENDS EOF push(@out,$tmp); $stack=0; Loading Loading @@ -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"); } Loading Loading @@ -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"); Loading Loading @@ -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); } Loading crypto/perlasm/x86nasm.pl +8 −2 Original line number Diff line number Diff line Loading @@ -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",@_); } Loading Loading @@ -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"); Loading Loading @@ -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 ___ Loading crypto/perlasm/x86unix.pl +13 −1 Original line number Diff line number Diff line Loading @@ -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",@_); } Loading @@ -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",@_); } Loading @@ -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 Loading Loading @@ -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"); Loading crypto/x86cpuid.pl +1 −1 Original line number Diff line number Diff line Loading @@ -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). Loading Loading
crypto/perlasm/x86ms.pl +20 −9 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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",@_); } Loading Loading @@ -247,6 +254,8 @@ sub main'file TITLE $file.asm .386 .model FLAT _TEXT\$ SEGMENT PAGE 'CODE' EOF push(@out,$tmp); } Loading @@ -258,7 +267,6 @@ sub main'function_begin push(@labels,$func); local($tmp)=<<"EOF"; _TEXT\$ SEGMENT PAGE 'CODE' PUBLIC _$func $extra _$func PROC NEAR Loading @@ -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 Loading @@ -296,7 +303,6 @@ sub main'function_end pop ebp ret _$func ENDP _TEXT\$ ENDS EOF push(@out,$tmp); $stack=0; Loading @@ -309,7 +315,6 @@ sub main'function_end_B local($tmp)=<<"EOF"; _$func ENDP _TEXT\$ ENDS EOF push(@out,$tmp); $stack=0; Loading Loading @@ -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"); } Loading Loading @@ -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"); Loading Loading @@ -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); } Loading
crypto/perlasm/x86nasm.pl +8 −2 Original line number Diff line number Diff line Loading @@ -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",@_); } Loading Loading @@ -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"); Loading Loading @@ -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 ___ Loading
crypto/perlasm/x86unix.pl +13 −1 Original line number Diff line number Diff line Loading @@ -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",@_); } Loading @@ -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",@_); } Loading @@ -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 Loading Loading @@ -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"); Loading
crypto/x86cpuid.pl +1 −1 Original line number Diff line number Diff line Loading @@ -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). Loading