Import of old SSLeay release: SSLeay 0.8.1b
[openssl.git] / crypto / perlasm / x86unix.pl
1 #!/usr/local/bin/perl
2
3 package x86ms;
4
5 $label="L000";
6
7 $align=($main'aout)?"4":"16";
8 $under=($main'aout)?"_":"";
9 $com_start=($main'sol)?"/":"#";
10
11 if ($main'cpp)
12         {
13         $align="ALIGN";
14         $under="";
15         $com_start='/*';
16         $com_end='*/';
17         }
18
19 %lb=(   'eax',  '%al',
20         'ebx',  '%bl',
21         'ecx',  '%cl',
22         'edx',  '%dl',
23         'ax',   '%al',
24         'bx',   '%bl',
25         'cx',   '%cl',
26         'dx',   '%dl',
27         );
28
29 %hb=(   'eax',  '%ah',
30         'ebx',  '%bh',
31         'ecx',  '%ch',
32         'edx',  '%dh',
33         'ax',   '%ah',
34         'bx',   '%bh',
35         'cx',   '%ch',
36         'dx',   '%dh',
37         );
38
39 %regs=( 'eax',  '%eax',
40         'ebx',  '%ebx',
41         'ecx',  '%ecx',
42         'edx',  '%edx',
43         'esi',  '%esi',
44         'edi',  '%edi',
45         'ebp',  '%ebp',
46         'esp',  '%esp',
47         );
48
49 sub main'LB
50         {
51         (defined($lb{$_[0]})) || die "$_[0] does not have a 'low byte'\n";
52         return($lb{$_[0]});
53         }
54
55 sub main'HB
56         {
57         (defined($hb{$_[0]})) || die "$_[0] does not have a 'high byte'\n";
58         return($hb{$_[0]});
59         }
60
61 sub main'DWP
62         {
63         local($addr,$reg1,$reg2,$idx)=@_;
64
65
66         $ret="";
67
68         $addr =~ s/(^|[+ \t])([A-Za-z_]+)($|[+ \t])/$1$under$2$3/;
69
70         $reg1="$regs{$reg1}" if defined($regs{$reg1});
71         $reg2="$regs{$reg2}" if defined($regs{$reg2});
72         $ret.=$addr if ($addr ne "") && ($addr ne 0);
73         if ($reg2 ne "")
74                 {
75                 $ret.="($reg1,$reg2,$idx)";
76                 }
77         else
78                 {
79                 $ret.="($reg1)"
80                 }
81         return($ret);
82         }
83
84 sub main'BP
85         {
86         local($addr,$reg1,$reg2,$idx)=@_;
87
88
89         $ret="";
90
91         $addr =~ s/(^|[+ \t])([A-Za-z_]+)($|[+ \t])/$1$under$2$3/;
92
93         $reg1="$regs{$reg1}" if defined($regs{$reg1});
94         $reg2="$regs{$reg2}" if defined($regs{$reg2});
95         $ret.=$addr if ($addr ne "") && ($addr ne 0);
96         if ($reg2 ne "")
97                 {
98                 $ret.="($reg1,$reg2,$idx)";
99                 }
100         else
101                 {
102                 $ret.="($reg1)"
103                 }
104         return($ret);
105         }
106
107 sub main'mov    { &out2("movl",@_); }
108 sub main'movb   { &out2("movb",@_); }
109 sub main'and    { &out2("andl",@_); }
110 sub main'or     { &out2("orl",@_); }
111 sub main'shl    { &out2("sall",@_); }
112 sub main'shr    { &out2("shrl",@_); }
113 sub main'xor    { &out2("xorl",@_); }
114 sub main'add    { &out2("addl",@_); }
115 sub main'sub    { &out2("subl",@_); }
116 sub main'rotl   { &out2("roll",@_); }
117 sub main'rotr   { &out2("rorl",@_); }
118 sub main'exch   { &out2("xchg",@_); }
119 sub main'cmp    { &out2("cmpl",@_); }
120 sub main'jmp    { &out1("jmp",@_); }
121 sub main'je     { &out1("je",@_); }
122 sub main'jne    { &out1("jne",@_); }
123 sub main'jnz    { &out1("jnz",@_); }
124 sub main'jz     { &out1("jz",@_); }
125 sub main'dec    { &out1("decl",@_); }
126 sub main'push   { &out1("pushl",@_); }
127 sub main'call   { &out1("call",$under.$_[0]); }
128
129
130 sub out2
131         {
132         local($name,$p1,$p2)=@_;
133         local($l,$ll,$t);
134
135         print "\t$name\t";
136         $t=&conv($p2).",";
137         $l=length($t);
138         print $t;
139         $ll=4-($l+9)/8;
140         print "\t" x $ll;
141         print &conv($p1);
142         print "\n";
143         }
144
145 sub out1
146         {
147         local($name,$p1)=@_;
148         local($l,$t);
149
150         print "\t$name\t";
151         print &conv($p1);
152         print "\n";
153         }
154
155 sub conv
156         {
157         local($p)=@_;
158
159 #       $p =~ s/0x([0-9A-Fa-f]+)/0$1h/;
160
161         $p=$regs{$p} if (defined($regs{$p}));
162
163         $p =~ s/^([0-9A-Fa-f]+)$/\$$1/;
164         $p =~ s/^(0x[0-9A-Fa-f]+)$/\$$1/;
165         return $p;
166         }
167
168 sub main'file
169         {
170         local($file)=@_;
171
172         print <<"EOF";
173         .file   "$file.s"
174         .version        "01.01"
175 gcc2_compiled.:
176 EOF
177         }
178
179 sub main'function_begin
180         {
181         local($func,$num)=@_;
182
183         $params=$num*4;
184
185         $func=$under.$func;
186
187         print <<"EOF";
188 .text
189         .align $align
190 .globl $func
191 EOF
192         if ($main'cpp)
193                 { printf("\tTYPE($func,\@function)\n"); }
194         else    { printf("\t.type       $func,\@function\n"); }
195         print <<"EOF";
196 $func:
197         pushl   %ebp
198         pushl   %ebx
199         pushl   %esi
200         pushl   %edi
201
202 EOF
203         $stack=20;
204         }
205
206 sub main'function_end
207         {
208         local($func)=@_;
209
210         $func=$under.$func;
211
212         print <<"EOF";
213         popl    %edi
214         popl    %esi
215         popl    %ebx
216         popl    %ebp
217         ret
218 .${func}_end:
219 EOF
220         if ($main'cpp)
221                 { printf("\tSIZE($func,.${func}_end-$func)\n"); }
222         else    { printf("\t.size\t$func,.${func}_end-$func\n"); }
223         print ".ident   \"desasm.pl\"\n";
224         $stack=0;
225         %label=();
226         }
227
228 sub main'function_end_A
229         {
230         local($func)=@_;
231
232         print <<"EOF";
233         popl    %edi
234         popl    %esi
235         popl    %ebx
236         popl    %ebp
237         ret
238 EOF
239         }
240
241 sub main'function_end_B
242         {
243         local($func)=@_;
244
245         $func=$under.$func;
246
247         print <<"EOF";
248 .${func}_end:
249 EOF
250         if ($main'cpp)
251                 { printf("\tSIZE($func,.${func}_end-$func)\n"); }
252         else    { printf("\t.size\t$func,.${func}_end-$func\n"); }
253         print ".ident   \"desasm.pl\"\n";
254         $stack=0;
255         %label=();
256         }
257
258 sub main'wparam
259         {
260         local($num)=@_;
261
262         return(&main'DWP($stack+$num*4,"esp","",0));
263         }
264
265 sub main'wtmp_b
266         {
267         local($num,$b)=@_;
268
269         return(&main'BP(-(($num+1)*4)+$b,"esp","",0));
270         }
271
272 sub main'wtmp
273         {
274         local($num)=@_;
275
276         return(&main'DWP(-($num+1)*4,"esp","",0));
277         }
278
279 sub main'comment
280         {
281         foreach (@_)
282                 {
283                 if (/^\s*$/)
284                         { print "\n"; }
285                 else
286                         { print "\t$com_start $_ $com_end\n"; }
287                 }
288         }
289
290 sub main'label
291         {
292         if (!defined($label{$_[0]}))
293                 {
294                 $label{$_[0]}=".${label}${_[0]}";
295                 $label++;
296                 }
297         return($label{$_[0]});
298         }
299
300 sub main'set_label
301         {
302         if (!defined($label{$_[0]}))
303                 {
304                 $label{$_[0]}=".${label}${_[0]}";
305                 $label++;
306                 }
307         print ".align $align\n";
308         print "$label{$_[0]}:\n";
309         }
310
311 sub main'file_end
312         {
313         }