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