1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#!/usr/local/bin/perl
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
3221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
4221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrompush(@INC,"${dir}","${dir}../../perlasm");
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectrequire "x86asm.pl";
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&asm_init($ARGV[0],$0);
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&bn_mul_comba("bn_mul_comba8",8);
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&bn_mul_comba("bn_mul_comba4",4);
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&bn_sqr_comba("bn_sqr_comba8",8);
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&bn_sqr_comba("bn_sqr_comba4",4);
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&asm_finish();
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub mul_add_c
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	local($a,$ai,$b,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_;
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# pos == -1 if eax and edx are pre-loaded, 0 to load from next
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# words, and 1 if load return value
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&comment("mul a[$ai]*b[$bi]");
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# "eax" and "edx" will always be pre-loaded.
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# &mov("eax",&DWP($ai*4,$a,"",0)) ;
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# &mov("edx",&DWP($bi*4,$b,"",0));
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mul("edx");
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&add($c0,"eax");
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0;	# laod next a
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov("eax",&wparam(0)) if $pos > 0;			# load r[]
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 ###
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&adc($c1,"edx");
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 0;	# laod next b
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 1;	# laod next b
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 ###
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&adc($c2,0);
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 # is pos > 1, it means it is the last loop
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov(&DWP($i*4,"eax","",0),$c0) if $pos > 0;		# save r[];
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1;		# laod next a
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub sqr_add_c
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	local($r,$a,$ai,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_;
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# pos == -1 if eax and edx are pre-loaded, 0 to load from next
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# words, and 1 if load return value
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&comment("sqr a[$ai]*a[$bi]");
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# "eax" and "edx" will always be pre-loaded.
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# &mov("eax",&DWP($ai*4,$a,"",0)) ;
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# &mov("edx",&DWP($bi*4,$b,"",0));
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($ai == $bi)
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{ &mul("eax");}
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{ &mul("edx");}
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&add($c0,"eax");
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0;	# load next a
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 ###
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&adc($c1,"edx");
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov("edx",&DWP(($nb)*4,$a,"",0)) if ($pos == 1) && ($na != $nb);
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 ###
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&adc($c2,0);
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 # is pos > 1, it means it is the last loop
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov(&DWP($i*4,$r,"",0),$c0) if $pos > 0;		# save r[];
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1;		# load next b
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub sqr_add_c2
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	local($r,$a,$ai,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_;
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# pos == -1 if eax and edx are pre-loaded, 0 to load from next
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# words, and 1 if load return value
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&comment("sqr a[$ai]*a[$bi]");
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# "eax" and "edx" will always be pre-loaded.
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# &mov("eax",&DWP($ai*4,$a,"",0)) ;
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# &mov("edx",&DWP($bi*4,$a,"",0));
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($ai == $bi)
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{ &mul("eax");}
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{ &mul("edx");}
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&add("eax","eax");
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 ###
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&adc("edx","edx");
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 ###
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&adc($c2,0);
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &add($c0,"eax");
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&adc($c1,"edx");
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0;	# load next a
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1;	# load next b
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&adc($c2,0);
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP($i*4,$r,"",0),$c0) if $pos > 0;		# save r[];
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov("edx",&DWP(($nb)*4,$a,"",0)) if ($pos <= 1) && ($na != $nb);
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 ###
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub bn_mul_comba
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	local($name,$num)=@_;
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	local($a,$b,$c0,$c1,$c2);
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	local($i,$as,$ae,$bs,$be,$ai,$bi);
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	local($tot,$end);
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&function_begin_B($name,"");
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$c0="ebx";
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$c1="ecx";
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$c2="ebp";
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$a="esi";
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$b="edi";
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$as=0;
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$ae=0;
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$bs=0;
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$be=0;
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$tot=$num+$num-1;
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&push("esi");
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov($a,&wparam(1));
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&push("edi");
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov($b,&wparam(2));
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&push("ebp");
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &push("ebx");
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&xor($c0,$c0);
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov("eax",&DWP(0,$a,"",0));	# load the first word
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&xor($c1,$c1);
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov("edx",&DWP(0,$b,"",0));	# load the first second
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for ($i=0; $i<$tot; $i++)
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$ai=$as;
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$bi=$bs;
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$end=$be+1;
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&comment("################## Calculate word $i");
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for ($j=$bs; $j<$end; $j++)
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			&xor($c2,$c2) if ($j == $bs);
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (($j+1) == $end)
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				$v=1;
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				$v=2 if (($i+1) == $tot);
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{ $v=0; }
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (($j+1) != $end)
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				$na=($ai-1);
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				$nb=($bi+1);
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				$na=$as+($i < ($num-1));
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				$nb=$bs+($i >= ($num-1));
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#printf STDERR "[$ai,$bi] -> [$na,$nb]\n";
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			&mul_add_c($a,$ai,$b,$bi,$c0,$c1,$c2,$v,$i,$na,$nb);
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ($v)
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				&comment("saved r[$i]");
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				# &mov("eax",&wparam(0));
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				# &mov(&DWP($i*4,"eax","",0),$c0);
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				($c0,$c1,$c2)=($c1,$c2,$c0);
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$ai--;
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$bi++;
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$as++ if ($i < ($num-1));
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$ae++ if ($i >= ($num-1));
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$bs++ if ($i >= ($num-1));
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$be++ if ($i < ($num-1));
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&comment("save r[$i]");
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# &mov("eax",&wparam(0));
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP($i*4,"eax","",0),$c0);
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&pop("ebx");
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&pop("ebp");
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&pop("edi");
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&pop("esi");
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&ret();
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&function_end_B($name);
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub bn_sqr_comba
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	local($name,$num)=@_;
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	local($r,$a,$c0,$c1,$c2)=@_;
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	local($i,$as,$ae,$bs,$be,$ai,$bi);
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	local($b,$tot,$end,$half);
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&function_begin_B($name,"");
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$c0="ebx";
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$c1="ecx";
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$c2="ebp";
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$a="esi";
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$r="edi";
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&push("esi");
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &push("edi");
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&push("ebp");
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &push("ebx");
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($r,&wparam(0));
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov($a,&wparam(1));
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&xor($c0,$c0);
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &xor($c1,$c1);
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("eax",&DWP(0,$a,"",0)); # load the first word
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$as=0;
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$ae=0;
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$bs=0;
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$be=0;
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$tot=$num+$num-1;
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for ($i=0; $i<$tot; $i++)
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$ai=$as;
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$bi=$bs;
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$end=$be+1;
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&comment("############### Calculate word $i");
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for ($j=$bs; $j<$end; $j++)
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			&xor($c2,$c2) if ($j == $bs);
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (($ai-1) < ($bi+1))
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				$v=1;
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				$v=2 if ($i+1) == $tot;
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{ $v=0; }
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!$v)
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				$na=$ai-1;
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				$nb=$bi+1;
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				$na=$as+($i < ($num-1));
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				$nb=$bs+($i >= ($num-1));
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ($ai == $bi)
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				&sqr_add_c($r,$a,$ai,$bi,
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					$c0,$c1,$c2,$v,$i,$na,$nb);
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				&sqr_add_c2($r,$a,$ai,$bi,
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					$c0,$c1,$c2,$v,$i,$na,$nb);
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ($v)
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				&comment("saved r[$i]");
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				#&mov(&DWP($i*4,$r,"",0),$c0);
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				($c0,$c1,$c2)=($c1,$c2,$c0);
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				last;
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$ai--;
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$bi++;
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$as++ if ($i < ($num-1));
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$ae++ if ($i >= ($num-1));
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$bs++ if ($i >= ($num-1));
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$be++ if ($i < ($num-1));
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP($i*4,$r,"",0),$c0);
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&pop("ebx");
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&pop("ebp");
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&pop("edi");
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&pop("esi");
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&ret();
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&function_end_B($name);
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
288