diff options
Diffstat (limited to 'src/lib/libcrypto/perlasm/x86unix.pl')
-rw-r--r-- | src/lib/libcrypto/perlasm/x86unix.pl | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/src/lib/libcrypto/perlasm/x86unix.pl b/src/lib/libcrypto/perlasm/x86unix.pl index a31a25c12b..b61425e951 100644 --- a/src/lib/libcrypto/perlasm/x86unix.pl +++ b/src/lib/libcrypto/perlasm/x86unix.pl | |||
@@ -15,6 +15,12 @@ sub main'asm_get_output { return(@out); } | |||
15 | sub main'get_labels { return(@labels); } | 15 | sub main'get_labels { return(@labels); } |
16 | sub main'external_label { push(@labels,@_); } | 16 | sub main'external_label { push(@labels,@_); } |
17 | 17 | ||
18 | if ($main'openbsd) | ||
19 | { | ||
20 | $com_start='/*'; | ||
21 | $com_end='*/'; | ||
22 | } | ||
23 | |||
18 | if ($main'cpp) | 24 | if ($main'cpp) |
19 | { | 25 | { |
20 | $align="ALIGN"; | 26 | $align="ALIGN"; |
@@ -173,7 +179,9 @@ sub main'not { &out1("notl",@_); } | |||
173 | sub main'call { &out1("call",($_[0]=~/^\.L/?'':$under).$_[0]); } | 179 | sub main'call { &out1("call",($_[0]=~/^\.L/?'':$under).$_[0]); } |
174 | sub main'ret { &out0("ret"); } | 180 | sub main'ret { &out0("ret"); } |
175 | sub main'nop { &out0("nop"); } | 181 | sub main'nop { &out0("nop"); } |
182 | sub main'test { &out2("testl",@_); } | ||
176 | sub main'movz { &out2("movzbl",@_); } | 183 | sub main'movz { &out2("movzbl",@_); } |
184 | sub main'neg { &out1("negl",@_); } | ||
177 | 185 | ||
178 | # The bswapl instruction is new for the 486. Emulate if i386. | 186 | # The bswapl instruction is new for the 486. Emulate if i386. |
179 | sub main'bswap | 187 | sub main'bswap |
@@ -277,6 +285,9 @@ sub main'file | |||
277 | { | 285 | { |
278 | local($file)=@_; | 286 | local($file)=@_; |
279 | 287 | ||
288 | if ($main'openbsd) | ||
289 | { push(@out,"#include <machine/asm.h>\n"); return; } | ||
290 | |||
280 | local($tmp)=<<"EOF"; | 291 | local($tmp)=<<"EOF"; |
281 | .file "$file.s" | 292 | .file "$file.s" |
282 | .version "01.01" | 293 | .version "01.01" |
@@ -292,6 +303,9 @@ sub main'function_begin | |||
292 | &main'external_label($func); | 303 | &main'external_label($func); |
293 | $func=$under.$func; | 304 | $func=$under.$func; |
294 | 305 | ||
306 | if ($main'openbsd) | ||
307 | { push (@out, "\nENTRY($func)\n"); goto skip; } | ||
308 | |||
295 | local($tmp)=<<"EOF"; | 309 | local($tmp)=<<"EOF"; |
296 | .text | 310 | .text |
297 | .align $align | 311 | .align $align |
@@ -304,6 +318,7 @@ EOF | |||
304 | { $tmp=push(@out,"\t.def\t$func;\t.scl\t2;\t.type\t32;\t.endef\n"); } | 318 | { $tmp=push(@out,"\t.def\t$func;\t.scl\t2;\t.type\t32;\t.endef\n"); } |
305 | else { $tmp=push(@out,"\t.type\t$func,\@function\n"); } | 319 | else { $tmp=push(@out,"\t.type\t$func,\@function\n"); } |
306 | push(@out,"$func:\n"); | 320 | push(@out,"$func:\n"); |
321 | skip: | ||
307 | $tmp=<<"EOF"; | 322 | $tmp=<<"EOF"; |
308 | pushl %ebp | 323 | pushl %ebp |
309 | pushl %ebx | 324 | pushl %ebx |
@@ -322,6 +337,9 @@ sub main'function_begin_B | |||
322 | &main'external_label($func); | 337 | &main'external_label($func); |
323 | $func=$under.$func; | 338 | $func=$under.$func; |
324 | 339 | ||
340 | if ($main'openbsd) | ||
341 | { push(@out, "\nENTRY($func)\n"); goto skip; } | ||
342 | |||
325 | local($tmp)=<<"EOF"; | 343 | local($tmp)=<<"EOF"; |
326 | .text | 344 | .text |
327 | .align $align | 345 | .align $align |
@@ -334,6 +352,7 @@ EOF | |||
334 | { $tmp=push(@out,"\t.def\t$func;\t.scl\t2;\t.type\t32;\t.endef\n"); } | 352 | { $tmp=push(@out,"\t.def\t$func;\t.scl\t2;\t.type\t32;\t.endef\n"); } |
335 | else { push(@out,"\t.type $func,\@function\n"); } | 353 | else { push(@out,"\t.type $func,\@function\n"); } |
336 | push(@out,"$func:\n"); | 354 | push(@out,"$func:\n"); |
355 | skip: | ||
337 | $stack=4; | 356 | $stack=4; |
338 | } | 357 | } |
339 | 358 | ||
@@ -430,7 +449,8 @@ sub main'swtmp | |||
430 | 449 | ||
431 | sub main'comment | 450 | sub main'comment |
432 | { | 451 | { |
433 | if ($main'elf) # GNU and SVR4 as'es use different comment delimiters, | 452 | if (!$main'openbsd && $main'elf) |
453 | # GNU and SVR4 as'es use different comment delimiters, | ||
434 | { # so we just skip comments... | 454 | { # so we just skip comments... |
435 | push(@out,"\n"); | 455 | push(@out,"\n"); |
436 | return; | 456 | return; |
@@ -444,6 +464,12 @@ sub main'comment | |||
444 | } | 464 | } |
445 | } | 465 | } |
446 | 466 | ||
467 | sub main'public_label | ||
468 | { | ||
469 | $label{$_[0]}="${under}${_[0]}" if (!defined($label{$_[0]})); | ||
470 | push(@out,".globl\t$label{$_[0]}\n"); | ||
471 | } | ||
472 | |||
447 | sub main'label | 473 | sub main'label |
448 | { | 474 | { |
449 | if (!defined($label{$_[0]})) | 475 | if (!defined($label{$_[0]})) |
@@ -461,7 +487,10 @@ sub main'set_label | |||
461 | $label{$_[0]}=".${label}${_[0]}"; | 487 | $label{$_[0]}=".${label}${_[0]}"; |
462 | $label++; | 488 | $label++; |
463 | } | 489 | } |
464 | push(@out,".align $align\n") if ($_[1] != 0); | 490 | if ($main'openbsd) |
491 | { push(@out,"_ALIGN_TEXT\n") if ($_[1] != 0); } | ||
492 | else | ||
493 | { push(@out,".align $align\n") if ($_[1] != 0); } | ||
465 | push(@out,"$label{$_[0]}:\n"); | 494 | push(@out,"$label{$_[0]}:\n"); |
466 | } | 495 | } |
467 | 496 | ||
@@ -477,7 +506,7 @@ sub main'file_end | |||
477 | 506 | ||
478 | sub main'data_word | 507 | sub main'data_word |
479 | { | 508 | { |
480 | push(@out,"\t.long $_[0]\n"); | 509 | push(@out,"\t.long\t".join(',',@_)."\n"); |
481 | } | 510 | } |
482 | 511 | ||
483 | # debug output functions: puts, putx, printf | 512 | # debug output functions: puts, putx, printf |
@@ -570,6 +599,16 @@ sub main'picmeup | |||
570 | ___ | 599 | ___ |
571 | push(@out,$tmp); | 600 | push(@out,$tmp); |
572 | } | 601 | } |
602 | elsif ($main'openbsd) | ||
603 | { | ||
604 | push(@out, "#ifdef PIC\n"); | ||
605 | push(@out, "\tPIC_PROLOGUE\n"); | ||
606 | &main'mov($dst,"PIC_GOT($sym)"); | ||
607 | push(@out, "\tPIC_EPILOGUE\n"); | ||
608 | push(@out, "#else\n"); | ||
609 | &main'lea($dst,&main'DWP($sym)); | ||
610 | push(@out, "#endif\n"); | ||
611 | } | ||
573 | elsif ($main'pic && ($main'elf || $main'aout)) | 612 | elsif ($main'pic && ($main'elf || $main'aout)) |
574 | { | 613 | { |
575 | push(@out,"\t.align\t8\n"); | 614 | push(@out,"\t.align\t8\n"); |