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