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