155714Skris#!/usr/local/bin/perl 255714Skris 355714Skris# Normal is the 4194206Ssimon# ripemd160_block_asm_data_order(RIPEMD160_CTX *c, ULONG *X,int blocks); 555714Skris 655714Skris$normal=0; 755714Skris 855714Skrispush(@INC,"perlasm","../../perlasm"); 955714Skrisrequire "x86asm.pl"; 1055714Skris 1155714Skris&asm_init($ARGV[0],$0); 1255714Skris 1359191Skris$A="ecx"; 1459191Skris$B="esi"; 1559191Skris$C="edi"; 1659191Skris$D="ebx"; 1755714Skris$E="ebp"; 1859191Skris$tmp1="eax"; 1959191Skris$tmp2="edx"; 2055714Skris 2155714Skris$KL1=0x5A827999; 2255714Skris$KL2=0x6ED9EBA1; 2355714Skris$KL3=0x8F1BBCDC; 2455714Skris$KL4=0xA953FD4E; 2555714Skris$KR0=0x50A28BE6; 2655714Skris$KR1=0x5C4DD124; 2755714Skris$KR2=0x6D703EF3; 2855714Skris$KR3=0x7A6D76E9; 2955714Skris 3055714Skris 3155714Skris@wl=( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 3255714Skris 7, 4,13, 1,10, 6,15, 3,12, 0, 9, 5, 2,14,11, 8, 3355714Skris 3,10,14, 4, 9,15, 8, 1, 2, 7, 0, 6,13,11, 5,12, 3455714Skris 1, 9,11,10, 0, 8,12, 4,13, 3, 7,15,14, 5, 6, 2, 3555714Skris 4, 0, 5, 9, 7,12, 2,10,14, 1, 3, 8,11, 6,15,13, 3655714Skris ); 3755714Skris 3855714Skris@wr=( 5,14, 7, 0, 9, 2,11, 4,13, 6,15, 8, 1,10, 3,12, 3955714Skris 6,11, 3, 7, 0,13, 5,10,14,15, 8,12, 4, 9, 1, 2, 4055714Skris 15, 5, 1, 3, 7,14, 6, 9,11, 8,12, 2,10, 0, 4,13, 4155714Skris 8, 6, 4, 1, 3,11,15, 0, 5,12, 2,13, 9, 7,10,14, 4255714Skris 12,15,10, 4, 1, 5, 8, 7, 6, 2,13,14, 0, 3, 9,11, 4355714Skris ); 4455714Skris 4555714Skris@sl=( 11,14,15,12, 5, 8, 7, 9,11,13,14,15, 6, 7, 9, 8, 4655714Skris 7, 6, 8,13,11, 9, 7,15, 7,12,15, 9,11, 7,13,12, 4755714Skris 11,13, 6, 7,14, 9,13,15,14, 8,13, 6, 5,12, 7, 5, 4855714Skris 11,12,14,15,14,15, 9, 8, 9,14, 5, 6, 8, 6, 5,12, 4955714Skris 9,15, 5,11, 6, 8,13,12, 5,12,13,14,11, 8, 5, 6, 5055714Skris ); 5155714Skris 5255714Skris@sr=( 8, 9, 9,11,13,15,15, 5, 7, 7, 8,11,14,14,12, 6, 5355714Skris 9,13,15, 7,12, 8, 9,11, 7, 7,12, 7, 6,15,13,11, 5455714Skris 9, 7,15,11, 8, 6, 6,14,12,13, 5,14,13,13, 7, 5, 5555714Skris 15, 5, 8,11,14,14, 6,14, 6, 9,12, 9,12, 5,15, 8, 5655714Skris 8, 5,12, 9,12, 5,14, 6, 8,13, 6, 5,15,13,11,11, 5755714Skris ); 5855714Skris 59194206Ssimon&ripemd160_block("ripemd160_block_asm_data_order"); 6055714Skris&asm_finish(); 6155714Skris 6255714Skrissub Xv 6355714Skris { 6455714Skris local($n)=@_; 6559191Skris return(&swtmp($n)); 6655714Skris # tmp on stack 6755714Skris } 6855714Skris 6955714Skrissub Np 7055714Skris { 7155714Skris local($p)=@_; 7255714Skris local(%n)=($A,$E,$B,$A,$C,$B,$D,$C,$E,$D); 7355714Skris return($n{$p}); 7455714Skris } 7555714Skris 7655714Skrissub RIP1 7755714Skris { 7855714Skris local($a,$b,$c,$d,$e,$pos,$s,$o,$pos2)=@_; 7955714Skris 8055714Skris &comment($p++); 8155714Skris if ($p & 1) 8255714Skris { 8359191Skris #&mov($tmp1, $c) if $o == -1; 8455714Skris &xor($tmp1, $d) if $o == -1; 8555714Skris &mov($tmp2, &Xv($pos)); 8655714Skris &xor($tmp1, $b); 8755714Skris &add($a, $tmp2); 8855714Skris &rotl($c, 10); 8955714Skris &add($a, $tmp1); 9055714Skris &mov($tmp1, &Np($c)); # NEXT 9155714Skris # XXX 9255714Skris &rotl($a, $s); 9355714Skris &add($a, $e); 9455714Skris } 9555714Skris else 9655714Skris { 9755714Skris &xor($tmp1, $d); 9855714Skris &mov($tmp2, &Xv($pos)); 9955714Skris &xor($tmp1, $b); 10055714Skris &add($a, $tmp1); 10155714Skris &mov($tmp1, &Np($c)) if $o <= 0; 10255714Skris &mov($tmp1, -1) if $o == 1; 10355714Skris # XXX if $o == 2; 10455714Skris &rotl($c, 10); 10555714Skris &add($a, $tmp2); 10655714Skris &xor($tmp1, &Np($d)) if $o <= 0; 10755714Skris &mov($tmp2, &Xv($pos2)) if $o == 1; 10855714Skris &mov($tmp2, &wparam(0)) if $o == 2; 10955714Skris &rotl($a, $s); 11055714Skris &add($a, $e); 11155714Skris } 11255714Skris } 11355714Skris 11455714Skrissub RIP2 11555714Skris { 11655714Skris local($a,$b,$c,$d,$e,$pos,$pos2,$s,$K,$o)=@_; 11755714Skris 11855714Skris# XXXXXX 11955714Skris &comment($p++); 12055714Skris if ($p & 1) 12155714Skris { 12255714Skris# &mov($tmp2, &Xv($pos)) if $o < -1; 12355714Skris# &mov($tmp1, -1) if $o < -1; 12455714Skris 12555714Skris &add($a, $tmp2); 12655714Skris &mov($tmp2, $c); 12755714Skris &sub($tmp1, $b); 12855714Skris &and($tmp2, $b); 12955714Skris &and($tmp1, $d); 13055714Skris &or($tmp2, $tmp1); 13155714Skris &mov($tmp1, &Xv($pos2)) if $o <= 0; # XXXXXXXXXXXXXX 13255714Skris # XXX 13355714Skris &rotl($c, 10); 13455714Skris &lea($a, &DWP($K,$a,$tmp2,1)); 13555714Skris &mov($tmp2, -1) if $o <= 0; 13655714Skris # XXX 13755714Skris &rotl($a, $s); 13855714Skris &add($a, $e); 13955714Skris } 14055714Skris else 14155714Skris { 14255714Skris # XXX 14355714Skris &add($a, $tmp1); 14455714Skris &mov($tmp1, $c); 14555714Skris &sub($tmp2, $b); 14655714Skris &and($tmp1, $b); 14755714Skris &and($tmp2, $d); 14855714Skris if ($o != 2) 14955714Skris { 15055714Skris &or($tmp1, $tmp2); 15155714Skris &mov($tmp2, &Xv($pos2)) if $o <= 0; 15255714Skris &mov($tmp2, -1) if $o == 1; 15355714Skris &rotl($c, 10); 15455714Skris &lea($a, &DWP($K,$a,$tmp1,1)); 15555714Skris &mov($tmp1, -1) if $o <= 0; 15655714Skris &sub($tmp2, &Np($c)) if $o == 1; 15755714Skris } else { 15855714Skris &or($tmp2, $tmp1); 15955714Skris &mov($tmp1, &Np($c)); 16055714Skris &rotl($c, 10); 16155714Skris &lea($a, &DWP($K,$a,$tmp2,1)); 16255714Skris &xor($tmp1, &Np($d)); 16355714Skris } 16455714Skris &rotl($a, $s); 16555714Skris &add($a, $e); 16655714Skris } 16755714Skris } 16855714Skris 16955714Skrissub RIP3 17055714Skris { 17155714Skris local($a,$b,$c,$d,$e,$pos,$s,$K,$o,$pos2)=@_; 17255714Skris 17355714Skris &comment($p++); 17455714Skris if ($p & 1) 17555714Skris { 17655714Skris# &mov($tmp2, -1) if $o < -1; 17755714Skris# &sub($tmp2, $c) if $o < -1; 17855714Skris &mov($tmp1, &Xv($pos)); 17955714Skris &or($tmp2, $b); 18055714Skris &add($a, $tmp1); 18155714Skris &xor($tmp2, $d); 18255714Skris &mov($tmp1, -1) if $o <= 0; # NEXT 18355714Skris # XXX 18455714Skris &rotl($c, 10); 18555714Skris &lea($a, &DWP($K,$a,$tmp2,1)); 18655714Skris &sub($tmp1, &Np($c)) if $o <= 0; # NEXT 18755714Skris # XXX 18855714Skris &rotl($a, $s); 18955714Skris &add($a, $e); 19055714Skris } 19155714Skris else 19255714Skris { 19355714Skris &mov($tmp2, &Xv($pos)); 19455714Skris &or($tmp1, $b); 19555714Skris &add($a, $tmp2); 19655714Skris &xor($tmp1, $d); 19755714Skris &mov($tmp2, -1) if $o <= 0; # NEXT 19855714Skris &mov($tmp2, -1) if $o == 1; 19955714Skris &mov($tmp2, &Xv($pos2)) if $o == 2; 20055714Skris &rotl($c, 10); 20155714Skris &lea($a, &DWP($K,$a,$tmp1,1)); 20255714Skris &sub($tmp2, &Np($c)) if $o <= 0; # NEXT 20355714Skris &mov($tmp1, &Np($d)) if $o == 1; 20455714Skris &mov($tmp1, -1) if $o == 2; 20555714Skris &rotl($a, $s); 20655714Skris &add($a, $e); 20755714Skris } 20855714Skris } 20955714Skris 21055714Skrissub RIP4 21155714Skris { 21255714Skris local($a,$b,$c,$d,$e,$pos,$s,$K,$o)=@_; 21355714Skris 21455714Skris &comment($p++); 21555714Skris if ($p & 1) 21655714Skris { 21755714Skris# &mov($tmp2, -1) if $o == -2; 21855714Skris# &mov($tmp1, $d) if $o == -2; 21955714Skris &sub($tmp2, $d); 22055714Skris &and($tmp1, $b); 22155714Skris &and($tmp2, $c); 22255714Skris &or($tmp2, $tmp1); 22355714Skris &mov($tmp1, &Xv($pos)); 22455714Skris &rotl($c, 10); 22555714Skris &lea($a, &DWP($K,$a,$tmp2)); 22655714Skris &mov($tmp2, -1) unless $o > 0; # NEXT 22755714Skris # XXX 22855714Skris &add($a, $tmp1); 22955714Skris &mov($tmp1, &Np($d)) unless $o > 0; # NEXT 23055714Skris # XXX 23155714Skris &rotl($a, $s); 23255714Skris &add($a, $e); 23355714Skris } 23455714Skris else 23555714Skris { 23655714Skris &sub($tmp2, $d); 23755714Skris &and($tmp1, $b); 23855714Skris &and($tmp2, $c); 23955714Skris &or($tmp2, $tmp1); 24055714Skris &mov($tmp1, &Xv($pos)); 24155714Skris &rotl($c, 10); 24255714Skris &lea($a, &DWP($K,$a,$tmp2)); 24355714Skris &mov($tmp2, -1) if $o == 0; # NEXT 24455714Skris &mov($tmp2, -1) if $o == 1; 24555714Skris &mov($tmp2, -1) if $o == 2; 24655714Skris # XXX 24755714Skris &add($a, $tmp1); 24855714Skris &mov($tmp1, &Np($d)) if $o == 0; # NEXT 24955714Skris &sub($tmp2, &Np($d)) if $o == 1; 25055714Skris &sub($tmp2, &Np($c)) if $o == 2; 25155714Skris # XXX 25255714Skris &rotl($a, $s); 25355714Skris &add($a, $e); 25455714Skris } 25555714Skris } 25655714Skris 25755714Skrissub RIP5 25855714Skris { 25955714Skris local($a,$b,$c,$d,$e,$pos,$s,$K,$o)=@_; 26055714Skris 26155714Skris &comment($p++); 26255714Skris if ($p & 1) 26355714Skris { 26455714Skris &mov($tmp2, -1) if $o == -2; 26555714Skris &sub($tmp2, $d) if $o == -2; 26655714Skris &mov($tmp1, &Xv($pos)); 26755714Skris &or($tmp2, $c); 26855714Skris &add($a, $tmp1); 26955714Skris &xor($tmp2, $b); 27055714Skris &mov($tmp1, -1) if $o <= 0; 27155714Skris # XXX 27255714Skris &rotl($c, 10); 27355714Skris &lea($a, &DWP($K,$a,$tmp2,1)); 27455714Skris &sub($tmp1, &Np($d)) if $o <= 0; 27555714Skris # XXX 27655714Skris &rotl($a, $s); 27755714Skris &add($a, $e); 27855714Skris } 27955714Skris else 28055714Skris { 28155714Skris &mov($tmp2, &Xv($pos)); 28255714Skris &or($tmp1, $c); 28355714Skris &add($a, $tmp2); 28455714Skris &xor($tmp1, $b); 28555714Skris &mov($tmp2, -1) if $o <= 0; 28655714Skris &mov($tmp2, &wparam(0)) if $o == 1; # Middle code 28755714Skris &mov($tmp2, -1) if $o == 2; 28855714Skris &rotl($c, 10); 28955714Skris &lea($a, &DWP($K,$a,$tmp1,1)); 29055714Skris &sub($tmp2, &Np($d)) if $o <= 0; 29159191Skris &mov(&swtmp(16), $A) if $o == 1; 29255714Skris &mov($tmp1, &Np($d)) if $o == 2; 29355714Skris &rotl($a, $s); 29455714Skris &add($a, $e); 29555714Skris } 29655714Skris } 29755714Skris 29855714Skrissub ripemd160_block 29955714Skris { 30055714Skris local($name)=@_; 30155714Skris 30255714Skris &function_begin_B($name,"",3); 30355714Skris 30455714Skris # parameter 1 is the RIPEMD160_CTX structure. 30555714Skris # A 0 30655714Skris # B 4 30755714Skris # C 8 30855714Skris # D 12 30955714Skris # E 16 31055714Skris 31159191Skris &mov($tmp2, &wparam(0)); 31259191Skris &mov($tmp1, &wparam(1)); 31355714Skris &push("esi"); 31459191Skris &mov($A, &DWP( 0,$tmp2,"",0)); 31555714Skris &push("edi"); 31659191Skris &mov($B, &DWP( 4,$tmp2,"",0)); 31755714Skris &push("ebp"); 31859191Skris &mov($C, &DWP( 8,$tmp2,"",0)); 31955714Skris &push("ebx"); 32059191Skris &stack_push(16+5+6); 32159191Skris # Special comment about the figure of 6. 32259191Skris # Idea is to pad the current frame so 32359191Skris # that the top of the stack gets fairly 32459191Skris # aligned. Well, as you realize it would 32559191Skris # always depend on how the frame below is 32659191Skris # aligned. The good news are that gcc-2.95 32759191Skris # and later does keep first argument at 32859191Skris # least double-wise aligned. 32959191Skris # <appro@fy.chalmers.se> 33055714Skris 33155714Skris &set_label("start") unless $normal; 33255714Skris &comment(""); 33355714Skris 33455714Skris # &mov($tmp1, &wparam(1)); # Done at end of loop 33555714Skris # &mov($tmp2, &wparam(0)); # Done at end of loop 33655714Skris 33755714Skris for ($z=0; $z<16; $z+=2) 33855714Skris { 33959191Skris &mov($D, &DWP( $z*4,$tmp1,"",0)); 34059191Skris &mov($E, &DWP( ($z+1)*4,$tmp1,"",0)); 34159191Skris &mov(&swtmp($z), $D); 34259191Skris &mov(&swtmp($z+1), $E); 34355714Skris } 34459191Skris &mov($tmp1, $C); 34555714Skris &mov($D, &DWP(12,$tmp2,"",0)); 34655714Skris &mov($E, &DWP(16,$tmp2,"",0)); 34755714Skris 34855714Skris &RIP1($A,$B,$C,$D,$E,$wl[ 0],$sl[ 0],-1); 34955714Skris &RIP1($E,$A,$B,$C,$D,$wl[ 1],$sl[ 1],0); 35055714Skris &RIP1($D,$E,$A,$B,$C,$wl[ 2],$sl[ 2],0); 35155714Skris &RIP1($C,$D,$E,$A,$B,$wl[ 3],$sl[ 3],0); 35255714Skris &RIP1($B,$C,$D,$E,$A,$wl[ 4],$sl[ 4],0); 35355714Skris &RIP1($A,$B,$C,$D,$E,$wl[ 5],$sl[ 5],0); 35455714Skris &RIP1($E,$A,$B,$C,$D,$wl[ 6],$sl[ 6],0); 35555714Skris &RIP1($D,$E,$A,$B,$C,$wl[ 7],$sl[ 7],0); 35655714Skris &RIP1($C,$D,$E,$A,$B,$wl[ 8],$sl[ 8],0); 35755714Skris &RIP1($B,$C,$D,$E,$A,$wl[ 9],$sl[ 9],0); 35855714Skris &RIP1($A,$B,$C,$D,$E,$wl[10],$sl[10],0); 35955714Skris &RIP1($E,$A,$B,$C,$D,$wl[11],$sl[11],0); 36055714Skris &RIP1($D,$E,$A,$B,$C,$wl[12],$sl[12],0); 36155714Skris &RIP1($C,$D,$E,$A,$B,$wl[13],$sl[13],0); 36255714Skris &RIP1($B,$C,$D,$E,$A,$wl[14],$sl[14],0); 36355714Skris &RIP1($A,$B,$C,$D,$E,$wl[15],$sl[15],1,$wl[16]); 36455714Skris 36555714Skris &RIP2($E,$A,$B,$C,$D,$wl[16],$wl[17],$sl[16],$KL1,-1); 36655714Skris &RIP2($D,$E,$A,$B,$C,$wl[17],$wl[18],$sl[17],$KL1,0); 36755714Skris &RIP2($C,$D,$E,$A,$B,$wl[18],$wl[19],$sl[18],$KL1,0); 36855714Skris &RIP2($B,$C,$D,$E,$A,$wl[19],$wl[20],$sl[19],$KL1,0); 36955714Skris &RIP2($A,$B,$C,$D,$E,$wl[20],$wl[21],$sl[20],$KL1,0); 37055714Skris &RIP2($E,$A,$B,$C,$D,$wl[21],$wl[22],$sl[21],$KL1,0); 37155714Skris &RIP2($D,$E,$A,$B,$C,$wl[22],$wl[23],$sl[22],$KL1,0); 37255714Skris &RIP2($C,$D,$E,$A,$B,$wl[23],$wl[24],$sl[23],$KL1,0); 37355714Skris &RIP2($B,$C,$D,$E,$A,$wl[24],$wl[25],$sl[24],$KL1,0); 37455714Skris &RIP2($A,$B,$C,$D,$E,$wl[25],$wl[26],$sl[25],$KL1,0); 37555714Skris &RIP2($E,$A,$B,$C,$D,$wl[26],$wl[27],$sl[26],$KL1,0); 37655714Skris &RIP2($D,$E,$A,$B,$C,$wl[27],$wl[28],$sl[27],$KL1,0); 37755714Skris &RIP2($C,$D,$E,$A,$B,$wl[28],$wl[29],$sl[28],$KL1,0); 37855714Skris &RIP2($B,$C,$D,$E,$A,$wl[29],$wl[30],$sl[29],$KL1,0); 37955714Skris &RIP2($A,$B,$C,$D,$E,$wl[30],$wl[31],$sl[30],$KL1,0); 38055714Skris &RIP2($E,$A,$B,$C,$D,$wl[31],$wl[32],$sl[31],$KL1,1); 38155714Skris 38255714Skris &RIP3($D,$E,$A,$B,$C,$wl[32],$sl[32],$KL2,-1); 38355714Skris &RIP3($C,$D,$E,$A,$B,$wl[33],$sl[33],$KL2,0); 38455714Skris &RIP3($B,$C,$D,$E,$A,$wl[34],$sl[34],$KL2,0); 38555714Skris &RIP3($A,$B,$C,$D,$E,$wl[35],$sl[35],$KL2,0); 38655714Skris &RIP3($E,$A,$B,$C,$D,$wl[36],$sl[36],$KL2,0); 38755714Skris &RIP3($D,$E,$A,$B,$C,$wl[37],$sl[37],$KL2,0); 38855714Skris &RIP3($C,$D,$E,$A,$B,$wl[38],$sl[38],$KL2,0); 38955714Skris &RIP3($B,$C,$D,$E,$A,$wl[39],$sl[39],$KL2,0); 39055714Skris &RIP3($A,$B,$C,$D,$E,$wl[40],$sl[40],$KL2,0); 39155714Skris &RIP3($E,$A,$B,$C,$D,$wl[41],$sl[41],$KL2,0); 39255714Skris &RIP3($D,$E,$A,$B,$C,$wl[42],$sl[42],$KL2,0); 39355714Skris &RIP3($C,$D,$E,$A,$B,$wl[43],$sl[43],$KL2,0); 39455714Skris &RIP3($B,$C,$D,$E,$A,$wl[44],$sl[44],$KL2,0); 39555714Skris &RIP3($A,$B,$C,$D,$E,$wl[45],$sl[45],$KL2,0); 39655714Skris &RIP3($E,$A,$B,$C,$D,$wl[46],$sl[46],$KL2,0); 39755714Skris &RIP3($D,$E,$A,$B,$C,$wl[47],$sl[47],$KL2,1); 39855714Skris 39955714Skris &RIP4($C,$D,$E,$A,$B,$wl[48],$sl[48],$KL3,-1); 40055714Skris &RIP4($B,$C,$D,$E,$A,$wl[49],$sl[49],$KL3,0); 40155714Skris &RIP4($A,$B,$C,$D,$E,$wl[50],$sl[50],$KL3,0); 40255714Skris &RIP4($E,$A,$B,$C,$D,$wl[51],$sl[51],$KL3,0); 40355714Skris &RIP4($D,$E,$A,$B,$C,$wl[52],$sl[52],$KL3,0); 40455714Skris &RIP4($C,$D,$E,$A,$B,$wl[53],$sl[53],$KL3,0); 40555714Skris &RIP4($B,$C,$D,$E,$A,$wl[54],$sl[54],$KL3,0); 40655714Skris &RIP4($A,$B,$C,$D,$E,$wl[55],$sl[55],$KL3,0); 40755714Skris &RIP4($E,$A,$B,$C,$D,$wl[56],$sl[56],$KL3,0); 40855714Skris &RIP4($D,$E,$A,$B,$C,$wl[57],$sl[57],$KL3,0); 40955714Skris &RIP4($C,$D,$E,$A,$B,$wl[58],$sl[58],$KL3,0); 41055714Skris &RIP4($B,$C,$D,$E,$A,$wl[59],$sl[59],$KL3,0); 41155714Skris &RIP4($A,$B,$C,$D,$E,$wl[60],$sl[60],$KL3,0); 41255714Skris &RIP4($E,$A,$B,$C,$D,$wl[61],$sl[61],$KL3,0); 41355714Skris &RIP4($D,$E,$A,$B,$C,$wl[62],$sl[62],$KL3,0); 41455714Skris &RIP4($C,$D,$E,$A,$B,$wl[63],$sl[63],$KL3,1); 41555714Skris 41655714Skris &RIP5($B,$C,$D,$E,$A,$wl[64],$sl[64],$KL4,-1); 41755714Skris &RIP5($A,$B,$C,$D,$E,$wl[65],$sl[65],$KL4,0); 41855714Skris &RIP5($E,$A,$B,$C,$D,$wl[66],$sl[66],$KL4,0); 41955714Skris &RIP5($D,$E,$A,$B,$C,$wl[67],$sl[67],$KL4,0); 42055714Skris &RIP5($C,$D,$E,$A,$B,$wl[68],$sl[68],$KL4,0); 42155714Skris &RIP5($B,$C,$D,$E,$A,$wl[69],$sl[69],$KL4,0); 42255714Skris &RIP5($A,$B,$C,$D,$E,$wl[70],$sl[70],$KL4,0); 42355714Skris &RIP5($E,$A,$B,$C,$D,$wl[71],$sl[71],$KL4,0); 42455714Skris &RIP5($D,$E,$A,$B,$C,$wl[72],$sl[72],$KL4,0); 42555714Skris &RIP5($C,$D,$E,$A,$B,$wl[73],$sl[73],$KL4,0); 42655714Skris &RIP5($B,$C,$D,$E,$A,$wl[74],$sl[74],$KL4,0); 42755714Skris &RIP5($A,$B,$C,$D,$E,$wl[75],$sl[75],$KL4,0); 42855714Skris &RIP5($E,$A,$B,$C,$D,$wl[76],$sl[76],$KL4,0); 42955714Skris &RIP5($D,$E,$A,$B,$C,$wl[77],$sl[77],$KL4,0); 43055714Skris &RIP5($C,$D,$E,$A,$B,$wl[78],$sl[78],$KL4,0); 43155714Skris &RIP5($B,$C,$D,$E,$A,$wl[79],$sl[79],$KL4,1); 43255714Skris 43355714Skris # &mov($tmp2, &wparam(0)); # moved into last RIP5 43459191Skris # &mov(&swtmp(16), $A); 43555714Skris &mov($A, &DWP( 0,$tmp2,"",0)); 43659191Skris &mov(&swtmp(16+1), $B); 43759191Skris &mov(&swtmp(16+2), $C); 43855714Skris &mov($B, &DWP( 4,$tmp2,"",0)); 43959191Skris &mov(&swtmp(16+3), $D); 44055714Skris &mov($C, &DWP( 8,$tmp2,"",0)); 44159191Skris &mov(&swtmp(16+4), $E); 44255714Skris &mov($D, &DWP(12,$tmp2,"",0)); 44355714Skris &mov($E, &DWP(16,$tmp2,"",0)); 44455714Skris 44555714Skris &RIP5($A,$B,$C,$D,$E,$wr[ 0],$sr[ 0],$KR0,-2); 44655714Skris &RIP5($E,$A,$B,$C,$D,$wr[ 1],$sr[ 1],$KR0,0); 44755714Skris &RIP5($D,$E,$A,$B,$C,$wr[ 2],$sr[ 2],$KR0,0); 44855714Skris &RIP5($C,$D,$E,$A,$B,$wr[ 3],$sr[ 3],$KR0,0); 44955714Skris &RIP5($B,$C,$D,$E,$A,$wr[ 4],$sr[ 4],$KR0,0); 45055714Skris &RIP5($A,$B,$C,$D,$E,$wr[ 5],$sr[ 5],$KR0,0); 45155714Skris &RIP5($E,$A,$B,$C,$D,$wr[ 6],$sr[ 6],$KR0,0); 45255714Skris &RIP5($D,$E,$A,$B,$C,$wr[ 7],$sr[ 7],$KR0,0); 45355714Skris &RIP5($C,$D,$E,$A,$B,$wr[ 8],$sr[ 8],$KR0,0); 45455714Skris &RIP5($B,$C,$D,$E,$A,$wr[ 9],$sr[ 9],$KR0,0); 45555714Skris &RIP5($A,$B,$C,$D,$E,$wr[10],$sr[10],$KR0,0); 45655714Skris &RIP5($E,$A,$B,$C,$D,$wr[11],$sr[11],$KR0,0); 45755714Skris &RIP5($D,$E,$A,$B,$C,$wr[12],$sr[12],$KR0,0); 45855714Skris &RIP5($C,$D,$E,$A,$B,$wr[13],$sr[13],$KR0,0); 45955714Skris &RIP5($B,$C,$D,$E,$A,$wr[14],$sr[14],$KR0,0); 46055714Skris &RIP5($A,$B,$C,$D,$E,$wr[15],$sr[15],$KR0,2); 46155714Skris 46255714Skris &RIP4($E,$A,$B,$C,$D,$wr[16],$sr[16],$KR1,-2); 46355714Skris &RIP4($D,$E,$A,$B,$C,$wr[17],$sr[17],$KR1,0); 46455714Skris &RIP4($C,$D,$E,$A,$B,$wr[18],$sr[18],$KR1,0); 46555714Skris &RIP4($B,$C,$D,$E,$A,$wr[19],$sr[19],$KR1,0); 46655714Skris &RIP4($A,$B,$C,$D,$E,$wr[20],$sr[20],$KR1,0); 46755714Skris &RIP4($E,$A,$B,$C,$D,$wr[21],$sr[21],$KR1,0); 46855714Skris &RIP4($D,$E,$A,$B,$C,$wr[22],$sr[22],$KR1,0); 46955714Skris &RIP4($C,$D,$E,$A,$B,$wr[23],$sr[23],$KR1,0); 47055714Skris &RIP4($B,$C,$D,$E,$A,$wr[24],$sr[24],$KR1,0); 47155714Skris &RIP4($A,$B,$C,$D,$E,$wr[25],$sr[25],$KR1,0); 47255714Skris &RIP4($E,$A,$B,$C,$D,$wr[26],$sr[26],$KR1,0); 47355714Skris &RIP4($D,$E,$A,$B,$C,$wr[27],$sr[27],$KR1,0); 47455714Skris &RIP4($C,$D,$E,$A,$B,$wr[28],$sr[28],$KR1,0); 47555714Skris &RIP4($B,$C,$D,$E,$A,$wr[29],$sr[29],$KR1,0); 47655714Skris &RIP4($A,$B,$C,$D,$E,$wr[30],$sr[30],$KR1,0); 47755714Skris &RIP4($E,$A,$B,$C,$D,$wr[31],$sr[31],$KR1,2); 47855714Skris 47955714Skris &RIP3($D,$E,$A,$B,$C,$wr[32],$sr[32],$KR2,-2); 48055714Skris &RIP3($C,$D,$E,$A,$B,$wr[33],$sr[33],$KR2,0); 48155714Skris &RIP3($B,$C,$D,$E,$A,$wr[34],$sr[34],$KR2,0); 48255714Skris &RIP3($A,$B,$C,$D,$E,$wr[35],$sr[35],$KR2,0); 48355714Skris &RIP3($E,$A,$B,$C,$D,$wr[36],$sr[36],$KR2,0); 48455714Skris &RIP3($D,$E,$A,$B,$C,$wr[37],$sr[37],$KR2,0); 48555714Skris &RIP3($C,$D,$E,$A,$B,$wr[38],$sr[38],$KR2,0); 48655714Skris &RIP3($B,$C,$D,$E,$A,$wr[39],$sr[39],$KR2,0); 48755714Skris &RIP3($A,$B,$C,$D,$E,$wr[40],$sr[40],$KR2,0); 48855714Skris &RIP3($E,$A,$B,$C,$D,$wr[41],$sr[41],$KR2,0); 48955714Skris &RIP3($D,$E,$A,$B,$C,$wr[42],$sr[42],$KR2,0); 49055714Skris &RIP3($C,$D,$E,$A,$B,$wr[43],$sr[43],$KR2,0); 49155714Skris &RIP3($B,$C,$D,$E,$A,$wr[44],$sr[44],$KR2,0); 49255714Skris &RIP3($A,$B,$C,$D,$E,$wr[45],$sr[45],$KR2,0); 49355714Skris &RIP3($E,$A,$B,$C,$D,$wr[46],$sr[46],$KR2,0); 49455714Skris &RIP3($D,$E,$A,$B,$C,$wr[47],$sr[47],$KR2,2,$wr[48]); 49555714Skris 49655714Skris &RIP2($C,$D,$E,$A,$B,$wr[48],$wr[49],$sr[48],$KR3,-2); 49755714Skris &RIP2($B,$C,$D,$E,$A,$wr[49],$wr[50],$sr[49],$KR3,0); 49855714Skris &RIP2($A,$B,$C,$D,$E,$wr[50],$wr[51],$sr[50],$KR3,0); 49955714Skris &RIP2($E,$A,$B,$C,$D,$wr[51],$wr[52],$sr[51],$KR3,0); 50055714Skris &RIP2($D,$E,$A,$B,$C,$wr[52],$wr[53],$sr[52],$KR3,0); 50155714Skris &RIP2($C,$D,$E,$A,$B,$wr[53],$wr[54],$sr[53],$KR3,0); 50255714Skris &RIP2($B,$C,$D,$E,$A,$wr[54],$wr[55],$sr[54],$KR3,0); 50355714Skris &RIP2($A,$B,$C,$D,$E,$wr[55],$wr[56],$sr[55],$KR3,0); 50455714Skris &RIP2($E,$A,$B,$C,$D,$wr[56],$wr[57],$sr[56],$KR3,0); 50555714Skris &RIP2($D,$E,$A,$B,$C,$wr[57],$wr[58],$sr[57],$KR3,0); 50655714Skris &RIP2($C,$D,$E,$A,$B,$wr[58],$wr[59],$sr[58],$KR3,0); 50755714Skris &RIP2($B,$C,$D,$E,$A,$wr[59],$wr[60],$sr[59],$KR3,0); 50855714Skris &RIP2($A,$B,$C,$D,$E,$wr[60],$wr[61],$sr[60],$KR3,0); 50955714Skris &RIP2($E,$A,$B,$C,$D,$wr[61],$wr[62],$sr[61],$KR3,0); 51055714Skris &RIP2($D,$E,$A,$B,$C,$wr[62],$wr[63],$sr[62],$KR3,0); 51155714Skris &RIP2($C,$D,$E,$A,$B,$wr[63],$wr[64],$sr[63],$KR3,2); 51255714Skris 51355714Skris &RIP1($B,$C,$D,$E,$A,$wr[64],$sr[64],-2); 51455714Skris &RIP1($A,$B,$C,$D,$E,$wr[65],$sr[65],0); 51555714Skris &RIP1($E,$A,$B,$C,$D,$wr[66],$sr[66],0); 51655714Skris &RIP1($D,$E,$A,$B,$C,$wr[67],$sr[67],0); 51755714Skris &RIP1($C,$D,$E,$A,$B,$wr[68],$sr[68],0); 51855714Skris &RIP1($B,$C,$D,$E,$A,$wr[69],$sr[69],0); 51955714Skris &RIP1($A,$B,$C,$D,$E,$wr[70],$sr[70],0); 52055714Skris &RIP1($E,$A,$B,$C,$D,$wr[71],$sr[71],0); 52155714Skris &RIP1($D,$E,$A,$B,$C,$wr[72],$sr[72],0); 52255714Skris &RIP1($C,$D,$E,$A,$B,$wr[73],$sr[73],0); 52355714Skris &RIP1($B,$C,$D,$E,$A,$wr[74],$sr[74],0); 52455714Skris &RIP1($A,$B,$C,$D,$E,$wr[75],$sr[75],0); 52555714Skris &RIP1($E,$A,$B,$C,$D,$wr[76],$sr[76],0); 52655714Skris &RIP1($D,$E,$A,$B,$C,$wr[77],$sr[77],0); 52755714Skris &RIP1($C,$D,$E,$A,$B,$wr[78],$sr[78],0); 52855714Skris &RIP1($B,$C,$D,$E,$A,$wr[79],$sr[79],2); 52955714Skris 53055714Skris # &mov($tmp2, &wparam(0)); # Moved into last round 53155714Skris 53255714Skris &mov($tmp1, &DWP( 4,$tmp2,"",0)); # ctx->B 53355714Skris &add($D, $tmp1); 53459191Skris &mov($tmp1, &swtmp(16+2)); # $c 53555714Skris &add($D, $tmp1); 53655714Skris 53755714Skris &mov($tmp1, &DWP( 8,$tmp2,"",0)); # ctx->C 53855714Skris &add($E, $tmp1); 53959191Skris &mov($tmp1, &swtmp(16+3)); # $d 54055714Skris &add($E, $tmp1); 54155714Skris 54255714Skris &mov($tmp1, &DWP(12,$tmp2,"",0)); # ctx->D 54355714Skris &add($A, $tmp1); 54459191Skris &mov($tmp1, &swtmp(16+4)); # $e 54555714Skris &add($A, $tmp1); 54655714Skris 54755714Skris 54855714Skris &mov($tmp1, &DWP(16,$tmp2,"",0)); # ctx->E 54955714Skris &add($B, $tmp1); 55059191Skris &mov($tmp1, &swtmp(16+0)); # $a 55155714Skris &add($B, $tmp1); 55255714Skris 55355714Skris &mov($tmp1, &DWP( 0,$tmp2,"",0)); # ctx->A 55455714Skris &add($C, $tmp1); 55559191Skris &mov($tmp1, &swtmp(16+1)); # $b 55655714Skris &add($C, $tmp1); 55755714Skris 55859191Skris &mov($tmp1, &wparam(2)); 55959191Skris 56055714Skris &mov(&DWP( 0,$tmp2,"",0), $D); 56155714Skris &mov(&DWP( 4,$tmp2,"",0), $E); 56255714Skris &mov(&DWP( 8,$tmp2,"",0), $A); 56359191Skris &sub($tmp1,1); 56459191Skris &mov(&DWP(12,$tmp2,"",0), $B); 56559191Skris &mov(&DWP(16,$tmp2,"",0), $C); 56655714Skris 56759191Skris &jle(&label("get_out")); 56855714Skris 56959191Skris &mov(&wparam(2),$tmp1); 57059191Skris &mov($C, $A); 57159191Skris &mov($tmp1, &wparam(1)); 57259191Skris &mov($A, $D); 57359191Skris &add($tmp1, 64); 57459191Skris &mov($B, $E); 57559191Skris &mov(&wparam(1),$tmp1); 57655714Skris 57759191Skris &jmp(&label("start")); 57855714Skris 57959191Skris &set_label("get_out"); 58055714Skris 58159191Skris &stack_pop(16+5+6); 58259191Skris 58355714Skris &pop("ebx"); 58455714Skris &pop("ebp"); 58555714Skris &pop("edi"); 58655714Skris &pop("esi"); 58755714Skris &ret(); 58855714Skris &function_end_B($name); 58955714Skris } 59055714Skris 591