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