summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/ripemd/asm/rmd-586.pl
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/ripemd/asm/rmd-586.pl')
-rw-r--r--src/lib/libcrypto/ripemd/asm/rmd-586.pl112
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
64sub Xv 62sub 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");