3 push(@INC,"perlasm","../../perlasm");
6 &asm_init($ARGV[0],"bn-586.pl");
8 &bn_mul_add_words("bn_mul_add_words");
9 &bn_mul_words("bn_mul_words");
10 &bn_sqr_words("bn_sqr_words");
11 &bn_div_words("bn_div_words");
12 &bn_add_words("bn_add_words");
13 &bn_sub_words("bn_sub_words");
21 &function_begin($name,"");
31 &xor($c,$c); # clear carry
32 &mov($r,&wparam(0)); #
34 &mov("ecx",&wparam(2)); #
35 &mov($a,&wparam(1)); #
37 &and("ecx",0xfffffff8); # num / 8
38 &mov($w,&wparam(3)); #
40 &push("ecx"); # Up the stack for a tmp variable
42 &jz(&label("maw_finish"));
44 &set_label("maw_loop",0);
46 &mov(&swtmp(0),"ecx"); #
48 for ($i=0; $i<32; $i+=4)
52 &mov("eax",&DWP($i,$a,"",0)); # *a
54 &add("eax",$c); # L(t)+= *r
55 &mov($c,&DWP($i,$r,"",0)); # L(t)+= *r
56 &adc("edx",0); # H(t)+=carry
57 &add("eax",$c); # L(t)+=c
58 &adc("edx",0); # H(t)+=carry
59 &mov(&DWP($i,$r,"",0),"eax"); # *r= L(t);
60 &mov($c,"edx"); # c= H(t);
64 &mov("ecx",&swtmp(0)); #
68 &jnz(&label("maw_loop"));
70 &set_label("maw_finish",0);
71 &mov("ecx",&wparam(2)); # get num
73 &jnz(&label("maw_finish2")); # helps branch prediction
74 &jmp(&label("maw_end"));
76 &set_label("maw_finish2",1);
77 for ($i=0; $i<7; $i++)
79 &comment("Tail Round $i");
80 &mov("eax",&DWP($i*4,$a,"",0));# *a
82 &add("eax",$c); # L(t)+=c
83 &mov($c,&DWP($i*4,$r,"",0)); # L(t)+= *r
84 &adc("edx",0); # H(t)+=carry
86 &adc("edx",0); # H(t)+=carry
87 &dec("ecx") if ($i != 7-1);
88 &mov(&DWP($i*4,$r,"",0),"eax"); # *r= L(t);
89 &mov($c,"edx"); # c= H(t);
90 &jz(&label("maw_end")) if ($i != 7-1);
92 &set_label("maw_end",0);
95 &pop("ecx"); # clear variable from
104 &function_begin($name,"");
115 &xor($c,$c); # clear carry
116 &mov($r,&wparam(0)); #
117 &mov($a,&wparam(1)); #
118 &mov($num,&wparam(2)); #
119 &mov($w,&wparam(3)); #
121 &and($num,0xfffffff8); # num / 8
122 &jz(&label("mw_finish"));
124 &set_label("mw_loop",0);
125 for ($i=0; $i<32; $i+=4)
127 &comment("Round $i");
129 &mov("eax",&DWP($i,$a,"",0)); # *a
131 &add("eax",$c); # L(t)+=c
134 &adc("edx",0); # H(t)+=carry
135 &mov(&DWP($i,$r,"",0),"eax"); # *r= L(t);
137 &mov($c,"edx"); # c= H(t);
144 &jz(&label("mw_finish"));
145 &jmp(&label("mw_loop"));
147 &set_label("mw_finish",0);
148 &mov($num,&wparam(2)); # get num
150 &jnz(&label("mw_finish2"));
151 &jmp(&label("mw_end"));
153 &set_label("mw_finish2",1);
154 for ($i=0; $i<7; $i++)
156 &comment("Tail Round $i");
157 &mov("eax",&DWP($i*4,$a,"",0));# *a
159 &add("eax",$c); # L(t)+=c
161 &adc("edx",0); # H(t)+=carry
162 &mov(&DWP($i*4,$r,"",0),"eax");# *r= L(t);
163 &mov($c,"edx"); # c= H(t);
164 &dec($num) if ($i != 7-1);
165 &jz(&label("mw_end")) if ($i != 7-1);
167 &set_label("mw_end",0);
170 &function_end($name);
177 &function_begin($name,"");
184 &mov($r,&wparam(0)); #
185 &mov($a,&wparam(1)); #
186 &mov($num,&wparam(2)); #
188 &and($num,0xfffffff8); # num / 8
189 &jz(&label("sw_finish"));
191 &set_label("sw_loop",0);
192 for ($i=0; $i<32; $i+=4)
194 &comment("Round $i");
195 &mov("eax",&DWP($i,$a,"",0)); # *a
197 &mul("eax"); # *a * *a
198 &mov(&DWP($i*2,$r,"",0),"eax"); #
199 &mov(&DWP($i*2+4,$r,"",0),"edx");#
206 &jnz(&label("sw_loop"));
208 &set_label("sw_finish",0);
209 &mov($num,&wparam(2)); # get num
211 &jz(&label("sw_end"));
213 for ($i=0; $i<7; $i++)
215 &comment("Tail Round $i");
216 &mov("eax",&DWP($i*4,$a,"",0)); # *a
218 &mul("eax"); # *a * *a
219 &mov(&DWP($i*8,$r,"",0),"eax"); #
220 &dec($num) if ($i != 7-1);
221 &mov(&DWP($i*8+4,$r,"",0),"edx");
222 &jz(&label("sw_end")) if ($i != 7-1);
224 &set_label("sw_end",0);
226 &function_end($name);
233 &function_begin($name,"");
234 &mov("edx",&wparam(0)); #
235 &mov("eax",&wparam(1)); #
236 &mov("ebx",&wparam(2)); #
238 &function_end($name);
245 &function_begin($name,"");
256 &mov($r,&wparam(0)); # get r
257 &mov($a,&wparam(1)); # get a
258 &mov($b,&wparam(2)); # get b
259 &mov($num,&wparam(3)); # get num
260 &xor($c,$c); # clear carry
261 &and($num,0xfffffff8); # num / 8
263 &jz(&label("aw_finish"));
265 &set_label("aw_loop",0);
266 for ($i=0; $i<8; $i++)
268 &comment("Round $i");
270 &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
271 &mov($tmp2,&DWP($i*4,$b,"",0)); # *b
277 &mov(&DWP($i*4,$r,"",0),$tmp1); # *r
285 &jnz(&label("aw_loop"));
287 &set_label("aw_finish",0);
288 &mov($num,&wparam(3)); # get num
290 &jz(&label("aw_end"));
292 for ($i=0; $i<7; $i++)
294 &comment("Tail Round $i");
295 &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
296 &mov($tmp2,&DWP($i*4,$b,"",0));# *b
302 &dec($num) if ($i != 6);
303 &mov(&DWP($i*4,$r,"",0),$tmp1); # *a
304 &jz(&label("aw_end")) if ($i != 6);
306 &set_label("aw_end",0);
308 # &mov("eax",$c); # $c is "eax"
310 &function_end($name);
317 &function_begin($name,"");
328 &mov($r,&wparam(0)); # get r
329 &mov($a,&wparam(1)); # get a
330 &mov($b,&wparam(2)); # get b
331 &mov($num,&wparam(3)); # get num
332 &xor($c,$c); # clear carry
333 &and($num,0xfffffff8); # num / 8
335 &jz(&label("aw_finish"));
337 &set_label("aw_loop",0);
338 for ($i=0; $i<8; $i++)
340 &comment("Round $i");
342 &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
343 &mov($tmp2,&DWP($i*4,$b,"",0)); # *b
349 &mov(&DWP($i*4,$r,"",0),$tmp1); # *r
357 &jnz(&label("aw_loop"));
359 &set_label("aw_finish",0);
360 &mov($num,&wparam(3)); # get num
362 &jz(&label("aw_end"));
364 for ($i=0; $i<7; $i++)
366 &comment("Tail Round $i");
367 &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
368 &mov($tmp2,&DWP($i*4,$b,"",0));# *b
374 &dec($num) if ($i != 6);
375 &mov(&DWP($i*4,$r,"",0),$tmp1); # *a
376 &jz(&label("aw_end")) if ($i != 6);
378 &set_label("aw_end",0);
380 # &mov("eax",$c); # $c is "eax"
382 &function_end($name);