diff options
author | Parménides GV <parmegv@sdf.org> | 2014-04-09 17:07:48 +0200 |
---|---|---|
committer | Parménides GV <parmegv@sdf.org> | 2014-04-09 17:15:17 +0200 |
commit | 51ff5a18f1f074e27e97d822745551a7e8fa068d (patch) | |
tree | 402e7dd42778a218635bb29a4c2dff93ea7f6525 /app/openssl/crypto/bn/asm/x86/mul.pl | |
parent | 910b0e1746ab3f63e63808b198ad51fec5b635e5 (diff) | |
parent | b5ba0abc1610dd4bf573ebcabc5e8f6ab0c9528f (diff) |
Merge branch 'feature/implement-gradle-build-system-#4676' into develop
Diffstat (limited to 'app/openssl/crypto/bn/asm/x86/mul.pl')
-rw-r--r-- | app/openssl/crypto/bn/asm/x86/mul.pl | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/app/openssl/crypto/bn/asm/x86/mul.pl b/app/openssl/crypto/bn/asm/x86/mul.pl new file mode 100644 index 00000000..674cb9b0 --- /dev/null +++ b/app/openssl/crypto/bn/asm/x86/mul.pl @@ -0,0 +1,77 @@ +#!/usr/local/bin/perl +# x86 assember + +sub bn_mul_words + { + local($name)=@_; + + &function_begin($name,""); + + &comment(""); + $Low="eax"; + $High="edx"; + $a="ebx"; + $w="ecx"; + $r="edi"; + $c="esi"; + $num="ebp"; + + &xor($c,$c); # clear carry + &mov($r,&wparam(0)); # + &mov($a,&wparam(1)); # + &mov($num,&wparam(2)); # + &mov($w,&wparam(3)); # + + &and($num,0xfffffff8); # num / 8 + &jz(&label("mw_finish")); + + &set_label("mw_loop",0); + for ($i=0; $i<32; $i+=4) + { + &comment("Round $i"); + + &mov("eax",&DWP($i,$a,"",0)); # *a + &mul($w); # *a * w + &add("eax",$c); # L(t)+=c + # XXX + + &adc("edx",0); # H(t)+=carry + &mov(&DWP($i,$r,"",0),"eax"); # *r= L(t); + + &mov($c,"edx"); # c= H(t); + } + + &comment(""); + &add($a,32); + &add($r,32); + &sub($num,8); + &jz(&label("mw_finish")); + &jmp(&label("mw_loop")); + + &set_label("mw_finish",0); + &mov($num,&wparam(2)); # get num + &and($num,7); + &jnz(&label("mw_finish2")); + &jmp(&label("mw_end")); + + &set_label("mw_finish2",1); + for ($i=0; $i<7; $i++) + { + &comment("Tail Round $i"); + &mov("eax",&DWP($i*4,$a,"",0));# *a + &mul($w); # *a * w + &add("eax",$c); # L(t)+=c + # XXX + &adc("edx",0); # H(t)+=carry + &mov(&DWP($i*4,$r,"",0),"eax");# *r= L(t); + &mov($c,"edx"); # c= H(t); + &dec($num) if ($i != 7-1); + &jz(&label("mw_end")) if ($i != 7-1); + } + &set_label("mw_end",0); + &mov("eax",$c); + + &function_end($name); + } + +1; |