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_add_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	$a="esi";
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$b="edi";
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$c="eax";
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$r="ebx";
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$tmp1="ecx";
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$tmp2="edx";
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$num="ebp";
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($r,&wparam(0));	# get r
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov($a,&wparam(1));	# get a
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($b,&wparam(2));	# get b
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &mov($num,&wparam(3));	# get num
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&xor($c,$c);		# clear carry
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &and($num,0xfffffff8);	# num / 8
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jz(&label("aw_finish"));
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&set_label("aw_loop",0);
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for ($i=0; $i<8; $i++)
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&comment("Round $i");
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&mov($tmp1,&DWP($i*4,$a,"",0)); 	# *a
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 &mov($tmp2,&DWP($i*4,$b,"",0)); 	# *b
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&add($tmp1,$c);
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 &mov($c,0);
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&adc($c,$c);
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 &add($tmp1,$tmp2);
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&adc($c,0);
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 &mov(&DWP($i*4,$r,"",0),$tmp1); 	# *r
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&comment("");
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&add($a,32);
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &add($b,32);
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&add($r,32);
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &sub($num,8);
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jnz(&label("aw_loop"));
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&set_label("aw_finish",0);
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($num,&wparam(3));	# get num
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&and($num,7);
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 &jz(&label("aw_end"));
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for ($i=0; $i<7; $i++)
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&comment("Tail Round $i");
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&mov($tmp1,&DWP($i*4,$a,"",0));	# *a
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 &mov($tmp2,&DWP($i*4,$b,"",0));# *b
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&add($tmp1,$c);
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 &mov($c,0);
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&adc($c,$c);
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 &add($tmp1,$tmp2);
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&adc($c,0);
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 &dec($num) if ($i != 6);
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&mov(&DWP($i*4,$r,"",0),$tmp1);	# *a
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 &jz(&label("aw_end")) if ($i != 6);
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&set_label("aw_end",0);
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#	&mov("eax",$c);		# $c is "eax"
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&function_end($name);
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project1;
77