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