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