Import of old SSLeay release: SSLeay 0.9.0b
[openssl.git] / crypto / cast / asm / cast-586.pl
1 #!/usr/local/bin/perl
2
3 # define for pentium pro friendly version
4 $ppro=1;
5
6 push(@INC,"perlasm","../../perlasm");
7 require "x86asm.pl";
8 require "cbc.pl";
9
10 &asm_init($ARGV[0],"cast-586.pl");
11
12 $CAST_ROUNDS=16;
13 $L="edi";
14 $R="esi";
15 $K="ebp";
16 $tmp1="ecx";
17 $tmp2="ebx";
18 $tmp3="eax";
19 $tmp4="edx";
20 $S1="CAST_S_table0";
21 $S2="CAST_S_table1";
22 $S3="CAST_S_table2";
23 $S4="CAST_S_table3";
24
25 @F1=("add","xor","sub");
26 @F2=("xor","sub","add");
27 @F3=("sub","add","xor");
28
29 &CAST_encrypt("CAST_encrypt",1);
30 &CAST_encrypt("CAST_decrypt",0);
31 &cbc("CAST_cbc_encrypt","CAST_encrypt","CAST_decrypt",1,4,5,3,-1,-1);
32
33 &asm_finish();
34
35 sub CAST_encrypt
36         {
37         local($name,$enc)=@_;
38
39         local($win_ex)=<<"EOF";
40 EXTERN  _CAST_S_table0:DWORD
41 EXTERN  _CAST_S_table1:DWORD
42 EXTERN  _CAST_S_table2:DWORD
43 EXTERN  _CAST_S_table3:DWORD
44 EOF
45         &main'external_label(
46                 "CAST_S_table0",
47                 "CAST_S_table1",
48                 "CAST_S_table2",
49                 "CAST_S_table3",
50                 );
51
52         &function_begin_B($name,$win_ex);
53
54         &comment("");
55
56         &push("ebp");
57         &push("ebx");
58         &mov($tmp2,&wparam(0));
59         &mov($K,&wparam(1));
60         &push("esi");
61         &push("edi");
62
63         &comment("Load the 2 words");
64         &mov($L,&DWP(0,$tmp2,"",0));
65         &mov($R,&DWP(4,$tmp2,"",0));
66
67         &xor(   $tmp3,  $tmp3);
68
69         # encrypting part
70
71         if ($enc)
72                 {
73                 &E_CAST( 0,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
74                 &E_CAST( 1,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
75                 &E_CAST( 2,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
76                 &E_CAST( 3,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
77                 &E_CAST( 4,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
78                 &E_CAST( 5,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
79                 &E_CAST( 6,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
80                 &E_CAST( 7,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
81                 &E_CAST( 8,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
82                 &E_CAST( 9,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
83                 &E_CAST(10,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
84                 &E_CAST(11,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
85                 &E_CAST(12,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
86                 &E_CAST(13,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
87                 &E_CAST(14,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
88                 &E_CAST(15,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4,1);
89                 }
90         else
91                 {
92                 &E_CAST(15,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
93                 &E_CAST(14,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
94                 &E_CAST(13,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
95                 &E_CAST(12,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
96                 &E_CAST(11,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
97                 &E_CAST(10,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
98                 &E_CAST( 9,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
99                 &E_CAST( 8,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
100                 &E_CAST( 7,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
101                 &E_CAST( 6,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
102                 &E_CAST( 5,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
103                 &E_CAST( 4,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
104                 &E_CAST( 3,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
105                 &E_CAST( 2,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
106                 &E_CAST( 1,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
107                 &E_CAST( 0,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4,1);
108                 }
109
110         &nop();
111         &mov(&DWP(4,$tmp3,"",0),$L);
112         &mov(&DWP(0,$tmp3,"",0),$R);
113         &function_end($name);
114         }
115
116 sub E_CAST
117         {
118         local($i,$S,$L,$R,$K,$OP1,$OP2,$OP3,$tmp1,$tmp2,$tmp3,$tmp4,$lst)=@_;
119         # Ri needs to have 16 pre added.
120
121         &comment("round $i");
122         &mov(   $tmp4,          &DWP($i*8,$K,"",1));
123
124         &mov(   $tmp1,          &DWP($i*8+4,$K,"",1));# must be word
125         &$OP1(  $tmp4,          $R);
126
127         &rotl(  $tmp4,          &LB($tmp1));
128
129         if ($ppro)
130                 {
131                 &mov(   $tmp2,          $tmp4);         # B
132                 &xor(   $tmp1,          $tmp1);
133
134                 &movb(  &LB($tmp1),     &HB($tmp4));    # A
135                 &and(   $tmp2,          0xff);
136
137                 &shr(   $tmp4,          16);            #
138                 &xor(   $tmp3,          $tmp3);
139                 }
140         else
141                 {
142                 &mov(   $tmp2,          $tmp4);         # B
143                 &movb(  &LB($tmp1),     &HB($tmp4));    # A     # BAD BAD BAD
144
145                 &shr(   $tmp4,          16);            #
146                 &and(   $tmp2,          0xff);
147                 }
148
149         &movb(  &LB($tmp3),     &HB($tmp4));    # C     # BAD BAD BAD
150         &and(   $tmp4,          0xff);          # D
151
152         &mov(   $tmp1,          &DWP($S1,"",$tmp1,4));
153         &mov(   $tmp2,          &DWP($S2,"",$tmp2,4));
154
155         &$OP2(  $tmp1,          $tmp2);
156         &mov(   $tmp2,          &DWP($S3,"",$tmp3,4));
157
158         &$OP3(  $tmp1,          $tmp2);
159         &mov(   $tmp2,          &DWP($S4,"",$tmp4,4));
160
161         &$OP1(  $tmp1,          $tmp2);
162          &mov($tmp3,&wparam(0)) if $lst;
163          # XXX
164
165         &xor(   $L,             $tmp1);
166          # XXX
167         }