mp_comba.c (79362B)
1 /* 2 * The below file is derived from TFM v0.03. 3 * It contains code from fp_mul_comba.c and 4 * fp_sqr_comba.c, which contained the following license. 5 * 6 * Right now, the assembly in this file limits 7 * this code to AMD 64. 8 * 9 * This file is public domain. 10 */ 11 12 /* TomsFastMath, a fast ISO C bignum library. 13 * 14 * This project is meant to fill in where LibTomMath 15 * falls short. That is speed ;-) 16 * 17 * This project is public domain and free for all purposes. 18 * 19 * Tom St Denis, tomstdenis@iahu.ca 20 */ 21 22 #include "mpi-priv.h" 23 24 /* clamp digits */ 25 #define mp_clamp(a) \ 26 { \ 27 while ((a)->used && (a)->dp[(a)->used - 1] == 0) \ 28 --((a)->used); \ 29 (a)->sign = (a)->used ? (a)->sign : ZPOS; \ 30 } 31 32 /* anything you need at the start */ 33 #define COMBA_START 34 35 /* clear the chaining variables */ 36 #define COMBA_CLEAR \ 37 c0 = c1 = c2 = 0; 38 39 /* forward the carry to the next digit */ 40 #define COMBA_FORWARD \ 41 do { \ 42 c0 = c1; \ 43 c1 = c2; \ 44 c2 = 0; \ 45 } while (0); 46 47 /* anything you need at the end */ 48 #define COMBA_FINI 49 50 /* this should multiply i and j */ 51 #define MULADD(i, j) \ 52 __asm__( \ 53 "movq %6,%%rax \n\t" \ 54 "mulq %7 \n\t" \ 55 "addq %%rax,%0 \n\t" \ 56 "adcq %%rdx,%1 \n\t" \ 57 "adcq $0,%2 \n\t" \ 58 : "=r"(c0), "=r"(c1), "=r"(c2) \ 59 : "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) \ 60 : "%rax", "%rdx", "cc"); 61 62 /* sqr macros only */ 63 #define CLEAR_CARRY \ 64 c0 = c1 = c2 = 0; 65 66 #define COMBA_STORE(x) \ 67 x = c0; 68 69 #define COMBA_STORE2(x) \ 70 x = c1; 71 72 #define CARRY_FORWARD \ 73 do { \ 74 c0 = c1; \ 75 c1 = c2; \ 76 c2 = 0; \ 77 } while (0); 78 79 #define COMBA_FINI 80 81 #define SQRADD(i, j) \ 82 __asm__( \ 83 "movq %6,%%rax \n\t" \ 84 "mulq %%rax \n\t" \ 85 "addq %%rax,%0 \n\t" \ 86 "adcq %%rdx,%1 \n\t" \ 87 "adcq $0,%2 \n\t" \ 88 : "=r"(c0), "=r"(c1), "=r"(c2) \ 89 : "0"(c0), "1"(c1), "2"(c2), "g"(i) \ 90 : "%rax", "%rdx", "cc"); 91 92 #define SQRADD2(i, j) \ 93 __asm__( \ 94 "movq %6,%%rax \n\t" \ 95 "mulq %7 \n\t" \ 96 "addq %%rax,%0 \n\t" \ 97 "adcq %%rdx,%1 \n\t" \ 98 "adcq $0,%2 \n\t" \ 99 "addq %%rax,%0 \n\t" \ 100 "adcq %%rdx,%1 \n\t" \ 101 "adcq $0,%2 \n\t" \ 102 : "=r"(c0), "=r"(c1), "=r"(c2) \ 103 : "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) \ 104 : "%rax", "%rdx", "cc"); 105 106 #define SQRADDSC(i, j) \ 107 __asm__( \ 108 "movq %3,%%rax \n\t" \ 109 "mulq %4 \n\t" \ 110 "movq %%rax,%0 \n\t" \ 111 "movq %%rdx,%1 \n\t" \ 112 "xorq %2,%2 \n\t" \ 113 : "=r"(sc0), "=r"(sc1), "=r"(sc2) \ 114 : "g"(i), "g"(j) \ 115 : "%rax", "%rdx", "cc"); 116 117 #define SQRADDAC(i, j) \ 118 __asm__( \ 119 "movq %6,%%rax \n\t" \ 120 "mulq %7 \n\t" \ 121 "addq %%rax,%0 \n\t" \ 122 "adcq %%rdx,%1 \n\t" \ 123 "adcq $0,%2 \n\t" \ 124 : "=r"(sc0), "=r"(sc1), "=r"(sc2) \ 125 : "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) \ 126 : "%rax", "%rdx", "cc"); 127 128 #define SQRADDDB \ 129 __asm__( \ 130 "addq %6,%0 \n\t" \ 131 "adcq %7,%1 \n\t" \ 132 "adcq %8,%2 \n\t" \ 133 "addq %6,%0 \n\t" \ 134 "adcq %7,%1 \n\t" \ 135 "adcq %8,%2 \n\t" \ 136 : "=&r"(c0), "=&r"(c1), "=&r"(c2) \ 137 : "0"(c0), "1"(c1), "2"(c2), "r"(sc0), "r"(sc1), "r"(sc2) \ 138 : "cc"); 139 140 void 141 s_mp_mul_comba_4(const mp_int *A, const mp_int *B, mp_int *C) 142 { 143 mp_digit c0, c1, c2, at[8]; 144 145 memcpy(at, A->dp, 4 * sizeof(mp_digit)); 146 memcpy(at + 4, B->dp, 4 * sizeof(mp_digit)); 147 COMBA_START; 148 149 COMBA_CLEAR; 150 /* 0 */ 151 MULADD(at[0], at[4]); 152 COMBA_STORE(C->dp[0]); 153 /* 1 */ 154 COMBA_FORWARD; 155 MULADD(at[0], at[5]); 156 MULADD(at[1], at[4]); 157 COMBA_STORE(C->dp[1]); 158 /* 2 */ 159 COMBA_FORWARD; 160 MULADD(at[0], at[6]); 161 MULADD(at[1], at[5]); 162 MULADD(at[2], at[4]); 163 COMBA_STORE(C->dp[2]); 164 /* 3 */ 165 COMBA_FORWARD; 166 MULADD(at[0], at[7]); 167 MULADD(at[1], at[6]); 168 MULADD(at[2], at[5]); 169 MULADD(at[3], at[4]); 170 COMBA_STORE(C->dp[3]); 171 /* 4 */ 172 COMBA_FORWARD; 173 MULADD(at[1], at[7]); 174 MULADD(at[2], at[6]); 175 MULADD(at[3], at[5]); 176 COMBA_STORE(C->dp[4]); 177 /* 5 */ 178 COMBA_FORWARD; 179 MULADD(at[2], at[7]); 180 MULADD(at[3], at[6]); 181 COMBA_STORE(C->dp[5]); 182 /* 6 */ 183 COMBA_FORWARD; 184 MULADD(at[3], at[7]); 185 COMBA_STORE(C->dp[6]); 186 COMBA_STORE2(C->dp[7]); 187 C->used = 8; 188 C->sign = A->sign ^ B->sign; 189 mp_clamp(C); 190 COMBA_FINI; 191 } 192 193 void 194 s_mp_mul_comba_8(const mp_int *A, const mp_int *B, mp_int *C) 195 { 196 mp_digit c0, c1, c2, at[16]; 197 198 memcpy(at, A->dp, 8 * sizeof(mp_digit)); 199 memcpy(at + 8, B->dp, 8 * sizeof(mp_digit)); 200 COMBA_START; 201 202 COMBA_CLEAR; 203 /* 0 */ 204 MULADD(at[0], at[8]); 205 COMBA_STORE(C->dp[0]); 206 /* 1 */ 207 COMBA_FORWARD; 208 MULADD(at[0], at[9]); 209 MULADD(at[1], at[8]); 210 COMBA_STORE(C->dp[1]); 211 /* 2 */ 212 COMBA_FORWARD; 213 MULADD(at[0], at[10]); 214 MULADD(at[1], at[9]); 215 MULADD(at[2], at[8]); 216 COMBA_STORE(C->dp[2]); 217 /* 3 */ 218 COMBA_FORWARD; 219 MULADD(at[0], at[11]); 220 MULADD(at[1], at[10]); 221 MULADD(at[2], at[9]); 222 MULADD(at[3], at[8]); 223 COMBA_STORE(C->dp[3]); 224 /* 4 */ 225 COMBA_FORWARD; 226 MULADD(at[0], at[12]); 227 MULADD(at[1], at[11]); 228 MULADD(at[2], at[10]); 229 MULADD(at[3], at[9]); 230 MULADD(at[4], at[8]); 231 COMBA_STORE(C->dp[4]); 232 /* 5 */ 233 COMBA_FORWARD; 234 MULADD(at[0], at[13]); 235 MULADD(at[1], at[12]); 236 MULADD(at[2], at[11]); 237 MULADD(at[3], at[10]); 238 MULADD(at[4], at[9]); 239 MULADD(at[5], at[8]); 240 COMBA_STORE(C->dp[5]); 241 /* 6 */ 242 COMBA_FORWARD; 243 MULADD(at[0], at[14]); 244 MULADD(at[1], at[13]); 245 MULADD(at[2], at[12]); 246 MULADD(at[3], at[11]); 247 MULADD(at[4], at[10]); 248 MULADD(at[5], at[9]); 249 MULADD(at[6], at[8]); 250 COMBA_STORE(C->dp[6]); 251 /* 7 */ 252 COMBA_FORWARD; 253 MULADD(at[0], at[15]); 254 MULADD(at[1], at[14]); 255 MULADD(at[2], at[13]); 256 MULADD(at[3], at[12]); 257 MULADD(at[4], at[11]); 258 MULADD(at[5], at[10]); 259 MULADD(at[6], at[9]); 260 MULADD(at[7], at[8]); 261 COMBA_STORE(C->dp[7]); 262 /* 8 */ 263 COMBA_FORWARD; 264 MULADD(at[1], at[15]); 265 MULADD(at[2], at[14]); 266 MULADD(at[3], at[13]); 267 MULADD(at[4], at[12]); 268 MULADD(at[5], at[11]); 269 MULADD(at[6], at[10]); 270 MULADD(at[7], at[9]); 271 COMBA_STORE(C->dp[8]); 272 /* 9 */ 273 COMBA_FORWARD; 274 MULADD(at[2], at[15]); 275 MULADD(at[3], at[14]); 276 MULADD(at[4], at[13]); 277 MULADD(at[5], at[12]); 278 MULADD(at[6], at[11]); 279 MULADD(at[7], at[10]); 280 COMBA_STORE(C->dp[9]); 281 /* 10 */ 282 COMBA_FORWARD; 283 MULADD(at[3], at[15]); 284 MULADD(at[4], at[14]); 285 MULADD(at[5], at[13]); 286 MULADD(at[6], at[12]); 287 MULADD(at[7], at[11]); 288 COMBA_STORE(C->dp[10]); 289 /* 11 */ 290 COMBA_FORWARD; 291 MULADD(at[4], at[15]); 292 MULADD(at[5], at[14]); 293 MULADD(at[6], at[13]); 294 MULADD(at[7], at[12]); 295 COMBA_STORE(C->dp[11]); 296 /* 12 */ 297 COMBA_FORWARD; 298 MULADD(at[5], at[15]); 299 MULADD(at[6], at[14]); 300 MULADD(at[7], at[13]); 301 COMBA_STORE(C->dp[12]); 302 /* 13 */ 303 COMBA_FORWARD; 304 MULADD(at[6], at[15]); 305 MULADD(at[7], at[14]); 306 COMBA_STORE(C->dp[13]); 307 /* 14 */ 308 COMBA_FORWARD; 309 MULADD(at[7], at[15]); 310 COMBA_STORE(C->dp[14]); 311 COMBA_STORE2(C->dp[15]); 312 C->used = 16; 313 C->sign = A->sign ^ B->sign; 314 mp_clamp(C); 315 COMBA_FINI; 316 } 317 318 void 319 s_mp_mul_comba_16(const mp_int *A, const mp_int *B, mp_int *C) 320 { 321 mp_digit c0, c1, c2, at[32]; 322 323 memcpy(at, A->dp, 16 * sizeof(mp_digit)); 324 memcpy(at + 16, B->dp, 16 * sizeof(mp_digit)); 325 COMBA_START; 326 327 COMBA_CLEAR; 328 /* 0 */ 329 MULADD(at[0], at[16]); 330 COMBA_STORE(C->dp[0]); 331 /* 1 */ 332 COMBA_FORWARD; 333 MULADD(at[0], at[17]); 334 MULADD(at[1], at[16]); 335 COMBA_STORE(C->dp[1]); 336 /* 2 */ 337 COMBA_FORWARD; 338 MULADD(at[0], at[18]); 339 MULADD(at[1], at[17]); 340 MULADD(at[2], at[16]); 341 COMBA_STORE(C->dp[2]); 342 /* 3 */ 343 COMBA_FORWARD; 344 MULADD(at[0], at[19]); 345 MULADD(at[1], at[18]); 346 MULADD(at[2], at[17]); 347 MULADD(at[3], at[16]); 348 COMBA_STORE(C->dp[3]); 349 /* 4 */ 350 COMBA_FORWARD; 351 MULADD(at[0], at[20]); 352 MULADD(at[1], at[19]); 353 MULADD(at[2], at[18]); 354 MULADD(at[3], at[17]); 355 MULADD(at[4], at[16]); 356 COMBA_STORE(C->dp[4]); 357 /* 5 */ 358 COMBA_FORWARD; 359 MULADD(at[0], at[21]); 360 MULADD(at[1], at[20]); 361 MULADD(at[2], at[19]); 362 MULADD(at[3], at[18]); 363 MULADD(at[4], at[17]); 364 MULADD(at[5], at[16]); 365 COMBA_STORE(C->dp[5]); 366 /* 6 */ 367 COMBA_FORWARD; 368 MULADD(at[0], at[22]); 369 MULADD(at[1], at[21]); 370 MULADD(at[2], at[20]); 371 MULADD(at[3], at[19]); 372 MULADD(at[4], at[18]); 373 MULADD(at[5], at[17]); 374 MULADD(at[6], at[16]); 375 COMBA_STORE(C->dp[6]); 376 /* 7 */ 377 COMBA_FORWARD; 378 MULADD(at[0], at[23]); 379 MULADD(at[1], at[22]); 380 MULADD(at[2], at[21]); 381 MULADD(at[3], at[20]); 382 MULADD(at[4], at[19]); 383 MULADD(at[5], at[18]); 384 MULADD(at[6], at[17]); 385 MULADD(at[7], at[16]); 386 COMBA_STORE(C->dp[7]); 387 /* 8 */ 388 COMBA_FORWARD; 389 MULADD(at[0], at[24]); 390 MULADD(at[1], at[23]); 391 MULADD(at[2], at[22]); 392 MULADD(at[3], at[21]); 393 MULADD(at[4], at[20]); 394 MULADD(at[5], at[19]); 395 MULADD(at[6], at[18]); 396 MULADD(at[7], at[17]); 397 MULADD(at[8], at[16]); 398 COMBA_STORE(C->dp[8]); 399 /* 9 */ 400 COMBA_FORWARD; 401 MULADD(at[0], at[25]); 402 MULADD(at[1], at[24]); 403 MULADD(at[2], at[23]); 404 MULADD(at[3], at[22]); 405 MULADD(at[4], at[21]); 406 MULADD(at[5], at[20]); 407 MULADD(at[6], at[19]); 408 MULADD(at[7], at[18]); 409 MULADD(at[8], at[17]); 410 MULADD(at[9], at[16]); 411 COMBA_STORE(C->dp[9]); 412 /* 10 */ 413 COMBA_FORWARD; 414 MULADD(at[0], at[26]); 415 MULADD(at[1], at[25]); 416 MULADD(at[2], at[24]); 417 MULADD(at[3], at[23]); 418 MULADD(at[4], at[22]); 419 MULADD(at[5], at[21]); 420 MULADD(at[6], at[20]); 421 MULADD(at[7], at[19]); 422 MULADD(at[8], at[18]); 423 MULADD(at[9], at[17]); 424 MULADD(at[10], at[16]); 425 COMBA_STORE(C->dp[10]); 426 /* 11 */ 427 COMBA_FORWARD; 428 MULADD(at[0], at[27]); 429 MULADD(at[1], at[26]); 430 MULADD(at[2], at[25]); 431 MULADD(at[3], at[24]); 432 MULADD(at[4], at[23]); 433 MULADD(at[5], at[22]); 434 MULADD(at[6], at[21]); 435 MULADD(at[7], at[20]); 436 MULADD(at[8], at[19]); 437 MULADD(at[9], at[18]); 438 MULADD(at[10], at[17]); 439 MULADD(at[11], at[16]); 440 COMBA_STORE(C->dp[11]); 441 /* 12 */ 442 COMBA_FORWARD; 443 MULADD(at[0], at[28]); 444 MULADD(at[1], at[27]); 445 MULADD(at[2], at[26]); 446 MULADD(at[3], at[25]); 447 MULADD(at[4], at[24]); 448 MULADD(at[5], at[23]); 449 MULADD(at[6], at[22]); 450 MULADD(at[7], at[21]); 451 MULADD(at[8], at[20]); 452 MULADD(at[9], at[19]); 453 MULADD(at[10], at[18]); 454 MULADD(at[11], at[17]); 455 MULADD(at[12], at[16]); 456 COMBA_STORE(C->dp[12]); 457 /* 13 */ 458 COMBA_FORWARD; 459 MULADD(at[0], at[29]); 460 MULADD(at[1], at[28]); 461 MULADD(at[2], at[27]); 462 MULADD(at[3], at[26]); 463 MULADD(at[4], at[25]); 464 MULADD(at[5], at[24]); 465 MULADD(at[6], at[23]); 466 MULADD(at[7], at[22]); 467 MULADD(at[8], at[21]); 468 MULADD(at[9], at[20]); 469 MULADD(at[10], at[19]); 470 MULADD(at[11], at[18]); 471 MULADD(at[12], at[17]); 472 MULADD(at[13], at[16]); 473 COMBA_STORE(C->dp[13]); 474 /* 14 */ 475 COMBA_FORWARD; 476 MULADD(at[0], at[30]); 477 MULADD(at[1], at[29]); 478 MULADD(at[2], at[28]); 479 MULADD(at[3], at[27]); 480 MULADD(at[4], at[26]); 481 MULADD(at[5], at[25]); 482 MULADD(at[6], at[24]); 483 MULADD(at[7], at[23]); 484 MULADD(at[8], at[22]); 485 MULADD(at[9], at[21]); 486 MULADD(at[10], at[20]); 487 MULADD(at[11], at[19]); 488 MULADD(at[12], at[18]); 489 MULADD(at[13], at[17]); 490 MULADD(at[14], at[16]); 491 COMBA_STORE(C->dp[14]); 492 /* 15 */ 493 COMBA_FORWARD; 494 MULADD(at[0], at[31]); 495 MULADD(at[1], at[30]); 496 MULADD(at[2], at[29]); 497 MULADD(at[3], at[28]); 498 MULADD(at[4], at[27]); 499 MULADD(at[5], at[26]); 500 MULADD(at[6], at[25]); 501 MULADD(at[7], at[24]); 502 MULADD(at[8], at[23]); 503 MULADD(at[9], at[22]); 504 MULADD(at[10], at[21]); 505 MULADD(at[11], at[20]); 506 MULADD(at[12], at[19]); 507 MULADD(at[13], at[18]); 508 MULADD(at[14], at[17]); 509 MULADD(at[15], at[16]); 510 COMBA_STORE(C->dp[15]); 511 /* 16 */ 512 COMBA_FORWARD; 513 MULADD(at[1], at[31]); 514 MULADD(at[2], at[30]); 515 MULADD(at[3], at[29]); 516 MULADD(at[4], at[28]); 517 MULADD(at[5], at[27]); 518 MULADD(at[6], at[26]); 519 MULADD(at[7], at[25]); 520 MULADD(at[8], at[24]); 521 MULADD(at[9], at[23]); 522 MULADD(at[10], at[22]); 523 MULADD(at[11], at[21]); 524 MULADD(at[12], at[20]); 525 MULADD(at[13], at[19]); 526 MULADD(at[14], at[18]); 527 MULADD(at[15], at[17]); 528 COMBA_STORE(C->dp[16]); 529 /* 17 */ 530 COMBA_FORWARD; 531 MULADD(at[2], at[31]); 532 MULADD(at[3], at[30]); 533 MULADD(at[4], at[29]); 534 MULADD(at[5], at[28]); 535 MULADD(at[6], at[27]); 536 MULADD(at[7], at[26]); 537 MULADD(at[8], at[25]); 538 MULADD(at[9], at[24]); 539 MULADD(at[10], at[23]); 540 MULADD(at[11], at[22]); 541 MULADD(at[12], at[21]); 542 MULADD(at[13], at[20]); 543 MULADD(at[14], at[19]); 544 MULADD(at[15], at[18]); 545 COMBA_STORE(C->dp[17]); 546 /* 18 */ 547 COMBA_FORWARD; 548 MULADD(at[3], at[31]); 549 MULADD(at[4], at[30]); 550 MULADD(at[5], at[29]); 551 MULADD(at[6], at[28]); 552 MULADD(at[7], at[27]); 553 MULADD(at[8], at[26]); 554 MULADD(at[9], at[25]); 555 MULADD(at[10], at[24]); 556 MULADD(at[11], at[23]); 557 MULADD(at[12], at[22]); 558 MULADD(at[13], at[21]); 559 MULADD(at[14], at[20]); 560 MULADD(at[15], at[19]); 561 COMBA_STORE(C->dp[18]); 562 /* 19 */ 563 COMBA_FORWARD; 564 MULADD(at[4], at[31]); 565 MULADD(at[5], at[30]); 566 MULADD(at[6], at[29]); 567 MULADD(at[7], at[28]); 568 MULADD(at[8], at[27]); 569 MULADD(at[9], at[26]); 570 MULADD(at[10], at[25]); 571 MULADD(at[11], at[24]); 572 MULADD(at[12], at[23]); 573 MULADD(at[13], at[22]); 574 MULADD(at[14], at[21]); 575 MULADD(at[15], at[20]); 576 COMBA_STORE(C->dp[19]); 577 /* 20 */ 578 COMBA_FORWARD; 579 MULADD(at[5], at[31]); 580 MULADD(at[6], at[30]); 581 MULADD(at[7], at[29]); 582 MULADD(at[8], at[28]); 583 MULADD(at[9], at[27]); 584 MULADD(at[10], at[26]); 585 MULADD(at[11], at[25]); 586 MULADD(at[12], at[24]); 587 MULADD(at[13], at[23]); 588 MULADD(at[14], at[22]); 589 MULADD(at[15], at[21]); 590 COMBA_STORE(C->dp[20]); 591 /* 21 */ 592 COMBA_FORWARD; 593 MULADD(at[6], at[31]); 594 MULADD(at[7], at[30]); 595 MULADD(at[8], at[29]); 596 MULADD(at[9], at[28]); 597 MULADD(at[10], at[27]); 598 MULADD(at[11], at[26]); 599 MULADD(at[12], at[25]); 600 MULADD(at[13], at[24]); 601 MULADD(at[14], at[23]); 602 MULADD(at[15], at[22]); 603 COMBA_STORE(C->dp[21]); 604 /* 22 */ 605 COMBA_FORWARD; 606 MULADD(at[7], at[31]); 607 MULADD(at[8], at[30]); 608 MULADD(at[9], at[29]); 609 MULADD(at[10], at[28]); 610 MULADD(at[11], at[27]); 611 MULADD(at[12], at[26]); 612 MULADD(at[13], at[25]); 613 MULADD(at[14], at[24]); 614 MULADD(at[15], at[23]); 615 COMBA_STORE(C->dp[22]); 616 /* 23 */ 617 COMBA_FORWARD; 618 MULADD(at[8], at[31]); 619 MULADD(at[9], at[30]); 620 MULADD(at[10], at[29]); 621 MULADD(at[11], at[28]); 622 MULADD(at[12], at[27]); 623 MULADD(at[13], at[26]); 624 MULADD(at[14], at[25]); 625 MULADD(at[15], at[24]); 626 COMBA_STORE(C->dp[23]); 627 /* 24 */ 628 COMBA_FORWARD; 629 MULADD(at[9], at[31]); 630 MULADD(at[10], at[30]); 631 MULADD(at[11], at[29]); 632 MULADD(at[12], at[28]); 633 MULADD(at[13], at[27]); 634 MULADD(at[14], at[26]); 635 MULADD(at[15], at[25]); 636 COMBA_STORE(C->dp[24]); 637 /* 25 */ 638 COMBA_FORWARD; 639 MULADD(at[10], at[31]); 640 MULADD(at[11], at[30]); 641 MULADD(at[12], at[29]); 642 MULADD(at[13], at[28]); 643 MULADD(at[14], at[27]); 644 MULADD(at[15], at[26]); 645 COMBA_STORE(C->dp[25]); 646 /* 26 */ 647 COMBA_FORWARD; 648 MULADD(at[11], at[31]); 649 MULADD(at[12], at[30]); 650 MULADD(at[13], at[29]); 651 MULADD(at[14], at[28]); 652 MULADD(at[15], at[27]); 653 COMBA_STORE(C->dp[26]); 654 /* 27 */ 655 COMBA_FORWARD; 656 MULADD(at[12], at[31]); 657 MULADD(at[13], at[30]); 658 MULADD(at[14], at[29]); 659 MULADD(at[15], at[28]); 660 COMBA_STORE(C->dp[27]); 661 /* 28 */ 662 COMBA_FORWARD; 663 MULADD(at[13], at[31]); 664 MULADD(at[14], at[30]); 665 MULADD(at[15], at[29]); 666 COMBA_STORE(C->dp[28]); 667 /* 29 */ 668 COMBA_FORWARD; 669 MULADD(at[14], at[31]); 670 MULADD(at[15], at[30]); 671 COMBA_STORE(C->dp[29]); 672 /* 30 */ 673 COMBA_FORWARD; 674 MULADD(at[15], at[31]); 675 COMBA_STORE(C->dp[30]); 676 COMBA_STORE2(C->dp[31]); 677 C->used = 32; 678 C->sign = A->sign ^ B->sign; 679 mp_clamp(C); 680 COMBA_FINI; 681 } 682 683 void 684 s_mp_mul_comba_32(const mp_int *A, const mp_int *B, mp_int *C) 685 { 686 mp_digit c0, c1, c2, at[64]; 687 688 memcpy(at, A->dp, 32 * sizeof(mp_digit)); 689 memcpy(at + 32, B->dp, 32 * sizeof(mp_digit)); 690 COMBA_START; 691 692 COMBA_CLEAR; 693 /* 0 */ 694 MULADD(at[0], at[32]); 695 COMBA_STORE(C->dp[0]); 696 /* 1 */ 697 COMBA_FORWARD; 698 MULADD(at[0], at[33]); 699 MULADD(at[1], at[32]); 700 COMBA_STORE(C->dp[1]); 701 /* 2 */ 702 COMBA_FORWARD; 703 MULADD(at[0], at[34]); 704 MULADD(at[1], at[33]); 705 MULADD(at[2], at[32]); 706 COMBA_STORE(C->dp[2]); 707 /* 3 */ 708 COMBA_FORWARD; 709 MULADD(at[0], at[35]); 710 MULADD(at[1], at[34]); 711 MULADD(at[2], at[33]); 712 MULADD(at[3], at[32]); 713 COMBA_STORE(C->dp[3]); 714 /* 4 */ 715 COMBA_FORWARD; 716 MULADD(at[0], at[36]); 717 MULADD(at[1], at[35]); 718 MULADD(at[2], at[34]); 719 MULADD(at[3], at[33]); 720 MULADD(at[4], at[32]); 721 COMBA_STORE(C->dp[4]); 722 /* 5 */ 723 COMBA_FORWARD; 724 MULADD(at[0], at[37]); 725 MULADD(at[1], at[36]); 726 MULADD(at[2], at[35]); 727 MULADD(at[3], at[34]); 728 MULADD(at[4], at[33]); 729 MULADD(at[5], at[32]); 730 COMBA_STORE(C->dp[5]); 731 /* 6 */ 732 COMBA_FORWARD; 733 MULADD(at[0], at[38]); 734 MULADD(at[1], at[37]); 735 MULADD(at[2], at[36]); 736 MULADD(at[3], at[35]); 737 MULADD(at[4], at[34]); 738 MULADD(at[5], at[33]); 739 MULADD(at[6], at[32]); 740 COMBA_STORE(C->dp[6]); 741 /* 7 */ 742 COMBA_FORWARD; 743 MULADD(at[0], at[39]); 744 MULADD(at[1], at[38]); 745 MULADD(at[2], at[37]); 746 MULADD(at[3], at[36]); 747 MULADD(at[4], at[35]); 748 MULADD(at[5], at[34]); 749 MULADD(at[6], at[33]); 750 MULADD(at[7], at[32]); 751 COMBA_STORE(C->dp[7]); 752 /* 8 */ 753 COMBA_FORWARD; 754 MULADD(at[0], at[40]); 755 MULADD(at[1], at[39]); 756 MULADD(at[2], at[38]); 757 MULADD(at[3], at[37]); 758 MULADD(at[4], at[36]); 759 MULADD(at[5], at[35]); 760 MULADD(at[6], at[34]); 761 MULADD(at[7], at[33]); 762 MULADD(at[8], at[32]); 763 COMBA_STORE(C->dp[8]); 764 /* 9 */ 765 COMBA_FORWARD; 766 MULADD(at[0], at[41]); 767 MULADD(at[1], at[40]); 768 MULADD(at[2], at[39]); 769 MULADD(at[3], at[38]); 770 MULADD(at[4], at[37]); 771 MULADD(at[5], at[36]); 772 MULADD(at[6], at[35]); 773 MULADD(at[7], at[34]); 774 MULADD(at[8], at[33]); 775 MULADD(at[9], at[32]); 776 COMBA_STORE(C->dp[9]); 777 /* 10 */ 778 COMBA_FORWARD; 779 MULADD(at[0], at[42]); 780 MULADD(at[1], at[41]); 781 MULADD(at[2], at[40]); 782 MULADD(at[3], at[39]); 783 MULADD(at[4], at[38]); 784 MULADD(at[5], at[37]); 785 MULADD(at[6], at[36]); 786 MULADD(at[7], at[35]); 787 MULADD(at[8], at[34]); 788 MULADD(at[9], at[33]); 789 MULADD(at[10], at[32]); 790 COMBA_STORE(C->dp[10]); 791 /* 11 */ 792 COMBA_FORWARD; 793 MULADD(at[0], at[43]); 794 MULADD(at[1], at[42]); 795 MULADD(at[2], at[41]); 796 MULADD(at[3], at[40]); 797 MULADD(at[4], at[39]); 798 MULADD(at[5], at[38]); 799 MULADD(at[6], at[37]); 800 MULADD(at[7], at[36]); 801 MULADD(at[8], at[35]); 802 MULADD(at[9], at[34]); 803 MULADD(at[10], at[33]); 804 MULADD(at[11], at[32]); 805 COMBA_STORE(C->dp[11]); 806 /* 12 */ 807 COMBA_FORWARD; 808 MULADD(at[0], at[44]); 809 MULADD(at[1], at[43]); 810 MULADD(at[2], at[42]); 811 MULADD(at[3], at[41]); 812 MULADD(at[4], at[40]); 813 MULADD(at[5], at[39]); 814 MULADD(at[6], at[38]); 815 MULADD(at[7], at[37]); 816 MULADD(at[8], at[36]); 817 MULADD(at[9], at[35]); 818 MULADD(at[10], at[34]); 819 MULADD(at[11], at[33]); 820 MULADD(at[12], at[32]); 821 COMBA_STORE(C->dp[12]); 822 /* 13 */ 823 COMBA_FORWARD; 824 MULADD(at[0], at[45]); 825 MULADD(at[1], at[44]); 826 MULADD(at[2], at[43]); 827 MULADD(at[3], at[42]); 828 MULADD(at[4], at[41]); 829 MULADD(at[5], at[40]); 830 MULADD(at[6], at[39]); 831 MULADD(at[7], at[38]); 832 MULADD(at[8], at[37]); 833 MULADD(at[9], at[36]); 834 MULADD(at[10], at[35]); 835 MULADD(at[11], at[34]); 836 MULADD(at[12], at[33]); 837 MULADD(at[13], at[32]); 838 COMBA_STORE(C->dp[13]); 839 /* 14 */ 840 COMBA_FORWARD; 841 MULADD(at[0], at[46]); 842 MULADD(at[1], at[45]); 843 MULADD(at[2], at[44]); 844 MULADD(at[3], at[43]); 845 MULADD(at[4], at[42]); 846 MULADD(at[5], at[41]); 847 MULADD(at[6], at[40]); 848 MULADD(at[7], at[39]); 849 MULADD(at[8], at[38]); 850 MULADD(at[9], at[37]); 851 MULADD(at[10], at[36]); 852 MULADD(at[11], at[35]); 853 MULADD(at[12], at[34]); 854 MULADD(at[13], at[33]); 855 MULADD(at[14], at[32]); 856 COMBA_STORE(C->dp[14]); 857 /* 15 */ 858 COMBA_FORWARD; 859 MULADD(at[0], at[47]); 860 MULADD(at[1], at[46]); 861 MULADD(at[2], at[45]); 862 MULADD(at[3], at[44]); 863 MULADD(at[4], at[43]); 864 MULADD(at[5], at[42]); 865 MULADD(at[6], at[41]); 866 MULADD(at[7], at[40]); 867 MULADD(at[8], at[39]); 868 MULADD(at[9], at[38]); 869 MULADD(at[10], at[37]); 870 MULADD(at[11], at[36]); 871 MULADD(at[12], at[35]); 872 MULADD(at[13], at[34]); 873 MULADD(at[14], at[33]); 874 MULADD(at[15], at[32]); 875 COMBA_STORE(C->dp[15]); 876 /* 16 */ 877 COMBA_FORWARD; 878 MULADD(at[0], at[48]); 879 MULADD(at[1], at[47]); 880 MULADD(at[2], at[46]); 881 MULADD(at[3], at[45]); 882 MULADD(at[4], at[44]); 883 MULADD(at[5], at[43]); 884 MULADD(at[6], at[42]); 885 MULADD(at[7], at[41]); 886 MULADD(at[8], at[40]); 887 MULADD(at[9], at[39]); 888 MULADD(at[10], at[38]); 889 MULADD(at[11], at[37]); 890 MULADD(at[12], at[36]); 891 MULADD(at[13], at[35]); 892 MULADD(at[14], at[34]); 893 MULADD(at[15], at[33]); 894 MULADD(at[16], at[32]); 895 COMBA_STORE(C->dp[16]); 896 /* 17 */ 897 COMBA_FORWARD; 898 MULADD(at[0], at[49]); 899 MULADD(at[1], at[48]); 900 MULADD(at[2], at[47]); 901 MULADD(at[3], at[46]); 902 MULADD(at[4], at[45]); 903 MULADD(at[5], at[44]); 904 MULADD(at[6], at[43]); 905 MULADD(at[7], at[42]); 906 MULADD(at[8], at[41]); 907 MULADD(at[9], at[40]); 908 MULADD(at[10], at[39]); 909 MULADD(at[11], at[38]); 910 MULADD(at[12], at[37]); 911 MULADD(at[13], at[36]); 912 MULADD(at[14], at[35]); 913 MULADD(at[15], at[34]); 914 MULADD(at[16], at[33]); 915 MULADD(at[17], at[32]); 916 COMBA_STORE(C->dp[17]); 917 /* 18 */ 918 COMBA_FORWARD; 919 MULADD(at[0], at[50]); 920 MULADD(at[1], at[49]); 921 MULADD(at[2], at[48]); 922 MULADD(at[3], at[47]); 923 MULADD(at[4], at[46]); 924 MULADD(at[5], at[45]); 925 MULADD(at[6], at[44]); 926 MULADD(at[7], at[43]); 927 MULADD(at[8], at[42]); 928 MULADD(at[9], at[41]); 929 MULADD(at[10], at[40]); 930 MULADD(at[11], at[39]); 931 MULADD(at[12], at[38]); 932 MULADD(at[13], at[37]); 933 MULADD(at[14], at[36]); 934 MULADD(at[15], at[35]); 935 MULADD(at[16], at[34]); 936 MULADD(at[17], at[33]); 937 MULADD(at[18], at[32]); 938 COMBA_STORE(C->dp[18]); 939 /* 19 */ 940 COMBA_FORWARD; 941 MULADD(at[0], at[51]); 942 MULADD(at[1], at[50]); 943 MULADD(at[2], at[49]); 944 MULADD(at[3], at[48]); 945 MULADD(at[4], at[47]); 946 MULADD(at[5], at[46]); 947 MULADD(at[6], at[45]); 948 MULADD(at[7], at[44]); 949 MULADD(at[8], at[43]); 950 MULADD(at[9], at[42]); 951 MULADD(at[10], at[41]); 952 MULADD(at[11], at[40]); 953 MULADD(at[12], at[39]); 954 MULADD(at[13], at[38]); 955 MULADD(at[14], at[37]); 956 MULADD(at[15], at[36]); 957 MULADD(at[16], at[35]); 958 MULADD(at[17], at[34]); 959 MULADD(at[18], at[33]); 960 MULADD(at[19], at[32]); 961 COMBA_STORE(C->dp[19]); 962 /* 20 */ 963 COMBA_FORWARD; 964 MULADD(at[0], at[52]); 965 MULADD(at[1], at[51]); 966 MULADD(at[2], at[50]); 967 MULADD(at[3], at[49]); 968 MULADD(at[4], at[48]); 969 MULADD(at[5], at[47]); 970 MULADD(at[6], at[46]); 971 MULADD(at[7], at[45]); 972 MULADD(at[8], at[44]); 973 MULADD(at[9], at[43]); 974 MULADD(at[10], at[42]); 975 MULADD(at[11], at[41]); 976 MULADD(at[12], at[40]); 977 MULADD(at[13], at[39]); 978 MULADD(at[14], at[38]); 979 MULADD(at[15], at[37]); 980 MULADD(at[16], at[36]); 981 MULADD(at[17], at[35]); 982 MULADD(at[18], at[34]); 983 MULADD(at[19], at[33]); 984 MULADD(at[20], at[32]); 985 COMBA_STORE(C->dp[20]); 986 /* 21 */ 987 COMBA_FORWARD; 988 MULADD(at[0], at[53]); 989 MULADD(at[1], at[52]); 990 MULADD(at[2], at[51]); 991 MULADD(at[3], at[50]); 992 MULADD(at[4], at[49]); 993 MULADD(at[5], at[48]); 994 MULADD(at[6], at[47]); 995 MULADD(at[7], at[46]); 996 MULADD(at[8], at[45]); 997 MULADD(at[9], at[44]); 998 MULADD(at[10], at[43]); 999 MULADD(at[11], at[42]); 1000 MULADD(at[12], at[41]); 1001 MULADD(at[13], at[40]); 1002 MULADD(at[14], at[39]); 1003 MULADD(at[15], at[38]); 1004 MULADD(at[16], at[37]); 1005 MULADD(at[17], at[36]); 1006 MULADD(at[18], at[35]); 1007 MULADD(at[19], at[34]); 1008 MULADD(at[20], at[33]); 1009 MULADD(at[21], at[32]); 1010 COMBA_STORE(C->dp[21]); 1011 /* 22 */ 1012 COMBA_FORWARD; 1013 MULADD(at[0], at[54]); 1014 MULADD(at[1], at[53]); 1015 MULADD(at[2], at[52]); 1016 MULADD(at[3], at[51]); 1017 MULADD(at[4], at[50]); 1018 MULADD(at[5], at[49]); 1019 MULADD(at[6], at[48]); 1020 MULADD(at[7], at[47]); 1021 MULADD(at[8], at[46]); 1022 MULADD(at[9], at[45]); 1023 MULADD(at[10], at[44]); 1024 MULADD(at[11], at[43]); 1025 MULADD(at[12], at[42]); 1026 MULADD(at[13], at[41]); 1027 MULADD(at[14], at[40]); 1028 MULADD(at[15], at[39]); 1029 MULADD(at[16], at[38]); 1030 MULADD(at[17], at[37]); 1031 MULADD(at[18], at[36]); 1032 MULADD(at[19], at[35]); 1033 MULADD(at[20], at[34]); 1034 MULADD(at[21], at[33]); 1035 MULADD(at[22], at[32]); 1036 COMBA_STORE(C->dp[22]); 1037 /* 23 */ 1038 COMBA_FORWARD; 1039 MULADD(at[0], at[55]); 1040 MULADD(at[1], at[54]); 1041 MULADD(at[2], at[53]); 1042 MULADD(at[3], at[52]); 1043 MULADD(at[4], at[51]); 1044 MULADD(at[5], at[50]); 1045 MULADD(at[6], at[49]); 1046 MULADD(at[7], at[48]); 1047 MULADD(at[8], at[47]); 1048 MULADD(at[9], at[46]); 1049 MULADD(at[10], at[45]); 1050 MULADD(at[11], at[44]); 1051 MULADD(at[12], at[43]); 1052 MULADD(at[13], at[42]); 1053 MULADD(at[14], at[41]); 1054 MULADD(at[15], at[40]); 1055 MULADD(at[16], at[39]); 1056 MULADD(at[17], at[38]); 1057 MULADD(at[18], at[37]); 1058 MULADD(at[19], at[36]); 1059 MULADD(at[20], at[35]); 1060 MULADD(at[21], at[34]); 1061 MULADD(at[22], at[33]); 1062 MULADD(at[23], at[32]); 1063 COMBA_STORE(C->dp[23]); 1064 /* 24 */ 1065 COMBA_FORWARD; 1066 MULADD(at[0], at[56]); 1067 MULADD(at[1], at[55]); 1068 MULADD(at[2], at[54]); 1069 MULADD(at[3], at[53]); 1070 MULADD(at[4], at[52]); 1071 MULADD(at[5], at[51]); 1072 MULADD(at[6], at[50]); 1073 MULADD(at[7], at[49]); 1074 MULADD(at[8], at[48]); 1075 MULADD(at[9], at[47]); 1076 MULADD(at[10], at[46]); 1077 MULADD(at[11], at[45]); 1078 MULADD(at[12], at[44]); 1079 MULADD(at[13], at[43]); 1080 MULADD(at[14], at[42]); 1081 MULADD(at[15], at[41]); 1082 MULADD(at[16], at[40]); 1083 MULADD(at[17], at[39]); 1084 MULADD(at[18], at[38]); 1085 MULADD(at[19], at[37]); 1086 MULADD(at[20], at[36]); 1087 MULADD(at[21], at[35]); 1088 MULADD(at[22], at[34]); 1089 MULADD(at[23], at[33]); 1090 MULADD(at[24], at[32]); 1091 COMBA_STORE(C->dp[24]); 1092 /* 25 */ 1093 COMBA_FORWARD; 1094 MULADD(at[0], at[57]); 1095 MULADD(at[1], at[56]); 1096 MULADD(at[2], at[55]); 1097 MULADD(at[3], at[54]); 1098 MULADD(at[4], at[53]); 1099 MULADD(at[5], at[52]); 1100 MULADD(at[6], at[51]); 1101 MULADD(at[7], at[50]); 1102 MULADD(at[8], at[49]); 1103 MULADD(at[9], at[48]); 1104 MULADD(at[10], at[47]); 1105 MULADD(at[11], at[46]); 1106 MULADD(at[12], at[45]); 1107 MULADD(at[13], at[44]); 1108 MULADD(at[14], at[43]); 1109 MULADD(at[15], at[42]); 1110 MULADD(at[16], at[41]); 1111 MULADD(at[17], at[40]); 1112 MULADD(at[18], at[39]); 1113 MULADD(at[19], at[38]); 1114 MULADD(at[20], at[37]); 1115 MULADD(at[21], at[36]); 1116 MULADD(at[22], at[35]); 1117 MULADD(at[23], at[34]); 1118 MULADD(at[24], at[33]); 1119 MULADD(at[25], at[32]); 1120 COMBA_STORE(C->dp[25]); 1121 /* 26 */ 1122 COMBA_FORWARD; 1123 MULADD(at[0], at[58]); 1124 MULADD(at[1], at[57]); 1125 MULADD(at[2], at[56]); 1126 MULADD(at[3], at[55]); 1127 MULADD(at[4], at[54]); 1128 MULADD(at[5], at[53]); 1129 MULADD(at[6], at[52]); 1130 MULADD(at[7], at[51]); 1131 MULADD(at[8], at[50]); 1132 MULADD(at[9], at[49]); 1133 MULADD(at[10], at[48]); 1134 MULADD(at[11], at[47]); 1135 MULADD(at[12], at[46]); 1136 MULADD(at[13], at[45]); 1137 MULADD(at[14], at[44]); 1138 MULADD(at[15], at[43]); 1139 MULADD(at[16], at[42]); 1140 MULADD(at[17], at[41]); 1141 MULADD(at[18], at[40]); 1142 MULADD(at[19], at[39]); 1143 MULADD(at[20], at[38]); 1144 MULADD(at[21], at[37]); 1145 MULADD(at[22], at[36]); 1146 MULADD(at[23], at[35]); 1147 MULADD(at[24], at[34]); 1148 MULADD(at[25], at[33]); 1149 MULADD(at[26], at[32]); 1150 COMBA_STORE(C->dp[26]); 1151 /* 27 */ 1152 COMBA_FORWARD; 1153 MULADD(at[0], at[59]); 1154 MULADD(at[1], at[58]); 1155 MULADD(at[2], at[57]); 1156 MULADD(at[3], at[56]); 1157 MULADD(at[4], at[55]); 1158 MULADD(at[5], at[54]); 1159 MULADD(at[6], at[53]); 1160 MULADD(at[7], at[52]); 1161 MULADD(at[8], at[51]); 1162 MULADD(at[9], at[50]); 1163 MULADD(at[10], at[49]); 1164 MULADD(at[11], at[48]); 1165 MULADD(at[12], at[47]); 1166 MULADD(at[13], at[46]); 1167 MULADD(at[14], at[45]); 1168 MULADD(at[15], at[44]); 1169 MULADD(at[16], at[43]); 1170 MULADD(at[17], at[42]); 1171 MULADD(at[18], at[41]); 1172 MULADD(at[19], at[40]); 1173 MULADD(at[20], at[39]); 1174 MULADD(at[21], at[38]); 1175 MULADD(at[22], at[37]); 1176 MULADD(at[23], at[36]); 1177 MULADD(at[24], at[35]); 1178 MULADD(at[25], at[34]); 1179 MULADD(at[26], at[33]); 1180 MULADD(at[27], at[32]); 1181 COMBA_STORE(C->dp[27]); 1182 /* 28 */ 1183 COMBA_FORWARD; 1184 MULADD(at[0], at[60]); 1185 MULADD(at[1], at[59]); 1186 MULADD(at[2], at[58]); 1187 MULADD(at[3], at[57]); 1188 MULADD(at[4], at[56]); 1189 MULADD(at[5], at[55]); 1190 MULADD(at[6], at[54]); 1191 MULADD(at[7], at[53]); 1192 MULADD(at[8], at[52]); 1193 MULADD(at[9], at[51]); 1194 MULADD(at[10], at[50]); 1195 MULADD(at[11], at[49]); 1196 MULADD(at[12], at[48]); 1197 MULADD(at[13], at[47]); 1198 MULADD(at[14], at[46]); 1199 MULADD(at[15], at[45]); 1200 MULADD(at[16], at[44]); 1201 MULADD(at[17], at[43]); 1202 MULADD(at[18], at[42]); 1203 MULADD(at[19], at[41]); 1204 MULADD(at[20], at[40]); 1205 MULADD(at[21], at[39]); 1206 MULADD(at[22], at[38]); 1207 MULADD(at[23], at[37]); 1208 MULADD(at[24], at[36]); 1209 MULADD(at[25], at[35]); 1210 MULADD(at[26], at[34]); 1211 MULADD(at[27], at[33]); 1212 MULADD(at[28], at[32]); 1213 COMBA_STORE(C->dp[28]); 1214 /* 29 */ 1215 COMBA_FORWARD; 1216 MULADD(at[0], at[61]); 1217 MULADD(at[1], at[60]); 1218 MULADD(at[2], at[59]); 1219 MULADD(at[3], at[58]); 1220 MULADD(at[4], at[57]); 1221 MULADD(at[5], at[56]); 1222 MULADD(at[6], at[55]); 1223 MULADD(at[7], at[54]); 1224 MULADD(at[8], at[53]); 1225 MULADD(at[9], at[52]); 1226 MULADD(at[10], at[51]); 1227 MULADD(at[11], at[50]); 1228 MULADD(at[12], at[49]); 1229 MULADD(at[13], at[48]); 1230 MULADD(at[14], at[47]); 1231 MULADD(at[15], at[46]); 1232 MULADD(at[16], at[45]); 1233 MULADD(at[17], at[44]); 1234 MULADD(at[18], at[43]); 1235 MULADD(at[19], at[42]); 1236 MULADD(at[20], at[41]); 1237 MULADD(at[21], at[40]); 1238 MULADD(at[22], at[39]); 1239 MULADD(at[23], at[38]); 1240 MULADD(at[24], at[37]); 1241 MULADD(at[25], at[36]); 1242 MULADD(at[26], at[35]); 1243 MULADD(at[27], at[34]); 1244 MULADD(at[28], at[33]); 1245 MULADD(at[29], at[32]); 1246 COMBA_STORE(C->dp[29]); 1247 /* 30 */ 1248 COMBA_FORWARD; 1249 MULADD(at[0], at[62]); 1250 MULADD(at[1], at[61]); 1251 MULADD(at[2], at[60]); 1252 MULADD(at[3], at[59]); 1253 MULADD(at[4], at[58]); 1254 MULADD(at[5], at[57]); 1255 MULADD(at[6], at[56]); 1256 MULADD(at[7], at[55]); 1257 MULADD(at[8], at[54]); 1258 MULADD(at[9], at[53]); 1259 MULADD(at[10], at[52]); 1260 MULADD(at[11], at[51]); 1261 MULADD(at[12], at[50]); 1262 MULADD(at[13], at[49]); 1263 MULADD(at[14], at[48]); 1264 MULADD(at[15], at[47]); 1265 MULADD(at[16], at[46]); 1266 MULADD(at[17], at[45]); 1267 MULADD(at[18], at[44]); 1268 MULADD(at[19], at[43]); 1269 MULADD(at[20], at[42]); 1270 MULADD(at[21], at[41]); 1271 MULADD(at[22], at[40]); 1272 MULADD(at[23], at[39]); 1273 MULADD(at[24], at[38]); 1274 MULADD(at[25], at[37]); 1275 MULADD(at[26], at[36]); 1276 MULADD(at[27], at[35]); 1277 MULADD(at[28], at[34]); 1278 MULADD(at[29], at[33]); 1279 MULADD(at[30], at[32]); 1280 COMBA_STORE(C->dp[30]); 1281 /* 31 */ 1282 COMBA_FORWARD; 1283 MULADD(at[0], at[63]); 1284 MULADD(at[1], at[62]); 1285 MULADD(at[2], at[61]); 1286 MULADD(at[3], at[60]); 1287 MULADD(at[4], at[59]); 1288 MULADD(at[5], at[58]); 1289 MULADD(at[6], at[57]); 1290 MULADD(at[7], at[56]); 1291 MULADD(at[8], at[55]); 1292 MULADD(at[9], at[54]); 1293 MULADD(at[10], at[53]); 1294 MULADD(at[11], at[52]); 1295 MULADD(at[12], at[51]); 1296 MULADD(at[13], at[50]); 1297 MULADD(at[14], at[49]); 1298 MULADD(at[15], at[48]); 1299 MULADD(at[16], at[47]); 1300 MULADD(at[17], at[46]); 1301 MULADD(at[18], at[45]); 1302 MULADD(at[19], at[44]); 1303 MULADD(at[20], at[43]); 1304 MULADD(at[21], at[42]); 1305 MULADD(at[22], at[41]); 1306 MULADD(at[23], at[40]); 1307 MULADD(at[24], at[39]); 1308 MULADD(at[25], at[38]); 1309 MULADD(at[26], at[37]); 1310 MULADD(at[27], at[36]); 1311 MULADD(at[28], at[35]); 1312 MULADD(at[29], at[34]); 1313 MULADD(at[30], at[33]); 1314 MULADD(at[31], at[32]); 1315 COMBA_STORE(C->dp[31]); 1316 /* 32 */ 1317 COMBA_FORWARD; 1318 MULADD(at[1], at[63]); 1319 MULADD(at[2], at[62]); 1320 MULADD(at[3], at[61]); 1321 MULADD(at[4], at[60]); 1322 MULADD(at[5], at[59]); 1323 MULADD(at[6], at[58]); 1324 MULADD(at[7], at[57]); 1325 MULADD(at[8], at[56]); 1326 MULADD(at[9], at[55]); 1327 MULADD(at[10], at[54]); 1328 MULADD(at[11], at[53]); 1329 MULADD(at[12], at[52]); 1330 MULADD(at[13], at[51]); 1331 MULADD(at[14], at[50]); 1332 MULADD(at[15], at[49]); 1333 MULADD(at[16], at[48]); 1334 MULADD(at[17], at[47]); 1335 MULADD(at[18], at[46]); 1336 MULADD(at[19], at[45]); 1337 MULADD(at[20], at[44]); 1338 MULADD(at[21], at[43]); 1339 MULADD(at[22], at[42]); 1340 MULADD(at[23], at[41]); 1341 MULADD(at[24], at[40]); 1342 MULADD(at[25], at[39]); 1343 MULADD(at[26], at[38]); 1344 MULADD(at[27], at[37]); 1345 MULADD(at[28], at[36]); 1346 MULADD(at[29], at[35]); 1347 MULADD(at[30], at[34]); 1348 MULADD(at[31], at[33]); 1349 COMBA_STORE(C->dp[32]); 1350 /* 33 */ 1351 COMBA_FORWARD; 1352 MULADD(at[2], at[63]); 1353 MULADD(at[3], at[62]); 1354 MULADD(at[4], at[61]); 1355 MULADD(at[5], at[60]); 1356 MULADD(at[6], at[59]); 1357 MULADD(at[7], at[58]); 1358 MULADD(at[8], at[57]); 1359 MULADD(at[9], at[56]); 1360 MULADD(at[10], at[55]); 1361 MULADD(at[11], at[54]); 1362 MULADD(at[12], at[53]); 1363 MULADD(at[13], at[52]); 1364 MULADD(at[14], at[51]); 1365 MULADD(at[15], at[50]); 1366 MULADD(at[16], at[49]); 1367 MULADD(at[17], at[48]); 1368 MULADD(at[18], at[47]); 1369 MULADD(at[19], at[46]); 1370 MULADD(at[20], at[45]); 1371 MULADD(at[21], at[44]); 1372 MULADD(at[22], at[43]); 1373 MULADD(at[23], at[42]); 1374 MULADD(at[24], at[41]); 1375 MULADD(at[25], at[40]); 1376 MULADD(at[26], at[39]); 1377 MULADD(at[27], at[38]); 1378 MULADD(at[28], at[37]); 1379 MULADD(at[29], at[36]); 1380 MULADD(at[30], at[35]); 1381 MULADD(at[31], at[34]); 1382 COMBA_STORE(C->dp[33]); 1383 /* 34 */ 1384 COMBA_FORWARD; 1385 MULADD(at[3], at[63]); 1386 MULADD(at[4], at[62]); 1387 MULADD(at[5], at[61]); 1388 MULADD(at[6], at[60]); 1389 MULADD(at[7], at[59]); 1390 MULADD(at[8], at[58]); 1391 MULADD(at[9], at[57]); 1392 MULADD(at[10], at[56]); 1393 MULADD(at[11], at[55]); 1394 MULADD(at[12], at[54]); 1395 MULADD(at[13], at[53]); 1396 MULADD(at[14], at[52]); 1397 MULADD(at[15], at[51]); 1398 MULADD(at[16], at[50]); 1399 MULADD(at[17], at[49]); 1400 MULADD(at[18], at[48]); 1401 MULADD(at[19], at[47]); 1402 MULADD(at[20], at[46]); 1403 MULADD(at[21], at[45]); 1404 MULADD(at[22], at[44]); 1405 MULADD(at[23], at[43]); 1406 MULADD(at[24], at[42]); 1407 MULADD(at[25], at[41]); 1408 MULADD(at[26], at[40]); 1409 MULADD(at[27], at[39]); 1410 MULADD(at[28], at[38]); 1411 MULADD(at[29], at[37]); 1412 MULADD(at[30], at[36]); 1413 MULADD(at[31], at[35]); 1414 COMBA_STORE(C->dp[34]); 1415 /* 35 */ 1416 COMBA_FORWARD; 1417 MULADD(at[4], at[63]); 1418 MULADD(at[5], at[62]); 1419 MULADD(at[6], at[61]); 1420 MULADD(at[7], at[60]); 1421 MULADD(at[8], at[59]); 1422 MULADD(at[9], at[58]); 1423 MULADD(at[10], at[57]); 1424 MULADD(at[11], at[56]); 1425 MULADD(at[12], at[55]); 1426 MULADD(at[13], at[54]); 1427 MULADD(at[14], at[53]); 1428 MULADD(at[15], at[52]); 1429 MULADD(at[16], at[51]); 1430 MULADD(at[17], at[50]); 1431 MULADD(at[18], at[49]); 1432 MULADD(at[19], at[48]); 1433 MULADD(at[20], at[47]); 1434 MULADD(at[21], at[46]); 1435 MULADD(at[22], at[45]); 1436 MULADD(at[23], at[44]); 1437 MULADD(at[24], at[43]); 1438 MULADD(at[25], at[42]); 1439 MULADD(at[26], at[41]); 1440 MULADD(at[27], at[40]); 1441 MULADD(at[28], at[39]); 1442 MULADD(at[29], at[38]); 1443 MULADD(at[30], at[37]); 1444 MULADD(at[31], at[36]); 1445 COMBA_STORE(C->dp[35]); 1446 /* 36 */ 1447 COMBA_FORWARD; 1448 MULADD(at[5], at[63]); 1449 MULADD(at[6], at[62]); 1450 MULADD(at[7], at[61]); 1451 MULADD(at[8], at[60]); 1452 MULADD(at[9], at[59]); 1453 MULADD(at[10], at[58]); 1454 MULADD(at[11], at[57]); 1455 MULADD(at[12], at[56]); 1456 MULADD(at[13], at[55]); 1457 MULADD(at[14], at[54]); 1458 MULADD(at[15], at[53]); 1459 MULADD(at[16], at[52]); 1460 MULADD(at[17], at[51]); 1461 MULADD(at[18], at[50]); 1462 MULADD(at[19], at[49]); 1463 MULADD(at[20], at[48]); 1464 MULADD(at[21], at[47]); 1465 MULADD(at[22], at[46]); 1466 MULADD(at[23], at[45]); 1467 MULADD(at[24], at[44]); 1468 MULADD(at[25], at[43]); 1469 MULADD(at[26], at[42]); 1470 MULADD(at[27], at[41]); 1471 MULADD(at[28], at[40]); 1472 MULADD(at[29], at[39]); 1473 MULADD(at[30], at[38]); 1474 MULADD(at[31], at[37]); 1475 COMBA_STORE(C->dp[36]); 1476 /* 37 */ 1477 COMBA_FORWARD; 1478 MULADD(at[6], at[63]); 1479 MULADD(at[7], at[62]); 1480 MULADD(at[8], at[61]); 1481 MULADD(at[9], at[60]); 1482 MULADD(at[10], at[59]); 1483 MULADD(at[11], at[58]); 1484 MULADD(at[12], at[57]); 1485 MULADD(at[13], at[56]); 1486 MULADD(at[14], at[55]); 1487 MULADD(at[15], at[54]); 1488 MULADD(at[16], at[53]); 1489 MULADD(at[17], at[52]); 1490 MULADD(at[18], at[51]); 1491 MULADD(at[19], at[50]); 1492 MULADD(at[20], at[49]); 1493 MULADD(at[21], at[48]); 1494 MULADD(at[22], at[47]); 1495 MULADD(at[23], at[46]); 1496 MULADD(at[24], at[45]); 1497 MULADD(at[25], at[44]); 1498 MULADD(at[26], at[43]); 1499 MULADD(at[27], at[42]); 1500 MULADD(at[28], at[41]); 1501 MULADD(at[29], at[40]); 1502 MULADD(at[30], at[39]); 1503 MULADD(at[31], at[38]); 1504 COMBA_STORE(C->dp[37]); 1505 /* 38 */ 1506 COMBA_FORWARD; 1507 MULADD(at[7], at[63]); 1508 MULADD(at[8], at[62]); 1509 MULADD(at[9], at[61]); 1510 MULADD(at[10], at[60]); 1511 MULADD(at[11], at[59]); 1512 MULADD(at[12], at[58]); 1513 MULADD(at[13], at[57]); 1514 MULADD(at[14], at[56]); 1515 MULADD(at[15], at[55]); 1516 MULADD(at[16], at[54]); 1517 MULADD(at[17], at[53]); 1518 MULADD(at[18], at[52]); 1519 MULADD(at[19], at[51]); 1520 MULADD(at[20], at[50]); 1521 MULADD(at[21], at[49]); 1522 MULADD(at[22], at[48]); 1523 MULADD(at[23], at[47]); 1524 MULADD(at[24], at[46]); 1525 MULADD(at[25], at[45]); 1526 MULADD(at[26], at[44]); 1527 MULADD(at[27], at[43]); 1528 MULADD(at[28], at[42]); 1529 MULADD(at[29], at[41]); 1530 MULADD(at[30], at[40]); 1531 MULADD(at[31], at[39]); 1532 COMBA_STORE(C->dp[38]); 1533 /* 39 */ 1534 COMBA_FORWARD; 1535 MULADD(at[8], at[63]); 1536 MULADD(at[9], at[62]); 1537 MULADD(at[10], at[61]); 1538 MULADD(at[11], at[60]); 1539 MULADD(at[12], at[59]); 1540 MULADD(at[13], at[58]); 1541 MULADD(at[14], at[57]); 1542 MULADD(at[15], at[56]); 1543 MULADD(at[16], at[55]); 1544 MULADD(at[17], at[54]); 1545 MULADD(at[18], at[53]); 1546 MULADD(at[19], at[52]); 1547 MULADD(at[20], at[51]); 1548 MULADD(at[21], at[50]); 1549 MULADD(at[22], at[49]); 1550 MULADD(at[23], at[48]); 1551 MULADD(at[24], at[47]); 1552 MULADD(at[25], at[46]); 1553 MULADD(at[26], at[45]); 1554 MULADD(at[27], at[44]); 1555 MULADD(at[28], at[43]); 1556 MULADD(at[29], at[42]); 1557 MULADD(at[30], at[41]); 1558 MULADD(at[31], at[40]); 1559 COMBA_STORE(C->dp[39]); 1560 /* 40 */ 1561 COMBA_FORWARD; 1562 MULADD(at[9], at[63]); 1563 MULADD(at[10], at[62]); 1564 MULADD(at[11], at[61]); 1565 MULADD(at[12], at[60]); 1566 MULADD(at[13], at[59]); 1567 MULADD(at[14], at[58]); 1568 MULADD(at[15], at[57]); 1569 MULADD(at[16], at[56]); 1570 MULADD(at[17], at[55]); 1571 MULADD(at[18], at[54]); 1572 MULADD(at[19], at[53]); 1573 MULADD(at[20], at[52]); 1574 MULADD(at[21], at[51]); 1575 MULADD(at[22], at[50]); 1576 MULADD(at[23], at[49]); 1577 MULADD(at[24], at[48]); 1578 MULADD(at[25], at[47]); 1579 MULADD(at[26], at[46]); 1580 MULADD(at[27], at[45]); 1581 MULADD(at[28], at[44]); 1582 MULADD(at[29], at[43]); 1583 MULADD(at[30], at[42]); 1584 MULADD(at[31], at[41]); 1585 COMBA_STORE(C->dp[40]); 1586 /* 41 */ 1587 COMBA_FORWARD; 1588 MULADD(at[10], at[63]); 1589 MULADD(at[11], at[62]); 1590 MULADD(at[12], at[61]); 1591 MULADD(at[13], at[60]); 1592 MULADD(at[14], at[59]); 1593 MULADD(at[15], at[58]); 1594 MULADD(at[16], at[57]); 1595 MULADD(at[17], at[56]); 1596 MULADD(at[18], at[55]); 1597 MULADD(at[19], at[54]); 1598 MULADD(at[20], at[53]); 1599 MULADD(at[21], at[52]); 1600 MULADD(at[22], at[51]); 1601 MULADD(at[23], at[50]); 1602 MULADD(at[24], at[49]); 1603 MULADD(at[25], at[48]); 1604 MULADD(at[26], at[47]); 1605 MULADD(at[27], at[46]); 1606 MULADD(at[28], at[45]); 1607 MULADD(at[29], at[44]); 1608 MULADD(at[30], at[43]); 1609 MULADD(at[31], at[42]); 1610 COMBA_STORE(C->dp[41]); 1611 /* 42 */ 1612 COMBA_FORWARD; 1613 MULADD(at[11], at[63]); 1614 MULADD(at[12], at[62]); 1615 MULADD(at[13], at[61]); 1616 MULADD(at[14], at[60]); 1617 MULADD(at[15], at[59]); 1618 MULADD(at[16], at[58]); 1619 MULADD(at[17], at[57]); 1620 MULADD(at[18], at[56]); 1621 MULADD(at[19], at[55]); 1622 MULADD(at[20], at[54]); 1623 MULADD(at[21], at[53]); 1624 MULADD(at[22], at[52]); 1625 MULADD(at[23], at[51]); 1626 MULADD(at[24], at[50]); 1627 MULADD(at[25], at[49]); 1628 MULADD(at[26], at[48]); 1629 MULADD(at[27], at[47]); 1630 MULADD(at[28], at[46]); 1631 MULADD(at[29], at[45]); 1632 MULADD(at[30], at[44]); 1633 MULADD(at[31], at[43]); 1634 COMBA_STORE(C->dp[42]); 1635 /* 43 */ 1636 COMBA_FORWARD; 1637 MULADD(at[12], at[63]); 1638 MULADD(at[13], at[62]); 1639 MULADD(at[14], at[61]); 1640 MULADD(at[15], at[60]); 1641 MULADD(at[16], at[59]); 1642 MULADD(at[17], at[58]); 1643 MULADD(at[18], at[57]); 1644 MULADD(at[19], at[56]); 1645 MULADD(at[20], at[55]); 1646 MULADD(at[21], at[54]); 1647 MULADD(at[22], at[53]); 1648 MULADD(at[23], at[52]); 1649 MULADD(at[24], at[51]); 1650 MULADD(at[25], at[50]); 1651 MULADD(at[26], at[49]); 1652 MULADD(at[27], at[48]); 1653 MULADD(at[28], at[47]); 1654 MULADD(at[29], at[46]); 1655 MULADD(at[30], at[45]); 1656 MULADD(at[31], at[44]); 1657 COMBA_STORE(C->dp[43]); 1658 /* 44 */ 1659 COMBA_FORWARD; 1660 MULADD(at[13], at[63]); 1661 MULADD(at[14], at[62]); 1662 MULADD(at[15], at[61]); 1663 MULADD(at[16], at[60]); 1664 MULADD(at[17], at[59]); 1665 MULADD(at[18], at[58]); 1666 MULADD(at[19], at[57]); 1667 MULADD(at[20], at[56]); 1668 MULADD(at[21], at[55]); 1669 MULADD(at[22], at[54]); 1670 MULADD(at[23], at[53]); 1671 MULADD(at[24], at[52]); 1672 MULADD(at[25], at[51]); 1673 MULADD(at[26], at[50]); 1674 MULADD(at[27], at[49]); 1675 MULADD(at[28], at[48]); 1676 MULADD(at[29], at[47]); 1677 MULADD(at[30], at[46]); 1678 MULADD(at[31], at[45]); 1679 COMBA_STORE(C->dp[44]); 1680 /* 45 */ 1681 COMBA_FORWARD; 1682 MULADD(at[14], at[63]); 1683 MULADD(at[15], at[62]); 1684 MULADD(at[16], at[61]); 1685 MULADD(at[17], at[60]); 1686 MULADD(at[18], at[59]); 1687 MULADD(at[19], at[58]); 1688 MULADD(at[20], at[57]); 1689 MULADD(at[21], at[56]); 1690 MULADD(at[22], at[55]); 1691 MULADD(at[23], at[54]); 1692 MULADD(at[24], at[53]); 1693 MULADD(at[25], at[52]); 1694 MULADD(at[26], at[51]); 1695 MULADD(at[27], at[50]); 1696 MULADD(at[28], at[49]); 1697 MULADD(at[29], at[48]); 1698 MULADD(at[30], at[47]); 1699 MULADD(at[31], at[46]); 1700 COMBA_STORE(C->dp[45]); 1701 /* 46 */ 1702 COMBA_FORWARD; 1703 MULADD(at[15], at[63]); 1704 MULADD(at[16], at[62]); 1705 MULADD(at[17], at[61]); 1706 MULADD(at[18], at[60]); 1707 MULADD(at[19], at[59]); 1708 MULADD(at[20], at[58]); 1709 MULADD(at[21], at[57]); 1710 MULADD(at[22], at[56]); 1711 MULADD(at[23], at[55]); 1712 MULADD(at[24], at[54]); 1713 MULADD(at[25], at[53]); 1714 MULADD(at[26], at[52]); 1715 MULADD(at[27], at[51]); 1716 MULADD(at[28], at[50]); 1717 MULADD(at[29], at[49]); 1718 MULADD(at[30], at[48]); 1719 MULADD(at[31], at[47]); 1720 COMBA_STORE(C->dp[46]); 1721 /* 47 */ 1722 COMBA_FORWARD; 1723 MULADD(at[16], at[63]); 1724 MULADD(at[17], at[62]); 1725 MULADD(at[18], at[61]); 1726 MULADD(at[19], at[60]); 1727 MULADD(at[20], at[59]); 1728 MULADD(at[21], at[58]); 1729 MULADD(at[22], at[57]); 1730 MULADD(at[23], at[56]); 1731 MULADD(at[24], at[55]); 1732 MULADD(at[25], at[54]); 1733 MULADD(at[26], at[53]); 1734 MULADD(at[27], at[52]); 1735 MULADD(at[28], at[51]); 1736 MULADD(at[29], at[50]); 1737 MULADD(at[30], at[49]); 1738 MULADD(at[31], at[48]); 1739 COMBA_STORE(C->dp[47]); 1740 /* 48 */ 1741 COMBA_FORWARD; 1742 MULADD(at[17], at[63]); 1743 MULADD(at[18], at[62]); 1744 MULADD(at[19], at[61]); 1745 MULADD(at[20], at[60]); 1746 MULADD(at[21], at[59]); 1747 MULADD(at[22], at[58]); 1748 MULADD(at[23], at[57]); 1749 MULADD(at[24], at[56]); 1750 MULADD(at[25], at[55]); 1751 MULADD(at[26], at[54]); 1752 MULADD(at[27], at[53]); 1753 MULADD(at[28], at[52]); 1754 MULADD(at[29], at[51]); 1755 MULADD(at[30], at[50]); 1756 MULADD(at[31], at[49]); 1757 COMBA_STORE(C->dp[48]); 1758 /* 49 */ 1759 COMBA_FORWARD; 1760 MULADD(at[18], at[63]); 1761 MULADD(at[19], at[62]); 1762 MULADD(at[20], at[61]); 1763 MULADD(at[21], at[60]); 1764 MULADD(at[22], at[59]); 1765 MULADD(at[23], at[58]); 1766 MULADD(at[24], at[57]); 1767 MULADD(at[25], at[56]); 1768 MULADD(at[26], at[55]); 1769 MULADD(at[27], at[54]); 1770 MULADD(at[28], at[53]); 1771 MULADD(at[29], at[52]); 1772 MULADD(at[30], at[51]); 1773 MULADD(at[31], at[50]); 1774 COMBA_STORE(C->dp[49]); 1775 /* 50 */ 1776 COMBA_FORWARD; 1777 MULADD(at[19], at[63]); 1778 MULADD(at[20], at[62]); 1779 MULADD(at[21], at[61]); 1780 MULADD(at[22], at[60]); 1781 MULADD(at[23], at[59]); 1782 MULADD(at[24], at[58]); 1783 MULADD(at[25], at[57]); 1784 MULADD(at[26], at[56]); 1785 MULADD(at[27], at[55]); 1786 MULADD(at[28], at[54]); 1787 MULADD(at[29], at[53]); 1788 MULADD(at[30], at[52]); 1789 MULADD(at[31], at[51]); 1790 COMBA_STORE(C->dp[50]); 1791 /* 51 */ 1792 COMBA_FORWARD; 1793 MULADD(at[20], at[63]); 1794 MULADD(at[21], at[62]); 1795 MULADD(at[22], at[61]); 1796 MULADD(at[23], at[60]); 1797 MULADD(at[24], at[59]); 1798 MULADD(at[25], at[58]); 1799 MULADD(at[26], at[57]); 1800 MULADD(at[27], at[56]); 1801 MULADD(at[28], at[55]); 1802 MULADD(at[29], at[54]); 1803 MULADD(at[30], at[53]); 1804 MULADD(at[31], at[52]); 1805 COMBA_STORE(C->dp[51]); 1806 /* 52 */ 1807 COMBA_FORWARD; 1808 MULADD(at[21], at[63]); 1809 MULADD(at[22], at[62]); 1810 MULADD(at[23], at[61]); 1811 MULADD(at[24], at[60]); 1812 MULADD(at[25], at[59]); 1813 MULADD(at[26], at[58]); 1814 MULADD(at[27], at[57]); 1815 MULADD(at[28], at[56]); 1816 MULADD(at[29], at[55]); 1817 MULADD(at[30], at[54]); 1818 MULADD(at[31], at[53]); 1819 COMBA_STORE(C->dp[52]); 1820 /* 53 */ 1821 COMBA_FORWARD; 1822 MULADD(at[22], at[63]); 1823 MULADD(at[23], at[62]); 1824 MULADD(at[24], at[61]); 1825 MULADD(at[25], at[60]); 1826 MULADD(at[26], at[59]); 1827 MULADD(at[27], at[58]); 1828 MULADD(at[28], at[57]); 1829 MULADD(at[29], at[56]); 1830 MULADD(at[30], at[55]); 1831 MULADD(at[31], at[54]); 1832 COMBA_STORE(C->dp[53]); 1833 /* 54 */ 1834 COMBA_FORWARD; 1835 MULADD(at[23], at[63]); 1836 MULADD(at[24], at[62]); 1837 MULADD(at[25], at[61]); 1838 MULADD(at[26], at[60]); 1839 MULADD(at[27], at[59]); 1840 MULADD(at[28], at[58]); 1841 MULADD(at[29], at[57]); 1842 MULADD(at[30], at[56]); 1843 MULADD(at[31], at[55]); 1844 COMBA_STORE(C->dp[54]); 1845 /* 55 */ 1846 COMBA_FORWARD; 1847 MULADD(at[24], at[63]); 1848 MULADD(at[25], at[62]); 1849 MULADD(at[26], at[61]); 1850 MULADD(at[27], at[60]); 1851 MULADD(at[28], at[59]); 1852 MULADD(at[29], at[58]); 1853 MULADD(at[30], at[57]); 1854 MULADD(at[31], at[56]); 1855 COMBA_STORE(C->dp[55]); 1856 /* 56 */ 1857 COMBA_FORWARD; 1858 MULADD(at[25], at[63]); 1859 MULADD(at[26], at[62]); 1860 MULADD(at[27], at[61]); 1861 MULADD(at[28], at[60]); 1862 MULADD(at[29], at[59]); 1863 MULADD(at[30], at[58]); 1864 MULADD(at[31], at[57]); 1865 COMBA_STORE(C->dp[56]); 1866 /* 57 */ 1867 COMBA_FORWARD; 1868 MULADD(at[26], at[63]); 1869 MULADD(at[27], at[62]); 1870 MULADD(at[28], at[61]); 1871 MULADD(at[29], at[60]); 1872 MULADD(at[30], at[59]); 1873 MULADD(at[31], at[58]); 1874 COMBA_STORE(C->dp[57]); 1875 /* 58 */ 1876 COMBA_FORWARD; 1877 MULADD(at[27], at[63]); 1878 MULADD(at[28], at[62]); 1879 MULADD(at[29], at[61]); 1880 MULADD(at[30], at[60]); 1881 MULADD(at[31], at[59]); 1882 COMBA_STORE(C->dp[58]); 1883 /* 59 */ 1884 COMBA_FORWARD; 1885 MULADD(at[28], at[63]); 1886 MULADD(at[29], at[62]); 1887 MULADD(at[30], at[61]); 1888 MULADD(at[31], at[60]); 1889 COMBA_STORE(C->dp[59]); 1890 /* 60 */ 1891 COMBA_FORWARD; 1892 MULADD(at[29], at[63]); 1893 MULADD(at[30], at[62]); 1894 MULADD(at[31], at[61]); 1895 COMBA_STORE(C->dp[60]); 1896 /* 61 */ 1897 COMBA_FORWARD; 1898 MULADD(at[30], at[63]); 1899 MULADD(at[31], at[62]); 1900 COMBA_STORE(C->dp[61]); 1901 /* 62 */ 1902 COMBA_FORWARD; 1903 MULADD(at[31], at[63]); 1904 COMBA_STORE(C->dp[62]); 1905 COMBA_STORE2(C->dp[63]); 1906 C->used = 64; 1907 C->sign = A->sign ^ B->sign; 1908 mp_clamp(C); 1909 COMBA_FINI; 1910 } 1911 1912 void 1913 s_mp_sqr_comba_4(const mp_int *A, mp_int *B) 1914 { 1915 mp_digit *a, b[8], c0, c1, c2; 1916 1917 a = A->dp; 1918 COMBA_START; 1919 1920 /* clear carries */ 1921 CLEAR_CARRY; 1922 1923 /* output 0 */ 1924 SQRADD(a[0], a[0]); 1925 COMBA_STORE(b[0]); 1926 1927 /* output 1 */ 1928 CARRY_FORWARD; 1929 SQRADD2(a[0], a[1]); 1930 COMBA_STORE(b[1]); 1931 1932 /* output 2 */ 1933 CARRY_FORWARD; 1934 SQRADD2(a[0], a[2]); 1935 SQRADD(a[1], a[1]); 1936 COMBA_STORE(b[2]); 1937 1938 /* output 3 */ 1939 CARRY_FORWARD; 1940 SQRADD2(a[0], a[3]); 1941 SQRADD2(a[1], a[2]); 1942 COMBA_STORE(b[3]); 1943 1944 /* output 4 */ 1945 CARRY_FORWARD; 1946 SQRADD2(a[1], a[3]); 1947 SQRADD(a[2], a[2]); 1948 COMBA_STORE(b[4]); 1949 1950 /* output 5 */ 1951 CARRY_FORWARD; 1952 SQRADD2(a[2], a[3]); 1953 COMBA_STORE(b[5]); 1954 1955 /* output 6 */ 1956 CARRY_FORWARD; 1957 SQRADD(a[3], a[3]); 1958 COMBA_STORE(b[6]); 1959 COMBA_STORE2(b[7]); 1960 COMBA_FINI; 1961 1962 B->used = 8; 1963 B->sign = ZPOS; 1964 memcpy(B->dp, b, 8 * sizeof(mp_digit)); 1965 mp_clamp(B); 1966 } 1967 1968 void 1969 s_mp_sqr_comba_8(const mp_int *A, mp_int *B) 1970 { 1971 mp_digit *a, b[16], c0, c1, c2, sc0, sc1, sc2; 1972 1973 a = A->dp; 1974 COMBA_START; 1975 1976 /* clear carries */ 1977 CLEAR_CARRY; 1978 1979 /* output 0 */ 1980 SQRADD(a[0], a[0]); 1981 COMBA_STORE(b[0]); 1982 1983 /* output 1 */ 1984 CARRY_FORWARD; 1985 SQRADD2(a[0], a[1]); 1986 COMBA_STORE(b[1]); 1987 1988 /* output 2 */ 1989 CARRY_FORWARD; 1990 SQRADD2(a[0], a[2]); 1991 SQRADD(a[1], a[1]); 1992 COMBA_STORE(b[2]); 1993 1994 /* output 3 */ 1995 CARRY_FORWARD; 1996 SQRADD2(a[0], a[3]); 1997 SQRADD2(a[1], a[2]); 1998 COMBA_STORE(b[3]); 1999 2000 /* output 4 */ 2001 CARRY_FORWARD; 2002 SQRADD2(a[0], a[4]); 2003 SQRADD2(a[1], a[3]); 2004 SQRADD(a[2], a[2]); 2005 COMBA_STORE(b[4]); 2006 2007 /* output 5 */ 2008 CARRY_FORWARD; 2009 SQRADDSC(a[0], a[5]); 2010 SQRADDAC(a[1], a[4]); 2011 SQRADDAC(a[2], a[3]); 2012 SQRADDDB; 2013 COMBA_STORE(b[5]); 2014 2015 /* output 6 */ 2016 CARRY_FORWARD; 2017 SQRADDSC(a[0], a[6]); 2018 SQRADDAC(a[1], a[5]); 2019 SQRADDAC(a[2], a[4]); 2020 SQRADDDB; 2021 SQRADD(a[3], a[3]); 2022 COMBA_STORE(b[6]); 2023 2024 /* output 7 */ 2025 CARRY_FORWARD; 2026 SQRADDSC(a[0], a[7]); 2027 SQRADDAC(a[1], a[6]); 2028 SQRADDAC(a[2], a[5]); 2029 SQRADDAC(a[3], a[4]); 2030 SQRADDDB; 2031 COMBA_STORE(b[7]); 2032 2033 /* output 8 */ 2034 CARRY_FORWARD; 2035 SQRADDSC(a[1], a[7]); 2036 SQRADDAC(a[2], a[6]); 2037 SQRADDAC(a[3], a[5]); 2038 SQRADDDB; 2039 SQRADD(a[4], a[4]); 2040 COMBA_STORE(b[8]); 2041 2042 /* output 9 */ 2043 CARRY_FORWARD; 2044 SQRADDSC(a[2], a[7]); 2045 SQRADDAC(a[3], a[6]); 2046 SQRADDAC(a[4], a[5]); 2047 SQRADDDB; 2048 COMBA_STORE(b[9]); 2049 2050 /* output 10 */ 2051 CARRY_FORWARD; 2052 SQRADD2(a[3], a[7]); 2053 SQRADD2(a[4], a[6]); 2054 SQRADD(a[5], a[5]); 2055 COMBA_STORE(b[10]); 2056 2057 /* output 11 */ 2058 CARRY_FORWARD; 2059 SQRADD2(a[4], a[7]); 2060 SQRADD2(a[5], a[6]); 2061 COMBA_STORE(b[11]); 2062 2063 /* output 12 */ 2064 CARRY_FORWARD; 2065 SQRADD2(a[5], a[7]); 2066 SQRADD(a[6], a[6]); 2067 COMBA_STORE(b[12]); 2068 2069 /* output 13 */ 2070 CARRY_FORWARD; 2071 SQRADD2(a[6], a[7]); 2072 COMBA_STORE(b[13]); 2073 2074 /* output 14 */ 2075 CARRY_FORWARD; 2076 SQRADD(a[7], a[7]); 2077 COMBA_STORE(b[14]); 2078 COMBA_STORE2(b[15]); 2079 COMBA_FINI; 2080 2081 B->used = 16; 2082 B->sign = ZPOS; 2083 memcpy(B->dp, b, 16 * sizeof(mp_digit)); 2084 mp_clamp(B); 2085 } 2086 2087 void 2088 s_mp_sqr_comba_16(const mp_int *A, mp_int *B) 2089 { 2090 mp_digit *a, b[32], c0, c1, c2, sc0, sc1, sc2; 2091 2092 a = A->dp; 2093 COMBA_START; 2094 2095 /* clear carries */ 2096 CLEAR_CARRY; 2097 2098 /* output 0 */ 2099 SQRADD(a[0], a[0]); 2100 COMBA_STORE(b[0]); 2101 2102 /* output 1 */ 2103 CARRY_FORWARD; 2104 SQRADD2(a[0], a[1]); 2105 COMBA_STORE(b[1]); 2106 2107 /* output 2 */ 2108 CARRY_FORWARD; 2109 SQRADD2(a[0], a[2]); 2110 SQRADD(a[1], a[1]); 2111 COMBA_STORE(b[2]); 2112 2113 /* output 3 */ 2114 CARRY_FORWARD; 2115 SQRADD2(a[0], a[3]); 2116 SQRADD2(a[1], a[2]); 2117 COMBA_STORE(b[3]); 2118 2119 /* output 4 */ 2120 CARRY_FORWARD; 2121 SQRADD2(a[0], a[4]); 2122 SQRADD2(a[1], a[3]); 2123 SQRADD(a[2], a[2]); 2124 COMBA_STORE(b[4]); 2125 2126 /* output 5 */ 2127 CARRY_FORWARD; 2128 SQRADDSC(a[0], a[5]); 2129 SQRADDAC(a[1], a[4]); 2130 SQRADDAC(a[2], a[3]); 2131 SQRADDDB; 2132 COMBA_STORE(b[5]); 2133 2134 /* output 6 */ 2135 CARRY_FORWARD; 2136 SQRADDSC(a[0], a[6]); 2137 SQRADDAC(a[1], a[5]); 2138 SQRADDAC(a[2], a[4]); 2139 SQRADDDB; 2140 SQRADD(a[3], a[3]); 2141 COMBA_STORE(b[6]); 2142 2143 /* output 7 */ 2144 CARRY_FORWARD; 2145 SQRADDSC(a[0], a[7]); 2146 SQRADDAC(a[1], a[6]); 2147 SQRADDAC(a[2], a[5]); 2148 SQRADDAC(a[3], a[4]); 2149 SQRADDDB; 2150 COMBA_STORE(b[7]); 2151 2152 /* output 8 */ 2153 CARRY_FORWARD; 2154 SQRADDSC(a[0], a[8]); 2155 SQRADDAC(a[1], a[7]); 2156 SQRADDAC(a[2], a[6]); 2157 SQRADDAC(a[3], a[5]); 2158 SQRADDDB; 2159 SQRADD(a[4], a[4]); 2160 COMBA_STORE(b[8]); 2161 2162 /* output 9 */ 2163 CARRY_FORWARD; 2164 SQRADDSC(a[0], a[9]); 2165 SQRADDAC(a[1], a[8]); 2166 SQRADDAC(a[2], a[7]); 2167 SQRADDAC(a[3], a[6]); 2168 SQRADDAC(a[4], a[5]); 2169 SQRADDDB; 2170 COMBA_STORE(b[9]); 2171 2172 /* output 10 */ 2173 CARRY_FORWARD; 2174 SQRADDSC(a[0], a[10]); 2175 SQRADDAC(a[1], a[9]); 2176 SQRADDAC(a[2], a[8]); 2177 SQRADDAC(a[3], a[7]); 2178 SQRADDAC(a[4], a[6]); 2179 SQRADDDB; 2180 SQRADD(a[5], a[5]); 2181 COMBA_STORE(b[10]); 2182 2183 /* output 11 */ 2184 CARRY_FORWARD; 2185 SQRADDSC(a[0], a[11]); 2186 SQRADDAC(a[1], a[10]); 2187 SQRADDAC(a[2], a[9]); 2188 SQRADDAC(a[3], a[8]); 2189 SQRADDAC(a[4], a[7]); 2190 SQRADDAC(a[5], a[6]); 2191 SQRADDDB; 2192 COMBA_STORE(b[11]); 2193 2194 /* output 12 */ 2195 CARRY_FORWARD; 2196 SQRADDSC(a[0], a[12]); 2197 SQRADDAC(a[1], a[11]); 2198 SQRADDAC(a[2], a[10]); 2199 SQRADDAC(a[3], a[9]); 2200 SQRADDAC(a[4], a[8]); 2201 SQRADDAC(a[5], a[7]); 2202 SQRADDDB; 2203 SQRADD(a[6], a[6]); 2204 COMBA_STORE(b[12]); 2205 2206 /* output 13 */ 2207 CARRY_FORWARD; 2208 SQRADDSC(a[0], a[13]); 2209 SQRADDAC(a[1], a[12]); 2210 SQRADDAC(a[2], a[11]); 2211 SQRADDAC(a[3], a[10]); 2212 SQRADDAC(a[4], a[9]); 2213 SQRADDAC(a[5], a[8]); 2214 SQRADDAC(a[6], a[7]); 2215 SQRADDDB; 2216 COMBA_STORE(b[13]); 2217 2218 /* output 14 */ 2219 CARRY_FORWARD; 2220 SQRADDSC(a[0], a[14]); 2221 SQRADDAC(a[1], a[13]); 2222 SQRADDAC(a[2], a[12]); 2223 SQRADDAC(a[3], a[11]); 2224 SQRADDAC(a[4], a[10]); 2225 SQRADDAC(a[5], a[9]); 2226 SQRADDAC(a[6], a[8]); 2227 SQRADDDB; 2228 SQRADD(a[7], a[7]); 2229 COMBA_STORE(b[14]); 2230 2231 /* output 15 */ 2232 CARRY_FORWARD; 2233 SQRADDSC(a[0], a[15]); 2234 SQRADDAC(a[1], a[14]); 2235 SQRADDAC(a[2], a[13]); 2236 SQRADDAC(a[3], a[12]); 2237 SQRADDAC(a[4], a[11]); 2238 SQRADDAC(a[5], a[10]); 2239 SQRADDAC(a[6], a[9]); 2240 SQRADDAC(a[7], a[8]); 2241 SQRADDDB; 2242 COMBA_STORE(b[15]); 2243 2244 /* output 16 */ 2245 CARRY_FORWARD; 2246 SQRADDSC(a[1], a[15]); 2247 SQRADDAC(a[2], a[14]); 2248 SQRADDAC(a[3], a[13]); 2249 SQRADDAC(a[4], a[12]); 2250 SQRADDAC(a[5], a[11]); 2251 SQRADDAC(a[6], a[10]); 2252 SQRADDAC(a[7], a[9]); 2253 SQRADDDB; 2254 SQRADD(a[8], a[8]); 2255 COMBA_STORE(b[16]); 2256 2257 /* output 17 */ 2258 CARRY_FORWARD; 2259 SQRADDSC(a[2], a[15]); 2260 SQRADDAC(a[3], a[14]); 2261 SQRADDAC(a[4], a[13]); 2262 SQRADDAC(a[5], a[12]); 2263 SQRADDAC(a[6], a[11]); 2264 SQRADDAC(a[7], a[10]); 2265 SQRADDAC(a[8], a[9]); 2266 SQRADDDB; 2267 COMBA_STORE(b[17]); 2268 2269 /* output 18 */ 2270 CARRY_FORWARD; 2271 SQRADDSC(a[3], a[15]); 2272 SQRADDAC(a[4], a[14]); 2273 SQRADDAC(a[5], a[13]); 2274 SQRADDAC(a[6], a[12]); 2275 SQRADDAC(a[7], a[11]); 2276 SQRADDAC(a[8], a[10]); 2277 SQRADDDB; 2278 SQRADD(a[9], a[9]); 2279 COMBA_STORE(b[18]); 2280 2281 /* output 19 */ 2282 CARRY_FORWARD; 2283 SQRADDSC(a[4], a[15]); 2284 SQRADDAC(a[5], a[14]); 2285 SQRADDAC(a[6], a[13]); 2286 SQRADDAC(a[7], a[12]); 2287 SQRADDAC(a[8], a[11]); 2288 SQRADDAC(a[9], a[10]); 2289 SQRADDDB; 2290 COMBA_STORE(b[19]); 2291 2292 /* output 20 */ 2293 CARRY_FORWARD; 2294 SQRADDSC(a[5], a[15]); 2295 SQRADDAC(a[6], a[14]); 2296 SQRADDAC(a[7], a[13]); 2297 SQRADDAC(a[8], a[12]); 2298 SQRADDAC(a[9], a[11]); 2299 SQRADDDB; 2300 SQRADD(a[10], a[10]); 2301 COMBA_STORE(b[20]); 2302 2303 /* output 21 */ 2304 CARRY_FORWARD; 2305 SQRADDSC(a[6], a[15]); 2306 SQRADDAC(a[7], a[14]); 2307 SQRADDAC(a[8], a[13]); 2308 SQRADDAC(a[9], a[12]); 2309 SQRADDAC(a[10], a[11]); 2310 SQRADDDB; 2311 COMBA_STORE(b[21]); 2312 2313 /* output 22 */ 2314 CARRY_FORWARD; 2315 SQRADDSC(a[7], a[15]); 2316 SQRADDAC(a[8], a[14]); 2317 SQRADDAC(a[9], a[13]); 2318 SQRADDAC(a[10], a[12]); 2319 SQRADDDB; 2320 SQRADD(a[11], a[11]); 2321 COMBA_STORE(b[22]); 2322 2323 /* output 23 */ 2324 CARRY_FORWARD; 2325 SQRADDSC(a[8], a[15]); 2326 SQRADDAC(a[9], a[14]); 2327 SQRADDAC(a[10], a[13]); 2328 SQRADDAC(a[11], a[12]); 2329 SQRADDDB; 2330 COMBA_STORE(b[23]); 2331 2332 /* output 24 */ 2333 CARRY_FORWARD; 2334 SQRADDSC(a[9], a[15]); 2335 SQRADDAC(a[10], a[14]); 2336 SQRADDAC(a[11], a[13]); 2337 SQRADDDB; 2338 SQRADD(a[12], a[12]); 2339 COMBA_STORE(b[24]); 2340 2341 /* output 25 */ 2342 CARRY_FORWARD; 2343 SQRADDSC(a[10], a[15]); 2344 SQRADDAC(a[11], a[14]); 2345 SQRADDAC(a[12], a[13]); 2346 SQRADDDB; 2347 COMBA_STORE(b[25]); 2348 2349 /* output 26 */ 2350 CARRY_FORWARD; 2351 SQRADD2(a[11], a[15]); 2352 SQRADD2(a[12], a[14]); 2353 SQRADD(a[13], a[13]); 2354 COMBA_STORE(b[26]); 2355 2356 /* output 27 */ 2357 CARRY_FORWARD; 2358 SQRADD2(a[12], a[15]); 2359 SQRADD2(a[13], a[14]); 2360 COMBA_STORE(b[27]); 2361 2362 /* output 28 */ 2363 CARRY_FORWARD; 2364 SQRADD2(a[13], a[15]); 2365 SQRADD(a[14], a[14]); 2366 COMBA_STORE(b[28]); 2367 2368 /* output 29 */ 2369 CARRY_FORWARD; 2370 SQRADD2(a[14], a[15]); 2371 COMBA_STORE(b[29]); 2372 2373 /* output 30 */ 2374 CARRY_FORWARD; 2375 SQRADD(a[15], a[15]); 2376 COMBA_STORE(b[30]); 2377 COMBA_STORE2(b[31]); 2378 COMBA_FINI; 2379 2380 B->used = 32; 2381 B->sign = ZPOS; 2382 memcpy(B->dp, b, 32 * sizeof(mp_digit)); 2383 mp_clamp(B); 2384 } 2385 2386 void 2387 s_mp_sqr_comba_32(const mp_int *A, mp_int *B) 2388 { 2389 mp_digit *a, b[64], c0, c1, c2, sc0, sc1, sc2; 2390 2391 a = A->dp; 2392 COMBA_START; 2393 2394 /* clear carries */ 2395 CLEAR_CARRY; 2396 2397 /* output 0 */ 2398 SQRADD(a[0], a[0]); 2399 COMBA_STORE(b[0]); 2400 2401 /* output 1 */ 2402 CARRY_FORWARD; 2403 SQRADD2(a[0], a[1]); 2404 COMBA_STORE(b[1]); 2405 2406 /* output 2 */ 2407 CARRY_FORWARD; 2408 SQRADD2(a[0], a[2]); 2409 SQRADD(a[1], a[1]); 2410 COMBA_STORE(b[2]); 2411 2412 /* output 3 */ 2413 CARRY_FORWARD; 2414 SQRADD2(a[0], a[3]); 2415 SQRADD2(a[1], a[2]); 2416 COMBA_STORE(b[3]); 2417 2418 /* output 4 */ 2419 CARRY_FORWARD; 2420 SQRADD2(a[0], a[4]); 2421 SQRADD2(a[1], a[3]); 2422 SQRADD(a[2], a[2]); 2423 COMBA_STORE(b[4]); 2424 2425 /* output 5 */ 2426 CARRY_FORWARD; 2427 SQRADDSC(a[0], a[5]); 2428 SQRADDAC(a[1], a[4]); 2429 SQRADDAC(a[2], a[3]); 2430 SQRADDDB; 2431 COMBA_STORE(b[5]); 2432 2433 /* output 6 */ 2434 CARRY_FORWARD; 2435 SQRADDSC(a[0], a[6]); 2436 SQRADDAC(a[1], a[5]); 2437 SQRADDAC(a[2], a[4]); 2438 SQRADDDB; 2439 SQRADD(a[3], a[3]); 2440 COMBA_STORE(b[6]); 2441 2442 /* output 7 */ 2443 CARRY_FORWARD; 2444 SQRADDSC(a[0], a[7]); 2445 SQRADDAC(a[1], a[6]); 2446 SQRADDAC(a[2], a[5]); 2447 SQRADDAC(a[3], a[4]); 2448 SQRADDDB; 2449 COMBA_STORE(b[7]); 2450 2451 /* output 8 */ 2452 CARRY_FORWARD; 2453 SQRADDSC(a[0], a[8]); 2454 SQRADDAC(a[1], a[7]); 2455 SQRADDAC(a[2], a[6]); 2456 SQRADDAC(a[3], a[5]); 2457 SQRADDDB; 2458 SQRADD(a[4], a[4]); 2459 COMBA_STORE(b[8]); 2460 2461 /* output 9 */ 2462 CARRY_FORWARD; 2463 SQRADDSC(a[0], a[9]); 2464 SQRADDAC(a[1], a[8]); 2465 SQRADDAC(a[2], a[7]); 2466 SQRADDAC(a[3], a[6]); 2467 SQRADDAC(a[4], a[5]); 2468 SQRADDDB; 2469 COMBA_STORE(b[9]); 2470 2471 /* output 10 */ 2472 CARRY_FORWARD; 2473 SQRADDSC(a[0], a[10]); 2474 SQRADDAC(a[1], a[9]); 2475 SQRADDAC(a[2], a[8]); 2476 SQRADDAC(a[3], a[7]); 2477 SQRADDAC(a[4], a[6]); 2478 SQRADDDB; 2479 SQRADD(a[5], a[5]); 2480 COMBA_STORE(b[10]); 2481 2482 /* output 11 */ 2483 CARRY_FORWARD; 2484 SQRADDSC(a[0], a[11]); 2485 SQRADDAC(a[1], a[10]); 2486 SQRADDAC(a[2], a[9]); 2487 SQRADDAC(a[3], a[8]); 2488 SQRADDAC(a[4], a[7]); 2489 SQRADDAC(a[5], a[6]); 2490 SQRADDDB; 2491 COMBA_STORE(b[11]); 2492 2493 /* output 12 */ 2494 CARRY_FORWARD; 2495 SQRADDSC(a[0], a[12]); 2496 SQRADDAC(a[1], a[11]); 2497 SQRADDAC(a[2], a[10]); 2498 SQRADDAC(a[3], a[9]); 2499 SQRADDAC(a[4], a[8]); 2500 SQRADDAC(a[5], a[7]); 2501 SQRADDDB; 2502 SQRADD(a[6], a[6]); 2503 COMBA_STORE(b[12]); 2504 2505 /* output 13 */ 2506 CARRY_FORWARD; 2507 SQRADDSC(a[0], a[13]); 2508 SQRADDAC(a[1], a[12]); 2509 SQRADDAC(a[2], a[11]); 2510 SQRADDAC(a[3], a[10]); 2511 SQRADDAC(a[4], a[9]); 2512 SQRADDAC(a[5], a[8]); 2513 SQRADDAC(a[6], a[7]); 2514 SQRADDDB; 2515 COMBA_STORE(b[13]); 2516 2517 /* output 14 */ 2518 CARRY_FORWARD; 2519 SQRADDSC(a[0], a[14]); 2520 SQRADDAC(a[1], a[13]); 2521 SQRADDAC(a[2], a[12]); 2522 SQRADDAC(a[3], a[11]); 2523 SQRADDAC(a[4], a[10]); 2524 SQRADDAC(a[5], a[9]); 2525 SQRADDAC(a[6], a[8]); 2526 SQRADDDB; 2527 SQRADD(a[7], a[7]); 2528 COMBA_STORE(b[14]); 2529 2530 /* output 15 */ 2531 CARRY_FORWARD; 2532 SQRADDSC(a[0], a[15]); 2533 SQRADDAC(a[1], a[14]); 2534 SQRADDAC(a[2], a[13]); 2535 SQRADDAC(a[3], a[12]); 2536 SQRADDAC(a[4], a[11]); 2537 SQRADDAC(a[5], a[10]); 2538 SQRADDAC(a[6], a[9]); 2539 SQRADDAC(a[7], a[8]); 2540 SQRADDDB; 2541 COMBA_STORE(b[15]); 2542 2543 /* output 16 */ 2544 CARRY_FORWARD; 2545 SQRADDSC(a[0], a[16]); 2546 SQRADDAC(a[1], a[15]); 2547 SQRADDAC(a[2], a[14]); 2548 SQRADDAC(a[3], a[13]); 2549 SQRADDAC(a[4], a[12]); 2550 SQRADDAC(a[5], a[11]); 2551 SQRADDAC(a[6], a[10]); 2552 SQRADDAC(a[7], a[9]); 2553 SQRADDDB; 2554 SQRADD(a[8], a[8]); 2555 COMBA_STORE(b[16]); 2556 2557 /* output 17 */ 2558 CARRY_FORWARD; 2559 SQRADDSC(a[0], a[17]); 2560 SQRADDAC(a[1], a[16]); 2561 SQRADDAC(a[2], a[15]); 2562 SQRADDAC(a[3], a[14]); 2563 SQRADDAC(a[4], a[13]); 2564 SQRADDAC(a[5], a[12]); 2565 SQRADDAC(a[6], a[11]); 2566 SQRADDAC(a[7], a[10]); 2567 SQRADDAC(a[8], a[9]); 2568 SQRADDDB; 2569 COMBA_STORE(b[17]); 2570 2571 /* output 18 */ 2572 CARRY_FORWARD; 2573 SQRADDSC(a[0], a[18]); 2574 SQRADDAC(a[1], a[17]); 2575 SQRADDAC(a[2], a[16]); 2576 SQRADDAC(a[3], a[15]); 2577 SQRADDAC(a[4], a[14]); 2578 SQRADDAC(a[5], a[13]); 2579 SQRADDAC(a[6], a[12]); 2580 SQRADDAC(a[7], a[11]); 2581 SQRADDAC(a[8], a[10]); 2582 SQRADDDB; 2583 SQRADD(a[9], a[9]); 2584 COMBA_STORE(b[18]); 2585 2586 /* output 19 */ 2587 CARRY_FORWARD; 2588 SQRADDSC(a[0], a[19]); 2589 SQRADDAC(a[1], a[18]); 2590 SQRADDAC(a[2], a[17]); 2591 SQRADDAC(a[3], a[16]); 2592 SQRADDAC(a[4], a[15]); 2593 SQRADDAC(a[5], a[14]); 2594 SQRADDAC(a[6], a[13]); 2595 SQRADDAC(a[7], a[12]); 2596 SQRADDAC(a[8], a[11]); 2597 SQRADDAC(a[9], a[10]); 2598 SQRADDDB; 2599 COMBA_STORE(b[19]); 2600 2601 /* output 20 */ 2602 CARRY_FORWARD; 2603 SQRADDSC(a[0], a[20]); 2604 SQRADDAC(a[1], a[19]); 2605 SQRADDAC(a[2], a[18]); 2606 SQRADDAC(a[3], a[17]); 2607 SQRADDAC(a[4], a[16]); 2608 SQRADDAC(a[5], a[15]); 2609 SQRADDAC(a[6], a[14]); 2610 SQRADDAC(a[7], a[13]); 2611 SQRADDAC(a[8], a[12]); 2612 SQRADDAC(a[9], a[11]); 2613 SQRADDDB; 2614 SQRADD(a[10], a[10]); 2615 COMBA_STORE(b[20]); 2616 2617 /* output 21 */ 2618 CARRY_FORWARD; 2619 SQRADDSC(a[0], a[21]); 2620 SQRADDAC(a[1], a[20]); 2621 SQRADDAC(a[2], a[19]); 2622 SQRADDAC(a[3], a[18]); 2623 SQRADDAC(a[4], a[17]); 2624 SQRADDAC(a[5], a[16]); 2625 SQRADDAC(a[6], a[15]); 2626 SQRADDAC(a[7], a[14]); 2627 SQRADDAC(a[8], a[13]); 2628 SQRADDAC(a[9], a[12]); 2629 SQRADDAC(a[10], a[11]); 2630 SQRADDDB; 2631 COMBA_STORE(b[21]); 2632 2633 /* output 22 */ 2634 CARRY_FORWARD; 2635 SQRADDSC(a[0], a[22]); 2636 SQRADDAC(a[1], a[21]); 2637 SQRADDAC(a[2], a[20]); 2638 SQRADDAC(a[3], a[19]); 2639 SQRADDAC(a[4], a[18]); 2640 SQRADDAC(a[5], a[17]); 2641 SQRADDAC(a[6], a[16]); 2642 SQRADDAC(a[7], a[15]); 2643 SQRADDAC(a[8], a[14]); 2644 SQRADDAC(a[9], a[13]); 2645 SQRADDAC(a[10], a[12]); 2646 SQRADDDB; 2647 SQRADD(a[11], a[11]); 2648 COMBA_STORE(b[22]); 2649 2650 /* output 23 */ 2651 CARRY_FORWARD; 2652 SQRADDSC(a[0], a[23]); 2653 SQRADDAC(a[1], a[22]); 2654 SQRADDAC(a[2], a[21]); 2655 SQRADDAC(a[3], a[20]); 2656 SQRADDAC(a[4], a[19]); 2657 SQRADDAC(a[5], a[18]); 2658 SQRADDAC(a[6], a[17]); 2659 SQRADDAC(a[7], a[16]); 2660 SQRADDAC(a[8], a[15]); 2661 SQRADDAC(a[9], a[14]); 2662 SQRADDAC(a[10], a[13]); 2663 SQRADDAC(a[11], a[12]); 2664 SQRADDDB; 2665 COMBA_STORE(b[23]); 2666 2667 /* output 24 */ 2668 CARRY_FORWARD; 2669 SQRADDSC(a[0], a[24]); 2670 SQRADDAC(a[1], a[23]); 2671 SQRADDAC(a[2], a[22]); 2672 SQRADDAC(a[3], a[21]); 2673 SQRADDAC(a[4], a[20]); 2674 SQRADDAC(a[5], a[19]); 2675 SQRADDAC(a[6], a[18]); 2676 SQRADDAC(a[7], a[17]); 2677 SQRADDAC(a[8], a[16]); 2678 SQRADDAC(a[9], a[15]); 2679 SQRADDAC(a[10], a[14]); 2680 SQRADDAC(a[11], a[13]); 2681 SQRADDDB; 2682 SQRADD(a[12], a[12]); 2683 COMBA_STORE(b[24]); 2684 2685 /* output 25 */ 2686 CARRY_FORWARD; 2687 SQRADDSC(a[0], a[25]); 2688 SQRADDAC(a[1], a[24]); 2689 SQRADDAC(a[2], a[23]); 2690 SQRADDAC(a[3], a[22]); 2691 SQRADDAC(a[4], a[21]); 2692 SQRADDAC(a[5], a[20]); 2693 SQRADDAC(a[6], a[19]); 2694 SQRADDAC(a[7], a[18]); 2695 SQRADDAC(a[8], a[17]); 2696 SQRADDAC(a[9], a[16]); 2697 SQRADDAC(a[10], a[15]); 2698 SQRADDAC(a[11], a[14]); 2699 SQRADDAC(a[12], a[13]); 2700 SQRADDDB; 2701 COMBA_STORE(b[25]); 2702 2703 /* output 26 */ 2704 CARRY_FORWARD; 2705 SQRADDSC(a[0], a[26]); 2706 SQRADDAC(a[1], a[25]); 2707 SQRADDAC(a[2], a[24]); 2708 SQRADDAC(a[3], a[23]); 2709 SQRADDAC(a[4], a[22]); 2710 SQRADDAC(a[5], a[21]); 2711 SQRADDAC(a[6], a[20]); 2712 SQRADDAC(a[7], a[19]); 2713 SQRADDAC(a[8], a[18]); 2714 SQRADDAC(a[9], a[17]); 2715 SQRADDAC(a[10], a[16]); 2716 SQRADDAC(a[11], a[15]); 2717 SQRADDAC(a[12], a[14]); 2718 SQRADDDB; 2719 SQRADD(a[13], a[13]); 2720 COMBA_STORE(b[26]); 2721 2722 /* output 27 */ 2723 CARRY_FORWARD; 2724 SQRADDSC(a[0], a[27]); 2725 SQRADDAC(a[1], a[26]); 2726 SQRADDAC(a[2], a[25]); 2727 SQRADDAC(a[3], a[24]); 2728 SQRADDAC(a[4], a[23]); 2729 SQRADDAC(a[5], a[22]); 2730 SQRADDAC(a[6], a[21]); 2731 SQRADDAC(a[7], a[20]); 2732 SQRADDAC(a[8], a[19]); 2733 SQRADDAC(a[9], a[18]); 2734 SQRADDAC(a[10], a[17]); 2735 SQRADDAC(a[11], a[16]); 2736 SQRADDAC(a[12], a[15]); 2737 SQRADDAC(a[13], a[14]); 2738 SQRADDDB; 2739 COMBA_STORE(b[27]); 2740 2741 /* output 28 */ 2742 CARRY_FORWARD; 2743 SQRADDSC(a[0], a[28]); 2744 SQRADDAC(a[1], a[27]); 2745 SQRADDAC(a[2], a[26]); 2746 SQRADDAC(a[3], a[25]); 2747 SQRADDAC(a[4], a[24]); 2748 SQRADDAC(a[5], a[23]); 2749 SQRADDAC(a[6], a[22]); 2750 SQRADDAC(a[7], a[21]); 2751 SQRADDAC(a[8], a[20]); 2752 SQRADDAC(a[9], a[19]); 2753 SQRADDAC(a[10], a[18]); 2754 SQRADDAC(a[11], a[17]); 2755 SQRADDAC(a[12], a[16]); 2756 SQRADDAC(a[13], a[15]); 2757 SQRADDDB; 2758 SQRADD(a[14], a[14]); 2759 COMBA_STORE(b[28]); 2760 2761 /* output 29 */ 2762 CARRY_FORWARD; 2763 SQRADDSC(a[0], a[29]); 2764 SQRADDAC(a[1], a[28]); 2765 SQRADDAC(a[2], a[27]); 2766 SQRADDAC(a[3], a[26]); 2767 SQRADDAC(a[4], a[25]); 2768 SQRADDAC(a[5], a[24]); 2769 SQRADDAC(a[6], a[23]); 2770 SQRADDAC(a[7], a[22]); 2771 SQRADDAC(a[8], a[21]); 2772 SQRADDAC(a[9], a[20]); 2773 SQRADDAC(a[10], a[19]); 2774 SQRADDAC(a[11], a[18]); 2775 SQRADDAC(a[12], a[17]); 2776 SQRADDAC(a[13], a[16]); 2777 SQRADDAC(a[14], a[15]); 2778 SQRADDDB; 2779 COMBA_STORE(b[29]); 2780 2781 /* output 30 */ 2782 CARRY_FORWARD; 2783 SQRADDSC(a[0], a[30]); 2784 SQRADDAC(a[1], a[29]); 2785 SQRADDAC(a[2], a[28]); 2786 SQRADDAC(a[3], a[27]); 2787 SQRADDAC(a[4], a[26]); 2788 SQRADDAC(a[5], a[25]); 2789 SQRADDAC(a[6], a[24]); 2790 SQRADDAC(a[7], a[23]); 2791 SQRADDAC(a[8], a[22]); 2792 SQRADDAC(a[9], a[21]); 2793 SQRADDAC(a[10], a[20]); 2794 SQRADDAC(a[11], a[19]); 2795 SQRADDAC(a[12], a[18]); 2796 SQRADDAC(a[13], a[17]); 2797 SQRADDAC(a[14], a[16]); 2798 SQRADDDB; 2799 SQRADD(a[15], a[15]); 2800 COMBA_STORE(b[30]); 2801 2802 /* output 31 */ 2803 CARRY_FORWARD; 2804 SQRADDSC(a[0], a[31]); 2805 SQRADDAC(a[1], a[30]); 2806 SQRADDAC(a[2], a[29]); 2807 SQRADDAC(a[3], a[28]); 2808 SQRADDAC(a[4], a[27]); 2809 SQRADDAC(a[5], a[26]); 2810 SQRADDAC(a[6], a[25]); 2811 SQRADDAC(a[7], a[24]); 2812 SQRADDAC(a[8], a[23]); 2813 SQRADDAC(a[9], a[22]); 2814 SQRADDAC(a[10], a[21]); 2815 SQRADDAC(a[11], a[20]); 2816 SQRADDAC(a[12], a[19]); 2817 SQRADDAC(a[13], a[18]); 2818 SQRADDAC(a[14], a[17]); 2819 SQRADDAC(a[15], a[16]); 2820 SQRADDDB; 2821 COMBA_STORE(b[31]); 2822 2823 /* output 32 */ 2824 CARRY_FORWARD; 2825 SQRADDSC(a[1], a[31]); 2826 SQRADDAC(a[2], a[30]); 2827 SQRADDAC(a[3], a[29]); 2828 SQRADDAC(a[4], a[28]); 2829 SQRADDAC(a[5], a[27]); 2830 SQRADDAC(a[6], a[26]); 2831 SQRADDAC(a[7], a[25]); 2832 SQRADDAC(a[8], a[24]); 2833 SQRADDAC(a[9], a[23]); 2834 SQRADDAC(a[10], a[22]); 2835 SQRADDAC(a[11], a[21]); 2836 SQRADDAC(a[12], a[20]); 2837 SQRADDAC(a[13], a[19]); 2838 SQRADDAC(a[14], a[18]); 2839 SQRADDAC(a[15], a[17]); 2840 SQRADDDB; 2841 SQRADD(a[16], a[16]); 2842 COMBA_STORE(b[32]); 2843 2844 /* output 33 */ 2845 CARRY_FORWARD; 2846 SQRADDSC(a[2], a[31]); 2847 SQRADDAC(a[3], a[30]); 2848 SQRADDAC(a[4], a[29]); 2849 SQRADDAC(a[5], a[28]); 2850 SQRADDAC(a[6], a[27]); 2851 SQRADDAC(a[7], a[26]); 2852 SQRADDAC(a[8], a[25]); 2853 SQRADDAC(a[9], a[24]); 2854 SQRADDAC(a[10], a[23]); 2855 SQRADDAC(a[11], a[22]); 2856 SQRADDAC(a[12], a[21]); 2857 SQRADDAC(a[13], a[20]); 2858 SQRADDAC(a[14], a[19]); 2859 SQRADDAC(a[15], a[18]); 2860 SQRADDAC(a[16], a[17]); 2861 SQRADDDB; 2862 COMBA_STORE(b[33]); 2863 2864 /* output 34 */ 2865 CARRY_FORWARD; 2866 SQRADDSC(a[3], a[31]); 2867 SQRADDAC(a[4], a[30]); 2868 SQRADDAC(a[5], a[29]); 2869 SQRADDAC(a[6], a[28]); 2870 SQRADDAC(a[7], a[27]); 2871 SQRADDAC(a[8], a[26]); 2872 SQRADDAC(a[9], a[25]); 2873 SQRADDAC(a[10], a[24]); 2874 SQRADDAC(a[11], a[23]); 2875 SQRADDAC(a[12], a[22]); 2876 SQRADDAC(a[13], a[21]); 2877 SQRADDAC(a[14], a[20]); 2878 SQRADDAC(a[15], a[19]); 2879 SQRADDAC(a[16], a[18]); 2880 SQRADDDB; 2881 SQRADD(a[17], a[17]); 2882 COMBA_STORE(b[34]); 2883 2884 /* output 35 */ 2885 CARRY_FORWARD; 2886 SQRADDSC(a[4], a[31]); 2887 SQRADDAC(a[5], a[30]); 2888 SQRADDAC(a[6], a[29]); 2889 SQRADDAC(a[7], a[28]); 2890 SQRADDAC(a[8], a[27]); 2891 SQRADDAC(a[9], a[26]); 2892 SQRADDAC(a[10], a[25]); 2893 SQRADDAC(a[11], a[24]); 2894 SQRADDAC(a[12], a[23]); 2895 SQRADDAC(a[13], a[22]); 2896 SQRADDAC(a[14], a[21]); 2897 SQRADDAC(a[15], a[20]); 2898 SQRADDAC(a[16], a[19]); 2899 SQRADDAC(a[17], a[18]); 2900 SQRADDDB; 2901 COMBA_STORE(b[35]); 2902 2903 /* output 36 */ 2904 CARRY_FORWARD; 2905 SQRADDSC(a[5], a[31]); 2906 SQRADDAC(a[6], a[30]); 2907 SQRADDAC(a[7], a[29]); 2908 SQRADDAC(a[8], a[28]); 2909 SQRADDAC(a[9], a[27]); 2910 SQRADDAC(a[10], a[26]); 2911 SQRADDAC(a[11], a[25]); 2912 SQRADDAC(a[12], a[24]); 2913 SQRADDAC(a[13], a[23]); 2914 SQRADDAC(a[14], a[22]); 2915 SQRADDAC(a[15], a[21]); 2916 SQRADDAC(a[16], a[20]); 2917 SQRADDAC(a[17], a[19]); 2918 SQRADDDB; 2919 SQRADD(a[18], a[18]); 2920 COMBA_STORE(b[36]); 2921 2922 /* output 37 */ 2923 CARRY_FORWARD; 2924 SQRADDSC(a[6], a[31]); 2925 SQRADDAC(a[7], a[30]); 2926 SQRADDAC(a[8], a[29]); 2927 SQRADDAC(a[9], a[28]); 2928 SQRADDAC(a[10], a[27]); 2929 SQRADDAC(a[11], a[26]); 2930 SQRADDAC(a[12], a[25]); 2931 SQRADDAC(a[13], a[24]); 2932 SQRADDAC(a[14], a[23]); 2933 SQRADDAC(a[15], a[22]); 2934 SQRADDAC(a[16], a[21]); 2935 SQRADDAC(a[17], a[20]); 2936 SQRADDAC(a[18], a[19]); 2937 SQRADDDB; 2938 COMBA_STORE(b[37]); 2939 2940 /* output 38 */ 2941 CARRY_FORWARD; 2942 SQRADDSC(a[7], a[31]); 2943 SQRADDAC(a[8], a[30]); 2944 SQRADDAC(a[9], a[29]); 2945 SQRADDAC(a[10], a[28]); 2946 SQRADDAC(a[11], a[27]); 2947 SQRADDAC(a[12], a[26]); 2948 SQRADDAC(a[13], a[25]); 2949 SQRADDAC(a[14], a[24]); 2950 SQRADDAC(a[15], a[23]); 2951 SQRADDAC(a[16], a[22]); 2952 SQRADDAC(a[17], a[21]); 2953 SQRADDAC(a[18], a[20]); 2954 SQRADDDB; 2955 SQRADD(a[19], a[19]); 2956 COMBA_STORE(b[38]); 2957 2958 /* output 39 */ 2959 CARRY_FORWARD; 2960 SQRADDSC(a[8], a[31]); 2961 SQRADDAC(a[9], a[30]); 2962 SQRADDAC(a[10], a[29]); 2963 SQRADDAC(a[11], a[28]); 2964 SQRADDAC(a[12], a[27]); 2965 SQRADDAC(a[13], a[26]); 2966 SQRADDAC(a[14], a[25]); 2967 SQRADDAC(a[15], a[24]); 2968 SQRADDAC(a[16], a[23]); 2969 SQRADDAC(a[17], a[22]); 2970 SQRADDAC(a[18], a[21]); 2971 SQRADDAC(a[19], a[20]); 2972 SQRADDDB; 2973 COMBA_STORE(b[39]); 2974 2975 /* output 40 */ 2976 CARRY_FORWARD; 2977 SQRADDSC(a[9], a[31]); 2978 SQRADDAC(a[10], a[30]); 2979 SQRADDAC(a[11], a[29]); 2980 SQRADDAC(a[12], a[28]); 2981 SQRADDAC(a[13], a[27]); 2982 SQRADDAC(a[14], a[26]); 2983 SQRADDAC(a[15], a[25]); 2984 SQRADDAC(a[16], a[24]); 2985 SQRADDAC(a[17], a[23]); 2986 SQRADDAC(a[18], a[22]); 2987 SQRADDAC(a[19], a[21]); 2988 SQRADDDB; 2989 SQRADD(a[20], a[20]); 2990 COMBA_STORE(b[40]); 2991 2992 /* output 41 */ 2993 CARRY_FORWARD; 2994 SQRADDSC(a[10], a[31]); 2995 SQRADDAC(a[11], a[30]); 2996 SQRADDAC(a[12], a[29]); 2997 SQRADDAC(a[13], a[28]); 2998 SQRADDAC(a[14], a[27]); 2999 SQRADDAC(a[15], a[26]); 3000 SQRADDAC(a[16], a[25]); 3001 SQRADDAC(a[17], a[24]); 3002 SQRADDAC(a[18], a[23]); 3003 SQRADDAC(a[19], a[22]); 3004 SQRADDAC(a[20], a[21]); 3005 SQRADDDB; 3006 COMBA_STORE(b[41]); 3007 3008 /* output 42 */ 3009 CARRY_FORWARD; 3010 SQRADDSC(a[11], a[31]); 3011 SQRADDAC(a[12], a[30]); 3012 SQRADDAC(a[13], a[29]); 3013 SQRADDAC(a[14], a[28]); 3014 SQRADDAC(a[15], a[27]); 3015 SQRADDAC(a[16], a[26]); 3016 SQRADDAC(a[17], a[25]); 3017 SQRADDAC(a[18], a[24]); 3018 SQRADDAC(a[19], a[23]); 3019 SQRADDAC(a[20], a[22]); 3020 SQRADDDB; 3021 SQRADD(a[21], a[21]); 3022 COMBA_STORE(b[42]); 3023 3024 /* output 43 */ 3025 CARRY_FORWARD; 3026 SQRADDSC(a[12], a[31]); 3027 SQRADDAC(a[13], a[30]); 3028 SQRADDAC(a[14], a[29]); 3029 SQRADDAC(a[15], a[28]); 3030 SQRADDAC(a[16], a[27]); 3031 SQRADDAC(a[17], a[26]); 3032 SQRADDAC(a[18], a[25]); 3033 SQRADDAC(a[19], a[24]); 3034 SQRADDAC(a[20], a[23]); 3035 SQRADDAC(a[21], a[22]); 3036 SQRADDDB; 3037 COMBA_STORE(b[43]); 3038 3039 /* output 44 */ 3040 CARRY_FORWARD; 3041 SQRADDSC(a[13], a[31]); 3042 SQRADDAC(a[14], a[30]); 3043 SQRADDAC(a[15], a[29]); 3044 SQRADDAC(a[16], a[28]); 3045 SQRADDAC(a[17], a[27]); 3046 SQRADDAC(a[18], a[26]); 3047 SQRADDAC(a[19], a[25]); 3048 SQRADDAC(a[20], a[24]); 3049 SQRADDAC(a[21], a[23]); 3050 SQRADDDB; 3051 SQRADD(a[22], a[22]); 3052 COMBA_STORE(b[44]); 3053 3054 /* output 45 */ 3055 CARRY_FORWARD; 3056 SQRADDSC(a[14], a[31]); 3057 SQRADDAC(a[15], a[30]); 3058 SQRADDAC(a[16], a[29]); 3059 SQRADDAC(a[17], a[28]); 3060 SQRADDAC(a[18], a[27]); 3061 SQRADDAC(a[19], a[26]); 3062 SQRADDAC(a[20], a[25]); 3063 SQRADDAC(a[21], a[24]); 3064 SQRADDAC(a[22], a[23]); 3065 SQRADDDB; 3066 COMBA_STORE(b[45]); 3067 3068 /* output 46 */ 3069 CARRY_FORWARD; 3070 SQRADDSC(a[15], a[31]); 3071 SQRADDAC(a[16], a[30]); 3072 SQRADDAC(a[17], a[29]); 3073 SQRADDAC(a[18], a[28]); 3074 SQRADDAC(a[19], a[27]); 3075 SQRADDAC(a[20], a[26]); 3076 SQRADDAC(a[21], a[25]); 3077 SQRADDAC(a[22], a[24]); 3078 SQRADDDB; 3079 SQRADD(a[23], a[23]); 3080 COMBA_STORE(b[46]); 3081 3082 /* output 47 */ 3083 CARRY_FORWARD; 3084 SQRADDSC(a[16], a[31]); 3085 SQRADDAC(a[17], a[30]); 3086 SQRADDAC(a[18], a[29]); 3087 SQRADDAC(a[19], a[28]); 3088 SQRADDAC(a[20], a[27]); 3089 SQRADDAC(a[21], a[26]); 3090 SQRADDAC(a[22], a[25]); 3091 SQRADDAC(a[23], a[24]); 3092 SQRADDDB; 3093 COMBA_STORE(b[47]); 3094 3095 /* output 48 */ 3096 CARRY_FORWARD; 3097 SQRADDSC(a[17], a[31]); 3098 SQRADDAC(a[18], a[30]); 3099 SQRADDAC(a[19], a[29]); 3100 SQRADDAC(a[20], a[28]); 3101 SQRADDAC(a[21], a[27]); 3102 SQRADDAC(a[22], a[26]); 3103 SQRADDAC(a[23], a[25]); 3104 SQRADDDB; 3105 SQRADD(a[24], a[24]); 3106 COMBA_STORE(b[48]); 3107 3108 /* output 49 */ 3109 CARRY_FORWARD; 3110 SQRADDSC(a[18], a[31]); 3111 SQRADDAC(a[19], a[30]); 3112 SQRADDAC(a[20], a[29]); 3113 SQRADDAC(a[21], a[28]); 3114 SQRADDAC(a[22], a[27]); 3115 SQRADDAC(a[23], a[26]); 3116 SQRADDAC(a[24], a[25]); 3117 SQRADDDB; 3118 COMBA_STORE(b[49]); 3119 3120 /* output 50 */ 3121 CARRY_FORWARD; 3122 SQRADDSC(a[19], a[31]); 3123 SQRADDAC(a[20], a[30]); 3124 SQRADDAC(a[21], a[29]); 3125 SQRADDAC(a[22], a[28]); 3126 SQRADDAC(a[23], a[27]); 3127 SQRADDAC(a[24], a[26]); 3128 SQRADDDB; 3129 SQRADD(a[25], a[25]); 3130 COMBA_STORE(b[50]); 3131 3132 /* output 51 */ 3133 CARRY_FORWARD; 3134 SQRADDSC(a[20], a[31]); 3135 SQRADDAC(a[21], a[30]); 3136 SQRADDAC(a[22], a[29]); 3137 SQRADDAC(a[23], a[28]); 3138 SQRADDAC(a[24], a[27]); 3139 SQRADDAC(a[25], a[26]); 3140 SQRADDDB; 3141 COMBA_STORE(b[51]); 3142 3143 /* output 52 */ 3144 CARRY_FORWARD; 3145 SQRADDSC(a[21], a[31]); 3146 SQRADDAC(a[22], a[30]); 3147 SQRADDAC(a[23], a[29]); 3148 SQRADDAC(a[24], a[28]); 3149 SQRADDAC(a[25], a[27]); 3150 SQRADDDB; 3151 SQRADD(a[26], a[26]); 3152 COMBA_STORE(b[52]); 3153 3154 /* output 53 */ 3155 CARRY_FORWARD; 3156 SQRADDSC(a[22], a[31]); 3157 SQRADDAC(a[23], a[30]); 3158 SQRADDAC(a[24], a[29]); 3159 SQRADDAC(a[25], a[28]); 3160 SQRADDAC(a[26], a[27]); 3161 SQRADDDB; 3162 COMBA_STORE(b[53]); 3163 3164 /* output 54 */ 3165 CARRY_FORWARD; 3166 SQRADDSC(a[23], a[31]); 3167 SQRADDAC(a[24], a[30]); 3168 SQRADDAC(a[25], a[29]); 3169 SQRADDAC(a[26], a[28]); 3170 SQRADDDB; 3171 SQRADD(a[27], a[27]); 3172 COMBA_STORE(b[54]); 3173 3174 /* output 55 */ 3175 CARRY_FORWARD; 3176 SQRADDSC(a[24], a[31]); 3177 SQRADDAC(a[25], a[30]); 3178 SQRADDAC(a[26], a[29]); 3179 SQRADDAC(a[27], a[28]); 3180 SQRADDDB; 3181 COMBA_STORE(b[55]); 3182 3183 /* output 56 */ 3184 CARRY_FORWARD; 3185 SQRADDSC(a[25], a[31]); 3186 SQRADDAC(a[26], a[30]); 3187 SQRADDAC(a[27], a[29]); 3188 SQRADDDB; 3189 SQRADD(a[28], a[28]); 3190 COMBA_STORE(b[56]); 3191 3192 /* output 57 */ 3193 CARRY_FORWARD; 3194 SQRADDSC(a[26], a[31]); 3195 SQRADDAC(a[27], a[30]); 3196 SQRADDAC(a[28], a[29]); 3197 SQRADDDB; 3198 COMBA_STORE(b[57]); 3199 3200 /* output 58 */ 3201 CARRY_FORWARD; 3202 SQRADD2(a[27], a[31]); 3203 SQRADD2(a[28], a[30]); 3204 SQRADD(a[29], a[29]); 3205 COMBA_STORE(b[58]); 3206 3207 /* output 59 */ 3208 CARRY_FORWARD; 3209 SQRADD2(a[28], a[31]); 3210 SQRADD2(a[29], a[30]); 3211 COMBA_STORE(b[59]); 3212 3213 /* output 60 */ 3214 CARRY_FORWARD; 3215 SQRADD2(a[29], a[31]); 3216 SQRADD(a[30], a[30]); 3217 COMBA_STORE(b[60]); 3218 3219 /* output 61 */ 3220 CARRY_FORWARD; 3221 SQRADD2(a[30], a[31]); 3222 COMBA_STORE(b[61]); 3223 3224 /* output 62 */ 3225 CARRY_FORWARD; 3226 SQRADD(a[31], a[31]); 3227 COMBA_STORE(b[62]); 3228 COMBA_STORE2(b[63]); 3229 COMBA_FINI; 3230 3231 B->used = 64; 3232 B->sign = ZPOS; 3233 memcpy(B->dp, b, 64 * sizeof(mp_digit)); 3234 mp_clamp(B); 3235 }