]> git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/perlasm/x86unix.pl
Import of old SSLeay release: SSLeay 0.8.1b
[thirdparty/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 }