1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#!/usr/local/bin/perl 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# x86 assember 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub bn_add_words 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($name)=@_; 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &function_begin($name,""); 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment(""); 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $a="esi"; 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $b="edi"; 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $c="eax"; 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $r="ebx"; 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp1="ecx"; 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp2="edx"; 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $num="ebp"; 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($r,&wparam(0)); # get r 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($a,&wparam(1)); # get a 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($b,&wparam(2)); # get b 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($num,&wparam(3)); # get num 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor($c,$c); # clear carry 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &and($num,0xfffffff8); # num / 8 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &jz(&label("aw_finish")); 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &set_label("aw_loop",0); 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for ($i=0; $i<8; $i++) 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment("Round $i"); 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($tmp1,&DWP($i*4,$a,"",0)); # *a 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($tmp2,&DWP($i*4,$b,"",0)); # *b 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &add($tmp1,$c); 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($c,0); 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &adc($c,$c); 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &add($tmp1,$tmp2); 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &adc($c,0); 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov(&DWP($i*4,$r,"",0),$tmp1); # *r 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment(""); 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &add($a,32); 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &add($b,32); 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &add($r,32); 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &sub($num,8); 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &jnz(&label("aw_loop")); 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &set_label("aw_finish",0); 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($num,&wparam(3)); # get num 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &and($num,7); 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &jz(&label("aw_end")); 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for ($i=0; $i<7; $i++) 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment("Tail Round $i"); 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($tmp1,&DWP($i*4,$a,"",0)); # *a 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($tmp2,&DWP($i*4,$b,"",0));# *b 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &add($tmp1,$c); 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($c,0); 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &adc($c,$c); 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &add($tmp1,$tmp2); 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &adc($c,0); 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &dec($num) if ($i != 6); 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov(&DWP($i*4,$r,"",0),$tmp1); # *a 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &jz(&label("aw_end")) if ($i != 6); 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &set_label("aw_end",0); 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# &mov("eax",$c); # $c is "eax" 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &function_end($name); 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project1; 77