155714Skris#!/usr/local/bin/perl
255714Skris# x86 assember
355714Skris
455714Skrissub bn_add_words
555714Skris	{
655714Skris	local($name)=@_;
755714Skris
855714Skris	&function_begin($name,"");
955714Skris
1055714Skris	&comment("");
1155714Skris	$a="esi";
1255714Skris	$b="edi";
1355714Skris	$c="eax";
1455714Skris	$r="ebx";
1555714Skris	$tmp1="ecx";
1655714Skris	$tmp2="edx";
1755714Skris	$num="ebp";
1855714Skris
1955714Skris	&mov($r,&wparam(0));	# get r
2055714Skris	 &mov($a,&wparam(1));	# get a
2155714Skris	&mov($b,&wparam(2));	# get b
2255714Skris	 &mov($num,&wparam(3));	# get num
2355714Skris	&xor($c,$c);		# clear carry
2455714Skris	 &and($num,0xfffffff8);	# num / 8
2555714Skris
2655714Skris	&jz(&label("aw_finish"));
2755714Skris
2855714Skris	&set_label("aw_loop",0);
2955714Skris	for ($i=0; $i<8; $i++)
3055714Skris		{
3155714Skris		&comment("Round $i");
3255714Skris
3355714Skris		&mov($tmp1,&DWP($i*4,$a,"",0)); 	# *a
3455714Skris		 &mov($tmp2,&DWP($i*4,$b,"",0)); 	# *b
3555714Skris		&add($tmp1,$c);
3655714Skris		 &mov($c,0);
3755714Skris		&adc($c,$c);
3855714Skris		 &add($tmp1,$tmp2);
3955714Skris		&adc($c,0);
4055714Skris		 &mov(&DWP($i*4,$r,"",0),$tmp1); 	# *r
4155714Skris		}
4255714Skris
4355714Skris	&comment("");
4455714Skris	&add($a,32);
4555714Skris	 &add($b,32);
4655714Skris	&add($r,32);
4755714Skris	 &sub($num,8);
4855714Skris	&jnz(&label("aw_loop"));
4955714Skris
5055714Skris	&set_label("aw_finish",0);
5155714Skris	&mov($num,&wparam(3));	# get num
5255714Skris	&and($num,7);
5355714Skris	 &jz(&label("aw_end"));
5455714Skris
5555714Skris	for ($i=0; $i<7; $i++)
5655714Skris		{
5755714Skris		&comment("Tail Round $i");
5855714Skris		&mov($tmp1,&DWP($i*4,$a,"",0));	# *a
5955714Skris		 &mov($tmp2,&DWP($i*4,$b,"",0));# *b
6055714Skris		&add($tmp1,$c);
6155714Skris		 &mov($c,0);
6255714Skris		&adc($c,$c);
6355714Skris		 &add($tmp1,$tmp2);
6455714Skris		&adc($c,0);
6555714Skris		 &dec($num) if ($i != 6);
6655714Skris		&mov(&DWP($i*4,$r,"",0),$tmp1);	# *a
6755714Skris		 &jz(&label("aw_end")) if ($i != 6);
6855714Skris		}
6955714Skris	&set_label("aw_end",0);
7055714Skris
7155714Skris#	&mov("eax",$c);		# $c is "eax"
7255714Skris
7355714Skris	&function_end($name);
7455714Skris	}
7555714Skris
7655714Skris1;
77