This commit was generated by cvs2svn to track changes on a CVS vendor
[openssl.git] / crypto / perlasm / x86ms.pl
1 #!/usr/local/bin/perl
2
3 package x86ms;
4
5 $label="L000";
6
7 %lb=(   'eax',  'al',
8         'ebx',  'bl',
9         'ecx',  'cl',
10         'edx',  'dl',
11         'ax',   'al',
12         'bx',   'bl',
13         'cx',   'cl',
14         'dx',   'dl',
15         );
16
17 %hb=(   'eax',  'ah',
18         'ebx',  'bh',
19         'ecx',  'ch',
20         'edx',  'dh',
21         'ax',   'ah',
22         'bx',   'bh',
23         'cx',   'ch',
24         'dx',   'dh',
25         );
26
27 sub main'LB
28         {
29         (defined($lb{$_[0]})) || die "$_[0] does not have a 'low byte'\n";
30         return($lb{$_[0]});
31         }
32
33 sub main'HB
34         {
35         (defined($hb{$_[0]})) || die "$_[0] does not have a 'high byte'\n";
36         return($hb{$_[0]});
37         }
38
39 sub main'DWP
40         {
41         local($addr,$reg1,$reg2,$idx)=@_;
42         local($t);
43         local($ret)="DWORD PTR ";
44
45         $addr =~ s/^\s+//;
46         if ($addr =~ /^(.+)\+(.+)$/)
47                 {
48                 $reg2=&conv($1);
49                 $addr="_$2";
50                 }
51         elsif ($addr =~ /^[_a-zA-Z]/)
52                 {
53                 $addr="_$addr";
54                 }
55
56         $reg1="$regs{$reg1}" if defined($regs{$reg1});
57         $reg2="$regs{$reg2}" if defined($regs{$reg2});
58         $ret.=$addr if ($addr ne "") && ($addr ne 0);
59         if ($reg2 ne "")
60                 {
61                 $t="";
62                 $t="*$idx" if ($idx != 0);
63                 $ret.="[$reg2$t+$reg1]";
64                 }
65         else
66                 {
67                 $ret.="[$reg1]"
68                 }
69         return($ret);
70         }
71
72 sub main'mov    { &out2("mov",@_); }
73 sub main'movb   { &out2("mov",@_); }
74 sub main'and    { &out2("and",@_); }
75 sub main'or     { &out2("or",@_); }
76 sub main'shl    { &out2("shl",@_); }
77 sub main'shr    { &out2("shr",@_); }
78 sub main'xor    { &out2("xor",@_); }
79 sub main'add    { &out2("add",@_); }
80 sub main'sub    { &out2("sub",@_); }
81 sub main'rotl   { &out2("rol",@_); }
82 sub main'rotr   { &out2("ror",@_); }
83 sub main'exch   { &out2("xchg",@_); }
84 sub main'cmp    { &out2("cmp",@_); }
85 sub main'dec    { &out1("dec",@_); }
86 sub main'jmp    { &out1("jmp",@_); }
87 sub main'je     { &out1("je",@_); }
88 sub main'jz     { &out1("jz",@_); }
89 sub main'jnz    { &out1("jnz",@_); }
90 sub main'push   { &out1("push",@_); }
91 sub main'call   { &out1("call",'_'.$_[0]); }
92
93
94 sub out2
95         {
96         local($name,$p1,$p2)=@_;
97         local($l,$t);
98
99         print "\t$name\t";
100         $t=&conv($p1).",";
101         $l=length($t);
102         print $t;
103         $l=4-($l+9)/8;
104         print "\t" x $l;
105         print &conv($p2);
106         print "\n";
107         }
108
109 sub out1
110         {
111         local($name,$p1)=@_;
112         local($l,$t);
113
114         print "\t$name\t";
115         print &conv($p1);
116         print "\n";
117         }
118
119 sub conv
120         {
121         local($p)=@_;
122
123         $p =~ s/0x([0-9A-Fa-f]+)/0$1h/;
124         return $p;
125         }
126
127 sub main'file
128         {
129         local($file)=@_;
130
131         print <<"EOF";
132         TITLE   $file.asm
133         .386
134 .model FLAT
135 EOF
136         }
137
138 sub main'function_begin
139         {
140         local($func,$num,$extra)=@_;
141
142         $params=$num*4;
143
144         print <<"EOF";
145 _TEXT   SEGMENT
146 PUBLIC  _$func
147 $extra
148 _$func PROC NEAR
149         push    ebp
150         push    ebx
151         push    esi
152         push    edi
153 EOF
154         $stack=20;
155         }
156
157 sub main'function_end
158         {
159         local($func)=@_;
160
161         print <<"EOF";
162         pop     edi
163         pop     esi
164         pop     ebx
165         pop     ebp
166         ret
167 _$func ENDP
168 _TEXT   ENDS
169 EOF
170         $stack=0;
171         %label=();
172         }
173
174 sub main'function_end_A
175         {
176         local($func)=@_;
177
178         print <<"EOF";
179         pop     edi
180         pop     esi
181         pop     ebx
182         pop     ebp
183         ret
184 EOF
185         }
186
187 sub main'function_end_B
188         {
189         local($func)=@_;
190
191         print <<"EOF";
192 _$func ENDP
193 _TEXT   ENDS
194 EOF
195         $stack=0;
196         %label=();
197         }
198
199 sub main'file_end
200         {
201         print "END\n"
202         }
203
204 sub main'wparam
205         {
206         local($num)=@_;
207
208         return(&main'DWP($stack+$num*4,"esp","",0));
209         }
210
211 sub main'wtmp
212         {
213         local($num)=@_;
214
215         return(&main'DWP($stack+$params+$num*4,"esp","",0));
216         }
217
218 sub main'comment
219         {
220         foreach (@_)
221                 {
222                 print "\t; $_\n";
223                 }
224         }
225
226 sub main'label
227         {
228         if (!defined($label{$_[0]}))
229                 {
230                 $label{$_[0]}="\$${label}${_[0]}";
231                 $label++;
232                 }
233         return($label{$_[0]});
234         }
235
236 sub main'set_label
237         {
238         if (!defined($label{$_[0]}))
239                 {
240                 $label{$_[0]}="${label}${_[0]}";
241                 $label++;
242                 }
243         print "$label{$_[0]}:\n";
244         }
245
246 sub main'file_end
247         {
248         print "END\n";
249         }