1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#!/usr/local/bin/perl 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 3221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; 4221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrompush(@INC,"${dir}","${dir}../../perlasm"); 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectrequire "x86asm.pl"; 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&asm_init($ARGV[0],$0); 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&bn_mul_comba("bn_mul_comba8",8); 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&bn_mul_comba("bn_mul_comba4",4); 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&bn_sqr_comba("bn_sqr_comba8",8); 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&bn_sqr_comba("bn_sqr_comba4",4); 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&asm_finish(); 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub mul_add_c 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($a,$ai,$b,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_; 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # pos == -1 if eax and edx are pre-loaded, 0 to load from next 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # words, and 1 if load return value 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment("mul a[$ai]*b[$bi]"); 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # "eax" and "edx" will always be pre-loaded. 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # &mov("eax",&DWP($ai*4,$a,"",0)) ; 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # &mov("edx",&DWP($bi*4,$b,"",0)); 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mul("edx"); 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &add($c0,"eax"); 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0; # laod next a 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("eax",&wparam(0)) if $pos > 0; # load r[] 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ### 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &adc($c1,"edx"); 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 0; # laod next b 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 1; # laod next b 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ### 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &adc($c2,0); 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # is pos > 1, it means it is the last loop 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov(&DWP($i*4,"eax","",0),$c0) if $pos > 0; # save r[]; 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1; # laod next a 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub sqr_add_c 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($r,$a,$ai,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_; 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # pos == -1 if eax and edx are pre-loaded, 0 to load from next 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # words, and 1 if load return value 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment("sqr a[$ai]*a[$bi]"); 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # "eax" and "edx" will always be pre-loaded. 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # &mov("eax",&DWP($ai*4,$a,"",0)) ; 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # &mov("edx",&DWP($bi*4,$b,"",0)); 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($ai == $bi) 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { &mul("eax");} 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { &mul("edx");} 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &add($c0,"eax"); 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0; # load next a 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ### 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &adc($c1,"edx"); 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("edx",&DWP(($nb)*4,$a,"",0)) if ($pos == 1) && ($na != $nb); 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ### 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &adc($c2,0); 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # is pos > 1, it means it is the last loop 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov(&DWP($i*4,$r,"",0),$c0) if $pos > 0; # save r[]; 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1; # load next b 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub sqr_add_c2 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($r,$a,$ai,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_; 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # pos == -1 if eax and edx are pre-loaded, 0 to load from next 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # words, and 1 if load return value 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment("sqr a[$ai]*a[$bi]"); 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # "eax" and "edx" will always be pre-loaded. 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # &mov("eax",&DWP($ai*4,$a,"",0)) ; 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # &mov("edx",&DWP($bi*4,$a,"",0)); 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($ai == $bi) 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { &mul("eax");} 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { &mul("edx");} 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &add("eax","eax"); 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ### 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &adc("edx","edx"); 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ### 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &adc($c2,0); 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &add($c0,"eax"); 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &adc($c1,"edx"); 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0; # load next a 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1; # load next b 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &adc($c2,0); 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov(&DWP($i*4,$r,"",0),$c0) if $pos > 0; # save r[]; 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("edx",&DWP(($nb)*4,$a,"",0)) if ($pos <= 1) && ($na != $nb); 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ### 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub bn_mul_comba 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($name,$num)=@_; 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($a,$b,$c0,$c1,$c2); 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($i,$as,$ae,$bs,$be,$ai,$bi); 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($tot,$end); 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &function_begin_B($name,""); 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $c0="ebx"; 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $c1="ecx"; 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $c2="ebp"; 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $a="esi"; 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $b="edi"; 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $as=0; 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $ae=0; 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $bs=0; 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $be=0; 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tot=$num+$num-1; 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &push("esi"); 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($a,&wparam(1)); 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &push("edi"); 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($b,&wparam(2)); 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &push("ebp"); 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &push("ebx"); 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor($c0,$c0); 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("eax",&DWP(0,$a,"",0)); # load the first word 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor($c1,$c1); 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("edx",&DWP(0,$b,"",0)); # load the first second 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for ($i=0; $i<$tot; $i++) 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $ai=$as; 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $bi=$bs; 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $end=$be+1; 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment("################## Calculate word $i"); 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for ($j=$bs; $j<$end; $j++) 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor($c2,$c2) if ($j == $bs); 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (($j+1) == $end) 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $v=1; 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $v=2 if (($i+1) == $tot); 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { $v=0; } 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (($j+1) != $end) 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $na=($ai-1); 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $nb=($bi+1); 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $na=$as+($i < ($num-1)); 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $nb=$bs+($i >= ($num-1)); 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#printf STDERR "[$ai,$bi] -> [$na,$nb]\n"; 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mul_add_c($a,$ai,$b,$bi,$c0,$c1,$c2,$v,$i,$na,$nb); 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($v) 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment("saved r[$i]"); 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # &mov("eax",&wparam(0)); 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # &mov(&DWP($i*4,"eax","",0),$c0); 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ($c0,$c1,$c2)=($c1,$c2,$c0); 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $ai--; 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $bi++; 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $as++ if ($i < ($num-1)); 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $ae++ if ($i >= ($num-1)); 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $bs++ if ($i >= ($num-1)); 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $be++ if ($i < ($num-1)); 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment("save r[$i]"); 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # &mov("eax",&wparam(0)); 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov(&DWP($i*4,"eax","",0),$c0); 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &pop("ebx"); 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &pop("ebp"); 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &pop("edi"); 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &pop("esi"); 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &ret(); 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &function_end_B($name); 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub bn_sqr_comba 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($name,$num)=@_; 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($r,$a,$c0,$c1,$c2)=@_; 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($i,$as,$ae,$bs,$be,$ai,$bi); 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($b,$tot,$end,$half); 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &function_begin_B($name,""); 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $c0="ebx"; 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $c1="ecx"; 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $c2="ebp"; 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $a="esi"; 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $r="edi"; 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &push("esi"); 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &push("edi"); 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &push("ebp"); 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &push("ebx"); 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($r,&wparam(0)); 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($a,&wparam(1)); 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor($c0,$c0); 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor($c1,$c1); 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("eax",&DWP(0,$a,"",0)); # load the first word 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $as=0; 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $ae=0; 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $bs=0; 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $be=0; 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tot=$num+$num-1; 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for ($i=0; $i<$tot; $i++) 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $ai=$as; 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $bi=$bs; 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $end=$be+1; 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment("############### Calculate word $i"); 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for ($j=$bs; $j<$end; $j++) 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor($c2,$c2) if ($j == $bs); 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (($ai-1) < ($bi+1)) 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $v=1; 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $v=2 if ($i+1) == $tot; 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { $v=0; } 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!$v) 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $na=$ai-1; 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $nb=$bi+1; 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $na=$as+($i < ($num-1)); 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $nb=$bs+($i >= ($num-1)); 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($ai == $bi) 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &sqr_add_c($r,$a,$ai,$bi, 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $c0,$c1,$c2,$v,$i,$na,$nb); 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &sqr_add_c2($r,$a,$ai,$bi, 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $c0,$c1,$c2,$v,$i,$na,$nb); 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($v) 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment("saved r[$i]"); 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project #&mov(&DWP($i*4,$r,"",0),$c0); 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ($c0,$c1,$c2)=($c1,$c2,$c0); 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project last; 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $ai--; 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $bi++; 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $as++ if ($i < ($num-1)); 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $ae++ if ($i >= ($num-1)); 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $bs++ if ($i >= ($num-1)); 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $be++ if ($i < ($num-1)); 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov(&DWP($i*4,$r,"",0),$c0); 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &pop("ebx"); 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &pop("ebp"); 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &pop("edi"); 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &pop("esi"); 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &ret(); 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &function_end_B($name); 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 288