Merge from vendor branch AWK:
[dragonfly.git] / crypto / heimdal-0.6.3 / lib / des / asm / 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'mov    { &out2("movl",@_); }
85 sub main'movb   { &out2("movb",@_); }
86 sub main'and    { &out2("andl",@_); }
87 sub main'or     { &out2("orl",@_); }
88 sub main'shl    { &out2("shll",@_); }
89 sub main'shr    { &out2("shrl",@_); }
90 sub main'xor    { &out2("xorl",@_); }
91 sub main'add    { &out2("addl",@_); }
92 sub main'sub    { &out2("subl",@_); }
93 sub main'rotl   { &out2("roll",@_); }
94 sub main'rotr   { &out2("rorl",@_); }
95 sub main'exch   { &out2("xchg",@_); }
96 sub main'cmp    { &out2("cmpl",@_); }
97 sub main'jmp    { &out1("jmp",@_); }
98 sub main'je     { &out1("je",@_); }
99 sub main'jne    { &out1("jne",@_); }
100 sub main'jnz    { &out1("jnz",@_); }
101 sub main'dec    { &out1("decl",@_); }
102 sub main'push   { &out1("pushl",@_); }
103 sub main'call   { &out1("call",$under.$_[0]); }
104
105
106 sub out2
107         {
108         local($name,$p1,$p2)=@_;
109         local($l,$ll,$t);
110
111         print "\t$name\t";
112         $t=&conv($p2).",";
113         $l=length($t);
114         print $t;
115         $ll=4-($l+9)/8;
116         print "\t" x $ll;
117         print &conv($p1);
118         print "\n";
119         }
120
121 sub out1
122         {
123         local($name,$p1)=@_;
124         local($l,$t);
125
126         print "\t$name\t";
127         print &conv($p1);
128         print "\n";
129         }
130
131 sub conv
132         {
133         local($p)=@_;
134
135 #       $p =~ s/0x([0-9A-Fa-f]+)/0$1h/;
136
137         $p=$regs{$p} if (defined($regs{$p}));
138
139         $p =~ s/^([0-9A-Fa-f]+)$/\$$1/;
140         $p =~ s/^(0x[0-9A-Fa-f]+)$/\$$1/;
141         return $p;
142         }
143
144 sub main'file
145         {
146         local($file)=@_;
147
148         print <<"EOF";
149         .file   "$file.s"
150         .version        "01.01"
151 gcc2_compiled.:
152 EOF
153         }
154
155 sub main'function_begin
156         {
157         local($func,$num)=@_;
158
159         $params=$num*4;
160
161         $func=$under.$func;
162
163         print <<"EOF";
164 .text
165         .align $align
166 .globl $func
167 EOF
168         if ($main'cpp)
169                 { printf("\tTYPE($func,\@function)\n"); }
170         else    { printf("\t.type       $func,\@function\n"); }
171         print <<"EOF";
172 $func:
173         pushl   %ebp
174         pushl   %ebx
175         pushl   %esi
176         pushl   %edi
177
178 EOF
179         $stack=20;
180         }
181
182 sub main'function_end
183         {
184         local($func)=@_;
185
186         $func=$under.$func;
187
188         print <<"EOF";
189         popl    %edi
190         popl    %esi
191         popl    %ebx
192         popl    %ebp
193         ret
194 .${func}_end:
195 EOF
196         if ($main'cpp)
197                 { printf("\tSIZE($func,.${func}_end-$func)\n"); }
198         else    { printf("\t.size\t$func,.${func}_end-$func\n"); }
199         print ".ident   \"desasm.pl\"\n";
200         $stack=0;
201         %label=();
202         }
203
204
205 sub main'wparam
206         {
207         local($num)=@_;
208
209         return(&main'DWP($stack+$num*4,"esp","",0));
210         }
211
212 sub main'wtmp
213         {
214         local($num)=@_;
215
216         return(&main'DWP(-($num+1)*4,"esp","",0));
217         }
218
219 sub main'comment
220         {
221         foreach (@_)
222                 {
223                 if (/^\s*$/)
224                         { print "\n"; }
225                 else
226                         { print "\t$com_start $_ $com_end\n"; }
227                 }
228         }
229
230 sub main'label
231         {
232         if (!defined($label{$_[0]}))
233                 {
234                 $label{$_[0]}=".${label}${_[0]}";
235                 $label++;
236                 }
237         return($label{$_[0]});
238         }
239
240 sub main'set_label
241         {
242         if (!defined($label{$_[0]}))
243                 {
244                 $label{$_[0]}=".${label}${_[0]}";
245                 $label++;
246                 }
247         print ".align $align\n";
248         print "$label{$_[0]}:\n";
249         }
250
251 sub main'file_end
252         {
253         }