3 push(@INC,"perlasm","../../perlasm");
6 &asm_init($ARGV[0],$0);
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");
14 &bn_sub_part_words("bn_sub_part_words");
22 &function_begin($name,"");
32 &xor($c,$c); # clear carry
33 &mov($r,&wparam(0)); #
35 &mov("ecx",&wparam(2)); #
36 &mov($a,&wparam(1)); #
38 &and("ecx",0xfffffff8); # num / 8
39 &mov($w,&wparam(3)); #
41 &push("ecx"); # Up the stack for a tmp variable
43 &jz(&label("maw_finish"));
45 &set_label("maw_loop",0);
47 &mov(&swtmp(0),"ecx"); #
49 for ($i=0; $i<32; $i+=4)
53 &mov("eax",&DWP($i,$a,"",0)); # *a
55 &add("eax",$c); # L(t)+= *r
56 &mov($c,&DWP($i,$r,"",0)); # L(t)+= *r
57 &adc("edx",0); # H(t)+=carry
58 &add("eax",$c); # L(t)+=c
59 &adc("edx",0); # H(t)+=carry
60 &mov(&DWP($i,$r,"",0),"eax"); # *r= L(t);
61 &mov($c,"edx"); # c= H(t);
65 &mov("ecx",&swtmp(0)); #
69 &jnz(&label("maw_loop"));
71 &set_label("maw_finish",0);
72 &mov("ecx",&wparam(2)); # get num
74 &jnz(&label("maw_finish2")); # helps branch prediction
75 &jmp(&label("maw_end"));
77 &set_label("maw_finish2",1);
78 for ($i=0; $i<7; $i++)
80 &comment("Tail Round $i");
81 &mov("eax",&DWP($i*4,$a,"",0));# *a
83 &add("eax",$c); # L(t)+=c
84 &mov($c,&DWP($i*4,$r,"",0)); # L(t)+= *r
85 &adc("edx",0); # H(t)+=carry
87 &adc("edx",0); # H(t)+=carry
88 &dec("ecx") if ($i != 7-1);
89 &mov(&DWP($i*4,$r,"",0),"eax"); # *r= L(t);
90 &mov($c,"edx"); # c= H(t);
91 &jz(&label("maw_end")) if ($i != 7-1);
93 &set_label("maw_end",0);
96 &pop("ecx"); # clear variable from
105 &function_begin($name,"");
116 &xor($c,$c); # clear carry
117 &mov($r,&wparam(0)); #
118 &mov($a,&wparam(1)); #
119 &mov($num,&wparam(2)); #
120 &mov($w,&wparam(3)); #
122 &and($num,0xfffffff8); # num / 8
123 &jz(&label("mw_finish"));
125 &set_label("mw_loop",0);
126 for ($i=0; $i<32; $i+=4)
128 &comment("Round $i");
130 &mov("eax",&DWP($i,$a,"",0)); # *a
132 &add("eax",$c); # L(t)+=c
135 &adc("edx",0); # H(t)+=carry
136 &mov(&DWP($i,$r,"",0),"eax"); # *r= L(t);
138 &mov($c,"edx"); # c= H(t);
145 &jz(&label("mw_finish"));
146 &jmp(&label("mw_loop"));
148 &set_label("mw_finish",0);
149 &mov($num,&wparam(2)); # get num
151 &jnz(&label("mw_finish2"));
152 &jmp(&label("mw_end"));
154 &set_label("mw_finish2",1);
155 for ($i=0; $i<7; $i++)
157 &comment("Tail Round $i");
158 &mov("eax",&DWP($i*4,$a,"",0));# *a
160 &add("eax",$c); # L(t)+=c
162 &adc("edx",0); # H(t)+=carry
163 &mov(&DWP($i*4,$r,"",0),"eax");# *r= L(t);
164 &mov($c,"edx"); # c= H(t);
165 &dec($num) if ($i != 7-1);
166 &jz(&label("mw_end")) if ($i != 7-1);
168 &set_label("mw_end",0);
171 &function_end($name);
178 &function_begin($name,"");
185 &mov($r,&wparam(0)); #
186 &mov($a,&wparam(1)); #
187 &mov($num,&wparam(2)); #
189 &and($num,0xfffffff8); # num / 8
190 &jz(&label("sw_finish"));
192 &set_label("sw_loop",0);
193 for ($i=0; $i<32; $i+=4)
195 &comment("Round $i");
196 &mov("eax",&DWP($i,$a,"",0)); # *a
198 &mul("eax"); # *a * *a
199 &mov(&DWP($i*2,$r,"",0),"eax"); #
200 &mov(&DWP($i*2+4,$r,"",0),"edx");#
207 &jnz(&label("sw_loop"));
209 &set_label("sw_finish",0);
210 &mov($num,&wparam(2)); # get num
212 &jz(&label("sw_end"));
214 for ($i=0; $i<7; $i++)
216 &comment("Tail Round $i");
217 &mov("eax",&DWP($i*4,$a,"",0)); # *a
219 &mul("eax"); # *a * *a
220 &mov(&DWP($i*8,$r,"",0),"eax"); #
221 &dec($num) if ($i != 7-1);
222 &mov(&DWP($i*8+4,$r,"",0),"edx");
223 &jz(&label("sw_end")) if ($i != 7-1);
225 &set_label("sw_end",0);
227 &function_end($name);
234 &function_begin($name,"");
235 &mov("edx",&wparam(0)); #
236 &mov("eax",&wparam(1)); #
237 &mov("ebx",&wparam(2)); #
239 &function_end($name);
246 &function_begin($name,"");
257 &mov($r,&wparam(0)); # get r
258 &mov($a,&wparam(1)); # get a
259 &mov($b,&wparam(2)); # get b
260 &mov($num,&wparam(3)); # get num
261 &xor($c,$c); # clear carry
262 &and($num,0xfffffff8); # num / 8
264 &jz(&label("aw_finish"));
266 &set_label("aw_loop",0);
267 for ($i=0; $i<8; $i++)
269 &comment("Round $i");
271 &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
272 &mov($tmp2,&DWP($i*4,$b,"",0)); # *b
278 &mov(&DWP($i*4,$r,"",0),$tmp1); # *r
286 &jnz(&label("aw_loop"));
288 &set_label("aw_finish",0);
289 &mov($num,&wparam(3)); # get num
291 &jz(&label("aw_end"));
293 for ($i=0; $i<7; $i++)
295 &comment("Tail Round $i");
296 &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
297 &mov($tmp2,&DWP($i*4,$b,"",0));# *b
303 &dec($num) if ($i != 6);
304 &mov(&DWP($i*4,$r,"",0),$tmp1); # *r
305 &jz(&label("aw_end")) if ($i != 6);
307 &set_label("aw_end",0);
309 # &mov("eax",$c); # $c is "eax"
311 &function_end($name);
318 &function_begin($name,"");
329 &mov($r,&wparam(0)); # get r
330 &mov($a,&wparam(1)); # get a
331 &mov($b,&wparam(2)); # get b
332 &mov($num,&wparam(3)); # get num
333 &xor($c,$c); # clear carry
334 &and($num,0xfffffff8); # num / 8
336 &jz(&label("aw_finish"));
338 &set_label("aw_loop",0);
339 for ($i=0; $i<8; $i++)
341 &comment("Round $i");
343 &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
344 &mov($tmp2,&DWP($i*4,$b,"",0)); # *b
350 &mov(&DWP($i*4,$r,"",0),$tmp1); # *r
358 &jnz(&label("aw_loop"));
360 &set_label("aw_finish",0);
361 &mov($num,&wparam(3)); # get num
363 &jz(&label("aw_end"));
365 for ($i=0; $i<7; $i++)
367 &comment("Tail Round $i");
368 &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
369 &mov($tmp2,&DWP($i*4,$b,"",0));# *b
375 &dec($num) if ($i != 6);
376 &mov(&DWP($i*4,$r,"",0),$tmp1); # *r
377 &jz(&label("aw_end")) if ($i != 6);
379 &set_label("aw_end",0);
381 # &mov("eax",$c); # $c is "eax"
383 &function_end($name);
386 sub bn_sub_part_words
390 &function_begin($name,"");
401 &mov($r,&wparam(0)); # get r
402 &mov($a,&wparam(1)); # get a
403 &mov($b,&wparam(2)); # get b
404 &mov($num,&wparam(3)); # get num
405 &xor($c,$c); # clear carry
406 &and($num,0xfffffff8); # num / 8
408 &jz(&label("aw_finish"));
410 &set_label("aw_loop",0);
411 for ($i=0; $i<8; $i++)
413 &comment("Round $i");
415 &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
416 &mov($tmp2,&DWP($i*4,$b,"",0)); # *b
422 &mov(&DWP($i*4,$r,"",0),$tmp1); # *r
430 &jnz(&label("aw_loop"));
432 &set_label("aw_finish",0);
433 &mov($num,&wparam(3)); # get num
435 &jz(&label("aw_end"));
437 for ($i=0; $i<7; $i++)
439 &comment("Tail Round $i");
440 &mov($tmp1,&DWP(0,$a,"",0)); # *a
441 &mov($tmp2,&DWP(0,$b,"",0));# *b
447 &mov(&DWP(0,$r,"",0),$tmp1); # *r
451 &dec($num) if ($i != 6);
452 &jz(&label("aw_end")) if ($i != 6);
454 &set_label("aw_end",0);
457 &je(&label("pw_end"));
459 &mov($num,&wparam(4)); # get dl
461 &je(&label("pw_end"));
462 &jge(&label("pw_pos"));
468 &and($num,0xfffffff8); # num / 8
469 &jz(&label("pw_neg_finish"));
471 &set_label("pw_neg_loop",0);
472 for ($i=0; $i<8; $i++)
474 &comment("dl<0 Round $i");
477 &mov($tmp2,&DWP($i*4,$b,"",0)); # *b
483 &mov(&DWP($i*4,$r,"",0),$tmp1); # *r
490 &jnz(&label("pw_neg_loop"));
492 &set_label("pw_neg_finish",0);
493 &mov($tmp2,&wparam(4)); # get dl
497 &jz(&label("pw_end"));
499 for ($i=0; $i<7; $i++)
501 &comment("dl<0 Tail Round $i");
503 &mov($tmp2,&DWP($i*4,$b,"",0));# *b
509 &dec($num) if ($i != 6);
510 &mov(&DWP($i*4,$r,"",0),$tmp1); # *r
511 &jz(&label("pw_end")) if ($i != 6);
514 &jmp(&label("pw_end"));
516 &set_label("pw_pos",0);
518 &and($num,0xfffffff8); # num / 8
519 &jz(&label("pw_pos_finish"));
521 &set_label("pw_pos_loop",0);
523 for ($i=0; $i<8; $i++)
525 &comment("dl>0 Round $i");
527 &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
529 &mov(&DWP($i*4,$r,"",0),$tmp1); # *r
530 &jnc(&label("pw_nc".$i));
537 &jnz(&label("pw_pos_loop"));
539 &set_label("pw_pos_finish",0);
540 &mov($num,&wparam(4)); # get dl
542 &jz(&label("pw_end"));
544 for ($i=0; $i<7; $i++)
546 &comment("dl>0 Tail Round $i");
547 &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
549 &mov(&DWP($i*4,$r,"",0),$tmp1); # *r
550 &jnc(&label("pw_tail_nc".$i));
551 &dec($num) if ($i != 6);
552 &jz(&label("pw_end")) if ($i != 6);
555 &jmp(&label("pw_end"));
557 &set_label("pw_nc_loop",0);
558 for ($i=0; $i<8; $i++)
560 &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
561 &mov(&DWP($i*4,$r,"",0),$tmp1); # *r
562 &set_label("pw_nc".$i,0);
569 &jnz(&label("pw_nc_loop"));
571 &mov($num,&wparam(4)); # get dl
573 &jz(&label("pw_nc_end"));
575 for ($i=0; $i<7; $i++)
577 &mov($tmp1,&DWP($i*4,$a,"",0)); # *a
578 &mov(&DWP($i*4,$r,"",0),$tmp1); # *r
579 &set_label("pw_tail_nc".$i,0);
580 &dec($num) if ($i != 6);
581 &jz(&label("pw_nc_end")) if ($i != 6);
584 &set_label("pw_nc_end",0);
587 &set_label("pw_end",0);
589 # &mov("eax",$c); # $c is "eax"
591 &function_end($name);