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 bn_sqr_words
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	local($name)=@_;
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&function_begin($name,"");
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&comment("");
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$r="esi";
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$a="edi";
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$num="ebx";
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($r,&wparam(0));	#
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($a,&wparam(1));	#
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($num,&wparam(2));	#
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&and($num,0xfffffff8);	# num / 8
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jz(&label("sw_finish"));
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&set_label("sw_loop",0);
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for ($i=0; $i<32; $i+=4)
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&comment("Round $i");
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&mov("eax",&DWP($i,$a,"",0)); 	# *a
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 # XXX
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&mul("eax");			# *a * *a
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&mov(&DWP($i*2,$r,"",0),"eax");	#
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 &mov(&DWP($i*2+4,$r,"",0),"edx");#
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&comment("");
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&add($a,32);
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&add($r,64);
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&sub($num,8);
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jnz(&label("sw_loop"));
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&set_label("sw_finish",0);
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($num,&wparam(2));	# get num
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&and($num,7);
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jz(&label("sw_end"));
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for ($i=0; $i<7; $i++)
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&comment("Tail Round $i");
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&mov("eax",&DWP($i*4,$a,"",0));	# *a
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 # XXX
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&mul("eax");			# *a * *a
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&mov(&DWP($i*8,$r,"",0),"eax");	#
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 &dec($num) if ($i != 7-1);
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&mov(&DWP($i*8+4,$r,"",0),"edx");
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 &jz(&label("sw_end")) if ($i != 7-1);
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&set_label("sw_end",0);
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&function_end($name);
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project1;
61