1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#!/usr/local/bin/perl
2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# x86 assember
3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgsub bn_mul_words
5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	local($name)=@_;
7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&function_begin($name,"");
9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&comment("");
11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	$Low="eax";
12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	$High="edx";
13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	$a="ebx";
14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	$w="ecx";
15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	$r="edi";
16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	$c="esi";
17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	$num="ebp";
18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&xor($c,$c);		# clear carry
20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov($r,&wparam(0));	#
21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov($a,&wparam(1));	#
22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov($num,&wparam(2));	#
23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov($w,&wparam(3));	#
24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&and($num,0xfffffff8);	# num / 8
26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&jz(&label("mw_finish"));
27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&set_label("mw_loop",0);
29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for ($i=0; $i<32; $i+=4)
30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&comment("Round $i");
32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 &mov("eax",&DWP($i,$a,"",0)); 	# *a
34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&mul($w);			# *a * w
35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&add("eax",$c);			# L(t)+=c
36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 # XXX
37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&adc("edx",0);			# H(t)+=carry
39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 &mov(&DWP($i,$r,"",0),"eax");	# *r= L(t);
40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&mov($c,"edx");			# c=  H(t);
42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&comment("");
45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&add($a,32);
46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&add($r,32);
47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&sub($num,8);
48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&jz(&label("mw_finish"));
49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&jmp(&label("mw_loop"));
50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&set_label("mw_finish",0);
52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov($num,&wparam(2));	# get num
53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&and($num,7);
54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&jnz(&label("mw_finish2"));
55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&jmp(&label("mw_end"));
56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&set_label("mw_finish2",1);
58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for ($i=0; $i<7; $i++)
59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&comment("Tail Round $i");
61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 &mov("eax",&DWP($i*4,$a,"",0));# *a
62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&mul($w);			# *a * w
63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&add("eax",$c);			# L(t)+=c
64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 # XXX
65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&adc("edx",0);			# H(t)+=carry
66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 &mov(&DWP($i*4,$r,"",0),"eax");# *r= L(t);
67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&mov($c,"edx");			# c=  H(t);
68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		 &dec($num) if ($i != 7-1);
69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		&jz(&label("mw_end")) if ($i != 7-1);
70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&set_label("mw_end",0);
72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&mov("eax",$c);
73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	&function_end($name);
75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org1;
78