summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/perlasm/x86unix.pl
diff options
context:
space:
mode:
authormarkus <>2002-09-05 12:51:52 +0000
committermarkus <>2002-09-05 12:51:52 +0000
commit5514995a9d5ed91db089875adb509c7781357c0e (patch)
tree2484410a46ba6c05ef94c253da36fbceef990b64 /src/lib/libcrypto/perlasm/x86unix.pl
parentfd9566423b542798f5c8b06e68101a9ea5bb9885 (diff)
downloadopenbsd-5514995a9d5ed91db089875adb509c7781357c0e.tar.gz
openbsd-5514995a9d5ed91db089875adb509c7781357c0e.tar.bz2
openbsd-5514995a9d5ed91db089875adb509c7781357c0e.zip
import openssl-0.9.7-beta1
Diffstat (limited to 'src/lib/libcrypto/perlasm/x86unix.pl')
-rw-r--r--src/lib/libcrypto/perlasm/x86unix.pl141
1 files changed, 128 insertions, 13 deletions
diff --git a/src/lib/libcrypto/perlasm/x86unix.pl b/src/lib/libcrypto/perlasm/x86unix.pl
index 6ee4dd3245..9ceabf0705 100644
--- a/src/lib/libcrypto/perlasm/x86unix.pl
+++ b/src/lib/libcrypto/perlasm/x86unix.pl
@@ -1,14 +1,10 @@
1#!/usr/bin/perl 1#!/usr/local/bin/perl
2
3# Because the bswapl instruction is not supported for old assembers
4# (it was a new instruction for the 486), I've added .byte xxxx code
5# to put it in.
6# eric 24-Apr-1998
7#
8 2
9package x86unix; 3package x86unix;
10 4
11$label="L000"; 5$label="L000";
6$const="";
7$constl=0;
12 8
13$align=($main'aout)?"4":"16"; 9$align=($main'aout)?"4":"16";
14$under=($main'aout)?"_":""; 10$under=($main'aout)?"_":"";
@@ -85,12 +81,17 @@ sub main'DWP
85 local($addr,$reg1,$reg2,$idx)=@_; 81 local($addr,$reg1,$reg2,$idx)=@_;
86 82
87 $ret=""; 83 $ret="";
88 $addr =~ s/(^|[+ \t])([A-Za-z_]+)($|[+ \t])/$1$under$2$3/; 84 $addr =~ s/(^|[+ \t])([A-Za-z_]+[A-Za-z0-9_]+)($|[+ \t])/$1$under$2$3/;
89 $reg1="$regs{$reg1}" if defined($regs{$reg1}); 85 $reg1="$regs{$reg1}" if defined($regs{$reg1});
90 $reg2="$regs{$reg2}" if defined($regs{$reg2}); 86 $reg2="$regs{$reg2}" if defined($regs{$reg2});
91 $ret.=$addr if ($addr ne "") && ($addr ne 0); 87 $ret.=$addr if ($addr ne "") && ($addr ne 0);
92 if ($reg2 ne "") 88 if ($reg2 ne "")
93 { $ret.="($reg1,$reg2,$idx)"; } 89 {
90 if($idx ne "")
91 { $ret.="($reg1,$reg2,$idx)"; }
92 else
93 { $ret.="($reg1,$reg2)"; }
94 }
94 else 95 else
95 { $ret.="($reg1)" } 96 { $ret.="($reg1)" }
96 return($ret); 97 return($ret);
@@ -101,6 +102,16 @@ sub main'BP
101 return(&main'DWP(@_)); 102 return(&main'DWP(@_));
102 } 103 }
103 104
105sub main'BC
106 {
107 return @_;
108 }
109
110sub main'DWC
111 {
112 return @_;
113 }
114
104#sub main'BP 115#sub main'BP
105# { 116# {
106# local($addr,$reg1,$reg2,$idx)=@_; 117# local($addr,$reg1,$reg2,$idx)=@_;
@@ -153,12 +164,29 @@ sub main'dec { &out1("decl",@_); }
153sub main'inc { &out1("incl",@_); } 164sub main'inc { &out1("incl",@_); }
154sub main'push { &out1("pushl",@_); $stack+=4; } 165sub main'push { &out1("pushl",@_); $stack+=4; }
155sub main'pop { &out1("popl",@_); $stack-=4; } 166sub main'pop { &out1("popl",@_); $stack-=4; }
156sub main'bswap { &out1("bswapl",@_); } 167sub main'pushf { &out0("pushf"); $stack+=4; }
168sub main'popf { &out0("popf"); $stack-=4; }
157sub main'not { &out1("notl",@_); } 169sub main'not { &out1("notl",@_); }
158sub main'call { &out1("call",$under.$_[0]); } 170sub main'call { &out1("call",$under.$_[0]); }
159sub main'ret { &out0("ret"); } 171sub main'ret { &out0("ret"); }
160sub main'nop { &out0("nop"); } 172sub main'nop { &out0("nop"); }
161 173
174# The bswapl instruction is new for the 486. Emulate if i386.
175sub main'bswap
176 {
177 if ($main'i386)
178 {
179 &main'comment("bswapl @_");
180 &main'exch(main'HB(@_),main'LB(@_));
181 &main'rotr(@_,16);
182 &main'exch(main'HB(@_),main'LB(@_));
183 }
184 else
185 {
186 &out1("bswapl",@_);
187 }
188 }
189
162sub out2 190sub out2
163 { 191 {
164 local($name,$p1,$p2)=@_; 192 local($name,$p1,$p2)=@_;
@@ -268,6 +296,8 @@ EOF
268 push(@out,$tmp); 296 push(@out,$tmp);
269 if ($main'cpp) 297 if ($main'cpp)
270 { $tmp=push(@out,"\tTYPE($func,\@function)\n"); } 298 { $tmp=push(@out,"\tTYPE($func,\@function)\n"); }
299 elsif ($main'gaswin)
300 { $tmp=push(@out,"\t.def\t$func;\t.scl\t2;\t.type\t32;\t.endef\n"); }
271 else { $tmp=push(@out,"\t.type\t$func,\@function\n"); } 301 else { $tmp=push(@out,"\t.type\t$func,\@function\n"); }
272 push(@out,"$func:\n"); 302 push(@out,"$func:\n");
273 $tmp=<<"EOF"; 303 $tmp=<<"EOF";
@@ -296,6 +326,8 @@ EOF
296 push(@out,$tmp); 326 push(@out,$tmp);
297 if ($main'cpp) 327 if ($main'cpp)
298 { push(@out,"\tTYPE($func,\@function)\n"); } 328 { push(@out,"\tTYPE($func,\@function)\n"); }
329 elsif ($main'gaswin)
330 { $tmp=push(@out,"\t.def\t$func;\t.scl\t2;\t.type\t32;\t.endef\n"); }
299 else { push(@out,"\t.type $func,\@function\n"); } 331 else { push(@out,"\t.type $func,\@function\n"); }
300 push(@out,"$func:\n"); 332 push(@out,"$func:\n");
301 $stack=4; 333 $stack=4;
@@ -316,8 +348,11 @@ sub main'function_end
316.${func}_end: 348.${func}_end:
317EOF 349EOF
318 push(@out,$tmp); 350 push(@out,$tmp);
351
319 if ($main'cpp) 352 if ($main'cpp)
320 { push(@out,"\tSIZE($func,.${func}_end-$func)\n"); } 353 { push(@out,"\tSIZE($func,.${func}_end-$func)\n"); }
354 elsif ($main'gaswin)
355 { $tmp=push(@out,"\t.align 4\n"); }
321 else { push(@out,"\t.size\t$func,.${func}_end-$func\n"); } 356 else { push(@out,"\t.size\t$func,.${func}_end-$func\n"); }
322 push(@out,".ident \"$func\"\n"); 357 push(@out,".ident \"$func\"\n");
323 $stack=0; 358 $stack=0;
@@ -344,10 +379,12 @@ sub main'function_end_B
344 379
345 $func=$under.$func; 380 $func=$under.$func;
346 381
347 push(@out,".${func}_end:\n"); 382 push(@out,".L_${func}_end:\n");
348 if ($main'cpp) 383 if ($main'cpp)
349 { push(@out,"\tSIZE($func,.${func}_end-$func)\n"); } 384 { push(@out,"\tSIZE($func,.L_${func}_end-$func)\n"); }
350 else { push(@out,"\t.size\t$func,.${func}_end-$func\n"); } 385 elsif ($main'gaswin)
386 { push(@out,"\t.align 4\n"); }
387 else { push(@out,"\t.size\t$func,.L_${func}_end-$func\n"); }
351 push(@out,".ident \"desasm.pl\"\n"); 388 push(@out,".ident \"desasm.pl\"\n");
352 $stack=0; 389 $stack=0;
353 %label=(); 390 %label=();
@@ -421,9 +458,87 @@ sub main'set_label
421 458
422sub main'file_end 459sub main'file_end
423 { 460 {
461 if ($const ne "")
462 {
463 push(@out,".section .rodata\n");
464 push(@out,$const);
465 $const="";
466 }
424 } 467 }
425 468
426sub main'data_word 469sub main'data_word
427 { 470 {
428 push(@out,"\t.long $_[0]\n"); 471 push(@out,"\t.long $_[0]\n");
429 } 472 }
473
474# debug output functions: puts, putx, printf
475
476sub main'puts
477 {
478 &pushvars();
479 &main'push('$Lstring' . ++$constl);
480 &main'call('puts');
481 $stack-=4;
482 &main'add("esp",4);
483 &popvars();
484
485 $const .= "Lstring$constl:\n\t.string \"@_[0]\"\n";
486 }
487
488sub main'putx
489 {
490 &pushvars();
491 &main'push($_[0]);
492 &main'push('$Lstring' . ++$constl);
493 &main'call('printf');
494 &main'add("esp",8);
495 $stack-=8;
496 &popvars();
497
498 $const .= "Lstring$constl:\n\t.string \"\%X\"\n";
499 }
500
501sub main'printf
502 {
503 $ostack = $stack;
504 &pushvars();
505 for ($i = @_ - 1; $i >= 0; $i--)
506 {
507 if ($i == 0) # change this to support %s format strings
508 {
509 &main'push('$Lstring' . ++$constl);
510 $const .= "Lstring$constl:\n\t.string \"@_[$i]\"\n";
511 }
512 else
513 {
514 if ($_[$i] =~ /([0-9]*)\(%esp\)/)
515 {
516 &main'push(($1 + $stack - $ostack) . '(%esp)');
517 }
518 else
519 {
520 &main'push($_[$i]);
521 }
522 }
523 }
524 &main'call('printf');
525 $stack-=4*@_;
526 &main'add("esp",4*@_);
527 &popvars();
528 }
529
530sub pushvars
531 {
532 &main'pushf();
533 &main'push("edx");
534 &main'push("ecx");
535 &main'push("eax");
536 }
537
538sub popvars
539 {
540 &main'pop("eax");
541 &main'pop("ecx");
542 &main'pop("edx");
543 &main'popf();
544 }