| OLD | NEW |
| (Empty) |
| 1 #!/usr/local/bin/perl | |
| 2 # x86 assember | |
| 3 | |
| 4 sub mul_add_c | |
| 5 { | |
| 6 local($a,$ai,$b,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_; | |
| 7 | |
| 8 # pos == -1 if eax and edx are pre-loaded, 0 to load from next | |
| 9 # words, and 1 if load return value | |
| 10 | |
| 11 &comment("mul a[$ai]*b[$bi]"); | |
| 12 | |
| 13 # "eax" and "edx" will always be pre-loaded. | |
| 14 # &mov("eax",&DWP($ai*4,$a,"",0)) ; | |
| 15 # &mov("edx",&DWP($bi*4,$b,"",0)); | |
| 16 | |
| 17 &mul("edx"); | |
| 18 &add($c0,"eax"); | |
| 19 &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0; # laod next a | |
| 20 &mov("eax",&wparam(0)) if $pos > 0; # load r[] | |
| 21 ### | |
| 22 &adc($c1,"edx"); | |
| 23 &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 0; # laod next b | |
| 24 &mov("edx",&DWP(($nb)*4,$b,"",0)) if $pos == 1; # laod next b | |
| 25 ### | |
| 26 &adc($c2,0); | |
| 27 # is pos > 1, it means it is the last loop | |
| 28 &mov(&DWP($i*4,"eax","",0),$c0) if $pos > 0; # save r[]; | |
| 29 &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1; # laod next a | |
| 30 } | |
| 31 | |
| 32 sub sqr_add_c | |
| 33 { | |
| 34 local($r,$a,$ai,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_; | |
| 35 | |
| 36 # pos == -1 if eax and edx are pre-loaded, 0 to load from next | |
| 37 # words, and 1 if load return value | |
| 38 | |
| 39 &comment("sqr a[$ai]*a[$bi]"); | |
| 40 | |
| 41 # "eax" and "edx" will always be pre-loaded. | |
| 42 # &mov("eax",&DWP($ai*4,$a,"",0)) ; | |
| 43 # &mov("edx",&DWP($bi*4,$b,"",0)); | |
| 44 | |
| 45 if ($ai == $bi) | |
| 46 { &mul("eax");} | |
| 47 else | |
| 48 { &mul("edx");} | |
| 49 &add($c0,"eax"); | |
| 50 &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0; # load next a | |
| 51 ### | |
| 52 &adc($c1,"edx"); | |
| 53 &mov("edx",&DWP(($nb)*4,$a,"",0)) if ($pos == 1) && ($na != $nb); | |
| 54 ### | |
| 55 &adc($c2,0); | |
| 56 # is pos > 1, it means it is the last loop | |
| 57 &mov(&DWP($i*4,$r,"",0),$c0) if $pos > 0; # save r[]; | |
| 58 &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1; # load next b | |
| 59 } | |
| 60 | |
| 61 sub sqr_add_c2 | |
| 62 { | |
| 63 local($r,$a,$ai,$bi,$c0,$c1,$c2,$pos,$i,$na,$nb)=@_; | |
| 64 | |
| 65 # pos == -1 if eax and edx are pre-loaded, 0 to load from next | |
| 66 # words, and 1 if load return value | |
| 67 | |
| 68 &comment("sqr a[$ai]*a[$bi]"); | |
| 69 | |
| 70 # "eax" and "edx" will always be pre-loaded. | |
| 71 # &mov("eax",&DWP($ai*4,$a,"",0)) ; | |
| 72 # &mov("edx",&DWP($bi*4,$a,"",0)); | |
| 73 | |
| 74 if ($ai == $bi) | |
| 75 { &mul("eax");} | |
| 76 else | |
| 77 { &mul("edx");} | |
| 78 &add("eax","eax"); | |
| 79 ### | |
| 80 &adc("edx","edx"); | |
| 81 ### | |
| 82 &adc($c2,0); | |
| 83 &add($c0,"eax"); | |
| 84 &adc($c1,"edx"); | |
| 85 &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 0; # load next a | |
| 86 &mov("eax",&DWP(($na)*4,$a,"",0)) if $pos == 1; # load next b | |
| 87 &adc($c2,0); | |
| 88 &mov(&DWP($i*4,$r,"",0),$c0) if $pos > 0; # save r[]; | |
| 89 &mov("edx",&DWP(($nb)*4,$a,"",0)) if ($pos <= 1) && ($na != $nb); | |
| 90 ### | |
| 91 } | |
| 92 | |
| 93 sub bn_mul_comba | |
| 94 { | |
| 95 local($name,$num)=@_; | |
| 96 local($a,$b,$c0,$c1,$c2); | |
| 97 local($i,$as,$ae,$bs,$be,$ai,$bi); | |
| 98 local($tot,$end); | |
| 99 | |
| 100 &function_begin_B($name,""); | |
| 101 | |
| 102 $c0="ebx"; | |
| 103 $c1="ecx"; | |
| 104 $c2="ebp"; | |
| 105 $a="esi"; | |
| 106 $b="edi"; | |
| 107 | |
| 108 $as=0; | |
| 109 $ae=0; | |
| 110 $bs=0; | |
| 111 $be=0; | |
| 112 $tot=$num+$num-1; | |
| 113 | |
| 114 &push("esi"); | |
| 115 &mov($a,&wparam(1)); | |
| 116 &push("edi"); | |
| 117 &mov($b,&wparam(2)); | |
| 118 &push("ebp"); | |
| 119 &push("ebx"); | |
| 120 | |
| 121 &xor($c0,$c0); | |
| 122 &mov("eax",&DWP(0,$a,"",0)); # load the first word | |
| 123 &xor($c1,$c1); | |
| 124 &mov("edx",&DWP(0,$b,"",0)); # load the first second | |
| 125 | |
| 126 for ($i=0; $i<$tot; $i++) | |
| 127 { | |
| 128 $ai=$as; | |
| 129 $bi=$bs; | |
| 130 $end=$be+1; | |
| 131 | |
| 132 &comment("################## Calculate word $i"); | |
| 133 | |
| 134 for ($j=$bs; $j<$end; $j++) | |
| 135 { | |
| 136 &xor($c2,$c2) if ($j == $bs); | |
| 137 if (($j+1) == $end) | |
| 138 { | |
| 139 $v=1; | |
| 140 $v=2 if (($i+1) == $tot); | |
| 141 } | |
| 142 else | |
| 143 { $v=0; } | |
| 144 if (($j+1) != $end) | |
| 145 { | |
| 146 $na=($ai-1); | |
| 147 $nb=($bi+1); | |
| 148 } | |
| 149 else | |
| 150 { | |
| 151 $na=$as+($i < ($num-1)); | |
| 152 $nb=$bs+($i >= ($num-1)); | |
| 153 } | |
| 154 #printf STDERR "[$ai,$bi] -> [$na,$nb]\n"; | |
| 155 &mul_add_c($a,$ai,$b,$bi,$c0,$c1,$c2,$v,$i,$na,$nb); | |
| 156 if ($v) | |
| 157 { | |
| 158 &comment("saved r[$i]"); | |
| 159 # &mov("eax",&wparam(0)); | |
| 160 # &mov(&DWP($i*4,"eax","",0),$c0); | |
| 161 ($c0,$c1,$c2)=($c1,$c2,$c0); | |
| 162 } | |
| 163 $ai--; | |
| 164 $bi++; | |
| 165 } | |
| 166 $as++ if ($i < ($num-1)); | |
| 167 $ae++ if ($i >= ($num-1)); | |
| 168 | |
| 169 $bs++ if ($i >= ($num-1)); | |
| 170 $be++ if ($i < ($num-1)); | |
| 171 } | |
| 172 &comment("save r[$i]"); | |
| 173 # &mov("eax",&wparam(0)); | |
| 174 &mov(&DWP($i*4,"eax","",0),$c0); | |
| 175 | |
| 176 &pop("ebx"); | |
| 177 &pop("ebp"); | |
| 178 &pop("edi"); | |
| 179 &pop("esi"); | |
| 180 &ret(); | |
| 181 &function_end_B($name); | |
| 182 } | |
| 183 | |
| 184 sub bn_sqr_comba | |
| 185 { | |
| 186 local($name,$num)=@_; | |
| 187 local($r,$a,$c0,$c1,$c2)=@_; | |
| 188 local($i,$as,$ae,$bs,$be,$ai,$bi); | |
| 189 local($b,$tot,$end,$half); | |
| 190 | |
| 191 &function_begin_B($name,""); | |
| 192 | |
| 193 $c0="ebx"; | |
| 194 $c1="ecx"; | |
| 195 $c2="ebp"; | |
| 196 $a="esi"; | |
| 197 $r="edi"; | |
| 198 | |
| 199 &push("esi"); | |
| 200 &push("edi"); | |
| 201 &push("ebp"); | |
| 202 &push("ebx"); | |
| 203 &mov($r,&wparam(0)); | |
| 204 &mov($a,&wparam(1)); | |
| 205 &xor($c0,$c0); | |
| 206 &xor($c1,$c1); | |
| 207 &mov("eax",&DWP(0,$a,"",0)); # load the first word | |
| 208 | |
| 209 $as=0; | |
| 210 $ae=0; | |
| 211 $bs=0; | |
| 212 $be=0; | |
| 213 $tot=$num+$num-1; | |
| 214 | |
| 215 for ($i=0; $i<$tot; $i++) | |
| 216 { | |
| 217 $ai=$as; | |
| 218 $bi=$bs; | |
| 219 $end=$be+1; | |
| 220 | |
| 221 &comment("############### Calculate word $i"); | |
| 222 for ($j=$bs; $j<$end; $j++) | |
| 223 { | |
| 224 &xor($c2,$c2) if ($j == $bs); | |
| 225 if (($ai-1) < ($bi+1)) | |
| 226 { | |
| 227 $v=1; | |
| 228 $v=2 if ($i+1) == $tot; | |
| 229 } | |
| 230 else | |
| 231 { $v=0; } | |
| 232 if (!$v) | |
| 233 { | |
| 234 $na=$ai-1; | |
| 235 $nb=$bi+1; | |
| 236 } | |
| 237 else | |
| 238 { | |
| 239 $na=$as+($i < ($num-1)); | |
| 240 $nb=$bs+($i >= ($num-1)); | |
| 241 } | |
| 242 if ($ai == $bi) | |
| 243 { | |
| 244 &sqr_add_c($r,$a,$ai,$bi, | |
| 245 $c0,$c1,$c2,$v,$i,$na,$nb); | |
| 246 } | |
| 247 else | |
| 248 { | |
| 249 &sqr_add_c2($r,$a,$ai,$bi, | |
| 250 $c0,$c1,$c2,$v,$i,$na,$nb); | |
| 251 } | |
| 252 if ($v) | |
| 253 { | |
| 254 &comment("saved r[$i]"); | |
| 255 #&mov(&DWP($i*4,$r,"",0),$c0); | |
| 256 ($c0,$c1,$c2)=($c1,$c2,$c0); | |
| 257 last; | |
| 258 } | |
| 259 $ai--; | |
| 260 $bi++; | |
| 261 } | |
| 262 $as++ if ($i < ($num-1)); | |
| 263 $ae++ if ($i >= ($num-1)); | |
| 264 | |
| 265 $bs++ if ($i >= ($num-1)); | |
| 266 $be++ if ($i < ($num-1)); | |
| 267 } | |
| 268 &mov(&DWP($i*4,$r,"",0),$c0); | |
| 269 &pop("ebx"); | |
| 270 &pop("ebp"); | |
| 271 &pop("edi"); | |
| 272 &pop("esi"); | |
| 273 &ret(); | |
| 274 &function_end_B($name); | |
| 275 } | |
| 276 | |
| 277 1; | |
| OLD | NEW |