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