Add heimdal-0.6.3
[dragonfly.git] / crypto / heimdal-0.6.3 / lib / des / asm / 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'push   { &out1("push",@_); }
90 sub main'call   { &out1("call",'_'.$_[0]); }
91
92
93 sub out2
94         {
95         local($name,$p1,$p2)=@_;
96         local($l,$t);
97
98         print "\t$name\t";
99         $t=&conv($p1).",";
100         $l=length($t);
101         print $t;
102         $l=4-($l+9)/8;
103         print "\t" x $l;
104         print &conv($p2);
105         print "\n";
106         }
107
108 sub out1
109         {
110         local($name,$p1)=@_;
111         local($l,$t);
112
113         print "\t$name\t";
114         print &conv($p1);
115         print "\n";
116         }
117
118 sub conv
119         {
120         local($p)=@_;
121
122         $p =~ s/0x([0-9A-Fa-f]+)/0$1h/;
123         return $p;
124         }
125
126 sub main'file
127         {
128         local($file)=@_;
129
130         print <<"EOF";
131         TITLE   $file.asm
132         .386
133 .model FLAT
134 EOF
135         }
136
137 sub main'function_begin
138         {
139         local($func,$num)=@_;
140
141         $params=$num*4;
142
143         print <<"EOF";
144 _TEXT   SEGMENT
145 PUBLIC  _$func
146 EXTRN   _des_SPtrans:DWORD
147 _$func PROC NEAR
148         push    ebp
149         push    ebx
150         push    esi
151         push    edi
152 EOF
153         $stack=20;
154         }
155
156 sub main'function_end
157         {
158         local($func)=@_;
159
160         print <<"EOF";
161         pop     edi
162         pop     esi
163         pop     ebx
164         pop     ebp
165         ret
166 _$func ENDP
167 _TEXT   ENDS
168 EOF
169         $stack=0;
170         %label=();
171         }
172
173 sub main'file_end
174         {
175         print "END\n"
176         }
177
178 sub main'wparam
179         {
180         local($num)=@_;
181
182         return(&main'DWP($stack+$num*4,"esp","",0));
183         }
184
185 sub main'wtmp
186         {
187         local($num)=@_;
188
189         return(&main'DWP($stack+$params+$num*4,"esp","",0));
190         }
191
192 sub main'comment
193         {
194         foreach (@_)
195                 {
196                 print "\t; $_\n";
197                 }
198         }
199
200 sub main'label
201         {
202         if (!defined($label{$_[0]}))
203                 {
204                 $label{$_[0]}="\$${label}${_[0]}";
205                 $label++;
206                 }
207         return($label{$_[0]});
208         }
209
210 sub main'set_label
211         {
212         if (!defined($label{$_[0]}))
213                 {
214                 $label{$_[0]}="${label}${_[0]}";
215                 $label++;
216                 }
217         print "$label{$_[0]}:\n";
218         }
219
220 sub main'file_end
221         {
222         print "END\n";
223         }