bn-586.pl revision 9dc0df1bac950d6e491f9a7c7e4888f2b301cb15
require "x86asm.pl";
$sse2=0;
&bn_mul_add_words("bn_mul_add_words");
&bn_mul_words("bn_mul_words");
&bn_sqr_words("bn_sqr_words");
&bn_div_words("bn_div_words");
&bn_add_words("bn_add_words");
&bn_sub_words("bn_sub_words");
&bn_sub_part_words("bn_sub_part_words");
&asm_finish();
sub bn_mul_add_words
{
local($name)=@_;
&comment("");
$Low="eax";
$High="edx";
$a="ebx";
$w="ebp";
$r="edi";
$c="esi";
&xor($c,$c); # clear carry
if ($sse2) {
&add($a,32);
&add($r,32);
&emms();
}
for ($i=0; $i<32; $i+=4)
{
&comment("Round $i");
&mul($w); # *a * w
}
&comment("");
&add($a,32);
&add($r,32);
for ($i=0; $i<7; $i++)
{
&comment("Tail Round $i");
&mul($w); # *a * w
&add("eax",$c);
}
&mov("eax",$c);
&function_end($name);
}
sub bn_mul_words
{
local($name)=@_;
&comment("");
$Low="eax";
$High="edx";
$a="ebx";
$w="ecx";
$r="edi";
$c="esi";
$num="ebp";
&xor($c,$c); # clear carry
for ($i=0; $i<32; $i+=4)
{
&comment("Round $i");
&mul($w); # *a * w
# XXX
}
&comment("");
&add($a,32);
&add($r,32);
for ($i=0; $i<7; $i++)
{
&comment("Tail Round $i");
&mul($w); # *a * w
# XXX
}
&mov("eax",$c);
&function_end($name);
}
sub bn_sqr_words
{
local($name)=@_;
&comment("");
$r="esi";
$a="edi";
$num="ebx";
for ($i=0; $i<32; $i+=4)
{
&comment("Round $i");
# XXX
}
&comment("");
&add($a,32);
&add($r,64);
for ($i=0; $i<7; $i++)
{
&comment("Tail Round $i");
# XXX
}
&function_end($name);
}
sub bn_div_words
{
local($name)=@_;
&div("ebx");
&function_end($name);
}
sub bn_add_words
{
local($name)=@_;
&comment("");
$a="esi";
$b="edi";
$c="eax";
$r="ebx";
$tmp1="ecx";
$tmp2="edx";
$num="ebp";
&xor($c,$c); # clear carry
for ($i=0; $i<8; $i++)
{
&comment("Round $i");
&mov($c,0);
&adc($c,$c);
&adc($c,0);
}
&comment("");
&add($a,32);
&add($b,32);
&add($r,32);
for ($i=0; $i<7; $i++)
{
&comment("Tail Round $i");
&mov($c,0);
&adc($c,$c);
&adc($c,0);
}
# &mov("eax",$c); # $c is "eax"
&function_end($name);
}
sub bn_sub_words
{
local($name)=@_;
&comment("");
$a="esi";
$b="edi";
$c="eax";
$r="ebx";
$tmp1="ecx";
$tmp2="edx";
$num="ebp";
&xor($c,$c); # clear carry
for ($i=0; $i<8; $i++)
{
&comment("Round $i");
&mov($c,0);
&adc($c,$c);
&adc($c,0);
}
&comment("");
&add($a,32);
&add($b,32);
&add($r,32);
for ($i=0; $i<7; $i++)
{
&comment("Tail Round $i");
&mov($c,0);
&adc($c,$c);
&adc($c,0);
}
# &mov("eax",$c); # $c is "eax"
&function_end($name);
}
{
local($name)=@_;
&comment("");
$a="esi";
$b="edi";
$c="eax";
$r="ebx";
$tmp1="ecx";
$tmp2="edx";
$num="ebp";
&xor($c,$c); # clear carry
for ($i=0; $i<8; $i++)
{
&comment("Round $i");
&mov($c,0);
&adc($c,$c);
&adc($c,0);
}
&comment("");
&add($a,32);
&add($b,32);
&add($r,32);
for ($i=0; $i<7; $i++)
{
&comment("Tail Round $i");
&mov($c,0);
&adc($c,$c);
&adc($c,0);
&add($a, 4);
&add($b, 4);
&add($r, 4);
}
&comment("pw_neg");
for ($i=0; $i<8; $i++)
{
&comment("dl<0 Round $i");
&mov($c,0);
&adc($c,$c);
&adc($c,0);
}
&comment("");
&add($b,32);
&add($r,32);
for ($i=0; $i<7; $i++)
{
&comment("dl<0 Tail Round $i");
&mov($c,0);
&adc($c,$c);
&adc($c,0);
}
for ($i=0; $i<8; $i++)
{
&comment("dl>0 Round $i");
}
&comment("");
&add($a,32);
&add($r,32);
for ($i=0; $i<7; $i++)
{
&comment("dl>0 Tail Round $i");
}
&mov($c,1);
for ($i=0; $i<8; $i++)
{
}
&comment("");
&add($a,32);
&add($r,32);
for ($i=0; $i<7; $i++)
{
}
&mov($c,0);
# &mov("eax",$c); # $c is "eax"
&function_end($name);
}