diff options
Diffstat (limited to 'src/lib/libcrypto/ripemd/asm/rmd-586.pl')
-rw-r--r-- | src/lib/libcrypto/ripemd/asm/rmd-586.pl | 112 |
1 files changed, 60 insertions, 52 deletions
diff --git a/src/lib/libcrypto/ripemd/asm/rmd-586.pl b/src/lib/libcrypto/ripemd/asm/rmd-586.pl index dc3f6c792e..0ab6f76bff 100644 --- a/src/lib/libcrypto/ripemd/asm/rmd-586.pl +++ b/src/lib/libcrypto/ripemd/asm/rmd-586.pl | |||
@@ -1,9 +1,7 @@ | |||
1 | #!/usr/bin/perl | 1 | #!/usr/local/bin/perl |
2 | 2 | ||
3 | # Normal is the | 3 | # Normal is the |
4 | # ripemd160_block_x86(MD5_CTX *c, ULONG *X); | 4 | # ripemd160_block_asm_host_order(RIPEMD160_CTX *c, ULONG *X,int blocks); |
5 | # version, non-normal is the | ||
6 | # ripemd160_block_x86(MD5_CTX *c, ULONG *X,int blocks); | ||
7 | 5 | ||
8 | $normal=0; | 6 | $normal=0; |
9 | 7 | ||
@@ -12,13 +10,13 @@ require "x86asm.pl"; | |||
12 | 10 | ||
13 | &asm_init($ARGV[0],$0); | 11 | &asm_init($ARGV[0],$0); |
14 | 12 | ||
15 | $A="eax"; | 13 | $A="ecx"; |
16 | $B="ebx"; | 14 | $B="esi"; |
17 | $C="ecx"; | 15 | $C="edi"; |
18 | $D="edx"; | 16 | $D="ebx"; |
19 | $E="ebp"; | 17 | $E="ebp"; |
20 | $tmp1="esi"; | 18 | $tmp1="eax"; |
21 | $tmp2="edi"; | 19 | $tmp2="edx"; |
22 | 20 | ||
23 | $KL1=0x5A827999; | 21 | $KL1=0x5A827999; |
24 | $KL2=0x6ED9EBA1; | 22 | $KL2=0x6ED9EBA1; |
@@ -58,13 +56,13 @@ $KR3=0x7A6D76E9; | |||
58 | 8, 5,12, 9,12, 5,14, 6, 8,13, 6, 5,15,13,11,11, | 56 | 8, 5,12, 9,12, 5,14, 6, 8,13, 6, 5,15,13,11,11, |
59 | ); | 57 | ); |
60 | 58 | ||
61 | &ripemd160_block("ripemd160_block_x86"); | 59 | &ripemd160_block("ripemd160_block_asm_host_order"); |
62 | &asm_finish(); | 60 | &asm_finish(); |
63 | 61 | ||
64 | sub Xv | 62 | sub Xv |
65 | { | 63 | { |
66 | local($n)=@_; | 64 | local($n)=@_; |
67 | return(&swtmp($n+1)); | 65 | return(&swtmp($n)); |
68 | # tmp on stack | 66 | # tmp on stack |
69 | } | 67 | } |
70 | 68 | ||
@@ -82,7 +80,7 @@ sub RIP1 | |||
82 | &comment($p++); | 80 | &comment($p++); |
83 | if ($p & 1) | 81 | if ($p & 1) |
84 | { | 82 | { |
85 | &mov($tmp1, $c) if $o == -1; | 83 | #&mov($tmp1, $c) if $o == -1; |
86 | &xor($tmp1, $d) if $o == -1; | 84 | &xor($tmp1, $d) if $o == -1; |
87 | &mov($tmp2, &Xv($pos)); | 85 | &mov($tmp2, &Xv($pos)); |
88 | &xor($tmp1, $b); | 86 | &xor($tmp1, $b); |
@@ -290,7 +288,7 @@ sub RIP5 | |||
290 | &rotl($c, 10); | 288 | &rotl($c, 10); |
291 | &lea($a, &DWP($K,$a,$tmp1,1)); | 289 | &lea($a, &DWP($K,$a,$tmp1,1)); |
292 | &sub($tmp2, &Np($d)) if $o <= 0; | 290 | &sub($tmp2, &Np($d)) if $o <= 0; |
293 | &mov(&swtmp(1+16), $A) if $o == 1; | 291 | &mov(&swtmp(16), $A) if $o == 1; |
294 | &mov($tmp1, &Np($d)) if $o == 2; | 292 | &mov($tmp1, &Np($d)) if $o == 2; |
295 | &rotl($a, $s); | 293 | &rotl($a, $s); |
296 | &add($a, $e); | 294 | &add($a, $e); |
@@ -310,19 +308,25 @@ sub ripemd160_block | |||
310 | # D 12 | 308 | # D 12 |
311 | # E 16 | 309 | # E 16 |
312 | 310 | ||
311 | &mov($tmp2, &wparam(0)); | ||
312 | &mov($tmp1, &wparam(1)); | ||
313 | &push("esi"); | 313 | &push("esi"); |
314 | &mov($C, &wparam(2)); | 314 | &mov($A, &DWP( 0,$tmp2,"",0)); |
315 | &push("edi"); | 315 | &push("edi"); |
316 | &mov($tmp1, &wparam(1)); # edi | 316 | &mov($B, &DWP( 4,$tmp2,"",0)); |
317 | &push("ebp"); | 317 | &push("ebp"); |
318 | &add($C, $tmp1); # offset we end at | 318 | &mov($C, &DWP( 8,$tmp2,"",0)); |
319 | &push("ebx"); | 319 | &push("ebx"); |
320 | &sub($C, 64); | 320 | &stack_push(16+5+6); |
321 | &stack_push(16+5+1); | 321 | # Special comment about the figure of 6. |
322 | # XXX | 322 | # Idea is to pad the current frame so |
323 | 323 | # that the top of the stack gets fairly | |
324 | &mov(&swtmp(0), $C); | 324 | # aligned. Well, as you realize it would |
325 | &mov($tmp2, &wparam(0)); # Done at end of loop | 325 | # always depend on how the frame below is |
326 | # aligned. The good news are that gcc-2.95 | ||
327 | # and later does keep first argument at | ||
328 | # least double-wise aligned. | ||
329 | # <appro@fy.chalmers.se> | ||
326 | 330 | ||
327 | &set_label("start") unless $normal; | 331 | &set_label("start") unless $normal; |
328 | &comment(""); | 332 | &comment(""); |
@@ -332,16 +336,12 @@ sub ripemd160_block | |||
332 | 336 | ||
333 | for ($z=0; $z<16; $z+=2) | 337 | for ($z=0; $z<16; $z+=2) |
334 | { | 338 | { |
335 | &mov($A, &DWP( $z*4,$tmp1,"",0)); | 339 | &mov($D, &DWP( $z*4,$tmp1,"",0)); |
336 | &mov($B, &DWP( ($z+1)*4,$tmp1,"",0)); | 340 | &mov($E, &DWP( ($z+1)*4,$tmp1,"",0)); |
337 | &mov(&swtmp(1+$z), $A); | 341 | &mov(&swtmp($z), $D); |
338 | &mov(&swtmp(1+$z+1), $B); | 342 | &mov(&swtmp($z+1), $E); |
339 | } | 343 | } |
340 | &add($tmp1, 64); | 344 | &mov($tmp1, $C); |
341 | &mov($A, &DWP( 0,$tmp2,"",0)); | ||
342 | &mov(&wparam(1),$tmp1); | ||
343 | &mov($B, &DWP( 4,$tmp2,"",0)); | ||
344 | &mov($C, &DWP( 8,$tmp2,"",0)); | ||
345 | &mov($D, &DWP(12,$tmp2,"",0)); | 345 | &mov($D, &DWP(12,$tmp2,"",0)); |
346 | &mov($E, &DWP(16,$tmp2,"",0)); | 346 | &mov($E, &DWP(16,$tmp2,"",0)); |
347 | 347 | ||
@@ -431,14 +431,14 @@ sub ripemd160_block | |||
431 | &RIP5($B,$C,$D,$E,$A,$wl[79],$sl[79],$KL4,1); | 431 | &RIP5($B,$C,$D,$E,$A,$wl[79],$sl[79],$KL4,1); |
432 | 432 | ||
433 | # &mov($tmp2, &wparam(0)); # moved into last RIP5 | 433 | # &mov($tmp2, &wparam(0)); # moved into last RIP5 |
434 | # &mov(&swtmp(1+16), $A); | 434 | # &mov(&swtmp(16), $A); |
435 | &mov($A, &DWP( 0,$tmp2,"",0)); | 435 | &mov($A, &DWP( 0,$tmp2,"",0)); |
436 | &mov(&swtmp(1+17), $B); | 436 | &mov(&swtmp(16+1), $B); |
437 | &mov(&swtmp(1+18), $C); | 437 | &mov(&swtmp(16+2), $C); |
438 | &mov($B, &DWP( 4,$tmp2,"",0)); | 438 | &mov($B, &DWP( 4,$tmp2,"",0)); |
439 | &mov(&swtmp(1+19), $D); | 439 | &mov(&swtmp(16+3), $D); |
440 | &mov($C, &DWP( 8,$tmp2,"",0)); | 440 | &mov($C, &DWP( 8,$tmp2,"",0)); |
441 | &mov(&swtmp(1+20), $E); | 441 | &mov(&swtmp(16+4), $E); |
442 | &mov($D, &DWP(12,$tmp2,"",0)); | 442 | &mov($D, &DWP(12,$tmp2,"",0)); |
443 | &mov($E, &DWP(16,$tmp2,"",0)); | 443 | &mov($E, &DWP(16,$tmp2,"",0)); |
444 | 444 | ||
@@ -530,47 +530,55 @@ sub ripemd160_block | |||
530 | # &mov($tmp2, &wparam(0)); # Moved into last round | 530 | # &mov($tmp2, &wparam(0)); # Moved into last round |
531 | 531 | ||
532 | &mov($tmp1, &DWP( 4,$tmp2,"",0)); # ctx->B | 532 | &mov($tmp1, &DWP( 4,$tmp2,"",0)); # ctx->B |
533 | &add($D, $tmp1); | 533 | &add($D, $tmp1); |
534 | &mov($tmp1, &swtmp(1+18)); # $c | 534 | &mov($tmp1, &swtmp(16+2)); # $c |
535 | &add($D, $tmp1); | 535 | &add($D, $tmp1); |
536 | 536 | ||
537 | &mov($tmp1, &DWP( 8,$tmp2,"",0)); # ctx->C | 537 | &mov($tmp1, &DWP( 8,$tmp2,"",0)); # ctx->C |
538 | &add($E, $tmp1); | 538 | &add($E, $tmp1); |
539 | &mov($tmp1, &swtmp(1+19)); # $d | 539 | &mov($tmp1, &swtmp(16+3)); # $d |
540 | &add($E, $tmp1); | 540 | &add($E, $tmp1); |
541 | 541 | ||
542 | &mov($tmp1, &DWP(12,$tmp2,"",0)); # ctx->D | 542 | &mov($tmp1, &DWP(12,$tmp2,"",0)); # ctx->D |
543 | &add($A, $tmp1); | 543 | &add($A, $tmp1); |
544 | &mov($tmp1, &swtmp(1+20)); # $e | 544 | &mov($tmp1, &swtmp(16+4)); # $e |
545 | &add($A, $tmp1); | 545 | &add($A, $tmp1); |
546 | 546 | ||
547 | 547 | ||
548 | &mov($tmp1, &DWP(16,$tmp2,"",0)); # ctx->E | 548 | &mov($tmp1, &DWP(16,$tmp2,"",0)); # ctx->E |
549 | &add($B, $tmp1); | 549 | &add($B, $tmp1); |
550 | &mov($tmp1, &swtmp(1+16)); # $a | 550 | &mov($tmp1, &swtmp(16+0)); # $a |
551 | &add($B, $tmp1); | 551 | &add($B, $tmp1); |
552 | 552 | ||
553 | &mov($tmp1, &DWP( 0,$tmp2,"",0)); # ctx->A | 553 | &mov($tmp1, &DWP( 0,$tmp2,"",0)); # ctx->A |
554 | &add($C, $tmp1); | 554 | &add($C, $tmp1); |
555 | &mov($tmp1, &swtmp(1+17)); # $b | 555 | &mov($tmp1, &swtmp(16+1)); # $b |
556 | &add($C, $tmp1); | 556 | &add($C, $tmp1); |
557 | 557 | ||
558 | &mov($tmp1, &wparam(2)); | ||
559 | |||
558 | &mov(&DWP( 0,$tmp2,"",0), $D); | 560 | &mov(&DWP( 0,$tmp2,"",0), $D); |
559 | &mov(&DWP( 4,$tmp2,"",0), $E); | 561 | &mov(&DWP( 4,$tmp2,"",0), $E); |
560 | &mov(&DWP( 8,$tmp2,"",0), $A); | 562 | &mov(&DWP( 8,$tmp2,"",0), $A); |
561 | &mov(&DWP(12,$tmp2,"",0), $B); | 563 | &sub($tmp1,1); |
562 | &mov(&DWP(16,$tmp2,"",0), $C); | 564 | &mov(&DWP(12,$tmp2,"",0), $B); |
565 | &mov(&DWP(16,$tmp2,"",0), $C); | ||
563 | 566 | ||
564 | &mov($tmp2, &swtmp(0)); | 567 | &jle(&label("get_out")); |
565 | &mov($tmp1, &wparam(1)); | 568 | |
569 | &mov(&wparam(2),$tmp1); | ||
570 | &mov($C, $A); | ||
571 | &mov($tmp1, &wparam(1)); | ||
572 | &mov($A, $D); | ||
573 | &add($tmp1, 64); | ||
574 | &mov($B, $E); | ||
575 | &mov(&wparam(1),$tmp1); | ||
566 | 576 | ||
567 | &cmp($tmp2,$tmp1); | 577 | &jmp(&label("start")); |
568 | &mov($tmp2, &wparam(0)); | ||
569 | 578 | ||
570 | # XXX | 579 | &set_label("get_out"); |
571 | &jge(&label("start")); | ||
572 | 580 | ||
573 | &stack_pop(16+5+1); | 581 | &stack_pop(16+5+6); |
574 | 582 | ||
575 | &pop("ebx"); | 583 | &pop("ebx"); |
576 | &pop("ebp"); | 584 | &pop("ebp"); |