summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/perlasm/x86nasm.pl
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/perlasm/x86nasm.pl')
-rw-r--r--src/lib/libcrypto/perlasm/x86nasm.pl153
1 files changed, 34 insertions, 119 deletions
diff --git a/src/lib/libcrypto/perlasm/x86nasm.pl b/src/lib/libcrypto/perlasm/x86nasm.pl
index fa38f89c09..4bdb3fe180 100644
--- a/src/lib/libcrypto/perlasm/x86nasm.pl
+++ b/src/lib/libcrypto/perlasm/x86nasm.pl
@@ -3,7 +3,6 @@
3package x86nasm; 3package x86nasm;
4 4
5$label="L000"; 5$label="L000";
6$under=($main'netware)?'':'_';
7 6
8%lb=( 'eax', 'al', 7%lb=( 'eax', 'al',
9 'ebx', 'bl', 8 'ebx', 'bl',
@@ -33,8 +32,7 @@ sub main'external_label
33{ 32{
34 push(@labels,@_); 33 push(@labels,@_);
35 foreach (@_) { 34 foreach (@_) {
36 push(@out,".") if ($main'mwerks); 35 push(@out, "extern\t_$_\n");
37 push(@out, "extern\t${under}$_\n");
38 } 36 }
39} 37}
40 38
@@ -60,19 +58,14 @@ sub main'DWP
60 &get_mem("DWORD",@_); 58 &get_mem("DWORD",@_);
61 } 59 }
62 60
63sub main'QWP
64 {
65 &get_mem("",@_);
66 }
67
68sub main'BC 61sub main'BC
69 { 62 {
70 return (($main'mwerks)?"":"BYTE ")."@_"; 63 return "BYTE @_";
71 } 64 }
72 65
73sub main'DWC 66sub main'DWC
74 { 67 {
75 return (($main'mwerks)?"":"DWORD ")."@_"; 68 return "DWORD @_";
76 } 69 }
77 70
78sub main'stack_push 71sub main'stack_push
@@ -93,22 +86,16 @@ sub get_mem
93 { 86 {
94 my($size,$addr,$reg1,$reg2,$idx)=@_; 87 my($size,$addr,$reg1,$reg2,$idx)=@_;
95 my($t,$post); 88 my($t,$post);
96 my($ret)=$size; 89 my($ret)="$size [";
97 if ($ret ne "")
98 {
99 $ret .= " PTR" if ($main'mwerks);
100 $ret .= " ";
101 }
102 $ret .= "[";
103 $addr =~ s/^\s+//; 90 $addr =~ s/^\s+//;
104 if ($addr =~ /^(.+)\+(.+)$/) 91 if ($addr =~ /^(.+)\+(.+)$/)
105 { 92 {
106 $reg2=&conv($1); 93 $reg2=&conv($1);
107 $addr="$under$2"; 94 $addr="_$2";
108 } 95 }
109 elsif ($addr =~ /^[_a-z][_a-z0-9]*$/i) 96 elsif ($addr =~ /^[_a-zA-Z]/)
110 { 97 {
111 $addr="$under$addr"; 98 $addr="_$addr";
112 } 99 }
113 100
114 if ($addr =~ /^.+\-.+$/) { $addr="($addr)"; } 101 if ($addr =~ /^.+\-.+$/) { $addr="($addr)"; }
@@ -147,14 +134,12 @@ sub main'xorb { &out2("xor",@_); }
147sub main'add { &out2("add",@_); } 134sub main'add { &out2("add",@_); }
148sub main'adc { &out2("adc",@_); } 135sub main'adc { &out2("adc",@_); }
149sub main'sub { &out2("sub",@_); } 136sub main'sub { &out2("sub",@_); }
150sub main'sbb { &out2("sbb",@_); }
151sub main'rotl { &out2("rol",@_); } 137sub main'rotl { &out2("rol",@_); }
152sub main'rotr { &out2("ror",@_); } 138sub main'rotr { &out2("ror",@_); }
153sub main'exch { &out2("xchg",@_); } 139sub main'exch { &out2("xchg",@_); }
154sub main'cmp { &out2("cmp",@_); } 140sub main'cmp { &out2("cmp",@_); }
155sub main'lea { &out2("lea",@_); } 141sub main'lea { &out2("lea",@_); }
156sub main'mul { &out1("mul",@_); } 142sub main'mul { &out1("mul",@_); }
157sub main'imul { &out2("imul",@_); }
158sub main'div { &out1("div",@_); } 143sub main'div { &out1("div",@_); }
159sub main'dec { &out1("dec",@_); } 144sub main'dec { &out1("dec",@_); }
160sub main'inc { &out1("inc",@_); } 145sub main'inc { &out1("inc",@_); }
@@ -162,57 +147,29 @@ sub main'jmp { &out1("jmp",@_); }
162sub main'jmp_ptr { &out1p("jmp",@_); } 147sub main'jmp_ptr { &out1p("jmp",@_); }
163 148
164# This is a bit of a kludge: declare all branches as NEAR. 149# This is a bit of a kludge: declare all branches as NEAR.
165$near=($main'mwerks)?'':'NEAR'; 150sub main'je { &out1("je NEAR",@_); }
166sub main'je { &out1("je $near",@_); } 151sub main'jle { &out1("jle NEAR",@_); }
167sub main'jle { &out1("jle $near",@_); } 152sub main'jz { &out1("jz NEAR",@_); }
168sub main'jz { &out1("jz $near",@_); } 153sub main'jge { &out1("jge NEAR",@_); }
169sub main'jge { &out1("jge $near",@_); } 154sub main'jl { &out1("jl NEAR",@_); }
170sub main'jl { &out1("jl $near",@_); } 155sub main'ja { &out1("ja NEAR",@_); }
171sub main'ja { &out1("ja $near",@_); } 156sub main'jae { &out1("jae NEAR",@_); }
172sub main'jae { &out1("jae $near",@_); } 157sub main'jb { &out1("jb NEAR",@_); }
173sub main'jb { &out1("jb $near",@_); } 158sub main'jbe { &out1("jbe NEAR",@_); }
174sub main'jbe { &out1("jbe $near",@_); } 159sub main'jc { &out1("jc NEAR",@_); }
175sub main'jc { &out1("jc $near",@_); } 160sub main'jnc { &out1("jnc NEAR",@_); }
176sub main'jnc { &out1("jnc $near",@_); } 161sub main'jnz { &out1("jnz NEAR",@_); }
177sub main'jnz { &out1("jnz $near",@_); } 162sub main'jne { &out1("jne NEAR",@_); }
178sub main'jne { &out1("jne $near",@_); } 163sub main'jno { &out1("jno NEAR",@_); }
179sub main'jno { &out1("jno $near",@_); }
180 164
181sub main'push { &out1("push",@_); $stack+=4; } 165sub main'push { &out1("push",@_); $stack+=4; }
182sub main'pop { &out1("pop",@_); $stack-=4; } 166sub main'pop { &out1("pop",@_); $stack-=4; }
183sub main'pushf { &out0("pushfd"); $stack+=4; }
184sub main'popf { &out0("popfd"); $stack-=4; }
185sub main'bswap { &out1("bswap",@_); &using486(); } 167sub main'bswap { &out1("bswap",@_); &using486(); }
186sub main'not { &out1("not",@_); } 168sub main'not { &out1("not",@_); }
187sub main'call { &out1("call",($_[0]=~/^\@L/?'':$under).$_[0]); } 169sub main'call { &out1("call",($_[0]=~/^\$L/?'':'_').$_[0]); }
188sub main'call_ptr { &out1p("call",@_); }
189sub main'ret { &out0("ret"); } 170sub main'ret { &out0("ret"); }
190sub main'nop { &out0("nop"); } 171sub main'nop { &out0("nop"); }
191sub main'test { &out2("test",@_); }
192sub main'bt { &out2("bt",@_); }
193sub main'leave { &out0("leave"); }
194sub main'cpuid { &out0("cpuid"); }
195sub main'rdtsc { &out0("rdtsc"); }
196sub main'halt { &out0("hlt"); }
197sub main'movz { &out2("movzx",@_); } 172sub main'movz { &out2("movzx",@_); }
198sub main'neg { &out1("neg",@_); }
199sub main'cld { &out0("cld"); }
200
201# SSE2
202sub main'emms { &out0("emms"); }
203sub main'movd { &out2("movd",@_); }
204sub main'movq { &out2("movq",@_); }
205sub main'movdqu { &out2("movdqu",@_); }
206sub main'movdqa { &out2("movdqa",@_); }
207sub main'movdq2q{ &out2("movdq2q",@_); }
208sub main'movq2dq{ &out2("movq2dq",@_); }
209sub main'paddq { &out2("paddq",@_); }
210sub main'pmuludq{ &out2("pmuludq",@_); }
211sub main'psrlq { &out2("psrlq",@_); }
212sub main'psllq { &out2("psllq",@_); }
213sub main'pxor { &out2("pxor",@_); }
214sub main'por { &out2("por",@_); }
215sub main'pand { &out2("pand",@_); }
216 173
217sub out2 174sub out2
218 { 175 {
@@ -220,7 +177,7 @@ sub out2
220 my($l,$t); 177 my($l,$t);
221 178
222 push(@out,"\t$name\t"); 179 push(@out,"\t$name\t");
223 if (!$main'mwerks and $name eq "lea") 180 if ($name eq "lea")
224 { 181 {
225 $p1 =~ s/^[^\[]*\[/\[/; 182 $p1 =~ s/^[^\[]*\[/\[/;
226 $p2 =~ s/^[^\[]*\[/\[/; 183 $p2 =~ s/^[^\[]*\[/\[/;
@@ -264,17 +221,15 @@ sub using486
264 221
265sub main'file 222sub main'file
266 { 223 {
267 if ($main'mwerks) { push(@out,".section\t.text\n"); } 224 local $tmp;
268 else { 225 $tmp=<<___;
269 local $tmp=<<___;
270%ifdef __omf__ 226%ifdef __omf__
271section code use32 class=code 227section code use32 class=code
272%else 228%else
273section .text 229section .text
274%endif 230%endif
275___ 231___
276 push(@out,$tmp); 232 push(@out,$tmp);
277 }
278 } 233 }
279 234
280sub main'function_begin 235sub main'function_begin
@@ -282,10 +237,9 @@ sub main'function_begin
282 my($func,$extra)=@_; 237 my($func,$extra)=@_;
283 238
284 push(@labels,$func); 239 push(@labels,$func);
285 push(@out,".") if ($main'mwerks);
286 my($tmp)=<<"EOF"; 240 my($tmp)=<<"EOF";
287global $under$func 241global _$func
288$under$func: 242_$func:
289 push ebp 243 push ebp
290 push ebx 244 push ebx
291 push esi 245 push esi
@@ -298,10 +252,9 @@ EOF
298sub main'function_begin_B 252sub main'function_begin_B
299 { 253 {
300 my($func,$extra)=@_; 254 my($func,$extra)=@_;
301 push(@out,".") if ($main'mwerks);
302 my($tmp)=<<"EOF"; 255 my($tmp)=<<"EOF";
303global $under$func 256global _$func
304$under$func: 257_$func:
305EOF 258EOF
306 push(@out,$tmp); 259 push(@out,$tmp);
307 $stack=4; 260 $stack=4;
@@ -375,18 +328,11 @@ sub main'comment
375 } 328 }
376 } 329 }
377 330
378sub main'public_label
379 {
380 $label{$_[0]}="${under}${_[0]}" if (!defined($label{$_[0]}));
381 push(@out,".") if ($main'mwerks);
382 push(@out,"global\t$label{$_[0]}\n");
383 }
384
385sub main'label 331sub main'label
386 { 332 {
387 if (!defined($label{$_[0]})) 333 if (!defined($label{$_[0]}))
388 { 334 {
389 $label{$_[0]}="\@${label}${_[0]}"; 335 $label{$_[0]}="\$${label}${_[0]}";
390 $label++; 336 $label++;
391 } 337 }
392 return($label{$_[0]}); 338 return($label{$_[0]});
@@ -396,30 +342,15 @@ sub main'set_label
396 { 342 {
397 if (!defined($label{$_[0]})) 343 if (!defined($label{$_[0]}))
398 { 344 {
399 $label{$_[0]}="\@${label}${_[0]}"; 345 $label{$_[0]}="\$${label}${_[0]}";
400 $label++; 346 $label++;
401 } 347 }
402 if ($_[1]!=0 && $_[1]>1)
403 {
404 main'align($_[1]);
405 }
406 push(@out,"$label{$_[0]}:\n"); 348 push(@out,"$label{$_[0]}:\n");
407 } 349 }
408 350
409sub main'data_byte
410 {
411 push(@out,(($main'mwerks)?".byte\t":"DB\t").join(',',@_)."\n");
412 }
413
414sub main'data_word 351sub main'data_word
415 { 352 {
416 push(@out,(($main'mwerks)?".long\t":"DD\t").join(',',@_)."\n"); 353 push(@out,"\tDD\t$_[0]\n");
417 }
418
419sub main'align
420 {
421 push(@out,".") if ($main'mwerks);
422 push(@out,"align\t$_[0]\n");
423 } 354 }
424 355
425sub out1p 356sub out1p
@@ -427,7 +358,7 @@ sub out1p
427 my($name,$p1)=@_; 358 my($name,$p1)=@_;
428 my($l,$t); 359 my($l,$t);
429 360
430 push(@out,"\t$name\t".&conv($p1)."\n"); 361 push(@out,"\t$name\t ".&conv($p1)."\n");
431 } 362 }
432 363
433sub main'picmeup 364sub main'picmeup
@@ -437,19 +368,3 @@ sub main'picmeup
437 } 368 }
438 369
439sub main'blindpop { &out1("pop",@_); } 370sub main'blindpop { &out1("pop",@_); }
440
441sub main'initseg
442 {
443 local($f)=@_;
444 if ($main'win32)
445 {
446 local($tmp)=<<___;
447segment .CRT\$XCU data
448extern $under$f
449DD $under$f
450___
451 push(@out,$tmp);
452 }
453 }
454
4551;