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