~ubuntu-branches/ubuntu/hardy/openssl/hardy-security

« back to all changes in this revision

Viewing changes to crypto/bn/asm/x86/comba.pl

  • Committer: Bazaar Package Importer
  • Author(s): Christoph Martin
  • Date: 2004-05-24 17:02:29 UTC
  • Revision ID: james.westby@ubuntu.com-20040524170229-ixlo08bbbly0xied
Tags: upstream-0.9.7d
ImportĀ upstreamĀ versionĀ 0.9.7d

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/local/bin/perl
 
2
# x86 assember
 
3
 
 
4
sub mul_add_c
 
5
        {
 
6
        local($a,$ai,$b,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_;
 
7
 
 
8
        # pos == -1 if eax and edx are pre-loaded, 0 to load from next
 
9
        # words, and 1 if load return value
 
10
 
 
11
        &comment("mul a[$ai]*b[$bi]");
 
12
 
 
13
        # "eax" and "edx" will always be pre-loaded.
 
14
        # &mov("eax",&DWP($ai*4,$a,"",0)) ;
 
15
        # &mov("edx",&DWP($bi*4,$b,"",0));
 
16
 
 
17
        &mul("edx");
 
18
        &add($c0,"eax");
 
19
         &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0;        # laod next a
 
20
         &mov("eax",&wparam(0)) if $pos > 0;                    # load r[]
 
21
         ###
 
22
        &adc($c1,"edx");
 
23
         &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 0;        # laod next b
 
24
         &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 1;        # laod next b
 
25
         ###
 
26
        &adc($c2,0);
 
27
         # is pos > 1, it means it is the last loop 
 
28
         &mov(&DWP($i*4,"eax","",0),$c0) if $pos > 0;           # save r[];
 
29
        &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1;         # laod next a
 
30
        }
 
31
 
 
32
sub sqr_add_c
 
33
        {
 
34
        local($r,$a,$ai,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_;
 
35
 
 
36
        # pos == -1 if eax and edx are pre-loaded, 0 to load from next
 
37
        # words, and 1 if load return value
 
38
 
 
39
        &comment("sqr a[$ai]*a[$bi]");
 
40
 
 
41
        # "eax" and "edx" will always be pre-loaded.
 
42
        # &mov("eax",&DWP($ai*4,$a,"",0)) ;
 
43
        # &mov("edx",&DWP($bi*4,$b,"",0));
 
44
 
 
45
        if ($ai == $bi)
 
46
                { &mul("eax");}
 
47
        else
 
48
                { &mul("edx");}
 
49
        &add($c0,"eax");
 
50
         &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0;        # load next a
 
51
         ###
 
52
        &adc($c1,"edx");
 
53
         &mov("edx",&DWP(($nb)*4,$a,"",0)) if ($pos == 1) && ($na != $nb);
 
54
         ###
 
55
        &adc($c2,0);
 
56
         # is pos > 1, it means it is the last loop 
 
57
         &mov(&DWP($i*4,$r,"",0),$c0) if $pos > 0;              # save r[];
 
58
        &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1;         # load next b
 
59
        }
 
60
 
 
61
sub sqr_add_c2
 
62
        {
 
63
        local($r,$a,$ai,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_;
 
64
 
 
65
        # pos == -1 if eax and edx are pre-loaded, 0 to load from next
 
66
        # words, and 1 if load return value
 
67
 
 
68
        &comment("sqr a[$ai]*a[$bi]");
 
69
 
 
70
        # "eax" and "edx" will always be pre-loaded.
 
71
        # &mov("eax",&DWP($ai*4,$a,"",0)) ;
 
72
        # &mov("edx",&DWP($bi*4,$a,"",0));
 
73
 
 
74
        if ($ai == $bi)
 
75
                { &mul("eax");}
 
76
        else
 
77
                { &mul("edx");}
 
78
        &add("eax","eax");
 
79
         ###
 
80
        &adc("edx","edx");
 
81
         ###
 
82
        &adc($c2,0);
 
83
         &add($c0,"eax");
 
84
        &adc($c1,"edx");
 
85
         &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0;        # load next a
 
86
         &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1;        # load next b
 
87
        &adc($c2,0);
 
88
        &mov(&DWP($i*4,$r,"",0),$c0) if $pos > 0;               # save r[];
 
89
         &mov("edx",&DWP(($nb)*4,$a,"",0)) if ($pos <= 1) && ($na != $nb);
 
90
         ###
 
91
        }
 
92
 
 
93
sub bn_mul_comba
 
94
        {
 
95
        local($name,$num)=@_;
 
96
        local($a,$b,$c0,$c1,$c2);
 
97
        local($i,$as,$ae,$bs,$be,$ai,$bi);
 
98
        local($tot,$end);
 
99
 
 
100
        &function_begin_B($name,"");
 
101
 
 
102
        $c0="ebx";
 
103
        $c1="ecx";
 
104
        $c2="ebp";
 
105
        $a="esi";
 
106
        $b="edi";
 
107
        
 
108
        $as=0;
 
109
        $ae=0;
 
110
        $bs=0;
 
111
        $be=0;
 
112
        $tot=$num+$num-1;
 
113
 
 
114
        &push("esi");
 
115
         &mov($a,&wparam(1));
 
116
        &push("edi");
 
117
         &mov($b,&wparam(2));
 
118
        &push("ebp");
 
119
         &push("ebx");
 
120
 
 
121
        &xor($c0,$c0);
 
122
         &mov("eax",&DWP(0,$a,"",0));   # load the first word 
 
123
        &xor($c1,$c1);
 
124
         &mov("edx",&DWP(0,$b,"",0));   # load the first second 
 
125
 
 
126
        for ($i=0; $i<$tot; $i++)
 
127
                {
 
128
                $ai=$as;
 
129
                $bi=$bs;
 
130
                $end=$be+1;
 
131
 
 
132
                &comment("################## Calculate word $i"); 
 
133
 
 
134
                for ($j=$bs; $j<$end; $j++)
 
135
                        {
 
136
                        &xor($c2,$c2) if ($j == $bs);
 
137
                        if (($j+1) == $end)
 
138
                                {
 
139
                                $v=1;
 
140
                                $v=2 if (($i+1) == $tot);
 
141
                                }
 
142
                        else
 
143
                                { $v=0; }
 
144
                        if (($j+1) != $end)
 
145
                                {
 
146
                                $na=($ai-1);
 
147
                                $nb=($bi+1);
 
148
                                }
 
149
                        else
 
150
                                {
 
151
                                $na=$as+($i < ($num-1));
 
152
                                $nb=$bs+($i >= ($num-1));
 
153
                                }
 
154
#printf STDERR "[$ai,$bi] -> [$na,$nb]\n";
 
155
                        &mul_add_c($a,$ai,$b,$bi,$c0,$c1,$c2,$v,$i,$na,$nb);
 
156
                        if ($v)
 
157
                                {
 
158
                                &comment("saved r[$i]");
 
159
                                # &mov("eax",&wparam(0));
 
160
                                # &mov(&DWP($i*4,"eax","",0),$c0);
 
161
                                ($c0,$c1,$c2)=($c1,$c2,$c0);
 
162
                                }
 
163
                        $ai--;
 
164
                        $bi++;
 
165
                        }
 
166
                $as++ if ($i < ($num-1));
 
167
                $ae++ if ($i >= ($num-1));
 
168
 
 
169
                $bs++ if ($i >= ($num-1));
 
170
                $be++ if ($i < ($num-1));
 
171
                }
 
172
        &comment("save r[$i]");
 
173
        # &mov("eax",&wparam(0));
 
174
        &mov(&DWP($i*4,"eax","",0),$c0);
 
175
 
 
176
        &pop("ebx");
 
177
        &pop("ebp");
 
178
        &pop("edi");
 
179
        &pop("esi");
 
180
        &ret();
 
181
        &function_end_B($name);
 
182
        }
 
183
 
 
184
sub bn_sqr_comba
 
185
        {
 
186
        local($name,$num)=@_;
 
187
        local($r,$a,$c0,$c1,$c2)=@_;
 
188
        local($i,$as,$ae,$bs,$be,$ai,$bi);
 
189
        local($b,$tot,$end,$half);
 
190
 
 
191
        &function_begin_B($name,"");
 
192
 
 
193
        $c0="ebx";
 
194
        $c1="ecx";
 
195
        $c2="ebp";
 
196
        $a="esi";
 
197
        $r="edi";
 
198
 
 
199
        &push("esi");
 
200
         &push("edi");
 
201
        &push("ebp");
 
202
         &push("ebx");
 
203
        &mov($r,&wparam(0));
 
204
         &mov($a,&wparam(1));
 
205
        &xor($c0,$c0);
 
206
         &xor($c1,$c1);
 
207
        &mov("eax",&DWP(0,$a,"",0)); # load the first word
 
208
 
 
209
        $as=0;
 
210
        $ae=0;
 
211
        $bs=0;
 
212
        $be=0;
 
213
        $tot=$num+$num-1;
 
214
 
 
215
        for ($i=0; $i<$tot; $i++)
 
216
                {
 
217
                $ai=$as;
 
218
                $bi=$bs;
 
219
                $end=$be+1;
 
220
 
 
221
                &comment("############### Calculate word $i");
 
222
                for ($j=$bs; $j<$end; $j++)
 
223
                        {
 
224
                        &xor($c2,$c2) if ($j == $bs);
 
225
                        if (($ai-1) < ($bi+1))
 
226
                                {
 
227
                                $v=1;
 
228
                                $v=2 if ($i+1) == $tot;
 
229
                                }
 
230
                        else
 
231
                                { $v=0; }
 
232
                        if (!$v)
 
233
                                {
 
234
                                $na=$ai-1;
 
235
                                $nb=$bi+1;
 
236
                                }
 
237
                        else
 
238
                                {
 
239
                                $na=$as+($i < ($num-1));
 
240
                                $nb=$bs+($i >= ($num-1));
 
241
                                }
 
242
                        if ($ai == $bi)
 
243
                                {
 
244
                                &sqr_add_c($r,$a,$ai,$bi,
 
245
                                        $c0,$c1,$c2,$v,$i,$na,$nb);
 
246
                                }
 
247
                        else
 
248
                                {
 
249
                                &sqr_add_c2($r,$a,$ai,$bi,
 
250
                                        $c0,$c1,$c2,$v,$i,$na,$nb);
 
251
                                }
 
252
                        if ($v)
 
253
                                {
 
254
                                &comment("saved r[$i]");
 
255
                                #&mov(&DWP($i*4,$r,"",0),$c0);
 
256
                                ($c0,$c1,$c2)=($c1,$c2,$c0);
 
257
                                last;
 
258
                                }
 
259
                        $ai--;
 
260
                        $bi++;
 
261
                        }
 
262
                $as++ if ($i < ($num-1));
 
263
                $ae++ if ($i >= ($num-1));
 
264
 
 
265
                $bs++ if ($i >= ($num-1));
 
266
                $be++ if ($i < ($num-1));
 
267
                }
 
268
        &mov(&DWP($i*4,$r,"",0),$c0);
 
269
        &pop("ebx");
 
270
        &pop("ebp");
 
271
        &pop("edi");
 
272
        &pop("esi");
 
273
        &ret();
 
274
        &function_end_B($name);
 
275
        }
 
276
 
 
277
1;