143410Snewton#!/usr/local/bin/perl
243410Snewton# x86 assember
343410Snewton
443410Snewtonsub bn_sqr_words
543410Snewton	{
643410Snewton	local($name)=@_;
743410Snewton
843410Snewton	&function_begin($name,"");
943410Snewton
1043410Snewton	&comment("");
1143410Snewton	$r="esi";
1243410Snewton	$a="edi";
1343410Snewton	$num="ebx";
1443410Snewton
1543410Snewton	&mov($r,&wparam(0));	#
1643410Snewton	&mov($a,&wparam(1));	#
1743410Snewton	&mov($num,&wparam(2));	#
1843410Snewton
1943410Snewton	&and($num,0xfffffff8);	# num / 8
2043410Snewton	&jz(&label("sw_finish"));
2143410Snewton
2243410Snewton	&set_label("sw_loop",0);
2343410Snewton	for ($i=0; $i<32; $i+=4)
2443410Snewton		{
2543410Snewton		&comment("Round $i");
2643410Snewton		&mov("eax",&DWP($i,$a,"",0)); 	# *a
2743410Snewton		 # XXX
2843410Snewton		&mul("eax");			# *a * *a
2943410Snewton		&mov(&DWP($i*2,$r,"",0),"eax");	#
3043410Snewton		 &mov(&DWP($i*2+4,$r,"",0),"edx");#
3143410Snewton		}
3249263Snewton
3343410Snewton	&comment("");
3443410Snewton	&add($a,32);
35119420Sobrien	&add($r,64);
36119420Sobrien	&sub($num,8);
37119420Sobrien	&jnz(&label("sw_loop"));
3843410Snewton
3943410Snewton	&set_label("sw_finish",0);
4043410Snewton	&mov($num,&wparam(2));	# get num
4143410Snewton	&and($num,7);
4243410Snewton	&jz(&label("sw_end"));
4343410Snewton
4443410Snewton	for ($i=0; $i<7; $i++)
4543410Snewton		{
4643410Snewton		&comment("Tail Round $i");
4743410Snewton		&mov("eax",&DWP($i*4,$a,"",0));	# *a
4843410Snewton		 # XXX
4943410Snewton		&mul("eax");			# *a * *a
5043410Snewton		&mov(&DWP($i*8,$r,"",0),"eax");	#
5143410Snewton		 &dec($num) if ($i != 7-1);
5243410Snewton		&mov(&DWP($i*8+4,$r,"",0),"edx");
5343410Snewton		 &jz(&label("sw_end")) if ($i != 7-1);
5443410Snewton		}
5543410Snewton	&set_label("sw_end",0);
5643410Snewton
5743410Snewton	&function_end($name);
5843410Snewton	}
5965314Sobrien
6065314Sobrien1;
6165314Sobrien