1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#!/usr/local/bin/perl 2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org# x86 assember 3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgsub bn_mul_words 5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org local($name)=@_; 7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &function_begin($name,""); 9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment(""); 11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org $Low="eax"; 12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org $High="edx"; 13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org $a="ebx"; 14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org $w="ecx"; 15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org $r="edi"; 16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org $c="esi"; 17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org $num="ebp"; 18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &xor($c,$c); # clear carry 20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov($r,&wparam(0)); # 21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov($a,&wparam(1)); # 22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov($num,&wparam(2)); # 23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov($w,&wparam(3)); # 24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &and($num,0xfffffff8); # num / 8 26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &jz(&label("mw_finish")); 27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &set_label("mw_loop",0); 29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for ($i=0; $i<32; $i+=4) 30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment("Round $i"); 32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov("eax",&DWP($i,$a,"",0)); # *a 34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mul($w); # *a * w 35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &add("eax",$c); # L(t)+=c 36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org # XXX 37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &adc("edx",0); # H(t)+=carry 39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov(&DWP($i,$r,"",0),"eax"); # *r= L(t); 40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov($c,"edx"); # c= H(t); 42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment(""); 45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &add($a,32); 46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &add($r,32); 47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &sub($num,8); 48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &jz(&label("mw_finish")); 49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &jmp(&label("mw_loop")); 50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &set_label("mw_finish",0); 52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov($num,&wparam(2)); # get num 53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &and($num,7); 54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &jnz(&label("mw_finish2")); 55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &jmp(&label("mw_end")); 56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &set_label("mw_finish2",1); 58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for ($i=0; $i<7; $i++) 59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment("Tail Round $i"); 61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov("eax",&DWP($i*4,$a,"",0));# *a 62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mul($w); # *a * w 63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &add("eax",$c); # L(t)+=c 64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org # XXX 65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &adc("edx",0); # H(t)+=carry 66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov(&DWP($i*4,$r,"",0),"eax");# *r= L(t); 67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov($c,"edx"); # c= H(t); 68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &dec($num) if ($i != 7-1); 69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &jz(&label("mw_end")) if ($i != 7-1); 70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &set_label("mw_end",0); 72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov("eax",$c); 73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &function_end($name); 75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org1; 78