4 use Carp qw(croak cluck);
15 sub main'asm_init_output { @out=(); }
16 sub main'asm_get_output { return(@out); }
17 sub main'get_labels { return(@labels); }
18 sub main'external_label { push(@labels,@_); }
37 'r15', '$21', # argc == 5
38 'r16', '$20', # argc == 4
39 'r17', '$19', # argc == 3
40 'r18', '$18', # argc == 2
41 'r19', '$17', # argc == 1
42 'r20', '$16', # argc == 0
44 'r22', '$10', # save 1
45 'r23', '$11', # save 2
46 'r24', '$12', # save 3
47 'r25', '$13', # save 4
48 'r26', '$14', # save 5
74 @reg=( '$0', '$1' ,'$2' ,'$3' ,'$4' ,'$5' ,'$6' ,'$7' ,'$8',
75 '$22','$23','$24','$25','$20','$21','$27','$28');
78 sub main'sub { &out3("subq",@_); }
79 sub main'add { &out3("addq",@_); }
80 sub main'mov { &out3("bis",$_[0],$_[0],$_[1]); }
81 sub main'or { &out3("bis",@_); }
82 sub main'bis { &out3("bis",@_); }
83 sub main'br { &out1("br",@_); }
84 sub main'ld { &out2("ldq",@_); }
85 sub main'st { &out2("stq",@_); }
86 sub main'cmpult { &out3("cmpult",@_); }
87 sub main'cmplt { &out3("cmplt",@_); }
88 sub main'bgt { &out2("bgt",@_); }
89 sub main'ble { &out2("ble",@_); }
90 sub main'blt { &out2("blt",@_); }
91 sub main'mul { &out3("mulq",@_); }
92 sub main'muh { &out3("umulh",@_); }
104 print &main'asm_get_output();
112 &main'asm_init_output();
113 &main'comment("Don't even think of reading this code");
114 &main'comment("It was automatically generated by $filename");
115 &main'comment("Which is a perl program used to generate the alpha assember.");
116 &main'comment("eric <eay\@cryptsoft.com>");
119 $filename =~ s/\.pl$//;
120 &main'file($filename);
128 return($regs{$r}) if defined($regs{$r});
136 return(&main'QWP($off*8,$reg));
143 $ret="$off(".&conv($reg).")";
149 local($name,$p1,$p2,$p3)=@_;
154 push(@out,"\t$name\t");
158 $tmp1=sprintf("\t" x $ll);
164 $tmp1=sprintf("\t" x $ll);
167 push(@out,&conv($p3)."\n");
172 local($name,$p1,$p2,$p3)=@_;
176 push(@out,"\t$name\t");
180 $tmp1=sprintf("\t" x $ll);
183 push(@out,&conv($p2)."\n");
191 push(@out,"\t$name\t".$p1."\n");
196 push(@out,"\t$_[0]\n");
205 # Generated from perl scripts contains in SSLeay
212 sub main'function_begin
216 print STDERR "$func\n";
231 sub main'function_end
244 sub main'function_end_A
254 sub main'function_end_B
260 push(@out,"\t.end $func\n");
275 { return(&main'QWP($stack+$num*8,"sp")); }
282 &main'sub("sp",$num*8,"sp");
289 &main'add("sp",$num*8,"sp");
294 return(&main'QWP(($_[0])*8,"sp"));
297 # Should use swtmp, which is above sp. Linix can trash the stack above esp
302 # return(&main'QWP(-($num+1)*4,"esp","",0));
312 { push(@out,"\t$com_start $_ $com_end\n"); }
318 if (!defined($label{$_[0]}))
320 $label{$_[0]}=$label;
323 return('$'.$label{$_[0]});
328 if (!defined($label{$_[0]}))
330 $label{$_[0]}=$label;
333 # push(@out,".align $align\n") if ($_[1] != 0);
334 push(@out,'$'."$label{$_[0]}:\n");
343 push(@out,"\t.long $_[0]\n");
357 for ($i=(14+(6-$args)); $i >= 0; $i--)
359 push(@pool_free,"r$i");
361 print STDERR "START :register pool:@pool_free\n";
367 printf STDERR "END %2d:register pool:@pool_free\n",$max;
382 $max=$curr_num if ($curr_num > $max);
386 print STDERR "GR:@pool_free\n" if $reg_alloc;
396 ($#pool_free >= ($num-1)) || croak "out of registers: want $num, have @pool_free";
399 push(@ret,pop @pool_free);
401 $max=$curr_num if ($curr_num > $max);
404 print STDERR "nr @ret\n" if $n_debug;
405 print STDERR "NR:@pool_free\n" if $reg_alloc;
415 print STDERR "fr @r\n" if $n_debug;
421 croak "double register free of $v (@pool_free)" if $w eq $v;
426 croak "bad argument to FR" if ($v !~ /^r\d+$/);
428 { unshift(@pool_free,$v); }
429 else { push(@pool_free,$v); }
432 print STDERR "FR:@pool_free\n" if $reg_alloc;