Fixed tfm_fp_mul_2 and tfm_fp_mul_d to handle leading digit correctly.
[crypto.git] / lib / silcmath / tfm.c
1 /*
2
3   tfm.c
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 2008 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; version 2 of the License.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18 */
19
20 /* Original code comes from public domain library tomsfastmath.  Any and
21    all changes made to that original code are not in public domain but are
22    copyrighted and licensed as defined above. */
23
24 /* We've changed the TFM to support dynamically allocated integers.  As good
25    and fast as the TFM is its main flaw is that it uses pre-allocated
26    integers.  This doesn't work in real life, unless of course you know
27    exactly how much memory you are going to use and need, or you don't care
28    about how much your program consumes memory.  On systems that need to work
29    in environments from few integers to tens of thousands allocated at the
30    same time, the dynamic allocation is the only right way to go to keep the
31    memory consumption in line.  It also has the added benefit that there is
32    no artificial limit to integer size.
33
34    The dynamically allocated integer can be initialized exactly the same
35    way as the original TFM integer.  It can be memset'ed to initialize, if
36    needed, but tfm_fp_init should be used.  However, tfm_fp_zero must always
37    be called to avoid memory leaks.  The integer thus is initialized to
38    no memory at first and will grow automatically.  It also supports
39    SilcStack.  With SilcStack integer reallocations are very fast and is
40    ideal to use in temp integers that are used only for computations and
41    not for storing integers for a long time.
42
43    Integers can be copied with tfm_fp_copy and it will automatically allocate
44    memory for the copied integer.  The contents of the integer can be
45    directly exchanged by exchanging the pointers with tfm_fp_exch, which is
46    much faster that the copy that must be used in original TFM to do the
47    same.
48
49    We've also added missing routines like bitwise AND, OR and XOR, sqrt,
50    expt_d and others. */
51
52 /* Implementation notes:
53
54    If result int doesn't have stack set, assure that it doesn't get stack
55    in the process.  Often routines tfm_fp_exch temp ints to the result.
56    Make sure the temp doesn't deliver stack to the result. */
57
58 #include <tfm.h>
59
60 /* Init to size */
61 int tfm_fp_init_size(SilcStack stack, tfm_fp_int *a, int size)
62 {
63   SILC_ASSERT(size);
64
65   if (stack)
66     stack = silc_stack_alloc(size, stack);
67
68   a->alloc = size + 1;
69   a->dp = silc_scalloc(stack, a->alloc, sizeof(*a->dp));
70   if (!a->dp)
71     return TFM_FP_MEM;
72   a->used = a->sign = 0;
73   a->stack = stack;
74   return TFM_FP_OKAY;
75 }
76
77 /* Uninit */
78 void tfm_fp_zero(tfm_fp_int *a)
79 {
80   silc_sfree(a->stack, a->dp);
81   a->dp = NULL;
82   a->alloc = a->used = a->sign = 0;
83   if (a->stack)
84     silc_stack_free(a->stack);
85 }
86
87 /* Zeroise */
88 static inline void tfm_fp_zeroise(tfm_fp_int *a)
89 {
90   if (a->used)
91     memset(a->dp, 0, a->used * sizeof(*a->dp));
92   a->sign = a->used = 0;
93 }
94
95 /* Grow integer */
96 int tfm_fp_grow(tfm_fp_int *a, int size)
97 {
98   void *tmp;
99
100   if (!size || a->alloc >= size)
101     return TFM_FP_OKAY;
102
103   size += 1;
104
105   SILC_LOG_DEBUG(("Grow %p from %d to %d", a, a->alloc, size));
106
107   tmp = silc_srealloc(a->stack, a->alloc * sizeof(*a->dp), a->dp,
108                       sizeof(*a->dp) * size);
109   if (!tmp)
110     return TFM_FP_MEM;
111   a->dp = tmp;
112
113   memset(a->dp + a->alloc, 0, (size - a->alloc) * sizeof(*a->dp));
114   a->alloc = size;
115
116   return TFM_FP_OKAY;
117 }
118
119 /* Copy */
120 int tfm_fp_copy(tfm_fp_int *a, tfm_fp_int *b)
121 {
122   if (a == b)
123     return TFM_FP_OKAY;
124
125   if (b->alloc < a->used) {
126     if (tfm_fp_grow(b, a->used))
127       return TFM_FP_MEM;
128   } else {
129     memset(b->dp + a->used, 0, (b->alloc - a->used) * sizeof(*b->dp));
130   }
131
132   memcpy(b->dp, a->dp, a->used * sizeof(*a->dp));
133
134   b->used = a->used;
135   b->sign = a->sign;
136
137   return TFM_FP_OKAY;
138 }
139
140 /* Init and copy.  Use stack as memory if non-NULL. */
141 int tfm_fp_init_copy(tfm_fp_int *a, tfm_fp_int *b, SilcStack stack)
142 {
143   tfm_fp_sinit(stack, a);
144   return tfm_fp_copy(b, a);
145 }
146
147 /* Simple exchange */
148 void tfm_fp_exch(tfm_fp_int *a, tfm_fp_int *b)
149 {
150   tfm_fp_int t;
151
152   if (a == b)
153     return;
154
155   t = *a;
156   *a = *b;
157   *b = t;
158 }
159
160 /* computes a = 2**b */
161 int tfm_fp_2expt(tfm_fp_int *a, int b)
162 {
163    int     z;
164
165    /* zero a as per default */
166    tfm_fp_zeroise (a);
167
168    if (b < 0) {
169       return TFM_FP_OKAY;
170    }
171
172    z = b / DIGIT_BIT;
173
174    /* Grow */
175    if (tfm_fp_grow(a, z + 1))
176      return TFM_FP_MEM;
177
178   /* set the used count of where the bit will go */
179   a->used = z + 1;
180
181   /* put the single bit in its place */
182   a->dp[z] = ((tfm_fp_digit)1) << (b % DIGIT_BIT);
183   return TFM_FP_OKAY;
184 }
185
186 int tfm_fp_add(tfm_fp_int *a, tfm_fp_int *b, tfm_fp_int *c)
187 {
188   int     sa, sb;
189
190   /* get sign of both inputs */
191   sa = a->sign;
192   sb = b->sign;
193
194   /* handle two cases, not four */
195   if (sa == sb) {
196     /* both positive or both negative */
197     /* add their magnitudes, copy the sign */
198     c->sign = sa;
199     return s_tfm_fp_add (a, b, c);
200   } else {
201     /* one positive, the other negative */
202     /* subtract the one with the greater magnitude from */
203     /* the one of the lesser magnitude.  The result gets */
204     /* the sign of the one with the greater magnitude. */
205     if (tfm_fp_cmp_mag (a, b) == TFM_FP_LT) {
206       c->sign = sb;
207       return s_tfm_fp_sub (b, a, c);
208     } else {
209       c->sign = sa;
210       return s_tfm_fp_sub (a, b, c);
211     }
212   }
213 }
214
215 /* c = a + b */
216 int tfm_fp_add_d(tfm_fp_int *a, tfm_fp_digit b, tfm_fp_int *c)
217 {
218    tfm_fp_int tmp;
219    int ret;
220
221    /* Grow when needed */
222    if (c->alloc < a->used + 1)
223      if (tfm_fp_grow(c, a->used + 1))
224        return TFM_FP_MEM;
225
226    tfm_fp_init(&tmp);
227    if (tfm_fp_set(&tmp, b)) {
228      tfm_fp_zero(&tmp);
229      return TFM_FP_MEM;
230    }
231    ret = tfm_fp_add(a,&tmp,c);
232    tfm_fp_zero(&tmp);
233
234    return ret;
235 }
236
237 /* d = a + b (mod c) */
238 int tfm_fp_addmod(tfm_fp_int *a, tfm_fp_int *b, tfm_fp_int *c, tfm_fp_int *d)
239 {
240   tfm_fp_int tmp;
241   int ret;
242
243   tfm_fp_init(&tmp);
244   if (tfm_fp_add(a, b, &tmp)) {
245     tfm_fp_zero(&tmp);
246     return TFM_FP_MEM;
247   }
248   ret = tfm_fp_mod(&tmp, c, d);
249   tfm_fp_zero(&tmp);
250
251   return ret;
252 }
253
254 int tfm_fp_cmp(tfm_fp_int *a, tfm_fp_int *b)
255 {
256    if (a->sign == TFM_FP_NEG && b->sign == TFM_FP_ZPOS) {
257       return TFM_FP_LT;
258    } else if (a->sign == TFM_FP_ZPOS && b->sign == TFM_FP_NEG) {
259       return TFM_FP_GT;
260    } else {
261       /* compare digits */
262       if (a->sign == TFM_FP_NEG) {
263          /* if negative compare opposite direction */
264          return tfm_fp_cmp_mag(b, a);
265       } else {
266          return tfm_fp_cmp_mag(a, b);
267       }
268    }
269 }
270
271 /* compare against a single digit */
272 int tfm_fp_cmp_d(tfm_fp_int *a, tfm_fp_digit b)
273 {
274   /* compare based on sign */
275   if ((b && a->used == 0) || a->sign == TFM_FP_NEG) {
276     return TFM_FP_LT;
277   }
278
279   /* compare based on magnitude */
280   if (a->used > 1) {
281     return TFM_FP_GT;
282   }
283
284   /* compare the only digit of a to b */
285   if (a->dp[0] > b) {
286     return TFM_FP_GT;
287   } else if (a->dp[0] < b) {
288     return TFM_FP_LT;
289   } else {
290     return TFM_FP_EQ;
291   }
292 }
293
294 int tfm_fp_cmp_mag(tfm_fp_int *a, tfm_fp_int *b)
295 {
296    int x;
297
298    if (a->used > b->used) {
299       return TFM_FP_GT;
300    } else if (a->used < b->used) {
301       return TFM_FP_LT;
302    } else {
303       for (x = a->used - 1; x >= 0; x--) {
304           if (a->dp[x] > b->dp[x]) {
305              return TFM_FP_GT;
306           } else if (a->dp[x] < b->dp[x]) {
307              return TFM_FP_LT;
308           }
309       }
310    }
311    return TFM_FP_EQ;
312 }
313
314 static const int lnz[16] = {
315    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
316 };
317
318 /* Counts the number of lsbs which are zero before the first zero bit */
319 int tfm_fp_cnt_lsb(tfm_fp_int *a)
320 {
321    int x;
322    tfm_fp_digit q, qq;
323
324    /* easy out */
325    if (tfm_fp_iszero(a) == 1) {
326       return 0;
327    }
328
329    /* scan lower digits until non-zero */
330    for (x = 0; x < a->used && a->dp[x] == 0; x++);
331    q = a->dp[x];
332    x *= DIGIT_BIT;
333
334    /* now scan this digit until a 1 is found */
335    if ((q & 1) == 0) {
336       do {
337          qq  = q & 15;
338          x  += lnz[qq];
339          q >>= 4;
340       } while (qq == 0);
341    }
342    return x;
343 }
344
345 int tfm_fp_count_bits (tfm_fp_int * a)
346 {
347   int     r;
348   tfm_fp_digit q;
349
350   /* shortcut */
351   if (a->used == 0) {
352     return 0;
353   }
354
355   /* get number of digits and add that */
356   r = (a->used - 1) * DIGIT_BIT;
357
358   /* take the last digit and count the bits in it */
359   q = a->dp[a->used - 1];
360   while (q > ((tfm_fp_digit) 0)) {
361     ++r;
362     q >>= ((tfm_fp_digit) 1);
363   }
364   return r;
365 }
366
367 /* a/b => cb + d == a */
368 int tfm_fp_div(tfm_fp_int *a, tfm_fp_int *b, tfm_fp_int *c, tfm_fp_int *d)
369 {
370   tfm_fp_int  q, x, y, t1, t2;
371   int     n, t, i, norm, neg;
372   SilcStack stack = NULL;
373
374   /* is divisor zero ? */
375   if (tfm_fp_iszero (b) == 1) {
376     return TFM_FP_VAL;
377   }
378
379   /* if a < b then q=0, r = a */
380   if (tfm_fp_cmp_mag (a, b) == TFM_FP_LT) {
381     if (d != NULL) {
382       if (tfm_fp_copy (a, d))
383         return TFM_FP_MEM;
384     }
385     if (c != NULL) {
386       tfm_fp_zeroise (c);
387     }
388     return TFM_FP_OKAY;
389   }
390
391   if (c)
392     stack = c->stack;
393
394   if (tfm_fp_init_size(stack, &t1, 3))
395     return TFM_FP_MEM;
396   if (tfm_fp_init_size(stack, &t2, 3))
397     return TFM_FP_MEM;
398
399   /* q is exchanged with c, use its stack if present. */
400   if (tfm_fp_init_size(stack, &q, a->used + 2))
401     goto err;
402   q.used = a->used + 2;
403
404   /* If result doesn't have stack assure it doesn't get stack in result,
405      x is exchanged with d. */
406   if (tfm_fp_init_copy(&x, a, d && d->stack ? a->stack : NULL))
407     goto err;
408
409   if (tfm_fp_init_copy(&y, b, b->stack))
410     goto err;
411
412   /* fix the sign */
413   neg = (a->sign == b->sign) ? TFM_FP_ZPOS : TFM_FP_NEG;
414   x.sign = y.sign = TFM_FP_ZPOS;
415
416   /* normalize both x and y, ensure that y >= b/2, [b == 2**DIGIT_BIT] */
417   norm = tfm_fp_count_bits(&y) % DIGIT_BIT;
418   if (norm < (int)(DIGIT_BIT-1)) {
419      norm = (DIGIT_BIT-1) - norm;
420      if (tfm_fp_mul_2d (&x, norm, &x))
421        goto err;
422      if (tfm_fp_mul_2d (&y, norm, &y))
423        goto err;
424   } else {
425      norm = 0;
426   }
427
428   /* note hac does 0 based, so if used==5 then its 0,1,2,3,4, e.g. use 4 */
429   n = x.used - 1;
430   t = y.used - 1;
431
432   /* while (x >= y*b**n-t) do { q[n-t] += 1; x -= y*b**{n-t} } */
433   if (tfm_fp_lshd (&y, n - t))   /* y = y*b**{n-t} */
434     goto err;
435
436   while (tfm_fp_cmp (&x, &y) != TFM_FP_LT) {
437     ++(q.dp[n - t]);
438     tfm_fp_sub (&x, &y, &x);
439   }
440
441   /* reset y by shifting it back down */
442   tfm_fp_rshd (&y, n - t);
443
444   /* step 3. for i from n down to (t + 1) */
445   for (i = n; i >= (t + 1); i--) {
446     if (i > x.used) {
447       continue;
448     }
449
450     /* step 3.1 if xi == yt then set q{i-t-1} to b-1,
451      * otherwise set q{i-t-1} to (xi*b + x{i-1})/yt */
452     if (x.dp[i] == y.dp[t]) {
453       q.dp[i - t - 1] = ((((tfm_fp_word)1) << DIGIT_BIT) - 1);
454     } else {
455       tfm_fp_word tmp;
456       tmp = ((tfm_fp_word) x.dp[i]) << ((tfm_fp_word) DIGIT_BIT);
457       tmp |= ((tfm_fp_word) x.dp[i - 1]);
458       tmp /= ((tfm_fp_word) y.dp[t]);
459       q.dp[i - t - 1] = (tfm_fp_digit) (tmp);
460     }
461
462     /* while (q{i-t-1} * (yt * b + y{t-1})) >
463              xi * b**2 + xi-1 * b + xi-2
464
465        do q{i-t-1} -= 1;
466     */
467     q.dp[i - t - 1] = (q.dp[i - t - 1] + 1);
468     do {
469       q.dp[i - t - 1] = (q.dp[i - t - 1] - 1);
470
471       /* find left hand */
472       tfm_fp_zeroise (&t1);
473       t1.dp[0] = (t - 1 < 0) ? 0 : y.dp[t - 1];
474       t1.dp[1] = y.dp[t];
475       t1.used = 2;
476       if (tfm_fp_mul_d (&t1, q.dp[i - t - 1], &t1))
477         goto err;
478
479       /* find right hand */
480       t2.dp[0] = (i - 2 < 0) ? 0 : x.dp[i - 2];
481       t2.dp[1] = (i - 1 < 0) ? 0 : x.dp[i - 1];
482       t2.dp[2] = x.dp[i];
483       t2.used = 3;
484     } while (tfm_fp_cmp_mag(&t1, &t2) == TFM_FP_GT);
485
486     /* step 3.3 x = x - q{i-t-1} * y * b**{i-t-1} */
487     if (tfm_fp_mul_d (&y, q.dp[i - t - 1], &t1))
488       goto err;
489     if (tfm_fp_lshd  (&t1, i - t - 1))
490       goto err;
491     if (tfm_fp_sub   (&x, &t1, &x))
492       goto err;
493
494     /* if x < 0 then { x = x + y*b**{i-t-1}; q{i-t-1} -= 1; } */
495     if (x.sign == TFM_FP_NEG) {
496       if (tfm_fp_copy (&y, &t1))
497         goto err;
498       if (tfm_fp_lshd (&t1, i - t - 1))
499         goto err;
500       if (tfm_fp_add (&x, &t1, &x))
501         goto err;
502       q.dp[i - t - 1] = q.dp[i - t - 1] - 1;
503     }
504   }
505
506   /* now q is the quotient and x is the remainder
507    * [which we have to normalize]
508    */
509
510   /* get sign before writing to c */
511   x.sign = x.used == 0 ? TFM_FP_ZPOS : a->sign;
512
513   if (c != NULL) {
514     tfm_fp_clamp (&q);
515     tfm_fp_exch(&q, c);
516     c->sign = neg;
517   }
518
519   if (d != NULL) {
520     if (tfm_fp_div_2d (&x, norm, &x, NULL))
521       goto err;
522
523 /* the following is a kludge, essentially we were seeing the right remainder but
524    with excess digits that should have been zero
525  */
526     for (i = b->used; i < x.used; i++) {
527         x.dp[i] = 0;
528     }
529     tfm_fp_clamp(&x);
530     tfm_fp_exch(&x, d);
531   }
532
533   tfm_fp_zero(&q);
534   tfm_fp_zero(&x);
535   tfm_fp_zero(&y);
536   tfm_fp_zero(&t1);
537   tfm_fp_zero(&t2);
538
539   return TFM_FP_OKAY;
540
541  err:
542   tfm_fp_zero(&q);
543   tfm_fp_zero(&x);
544   tfm_fp_zero(&y);
545   tfm_fp_zero(&t1);
546   tfm_fp_zero(&t2);
547   return TFM_FP_MEM;
548 }
549
550 /* b = a/2 */
551 int tfm_fp_div_2(tfm_fp_int * a, tfm_fp_int * b)
552 {
553   int     x, oldused;
554
555   /* Grow when needed */
556   if (b->alloc < a->used)
557     if (tfm_fp_grow(b, a->used))
558       return TFM_FP_MEM;
559
560   oldused = b->used;
561   b->used = a->used;
562   {
563     register tfm_fp_digit r, rr, *tmpa, *tmpb;
564
565     /* source alias */
566     tmpa = a->dp + b->used - 1;
567
568     /* dest alias */
569     tmpb = b->dp + b->used - 1;
570
571     /* carry */
572     r = 0;
573     for (x = b->used - 1; x >= 0; x--) {
574       /* get the carry for the next iteration */
575       rr = *tmpa & 1;
576
577       /* shift the current digit, add in carry and store */
578       *tmpb-- = (*tmpa-- >> 1) | (r << (DIGIT_BIT - 1));
579
580       /* forward carry to next iteration */
581       r = rr;
582     }
583
584     /* zero excess digits */
585     tmpb = b->dp + b->used;
586     for (x = b->used; x < oldused; x++) {
587       *tmpb++ = 0;
588     }
589   }
590   b->sign = a->sign;
591   tfm_fp_clamp (b);
592   return TFM_FP_OKAY;
593 }
594
595 /* c = a / 2**b */
596 int tfm_fp_div_2d(tfm_fp_int *a, int b, tfm_fp_int *c, tfm_fp_int *d)
597 {
598   tfm_fp_digit D, r, rr;
599   int      x;
600   tfm_fp_int   t;
601
602   /* if the shift count is <= 0 then we do no work */
603   if (b <= 0) {
604     if (tfm_fp_copy (a, c))
605       return TFM_FP_MEM;
606     if (d != NULL) {
607       tfm_fp_zeroise (d);
608     }
609     return TFM_FP_OKAY;
610   }
611
612   tfm_fp_init(&t);
613
614   /* get the remainder */
615   if (d != NULL) {
616     if (tfm_fp_mod_2d (a, b, &t)) {
617       tfm_fp_zero(&t);
618       return TFM_FP_MEM;
619     }
620   }
621
622   /* copy */
623   if (tfm_fp_copy(a, c)) {
624     tfm_fp_zero(&t);
625     return TFM_FP_MEM;
626   }
627
628   /* shift by as many digits in the bit count */
629   if (b >= (int)DIGIT_BIT) {
630     tfm_fp_rshd (c, b / DIGIT_BIT);
631   }
632
633   /* shift any bit count < DIGIT_BIT */
634   D = (tfm_fp_digit) (b % DIGIT_BIT);
635   if (D != 0) {
636     register tfm_fp_digit *tmpc, mask, shift;
637
638     /* mask */
639     mask = (((tfm_fp_digit)1) << D) - 1;
640
641     /* shift for lsb */
642     shift = DIGIT_BIT - D;
643
644     /* alias */
645     tmpc = c->dp + (c->used - 1);
646
647     /* carry */
648     r = 0;
649     for (x = c->used - 1; x >= 0; x--) {
650       /* get the lower  bits of this word in a temp */
651       rr = *tmpc & mask;
652
653       /* shift the current word and mix in the carry bits from the previous word */
654       *tmpc = (*tmpc >> D) | (r << shift);
655       --tmpc;
656
657       /* set the carry to the carry bits of the current word found above */
658       r = rr;
659     }
660   }
661   tfm_fp_clamp (c);
662   if (d != NULL)
663     tfm_fp_exch(&t, d);
664
665   tfm_fp_zero(&t);
666   return TFM_FP_OKAY;
667 }
668
669 static int s_is_power_of_two(tfm_fp_digit b, int *p)
670 {
671    int x;
672
673    /* fast return if no power of two */
674    if ((b==0) || (b & (b-1))) {
675       return 0;
676    }
677
678    for (x = 0; x < DIGIT_BIT; x++) {
679       if (b == (((tfm_fp_digit)1)<<x)) {
680          *p = x;
681          return 1;
682       }
683    }
684    return 0;
685 }
686
687 /* a/b => cb + d == a */
688 int tfm_fp_div_d(tfm_fp_int *a, tfm_fp_digit b, tfm_fp_int *c, tfm_fp_digit *d)
689 {
690   tfm_fp_int   q;
691   tfm_fp_word  w;
692   tfm_fp_digit t;
693   int      ix;
694
695   /* cannot divide by zero */
696   if (b == 0) {
697      return TFM_FP_VAL;
698   }
699
700   /* quick outs */
701   if (b == 1 || tfm_fp_iszero(a) == 1) {
702      if (d != NULL) {
703         *d = 0;
704      }
705      if (c != NULL) {
706        return tfm_fp_copy(a, c);
707      }
708      return TFM_FP_OKAY;
709   }
710
711   /* power of two ? */
712   if (s_is_power_of_two(b, &ix) == 1) {
713      if (d != NULL) {
714         *d = a->dp[0] & ((((tfm_fp_digit)1)<<ix) - 1);
715      }
716      if (c != NULL) {
717        return tfm_fp_div_2d(a, ix, c, NULL);
718      }
719      return TFM_FP_OKAY;
720   }
721
722   /* no easy answer [c'est la vie].  Just division */
723   if (tfm_fp_init_size(NULL, &q, a->used))
724     return TFM_FP_MEM;
725
726   q.used = a->used;
727   q.sign = a->sign;
728   w = 0;
729   for (ix = a->used - 1; ix >= 0; ix--) {
730      w = (w << ((tfm_fp_word)DIGIT_BIT)) | ((tfm_fp_word)a->dp[ix]);
731
732      if (w >= b) {
733         t = (tfm_fp_digit)(w / b);
734         w -= ((tfm_fp_word)t) * ((tfm_fp_word)b);
735       } else {
736         t = 0;
737       }
738       q.dp[ix] = (tfm_fp_digit)t;
739   }
740
741   if (d != NULL) {
742      *d = (tfm_fp_digit)w;
743   }
744
745   if (c != NULL) {
746      tfm_fp_clamp(&q);
747      tfm_fp_exch(&q, c);
748   }
749
750   tfm_fp_zero(&q);
751
752   return TFM_FP_OKAY;
753 }
754
755 /* y = g**x (mod b)
756  * Some restrictions... x must be positive and < b
757  */
758 static int _tfm_fp_exptmod(tfm_fp_int * G, tfm_fp_int * X, tfm_fp_int * P, tfm_fp_int * Y)
759 {
760   tfm_fp_int   M[64], res;
761   tfm_fp_digit buf, mp;
762   int      err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize;
763
764   /* find window size */
765   x = tfm_fp_count_bits (X);
766   if (x <= 21) {
767     winsize = 1;
768   } else if (x <= 36) {
769     winsize = 3;
770   } else if (x <= 140) {
771     winsize = 4;
772   } else if (x <= 450) {
773     winsize = 5;
774   } else {
775     winsize = 6;
776   }
777
778   /* init M array */
779   memset(M, 0, sizeof(M));
780
781   /* now setup montgomery  */
782   if ((err = tfm_fp_montgomery_setup (P, &mp)) != TFM_FP_OKAY) {
783      return err;
784   }
785
786   /* setup result */
787   if (tfm_fp_init_size(Y->stack, &res, 1))
788     return TFM_FP_MEM;
789
790   /* create M table
791    *
792    * The M table contains powers of the input base, e.g. M[x] = G^x mod P
793    *
794    * The first half of the table is not computed though accept for M[0] and M[1]
795    */
796
797    /* now we need R mod m */
798    tfm_fp_montgomery_calc_normalization (&res, P);
799
800    /* now set M[1] to G * R mod m */
801    if (tfm_fp_cmp_mag(P, G) != TFM_FP_GT) {
802       /* G > P so we reduce it first */
803      if (tfm_fp_mod(G, P, &M[1]))
804        return TFM_FP_MEM;
805    } else {
806      if (tfm_fp_copy(G, &M[1]))
807        return TFM_FP_MEM;
808    }
809    if (tfm_fp_mulmod (&M[1], &res, P, &M[1]))
810      return TFM_FP_MEM;
811
812   /* compute the value at M[1<<(winsize-1)] by squaring M[1] (winsize-1) times */
813   if (tfm_fp_copy (&M[1], &M[1 << (winsize - 1)]))
814      return TFM_FP_MEM;
815   for (x = 0; x < (winsize - 1); x++) {
816     if (tfm_fp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)]))
817       return TFM_FP_MEM;
818     tfm_fp_montgomery_reduce (&M[1 << (winsize - 1)], P, mp);
819   }
820
821   /* create upper table */
822   for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) {
823     if (tfm_fp_mul(&M[x - 1], &M[1], &M[x]))
824       return TFM_FP_MEM;
825     tfm_fp_montgomery_reduce(&M[x], P, mp);
826   }
827
828   /* set initial mode and bit cnt */
829   mode   = 0;
830   bitcnt = 1;
831   buf    = 0;
832   digidx = X->used - 1;
833   bitcpy = 0;
834   bitbuf = 0;
835
836   for (;;) {
837     /* grab next digit as required */
838     if (--bitcnt == 0) {
839       /* if digidx == -1 we are out of digits so break */
840       if (digidx == -1) {
841         break;
842       }
843       /* read next digit and reset bitcnt */
844       buf    = X->dp[digidx--];
845       bitcnt = (int)DIGIT_BIT;
846     }
847
848     /* grab the next msb from the exponent */
849     y     = (tfm_fp_digit)(buf >> (DIGIT_BIT - 1)) & 1;
850     buf <<= (tfm_fp_digit)1;
851
852     /* if the bit is zero and mode == 0 then we ignore it
853      * These represent the leading zero bits before the first 1 bit
854      * in the exponent.  Technically this opt is not required but it
855      * does lower the # of trivial squaring/reductions used
856      */
857     if (mode == 0 && y == 0) {
858       continue;
859     }
860
861     /* if the bit is zero and mode == 1 then we square */
862     if (mode == 1 && y == 0) {
863       if (tfm_fp_sqr(&res, &res))
864         return TFM_FP_MEM;
865       tfm_fp_montgomery_reduce(&res, P, mp);
866       continue;
867     }
868
869     /* else we add it to the window */
870     bitbuf |= (y << (winsize - ++bitcpy));
871     mode    = 2;
872
873     if (bitcpy == winsize) {
874       /* ok window is filled so square as required and multiply  */
875       /* square first */
876       for (x = 0; x < winsize; x++) {
877         if (tfm_fp_sqr(&res, &res))
878           return TFM_FP_MEM;
879         tfm_fp_montgomery_reduce(&res, P, mp);
880       }
881
882       /* then multiply */
883       if (tfm_fp_mul(&res, &M[bitbuf], &res))
884         return TFM_FP_MEM;
885       tfm_fp_montgomery_reduce(&res, P, mp);
886
887       /* empty window and reset */
888       bitcpy = 0;
889       bitbuf = 0;
890       mode   = 1;
891     }
892   }
893
894   /* if bits remain then square/multiply */
895   if (mode == 2 && bitcpy > 0) {
896     /* square then multiply if the bit is set */
897     for (x = 0; x < bitcpy; x++) {
898       if (tfm_fp_sqr(&res, &res))
899         return TFM_FP_MEM;
900       tfm_fp_montgomery_reduce(&res, P, mp);
901
902       /* get next bit of the window */
903       bitbuf <<= 1;
904       if ((bitbuf & (1 << winsize)) != 0) {
905         /* then multiply */
906         if (tfm_fp_mul(&res, &M[1], &res))
907           return TFM_FP_MEM;
908         tfm_fp_montgomery_reduce(&res, P, mp);
909       }
910     }
911   }
912
913   /* fixup result if Montgomery reduction is used
914    * recall that any value in a Montgomery system is
915    * actually multiplied by R mod n.  So we have
916    * to reduce one more time to cancel out the factor
917    * of R.
918    */
919   tfm_fp_montgomery_reduce(&res, P, mp);
920
921   /* swap res with Y */
922   tfm_fp_exch (&res, Y);
923
924   tfm_fp_zero(&res);
925   tfm_fp_zero(&M[1]);
926   for (x = 1 << (winsize - 1); x < (1 << winsize); x++)
927     tfm_fp_zero(&M[x]);
928
929   return TFM_FP_OKAY;
930 }
931
932 int tfm_fp_exptmod(tfm_fp_int * G, tfm_fp_int * X, tfm_fp_int * P, tfm_fp_int * Y)
933 {
934    tfm_fp_int tmp;
935    int    err;
936
937    /* is X negative?  */
938    if (X->sign == TFM_FP_NEG) {
939      /* yes, copy G and invmod it */
940      if (tfm_fp_copy(G, &tmp))
941        return TFM_FP_MEM;
942      if ((err = tfm_fp_invmod(&tmp, P, &tmp)) != TFM_FP_OKAY) {
943        tfm_fp_zero(&tmp);
944        return err;
945      }
946      X->sign = TFM_FP_ZPOS;
947      err =  _tfm_fp_exptmod(&tmp, X, P, Y);
948      if (X != Y) {
949        X->sign = TFM_FP_NEG;
950      }
951      return err;
952    } else {
953      /* Positive exponent so just exptmod */
954      return _tfm_fp_exptmod(G, X, P, Y);
955    }
956 }
957
958 /* c = (a, b) */
959 int tfm_fp_gcd(tfm_fp_int *a, tfm_fp_int *b, tfm_fp_int *c)
960 {
961    tfm_fp_int u, v, r;
962    int res = TFM_FP_OKAY;
963
964    /* either zero than gcd is the largest */
965    if (tfm_fp_iszero (a) == 1 && tfm_fp_iszero (b) == 0) {
966      tfm_fp_abs (b, c);
967      return TFM_FP_OKAY;
968    }
969    if (tfm_fp_iszero (a) == 0 && tfm_fp_iszero (b) == 1) {
970      tfm_fp_abs (a, c);
971      return TFM_FP_OKAY;
972    }
973
974    /* optimized.  At this point if a == 0 then
975     * b must equal zero too
976     */
977    if (tfm_fp_iszero (a) == 1) {
978      tfm_fp_zeroise(c);
979      return TFM_FP_OKAY;
980    }
981
982    /* sort inputs */
983    if (tfm_fp_cmp_mag(a, b) != TFM_FP_LT) {
984      /* If result doesn't have stack, assure it doesn't get one */
985      if (tfm_fp_init_copy(&u, a, c->stack ? a->stack : NULL))
986        return TFM_FP_OKAY;
987      if (tfm_fp_init_copy(&v, b, c->stack ? b->stack : NULL))
988        return TFM_FP_OKAY;
989    } else {
990      /* If result doesn't have stack, assure it doesn't get one */
991      if (tfm_fp_init_copy(&u, b, c->stack ? b->stack : NULL))
992        return TFM_FP_OKAY;
993      if (tfm_fp_init_copy(&v, a, c->stack ? a->stack : NULL))
994        return TFM_FP_OKAY;
995    }
996
997    tfm_fp_init(&r);
998    while (tfm_fp_iszero(&v) == TFM_FP_NO) {
999      if ((res = tfm_fp_mod(&u, &v, &r)))
1000        goto out;
1001      tfm_fp_exch(&v, &u);
1002      tfm_fp_exch(&r, &v);
1003    }
1004    tfm_fp_exch(&u, c);
1005
1006  out:
1007    tfm_fp_zero(&r);
1008    tfm_fp_zero(&u);
1009    tfm_fp_zero(&v);
1010
1011    return res;
1012 }
1013
1014 static int tfm_fp_invmod_slow (tfm_fp_int * a, tfm_fp_int * b, tfm_fp_int * c)
1015 {
1016   tfm_fp_int  x, y, u, v, A, B, C, D;
1017   int     res, ret = TFM_FP_MEM;
1018
1019   /* b cannot be negative */
1020   if (b->sign == TFM_FP_NEG || tfm_fp_iszero(b) == 1) {
1021     return TFM_FP_VAL;
1022   }
1023
1024   /* init temps */
1025   tfm_fp_init(&x);    tfm_fp_init(&y);
1026   tfm_fp_init(&u);    tfm_fp_init(&v);
1027   tfm_fp_init(&A);    tfm_fp_init(&B);
1028   tfm_fp_init(&C);    tfm_fp_init(&D);
1029
1030   /* x = a, y = b */
1031   if ((res = tfm_fp_mod(a, b, &x)) != TFM_FP_OKAY)
1032     goto err;
1033   if (tfm_fp_copy(b, &y))
1034     goto err;
1035
1036   /* 2. [modified] if x,y are both even then return an error! */
1037   if (tfm_fp_iseven (&x) == 1 && tfm_fp_iseven (&y) == 1) {
1038     return TFM_FP_VAL;
1039   }
1040
1041   /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */
1042   if (tfm_fp_copy (&x, &u))
1043     goto err;
1044   if (tfm_fp_copy (&y, &v))
1045     goto err;
1046   if (tfm_fp_set (&A, 1))
1047     goto err;
1048   if (tfm_fp_set (&D, 1))
1049     goto err;
1050
1051 top:
1052   /* 4.  while u is even do */
1053   while (tfm_fp_iseven (&u) == 1) {
1054     /* 4.1 u = u/2 */
1055     if (tfm_fp_div_2 (&u, &u))
1056       goto err;
1057
1058     /* 4.2 if A or B is odd then */
1059     if (tfm_fp_isodd (&A) == 1 || tfm_fp_isodd (&B) == 1) {
1060       /* A = (A+y)/2, B = (B-x)/2 */
1061       if (tfm_fp_add (&A, &y, &A))
1062         goto err;
1063       if (tfm_fp_sub (&B, &x, &B))
1064         goto err;
1065     }
1066     /* A = A/2, B = B/2 */
1067     if (tfm_fp_div_2 (&A, &A))
1068       goto err;
1069     if (tfm_fp_div_2 (&B, &B))
1070       goto err;
1071   }
1072
1073   /* 5.  while v is even do */
1074   while (tfm_fp_iseven (&v) == 1) {
1075     /* 5.1 v = v/2 */
1076     if (tfm_fp_div_2 (&v, &v))
1077       goto err;
1078
1079     /* 5.2 if C or D is odd then */
1080     if (tfm_fp_isodd (&C) == 1 || tfm_fp_isodd (&D) == 1) {
1081       /* C = (C+y)/2, D = (D-x)/2 */
1082       if (tfm_fp_add (&C, &y, &C))
1083         goto err;
1084       if (tfm_fp_sub (&D, &x, &D))
1085         goto err;
1086     }
1087     /* C = C/2, D = D/2 */
1088     if (tfm_fp_div_2 (&C, &C))
1089       goto err;
1090     if (tfm_fp_div_2 (&D, &D))
1091       goto err;
1092   }
1093
1094   /* 6.  if u >= v then */
1095   if (tfm_fp_cmp (&u, &v) != TFM_FP_LT) {
1096     /* u = u - v, A = A - C, B = B - D */
1097     if (tfm_fp_sub (&u, &v, &u))
1098       goto err;
1099     if (tfm_fp_sub (&A, &C, &A))
1100       goto err;
1101     if (tfm_fp_sub (&B, &D, &B))
1102       goto err;
1103   } else {
1104     /* v - v - u, C = C - A, D = D - B */
1105     if (tfm_fp_sub (&v, &u, &v))
1106       goto err;
1107     if (tfm_fp_sub (&C, &A, &C))
1108       goto err;
1109     if (tfm_fp_sub (&D, &B, &D))
1110       goto err;
1111   }
1112
1113   /* if not zero goto step 4 */
1114   if (tfm_fp_iszero (&u) == 0)
1115     goto top;
1116
1117   /* now a = C, b = D, gcd == g*v */
1118
1119   /* if v != 1 then there is no inverse */
1120   if (tfm_fp_cmp_d (&v, 1) != TFM_FP_EQ) {
1121     ret = TFM_FP_VAL;
1122     goto err;
1123   }
1124
1125   /* if its too low */
1126   while (tfm_fp_cmp_d(&C, 0) == TFM_FP_LT) {
1127       if (tfm_fp_add(&C, b, &C))
1128         goto err;
1129   }
1130
1131   /* too big */
1132   while (tfm_fp_cmp_mag(&C, b) != TFM_FP_LT) {
1133       if (tfm_fp_sub(&C, b, &C))
1134         goto err;
1135   }
1136
1137   /* C is now the inverse */
1138   tfm_fp_exch(&C, c);
1139
1140   tfm_fp_zero(&x);
1141   tfm_fp_zero(&y);
1142   tfm_fp_zero(&u);
1143   tfm_fp_zero(&v);
1144   tfm_fp_zero(&A);
1145   tfm_fp_zero(&B);
1146   tfm_fp_zero(&C);
1147   tfm_fp_zero(&D);
1148
1149   return TFM_FP_OKAY;
1150
1151  err:
1152   tfm_fp_zero(&x);
1153   tfm_fp_zero(&y);
1154   tfm_fp_zero(&u);
1155   tfm_fp_zero(&v);
1156   tfm_fp_zero(&A);
1157   tfm_fp_zero(&B);
1158   tfm_fp_zero(&C);
1159   tfm_fp_zero(&D);
1160   return ret;
1161 }
1162
1163 /* c = 1/a (mod b) for odd b only */
1164 int tfm_fp_invmod(tfm_fp_int *a, tfm_fp_int *b, tfm_fp_int *c)
1165 {
1166   tfm_fp_int  x, y, u, v, B, D;
1167   int     neg, ret = TFM_FP_MEM;
1168
1169   /* 2. [modified] b must be odd   */
1170   if (tfm_fp_iseven (b) == TFM_FP_YES) {
1171     return tfm_fp_invmod_slow(a,b,c);
1172   }
1173
1174   /* init all our temps */
1175   tfm_fp_init(&x);  tfm_fp_init(&y);
1176   tfm_fp_init(&u);  tfm_fp_init(&v);
1177   tfm_fp_init(&B);  tfm_fp_init(&D);
1178
1179   /* x == modulus, y == value to invert */
1180   if (tfm_fp_copy(b, &x))
1181     goto err;
1182
1183   /* we need y = |a| */
1184   tfm_fp_abs(a, &y);
1185
1186   /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */
1187   if (tfm_fp_copy(&x, &u))
1188     goto err;
1189   if (tfm_fp_copy(&y, &v))
1190     goto err;
1191   if (tfm_fp_set (&D, 1))
1192     goto err;
1193
1194 top:
1195   /* 4.  while u is even do */
1196   while (tfm_fp_iseven (&u) == TFM_FP_YES) {
1197     /* 4.1 u = u/2 */
1198     if (tfm_fp_div_2 (&u, &u))
1199       goto err;
1200
1201     /* 4.2 if B is odd then */
1202     if (tfm_fp_isodd (&B) == TFM_FP_YES) {
1203       if (tfm_fp_sub (&B, &x, &B))
1204         goto err;
1205     }
1206     /* B = B/2 */
1207     if (tfm_fp_div_2 (&B, &B))
1208       goto err;
1209   }
1210
1211   /* 5.  while v is even do */
1212   while (tfm_fp_iseven (&v) == TFM_FP_YES) {
1213     /* 5.1 v = v/2 */
1214     if (tfm_fp_div_2 (&v, &v))
1215       goto err;
1216
1217     /* 5.2 if D is odd then */
1218     if (tfm_fp_isodd (&D) == TFM_FP_YES) {
1219       /* D = (D-x)/2 */
1220       if (tfm_fp_sub (&D, &x, &D))
1221         goto err;
1222     }
1223     /* D = D/2 */
1224     if (tfm_fp_div_2 (&D, &D))
1225       goto err;
1226   }
1227
1228   /* 6.  if u >= v then */
1229   if (tfm_fp_cmp (&u, &v) != TFM_FP_LT) {
1230     /* u = u - v, B = B - D */
1231     if (tfm_fp_sub (&u, &v, &u))
1232       goto err;
1233     if (tfm_fp_sub (&B, &D, &B))
1234       goto err;
1235   } else {
1236     /* v - v - u, D = D - B */
1237     if (tfm_fp_sub (&v, &u, &v))
1238       goto err;
1239     if (tfm_fp_sub (&D, &B, &D))
1240       goto err;
1241   }
1242
1243   /* if not zero goto step 4 */
1244   if (tfm_fp_iszero (&u) == TFM_FP_NO) {
1245     goto top;
1246   }
1247
1248   /* now a = C, b = D, gcd == g*v */
1249
1250   /* if v != 1 then there is no inverse */
1251   if (tfm_fp_cmp_d (&v, 1) != TFM_FP_EQ) {
1252     ret = TFM_FP_VAL;
1253     goto err;
1254   }
1255
1256   /* b is now the inverse */
1257   neg = a->sign;
1258   while (D.sign == TFM_FP_NEG) {
1259     if (tfm_fp_add (&D, b, &D))
1260       goto err;
1261   }
1262   tfm_fp_exch (&D, c);
1263   c->sign = neg;
1264
1265   tfm_fp_zero(&x);  tfm_fp_zero(&y);
1266   tfm_fp_zero(&u);  tfm_fp_zero(&v);
1267   tfm_fp_zero(&B);  tfm_fp_zero(&D);
1268
1269   return TFM_FP_OKAY;
1270
1271  err:
1272   tfm_fp_zero(&x);  tfm_fp_zero(&y);
1273   tfm_fp_zero(&u);  tfm_fp_zero(&v);
1274   tfm_fp_zero(&B);  tfm_fp_zero(&D);
1275   return ret;
1276 }
1277
1278 /* c = [a, b] */
1279 int tfm_fp_lcm(tfm_fp_int *a, tfm_fp_int *b, tfm_fp_int *c)
1280 {
1281    tfm_fp_int  t1, t2;
1282    int res;
1283
1284    tfm_fp_init(&t1);
1285    tfm_fp_init(&t2);
1286    if ((res = tfm_fp_gcd(a, b, &t1)))
1287      goto out;
1288    if (tfm_fp_cmp_mag(a, b) == TFM_FP_GT) {
1289       if ((res = tfm_fp_div(a, &t1, &t2, NULL)))
1290         goto out;
1291       res = tfm_fp_mul(b, &t2, c);
1292    } else {
1293       if ((res = tfm_fp_div(b, &t1, &t2, NULL)))
1294       res = tfm_fp_mul(a, &t2, c);
1295    }
1296
1297  out:
1298    tfm_fp_zero(&t1);
1299    tfm_fp_zero(&t2);
1300    return res;
1301 }
1302
1303 int tfm_fp_lshd(tfm_fp_int *a, int x)
1304 {
1305    int y;
1306
1307    /* Grow when needed */
1308    if (a->alloc < a->used + x)
1309      if (tfm_fp_grow(a, a->used + x))
1310        return TFM_FP_MEM;
1311
1312    y = a->used + x - 1;
1313
1314    /* store new size */
1315    a->used = y + 1;
1316
1317    /* move digits */
1318    for (; y >= x; y--) {
1319        a->dp[y] = a->dp[y-x];
1320    }
1321
1322    /* zero lower digits */
1323    for (; y >= 0; y--) {
1324        a->dp[y] = 0;
1325    }
1326
1327    /* clamp digits */
1328    tfm_fp_clamp(a);
1329    return TFM_FP_OKAY;
1330 }
1331
1332 /* c = a mod b, 0 <= c < b  */
1333 int tfm_fp_mod(tfm_fp_int *a, tfm_fp_int *b, tfm_fp_int *c)
1334 {
1335    tfm_fp_int t;
1336    int    err;
1337
1338    tfm_fp_init(&t);
1339    if ((err = tfm_fp_div(a, b, NULL, &t)) != TFM_FP_OKAY) {
1340       tfm_fp_zero(&t);
1341       return err;
1342    }
1343    if (t.sign != b->sign) {
1344       err = tfm_fp_add(&t, b, c);
1345    } else {
1346       err = TFM_FP_OKAY;
1347       tfm_fp_exch(&t, c);
1348    }
1349    tfm_fp_zero(&t);
1350    return err;
1351 }
1352
1353 /* c = a mod 2**d */
1354 int tfm_fp_mod_2d(tfm_fp_int *a, int b, tfm_fp_int *c)
1355 {
1356    int x;
1357
1358    /* zero if count less than or equal to zero */
1359    if (b <= 0) {
1360       tfm_fp_zeroise(c);
1361       return TFM_FP_OKAY;
1362    }
1363
1364    /* get copy of input */
1365    if (tfm_fp_copy(a, c))
1366      return TFM_FP_MEM;
1367
1368    /* if 2**d is larger than we just return */
1369    if (b >= (DIGIT_BIT * a->used))
1370      return TFM_FP_OKAY;
1371
1372   /* zero digits above the last digit of the modulus */
1373   for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) {
1374     c->dp[x] = 0;
1375   }
1376   /* clear the digit that is not completely outside/inside the modulus */
1377   c->dp[b / DIGIT_BIT] &= ~((tfm_fp_digit)0) >> (DIGIT_BIT - b);
1378   tfm_fp_clamp (c);
1379   return TFM_FP_OKAY;
1380 }
1381
1382 /* c = a mod b, 0 <= c < b  */
1383 int tfm_fp_mod_d(tfm_fp_int *a, tfm_fp_digit b, tfm_fp_digit *c)
1384 {
1385    return tfm_fp_div_d(a, b, NULL, c);
1386 }
1387
1388 /* computes a = B**n mod b without division or multiplication useful for
1389  * normalizing numbers in a Montgomery system.
1390  */
1391 int tfm_fp_montgomery_calc_normalization(tfm_fp_int *a, tfm_fp_int *b)
1392 {
1393   int     x, bits;
1394
1395   /* how many bits of last digit does b use */
1396   bits = tfm_fp_count_bits (b) % DIGIT_BIT;
1397   if (!bits) bits = DIGIT_BIT;
1398
1399   /* compute A = B^(n-1) * 2^(bits-1) */
1400   if (b->used > 1) {
1401      if (tfm_fp_2expt (a, (b->used - 1) * DIGIT_BIT + bits - 1))
1402         return TFM_FP_MEM;
1403   } else {
1404      if (tfm_fp_set(a, 1))
1405         return TFM_FP_MEM;
1406      bits = 1;
1407   }
1408
1409   /* now compute C = A * B mod b */
1410   for (x = bits - 1; x < (int)DIGIT_BIT; x++) {
1411     if (tfm_fp_mul_2 (a, a))
1412       return TFM_FP_MEM;
1413     if (tfm_fp_cmp_mag (a, b) != TFM_FP_LT) {
1414       if (s_tfm_fp_sub (a, b, a))
1415         return TFM_FP_MEM;
1416     }
1417   }
1418   return TFM_FP_OKAY;
1419 }
1420
1421 /******************************************************************/
1422 #if defined(TFM_X86) && !defined(TFM_SSE2)
1423 /* x86-32 code */
1424
1425 #define MONT_START
1426 #define MONT_FINI
1427 #define LOOP_END
1428 #define LOOP_START \
1429    mu = c[x] * mp
1430
1431 #define INNERMUL                                          \
1432 asm(                                                      \
1433    "movl %5,%%eax \n\t"                                   \
1434    "mull %4       \n\t"                                   \
1435    "addl %1,%%eax \n\t"                                   \
1436    "adcl $0,%%edx \n\t"                                   \
1437    "addl %%eax,%0 \n\t"                                   \
1438    "adcl $0,%%edx \n\t"                                   \
1439    "movl %%edx,%1 \n\t"                                   \
1440 :"=g"(_c[LO]), "=r"(cy)                                   \
1441 :"0"(_c[LO]), "1"(cy), "g"(mu), "g"(*tmpm++)              \
1442 : "%eax", "%edx", "%cc")
1443
1444 #define PROPCARRY                           \
1445 asm(                                        \
1446    "addl   %1,%0    \n\t"                   \
1447    "setb   %%al     \n\t"                   \
1448    "movzbl %%al,%1 \n\t"                    \
1449 :"=g"(_c[LO]), "=r"(cy)                     \
1450 :"0"(_c[LO]), "1"(cy)                       \
1451 : "%eax", "%cc")
1452
1453 /******************************************************************/
1454 #elif defined(TFM_X86_64)
1455 /* x86-64 code */
1456
1457 #define MONT_START
1458 #define MONT_FINI
1459 #define LOOP_END
1460 #define LOOP_START \
1461    mu = c[x] * mp
1462
1463 #define INNERMUL                                          \
1464 asm(                                                      \
1465    "movq %5,%%rax \n\t"                                   \
1466    "mulq %4       \n\t"                                   \
1467    "addq %1,%%rax \n\t"                                   \
1468    "adcq $0,%%rdx \n\t"                                   \
1469    "addq %%rax,%0 \n\t"                                   \
1470    "adcq $0,%%rdx \n\t"                                   \
1471    "movq %%rdx,%1 \n\t"                                   \
1472 :"=g"(_c[LO]), "=r"(cy)                                   \
1473 :"0"(_c[LO]), "1"(cy), "r"(mu), "r"(*tmpm++)              \
1474 : "%rax", "%rdx", "%cc")
1475
1476 #define INNERMUL8 \
1477  asm(                  \
1478  "movq 0(%5),%%rax    \n\t"  \
1479  "movq 0(%2),%%r10    \n\t"  \
1480  "movq 0x8(%5),%%r11  \n\t"  \
1481  "mulq %4             \n\t"  \
1482  "addq %%r10,%%rax    \n\t"  \
1483  "adcq $0,%%rdx       \n\t"  \
1484  "movq 0x8(%2),%%r10  \n\t"  \
1485  "addq %3,%%rax       \n\t"  \
1486  "adcq $0,%%rdx       \n\t"  \
1487  "movq %%rax,0(%0)    \n\t"  \
1488  "movq %%rdx,%1       \n\t"  \
1489  \
1490  "movq %%r11,%%rax    \n\t"  \
1491  "movq 0x10(%5),%%r11 \n\t"  \
1492  "mulq %4             \n\t"  \
1493  "addq %%r10,%%rax    \n\t"  \
1494  "adcq $0,%%rdx       \n\t"  \
1495  "movq 0x10(%2),%%r10 \n\t"  \
1496  "addq %3,%%rax       \n\t"  \
1497  "adcq $0,%%rdx       \n\t"  \
1498  "movq %%rax,0x8(%0)  \n\t"  \
1499  "movq %%rdx,%1       \n\t"  \
1500  \
1501  "movq %%r11,%%rax    \n\t"  \
1502  "movq 0x18(%5),%%r11 \n\t"  \
1503  "mulq %4             \n\t"  \
1504  "addq %%r10,%%rax    \n\t"  \
1505  "adcq $0,%%rdx       \n\t"  \
1506  "movq 0x18(%2),%%r10 \n\t"  \
1507  "addq %3,%%rax       \n\t"  \
1508  "adcq $0,%%rdx       \n\t"  \
1509  "movq %%rax,0x10(%0) \n\t"  \
1510  "movq %%rdx,%1       \n\t"  \
1511  \
1512  "movq %%r11,%%rax    \n\t"  \
1513  "movq 0x20(%5),%%r11 \n\t"  \
1514  "mulq %4             \n\t"  \
1515  "addq %%r10,%%rax    \n\t"  \
1516  "adcq $0,%%rdx       \n\t"  \
1517  "movq 0x20(%2),%%r10 \n\t"  \
1518  "addq %3,%%rax       \n\t"  \
1519  "adcq $0,%%rdx       \n\t"  \
1520  "movq %%rax,0x18(%0) \n\t"  \
1521  "movq %%rdx,%1       \n\t"  \
1522  \
1523  "movq %%r11,%%rax    \n\t"  \
1524  "movq 0x28(%5),%%r11 \n\t"  \
1525  "mulq %4             \n\t"  \
1526  "addq %%r10,%%rax    \n\t"  \
1527  "adcq $0,%%rdx       \n\t"  \
1528  "movq 0x28(%2),%%r10 \n\t"  \
1529  "addq %3,%%rax       \n\t"  \
1530  "adcq $0,%%rdx       \n\t"  \
1531  "movq %%rax,0x20(%0) \n\t"  \
1532  "movq %%rdx,%1       \n\t"  \
1533  \
1534  "movq %%r11,%%rax    \n\t"  \
1535  "movq 0x30(%5),%%r11 \n\t"  \
1536  "mulq %4             \n\t"  \
1537  "addq %%r10,%%rax    \n\t"  \
1538  "adcq $0,%%rdx       \n\t"  \
1539  "movq 0x30(%2),%%r10 \n\t"  \
1540  "addq %3,%%rax       \n\t"  \
1541  "adcq $0,%%rdx       \n\t"  \
1542  "movq %%rax,0x28(%0) \n\t"  \
1543  "movq %%rdx,%1       \n\t"  \
1544  \
1545  "movq %%r11,%%rax    \n\t"  \
1546  "movq 0x38(%5),%%r11 \n\t"  \
1547  "mulq %4             \n\t"  \
1548  "addq %%r10,%%rax    \n\t"  \
1549  "adcq $0,%%rdx       \n\t"  \
1550  "movq 0x38(%2),%%r10 \n\t"  \
1551  "addq %3,%%rax       \n\t"  \
1552  "adcq $0,%%rdx       \n\t"  \
1553  "movq %%rax,0x30(%0) \n\t"  \
1554  "movq %%rdx,%1       \n\t"  \
1555  \
1556  "movq %%r11,%%rax    \n\t"  \
1557  "mulq %4             \n\t"  \
1558  "addq %%r10,%%rax    \n\t"  \
1559  "adcq $0,%%rdx       \n\t"  \
1560  "addq %3,%%rax       \n\t"  \
1561  "adcq $0,%%rdx       \n\t"  \
1562  "movq %%rax,0x38(%0) \n\t"  \
1563  "movq %%rdx,%1       \n\t"  \
1564  \
1565 :"=r"(_c), "=r"(cy)                    \
1566 : "0"(_c),  "1"(cy), "g"(mu), "r"(tmpm)\
1567 : "%rax", "%rdx", "%r10", "%r11", "%cc")
1568
1569
1570 #define PROPCARRY                           \
1571 asm(                                        \
1572    "addq   %1,%0    \n\t"                   \
1573    "setb   %%al     \n\t"                   \
1574    "movzbq %%al,%1 \n\t"                    \
1575 :"=g"(_c[LO]), "=r"(cy)                     \
1576 :"0"(_c[LO]), "1"(cy)                       \
1577 : "%rax", "%cc")
1578
1579 /******************************************************************/
1580 #elif defined(TFM_SSE2)
1581 /* SSE2 code (assumes 32-bit tfm_fp_digits) */
1582 /* XMM register assignments:
1583  * xmm0  *tmpm++, then Mu * (*tmpm++)
1584  * xmm1  c[x], then Mu
1585  * xmm2  mp
1586  * xmm3  cy
1587  * xmm4  _c[LO]
1588  */
1589
1590 #define MONT_START \
1591    asm("movd %0,%%mm2"::"g"(mp))
1592
1593 #define MONT_FINI \
1594    asm("emms")
1595
1596 #define LOOP_START          \
1597 asm(                        \
1598 "movd %0,%%mm1        \n\t" \
1599 "pxor %%mm3,%%mm3     \n\t" \
1600 "pmuludq %%mm2,%%mm1  \n\t" \
1601 :: "g"(c[x]))
1602
1603 /* pmuludq on mmx registers does a 32x32->64 multiply. */
1604 #define INNERMUL               \
1605 asm(                           \
1606    "movd %1,%%mm4        \n\t" \
1607    "movd %2,%%mm0        \n\t" \
1608    "paddq %%mm4,%%mm3    \n\t" \
1609    "pmuludq %%mm1,%%mm0  \n\t" \
1610    "paddq %%mm0,%%mm3    \n\t" \
1611    "movd %%mm3,%0        \n\t" \
1612    "psrlq $32, %%mm3     \n\t" \
1613 :"=g"(_c[LO]) : "0"(_c[LO]), "g"(*tmpm++) );
1614
1615 #define INNERMUL8 \
1616 asm(                           \
1617    "movd 0(%1),%%mm4     \n\t" \
1618    "movd 0(%2),%%mm0     \n\t" \
1619    "paddq %%mm4,%%mm3    \n\t" \
1620    "pmuludq %%mm1,%%mm0  \n\t" \
1621    "movd 4(%2),%%mm5     \n\t" \
1622    "paddq %%mm0,%%mm3    \n\t" \
1623    "movd 4(%1),%%mm6     \n\t" \
1624    "movd %%mm3,0(%0)     \n\t" \
1625    "psrlq $32, %%mm3     \n\t" \
1626 \
1627    "paddq %%mm6,%%mm3    \n\t" \
1628    "pmuludq %%mm1,%%mm5  \n\t" \
1629    "movd 8(%2),%%mm6     \n\t" \
1630    "paddq %%mm5,%%mm3    \n\t" \
1631    "movd 8(%1),%%mm7     \n\t" \
1632    "movd %%mm3,4(%0)     \n\t" \
1633    "psrlq $32, %%mm3     \n\t" \
1634 \
1635    "paddq %%mm7,%%mm3    \n\t" \
1636    "pmuludq %%mm1,%%mm6  \n\t" \
1637    "movd 12(%2),%%mm7    \n\t" \
1638    "paddq %%mm6,%%mm3    \n\t" \
1639    "movd 12(%1),%%mm5     \n\t" \
1640    "movd %%mm3,8(%0)     \n\t" \
1641    "psrlq $32, %%mm3     \n\t" \
1642 \
1643    "paddq %%mm5,%%mm3    \n\t" \
1644    "pmuludq %%mm1,%%mm7  \n\t" \
1645    "movd 16(%2),%%mm5    \n\t" \
1646    "paddq %%mm7,%%mm3    \n\t" \
1647    "movd 16(%1),%%mm6    \n\t" \
1648    "movd %%mm3,12(%0)    \n\t" \
1649    "psrlq $32, %%mm3     \n\t" \
1650 \
1651    "paddq %%mm6,%%mm3    \n\t" \
1652    "pmuludq %%mm1,%%mm5  \n\t" \
1653    "movd 20(%2),%%mm6    \n\t" \
1654    "paddq %%mm5,%%mm3    \n\t" \
1655    "movd 20(%1),%%mm7    \n\t" \
1656    "movd %%mm3,16(%0)    \n\t" \
1657    "psrlq $32, %%mm3     \n\t" \
1658 \
1659    "paddq %%mm7,%%mm3    \n\t" \
1660    "pmuludq %%mm1,%%mm6  \n\t" \
1661    "movd 24(%2),%%mm7    \n\t" \
1662    "paddq %%mm6,%%mm3    \n\t" \
1663    "movd 24(%1),%%mm5     \n\t" \
1664    "movd %%mm3,20(%0)    \n\t" \
1665    "psrlq $32, %%mm3     \n\t" \
1666 \
1667    "paddq %%mm5,%%mm3    \n\t" \
1668    "pmuludq %%mm1,%%mm7  \n\t" \
1669    "movd 28(%2),%%mm5    \n\t" \
1670    "paddq %%mm7,%%mm3    \n\t" \
1671    "movd 28(%1),%%mm6    \n\t" \
1672    "movd %%mm3,24(%0)    \n\t" \
1673    "psrlq $32, %%mm3     \n\t" \
1674 \
1675    "paddq %%mm6,%%mm3    \n\t" \
1676    "pmuludq %%mm1,%%mm5  \n\t" \
1677    "paddq %%mm5,%%mm3    \n\t" \
1678    "movd %%mm3,28(%0)    \n\t" \
1679    "psrlq $32, %%mm3     \n\t" \
1680 :"=r"(_c) : "0"(_c), "g"(tmpm) );
1681
1682 #define LOOP_END \
1683 asm( "movd %%mm3,%0  \n" :"=r"(cy))
1684
1685 #define PROPCARRY                           \
1686 asm(                                        \
1687    "addl   %1,%0    \n\t"                   \
1688    "setb   %%al     \n\t"                   \
1689    "movzbl %%al,%1 \n\t"                    \
1690 :"=g"(_c[LO]), "=r"(cy)                     \
1691 :"0"(_c[LO]), "1"(cy)                       \
1692 : "%eax", "%cc")
1693
1694 /******************************************************************/
1695 #elif defined(TFM_ARM)
1696    /* ARMv4 code */
1697
1698 #define MONT_START
1699 #define MONT_FINI
1700 #define LOOP_END
1701 #define LOOP_START \
1702    mu = c[x] * mp
1703
1704 #define INNERMUL                    \
1705 asm(                                \
1706     " LDR    r0,%1            \n\t" \
1707     " ADDS   r0,r0,%0         \n\t" \
1708     " MOVCS  %0,#1            \n\t" \
1709     " MOVCC  %0,#0            \n\t" \
1710     " UMLAL  r0,%0,%3,%4      \n\t" \
1711     " STR    r0,%1            \n\t" \
1712 :"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(*tmpm++),"1"(_c[0]):"r0","%cc");
1713
1714 #define PROPCARRY                  \
1715 asm(                               \
1716     " LDR   r0,%1            \n\t" \
1717     " ADDS  r0,r0,%0         \n\t" \
1718     " STR   r0,%1            \n\t" \
1719     " MOVCS %0,#1            \n\t" \
1720     " MOVCC %0,#0            \n\t" \
1721 :"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"r0","%cc");
1722
1723 /******************************************************************/
1724 #elif defined(TFM_PPC32)
1725
1726 /* PPC32 */
1727 #define MONT_START
1728 #define MONT_FINI
1729 #define LOOP_END
1730 #define LOOP_START \
1731    mu = c[x] * mp
1732
1733 #define INNERMUL                     \
1734 asm(                                 \
1735    " mullw    16,%3,%4       \n\t"   \
1736    " mulhwu   17,%3,%4       \n\t"   \
1737    " addc     16,16,%0       \n\t"   \
1738    " addze    17,17          \n\t"   \
1739    " lwz      18,%1          \n\t"   \
1740    " addc     16,16,18       \n\t"   \
1741    " addze    %0,17          \n\t"   \
1742    " stw      16,%1          \n\t"   \
1743 :"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(tmpm[0]),"1"(_c[0]):"16", "17", "18","%cc"); ++tmpm;
1744
1745 #define PROPCARRY                    \
1746 asm(                                 \
1747    " lwz      16,%1         \n\t"    \
1748    " addc     16,16,%0      \n\t"    \
1749    " stw      16,%1         \n\t"    \
1750    " xor      %0,%0,%0      \n\t"    \
1751    " addze    %0,%0         \n\t"    \
1752 :"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"16","%cc");
1753
1754 /******************************************************************/
1755 #elif defined(TFM_PPC64)
1756
1757 /* PPC64 */
1758 #define MONT_START
1759 #define MONT_FINI
1760 #define LOOP_END
1761 #define LOOP_START \
1762    mu = c[x] * mp
1763
1764 #define INNERMUL                     \
1765 asm(                                 \
1766    " mulld    r16,%3,%4       \n\t"   \
1767    " mulhdu   r17,%3,%4       \n\t"   \
1768    " addc     r16,16,%0       \n\t"   \
1769    " addze    r17,r17          \n\t"   \
1770    " ldx      r18,0,%1        \n\t"   \
1771    " addc     r16,r16,r18       \n\t"   \
1772    " addze    %0,r17          \n\t"   \
1773    " sdx      r16,0,%1        \n\t"   \
1774 :"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(tmpm[0]),"1"(_c[0]):"r16", "r17", "r18","%cc"); ++tmpm;
1775
1776 #define PROPCARRY                    \
1777 asm(                                 \
1778    " ldx      r16,0,%1       \n\t"    \
1779    " addc     r16,r16,%0      \n\t"    \
1780    " sdx      r16,0,%1       \n\t"    \
1781    " xor      %0,%0,%0      \n\t"    \
1782    " addze    %0,%0         \n\t"    \
1783 :"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"r16","%cc");
1784
1785 /******************************************************************/
1786 #elif defined(TFM_AVR32)
1787
1788 /* AVR32 */
1789 #define MONT_START
1790 #define MONT_FINI
1791 #define LOOP_END
1792 #define LOOP_START \
1793    mu = c[x] * mp
1794
1795 #define INNERMUL                    \
1796 asm(                                \
1797     " ld.w   r2,%1            \n\t" \
1798     " add    r2,%0            \n\t" \
1799     " eor    r3,r3            \n\t" \
1800     " acr    r3               \n\t" \
1801     " macu.d r2,%3,%4         \n\t" \
1802     " st.w   %1,r2            \n\t" \
1803     " mov    %0,r3            \n\t" \
1804 :"=r"(cy),"=r"(_c):"0"(cy),"r"(mu),"r"(*tmpm++),"1"(_c):"r2","r3");
1805
1806 #define PROPCARRY                    \
1807 asm(                                 \
1808    " ld.w     r2,%1         \n\t"    \
1809    " add      r2,%0         \n\t"    \
1810    " st.w     %1,r2         \n\t"    \
1811    " eor      %0,%0         \n\t"    \
1812    " acr      %0            \n\t"    \
1813 :"=r"(cy),"=r"(&_c[0]):"0"(cy),"1"(&_c[0]):"r2","%cc");
1814
1815 /******************************************************************/
1816 #elif defined(TFM_MIPS)
1817
1818 /* MIPS */
1819 #define MONT_START
1820 #define MONT_FINI
1821 #define LOOP_END
1822 #define LOOP_START \
1823    mu = c[x] * mp
1824
1825 #define INNERMUL                     \
1826 asm(                                 \
1827    " multu    %3,%4          \n\t"   \
1828    " mflo     $12            \n\t"   \
1829    " mfhi     $13            \n\t"   \
1830    " addu     $12,$12,%0     \n\t"   \
1831    " sltu     $10,$12,%0     \n\t"   \
1832    " addu     $13,$13,$10    \n\t"   \
1833    " lw       $10,%1         \n\t"   \
1834    " addu     $12,$12,$10    \n\t"   \
1835    " sltu     $10,$12,$10    \n\t"   \
1836    " addu     %0,$13,$10     \n\t"   \
1837    " sw       $12,%1         \n\t"   \
1838 :"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(tmpm[0]),"1"(_c[0]):"$10","$12","$13"); ++tmpm;
1839
1840 #define PROPCARRY                    \
1841 asm(                                 \
1842    " lw       $10,%1        \n\t"    \
1843    " addu     $10,$10,%0    \n\t"    \
1844    " sw       $10,%1        \n\t"    \
1845    " sltu     %0,$10,%0     \n\t"    \
1846 :"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"$10");
1847
1848 /******************************************************************/
1849 #else
1850
1851 /* ISO C code */
1852 #define MONT_START
1853 #define MONT_FINI
1854 #define LOOP_END
1855 #define LOOP_START \
1856    mu = c[x] * mp
1857
1858 #define INNERMUL                                      \
1859    do { tfm_fp_word t;                                    \
1860    _c[0] = t  = ((tfm_fp_word)_c[0] + (tfm_fp_word)cy) +      \
1861                 (((tfm_fp_word)mu) * ((tfm_fp_word)*tmpm++)); \
1862    cy = (t >> DIGIT_BIT);                             \
1863    } while (0)
1864
1865 #define PROPCARRY \
1866    do { tfm_fp_digit t = _c[0] += cy; cy = (t < cy); } while (0)
1867
1868 #endif
1869 /******************************************************************/
1870
1871
1872 #define LO  0
1873
1874 #ifdef TFM_SMALL_MONT_SET
1875 #include "tfm_fp_mont_small.i"
1876 #endif
1877
1878 /* computes x/R == x (mod N) via Montgomery Reduction */
1879 int tfm_fp_montgomery_reduce(tfm_fp_int *a, tfm_fp_int *m, tfm_fp_digit mp)
1880 {
1881    tfm_fp_digit *c, C[TFM_FP_SIZE], *ac = NULL, *_c, *tmpm, mu;
1882    int      oldused, x, y, pa;
1883
1884    /* Grow when needed */
1885    if (a->alloc < m->used + 1)
1886      if (tfm_fp_grow(a, m->used + 1))
1887        return TFM_FP_MEM;
1888
1889    pa = m->used;
1890
1891    /* Allocate more space if we're doing huge computations */
1892    if (2 * pa + 1 >= TFM_FP_SIZE) {
1893      ac = silc_smalloc(a->stack, (2 * pa + 1) * sizeof(*c));
1894      if (!ac)
1895        return TFM_FP_MEM;
1896      c = ac;
1897    } else {
1898      c = C;
1899    }
1900
1901    /* copy the input */
1902    oldused = a->used;
1903    for (x = 0; x < oldused; x++) {
1904        c[x] = a->dp[x];
1905    }
1906 #if !defined(USE_MEMSET)
1907    for (; x < 2*pa+1; x++) {
1908        c[x] = 0;
1909    }
1910 #endif
1911    MONT_START;
1912
1913    for (x = 0; x < pa; x++) {
1914        tfm_fp_digit cy = 0;
1915        /* get Mu for this round */
1916        LOOP_START;
1917        _c   = c + x;
1918        tmpm = m->dp;
1919        y = 0;
1920        #if (defined(TFM_SSE2) || defined(TFM_X86_64))
1921         for (; y < (pa & ~7); y += 8) {
1922               INNERMUL8;
1923               _c   += 8;
1924               tmpm += 8;
1925            }
1926        #endif
1927
1928        for (; y < pa; y++) {
1929           INNERMUL;
1930           ++_c;
1931        }
1932        LOOP_END;
1933        while (cy) {
1934            PROPCARRY;
1935            ++_c;
1936        }
1937   }
1938
1939   /* now copy out */
1940   _c   = c + pa;
1941   tmpm = a->dp;
1942   for (x = 0; x < pa+1; x++) {
1943      *tmpm++ = *_c++;
1944   }
1945
1946   for (; x < oldused; x++)   {
1947      *tmpm++ = 0;
1948   }
1949
1950   MONT_FINI;
1951
1952   a->used = pa+1;
1953   tfm_fp_clamp(a);
1954
1955   if (ac)
1956     silc_sfree(a->stack, ac);
1957
1958   /* if A >= m then A = A - m */
1959   if (tfm_fp_cmp_mag (a, m) != TFM_FP_LT) {
1960     if (s_tfm_fp_sub (a, m, a))
1961       return TFM_FP_MEM;
1962   }
1963   return TFM_FP_OKAY;
1964 }
1965
1966 /* setups the montgomery reduction */
1967 int tfm_fp_montgomery_setup(tfm_fp_int *a, tfm_fp_digit *rho)
1968 {
1969   tfm_fp_digit x, b;
1970
1971 /* fast inversion mod 2**k
1972  *
1973  * Based on the fact that
1974  *
1975  * XA = 1 (mod 2**n)  =>  (X(2-XA)) A = 1 (mod 2**2n)
1976  *                    =>  2*X*A - X*X*A*A = 1
1977  *                    =>  2*(1) - (1)     = 1
1978  */
1979   b = a->dp[0];
1980
1981   if ((b & 1) == 0) {
1982     return TFM_FP_VAL;
1983   }
1984
1985   x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
1986   x *= 2 - b * x;               /* here x*a==1 mod 2**8 */
1987   x *= 2 - b * x;               /* here x*a==1 mod 2**16 */
1988   x *= 2 - b * x;               /* here x*a==1 mod 2**32 */
1989 #ifdef TFM_FP_64BIT
1990   x *= 2 - b * x;               /* here x*a==1 mod 2**64 */
1991 #endif
1992
1993   /* rho = -1/m mod b */
1994   *rho = (((tfm_fp_word) 1 << ((tfm_fp_word) DIGIT_BIT)) - ((tfm_fp_word)x));
1995
1996   return TFM_FP_OKAY;
1997 }
1998
1999 /* c = a * b */
2000 int tfm_fp_mul(tfm_fp_int *A, tfm_fp_int *B, tfm_fp_int *C)
2001 {
2002     int   y, yy;
2003
2004      y  = MAX(A->used, B->used);
2005      yy = MIN(A->used, B->used);
2006
2007     /* pick a comba (unrolled 4/8/16/32 x or rolled) based on the size
2008        of the largest input.  We also want to avoid doing excess mults if the
2009        inputs are not close to the next power of two.  That is, for example,
2010        if say y=17 then we would do (32-17)^2 = 225 unneeded multiplications
2011     */
2012
2013 #ifdef TFM_SMALL_SET
2014         if (y <= 16) {
2015           /* Grow when needed.  All mul routines expect the space to be there
2016              and that all integers are same size. */
2017           if (C->alloc < 32 + 1)
2018             if (tfm_fp_grow(C, 32 + 1))
2019               return TFM_FP_MEM;
2020           if (A->alloc < 32 + 1)
2021             if (tfm_fp_grow(A, 32 + 1))
2022               return TFM_FP_MEM;
2023           if (B->alloc < 32 + 1)
2024             if (tfm_fp_grow(B, 32 + 1))
2025               return TFM_FP_MEM;
2026
2027            tfm_fp_mul_comba_small(A,B,C);
2028            return TFM_FP_OKAY;
2029         }
2030 #endif
2031 #if defined(TFM_MUL20)
2032         if (y <= 20) {
2033           /* Grow when needed.  All mul routines expect the space to be there
2034              and that all integers are same size. */
2035           if (C->alloc < 40 + 1)
2036             if (tfm_fp_grow(C, 40 + 1))
2037               return TFM_FP_MEM;
2038           if (A->alloc < 40 + 1)
2039             if (tfm_fp_grow(A, 40 + 1))
2040               return TFM_FP_MEM;
2041           if (B->alloc < 40 + 1)
2042             if (tfm_fp_grow(B, 40 + 1))
2043               return TFM_FP_MEM;
2044
2045            tfm_fp_mul_comba20(A,B,C);
2046            return TFM_FP_OKAY;
2047         }
2048 #endif
2049 #if defined(TFM_MUL24)
2050         if (yy >= 16 && y <= 24) {
2051           /* Grow when needed.  All mul routines expect the space to be there
2052              and that all integers are same size. */
2053           if (C->alloc < 48 + 1)
2054             if (tfm_fp_grow(C, 48 + 1))
2055               return TFM_FP_MEM;
2056           if (A->alloc < 48 + 1)
2057             if (tfm_fp_grow(A, 48 + 1))
2058               return TFM_FP_MEM;
2059           if (B->alloc < 48 + 1)
2060             if (tfm_fp_grow(B, 48 + 1))
2061               return TFM_FP_MEM;
2062
2063            tfm_fp_mul_comba24(A,B,C);
2064            return TFM_FP_OKAY;
2065         }
2066 #endif
2067 #if defined(TFM_MUL28)
2068         if (yy >= 20 && y <= 28) {
2069           /* Grow when needed.  All mul routines expect the space to be there
2070              and that all integers are same size. */
2071           if (C->alloc < 56 + 1)
2072             if (tfm_fp_grow(C, 56 + 1))
2073               return TFM_FP_MEM;
2074           if (A->alloc < 56 + 1)
2075             if (tfm_fp_grow(A, 56 + 1))
2076               return TFM_FP_MEM;
2077           if (B->alloc < 56 + 1)
2078             if (tfm_fp_grow(B, 56 + 1))
2079               return TFM_FP_MEM;
2080
2081            tfm_fp_mul_comba28(A,B,C);
2082            return TFM_FP_OKAY;
2083         }
2084 #endif
2085 #if defined(TFM_MUL32)
2086         if (yy >= 24 && y <= 32) {
2087           /* Grow when needed.  All mul routines expect the space to be there
2088              and that all integers are same size. */
2089           if (C->alloc < 64 + 1)
2090             if (tfm_fp_grow(C, 64 + 1))
2091               return TFM_FP_MEM;
2092           if (A->alloc < 64 + 1)
2093             if (tfm_fp_grow(A, 64 + 1))
2094               return TFM_FP_MEM;
2095           if (B->alloc < 64 + 1)
2096             if (tfm_fp_grow(B, 64 + 1))
2097               return TFM_FP_MEM;
2098
2099            tfm_fp_mul_comba32(A,B,C);
2100            return TFM_FP_OKAY;
2101         }
2102 #endif
2103 #if defined(TFM_MUL48)
2104         if (yy >= 40 && y <= 48) {
2105           /* Grow when needed.  All mul routines expect the space to be there
2106              and that all integers are same size. */
2107           if (C->alloc < 96 + 1)
2108             if (tfm_fp_grow(C, 96 + 1))
2109               return TFM_FP_MEM;
2110           if (A->alloc < 96 + 1)
2111             if (tfm_fp_grow(A, 96 + 1))
2112               return TFM_FP_MEM;
2113           if (B->alloc < 96 + 1)
2114             if (tfm_fp_grow(B, 96 + 1))
2115               return TFM_FP_MEM;
2116
2117            tfm_fp_mul_comba48(A,B,C);
2118            return TFM_FP_OKAY;
2119         }
2120 #endif
2121 #if defined(TFM_MUL64)
2122         if (yy >= 56 && y <= 64) {
2123           /* Grow when needed.  All mul routines expect the space to be there
2124              and that all integers are same size. */
2125           if (C->alloc < 128 + 1)
2126             if (tfm_fp_grow(C, 128 + 1))
2127               return TFM_FP_MEM;
2128           if (A->alloc < 128 + 1)
2129             if (tfm_fp_grow(A, 128 + 1))
2130               return TFM_FP_MEM;
2131           if (B->alloc < 128 + 1)
2132             if (tfm_fp_grow(B, 128 + 1))
2133               return TFM_FP_MEM;
2134
2135            tfm_fp_mul_comba64(A,B,C);
2136            return TFM_FP_OKAY;
2137         }
2138 #endif
2139
2140         /* Grow when needed.  All mul routines expect the space to be there
2141            and that all integers are same size. */
2142         if (C->alloc < (y * 2) + 1)
2143           if (tfm_fp_grow(C, (y * 2) + 1))
2144             return TFM_FP_MEM;
2145         if (A->alloc < (y * 2) + 1)
2146           if (tfm_fp_grow(A, (y * 2) + 1))
2147             return TFM_FP_MEM;
2148         if (B->alloc < (y * 2) + 1)
2149           if (tfm_fp_grow(B, (y * 2) + 1))
2150             return TFM_FP_MEM;
2151
2152         return tfm_fp_mul_comba(A,B,C);
2153 }
2154
2155 int tfm_fp_mul_2(tfm_fp_int * a, tfm_fp_int * b)
2156 {
2157   int     x, oldused;
2158
2159   if (b->alloc <= a->used + 1)
2160     if (tfm_fp_grow(b, a->used + 1))
2161       return TFM_FP_MEM;
2162
2163   oldused = b->used;
2164   b->used = a->used;
2165
2166   {
2167     register tfm_fp_digit r, rr, *tmpa, *tmpb;
2168
2169     /* alias for source */
2170     tmpa = a->dp;
2171
2172     /* alias for dest */
2173     tmpb = b->dp;
2174
2175     /* carry */
2176     r = 0;
2177     for (x = 0; x < a->used; x++) {
2178
2179       /* get what will be the *next* carry bit from the
2180        * MSB of the current digit
2181        */
2182       rr = *tmpa >> ((tfm_fp_digit)(DIGIT_BIT - 1));
2183
2184       /* now shift up this digit, add in the carry [from the previous] */
2185       *tmpb++ = ((*tmpa++ << ((tfm_fp_digit)1)) | r);
2186
2187       /* copy the carry that would be from the source
2188        * digit into the next iteration
2189        */
2190       r = rr;
2191     }
2192
2193     /* new leading digit? */
2194     if (r != 0) {
2195       /* add a MSB which is always 1 at this point */
2196       *tmpb = 1;
2197       ++(b->used);
2198     }
2199
2200     /* now zero any excess digits on the destination
2201      * that we didn't write to
2202      */
2203     tmpb = b->dp + b->used;
2204     for (x = b->used; x < oldused; x++) {
2205       *tmpb++ = 0;
2206     }
2207   }
2208   b->sign = a->sign;
2209   return TFM_FP_OKAY;
2210 }
2211
2212 /* c = a * 2**d */
2213 int tfm_fp_mul_2d(tfm_fp_int *a, int b, tfm_fp_int *c)
2214 {
2215    tfm_fp_digit carry, carrytmp, shift;
2216    int x;
2217
2218    /* copy it */
2219    if (tfm_fp_copy(a, c))
2220      return TFM_FP_MEM;
2221
2222    if (c->alloc < (c->used + b / DIGIT_BIT + 1))
2223      if (tfm_fp_grow(c, c->used + b / DIGIT_BIT + 1))
2224        return TFM_FP_MEM;
2225
2226    /* handle whole digits */
2227    if (b >= DIGIT_BIT) {
2228      if (tfm_fp_lshd(c, b/DIGIT_BIT))
2229        return TFM_FP_MEM;
2230    }
2231    b %= DIGIT_BIT;
2232
2233    /* shift the digits */
2234    if (b != 0) {
2235       carry = 0;
2236       shift = DIGIT_BIT - b;
2237       for (x = 0; x < c->used; x++) {
2238           carrytmp = c->dp[x] >> shift;
2239           c->dp[x] = (c->dp[x] << b) + carry;
2240           carry = carrytmp;
2241       }
2242       /* store last carry if room */
2243       if (carry && x < c->alloc) {
2244          c->dp[c->used++] = carry;
2245       }
2246    }
2247    tfm_fp_clamp(c);
2248    return TFM_FP_OKAY;
2249 }
2250
2251 #if defined(TFM_PRESCOTT) && defined(TFM_SSE2)
2252    #undef TFM_SSE2
2253    #define TFM_X86
2254 #endif
2255
2256 /* these are the combas.  Worship them. */
2257 #if defined(TFM_X86)
2258 /* Generic x86 optimized code */
2259
2260 /* anything you need at the start */
2261 #define COMBA_START
2262
2263 /* clear the chaining variables */
2264 #define COMBA_CLEAR \
2265    c0 = c1 = c2 = 0;
2266
2267 /* forward the carry to the next digit */
2268 #define COMBA_FORWARD \
2269    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
2270
2271 /* store the first sum */
2272 #define COMBA_STORE(x) \
2273    x = c0;
2274
2275 /* store the second sum [carry] */
2276 #define COMBA_STORE2(x) \
2277    x = c1;
2278
2279 /* anything you need at the end */
2280 #define COMBA_FINI
2281
2282 /* this should multiply i and j  */
2283 #define MULADD(i, j)                                      \
2284 asm(                                                      \
2285      "movl  %6,%%eax     \n\t"                            \
2286      "mull  %7           \n\t"                            \
2287      "addl  %%eax,%0     \n\t"                            \
2288      "adcl  %%edx,%1     \n\t"                            \
2289      "adcl  $0,%2        \n\t"                            \
2290      :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j)  :"%eax","%edx","%cc");
2291
2292 #elif defined(TFM_X86_64)
2293 /* x86-64 optimized */
2294
2295 /* anything you need at the start */
2296 #define COMBA_START
2297
2298 /* clear the chaining variables */
2299 #define COMBA_CLEAR \
2300    c0 = c1 = c2 = 0;
2301
2302 /* forward the carry to the next digit */
2303 #define COMBA_FORWARD \
2304    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
2305
2306 /* store the first sum */
2307 #define COMBA_STORE(x) \
2308    x = c0;
2309
2310 /* store the second sum [carry] */
2311 #define COMBA_STORE2(x) \
2312    x = c1;
2313
2314 /* anything you need at the end */
2315 #define COMBA_FINI
2316
2317 /* this should multiply i and j  */
2318 #define MULADD(i, j)                                      \
2319 asm  (                                                    \
2320      "movq  %6,%%rax     \n\t"                            \
2321      "mulq  %7           \n\t"                            \
2322      "addq  %%rax,%0     \n\t"                            \
2323      "adcq  %%rdx,%1     \n\t"                            \
2324      "adcq  $0,%2        \n\t"                            \
2325      :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j)  :"%rax","%rdx","%cc");
2326
2327 #elif defined(TFM_SSE2)
2328 /* use SSE2 optimizations */
2329
2330 /* anything you need at the start */
2331 #define COMBA_START
2332
2333 /* clear the chaining variables */
2334 #define COMBA_CLEAR \
2335    c0 = c1 = c2 = 0;
2336
2337 /* forward the carry to the next digit */
2338 #define COMBA_FORWARD \
2339    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
2340
2341 /* store the first sum */
2342 #define COMBA_STORE(x) \
2343    x = c0;
2344
2345 /* store the second sum [carry] */
2346 #define COMBA_STORE2(x) \
2347    x = c1;
2348
2349 /* anything you need at the end */
2350 #define COMBA_FINI \
2351    asm("emms");
2352
2353 /* this should multiply i and j  */
2354 #define MULADD(i, j)                                     \
2355 asm(                                                     \
2356     "movd  %6,%%mm0     \n\t"                            \
2357     "movd  %7,%%mm1     \n\t"                            \
2358     "pmuludq %%mm1,%%mm0\n\t"                            \
2359     "movd  %%mm0,%%eax  \n\t"                            \
2360     "psrlq $32,%%mm0    \n\t"                            \
2361     "addl  %%eax,%0     \n\t"                            \
2362     "movd  %%mm0,%%eax  \n\t"                            \
2363     "adcl  %%eax,%1     \n\t"                            \
2364     "adcl  $0,%2        \n\t"                            \
2365     :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j)  :"%eax","%cc");
2366
2367 #elif defined(TFM_ARM)
2368 /* ARM code */
2369
2370 #define COMBA_START
2371
2372 #define COMBA_CLEAR \
2373    c0 = c1 = c2 = 0;
2374
2375 #define COMBA_FORWARD \
2376    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
2377
2378 #define COMBA_STORE(x) \
2379    x = c0;
2380
2381 #define COMBA_STORE2(x) \
2382    x = c1;
2383
2384 #define COMBA_FINI
2385
2386 #define MULADD(i, j)                                          \
2387 asm(                                                          \
2388 "  UMULL  r0,r1,%6,%7           \n\t"                         \
2389 "  ADDS   %0,%0,r0              \n\t"                         \
2390 "  ADCS   %1,%1,r1              \n\t"                         \
2391 "  ADC    %2,%2,#0              \n\t"                         \
2392 :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j) : "r0", "r1", "%cc");
2393
2394 #elif defined(TFM_PPC32)
2395 /* For 32-bit PPC */
2396
2397 #define COMBA_START
2398
2399 #define COMBA_CLEAR \
2400    c0 = c1 = c2 = 0;
2401
2402 #define COMBA_FORWARD \
2403    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
2404
2405 #define COMBA_STORE(x) \
2406    x = c0;
2407
2408 #define COMBA_STORE2(x) \
2409    x = c1;
2410
2411 #define COMBA_FINI
2412
2413 /* untested: will mulhwu change the flags?  Docs say no */
2414 #define MULADD(i, j)              \
2415 asm(                              \
2416    " mullw  16,%6,%7       \n\t" \
2417    " addc   %0,%0,16       \n\t" \
2418    " mulhwu 16,%6,%7       \n\t" \
2419    " adde   %1,%1,16       \n\t" \
2420    " addze  %2,%2          \n\t" \
2421 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16");
2422
2423 #elif defined(TFM_PPC64)
2424 /* For 64-bit PPC */
2425
2426 #define COMBA_START
2427
2428 #define COMBA_CLEAR \
2429    c0 = c1 = c2 = 0;
2430
2431 #define COMBA_FORWARD \
2432    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
2433
2434 #define COMBA_STORE(x) \
2435    x = c0;
2436
2437 #define COMBA_STORE2(x) \
2438    x = c1;
2439
2440 #define COMBA_FINI
2441
2442 /* untested: will mulhdu change the flags?  Docs say no */
2443 #define MULADD(i, j)              \
2444 asm(                              \
2445    " mulld  r16,%6,%7       \n\t" \
2446    " addc   %0,%0,16       \n\t" \
2447    " mulhdu r16,%6,%7       \n\t" \
2448    " adde   %1,%1,16       \n\t" \
2449    " addze  %2,%2          \n\t" \
2450 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r16");
2451
2452 #elif defined(TFM_AVR32)
2453
2454 /* ISO C code */
2455
2456 #define COMBA_START
2457
2458 #define COMBA_CLEAR \
2459    c0 = c1 = c2 = 0;
2460
2461 #define COMBA_FORWARD \
2462    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
2463
2464 #define COMBA_STORE(x) \
2465    x = c0;
2466
2467 #define COMBA_STORE2(x) \
2468    x = c1;
2469
2470 #define COMBA_FINI
2471
2472 #define MULADD(i, j)             \
2473 asm(                             \
2474    " mulu.d r2,%6,%7        \n\t"\
2475    " add    %0,r2           \n\t"\
2476    " adc    %1,%1,r3        \n\t"\
2477    " acr    %2              \n\t"\
2478 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r2","r3");
2479
2480 #elif defined(TFM_MIPS)
2481
2482 #define COMBA_START
2483
2484 #define COMBA_CLEAR \
2485    c0 = c1 = c2 = 0;
2486
2487 #define COMBA_FORWARD \
2488    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
2489
2490 #define COMBA_STORE(x) \
2491    x = c0;
2492
2493 #define COMBA_STORE2(x) \
2494    x = c1;
2495
2496 #define COMBA_FINI
2497
2498 #define MULADD(i, j)              \
2499 asm(                              \
2500    " multu  %6,%7          \n\t"  \
2501    " mflo   $12            \n\t"  \
2502    " mfhi   $13            \n\t"  \
2503    " addu    %0,%0,$12     \n\t"  \
2504    " sltu   $12,%0,$12     \n\t"  \
2505    " addu    %1,%1,$13     \n\t"  \
2506    " sltu   $13,%1,$13     \n\t"  \
2507    " addu    %1,%1,$12     \n\t"  \
2508    " sltu   $12,%1,$12     \n\t"  \
2509    " addu    %2,%2,$13     \n\t"  \
2510    " addu    %2,%2,$12     \n\t"  \
2511 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"$12","$13");
2512
2513 #else
2514 /* ISO C code */
2515
2516 #define COMBA_START
2517
2518 #define COMBA_CLEAR \
2519    c0 = c1 = c2 = 0;
2520
2521 #define COMBA_FORWARD \
2522    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
2523
2524 #define COMBA_STORE(x) \
2525    x = c0;
2526
2527 #define COMBA_STORE2(x) \
2528    x = c1;
2529
2530 #define COMBA_FINI
2531
2532 #define MULADD(i, j)                                                              \
2533    do { tfm_fp_word t;                                                                \
2534    t = (tfm_fp_word)c0 + ((tfm_fp_word)i) * ((tfm_fp_word)j); c0 = t;                         \
2535    t = (tfm_fp_word)c1 + (t >> DIGIT_BIT);            c1 = t; c2 += t >> DIGIT_BIT;   \
2536    } while (0);
2537
2538 #endif
2539
2540 #ifndef TFM_DEFINES
2541
2542 /* generic PxQ multiplier */
2543 int tfm_fp_mul_comba(tfm_fp_int *A, tfm_fp_int *B, tfm_fp_int *C)
2544 {
2545    int       ix, iy, iz, tx, ty, pa;
2546    tfm_fp_digit  c0, c1, c2, *tmpx, *tmpy;
2547    tfm_fp_int    tmp, *dst;
2548
2549    SILC_LOG_DEBUG(("Start"));
2550    COMBA_START;
2551    COMBA_CLEAR;
2552
2553    pa = A->used + B->used;
2554
2555    if (A == C || B == C) {
2556      if (tfm_fp_init_size(C->stack, &tmp, pa))
2557        return TFM_FP_MEM;
2558       dst = &tmp;
2559    } else {
2560       tfm_fp_zeroise(C);
2561       dst = C;
2562    }
2563
2564    for (ix = 0; ix < pa; ix++) {
2565       /* get offsets into the two bignums */
2566       ty = MIN(ix, B->used-1);
2567       tx = ix - ty;
2568
2569       /* setup temp aliases */
2570       tmpx = A->dp + tx;
2571       tmpy = B->dp + ty;
2572
2573       /* this is the number of times the loop will iterrate, essentially its
2574          while (tx++ < a->used && ty-- >= 0) { ... }
2575        */
2576       iy = MIN(A->used-tx, ty+1);
2577
2578       /* execute loop */
2579       COMBA_FORWARD;
2580       for (iz = 0; iz < iy; ++iz) {
2581           MULADD(*tmpx++, *tmpy--);
2582       }
2583
2584       /* store term */
2585       COMBA_STORE(dst->dp[ix]);
2586   }
2587   COMBA_FINI;
2588
2589   dst->used = pa;
2590   dst->sign = A->sign ^ B->sign;
2591   tfm_fp_clamp(dst);
2592   tfm_fp_exch(dst, C);
2593
2594   if (A == C || B == C)
2595     tfm_fp_zero(&tmp);
2596
2597   return TFM_FP_OKAY;
2598 }
2599
2600 #endif
2601
2602 #define TFM_DEFINES
2603
2604 #ifdef TFM_MUL20
2605 void tfm_fp_mul_comba20(tfm_fp_int *A, tfm_fp_int *B, tfm_fp_int *C)
2606 {
2607    tfm_fp_digit c0, c1, c2, at[40];
2608
2609    SILC_LOG_DEBUG(("Start"));
2610    memcpy(at, A->dp, 20 * sizeof(tfm_fp_digit));
2611    memcpy(at+20, B->dp, 20 * sizeof(tfm_fp_digit));
2612    COMBA_START;
2613
2614    COMBA_CLEAR;
2615    /* 0 */
2616    MULADD(at[0], at[20]);
2617    COMBA_STORE(C->dp[0]);
2618    /* 1 */
2619    COMBA_FORWARD;
2620    MULADD(at[0], at[21]);    MULADD(at[1], at[20]);
2621    COMBA_STORE(C->dp[1]);
2622    /* 2 */
2623    COMBA_FORWARD;
2624    MULADD(at[0], at[22]);    MULADD(at[1], at[21]);    MULADD(at[2], at[20]);
2625    COMBA_STORE(C->dp[2]);
2626    /* 3 */
2627    COMBA_FORWARD;
2628    MULADD(at[0], at[23]);    MULADD(at[1], at[22]);    MULADD(at[2], at[21]);    MULADD(at[3], at[20]);
2629    COMBA_STORE(C->dp[3]);
2630    /* 4 */
2631    COMBA_FORWARD;
2632    MULADD(at[0], at[24]);    MULADD(at[1], at[23]);    MULADD(at[2], at[22]);    MULADD(at[3], at[21]);    MULADD(at[4], at[20]);
2633    COMBA_STORE(C->dp[4]);
2634    /* 5 */
2635    COMBA_FORWARD;
2636    MULADD(at[0], at[25]);    MULADD(at[1], at[24]);    MULADD(at[2], at[23]);    MULADD(at[3], at[22]);    MULADD(at[4], at[21]);    MULADD(at[5], at[20]);
2637    COMBA_STORE(C->dp[5]);
2638    /* 6 */
2639    COMBA_FORWARD;
2640    MULADD(at[0], at[26]);    MULADD(at[1], at[25]);    MULADD(at[2], at[24]);    MULADD(at[3], at[23]);    MULADD(at[4], at[22]);    MULADD(at[5], at[21]);    MULADD(at[6], at[20]);
2641    COMBA_STORE(C->dp[6]);
2642    /* 7 */
2643    COMBA_FORWARD;
2644    MULADD(at[0], at[27]);    MULADD(at[1], at[26]);    MULADD(at[2], at[25]);    MULADD(at[3], at[24]);    MULADD(at[4], at[23]);    MULADD(at[5], at[22]);    MULADD(at[6], at[21]);    MULADD(at[7], at[20]);
2645    COMBA_STORE(C->dp[7]);
2646    /* 8 */
2647    COMBA_FORWARD;
2648    MULADD(at[0], at[28]);    MULADD(at[1], at[27]);    MULADD(at[2], at[26]);    MULADD(at[3], at[25]);    MULADD(at[4], at[24]);    MULADD(at[5], at[23]);    MULADD(at[6], at[22]);    MULADD(at[7], at[21]);    MULADD(at[8], at[20]);
2649    COMBA_STORE(C->dp[8]);
2650    /* 9 */
2651    COMBA_FORWARD;
2652    MULADD(at[0], at[29]);    MULADD(at[1], at[28]);    MULADD(at[2], at[27]);    MULADD(at[3], at[26]);    MULADD(at[4], at[25]);    MULADD(at[5], at[24]);    MULADD(at[6], at[23]);    MULADD(at[7], at[22]);    MULADD(at[8], at[21]);    MULADD(at[9], at[20]);
2653    COMBA_STORE(C->dp[9]);
2654    /* 10 */
2655    COMBA_FORWARD;
2656    MULADD(at[0], at[30]);    MULADD(at[1], at[29]);    MULADD(at[2], at[28]);    MULADD(at[3], at[27]);    MULADD(at[4], at[26]);    MULADD(at[5], at[25]);    MULADD(at[6], at[24]);    MULADD(at[7], at[23]);    MULADD(at[8], at[22]);    MULADD(at[9], at[21]);    MULADD(at[10], at[20]);
2657    COMBA_STORE(C->dp[10]);
2658    /* 11 */
2659    COMBA_FORWARD;
2660    MULADD(at[0], at[31]);    MULADD(at[1], at[30]);    MULADD(at[2], at[29]);    MULADD(at[3], at[28]);    MULADD(at[4], at[27]);    MULADD(at[5], at[26]);    MULADD(at[6], at[25]);    MULADD(at[7], at[24]);    MULADD(at[8], at[23]);    MULADD(at[9], at[22]);    MULADD(at[10], at[21]);    MULADD(at[11], at[20]);
2661    COMBA_STORE(C->dp[11]);
2662    /* 12 */
2663    COMBA_FORWARD;
2664    MULADD(at[0], at[32]);    MULADD(at[1], at[31]);    MULADD(at[2], at[30]);    MULADD(at[3], at[29]);    MULADD(at[4], at[28]);    MULADD(at[5], at[27]);    MULADD(at[6], at[26]);    MULADD(at[7], at[25]);    MULADD(at[8], at[24]);    MULADD(at[9], at[23]);    MULADD(at[10], at[22]);    MULADD(at[11], at[21]);    MULADD(at[12], at[20]);
2665    COMBA_STORE(C->dp[12]);
2666    /* 13 */
2667    COMBA_FORWARD;
2668    MULADD(at[0], at[33]);    MULADD(at[1], at[32]);    MULADD(at[2], at[31]);    MULADD(at[3], at[30]);    MULADD(at[4], at[29]);    MULADD(at[5], at[28]);    MULADD(at[6], at[27]);    MULADD(at[7], at[26]);    MULADD(at[8], at[25]);    MULADD(at[9], at[24]);    MULADD(at[10], at[23]);    MULADD(at[11], at[22]);    MULADD(at[12], at[21]);    MULADD(at[13], at[20]);
2669    COMBA_STORE(C->dp[13]);
2670    /* 14 */
2671    COMBA_FORWARD;
2672    MULADD(at[0], at[34]);    MULADD(at[1], at[33]);    MULADD(at[2], at[32]);    MULADD(at[3], at[31]);    MULADD(at[4], at[30]);    MULADD(at[5], at[29]);    MULADD(at[6], at[28]);    MULADD(at[7], at[27]);    MULADD(at[8], at[26]);    MULADD(at[9], at[25]);    MULADD(at[10], at[24]);    MULADD(at[11], at[23]);    MULADD(at[12], at[22]);    MULADD(at[13], at[21]);    MULADD(at[14], at[20]);
2673    COMBA_STORE(C->dp[14]);
2674    /* 15 */
2675    COMBA_FORWARD;
2676    MULADD(at[0], at[35]);    MULADD(at[1], at[34]);    MULADD(at[2], at[33]);    MULADD(at[3], at[32]);    MULADD(at[4], at[31]);    MULADD(at[5], at[30]);    MULADD(at[6], at[29]);    MULADD(at[7], at[28]);    MULADD(at[8], at[27]);    MULADD(at[9], at[26]);    MULADD(at[10], at[25]);    MULADD(at[11], at[24]);    MULADD(at[12], at[23]);    MULADD(at[13], at[22]);    MULADD(at[14], at[21]);    MULADD(at[15], at[20]);
2677    COMBA_STORE(C->dp[15]);
2678    /* 16 */
2679    COMBA_FORWARD;
2680    MULADD(at[0], at[36]);    MULADD(at[1], at[35]);    MULADD(at[2], at[34]);    MULADD(at[3], at[33]);    MULADD(at[4], at[32]);    MULADD(at[5], at[31]);    MULADD(at[6], at[30]);    MULADD(at[7], at[29]);    MULADD(at[8], at[28]);    MULADD(at[9], at[27]);    MULADD(at[10], at[26]);    MULADD(at[11], at[25]);    MULADD(at[12], at[24]);    MULADD(at[13], at[23]);    MULADD(at[14], at[22]);    MULADD(at[15], at[21]);    MULADD(at[16], at[20]);
2681    COMBA_STORE(C->dp[16]);
2682    /* 17 */
2683    COMBA_FORWARD;
2684    MULADD(at[0], at[37]);    MULADD(at[1], at[36]);    MULADD(at[2], at[35]);    MULADD(at[3], at[34]);    MULADD(at[4], at[33]);    MULADD(at[5], at[32]);    MULADD(at[6], at[31]);    MULADD(at[7], at[30]);    MULADD(at[8], at[29]);    MULADD(at[9], at[28]);    MULADD(at[10], at[27]);    MULADD(at[11], at[26]);    MULADD(at[12], at[25]);    MULADD(at[13], at[24]);    MULADD(at[14], at[23]);    MULADD(at[15], at[22]);    MULADD(at[16], at[21]);    MULADD(at[17], at[20]);
2685    COMBA_STORE(C->dp[17]);
2686    /* 18 */
2687    COMBA_FORWARD;
2688    MULADD(at[0], at[38]);    MULADD(at[1], at[37]);    MULADD(at[2], at[36]);    MULADD(at[3], at[35]);    MULADD(at[4], at[34]);    MULADD(at[5], at[33]);    MULADD(at[6], at[32]);    MULADD(at[7], at[31]);    MULADD(at[8], at[30]);    MULADD(at[9], at[29]);    MULADD(at[10], at[28]);    MULADD(at[11], at[27]);    MULADD(at[12], at[26]);    MULADD(at[13], at[25]);    MULADD(at[14], at[24]);    MULADD(at[15], at[23]);    MULADD(at[16], at[22]);    MULADD(at[17], at[21]);    MULADD(at[18], at[20]);
2689    COMBA_STORE(C->dp[18]);
2690    /* 19 */
2691    COMBA_FORWARD;
2692    MULADD(at[0], at[39]);    MULADD(at[1], at[38]);    MULADD(at[2], at[37]);    MULADD(at[3], at[36]);    MULADD(at[4], at[35]);    MULADD(at[5], at[34]);    MULADD(at[6], at[33]);    MULADD(at[7], at[32]);    MULADD(at[8], at[31]);    MULADD(at[9], at[30]);    MULADD(at[10], at[29]);    MULADD(at[11], at[28]);    MULADD(at[12], at[27]);    MULADD(at[13], at[26]);    MULADD(at[14], at[25]);    MULADD(at[15], at[24]);    MULADD(at[16], at[23]);    MULADD(at[17], at[22]);    MULADD(at[18], at[21]);    MULADD(at[19], at[20]);
2693    COMBA_STORE(C->dp[19]);
2694    /* 20 */
2695    COMBA_FORWARD;
2696    MULADD(at[1], at[39]);    MULADD(at[2], at[38]);    MULADD(at[3], at[37]);    MULADD(at[4], at[36]);    MULADD(at[5], at[35]);    MULADD(at[6], at[34]);    MULADD(at[7], at[33]);    MULADD(at[8], at[32]);    MULADD(at[9], at[31]);    MULADD(at[10], at[30]);    MULADD(at[11], at[29]);    MULADD(at[12], at[28]);    MULADD(at[13], at[27]);    MULADD(at[14], at[26]);    MULADD(at[15], at[25]);    MULADD(at[16], at[24]);    MULADD(at[17], at[23]);    MULADD(at[18], at[22]);    MULADD(at[19], at[21]);
2697    COMBA_STORE(C->dp[20]);
2698    /* 21 */
2699    COMBA_FORWARD;
2700    MULADD(at[2], at[39]);    MULADD(at[3], at[38]);    MULADD(at[4], at[37]);    MULADD(at[5], at[36]);    MULADD(at[6], at[35]);    MULADD(at[7], at[34]);    MULADD(at[8], at[33]);    MULADD(at[9], at[32]);    MULADD(at[10], at[31]);    MULADD(at[11], at[30]);    MULADD(at[12], at[29]);    MULADD(at[13], at[28]);    MULADD(at[14], at[27]);    MULADD(at[15], at[26]);    MULADD(at[16], at[25]);    MULADD(at[17], at[24]);    MULADD(at[18], at[23]);    MULADD(at[19], at[22]);
2701    COMBA_STORE(C->dp[21]);
2702    /* 22 */
2703    COMBA_FORWARD;
2704    MULADD(at[3], at[39]);    MULADD(at[4], at[38]);    MULADD(at[5], at[37]);    MULADD(at[6], at[36]);    MULADD(at[7], at[35]);    MULADD(at[8], at[34]);    MULADD(at[9], at[33]);    MULADD(at[10], at[32]);    MULADD(at[11], at[31]);    MULADD(at[12], at[30]);    MULADD(at[13], at[29]);    MULADD(at[14], at[28]);    MULADD(at[15], at[27]);    MULADD(at[16], at[26]);    MULADD(at[17], at[25]);    MULADD(at[18], at[24]);    MULADD(at[19], at[23]);
2705    COMBA_STORE(C->dp[22]);
2706    /* 23 */
2707    COMBA_FORWARD;
2708    MULADD(at[4], at[39]);    MULADD(at[5], at[38]);    MULADD(at[6], at[37]);    MULADD(at[7], at[36]);    MULADD(at[8], at[35]);    MULADD(at[9], at[34]);    MULADD(at[10], at[33]);    MULADD(at[11], at[32]);    MULADD(at[12], at[31]);    MULADD(at[13], at[30]);    MULADD(at[14], at[29]);    MULADD(at[15], at[28]);    MULADD(at[16], at[27]);    MULADD(at[17], at[26]);    MULADD(at[18], at[25]);    MULADD(at[19], at[24]);
2709    COMBA_STORE(C->dp[23]);
2710    /* 24 */
2711    COMBA_FORWARD;
2712    MULADD(at[5], at[39]);    MULADD(at[6], at[38]);    MULADD(at[7], at[37]);    MULADD(at[8], at[36]);    MULADD(at[9], at[35]);    MULADD(at[10], at[34]);    MULADD(at[11], at[33]);    MULADD(at[12], at[32]);    MULADD(at[13], at[31]);    MULADD(at[14], at[30]);    MULADD(at[15], at[29]);    MULADD(at[16], at[28]);    MULADD(at[17], at[27]);    MULADD(at[18], at[26]);    MULADD(at[19], at[25]);
2713    COMBA_STORE(C->dp[24]);
2714    /* 25 */
2715    COMBA_FORWARD;
2716    MULADD(at[6], at[39]);    MULADD(at[7], at[38]);    MULADD(at[8], at[37]);    MULADD(at[9], at[36]);    MULADD(at[10], at[35]);    MULADD(at[11], at[34]);    MULADD(at[12], at[33]);    MULADD(at[13], at[32]);    MULADD(at[14], at[31]);    MULADD(at[15], at[30]);    MULADD(at[16], at[29]);    MULADD(at[17], at[28]);    MULADD(at[18], at[27]);    MULADD(at[19], at[26]);
2717    COMBA_STORE(C->dp[25]);
2718    /* 26 */
2719    COMBA_FORWARD;
2720    MULADD(at[7], at[39]);    MULADD(at[8], at[38]);    MULADD(at[9], at[37]);    MULADD(at[10], at[36]);    MULADD(at[11], at[35]);    MULADD(at[12], at[34]);    MULADD(at[13], at[33]);    MULADD(at[14], at[32]);    MULADD(at[15], at[31]);    MULADD(at[16], at[30]);    MULADD(at[17], at[29]);    MULADD(at[18], at[28]);    MULADD(at[19], at[27]);
2721    COMBA_STORE(C->dp[26]);
2722    /* 27 */
2723    COMBA_FORWARD;
2724    MULADD(at[8], at[39]);    MULADD(at[9], at[38]);    MULADD(at[10], at[37]);    MULADD(at[11], at[36]);    MULADD(at[12], at[35]);    MULADD(at[13], at[34]);    MULADD(at[14], at[33]);    MULADD(at[15], at[32]);    MULADD(at[16], at[31]);    MULADD(at[17], at[30]);    MULADD(at[18], at[29]);    MULADD(at[19], at[28]);
2725    COMBA_STORE(C->dp[27]);
2726    /* 28 */
2727    COMBA_FORWARD;
2728    MULADD(at[9], at[39]);    MULADD(at[10], at[38]);    MULADD(at[11], at[37]);    MULADD(at[12], at[36]);    MULADD(at[13], at[35]);    MULADD(at[14], at[34]);    MULADD(at[15], at[33]);    MULADD(at[16], at[32]);    MULADD(at[17], at[31]);    MULADD(at[18], at[30]);    MULADD(at[19], at[29]);
2729    COMBA_STORE(C->dp[28]);
2730    /* 29 */
2731    COMBA_FORWARD;
2732    MULADD(at[10], at[39]);    MULADD(at[11], at[38]);    MULADD(at[12], at[37]);    MULADD(at[13], at[36]);    MULADD(at[14], at[35]);    MULADD(at[15], at[34]);    MULADD(at[16], at[33]);    MULADD(at[17], at[32]);    MULADD(at[18], at[31]);    MULADD(at[19], at[30]);
2733    COMBA_STORE(C->dp[29]);
2734    /* 30 */
2735    COMBA_FORWARD;
2736    MULADD(at[11], at[39]);    MULADD(at[12], at[38]);    MULADD(at[13], at[37]);    MULADD(at[14], at[36]);    MULADD(at[15], at[35]);    MULADD(at[16], at[34]);    MULADD(at[17], at[33]);    MULADD(at[18], at[32]);    MULADD(at[19], at[31]);
2737    COMBA_STORE(C->dp[30]);
2738    /* 31 */
2739    COMBA_FORWARD;
2740    MULADD(at[12], at[39]);    MULADD(at[13], at[38]);    MULADD(at[14], at[37]);    MULADD(at[15], at[36]);    MULADD(at[16], at[35]);    MULADD(at[17], at[34]);    MULADD(at[18], at[33]);    MULADD(at[19], at[32]);
2741    COMBA_STORE(C->dp[31]);
2742    /* 32 */
2743    COMBA_FORWARD;
2744    MULADD(at[13], at[39]);    MULADD(at[14], at[38]);    MULADD(at[15], at[37]);    MULADD(at[16], at[36]);    MULADD(at[17], at[35]);    MULADD(at[18], at[34]);    MULADD(at[19], at[33]);
2745    COMBA_STORE(C->dp[32]);
2746    /* 33 */
2747    COMBA_FORWARD;
2748    MULADD(at[14], at[39]);    MULADD(at[15], at[38]);    MULADD(at[16], at[37]);    MULADD(at[17], at[36]);    MULADD(at[18], at[35]);    MULADD(at[19], at[34]);
2749    COMBA_STORE(C->dp[33]);
2750    /* 34 */
2751    COMBA_FORWARD;
2752    MULADD(at[15], at[39]);    MULADD(at[16], at[38]);    MULADD(at[17], at[37]);    MULADD(at[18], at[36]);    MULADD(at[19], at[35]);
2753    COMBA_STORE(C->dp[34]);
2754    /* 35 */
2755    COMBA_FORWARD;
2756    MULADD(at[16], at[39]);    MULADD(at[17], at[38]);    MULADD(at[18], at[37]);    MULADD(at[19], at[36]);
2757    COMBA_STORE(C->dp[35]);
2758    /* 36 */
2759    COMBA_FORWARD;
2760    MULADD(at[17], at[39]);    MULADD(at[18], at[38]);    MULADD(at[19], at[37]);
2761    COMBA_STORE(C->dp[36]);
2762    /* 37 */
2763    COMBA_FORWARD;
2764    MULADD(at[18], at[39]);    MULADD(at[19], at[38]);
2765    COMBA_STORE(C->dp[37]);
2766    /* 38 */
2767    COMBA_FORWARD;
2768    MULADD(at[19], at[39]);
2769    COMBA_STORE(C->dp[38]);
2770    COMBA_STORE2(C->dp[39]);
2771    C->used = 40;
2772    C->sign = A->sign ^ B->sign;
2773    tfm_fp_clamp(C);
2774    COMBA_FINI;
2775 }
2776 #endif
2777
2778 #define TFM_DEFINES
2779
2780 #ifdef TFM_MUL24
2781 void tfm_fp_mul_comba24(tfm_fp_int *A, tfm_fp_int *B, tfm_fp_int *C)
2782 {
2783    tfm_fp_digit c0, c1, c2, at[48];
2784
2785    SILC_LOG_DEBUG(("Start"));
2786    memcpy(at, A->dp, 24 * sizeof(tfm_fp_digit));
2787    memcpy(at+24, B->dp, 24 * sizeof(tfm_fp_digit));
2788    COMBA_START;
2789
2790    COMBA_CLEAR;
2791    /* 0 */
2792    MULADD(at[0], at[24]);
2793    COMBA_STORE(C->dp[0]);
2794    /* 1 */
2795    COMBA_FORWARD;
2796    MULADD(at[0], at[25]);    MULADD(at[1], at[24]);
2797    COMBA_STORE(C->dp[1]);
2798    /* 2 */
2799    COMBA_FORWARD;
2800    MULADD(at[0], at[26]);    MULADD(at[1], at[25]);    MULADD(at[2], at[24]);
2801    COMBA_STORE(C->dp[2]);
2802    /* 3 */
2803    COMBA_FORWARD;
2804    MULADD(at[0], at[27]);    MULADD(at[1], at[26]);    MULADD(at[2], at[25]);    MULADD(at[3], at[24]);
2805    COMBA_STORE(C->dp[3]);
2806    /* 4 */
2807    COMBA_FORWARD;
2808    MULADD(at[0], at[28]);    MULADD(at[1], at[27]);    MULADD(at[2], at[26]);    MULADD(at[3], at[25]);    MULADD(at[4], at[24]);
2809    COMBA_STORE(C->dp[4]);
2810    /* 5 */
2811    COMBA_FORWARD;
2812    MULADD(at[0], at[29]);    MULADD(at[1], at[28]);    MULADD(at[2], at[27]);    MULADD(at[3], at[26]);    MULADD(at[4], at[25]);    MULADD(at[5], at[24]);
2813    COMBA_STORE(C->dp[5]);
2814    /* 6 */
2815    COMBA_FORWARD;
2816    MULADD(at[0], at[30]);    MULADD(at[1], at[29]);    MULADD(at[2], at[28]);    MULADD(at[3], at[27]);    MULADD(at[4], at[26]);    MULADD(at[5], at[25]);    MULADD(at[6], at[24]);
2817    COMBA_STORE(C->dp[6]);
2818    /* 7 */
2819    COMBA_FORWARD;
2820    MULADD(at[0], at[31]);    MULADD(at[1], at[30]);    MULADD(at[2], at[29]);    MULADD(at[3], at[28]);    MULADD(at[4], at[27]);    MULADD(at[5], at[26]);    MULADD(at[6], at[25]);    MULADD(at[7], at[24]);
2821    COMBA_STORE(C->dp[7]);
2822    /* 8 */
2823    COMBA_FORWARD;
2824    MULADD(at[0], at[32]);    MULADD(at[1], at[31]);    MULADD(at[2], at[30]);    MULADD(at[3], at[29]);    MULADD(at[4], at[28]);    MULADD(at[5], at[27]);    MULADD(at[6], at[26]);    MULADD(at[7], at[25]);    MULADD(at[8], at[24]);
2825    COMBA_STORE(C->dp[8]);
2826    /* 9 */
2827    COMBA_FORWARD;
2828    MULADD(at[0], at[33]);    MULADD(at[1], at[32]);    MULADD(at[2], at[31]);    MULADD(at[3], at[30]);    MULADD(at[4], at[29]);    MULADD(at[5], at[28]);    MULADD(at[6], at[27]);    MULADD(at[7], at[26]);    MULADD(at[8], at[25]);    MULADD(at[9], at[24]);
2829    COMBA_STORE(C->dp[9]);
2830    /* 10 */
2831    COMBA_FORWARD;
2832    MULADD(at[0], at[34]);    MULADD(at[1], at[33]);    MULADD(at[2], at[32]);    MULADD(at[3], at[31]);    MULADD(at[4], at[30]);    MULADD(at[5], at[29]);    MULADD(at[6], at[28]);    MULADD(at[7], at[27]);    MULADD(at[8], at[26]);    MULADD(at[9], at[25]);    MULADD(at[10], at[24]);
2833    COMBA_STORE(C->dp[10]);
2834    /* 11 */
2835    COMBA_FORWARD;
2836    MULADD(at[0], at[35]);    MULADD(at[1], at[34]);    MULADD(at[2], at[33]);    MULADD(at[3], at[32]);    MULADD(at[4], at[31]);    MULADD(at[5], at[30]);    MULADD(at[6], at[29]);    MULADD(at[7], at[28]);    MULADD(at[8], at[27]);    MULADD(at[9], at[26]);    MULADD(at[10], at[25]);    MULADD(at[11], at[24]);
2837    COMBA_STORE(C->dp[11]);
2838    /* 12 */
2839    COMBA_FORWARD;
2840    MULADD(at[0], at[36]);    MULADD(at[1], at[35]);    MULADD(at[2], at[34]);    MULADD(at[3], at[33]);    MULADD(at[4], at[32]);    MULADD(at[5], at[31]);    MULADD(at[6], at[30]);    MULADD(at[7], at[29]);    MULADD(at[8], at[28]);    MULADD(at[9], at[27]);    MULADD(at[10], at[26]);    MULADD(at[11], at[25]);    MULADD(at[12], at[24]);
2841    COMBA_STORE(C->dp[12]);
2842    /* 13 */
2843    COMBA_FORWARD;
2844    MULADD(at[0], at[37]);    MULADD(at[1], at[36]);    MULADD(at[2], at[35]);    MULADD(at[3], at[34]);    MULADD(at[4], at[33]);    MULADD(at[5], at[32]);    MULADD(at[6], at[31]);    MULADD(at[7], at[30]);    MULADD(at[8], at[29]);    MULADD(at[9], at[28]);    MULADD(at[10], at[27]);    MULADD(at[11], at[26]);    MULADD(at[12], at[25]);    MULADD(at[13], at[24]);
2845    COMBA_STORE(C->dp[13]);
2846    /* 14 */
2847    COMBA_FORWARD;
2848    MULADD(at[0], at[38]);    MULADD(at[1], at[37]);    MULADD(at[2], at[36]);    MULADD(at[3], at[35]);    MULADD(at[4], at[34]);    MULADD(at[5], at[33]);    MULADD(at[6], at[32]);    MULADD(at[7], at[31]);    MULADD(at[8], at[30]);    MULADD(at[9], at[29]);    MULADD(at[10], at[28]);    MULADD(at[11], at[27]);    MULADD(at[12], at[26]);    MULADD(at[13], at[25]);    MULADD(at[14], at[24]);
2849    COMBA_STORE(C->dp[14]);
2850    /* 15 */
2851    COMBA_FORWARD;
2852    MULADD(at[0], at[39]);    MULADD(at[1], at[38]);    MULADD(at[2], at[37]);    MULADD(at[3], at[36]);    MULADD(at[4], at[35]);    MULADD(at[5], at[34]);    MULADD(at[6], at[33]);    MULADD(at[7], at[32]);    MULADD(at[8], at[31]);    MULADD(at[9], at[30]);    MULADD(at[10], at[29]);    MULADD(at[11], at[28]);    MULADD(at[12], at[27]);    MULADD(at[13], at[26]);    MULADD(at[14], at[25]);    MULADD(at[15], at[24]);
2853    COMBA_STORE(C->dp[15]);
2854    /* 16 */
2855    COMBA_FORWARD;
2856    MULADD(at[0], at[40]);    MULADD(at[1], at[39]);    MULADD(at[2], at[38]);    MULADD(at[3], at[37]);    MULADD(at[4], at[36]);    MULADD(at[5], at[35]);    MULADD(at[6], at[34]);    MULADD(at[7], at[33]);    MULADD(at[8], at[32]);    MULADD(at[9], at[31]);    MULADD(at[10], at[30]);    MULADD(at[11], at[29]);    MULADD(at[12], at[28]);    MULADD(at[13], at[27]);    MULADD(at[14], at[26]);    MULADD(at[15], at[25]);    MULADD(at[16], at[24]);
2857    COMBA_STORE(C->dp[16]);
2858    /* 17 */
2859    COMBA_FORWARD;
2860    MULADD(at[0], at[41]);    MULADD(at[1], at[40]);    MULADD(at[2], at[39]);    MULADD(at[3], at[38]);    MULADD(at[4], at[37]);    MULADD(at[5], at[36]);    MULADD(at[6], at[35]);    MULADD(at[7], at[34]);    MULADD(at[8], at[33]);    MULADD(at[9], at[32]);    MULADD(at[10], at[31]);    MULADD(at[11], at[30]);    MULADD(at[12], at[29]);    MULADD(at[13], at[28]);    MULADD(at[14], at[27]);    MULADD(at[15], at[26]);    MULADD(at[16], at[25]);    MULADD(at[17], at[24]);
2861    COMBA_STORE(C->dp[17]);
2862    /* 18 */
2863    COMBA_FORWARD;
2864    MULADD(at[0], at[42]);    MULADD(at[1], at[41]);    MULADD(at[2], at[40]);    MULADD(at[3], at[39]);    MULADD(at[4], at[38]);    MULADD(at[5], at[37]);    MULADD(at[6], at[36]);    MULADD(at[7], at[35]);    MULADD(at[8], at[34]);    MULADD(at[9], at[33]);    MULADD(at[10], at[32]);    MULADD(at[11], at[31]);    MULADD(at[12], at[30]);    MULADD(at[13], at[29]);    MULADD(at[14], at[28]);    MULADD(at[15], at[27]);    MULADD(at[16], at[26]);    MULADD(at[17], at[25]);    MULADD(at[18], at[24]);
2865    COMBA_STORE(C->dp[18]);
2866    /* 19 */
2867    COMBA_FORWARD;
2868    MULADD(at[0], at[43]);    MULADD(at[1], at[42]);    MULADD(at[2], at[41]);    MULADD(at[3], at[40]);    MULADD(at[4], at[39]);    MULADD(at[5], at[38]);    MULADD(at[6], at[37]);    MULADD(at[7], at[36]);    MULADD(at[8], at[35]);    MULADD(at[9], at[34]);    MULADD(at[10], at[33]);    MULADD(at[11], at[32]);    MULADD(at[12], at[31]);    MULADD(at[13], at[30]);    MULADD(at[14], at[29]);    MULADD(at[15], at[28]);    MULADD(at[16], at[27]);    MULADD(at[17], at[26]);    MULADD(at[18], at[25]);    MULADD(at[19], at[24]);
2869    COMBA_STORE(C->dp[19]);
2870    /* 20 */
2871    COMBA_FORWARD;
2872    MULADD(at[0], at[44]);    MULADD(at[1], at[43]);    MULADD(at[2], at[42]);    MULADD(at[3], at[41]);    MULADD(at[4], at[40]);    MULADD(at[5], at[39]);    MULADD(at[6], at[38]);    MULADD(at[7], at[37]);    MULADD(at[8], at[36]);    MULADD(at[9], at[35]);    MULADD(at[10], at[34]);    MULADD(at[11], at[33]);    MULADD(at[12], at[32]);    MULADD(at[13], at[31]);    MULADD(at[14], at[30]);    MULADD(at[15], at[29]);    MULADD(at[16], at[28]);    MULADD(at[17], at[27]);    MULADD(at[18], at[26]);    MULADD(at[19], at[25]);    MULADD(at[20], at[24]);
2873    COMBA_STORE(C->dp[20]);
2874    /* 21 */
2875    COMBA_FORWARD;
2876    MULADD(at[0], at[45]);    MULADD(at[1], at[44]);    MULADD(at[2], at[43]);    MULADD(at[3], at[42]);    MULADD(at[4], at[41]);    MULADD(at[5], at[40]);    MULADD(at[6], at[39]);    MULADD(at[7], at[38]);    MULADD(at[8], at[37]);    MULADD(at[9], at[36]);    MULADD(at[10], at[35]);    MULADD(at[11], at[34]);    MULADD(at[12], at[33]);    MULADD(at[13], at[32]);    MULADD(at[14], at[31]);    MULADD(at[15], at[30]);    MULADD(at[16], at[29]);    MULADD(at[17], at[28]);    MULADD(at[18], at[27]);    MULADD(at[19], at[26]);    MULADD(at[20], at[25]);    MULADD(at[21], at[24]);
2877    COMBA_STORE(C->dp[21]);
2878    /* 22 */
2879    COMBA_FORWARD;
2880    MULADD(at[0], at[46]);    MULADD(at[1], at[45]);    MULADD(at[2], at[44]);    MULADD(at[3], at[43]);    MULADD(at[4], at[42]);    MULADD(at[5], at[41]);    MULADD(at[6], at[40]);    MULADD(at[7], at[39]);    MULADD(at[8], at[38]);    MULADD(at[9], at[37]);    MULADD(at[10], at[36]);    MULADD(at[11], at[35]);    MULADD(at[12], at[34]);    MULADD(at[13], at[33]);    MULADD(at[14], at[32]);    MULADD(at[15], at[31]);    MULADD(at[16], at[30]);    MULADD(at[17], at[29]);    MULADD(at[18], at[28]);    MULADD(at[19], at[27]);    MULADD(at[20], at[26]);    MULADD(at[21], at[25]);    MULADD(at[22], at[24]);
2881    COMBA_STORE(C->dp[22]);
2882    /* 23 */
2883    COMBA_FORWARD;
2884    MULADD(at[0], at[47]);    MULADD(at[1], at[46]);    MULADD(at[2], at[45]);    MULADD(at[3], at[44]);    MULADD(at[4], at[43]);    MULADD(at[5], at[42]);    MULADD(at[6], at[41]);    MULADD(at[7], at[40]);    MULADD(at[8], at[39]);    MULADD(at[9], at[38]);    MULADD(at[10], at[37]);    MULADD(at[11], at[36]);    MULADD(at[12], at[35]);    MULADD(at[13], at[34]);    MULADD(at[14], at[33]);    MULADD(at[15], at[32]);    MULADD(at[16], at[31]);    MULADD(at[17], at[30]);    MULADD(at[18], at[29]);    MULADD(at[19], at[28]);    MULADD(at[20], at[27]);    MULADD(at[21], at[26]);    MULADD(at[22], at[25]);    MULADD(at[23], at[24]);
2885    COMBA_STORE(C->dp[23]);
2886    /* 24 */
2887    COMBA_FORWARD;
2888    MULADD(at[1], at[47]);    MULADD(at[2], at[46]);    MULADD(at[3], at[45]);    MULADD(at[4], at[44]);    MULADD(at[5], at[43]);    MULADD(at[6], at[42]);    MULADD(at[7], at[41]);    MULADD(at[8], at[40]);    MULADD(at[9], at[39]);    MULADD(at[10], at[38]);    MULADD(at[11], at[37]);    MULADD(at[12], at[36]);    MULADD(at[13], at[35]);    MULADD(at[14], at[34]);    MULADD(at[15], at[33]);    MULADD(at[16], at[32]);    MULADD(at[17], at[31]);    MULADD(at[18], at[30]);    MULADD(at[19], at[29]);    MULADD(at[20], at[28]);    MULADD(at[21], at[27]);    MULADD(at[22], at[26]);    MULADD(at[23], at[25]);
2889    COMBA_STORE(C->dp[24]);
2890    /* 25 */
2891    COMBA_FORWARD;
2892    MULADD(at[2], at[47]);    MULADD(at[3], at[46]);    MULADD(at[4], at[45]);    MULADD(at[5], at[44]);    MULADD(at[6], at[43]);    MULADD(at[7], at[42]);    MULADD(at[8], at[41]);    MULADD(at[9], at[40]);    MULADD(at[10], at[39]);    MULADD(at[11], at[38]);    MULADD(at[12], at[37]);    MULADD(at[13], at[36]);    MULADD(at[14], at[35]);    MULADD(at[15], at[34]);    MULADD(at[16], at[33]);    MULADD(at[17], at[32]);    MULADD(at[18], at[31]);    MULADD(at[19], at[30]);    MULADD(at[20], at[29]);    MULADD(at[21], at[28]);    MULADD(at[22], at[27]);    MULADD(at[23], at[26]);
2893    COMBA_STORE(C->dp[25]);
2894    /* 26 */
2895    COMBA_FORWARD;
2896    MULADD(at[3], at[47]);    MULADD(at[4], at[46]);    MULADD(at[5], at[45]);    MULADD(at[6], at[44]);    MULADD(at[7], at[43]);    MULADD(at[8], at[42]);    MULADD(at[9], at[41]);    MULADD(at[10], at[40]);    MULADD(at[11], at[39]);    MULADD(at[12], at[38]);    MULADD(at[13], at[37]);    MULADD(at[14], at[36]);    MULADD(at[15], at[35]);    MULADD(at[16], at[34]);    MULADD(at[17], at[33]);    MULADD(at[18], at[32]);    MULADD(at[19], at[31]);    MULADD(at[20], at[30]);    MULADD(at[21], at[29]);    MULADD(at[22], at[28]);    MULADD(at[23], at[27]);
2897    COMBA_STORE(C->dp[26]);
2898    /* 27 */
2899    COMBA_FORWARD;
2900    MULADD(at[4], at[47]);    MULADD(at[5], at[46]);    MULADD(at[6], at[45]);    MULADD(at[7], at[44]);    MULADD(at[8], at[43]);    MULADD(at[9], at[42]);    MULADD(at[10], at[41]);    MULADD(at[11], at[40]);    MULADD(at[12], at[39]);    MULADD(at[13], at[38]);    MULADD(at[14], at[37]);    MULADD(at[15], at[36]);    MULADD(at[16], at[35]);    MULADD(at[17], at[34]);    MULADD(at[18], at[33]);    MULADD(at[19], at[32]);    MULADD(at[20], at[31]);    MULADD(at[21], at[30]);    MULADD(at[22], at[29]);    MULADD(at[23], at[28]);
2901    COMBA_STORE(C->dp[27]);
2902    /* 28 */
2903    COMBA_FORWARD;
2904    MULADD(at[5], at[47]);    MULADD(at[6], at[46]);    MULADD(at[7], at[45]);    MULADD(at[8], at[44]);    MULADD(at[9], at[43]);    MULADD(at[10], at[42]);    MULADD(at[11], at[41]);    MULADD(at[12], at[40]);    MULADD(at[13], at[39]);    MULADD(at[14], at[38]);    MULADD(at[15], at[37]);    MULADD(at[16], at[36]);    MULADD(at[17], at[35]);    MULADD(at[18], at[34]);    MULADD(at[19], at[33]);    MULADD(at[20], at[32]);    MULADD(at[21], at[31]);    MULADD(at[22], at[30]);    MULADD(at[23], at[29]);
2905    COMBA_STORE(C->dp[28]);
2906    /* 29 */
2907    COMBA_FORWARD;
2908    MULADD(at[6], at[47]);    MULADD(at[7], at[46]);    MULADD(at[8], at[45]);    MULADD(at[9], at[44]);    MULADD(at[10], at[43]);    MULADD(at[11], at[42]);    MULADD(at[12], at[41]);    MULADD(at[13], at[40]);    MULADD(at[14], at[39]);    MULADD(at[15], at[38]);    MULADD(at[16], at[37]);    MULADD(at[17], at[36]);    MULADD(at[18], at[35]);    MULADD(at[19], at[34]);    MULADD(at[20], at[33]);    MULADD(at[21], at[32]);    MULADD(at[22], at[31]);    MULADD(at[23], at[30]);
2909    COMBA_STORE(C->dp[29]);
2910    /* 30 */
2911    COMBA_FORWARD;
2912    MULADD(at[7], at[47]);    MULADD(at[8], at[46]);    MULADD(at[9], at[45]);    MULADD(at[10], at[44]);    MULADD(at[11], at[43]);    MULADD(at[12], at[42]);    MULADD(at[13], at[41]);    MULADD(at[14], at[40]);    MULADD(at[15], at[39]);    MULADD(at[16], at[38]);    MULADD(at[17], at[37]);    MULADD(at[18], at[36]);    MULADD(at[19], at[35]);    MULADD(at[20], at[34]);    MULADD(at[21], at[33]);    MULADD(at[22], at[32]);    MULADD(at[23], at[31]);
2913    COMBA_STORE(C->dp[30]);
2914    /* 31 */
2915    COMBA_FORWARD;
2916    MULADD(at[8], at[47]);    MULADD(at[9], at[46]);    MULADD(at[10], at[45]);    MULADD(at[11], at[44]);    MULADD(at[12], at[43]);    MULADD(at[13], at[42]);    MULADD(at[14], at[41]);    MULADD(at[15], at[40]);    MULADD(at[16], at[39]);    MULADD(at[17], at[38]);    MULADD(at[18], at[37]);    MULADD(at[19], at[36]);    MULADD(at[20], at[35]);    MULADD(at[21], at[34]);    MULADD(at[22], at[33]);    MULADD(at[23], at[32]);
2917    COMBA_STORE(C->dp[31]);
2918    /* 32 */
2919    COMBA_FORWARD;
2920    MULADD(at[9], at[47]);    MULADD(at[10], at[46]);    MULADD(at[11], at[45]);    MULADD(at[12], at[44]);    MULADD(at[13], at[43]);    MULADD(at[14], at[42]);    MULADD(at[15], at[41]);    MULADD(at[16], at[40]);    MULADD(at[17], at[39]);    MULADD(at[18], at[38]);    MULADD(at[19], at[37]);    MULADD(at[20], at[36]);    MULADD(at[21], at[35]);    MULADD(at[22], at[34]);    MULADD(at[23], at[33]);
2921    COMBA_STORE(C->dp[32]);
2922    /* 33 */
2923    COMBA_FORWARD;
2924    MULADD(at[10], at[47]);    MULADD(at[11], at[46]);    MULADD(at[12], at[45]);    MULADD(at[13], at[44]);    MULADD(at[14], at[43]);    MULADD(at[15], at[42]);    MULADD(at[16], at[41]);    MULADD(at[17], at[40]);    MULADD(at[18], at[39]);    MULADD(at[19], at[38]);    MULADD(at[20], at[37]);    MULADD(at[21], at[36]);    MULADD(at[22], at[35]);    MULADD(at[23], at[34]);
2925    COMBA_STORE(C->dp[33]);
2926    /* 34 */
2927    COMBA_FORWARD;
2928    MULADD(at[11], at[47]);    MULADD(at[12], at[46]);    MULADD(at[13], at[45]);    MULADD(at[14], at[44]);    MULADD(at[15], at[43]);    MULADD(at[16], at[42]);    MULADD(at[17], at[41]);    MULADD(at[18], at[40]);    MULADD(at[19], at[39]);    MULADD(at[20], at[38]);    MULADD(at[21], at[37]);    MULADD(at[22], at[36]);    MULADD(at[23], at[35]);
2929    COMBA_STORE(C->dp[34]);
2930    /* 35 */
2931    COMBA_FORWARD;
2932    MULADD(at[12], at[47]);    MULADD(at[13], at[46]);    MULADD(at[14], at[45]);    MULADD(at[15], at[44]);    MULADD(at[16], at[43]);    MULADD(at[17], at[42]);    MULADD(at[18], at[41]);    MULADD(at[19], at[40]);    MULADD(at[20], at[39]);    MULADD(at[21], at[38]);    MULADD(at[22], at[37]);    MULADD(at[23], at[36]);
2933    COMBA_STORE(C->dp[35]);
2934    /* 36 */
2935    COMBA_FORWARD;
2936    MULADD(at[13], at[47]);    MULADD(at[14], at[46]);    MULADD(at[15], at[45]);    MULADD(at[16], at[44]);    MULADD(at[17], at[43]);    MULADD(at[18], at[42]);    MULADD(at[19], at[41]);    MULADD(at[20], at[40]);    MULADD(at[21], at[39]);    MULADD(at[22], at[38]);    MULADD(at[23], at[37]);
2937    COMBA_STORE(C->dp[36]);
2938    /* 37 */
2939    COMBA_FORWARD;
2940    MULADD(at[14], at[47]);    MULADD(at[15], at[46]);    MULADD(at[16], at[45]);    MULADD(at[17], at[44]);    MULADD(at[18], at[43]);    MULADD(at[19], at[42]);    MULADD(at[20], at[41]);    MULADD(at[21], at[40]);    MULADD(at[22], at[39]);    MULADD(at[23], at[38]);
2941    COMBA_STORE(C->dp[37]);
2942    /* 38 */
2943    COMBA_FORWARD;
2944    MULADD(at[15], at[47]);    MULADD(at[16], at[46]);    MULADD(at[17], at[45]);    MULADD(at[18], at[44]);    MULADD(at[19], at[43]);    MULADD(at[20], at[42]);    MULADD(at[21], at[41]);    MULADD(at[22], at[40]);    MULADD(at[23], at[39]);
2945    COMBA_STORE(C->dp[38]);
2946    /* 39 */
2947    COMBA_FORWARD;
2948    MULADD(at[16], at[47]);    MULADD(at[17], at[46]);    MULADD(at[18], at[45]);    MULADD(at[19], at[44]);    MULADD(at[20], at[43]);    MULADD(at[21], at[42]);    MULADD(at[22], at[41]);    MULADD(at[23], at[40]);
2949    COMBA_STORE(C->dp[39]);
2950    /* 40 */
2951    COMBA_FORWARD;
2952    MULADD(at[17], at[47]);    MULADD(at[18], at[46]);    MULADD(at[19], at[45]);    MULADD(at[20], at[44]);    MULADD(at[21], at[43]);    MULADD(at[22], at[42]);    MULADD(at[23], at[41]);
2953    COMBA_STORE(C->dp[40]);
2954    /* 41 */
2955    COMBA_FORWARD;
2956    MULADD(at[18], at[47]);    MULADD(at[19], at[46]);    MULADD(at[20], at[45]);    MULADD(at[21], at[44]);    MULADD(at[22], at[43]);    MULADD(at[23], at[42]);
2957    COMBA_STORE(C->dp[41]);
2958    /* 42 */
2959    COMBA_FORWARD;
2960    MULADD(at[19], at[47]);    MULADD(at[20], at[46]);    MULADD(at[21], at[45]);    MULADD(at[22], at[44]);    MULADD(at[23], at[43]);
2961    COMBA_STORE(C->dp[42]);
2962    /* 43 */
2963    COMBA_FORWARD;
2964    MULADD(at[20], at[47]);    MULADD(at[21], at[46]);    MULADD(at[22], at[45]);    MULADD(at[23], at[44]);
2965    COMBA_STORE(C->dp[43]);
2966    /* 44 */
2967    COMBA_FORWARD;
2968    MULADD(at[21], at[47]);    MULADD(at[22], at[46]);    MULADD(at[23], at[45]);
2969    COMBA_STORE(C->dp[44]);
2970    /* 45 */
2971    COMBA_FORWARD;
2972    MULADD(at[22], at[47]);    MULADD(at[23], at[46]);
2973    COMBA_STORE(C->dp[45]);
2974    /* 46 */
2975    COMBA_FORWARD;
2976    MULADD(at[23], at[47]);
2977    COMBA_STORE(C->dp[46]);
2978    COMBA_STORE2(C->dp[47]);
2979    C->used = 48;
2980    C->sign = A->sign ^ B->sign;
2981    tfm_fp_clamp(C);
2982    COMBA_FINI;
2983 }
2984 #endif
2985
2986 #define TFM_DEFINES
2987
2988 #ifdef TFM_MUL28
2989 void tfm_fp_mul_comba28(tfm_fp_int *A, tfm_fp_int *B, tfm_fp_int *C)
2990 {
2991    tfm_fp_digit c0, c1, c2, at[56];
2992
2993    SILC_LOG_DEBUG(("Start"));
2994    memcpy(at, A->dp, 28 * sizeof(tfm_fp_digit));
2995    memcpy(at+28, B->dp, 28 * sizeof(tfm_fp_digit));
2996    COMBA_START;
2997
2998    COMBA_CLEAR;
2999    /* 0 */
3000    MULADD(at[0], at[28]);
3001    COMBA_STORE(C->dp[0]);
3002    /* 1 */
3003    COMBA_FORWARD;
3004    MULADD(at[0], at[29]);    MULADD(at[1], at[28]);
3005    COMBA_STORE(C->dp[1]);
3006    /* 2 */
3007    COMBA_FORWARD;
3008    MULADD(at[0], at[30]);    MULADD(at[1], at[29]);    MULADD(at[2], at[28]);
3009    COMBA_STORE(C->dp[2]);
3010    /* 3 */
3011    COMBA_FORWARD;
3012    MULADD(at[0], at[31]);    MULADD(at[1], at[30]);    MULADD(at[2], at[29]);    MULADD(at[3], at[28]);
3013    COMBA_STORE(C->dp[3]);
3014    /* 4 */
3015    COMBA_FORWARD;
3016    MULADD(at[0], at[32]);    MULADD(at[1], at[31]);    MULADD(at[2], at[30]);    MULADD(at[3], at[29]);    MULADD(at[4], at[28]);
3017    COMBA_STORE(C->dp[4]);
3018    /* 5 */
3019    COMBA_FORWARD;
3020    MULADD(at[0], at[33]);    MULADD(at[1], at[32]);    MULADD(at[2], at[31]);    MULADD(at[3], at[30]);    MULADD(at[4], at[29]);    MULADD(at[5], at[28]);
3021    COMBA_STORE(C->dp[5]);
3022    /* 6 */
3023    COMBA_FORWARD;
3024    MULADD(at[0], at[34]);    MULADD(at[1], at[33]);    MULADD(at[2], at[32]);    MULADD(at[3], at[31]);    MULADD(at[4], at[30]);    MULADD(at[5], at[29]);    MULADD(at[6], at[28]);
3025    COMBA_STORE(C->dp[6]);
3026    /* 7 */
3027    COMBA_FORWARD;
3028    MULADD(at[0], at[35]);    MULADD(at[1], at[34]);    MULADD(at[2], at[33]);    MULADD(at[3], at[32]);    MULADD(at[4], at[31]);    MULADD(at[5], at[30]);    MULADD(at[6], at[29]);    MULADD(at[7], at[28]);
3029    COMBA_STORE(C->dp[7]);
3030    /* 8 */
3031    COMBA_FORWARD;
3032    MULADD(at[0], at[36]);    MULADD(at[1], at[35]);    MULADD(at[2], at[34]);    MULADD(at[3], at[33]);    MULADD(at[4], at[32]);    MULADD(at[5], at[31]);    MULADD(at[6], at[30]);    MULADD(at[7], at[29]);    MULADD(at[8], at[28]);
3033    COMBA_STORE(C->dp[8]);
3034    /* 9 */
3035    COMBA_FORWARD;
3036    MULADD(at[0], at[37]);    MULADD(at[1], at[36]);    MULADD(at[2], at[35]);    MULADD(at[3], at[34]);    MULADD(at[4], at[33]);    MULADD(at[5], at[32]);    MULADD(at[6], at[31]);    MULADD(at[7], at[30]);    MULADD(at[8], at[29]);    MULADD(at[9], at[28]);
3037    COMBA_STORE(C->dp[9]);
3038    /* 10 */
3039    COMBA_FORWARD;
3040    MULADD(at[0], at[38]);    MULADD(at[1], at[37]);    MULADD(at[2], at[36]);    MULADD(at[3], at[35]);    MULADD(at[4], at[34]);    MULADD(at[5], at[33]);    MULADD(at[6], at[32]);    MULADD(at[7], at[31]);    MULADD(at[8], at[30]);    MULADD(at[9], at[29]);    MULADD(at[10], at[28]);
3041    COMBA_STORE(C->dp[10]);
3042    /* 11 */
3043    COMBA_FORWARD;
3044    MULADD(at[0], at[39]);    MULADD(at[1], at[38]);    MULADD(at[2], at[37]);    MULADD(at[3], at[36]);    MULADD(at[4], at[35]);    MULADD(at[5], at[34]);    MULADD(at[6], at[33]);    MULADD(at[7], at[32]);    MULADD(at[8], at[31]);    MULADD(at[9], at[30]);    MULADD(at[10], at[29]);    MULADD(at[11], at[28]);
3045    COMBA_STORE(C->dp[11]);
3046    /* 12 */
3047    COMBA_FORWARD;
3048    MULADD(at[0], at[40]);    MULADD(at[1], at[39]);    MULADD(at[2], at[38]);    MULADD(at[3], at[37]);    MULADD(at[4], at[36]);    MULADD(at[5], at[35]);    MULADD(at[6], at[34]);    MULADD(at[7], at[33]);    MULADD(at[8], at[32]);    MULADD(at[9], at[31]);    MULADD(at[10], at[30]);    MULADD(at[11], at[29]);    MULADD(at[12], at[28]);
3049    COMBA_STORE(C->dp[12]);
3050    /* 13 */
3051    COMBA_FORWARD;
3052    MULADD(at[0], at[41]);    MULADD(at[1], at[40]);    MULADD(at[2], at[39]);    MULADD(at[3], at[38]);    MULADD(at[4], at[37]);    MULADD(at[5], at[36]);    MULADD(at[6], at[35]);    MULADD(at[7], at[34]);    MULADD(at[8], at[33]);    MULADD(at[9], at[32]);    MULADD(at[10], at[31]);    MULADD(at[11], at[30]);    MULADD(at[12], at[29]);    MULADD(at[13], at[28]);
3053    COMBA_STORE(C->dp[13]);
3054    /* 14 */
3055    COMBA_FORWARD;
3056    MULADD(at[0], at[42]);    MULADD(at[1], at[41]);    MULADD(at[2], at[40]);    MULADD(at[3], at[39]);    MULADD(at[4], at[38]);    MULADD(at[5], at[37]);    MULADD(at[6], at[36]);    MULADD(at[7], at[35]);    MULADD(at[8], at[34]);    MULADD(at[9], at[33]);    MULADD(at[10], at[32]);    MULADD(at[11], at[31]);    MULADD(at[12], at[30]);    MULADD(at[13], at[29]);    MULADD(at[14], at[28]);
3057    COMBA_STORE(C->dp[14]);
3058    /* 15 */
3059    COMBA_FORWARD;
3060    MULADD(at[0], at[43]);    MULADD(at[1], at[42]);    MULADD(at[2], at[41]);    MULADD(at[3], at[40]);    MULADD(at[4], at[39]);    MULADD(at[5], at[38]);    MULADD(at[6], at[37]);    MULADD(at[7], at[36]);    MULADD(at[8], at[35]);    MULADD(at[9], at[34]);    MULADD(at[10], at[33]);    MULADD(at[11], at[32]);    MULADD(at[12], at[31]);    MULADD(at[13], at[30]);    MULADD(at[14], at[29]);    MULADD(at[15], at[28]);
3061    COMBA_STORE(C->dp[15]);
3062    /* 16 */
3063    COMBA_FORWARD;
3064    MULADD(at[0], at[44]);    MULADD(at[1], at[43]);    MULADD(at[2], at[42]);    MULADD(at[3], at[41]);    MULADD(at[4], at[40]);    MULADD(at[5], at[39]);    MULADD(at[6], at[38]);    MULADD(at[7], at[37]);    MULADD(at[8], at[36]);    MULADD(at[9], at[35]);    MULADD(at[10], at[34]);    MULADD(at[11], at[33]);    MULADD(at[12], at[32]);    MULADD(at[13], at[31]);    MULADD(at[14], at[30]);    MULADD(at[15], at[29]);    MULADD(at[16], at[28]);
3065    COMBA_STORE(C->dp[16]);
3066    /* 17 */
3067    COMBA_FORWARD;
3068    MULADD(at[0], at[45]);    MULADD(at[1], at[44]);    MULADD(at[2], at[43]);    MULADD(at[3], at[42]);    MULADD(at[4], at[41]);    MULADD(at[5], at[40]);    MULADD(at[6], at[39]);    MULADD(at[7], at[38]);    MULADD(at[8], at[37]);    MULADD(at[9], at[36]);    MULADD(at[10], at[35]);    MULADD(at[11], at[34]);    MULADD(at[12], at[33]);    MULADD(at[13], at[32]);    MULADD(at[14], at[31]);    MULADD(at[15], at[30]);    MULADD(at[16], at[29]);    MULADD(at[17], at[28]);
3069    COMBA_STORE(C->dp[17]);
3070    /* 18 */
3071    COMBA_FORWARD;
3072    MULADD(at[0], at[46]);    MULADD(at[1], at[45]);    MULADD(at[2], at[44]);    MULADD(at[3], at[43]);    MULADD(at[4], at[42]);    MULADD(at[5], at[41]);    MULADD(at[6], at[40]);    MULADD(at[7], at[39]);    MULADD(at[8], at[38]);    MULADD(at[9], at[37]);    MULADD(at[10], at[36]);    MULADD(at[11], at[35]);    MULADD(at[12], at[34]);    MULADD(at[13], at[33]);    MULADD(at[14], at[32]);    MULADD(at[15], at[31]);    MULADD(at[16], at[30]);    MULADD(at[17], at[29]);    MULADD(at[18], at[28]);
3073    COMBA_STORE(C->dp[18]);
3074    /* 19 */
3075    COMBA_FORWARD;
3076    MULADD(at[0], at[47]);    MULADD(at[1], at[46]);    MULADD(at[2], at[45]);    MULADD(at[3], at[44]);    MULADD(at[4], at[43]);    MULADD(at[5], at[42]);    MULADD(at[6], at[41]);    MULADD(at[7], at[40]);    MULADD(at[8], at[39]);    MULADD(at[9], at[38]);    MULADD(at[10], at[37]);    MULADD(at[11], at[36]);    MULADD(at[12], at[35]);    MULADD(at[13], at[34]);    MULADD(at[14], at[33]);    MULADD(at[15], at[32]);    MULADD(at[16], at[31]);    MULADD(at[17], at[30]);    MULADD(at[18], at[29]);    MULADD(at[19], at[28]);
3077    COMBA_STORE(C->dp[19]);
3078    /* 20 */
3079    COMBA_FORWARD;
3080    MULADD(at[0], at[48]);    MULADD(at[1], at[47]);    MULADD(at[2], at[46]);    MULADD(at[3], at[45]);    MULADD(at[4], at[44]);    MULADD(at[5], at[43]);    MULADD(at[6], at[42]);    MULADD(at[7], at[41]);    MULADD(at[8], at[40]);    MULADD(at[9], at[39]);    MULADD(at[10], at[38]);    MULADD(at[11], at[37]);    MULADD(at[12], at[36]);    MULADD(at[13], at[35]);    MULADD(at[14], at[34]);    MULADD(at[15], at[33]);    MULADD(at[16], at[32]);    MULADD(at[17], at[31]);    MULADD(at[18], at[30]);    MULADD(at[19], at[29]);    MULADD(at[20], at[28]);
3081    COMBA_STORE(C->dp[20]);
3082    /* 21 */
3083    COMBA_FORWARD;
3084    MULADD(at[0], at[49]);    MULADD(at[1], at[48]);    MULADD(at[2], at[47]);    MULADD(at[3], at[46]);    MULADD(at[4], at[45]);    MULADD(at[5], at[44]);    MULADD(at[6], at[43]);    MULADD(at[7], at[42]);    MULADD(at[8], at[41]);    MULADD(at[9], at[40]);    MULADD(at[10], at[39]);    MULADD(at[11], at[38]);    MULADD(at[12], at[37]);    MULADD(at[13], at[36]);    MULADD(at[14], at[35]);    MULADD(at[15], at[34]);    MULADD(at[16], at[33]);    MULADD(at[17], at[32]);    MULADD(at[18], at[31]);    MULADD(at[19], at[30]);    MULADD(at[20], at[29]);    MULADD(at[21], at[28]);
3085    COMBA_STORE(C->dp[21]);
3086    /* 22 */
3087    COMBA_FORWARD;
3088    MULADD(at[0], at[50]);    MULADD(at[1], at[49]);    MULADD(at[2], at[48]);    MULADD(at[3], at[47]);    MULADD(at[4], at[46]);    MULADD(at[5], at[45]);    MULADD(at[6], at[44]);    MULADD(at[7], at[43]);    MULADD(at[8], at[42]);    MULADD(at[9], at[41]);    MULADD(at[10], at[40]);    MULADD(at[11], at[39]);    MULADD(at[12], at[38]);    MULADD(at[13], at[37]);    MULADD(at[14], at[36]);    MULADD(at[15], at[35]);    MULADD(at[16], at[34]);    MULADD(at[17], at[33]);    MULADD(at[18], at[32]);    MULADD(at[19], at[31]);    MULADD(at[20], at[30]);    MULADD(at[21], at[29]);    MULADD(at[22], at[28]);
3089    COMBA_STORE(C->dp[22]);
3090    /* 23 */
3091    COMBA_FORWARD;
3092    MULADD(at[0], at[51]);    MULADD(at[1], at[50]);    MULADD(at[2], at[49]);    MULADD(at[3], at[48]);    MULADD(at[4], at[47]);    MULADD(at[5], at[46]);    MULADD(at[6], at[45]);    MULADD(at[7], at[44]);    MULADD(at[8], at[43]);    MULADD(at[9], at[42]);    MULADD(at[10], at[41]);    MULADD(at[11], at[40]);    MULADD(at[12], at[39]);    MULADD(at[13], at[38]);    MULADD(at[14], at[37]);    MULADD(at[15], at[36]);    MULADD(at[16], at[35]);    MULADD(at[17], at[34]);    MULADD(at[18], at[33]);    MULADD(at[19], at[32]);    MULADD(at[20], at[31]);    MULADD(at[21], at[30]);    MULADD(at[22], at[29]);    MULADD(at[23], at[28]);
3093    COMBA_STORE(C->dp[23]);
3094    /* 24 */
3095    COMBA_FORWARD;
3096    MULADD(at[0], at[52]);    MULADD(at[1], at[51]);    MULADD(at[2], at[50]);    MULADD(at[3], at[49]);    MULADD(at[4], at[48]);    MULADD(at[5], at[47]);    MULADD(at[6], at[46]);    MULADD(at[7], at[45]);    MULADD(at[8], at[44]);    MULADD(at[9], at[43]);    MULADD(at[10], at[42]);    MULADD(at[11], at[41]);    MULADD(at[12], at[40]);    MULADD(at[13], at[39]);    MULADD(at[14], at[38]);    MULADD(at[15], at[37]);    MULADD(at[16], at[36]);    MULADD(at[17], at[35]);    MULADD(at[18], at[34]);    MULADD(at[19], at[33]);    MULADD(at[20], at[32]);    MULADD(at[21], at[31]);    MULADD(at[22], at[30]);    MULADD(at[23], at[29]);    MULADD(at[24], at[28]);
3097    COMBA_STORE(C->dp[24]);
3098    /* 25 */
3099    COMBA_FORWARD;
3100    MULADD(at[0], at[53]);    MULADD(at[1], at[52]);    MULADD(at[2], at[51]);    MULADD(at[3], at[50]);    MULADD(at[4], at[49]);    MULADD(at[5], at[48]);    MULADD(at[6], at[47]);    MULADD(at[7], at[46]);    MULADD(at[8], at[45]);    MULADD(at[9], at[44]);    MULADD(at[10], at[43]);    MULADD(at[11], at[42]);    MULADD(at[12], at[41]);    MULADD(at[13], at[40]);    MULADD(at[14], at[39]);    MULADD(at[15], at[38]);    MULADD(at[16], at[37]);    MULADD(at[17], at[36]);    MULADD(at[18], at[35]);    MULADD(at[19], at[34]);    MULADD(at[20], at[33]);    MULADD(at[21], at[32]);    MULADD(at[22], at[31]);    MULADD(at[23], at[30]);    MULADD(at[24], at[29]);    MULADD(at[25], at[28]);
3101    COMBA_STORE(C->dp[25]);
3102    /* 26 */
3103    COMBA_FORWARD;
3104    MULADD(at[0], at[54]);    MULADD(at[1], at[53]);    MULADD(at[2], at[52]);    MULADD(at[3], at[51]);    MULADD(at[4], at[50]);    MULADD(at[5], at[49]);    MULADD(at[6], at[48]);    MULADD(at[7], at[47]);    MULADD(at[8], at[46]);    MULADD(at[9], at[45]);    MULADD(at[10], at[44]);    MULADD(at[11], at[43]);    MULADD(at[12], at[42]);    MULADD(at[13], at[41]);    MULADD(at[14], at[40]);    MULADD(at[15], at[39]);    MULADD(at[16], at[38]);    MULADD(at[17], at[37]);    MULADD(at[18], at[36]);    MULADD(at[19], at[35]);    MULADD(at[20], at[34]);    MULADD(at[21], at[33]);    MULADD(at[22], at[32]);    MULADD(at[23], at[31]);    MULADD(at[24], at[30]);    MULADD(at[25], at[29]);    MULADD(at[26], at[28]);
3105    COMBA_STORE(C->dp[26]);
3106    /* 27 */
3107    COMBA_FORWARD;
3108    MULADD(at[0], at[55]);    MULADD(at[1], at[54]);    MULADD(at[2], at[53]);    MULADD(at[3], at[52]);    MULADD(at[4], at[51]);    MULADD(at[5], at[50]);    MULADD(at[6], at[49]);    MULADD(at[7], at[48]);    MULADD(at[8], at[47]);    MULADD(at[9], at[46]);    MULADD(at[10], at[45]);    MULADD(at[11], at[44]);    MULADD(at[12], at[43]);    MULADD(at[13], at[42]);    MULADD(at[14], at[41]);    MULADD(at[15], at[40]);    MULADD(at[16], at[39]);    MULADD(at[17], at[38]);    MULADD(at[18], at[37]);    MULADD(at[19], at[36]);    MULADD(at[20], at[35]);    MULADD(at[21], at[34]);    MULADD(at[22], at[33]);    MULADD(at[23], at[32]);    MULADD(at[24], at[31]);    MULADD(at[25], at[30]);    MULADD(at[26], at[29]);    MULADD(at[27], at[28]);
3109    COMBA_STORE(C->dp[27]);
3110    /* 28 */
3111    COMBA_FORWARD;
3112    MULADD(at[1], at[55]);    MULADD(at[2], at[54]);    MULADD(at[3], at[53]);    MULADD(at[4], at[52]);    MULADD(at[5], at[51]);    MULADD(at[6], at[50]);    MULADD(at[7], at[49]);    MULADD(at[8], at[48]);    MULADD(at[9], at[47]);    MULADD(at[10], at[46]);    MULADD(at[11], at[45]);    MULADD(at[12], at[44]);    MULADD(at[13], at[43]);    MULADD(at[14], at[42]);    MULADD(at[15], at[41]);    MULADD(at[16], at[40]);    MULADD(at[17], at[39]);    MULADD(at[18], at[38]);    MULADD(at[19], at[37]);    MULADD(at[20], at[36]);    MULADD(at[21], at[35]);    MULADD(at[22], at[34]);    MULADD(at[23], at[33]);    MULADD(at[24], at[32]);    MULADD(at[25], at[31]);    MULADD(at[26], at[30]);    MULADD(at[27], at[29]);
3113    COMBA_STORE(C->dp[28]);
3114    /* 29 */
3115    COMBA_FORWARD;
3116    MULADD(at[2], at[55]);    MULADD(at[3], at[54]);    MULADD(at[4], at[53]);    MULADD(at[5], at[52]);    MULADD(at[6], at[51]);    MULADD(at[7], at[50]);    MULADD(at[8], at[49]);    MULADD(at[9], at[48]);    MULADD(at[10], at[47]);    MULADD(at[11], at[46]);    MULADD(at[12], at[45]);    MULADD(at[13], at[44]);    MULADD(at[14], at[43]);    MULADD(at[15], at[42]);    MULADD(at[16], at[41]);    MULADD(at[17], at[40]);    MULADD(at[18], at[39]);    MULADD(at[19], at[38]);    MULADD(at[20], at[37]);    MULADD(at[21], at[36]);    MULADD(at[22], at[35]);    MULADD(at[23], at[34]);    MULADD(at[24], at[33]);    MULADD(at[25], at[32]);    MULADD(at[26], at[31]);    MULADD(at[27], at[30]);
3117    COMBA_STORE(C->dp[29]);
3118    /* 30 */
3119    COMBA_FORWARD;
3120    MULADD(at[3], at[55]);    MULADD(at[4], at[54]);    MULADD(at[5], at[53]);    MULADD(at[6], at[52]);    MULADD(at[7], at[51]);    MULADD(at[8], at[50]);    MULADD(at[9], at[49]);    MULADD(at[10], at[48]);    MULADD(at[11], at[47]);    MULADD(at[12], at[46]);    MULADD(at[13], at[45]);    MULADD(at[14], at[44]);    MULADD(at[15], at[43]);    MULADD(at[16], at[42]);    MULADD(at[17], at[41]);    MULADD(at[18], at[40]);    MULADD(at[19], at[39]);    MULADD(at[20], at[38]);    MULADD(at[21], at[37]);    MULADD(at[22], at[36]);    MULADD(at[23], at[35]);    MULADD(at[24], at[34]);    MULADD(at[25], at[33]);    MULADD(at[26], at[32]);    MULADD(at[27], at[31]);
3121    COMBA_STORE(C->dp[30]);
3122    /* 31 */
3123    COMBA_FORWARD;
3124    MULADD(at[4], at[55]);    MULADD(at[5], at[54]);    MULADD(at[6], at[53]);    MULADD(at[7], at[52]);    MULADD(at[8], at[51]);    MULADD(at[9], at[50]);    MULADD(at[10], at[49]);    MULADD(at[11], at[48]);    MULADD(at[12], at[47]);    MULADD(at[13], at[46]);    MULADD(at[14], at[45]);    MULADD(at[15], at[44]);    MULADD(at[16], at[43]);    MULADD(at[17], at[42]);    MULADD(at[18], at[41]);    MULADD(at[19], at[40]);    MULADD(at[20], at[39]);    MULADD(at[21], at[38]);    MULADD(at[22], at[37]);    MULADD(at[23], at[36]);    MULADD(at[24], at[35]);    MULADD(at[25], at[34]);    MULADD(at[26], at[33]);    MULADD(at[27], at[32]);
3125    COMBA_STORE(C->dp[31]);
3126    /* 32 */
3127    COMBA_FORWARD;
3128    MULADD(at[5], at[55]);    MULADD(at[6], at[54]);    MULADD(at[7], at[53]);    MULADD(at[8], at[52]);    MULADD(at[9], at[51]);    MULADD(at[10], at[50]);    MULADD(at[11], at[49]);    MULADD(at[12], at[48]);    MULADD(at[13], at[47]);    MULADD(at[14], at[46]);    MULADD(at[15], at[45]);    MULADD(at[16], at[44]);    MULADD(at[17], at[43]);    MULADD(at[18], at[42]);    MULADD(at[19], at[41]);    MULADD(at[20], at[40]);    MULADD(at[21], at[39]);    MULADD(at[22], at[38]);    MULADD(at[23], at[37]);    MULADD(at[24], at[36]);    MULADD(at[25], at[35]);    MULADD(at[26], at[34]);    MULADD(at[27], at[33]);
3129    COMBA_STORE(C->dp[32]);
3130    /* 33 */
3131    COMBA_FORWARD;
3132    MULADD(at[6], at[55]);    MULADD(at[7], at[54]);    MULADD(at[8], at[53]);    MULADD(at[9], at[52]);    MULADD(at[10], at[51]);    MULADD(at[11], at[50]);    MULADD(at[12], at[49]);    MULADD(at[13], at[48]);    MULADD(at[14], at[47]);    MULADD(at[15], at[46]);    MULADD(at[16], at[45]);    MULADD(at[17], at[44]);    MULADD(at[18], at[43]);    MULADD(at[19], at[42]);    MULADD(at[20], at[41]);    MULADD(at[21], at[40]);    MULADD(at[22], at[39]);    MULADD(at[23], at[38]);    MULADD(at[24], at[37]);    MULADD(at[25], at[36]);    MULADD(at[26], at[35]);    MULADD(at[27], at[34]);
3133    COMBA_STORE(C->dp[33]);
3134    /* 34 */
3135    COMBA_FORWARD;
3136    MULADD(at[7], at[55]);    MULADD(at[8], at[54]);    MULADD(at[9], at[53]);    MULADD(at[10], at[52]);    MULADD(at[11], at[51]);    MULADD(at[12], at[50]);    MULADD(at[13], at[49]);    MULADD(at[14], at[48]);    MULADD(at[15], at[47]);    MULADD(at[16], at[46]);    MULADD(at[17], at[45]);    MULADD(at[18], at[44]);    MULADD(at[19], at[43]);    MULADD(at[20], at[42]);    MULADD(at[21], at[41]);    MULADD(at[22], at[40]);    MULADD(at[23], at[39]);    MULADD(at[24], at[38]);    MULADD(at[25], at[37]);    MULADD(at[26], at[36]);    MULADD(at[27], at[35]);
3137    COMBA_STORE(C->dp[34]);
3138    /* 35 */
3139    COMBA_FORWARD;
3140    MULADD(at[8], at[55]);    MULADD(at[9], at[54]);    MULADD(at[10], at[53]);    MULADD(at[11], at[52]);    MULADD(at[12], at[51]);    MULADD(at[13], at[50]);    MULADD(at[14], at[49]);    MULADD(at[15], at[48]);    MULADD(at[16], at[47]);    MULADD(at[17], at[46]);    MULADD(at[18], at[45]);    MULADD(at[19], at[44]);    MULADD(at[20], at[43]);    MULADD(at[21], at[42]);    MULADD(at[22], at[41]);    MULADD(at[23], at[40]);    MULADD(at[24], at[39]);    MULADD(at[25], at[38]);    MULADD(at[26], at[37]);    MULADD(at[27], at[36]);
3141    COMBA_STORE(C->dp[35]);
3142    /* 36 */
3143    COMBA_FORWARD;
3144    MULADD(at[9], at[55]);    MULADD(at[10], at[54]);    MULADD(at[11], at[53]);    MULADD(at[12], at[52]);    MULADD(at[13], at[51]);    MULADD(at[14], at[50]);    MULADD(at[15], at[49]);    MULADD(at[16], at[48]);    MULADD(at[17], at[47]);    MULADD(at[18], at[46]);    MULADD(at[19], at[45]);    MULADD(at[20], at[44]);    MULADD(at[21], at[43]);    MULADD(at[22], at[42]);    MULADD(at[23], at[41]);    MULADD(at[24], at[40]);    MULADD(at[25], at[39]);    MULADD(at[26], at[38]);    MULADD(at[27], at[37]);
3145    COMBA_STORE(C->dp[36]);
3146    /* 37 */
3147    COMBA_FORWARD;
3148    MULADD(at[10], at[55]);    MULADD(at[11], at[54]);    MULADD(at[12], at[53]);    MULADD(at[13], at[52]);    MULADD(at[14], at[51]);    MULADD(at[15], at[50]);    MULADD(at[16], at[49]);    MULADD(at[17], at[48]);    MULADD(at[18], at[47]);    MULADD(at[19], at[46]);    MULADD(at[20], at[45]);    MULADD(at[21], at[44]);    MULADD(at[22], at[43]);    MULADD(at[23], at[42]);    MULADD(at[24], at[41]);    MULADD(at[25], at[40]);    MULADD(at[26], at[39]);    MULADD(at[27], at[38]);
3149    COMBA_STORE(C->dp[37]);
3150    /* 38 */
3151    COMBA_FORWARD;
3152    MULADD(at[11], at[55]);    MULADD(at[12], at[54]);    MULADD(at[13], at[53]);    MULADD(at[14], at[52]);    MULADD(at[15], at[51]);    MULADD(at[16], at[50]);    MULADD(at[17], at[49]);    MULADD(at[18], at[48]);    MULADD(at[19], at[47]);    MULADD(at[20], at[46]);    MULADD(at[21], at[45]);    MULADD(at[22], at[44]);    MULADD(at[23], at[43]);    MULADD(at[24], at[42]);    MULADD(at[25], at[41]);    MULADD(at[26], at[40]);    MULADD(at[27], at[39]);
3153    COMBA_STORE(C->dp[38]);
3154    /* 39 */
3155    COMBA_FORWARD;
3156    MULADD(at[12], at[55]);    MULADD(at[13], at[54]);    MULADD(at[14], at[53]);    MULADD(at[15], at[52]);    MULADD(at[16], at[51]);    MULADD(at[17], at[50]);    MULADD(at[18], at[49]);    MULADD(at[19], at[48]);    MULADD(at[20], at[47]);    MULADD(at[21], at[46]);    MULADD(at[22], at[45]);    MULADD(at[23], at[44]);    MULADD(at[24], at[43]);    MULADD(at[25], at[42]);    MULADD(at[26], at[41]);    MULADD(at[27], at[40]);
3157    COMBA_STORE(C->dp[39]);
3158    /* 40 */
3159    COMBA_FORWARD;
3160    MULADD(at[13], at[55]);    MULADD(at[14], at[54]);    MULADD(at[15], at[53]);    MULADD(at[16], at[52]);    MULADD(at[17], at[51]);    MULADD(at[18], at[50]);    MULADD(at[19], at[49]);    MULADD(at[20], at[48]);    MULADD(at[21], at[47]);    MULADD(at[22], at[46]);    MULADD(at[23], at[45]);    MULADD(at[24], at[44]);    MULADD(at[25], at[43]);    MULADD(at[26], at[42]);    MULADD(at[27], at[41]);
3161    COMBA_STORE(C->dp[40]);
3162    /* 41 */
3163    COMBA_FORWARD;
3164    MULADD(at[14], at[55]);    MULADD(at[15], at[54]);    MULADD(at[16], at[53]);    MULADD(at[17], at[52]);    MULADD(at[18], at[51]);    MULADD(at[19], at[50]);    MULADD(at[20], at[49]);    MULADD(at[21], at[48]);    MULADD(at[22], at[47]);    MULADD(at[23], at[46]);    MULADD(at[24], at[45]);    MULADD(at[25], at[44]);    MULADD(at[26], at[43]);    MULADD(at[27], at[42]);
3165    COMBA_STORE(C->dp[41]);
3166    /* 42 */
3167    COMBA_FORWARD;
3168    MULADD(at[15], at[55]);    MULADD(at[16], at[54]);    MULADD(at[17], at[53]);    MULADD(at[18], at[52]);    MULADD(at[19], at[51]);    MULADD(at[20], at[50]);    MULADD(at[21], at[49]);    MULADD(at[22], at[48]);    MULADD(at[23], at[47]);    MULADD(at[24], at[46]);    MULADD(at[25], at[45]);    MULADD(at[26], at[44]);    MULADD(at[27], at[43]);
3169    COMBA_STORE(C->dp[42]);
3170    /* 43 */
3171    COMBA_FORWARD;
3172    MULADD(at[16], at[55]);    MULADD(at[17], at[54]);    MULADD(at[18], at[53]);    MULADD(at[19], at[52]);    MULADD(at[20], at[51]);    MULADD(at[21], at[50]);    MULADD(at[22], at[49]);    MULADD(at[23], at[48]);    MULADD(at[24], at[47]);    MULADD(at[25], at[46]);    MULADD(at[26], at[45]);    MULADD(at[27], at[44]);
3173    COMBA_STORE(C->dp[43]);
3174    /* 44 */
3175    COMBA_FORWARD;
3176    MULADD(at[17], at[55]);    MULADD(at[18], at[54]);    MULADD(at[19], at[53]);    MULADD(at[20], at[52]);    MULADD(at[21], at[51]);    MULADD(at[22], at[50]);    MULADD(at[23], at[49]);    MULADD(at[24], at[48]);    MULADD(at[25], at[47]);    MULADD(at[26], at[46]);    MULADD(at[27], at[45]);
3177    COMBA_STORE(C->dp[44]);
3178    /* 45 */
3179    COMBA_FORWARD;
3180    MULADD(at[18], at[55]);    MULADD(at[19], at[54]);    MULADD(at[20], at[53]);    MULADD(at[21], at[52]);    MULADD(at[22], at[51]);    MULADD(at[23], at[50]);    MULADD(at[24], at[49]);    MULADD(at[25], at[48]);    MULADD(at[26], at[47]);    MULADD(at[27], at[46]);
3181    COMBA_STORE(C->dp[45]);
3182    /* 46 */
3183    COMBA_FORWARD;
3184    MULADD(at[19], at[55]);    MULADD(at[20], at[54]);    MULADD(at[21], at[53]);    MULADD(at[22], at[52]);    MULADD(at[23], at[51]);    MULADD(at[24], at[50]);    MULADD(at[25], at[49]);    MULADD(at[26], at[48]);    MULADD(at[27], at[47]);
3185    COMBA_STORE(C->dp[46]);
3186    /* 47 */
3187    COMBA_FORWARD;
3188    MULADD(at[20], at[55]);    MULADD(at[21], at[54]);    MULADD(at[22], at[53]);    MULADD(at[23], at[52]);    MULADD(at[24], at[51]);    MULADD(at[25], at[50]);    MULADD(at[26], at[49]);    MULADD(at[27], at[48]);
3189    COMBA_STORE(C->dp[47]);
3190    /* 48 */
3191    COMBA_FORWARD;
3192    MULADD(at[21], at[55]);    MULADD(at[22], at[54]);    MULADD(at[23], at[53]);    MULADD(at[24], at[52]);    MULADD(at[25], at[51]);    MULADD(at[26], at[50]);    MULADD(at[27], at[49]);
3193    COMBA_STORE(C->dp[48]);
3194    /* 49 */
3195    COMBA_FORWARD;
3196    MULADD(at[22], at[55]);    MULADD(at[23], at[54]);    MULADD(at[24], at[53]);    MULADD(at[25], at[52]);    MULADD(at[26], at[51]);    MULADD(at[27], at[50]);
3197    COMBA_STORE(C->dp[49]);
3198    /* 50 */
3199    COMBA_FORWARD;
3200    MULADD(at[23], at[55]);    MULADD(at[24], at[54]);    MULADD(at[25], at[53]);    MULADD(at[26], at[52]);    MULADD(at[27], at[51]);
3201    COMBA_STORE(C->dp[50]);
3202    /* 51 */
3203    COMBA_FORWARD;
3204    MULADD(at[24], at[55]);    MULADD(at[25], at[54]);    MULADD(at[26], at[53]);    MULADD(at[27], at[52]);
3205    COMBA_STORE(C->dp[51]);
3206    /* 52 */
3207    COMBA_FORWARD;
3208    MULADD(at[25], at[55]);    MULADD(at[26], at[54]);    MULADD(at[27], at[53]);
3209    COMBA_STORE(C->dp[52]);
3210    /* 53 */
3211    COMBA_FORWARD;
3212    MULADD(at[26], at[55]);    MULADD(at[27], at[54]);
3213    COMBA_STORE(C->dp[53]);
3214    /* 54 */
3215    COMBA_FORWARD;
3216    MULADD(at[27], at[55]);
3217    COMBA_STORE(C->dp[54]);
3218    COMBA_STORE2(C->dp[55]);
3219    C->used = 56;
3220    C->sign = A->sign ^ B->sign;
3221    tfm_fp_clamp(C);
3222    COMBA_FINI;
3223 }
3224 #endif
3225
3226 #define TFM_DEFINES
3227
3228 #ifdef TFM_MUL32
3229 void tfm_fp_mul_comba32(tfm_fp_int *A, tfm_fp_int *B, tfm_fp_int *C)
3230 {
3231    tfm_fp_digit c0, c1, c2, at[64];
3232    int out_size;
3233
3234    SILC_LOG_DEBUG(("Start"));
3235    out_size = A->used + B->used;
3236    memcpy(at, A->dp, 32 * sizeof(tfm_fp_digit));
3237    memcpy(at+32, B->dp, 32 * sizeof(tfm_fp_digit));
3238    COMBA_START;
3239
3240    COMBA_CLEAR;
3241    /* 0 */
3242    MULADD(at[0], at[32]);
3243    COMBA_STORE(C->dp[0]);
3244    /* 1 */
3245    COMBA_FORWARD;
3246    MULADD(at[0], at[33]);    MULADD(at[1], at[32]);
3247    COMBA_STORE(C->dp[1]);
3248    /* 2 */
3249    COMBA_FORWARD;
3250    MULADD(at[0], at[34]);    MULADD(at[1], at[33]);    MULADD(at[2], at[32]);
3251    COMBA_STORE(C->dp[2]);
3252    /* 3 */
3253    COMBA_FORWARD;
3254    MULADD(at[0], at[35]);    MULADD(at[1], at[34]);    MULADD(at[2], at[33]);    MULADD(at[3], at[32]);
3255    COMBA_STORE(C->dp[3]);
3256    /* 4 */
3257    COMBA_FORWARD;
3258    MULADD(at[0], at[36]);    MULADD(at[1], at[35]);    MULADD(at[2], at[34]);    MULADD(at[3], at[33]);    MULADD(at[4], at[32]);
3259    COMBA_STORE(C->dp[4]);
3260    /* 5 */
3261    COMBA_FORWARD;
3262    MULADD(at[0], at[37]);    MULADD(at[1], at[36]);    MULADD(at[2], at[35]);    MULADD(at[3], at[34]);    MULADD(at[4], at[33]);    MULADD(at[5], at[32]);
3263    COMBA_STORE(C->dp[5]);
3264    /* 6 */
3265    COMBA_FORWARD;
3266    MULADD(at[0], at[38]);    MULADD(at[1], at[37]);    MULADD(at[2], at[36]);    MULADD(at[3], at[35]);    MULADD(at[4], at[34]);    MULADD(at[5], at[33]);    MULADD(at[6], at[32]);
3267    COMBA_STORE(C->dp[6]);
3268    /* 7 */
3269    COMBA_FORWARD;
3270    MULADD(at[0], at[39]);    MULADD(at[1], at[38]);    MULADD(at[2], at[37]);    MULADD(at[3], at[36]);    MULADD(at[4], at[35]);    MULADD(at[5], at[34]);    MULADD(at[6], at[33]);    MULADD(at[7], at[32]);
3271    COMBA_STORE(C->dp[7]);
3272    /* 8 */
3273    COMBA_FORWARD;
3274    MULADD(at[0], at[40]);    MULADD(at[1], at[39]);    MULADD(at[2], at[38]);    MULADD(at[3], at[37]);    MULADD(at[4], at[36]);    MULADD(at[5], at[35]);    MULADD(at[6], at[34]);    MULADD(at[7], at[33]);    MULADD(at[8], at[32]);
3275    COMBA_STORE(C->dp[8]);
3276    /* 9 */
3277    COMBA_FORWARD;
3278    MULADD(at[0], at[41]);    MULADD(at[1], at[40]);    MULADD(at[2], at[39]);    MULADD(at[3], at[38]);    MULADD(at[4], at[37]);    MULADD(at[5], at[36]);    MULADD(at[6], at[35]);    MULADD(at[7], at[34]);    MULADD(at[8], at[33]);    MULADD(at[9], at[32]);
3279    COMBA_STORE(C->dp[9]);
3280    /* 10 */
3281    COMBA_FORWARD;
3282    MULADD(at[0], at[42]);    MULADD(at[1], at[41]);    MULADD(at[2], at[40]);    MULADD(at[3], at[39]);    MULADD(at[4], at[38]);    MULADD(at[5], at[37]);    MULADD(at[6], at[36]);    MULADD(at[7], at[35]);    MULADD(at[8], at[34]);    MULADD(at[9], at[33]);    MULADD(at[10], at[32]);
3283    COMBA_STORE(C->dp[10]);
3284    /* 11 */
3285    COMBA_FORWARD;
3286    MULADD(at[0], at[43]);    MULADD(at[1], at[42]);    MULADD(at[2], at[41]);    MULADD(at[3], at[40]);    MULADD(at[4], at[39]);    MULADD(at[5], at[38]);    MULADD(at[6], at[37]);    MULADD(at[7], at[36]);    MULADD(at[8], at[35]);    MULADD(at[9], at[34]);    MULADD(at[10], at[33]);    MULADD(at[11], at[32]);
3287    COMBA_STORE(C->dp[11]);
3288    /* 12 */
3289    COMBA_FORWARD;
3290    MULADD(at[0], at[44]);    MULADD(at[1], at[43]);    MULADD(at[2], at[42]);    MULADD(at[3], at[41]);    MULADD(at[4], at[40]);    MULADD(at[5], at[39]);    MULADD(at[6], at[38]);    MULADD(at[7], at[37]);    MULADD(at[8], at[36]);    MULADD(at[9], at[35]);    MULADD(at[10], at[34]);    MULADD(at[11], at[33]);    MULADD(at[12], at[32]);
3291    COMBA_STORE(C->dp[12]);
3292    /* 13 */
3293    COMBA_FORWARD;
3294    MULADD(at[0], at[45]);    MULADD(at[1], at[44]);    MULADD(at[2], at[43]);    MULADD(at[3], at[42]);    MULADD(at[4], at[41]);    MULADD(at[5], at[40]);    MULADD(at[6], at[39]);    MULADD(at[7], at[38]);    MULADD(at[8], at[37]);    MULADD(at[9], at[36]);    MULADD(at[10], at[35]);    MULADD(at[11], at[34]);    MULADD(at[12], at[33]);    MULADD(at[13], at[32]);
3295    COMBA_STORE(C->dp[13]);
3296    /* 14 */
3297    COMBA_FORWARD;
3298    MULADD(at[0], at[46]);    MULADD(at[1], at[45]);    MULADD(at[2], at[44]);    MULADD(at[3], at[43]);    MULADD(at[4], at[42]);    MULADD(at[5], at[41]);    MULADD(at[6], at[40]);    MULADD(at[7], at[39]);    MULADD(at[8], at[38]);    MULADD(at[9], at[37]);    MULADD(at[10], at[36]);    MULADD(at[11], at[35]);    MULADD(at[12], at[34]);    MULADD(at[13], at[33]);    MULADD(at[14], at[32]);
3299    COMBA_STORE(C->dp[14]);
3300    /* 15 */
3301    COMBA_FORWARD;
3302    MULADD(at[0], at[47]);    MULADD(at[1], at[46]);    MULADD(at[2], at[45]);    MULADD(at[3], at[44]);    MULADD(at[4], at[43]);    MULADD(at[5], at[42]);    MULADD(at[6], at[41]);    MULADD(at[7], at[40]);    MULADD(at[8], at[39]);    MULADD(at[9], at[38]);    MULADD(at[10], at[37]);    MULADD(at[11], at[36]);    MULADD(at[12], at[35]);    MULADD(at[13], at[34]);    MULADD(at[14], at[33]);    MULADD(at[15], at[32]);
3303    COMBA_STORE(C->dp[15]);
3304    /* 16 */
3305    COMBA_FORWARD;
3306    MULADD(at[0], at[48]);    MULADD(at[1], at[47]);    MULADD(at[2], at[46]);    MULADD(at[3], at[45]);    MULADD(at[4], at[44]);    MULADD(at[5], at[43]);    MULADD(at[6], at[42]);    MULADD(at[7], at[41]);    MULADD(at[8], at[40]);    MULADD(at[9], at[39]);    MULADD(at[10], at[38]);    MULADD(at[11], at[37]);    MULADD(at[12], at[36]);    MULADD(at[13], at[35]);    MULADD(at[14], at[34]);    MULADD(at[15], at[33]);    MULADD(at[16], at[32]);
3307    COMBA_STORE(C->dp[16]);
3308    /* 17 */
3309    COMBA_FORWARD;
3310    MULADD(at[0], at[49]);    MULADD(at[1], at[48]);    MULADD(at[2], at[47]);    MULADD(at[3], at[46]);    MULADD(at[4], at[45]);    MULADD(at[5], at[44]);    MULADD(at[6], at[43]);    MULADD(at[7], at[42]);    MULADD(at[8], at[41]);    MULADD(at[9], at[40]);    MULADD(at[10], at[39]);    MULADD(at[11], at[38]);    MULADD(at[12], at[37]);    MULADD(at[13], at[36]);    MULADD(at[14], at[35]);    MULADD(at[15], at[34]);    MULADD(at[16], at[33]);    MULADD(at[17], at[32]);
3311    COMBA_STORE(C->dp[17]);
3312    /* 18 */
3313    COMBA_FORWARD;
3314    MULADD(at[0], at[50]);    MULADD(at[1], at[49]);    MULADD(at[2], at[48]);    MULADD(at[3], at[47]);    MULADD(at[4], at[46]);    MULADD(at[5], at[45]);    MULADD(at[6], at[44]);    MULADD(at[7], at[43]);    MULADD(at[8], at[42]);    MULADD(at[9], at[41]);    MULADD(at[10], at[40]);    MULADD(at[11], at[39]);    MULADD(at[12], at[38]);    MULADD(at[13], at[37]);    MULADD(at[14], at[36]);    MULADD(at[15], at[35]);    MULADD(at[16], at[34]);    MULADD(at[17], at[33]);    MULADD(at[18], at[32]);
3315    COMBA_STORE(C->dp[18]);
3316    /* 19 */
3317    COMBA_FORWARD;
3318    MULADD(at[0], at[51]);    MULADD(at[1], at[50]);    MULADD(at[2], at[49]);    MULADD(at[3], at[48]);    MULADD(at[4], at[47]);    MULADD(at[5], at[46]);    MULADD(at[6], at[45]);    MULADD(at[7], at[44]);    MULADD(at[8], at[43]);    MULADD(at[9], at[42]);    MULADD(at[10], at[41]);    MULADD(at[11], at[40]);    MULADD(at[12], at[39]);    MULADD(at[13], at[38]);    MULADD(at[14], at[37]);    MULADD(at[15], at[36]);    MULADD(at[16], at[35]);    MULADD(at[17], at[34]);    MULADD(at[18], at[33]);    MULADD(at[19], at[32]);
3319    COMBA_STORE(C->dp[19]);
3320    /* 20 */
3321    COMBA_FORWARD;
3322    MULADD(at[0], at[52]);    MULADD(at[1], at[51]);    MULADD(at[2], at[50]);    MULADD(at[3], at[49]);    MULADD(at[4], at[48]);    MULADD(at[5], at[47]);    MULADD(at[6], at[46]);    MULADD(at[7], at[45]);    MULADD(at[8], at[44]);    MULADD(at[9], at[43]);    MULADD(at[10], at[42]);    MULADD(at[11], at[41]);    MULADD(at[12], at[40]);    MULADD(at[13], at[39]);    MULADD(at[14], at[38]);    MULADD(at[15], at[37]);    MULADD(at[16], at[36]);    MULADD(at[17], at[35]);    MULADD(at[18], at[34]);    MULADD(at[19], at[33]);    MULADD(at[20], at[32]);
3323    COMBA_STORE(C->dp[20]);
3324    /* 21 */
3325    COMBA_FORWARD;
3326    MULADD(at[0], at[53]);    MULADD(at[1], at[52]);    MULADD(at[2], at[51]);    MULADD(at[3], at[50]);    MULADD(at[4], at[49]);    MULADD(at[5], at[48]);    MULADD(at[6], at[47]);    MULADD(at[7], at[46]);    MULADD(at[8], at[45]);    MULADD(at[9], at[44]);    MULADD(at[10], at[43]);    MULADD(at[11], at[42]);    MULADD(at[12], at[41]);    MULADD(at[13], at[40]);    MULADD(at[14], at[39]);    MULADD(at[15], at[38]);    MULADD(at[16], at[37]);    MULADD(at[17], at[36]);    MULADD(at[18], at[35]);    MULADD(at[19], at[34]);    MULADD(at[20], at[33]);    MULADD(at[21], at[32]);
3327    COMBA_STORE(C->dp[21]);
3328    /* 22 */
3329    COMBA_FORWARD;
3330    MULADD(at[0], at[54]);    MULADD(at[1], at[53]);    MULADD(at[2], at[52]);    MULADD(at[3], at[51]);    MULADD(at[4], at[50]);    MULADD(at[5], at[49]);    MULADD(at[6], at[48]);    MULADD(at[7], at[47]);    MULADD(at[8], at[46]);    MULADD(at[9], at[45]);    MULADD(at[10], at[44]);    MULADD(at[11], at[43]);    MULADD(at[12], at[42]);    MULADD(at[13], at[41]);    MULADD(at[14], at[40]);    MULADD(at[15], at[39]);    MULADD(at[16], at[38]);    MULADD(at[17], at[37]);    MULADD(at[18], at[36]);    MULADD(at[19], at[35]);    MULADD(at[20], at[34]);    MULADD(at[21], at[33]);    MULADD(at[22], at[32]);
3331    COMBA_STORE(C->dp[22]);
3332    /* 23 */
3333    COMBA_FORWARD;
3334    MULADD(at[0], at[55]);    MULADD(at[1], at[54]);    MULADD(at[2], at[53]);    MULADD(at[3], at[52]);    MULADD(at[4], at[51]);    MULADD(at[5], at[50]);    MULADD(at[6], at[49]);    MULADD(at[7], at[48]);    MULADD(at[8], at[47]);    MULADD(at[9], at[46]);    MULADD(at[10], at[45]);    MULADD(at[11], at[44]);    MULADD(at[12], at[43]);    MULADD(at[13], at[42]);    MULADD(at[14], at[41]);    MULADD(at[15], at[40]);    MULADD(at[16], at[39]);    MULADD(at[17], at[38]);    MULADD(at[18], at[37]);    MULADD(at[19], at[36]);    MULADD(at[20], at[35]);    MULADD(at[21], at[34]);    MULADD(at[22], at[33]);    MULADD(at[23], at[32]);
3335    COMBA_STORE(C->dp[23]);
3336    /* 24 */
3337    COMBA_FORWARD;
3338    MULADD(at[0], at[56]);    MULADD(at[1], at[55]);    MULADD(at[2], at[54]);    MULADD(at[3], at[53]);    MULADD(at[4], at[52]);    MULADD(at[5], at[51]);    MULADD(at[6], at[50]);    MULADD(at[7], at[49]);    MULADD(at[8], at[48]);    MULADD(at[9], at[47]);    MULADD(at[10], at[46]);    MULADD(at[11], at[45]);    MULADD(at[12], at[44]);    MULADD(at[13], at[43]);    MULADD(at[14], at[42]);    MULADD(at[15], at[41]);    MULADD(at[16], at[40]);    MULADD(at[17], at[39]);    MULADD(at[18], at[38]);    MULADD(at[19], at[37]);    MULADD(at[20], at[36]);    MULADD(at[21], at[35]);    MULADD(at[22], at[34]);    MULADD(at[23], at[33]);    MULADD(at[24], at[32]);
3339    COMBA_STORE(C->dp[24]);
3340    /* 25 */
3341    COMBA_FORWARD;
3342    MULADD(at[0], at[57]);    MULADD(at[1], at[56]);    MULADD(at[2], at[55]);    MULADD(at[3], at[54]);    MULADD(at[4], at[53]);    MULADD(at[5], at[52]);    MULADD(at[6], at[51]);    MULADD(at[7], at[50]);    MULADD(at[8], at[49]);    MULADD(at[9], at[48]);    MULADD(at[10], at[47]);    MULADD(at[11], at[46]);    MULADD(at[12], at[45]);    MULADD(at[13], at[44]);    MULADD(at[14], at[43]);    MULADD(at[15], at[42]);    MULADD(at[16], at[41]);    MULADD(at[17], at[40]);    MULADD(at[18], at[39]);    MULADD(at[19], at[38]);    MULADD(at[20], at[37]);    MULADD(at[21], at[36]);    MULADD(at[22], at[35]);    MULADD(at[23], at[34]);    MULADD(at[24], at[33]);    MULADD(at[25], at[32]);
3343    COMBA_STORE(C->dp[25]);
3344    /* 26 */
3345    COMBA_FORWARD;
3346    MULADD(at[0], at[58]);    MULADD(at[1], at[57]);    MULADD(at[2], at[56]);    MULADD(at[3], at[55]);    MULADD(at[4], at[54]);    MULADD(at[5], at[53]);    MULADD(at[6], at[52]);    MULADD(at[7], at[51]);    MULADD(at[8], at[50]);    MULADD(at[9], at[49]);    MULADD(at[10], at[48]);    MULADD(at[11], at[47]);    MULADD(at[12], at[46]);    MULADD(at[13], at[45]);    MULADD(at[14], at[44]);    MULADD(at[15], at[43]);    MULADD(at[16], at[42]);    MULADD(at[17], at[41]);    MULADD(at[18], at[40]);    MULADD(at[19], at[39]);    MULADD(at[20], at[38]);    MULADD(at[21], at[37]);    MULADD(at[22], at[36]);    MULADD(at[23], at[35]);    MULADD(at[24], at[34]);    MULADD(at[25], at[33]);    MULADD(at[26], at[32]);
3347    COMBA_STORE(C->dp[26]);
3348    /* 27 */
3349    COMBA_FORWARD;
3350    MULADD(at[0], at[59]);    MULADD(at[1], at[58]);    MULADD(at[2], at[57]);    MULADD(at[3], at[56]);    MULADD(at[4], at[55]);    MULADD(at[5], at[54]);    MULADD(at[6], at[53]);    MULADD(at[7], at[52]);    MULADD(at[8], at[51]);    MULADD(at[9], at[50]);    MULADD(at[10], at[49]);    MULADD(at[11], at[48]);    MULADD(at[12], at[47]);    MULADD(at[13], at[46]);    MULADD(at[14], at[45]);    MULADD(at[15], at[44]);    MULADD(at[16], at[43]);    MULADD(at[17], at[42]);    MULADD(at[18], at[41]);    MULADD(at[19], at[40]);    MULADD(at[20], at[39]);    MULADD(at[21], at[38]);    MULADD(at[22], at[37]);    MULADD(at[23], at[36]);    MULADD(at[24], at[35]);    MULADD(at[25], at[34]);    MULADD(at[26], at[33]);    MULADD(at[27], at[32]);
3351    COMBA_STORE(C->dp[27]);
3352    /* 28 */
3353    COMBA_FORWARD;
3354    MULADD(at[0], at[60]);    MULADD(at[1], at[59]);    MULADD(at[2], at[58]);    MULADD(at[3], at[57]);    MULADD(at[4], at[56]);    MULADD(at[5], at[55]);    MULADD(at[6], at[54]);    MULADD(at[7], at[53]);    MULADD(at[8], at[52]);    MULADD(at[9], at[51]);    MULADD(at[10], at[50]);    MULADD(at[11], at[49]);    MULADD(at[12], at[48]);    MULADD(at[13], at[47]);    MULADD(at[14], at[46]);    MULADD(at[15], at[45]);    MULADD(at[16], at[44]);    MULADD(at[17], at[43]);    MULADD(at[18], at[42]);    MULADD(at[19], at[41]);    MULADD(at[20], at[40]);    MULADD(at[21], at[39]);    MULADD(at[22], at[38]);    MULADD(at[23], at[37]);    MULADD(at[24], at[36]);    MULADD(at[25], at[35]);    MULADD(at[26], at[34]);    MULADD(at[27], at[33]);    MULADD(at[28], at[32]);
3355    COMBA_STORE(C->dp[28]);
3356    /* 29 */
3357    COMBA_FORWARD;
3358    MULADD(at[0], at[61]);    MULADD(at[1], at[60]);    MULADD(at[2], at[59]);    MULADD(at[3], at[58]);    MULADD(at[4], at[57]);    MULADD(at[5], at[56]);    MULADD(at[6], at[55]);    MULADD(at[7], at[54]);    MULADD(at[8], at[53]);    MULADD(at[9], at[52]);    MULADD(at[10], at[51]);    MULADD(at[11], at[50]);    MULADD(at[12], at[49]);    MULADD(at[13], at[48]);    MULADD(at[14], at[47]);    MULADD(at[15], at[46]);    MULADD(at[16], at[45]);    MULADD(at[17], at[44]);    MULADD(at[18], at[43]);    MULADD(at[19], at[42]);    MULADD(at[20], at[41]);    MULADD(at[21], at[40]);    MULADD(at[22], at[39]);    MULADD(at[23], at[38]);    MULADD(at[24], at[37]);    MULADD(at[25], at[36]);    MULADD(at[26], at[35]);    MULADD(at[27], at[34]);    MULADD(at[28], at[33]);    MULADD(at[29], at[32]);
3359    COMBA_STORE(C->dp[29]);
3360    /* 30 */
3361    COMBA_FORWARD;
3362    MULADD(at[0], at[62]);    MULADD(at[1], at[61]);    MULADD(at[2], at[60]);    MULADD(at[3], at[59]);    MULADD(at[4], at[58]);    MULADD(at[5], at[57]);    MULADD(at[6], at[56]);    MULADD(at[7], at[55]);    MULADD(at[8], at[54]);    MULADD(at[9], at[53]);    MULADD(at[10], at[52]);    MULADD(at[11], at[51]);    MULADD(at[12], at[50]);    MULADD(at[13], at[49]);    MULADD(at[14], at[48]);    MULADD(at[15], at[47]);    MULADD(at[16], at[46]);    MULADD(at[17], at[45]);    MULADD(at[18], at[44]);    MULADD(at[19], at[43]);    MULADD(at[20], at[42]);    MULADD(at[21], at[41]);    MULADD(at[22], at[40]);    MULADD(at[23], at[39]);    MULADD(at[24], at[38]);    MULADD(at[25], at[37]);    MULADD(at[26], at[36]);    MULADD(at[27], at[35]);    MULADD(at[28], at[34]);    MULADD(at[29], at[33]);    MULADD(at[30], at[32]);
3363    COMBA_STORE(C->dp[30]);
3364    /* 31 */
3365    COMBA_FORWARD;
3366    MULADD(at[0], at[63]);    MULADD(at[1], at[62]);    MULADD(at[2], at[61]);    MULADD(at[3], at[60]);    MULADD(at[4], at[59]);    MULADD(at[5], at[58]);    MULADD(at[6], at[57]);    MULADD(at[7], at[56]);    MULADD(at[8], at[55]);    MULADD(at[9], at[54]);    MULADD(at[10], at[53]);    MULADD(at[11], at[52]);    MULADD(at[12], at[51]);    MULADD(at[13], at[50]);    MULADD(at[14], at[49]);    MULADD(at[15], at[48]);    MULADD(at[16], at[47]);    MULADD(at[17], at[46]);    MULADD(at[18], at[45]);    MULADD(at[19], at[44]);    MULADD(at[20], at[43]);    MULADD(at[21], at[42]);    MULADD(at[22], at[41]);    MULADD(at[23], at[40]);    MULADD(at[24], at[39]);    MULADD(at[25], at[38]);    MULADD(at[26], at[37]);    MULADD(at[27], at[36]);    MULADD(at[28], at[35]);    MULADD(at[29], at[34]);    MULADD(at[30], at[33]);    MULADD(at[31], at[32]);
3367    COMBA_STORE(C->dp[31]);
3368    /* 32 */
3369    COMBA_FORWARD;
3370    MULADD(at[1], at[63]);    MULADD(at[2], at[62]);    MULADD(at[3], at[61]);    MULADD(at[4], at[60]);    MULADD(at[5], at[59]);    MULADD(at[6], at[58]);    MULADD(at[7], at[57]);    MULADD(at[8], at[56]);    MULADD(at[9], at[55]);    MULADD(at[10], at[54]);    MULADD(at[11], at[53]);    MULADD(at[12], at[52]);    MULADD(at[13], at[51]);    MULADD(at[14], at[50]);    MULADD(at[15], at[49]);    MULADD(at[16], at[48]);    MULADD(at[17], at[47]);    MULADD(at[18], at[46]);    MULADD(at[19], at[45]);    MULADD(at[20], at[44]);    MULADD(at[21], at[43]);    MULADD(at[22], at[42]);    MULADD(at[23], at[41]);    MULADD(at[24], at[40]);    MULADD(at[25], at[39]);    MULADD(at[26], at[38]);    MULADD(at[27], at[37]);    MULADD(at[28], at[36]);    MULADD(at[29], at[35]);    MULADD(at[30], at[34]);    MULADD(at[31], at[33]);
3371    COMBA_STORE(C->dp[32]);
3372    /* 33 */
3373    COMBA_FORWARD;
3374    MULADD(at[2], at[63]);    MULADD(at[3], at[62]);    MULADD(at[4], at[61]);    MULADD(at[5], at[60]);    MULADD(at[6], at[59]);    MULADD(at[7], at[58]);    MULADD(at[8], at[57]);    MULADD(at[9], at[56]);    MULADD(at[10], at[55]);    MULADD(at[11], at[54]);    MULADD(at[12], at[53]);    MULADD(at[13], at[52]);    MULADD(at[14], at[51]);    MULADD(at[15], at[50]);    MULADD(at[16], at[49]);    MULADD(at[17], at[48]);    MULADD(at[18], at[47]);    MULADD(at[19], at[46]);    MULADD(at[20], at[45]);    MULADD(at[21], at[44]);    MULADD(at[22], at[43]);    MULADD(at[23], at[42]);    MULADD(at[24], at[41]);    MULADD(at[25], at[40]);    MULADD(at[26], at[39]);    MULADD(at[27], at[38]);    MULADD(at[28], at[37]);    MULADD(at[29], at[36]);    MULADD(at[30], at[35]);    MULADD(at[31], at[34]);
3375    COMBA_STORE(C->dp[33]);
3376    /* 34 */
3377    COMBA_FORWARD;
3378    MULADD(at[3], at[63]);    MULADD(at[4], at[62]);    MULADD(at[5], at[61]);    MULADD(at[6], at[60]);    MULADD(at[7], at[59]);    MULADD(at[8], at[58]);    MULADD(at[9], at[57]);    MULADD(at[10], at[56]);    MULADD(at[11], at[55]);    MULADD(at[12], at[54]);    MULADD(at[13], at[53]);    MULADD(at[14], at[52]);    MULADD(at[15], at[51]);    MULADD(at[16], at[50]);    MULADD(at[17], at[49]);    MULADD(at[18], at[48]);    MULADD(at[19], at[47]);    MULADD(at[20], at[46]);    MULADD(at[21], at[45]);    MULADD(at[22], at[44]);    MULADD(at[23], at[43]);    MULADD(at[24], at[42]);    MULADD(at[25], at[41]);    MULADD(at[26], at[40]);    MULADD(at[27], at[39]);    MULADD(at[28], at[38]);    MULADD(at[29], at[37]);    MULADD(at[30], at[36]);    MULADD(at[31], at[35]);
3379    COMBA_STORE(C->dp[34]);
3380    /* 35 */
3381    COMBA_FORWARD;
3382    MULADD(at[4], at[63]);    MULADD(at[5], at[62]);    MULADD(at[6], at[61]);    MULADD(at[7], at[60]);    MULADD(at[8], at[59]);    MULADD(at[9], at[58]);    MULADD(at[10], at[57]);    MULADD(at[11], at[56]);    MULADD(at[12], at[55]);    MULADD(at[13], at[54]);    MULADD(at[14], at[53]);    MULADD(at[15], at[52]);    MULADD(at[16], at[51]);    MULADD(at[17], at[50]);    MULADD(at[18], at[49]);    MULADD(at[19], at[48]);    MULADD(at[20], at[47]);    MULADD(at[21], at[46]);    MULADD(at[22], at[45]);    MULADD(at[23], at[44]);    MULADD(at[24], at[43]);    MULADD(at[25], at[42]);    MULADD(at[26], at[41]);    MULADD(at[27], at[40]);    MULADD(at[28], at[39]);    MULADD(at[29], at[38]);    MULADD(at[30], at[37]);    MULADD(at[31], at[36]);
3383    COMBA_STORE(C->dp[35]);
3384    /* 36 */
3385    COMBA_FORWARD;
3386    MULADD(at[5], at[63]);    MULADD(at[6], at[62]);    MULADD(at[7], at[61]);    MULADD(at[8], at[60]);    MULADD(at[9], at[59]);    MULADD(at[10], at[58]);    MULADD(at[11], at[57]);    MULADD(at[12], at[56]);    MULADD(at[13], at[55]);    MULADD(at[14], at[54]);    MULADD(at[15], at[53]);    MULADD(at[16], at[52]);    MULADD(at[17], at[51]);    MULADD(at[18], at[50]);    MULADD(at[19], at[49]);    MULADD(at[20], at[48]);    MULADD(at[21], at[47]);    MULADD(at[22], at[46]);    MULADD(at[23], at[45]);    MULADD(at[24], at[44]);    MULADD(at[25], at[43]);    MULADD(at[26], at[42]);    MULADD(at[27], at[41]);    MULADD(at[28], at[40]);    MULADD(at[29], at[39]);    MULADD(at[30], at[38]);    MULADD(at[31], at[37]);
3387    COMBA_STORE(C->dp[36]);
3388    /* 37 */
3389    COMBA_FORWARD;
3390    MULADD(at[6], at[63]);    MULADD(at[7], at[62]);    MULADD(at[8], at[61]);    MULADD(at[9], at[60]);    MULADD(at[10], at[59]);    MULADD(at[11], at[58]);    MULADD(at[12], at[57]);    MULADD(at[13], at[56]);    MULADD(at[14], at[55]);    MULADD(at[15], at[54]);    MULADD(at[16], at[53]);    MULADD(at[17], at[52]);    MULADD(at[18], at[51]);    MULADD(at[19], at[50]);    MULADD(at[20], at[49]);    MULADD(at[21], at[48]);    MULADD(at[22], at[47]);    MULADD(at[23], at[46]);    MULADD(at[24], at[45]);    MULADD(at[25], at[44]);    MULADD(at[26], at[43]);    MULADD(at[27], at[42]);    MULADD(at[28], at[41]);    MULADD(at[29], at[40]);    MULADD(at[30], at[39]);    MULADD(at[31], at[38]);
3391    COMBA_STORE(C->dp[37]);
3392    /* 38 */
3393    COMBA_FORWARD;
3394    MULADD(at[7], at[63]);    MULADD(at[8], at[62]);    MULADD(at[9], at[61]);    MULADD(at[10], at[60]);    MULADD(at[11], at[59]);    MULADD(at[12], at[58]);    MULADD(at[13], at[57]);    MULADD(at[14], at[56]);    MULADD(at[15], at[55]);    MULADD(at[16], at[54]);    MULADD(at[17], at[53]);    MULADD(at[18], at[52]);    MULADD(at[19], at[51]);    MULADD(at[20], at[50]);    MULADD(at[21], at[49]);    MULADD(at[22], at[48]);    MULADD(at[23], at[47]);    MULADD(at[24], at[46]);    MULADD(at[25], at[45]);    MULADD(at[26], at[44]);    MULADD(at[27], at[43]);    MULADD(at[28], at[42]);    MULADD(at[29], at[41]);    MULADD(at[30], at[40]);    MULADD(at[31], at[39]);
3395    COMBA_STORE(C->dp[38]);
3396
3397    /* early out at 40 digits, 40*32==1280, or two 640 bit operands */
3398    if (out_size <= 40) { COMBA_STORE2(C->dp[39]); C->used = 40; C->sign = A->sign ^ B->sign; tfm_fp_clamp(C); COMBA_FINI; return; }
3399
3400    /* 39 */
3401    COMBA_FORWARD;
3402    MULADD(at[8], at[63]);    MULADD(at[9], at[62]);    MULADD(at[10], at[61]);    MULADD(at[11], at[60]);    MULADD(at[12], at[59]);    MULADD(at[13], at[58]);    MULADD(at[14], at[57]);    MULADD(at[15], at[56]);    MULADD(at[16], at[55]);    MULADD(at[17], at[54]);    MULADD(at[18], at[53]);    MULADD(at[19], at[52]);    MULADD(at[20], at[51]);    MULADD(at[21], at[50]);    MULADD(at[22], at[49]);    MULADD(at[23], at[48]);    MULADD(at[24], at[47]);    MULADD(at[25], at[46]);    MULADD(at[26], at[45]);    MULADD(at[27], at[44]);    MULADD(at[28], at[43]);    MULADD(at[29], at[42]);    MULADD(at[30], at[41]);    MULADD(at[31], at[40]);
3403    COMBA_STORE(C->dp[39]);
3404    /* 40 */
3405    COMBA_FORWARD;
3406    MULADD(at[9], at[63]);    MULADD(at[10], at[62]);    MULADD(at[11], at[61]);    MULADD(at[12], at[60]);    MULADD(at[13], at[59]);    MULADD(at[14], at[58]);    MULADD(at[15], at[57]);    MULADD(at[16], at[56]);    MULADD(at[17], at[55]);    MULADD(at[18], at[54]);    MULADD(at[19], at[53]);    MULADD(at[20], at[52]);    MULADD(at[21], at[51]);    MULADD(at[22], at[50]);    MULADD(at[23], at[49]);    MULADD(at[24], at[48]);    MULADD(at[25], at[47]);    MULADD(at[26], at[46]);    MULADD(at[27], at[45]);    MULADD(at[28], at[44]);    MULADD(at[29], at[43]);    MULADD(at[30], at[42]);    MULADD(at[31], at[41]);
3407    COMBA_STORE(C->dp[40]);
3408    /* 41 */
3409    COMBA_FORWARD;
3410    MULADD(at[10], at[63]);    MULADD(at[11], at[62]);    MULADD(at[12], at[61]);    MULADD(at[13], at[60]);    MULADD(at[14], at[59]);    MULADD(at[15], at[58]);    MULADD(at[16], at[57]);    MULADD(at[17], at[56]);    MULADD(at[18], at[55]);    MULADD(at[19], at[54]);    MULADD(at[20], at[53]);    MULADD(at[21], at[52]);    MULADD(at[22], at[51]);    MULADD(at[23], at[50]);    MULADD(at[24], at[49]);    MULADD(at[25], at[48]);    MULADD(at[26], at[47]);    MULADD(at[27], at[46]);    MULADD(at[28], at[45]);    MULADD(at[29], at[44]);    MULADD(at[30], at[43]);    MULADD(at[31], at[42]);
3411    COMBA_STORE(C->dp[41]);
3412    /* 42 */
3413    COMBA_FORWARD;
3414    MULADD(at[11], at[63]);    MULADD(at[12], at[62]);    MULADD(at[13], at[61]);    MULADD(at[14], at[60]);    MULADD(at[15], at[59]);    MULADD(at[16], at[58]);    MULADD(at[17], at[57]);    MULADD(at[18], at[56]);    MULADD(at[19], at[55]);    MULADD(at[20], at[54]);    MULADD(at[21], at[53]);    MULADD(at[22], at[52]);    MULADD(at[23], at[51]);    MULADD(at[24], at[50]);    MULADD(at[25], at[49]);    MULADD(at[26], at[48]);    MULADD(at[27], at[47]);    MULADD(at[28], at[46]);    MULADD(at[29], at[45]);    MULADD(at[30], at[44]);    MULADD(at[31], at[43]);
3415    COMBA_STORE(C->dp[42]);
3416    /* 43 */
3417    COMBA_FORWARD;
3418    MULADD(at[12], at[63]);    MULADD(at[13], at[62]);    MULADD(at[14], at[61]);    MULADD(at[15], at[60]);    MULADD(at[16], at[59]);    MULADD(at[17], at[58]);    MULADD(at[18], at[57]);    MULADD(at[19], at[56]);    MULADD(at[20], at[55]);    MULADD(at[21], at[54]);    MULADD(at[22], at[53]);    MULADD(at[23], at[52]);    MULADD(at[24], at[51]);    MULADD(at[25], at[50]);    MULADD(at[26], at[49]);    MULADD(at[27], at[48]);    MULADD(at[28], at[47]);    MULADD(at[29], at[46]);    MULADD(at[30], at[45]);    MULADD(at[31], at[44]);
3419    COMBA_STORE(C->dp[43]);
3420    /* 44 */
3421    COMBA_FORWARD;
3422    MULADD(at[13], at[63]);    MULADD(at[14], at[62]);    MULADD(at[15], at[61]);    MULADD(at[16], at[60]);    MULADD(at[17], at[59]);    MULADD(at[18], at[58]);    MULADD(at[19], at[57]);    MULADD(at[20], at[56]);    MULADD(at[21], at[55]);    MULADD(at[22], at[54]);    MULADD(at[23], at[53]);    MULADD(at[24], at[52]);    MULADD(at[25], at[51]);    MULADD(at[26], at[50]);    MULADD(at[27], at[49]);    MULADD(at[28], at[48]);    MULADD(at[29], at[47]);    MULADD(at[30], at[46]);    MULADD(at[31], at[45]);
3423    COMBA_STORE(C->dp[44]);
3424    /* 45 */
3425    COMBA_FORWARD;
3426    MULADD(at[14], at[63]);    MULADD(at[15], at[62]);    MULADD(at[16], at[61]);    MULADD(at[17], at[60]);    MULADD(at[18], at[59]);    MULADD(at[19], at[58]);    MULADD(at[20], at[57]);    MULADD(at[21], at[56]);    MULADD(at[22], at[55]);    MULADD(at[23], at[54]);    MULADD(at[24], at[53]);    MULADD(at[25], at[52]);    MULADD(at[26], at[51]);    MULADD(at[27], at[50]);    MULADD(at[28], at[49]);    MULADD(at[29], at[48]);    MULADD(at[30], at[47]);    MULADD(at[31], at[46]);
3427    COMBA_STORE(C->dp[45]);
3428    /* 46 */
3429    COMBA_FORWARD;
3430    MULADD(at[15], at[63]);    MULADD(at[16], at[62]);    MULADD(at[17], at[61]);    MULADD(at[18], at[60]);    MULADD(at[19], at[59]);    MULADD(at[20], at[58]);    MULADD(at[21], at[57]);    MULADD(at[22], at[56]);    MULADD(at[23], at[55]);    MULADD(at[24], at[54]);    MULADD(at[25], at[53]);    MULADD(at[26], at[52]);    MULADD(at[27], at[51]);    MULADD(at[28], at[50]);    MULADD(at[29], at[49]);    MULADD(at[30], at[48]);    MULADD(at[31], at[47]);
3431    COMBA_STORE(C->dp[46]);
3432
3433    /* early out at 48 digits, 48*32==1536, or two 768 bit operands */
3434    if (out_size <= 48) { COMBA_STORE2(C->dp[47]); C->used = 48; C->sign = A->sign ^ B->sign; tfm_fp_clamp(C); COMBA_FINI; return; }
3435
3436    /* 47 */
3437    COMBA_FORWARD;
3438    MULADD(at[16], at[63]);    MULADD(at[17], at[62]);    MULADD(at[18], at[61]);    MULADD(at[19], at[60]);    MULADD(at[20], at[59]);    MULADD(at[21], at[58]);    MULADD(at[22], at[57]);    MULADD(at[23], at[56]);    MULADD(at[24], at[55]);    MULADD(at[25], at[54]);    MULADD(at[26], at[53]);    MULADD(at[27], at[52]);    MULADD(at[28], at[51]);    MULADD(at[29], at[50]);    MULADD(at[30], at[49]);    MULADD(at[31], at[48]);
3439    COMBA_STORE(C->dp[47]);
3440    /* 48 */
3441    COMBA_FORWARD;
3442    MULADD(at[17], at[63]);    MULADD(at[18], at[62]);    MULADD(at[19], at[61]);    MULADD(at[20], at[60]);    MULADD(at[21], at[59]);    MULADD(at[22], at[58]);    MULADD(at[23], at[57]);    MULADD(at[24], at[56]);    MULADD(at[25], at[55]);    MULADD(at[26], at[54]);    MULADD(at[27], at[53]);    MULADD(at[28], at[52]);    MULADD(at[29], at[51]);    MULADD(at[30], at[50]);    MULADD(at[31], at[49]);
3443    COMBA_STORE(C->dp[48]);
3444    /* 49 */
3445    COMBA_FORWARD;
3446    MULADD(at[18], at[63]);    MULADD(at[19], at[62]);    MULADD(at[20], at[61]);    MULADD(at[21], at[60]);    MULADD(at[22], at[59]);    MULADD(at[23], at[58]);    MULADD(at[24], at[57]);    MULADD(at[25], at[56]);    MULADD(at[26], at[55]);    MULADD(at[27], at[54]);    MULADD(at[28], at[53]);    MULADD(at[29], at[52]);    MULADD(at[30], at[51]);    MULADD(at[31], at[50]);
3447    COMBA_STORE(C->dp[49]);
3448    /* 50 */
3449    COMBA_FORWARD;
3450    MULADD(at[19], at[63]);    MULADD(at[20], at[62]);    MULADD(at[21], at[61]);    MULADD(at[22], at[60]);    MULADD(at[23], at[59]);    MULADD(at[24], at[58]);    MULADD(at[25], at[57]);    MULADD(at[26], at[56]);    MULADD(at[27], at[55]);    MULADD(at[28], at[54]);    MULADD(at[29], at[53]);    MULADD(at[30], at[52]);    MULADD(at[31], at[51]);
3451    COMBA_STORE(C->dp[50]);
3452    /* 51 */
3453    COMBA_FORWARD;
3454    MULADD(at[20], at[63]);    MULADD(at[21], at[62]);    MULADD(at[22], at[61]);    MULADD(at[23], at[60]);    MULADD(at[24], at[59]);    MULADD(at[25], at[58]);    MULADD(at[26], at[57]);    MULADD(at[27], at[56]);    MULADD(at[28], at[55]);    MULADD(at[29], at[54]);    MULADD(at[30], at[53]);    MULADD(at[31], at[52]);
3455    COMBA_STORE(C->dp[51]);
3456    /* 52 */
3457    COMBA_FORWARD;
3458    MULADD(at[21], at[63]);    MULADD(at[22], at[62]);    MULADD(at[23], at[61]);    MULADD(at[24], at[60]);    MULADD(at[25], at[59]);    MULADD(at[26], at[58]);    MULADD(at[27], at[57]);    MULADD(at[28], at[56]);    MULADD(at[29], at[55]);    MULADD(at[30], at[54]);    MULADD(at[31], at[53]);
3459    COMBA_STORE(C->dp[52]);
3460    /* 53 */
3461    COMBA_FORWARD;
3462    MULADD(at[22], at[63]);    MULADD(at[23], at[62]);    MULADD(at[24], at[61]);    MULADD(at[25], at[60]);    MULADD(at[26], at[59]);    MULADD(at[27], at[58]);    MULADD(at[28], at[57]);    MULADD(at[29], at[56]);    MULADD(at[30], at[55]);    MULADD(at[31], at[54]);
3463    COMBA_STORE(C->dp[53]);
3464    /* 54 */
3465    COMBA_FORWARD;
3466    MULADD(at[23], at[63]);    MULADD(at[24], at[62]);    MULADD(at[25], at[61]);    MULADD(at[26], at[60]);    MULADD(at[27], at[59]);    MULADD(at[28], at[58]);    MULADD(at[29], at[57]);    MULADD(at[30], at[56]);    MULADD(at[31], at[55]);
3467    COMBA_STORE(C->dp[54]);
3468
3469    /* early out at 56 digits, 56*32==1792, or two 896 bit operands */
3470    if (out_size <= 56) { COMBA_STORE2(C->dp[55]); C->used = 56; C->sign = A->sign ^ B->sign; tfm_fp_clamp(C); COMBA_FINI; return; }
3471
3472    /* 55 */
3473    COMBA_FORWARD;
3474    MULADD(at[24], at[63]);    MULADD(at[25], at[62]);    MULADD(at[26], at[61]);    MULADD(at[27], at[60]);    MULADD(at[28], at[59]);    MULADD(at[29], at[58]);    MULADD(at[30], at[57]);    MULADD(at[31], at[56]);
3475    COMBA_STORE(C->dp[55]);
3476    /* 56 */
3477    COMBA_FORWARD;
3478    MULADD(at[25], at[63]);    MULADD(at[26], at[62]);    MULADD(at[27], at[61]);    MULADD(at[28], at[60]);    MULADD(at[29], at[59]);    MULADD(at[30], at[58]);    MULADD(at[31], at[57]);
3479    COMBA_STORE(C->dp[56]);
3480    /* 57 */
3481    COMBA_FORWARD;
3482    MULADD(at[26], at[63]);    MULADD(at[27], at[62]);    MULADD(at[28], at[61]);    MULADD(at[29], at[60]);    MULADD(at[30], at[59]);    MULADD(at[31], at[58]);
3483    COMBA_STORE(C->dp[57]);
3484    /* 58 */
3485    COMBA_FORWARD;
3486    MULADD(at[27], at[63]);    MULADD(at[28], at[62]);    MULADD(at[29], at[61]);    MULADD(at[30], at[60]);    MULADD(at[31], at[59]);
3487    COMBA_STORE(C->dp[58]);
3488    /* 59 */
3489    COMBA_FORWARD;
3490    MULADD(at[28], at[63]);    MULADD(at[29], at[62]);    MULADD(at[30], at[61]);    MULADD(at[31], at[60]);
3491    COMBA_STORE(C->dp[59]);
3492    /* 60 */
3493    COMBA_FORWARD;
3494    MULADD(at[29], at[63]);    MULADD(at[30], at[62]);    MULADD(at[31], at[61]);
3495    COMBA_STORE(C->dp[60]);
3496    /* 61 */
3497    COMBA_FORWARD;
3498    MULADD(at[30], at[63]);    MULADD(at[31], at[62]);
3499    COMBA_STORE(C->dp[61]);
3500    /* 62 */
3501    COMBA_FORWARD;
3502    MULADD(at[31], at[63]);
3503    COMBA_STORE(C->dp[62]);
3504    COMBA_STORE2(C->dp[63]);
3505    C->used = 64;
3506    C->sign = A->sign ^ B->sign;
3507    tfm_fp_clamp(C);
3508    COMBA_FINI;
3509 }
3510 #endif
3511
3512 #define TFM_DEFINES
3513
3514 #ifdef TFM_MUL48
3515 void tfm_fp_mul_comba48(tfm_fp_int *A, tfm_fp_int *B, tfm_fp_int *C)
3516 {
3517    tfm_fp_digit c0, c1, c2, at[96];
3518
3519    SILC_LOG_DEBUG(("Start"));
3520    memcpy(at, A->dp, 48 * sizeof(tfm_fp_digit));
3521    memcpy(at+48, B->dp, 48 * sizeof(tfm_fp_digit));
3522    COMBA_START;
3523
3524    COMBA_CLEAR;
3525    /* 0 */
3526    MULADD(at[0], at[48]);
3527    COMBA_STORE(C->dp[0]);
3528    /* 1 */
3529    COMBA_FORWARD;
3530    MULADD(at[0], at[49]);    MULADD(at[1], at[48]);
3531    COMBA_STORE(C->dp[1]);
3532    /* 2 */
3533    COMBA_FORWARD;
3534    MULADD(at[0], at[50]);    MULADD(at[1], at[49]);    MULADD(at[2], at[48]);
3535    COMBA_STORE(C->dp[2]);
3536    /* 3 */
3537    COMBA_FORWARD;
3538    MULADD(at[0], at[51]);    MULADD(at[1], at[50]);    MULADD(at[2], at[49]);    MULADD(at[3], at[48]);
3539    COMBA_STORE(C->dp[3]);
3540    /* 4 */
3541    COMBA_FORWARD;
3542    MULADD(at[0], at[52]);    MULADD(at[1], at[51]);    MULADD(at[2], at[50]);    MULADD(at[3], at[49]);    MULADD(at[4], at[48]);
3543    COMBA_STORE(C->dp[4]);
3544    /* 5 */
3545    COMBA_FORWARD;
3546    MULADD(at[0], at[53]);    MULADD(at[1], at[52]);    MULADD(at[2], at[51]);    MULADD(at[3], at[50]);    MULADD(at[4], at[49]);    MULADD(at[5], at[48]);
3547    COMBA_STORE(C->dp[5]);
3548    /* 6 */
3549    COMBA_FORWARD;
3550    MULADD(at[0], at[54]);    MULADD(at[1], at[53]);    MULADD(at[2], at[52]);    MULADD(at[3], at[51]);    MULADD(at[4], at[50]);    MULADD(at[5], at[49]);    MULADD(at[6], at[48]);
3551    COMBA_STORE(C->dp[6]);
3552    /* 7 */
3553    COMBA_FORWARD;
3554    MULADD(at[0], at[55]);    MULADD(at[1], at[54]);    MULADD(at[2], at[53]);    MULADD(at[3], at[52]);    MULADD(at[4], at[51]);    MULADD(at[5], at[50]);    MULADD(at[6], at[49]);    MULADD(at[7], at[48]);
3555    COMBA_STORE(C->dp[7]);
3556    /* 8 */
3557    COMBA_FORWARD;
3558    MULADD(at[0], at[56]);    MULADD(at[1], at[55]);    MULADD(at[2], at[54]);    MULADD(at[3], at[53]);    MULADD(at[4], at[52]);    MULADD(at[5], at[51]);    MULADD(at[6], at[50]);    MULADD(at[7], at[49]);    MULADD(at[8], at[48]);
3559    COMBA_STORE(C->dp[8]);
3560    /* 9 */
3561    COMBA_FORWARD;
3562    MULADD(at[0], at[57]);    MULADD(at[1], at[56]);    MULADD(at[2], at[55]);    MULADD(at[3], at[54]);    MULADD(at[4], at[53]);    MULADD(at[5], at[52]);    MULADD(at[6], at[51]);    MULADD(at[7], at[50]);    MULADD(at[8], at[49]);    MULADD(at[9], at[48]);
3563    COMBA_STORE(C->dp[9]);
3564    /* 10 */
3565    COMBA_FORWARD;
3566    MULADD(at[0], at[58]);    MULADD(at[1], at[57]);    MULADD(at[2], at[56]);    MULADD(at[3], at[55]);    MULADD(at[4], at[54]);    MULADD(at[5], at[53]);    MULADD(at[6], at[52]);    MULADD(at[7], at[51]);    MULADD(at[8], at[50]);    MULADD(at[9], at[49]);    MULADD(at[10], at[48]);
3567    COMBA_STORE(C->dp[10]);
3568    /* 11 */
3569    COMBA_FORWARD;
3570    MULADD(at[0], at[59]);    MULADD(at[1], at[58]);    MULADD(at[2], at[57]);    MULADD(at[3], at[56]);    MULADD(at[4], at[55]);    MULADD(at[5], at[54]);    MULADD(at[6], at[53]);    MULADD(at[7], at[52]);    MULADD(at[8], at[51]);    MULADD(at[9], at[50]);    MULADD(at[10], at[49]);    MULADD(at[11], at[48]);
3571    COMBA_STORE(C->dp[11]);
3572    /* 12 */
3573    COMBA_FORWARD;
3574    MULADD(at[0], at[60]);    MULADD(at[1], at[59]);    MULADD(at[2], at[58]);    MULADD(at[3], at[57]);    MULADD(at[4], at[56]);    MULADD(at[5], at[55]);    MULADD(at[6], at[54]);    MULADD(at[7], at[53]);    MULADD(at[8], at[52]);    MULADD(at[9], at[51]);    MULADD(at[10], at[50]);    MULADD(at[11], at[49]);    MULADD(at[12], at[48]);
3575    COMBA_STORE(C->dp[12]);
3576    /* 13 */
3577    COMBA_FORWARD;
3578    MULADD(at[0], at[61]);    MULADD(at[1], at[60]);    MULADD(at[2], at[59]);    MULADD(at[3], at[58]);    MULADD(at[4], at[57]);    MULADD(at[5], at[56]);    MULADD(at[6], at[55]);    MULADD(at[7], at[54]);    MULADD(at[8], at[53]);    MULADD(at[9], at[52]);    MULADD(at[10], at[51]);    MULADD(at[11], at[50]);    MULADD(at[12], at[49]);    MULADD(at[13], at[48]);
3579    COMBA_STORE(C->dp[13]);
3580    /* 14 */
3581    COMBA_FORWARD;
3582    MULADD(at[0], at[62]);    MULADD(at[1], at[61]);    MULADD(at[2], at[60]);    MULADD(at[3], at[59]);    MULADD(at[4], at[58]);    MULADD(at[5], at[57]);    MULADD(at[6], at[56]);    MULADD(at[7], at[55]);    MULADD(at[8], at[54]);    MULADD(at[9], at[53]);    MULADD(at[10], at[52]);    MULADD(at[11], at[51]);    MULADD(at[12], at[50]);    MULADD(at[13], at[49]);    MULADD(at[14], at[48]);
3583    COMBA_STORE(C->dp[14]);
3584    /* 15 */
3585    COMBA_FORWARD;
3586    MULADD(at[0], at[63]);    MULADD(at[1], at[62]);    MULADD(at[2], at[61]);    MULADD(at[3], at[60]);    MULADD(at[4], at[59]);    MULADD(at[5], at[58]);    MULADD(at[6], at[57]);    MULADD(at[7], at[56]);    MULADD(at[8], at[55]);    MULADD(at[9], at[54]);    MULADD(at[10], at[53]);    MULADD(at[11], at[52]);    MULADD(at[12], at[51]);    MULADD(at[13], at[50]);    MULADD(at[14], at[49]);    MULADD(at[15], at[48]);
3587    COMBA_STORE(C->dp[15]);
3588    /* 16 */
3589    COMBA_FORWARD;
3590    MULADD(at[0], at[64]);    MULADD(at[1], at[63]);    MULADD(at[2], at[62]);    MULADD(at[3], at[61]);    MULADD(at[4], at[60]);    MULADD(at[5], at[59]);    MULADD(at[6], at[58]);    MULADD(at[7], at[57]);    MULADD(at[8], at[56]);    MULADD(at[9], at[55]);    MULADD(at[10], at[54]);    MULADD(at[11], at[53]);    MULADD(at[12], at[52]);    MULADD(at[13], at[51]);    MULADD(at[14], at[50]);    MULADD(at[15], at[49]);    MULADD(at[16], at[48]);
3591    COMBA_STORE(C->dp[16]);
3592    /* 17 */
3593    COMBA_FORWARD;
3594    MULADD(at[0], at[65]);    MULADD(at[1], at[64]);    MULADD(at[2], at[63]);    MULADD(at[3], at[62]);    MULADD(at[4], at[61]);    MULADD(at[5], at[60]);    MULADD(at[6], at[59]);    MULADD(at[7], at[58]);    MULADD(at[8], at[57]);    MULADD(at[9], at[56]);    MULADD(at[10], at[55]);    MULADD(at[11], at[54]);    MULADD(at[12], at[53]);    MULADD(at[13], at[52]);    MULADD(at[14], at[51]);    MULADD(at[15], at[50]);    MULADD(at[16], at[49]);    MULADD(at[17], at[48]);
3595    COMBA_STORE(C->dp[17]);
3596    /* 18 */
3597    COMBA_FORWARD;
3598    MULADD(at[0], at[66]);    MULADD(at[1], at[65]);    MULADD(at[2], at[64]);    MULADD(at[3], at[63]);    MULADD(at[4], at[62]);    MULADD(at[5], at[61]);    MULADD(at[6], at[60]);    MULADD(at[7], at[59]);    MULADD(at[8], at[58]);    MULADD(at[9], at[57]);    MULADD(at[10], at[56]);    MULADD(at[11], at[55]);    MULADD(at[12], at[54]);    MULADD(at[13], at[53]);    MULADD(at[14], at[52]);    MULADD(at[15], at[51]);    MULADD(at[16], at[50]);    MULADD(at[17], at[49]);    MULADD(at[18], at[48]);
3599    COMBA_STORE(C->dp[18]);
3600    /* 19 */
3601    COMBA_FORWARD;
3602    MULADD(at[0], at[67]);    MULADD(at[1], at[66]);    MULADD(at[2], at[65]);    MULADD(at[3], at[64]);    MULADD(at[4], at[63]);    MULADD(at[5], at[62]);    MULADD(at[6], at[61]);    MULADD(at[7], at[60]);    MULADD(at[8], at[59]);    MULADD(at[9], at[58]);    MULADD(at[10], at[57]);    MULADD(at[11], at[56]);    MULADD(at[12], at[55]);    MULADD(at[13], at[54]);    MULADD(at[14], at[53]);    MULADD(at[15], at[52]);    MULADD(at[16], at[51]);    MULADD(at[17], at[50]);    MULADD(at[18], at[49]);    MULADD(at[19], at[48]);
3603    COMBA_STORE(C->dp[19]);
3604    /* 20 */
3605    COMBA_FORWARD;
3606    MULADD(at[0], at[68]);    MULADD(at[1], at[67]);    MULADD(at[2], at[66]);    MULADD(at[3], at[65]);    MULADD(at[4], at[64]);    MULADD(at[5], at[63]);    MULADD(at[6], at[62]);    MULADD(at[7], at[61]);    MULADD(at[8], at[60]);    MULADD(at[9], at[59]);    MULADD(at[10], at[58]);    MULADD(at[11], at[57]);    MULADD(at[12], at[56]);    MULADD(at[13], at[55]);    MULADD(at[14], at[54]);    MULADD(at[15], at[53]);    MULADD(at[16], at[52]);    MULADD(at[17], at[51]);    MULADD(at[18], at[50]);    MULADD(at[19], at[49]);    MULADD(at[20], at[48]);
3607    COMBA_STORE(C->dp[20]);
3608    /* 21 */
3609    COMBA_FORWARD;
3610    MULADD(at[0], at[69]);    MULADD(at[1], at[68]);    MULADD(at[2], at[67]);    MULADD(at[3], at[66]);    MULADD(at[4], at[65]);    MULADD(at[5], at[64]);    MULADD(at[6], at[63]);    MULADD(at[7], at[62]);    MULADD(at[8], at[61]);    MULADD(at[9], at[60]);    MULADD(at[10], at[59]);    MULADD(at[11], at[58]);    MULADD(at[12], at[57]);    MULADD(at[13], at[56]);    MULADD(at[14], at[55]);    MULADD(at[15], at[54]);    MULADD(at[16], at[53]);    MULADD(at[17], at[52]);    MULADD(at[18], at[51]);    MULADD(at[19], at[50]);    MULADD(at[20], at[49]);    MULADD(at[21], at[48]);
3611    COMBA_STORE(C->dp[21]);
3612    /* 22 */
3613    COMBA_FORWARD;
3614    MULADD(at[0], at[70]);    MULADD(at[1], at[69]);    MULADD(at[2], at[68]);    MULADD(at[3], at[67]);    MULADD(at[4], at[66]);    MULADD(at[5], at[65]);    MULADD(at[6], at[64]);    MULADD(at[7], at[63]);    MULADD(at[8], at[62]);    MULADD(at[9], at[61]);    MULADD(at[10], at[60]);    MULADD(at[11], at[59]);    MULADD(at[12], at[58]);    MULADD(at[13], at[57]);    MULADD(at[14], at[56]);    MULADD(at[15], at[55]);    MULADD(at[16], at[54]);    MULADD(at[17], at[53]);    MULADD(at[18], at[52]);    MULADD(at[19], at[51]);    MULADD(at[20], at[50]);    MULADD(at[21], at[49]);    MULADD(at[22], at[48]);
3615    COMBA_STORE(C->dp[22]);
3616    /* 23 */
3617    COMBA_FORWARD;
3618    MULADD(at[0], at[71]);    MULADD(at[1], at[70]);    MULADD(at[2], at[69]);    MULADD(at[3], at[68]);    MULADD(at[4], at[67]);    MULADD(at[5], at[66]);    MULADD(at[6], at[65]);    MULADD(at[7], at[64]);    MULADD(at[8], at[63]);    MULADD(at[9], at[62]);    MULADD(at[10], at[61]);    MULADD(at[11], at[60]);    MULADD(at[12], at[59]);    MULADD(at[13], at[58]);    MULADD(at[14], at[57]);    MULADD(at[15], at[56]);    MULADD(at[16], at[55]);    MULADD(at[17], at[54]);    MULADD(at[18], at[53]);    MULADD(at[19], at[52]);    MULADD(at[20], at[51]);    MULADD(at[21], at[50]);    MULADD(at[22], at[49]);    MULADD(at[23], at[48]);
3619    COMBA_STORE(C->dp[23]);
3620    /* 24 */
3621    COMBA_FORWARD;
3622    MULADD(at[0], at[72]);    MULADD(at[1], at[71]);    MULADD(at[2], at[70]);    MULADD(at[3], at[69]);    MULADD(at[4], at[68]);    MULADD(at[5], at[67]);    MULADD(at[6], at[66]);    MULADD(at[7], at[65]);    MULADD(at[8], at[64]);    MULADD(at[9], at[63]);    MULADD(at[10], at[62]);    MULADD(at[11], at[61]);    MULADD(at[12], at[60]);    MULADD(at[13], at[59]);    MULADD(at[14], at[58]);    MULADD(at[15], at[57]);    MULADD(at[16], at[56]);    MULADD(at[17], at[55]);    MULADD(at[18], at[54]);    MULADD(at[19], at[53]);    MULADD(at[20], at[52]);    MULADD(at[21], at[51]);    MULADD(at[22], at[50]);    MULADD(at[23], at[49]);    MULADD(at[24], at[48]);
3623    COMBA_STORE(C->dp[24]);
3624    /* 25 */
3625    COMBA_FORWARD;
3626    MULADD(at[0], at[73]);    MULADD(at[1], at[72]);    MULADD(at[2], at[71]);    MULADD(at[3], at[70]);    MULADD(at[4], at[69]);    MULADD(at[5], at[68]);    MULADD(at[6], at[67]);    MULADD(at[7], at[66]);    MULADD(at[8], at[65]);    MULADD(at[9], at[64]);    MULADD(at[10], at[63]);    MULADD(at[11], at[62]);    MULADD(at[12], at[61]);    MULADD(at[13], at[60]);    MULADD(at[14], at[59]);    MULADD(at[15], at[58]);    MULADD(at[16], at[57]);    MULADD(at[17], at[56]);    MULADD(at[18], at[55]);    MULADD(at[19], at[54]);    MULADD(at[20], at[53]);    MULADD(at[21], at[52]);    MULADD(at[22], at[51]);    MULADD(at[23], at[50]);    MULADD(at[24], at[49]);    MULADD(at[25], at[48]);
3627    COMBA_STORE(C->dp[25]);
3628    /* 26 */
3629    COMBA_FORWARD;
3630    MULADD(at[0], at[74]);    MULADD(at[1], at[73]);    MULADD(at[2], at[72]);    MULADD(at[3], at[71]);    MULADD(at[4], at[70]);    MULADD(at[5], at[69]);    MULADD(at[6], at[68]);    MULADD(at[7], at[67]);    MULADD(at[8], at[66]);    MULADD(at[9], at[65]);    MULADD(at[10], at[64]);    MULADD(at[11], at[63]);    MULADD(at[12], at[62]);    MULADD(at[13], at[61]);    MULADD(at[14], at[60]);    MULADD(at[15], at[59]);    MULADD(at[16], at[58]);    MULADD(at[17], at[57]);    MULADD(at[18], at[56]);    MULADD(at[19], at[55]);    MULADD(at[20], at[54]);    MULADD(at[21], at[53]);    MULADD(at[22], at[52]);    MULADD(at[23], at[51]);    MULADD(at[24], at[50]);    MULADD(at[25], at[49]);    MULADD(at[26], at[48]);
3631    COMBA_STORE(C->dp[26]);
3632    /* 27 */
3633    COMBA_FORWARD;
3634    MULADD(at[0], at[75]);    MULADD(at[1], at[74]);    MULADD(at[2], at[73]);    MULADD(at[3], at[72]);    MULADD(at[4], at[71]);    MULADD(at[5], at[70]);    MULADD(at[6], at[69]);    MULADD(at[7], at[68]);    MULADD(at[8], at[67]);    MULADD(at[9], at[66]);    MULADD(at[10], at[65]);    MULADD(at[11], at[64]);    MULADD(at[12], at[63]);    MULADD(at[13], at[62]);    MULADD(at[14], at[61]);    MULADD(at[15], at[60]);    MULADD(at[16], at[59]);    MULADD(at[17], at[58]);    MULADD(at[18], at[57]);    MULADD(at[19], at[56]);    MULADD(at[20], at[55]);    MULADD(at[21], at[54]);    MULADD(at[22], at[53]);    MULADD(at[23], at[52]);    MULADD(at[24], at[51]);    MULADD(at[25], at[50]);    MULADD(at[26], at[49]);    MULADD(at[27], at[48]);
3635    COMBA_STORE(C->dp[27]);
3636    /* 28 */
3637    COMBA_FORWARD;
3638    MULADD(at[0], at[76]);    MULADD(at[1], at[75]);    MULADD(at[2], at[74]);    MULADD(at[3], at[73]);    MULADD(at[4], at[72]);    MULADD(at[5], at[71]);    MULADD(at[6], at[70]);    MULADD(at[7], at[69]);    MULADD(at[8], at[68]);    MULADD(at[9], at[67]);    MULADD(at[10], at[66]);    MULADD(at[11], at[65]);    MULADD(at[12], at[64]);    MULADD(at[13], at[63]);    MULADD(at[14], at[62]);    MULADD(at[15], at[61]);    MULADD(at[16], at[60]);    MULADD(at[17], at[59]);    MULADD(at[18], at[58]);    MULADD(at[19], at[57]);    MULADD(at[20], at[56]);    MULADD(at[21], at[55]);    MULADD(at[22], at[54]);    MULADD(at[23], at[53]);    MULADD(at[24], at[52]);    MULADD(at[25], at[51]);    MULADD(at[26], at[50]);    MULADD(at[27], at[49]);    MULADD(at[28], at[48]);
3639    COMBA_STORE(C->dp[28]);
3640    /* 29 */
3641    COMBA_FORWARD;
3642    MULADD(at[0], at[77]);    MULADD(at[1], at[76]);    MULADD(at[2], at[75]);    MULADD(at[3], at[74]);    MULADD(at[4], at[73]);    MULADD(at[5], at[72]);    MULADD(at[6], at[71]);    MULADD(at[7], at[70]);    MULADD(at[8], at[69]);    MULADD(at[9], at[68]);    MULADD(at[10], at[67]);    MULADD(at[11], at[66]);    MULADD(at[12], at[65]);    MULADD(at[13], at[64]);    MULADD(at[14], at[63]);    MULADD(at[15], at[62]);    MULADD(at[16], at[61]);    MULADD(at[17], at[60]);    MULADD(at[18], at[59]);    MULADD(at[19], at[58]);    MULADD(at[20], at[57]);    MULADD(at[21], at[56]);    MULADD(at[22], at[55]);    MULADD(at[23], at[54]);    MULADD(at[24], at[53]);    MULADD(at[25], at[52]);    MULADD(at[26], at[51]);    MULADD(at[27], at[50]);    MULADD(at[28], at[49]);    MULADD(at[29], at[48]);
3643    COMBA_STORE(C->dp[29]);
3644    /* 30 */
3645    COMBA_FORWARD;
3646    MULADD(at[0], at[78]);    MULADD(at[1], at[77]);    MULADD(at[2], at[76]);    MULADD(at[3], at[75]);    MULADD(at[4], at[74]);    MULADD(at[5], at[73]);    MULADD(at[6], at[72]);    MULADD(at[7], at[71]);    MULADD(at[8], at[70]);    MULADD(at[9], at[69]);    MULADD(at[10], at[68]);    MULADD(at[11], at[67]);    MULADD(at[12], at[66]);    MULADD(at[13], at[65]);    MULADD(at[14], at[64]);    MULADD(at[15], at[63]);    MULADD(at[16], at[62]);    MULADD(at[17], at[61]);    MULADD(at[18], at[60]);    MULADD(at[19], at[59]);    MULADD(at[20], at[58]);    MULADD(at[21], at[57]);    MULADD(at[22], at[56]);    MULADD(at[23], at[55]);    MULADD(at[24], at[54]);    MULADD(at[25], at[53]);    MULADD(at[26], at[52]);    MULADD(at[27], at[51]);    MULADD(at[28], at[50]);    MULADD(at[29], at[49]);    MULADD(at[30], at[48]);
3647    COMBA_STORE(C->dp[30]);
3648    /* 31 */
3649    COMBA_FORWARD;
3650    MULADD(at[0], at[79]);    MULADD(at[1], at[78]);    MULADD(at[2], at[77]);    MULADD(at[3], at[76]);    MULADD(at[4], at[75]);    MULADD(at[5], at[74]);    MULADD(at[6], at[73]);    MULADD(at[7], at[72]);    MULADD(at[8], at[71]);    MULADD(at[9], at[70]);    MULADD(at[10], at[69]);    MULADD(at[11], at[68]);    MULADD(at[12], at[67]);    MULADD(at[13], at[66]);    MULADD(at[14], at[65]);    MULADD(at[15], at[64]);    MULADD(at[16], at[63]);    MULADD(at[17], at[62]);    MULADD(at[18], at[61]);    MULADD(at[19], at[60]);    MULADD(at[20], at[59]);    MULADD(at[21], at[58]);    MULADD(at[22], at[57]);    MULADD(at[23], at[56]);    MULADD(at[24], at[55]);    MULADD(at[25], at[54]);    MULADD(at[26], at[53]);    MULADD(at[27], at[52]);    MULADD(at[28], at[51]);    MULADD(at[29], at[50]);    MULADD(at[30], at[49]);    MULADD(at[31], at[48]);
3651    COMBA_STORE(C->dp[31]);
3652    /* 32 */
3653    COMBA_FORWARD;
3654    MULADD(at[0], at[80]);    MULADD(at[1], at[79]);    MULADD(at[2], at[78]);    MULADD(at[3], at[77]);    MULADD(at[4], at[76]);    MULADD(at[5], at[75]);    MULADD(at[6], at[74]);    MULADD(at[7], at[73]);    MULADD(at[8], at[72]);    MULADD(at[9], at[71]);    MULADD(at[10], at[70]);    MULADD(at[11], at[69]);    MULADD(at[12], at[68]);    MULADD(at[13], at[67]);    MULADD(at[14], at[66]);    MULADD(at[15], at[65]);    MULADD(at[16], at[64]);    MULADD(at[17], at[63]);    MULADD(at[18], at[62]);    MULADD(at[19], at[61]);    MULADD(at[20], at[60]);    MULADD(at[21], at[59]);    MULADD(at[22], at[58]);    MULADD(at[23], at[57]);    MULADD(at[24], at[56]);    MULADD(at[25], at[55]);    MULADD(at[26], at[54]);    MULADD(at[27], at[53]);    MULADD(at[28], at[52]);    MULADD(at[29], at[51]);    MULADD(at[30], at[50]);    MULADD(at[31], at[49]);    MULADD(at[32], at[48]);
3655    COMBA_STORE(C->dp[32]);
3656    /* 33 */
3657    COMBA_FORWARD;
3658    MULADD(at[0], at[81]);    MULADD(at[1], at[80]);    MULADD(at[2], at[79]);    MULADD(at[3], at[78]);    MULADD(at[4], at[77]);    MULADD(at[5], at[76]);    MULADD(at[6], at[75]);    MULADD(at[7], at[74]);    MULADD(at[8], at[73]);    MULADD(at[9], at[72]);    MULADD(at[10], at[71]);    MULADD(at[11], at[70]);    MULADD(at[12], at[69]);    MULADD(at[13], at[68]);    MULADD(at[14], at[67]);    MULADD(at[15], at[66]);    MULADD(at[16], at[65]);    MULADD(at[17], at[64]);    MULADD(at[18], at[63]);    MULADD(at[19], at[62]);    MULADD(at[20], at[61]);    MULADD(at[21], at[60]);    MULADD(at[22], at[59]);    MULADD(at[23], at[58]);    MULADD(at[24], at[57]);    MULADD(at[25], at[56]);    MULADD(at[26], at[55]);    MULADD(at[27], at[54]);    MULADD(at[28], at[53]);    MULADD(at[29], at[52]);    MULADD(at[30], at[51]);    MULADD(at[31], at[50]);    MULADD(at[32], at[49]);    MULADD(at[33], at[48]);
3659    COMBA_STORE(C->dp[33]);
3660    /* 34 */
3661    COMBA_FORWARD;
3662    MULADD(at[0], at[82]);    MULADD(at[1], at[81]);    MULADD(at[2], at[80]);    MULADD(at[3], at[79]);    MULADD(at[4], at[78]);    MULADD(at[5], at[77]);    MULADD(at[6], at[76]);    MULADD(at[7], at[75]);    MULADD(at[8], at[74]);    MULADD(at[9], at[73]);    MULADD(at[10], at[72]);    MULADD(at[11], at[71]);    MULADD(at[12], at[70]);    MULADD(at[13], at[69]);    MULADD(at[14], at[68]);    MULADD(at[15], at[67]);    MULADD(at[16], at[66]);    MULADD(at[17], at[65]);    MULADD(at[18], at[64]);    MULADD(at[19], at[63]);    MULADD(at[20], at[62]);    MULADD(at[21], at[61]);    MULADD(at[22], at[60]);    MULADD(at[23], at[59]);    MULADD(at[24], at[58]);    MULADD(at[25], at[57]);    MULADD(at[26], at[56]);    MULADD(at[27], at[55]);    MULADD(at[28], at[54]);    MULADD(at[29], at[53]);    MULADD(at[30], at[52]);    MULADD(at[31], at[51]);    MULADD(at[32], at[50]);    MULADD(at[33], at[49]);    MULADD(at[34], at[48]);
3663    COMBA_STORE(C->dp[34]);
3664    /* 35 */
3665    COMBA_FORWARD;
3666    MULADD(at[0], at[83]);    MULADD(at[1], at[82]);    MULADD(at[2], at[81]);    MULADD(at[3], at[80]);    MULADD(at[4], at[79]);    MULADD(at[5], at[78]);    MULADD(at[6], at[77]);    MULADD(at[7], at[76]);    MULADD(at[8], at[75]);    MULADD(at[9], at[74]);    MULADD(at[10], at[73]);    MULADD(at[11], at[72]);    MULADD(at[12], at[71]);    MULADD(at[13], at[70]);    MULADD(at[14], at[69]);    MULADD(at[15], at[68]);    MULADD(at[16], at[67]);    MULADD(at[17], at[66]);    MULADD(at[18], at[65]);    MULADD(at[19], at[64]);    MULADD(at[20], at[63]);    MULADD(at[21], at[62]);    MULADD(at[22], at[61]);    MULADD(at[23], at[60]);    MULADD(at[24], at[59]);    MULADD(at[25], at[58]);    MULADD(at[26], at[57]);    MULADD(at[27], at[56]);    MULADD(at[28], at[55]);    MULADD(at[29], at[54]);    MULADD(at[30], at[53]);    MULADD(at[31], at[52]);    MULADD(at[32], at[51]);    MULADD(at[33], at[50]);    MULADD(at[34], at[49]);    MULADD(at[35], at[48]);
3667    COMBA_STORE(C->dp[35]);
3668    /* 36 */
3669    COMBA_FORWARD;
3670    MULADD(at[0], at[84]);    MULADD(at[1], at[83]);    MULADD(at[2], at[82]);    MULADD(at[3], at[81]);    MULADD(at[4], at[80]);    MULADD(at[5], at[79]);    MULADD(at[6], at[78]);    MULADD(at[7], at[77]);    MULADD(at[8], at[76]);    MULADD(at[9], at[75]);    MULADD(at[10], at[74]);    MULADD(at[11], at[73]);    MULADD(at[12], at[72]);    MULADD(at[13], at[71]);    MULADD(at[14], at[70]);    MULADD(at[15], at[69]);    MULADD(at[16], at[68]);    MULADD(at[17], at[67]);    MULADD(at[18], at[66]);    MULADD(at[19], at[65]);    MULADD(at[20], at[64]);    MULADD(at[21], at[63]);    MULADD(at[22], at[62]);    MULADD(at[23], at[61]);    MULADD(at[24], at[60]);    MULADD(at[25], at[59]);    MULADD(at[26], at[58]);    MULADD(at[27], at[57]);    MULADD(at[28], at[56]);    MULADD(at[29], at[55]);    MULADD(at[30], at[54]);    MULADD(at[31], at[53]);    MULADD(at[32], at[52]);    MULADD(at[33], at[51]);    MULADD(at[34], at[50]);    MULADD(at[35], at[49]);    MULADD(at[36], at[48]);
3671    COMBA_STORE(C->dp[36]);
3672    /* 37 */
3673    COMBA_FORWARD;
3674    MULADD(at[0], at[85]);    MULADD(at[1], at[84]);    MULADD(at[2], at[83]);    MULADD(at[3], at[82]);    MULADD(at[4], at[81]);    MULADD(at[5], at[80]);    MULADD(at[6], at[79]);    MULADD(at[7], at[78]);    MULADD(at[8], at[77]);    MULADD(at[9], at[76]);    MULADD(at[10], at[75]);    MULADD(at[11], at[74]);    MULADD(at[12], at[73]);    MULADD(at[13], at[72]);    MULADD(at[14], at[71]);    MULADD(at[15], at[70]);    MULADD(at[16], at[69]);    MULADD(at[17], at[68]);    MULADD(at[18], at[67]);    MULADD(at[19], at[66]);    MULADD(at[20], at[65]);    MULADD(at[21], at[64]);    MULADD(at[22], at[63]);    MULADD(at[23], at[62]);    MULADD(at[24], at[61]);    MULADD(at[25], at[60]);    MULADD(at[26], at[59]);    MULADD(at[27], at[58]);    MULADD(at[28], at[57]);    MULADD(at[29], at[56]);    MULADD(at[30], at[55]);    MULADD(at[31], at[54]);    MULADD(at[32], at[53]);    MULADD(at[33], at[52]);    MULADD(at[34], at[51]);    MULADD(at[35], at[50]);    MULADD(at[36], at[49]);    MULADD(at[37], at[48]);
3675    COMBA_STORE(C->dp[37]);
3676    /* 38 */
3677    COMBA_FORWARD;
3678    MULADD(at[0], at[86]);    MULADD(at[1], at[85]);    MULADD(at[2], at[84]);    MULADD(at[3], at[83]);    MULADD(at[4], at[82]);    MULADD(at[5], at[81]);    MULADD(at[6], at[80]);    MULADD(at[7], at[79]);    MULADD(at[8], at[78]);    MULADD(at[9], at[77]);    MULADD(at[10], at[76]);    MULADD(at[11], at[75]);    MULADD(at[12], at[74]);    MULADD(at[13], at[73]);    MULADD(at[14], at[72]);    MULADD(at[15], at[71]);    MULADD(at[16], at[70]);    MULADD(at[17], at[69]);    MULADD(at[18], at[68]);    MULADD(at[19], at[67]);    MULADD(at[20], at[66]);    MULADD(at[21], at[65]);    MULADD(at[22], at[64]);    MULADD(at[23], at[63]);    MULADD(at[24], at[62]);    MULADD(at[25], at[61]);    MULADD(at[26], at[60]);    MULADD(at[27], at[59]);    MULADD(at[28], at[58]);    MULADD(at[29], at[57]);    MULADD(at[30], at[56]);    MULADD(at[31], at[55]);    MULADD(at[32], at[54]);    MULADD(at[33], at[53]);    MULADD(at[34], at[52]);    MULADD(at[35], at[51]);    MULADD(at[36], at[50]);    MULADD(at[37], at[49]);    MULADD(at[38], at[48]);
3679    COMBA_STORE(C->dp[38]);
3680    /* 39 */
3681    COMBA_FORWARD;
3682    MULADD(at[0], at[87]);    MULADD(at[1], at[86]);    MULADD(at[2], at[85]);    MULADD(at[3], at[84]);    MULADD(at[4], at[83]);    MULADD(at[5], at[82]);    MULADD(at[6], at[81]);    MULADD(at[7], at[80]);    MULADD(at[8], at[79]);    MULADD(at[9], at[78]);    MULADD(at[10], at[77]);    MULADD(at[11], at[76]);    MULADD(at[12], at[75]);    MULADD(at[13], at[74]);    MULADD(at[14], at[73]);    MULADD(at[15], at[72]);    MULADD(at[16], at[71]);    MULADD(at[17], at[70]);    MULADD(at[18], at[69]);    MULADD(at[19], at[68]);    MULADD(at[20], at[67]);    MULADD(at[21], at[66]);    MULADD(at[22], at[65]);    MULADD(at[23], at[64]);    MULADD(at[24], at[63]);    MULADD(at[25], at[62]);    MULADD(at[26], at[61]);    MULADD(at[27], at[60]);    MULADD(at[28], at[59]);    MULADD(at[29], at[58]);    MULADD(at[30], at[57]);    MULADD(at[31], at[56]);    MULADD(at[32], at[55]);    MULADD(at[33], at[54]);    MULADD(at[34], at[53]);    MULADD(at[35], at[52]);    MULADD(at[36], at[51]);    MULADD(at[37], at[50]);    MULADD(at[38], at[49]);    MULADD(at[39], at[48]);
3683    COMBA_STORE(C->dp[39]);
3684    /* 40 */
3685    COMBA_FORWARD;
3686    MULADD(at[0], at[88]);    MULADD(at[1], at[87]);    MULADD(at[2], at[86]);    MULADD(at[3], at[85]);    MULADD(at[4], at[84]);    MULADD(at[5], at[83]);    MULADD(at[6], at[82]);    MULADD(at[7], at[81]);    MULADD(at[8], at[80]);    MULADD(at[9], at[79]);    MULADD(at[10], at[78]);    MULADD(at[11], at[77]);    MULADD(at[12], at[76]);    MULADD(at[13], at[75]);    MULADD(at[14], at[74]);    MULADD(at[15], at[73]);    MULADD(at[16], at[72]);    MULADD(at[17], at[71]);    MULADD(at[18], at[70]);    MULADD(at[19], at[69]);    MULADD(at[20], at[68]);    MULADD(at[21], at[67]);    MULADD(at[22], at[66]);    MULADD(at[23], at[65]);    MULADD(at[24], at[64]);    MULADD(at[25], at[63]);    MULADD(at[26], at[62]);    MULADD(at[27], at[61]);    MULADD(at[28], at[60]);    MULADD(at[29], at[59]);    MULADD(at[30], at[58]);    MULADD(at[31], at[57]);    MULADD(at[32], at[56]);    MULADD(at[33], at[55]);    MULADD(at[34], at[54]);    MULADD(at[35], at[53]);    MULADD(at[36], at[52]);    MULADD(at[37], at[51]);    MULADD(at[38], at[50]);    MULADD(at[39], at[49]);    MULADD(at[40], at[48]);
3687    COMBA_STORE(C->dp[40]);
3688    /* 41 */
3689    COMBA_FORWARD;
3690    MULADD(at[0], at[89]);    MULADD(at[1], at[88]);    MULADD(at[2], at[87]);    MULADD(at[3], at[86]);    MULADD(at[4], at[85]);    MULADD(at[5], at[84]);    MULADD(at[6], at[83]);    MULADD(at[7], at[82]);    MULADD(at[8], at[81]);    MULADD(at[9], at[80]);    MULADD(at[10], at[79]);    MULADD(at[11], at[78]);    MULADD(at[12], at[77]);    MULADD(at[13], at[76]);    MULADD(at[14], at[75]);    MULADD(at[15], at[74]);    MULADD(at[16], at[73]);    MULADD(at[17], at[72]);    MULADD(at[18], at[71]);    MULADD(at[19], at[70]);    MULADD(at[20], at[69]);    MULADD(at[21], at[68]);    MULADD(at[22], at[67]);    MULADD(at[23], at[66]);    MULADD(at[24], at[65]);    MULADD(at[25], at[64]);    MULADD(at[26], at[63]);    MULADD(at[27], at[62]);    MULADD(at[28], at[61]);    MULADD(at[29], at[60]);    MULADD(at[30], at[59]);    MULADD(at[31], at[58]);    MULADD(at[32], at[57]);    MULADD(at[33], at[56]);    MULADD(at[34], at[55]);    MULADD(at[35], at[54]);    MULADD(at[36], at[53]);    MULADD(at[37], at[52]);    MULADD(at[38], at[51]);    MULADD(at[39], at[50]);    MULADD(at[40], at[49]);    MULADD(at[41], at[48]);
3691    COMBA_STORE(C->dp[41]);
3692    /* 42 */
3693    COMBA_FORWARD;
3694    MULADD(at[0], at[90]);    MULADD(at[1], at[89]);    MULADD(at[2], at[88]);    MULADD(at[3], at[87]);    MULADD(at[4], at[86]);    MULADD(at[5], at[85]);    MULADD(at[6], at[84]);    MULADD(at[7], at[83]);    MULADD(at[8], at[82]);    MULADD(at[9], at[81]);    MULADD(at[10], at[80]);    MULADD(at[11], at[79]);    MULADD(at[12], at[78]);    MULADD(at[13], at[77]);    MULADD(at[14], at[76]);    MULADD(at[15], at[75]);    MULADD(at[16], at[74]);    MULADD(at[17], at[73]);    MULADD(at[18], at[72]);    MULADD(at[19], at[71]);    MULADD(at[20], at[70]);    MULADD(at[21], at[69]);    MULADD(at[22], at[68]);    MULADD(at[23], at[67]);    MULADD(at[24], at[66]);    MULADD(at[25], at[65]);    MULADD(at[26], at[64]);    MULADD(at[27], at[63]);    MULADD(at[28], at[62]);    MULADD(at[29], at[61]);    MULADD(at[30], at[60]);    MULADD(at[31], at[59]);    MULADD(at[32], at[58]);    MULADD(at[33], at[57]);    MULADD(at[34], at[56]);    MULADD(at[35], at[55]);    MULADD(at[36], at[54]);    MULADD(at[37], at[53]);    MULADD(at[38], at[52]);    MULADD(at[39], at[51]);    MULADD(at[40], at[50]);    MULADD(at[41], at[49]);    MULADD(at[42], at[48]);
3695    COMBA_STORE(C->dp[42]);
3696    /* 43 */
3697    COMBA_FORWARD;
3698    MULADD(at[0], at[91]);    MULADD(at[1], at[90]);    MULADD(at[2], at[89]);    MULADD(at[3], at[88]);    MULADD(at[4], at[87]);    MULADD(at[5], at[86]);    MULADD(at[6], at[85]);    MULADD(at[7], at[84]);    MULADD(at[8], at[83]);    MULADD(at[9], at[82]);    MULADD(at[10], at[81]);    MULADD(at[11], at[80]);    MULADD(at[12], at[79]);    MULADD(at[13], at[78]);    MULADD(at[14], at[77]);    MULADD(at[15], at[76]);    MULADD(at[16], at[75]);    MULADD(at[17], at[74]);    MULADD(at[18], at[73]);    MULADD(at[19], at[72]);    MULADD(at[20], at[71]);    MULADD(at[21], at[70]);    MULADD(at[22], at[69]);    MULADD(at[23], at[68]);    MULADD(at[24], at[67]);    MULADD(at[25], at[66]);    MULADD(at[26], at[65]);    MULADD(at[27], at[64]);    MULADD(at[28], at[63]);    MULADD(at[29], at[62]);    MULADD(at[30], at[61]);    MULADD(at[31], at[60]);    MULADD(at[32], at[59]);    MULADD(at[33], at[58]);    MULADD(at[34], at[57]);    MULADD(at[35], at[56]);    MULADD(at[36], at[55]);    MULADD(at[37], at[54]);    MULADD(at[38], at[53]);    MULADD(at[39], at[52]);    MULADD(at[40], at[51]);    MULADD(at[41], at[50]);    MULADD(at[42], at[49]);    MULADD(at[43], at[48]);
3699    COMBA_STORE(C->dp[43]);
3700    /* 44 */
3701    COMBA_FORWARD;
3702    MULADD(at[0], at[92]);    MULADD(at[1], at[91]);    MULADD(at[2], at[90]);    MULADD(at[3], at[89]);    MULADD(at[4], at[88]);    MULADD(at[5], at[87]);    MULADD(at[6], at[86]);    MULADD(at[7], at[85]);    MULADD(at[8], at[84]);    MULADD(at[9], at[83]);    MULADD(at[10], at[82]);    MULADD(at[11], at[81]);    MULADD(at[12], at[80]);    MULADD(at[13], at[79]);    MULADD(at[14], at[78]);    MULADD(at[15], at[77]);    MULADD(at[16], at[76]);    MULADD(at[17], at[75]);    MULADD(at[18], at[74]);    MULADD(at[19], at[73]);    MULADD(at[20], at[72]);    MULADD(at[21], at[71]);    MULADD(at[22], at[70]);    MULADD(at[23], at[69]);    MULADD(at[24], at[68]);    MULADD(at[25], at[67]);    MULADD(at[26], at[66]);    MULADD(at[27], at[65]);    MULADD(at[28], at[64]);    MULADD(at[29], at[63]);    MULADD(at[30], at[62]);    MULADD(at[31], at[61]);    MULADD(at[32], at[60]);    MULADD(at[33], at[59]);    MULADD(at[34], at[58]);    MULADD(at[35], at[57]);    MULADD(at[36], at[56]);    MULADD(at[37], at[55]);    MULADD(at[38], at[54]);    MULADD(at[39], at[53]);    MULADD(at[40], at[52]);    MULADD(at[41], at[51]);    MULADD(at[42], at[50]);    MULADD(at[43], at[49]);    MULADD(at[44], at[48]);
3703    COMBA_STORE(C->dp[44]);
3704    /* 45 */
3705    COMBA_FORWARD;
3706    MULADD(at[0], at[93]);    MULADD(at[1], at[92]);    MULADD(at[2], at[91]);    MULADD(at[3], at[90]);    MULADD(at[4], at[89]);    MULADD(at[5], at[88]);    MULADD(at[6], at[87]);    MULADD(at[7], at[86]);    MULADD(at[8], at[85]);    MULADD(at[9], at[84]);    MULADD(at[10], at[83]);    MULADD(at[11], at[82]);    MULADD(at[12], at[81]);    MULADD(at[13], at[80]);    MULADD(at[14], at[79]);    MULADD(at[15], at[78]);    MULADD(at[16], at[77]);    MULADD(at[17], at[76]);    MULADD(at[18], at[75]);    MULADD(at[19], at[74]);    MULADD(at[20], at[73]);    MULADD(at[21], at[72]);    MULADD(at[22], at[71]);    MULADD(at[23], at[70]);    MULADD(at[24], at[69]);    MULADD(at[25], at[68]);    MULADD(at[26], at[67]);    MULADD(at[27], at[66]);    MULADD(at[28], at[65]);    MULADD(at[29], at[64]);    MULADD(at[30], at[63]);    MULADD(at[31], at[62]);    MULADD(at[32], at[61]);    MULADD(at[33], at[60]);    MULADD(at[34], at[59]);    MULADD(at[35], at[58]);    MULADD(at[36], at[57]);    MULADD(at[37], at[56]);    MULADD(at[38], at[55]);    MULADD(at[39], at[54]);    MULADD(at[40], at[53]);    MULADD(at[41], at[52]);    MULADD(at[42], at[51]);    MULADD(at[43], at[50]);    MULADD(at[44], at[49]);    MULADD(at[45], at[48]);
3707    COMBA_STORE(C->dp[45]);
3708    /* 46 */
3709    COMBA_FORWARD;
3710    MULADD(at[0], at[94]);    MULADD(at[1], at[93]);    MULADD(at[2], at[92]);    MULADD(at[3], at[91]);    MULADD(at[4], at[90]);    MULADD(at[5], at[89]);    MULADD(at[6], at[88]);    MULADD(at[7], at[87]);    MULADD(at[8], at[86]);    MULADD(at[9], at[85]);    MULADD(at[10], at[84]);    MULADD(at[11], at[83]);    MULADD(at[12], at[82]);    MULADD(at[13], at[81]);    MULADD(at[14], at[80]);    MULADD(at[15], at[79]);    MULADD(at[16], at[78]);    MULADD(at[17], at[77]);    MULADD(at[18], at[76]);    MULADD(at[19], at[75]);    MULADD(at[20], at[74]);    MULADD(at[21], at[73]);    MULADD(at[22], at[72]);    MULADD(at[23], at[71]);    MULADD(at[24], at[70]);    MULADD(at[25], at[69]);    MULADD(at[26], at[68]);    MULADD(at[27], at[67]);    MULADD(at[28], at[66]);    MULADD(at[29], at[65]);    MULADD(at[30], at[64]);    MULADD(at[31], at[63]);    MULADD(at[32], at[62]);    MULADD(at[33], at[61]);    MULADD(at[34], at[60]);    MULADD(at[35], at[59]);    MULADD(at[36], at[58]);    MULADD(at[37], at[57]);    MULADD(at[38], at[56]);    MULADD(at[39], at[55]);    MULADD(at[40], at[54]);    MULADD(at[41], at[53]);    MULADD(at[42], at[52]);    MULADD(at[43], at[51]);    MULADD(at[44], at[50]);    MULADD(at[45], at[49]);    MULADD(at[46], at[48]);
3711    COMBA_STORE(C->dp[46]);
3712    /* 47 */
3713    COMBA_FORWARD;
3714    MULADD(at[0], at[95]);    MULADD(at[1], at[94]);    MULADD(at[2], at[93]);    MULADD(at[3], at[92]);    MULADD(at[4], at[91]);    MULADD(at[5], at[90]);    MULADD(at[6], at[89]);    MULADD(at[7], at[88]);    MULADD(at[8], at[87]);    MULADD(at[9], at[86]);    MULADD(at[10], at[85]);    MULADD(at[11], at[84]);    MULADD(at[12], at[83]);    MULADD(at[13], at[82]);    MULADD(at[14], at[81]);    MULADD(at[15], at[80]);    MULADD(at[16], at[79]);    MULADD(at[17], at[78]);    MULADD(at[18], at[77]);    MULADD(at[19], at[76]);    MULADD(at[20], at[75]);    MULADD(at[21], at[74]);    MULADD(at[22], at[73]);    MULADD(at[23], at[72]);    MULADD(at[24], at[71]);    MULADD(at[25], at[70]);    MULADD(at[26], at[69]);    MULADD(at[27], at[68]);    MULADD(at[28], at[67]);    MULADD(at[29], at[66]);    MULADD(at[30], at[65]);    MULADD(at[31], at[64]);    MULADD(at[32], at[63]);    MULADD(at[33], at[62]);    MULADD(at[34], at[61]);    MULADD(at[35], at[60]);    MULADD(at[36], at[59]);    MULADD(at[37], at[58]);    MULADD(at[38], at[57]);    MULADD(at[39], at[56]);    MULADD(at[40], at[55]);    MULADD(at[41], at[54]);    MULADD(at[42], at[53]);    MULADD(at[43], at[52]);    MULADD(at[44], at[51]);    MULADD(at[45], at[50]);    MULADD(at[46], at[49]);    MULADD(at[47], at[48]);
3715    COMBA_STORE(C->dp[47]);
3716    /* 48 */
3717    COMBA_FORWARD;
3718    MULADD(at[1], at[95]);    MULADD(at[2], at[94]);    MULADD(at[3], at[93]);    MULADD(at[4], at[92]);    MULADD(at[5], at[91]);    MULADD(at[6], at[90]);    MULADD(at[7], at[89]);    MULADD(at[8], at[88]);    MULADD(at[9], at[87]);    MULADD(at[10], at[86]);    MULADD(at[11], at[85]);    MULADD(at[12], at[84]);    MULADD(at[13], at[83]);    MULADD(at[14], at[82]);    MULADD(at[15], at[81]);    MULADD(at[16], at[80]);    MULADD(at[17], at[79]);    MULADD(at[18], at[78]);    MULADD(at[19], at[77]);    MULADD(at[20], at[76]);    MULADD(at[21], at[75]);    MULADD(at[22], at[74]);    MULADD(at[23], at[73]);    MULADD(at[24], at[72]);    MULADD(at[25], at[71]);    MULADD(at[26], at[70]);    MULADD(at[27], at[69]);    MULADD(at[28], at[68]);    MULADD(at[29], at[67]);    MULADD(at[30], at[66]);    MULADD(at[31], at[65]);    MULADD(at[32], at[64]);    MULADD(at[33], at[63]);    MULADD(at[34], at[62]);    MULADD(at[35], at[61]);    MULADD(at[36], at[60]);    MULADD(at[37], at[59]);    MULADD(at[38], at[58]);    MULADD(at[39], at[57]);    MULADD(at[40], at[56]);    MULADD(at[41], at[55]);    MULADD(at[42], at[54]);    MULADD(at[43], at[53]);    MULADD(at[44], at[52]);    MULADD(at[45], at[51]);    MULADD(at[46], at[50]);    MULADD(at[47], at[49]);
3719    COMBA_STORE(C->dp[48]);
3720    /* 49 */
3721    COMBA_FORWARD;
3722    MULADD(at[2], at[95]);    MULADD(at[3], at[94]);    MULADD(at[4], at[93]);    MULADD(at[5], at[92]);    MULADD(at[6], at[91]);    MULADD(at[7], at[90]);    MULADD(at[8], at[89]);    MULADD(at[9], at[88]);    MULADD(at[10], at[87]);    MULADD(at[11], at[86]);    MULADD(at[12], at[85]);    MULADD(at[13], at[84]);    MULADD(at[14], at[83]);    MULADD(at[15], at[82]);    MULADD(at[16], at[81]);    MULADD(at[17], at[80]);    MULADD(at[18], at[79]);    MULADD(at[19], at[78]);    MULADD(at[20], at[77]);    MULADD(at[21], at[76]);    MULADD(at[22], at[75]);    MULADD(at[23], at[74]);    MULADD(at[24], at[73]);    MULADD(at[25], at[72]);    MULADD(at[26], at[71]);    MULADD(at[27], at[70]);    MULADD(at[28], at[69]);    MULADD(at[29], at[68]);    MULADD(at[30], at[67]);    MULADD(at[31], at[66]);    MULADD(at[32], at[65]);    MULADD(at[33], at[64]);    MULADD(at[34], at[63]);    MULADD(at[35], at[62]);    MULADD(at[36], at[61]);    MULADD(at[37], at[60]);    MULADD(at[38], at[59]);    MULADD(at[39], at[58]);    MULADD(at[40], at[57]);    MULADD(at[41], at[56]);    MULADD(at[42], at[55]);    MULADD(at[43], at[54]);    MULADD(at[44], at[53]);    MULADD(at[45], at[52]);    MULADD(at[46], at[51]);    MULADD(at[47], at[50]);
3723    COMBA_STORE(C->dp[49]);
3724    /* 50 */
3725    COMBA_FORWARD;
3726    MULADD(at[3], at[95]);    MULADD(at[4], at[94]);    MULADD(at[5], at[93]);    MULADD(at[6], at[92]);    MULADD(at[7], at[91]);    MULADD(at[8], at[90]);    MULADD(at[9], at[89]);    MULADD(at[10], at[88]);    MULADD(at[11], at[87]);    MULADD(at[12], at[86]);    MULADD(at[13], at[85]);    MULADD(at[14], at[84]);    MULADD(at[15], at[83]);    MULADD(at[16], at[82]);    MULADD(at[17], at[81]);    MULADD(at[18], at[80]);    MULADD(at[19], at[79]);    MULADD(at[20], at[78]);    MULADD(at[21], at[77]);    MULADD(at[22], at[76]);    MULADD(at[23], at[75]);    MULADD(at[24], at[74]);    MULADD(at[25], at[73]);    MULADD(at[26], at[72]);    MULADD(at[27], at[71]);    MULADD(at[28], at[70]);    MULADD(at[29], at[69]);    MULADD(at[30], at[68]);    MULADD(at[31], at[67]);    MULADD(at[32], at[66]);    MULADD(at[33], at[65]);    MULADD(at[34], at[64]);    MULADD(at[35], at[63]);    MULADD(at[36], at[62]);    MULADD(at[37], at[61]);    MULADD(at[38], at[60]);    MULADD(at[39], at[59]);    MULADD(at[40], at[58]);    MULADD(at[41], at[57]);    MULADD(at[42], at[56]);    MULADD(at[43], at[55]);    MULADD(at[44], at[54]);    MULADD(at[45], at[53]);    MULADD(at[46], at[52]);    MULADD(at[47], at[51]);
3727    COMBA_STORE(C->dp[50]);
3728    /* 51 */
3729    COMBA_FORWARD;
3730    MULADD(at[4], at[95]);    MULADD(at[5], at[94]);    MULADD(at[6], at[93]);    MULADD(at[7], at[92]);    MULADD(at[8], at[91]);    MULADD(at[9], at[90]);    MULADD(at[10], at[89]);    MULADD(at[11], at[88]);    MULADD(at[12], at[87]);    MULADD(at[13], at[86]);    MULADD(at[14], at[85]);    MULADD(at[15], at[84]);    MULADD(at[16], at[83]);    MULADD(at[17], at[82]);    MULADD(at[18], at[81]);    MULADD(at[19], at[80]);    MULADD(at[20], at[79]);    MULADD(at[21], at[78]);    MULADD(at[22], at[77]);    MULADD(at[23], at[76]);    MULADD(at[24], at[75]);    MULADD(at[25], at[74]);    MULADD(at[26], at[73]);    MULADD(at[27], at[72]);    MULADD(at[28], at[71]);    MULADD(at[29], at[70]);    MULADD(at[30], at[69]);    MULADD(at[31], at[68]);    MULADD(at[32], at[67]);    MULADD(at[33], at[66]);    MULADD(at[34], at[65]);    MULADD(at[35], at[64]);    MULADD(at[36], at[63]);    MULADD(at[37], at[62]);    MULADD(at[38], at[61]);    MULADD(at[39], at[60]);    MULADD(at[40], at[59]);    MULADD(at[41], at[58]);    MULADD(at[42], at[57]);    MULADD(at[43], at[56]);    MULADD(at[44], at[55]);    MULADD(at[45], at[54]);    MULADD(at[46], at[53]);    MULADD(at[47], at[52]);
3731    COMBA_STORE(C->dp[51]);
3732    /* 52 */
3733    COMBA_FORWARD;
3734    MULADD(at[5], at[95]);    MULADD(at[6], at[94]);    MULADD(at[7], at[93]);    MULADD(at[8], at[92]);    MULADD(at[9], at[91]);    MULADD(at[10], at[90]);    MULADD(at[11], at[89]);    MULADD(at[12], at[88]);    MULADD(at[13], at[87]);    MULADD(at[14], at[86]);    MULADD(at[15], at[85]);    MULADD(at[16], at[84]);    MULADD(at[17], at[83]);    MULADD(at[18], at[82]);    MULADD(at[19], at[81]);    MULADD(at[20], at[80]);    MULADD(at[21], at[79]);    MULADD(at[22], at[78]);    MULADD(at[23], at[77]);    MULADD(at[24], at[76]);    MULADD(at[25], at[75]);    MULADD(at[26], at[74]);    MULADD(at[27], at[73]);    MULADD(at[28], at[72]);    MULADD(at[29], at[71]);    MULADD(at[30], at[70]);    MULADD(at[31], at[69]);    MULADD(at[32], at[68]);    MULADD(at[33], at[67]);    MULADD(at[34], at[66]);    MULADD(at[35], at[65]);    MULADD(at[36], at[64]);    MULADD(at[37], at[63]);    MULADD(at[38], at[62]);    MULADD(at[39], at[61]);    MULADD(at[40], at[60]);    MULADD(at[41], at[59]);    MULADD(at[42], at[58]);    MULADD(at[43], at[57]);    MULADD(at[44], at[56]);    MULADD(at[45], at[55]);    MULADD(at[46], at[54]);    MULADD(at[47], at[53]);
3735    COMBA_STORE(C->dp[52]);
3736    /* 53 */
3737    COMBA_FORWARD;
3738    MULADD(at[6], at[95]);    MULADD(at[7], at[94]);    MULADD(at[8], at[93]);    MULADD(at[9], at[92]);    MULADD(at[10], at[91]);    MULADD(at[11], at[90]);    MULADD(at[12], at[89]);    MULADD(at[13], at[88]);    MULADD(at[14], at[87]);    MULADD(at[15], at[86]);    MULADD(at[16], at[85]);    MULADD(at[17], at[84]);    MULADD(at[18], at[83]);    MULADD(at[19], at[82]);    MULADD(at[20], at[81]);    MULADD(at[21], at[80]);    MULADD(at[22], at[79]);    MULADD(at[23], at[78]);    MULADD(at[24], at[77]);    MULADD(at[25], at[76]);    MULADD(at[26], at[75]);    MULADD(at[27], at[74]);    MULADD(at[28], at[73]);    MULADD(at[29], at[72]);    MULADD(at[30], at[71]);    MULADD(at[31], at[70]);    MULADD(at[32], at[69]);    MULADD(at[33], at[68]);    MULADD(at[34], at[67]);    MULADD(at[35], at[66]);    MULADD(at[36], at[65]);    MULADD(at[37], at[64]);    MULADD(at[38], at[63]);    MULADD(at[39], at[62]);    MULADD(at[40], at[61]);    MULADD(at[41], at[60]);    MULADD(at[42], at[59]);    MULADD(at[43], at[58]);    MULADD(at[44], at[57]);    MULADD(at[45], at[56]);    MULADD(at[46], at[55]);    MULADD(at[47], at[54]);
3739    COMBA_STORE(C->dp[53]);
3740    /* 54 */
3741    COMBA_FORWARD;
3742    MULADD(at[7], at[95]);    MULADD(at[8], at[94]);    MULADD(at[9], at[93]);    MULADD(at[10], at[92]);    MULADD(at[11], at[91]);    MULADD(at[12], at[90]);    MULADD(at[13], at[89]);    MULADD(at[14], at[88]);    MULADD(at[15], at[87]);    MULADD(at[16], at[86]);    MULADD(at[17], at[85]);    MULADD(at[18], at[84]);    MULADD(at[19], at[83]);    MULADD(at[20], at[82]);    MULADD(at[21], at[81]);    MULADD(at[22], at[80]);    MULADD(at[23], at[79]);    MULADD(at[24], at[78]);    MULADD(at[25], at[77]);    MULADD(at[26], at[76]);    MULADD(at[27], at[75]);    MULADD(at[28], at[74]);    MULADD(at[29], at[73]);    MULADD(at[30], at[72]);    MULADD(at[31], at[71]);    MULADD(at[32], at[70]);    MULADD(at[33], at[69]);    MULADD(at[34], at[68]);    MULADD(at[35], at[67]);    MULADD(at[36], at[66]);    MULADD(at[37], at[65]);    MULADD(at[38], at[64]);    MULADD(at[39], at[63]);    MULADD(at[40], at[62]);    MULADD(at[41], at[61]);    MULADD(at[42], at[60]);    MULADD(at[43], at[59]);    MULADD(at[44], at[58]);    MULADD(at[45], at[57]);    MULADD(at[46], at[56]);    MULADD(at[47], at[55]);
3743    COMBA_STORE(C->dp[54]);
3744    /* 55 */
3745    COMBA_FORWARD;
3746    MULADD(at[8], at[95]);    MULADD(at[9], at[94]);    MULADD(at[10], at[93]);    MULADD(at[11], at[92]);    MULADD(at[12], at[91]);    MULADD(at[13], at[90]);    MULADD(at[14], at[89]);    MULADD(at[15], at[88]);    MULADD(at[16], at[87]);    MULADD(at[17], at[86]);    MULADD(at[18], at[85]);    MULADD(at[19], at[84]);    MULADD(at[20], at[83]);    MULADD(at[21], at[82]);    MULADD(at[22], at[81]);    MULADD(at[23], at[80]);    MULADD(at[24], at[79]);    MULADD(at[25], at[78]);    MULADD(at[26], at[77]);    MULADD(at[27], at[76]);    MULADD(at[28], at[75]);    MULADD(at[29], at[74]);    MULADD(at[30], at[73]);    MULADD(at[31], at[72]);    MULADD(at[32], at[71]);    MULADD(at[33], at[70]);    MULADD(at[34], at[69]);    MULADD(at[35], at[68]);    MULADD(at[36], at[67]);    MULADD(at[37], at[66]);    MULADD(at[38], at[65]);    MULADD(at[39], at[64]);    MULADD(at[40], at[63]);    MULADD(at[41], at[62]);    MULADD(at[42], at[61]);    MULADD(at[43], at[60]);    MULADD(at[44], at[59]);    MULADD(at[45], at[58]);    MULADD(at[46], at[57]);    MULADD(at[47], at[56]);
3747    COMBA_STORE(C->dp[55]);
3748    /* 56 */
3749    COMBA_FORWARD;
3750    MULADD(at[9], at[95]);    MULADD(at[10], at[94]);    MULADD(at[11], at[93]);    MULADD(at[12], at[92]);    MULADD(at[13], at[91]);    MULADD(at[14], at[90]);    MULADD(at[15], at[89]);    MULADD(at[16], at[88]);    MULADD(at[17], at[87]);    MULADD(at[18], at[86]);    MULADD(at[19], at[85]);    MULADD(at[20], at[84]);    MULADD(at[21], at[83]);    MULADD(at[22], at[82]);    MULADD(at[23], at[81]);    MULADD(at[24], at[80]);    MULADD(at[25], at[79]);    MULADD(at[26], at[78]);    MULADD(at[27], at[77]);    MULADD(at[28], at[76]);    MULADD(at[29], at[75]);    MULADD(at[30], at[74]);    MULADD(at[31], at[73]);    MULADD(at[32], at[72]);    MULADD(at[33], at[71]);    MULADD(at[34], at[70]);    MULADD(at[35], at[69]);    MULADD(at[36], at[68]);    MULADD(at[37], at[67]);    MULADD(at[38], at[66]);    MULADD(at[39], at[65]);    MULADD(at[40], at[64]);    MULADD(at[41], at[63]);    MULADD(at[42], at[62]);    MULADD(at[43], at[61]);    MULADD(at[44], at[60]);    MULADD(at[45], at[59]);    MULADD(at[46], at[58]);    MULADD(at[47], at[57]);
3751    COMBA_STORE(C->dp[56]);
3752    /* 57 */
3753    COMBA_FORWARD;
3754    MULADD(at[10], at[95]);    MULADD(at[11], at[94]);    MULADD(at[12], at[93]);    MULADD(at[13], at[92]);    MULADD(at[14], at[91]);    MULADD(at[15], at[90]);    MULADD(at[16], at[89]);    MULADD(at[17], at[88]);    MULADD(at[18], at[87]);    MULADD(at[19], at[86]);    MULADD(at[20], at[85]);    MULADD(at[21], at[84]);    MULADD(at[22], at[83]);    MULADD(at[23], at[82]);    MULADD(at[24], at[81]);    MULADD(at[25], at[80]);    MULADD(at[26], at[79]);    MULADD(at[27], at[78]);    MULADD(at[28], at[77]);    MULADD(at[29], at[76]);    MULADD(at[30], at[75]);    MULADD(at[31], at[74]);    MULADD(at[32], at[73]);    MULADD(at[33], at[72]);    MULADD(at[34], at[71]);    MULADD(at[35], at[70]);    MULADD(at[36], at[69]);    MULADD(at[37], at[68]);    MULADD(at[38], at[67]);    MULADD(at[39], at[66]);    MULADD(at[40], at[65]);    MULADD(at[41], at[64]);    MULADD(at[42], at[63]);    MULADD(at[43], at[62]);    MULADD(at[44], at[61]);    MULADD(at[45], at[60]);    MULADD(at[46], at[59]);    MULADD(at[47], at[58]);
3755    COMBA_STORE(C->dp[57]);
3756    /* 58 */
3757    COMBA_FORWARD;
3758    MULADD(at[11], at[95]);    MULADD(at[12], at[94]);    MULADD(at[13], at[93]);    MULADD(at[14], at[92]);    MULADD(at[15], at[91]);    MULADD(at[16], at[90]);    MULADD(at[17], at[89]);    MULADD(at[18], at[88]);    MULADD(at[19], at[87]);    MULADD(at[20], at[86]);    MULADD(at[21], at[85]);    MULADD(at[22], at[84]);    MULADD(at[23], at[83]);    MULADD(at[24], at[82]);    MULADD(at[25], at[81]);    MULADD(at[26], at[80]);    MULADD(at[27], at[79]);    MULADD(at[28], at[78]);    MULADD(at[29], at[77]);    MULADD(at[30], at[76]);    MULADD(at[31], at[75]);    MULADD(at[32], at[74]);    MULADD(at[33], at[73]);    MULADD(at[34], at[72]);    MULADD(at[35], at[71]);    MULADD(at[36], at[70]);    MULADD(at[37], at[69]);    MULADD(at[38], at[68]);    MULADD(at[39], at[67]);    MULADD(at[40], at[66]);    MULADD(at[41], at[65]);    MULADD(at[42], at[64]);    MULADD(at[43], at[63]);    MULADD(at[44], at[62]);    MULADD(at[45], at[61]);    MULADD(at[46], at[60]);    MULADD(at[47], at[59]);
3759    COMBA_STORE(C->dp[58]);
3760    /* 59 */
3761    COMBA_FORWARD;
3762    MULADD(at[12], at[95]);    MULADD(at[13], at[94]);    MULADD(at[14], at[93]);    MULADD(at[15], at[92]);    MULADD(at[16], at[91]);    MULADD(at[17], at[90]);    MULADD(at[18], at[89]);    MULADD(at[19], at[88]);    MULADD(at[20], at[87]);    MULADD(at[21], at[86]);    MULADD(at[22], at[85]);    MULADD(at[23], at[84]);    MULADD(at[24], at[83]);    MULADD(at[25], at[82]);    MULADD(at[26], at[81]);    MULADD(at[27], at[80]);    MULADD(at[28], at[79]);    MULADD(at[29], at[78]);    MULADD(at[30], at[77]);    MULADD(at[31], at[76]);    MULADD(at[32], at[75]);    MULADD(at[33], at[74]);    MULADD(at[34], at[73]);    MULADD(at[35], at[72]);    MULADD(at[36], at[71]);    MULADD(at[37], at[70]);    MULADD(at[38], at[69]);    MULADD(at[39], at[68]);    MULADD(at[40], at[67]);    MULADD(at[41], at[66]);    MULADD(at[42], at[65]);    MULADD(at[43], at[64]);    MULADD(at[44], at[63]);    MULADD(at[45], at[62]);    MULADD(at[46], at[61]);    MULADD(at[47], at[60]);
3763    COMBA_STORE(C->dp[59]);
3764    /* 60 */
3765    COMBA_FORWARD;
3766    MULADD(at[13], at[95]);    MULADD(at[14], at[94]);    MULADD(at[15], at[93]);    MULADD(at[16], at[92]);    MULADD(at[17], at[91]);    MULADD(at[18], at[90]);    MULADD(at[19], at[89]);    MULADD(at[20], at[88]);    MULADD(at[21], at[87]);    MULADD(at[22], at[86]);    MULADD(at[23], at[85]);    MULADD(at[24], at[84]);    MULADD(at[25], at[83]);    MULADD(at[26], at[82]);    MULADD(at[27], at[81]);    MULADD(at[28], at[80]);    MULADD(at[29], at[79]);    MULADD(at[30], at[78]);    MULADD(at[31], at[77]);    MULADD(at[32], at[76]);    MULADD(at[33], at[75]);    MULADD(at[34], at[74]);    MULADD(at[35], at[73]);    MULADD(at[36], at[72]);    MULADD(at[37], at[71]);    MULADD(at[38], at[70]);    MULADD(at[39], at[69]);    MULADD(at[40], at[68]);    MULADD(at[41], at[67]);    MULADD(at[42], at[66]);    MULADD(at[43], at[65]);    MULADD(at[44], at[64]);    MULADD(at[45], at[63]);    MULADD(at[46], at[62]);    MULADD(at[47], at[61]);
3767    COMBA_STORE(C->dp[60]);
3768    /* 61 */
3769    COMBA_FORWARD;
3770    MULADD(at[14], at[95]);    MULADD(at[15], at[94]);    MULADD(at[16], at[93]);    MULADD(at[17], at[92]);    MULADD(at[18], at[91]);    MULADD(at[19], at[90]);    MULADD(at[20], at[89]);    MULADD(at[21], at[88]);    MULADD(at[22], at[87]);    MULADD(at[23], at[86]);    MULADD(at[24], at[85]);    MULADD(at[25], at[84]);    MULADD(at[26], at[83]);    MULADD(at[27], at[82]);    MULADD(at[28], at[81]);    MULADD(at[29], at[80]);    MULADD(at[30], at[79]);    MULADD(at[31], at[78]);    MULADD(at[32], at[77]);    MULADD(at[33], at[76]);    MULADD(at[34], at[75]);    MULADD(at[35], at[74]);    MULADD(at[36], at[73]);    MULADD(at[37], at[72]);    MULADD(at[38], at[71]);    MULADD(at[39], at[70]);    MULADD(at[40], at[69]);    MULADD(at[41], at[68]);    MULADD(at[42], at[67]);    MULADD(at[43], at[66]);    MULADD(at[44], at[65]);    MULADD(at[45], at[64]);    MULADD(at[46], at[63]);    MULADD(at[47], at[62]);
3771    COMBA_STORE(C->dp[61]);
3772    /* 62 */
3773    COMBA_FORWARD;
3774    MULADD(at[15], at[95]);    MULADD(at[16], at[94]);    MULADD(at[17], at[93]);    MULADD(at[18], at[92]);    MULADD(at[19], at[91]);    MULADD(at[20], at[90]);    MULADD(at[21], at[89]);    MULADD(at[22], at[88]);    MULADD(at[23], at[87]);    MULADD(at[24], at[86]);    MULADD(at[25], at[85]);    MULADD(at[26], at[84]);    MULADD(at[27], at[83]);    MULADD(at[28], at[82]);    MULADD(at[29], at[81]);    MULADD(at[30], at[80]);    MULADD(at[31], at[79]);    MULADD(at[32], at[78]);    MULADD(at[33], at[77]);    MULADD(at[34], at[76]);    MULADD(at[35], at[75]);    MULADD(at[36], at[74]);    MULADD(at[37], at[73]);    MULADD(at[38], at[72]);    MULADD(at[39], at[71]);    MULADD(at[40], at[70]);    MULADD(at[41], at[69]);    MULADD(at[42], at[68]);    MULADD(at[43], at[67]);    MULADD(at[44], at[66]);    MULADD(at[45], at[65]);    MULADD(at[46], at[64]);    MULADD(at[47], at[63]);
3775    COMBA_STORE(C->dp[62]);
3776    /* 63 */
3777    COMBA_FORWARD;
3778    MULADD(at[16], at[95]);    MULADD(at[17], at[94]);    MULADD(at[18], at[93]);    MULADD(at[19], at[92]);    MULADD(at[20], at[91]);    MULADD(at[21], at[90]);    MULADD(at[22], at[89]);    MULADD(at[23], at[88]);    MULADD(at[24], at[87]);    MULADD(at[25], at[86]);    MULADD(at[26], at[85]);    MULADD(at[27], at[84]);    MULADD(at[28], at[83]);    MULADD(at[29], at[82]);    MULADD(at[30], at[81]);    MULADD(at[31], at[80]);    MULADD(at[32], at[79]);    MULADD(at[33], at[78]);    MULADD(at[34], at[77]);    MULADD(at[35], at[76]);    MULADD(at[36], at[75]);    MULADD(at[37], at[74]);    MULADD(at[38], at[73]);    MULADD(at[39], at[72]);    MULADD(at[40], at[71]);    MULADD(at[41], at[70]);    MULADD(at[42], at[69]);    MULADD(at[43], at[68]);    MULADD(at[44], at[67]);    MULADD(at[45], at[66]);    MULADD(at[46], at[65]);    MULADD(at[47], at[64]);
3779    COMBA_STORE(C->dp[63]);
3780    /* 64 */
3781    COMBA_FORWARD;
3782    MULADD(at[17], at[95]);    MULADD(at[18], at[94]);    MULADD(at[19], at[93]);    MULADD(at[20], at[92]);    MULADD(at[21], at[91]);    MULADD(at[22], at[90]);    MULADD(at[23], at[89]);    MULADD(at[24], at[88]);    MULADD(at[25], at[87]);    MULADD(at[26], at[86]);    MULADD(at[27], at[85]);    MULADD(at[28], at[84]);    MULADD(at[29], at[83]);    MULADD(at[30], at[82]);    MULADD(at[31], at[81]);    MULADD(at[32], at[80]);    MULADD(at[33], at[79]);    MULADD(at[34], at[78]);    MULADD(at[35], at[77]);    MULADD(at[36], at[76]);    MULADD(at[37], at[75]);    MULADD(at[38], at[74]);    MULADD(at[39], at[73]);    MULADD(at[40], at[72]);    MULADD(at[41], at[71]);    MULADD(at[42], at[70]);    MULADD(at[43], at[69]);    MULADD(at[44], at[68]);    MULADD(at[45], at[67]);    MULADD(at[46], at[66]);    MULADD(at[47], at[65]);
3783    COMBA_STORE(C->dp[64]);
3784    /* 65 */
3785    COMBA_FORWARD;
3786    MULADD(at[18], at[95]);    MULADD(at[19], at[94]);    MULADD(at[20], at[93]);    MULADD(at[21], at[92]);    MULADD(at[22], at[91]);    MULADD(at[23], at[90]);    MULADD(at[24], at[89]);    MULADD(at[25], at[88]);    MULADD(at[26], at[87]);    MULADD(at[27], at[86]);    MULADD(at[28], at[85]);    MULADD(at[29], at[84]);    MULADD(at[30], at[83]);    MULADD(at[31], at[82]);    MULADD(at[32], at[81]);    MULADD(at[33], at[80]);    MULADD(at[34], at[79]);    MULADD(at[35], at[78]);    MULADD(at[36], at[77]);    MULADD(at[37], at[76]);    MULADD(at[38], at[75]);    MULADD(at[39], at[74]);    MULADD(at[40], at[73]);    MULADD(at[41], at[72]);    MULADD(at[42], at[71]);    MULADD(at[43], at[70]);    MULADD(at[44], at[69]);    MULADD(at[45], at[68]);    MULADD(at[46], at[67]);    MULADD(at[47], at[66]);
3787    COMBA_STORE(C->dp[65]);
3788    /* 66 */
3789    COMBA_FORWARD;
3790    MULADD(at[19], at[95]);    MULADD(at[20], at[94]);    MULADD(at[21], at[93]);    MULADD(at[22], at[92]);    MULADD(at[23], at[91]);    MULADD(at[24], at[90]);    MULADD(at[25], at[89]);    MULADD(at[26], at[88]);    MULADD(at[27], at[87]);    MULADD(at[28], at[86]);    MULADD(at[29], at[85]);    MULADD(at[30], at[84]);    MULADD(at[31], at[83]);    MULADD(at[32], at[82]);    MULADD(at[33], at[81]);    MULADD(at[34], at[80]);    MULADD(at[35], at[79]);    MULADD(at[36], at[78]);    MULADD(at[37], at[77]);    MULADD(at[38], at[76]);    MULADD(at[39], at[75]);    MULADD(at[40], at[74]);    MULADD(at[41], at[73]);    MULADD(at[42], at[72]);    MULADD(at[43], at[71]);    MULADD(at[44], at[70]);    MULADD(at[45], at[69]);    MULADD(at[46], at[68]);    MULADD(at[47], at[67]);
3791    COMBA_STORE(C->dp[66]);
3792    /* 67 */
3793    COMBA_FORWARD;
3794    MULADD(at[20], at[95]);    MULADD(at[21], at[94]);    MULADD(at[22], at[93]);    MULADD(at[23], at[92]);    MULADD(at[24], at[91]);    MULADD(at[25], at[90]);    MULADD(at[26], at[89]);    MULADD(at[27], at[88]);    MULADD(at[28], at[87]);    MULADD(at[29], at[86]);    MULADD(at[30], at[85]);    MULADD(at[31], at[84]);    MULADD(at[32], at[83]);    MULADD(at[33], at[82]);    MULADD(at[34], at[81]);    MULADD(at[35], at[80]);    MULADD(at[36], at[79]);    MULADD(at[37], at[78]);    MULADD(at[38], at[77]);    MULADD(at[39], at[76]);    MULADD(at[40], at[75]);    MULADD(at[41], at[74]);    MULADD(at[42], at[73]);    MULADD(at[43], at[72]);    MULADD(at[44], at[71]);    MULADD(at[45], at[70]);    MULADD(at[46], at[69]);    MULADD(at[47], at[68]);
3795    COMBA_STORE(C->dp[67]);
3796    /* 68 */
3797    COMBA_FORWARD;
3798    MULADD(at[21], at[95]);    MULADD(at[22], at[94]);    MULADD(at[23], at[93]);    MULADD(at[24], at[92]);    MULADD(at[25], at[91]);    MULADD(at[26], at[90]);    MULADD(at[27], at[89]);    MULADD(at[28], at[88]);    MULADD(at[29], at[87]);    MULADD(at[30], at[86]);    MULADD(at[31], at[85]);    MULADD(at[32], at[84]);    MULADD(at[33], at[83]);    MULADD(at[34], at[82]);    MULADD(at[35], at[81]);    MULADD(at[36], at[80]);    MULADD(at[37], at[79]);    MULADD(at[38], at[78]);    MULADD(at[39], at[77]);    MULADD(at[40], at[76]);    MULADD(at[41], at[75]);    MULADD(at[42], at[74]);    MULADD(at[43], at[73]);    MULADD(at[44], at[72]);    MULADD(at[45], at[71]);    MULADD(at[46], at[70]);    MULADD(at[47], at[69]);
3799    COMBA_STORE(C->dp[68]);
3800    /* 69 */
3801    COMBA_FORWARD;
3802    MULADD(at[22], at[95]);    MULADD(at[23], at[94]);    MULADD(at[24], at[93]);    MULADD(at[25], at[92]);    MULADD(at[26], at[91]);    MULADD(at[27], at[90]);    MULADD(at[28], at[89]);    MULADD(at[29], at[88]);    MULADD(at[30], at[87]);    MULADD(at[31], at[86]);    MULADD(at[32], at[85]);    MULADD(at[33], at[84]);    MULADD(at[34], at[83]);    MULADD(at[35], at[82]);    MULADD(at[36], at[81]);    MULADD(at[37], at[80]);    MULADD(at[38], at[79]);    MULADD(at[39], at[78]);    MULADD(at[40], at[77]);    MULADD(at[41], at[76]);    MULADD(at[42], at[75]);    MULADD(at[43], at[74]);    MULADD(at[44], at[73]);    MULADD(at[45], at[72]);    MULADD(at[46], at[71]);    MULADD(at[47], at[70]);
3803    COMBA_STORE(C->dp[69]);
3804    /* 70 */
3805    COMBA_FORWARD;
3806    MULADD(at[23], at[95]);    MULADD(at[24], at[94]);    MULADD(at[25], at[93]);    MULADD(at[26], at[92]);    MULADD(at[27], at[91]);    MULADD(at[28], at[90]);    MULADD(at[29], at[89]);    MULADD(at[30], at[88]);    MULADD(at[31], at[87]);    MULADD(at[32], at[86]);    MULADD(at[33], at[85]);    MULADD(at[34], at[84]);    MULADD(at[35], at[83]);    MULADD(at[36], at[82]);    MULADD(at[37], at[81]);    MULADD(at[38], at[80]);    MULADD(at[39], at[79]);    MULADD(at[40], at[78]);    MULADD(at[41], at[77]);    MULADD(at[42], at[76]);    MULADD(at[43], at[75]);    MULADD(at[44], at[74]);    MULADD(at[45], at[73]);    MULADD(at[46], at[72]);    MULADD(at[47], at[71]);
3807    COMBA_STORE(C->dp[70]);
3808    /* 71 */
3809    COMBA_FORWARD;
3810    MULADD(at[24], at[95]);    MULADD(at[25], at[94]);    MULADD(at[26], at[93]);    MULADD(at[27], at[92]);    MULADD(at[28], at[91]);    MULADD(at[29], at[90]);    MULADD(at[30], at[89]);    MULADD(at[31], at[88]);    MULADD(at[32], at[87]);    MULADD(at[33], at[86]);    MULADD(at[34], at[85]);    MULADD(at[35], at[84]);    MULADD(at[36], at[83]);    MULADD(at[37], at[82]);    MULADD(at[38], at[81]);    MULADD(at[39], at[80]);    MULADD(at[40], at[79]);    MULADD(at[41], at[78]);    MULADD(at[42], at[77]);    MULADD(at[43], at[76]);    MULADD(at[44], at[75]);    MULADD(at[45], at[74]);    MULADD(at[46], at[73]);    MULADD(at[47], at[72]);
3811    COMBA_STORE(C->dp[71]);
3812    /* 72 */
3813    COMBA_FORWARD;
3814    MULADD(at[25], at[95]);    MULADD(at[26], at[94]);    MULADD(at[27], at[93]);    MULADD(at[28], at[92]);    MULADD(at[29], at[91]);    MULADD(at[30], at[90]);    MULADD(at[31], at[89]);    MULADD(at[32], at[88]);    MULADD(at[33], at[87]);    MULADD(at[34], at[86]);    MULADD(at[35], at[85]);    MULADD(at[36], at[84]);    MULADD(at[37], at[83]);    MULADD(at[38], at[82]);    MULADD(at[39], at[81]);    MULADD(at[40], at[80]);    MULADD(at[41], at[79]);    MULADD(at[42], at[78]);    MULADD(at[43], at[77]);    MULADD(at[44], at[76]);    MULADD(at[45], at[75]);    MULADD(at[46], at[74]);    MULADD(at[47], at[73]);
3815    COMBA_STORE(C->dp[72]);
3816    /* 73 */
3817    COMBA_FORWARD;
3818    MULADD(at[26], at[95]);    MULADD(at[27], at[94]);    MULADD(at[28], at[93]);    MULADD(at[29], at[92]);    MULADD(at[30], at[91]);    MULADD(at[31], at[90]);    MULADD(at[32], at[89]);    MULADD(at[33], at[88]);    MULADD(at[34], at[87]);    MULADD(at[35], at[86]);    MULADD(at[36], at[85]);    MULADD(at[37], at[84]);    MULADD(at[38], at[83]);    MULADD(at[39], at[82]);    MULADD(at[40], at[81]);    MULADD(at[41], at[80]);    MULADD(at[42], at[79]);    MULADD(at[43], at[78]);    MULADD(at[44], at[77]);    MULADD(at[45], at[76]);    MULADD(at[46], at[75]);    MULADD(at[47], at[74]);
3819    COMBA_STORE(C->dp[73]);
3820    /* 74 */
3821    COMBA_FORWARD;
3822    MULADD(at[27], at[95]);    MULADD(at[28], at[94]);    MULADD(at[29], at[93]);    MULADD(at[30], at[92]);    MULADD(at[31], at[91]);    MULADD(at[32], at[90]);    MULADD(at[33], at[89]);    MULADD(at[34], at[88]);    MULADD(at[35], at[87]);    MULADD(at[36], at[86]);    MULADD(at[37], at[85]);    MULADD(at[38], at[84]);    MULADD(at[39], at[83]);    MULADD(at[40], at[82]);    MULADD(at[41], at[81]);    MULADD(at[42], at[80]);    MULADD(at[43], at[79]);    MULADD(at[44], at[78]);    MULADD(at[45], at[77]);    MULADD(at[46], at[76]);    MULADD(at[47], at[75]);
3823    COMBA_STORE(C->dp[74]);
3824    /* 75 */
3825    COMBA_FORWARD;
3826    MULADD(at[28], at[95]);    MULADD(at[29], at[94]);    MULADD(at[30], at[93]);    MULADD(at[31], at[92]);    MULADD(at[32], at[91]);    MULADD(at[33], at[90]);    MULADD(at[34], at[89]);    MULADD(at[35], at[88]);    MULADD(at[36], at[87]);    MULADD(at[37], at[86]);    MULADD(at[38], at[85]);    MULADD(at[39], at[84]);    MULADD(at[40], at[83]);    MULADD(at[41], at[82]);    MULADD(at[42], at[81]);    MULADD(at[43], at[80]);    MULADD(at[44], at[79]);    MULADD(at[45], at[78]);    MULADD(at[46], at[77]);    MULADD(at[47], at[76]);
3827    COMBA_STORE(C->dp[75]);
3828    /* 76 */
3829    COMBA_FORWARD;
3830    MULADD(at[29], at[95]);    MULADD(at[30], at[94]);    MULADD(at[31], at[93]);    MULADD(at[32], at[92]);    MULADD(at[33], at[91]);    MULADD(at[34], at[90]);    MULADD(at[35], at[89]);    MULADD(at[36], at[88]);    MULADD(at[37], at[87]);    MULADD(at[38], at[86]);    MULADD(at[39], at[85]);    MULADD(at[40], at[84]);    MULADD(at[41], at[83]);    MULADD(at[42], at[82]);    MULADD(at[43], at[81]);    MULADD(at[44], at[80]);    MULADD(at[45], at[79]);    MULADD(at[46], at[78]);    MULADD(at[47], at[77]);
3831    COMBA_STORE(C->dp[76]);
3832    /* 77 */
3833    COMBA_FORWARD;
3834    MULADD(at[30], at[95]);    MULADD(at[31], at[94]);    MULADD(at[32], at[93]);    MULADD(at[33], at[92]);    MULADD(at[34], at[91]);    MULADD(at[35], at[90]);    MULADD(at[36], at[89]);    MULADD(at[37], at[88]);    MULADD(at[38], at[87]);    MULADD(at[39], at[86]);    MULADD(at[40], at[85]);    MULADD(at[41], at[84]);    MULADD(at[42], at[83]);    MULADD(at[43], at[82]);    MULADD(at[44], at[81]);    MULADD(at[45], at[80]);    MULADD(at[46], at[79]);    MULADD(at[47], at[78]);
3835    COMBA_STORE(C->dp[77]);
3836    /* 78 */
3837    COMBA_FORWARD;
3838    MULADD(at[31], at[95]);    MULADD(at[32], at[94]);    MULADD(at[33], at[93]);    MULADD(at[34], at[92]);    MULADD(at[35], at[91]);    MULADD(at[36], at[90]);    MULADD(at[37], at[89]);    MULADD(at[38], at[88]);    MULADD(at[39], at[87]);    MULADD(at[40], at[86]);    MULADD(at[41], at[85]);    MULADD(at[42], at[84]);    MULADD(at[43], at[83]);    MULADD(at[44], at[82]);    MULADD(at[45], at[81]);    MULADD(at[46], at[80]);    MULADD(at[47], at[79]);
3839    COMBA_STORE(C->dp[78]);
3840    /* 79 */
3841    COMBA_FORWARD;
3842    MULADD(at[32], at[95]);    MULADD(at[33], at[94]);    MULADD(at[34], at[93]);    MULADD(at[35], at[92]);    MULADD(at[36], at[91]);    MULADD(at[37], at[90]);    MULADD(at[38], at[89]);    MULADD(at[39], at[88]);    MULADD(at[40], at[87]);    MULADD(at[41], at[86]);    MULADD(at[42], at[85]);    MULADD(at[43], at[84]);    MULADD(at[44], at[83]);    MULADD(at[45], at[82]);    MULADD(at[46], at[81]);    MULADD(at[47], at[80]);
3843    COMBA_STORE(C->dp[79]);
3844    /* 80 */
3845    COMBA_FORWARD;
3846    MULADD(at[33], at[95]);    MULADD(at[34], at[94]);    MULADD(at[35], at[93]);    MULADD(at[36], at[92]);    MULADD(at[37], at[91]);    MULADD(at[38], at[90]);    MULADD(at[39], at[89]);    MULADD(at[40], at[88]);    MULADD(at[41], at[87]);    MULADD(at[42], at[86]);    MULADD(at[43], at[85]);    MULADD(at[44], at[84]);    MULADD(at[45], at[83]);    MULADD(at[46], at[82]);    MULADD(at[47], at[81]);
3847    COMBA_STORE(C->dp[80]);
3848    /* 81 */
3849    COMBA_FORWARD;
3850    MULADD(at[34], at[95]);    MULADD(at[35], at[94]);    MULADD(at[36], at[93]);    MULADD(at[37], at[92]);    MULADD(at[38], at[91]);    MULADD(at[39], at[90]);    MULADD(at[40], at[89]);    MULADD(at[41], at[88]);    MULADD(at[42], at[87]);    MULADD(at[43], at[86]);    MULADD(at[44], at[85]);    MULADD(at[45], at[84]);    MULADD(at[46], at[83]);    MULADD(at[47], at[82]);
3851    COMBA_STORE(C->dp[81]);
3852    /* 82 */
3853    COMBA_FORWARD;
3854    MULADD(at[35], at[95]);    MULADD(at[36], at[94]);    MULADD(at[37], at[93]);    MULADD(at[38], at[92]);    MULADD(at[39], at[91]);    MULADD(at[40], at[90]);    MULADD(at[41], at[89]);    MULADD(at[42], at[88]);    MULADD(at[43], at[87]);    MULADD(at[44], at[86]);    MULADD(at[45], at[85]);    MULADD(at[46], at[84]);    MULADD(at[47], at[83]);
3855    COMBA_STORE(C->dp[82]);
3856    /* 83 */
3857    COMBA_FORWARD;
3858    MULADD(at[36], at[95]);    MULADD(at[37], at[94]);    MULADD(at[38], at[93]);    MULADD(at[39], at[92]);    MULADD(at[40], at[91]);    MULADD(at[41], at[90]);    MULADD(at[42], at[89]);    MULADD(at[43], at[88]);    MULADD(at[44], at[87]);    MULADD(at[45], at[86]);    MULADD(at[46], at[85]);    MULADD(at[47], at[84]);
3859    COMBA_STORE(C->dp[83]);
3860    /* 84 */
3861    COMBA_FORWARD;
3862    MULADD(at[37], at[95]);    MULADD(at[38], at[94]);    MULADD(at[39], at[93]);    MULADD(at[40], at[92]);    MULADD(at[41], at[91]);    MULADD(at[42], at[90]);    MULADD(at[43], at[89]);    MULADD(at[44], at[88]);    MULADD(at[45], at[87]);    MULADD(at[46], at[86]);    MULADD(at[47], at[85]);
3863    COMBA_STORE(C->dp[84]);
3864    /* 85 */
3865    COMBA_FORWARD;
3866    MULADD(at[38], at[95]);    MULADD(at[39], at[94]);    MULADD(at[40], at[93]);    MULADD(at[41], at[92]);    MULADD(at[42], at[91]);    MULADD(at[43], at[90]);    MULADD(at[44], at[89]);    MULADD(at[45], at[88]);    MULADD(at[46], at[87]);    MULADD(at[47], at[86]);
3867    COMBA_STORE(C->dp[85]);
3868    /* 86 */
3869    COMBA_FORWARD;
3870    MULADD(at[39], at[95]);    MULADD(at[40], at[94]);    MULADD(at[41], at[93]);    MULADD(at[42], at[92]);    MULADD(at[43], at[91]);    MULADD(at[44], at[90]);    MULADD(at[45], at[89]);    MULADD(at[46], at[88]);    MULADD(at[47], at[87]);
3871    COMBA_STORE(C->dp[86]);
3872    /* 87 */
3873    COMBA_FORWARD;
3874    MULADD(at[40], at[95]);    MULADD(at[41], at[94]);    MULADD(at[42], at[93]);    MULADD(at[43], at[92]);    MULADD(at[44], at[91]);    MULADD(at[45], at[90]);    MULADD(at[46], at[89]);    MULADD(at[47], at[88]);
3875    COMBA_STORE(C->dp[87]);
3876    /* 88 */
3877    COMBA_FORWARD;
3878    MULADD(at[41], at[95]);    MULADD(at[42], at[94]);    MULADD(at[43], at[93]);    MULADD(at[44], at[92]);    MULADD(at[45], at[91]);    MULADD(at[46], at[90]);    MULADD(at[47], at[89]);
3879    COMBA_STORE(C->dp[88]);
3880    /* 89 */
3881    COMBA_FORWARD;
3882    MULADD(at[42], at[95]);    MULADD(at[43], at[94]);    MULADD(at[44], at[93]);    MULADD(at[45], at[92]);    MULADD(at[46], at[91]);    MULADD(at[47], at[90]);
3883    COMBA_STORE(C->dp[89]);
3884    /* 90 */
3885    COMBA_FORWARD;
3886    MULADD(at[43], at[95]);    MULADD(at[44], at[94]);    MULADD(at[45], at[93]);    MULADD(at[46], at[92]);    MULADD(at[47], at[91]);
3887    COMBA_STORE(C->dp[90]);
3888    /* 91 */
3889    COMBA_FORWARD;
3890    MULADD(at[44], at[95]);    MULADD(at[45], at[94]);    MULADD(at[46], at[93]);    MULADD(at[47], at[92]);
3891    COMBA_STORE(C->dp[91]);
3892    /* 92 */
3893    COMBA_FORWARD;
3894    MULADD(at[45], at[95]);    MULADD(at[46], at[94]);    MULADD(at[47], at[93]);
3895    COMBA_STORE(C->dp[92]);
3896    /* 93 */
3897    COMBA_FORWARD;
3898    MULADD(at[46], at[95]);    MULADD(at[47], at[94]);
3899    COMBA_STORE(C->dp[93]);
3900    /* 94 */
3901    COMBA_FORWARD;
3902    MULADD(at[47], at[95]);
3903    COMBA_STORE(C->dp[94]);
3904    COMBA_STORE2(C->dp[95]);
3905    C->used = 96;
3906    C->sign = A->sign ^ B->sign;
3907    tfm_fp_clamp(C);
3908    COMBA_FINI;
3909 }
3910 #endif
3911
3912 #define TFM_DEFINES
3913
3914 #ifdef TFM_MUL64
3915 void tfm_fp_mul_comba64(tfm_fp_int *A, tfm_fp_int *B, tfm_fp_int *C)
3916 {
3917    tfm_fp_digit c0, c1, c2, at[128];
3918
3919    SILC_LOG_DEBUG(("Start"));
3920    memcpy(at, A->dp, 64 * sizeof(tfm_fp_digit));
3921    memcpy(at+64, B->dp, 64 * sizeof(tfm_fp_digit));
3922    COMBA_START;
3923
3924    COMBA_CLEAR;
3925    /* 0 */
3926    MULADD(at[0], at[64]);
3927    COMBA_STORE(C->dp[0]);
3928    /* 1 */
3929    COMBA_FORWARD;
3930    MULADD(at[0], at[65]);    MULADD(at[1], at[64]);
3931    COMBA_STORE(C->dp[1]);
3932    /* 2 */
3933    COMBA_FORWARD;
3934    MULADD(at[0], at[66]);    MULADD(at[1], at[65]);    MULADD(at[2], at[64]);
3935    COMBA_STORE(C->dp[2]);
3936    /* 3 */
3937    COMBA_FORWARD;
3938    MULADD(at[0], at[67]);    MULADD(at[1], at[66]);    MULADD(at[2], at[65]);    MULADD(at[3], at[64]);
3939    COMBA_STORE(C->dp[3]);
3940    /* 4 */
3941    COMBA_FORWARD;
3942    MULADD(at[0], at[68]);    MULADD(at[1], at[67]);    MULADD(at[2], at[66]);    MULADD(at[3], at[65]);    MULADD(at[4], at[64]);
3943    COMBA_STORE(C->dp[4]);
3944    /* 5 */
3945    COMBA_FORWARD;
3946    MULADD(at[0], at[69]);    MULADD(at[1], at[68]);    MULADD(at[2], at[67]);    MULADD(at[3], at[66]);    MULADD(at[4], at[65]);    MULADD(at[5], at[64]);
3947    COMBA_STORE(C->dp[5]);
3948    /* 6 */
3949    COMBA_FORWARD;
3950    MULADD(at[0], at[70]);    MULADD(at[1], at[69]);    MULADD(at[2], at[68]);    MULADD(at[3], at[67]);    MULADD(at[4], at[66]);    MULADD(at[5], at[65]);    MULADD(at[6], at[64]);
3951    COMBA_STORE(C->dp[6]);
3952    /* 7 */
3953    COMBA_FORWARD;
3954    MULADD(at[0], at[71]);    MULADD(at[1], at[70]);    MULADD(at[2], at[69]);    MULADD(at[3], at[68]);    MULADD(at[4], at[67]);    MULADD(at[5], at[66]);    MULADD(at[6], at[65]);    MULADD(at[7], at[64]);
3955    COMBA_STORE(C->dp[7]);
3956    /* 8 */
3957    COMBA_FORWARD;
3958    MULADD(at[0], at[72]);    MULADD(at[1], at[71]);    MULADD(at[2], at[70]);    MULADD(at[3], at[69]);    MULADD(at[4], at[68]);    MULADD(at[5], at[67]);    MULADD(at[6], at[66]);    MULADD(at[7], at[65]);    MULADD(at[8], at[64]);
3959    COMBA_STORE(C->dp[8]);
3960    /* 9 */
3961    COMBA_FORWARD;
3962    MULADD(at[0], at[73]);    MULADD(at[1], at[72]);    MULADD(at[2], at[71]);    MULADD(at[3], at[70]);    MULADD(at[4], at[69]);    MULADD(at[5], at[68]);    MULADD(at[6], at[67]);    MULADD(at[7], at[66]);    MULADD(at[8], at[65]);    MULADD(at[9], at[64]);
3963    COMBA_STORE(C->dp[9]);
3964    /* 10 */
3965    COMBA_FORWARD;
3966    MULADD(at[0], at[74]);    MULADD(at[1], at[73]);    MULADD(at[2], at[72]);    MULADD(at[3], at[71]);    MULADD(at[4], at[70]);    MULADD(at[5], at[69]);    MULADD(at[6], at[68]);    MULADD(at[7], at[67]);    MULADD(at[8], at[66]);    MULADD(at[9], at[65]);    MULADD(at[10], at[64]);
3967    COMBA_STORE(C->dp[10]);
3968    /* 11 */
3969    COMBA_FORWARD;
3970    MULADD(at[0], at[75]);    MULADD(at[1], at[74]);    MULADD(at[2], at[73]);    MULADD(at[3], at[72]);    MULADD(at[4], at[71]);    MULADD(at[5], at[70]);    MULADD(at[6], at[69]);    MULADD(at[7], at[68]);    MULADD(at[8], at[67]);    MULADD(at[9], at[66]);    MULADD(at[10], at[65]);    MULADD(at[11], at[64]);
3971    COMBA_STORE(C->dp[11]);
3972    /* 12 */
3973    COMBA_FORWARD;
3974    MULADD(at[0], at[76]);    MULADD(at[1], at[75]);    MULADD(at[2], at[74]);    MULADD(at[3], at[73]);    MULADD(at[4], at[72]);    MULADD(at[5], at[71]);    MULADD(at[6], at[70]);    MULADD(at[7], at[69]);    MULADD(at[8], at[68]);    MULADD(at[9], at[67]);    MULADD(at[10], at[66]);    MULADD(at[11], at[65]);    MULADD(at[12], at[64]);
3975    COMBA_STORE(C->dp[12]);
3976    /* 13 */
3977    COMBA_FORWARD;
3978    MULADD(at[0], at[77]);    MULADD(at[1], at[76]);    MULADD(at[2], at[75]);    MULADD(at[3], at[74]);    MULADD(at[4], at[73]);    MULADD(at[5], at[72]);    MULADD(at[6], at[71]);    MULADD(at[7], at[70]);    MULADD(at[8], at[69]);    MULADD(at[9], at[68]);    MULADD(at[10], at[67]);    MULADD(at[11], at[66]);    MULADD(at[12], at[65]);    MULADD(at[13], at[64]);
3979    COMBA_STORE(C->dp[13]);
3980    /* 14 */
3981    COMBA_FORWARD;
3982    MULADD(at[0], at[78]);    MULADD(at[1], at[77]);    MULADD(at[2], at[76]);    MULADD(at[3], at[75]);    MULADD(at[4], at[74]);    MULADD(at[5], at[73]);    MULADD(at[6], at[72]);    MULADD(at[7], at[71]);    MULADD(at[8], at[70]);    MULADD(at[9], at[69]);    MULADD(at[10], at[68]);    MULADD(at[11], at[67]);    MULADD(at[12], at[66]);    MULADD(at[13], at[65]);    MULADD(at[14], at[64]);
3983    COMBA_STORE(C->dp[14]);
3984    /* 15 */
3985    COMBA_FORWARD;
3986    MULADD(at[0], at[79]);    MULADD(at[1], at[78]);    MULADD(at[2], at[77]);    MULADD(at[3], at[76]);    MULADD(at[4], at[75]);    MULADD(at[5], at[74]);    MULADD(at[6], at[73]);    MULADD(at[7], at[72]);    MULADD(at[8], at[71]);    MULADD(at[9], at[70]);    MULADD(at[10], at[69]);    MULADD(at[11], at[68]);    MULADD(at[12], at[67]);    MULADD(at[13], at[66]);    MULADD(at[14], at[65]);    MULADD(at[15], at[64]);
3987    COMBA_STORE(C->dp[15]);
3988    /* 16 */
3989    COMBA_FORWARD;
3990    MULADD(at[0], at[80]);    MULADD(at[1], at[79]);    MULADD(at[2], at[78]);    MULADD(at[3], at[77]);    MULADD(at[4], at[76]);    MULADD(at[5], at[75]);    MULADD(at[6], at[74]);    MULADD(at[7], at[73]);    MULADD(at[8], at[72]);    MULADD(at[9], at[71]);    MULADD(at[10], at[70]);    MULADD(at[11], at[69]);    MULADD(at[12], at[68]);    MULADD(at[13], at[67]);    MULADD(at[14], at[66]);    MULADD(at[15], at[65]);    MULADD(at[16], at[64]);
3991    COMBA_STORE(C->dp[16]);
3992    /* 17 */
3993    COMBA_FORWARD;
3994    MULADD(at[0], at[81]);    MULADD(at[1], at[80]);    MULADD(at[2], at[79]);    MULADD(at[3], at[78]);    MULADD(at[4], at[77]);    MULADD(at[5], at[76]);    MULADD(at[6], at[75]);    MULADD(at[7], at[74]);    MULADD(at[8], at[73]);    MULADD(at[9], at[72]);    MULADD(at[10], at[71]);    MULADD(at[11], at[70]);    MULADD(at[12], at[69]);    MULADD(at[13], at[68]);    MULADD(at[14], at[67]);    MULADD(at[15], at[66]);    MULADD(at[16], at[65]);    MULADD(at[17], at[64]);
3995    COMBA_STORE(C->dp[17]);
3996    /* 18 */
3997    COMBA_FORWARD;
3998    MULADD(at[0], at[82]);    MULADD(at[1], at[81]);    MULADD(at[2], at[80]);    MULADD(at[3], at[79]);    MULADD(at[4], at[78]);    MULADD(at[5], at[77]);    MULADD(at[6], at[76]);    MULADD(at[7], at[75]);    MULADD(at[8], at[74]);    MULADD(at[9], at[73]);    MULADD(at[10], at[72]);    MULADD(at[11], at[71]);    MULADD(at[12], at[70]);    MULADD(at[13], at[69]);    MULADD(at[14], at[68]);    MULADD(at[15], at[67]);    MULADD(at[16], at[66]);    MULADD(at[17], at[65]);    MULADD(at[18], at[64]);
3999    COMBA_STORE(C->dp[18]);
4000    /* 19 */
4001    COMBA_FORWARD;
4002    MULADD(at[0], at[83]);    MULADD(at[1], at[82]);    MULADD(at[2], at[81]);    MULADD(at[3], at[80]);    MULADD(at[4], at[79]);    MULADD(at[5], at[78]);    MULADD(at[6], at[77]);    MULADD(at[7], at[76]);    MULADD(at[8], at[75]);    MULADD(at[9], at[74]);    MULADD(at[10], at[73]);    MULADD(at[11], at[72]);    MULADD(at[12], at[71]);    MULADD(at[13], at[70]);    MULADD(at[14], at[69]);    MULADD(at[15], at[68]);    MULADD(at[16], at[67]);    MULADD(at[17], at[66]);    MULADD(at[18], at[65]);    MULADD(at[19], at[64]);
4003    COMBA_STORE(C->dp[19]);
4004    /* 20 */
4005    COMBA_FORWARD;
4006    MULADD(at[0], at[84]);    MULADD(at[1], at[83]);    MULADD(at[2], at[82]);    MULADD(at[3], at[81]);    MULADD(at[4], at[80]);    MULADD(at[5], at[79]);    MULADD(at[6], at[78]);    MULADD(at[7], at[77]);    MULADD(at[8], at[76]);    MULADD(at[9], at[75]);    MULADD(at[10], at[74]);    MULADD(at[11], at[73]);    MULADD(at[12], at[72]);    MULADD(at[13], at[71]);    MULADD(at[14], at[70]);    MULADD(at[15], at[69]);    MULADD(at[16], at[68]);    MULADD(at[17], at[67]);    MULADD(at[18], at[66]);    MULADD(at[19], at[65]);    MULADD(at[20], at[64]);
4007    COMBA_STORE(C->dp[20]);
4008    /* 21 */
4009    COMBA_FORWARD;
4010    MULADD(at[0], at[85]);    MULADD(at[1], at[84]);    MULADD(at[2], at[83]);    MULADD(at[3], at[82]);    MULADD(at[4], at[81]);    MULADD(at[5], at[80]);    MULADD(at[6], at[79]);    MULADD(at[7], at[78]);    MULADD(at[8], at[77]);    MULADD(at[9], at[76]);    MULADD(at[10], at[75]);    MULADD(at[11], at[74]);    MULADD(at[12], at[73]);    MULADD(at[13], at[72]);    MULADD(at[14], at[71]);    MULADD(at[15], at[70]);    MULADD(at[16], at[69]);    MULADD(at[17], at[68]);    MULADD(at[18], at[67]);    MULADD(at[19], at[66]);    MULADD(at[20], at[65]);    MULADD(at[21], at[64]);
4011    COMBA_STORE(C->dp[21]);
4012    /* 22 */
4013    COMBA_FORWARD;
4014    MULADD(at[0], at[86]);    MULADD(at[1], at[85]);    MULADD(at[2], at[84]);    MULADD(at[3], at[83]);    MULADD(at[4], at[82]);    MULADD(at[5], at[81]);    MULADD(at[6], at[80]);    MULADD(at[7], at[79]);    MULADD(at[8], at[78]);    MULADD(at[9], at[77]);    MULADD(at[10], at[76]);    MULADD(at[11], at[75]);    MULADD(at[12], at[74]);    MULADD(at[13], at[73]);    MULADD(at[14], at[72]);    MULADD(at[15], at[71]);    MULADD(at[16], at[70]);    MULADD(at[17], at[69]);    MULADD(at[18], at[68]);    MULADD(at[19], at[67]);    MULADD(at[20], at[66]);    MULADD(at[21], at[65]);    MULADD(at[22], at[64]);
4015    COMBA_STORE(C->dp[22]);
4016    /* 23 */
4017    COMBA_FORWARD;
4018    MULADD(at[0], at[87]);    MULADD(at[1], at[86]);    MULADD(at[2], at[85]);    MULADD(at[3], at[84]);    MULADD(at[4], at[83]);    MULADD(at[5], at[82]);    MULADD(at[6], at[81]);    MULADD(at[7], at[80]);    MULADD(at[8], at[79]);    MULADD(at[9], at[78]);    MULADD(at[10], at[77]);    MULADD(at[11], at[76]);    MULADD(at[12], at[75]);    MULADD(at[13], at[74]);    MULADD(at[14], at[73]);    MULADD(at[15], at[72]);    MULADD(at[16], at[71]);    MULADD(at[17], at[70]);    MULADD(at[18], at[69]);    MULADD(at[19], at[68]);    MULADD(at[20], at[67]);    MULADD(at[21], at[66]);    MULADD(at[22], at[65]);    MULADD(at[23], at[64]);
4019    COMBA_STORE(C->dp[23]);
4020    /* 24 */
4021    COMBA_FORWARD;
4022    MULADD(at[0], at[88]);    MULADD(at[1], at[87]);    MULADD(at[2], at[86]);    MULADD(at[3], at[85]);    MULADD(at[4], at[84]);    MULADD(at[5], at[83]);    MULADD(at[6], at[82]);    MULADD(at[7], at[81]);    MULADD(at[8], at[80]);    MULADD(at[9], at[79]);    MULADD(at[10], at[78]);    MULADD(at[11], at[77]);    MULADD(at[12], at[76]);    MULADD(at[13], at[75]);    MULADD(at[14], at[74]);    MULADD(at[15], at[73]);    MULADD(at[16], at[72]);    MULADD(at[17], at[71]);    MULADD(at[18], at[70]);    MULADD(at[19], at[69]);    MULADD(at[20], at[68]);    MULADD(at[21], at[67]);    MULADD(at[22], at[66]);    MULADD(at[23], at[65]);    MULADD(at[24], at[64]);
4023    COMBA_STORE(C->dp[24]);
4024    /* 25 */
4025    COMBA_FORWARD;
4026    MULADD(at[0], at[89]);    MULADD(at[1], at[88]);    MULADD(at[2], at[87]);    MULADD(at[3], at[86]);    MULADD(at[4], at[85]);    MULADD(at[5], at[84]);    MULADD(at[6], at[83]);    MULADD(at[7], at[82]);    MULADD(at[8], at[81]);    MULADD(at[9], at[80]);    MULADD(at[10], at[79]);    MULADD(at[11], at[78]);    MULADD(at[12], at[77]);    MULADD(at[13], at[76]);    MULADD(at[14], at[75]);    MULADD(at[15], at[74]);    MULADD(at[16], at[73]);    MULADD(at[17], at[72]);    MULADD(at[18], at[71]);    MULADD(at[19], at[70]);    MULADD(at[20], at[69]);    MULADD(at[21], at[68]);    MULADD(at[22], at[67]);    MULADD(at[23], at[66]);    MULADD(at[24], at[65]);    MULADD(at[25], at[64]);
4027    COMBA_STORE(C->dp[25]);
4028    /* 26 */
4029    COMBA_FORWARD;
4030    MULADD(at[0], at[90]);    MULADD(at[1], at[89]);    MULADD(at[2], at[88]);    MULADD(at[3], at[87]);    MULADD(at[4], at[86]);    MULADD(at[5], at[85]);    MULADD(at[6], at[84]);    MULADD(at[7], at[83]);    MULADD(at[8], at[82]);    MULADD(at[9], at[81]);    MULADD(at[10], at[80]);    MULADD(at[11], at[79]);    MULADD(at[12], at[78]);    MULADD(at[13], at[77]);    MULADD(at[14], at[76]);    MULADD(at[15], at[75]);    MULADD(at[16], at[74]);    MULADD(at[17], at[73]);    MULADD(at[18], at[72]);    MULADD(at[19], at[71]);    MULADD(at[20], at[70]);    MULADD(at[21], at[69]);    MULADD(at[22], at[68]);    MULADD(at[23], at[67]);    MULADD(at[24], at[66]);    MULADD(at[25], at[65]);    MULADD(at[26], at[64]);
4031    COMBA_STORE(C->dp[26]);
4032    /* 27 */
4033    COMBA_FORWARD;
4034    MULADD(at[0], at[91]);    MULADD(at[1], at[90]);    MULADD(at[2], at[89]);    MULADD(at[3], at[88]);    MULADD(at[4], at[87]);    MULADD(at[5], at[86]);    MULADD(at[6], at[85]);    MULADD(at[7], at[84]);    MULADD(at[8], at[83]);    MULADD(at[9], at[82]);    MULADD(at[10], at[81]);    MULADD(at[11], at[80]);    MULADD(at[12], at[79]);    MULADD(at[13], at[78]);    MULADD(at[14], at[77]);    MULADD(at[15], at[76]);    MULADD(at[16], at[75]);    MULADD(at[17], at[74]);    MULADD(at[18], at[73]);    MULADD(at[19], at[72]);    MULADD(at[20], at[71]);    MULADD(at[21], at[70]);    MULADD(at[22], at[69]);    MULADD(at[23], at[68]);    MULADD(at[24], at[67]);    MULADD(at[25], at[66]);    MULADD(at[26], at[65]);    MULADD(at[27], at[64]);
4035    COMBA_STORE(C->dp[27]);
4036    /* 28 */
4037    COMBA_FORWARD;
4038    MULADD(at[0], at[92]);    MULADD(at[1], at[91]);    MULADD(at[2], at[90]);    MULADD(at[3], at[89]);    MULADD(at[4], at[88]);    MULADD(at[5], at[87]);    MULADD(at[6], at[86]);    MULADD(at[7], at[85]);    MULADD(at[8], at[84]);    MULADD(at[9], at[83]);    MULADD(at[10], at[82]);    MULADD(at[11], at[81]);    MULADD(at[12], at[80]);    MULADD(at[13], at[79]);    MULADD(at[14], at[78]);    MULADD(at[15], at[77]);    MULADD(at[16], at[76]);    MULADD(at[17], at[75]);    MULADD(at[18], at[74]);    MULADD(at[19], at[73]);    MULADD(at[20], at[72]);    MULADD(at[21], at[71]);    MULADD(at[22], at[70]);    MULADD(at[23], at[69]);    MULADD(at[24], at[68]);    MULADD(at[25], at[67]);    MULADD(at[26], at[66]);    MULADD(at[27], at[65]);    MULADD(at[28], at[64]);
4039    COMBA_STORE(C->dp[28]);
4040    /* 29 */
4041    COMBA_FORWARD;
4042    MULADD(at[0], at[93]);    MULADD(at[1], at[92]);    MULADD(at[2], at[91]);    MULADD(at[3], at[90]);    MULADD(at[4], at[89]);    MULADD(at[5], at[88]);    MULADD(at[6], at[87]);    MULADD(at[7], at[86]);    MULADD(at[8], at[85]);    MULADD(at[9], at[84]);    MULADD(at[10], at[83]);    MULADD(at[11], at[82]);    MULADD(at[12], at[81]);    MULADD(at[13], at[80]);    MULADD(at[14], at[79]);    MULADD(at[15], at[78]);    MULADD(at[16], at[77]);    MULADD(at[17], at[76]);    MULADD(at[18], at[75]);    MULADD(at[19], at[74]);    MULADD(at[20], at[73]);    MULADD(at[21], at[72]);    MULADD(at[22], at[71]);    MULADD(at[23], at[70]);    MULADD(at[24], at[69]);    MULADD(at[25], at[68]);    MULADD(at[26], at[67]);    MULADD(at[27], at[66]);    MULADD(at[28], at[65]);    MULADD(at[29], at[64]);
4043    COMBA_STORE(C->dp[29]);
4044    /* 30 */
4045    COMBA_FORWARD;
4046    MULADD(at[0], at[94]);    MULADD(at[1], at[93]);    MULADD(at[2], at[92]);    MULADD(at[3], at[91]);    MULADD(at[4], at[90]);    MULADD(at[5], at[89]);    MULADD(at[6], at[88]);    MULADD(at[7], at[87]);    MULADD(at[8], at[86]);    MULADD(at[9], at[85]);    MULADD(at[10], at[84]);    MULADD(at[11], at[83]);    MULADD(at[12], at[82]);    MULADD(at[13], at[81]);    MULADD(at[14], at[80]);    MULADD(at[15], at[79]);    MULADD(at[16], at[78]);    MULADD(at[17], at[77]);    MULADD(at[18], at[76]);    MULADD(at[19], at[75]);    MULADD(at[20], at[74]);    MULADD(at[21], at[73]);    MULADD(at[22], at[72]);    MULADD(at[23], at[71]);    MULADD(at[24], at[70]);    MULADD(at[25], at[69]);    MULADD(at[26], at[68]);    MULADD(at[27], at[67]);    MULADD(at[28], at[66]);    MULADD(at[29], at[65]);    MULADD(at[30], at[64]);
4047    COMBA_STORE(C->dp[30]);
4048    /* 31 */
4049    COMBA_FORWARD;
4050    MULADD(at[0], at[95]);    MULADD(at[1], at[94]);    MULADD(at[2], at[93]);    MULADD(at[3], at[92]);    MULADD(at[4], at[91]);    MULADD(at[5], at[90]);    MULADD(at[6], at[89]);    MULADD(at[7], at[88]);    MULADD(at[8], at[87]);    MULADD(at[9], at[86]);    MULADD(at[10], at[85]);    MULADD(at[11], at[84]);    MULADD(at[12], at[83]);    MULADD(at[13], at[82]);    MULADD(at[14], at[81]);    MULADD(at[15], at[80]);    MULADD(at[16], at[79]);    MULADD(at[17], at[78]);    MULADD(at[18], at[77]);    MULADD(at[19], at[76]);    MULADD(at[20], at[75]);    MULADD(at[21], at[74]);    MULADD(at[22], at[73]);    MULADD(at[23], at[72]);    MULADD(at[24], at[71]);    MULADD(at[25], at[70]);    MULADD(at[26], at[69]);    MULADD(at[27], at[68]);    MULADD(at[28], at[67]);    MULADD(at[29], at[66]);    MULADD(at[30], at[65]);    MULADD(at[31], at[64]);
4051    COMBA_STORE(C->dp[31]);
4052    /* 32 */
4053    COMBA_FORWARD;
4054    MULADD(at[0], at[96]);    MULADD(at[1], at[95]);    MULADD(at[2], at[94]);    MULADD(at[3], at[93]);    MULADD(at[4], at[92]);    MULADD(at[5], at[91]);    MULADD(at[6], at[90]);    MULADD(at[7], at[89]);    MULADD(at[8], at[88]);    MULADD(at[9], at[87]);    MULADD(at[10], at[86]);    MULADD(at[11], at[85]);    MULADD(at[12], at[84]);    MULADD(at[13], at[83]);    MULADD(at[14], at[82]);    MULADD(at[15], at[81]);    MULADD(at[16], at[80]);    MULADD(at[17], at[79]);    MULADD(at[18], at[78]);    MULADD(at[19], at[77]);    MULADD(at[20], at[76]);    MULADD(at[21], at[75]);    MULADD(at[22], at[74]);    MULADD(at[23], at[73]);    MULADD(at[24], at[72]);    MULADD(at[25], at[71]);    MULADD(at[26], at[70]);    MULADD(at[27], at[69]);    MULADD(at[28], at[68]);    MULADD(at[29], at[67]);    MULADD(at[30], at[66]);    MULADD(at[31], at[65]);    MULADD(at[32], at[64]);
4055    COMBA_STORE(C->dp[32]);
4056    /* 33 */
4057    COMBA_FORWARD;
4058    MULADD(at[0], at[97]);    MULADD(at[1], at[96]);    MULADD(at[2], at[95]);    MULADD(at[3], at[94]);    MULADD(at[4], at[93]);    MULADD(at[5], at[92]);    MULADD(at[6], at[91]);    MULADD(at[7], at[90]);    MULADD(at[8], at[89]);    MULADD(at[9], at[88]);    MULADD(at[10], at[87]);    MULADD(at[11], at[86]);    MULADD(at[12], at[85]);    MULADD(at[13], at[84]);    MULADD(at[14], at[83]);    MULADD(at[15], at[82]);    MULADD(at[16], at[81]);    MULADD(at[17], at[80]);    MULADD(at[18], at[79]);    MULADD(at[19], at[78]);    MULADD(at[20], at[77]);    MULADD(at[21], at[76]);    MULADD(at[22], at[75]);    MULADD(at[23], at[74]);    MULADD(at[24], at[73]);    MULADD(at[25], at[72]);    MULADD(at[26], at[71]);    MULADD(at[27], at[70]);    MULADD(at[28], at[69]);    MULADD(at[29], at[68]);    MULADD(at[30], at[67]);    MULADD(at[31], at[66]);    MULADD(at[32], at[65]);    MULADD(at[33], at[64]);
4059    COMBA_STORE(C->dp[33]);
4060    /* 34 */
4061    COMBA_FORWARD;
4062    MULADD(at[0], at[98]);    MULADD(at[1], at[97]);    MULADD(at[2], at[96]);    MULADD(at[3], at[95]);    MULADD(at[4], at[94]);    MULADD(at[5], at[93]);    MULADD(at[6], at[92]);    MULADD(at[7], at[91]);    MULADD(at[8], at[90]);    MULADD(at[9], at[89]);    MULADD(at[10], at[88]);    MULADD(at[11], at[87]);    MULADD(at[12], at[86]);    MULADD(at[13], at[85]);    MULADD(at[14], at[84]);    MULADD(at[15], at[83]);    MULADD(at[16], at[82]);    MULADD(at[17], at[81]);    MULADD(at[18], at[80]);    MULADD(at[19], at[79]);    MULADD(at[20], at[78]);    MULADD(at[21], at[77]);    MULADD(at[22], at[76]);    MULADD(at[23], at[75]);    MULADD(at[24], at[74]);    MULADD(at[25], at[73]);    MULADD(at[26], at[72]);    MULADD(at[27], at[71]);    MULADD(at[28], at[70]);    MULADD(at[29], at[69]);    MULADD(at[30], at[68]);    MULADD(at[31], at[67]);    MULADD(at[32], at[66]);    MULADD(at[33], at[65]);    MULADD(at[34], at[64]);
4063    COMBA_STORE(C->dp[34]);
4064    /* 35 */
4065    COMBA_FORWARD;
4066    MULADD(at[0], at[99]);    MULADD(at[1], at[98]);    MULADD(at[2], at[97]);    MULADD(at[3], at[96]);    MULADD(at[4], at[95]);    MULADD(at[5], at[94]);    MULADD(at[6], at[93]);    MULADD(at[7], at[92]);    MULADD(at[8], at[91]);    MULADD(at[9], at[90]);    MULADD(at[10], at[89]);    MULADD(at[11], at[88]);    MULADD(at[12], at[87]);    MULADD(at[13], at[86]);    MULADD(at[14], at[85]);    MULADD(at[15], at[84]);    MULADD(at[16], at[83]);    MULADD(at[17], at[82]);    MULADD(at[18], at[81]);    MULADD(at[19], at[80]);    MULADD(at[20], at[79]);    MULADD(at[21], at[78]);    MULADD(at[22], at[77]);    MULADD(at[23], at[76]);    MULADD(at[24], at[75]);    MULADD(at[25], at[74]);    MULADD(at[26], at[73]);    MULADD(at[27], at[72]);    MULADD(at[28], at[71]);    MULADD(at[29], at[70]);    MULADD(at[30], at[69]);    MULADD(at[31], at[68]);    MULADD(at[32], at[67]);    MULADD(at[33], at[66]);    MULADD(at[34], at[65]);    MULADD(at[35], at[64]);
4067    COMBA_STORE(C->dp[35]);
4068    /* 36 */
4069    COMBA_FORWARD;
4070    MULADD(at[0], at[100]);    MULADD(at[1], at[99]);    MULADD(at[2], at[98]);    MULADD(at[3], at[97]);    MULADD(at[4], at[96]);    MULADD(at[5], at[95]);    MULADD(at[6], at[94]);    MULADD(at[7], at[93]);    MULADD(at[8], at[92]);    MULADD(at[9], at[91]);    MULADD(at[10], at[90]);    MULADD(at[11], at[89]);    MULADD(at[12], at[88]);    MULADD(at[13], at[87]);    MULADD(at[14], at[86]);    MULADD(at[15], at[85]);    MULADD(at[16], at[84]);    MULADD(at[17], at[83]);    MULADD(at[18], at[82]);    MULADD(at[19], at[81]);    MULADD(at[20], at[80]);    MULADD(at[21], at[79]);    MULADD(at[22], at[78]);    MULADD(at[23], at[77]);    MULADD(at[24], at[76]);    MULADD(at[25], at[75]);    MULADD(at[26], at[74]);    MULADD(at[27], at[73]);    MULADD(at[28], at[72]);    MULADD(at[29], at[71]);    MULADD(at[30], at[70]);    MULADD(at[31], at[69]);    MULADD(at[32], at[68]);    MULADD(at[33], at[67]);    MULADD(at[34], at[66]);    MULADD(at[35], at[65]);    MULADD(at[36], at[64]);
4071    COMBA_STORE(C->dp[36]);
4072    /* 37 */
4073    COMBA_FORWARD;
4074    MULADD(at[0], at[101]);    MULADD(at[1], at[100]);    MULADD(at[2], at[99]);    MULADD(at[3], at[98]);    MULADD(at[4], at[97]);    MULADD(at[5], at[96]);    MULADD(at[6], at[95]);    MULADD(at[7], at[94]);    MULADD(at[8], at[93]);    MULADD(at[9], at[92]);    MULADD(at[10], at[91]);    MULADD(at[11], at[90]);    MULADD(at[12], at[89]);    MULADD(at[13], at[88]);    MULADD(at[14], at[87]);    MULADD(at[15], at[86]);    MULADD(at[16], at[85]);    MULADD(at[17], at[84]);    MULADD(at[18], at[83]);    MULADD(at[19], at[82]);    MULADD(at[20], at[81]);    MULADD(at[21], at[80]);    MULADD(at[22], at[79]);    MULADD(at[23], at[78]);    MULADD(at[24], at[77]);    MULADD(at[25], at[76]);    MULADD(at[26], at[75]);    MULADD(at[27], at[74]);    MULADD(at[28], at[73]);    MULADD(at[29], at[72]);    MULADD(at[30], at[71]);    MULADD(at[31], at[70]);    MULADD(at[32], at[69]);    MULADD(at[33], at[68]);    MULADD(at[34], at[67]);    MULADD(at[35], at[66]);    MULADD(at[36], at[65]);    MULADD(at[37], at[64]);
4075    COMBA_STORE(C->dp[37]);
4076    /* 38 */
4077    COMBA_FORWARD;
4078    MULADD(at[0], at[102]);    MULADD(at[1], at[101]);    MULADD(at[2], at[100]);    MULADD(at[3], at[99]);    MULADD(at[4], at[98]);    MULADD(at[5], at[97]);    MULADD(at[6], at[96]);    MULADD(at[7], at[95]);    MULADD(at[8], at[94]);    MULADD(at[9], at[93]);    MULADD(at[10], at[92]);    MULADD(at[11], at[91]);    MULADD(at[12], at[90]);    MULADD(at[13], at[89]);    MULADD(at[14], at[88]);    MULADD(at[15], at[87]);    MULADD(at[16], at[86]);    MULADD(at[17], at[85]);    MULADD(at[18], at[84]);    MULADD(at[19], at[83]);    MULADD(at[20], at[82]);    MULADD(at[21], at[81]);    MULADD(at[22], at[80]);    MULADD(at[23], at[79]);    MULADD(at[24], at[78]);    MULADD(at[25], at[77]);    MULADD(at[26], at[76]);    MULADD(at[27], at[75]);    MULADD(at[28], at[74]);    MULADD(at[29], at[73]);    MULADD(at[30], at[72]);    MULADD(at[31], at[71]);    MULADD(at[32], at[70]);    MULADD(at[33], at[69]);    MULADD(at[34], at[68]);    MULADD(at[35], at[67]);    MULADD(at[36], at[66]);    MULADD(at[37], at[65]);    MULADD(at[38], at[64]);
4079    COMBA_STORE(C->dp[38]);
4080    /* 39 */
4081    COMBA_FORWARD;
4082    MULADD(at[0], at[103]);    MULADD(at[1], at[102]);    MULADD(at[2], at[101]);    MULADD(at[3], at[100]);    MULADD(at[4], at[99]);    MULADD(at[5], at[98]);    MULADD(at[6], at[97]);    MULADD(at[7], at[96]);    MULADD(at[8], at[95]);    MULADD(at[9], at[94]);    MULADD(at[10], at[93]);    MULADD(at[11], at[92]);    MULADD(at[12], at[91]);    MULADD(at[13], at[90]);    MULADD(at[14], at[89]);    MULADD(at[15], at[88]);    MULADD(at[16], at[87]);    MULADD(at[17], at[86]);    MULADD(at[18], at[85]);    MULADD(at[19], at[84]);    MULADD(at[20], at[83]);    MULADD(at[21], at[82]);    MULADD(at[22], at[81]);    MULADD(at[23], at[80]);    MULADD(at[24], at[79]);    MULADD(at[25], at[78]);    MULADD(at[26], at[77]);    MULADD(at[27], at[76]);    MULADD(at[28], at[75]);    MULADD(at[29], at[74]);    MULADD(at[30], at[73]);    MULADD(at[31], at[72]);    MULADD(at[32], at[71]);    MULADD(at[33], at[70]);    MULADD(at[34], at[69]);    MULADD(at[35], at[68]);    MULADD(at[36], at[67]);    MULADD(at[37], at[66]);    MULADD(at[38], at[65]);    MULADD(at[39], at[64]);
4083    COMBA_STORE(C->dp[39]);
4084    /* 40 */
4085    COMBA_FORWARD;
4086    MULADD(at[0], at[104]);    MULADD(at[1], at[103]);    MULADD(at[2], at[102]);    MULADD(at[3], at[101]);    MULADD(at[4], at[100]);    MULADD(at[5], at[99]);    MULADD(at[6], at[98]);    MULADD(at[7], at[97]);    MULADD(at[8], at[96]);    MULADD(at[9], at[95]);    MULADD(at[10], at[94]);    MULADD(at[11], at[93]);    MULADD(at[12], at[92]);    MULADD(at[13], at[91]);    MULADD(at[14], at[90]);    MULADD(at[15], at[89]);    MULADD(at[16], at[88]);    MULADD(at[17], at[87]);    MULADD(at[18], at[86]);    MULADD(at[19], at[85]);    MULADD(at[20], at[84]);    MULADD(at[21], at[83]);    MULADD(at[22], at[82]);    MULADD(at[23], at[81]);    MULADD(at[24], at[80]);    MULADD(at[25], at[79]);    MULADD(at[26], at[78]);    MULADD(at[27], at[77]);    MULADD(at[28], at[76]);    MULADD(at[29], at[75]);    MULADD(at[30], at[74]);    MULADD(at[31], at[73]);    MULADD(at[32], at[72]);    MULADD(at[33], at[71]);    MULADD(at[34], at[70]);    MULADD(at[35], at[69]);    MULADD(at[36], at[68]);    MULADD(at[37], at[67]);    MULADD(at[38], at[66]);    MULADD(at[39], at[65]);    MULADD(at[40], at[64]);
4087    COMBA_STORE(C->dp[40]);
4088    /* 41 */
4089    COMBA_FORWARD;
4090    MULADD(at[0], at[105]);    MULADD(at[1], at[104]);    MULADD(at[2], at[103]);    MULADD(at[3], at[102]);    MULADD(at[4], at[101]);    MULADD(at[5], at[100]);    MULADD(at[6], at[99]);    MULADD(at[7], at[98]);    MULADD(at[8], at[97]);    MULADD(at[9], at[96]);    MULADD(at[10], at[95]);    MULADD(at[11], at[94]);    MULADD(at[12], at[93]);    MULADD(at[13], at[92]);    MULADD(at[14], at[91]);    MULADD(at[15], at[90]);    MULADD(at[16], at[89]);    MULADD(at[17], at[88]);    MULADD(at[18], at[87]);    MULADD(at[19], at[86]);    MULADD(at[20], at[85]);    MULADD(at[21], at[84]);    MULADD(at[22], at[83]);    MULADD(at[23], at[82]);    MULADD(at[24], at[81]);    MULADD(at[25], at[80]);    MULADD(at[26], at[79]);    MULADD(at[27], at[78]);    MULADD(at[28], at[77]);    MULADD(at[29], at[76]);    MULADD(at[30], at[75]);    MULADD(at[31], at[74]);    MULADD(at[32], at[73]);    MULADD(at[33], at[72]);    MULADD(at[34], at[71]);    MULADD(at[35], at[70]);    MULADD(at[36], at[69]);    MULADD(at[37], at[68]);    MULADD(at[38], at[67]);    MULADD(at[39], at[66]);    MULADD(at[40], at[65]);    MULADD(at[41], at[64]);
4091    COMBA_STORE(C->dp[41]);
4092    /* 42 */
4093    COMBA_FORWARD;
4094    MULADD(at[0], at[106]);    MULADD(at[1], at[105]);    MULADD(at[2], at[104]);    MULADD(at[3], at[103]);    MULADD(at[4], at[102]);    MULADD(at[5], at[101]);    MULADD(at[6], at[100]);    MULADD(at[7], at[99]);    MULADD(at[8], at[98]);    MULADD(at[9], at[97]);    MULADD(at[10], at[96]);    MULADD(at[11], at[95]);    MULADD(at[12], at[94]);    MULADD(at[13], at[93]);    MULADD(at[14], at[92]);    MULADD(at[15], at[91]);    MULADD(at[16], at[90]);    MULADD(at[17], at[89]);    MULADD(at[18], at[88]);    MULADD(at[19], at[87]);    MULADD(at[20], at[86]);    MULADD(at[21], at[85]);    MULADD(at[22], at[84]);    MULADD(at[23], at[83]);    MULADD(at[24], at[82]);    MULADD(at[25], at[81]);    MULADD(at[26], at[80]);    MULADD(at[27], at[79]);    MULADD(at[28], at[78]);    MULADD(at[29], at[77]);    MULADD(at[30], at[76]);    MULADD(at[31], at[75]);    MULADD(at[32], at[74]);    MULADD(at[33], at[73]);    MULADD(at[34], at[72]);    MULADD(at[35], at[71]);    MULADD(at[36], at[70]);    MULADD(at[37], at[69]);    MULADD(at[38], at[68]);    MULADD(at[39], at[67]);    MULADD(at[40], at[66]);    MULADD(at[41], at[65]);    MULADD(at[42], at[64]);
4095    COMBA_STORE(C->dp[42]);
4096    /* 43 */
4097    COMBA_FORWARD;
4098    MULADD(at[0], at[107]);    MULADD(at[1], at[106]);    MULADD(at[2], at[105]);    MULADD(at[3], at[104]);    MULADD(at[4], at[103]);    MULADD(at[5], at[102]);    MULADD(at[6], at[101]);    MULADD(at[7], at[100]);    MULADD(at[8], at[99]);    MULADD(at[9], at[98]);    MULADD(at[10], at[97]);    MULADD(at[11], at[96]);    MULADD(at[12], at[95]);    MULADD(at[13], at[94]);    MULADD(at[14], at[93]);    MULADD(at[15], at[92]);    MULADD(at[16], at[91]);    MULADD(at[17], at[90]);    MULADD(at[18], at[89]);    MULADD(at[19], at[88]);    MULADD(at[20], at[87]);    MULADD(at[21], at[86]);    MULADD(at[22], at[85]);    MULADD(at[23], at[84]);    MULADD(at[24], at[83]);    MULADD(at[25], at[82]);    MULADD(at[26], at[81]);    MULADD(at[27], at[80]);    MULADD(at[28], at[79]);    MULADD(at[29], at[78]);    MULADD(at[30], at[77]);    MULADD(at[31], at[76]);    MULADD(at[32], at[75]);    MULADD(at[33], at[74]);    MULADD(at[34], at[73]);    MULADD(at[35], at[72]);    MULADD(at[36], at[71]);    MULADD(at[37], at[70]);    MULADD(at[38], at[69]);    MULADD(at[39], at[68]);    MULADD(at[40], at[67]);    MULADD(at[41], at[66]);    MULADD(at[42], at[65]);    MULADD(at[43], at[64]);
4099    COMBA_STORE(C->dp[43]);
4100    /* 44 */
4101    COMBA_FORWARD;
4102    MULADD(at[0], at[108]);    MULADD(at[1], at[107]);    MULADD(at[2], at[106]);    MULADD(at[3], at[105]);    MULADD(at[4], at[104]);    MULADD(at[5], at[103]);    MULADD(at[6], at[102]);    MULADD(at[7], at[101]);    MULADD(at[8], at[100]);    MULADD(at[9], at[99]);    MULADD(at[10], at[98]);    MULADD(at[11], at[97]);    MULADD(at[12], at[96]);    MULADD(at[13], at[95]);    MULADD(at[14], at[94]);    MULADD(at[15], at[93]);    MULADD(at[16], at[92]);    MULADD(at[17], at[91]);    MULADD(at[18], at[90]);    MULADD(at[19], at[89]);    MULADD(at[20], at[88]);    MULADD(at[21], at[87]);    MULADD(at[22], at[86]);    MULADD(at[23], at[85]);    MULADD(at[24], at[84]);    MULADD(at[25], at[83]);    MULADD(at[26], at[82]);    MULADD(at[27], at[81]);    MULADD(at[28], at[80]);    MULADD(at[29], at[79]);    MULADD(at[30], at[78]);    MULADD(at[31], at[77]);    MULADD(at[32], at[76]);    MULADD(at[33], at[75]);    MULADD(at[34], at[74]);    MULADD(at[35], at[73]);    MULADD(at[36], at[72]);    MULADD(at[37], at[71]);    MULADD(at[38], at[70]);    MULADD(at[39], at[69]);    MULADD(at[40], at[68]);    MULADD(at[41], at[67]);    MULADD(at[42], at[66]);    MULADD(at[43], at[65]);    MULADD(at[44], at[64]);
4103    COMBA_STORE(C->dp[44]);
4104    /* 45 */
4105    COMBA_FORWARD;
4106    MULADD(at[0], at[109]);    MULADD(at[1], at[108]);    MULADD(at[2], at[107]);    MULADD(at[3], at[106]);    MULADD(at[4], at[105]);    MULADD(at[5], at[104]);    MULADD(at[6], at[103]);    MULADD(at[7], at[102]);    MULADD(at[8], at[101]);    MULADD(at[9], at[100]);    MULADD(at[10], at[99]);    MULADD(at[11], at[98]);    MULADD(at[12], at[97]);    MULADD(at[13], at[96]);    MULADD(at[14], at[95]);    MULADD(at[15], at[94]);    MULADD(at[16], at[93]);    MULADD(at[17], at[92]);    MULADD(at[18], at[91]);    MULADD(at[19], at[90]);    MULADD(at[20], at[89]);    MULADD(at[21], at[88]);    MULADD(at[22], at[87]);    MULADD(at[23], at[86]);    MULADD(at[24], at[85]);    MULADD(at[25], at[84]);    MULADD(at[26], at[83]);    MULADD(at[27], at[82]);    MULADD(at[28], at[81]);    MULADD(at[29], at[80]);    MULADD(at[30], at[79]);    MULADD(at[31], at[78]);    MULADD(at[32], at[77]);    MULADD(at[33], at[76]);    MULADD(at[34], at[75]);    MULADD(at[35], at[74]);    MULADD(at[36], at[73]);    MULADD(at[37], at[72]);    MULADD(at[38], at[71]);    MULADD(at[39], at[70]);    MULADD(at[40], at[69]);    MULADD(at[41], at[68]);    MULADD(at[42], at[67]);    MULADD(at[43], at[66]);    MULADD(at[44], at[65]);    MULADD(at[45], at[64]);
4107    COMBA_STORE(C->dp[45]);
4108    /* 46 */
4109    COMBA_FORWARD;
4110    MULADD(at[0], at[110]);    MULADD(at[1], at[109]);    MULADD(at[2], at[108]);    MULADD(at[3], at[107]);    MULADD(at[4], at[106]);    MULADD(at[5], at[105]);    MULADD(at[6], at[104]);    MULADD(at[7], at[103]);    MULADD(at[8], at[102]);    MULADD(at[9], at[101]);    MULADD(at[10], at[100]);    MULADD(at[11], at[99]);    MULADD(at[12], at[98]);    MULADD(at[13], at[97]);    MULADD(at[14], at[96]);    MULADD(at[15], at[95]);    MULADD(at[16], at[94]);    MULADD(at[17], at[93]);    MULADD(at[18], at[92]);    MULADD(at[19], at[91]);    MULADD(at[20], at[90]);    MULADD(at[21], at[89]);    MULADD(at[22], at[88]);    MULADD(at[23], at[87]);    MULADD(at[24], at[86]);    MULADD(at[25], at[85]);    MULADD(at[26], at[84]);    MULADD(at[27], at[83]);    MULADD(at[28], at[82]);    MULADD(at[29], at[81]);    MULADD(at[30], at[80]);    MULADD(at[31], at[79]);    MULADD(at[32], at[78]);    MULADD(at[33], at[77]);    MULADD(at[34], at[76]);    MULADD(at[35], at[75]);    MULADD(at[36], at[74]);    MULADD(at[37], at[73]);    MULADD(at[38], at[72]);    MULADD(at[39], at[71]);    MULADD(at[40], at[70]);    MULADD(at[41], at[69]);    MULADD(at[42], at[68]);    MULADD(at[43], at[67]);    MULADD(at[44], at[66]);    MULADD(at[45], at[65]);    MULADD(at[46], at[64]);
4111    COMBA_STORE(C->dp[46]);
4112    /* 47 */
4113    COMBA_FORWARD;
4114    MULADD(at[0], at[111]);    MULADD(at[1], at[110]);    MULADD(at[2], at[109]);    MULADD(at[3], at[108]);    MULADD(at[4], at[107]);    MULADD(at[5], at[106]);    MULADD(at[6], at[105]);    MULADD(at[7], at[104]);    MULADD(at[8], at[103]);    MULADD(at[9], at[102]);    MULADD(at[10], at[101]);    MULADD(at[11], at[100]);    MULADD(at[12], at[99]);    MULADD(at[13], at[98]);    MULADD(at[14], at[97]);    MULADD(at[15], at[96]);    MULADD(at[16], at[95]);    MULADD(at[17], at[94]);    MULADD(at[18], at[93]);    MULADD(at[19], at[92]);    MULADD(at[20], at[91]);    MULADD(at[21], at[90]);    MULADD(at[22], at[89]);    MULADD(at[23], at[88]);    MULADD(at[24], at[87]);    MULADD(at[25], at[86]);    MULADD(at[26], at[85]);    MULADD(at[27], at[84]);    MULADD(at[28], at[83]);    MULADD(at[29], at[82]);    MULADD(at[30], at[81]);    MULADD(at[31], at[80]);    MULADD(at[32], at[79]);    MULADD(at[33], at[78]);    MULADD(at[34], at[77]);    MULADD(at[35], at[76]);    MULADD(at[36], at[75]);    MULADD(at[37], at[74]);    MULADD(at[38], at[73]);    MULADD(at[39], at[72]);    MULADD(at[40], at[71]);    MULADD(at[41], at[70]);    MULADD(at[42], at[69]);    MULADD(at[43], at[68]);    MULADD(at[44], at[67]);    MULADD(at[45], at[66]);    MULADD(at[46], at[65]);    MULADD(at[47], at[64]);
4115    COMBA_STORE(C->dp[47]);
4116    /* 48 */
4117    COMBA_FORWARD;
4118    MULADD(at[0], at[112]);    MULADD(at[1], at[111]);    MULADD(at[2], at[110]);    MULADD(at[3], at[109]);    MULADD(at[4], at[108]);    MULADD(at[5], at[107]);    MULADD(at[6], at[106]);    MULADD(at[7], at[105]);    MULADD(at[8], at[104]);    MULADD(at[9], at[103]);    MULADD(at[10], at[102]);    MULADD(at[11], at[101]);    MULADD(at[12], at[100]);    MULADD(at[13], at[99]);    MULADD(at[14], at[98]);    MULADD(at[15], at[97]);    MULADD(at[16], at[96]);    MULADD(at[17], at[95]);    MULADD(at[18], at[94]);    MULADD(at[19], at[93]);    MULADD(at[20], at[92]);    MULADD(at[21], at[91]);    MULADD(at[22], at[90]);    MULADD(at[23], at[89]);    MULADD(at[24], at[88]);    MULADD(at[25], at[87]);    MULADD(at[26], at[86]);    MULADD(at[27], at[85]);    MULADD(at[28], at[84]);    MULADD(at[29], at[83]);    MULADD(at[30], at[82]);    MULADD(at[31], at[81]);    MULADD(at[32], at[80]);    MULADD(at[33], at[79]);    MULADD(at[34], at[78]);    MULADD(at[35], at[77]);    MULADD(at[36], at[76]);    MULADD(at[37], at[75]);    MULADD(at[38], at[74]);    MULADD(at[39], at[73]);    MULADD(at[40], at[72]);    MULADD(at[41], at[71]);    MULADD(at[42], at[70]);    MULADD(at[43], at[69]);    MULADD(at[44], at[68]);    MULADD(at[45], at[67]);    MULADD(at[46], at[66]);    MULADD(at[47], at[65]);    MULADD(at[48], at[64]);
4119    COMBA_STORE(C->dp[48]);
4120    /* 49 */
4121    COMBA_FORWARD;
4122    MULADD(at[0], at[113]);    MULADD(at[1], at[112]);    MULADD(at[2], at[111]);    MULADD(at[3], at[110]);    MULADD(at[4], at[109]);    MULADD(at[5], at[108]);    MULADD(at[6], at[107]);    MULADD(at[7], at[106]);    MULADD(at[8], at[105]);    MULADD(at[9], at[104]);    MULADD(at[10], at[103]);    MULADD(at[11], at[102]);    MULADD(at[12], at[101]);    MULADD(at[13], at[100]);    MULADD(at[14], at[99]);    MULADD(at[15], at[98]);    MULADD(at[16], at[97]);    MULADD(at[17], at[96]);    MULADD(at[18], at[95]);    MULADD(at[19], at[94]);    MULADD(at[20], at[93]);    MULADD(at[21], at[92]);    MULADD(at[22], at[91]);    MULADD(at[23], at[90]);    MULADD(at[24], at[89]);    MULADD(at[25], at[88]);    MULADD(at[26], at[87]);    MULADD(at[27], at[86]);    MULADD(at[28], at[85]);    MULADD(at[29], at[84]);    MULADD(at[30], at[83]);    MULADD(at[31], at[82]);    MULADD(at[32], at[81]);    MULADD(at[33], at[80]);    MULADD(at[34], at[79]);    MULADD(at[35], at[78]);    MULADD(at[36], at[77]);    MULADD(at[37], at[76]);    MULADD(at[38], at[75]);    MULADD(at[39], at[74]);    MULADD(at[40], at[73]);    MULADD(at[41], at[72]);    MULADD(at[42], at[71]);    MULADD(at[43], at[70]);    MULADD(at[44], at[69]);    MULADD(at[45], at[68]);    MULADD(at[46], at[67]);    MULADD(at[47], at[66]);    MULADD(at[48], at[65]);    MULADD(at[49], at[64]);
4123    COMBA_STORE(C->dp[49]);
4124    /* 50 */
4125    COMBA_FORWARD;
4126    MULADD(at[0], at[114]);    MULADD(at[1], at[113]);    MULADD(at[2], at[112]);    MULADD(at[3], at[111]);    MULADD(at[4], at[110]);    MULADD(at[5], at[109]);    MULADD(at[6], at[108]);    MULADD(at[7], at[107]);    MULADD(at[8], at[106]);    MULADD(at[9], at[105]);    MULADD(at[10], at[104]);    MULADD(at[11], at[103]);    MULADD(at[12], at[102]);    MULADD(at[13], at[101]);    MULADD(at[14], at[100]);    MULADD(at[15], at[99]);    MULADD(at[16], at[98]);    MULADD(at[17], at[97]);    MULADD(at[18], at[96]);    MULADD(at[19], at[95]);    MULADD(at[20], at[94]);    MULADD(at[21], at[93]);    MULADD(at[22], at[92]);    MULADD(at[23], at[91]);    MULADD(at[24], at[90]);    MULADD(at[25], at[89]);    MULADD(at[26], at[88]);    MULADD(at[27], at[87]);    MULADD(at[28], at[86]);    MULADD(at[29], at[85]);    MULADD(at[30], at[84]);    MULADD(at[31], at[83]);    MULADD(at[32], at[82]);    MULADD(at[33], at[81]);    MULADD(at[34], at[80]);    MULADD(at[35], at[79]);    MULADD(at[36], at[78]);    MULADD(at[37], at[77]);    MULADD(at[38], at[76]);    MULADD(at[39], at[75]);    MULADD(at[40], at[74]);    MULADD(at[41], at[73]);    MULADD(at[42], at[72]);    MULADD(at[43], at[71]);    MULADD(at[44], at[70]);    MULADD(at[45], at[69]);    MULADD(at[46], at[68]);    MULADD(at[47], at[67]);    MULADD(at[48], at[66]);    MULADD(at[49], at[65]);    MULADD(at[50], at[64]);
4127    COMBA_STORE(C->dp[50]);
4128    /* 51 */
4129    COMBA_FORWARD;
4130    MULADD(at[0], at[115]);    MULADD(at[1], at[114]);    MULADD(at[2], at[113]);    MULADD(at[3], at[112]);    MULADD(at[4], at[111]);    MULADD(at[5], at[110]);    MULADD(at[6], at[109]);    MULADD(at[7], at[108]);    MULADD(at[8], at[107]);    MULADD(at[9], at[106]);    MULADD(at[10], at[105]);    MULADD(at[11], at[104]);    MULADD(at[12], at[103]);    MULADD(at[13], at[102]);    MULADD(at[14], at[101]);    MULADD(at[15], at[100]);    MULADD(at[16], at[99]);    MULADD(at[17], at[98]);    MULADD(at[18], at[97]);    MULADD(at[19], at[96]);    MULADD(at[20], at[95]);    MULADD(at[21], at[94]);    MULADD(at[22], at[93]);    MULADD(at[23], at[92]);    MULADD(at[24], at[91]);    MULADD(at[25], at[90]);    MULADD(at[26], at[89]);    MULADD(at[27], at[88]);    MULADD(at[28], at[87]);    MULADD(at[29], at[86]);    MULADD(at[30], at[85]);    MULADD(at[31], at[84]);    MULADD(at[32], at[83]);    MULADD(at[33], at[82]);    MULADD(at[34], at[81]);    MULADD(at[35], at[80]);    MULADD(at[36], at[79]);    MULADD(at[37], at[78]);    MULADD(at[38], at[77]);    MULADD(at[39], at[76]);    MULADD(at[40], at[75]);    MULADD(at[41], at[74]);    MULADD(at[42], at[73]);    MULADD(at[43], at[72]);    MULADD(at[44], at[71]);    MULADD(at[45], at[70]);    MULADD(at[46], at[69]);    MULADD(at[47], at[68]);    MULADD(at[48], at[67]);    MULADD(at[49], at[66]);    MULADD(at[50], at[65]);    MULADD(at[51], at[64]);
4131    COMBA_STORE(C->dp[51]);
4132    /* 52 */
4133    COMBA_FORWARD;
4134    MULADD(at[0], at[116]);    MULADD(at[1], at[115]);    MULADD(at[2], at[114]);    MULADD(at[3], at[113]);    MULADD(at[4], at[112]);    MULADD(at[5], at[111]);    MULADD(at[6], at[110]);    MULADD(at[7], at[109]);    MULADD(at[8], at[108]);    MULADD(at[9], at[107]);    MULADD(at[10], at[106]);    MULADD(at[11], at[105]);    MULADD(at[12], at[104]);    MULADD(at[13], at[103]);    MULADD(at[14], at[102]);    MULADD(at[15], at[101]);    MULADD(at[16], at[100]);    MULADD(at[17], at[99]);    MULADD(at[18], at[98]);    MULADD(at[19], at[97]);    MULADD(at[20], at[96]);    MULADD(at[21], at[95]);    MULADD(at[22], at[94]);    MULADD(at[23], at[93]);    MULADD(at[24], at[92]);    MULADD(at[25], at[91]);    MULADD(at[26], at[90]);    MULADD(at[27], at[89]);    MULADD(at[28], at[88]);    MULADD(at[29], at[87]);    MULADD(at[30], at[86]);    MULADD(at[31], at[85]);    MULADD(at[32], at[84]);    MULADD(at[33], at[83]);    MULADD(at[34], at[82]);    MULADD(at[35], at[81]);    MULADD(at[36], at[80]);    MULADD(at[37], at[79]);    MULADD(at[38], at[78]);    MULADD(at[39], at[77]);    MULADD(at[40], at[76]);    MULADD(at[41], at[75]);    MULADD(at[42], at[74]);    MULADD(at[43], at[73]);    MULADD(at[44], at[72]);    MULADD(at[45], at[71]);    MULADD(at[46], at[70]);    MULADD(at[47], at[69]);    MULADD(at[48], at[68]);    MULADD(at[49], at[67]);    MULADD(at[50], at[66]);    MULADD(at[51], at[65]);    MULADD(at[52], at[64]);
4135    COMBA_STORE(C->dp[52]);
4136    /* 53 */
4137    COMBA_FORWARD;
4138    MULADD(at[0], at[117]);    MULADD(at[1], at[116]);    MULADD(at[2], at[115]);    MULADD(at[3], at[114]);    MULADD(at[4], at[113]);    MULADD(at[5], at[112]);    MULADD(at[6], at[111]);    MULADD(at[7], at[110]);    MULADD(at[8], at[109]);    MULADD(at[9], at[108]);    MULADD(at[10], at[107]);    MULADD(at[11], at[106]);    MULADD(at[12], at[105]);    MULADD(at[13], at[104]);    MULADD(at[14], at[103]);    MULADD(at[15], at[102]);    MULADD(at[16], at[101]);    MULADD(at[17], at[100]);    MULADD(at[18], at[99]);    MULADD(at[19], at[98]);    MULADD(at[20], at[97]);    MULADD(at[21], at[96]);    MULADD(at[22], at[95]);    MULADD(at[23], at[94]);    MULADD(at[24], at[93]);    MULADD(at[25], at[92]);    MULADD(at[26], at[91]);    MULADD(at[27], at[90]);    MULADD(at[28], at[89]);    MULADD(at[29], at[88]);    MULADD(at[30], at[87]);    MULADD(at[31], at[86]);    MULADD(at[32], at[85]);    MULADD(at[33], at[84]);    MULADD(at[34], at[83]);    MULADD(at[35], at[82]);    MULADD(at[36], at[81]);    MULADD(at[37], at[80]);    MULADD(at[38], at[79]);    MULADD(at[39], at[78]);    MULADD(at[40], at[77]);    MULADD(at[41], at[76]);    MULADD(at[42], at[75]);    MULADD(at[43], at[74]);    MULADD(at[44], at[73]);    MULADD(at[45], at[72]);    MULADD(at[46], at[71]);    MULADD(at[47], at[70]);    MULADD(at[48], at[69]);    MULADD(at[49], at[68]);    MULADD(at[50], at[67]);    MULADD(at[51], at[66]);    MULADD(at[52], at[65]);    MULADD(at[53], at[64]);
4139    COMBA_STORE(C->dp[53]);
4140    /* 54 */
4141    COMBA_FORWARD;
4142    MULADD(at[0], at[118]);    MULADD(at[1], at[117]);    MULADD(at[2], at[116]);    MULADD(at[3], at[115]);    MULADD(at[4], at[114]);    MULADD(at[5], at[113]);    MULADD(at[6], at[112]);    MULADD(at[7], at[111]);    MULADD(at[8], at[110]);    MULADD(at[9], at[109]);    MULADD(at[10], at[108]);    MULADD(at[11], at[107]);    MULADD(at[12], at[106]);    MULADD(at[13], at[105]);    MULADD(at[14], at[104]);    MULADD(at[15], at[103]);    MULADD(at[16], at[102]);    MULADD(at[17], at[101]);    MULADD(at[18], at[100]);    MULADD(at[19], at[99]);    MULADD(at[20], at[98]);    MULADD(at[21], at[97]);    MULADD(at[22], at[96]);    MULADD(at[23], at[95]);    MULADD(at[24], at[94]);    MULADD(at[25], at[93]);    MULADD(at[26], at[92]);    MULADD(at[27], at[91]);    MULADD(at[28], at[90]);    MULADD(at[29], at[89]);    MULADD(at[30], at[88]);    MULADD(at[31], at[87]);    MULADD(at[32], at[86]);    MULADD(at[33], at[85]);    MULADD(at[34], at[84]);    MULADD(at[35], at[83]);    MULADD(at[36], at[82]);    MULADD(at[37], at[81]);    MULADD(at[38], at[80]);    MULADD(at[39], at[79]);    MULADD(at[40], at[78]);    MULADD(at[41], at[77]);    MULADD(at[42], at[76]);    MULADD(at[43], at[75]);    MULADD(at[44], at[74]);    MULADD(at[45], at[73]);    MULADD(at[46], at[72]);    MULADD(at[47], at[71]);    MULADD(at[48], at[70]);    MULADD(at[49], at[69]);    MULADD(at[50], at[68]);    MULADD(at[51], at[67]);    MULADD(at[52], at[66]);    MULADD(at[53], at[65]);    MULADD(at[54], at[64]);
4143    COMBA_STORE(C->dp[54]);
4144    /* 55 */
4145    COMBA_FORWARD;
4146    MULADD(at[0], at[119]);    MULADD(at[1], at[118]);    MULADD(at[2], at[117]);    MULADD(at[3], at[116]);    MULADD(at[4], at[115]);    MULADD(at[5], at[114]);    MULADD(at[6], at[113]);    MULADD(at[7], at[112]);    MULADD(at[8], at[111]);    MULADD(at[9], at[110]);    MULADD(at[10], at[109]);    MULADD(at[11], at[108]);    MULADD(at[12], at[107]);    MULADD(at[13], at[106]);    MULADD(at[14], at[105]);    MULADD(at[15], at[104]);    MULADD(at[16], at[103]);    MULADD(at[17], at[102]);    MULADD(at[18], at[101]);    MULADD(at[19], at[100]);    MULADD(at[20], at[99]);    MULADD(at[21], at[98]);    MULADD(at[22], at[97]);    MULADD(at[23], at[96]);    MULADD(at[24], at[95]);    MULADD(at[25], at[94]);    MULADD(at[26], at[93]);    MULADD(at[27], at[92]);    MULADD(at[28], at[91]);    MULADD(at[29], at[90]);    MULADD(at[30], at[89]);    MULADD(at[31], at[88]);    MULADD(at[32], at[87]);    MULADD(at[33], at[86]);    MULADD(at[34], at[85]);    MULADD(at[35], at[84]);    MULADD(at[36], at[83]);    MULADD(at[37], at[82]);    MULADD(at[38], at[81]);    MULADD(at[39], at[80]);    MULADD(at[40], at[79]);    MULADD(at[41], at[78]);    MULADD(at[42], at[77]);    MULADD(at[43], at[76]);    MULADD(at[44], at[75]);    MULADD(at[45], at[74]);    MULADD(at[46], at[73]);    MULADD(at[47], at[72]);    MULADD(at[48], at[71]);    MULADD(at[49], at[70]);    MULADD(at[50], at[69]);    MULADD(at[51], at[68]);    MULADD(at[52], at[67]);    MULADD(at[53], at[66]);    MULADD(at[54], at[65]);    MULADD(at[55], at[64]);
4147    COMBA_STORE(C->dp[55]);
4148    /* 56 */
4149    COMBA_FORWARD;
4150    MULADD(at[0], at[120]);    MULADD(at[1], at[119]);    MULADD(at[2], at[118]);    MULADD(at[3], at[117]);    MULADD(at[4], at[116]);    MULADD(at[5], at[115]);    MULADD(at[6], at[114]);    MULADD(at[7], at[113]);    MULADD(at[8], at[112]);    MULADD(at[9], at[111]);    MULADD(at[10], at[110]);    MULADD(at[11], at[109]);    MULADD(at[12], at[108]);    MULADD(at[13], at[107]);    MULADD(at[14], at[106]);    MULADD(at[15], at[105]);    MULADD(at[16], at[104]);    MULADD(at[17], at[103]);    MULADD(at[18], at[102]);    MULADD(at[19], at[101]);    MULADD(at[20], at[100]);    MULADD(at[21], at[99]);    MULADD(at[22], at[98]);    MULADD(at[23], at[97]);    MULADD(at[24], at[96]);    MULADD(at[25], at[95]);    MULADD(at[26], at[94]);    MULADD(at[27], at[93]);    MULADD(at[28], at[92]);    MULADD(at[29], at[91]);    MULADD(at[30], at[90]);    MULADD(at[31], at[89]);    MULADD(at[32], at[88]);    MULADD(at[33], at[87]);    MULADD(at[34], at[86]);    MULADD(at[35], at[85]);    MULADD(at[36], at[84]);    MULADD(at[37], at[83]);    MULADD(at[38], at[82]);    MULADD(at[39], at[81]);    MULADD(at[40], at[80]);    MULADD(at[41], at[79]);    MULADD(at[42], at[78]);    MULADD(at[43], at[77]);    MULADD(at[44], at[76]);    MULADD(at[45], at[75]);    MULADD(at[46], at[74]);    MULADD(at[47], at[73]);    MULADD(at[48], at[72]);    MULADD(at[49], at[71]);    MULADD(at[50], at[70]);    MULADD(at[51], at[69]);    MULADD(at[52], at[68]);    MULADD(at[53], at[67]);    MULADD(at[54], at[66]);    MULADD(at[55], at[65]);    MULADD(at[56], at[64]);
4151    COMBA_STORE(C->dp[56]);
4152    /* 57 */
4153    COMBA_FORWARD;
4154    MULADD(at[0], at[121]);    MULADD(at[1], at[120]);    MULADD(at[2], at[119]);    MULADD(at[3], at[118]);    MULADD(at[4], at[117]);    MULADD(at[5], at[116]);    MULADD(at[6], at[115]);    MULADD(at[7], at[114]);    MULADD(at[8], at[113]);    MULADD(at[9], at[112]);    MULADD(at[10], at[111]);    MULADD(at[11], at[110]);    MULADD(at[12], at[109]);    MULADD(at[13], at[108]);    MULADD(at[14], at[107]);    MULADD(at[15], at[106]);    MULADD(at[16], at[105]);    MULADD(at[17], at[104]);    MULADD(at[18], at[103]);    MULADD(at[19], at[102]);    MULADD(at[20], at[101]);    MULADD(at[21], at[100]);    MULADD(at[22], at[99]);    MULADD(at[23], at[98]);    MULADD(at[24], at[97]);    MULADD(at[25], at[96]);    MULADD(at[26], at[95]);    MULADD(at[27], at[94]);    MULADD(at[28], at[93]);    MULADD(at[29], at[92]);    MULADD(at[30], at[91]);    MULADD(at[31], at[90]);    MULADD(at[32], at[89]);    MULADD(at[33], at[88]);    MULADD(at[34], at[87]);    MULADD(at[35], at[86]);    MULADD(at[36], at[85]);    MULADD(at[37], at[84]);    MULADD(at[38], at[83]);    MULADD(at[39], at[82]);    MULADD(at[40], at[81]);    MULADD(at[41], at[80]);    MULADD(at[42], at[79]);    MULADD(at[43], at[78]);    MULADD(at[44], at[77]);    MULADD(at[45], at[76]);    MULADD(at[46], at[75]);    MULADD(at[47], at[74]);    MULADD(at[48], at[73]);    MULADD(at[49], at[72]);    MULADD(at[50], at[71]);    MULADD(at[51], at[70]);    MULADD(at[52], at[69]);    MULADD(at[53], at[68]);    MULADD(at[54], at[67]);    MULADD(at[55], at[66]);    MULADD(at[56], at[65]);    MULADD(at[57], at[64]);
4155    COMBA_STORE(C->dp[57]);
4156    /* 58 */
4157    COMBA_FORWARD;
4158    MULADD(at[0], at[122]);    MULADD(at[1], at[121]);    MULADD(at[2], at[120]);    MULADD(at[3], at[119]);    MULADD(at[4], at[118]);    MULADD(at[5], at[117]);    MULADD(at[6], at[116]);    MULADD(at[7], at[115]);    MULADD(at[8], at[114]);    MULADD(at[9], at[113]);    MULADD(at[10], at[112]);    MULADD(at[11], at[111]);    MULADD(at[12], at[110]);    MULADD(at[13], at[109]);    MULADD(at[14], at[108]);    MULADD(at[15], at[107]);    MULADD(at[16], at[106]);    MULADD(at[17], at[105]);    MULADD(at[18], at[104]);    MULADD(at[19], at[103]);    MULADD(at[20], at[102]);    MULADD(at[21], at[101]);    MULADD(at[22], at[100]);    MULADD(at[23], at[99]);    MULADD(at[24], at[98]);    MULADD(at[25], at[97]);    MULADD(at[26], at[96]);    MULADD(at[27], at[95]);    MULADD(at[28], at[94]);    MULADD(at[29], at[93]);    MULADD(at[30], at[92]);    MULADD(at[31], at[91]);    MULADD(at[32], at[90]);    MULADD(at[33], at[89]);    MULADD(at[34], at[88]);    MULADD(at[35], at[87]);    MULADD(at[36], at[86]);    MULADD(at[37], at[85]);    MULADD(at[38], at[84]);    MULADD(at[39], at[83]);    MULADD(at[40], at[82]);    MULADD(at[41], at[81]);    MULADD(at[42], at[80]);    MULADD(at[43], at[79]);    MULADD(at[44], at[78]);    MULADD(at[45], at[77]);    MULADD(at[46], at[76]);    MULADD(at[47], at[75]);    MULADD(at[48], at[74]);    MULADD(at[49], at[73]);    MULADD(at[50], at[72]);    MULADD(at[51], at[71]);    MULADD(at[52], at[70]);    MULADD(at[53], at[69]);    MULADD(at[54], at[68]);    MULADD(at[55], at[67]);    MULADD(at[56], at[66]);    MULADD(at[57], at[65]);    MULADD(at[58], at[64]);
4159    COMBA_STORE(C->dp[58]);
4160    /* 59 */
4161    COMBA_FORWARD;
4162    MULADD(at[0], at[123]);    MULADD(at[1], at[122]);    MULADD(at[2], at[121]);    MULADD(at[3], at[120]);    MULADD(at[4], at[119]);    MULADD(at[5], at[118]);    MULADD(at[6], at[117]);    MULADD(at[7], at[116]);    MULADD(at[8], at[115]);    MULADD(at[9], at[114]);    MULADD(at[10], at[113]);    MULADD(at[11], at[112]);    MULADD(at[12], at[111]);    MULADD(at[13], at[110]);    MULADD(at[14], at[109]);    MULADD(at[15], at[108]);    MULADD(at[16], at[107]);    MULADD(at[17], at[106]);    MULADD(at[18], at[105]);    MULADD(at[19], at[104]);    MULADD(at[20], at[103]);    MULADD(at[21], at[102]);    MULADD(at[22], at[101]);    MULADD(at[23], at[100]);    MULADD(at[24], at[99]);    MULADD(at[25], at[98]);    MULADD(at[26], at[97]);    MULADD(at[27], at[96]);    MULADD(at[28], at[95]);    MULADD(at[29], at[94]);    MULADD(at[30], at[93]);    MULADD(at[31], at[92]);    MULADD(at[32], at[91]);    MULADD(at[33], at[90]);    MULADD(at[34], at[89]);    MULADD(at[35], at[88]);    MULADD(at[36], at[87]);    MULADD(at[37], at[86]);    MULADD(at[38], at[85]);    MULADD(at[39], at[84]);    MULADD(at[40], at[83]);    MULADD(at[41], at[82]);    MULADD(at[42], at[81]);    MULADD(at[43], at[80]);    MULADD(at[44], at[79]);    MULADD(at[45], at[78]);    MULADD(at[46], at[77]);    MULADD(at[47], at[76]);    MULADD(at[48], at[75]);    MULADD(at[49], at[74]);    MULADD(at[50], at[73]);    MULADD(at[51], at[72]);    MULADD(at[52], at[71]);    MULADD(at[53], at[70]);    MULADD(at[54], at[69]);    MULADD(at[55], at[68]);    MULADD(at[56], at[67]);    MULADD(at[57], at[66]);    MULADD(at[58], at[65]);    MULADD(at[59], at[64]);
4163    COMBA_STORE(C->dp[59]);
4164    /* 60 */
4165    COMBA_FORWARD;
4166    MULADD(at[0], at[124]);    MULADD(at[1], at[123]);    MULADD(at[2], at[122]);    MULADD(at[3], at[121]);    MULADD(at[4], at[120]);    MULADD(at[5], at[119]);    MULADD(at[6], at[118]);    MULADD(at[7], at[117]);    MULADD(at[8], at[116]);    MULADD(at[9], at[115]);    MULADD(at[10], at[114]);    MULADD(at[11], at[113]);    MULADD(at[12], at[112]);    MULADD(at[13], at[111]);    MULADD(at[14], at[110]);    MULADD(at[15], at[109]);    MULADD(at[16], at[108]);    MULADD(at[17], at[107]);    MULADD(at[18], at[106]);    MULADD(at[19], at[105]);    MULADD(at[20], at[104]);    MULADD(at[21], at[103]);    MULADD(at[22], at[102]);    MULADD(at[23], at[101]);    MULADD(at[24], at[100]);    MULADD(at[25], at[99]);    MULADD(at[26], at[98]);    MULADD(at[27], at[97]);    MULADD(at[28], at[96]);    MULADD(at[29], at[95]);    MULADD(at[30], at[94]);    MULADD(at[31], at[93]);    MULADD(at[32], at[92]);    MULADD(at[33], at[91]);    MULADD(at[34], at[90]);    MULADD(at[35], at[89]);    MULADD(at[36], at[88]);    MULADD(at[37], at[87]);    MULADD(at[38], at[86]);    MULADD(at[39], at[85]);    MULADD(at[40], at[84]);    MULADD(at[41], at[83]);    MULADD(at[42], at[82]);    MULADD(at[43], at[81]);    MULADD(at[44], at[80]);    MULADD(at[45], at[79]);    MULADD(at[46], at[78]);    MULADD(at[47], at[77]);    MULADD(at[48], at[76]);    MULADD(at[49], at[75]);    MULADD(at[50], at[74]);    MULADD(at[51], at[73]);    MULADD(at[52], at[72]);    MULADD(at[53], at[71]);    MULADD(at[54], at[70]);    MULADD(at[55], at[69]);    MULADD(at[56], at[68]);    MULADD(at[57], at[67]);    MULADD(at[58], at[66]);    MULADD(at[59], at[65]);    MULADD(at[60], at[64]);
4167    COMBA_STORE(C->dp[60]);
4168    /* 61 */
4169    COMBA_FORWARD;
4170    MULADD(at[0], at[125]);    MULADD(at[1], at[124]);    MULADD(at[2], at[123]);    MULADD(at[3], at[122]);    MULADD(at[4], at[121]);    MULADD(at[5], at[120]);    MULADD(at[6], at[119]);    MULADD(at[7], at[118]);    MULADD(at[8], at[117]);    MULADD(at[9], at[116]);    MULADD(at[10], at[115]);    MULADD(at[11], at[114]);    MULADD(at[12], at[113]);    MULADD(at[13], at[112]);    MULADD(at[14], at[111]);    MULADD(at[15], at[110]);    MULADD(at[16], at[109]);    MULADD(at[17], at[108]);    MULADD(at[18], at[107]);    MULADD(at[19], at[106]);    MULADD(at[20], at[105]);    MULADD(at[21], at[104]);    MULADD(at[22], at[103]);    MULADD(at[23], at[102]);    MULADD(at[24], at[101]);    MULADD(at[25], at[100]);    MULADD(at[26], at[99]);    MULADD(at[27], at[98]);    MULADD(at[28], at[97]);    MULADD(at[29], at[96]);    MULADD(at[30], at[95]);    MULADD(at[31], at[94]);    MULADD(at[32], at[93]);    MULADD(at[33], at[92]);    MULADD(at[34], at[91]);    MULADD(at[35], at[90]);    MULADD(at[36], at[89]);    MULADD(at[37], at[88]);    MULADD(at[38], at[87]);    MULADD(at[39], at[86]);    MULADD(at[40], at[85]);    MULADD(at[41], at[84]);    MULADD(at[42], at[83]);    MULADD(at[43], at[82]);    MULADD(at[44], at[81]);    MULADD(at[45], at[80]);    MULADD(at[46], at[79]);    MULADD(at[47], at[78]);    MULADD(at[48], at[77]);    MULADD(at[49], at[76]);    MULADD(at[50], at[75]);    MULADD(at[51], at[74]);    MULADD(at[52], at[73]);    MULADD(at[53], at[72]);    MULADD(at[54], at[71]);    MULADD(at[55], at[70]);    MULADD(at[56], at[69]);    MULADD(at[57], at[68]);    MULADD(at[58], at[67]);    MULADD(at[59], at[66]);    MULADD(at[60], at[65]);    MULADD(at[61], at[64]);
4171    COMBA_STORE(C->dp[61]);
4172    /* 62 */
4173    COMBA_FORWARD;
4174    MULADD(at[0], at[126]);    MULADD(at[1], at[125]);    MULADD(at[2], at[124]);    MULADD(at[3], at[123]);    MULADD(at[4], at[122]);    MULADD(at[5], at[121]);    MULADD(at[6], at[120]);    MULADD(at[7], at[119]);    MULADD(at[8], at[118]);    MULADD(at[9], at[117]);    MULADD(at[10], at[116]);    MULADD(at[11], at[115]);    MULADD(at[12], at[114]);    MULADD(at[13], at[113]);    MULADD(at[14], at[112]);    MULADD(at[15], at[111]);    MULADD(at[16], at[110]);    MULADD(at[17], at[109]);    MULADD(at[18], at[108]);    MULADD(at[19], at[107]);    MULADD(at[20], at[106]);    MULADD(at[21], at[105]);    MULADD(at[22], at[104]);    MULADD(at[23], at[103]);    MULADD(at[24], at[102]);    MULADD(at[25], at[101]);    MULADD(at[26], at[100]);    MULADD(at[27], at[99]);    MULADD(at[28], at[98]);    MULADD(at[29], at[97]);    MULADD(at[30], at[96]);    MULADD(at[31], at[95]);    MULADD(at[32], at[94]);    MULADD(at[33], at[93]);    MULADD(at[34], at[92]);    MULADD(at[35], at[91]);    MULADD(at[36], at[90]);    MULADD(at[37], at[89]);    MULADD(at[38], at[88]);    MULADD(at[39], at[87]);    MULADD(at[40], at[86]);    MULADD(at[41], at[85]);    MULADD(at[42], at[84]);    MULADD(at[43], at[83]);    MULADD(at[44], at[82]);    MULADD(at[45], at[81]);    MULADD(at[46], at[80]);    MULADD(at[47], at[79]);    MULADD(at[48], at[78]);    MULADD(at[49], at[77]);    MULADD(at[50], at[76]);    MULADD(at[51], at[75]);    MULADD(at[52], at[74]);    MULADD(at[53], at[73]);    MULADD(at[54], at[72]);    MULADD(at[55], at[71]);    MULADD(at[56], at[70]);    MULADD(at[57], at[69]);    MULADD(at[58], at[68]);    MULADD(at[59], at[67]);    MULADD(at[60], at[66]);    MULADD(at[61], at[65]);    MULADD(at[62], at[64]);
4175    COMBA_STORE(C->dp[62]);
4176    /* 63 */
4177    COMBA_FORWARD;
4178    MULADD(at[0], at[127]);    MULADD(at[1], at[126]);    MULADD(at[2], at[125]);    MULADD(at[3], at[124]);    MULADD(at[4], at[123]);    MULADD(at[5], at[122]);    MULADD(at[6], at[121]);    MULADD(at[7], at[120]);    MULADD(at[8], at[119]);    MULADD(at[9], at[118]);    MULADD(at[10], at[117]);    MULADD(at[11], at[116]);    MULADD(at[12], at[115]);    MULADD(at[13], at[114]);    MULADD(at[14], at[113]);    MULADD(at[15], at[112]);    MULADD(at[16], at[111]);    MULADD(at[17], at[110]);    MULADD(at[18], at[109]);    MULADD(at[19], at[108]);    MULADD(at[20], at[107]);    MULADD(at[21], at[106]);    MULADD(at[22], at[105]);    MULADD(at[23], at[104]);    MULADD(at[24], at[103]);    MULADD(at[25], at[102]);    MULADD(at[26], at[101]);    MULADD(at[27], at[100]);    MULADD(at[28], at[99]);    MULADD(at[29], at[98]);    MULADD(at[30], at[97]);    MULADD(at[31], at[96]);    MULADD(at[32], at[95]);    MULADD(at[33], at[94]);    MULADD(at[34], at[93]);    MULADD(at[35], at[92]);    MULADD(at[36], at[91]);    MULADD(at[37], at[90]);    MULADD(at[38], at[89]);    MULADD(at[39], at[88]);    MULADD(at[40], at[87]);    MULADD(at[41], at[86]);    MULADD(at[42], at[85]);    MULADD(at[43], at[84]);    MULADD(at[44], at[83]);    MULADD(at[45], at[82]);    MULADD(at[46], at[81]);    MULADD(at[47], at[80]);    MULADD(at[48], at[79]);    MULADD(at[49], at[78]);    MULADD(at[50], at[77]);    MULADD(at[51], at[76]);    MULADD(at[52], at[75]);    MULADD(at[53], at[74]);    MULADD(at[54], at[73]);    MULADD(at[55], at[72]);    MULADD(at[56], at[71]);    MULADD(at[57], at[70]);    MULADD(at[58], at[69]);    MULADD(at[59], at[68]);    MULADD(at[60], at[67]);    MULADD(at[61], at[66]);    MULADD(at[62], at[65]);    MULADD(at[63], at[64]);
4179    COMBA_STORE(C->dp[63]);
4180    /* 64 */
4181    COMBA_FORWARD;
4182    MULADD(at[1], at[127]);    MULADD(at[2], at[126]);    MULADD(at[3], at[125]);    MULADD(at[4], at[124]);    MULADD(at[5], at[123]);    MULADD(at[6], at[122]);    MULADD(at[7], at[121]);    MULADD(at[8], at[120]);    MULADD(at[9], at[119]);    MULADD(at[10], at[118]);    MULADD(at[11], at[117]);    MULADD(at[12], at[116]);    MULADD(at[13], at[115]);    MULADD(at[14], at[114]);    MULADD(at[15], at[113]);    MULADD(at[16], at[112]);    MULADD(at[17], at[111]);    MULADD(at[18], at[110]);    MULADD(at[19], at[109]);    MULADD(at[20], at[108]);    MULADD(at[21], at[107]);    MULADD(at[22], at[106]);    MULADD(at[23], at[105]);    MULADD(at[24], at[104]);    MULADD(at[25], at[103]);    MULADD(at[26], at[102]);    MULADD(at[27], at[101]);    MULADD(at[28], at[100]);    MULADD(at[29], at[99]);    MULADD(at[30], at[98]);    MULADD(at[31], at[97]);    MULADD(at[32], at[96]);    MULADD(at[33], at[95]);    MULADD(at[34], at[94]);    MULADD(at[35], at[93]);    MULADD(at[36], at[92]);    MULADD(at[37], at[91]);    MULADD(at[38], at[90]);    MULADD(at[39], at[89]);    MULADD(at[40], at[88]);    MULADD(at[41], at[87]);    MULADD(at[42], at[86]);    MULADD(at[43], at[85]);    MULADD(at[44], at[84]);    MULADD(at[45], at[83]);    MULADD(at[46], at[82]);    MULADD(at[47], at[81]);    MULADD(at[48], at[80]);    MULADD(at[49], at[79]);    MULADD(at[50], at[78]);    MULADD(at[51], at[77]);    MULADD(at[52], at[76]);    MULADD(at[53], at[75]);    MULADD(at[54], at[74]);    MULADD(at[55], at[73]);    MULADD(at[56], at[72]);    MULADD(at[57], at[71]);    MULADD(at[58], at[70]);    MULADD(at[59], at[69]);    MULADD(at[60], at[68]);    MULADD(at[61], at[67]);    MULADD(at[62], at[66]);    MULADD(at[63], at[65]);
4183    COMBA_STORE(C->dp[64]);
4184    /* 65 */
4185    COMBA_FORWARD;
4186    MULADD(at[2], at[127]);    MULADD(at[3], at[126]);    MULADD(at[4], at[125]);    MULADD(at[5], at[124]);    MULADD(at[6], at[123]);    MULADD(at[7], at[122]);    MULADD(at[8], at[121]);    MULADD(at[9], at[120]);    MULADD(at[10], at[119]);    MULADD(at[11], at[118]);    MULADD(at[12], at[117]);    MULADD(at[13], at[116]);    MULADD(at[14], at[115]);    MULADD(at[15], at[114]);    MULADD(at[16], at[113]);    MULADD(at[17], at[112]);    MULADD(at[18], at[111]);    MULADD(at[19], at[110]);    MULADD(at[20], at[109]);    MULADD(at[21], at[108]);    MULADD(at[22], at[107]);    MULADD(at[23], at[106]);    MULADD(at[24], at[105]);    MULADD(at[25], at[104]);    MULADD(at[26], at[103]);    MULADD(at[27], at[102]);    MULADD(at[28], at[101]);    MULADD(at[29], at[100]);    MULADD(at[30], at[99]);    MULADD(at[31], at[98]);    MULADD(at[32], at[97]);    MULADD(at[33], at[96]);    MULADD(at[34], at[95]);    MULADD(at[35], at[94]);    MULADD(at[36], at[93]);    MULADD(at[37], at[92]);    MULADD(at[38], at[91]);    MULADD(at[39], at[90]);    MULADD(at[40], at[89]);    MULADD(at[41], at[88]);    MULADD(at[42], at[87]);    MULADD(at[43], at[86]);    MULADD(at[44], at[85]);    MULADD(at[45], at[84]);    MULADD(at[46], at[83]);    MULADD(at[47], at[82]);    MULADD(at[48], at[81]);    MULADD(at[49], at[80]);    MULADD(at[50], at[79]);    MULADD(at[51], at[78]);    MULADD(at[52], at[77]);    MULADD(at[53], at[76]);    MULADD(at[54], at[75]);    MULADD(at[55], at[74]);    MULADD(at[56], at[73]);    MULADD(at[57], at[72]);    MULADD(at[58], at[71]);    MULADD(at[59], at[70]);    MULADD(at[60], at[69]);    MULADD(at[61], at[68]);    MULADD(at[62], at[67]);    MULADD(at[63], at[66]);
4187    COMBA_STORE(C->dp[65]);
4188    /* 66 */
4189    COMBA_FORWARD;
4190    MULADD(at[3], at[127]);    MULADD(at[4], at[126]);    MULADD(at[5], at[125]);    MULADD(at[6], at[124]);    MULADD(at[7], at[123]);    MULADD(at[8], at[122]);    MULADD(at[9], at[121]);    MULADD(at[10], at[120]);    MULADD(at[11], at[119]);    MULADD(at[12], at[118]);    MULADD(at[13], at[117]);    MULADD(at[14], at[116]);    MULADD(at[15], at[115]);    MULADD(at[16], at[114]);    MULADD(at[17], at[113]);    MULADD(at[18], at[112]);    MULADD(at[19], at[111]);    MULADD(at[20], at[110]);    MULADD(at[21], at[109]);    MULADD(at[22], at[108]);    MULADD(at[23], at[107]);    MULADD(at[24], at[106]);    MULADD(at[25], at[105]);    MULADD(at[26], at[104]);    MULADD(at[27], at[103]);    MULADD(at[28], at[102]);    MULADD(at[29], at[101]);    MULADD(at[30], at[100]);    MULADD(at[31], at[99]);    MULADD(at[32], at[98]);    MULADD(at[33], at[97]);    MULADD(at[34], at[96]);    MULADD(at[35], at[95]);    MULADD(at[36], at[94]);    MULADD(at[37], at[93]);    MULADD(at[38], at[92]);    MULADD(at[39], at[91]);    MULADD(at[40], at[90]);    MULADD(at[41], at[89]);    MULADD(at[42], at[88]);    MULADD(at[43], at[87]);    MULADD(at[44], at[86]);    MULADD(at[45], at[85]);    MULADD(at[46], at[84]);    MULADD(at[47], at[83]);    MULADD(at[48], at[82]);    MULADD(at[49], at[81]);    MULADD(at[50], at[80]);    MULADD(at[51], at[79]);    MULADD(at[52], at[78]);    MULADD(at[53], at[77]);    MULADD(at[54], at[76]);    MULADD(at[55], at[75]);    MULADD(at[56], at[74]);    MULADD(at[57], at[73]);    MULADD(at[58], at[72]);    MULADD(at[59], at[71]);    MULADD(at[60], at[70]);    MULADD(at[61], at[69]);    MULADD(at[62], at[68]);    MULADD(at[63], at[67]);
4191    COMBA_STORE(C->dp[66]);
4192    /* 67 */
4193    COMBA_FORWARD;
4194    MULADD(at[4], at[127]);    MULADD(at[5], at[126]);    MULADD(at[6], at[125]);    MULADD(at[7], at[124]);    MULADD(at[8], at[123]);    MULADD(at[9], at[122]);    MULADD(at[10], at[121]);    MULADD(at[11], at[120]);    MULADD(at[12], at[119]);    MULADD(at[13], at[118]);    MULADD(at[14], at[117]);    MULADD(at[15], at[116]);    MULADD(at[16], at[115]);    MULADD(at[17], at[114]);    MULADD(at[18], at[113]);    MULADD(at[19], at[112]);    MULADD(at[20], at[111]);    MULADD(at[21], at[110]);    MULADD(at[22], at[109]);    MULADD(at[23], at[108]);    MULADD(at[24], at[107]);    MULADD(at[25], at[106]);    MULADD(at[26], at[105]);    MULADD(at[27], at[104]);    MULADD(at[28], at[103]);    MULADD(at[29], at[102]);    MULADD(at[30], at[101]);    MULADD(at[31], at[100]);    MULADD(at[32], at[99]);    MULADD(at[33], at[98]);    MULADD(at[34], at[97]);    MULADD(at[35], at[96]);    MULADD(at[36], at[95]);    MULADD(at[37], at[94]);    MULADD(at[38], at[93]);    MULADD(at[39], at[92]);    MULADD(at[40], at[91]);    MULADD(at[41], at[90]);    MULADD(at[42], at[89]);    MULADD(at[43], at[88]);    MULADD(at[44], at[87]);    MULADD(at[45], at[86]);    MULADD(at[46], at[85]);    MULADD(at[47], at[84]);    MULADD(at[48], at[83]);    MULADD(at[49], at[82]);    MULADD(at[50], at[81]);    MULADD(at[51], at[80]);    MULADD(at[52], at[79]);    MULADD(at[53], at[78]);    MULADD(at[54], at[77]);    MULADD(at[55], at[76]);    MULADD(at[56], at[75]);    MULADD(at[57], at[74]);    MULADD(at[58], at[73]);    MULADD(at[59], at[72]);    MULADD(at[60], at[71]);    MULADD(at[61], at[70]);    MULADD(at[62], at[69]);    MULADD(at[63], at[68]);
4195    COMBA_STORE(C->dp[67]);
4196    /* 68 */
4197    COMBA_FORWARD;
4198    MULADD(at[5], at[127]);    MULADD(at[6], at[126]);    MULADD(at[7], at[125]);    MULADD(at[8], at[124]);    MULADD(at[9], at[123]);    MULADD(at[10], at[122]);    MULADD(at[11], at[121]);    MULADD(at[12], at[120]);    MULADD(at[13], at[119]);    MULADD(at[14], at[118]);    MULADD(at[15], at[117]);    MULADD(at[16], at[116]);    MULADD(at[17], at[115]);    MULADD(at[18], at[114]);    MULADD(at[19], at[113]);    MULADD(at[20], at[112]);    MULADD(at[21], at[111]);    MULADD(at[22], at[110]);    MULADD(at[23], at[109]);    MULADD(at[24], at[108]);    MULADD(at[25], at[107]);    MULADD(at[26], at[106]);    MULADD(at[27], at[105]);    MULADD(at[28], at[104]);    MULADD(at[29], at[103]);    MULADD(at[30], at[102]);    MULADD(at[31], at[101]);    MULADD(at[32], at[100]);    MULADD(at[33], at[99]);    MULADD(at[34], at[98]);    MULADD(at[35], at[97]);    MULADD(at[36], at[96]);    MULADD(at[37], at[95]);    MULADD(at[38], at[94]);    MULADD(at[39], at[93]);    MULADD(at[40], at[92]);    MULADD(at[41], at[91]);    MULADD(at[42], at[90]);    MULADD(at[43], at[89]);    MULADD(at[44], at[88]);    MULADD(at[45], at[87]);    MULADD(at[46], at[86]);    MULADD(at[47], at[85]);    MULADD(at[48], at[84]);    MULADD(at[49], at[83]);    MULADD(at[50], at[82]);    MULADD(at[51], at[81]);    MULADD(at[52], at[80]);    MULADD(at[53], at[79]);    MULADD(at[54], at[78]);    MULADD(at[55], at[77]);    MULADD(at[56], at[76]);    MULADD(at[57], at[75]);    MULADD(at[58], at[74]);    MULADD(at[59], at[73]);    MULADD(at[60], at[72]);    MULADD(at[61], at[71]);    MULADD(at[62], at[70]);    MULADD(at[63], at[69]);
4199    COMBA_STORE(C->dp[68]);
4200    /* 69 */
4201    COMBA_FORWARD;
4202    MULADD(at[6], at[127]);    MULADD(at[7], at[126]);    MULADD(at[8], at[125]);    MULADD(at[9], at[124]);    MULADD(at[10], at[123]);    MULADD(at[11], at[122]);    MULADD(at[12], at[121]);    MULADD(at[13], at[120]);    MULADD(at[14], at[119]);    MULADD(at[15], at[118]);    MULADD(at[16], at[117]);    MULADD(at[17], at[116]);    MULADD(at[18], at[115]);    MULADD(at[19], at[114]);    MULADD(at[20], at[113]);    MULADD(at[21], at[112]);    MULADD(at[22], at[111]);    MULADD(at[23], at[110]);    MULADD(at[24], at[109]);    MULADD(at[25], at[108]);    MULADD(at[26], at[107]);    MULADD(at[27], at[106]);    MULADD(at[28], at[105]);    MULADD(at[29], at[104]);    MULADD(at[30], at[103]);    MULADD(at[31], at[102]);    MULADD(at[32], at[101]);    MULADD(at[33], at[100]);    MULADD(at[34], at[99]);    MULADD(at[35], at[98]);    MULADD(at[36], at[97]);    MULADD(at[37], at[96]);    MULADD(at[38], at[95]);    MULADD(at[39], at[94]);    MULADD(at[40], at[93]);    MULADD(at[41], at[92]);    MULADD(at[42], at[91]);    MULADD(at[43], at[90]);    MULADD(at[44], at[89]);    MULADD(at[45], at[88]);    MULADD(at[46], at[87]);    MULADD(at[47], at[86]);    MULADD(at[48], at[85]);    MULADD(at[49], at[84]);    MULADD(at[50], at[83]);    MULADD(at[51], at[82]);    MULADD(at[52], at[81]);    MULADD(at[53], at[80]);    MULADD(at[54], at[79]);    MULADD(at[55], at[78]);    MULADD(at[56], at[77]);    MULADD(at[57], at[76]);    MULADD(at[58], at[75]);    MULADD(at[59], at[74]);    MULADD(at[60], at[73]);    MULADD(at[61], at[72]);    MULADD(at[62], at[71]);    MULADD(at[63], at[70]);
4203    COMBA_STORE(C->dp[69]);
4204    /* 70 */
4205    COMBA_FORWARD;
4206    MULADD(at[7], at[127]);    MULADD(at[8], at[126]);    MULADD(at[9], at[125]);    MULADD(at[10], at[124]);    MULADD(at[11], at[123]);    MULADD(at[12], at[122]);    MULADD(at[13], at[121]);    MULADD(at[14], at[120]);    MULADD(at[15], at[119]);    MULADD(at[16], at[118]);    MULADD(at[17], at[117]);    MULADD(at[18], at[116]);    MULADD(at[19], at[115]);    MULADD(at[20], at[114]);    MULADD(at[21], at[113]);    MULADD(at[22], at[112]);    MULADD(at[23], at[111]);    MULADD(at[24], at[110]);    MULADD(at[25], at[109]);    MULADD(at[26], at[108]);    MULADD(at[27], at[107]);    MULADD(at[28], at[106]);    MULADD(at[29], at[105]);    MULADD(at[30], at[104]);    MULADD(at[31], at[103]);    MULADD(at[32], at[102]);    MULADD(at[33], at[101]);    MULADD(at[34], at[100]);    MULADD(at[35], at[99]);    MULADD(at[36], at[98]);    MULADD(at[37], at[97]);    MULADD(at[38], at[96]);    MULADD(at[39], at[95]);    MULADD(at[40], at[94]);    MULADD(at[41], at[93]);    MULADD(at[42], at[92]);    MULADD(at[43], at[91]);    MULADD(at[44], at[90]);    MULADD(at[45], at[89]);    MULADD(at[46], at[88]);    MULADD(at[47], at[87]);    MULADD(at[48], at[86]);    MULADD(at[49], at[85]);    MULADD(at[50], at[84]);    MULADD(at[51], at[83]);    MULADD(at[52], at[82]);    MULADD(at[53], at[81]);    MULADD(at[54], at[80]);    MULADD(at[55], at[79]);    MULADD(at[56], at[78]);    MULADD(at[57], at[77]);    MULADD(at[58], at[76]);    MULADD(at[59], at[75]);    MULADD(at[60], at[74]);    MULADD(at[61], at[73]);    MULADD(at[62], at[72]);    MULADD(at[63], at[71]);
4207    COMBA_STORE(C->dp[70]);
4208    /* 71 */
4209    COMBA_FORWARD;
4210    MULADD(at[8], at[127]);    MULADD(at[9], at[126]);    MULADD(at[10], at[125]);    MULADD(at[11], at[124]);    MULADD(at[12], at[123]);    MULADD(at[13], at[122]);    MULADD(at[14], at[121]);    MULADD(at[15], at[120]);    MULADD(at[16], at[119]);    MULADD(at[17], at[118]);    MULADD(at[18], at[117]);    MULADD(at[19], at[116]);    MULADD(at[20], at[115]);    MULADD(at[21], at[114]);    MULADD(at[22], at[113]);    MULADD(at[23], at[112]);    MULADD(at[24], at[111]);    MULADD(at[25], at[110]);    MULADD(at[26], at[109]);    MULADD(at[27], at[108]);    MULADD(at[28], at[107]);    MULADD(at[29], at[106]);    MULADD(at[30], at[105]);    MULADD(at[31], at[104]);    MULADD(at[32], at[103]);    MULADD(at[33], at[102]);    MULADD(at[34], at[101]);    MULADD(at[35], at[100]);    MULADD(at[36], at[99]);    MULADD(at[37], at[98]);    MULADD(at[38], at[97]);    MULADD(at[39], at[96]);    MULADD(at[40], at[95]);    MULADD(at[41], at[94]);    MULADD(at[42], at[93]);    MULADD(at[43], at[92]);    MULADD(at[44], at[91]);    MULADD(at[45], at[90]);    MULADD(at[46], at[89]);    MULADD(at[47], at[88]);    MULADD(at[48], at[87]);    MULADD(at[49], at[86]);    MULADD(at[50], at[85]);    MULADD(at[51], at[84]);    MULADD(at[52], at[83]);    MULADD(at[53], at[82]);    MULADD(at[54], at[81]);    MULADD(at[55], at[80]);    MULADD(at[56], at[79]);    MULADD(at[57], at[78]);    MULADD(at[58], at[77]);    MULADD(at[59], at[76]);    MULADD(at[60], at[75]);    MULADD(at[61], at[74]);    MULADD(at[62], at[73]);    MULADD(at[63], at[72]);
4211    COMBA_STORE(C->dp[71]);
4212    /* 72 */
4213    COMBA_FORWARD;
4214    MULADD(at[9], at[127]);    MULADD(at[10], at[126]);    MULADD(at[11], at[125]);    MULADD(at[12], at[124]);    MULADD(at[13], at[123]);    MULADD(at[14], at[122]);    MULADD(at[15], at[121]);    MULADD(at[16], at[120]);    MULADD(at[17], at[119]);    MULADD(at[18], at[118]);    MULADD(at[19], at[117]);    MULADD(at[20], at[116]);    MULADD(at[21], at[115]);    MULADD(at[22], at[114]);    MULADD(at[23], at[113]);    MULADD(at[24], at[112]);    MULADD(at[25], at[111]);    MULADD(at[26], at[110]);    MULADD(at[27], at[109]);    MULADD(at[28], at[108]);    MULADD(at[29], at[107]);    MULADD(at[30], at[106]);    MULADD(at[31], at[105]);    MULADD(at[32], at[104]);    MULADD(at[33], at[103]);    MULADD(at[34], at[102]);    MULADD(at[35], at[101]);    MULADD(at[36], at[100]);    MULADD(at[37], at[99]);    MULADD(at[38], at[98]);    MULADD(at[39], at[97]);    MULADD(at[40], at[96]);    MULADD(at[41], at[95]);    MULADD(at[42], at[94]);    MULADD(at[43], at[93]);    MULADD(at[44], at[92]);    MULADD(at[45], at[91]);    MULADD(at[46], at[90]);    MULADD(at[47], at[89]);    MULADD(at[48], at[88]);    MULADD(at[49], at[87]);    MULADD(at[50], at[86]);    MULADD(at[51], at[85]);    MULADD(at[52], at[84]);    MULADD(at[53], at[83]);    MULADD(at[54], at[82]);    MULADD(at[55], at[81]);    MULADD(at[56], at[80]);    MULADD(at[57], at[79]);    MULADD(at[58], at[78]);    MULADD(at[59], at[77]);    MULADD(at[60], at[76]);    MULADD(at[61], at[75]);    MULADD(at[62], at[74]);    MULADD(at[63], at[73]);
4215    COMBA_STORE(C->dp[72]);
4216    /* 73 */
4217    COMBA_FORWARD;
4218    MULADD(at[10], at[127]);    MULADD(at[11], at[126]);    MULADD(at[12], at[125]);    MULADD(at[13], at[124]);    MULADD(at[14], at[123]);    MULADD(at[15], at[122]);    MULADD(at[16], at[121]);    MULADD(at[17], at[120]);    MULADD(at[18], at[119]);    MULADD(at[19], at[118]);    MULADD(at[20], at[117]);    MULADD(at[21], at[116]);    MULADD(at[22], at[115]);    MULADD(at[23], at[114]);    MULADD(at[24], at[113]);    MULADD(at[25], at[112]);    MULADD(at[26], at[111]);    MULADD(at[27], at[110]);    MULADD(at[28], at[109]);    MULADD(at[29], at[108]);    MULADD(at[30], at[107]);    MULADD(at[31], at[106]);    MULADD(at[32], at[105]);    MULADD(at[33], at[104]);    MULADD(at[34], at[103]);    MULADD(at[35], at[102]);    MULADD(at[36], at[101]);    MULADD(at[37], at[100]);    MULADD(at[38], at[99]);    MULADD(at[39], at[98]);    MULADD(at[40], at[97]);    MULADD(at[41], at[96]);    MULADD(at[42], at[95]);    MULADD(at[43], at[94]);    MULADD(at[44], at[93]);    MULADD(at[45], at[92]);    MULADD(at[46], at[91]);    MULADD(at[47], at[90]);    MULADD(at[48], at[89]);    MULADD(at[49], at[88]);    MULADD(at[50], at[87]);    MULADD(at[51], at[86]);    MULADD(at[52], at[85]);    MULADD(at[53], at[84]);    MULADD(at[54], at[83]);    MULADD(at[55], at[82]);    MULADD(at[56], at[81]);    MULADD(at[57], at[80]);    MULADD(at[58], at[79]);    MULADD(at[59], at[78]);    MULADD(at[60], at[77]);    MULADD(at[61], at[76]);    MULADD(at[62], at[75]);    MULADD(at[63], at[74]);
4219    COMBA_STORE(C->dp[73]);
4220    /* 74 */
4221    COMBA_FORWARD;
4222    MULADD(at[11], at[127]);    MULADD(at[12], at[126]);    MULADD(at[13], at[125]);    MULADD(at[14], at[124]);    MULADD(at[15], at[123]);    MULADD(at[16], at[122]);    MULADD(at[17], at[121]);    MULADD(at[18], at[120]);    MULADD(at[19], at[119]);    MULADD(at[20], at[118]);    MULADD(at[21], at[117]);    MULADD(at[22], at[116]);    MULADD(at[23], at[115]);    MULADD(at[24], at[114]);    MULADD(at[25], at[113]);    MULADD(at[26], at[112]);    MULADD(at[27], at[111]);    MULADD(at[28], at[110]);    MULADD(at[29], at[109]);    MULADD(at[30], at[108]);    MULADD(at[31], at[107]);    MULADD(at[32], at[106]);    MULADD(at[33], at[105]);    MULADD(at[34], at[104]);    MULADD(at[35], at[103]);    MULADD(at[36], at[102]);    MULADD(at[37], at[101]);    MULADD(at[38], at[100]);    MULADD(at[39], at[99]);    MULADD(at[40], at[98]);    MULADD(at[41], at[97]);    MULADD(at[42], at[96]);    MULADD(at[43], at[95]);    MULADD(at[44], at[94]);    MULADD(at[45], at[93]);    MULADD(at[46], at[92]);    MULADD(at[47], at[91]);    MULADD(at[48], at[90]);    MULADD(at[49], at[89]);    MULADD(at[50], at[88]);    MULADD(at[51], at[87]);    MULADD(at[52], at[86]);    MULADD(at[53], at[85]);    MULADD(at[54], at[84]);    MULADD(at[55], at[83]);    MULADD(at[56], at[82]);    MULADD(at[57], at[81]);    MULADD(at[58], at[80]);    MULADD(at[59], at[79]);    MULADD(at[60], at[78]);    MULADD(at[61], at[77]);    MULADD(at[62], at[76]);    MULADD(at[63], at[75]);
4223    COMBA_STORE(C->dp[74]);
4224    /* 75 */
4225    COMBA_FORWARD;
4226    MULADD(at[12], at[127]);    MULADD(at[13], at[126]);    MULADD(at[14], at[125]);    MULADD(at[15], at[124]);    MULADD(at[16], at[123]);    MULADD(at[17], at[122]);    MULADD(at[18], at[121]);    MULADD(at[19], at[120]);    MULADD(at[20], at[119]);    MULADD(at[21], at[118]);    MULADD(at[22], at[117]);    MULADD(at[23], at[116]);    MULADD(at[24], at[115]);    MULADD(at[25], at[114]);    MULADD(at[26], at[113]);    MULADD(at[27], at[112]);    MULADD(at[28], at[111]);    MULADD(at[29], at[110]);    MULADD(at[30], at[109]);    MULADD(at[31], at[108]);    MULADD(at[32], at[107]);    MULADD(at[33], at[106]);    MULADD(at[34], at[105]);    MULADD(at[35], at[104]);    MULADD(at[36], at[103]);    MULADD(at[37], at[102]);    MULADD(at[38], at[101]);    MULADD(at[39], at[100]);    MULADD(at[40], at[99]);    MULADD(at[41], at[98]);    MULADD(at[42], at[97]);    MULADD(at[43], at[96]);    MULADD(at[44], at[95]);    MULADD(at[45], at[94]);    MULADD(at[46], at[93]);    MULADD(at[47], at[92]);    MULADD(at[48], at[91]);    MULADD(at[49], at[90]);    MULADD(at[50], at[89]);    MULADD(at[51], at[88]);    MULADD(at[52], at[87]);    MULADD(at[53], at[86]);    MULADD(at[54], at[85]);    MULADD(at[55], at[84]);    MULADD(at[56], at[83]);    MULADD(at[57], at[82]);    MULADD(at[58], at[81]);    MULADD(at[59], at[80]);    MULADD(at[60], at[79]);    MULADD(at[61], at[78]);    MULADD(at[62], at[77]);    MULADD(at[63], at[76]);
4227    COMBA_STORE(C->dp[75]);
4228    /* 76 */
4229    COMBA_FORWARD;
4230    MULADD(at[13], at[127]);    MULADD(at[14], at[126]);    MULADD(at[15], at[125]);    MULADD(at[16], at[124]);    MULADD(at[17], at[123]);    MULADD(at[18], at[122]);    MULADD(at[19], at[121]);    MULADD(at[20], at[120]);    MULADD(at[21], at[119]);    MULADD(at[22], at[118]);    MULADD(at[23], at[117]);    MULADD(at[24], at[116]);    MULADD(at[25], at[115]);    MULADD(at[26], at[114]);    MULADD(at[27], at[113]);    MULADD(at[28], at[112]);    MULADD(at[29], at[111]);    MULADD(at[30], at[110]);    MULADD(at[31], at[109]);    MULADD(at[32], at[108]);    MULADD(at[33], at[107]);    MULADD(at[34], at[106]);    MULADD(at[35], at[105]);    MULADD(at[36], at[104]);    MULADD(at[37], at[103]);    MULADD(at[38], at[102]);    MULADD(at[39], at[101]);    MULADD(at[40], at[100]);    MULADD(at[41], at[99]);    MULADD(at[42], at[98]);    MULADD(at[43], at[97]);    MULADD(at[44], at[96]);    MULADD(at[45], at[95]);    MULADD(at[46], at[94]);    MULADD(at[47], at[93]);    MULADD(at[48], at[92]);    MULADD(at[49], at[91]);    MULADD(at[50], at[90]);    MULADD(at[51], at[89]);    MULADD(at[52], at[88]);    MULADD(at[53], at[87]);    MULADD(at[54], at[86]);    MULADD(at[55], at[85]);    MULADD(at[56], at[84]);    MULADD(at[57], at[83]);    MULADD(at[58], at[82]);    MULADD(at[59], at[81]);    MULADD(at[60], at[80]);    MULADD(at[61], at[79]);    MULADD(at[62], at[78]);    MULADD(at[63], at[77]);
4231    COMBA_STORE(C->dp[76]);
4232    /* 77 */
4233    COMBA_FORWARD;
4234    MULADD(at[14], at[127]);    MULADD(at[15], at[126]);    MULADD(at[16], at[125]);    MULADD(at[17], at[124]);    MULADD(at[18], at[123]);    MULADD(at[19], at[122]);    MULADD(at[20], at[121]);    MULADD(at[21], at[120]);    MULADD(at[22], at[119]);    MULADD(at[23], at[118]);    MULADD(at[24], at[117]);    MULADD(at[25], at[116]);    MULADD(at[26], at[115]);    MULADD(at[27], at[114]);    MULADD(at[28], at[113]);    MULADD(at[29], at[112]);    MULADD(at[30], at[111]);    MULADD(at[31], at[110]);    MULADD(at[32], at[109]);    MULADD(at[33], at[108]);    MULADD(at[34], at[107]);    MULADD(at[35], at[106]);    MULADD(at[36], at[105]);    MULADD(at[37], at[104]);    MULADD(at[38], at[103]);    MULADD(at[39], at[102]);    MULADD(at[40], at[101]);    MULADD(at[41], at[100]);    MULADD(at[42], at[99]);    MULADD(at[43], at[98]);    MULADD(at[44], at[97]);    MULADD(at[45], at[96]);    MULADD(at[46], at[95]);    MULADD(at[47], at[94]);    MULADD(at[48], at[93]);    MULADD(at[49], at[92]);    MULADD(at[50], at[91]);    MULADD(at[51], at[90]);    MULADD(at[52], at[89]);    MULADD(at[53], at[88]);    MULADD(at[54], at[87]);    MULADD(at[55], at[86]);    MULADD(at[56], at[85]);    MULADD(at[57], at[84]);    MULADD(at[58], at[83]);    MULADD(at[59], at[82]);    MULADD(at[60], at[81]);    MULADD(at[61], at[80]);    MULADD(at[62], at[79]);    MULADD(at[63], at[78]);
4235    COMBA_STORE(C->dp[77]);
4236    /* 78 */
4237    COMBA_FORWARD;
4238    MULADD(at[15], at[127]);    MULADD(at[16], at[126]);    MULADD(at[17], at[125]);    MULADD(at[18], at[124]);    MULADD(at[19], at[123]);    MULADD(at[20], at[122]);    MULADD(at[21], at[121]);    MULADD(at[22], at[120]);    MULADD(at[23], at[119]);    MULADD(at[24], at[118]);    MULADD(at[25], at[117]);    MULADD(at[26], at[116]);    MULADD(at[27], at[115]);    MULADD(at[28], at[114]);    MULADD(at[29], at[113]);    MULADD(at[30], at[112]);    MULADD(at[31], at[111]);    MULADD(at[32], at[110]);    MULADD(at[33], at[109]);    MULADD(at[34], at[108]);    MULADD(at[35], at[107]);    MULADD(at[36], at[106]);    MULADD(at[37], at[105]);    MULADD(at[38], at[104]);    MULADD(at[39], at[103]);    MULADD(at[40], at[102]);    MULADD(at[41], at[101]);    MULADD(at[42], at[100]);    MULADD(at[43], at[99]);    MULADD(at[44], at[98]);    MULADD(at[45], at[97]);    MULADD(at[46], at[96]);    MULADD(at[47], at[95]);    MULADD(at[48], at[94]);    MULADD(at[49], at[93]);    MULADD(at[50], at[92]);    MULADD(at[51], at[91]);    MULADD(at[52], at[90]);    MULADD(at[53], at[89]);    MULADD(at[54], at[88]);    MULADD(at[55], at[87]);    MULADD(at[56], at[86]);    MULADD(at[57], at[85]);    MULADD(at[58], at[84]);    MULADD(at[59], at[83]);    MULADD(at[60], at[82]);    MULADD(at[61], at[81]);    MULADD(at[62], at[80]);    MULADD(at[63], at[79]);
4239    COMBA_STORE(C->dp[78]);
4240    /* 79 */
4241    COMBA_FORWARD;
4242    MULADD(at[16], at[127]);    MULADD(at[17], at[126]);    MULADD(at[18], at[125]);    MULADD(at[19], at[124]);    MULADD(at[20], at[123]);    MULADD(at[21], at[122]);    MULADD(at[22], at[121]);    MULADD(at[23], at[120]);    MULADD(at[24], at[119]);    MULADD(at[25], at[118]);    MULADD(at[26], at[117]);    MULADD(at[27], at[116]);    MULADD(at[28], at[115]);    MULADD(at[29], at[114]);    MULADD(at[30], at[113]);    MULADD(at[31], at[112]);    MULADD(at[32], at[111]);    MULADD(at[33], at[110]);    MULADD(at[34], at[109]);    MULADD(at[35], at[108]);    MULADD(at[36], at[107]);    MULADD(at[37], at[106]);    MULADD(at[38], at[105]);    MULADD(at[39], at[104]);    MULADD(at[40], at[103]);    MULADD(at[41], at[102]);    MULADD(at[42], at[101]);    MULADD(at[43], at[100]);    MULADD(at[44], at[99]);    MULADD(at[45], at[98]);    MULADD(at[46], at[97]);    MULADD(at[47], at[96]);    MULADD(at[48], at[95]);    MULADD(at[49], at[94]);    MULADD(at[50], at[93]);    MULADD(at[51], at[92]);    MULADD(at[52], at[91]);    MULADD(at[53], at[90]);    MULADD(at[54], at[89]);    MULADD(at[55], at[88]);    MULADD(at[56], at[87]);    MULADD(at[57], at[86]);    MULADD(at[58], at[85]);    MULADD(at[59], at[84]);    MULADD(at[60], at[83]);    MULADD(at[61], at[82]);    MULADD(at[62], at[81]);    MULADD(at[63], at[80]);
4243    COMBA_STORE(C->dp[79]);
4244    /* 80 */
4245    COMBA_FORWARD;
4246    MULADD(at[17], at[127]);    MULADD(at[18], at[126]);    MULADD(at[19], at[125]);    MULADD(at[20], at[124]);    MULADD(at[21], at[123]);    MULADD(at[22], at[122]);    MULADD(at[23], at[121]);    MULADD(at[24], at[120]);    MULADD(at[25], at[119]);    MULADD(at[26], at[118]);    MULADD(at[27], at[117]);    MULADD(at[28], at[116]);    MULADD(at[29], at[115]);    MULADD(at[30], at[114]);    MULADD(at[31], at[113]);    MULADD(at[32], at[112]);    MULADD(at[33], at[111]);    MULADD(at[34], at[110]);    MULADD(at[35], at[109]);    MULADD(at[36], at[108]);    MULADD(at[37], at[107]);    MULADD(at[38], at[106]);    MULADD(at[39], at[105]);    MULADD(at[40], at[104]);    MULADD(at[41], at[103]);    MULADD(at[42], at[102]);    MULADD(at[43], at[101]);    MULADD(at[44], at[100]);    MULADD(at[45], at[99]);    MULADD(at[46], at[98]);    MULADD(at[47], at[97]);    MULADD(at[48], at[96]);    MULADD(at[49], at[95]);    MULADD(at[50], at[94]);    MULADD(at[51], at[93]);    MULADD(at[52], at[92]);    MULADD(at[53], at[91]);    MULADD(at[54], at[90]);    MULADD(at[55], at[89]);    MULADD(at[56], at[88]);    MULADD(at[57], at[87]);    MULADD(at[58], at[86]);    MULADD(at[59], at[85]);    MULADD(at[60], at[84]);    MULADD(at[61], at[83]);    MULADD(at[62], at[82]);    MULADD(at[63], at[81]);
4247    COMBA_STORE(C->dp[80]);
4248    /* 81 */
4249    COMBA_FORWARD;
4250    MULADD(at[18], at[127]);    MULADD(at[19], at[126]);    MULADD(at[20], at[125]);    MULADD(at[21], at[124]);    MULADD(at[22], at[123]);    MULADD(at[23], at[122]);    MULADD(at[24], at[121]);    MULADD(at[25], at[120]);    MULADD(at[26], at[119]);    MULADD(at[27], at[118]);    MULADD(at[28], at[117]);    MULADD(at[29], at[116]);    MULADD(at[30], at[115]);    MULADD(at[31], at[114]);    MULADD(at[32], at[113]);    MULADD(at[33], at[112]);    MULADD(at[34], at[111]);    MULADD(at[35], at[110]);    MULADD(at[36], at[109]);    MULADD(at[37], at[108]);    MULADD(at[38], at[107]);    MULADD(at[39], at[106]);    MULADD(at[40], at[105]);    MULADD(at[41], at[104]);    MULADD(at[42], at[103]);    MULADD(at[43], at[102]);    MULADD(at[44], at[101]);    MULADD(at[45], at[100]);    MULADD(at[46], at[99]);    MULADD(at[47], at[98]);    MULADD(at[48], at[97]);    MULADD(at[49], at[96]);    MULADD(at[50], at[95]);    MULADD(at[51], at[94]);    MULADD(at[52], at[93]);    MULADD(at[53], at[92]);    MULADD(at[54], at[91]);    MULADD(at[55], at[90]);    MULADD(at[56], at[89]);    MULADD(at[57], at[88]);    MULADD(at[58], at[87]);    MULADD(at[59], at[86]);    MULADD(at[60], at[85]);    MULADD(at[61], at[84]);    MULADD(at[62], at[83]);    MULADD(at[63], at[82]);
4251    COMBA_STORE(C->dp[81]);
4252    /* 82 */
4253    COMBA_FORWARD;
4254    MULADD(at[19], at[127]);    MULADD(at[20], at[126]);    MULADD(at[21], at[125]);    MULADD(at[22], at[124]);    MULADD(at[23], at[123]);    MULADD(at[24], at[122]);    MULADD(at[25], at[121]);    MULADD(at[26], at[120]);    MULADD(at[27], at[119]);    MULADD(at[28], at[118]);    MULADD(at[29], at[117]);    MULADD(at[30], at[116]);    MULADD(at[31], at[115]);    MULADD(at[32], at[114]);    MULADD(at[33], at[113]);    MULADD(at[34], at[112]);    MULADD(at[35], at[111]);    MULADD(at[36], at[110]);    MULADD(at[37], at[109]);    MULADD(at[38], at[108]);    MULADD(at[39], at[107]);    MULADD(at[40], at[106]);    MULADD(at[41], at[105]);    MULADD(at[42], at[104]);    MULADD(at[43], at[103]);    MULADD(at[44], at[102]);    MULADD(at[45], at[101]);    MULADD(at[46], at[100]);    MULADD(at[47], at[99]);    MULADD(at[48], at[98]);    MULADD(at[49], at[97]);    MULADD(at[50], at[96]);    MULADD(at[51], at[95]);    MULADD(at[52], at[94]);    MULADD(at[53], at[93]);    MULADD(at[54], at[92]);    MULADD(at[55], at[91]);    MULADD(at[56], at[90]);    MULADD(at[57], at[89]);    MULADD(at[58], at[88]);    MULADD(at[59], at[87]);    MULADD(at[60], at[86]);    MULADD(at[61], at[85]);    MULADD(at[62], at[84]);    MULADD(at[63], at[83]);
4255    COMBA_STORE(C->dp[82]);
4256    /* 83 */
4257    COMBA_FORWARD;
4258    MULADD(at[20], at[127]);    MULADD(at[21], at[126]);    MULADD(at[22], at[125]);    MULADD(at[23], at[124]);    MULADD(at[24], at[123]);    MULADD(at[25], at[122]);    MULADD(at[26], at[121]);    MULADD(at[27], at[120]);    MULADD(at[28], at[119]);    MULADD(at[29], at[118]);    MULADD(at[30], at[117]);    MULADD(at[31], at[116]);    MULADD(at[32], at[115]);    MULADD(at[33], at[114]);    MULADD(at[34], at[113]);    MULADD(at[35], at[112]);    MULADD(at[36], at[111]);    MULADD(at[37], at[110]);    MULADD(at[38], at[109]);    MULADD(at[39], at[108]);    MULADD(at[40], at[107]);    MULADD(at[41], at[106]);    MULADD(at[42], at[105]);    MULADD(at[43], at[104]);    MULADD(at[44], at[103]);    MULADD(at[45], at[102]);    MULADD(at[46], at[101]);    MULADD(at[47], at[100]);    MULADD(at[48], at[99]);    MULADD(at[49], at[98]);    MULADD(at[50], at[97]);    MULADD(at[51], at[96]);    MULADD(at[52], at[95]);    MULADD(at[53], at[94]);    MULADD(at[54], at[93]);    MULADD(at[55], at[92]);    MULADD(at[56], at[91]);    MULADD(at[57], at[90]);    MULADD(at[58], at[89]);    MULADD(at[59], at[88]);    MULADD(at[60], at[87]);    MULADD(at[61], at[86]);    MULADD(at[62], at[85]);    MULADD(at[63], at[84]);
4259    COMBA_STORE(C->dp[83]);
4260    /* 84 */
4261    COMBA_FORWARD;
4262    MULADD(at[21], at[127]);    MULADD(at[22], at[126]);    MULADD(at[23], at[125]);    MULADD(at[24], at[124]);    MULADD(at[25], at[123]);    MULADD(at[26], at[122]);    MULADD(at[27], at[121]);    MULADD(at[28], at[120]);    MULADD(at[29], at[119]);    MULADD(at[30], at[118]);    MULADD(at[31], at[117]);    MULADD(at[32], at[116]);    MULADD(at[33], at[115]);    MULADD(at[34], at[114]);    MULADD(at[35], at[113]);    MULADD(at[36], at[112]);    MULADD(at[37], at[111]);    MULADD(at[38], at[110]);    MULADD(at[39], at[109]);    MULADD(at[40], at[108]);    MULADD(at[41], at[107]);    MULADD(at[42], at[106]);    MULADD(at[43], at[105]);    MULADD(at[44], at[104]);    MULADD(at[45], at[103]);    MULADD(at[46], at[102]);    MULADD(at[47], at[101]);    MULADD(at[48], at[100]);    MULADD(at[49], at[99]);    MULADD(at[50], at[98]);    MULADD(at[51], at[97]);    MULADD(at[52], at[96]);    MULADD(at[53], at[95]);    MULADD(at[54], at[94]);    MULADD(at[55], at[93]);    MULADD(at[56], at[92]);    MULADD(at[57], at[91]);    MULADD(at[58], at[90]);    MULADD(at[59], at[89]);    MULADD(at[60], at[88]);    MULADD(at[61], at[87]);    MULADD(at[62], at[86]);    MULADD(at[63], at[85]);
4263    COMBA_STORE(C->dp[84]);
4264    /* 85 */
4265    COMBA_FORWARD;
4266    MULADD(at[22], at[127]);    MULADD(at[23], at[126]);    MULADD(at[24], at[125]);    MULADD(at[25], at[124]);    MULADD(at[26], at[123]);    MULADD(at[27], at[122]);    MULADD(at[28], at[121]);    MULADD(at[29], at[120]);    MULADD(at[30], at[119]);    MULADD(at[31], at[118]);    MULADD(at[32], at[117]);    MULADD(at[33], at[116]);    MULADD(at[34], at[115]);    MULADD(at[35], at[114]);    MULADD(at[36], at[113]);    MULADD(at[37], at[112]);    MULADD(at[38], at[111]);    MULADD(at[39], at[110]);    MULADD(at[40], at[109]);    MULADD(at[41], at[108]);    MULADD(at[42], at[107]);    MULADD(at[43], at[106]);    MULADD(at[44], at[105]);    MULADD(at[45], at[104]);    MULADD(at[46], at[103]);    MULADD(at[47], at[102]);    MULADD(at[48], at[101]);    MULADD(at[49], at[100]);    MULADD(at[50], at[99]);    MULADD(at[51], at[98]);    MULADD(at[52], at[97]);    MULADD(at[53], at[96]);    MULADD(at[54], at[95]);    MULADD(at[55], at[94]);    MULADD(at[56], at[93]);    MULADD(at[57], at[92]);    MULADD(at[58], at[91]);    MULADD(at[59], at[90]);    MULADD(at[60], at[89]);    MULADD(at[61], at[88]);    MULADD(at[62], at[87]);    MULADD(at[63], at[86]);
4267    COMBA_STORE(C->dp[85]);
4268    /* 86 */
4269    COMBA_FORWARD;
4270    MULADD(at[23], at[127]);    MULADD(at[24], at[126]);    MULADD(at[25], at[125]);    MULADD(at[26], at[124]);    MULADD(at[27], at[123]);    MULADD(at[28], at[122]);    MULADD(at[29], at[121]);    MULADD(at[30], at[120]);    MULADD(at[31], at[119]);    MULADD(at[32], at[118]);    MULADD(at[33], at[117]);    MULADD(at[34], at[116]);    MULADD(at[35], at[115]);    MULADD(at[36], at[114]);    MULADD(at[37], at[113]);    MULADD(at[38], at[112]);    MULADD(at[39], at[111]);    MULADD(at[40], at[110]);    MULADD(at[41], at[109]);    MULADD(at[42], at[108]);    MULADD(at[43], at[107]);    MULADD(at[44], at[106]);    MULADD(at[45], at[105]);    MULADD(at[46], at[104]);    MULADD(at[47], at[103]);    MULADD(at[48], at[102]);    MULADD(at[49], at[101]);    MULADD(at[50], at[100]);    MULADD(at[51], at[99]);    MULADD(at[52], at[98]);    MULADD(at[53], at[97]);    MULADD(at[54], at[96]);    MULADD(at[55], at[95]);    MULADD(at[56], at[94]);    MULADD(at[57], at[93]);    MULADD(at[58], at[92]);    MULADD(at[59], at[91]);    MULADD(at[60], at[90]);    MULADD(at[61], at[89]);    MULADD(at[62], at[88]);    MULADD(at[63], at[87]);
4271    COMBA_STORE(C->dp[86]);
4272    /* 87 */
4273    COMBA_FORWARD;
4274    MULADD(at[24], at[127]);    MULADD(at[25], at[126]);    MULADD(at[26], at[125]);    MULADD(at[27], at[124]);    MULADD(at[28], at[123]);    MULADD(at[29], at[122]);    MULADD(at[30], at[121]);    MULADD(at[31], at[120]);    MULADD(at[32], at[119]);    MULADD(at[33], at[118]);    MULADD(at[34], at[117]);    MULADD(at[35], at[116]);    MULADD(at[36], at[115]);    MULADD(at[37], at[114]);    MULADD(at[38], at[113]);    MULADD(at[39], at[112]);    MULADD(at[40], at[111]);    MULADD(at[41], at[110]);    MULADD(at[42], at[109]);    MULADD(at[43], at[108]);    MULADD(at[44], at[107]);    MULADD(at[45], at[106]);    MULADD(at[46], at[105]);    MULADD(at[47], at[104]);    MULADD(at[48], at[103]);    MULADD(at[49], at[102]);    MULADD(at[50], at[101]);    MULADD(at[51], at[100]);    MULADD(at[52], at[99]);    MULADD(at[53], at[98]);    MULADD(at[54], at[97]);    MULADD(at[55], at[96]);    MULADD(at[56], at[95]);    MULADD(at[57], at[94]);    MULADD(at[58], at[93]);    MULADD(at[59], at[92]);    MULADD(at[60], at[91]);    MULADD(at[61], at[90]);    MULADD(at[62], at[89]);    MULADD(at[63], at[88]);
4275    COMBA_STORE(C->dp[87]);
4276    /* 88 */
4277    COMBA_FORWARD;
4278    MULADD(at[25], at[127]);    MULADD(at[26], at[126]);    MULADD(at[27], at[125]);    MULADD(at[28], at[124]);    MULADD(at[29], at[123]);    MULADD(at[30], at[122]);    MULADD(at[31], at[121]);    MULADD(at[32], at[120]);    MULADD(at[33], at[119]);    MULADD(at[34], at[118]);    MULADD(at[35], at[117]);    MULADD(at[36], at[116]);    MULADD(at[37], at[115]);    MULADD(at[38], at[114]);    MULADD(at[39], at[113]);    MULADD(at[40], at[112]);    MULADD(at[41], at[111]);    MULADD(at[42], at[110]);    MULADD(at[43], at[109]);    MULADD(at[44], at[108]);    MULADD(at[45], at[107]);    MULADD(at[46], at[106]);    MULADD(at[47], at[105]);    MULADD(at[48], at[104]);    MULADD(at[49], at[103]);    MULADD(at[50], at[102]);    MULADD(at[51], at[101]);    MULADD(at[52], at[100]);    MULADD(at[53], at[99]);    MULADD(at[54], at[98]);    MULADD(at[55], at[97]);    MULADD(at[56], at[96]);    MULADD(at[57], at[95]);    MULADD(at[58], at[94]);    MULADD(at[59], at[93]);    MULADD(at[60], at[92]);    MULADD(at[61], at[91]);    MULADD(at[62], at[90]);    MULADD(at[63], at[89]);
4279    COMBA_STORE(C->dp[88]);
4280    /* 89 */
4281    COMBA_FORWARD;
4282    MULADD(at[26], at[127]);    MULADD(at[27], at[126]);    MULADD(at[28], at[125]);    MULADD(at[29], at[124]);    MULADD(at[30], at[123]);    MULADD(at[31], at[122]);    MULADD(at[32], at[121]);    MULADD(at[33], at[120]);    MULADD(at[34], at[119]);    MULADD(at[35], at[118]);    MULADD(at[36], at[117]);    MULADD(at[37], at[116]);    MULADD(at[38], at[115]);    MULADD(at[39], at[114]);    MULADD(at[40], at[113]);    MULADD(at[41], at[112]);    MULADD(at[42], at[111]);    MULADD(at[43], at[110]);    MULADD(at[44], at[109]);    MULADD(at[45], at[108]);    MULADD(at[46], at[107]);    MULADD(at[47], at[106]);    MULADD(at[48], at[105]);    MULADD(at[49], at[104]);    MULADD(at[50], at[103]);    MULADD(at[51], at[102]);    MULADD(at[52], at[101]);    MULADD(at[53], at[100]);    MULADD(at[54], at[99]);    MULADD(at[55], at[98]);    MULADD(at[56], at[97]);    MULADD(at[57], at[96]);    MULADD(at[58], at[95]);    MULADD(at[59], at[94]);    MULADD(at[60], at[93]);    MULADD(at[61], at[92]);    MULADD(at[62], at[91]);    MULADD(at[63], at[90]);
4283    COMBA_STORE(C->dp[89]);
4284    /* 90 */
4285    COMBA_FORWARD;
4286    MULADD(at[27], at[127]);    MULADD(at[28], at[126]);    MULADD(at[29], at[125]);    MULADD(at[30], at[124]);    MULADD(at[31], at[123]);    MULADD(at[32], at[122]);    MULADD(at[33], at[121]);    MULADD(at[34], at[120]);    MULADD(at[35], at[119]);    MULADD(at[36], at[118]);    MULADD(at[37], at[117]);    MULADD(at[38], at[116]);    MULADD(at[39], at[115]);    MULADD(at[40], at[114]);    MULADD(at[41], at[113]);    MULADD(at[42], at[112]);    MULADD(at[43], at[111]);    MULADD(at[44], at[110]);    MULADD(at[45], at[109]);    MULADD(at[46], at[108]);    MULADD(at[47], at[107]);    MULADD(at[48], at[106]);    MULADD(at[49], at[105]);    MULADD(at[50], at[104]);    MULADD(at[51], at[103]);    MULADD(at[52], at[102]);    MULADD(at[53], at[101]);    MULADD(at[54], at[100]);    MULADD(at[55], at[99]);    MULADD(at[56], at[98]);    MULADD(at[57], at[97]);    MULADD(at[58], at[96]);    MULADD(at[59], at[95]);    MULADD(at[60], at[94]);    MULADD(at[61], at[93]);    MULADD(at[62], at[92]);    MULADD(at[63], at[91]);
4287    COMBA_STORE(C->dp[90]);
4288    /* 91 */
4289    COMBA_FORWARD;
4290    MULADD(at[28], at[127]);    MULADD(at[29], at[126]);    MULADD(at[30], at[125]);    MULADD(at[31], at[124]);    MULADD(at[32], at[123]);    MULADD(at[33], at[122]);    MULADD(at[34], at[121]);    MULADD(at[35], at[120]);    MULADD(at[36], at[119]);    MULADD(at[37], at[118]);    MULADD(at[38], at[117]);    MULADD(at[39], at[116]);    MULADD(at[40], at[115]);    MULADD(at[41], at[114]);    MULADD(at[42], at[113]);    MULADD(at[43], at[112]);    MULADD(at[44], at[111]);    MULADD(at[45], at[110]);    MULADD(at[46], at[109]);    MULADD(at[47], at[108]);    MULADD(at[48], at[107]);    MULADD(at[49], at[106]);    MULADD(at[50], at[105]);    MULADD(at[51], at[104]);    MULADD(at[52], at[103]);    MULADD(at[53], at[102]);    MULADD(at[54], at[101]);    MULADD(at[55], at[100]);    MULADD(at[56], at[99]);    MULADD(at[57], at[98]);    MULADD(at[58], at[97]);    MULADD(at[59], at[96]);    MULADD(at[60], at[95]);    MULADD(at[61], at[94]);    MULADD(at[62], at[93]);    MULADD(at[63], at[92]);
4291    COMBA_STORE(C->dp[91]);
4292    /* 92 */
4293    COMBA_FORWARD;
4294    MULADD(at[29], at[127]);    MULADD(at[30], at[126]);    MULADD(at[31], at[125]);    MULADD(at[32], at[124]);    MULADD(at[33], at[123]);    MULADD(at[34], at[122]);    MULADD(at[35], at[121]);    MULADD(at[36], at[120]);    MULADD(at[37], at[119]);    MULADD(at[38], at[118]);    MULADD(at[39], at[117]);    MULADD(at[40], at[116]);    MULADD(at[41], at[115]);    MULADD(at[42], at[114]);    MULADD(at[43], at[113]);    MULADD(at[44], at[112]);    MULADD(at[45], at[111]);    MULADD(at[46], at[110]);    MULADD(at[47], at[109]);    MULADD(at[48], at[108]);    MULADD(at[49], at[107]);    MULADD(at[50], at[106]);    MULADD(at[51], at[105]);    MULADD(at[52], at[104]);    MULADD(at[53], at[103]);    MULADD(at[54], at[102]);    MULADD(at[55], at[101]);    MULADD(at[56], at[100]);    MULADD(at[57], at[99]);    MULADD(at[58], at[98]);    MULADD(at[59], at[97]);    MULADD(at[60], at[96]);    MULADD(at[61], at[95]);    MULADD(at[62], at[94]);    MULADD(at[63], at[93]);
4295    COMBA_STORE(C->dp[92]);
4296    /* 93 */
4297    COMBA_FORWARD;
4298    MULADD(at[30], at[127]);    MULADD(at[31], at[126]);    MULADD(at[32], at[125]);    MULADD(at[33], at[124]);    MULADD(at[34], at[123]);    MULADD(at[35], at[122]);    MULADD(at[36], at[121]);    MULADD(at[37], at[120]);    MULADD(at[38], at[119]);    MULADD(at[39], at[118]);    MULADD(at[40], at[117]);    MULADD(at[41], at[116]);    MULADD(at[42], at[115]);    MULADD(at[43], at[114]);    MULADD(at[44], at[113]);    MULADD(at[45], at[112]);    MULADD(at[46], at[111]);    MULADD(at[47], at[110]);    MULADD(at[48], at[109]);    MULADD(at[49], at[108]);    MULADD(at[50], at[107]);    MULADD(at[51], at[106]);    MULADD(at[52], at[105]);    MULADD(at[53], at[104]);    MULADD(at[54], at[103]);    MULADD(at[55], at[102]);    MULADD(at[56], at[101]);    MULADD(at[57], at[100]);    MULADD(at[58], at[99]);    MULADD(at[59], at[98]);    MULADD(at[60], at[97]);    MULADD(at[61], at[96]);    MULADD(at[62], at[95]);    MULADD(at[63], at[94]);
4299    COMBA_STORE(C->dp[93]);
4300    /* 94 */
4301    COMBA_FORWARD;
4302    MULADD(at[31], at[127]);    MULADD(at[32], at[126]);    MULADD(at[33], at[125]);    MULADD(at[34], at[124]);    MULADD(at[35], at[123]);    MULADD(at[36], at[122]);    MULADD(at[37], at[121]);    MULADD(at[38], at[120]);    MULADD(at[39], at[119]);    MULADD(at[40], at[118]);    MULADD(at[41], at[117]);    MULADD(at[42], at[116]);    MULADD(at[43], at[115]);    MULADD(at[44], at[114]);    MULADD(at[45], at[113]);    MULADD(at[46], at[112]);    MULADD(at[47], at[111]);    MULADD(at[48], at[110]);    MULADD(at[49], at[109]);    MULADD(at[50], at[108]);    MULADD(at[51], at[107]);    MULADD(at[52], at[106]);    MULADD(at[53], at[105]);    MULADD(at[54], at[104]);    MULADD(at[55], at[103]);    MULADD(at[56], at[102]);    MULADD(at[57], at[101]);    MULADD(at[58], at[100]);    MULADD(at[59], at[99]);    MULADD(at[60], at[98]);    MULADD(at[61], at[97]);    MULADD(at[62], at[96]);    MULADD(at[63], at[95]);
4303    COMBA_STORE(C->dp[94]);
4304    /* 95 */
4305    COMBA_FORWARD;
4306    MULADD(at[32], at[127]);    MULADD(at[33], at[126]);    MULADD(at[34], at[125]);    MULADD(at[35], at[124]);    MULADD(at[36], at[123]);    MULADD(at[37], at[122]);    MULADD(at[38], at[121]);    MULADD(at[39], at[120]);    MULADD(at[40], at[119]);    MULADD(at[41], at[118]);    MULADD(at[42], at[117]);    MULADD(at[43], at[116]);    MULADD(at[44], at[115]);    MULADD(at[45], at[114]);    MULADD(at[46], at[113]);    MULADD(at[47], at[112]);    MULADD(at[48], at[111]);    MULADD(at[49], at[110]);    MULADD(at[50], at[109]);    MULADD(at[51], at[108]);    MULADD(at[52], at[107]);    MULADD(at[53], at[106]);    MULADD(at[54], at[105]);    MULADD(at[55], at[104]);    MULADD(at[56], at[103]);    MULADD(at[57], at[102]);    MULADD(at[58], at[101]);    MULADD(at[59], at[100]);    MULADD(at[60], at[99]);    MULADD(at[61], at[98]);    MULADD(at[62], at[97]);    MULADD(at[63], at[96]);
4307    COMBA_STORE(C->dp[95]);
4308    /* 96 */
4309    COMBA_FORWARD;
4310    MULADD(at[33], at[127]);    MULADD(at[34], at[126]);    MULADD(at[35], at[125]);    MULADD(at[36], at[124]);    MULADD(at[37], at[123]);    MULADD(at[38], at[122]);    MULADD(at[39], at[121]);    MULADD(at[40], at[120]);    MULADD(at[41], at[119]);    MULADD(at[42], at[118]);    MULADD(at[43], at[117]);    MULADD(at[44], at[116]);    MULADD(at[45], at[115]);    MULADD(at[46], at[114]);    MULADD(at[47], at[113]);    MULADD(at[48], at[112]);    MULADD(at[49], at[111]);    MULADD(at[50], at[110]);    MULADD(at[51], at[109]);    MULADD(at[52], at[108]);    MULADD(at[53], at[107]);    MULADD(at[54], at[106]);    MULADD(at[55], at[105]);    MULADD(at[56], at[104]);    MULADD(at[57], at[103]);    MULADD(at[58], at[102]);    MULADD(at[59], at[101]);    MULADD(at[60], at[100]);    MULADD(at[61], at[99]);    MULADD(at[62], at[98]);    MULADD(at[63], at[97]);
4311    COMBA_STORE(C->dp[96]);
4312    /* 97 */
4313    COMBA_FORWARD;
4314    MULADD(at[34], at[127]);    MULADD(at[35], at[126]);    MULADD(at[36], at[125]);    MULADD(at[37], at[124]);    MULADD(at[38], at[123]);    MULADD(at[39], at[122]);    MULADD(at[40], at[121]);    MULADD(at[41], at[120]);    MULADD(at[42], at[119]);    MULADD(at[43], at[118]);    MULADD(at[44], at[117]);    MULADD(at[45], at[116]);    MULADD(at[46], at[115]);    MULADD(at[47], at[114]);    MULADD(at[48], at[113]);    MULADD(at[49], at[112]);    MULADD(at[50], at[111]);    MULADD(at[51], at[110]);    MULADD(at[52], at[109]);    MULADD(at[53], at[108]);    MULADD(at[54], at[107]);    MULADD(at[55], at[106]);    MULADD(at[56], at[105]);    MULADD(at[57], at[104]);    MULADD(at[58], at[103]);    MULADD(at[59], at[102]);    MULADD(at[60], at[101]);    MULADD(at[61], at[100]);    MULADD(at[62], at[99]);    MULADD(at[63], at[98]);
4315    COMBA_STORE(C->dp[97]);
4316    /* 98 */
4317    COMBA_FORWARD;
4318    MULADD(at[35], at[127]);    MULADD(at[36], at[126]);    MULADD(at[37], at[125]);    MULADD(at[38], at[124]);    MULADD(at[39], at[123]);    MULADD(at[40], at[122]);    MULADD(at[41], at[121]);    MULADD(at[42], at[120]);    MULADD(at[43], at[119]);    MULADD(at[44], at[118]);    MULADD(at[45], at[117]);    MULADD(at[46], at[116]);    MULADD(at[47], at[115]);    MULADD(at[48], at[114]);    MULADD(at[49], at[113]);    MULADD(at[50], at[112]);    MULADD(at[51], at[111]);    MULADD(at[52], at[110]);    MULADD(at[53], at[109]);    MULADD(at[54], at[108]);    MULADD(at[55], at[107]);    MULADD(at[56], at[106]);    MULADD(at[57], at[105]);    MULADD(at[58], at[104]);    MULADD(at[59], at[103]);    MULADD(at[60], at[102]);    MULADD(at[61], at[101]);    MULADD(at[62], at[100]);    MULADD(at[63], at[99]);
4319    COMBA_STORE(C->dp[98]);
4320    /* 99 */
4321    COMBA_FORWARD;
4322    MULADD(at[36], at[127]);    MULADD(at[37], at[126]);    MULADD(at[38], at[125]);    MULADD(at[39], at[124]);    MULADD(at[40], at[123]);    MULADD(at[41], at[122]);    MULADD(at[42], at[121]);    MULADD(at[43], at[120]);    MULADD(at[44], at[119]);    MULADD(at[45], at[118]);    MULADD(at[46], at[117]);    MULADD(at[47], at[116]);    MULADD(at[48], at[115]);    MULADD(at[49], at[114]);    MULADD(at[50], at[113]);    MULADD(at[51], at[112]);    MULADD(at[52], at[111]);    MULADD(at[53], at[110]);    MULADD(at[54], at[109]);    MULADD(at[55], at[108]);    MULADD(at[56], at[107]);    MULADD(at[57], at[106]);    MULADD(at[58], at[105]);    MULADD(at[59], at[104]);    MULADD(at[60], at[103]);    MULADD(at[61], at[102]);    MULADD(at[62], at[101]);    MULADD(at[63], at[100]);
4323    COMBA_STORE(C->dp[99]);
4324    /* 100 */
4325    COMBA_FORWARD;
4326    MULADD(at[37], at[127]);    MULADD(at[38], at[126]);    MULADD(at[39], at[125]);    MULADD(at[40], at[124]);    MULADD(at[41], at[123]);    MULADD(at[42], at[122]);    MULADD(at[43], at[121]);    MULADD(at[44], at[120]);    MULADD(at[45], at[119]);    MULADD(at[46], at[118]);    MULADD(at[47], at[117]);    MULADD(at[48], at[116]);    MULADD(at[49], at[115]);    MULADD(at[50], at[114]);    MULADD(at[51], at[113]);    MULADD(at[52], at[112]);    MULADD(at[53], at[111]);    MULADD(at[54], at[110]);    MULADD(at[55], at[109]);    MULADD(at[56], at[108]);    MULADD(at[57], at[107]);    MULADD(at[58], at[106]);    MULADD(at[59], at[105]);    MULADD(at[60], at[104]);    MULADD(at[61], at[103]);    MULADD(at[62], at[102]);    MULADD(at[63], at[101]);
4327    COMBA_STORE(C->dp[100]);
4328    /* 101 */
4329    COMBA_FORWARD;
4330    MULADD(at[38], at[127]);    MULADD(at[39], at[126]);    MULADD(at[40], at[125]);    MULADD(at[41], at[124]);    MULADD(at[42], at[123]);    MULADD(at[43], at[122]);    MULADD(at[44], at[121]);    MULADD(at[45], at[120]);    MULADD(at[46], at[119]);    MULADD(at[47], at[118]);    MULADD(at[48], at[117]);    MULADD(at[49], at[116]);    MULADD(at[50], at[115]);    MULADD(at[51], at[114]);    MULADD(at[52], at[113]);    MULADD(at[53], at[112]);    MULADD(at[54], at[111]);    MULADD(at[55], at[110]);    MULADD(at[56], at[109]);    MULADD(at[57], at[108]);    MULADD(at[58], at[107]);    MULADD(at[59], at[106]);    MULADD(at[60], at[105]);    MULADD(at[61], at[104]);    MULADD(at[62], at[103]);    MULADD(at[63], at[102]);
4331    COMBA_STORE(C->dp[101]);
4332    /* 102 */
4333    COMBA_FORWARD;
4334    MULADD(at[39], at[127]);    MULADD(at[40], at[126]);    MULADD(at[41], at[125]);    MULADD(at[42], at[124]);    MULADD(at[43], at[123]);    MULADD(at[44], at[122]);    MULADD(at[45], at[121]);    MULADD(at[46], at[120]);    MULADD(at[47], at[119]);    MULADD(at[48], at[118]);    MULADD(at[49], at[117]);    MULADD(at[50], at[116]);    MULADD(at[51], at[115]);    MULADD(at[52], at[114]);    MULADD(at[53], at[113]);    MULADD(at[54], at[112]);    MULADD(at[55], at[111]);    MULADD(at[56], at[110]);    MULADD(at[57], at[109]);    MULADD(at[58], at[108]);    MULADD(at[59], at[107]);    MULADD(at[60], at[106]);    MULADD(at[61], at[105]);    MULADD(at[62], at[104]);    MULADD(at[63], at[103]);
4335    COMBA_STORE(C->dp[102]);
4336    /* 103 */
4337    COMBA_FORWARD;
4338    MULADD(at[40], at[127]);    MULADD(at[41], at[126]);    MULADD(at[42], at[125]);    MULADD(at[43], at[124]);    MULADD(at[44], at[123]);    MULADD(at[45], at[122]);    MULADD(at[46], at[121]);    MULADD(at[47], at[120]);    MULADD(at[48], at[119]);    MULADD(at[49], at[118]);    MULADD(at[50], at[117]);    MULADD(at[51], at[116]);    MULADD(at[52], at[115]);    MULADD(at[53], at[114]);    MULADD(at[54], at[113]);    MULADD(at[55], at[112]);    MULADD(at[56], at[111]);    MULADD(at[57], at[110]);    MULADD(at[58], at[109]);    MULADD(at[59], at[108]);    MULADD(at[60], at[107]);    MULADD(at[61], at[106]);    MULADD(at[62], at[105]);    MULADD(at[63], at[104]);
4339    COMBA_STORE(C->dp[103]);
4340    /* 104 */
4341    COMBA_FORWARD;
4342    MULADD(at[41], at[127]);    MULADD(at[42], at[126]);    MULADD(at[43], at[125]);    MULADD(at[44], at[124]);    MULADD(at[45], at[123]);    MULADD(at[46], at[122]);    MULADD(at[47], at[121]);    MULADD(at[48], at[120]);    MULADD(at[49], at[119]);    MULADD(at[50], at[118]);    MULADD(at[51], at[117]);    MULADD(at[52], at[116]);    MULADD(at[53], at[115]);    MULADD(at[54], at[114]);    MULADD(at[55], at[113]);    MULADD(at[56], at[112]);    MULADD(at[57], at[111]);    MULADD(at[58], at[110]);    MULADD(at[59], at[109]);    MULADD(at[60], at[108]);    MULADD(at[61], at[107]);    MULADD(at[62], at[106]);    MULADD(at[63], at[105]);
4343    COMBA_STORE(C->dp[104]);
4344    /* 105 */
4345    COMBA_FORWARD;
4346    MULADD(at[42], at[127]);    MULADD(at[43], at[126]);    MULADD(at[44], at[125]);    MULADD(at[45], at[124]);    MULADD(at[46], at[123]);    MULADD(at[47], at[122]);    MULADD(at[48], at[121]);    MULADD(at[49], at[120]);    MULADD(at[50], at[119]);    MULADD(at[51], at[118]);    MULADD(at[52], at[117]);    MULADD(at[53], at[116]);    MULADD(at[54], at[115]);    MULADD(at[55], at[114]);    MULADD(at[56], at[113]);    MULADD(at[57], at[112]);    MULADD(at[58], at[111]);    MULADD(at[59], at[110]);    MULADD(at[60], at[109]);    MULADD(at[61], at[108]);    MULADD(at[62], at[107]);    MULADD(at[63], at[106]);
4347    COMBA_STORE(C->dp[105]);
4348    /* 106 */
4349    COMBA_FORWARD;
4350    MULADD(at[43], at[127]);    MULADD(at[44], at[126]);    MULADD(at[45], at[125]);    MULADD(at[46], at[124]);    MULADD(at[47], at[123]);    MULADD(at[48], at[122]);    MULADD(at[49], at[121]);    MULADD(at[50], at[120]);    MULADD(at[51], at[119]);    MULADD(at[52], at[118]);    MULADD(at[53], at[117]);    MULADD(at[54], at[116]);    MULADD(at[55], at[115]);    MULADD(at[56], at[114]);    MULADD(at[57], at[113]);    MULADD(at[58], at[112]);    MULADD(at[59], at[111]);    MULADD(at[60], at[110]);    MULADD(at[61], at[109]);    MULADD(at[62], at[108]);    MULADD(at[63], at[107]);
4351    COMBA_STORE(C->dp[106]);
4352    /* 107 */
4353    COMBA_FORWARD;
4354    MULADD(at[44], at[127]);    MULADD(at[45], at[126]);    MULADD(at[46], at[125]);    MULADD(at[47], at[124]);    MULADD(at[48], at[123]);    MULADD(at[49], at[122]);    MULADD(at[50], at[121]);    MULADD(at[51], at[120]);    MULADD(at[52], at[119]);    MULADD(at[53], at[118]);    MULADD(at[54], at[117]);    MULADD(at[55], at[116]);    MULADD(at[56], at[115]);    MULADD(at[57], at[114]);    MULADD(at[58], at[113]);    MULADD(at[59], at[112]);    MULADD(at[60], at[111]);    MULADD(at[61], at[110]);    MULADD(at[62], at[109]);    MULADD(at[63], at[108]);
4355    COMBA_STORE(C->dp[107]);
4356    /* 108 */
4357    COMBA_FORWARD;
4358    MULADD(at[45], at[127]);    MULADD(at[46], at[126]);    MULADD(at[47], at[125]);    MULADD(at[48], at[124]);    MULADD(at[49], at[123]);    MULADD(at[50], at[122]);    MULADD(at[51], at[121]);    MULADD(at[52], at[120]);    MULADD(at[53], at[119]);    MULADD(at[54], at[118]);    MULADD(at[55], at[117]);    MULADD(at[56], at[116]);    MULADD(at[57], at[115]);    MULADD(at[58], at[114]);    MULADD(at[59], at[113]);    MULADD(at[60], at[112]);    MULADD(at[61], at[111]);    MULADD(at[62], at[110]);    MULADD(at[63], at[109]);
4359    COMBA_STORE(C->dp[108]);
4360    /* 109 */
4361    COMBA_FORWARD;
4362    MULADD(at[46], at[127]);    MULADD(at[47], at[126]);    MULADD(at[48], at[125]);    MULADD(at[49], at[124]);    MULADD(at[50], at[123]);    MULADD(at[51], at[122]);    MULADD(at[52], at[121]);    MULADD(at[53], at[120]);    MULADD(at[54], at[119]);    MULADD(at[55], at[118]);    MULADD(at[56], at[117]);    MULADD(at[57], at[116]);    MULADD(at[58], at[115]);    MULADD(at[59], at[114]);    MULADD(at[60], at[113]);    MULADD(at[61], at[112]);    MULADD(at[62], at[111]);    MULADD(at[63], at[110]);
4363    COMBA_STORE(C->dp[109]);
4364    /* 110 */
4365    COMBA_FORWARD;
4366    MULADD(at[47], at[127]);    MULADD(at[48], at[126]);    MULADD(at[49], at[125]);    MULADD(at[50], at[124]);    MULADD(at[51], at[123]);    MULADD(at[52], at[122]);    MULADD(at[53], at[121]);    MULADD(at[54], at[120]);    MULADD(at[55], at[119]);    MULADD(at[56], at[118]);    MULADD(at[57], at[117]);    MULADD(at[58], at[116]);    MULADD(at[59], at[115]);    MULADD(at[60], at[114]);    MULADD(at[61], at[113]);    MULADD(at[62], at[112]);    MULADD(at[63], at[111]);
4367    COMBA_STORE(C->dp[110]);
4368    /* 111 */
4369    COMBA_FORWARD;
4370    MULADD(at[48], at[127]);    MULADD(at[49], at[126]);    MULADD(at[50], at[125]);    MULADD(at[51], at[124]);    MULADD(at[52], at[123]);    MULADD(at[53], at[122]);    MULADD(at[54], at[121]);    MULADD(at[55], at[120]);    MULADD(at[56], at[119]);    MULADD(at[57], at[118]);    MULADD(at[58], at[117]);    MULADD(at[59], at[116]);    MULADD(at[60], at[115]);    MULADD(at[61], at[114]);    MULADD(at[62], at[113]);    MULADD(at[63], at[112]);
4371    COMBA_STORE(C->dp[111]);
4372    /* 112 */
4373    COMBA_FORWARD;
4374    MULADD(at[49], at[127]);    MULADD(at[50], at[126]);    MULADD(at[51], at[125]);    MULADD(at[52], at[124]);    MULADD(at[53], at[123]);    MULADD(at[54], at[122]);    MULADD(at[55], at[121]);    MULADD(at[56], at[120]);    MULADD(at[57], at[119]);    MULADD(at[58], at[118]);    MULADD(at[59], at[117]);    MULADD(at[60], at[116]);    MULADD(at[61], at[115]);    MULADD(at[62], at[114]);    MULADD(at[63], at[113]);
4375    COMBA_STORE(C->dp[112]);
4376    /* 113 */
4377    COMBA_FORWARD;
4378    MULADD(at[50], at[127]);    MULADD(at[51], at[126]);    MULADD(at[52], at[125]);    MULADD(at[53], at[124]);    MULADD(at[54], at[123]);    MULADD(at[55], at[122]);    MULADD(at[56], at[121]);    MULADD(at[57], at[120]);    MULADD(at[58], at[119]);    MULADD(at[59], at[118]);    MULADD(at[60], at[117]);    MULADD(at[61], at[116]);    MULADD(at[62], at[115]);    MULADD(at[63], at[114]);
4379    COMBA_STORE(C->dp[113]);
4380    /* 114 */
4381    COMBA_FORWARD;
4382    MULADD(at[51], at[127]);    MULADD(at[52], at[126]);    MULADD(at[53], at[125]);    MULADD(at[54], at[124]);    MULADD(at[55], at[123]);    MULADD(at[56], at[122]);    MULADD(at[57], at[121]);    MULADD(at[58], at[120]);    MULADD(at[59], at[119]);    MULADD(at[60], at[118]);    MULADD(at[61], at[117]);    MULADD(at[62], at[116]);    MULADD(at[63], at[115]);
4383    COMBA_STORE(C->dp[114]);
4384    /* 115 */
4385    COMBA_FORWARD;
4386    MULADD(at[52], at[127]);    MULADD(at[53], at[126]);    MULADD(at[54], at[125]);    MULADD(at[55], at[124]);    MULADD(at[56], at[123]);    MULADD(at[57], at[122]);    MULADD(at[58], at[121]);    MULADD(at[59], at[120]);    MULADD(at[60], at[119]);    MULADD(at[61], at[118]);    MULADD(at[62], at[117]);    MULADD(at[63], at[116]);
4387    COMBA_STORE(C->dp[115]);
4388    /* 116 */
4389    COMBA_FORWARD;
4390    MULADD(at[53], at[127]);    MULADD(at[54], at[126]);    MULADD(at[55], at[125]);    MULADD(at[56], at[124]);    MULADD(at[57], at[123]);    MULADD(at[58], at[122]);    MULADD(at[59], at[121]);    MULADD(at[60], at[120]);    MULADD(at[61], at[119]);    MULADD(at[62], at[118]);    MULADD(at[63], at[117]);
4391    COMBA_STORE(C->dp[116]);
4392    /* 117 */
4393    COMBA_FORWARD;
4394    MULADD(at[54], at[127]);    MULADD(at[55], at[126]);    MULADD(at[56], at[125]);    MULADD(at[57], at[124]);    MULADD(at[58], at[123]);    MULADD(at[59], at[122]);    MULADD(at[60], at[121]);    MULADD(at[61], at[120]);    MULADD(at[62], at[119]);    MULADD(at[63], at[118]);
4395    COMBA_STORE(C->dp[117]);
4396    /* 118 */
4397    COMBA_FORWARD;
4398    MULADD(at[55], at[127]);    MULADD(at[56], at[126]);    MULADD(at[57], at[125]);    MULADD(at[58], at[124]);    MULADD(at[59], at[123]);    MULADD(at[60], at[122]);    MULADD(at[61], at[121]);    MULADD(at[62], at[120]);    MULADD(at[63], at[119]);
4399    COMBA_STORE(C->dp[118]);
4400    /* 119 */
4401    COMBA_FORWARD;
4402    MULADD(at[56], at[127]);    MULADD(at[57], at[126]);    MULADD(at[58], at[125]);    MULADD(at[59], at[124]);    MULADD(at[60], at[123]);    MULADD(at[61], at[122]);    MULADD(at[62], at[121]);    MULADD(at[63], at[120]);
4403    COMBA_STORE(C->dp[119]);
4404    /* 120 */
4405    COMBA_FORWARD;
4406    MULADD(at[57], at[127]);    MULADD(at[58], at[126]);    MULADD(at[59], at[125]);    MULADD(at[60], at[124]);    MULADD(at[61], at[123]);    MULADD(at[62], at[122]);    MULADD(at[63], at[121]);
4407    COMBA_STORE(C->dp[120]);
4408    /* 121 */
4409    COMBA_FORWARD;
4410    MULADD(at[58], at[127]);    MULADD(at[59], at[126]);    MULADD(at[60], at[125]);    MULADD(at[61], at[124]);    MULADD(at[62], at[123]);    MULADD(at[63], at[122]);
4411    COMBA_STORE(C->dp[121]);
4412    /* 122 */
4413    COMBA_FORWARD;
4414    MULADD(at[59], at[127]);    MULADD(at[60], at[126]);    MULADD(at[61], at[125]);    MULADD(at[62], at[124]);    MULADD(at[63], at[123]);
4415    COMBA_STORE(C->dp[122]);
4416    /* 123 */
4417    COMBA_FORWARD;
4418    MULADD(at[60], at[127]);    MULADD(at[61], at[126]);    MULADD(at[62], at[125]);    MULADD(at[63], at[124]);
4419    COMBA_STORE(C->dp[123]);
4420    /* 124 */
4421    COMBA_FORWARD;
4422    MULADD(at[61], at[127]);    MULADD(at[62], at[126]);    MULADD(at[63], at[125]);
4423    COMBA_STORE(C->dp[124]);
4424    /* 125 */
4425    COMBA_FORWARD;
4426    MULADD(at[62], at[127]);    MULADD(at[63], at[126]);
4427    COMBA_STORE(C->dp[125]);
4428    /* 126 */
4429    COMBA_FORWARD;
4430    MULADD(at[63], at[127]);
4431    COMBA_STORE(C->dp[126]);
4432    COMBA_STORE2(C->dp[127]);
4433    C->used = 128;
4434    C->sign = A->sign ^ B->sign;
4435    tfm_fp_clamp(C);
4436    COMBA_FINI;
4437 }
4438 #endif
4439
4440 #define TFM_DEFINES
4441
4442 #if defined(TFM_SMALL_SET)
4443 void tfm_fp_mul_comba_small(tfm_fp_int *A, tfm_fp_int *B, tfm_fp_int *C)
4444 {
4445    tfm_fp_digit c0, c1, c2, at[32];
4446    SILC_LOG_DEBUG(("Start"));
4447    switch (MAX(A->used, B->used)) {
4448
4449    case 1:
4450       memcpy(at, A->dp, 1 * sizeof(tfm_fp_digit));
4451       memcpy(at+1, B->dp, 1 * sizeof(tfm_fp_digit));
4452       COMBA_START;
4453
4454       COMBA_CLEAR;
4455       /* 0 */
4456       MULADD(at[0], at[1]);
4457       COMBA_STORE(C->dp[0]);
4458       COMBA_STORE2(C->dp[1]);
4459       C->used = 2;
4460       C->sign = A->sign ^ B->sign;
4461       tfm_fp_clamp(C);
4462       COMBA_FINI;
4463       break;
4464
4465    case 2:
4466       memcpy(at, A->dp, 2 * sizeof(tfm_fp_digit));
4467       memcpy(at+2, B->dp, 2 * sizeof(tfm_fp_digit));
4468       COMBA_START;
4469
4470       COMBA_CLEAR;
4471       /* 0 */
4472       MULADD(at[0], at[2]);
4473       COMBA_STORE(C->dp[0]);
4474       /* 1 */
4475       COMBA_FORWARD;
4476       MULADD(at[0], at[3]);       MULADD(at[1], at[2]);
4477       COMBA_STORE(C->dp[1]);
4478       /* 2 */
4479       COMBA_FORWARD;
4480       MULADD(at[1], at[3]);
4481       COMBA_STORE(C->dp[2]);
4482       COMBA_STORE2(C->dp[3]);
4483       C->used = 4;
4484       C->sign = A->sign ^ B->sign;
4485       tfm_fp_clamp(C);
4486       COMBA_FINI;
4487       break;
4488
4489    case 3:
4490       memcpy(at, A->dp, 3 * sizeof(tfm_fp_digit));
4491       memcpy(at+3, B->dp, 3 * sizeof(tfm_fp_digit));
4492       COMBA_START;
4493
4494       COMBA_CLEAR;
4495       /* 0 */
4496       MULADD(at[0], at[3]);
4497       COMBA_STORE(C->dp[0]);
4498       /* 1 */
4499       COMBA_FORWARD;
4500       MULADD(at[0], at[4]);       MULADD(at[1], at[3]);
4501       COMBA_STORE(C->dp[1]);
4502       /* 2 */
4503       COMBA_FORWARD;
4504       MULADD(at[0], at[5]);       MULADD(at[1], at[4]);       MULADD(at[2], at[3]);
4505       COMBA_STORE(C->dp[2]);
4506       /* 3 */
4507       COMBA_FORWARD;
4508       MULADD(at[1], at[5]);       MULADD(at[2], at[4]);
4509       COMBA_STORE(C->dp[3]);
4510       /* 4 */
4511       COMBA_FORWARD;
4512       MULADD(at[2], at[5]);
4513       COMBA_STORE(C->dp[4]);
4514       COMBA_STORE2(C->dp[5]);
4515       C->used = 6;
4516       C->sign = A->sign ^ B->sign;
4517       tfm_fp_clamp(C);
4518       COMBA_FINI;
4519       break;
4520
4521    case 4:
4522       memcpy(at, A->dp, 4 * sizeof(tfm_fp_digit));
4523       memcpy(at+4, B->dp, 4 * sizeof(tfm_fp_digit));
4524       COMBA_START;
4525
4526       COMBA_CLEAR;
4527       /* 0 */
4528       MULADD(at[0], at[4]);
4529       COMBA_STORE(C->dp[0]);
4530       /* 1 */
4531       COMBA_FORWARD;
4532       MULADD(at[0], at[5]);       MULADD(at[1], at[4]);
4533       COMBA_STORE(C->dp[1]);
4534       /* 2 */
4535       COMBA_FORWARD;
4536       MULADD(at[0], at[6]);       MULADD(at[1], at[5]);       MULADD(at[2], at[4]);
4537       COMBA_STORE(C->dp[2]);
4538       /* 3 */
4539       COMBA_FORWARD;
4540       MULADD(at[0], at[7]);       MULADD(at[1], at[6]);       MULADD(at[2], at[5]);       MULADD(at[3], at[4]);
4541       COMBA_STORE(C->dp[3]);
4542       /* 4 */
4543       COMBA_FORWARD;
4544       MULADD(at[1], at[7]);       MULADD(at[2], at[6]);       MULADD(at[3], at[5]);
4545       COMBA_STORE(C->dp[4]);
4546       /* 5 */
4547       COMBA_FORWARD;
4548       MULADD(at[2], at[7]);       MULADD(at[3], at[6]);
4549       COMBA_STORE(C->dp[5]);
4550       /* 6 */
4551       COMBA_FORWARD;
4552       MULADD(at[3], at[7]);
4553       COMBA_STORE(C->dp[6]);
4554       COMBA_STORE2(C->dp[7]);
4555       C->used = 8;
4556       C->sign = A->sign ^ B->sign;
4557       tfm_fp_clamp(C);
4558       COMBA_FINI;
4559       break;
4560
4561    case 5:
4562       memcpy(at, A->dp, 5 * sizeof(tfm_fp_digit));
4563       memcpy(at+5, B->dp, 5 * sizeof(tfm_fp_digit));
4564       COMBA_START;
4565
4566       COMBA_CLEAR;
4567       /* 0 */
4568       MULADD(at[0], at[5]);
4569       COMBA_STORE(C->dp[0]);
4570       /* 1 */
4571       COMBA_FORWARD;
4572       MULADD(at[0], at[6]);       MULADD(at[1], at[5]);
4573       COMBA_STORE(C->dp[1]);
4574       /* 2 */
4575       COMBA_FORWARD;
4576       MULADD(at[0], at[7]);       MULADD(at[1], at[6]);       MULADD(at[2], at[5]);
4577       COMBA_STORE(C->dp[2]);
4578       /* 3 */
4579       COMBA_FORWARD;
4580       MULADD(at[0], at[8]);       MULADD(at[1], at[7]);       MULADD(at[2], at[6]);       MULADD(at[3], at[5]);
4581       COMBA_STORE(C->dp[3]);
4582       /* 4 */
4583       COMBA_FORWARD;
4584       MULADD(at[0], at[9]);       MULADD(at[1], at[8]);       MULADD(at[2], at[7]);       MULADD(at[3], at[6]);       MULADD(at[4], at[5]);
4585       COMBA_STORE(C->dp[4]);
4586       /* 5 */
4587       COMBA_FORWARD;
4588       MULADD(at[1], at[9]);       MULADD(at[2], at[8]);       MULADD(at[3], at[7]);       MULADD(at[4], at[6]);
4589       COMBA_STORE(C->dp[5]);
4590       /* 6 */
4591       COMBA_FORWARD;
4592       MULADD(at[2], at[9]);       MULADD(at[3], at[8]);       MULADD(at[4], at[7]);
4593       COMBA_STORE(C->dp[6]);
4594       /* 7 */
4595       COMBA_FORWARD;
4596       MULADD(at[3], at[9]);       MULADD(at[4], at[8]);
4597       COMBA_STORE(C->dp[7]);
4598       /* 8 */
4599       COMBA_FORWARD;
4600       MULADD(at[4], at[9]);
4601       COMBA_STORE(C->dp[8]);
4602       COMBA_STORE2(C->dp[9]);
4603       C->used = 10;
4604       C->sign = A->sign ^ B->sign;
4605       tfm_fp_clamp(C);
4606       COMBA_FINI;
4607       break;
4608
4609    case 6:
4610       memcpy(at, A->dp, 6 * sizeof(tfm_fp_digit));
4611       memcpy(at+6, B->dp, 6 * sizeof(tfm_fp_digit));
4612       COMBA_START;
4613
4614       COMBA_CLEAR;
4615       /* 0 */
4616       MULADD(at[0], at[6]);
4617       COMBA_STORE(C->dp[0]);
4618       /* 1 */
4619       COMBA_FORWARD;
4620       MULADD(at[0], at[7]);       MULADD(at[1], at[6]);
4621       COMBA_STORE(C->dp[1]);
4622       /* 2 */
4623       COMBA_FORWARD;
4624       MULADD(at[0], at[8]);       MULADD(at[1], at[7]);       MULADD(at[2], at[6]);
4625       COMBA_STORE(C->dp[2]);
4626       /* 3 */
4627       COMBA_FORWARD;
4628       MULADD(at[0], at[9]);       MULADD(at[1], at[8]);       MULADD(at[2], at[7]);       MULADD(at[3], at[6]);
4629       COMBA_STORE(C->dp[3]);
4630       /* 4 */
4631       COMBA_FORWARD;
4632       MULADD(at[0], at[10]);       MULADD(at[1], at[9]);       MULADD(at[2], at[8]);       MULADD(at[3], at[7]);       MULADD(at[4], at[6]);
4633       COMBA_STORE(C->dp[4]);
4634       /* 5 */
4635       COMBA_FORWARD;
4636       MULADD(at[0], at[11]);       MULADD(at[1], at[10]);       MULADD(at[2], at[9]);       MULADD(at[3], at[8]);       MULADD(at[4], at[7]);       MULADD(at[5], at[6]);
4637       COMBA_STORE(C->dp[5]);
4638       /* 6 */
4639       COMBA_FORWARD;
4640       MULADD(at[1], at[11]);       MULADD(at[2], at[10]);       MULADD(at[3], at[9]);       MULADD(at[4], at[8]);       MULADD(at[5], at[7]);
4641       COMBA_STORE(C->dp[6]);
4642       /* 7 */
4643       COMBA_FORWARD;
4644       MULADD(at[2], at[11]);       MULADD(at[3], at[10]);       MULADD(at[4], at[9]);       MULADD(at[5], at[8]);
4645       COMBA_STORE(C->dp[7]);
4646       /* 8 */
4647       COMBA_FORWARD;
4648       MULADD(at[3], at[11]);       MULADD(at[4], at[10]);       MULADD(at[5], at[9]);
4649       COMBA_STORE(C->dp[8]);
4650       /* 9 */
4651       COMBA_FORWARD;
4652       MULADD(at[4], at[11]);       MULADD(at[5], at[10]);
4653       COMBA_STORE(C->dp[9]);
4654       /* 10 */
4655       COMBA_FORWARD;
4656       MULADD(at[5], at[11]);
4657       COMBA_STORE(C->dp[10]);
4658       COMBA_STORE2(C->dp[11]);
4659       C->used = 12;
4660       C->sign = A->sign ^ B->sign;
4661       tfm_fp_clamp(C);
4662       COMBA_FINI;
4663       break;
4664
4665    case 7:
4666       memcpy(at, A->dp, 7 * sizeof(tfm_fp_digit));
4667       memcpy(at+7, B->dp, 7 * sizeof(tfm_fp_digit));
4668       COMBA_START;
4669
4670       COMBA_CLEAR;
4671       /* 0 */
4672       MULADD(at[0], at[7]);
4673       COMBA_STORE(C->dp[0]);
4674       /* 1 */
4675       COMBA_FORWARD;
4676       MULADD(at[0], at[8]);       MULADD(at[1], at[7]);
4677       COMBA_STORE(C->dp[1]);
4678       /* 2 */
4679       COMBA_FORWARD;
4680       MULADD(at[0], at[9]);       MULADD(at[1], at[8]);       MULADD(at[2], at[7]);
4681       COMBA_STORE(C->dp[2]);
4682       /* 3 */
4683       COMBA_FORWARD;
4684       MULADD(at[0], at[10]);       MULADD(at[1], at[9]);       MULADD(at[2], at[8]);       MULADD(at[3], at[7]);
4685       COMBA_STORE(C->dp[3]);
4686       /* 4 */
4687       COMBA_FORWARD;
4688       MULADD(at[0], at[11]);       MULADD(at[1], at[10]);       MULADD(at[2], at[9]);       MULADD(at[3], at[8]);       MULADD(at[4], at[7]);
4689       COMBA_STORE(C->dp[4]);
4690       /* 5 */
4691       COMBA_FORWARD;
4692       MULADD(at[0], at[12]);       MULADD(at[1], at[11]);       MULADD(at[2], at[10]);       MULADD(at[3], at[9]);       MULADD(at[4], at[8]);       MULADD(at[5], at[7]);
4693       COMBA_STORE(C->dp[5]);
4694       /* 6 */
4695       COMBA_FORWARD;
4696       MULADD(at[0], at[13]);       MULADD(at[1], at[12]);       MULADD(at[2], at[11]);       MULADD(at[3], at[10]);       MULADD(at[4], at[9]);       MULADD(at[5], at[8]);       MULADD(at[6], at[7]);
4697       COMBA_STORE(C->dp[6]);
4698       /* 7 */
4699       COMBA_FORWARD;
4700       MULADD(at[1], at[13]);       MULADD(at[2], at[12]);       MULADD(at[3], at[11]);       MULADD(at[4], at[10]);       MULADD(at[5], at[9]);       MULADD(at[6], at[8]);
4701       COMBA_STORE(C->dp[7]);
4702       /* 8 */
4703       COMBA_FORWARD;
4704       MULADD(at[2], at[13]);       MULADD(at[3], at[12]);       MULADD(at[4], at[11]);       MULADD(at[5], at[10]);       MULADD(at[6], at[9]);
4705       COMBA_STORE(C->dp[8]);
4706       /* 9 */
4707       COMBA_FORWARD;
4708       MULADD(at[3], at[13]);       MULADD(at[4], at[12]);       MULADD(at[5], at[11]);       MULADD(at[6], at[10]);
4709       COMBA_STORE(C->dp[9]);
4710       /* 10 */
4711       COMBA_FORWARD;
4712       MULADD(at[4], at[13]);       MULADD(at[5], at[12]);       MULADD(at[6], at[11]);
4713       COMBA_STORE(C->dp[10]);
4714       /* 11 */
4715       COMBA_FORWARD;
4716       MULADD(at[5], at[13]);       MULADD(at[6], at[12]);
4717       COMBA_STORE(C->dp[11]);
4718       /* 12 */
4719       COMBA_FORWARD;
4720       MULADD(at[6], at[13]);
4721       COMBA_STORE(C->dp[12]);
4722       COMBA_STORE2(C->dp[13]);
4723       C->used = 14;
4724       C->sign = A->sign ^ B->sign;
4725       tfm_fp_clamp(C);
4726       COMBA_FINI;
4727       break;
4728
4729    case 8:
4730       memcpy(at, A->dp, 8 * sizeof(tfm_fp_digit));
4731       memcpy(at+8, B->dp, 8 * sizeof(tfm_fp_digit));
4732       COMBA_START;
4733
4734       COMBA_CLEAR;
4735       /* 0 */
4736       MULADD(at[0], at[8]);
4737       COMBA_STORE(C->dp[0]);
4738       /* 1 */
4739       COMBA_FORWARD;
4740       MULADD(at[0], at[9]);       MULADD(at[1], at[8]);
4741       COMBA_STORE(C->dp[1]);
4742       /* 2 */
4743       COMBA_FORWARD;
4744       MULADD(at[0], at[10]);       MULADD(at[1], at[9]);       MULADD(at[2], at[8]);
4745       COMBA_STORE(C->dp[2]);
4746       /* 3 */
4747       COMBA_FORWARD;
4748       MULADD(at[0], at[11]);       MULADD(at[1], at[10]);       MULADD(at[2], at[9]);       MULADD(at[3], at[8]);
4749       COMBA_STORE(C->dp[3]);
4750       /* 4 */
4751       COMBA_FORWARD;
4752       MULADD(at[0], at[12]);       MULADD(at[1], at[11]);       MULADD(at[2], at[10]);       MULADD(at[3], at[9]);       MULADD(at[4], at[8]);
4753       COMBA_STORE(C->dp[4]);
4754       /* 5 */
4755       COMBA_FORWARD;
4756       MULADD(at[0], at[13]);       MULADD(at[1], at[12]);       MULADD(at[2], at[11]);       MULADD(at[3], at[10]);       MULADD(at[4], at[9]);       MULADD(at[5], at[8]);
4757       COMBA_STORE(C->dp[5]);
4758       /* 6 */
4759       COMBA_FORWARD;
4760       MULADD(at[0], at[14]);       MULADD(at[1], at[13]);       MULADD(at[2], at[12]);       MULADD(at[3], at[11]);       MULADD(at[4], at[10]);       MULADD(at[5], at[9]);       MULADD(at[6], at[8]);
4761       COMBA_STORE(C->dp[6]);
4762       /* 7 */
4763       COMBA_FORWARD;
4764       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);       MULADD(at[2], at[13]);       MULADD(at[3], at[12]);       MULADD(at[4], at[11]);       MULADD(at[5], at[10]);       MULADD(at[6], at[9]);       MULADD(at[7], at[8]);
4765       COMBA_STORE(C->dp[7]);
4766       /* 8 */
4767       COMBA_FORWARD;
4768       MULADD(at[1], at[15]);       MULADD(at[2], at[14]);       MULADD(at[3], at[13]);       MULADD(at[4], at[12]);       MULADD(at[5], at[11]);       MULADD(at[6], at[10]);       MULADD(at[7], at[9]);
4769       COMBA_STORE(C->dp[8]);
4770       /* 9 */
4771       COMBA_FORWARD;
4772       MULADD(at[2], at[15]);       MULADD(at[3], at[14]);       MULADD(at[4], at[13]);       MULADD(at[5], at[12]);       MULADD(at[6], at[11]);       MULADD(at[7], at[10]);
4773       COMBA_STORE(C->dp[9]);
4774       /* 10 */
4775       COMBA_FORWARD;
4776       MULADD(at[3], at[15]);       MULADD(at[4], at[14]);       MULADD(at[5], at[13]);       MULADD(at[6], at[12]);       MULADD(at[7], at[11]);
4777       COMBA_STORE(C->dp[10]);
4778       /* 11 */
4779       COMBA_FORWARD;
4780       MULADD(at[4], at[15]);       MULADD(at[5], at[14]);       MULADD(at[6], at[13]);       MULADD(at[7], at[12]);
4781       COMBA_STORE(C->dp[11]);
4782       /* 12 */
4783       COMBA_FORWARD;
4784       MULADD(at[5], at[15]);       MULADD(at[6], at[14]);       MULADD(at[7], at[13]);
4785       COMBA_STORE(C->dp[12]);
4786       /* 13 */
4787       COMBA_FORWARD;
4788       MULADD(at[6], at[15]);       MULADD(at[7], at[14]);
4789       COMBA_STORE(C->dp[13]);
4790       /* 14 */
4791       COMBA_FORWARD;
4792       MULADD(at[7], at[15]);
4793       COMBA_STORE(C->dp[14]);
4794       COMBA_STORE2(C->dp[15]);
4795       C->used = 16;
4796       C->sign = A->sign ^ B->sign;
4797       tfm_fp_clamp(C);
4798       COMBA_FINI;
4799       break;
4800
4801    case 9:
4802       memcpy(at, A->dp, 9 * sizeof(tfm_fp_digit));
4803       memcpy(at+9, B->dp, 9 * sizeof(tfm_fp_digit));
4804       COMBA_START;
4805
4806       COMBA_CLEAR;
4807       /* 0 */
4808       MULADD(at[0], at[9]);
4809       COMBA_STORE(C->dp[0]);
4810       /* 1 */
4811       COMBA_FORWARD;
4812       MULADD(at[0], at[10]);       MULADD(at[1], at[9]);
4813       COMBA_STORE(C->dp[1]);
4814       /* 2 */
4815       COMBA_FORWARD;
4816       MULADD(at[0], at[11]);       MULADD(at[1], at[10]);       MULADD(at[2], at[9]);
4817       COMBA_STORE(C->dp[2]);
4818       /* 3 */
4819       COMBA_FORWARD;
4820       MULADD(at[0], at[12]);       MULADD(at[1], at[11]);       MULADD(at[2], at[10]);       MULADD(at[3], at[9]);
4821       COMBA_STORE(C->dp[3]);
4822       /* 4 */
4823       COMBA_FORWARD;
4824       MULADD(at[0], at[13]);       MULADD(at[1], at[12]);       MULADD(at[2], at[11]);       MULADD(at[3], at[10]);       MULADD(at[4], at[9]);
4825       COMBA_STORE(C->dp[4]);
4826       /* 5 */
4827       COMBA_FORWARD;
4828       MULADD(at[0], at[14]);       MULADD(at[1], at[13]);       MULADD(at[2], at[12]);       MULADD(at[3], at[11]);       MULADD(at[4], at[10]);       MULADD(at[5], at[9]);
4829       COMBA_STORE(C->dp[5]);
4830       /* 6 */
4831       COMBA_FORWARD;
4832       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);       MULADD(at[2], at[13]);       MULADD(at[3], at[12]);       MULADD(at[4], at[11]);       MULADD(at[5], at[10]);       MULADD(at[6], at[9]);
4833       COMBA_STORE(C->dp[6]);
4834       /* 7 */
4835       COMBA_FORWARD;
4836       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);       MULADD(at[2], at[14]);       MULADD(at[3], at[13]);       MULADD(at[4], at[12]);       MULADD(at[5], at[11]);       MULADD(at[6], at[10]);       MULADD(at[7], at[9]);
4837       COMBA_STORE(C->dp[7]);
4838       /* 8 */
4839       COMBA_FORWARD;
4840       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]);       MULADD(at[3], at[14]);       MULADD(at[4], at[13]);       MULADD(at[5], at[12]);       MULADD(at[6], at[11]);       MULADD(at[7], at[10]);       MULADD(at[8], at[9]);
4841       COMBA_STORE(C->dp[8]);
4842       /* 9 */
4843       COMBA_FORWARD;
4844       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]);       MULADD(at[4], at[14]);       MULADD(at[5], at[13]);       MULADD(at[6], at[12]);       MULADD(at[7], at[11]);       MULADD(at[8], at[10]);
4845       COMBA_STORE(C->dp[9]);
4846       /* 10 */
4847       COMBA_FORWARD;
4848       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);       MULADD(at[4], at[15]);       MULADD(at[5], at[14]);       MULADD(at[6], at[13]);       MULADD(at[7], at[12]);       MULADD(at[8], at[11]);
4849       COMBA_STORE(C->dp[10]);
4850       /* 11 */
4851       COMBA_FORWARD;
4852       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);       MULADD(at[5], at[15]);       MULADD(at[6], at[14]);       MULADD(at[7], at[13]);       MULADD(at[8], at[12]);
4853       COMBA_STORE(C->dp[11]);
4854       /* 12 */
4855       COMBA_FORWARD;
4856       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);       MULADD(at[6], at[15]);       MULADD(at[7], at[14]);       MULADD(at[8], at[13]);
4857       COMBA_STORE(C->dp[12]);
4858       /* 13 */
4859       COMBA_FORWARD;
4860       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]);       MULADD(at[8], at[14]);
4861       COMBA_STORE(C->dp[13]);
4862       /* 14 */
4863       COMBA_FORWARD;
4864       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]);
4865       COMBA_STORE(C->dp[14]);
4866       /* 15 */
4867       COMBA_FORWARD;
4868       MULADD(at[7], at[17]);       MULADD(at[8], at[16]);
4869       COMBA_STORE(C->dp[15]);
4870       /* 16 */
4871       COMBA_FORWARD;
4872       MULADD(at[8], at[17]);
4873       COMBA_STORE(C->dp[16]);
4874       COMBA_STORE2(C->dp[17]);
4875       C->used = 18;
4876       C->sign = A->sign ^ B->sign;
4877       tfm_fp_clamp(C);
4878       COMBA_FINI;
4879       break;
4880
4881    case 10:
4882       memcpy(at, A->dp, 10 * sizeof(tfm_fp_digit));
4883       memcpy(at+10, B->dp, 10 * sizeof(tfm_fp_digit));
4884       COMBA_START;
4885
4886       COMBA_CLEAR;
4887       /* 0 */
4888       MULADD(at[0], at[10]);
4889       COMBA_STORE(C->dp[0]);
4890       /* 1 */
4891       COMBA_FORWARD;
4892       MULADD(at[0], at[11]);       MULADD(at[1], at[10]);
4893       COMBA_STORE(C->dp[1]);
4894       /* 2 */
4895       COMBA_FORWARD;
4896       MULADD(at[0], at[12]);       MULADD(at[1], at[11]);       MULADD(at[2], at[10]);
4897       COMBA_STORE(C->dp[2]);
4898       /* 3 */
4899       COMBA_FORWARD;
4900       MULADD(at[0], at[13]);       MULADD(at[1], at[12]);       MULADD(at[2], at[11]);       MULADD(at[3], at[10]);
4901       COMBA_STORE(C->dp[3]);
4902       /* 4 */
4903       COMBA_FORWARD;
4904       MULADD(at[0], at[14]);       MULADD(at[1], at[13]);       MULADD(at[2], at[12]);       MULADD(at[3], at[11]);       MULADD(at[4], at[10]);
4905       COMBA_STORE(C->dp[4]);
4906       /* 5 */
4907       COMBA_FORWARD;
4908       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);       MULADD(at[2], at[13]);       MULADD(at[3], at[12]);       MULADD(at[4], at[11]);       MULADD(at[5], at[10]);
4909       COMBA_STORE(C->dp[5]);
4910       /* 6 */
4911       COMBA_FORWARD;
4912       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);       MULADD(at[2], at[14]);       MULADD(at[3], at[13]);       MULADD(at[4], at[12]);       MULADD(at[5], at[11]);       MULADD(at[6], at[10]);
4913       COMBA_STORE(C->dp[6]);
4914       /* 7 */
4915       COMBA_FORWARD;
4916       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]);       MULADD(at[3], at[14]);       MULADD(at[4], at[13]);       MULADD(at[5], at[12]);       MULADD(at[6], at[11]);       MULADD(at[7], at[10]);
4917       COMBA_STORE(C->dp[7]);
4918       /* 8 */
4919       COMBA_FORWARD;
4920       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]);       MULADD(at[4], at[14]);       MULADD(at[5], at[13]);       MULADD(at[6], at[12]);       MULADD(at[7], at[11]);       MULADD(at[8], at[10]);
4921       COMBA_STORE(C->dp[8]);
4922       /* 9 */
4923       COMBA_FORWARD;
4924       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);       MULADD(at[4], at[15]);       MULADD(at[5], at[14]);       MULADD(at[6], at[13]);       MULADD(at[7], at[12]);       MULADD(at[8], at[11]);       MULADD(at[9], at[10]);
4925       COMBA_STORE(C->dp[9]);
4926       /* 10 */
4927       COMBA_FORWARD;
4928       MULADD(at[1], at[19]);       MULADD(at[2], at[18]);       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);       MULADD(at[5], at[15]);       MULADD(at[6], at[14]);       MULADD(at[7], at[13]);       MULADD(at[8], at[12]);       MULADD(at[9], at[11]);
4929       COMBA_STORE(C->dp[10]);
4930       /* 11 */
4931       COMBA_FORWARD;
4932       MULADD(at[2], at[19]);       MULADD(at[3], at[18]);       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);       MULADD(at[6], at[15]);       MULADD(at[7], at[14]);       MULADD(at[8], at[13]);       MULADD(at[9], at[12]);
4933       COMBA_STORE(C->dp[11]);
4934       /* 12 */
4935       COMBA_FORWARD;
4936       MULADD(at[3], at[19]);       MULADD(at[4], at[18]);       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]);       MULADD(at[8], at[14]);       MULADD(at[9], at[13]);
4937       COMBA_STORE(C->dp[12]);
4938       /* 13 */
4939       COMBA_FORWARD;
4940       MULADD(at[4], at[19]);       MULADD(at[5], at[18]);       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]);       MULADD(at[9], at[14]);
4941       COMBA_STORE(C->dp[13]);
4942       /* 14 */
4943       COMBA_FORWARD;
4944       MULADD(at[5], at[19]);       MULADD(at[6], at[18]);       MULADD(at[7], at[17]);       MULADD(at[8], at[16]);       MULADD(at[9], at[15]);
4945       COMBA_STORE(C->dp[14]);
4946       /* 15 */
4947       COMBA_FORWARD;
4948       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]);
4949       COMBA_STORE(C->dp[15]);
4950       /* 16 */
4951       COMBA_FORWARD;
4952       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]);
4953       COMBA_STORE(C->dp[16]);
4954       /* 17 */
4955       COMBA_FORWARD;
4956       MULADD(at[8], at[19]);       MULADD(at[9], at[18]);
4957       COMBA_STORE(C->dp[17]);
4958       /* 18 */
4959       COMBA_FORWARD;
4960       MULADD(at[9], at[19]);
4961       COMBA_STORE(C->dp[18]);
4962       COMBA_STORE2(C->dp[19]);
4963       C->used = 20;
4964       C->sign = A->sign ^ B->sign;
4965       tfm_fp_clamp(C);
4966       COMBA_FINI;
4967       break;
4968
4969    case 11:
4970       memcpy(at, A->dp, 11 * sizeof(tfm_fp_digit));
4971       memcpy(at+11, B->dp, 11 * sizeof(tfm_fp_digit));
4972       COMBA_START;
4973
4974       COMBA_CLEAR;
4975       /* 0 */
4976       MULADD(at[0], at[11]);
4977       COMBA_STORE(C->dp[0]);
4978       /* 1 */
4979       COMBA_FORWARD;
4980       MULADD(at[0], at[12]);       MULADD(at[1], at[11]);
4981       COMBA_STORE(C->dp[1]);
4982       /* 2 */
4983       COMBA_FORWARD;
4984       MULADD(at[0], at[13]);       MULADD(at[1], at[12]);       MULADD(at[2], at[11]);
4985       COMBA_STORE(C->dp[2]);
4986       /* 3 */
4987       COMBA_FORWARD;
4988       MULADD(at[0], at[14]);       MULADD(at[1], at[13]);       MULADD(at[2], at[12]);       MULADD(at[3], at[11]);
4989       COMBA_STORE(C->dp[3]);
4990       /* 4 */
4991       COMBA_FORWARD;
4992       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);       MULADD(at[2], at[13]);       MULADD(at[3], at[12]);       MULADD(at[4], at[11]);
4993       COMBA_STORE(C->dp[4]);
4994       /* 5 */
4995       COMBA_FORWARD;
4996       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);       MULADD(at[2], at[14]);       MULADD(at[3], at[13]);       MULADD(at[4], at[12]);       MULADD(at[5], at[11]);
4997       COMBA_STORE(C->dp[5]);
4998       /* 6 */
4999       COMBA_FORWARD;
5000       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]);       MULADD(at[3], at[14]);       MULADD(at[4], at[13]);       MULADD(at[5], at[12]);       MULADD(at[6], at[11]);
5001       COMBA_STORE(C->dp[6]);
5002       /* 7 */
5003       COMBA_FORWARD;
5004       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]);       MULADD(at[4], at[14]);       MULADD(at[5], at[13]);       MULADD(at[6], at[12]);       MULADD(at[7], at[11]);
5005       COMBA_STORE(C->dp[7]);
5006       /* 8 */
5007       COMBA_FORWARD;
5008       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);       MULADD(at[4], at[15]);       MULADD(at[5], at[14]);       MULADD(at[6], at[13]);       MULADD(at[7], at[12]);       MULADD(at[8], at[11]);
5009       COMBA_STORE(C->dp[8]);
5010       /* 9 */
5011       COMBA_FORWARD;
5012       MULADD(at[0], at[20]);       MULADD(at[1], at[19]);       MULADD(at[2], at[18]);       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);       MULADD(at[5], at[15]);       MULADD(at[6], at[14]);       MULADD(at[7], at[13]);       MULADD(at[8], at[12]);       MULADD(at[9], at[11]);
5013       COMBA_STORE(C->dp[9]);
5014       /* 10 */
5015       COMBA_FORWARD;
5016       MULADD(at[0], at[21]);       MULADD(at[1], at[20]);       MULADD(at[2], at[19]);       MULADD(at[3], at[18]);       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);       MULADD(at[6], at[15]);       MULADD(at[7], at[14]);       MULADD(at[8], at[13]);       MULADD(at[9], at[12]);       MULADD(at[10], at[11]);
5017       COMBA_STORE(C->dp[10]);
5018       /* 11 */
5019       COMBA_FORWARD;
5020       MULADD(at[1], at[21]);       MULADD(at[2], at[20]);       MULADD(at[3], at[19]);       MULADD(at[4], at[18]);       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]);       MULADD(at[8], at[14]);       MULADD(at[9], at[13]);       MULADD(at[10], at[12]);
5021       COMBA_STORE(C->dp[11]);
5022       /* 12 */
5023       COMBA_FORWARD;
5024       MULADD(at[2], at[21]);       MULADD(at[3], at[20]);       MULADD(at[4], at[19]);       MULADD(at[5], at[18]);       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]);       MULADD(at[9], at[14]);       MULADD(at[10], at[13]);
5025       COMBA_STORE(C->dp[12]);
5026       /* 13 */
5027       COMBA_FORWARD;
5028       MULADD(at[3], at[21]);       MULADD(at[4], at[20]);       MULADD(at[5], at[19]);       MULADD(at[6], at[18]);       MULADD(at[7], at[17]);       MULADD(at[8], at[16]);       MULADD(at[9], at[15]);       MULADD(at[10], at[14]);
5029       COMBA_STORE(C->dp[13]);
5030       /* 14 */
5031       COMBA_FORWARD;
5032       MULADD(at[4], at[21]);       MULADD(at[5], at[20]);       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]);       MULADD(at[10], at[15]);
5033       COMBA_STORE(C->dp[14]);
5034       /* 15 */
5035       COMBA_FORWARD;
5036       MULADD(at[5], at[21]);       MULADD(at[6], at[20]);       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]);       MULADD(at[10], at[16]);
5037       COMBA_STORE(C->dp[15]);
5038       /* 16 */
5039       COMBA_FORWARD;
5040       MULADD(at[6], at[21]);       MULADD(at[7], at[20]);       MULADD(at[8], at[19]);       MULADD(at[9], at[18]);       MULADD(at[10], at[17]);
5041       COMBA_STORE(C->dp[16]);
5042       /* 17 */
5043       COMBA_FORWARD;
5044       MULADD(at[7], at[21]);       MULADD(at[8], at[20]);       MULADD(at[9], at[19]);       MULADD(at[10], at[18]);
5045       COMBA_STORE(C->dp[17]);
5046       /* 18 */
5047       COMBA_FORWARD;
5048       MULADD(at[8], at[21]);       MULADD(at[9], at[20]);       MULADD(at[10], at[19]);
5049       COMBA_STORE(C->dp[18]);
5050       /* 19 */
5051       COMBA_FORWARD;
5052       MULADD(at[9], at[21]);       MULADD(at[10], at[20]);
5053       COMBA_STORE(C->dp[19]);
5054       /* 20 */
5055       COMBA_FORWARD;
5056       MULADD(at[10], at[21]);
5057       COMBA_STORE(C->dp[20]);
5058       COMBA_STORE2(C->dp[21]);
5059       C->used = 22;
5060       C->sign = A->sign ^ B->sign;
5061       tfm_fp_clamp(C);
5062       COMBA_FINI;
5063       break;
5064
5065    case 12:
5066       memcpy(at, A->dp, 12 * sizeof(tfm_fp_digit));
5067       memcpy(at+12, B->dp, 12 * sizeof(tfm_fp_digit));
5068       COMBA_START;
5069
5070       COMBA_CLEAR;
5071       /* 0 */
5072       MULADD(at[0], at[12]);
5073       COMBA_STORE(C->dp[0]);
5074       /* 1 */
5075       COMBA_FORWARD;
5076       MULADD(at[0], at[13]);       MULADD(at[1], at[12]);
5077       COMBA_STORE(C->dp[1]);
5078       /* 2 */
5079       COMBA_FORWARD;
5080       MULADD(at[0], at[14]);       MULADD(at[1], at[13]);       MULADD(at[2], at[12]);
5081       COMBA_STORE(C->dp[2]);
5082       /* 3 */
5083       COMBA_FORWARD;
5084       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);       MULADD(at[2], at[13]);       MULADD(at[3], at[12]);
5085       COMBA_STORE(C->dp[3]);
5086       /* 4 */
5087       COMBA_FORWARD;
5088       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);       MULADD(at[2], at[14]);       MULADD(at[3], at[13]);       MULADD(at[4], at[12]);
5089       COMBA_STORE(C->dp[4]);
5090       /* 5 */
5091       COMBA_FORWARD;
5092       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]);       MULADD(at[3], at[14]);       MULADD(at[4], at[13]);       MULADD(at[5], at[12]);
5093       COMBA_STORE(C->dp[5]);
5094       /* 6 */
5095       COMBA_FORWARD;
5096       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]);       MULADD(at[4], at[14]);       MULADD(at[5], at[13]);       MULADD(at[6], at[12]);
5097       COMBA_STORE(C->dp[6]);
5098       /* 7 */
5099       COMBA_FORWARD;
5100       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);       MULADD(at[4], at[15]);       MULADD(at[5], at[14]);       MULADD(at[6], at[13]);       MULADD(at[7], at[12]);
5101       COMBA_STORE(C->dp[7]);
5102       /* 8 */
5103       COMBA_FORWARD;
5104       MULADD(at[0], at[20]);       MULADD(at[1], at[19]);       MULADD(at[2], at[18]);       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);       MULADD(at[5], at[15]);       MULADD(at[6], at[14]);       MULADD(at[7], at[13]);       MULADD(at[8], at[12]);
5105       COMBA_STORE(C->dp[8]);
5106       /* 9 */
5107       COMBA_FORWARD;
5108       MULADD(at[0], at[21]);       MULADD(at[1], at[20]);       MULADD(at[2], at[19]);       MULADD(at[3], at[18]);       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);       MULADD(at[6], at[15]);       MULADD(at[7], at[14]);       MULADD(at[8], at[13]);       MULADD(at[9], at[12]);
5109       COMBA_STORE(C->dp[9]);
5110       /* 10 */
5111       COMBA_FORWARD;
5112       MULADD(at[0], at[22]);       MULADD(at[1], at[21]);       MULADD(at[2], at[20]);       MULADD(at[3], at[19]);       MULADD(at[4], at[18]);       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]);       MULADD(at[8], at[14]);       MULADD(at[9], at[13]);       MULADD(at[10], at[12]);
5113       COMBA_STORE(C->dp[10]);
5114       /* 11 */
5115       COMBA_FORWARD;
5116       MULADD(at[0], at[23]);       MULADD(at[1], at[22]);       MULADD(at[2], at[21]);       MULADD(at[3], at[20]);       MULADD(at[4], at[19]);       MULADD(at[5], at[18]);       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]);       MULADD(at[9], at[14]);       MULADD(at[10], at[13]);       MULADD(at[11], at[12]);
5117       COMBA_STORE(C->dp[11]);
5118       /* 12 */
5119       COMBA_FORWARD;
5120       MULADD(at[1], at[23]);       MULADD(at[2], at[22]);       MULADD(at[3], at[21]);       MULADD(at[4], at[20]);       MULADD(at[5], at[19]);       MULADD(at[6], at[18]);       MULADD(at[7], at[17]);       MULADD(at[8], at[16]);       MULADD(at[9], at[15]);       MULADD(at[10], at[14]);       MULADD(at[11], at[13]);
5121       COMBA_STORE(C->dp[12]);
5122       /* 13 */
5123       COMBA_FORWARD;
5124       MULADD(at[2], at[23]);       MULADD(at[3], at[22]);       MULADD(at[4], at[21]);       MULADD(at[5], at[20]);       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]);       MULADD(at[10], at[15]);       MULADD(at[11], at[14]);
5125       COMBA_STORE(C->dp[13]);
5126       /* 14 */
5127       COMBA_FORWARD;
5128       MULADD(at[3], at[23]);       MULADD(at[4], at[22]);       MULADD(at[5], at[21]);       MULADD(at[6], at[20]);       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]);       MULADD(at[10], at[16]);       MULADD(at[11], at[15]);
5129       COMBA_STORE(C->dp[14]);
5130       /* 15 */
5131       COMBA_FORWARD;
5132       MULADD(at[4], at[23]);       MULADD(at[5], at[22]);       MULADD(at[6], at[21]);       MULADD(at[7], at[20]);       MULADD(at[8], at[19]);       MULADD(at[9], at[18]);       MULADD(at[10], at[17]);       MULADD(at[11], at[16]);
5133       COMBA_STORE(C->dp[15]);
5134       /* 16 */
5135       COMBA_FORWARD;
5136       MULADD(at[5], at[23]);       MULADD(at[6], at[22]);       MULADD(at[7], at[21]);       MULADD(at[8], at[20]);       MULADD(at[9], at[19]);       MULADD(at[10], at[18]);       MULADD(at[11], at[17]);
5137       COMBA_STORE(C->dp[16]);
5138       /* 17 */
5139       COMBA_FORWARD;
5140       MULADD(at[6], at[23]);       MULADD(at[7], at[22]);       MULADD(at[8], at[21]);       MULADD(at[9], at[20]);       MULADD(at[10], at[19]);       MULADD(at[11], at[18]);
5141       COMBA_STORE(C->dp[17]);
5142       /* 18 */
5143       COMBA_FORWARD;
5144       MULADD(at[7], at[23]);       MULADD(at[8], at[22]);       MULADD(at[9], at[21]);       MULADD(at[10], at[20]);       MULADD(at[11], at[19]);
5145       COMBA_STORE(C->dp[18]);
5146       /* 19 */
5147       COMBA_FORWARD;
5148       MULADD(at[8], at[23]);       MULADD(at[9], at[22]);       MULADD(at[10], at[21]);       MULADD(at[11], at[20]);
5149       COMBA_STORE(C->dp[19]);
5150       /* 20 */
5151       COMBA_FORWARD;
5152       MULADD(at[9], at[23]);       MULADD(at[10], at[22]);       MULADD(at[11], at[21]);
5153       COMBA_STORE(C->dp[20]);
5154       /* 21 */
5155       COMBA_FORWARD;
5156       MULADD(at[10], at[23]);       MULADD(at[11], at[22]);
5157       COMBA_STORE(C->dp[21]);
5158       /* 22 */
5159       COMBA_FORWARD;
5160       MULADD(at[11], at[23]);
5161       COMBA_STORE(C->dp[22]);
5162       COMBA_STORE2(C->dp[23]);
5163       C->used = 24;
5164       C->sign = A->sign ^ B->sign;
5165       tfm_fp_clamp(C);
5166       COMBA_FINI;
5167       break;
5168
5169    case 13:
5170       memcpy(at, A->dp, 13 * sizeof(tfm_fp_digit));
5171       memcpy(at+13, B->dp, 13 * sizeof(tfm_fp_digit));
5172       COMBA_START;
5173
5174       COMBA_CLEAR;
5175       /* 0 */
5176       MULADD(at[0], at[13]);
5177       COMBA_STORE(C->dp[0]);
5178       /* 1 */
5179       COMBA_FORWARD;
5180       MULADD(at[0], at[14]);       MULADD(at[1], at[13]);
5181       COMBA_STORE(C->dp[1]);
5182       /* 2 */
5183       COMBA_FORWARD;
5184       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);       MULADD(at[2], at[13]);
5185       COMBA_STORE(C->dp[2]);
5186       /* 3 */
5187       COMBA_FORWARD;
5188       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);       MULADD(at[2], at[14]);       MULADD(at[3], at[13]);
5189       COMBA_STORE(C->dp[3]);
5190       /* 4 */
5191       COMBA_FORWARD;
5192       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]);       MULADD(at[3], at[14]);       MULADD(at[4], at[13]);
5193       COMBA_STORE(C->dp[4]);
5194       /* 5 */
5195       COMBA_FORWARD;
5196       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]);       MULADD(at[4], at[14]);       MULADD(at[5], at[13]);
5197       COMBA_STORE(C->dp[5]);
5198       /* 6 */
5199       COMBA_FORWARD;
5200       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);       MULADD(at[4], at[15]);       MULADD(at[5], at[14]);       MULADD(at[6], at[13]);
5201       COMBA_STORE(C->dp[6]);
5202       /* 7 */
5203       COMBA_FORWARD;
5204       MULADD(at[0], at[20]);       MULADD(at[1], at[19]);       MULADD(at[2], at[18]);       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);       MULADD(at[5], at[15]);       MULADD(at[6], at[14]);       MULADD(at[7], at[13]);
5205       COMBA_STORE(C->dp[7]);
5206       /* 8 */
5207       COMBA_FORWARD;
5208       MULADD(at[0], at[21]);       MULADD(at[1], at[20]);       MULADD(at[2], at[19]);       MULADD(at[3], at[18]);       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);       MULADD(at[6], at[15]);       MULADD(at[7], at[14]);       MULADD(at[8], at[13]);
5209       COMBA_STORE(C->dp[8]);
5210       /* 9 */
5211       COMBA_FORWARD;
5212       MULADD(at[0], at[22]);       MULADD(at[1], at[21]);       MULADD(at[2], at[20]);       MULADD(at[3], at[19]);       MULADD(at[4], at[18]);       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]);       MULADD(at[8], at[14]);       MULADD(at[9], at[13]);
5213       COMBA_STORE(C->dp[9]);
5214       /* 10 */
5215       COMBA_FORWARD;
5216       MULADD(at[0], at[23]);       MULADD(at[1], at[22]);       MULADD(at[2], at[21]);       MULADD(at[3], at[20]);       MULADD(at[4], at[19]);       MULADD(at[5], at[18]);       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]);       MULADD(at[9], at[14]);       MULADD(at[10], at[13]);
5217       COMBA_STORE(C->dp[10]);
5218       /* 11 */
5219       COMBA_FORWARD;
5220       MULADD(at[0], at[24]);       MULADD(at[1], at[23]);       MULADD(at[2], at[22]);       MULADD(at[3], at[21]);       MULADD(at[4], at[20]);       MULADD(at[5], at[19]);       MULADD(at[6], at[18]);       MULADD(at[7], at[17]);       MULADD(at[8], at[16]);       MULADD(at[9], at[15]);       MULADD(at[10], at[14]);       MULADD(at[11], at[13]);
5221       COMBA_STORE(C->dp[11]);
5222       /* 12 */
5223       COMBA_FORWARD;
5224       MULADD(at[0], at[25]);       MULADD(at[1], at[24]);       MULADD(at[2], at[23]);       MULADD(at[3], at[22]);       MULADD(at[4], at[21]);       MULADD(at[5], at[20]);       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]);       MULADD(at[10], at[15]);       MULADD(at[11], at[14]);       MULADD(at[12], at[13]);
5225       COMBA_STORE(C->dp[12]);
5226       /* 13 */
5227       COMBA_FORWARD;
5228       MULADD(at[1], at[25]);       MULADD(at[2], at[24]);       MULADD(at[3], at[23]);       MULADD(at[4], at[22]);       MULADD(at[5], at[21]);       MULADD(at[6], at[20]);       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]);       MULADD(at[10], at[16]);       MULADD(at[11], at[15]);       MULADD(at[12], at[14]);
5229       COMBA_STORE(C->dp[13]);
5230       /* 14 */
5231       COMBA_FORWARD;
5232       MULADD(at[2], at[25]);       MULADD(at[3], at[24]);       MULADD(at[4], at[23]);       MULADD(at[5], at[22]);       MULADD(at[6], at[21]);       MULADD(at[7], at[20]);       MULADD(at[8], at[19]);       MULADD(at[9], at[18]);       MULADD(at[10], at[17]);       MULADD(at[11], at[16]);       MULADD(at[12], at[15]);
5233       COMBA_STORE(C->dp[14]);
5234       /* 15 */
5235       COMBA_FORWARD;
5236       MULADD(at[3], at[25]);       MULADD(at[4], at[24]);       MULADD(at[5], at[23]);       MULADD(at[6], at[22]);       MULADD(at[7], at[21]);       MULADD(at[8], at[20]);       MULADD(at[9], at[19]);       MULADD(at[10], at[18]);       MULADD(at[11], at[17]);       MULADD(at[12], at[16]);
5237       COMBA_STORE(C->dp[15]);
5238       /* 16 */
5239       COMBA_FORWARD;
5240       MULADD(at[4], at[25]);       MULADD(at[5], at[24]);       MULADD(at[6], at[23]);       MULADD(at[7], at[22]);       MULADD(at[8], at[21]);       MULADD(at[9], at[20]);       MULADD(at[10], at[19]);       MULADD(at[11], at[18]);       MULADD(at[12], at[17]);
5241       COMBA_STORE(C->dp[16]);
5242       /* 17 */
5243       COMBA_FORWARD;
5244       MULADD(at[5], at[25]);       MULADD(at[6], at[24]);       MULADD(at[7], at[23]);       MULADD(at[8], at[22]);       MULADD(at[9], at[21]);       MULADD(at[10], at[20]);       MULADD(at[11], at[19]);       MULADD(at[12], at[18]);
5245       COMBA_STORE(C->dp[17]);
5246       /* 18 */
5247       COMBA_FORWARD;
5248       MULADD(at[6], at[25]);       MULADD(at[7], at[24]);       MULADD(at[8], at[23]);       MULADD(at[9], at[22]);       MULADD(at[10], at[21]);       MULADD(at[11], at[20]);       MULADD(at[12], at[19]);
5249       COMBA_STORE(C->dp[18]);
5250       /* 19 */
5251       COMBA_FORWARD;
5252       MULADD(at[7], at[25]);       MULADD(at[8], at[24]);       MULADD(at[9], at[23]);       MULADD(at[10], at[22]);       MULADD(at[11], at[21]);       MULADD(at[12], at[20]);
5253       COMBA_STORE(C->dp[19]);
5254       /* 20 */
5255       COMBA_FORWARD;
5256       MULADD(at[8], at[25]);       MULADD(at[9], at[24]);       MULADD(at[10], at[23]);       MULADD(at[11], at[22]);       MULADD(at[12], at[21]);
5257       COMBA_STORE(C->dp[20]);
5258       /* 21 */
5259       COMBA_FORWARD;
5260       MULADD(at[9], at[25]);       MULADD(at[10], at[24]);       MULADD(at[11], at[23]);       MULADD(at[12], at[22]);
5261       COMBA_STORE(C->dp[21]);
5262       /* 22 */
5263       COMBA_FORWARD;
5264       MULADD(at[10], at[25]);       MULADD(at[11], at[24]);       MULADD(at[12], at[23]);
5265       COMBA_STORE(C->dp[22]);
5266       /* 23 */
5267       COMBA_FORWARD;
5268       MULADD(at[11], at[25]);       MULADD(at[12], at[24]);
5269       COMBA_STORE(C->dp[23]);
5270       /* 24 */
5271       COMBA_FORWARD;
5272       MULADD(at[12], at[25]);
5273       COMBA_STORE(C->dp[24]);
5274       COMBA_STORE2(C->dp[25]);
5275       C->used = 26;
5276       C->sign = A->sign ^ B->sign;
5277       tfm_fp_clamp(C);
5278       COMBA_FINI;
5279       break;
5280
5281    case 14:
5282       memcpy(at, A->dp, 14 * sizeof(tfm_fp_digit));
5283       memcpy(at+14, B->dp, 14 * sizeof(tfm_fp_digit));
5284       COMBA_START;
5285
5286       COMBA_CLEAR;
5287       /* 0 */
5288       MULADD(at[0], at[14]);
5289       COMBA_STORE(C->dp[0]);
5290       /* 1 */
5291       COMBA_FORWARD;
5292       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);
5293       COMBA_STORE(C->dp[1]);
5294       /* 2 */
5295       COMBA_FORWARD;
5296       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);       MULADD(at[2], at[14]);
5297       COMBA_STORE(C->dp[2]);
5298       /* 3 */
5299       COMBA_FORWARD;
5300       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]);       MULADD(at[3], at[14]);
5301       COMBA_STORE(C->dp[3]);
5302       /* 4 */
5303       COMBA_FORWARD;
5304       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]);       MULADD(at[4], at[14]);
5305       COMBA_STORE(C->dp[4]);
5306       /* 5 */
5307       COMBA_FORWARD;
5308       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);       MULADD(at[4], at[15]);       MULADD(at[5], at[14]);
5309       COMBA_STORE(C->dp[5]);
5310       /* 6 */
5311       COMBA_FORWARD;
5312       MULADD(at[0], at[20]);       MULADD(at[1], at[19]);       MULADD(at[2], at[18]);       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);       MULADD(at[5], at[15]);       MULADD(at[6], at[14]);
5313       COMBA_STORE(C->dp[6]);
5314       /* 7 */
5315       COMBA_FORWARD;
5316       MULADD(at[0], at[21]);       MULADD(at[1], at[20]);       MULADD(at[2], at[19]);       MULADD(at[3], at[18]);       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);       MULADD(at[6], at[15]);       MULADD(at[7], at[14]);
5317       COMBA_STORE(C->dp[7]);
5318       /* 8 */
5319       COMBA_FORWARD;
5320       MULADD(at[0], at[22]);       MULADD(at[1], at[21]);       MULADD(at[2], at[20]);       MULADD(at[3], at[19]);       MULADD(at[4], at[18]);       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]);       MULADD(at[8], at[14]);
5321       COMBA_STORE(C->dp[8]);
5322       /* 9 */
5323       COMBA_FORWARD;
5324       MULADD(at[0], at[23]);       MULADD(at[1], at[22]);       MULADD(at[2], at[21]);       MULADD(at[3], at[20]);       MULADD(at[4], at[19]);       MULADD(at[5], at[18]);       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]);       MULADD(at[9], at[14]);
5325       COMBA_STORE(C->dp[9]);
5326       /* 10 */
5327       COMBA_FORWARD;
5328       MULADD(at[0], at[24]);       MULADD(at[1], at[23]);       MULADD(at[2], at[22]);       MULADD(at[3], at[21]);       MULADD(at[4], at[20]);       MULADD(at[5], at[19]);       MULADD(at[6], at[18]);       MULADD(at[7], at[17]);       MULADD(at[8], at[16]);       MULADD(at[9], at[15]);       MULADD(at[10], at[14]);
5329       COMBA_STORE(C->dp[10]);
5330       /* 11 */
5331       COMBA_FORWARD;
5332       MULADD(at[0], at[25]);       MULADD(at[1], at[24]);       MULADD(at[2], at[23]);       MULADD(at[3], at[22]);       MULADD(at[4], at[21]);       MULADD(at[5], at[20]);       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]);       MULADD(at[10], at[15]);       MULADD(at[11], at[14]);
5333       COMBA_STORE(C->dp[11]);
5334       /* 12 */
5335       COMBA_FORWARD;
5336       MULADD(at[0], at[26]);       MULADD(at[1], at[25]);       MULADD(at[2], at[24]);       MULADD(at[3], at[23]);       MULADD(at[4], at[22]);       MULADD(at[5], at[21]);       MULADD(at[6], at[20]);       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]);       MULADD(at[10], at[16]);       MULADD(at[11], at[15]);       MULADD(at[12], at[14]);
5337       COMBA_STORE(C->dp[12]);
5338       /* 13 */
5339       COMBA_FORWARD;
5340       MULADD(at[0], at[27]);       MULADD(at[1], at[26]);       MULADD(at[2], at[25]);       MULADD(at[3], at[24]);       MULADD(at[4], at[23]);       MULADD(at[5], at[22]);       MULADD(at[6], at[21]);       MULADD(at[7], at[20]);       MULADD(at[8], at[19]);       MULADD(at[9], at[18]);       MULADD(at[10], at[17]);       MULADD(at[11], at[16]);       MULADD(at[12], at[15]);       MULADD(at[13], at[14]);
5341       COMBA_STORE(C->dp[13]);
5342       /* 14 */
5343       COMBA_FORWARD;
5344       MULADD(at[1], at[27]);       MULADD(at[2], at[26]);       MULADD(at[3], at[25]);       MULADD(at[4], at[24]);       MULADD(at[5], at[23]);       MULADD(at[6], at[22]);       MULADD(at[7], at[21]);       MULADD(at[8], at[20]);       MULADD(at[9], at[19]);       MULADD(at[10], at[18]);       MULADD(at[11], at[17]);       MULADD(at[12], at[16]);       MULADD(at[13], at[15]);
5345       COMBA_STORE(C->dp[14]);
5346       /* 15 */
5347       COMBA_FORWARD;
5348       MULADD(at[2], at[27]);       MULADD(at[3], at[26]);       MULADD(at[4], at[25]);       MULADD(at[5], at[24]);       MULADD(at[6], at[23]);       MULADD(at[7], at[22]);       MULADD(at[8], at[21]);       MULADD(at[9], at[20]);       MULADD(at[10], at[19]);       MULADD(at[11], at[18]);       MULADD(at[12], at[17]);       MULADD(at[13], at[16]);
5349       COMBA_STORE(C->dp[15]);
5350       /* 16 */
5351       COMBA_FORWARD;
5352       MULADD(at[3], at[27]);       MULADD(at[4], at[26]);       MULADD(at[5], at[25]);       MULADD(at[6], at[24]);       MULADD(at[7], at[23]);       MULADD(at[8], at[22]);       MULADD(at[9], at[21]);       MULADD(at[10], at[20]);       MULADD(at[11], at[19]);       MULADD(at[12], at[18]);       MULADD(at[13], at[17]);
5353       COMBA_STORE(C->dp[16]);
5354       /* 17 */
5355       COMBA_FORWARD;
5356       MULADD(at[4], at[27]);       MULADD(at[5], at[26]);       MULADD(at[6], at[25]);       MULADD(at[7], at[24]);       MULADD(at[8], at[23]);       MULADD(at[9], at[22]);       MULADD(at[10], at[21]);       MULADD(at[11], at[20]);       MULADD(at[12], at[19]);       MULADD(at[13], at[18]);
5357       COMBA_STORE(C->dp[17]);
5358       /* 18 */
5359       COMBA_FORWARD;
5360       MULADD(at[5], at[27]);       MULADD(at[6], at[26]);       MULADD(at[7], at[25]);       MULADD(at[8], at[24]);       MULADD(at[9], at[23]);       MULADD(at[10], at[22]);       MULADD(at[11], at[21]);       MULADD(at[12], at[20]);       MULADD(at[13], at[19]);
5361       COMBA_STORE(C->dp[18]);
5362       /* 19 */
5363       COMBA_FORWARD;
5364       MULADD(at[6], at[27]);       MULADD(at[7], at[26]);       MULADD(at[8], at[25]);       MULADD(at[9], at[24]);       MULADD(at[10], at[23]);       MULADD(at[11], at[22]);       MULADD(at[12], at[21]);       MULADD(at[13], at[20]);
5365       COMBA_STORE(C->dp[19]);
5366       /* 20 */
5367       COMBA_FORWARD;
5368       MULADD(at[7], at[27]);       MULADD(at[8], at[26]);       MULADD(at[9], at[25]);       MULADD(at[10], at[24]);       MULADD(at[11], at[23]);       MULADD(at[12], at[22]);       MULADD(at[13], at[21]);
5369       COMBA_STORE(C->dp[20]);
5370       /* 21 */
5371       COMBA_FORWARD;
5372       MULADD(at[8], at[27]);       MULADD(at[9], at[26]);       MULADD(at[10], at[25]);       MULADD(at[11], at[24]);       MULADD(at[12], at[23]);       MULADD(at[13], at[22]);
5373       COMBA_STORE(C->dp[21]);
5374       /* 22 */
5375       COMBA_FORWARD;
5376       MULADD(at[9], at[27]);       MULADD(at[10], at[26]);       MULADD(at[11], at[25]);       MULADD(at[12], at[24]);       MULADD(at[13], at[23]);
5377       COMBA_STORE(C->dp[22]);
5378       /* 23 */
5379       COMBA_FORWARD;
5380       MULADD(at[10], at[27]);       MULADD(at[11], at[26]);       MULADD(at[12], at[25]);       MULADD(at[13], at[24]);
5381       COMBA_STORE(C->dp[23]);
5382       /* 24 */
5383       COMBA_FORWARD;
5384       MULADD(at[11], at[27]);       MULADD(at[12], at[26]);       MULADD(at[13], at[25]);
5385       COMBA_STORE(C->dp[24]);
5386       /* 25 */
5387       COMBA_FORWARD;
5388       MULADD(at[12], at[27]);       MULADD(at[13], at[26]);
5389       COMBA_STORE(C->dp[25]);
5390       /* 26 */
5391       COMBA_FORWARD;
5392       MULADD(at[13], at[27]);
5393       COMBA_STORE(C->dp[26]);
5394       COMBA_STORE2(C->dp[27]);
5395       C->used = 28;
5396       C->sign = A->sign ^ B->sign;
5397       tfm_fp_clamp(C);
5398       COMBA_FINI;
5399       break;
5400
5401    case 15:
5402       memcpy(at, A->dp, 15 * sizeof(tfm_fp_digit));
5403       memcpy(at+15, B->dp, 15 * sizeof(tfm_fp_digit));
5404       COMBA_START;
5405
5406       COMBA_CLEAR;
5407       /* 0 */
5408       MULADD(at[0], at[15]);
5409       COMBA_STORE(C->dp[0]);
5410       /* 1 */
5411       COMBA_FORWARD;
5412       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);
5413       COMBA_STORE(C->dp[1]);
5414       /* 2 */
5415       COMBA_FORWARD;
5416       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]);
5417       COMBA_STORE(C->dp[2]);
5418       /* 3 */
5419       COMBA_FORWARD;
5420       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]);
5421       COMBA_STORE(C->dp[3]);
5422       /* 4 */
5423       COMBA_FORWARD;
5424       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);       MULADD(at[4], at[15]);
5425       COMBA_STORE(C->dp[4]);
5426       /* 5 */
5427       COMBA_FORWARD;
5428       MULADD(at[0], at[20]);       MULADD(at[1], at[19]);       MULADD(at[2], at[18]);       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);       MULADD(at[5], at[15]);
5429       COMBA_STORE(C->dp[5]);
5430       /* 6 */
5431       COMBA_FORWARD;
5432       MULADD(at[0], at[21]);       MULADD(at[1], at[20]);       MULADD(at[2], at[19]);       MULADD(at[3], at[18]);       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);       MULADD(at[6], at[15]);
5433       COMBA_STORE(C->dp[6]);
5434       /* 7 */
5435       COMBA_FORWARD;
5436       MULADD(at[0], at[22]);       MULADD(at[1], at[21]);       MULADD(at[2], at[20]);       MULADD(at[3], at[19]);       MULADD(at[4], at[18]);       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]);
5437       COMBA_STORE(C->dp[7]);
5438       /* 8 */
5439       COMBA_FORWARD;
5440       MULADD(at[0], at[23]);       MULADD(at[1], at[22]);       MULADD(at[2], at[21]);       MULADD(at[3], at[20]);       MULADD(at[4], at[19]);       MULADD(at[5], at[18]);       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]);
5441       COMBA_STORE(C->dp[8]);
5442       /* 9 */
5443       COMBA_FORWARD;
5444       MULADD(at[0], at[24]);       MULADD(at[1], at[23]);       MULADD(at[2], at[22]);       MULADD(at[3], at[21]);       MULADD(at[4], at[20]);       MULADD(at[5], at[19]);       MULADD(at[6], at[18]);       MULADD(at[7], at[17]);       MULADD(at[8], at[16]);       MULADD(at[9], at[15]);
5445       COMBA_STORE(C->dp[9]);
5446       /* 10 */
5447       COMBA_FORWARD;
5448       MULADD(at[0], at[25]);       MULADD(at[1], at[24]);       MULADD(at[2], at[23]);       MULADD(at[3], at[22]);       MULADD(at[4], at[21]);       MULADD(at[5], at[20]);       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]);       MULADD(at[10], at[15]);
5449       COMBA_STORE(C->dp[10]);
5450       /* 11 */
5451       COMBA_FORWARD;
5452       MULADD(at[0], at[26]);       MULADD(at[1], at[25]);       MULADD(at[2], at[24]);       MULADD(at[3], at[23]);       MULADD(at[4], at[22]);       MULADD(at[5], at[21]);       MULADD(at[6], at[20]);       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]);       MULADD(at[10], at[16]);       MULADD(at[11], at[15]);
5453       COMBA_STORE(C->dp[11]);
5454       /* 12 */
5455       COMBA_FORWARD;
5456       MULADD(at[0], at[27]);       MULADD(at[1], at[26]);       MULADD(at[2], at[25]);       MULADD(at[3], at[24]);       MULADD(at[4], at[23]);       MULADD(at[5], at[22]);       MULADD(at[6], at[21]);       MULADD(at[7], at[20]);       MULADD(at[8], at[19]);       MULADD(at[9], at[18]);       MULADD(at[10], at[17]);       MULADD(at[11], at[16]);       MULADD(at[12], at[15]);
5457       COMBA_STORE(C->dp[12]);
5458       /* 13 */
5459       COMBA_FORWARD;
5460       MULADD(at[0], at[28]);       MULADD(at[1], at[27]);       MULADD(at[2], at[26]);       MULADD(at[3], at[25]);       MULADD(at[4], at[24]);       MULADD(at[5], at[23]);       MULADD(at[6], at[22]);       MULADD(at[7], at[21]);       MULADD(at[8], at[20]);       MULADD(at[9], at[19]);       MULADD(at[10], at[18]);       MULADD(at[11], at[17]);       MULADD(at[12], at[16]);       MULADD(at[13], at[15]);
5461       COMBA_STORE(C->dp[13]);
5462       /* 14 */
5463       COMBA_FORWARD;
5464       MULADD(at[0], at[29]);       MULADD(at[1], at[28]);       MULADD(at[2], at[27]);       MULADD(at[3], at[26]);       MULADD(at[4], at[25]);       MULADD(at[5], at[24]);       MULADD(at[6], at[23]);       MULADD(at[7], at[22]);       MULADD(at[8], at[21]);       MULADD(at[9], at[20]);       MULADD(at[10], at[19]);       MULADD(at[11], at[18]);       MULADD(at[12], at[17]);       MULADD(at[13], at[16]);       MULADD(at[14], at[15]);
5465       COMBA_STORE(C->dp[14]);
5466       /* 15 */
5467       COMBA_FORWARD;
5468       MULADD(at[1], at[29]);       MULADD(at[2], at[28]);       MULADD(at[3], at[27]);       MULADD(at[4], at[26]);       MULADD(at[5], at[25]);       MULADD(at[6], at[24]);       MULADD(at[7], at[23]);       MULADD(at[8], at[22]);       MULADD(at[9], at[21]);       MULADD(at[10], at[20]);       MULADD(at[11], at[19]);       MULADD(at[12], at[18]);       MULADD(at[13], at[17]);       MULADD(at[14], at[16]);
5469       COMBA_STORE(C->dp[15]);
5470       /* 16 */
5471       COMBA_FORWARD;
5472       MULADD(at[2], at[29]);       MULADD(at[3], at[28]);       MULADD(at[4], at[27]);       MULADD(at[5], at[26]);       MULADD(at[6], at[25]);       MULADD(at[7], at[24]);       MULADD(at[8], at[23]);       MULADD(at[9], at[22]);       MULADD(at[10], at[21]);       MULADD(at[11], at[20]);       MULADD(at[12], at[19]);       MULADD(at[13], at[18]);       MULADD(at[14], at[17]);
5473       COMBA_STORE(C->dp[16]);
5474       /* 17 */
5475       COMBA_FORWARD;
5476       MULADD(at[3], at[29]);       MULADD(at[4], at[28]);       MULADD(at[5], at[27]);       MULADD(at[6], at[26]);       MULADD(at[7], at[25]);       MULADD(at[8], at[24]);       MULADD(at[9], at[23]);       MULADD(at[10], at[22]);       MULADD(at[11], at[21]);       MULADD(at[12], at[20]);       MULADD(at[13], at[19]);       MULADD(at[14], at[18]);
5477       COMBA_STORE(C->dp[17]);
5478       /* 18 */
5479       COMBA_FORWARD;
5480       MULADD(at[4], at[29]);       MULADD(at[5], at[28]);       MULADD(at[6], at[27]);       MULADD(at[7], at[26]);       MULADD(at[8], at[25]);       MULADD(at[9], at[24]);       MULADD(at[10], at[23]);       MULADD(at[11], at[22]);       MULADD(at[12], at[21]);       MULADD(at[13], at[20]);       MULADD(at[14], at[19]);
5481       COMBA_STORE(C->dp[18]);
5482       /* 19 */
5483       COMBA_FORWARD;
5484       MULADD(at[5], at[29]);       MULADD(at[6], at[28]);       MULADD(at[7], at[27]);       MULADD(at[8], at[26]);       MULADD(at[9], at[25]);       MULADD(at[10], at[24]);       MULADD(at[11], at[23]);       MULADD(at[12], at[22]);       MULADD(at[13], at[21]);       MULADD(at[14], at[20]);
5485       COMBA_STORE(C->dp[19]);
5486       /* 20 */
5487       COMBA_FORWARD;
5488       MULADD(at[6], at[29]);       MULADD(at[7], at[28]);       MULADD(at[8], at[27]);       MULADD(at[9], at[26]);       MULADD(at[10], at[25]);       MULADD(at[11], at[24]);       MULADD(at[12], at[23]);       MULADD(at[13], at[22]);       MULADD(at[14], at[21]);
5489       COMBA_STORE(C->dp[20]);
5490       /* 21 */
5491       COMBA_FORWARD;
5492       MULADD(at[7], at[29]);       MULADD(at[8], at[28]);       MULADD(at[9], at[27]);       MULADD(at[10], at[26]);       MULADD(at[11], at[25]);       MULADD(at[12], at[24]);       MULADD(at[13], at[23]);       MULADD(at[14], at[22]);
5493       COMBA_STORE(C->dp[21]);
5494       /* 22 */
5495       COMBA_FORWARD;
5496       MULADD(at[8], at[29]);       MULADD(at[9], at[28]);       MULADD(at[10], at[27]);       MULADD(at[11], at[26]);       MULADD(at[12], at[25]);       MULADD(at[13], at[24]);       MULADD(at[14], at[23]);
5497       COMBA_STORE(C->dp[22]);
5498       /* 23 */
5499       COMBA_FORWARD;
5500       MULADD(at[9], at[29]);       MULADD(at[10], at[28]);       MULADD(at[11], at[27]);       MULADD(at[12], at[26]);       MULADD(at[13], at[25]);       MULADD(at[14], at[24]);
5501       COMBA_STORE(C->dp[23]);
5502       /* 24 */
5503       COMBA_FORWARD;
5504       MULADD(at[10], at[29]);       MULADD(at[11], at[28]);       MULADD(at[12], at[27]);       MULADD(at[13], at[26]);       MULADD(at[14], at[25]);
5505       COMBA_STORE(C->dp[24]);
5506       /* 25 */
5507       COMBA_FORWARD;
5508       MULADD(at[11], at[29]);       MULADD(at[12], at[28]);       MULADD(at[13], at[27]);       MULADD(at[14], at[26]);
5509       COMBA_STORE(C->dp[25]);
5510       /* 26 */
5511       COMBA_FORWARD;
5512       MULADD(at[12], at[29]);       MULADD(at[13], at[28]);       MULADD(at[14], at[27]);
5513       COMBA_STORE(C->dp[26]);
5514       /* 27 */
5515       COMBA_FORWARD;
5516       MULADD(at[13], at[29]);       MULADD(at[14], at[28]);
5517       COMBA_STORE(C->dp[27]);
5518       /* 28 */
5519       COMBA_FORWARD;
5520       MULADD(at[14], at[29]);
5521       COMBA_STORE(C->dp[28]);
5522       COMBA_STORE2(C->dp[29]);
5523       C->used = 30;
5524       C->sign = A->sign ^ B->sign;
5525       tfm_fp_clamp(C);
5526       COMBA_FINI;
5527       break;
5528
5529    case 16:
5530       memcpy(at, A->dp, 16 * sizeof(tfm_fp_digit));
5531       memcpy(at+16, B->dp, 16 * sizeof(tfm_fp_digit));
5532       COMBA_START;
5533
5534       COMBA_CLEAR;
5535       /* 0 */
5536       MULADD(at[0], at[16]);
5537       COMBA_STORE(C->dp[0]);
5538       /* 1 */
5539       COMBA_FORWARD;
5540       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);
5541       COMBA_STORE(C->dp[1]);
5542       /* 2 */
5543       COMBA_FORWARD;
5544       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);
5545       COMBA_STORE(C->dp[2]);
5546       /* 3 */
5547       COMBA_FORWARD;
5548       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);
5549       COMBA_STORE(C->dp[3]);
5550       /* 4 */
5551       COMBA_FORWARD;
5552       MULADD(at[0], at[20]);       MULADD(at[1], at[19]);       MULADD(at[2], at[18]);       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);
5553       COMBA_STORE(C->dp[4]);
5554       /* 5 */
5555       COMBA_FORWARD;
5556       MULADD(at[0], at[21]);       MULADD(at[1], at[20]);       MULADD(at[2], at[19]);       MULADD(at[3], at[18]);       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);
5557       COMBA_STORE(C->dp[5]);
5558       /* 6 */
5559       COMBA_FORWARD;
5560       MULADD(at[0], at[22]);       MULADD(at[1], at[21]);       MULADD(at[2], at[20]);       MULADD(at[3], at[19]);       MULADD(at[4], at[18]);       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);
5561       COMBA_STORE(C->dp[6]);
5562       /* 7 */
5563       COMBA_FORWARD;
5564       MULADD(at[0], at[23]);       MULADD(at[1], at[22]);       MULADD(at[2], at[21]);       MULADD(at[3], at[20]);       MULADD(at[4], at[19]);       MULADD(at[5], at[18]);       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);
5565       COMBA_STORE(C->dp[7]);
5566       /* 8 */
5567       COMBA_FORWARD;
5568       MULADD(at[0], at[24]);       MULADD(at[1], at[23]);       MULADD(at[2], at[22]);       MULADD(at[3], at[21]);       MULADD(at[4], at[20]);       MULADD(at[5], at[19]);       MULADD(at[6], at[18]);       MULADD(at[7], at[17]);       MULADD(at[8], at[16]);
5569       COMBA_STORE(C->dp[8]);
5570       /* 9 */
5571       COMBA_FORWARD;
5572       MULADD(at[0], at[25]);       MULADD(at[1], at[24]);       MULADD(at[2], at[23]);       MULADD(at[3], at[22]);       MULADD(at[4], at[21]);       MULADD(at[5], at[20]);       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]);
5573       COMBA_STORE(C->dp[9]);
5574       /* 10 */
5575       COMBA_FORWARD;
5576       MULADD(at[0], at[26]);       MULADD(at[1], at[25]);       MULADD(at[2], at[24]);       MULADD(at[3], at[23]);       MULADD(at[4], at[22]);       MULADD(at[5], at[21]);       MULADD(at[6], at[20]);       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]);       MULADD(at[10], at[16]);
5577       COMBA_STORE(C->dp[10]);
5578       /* 11 */
5579       COMBA_FORWARD;
5580       MULADD(at[0], at[27]);       MULADD(at[1], at[26]);       MULADD(at[2], at[25]);       MULADD(at[3], at[24]);       MULADD(at[4], at[23]);       MULADD(at[5], at[22]);       MULADD(at[6], at[21]);       MULADD(at[7], at[20]);       MULADD(at[8], at[19]);       MULADD(at[9], at[18]);       MULADD(at[10], at[17]);       MULADD(at[11], at[16]);
5581       COMBA_STORE(C->dp[11]);
5582       /* 12 */
5583       COMBA_FORWARD;
5584       MULADD(at[0], at[28]);       MULADD(at[1], at[27]);       MULADD(at[2], at[26]);       MULADD(at[3], at[25]);       MULADD(at[4], at[24]);       MULADD(at[5], at[23]);       MULADD(at[6], at[22]);       MULADD(at[7], at[21]);       MULADD(at[8], at[20]);       MULADD(at[9], at[19]);       MULADD(at[10], at[18]);       MULADD(at[11], at[17]);       MULADD(at[12], at[16]);
5585       COMBA_STORE(C->dp[12]);
5586       /* 13 */
5587       COMBA_FORWARD;
5588       MULADD(at[0], at[29]);       MULADD(at[1], at[28]);       MULADD(at[2], at[27]);       MULADD(at[3], at[26]);       MULADD(at[4], at[25]);       MULADD(at[5], at[24]);       MULADD(at[6], at[23]);       MULADD(at[7], at[22]);       MULADD(at[8], at[21]);       MULADD(at[9], at[20]);       MULADD(at[10], at[19]);       MULADD(at[11], at[18]);       MULADD(at[12], at[17]);       MULADD(at[13], at[16]);
5589       COMBA_STORE(C->dp[13]);
5590       /* 14 */
5591       COMBA_FORWARD;
5592       MULADD(at[0], at[30]);       MULADD(at[1], at[29]);       MULADD(at[2], at[28]);       MULADD(at[3], at[27]);       MULADD(at[4], at[26]);       MULADD(at[5], at[25]);       MULADD(at[6], at[24]);       MULADD(at[7], at[23]);       MULADD(at[8], at[22]);       MULADD(at[9], at[21]);       MULADD(at[10], at[20]);       MULADD(at[11], at[19]);       MULADD(at[12], at[18]);       MULADD(at[13], at[17]);       MULADD(at[14], at[16]);
5593       COMBA_STORE(C->dp[14]);
5594       /* 15 */
5595       COMBA_FORWARD;
5596       MULADD(at[0], at[31]);       MULADD(at[1], at[30]);       MULADD(at[2], at[29]);       MULADD(at[3], at[28]);       MULADD(at[4], at[27]);       MULADD(at[5], at[26]);       MULADD(at[6], at[25]);       MULADD(at[7], at[24]);       MULADD(at[8], at[23]);       MULADD(at[9], at[22]);       MULADD(at[10], at[21]);       MULADD(at[11], at[20]);       MULADD(at[12], at[19]);       MULADD(at[13], at[18]);       MULADD(at[14], at[17]);       MULADD(at[15], at[16]);
5597       COMBA_STORE(C->dp[15]);
5598       /* 16 */
5599       COMBA_FORWARD;
5600       MULADD(at[1], at[31]);       MULADD(at[2], at[30]);       MULADD(at[3], at[29]);       MULADD(at[4], at[28]);       MULADD(at[5], at[27]);       MULADD(at[6], at[26]);       MULADD(at[7], at[25]);       MULADD(at[8], at[24]);       MULADD(at[9], at[23]);       MULADD(at[10], at[22]);       MULADD(at[11], at[21]);       MULADD(at[12], at[20]);       MULADD(at[13], at[19]);       MULADD(at[14], at[18]);       MULADD(at[15], at[17]);
5601       COMBA_STORE(C->dp[16]);
5602       /* 17 */
5603       COMBA_FORWARD;
5604       MULADD(at[2], at[31]);       MULADD(at[3], at[30]);       MULADD(at[4], at[29]);       MULADD(at[5], at[28]);       MULADD(at[6], at[27]);       MULADD(at[7], at[26]);       MULADD(at[8], at[25]);       MULADD(at[9], at[24]);       MULADD(at[10], at[23]);       MULADD(at[11], at[22]);       MULADD(at[12], at[21]);       MULADD(at[13], at[20]);       MULADD(at[14], at[19]);       MULADD(at[15], at[18]);
5605       COMBA_STORE(C->dp[17]);
5606       /* 18 */
5607       COMBA_FORWARD;
5608       MULADD(at[3], at[31]);       MULADD(at[4], at[30]);       MULADD(at[5], at[29]);       MULADD(at[6], at[28]);       MULADD(at[7], at[27]);       MULADD(at[8], at[26]);       MULADD(at[9], at[25]);       MULADD(at[10], at[24]);       MULADD(at[11], at[23]);       MULADD(at[12], at[22]);       MULADD(at[13], at[21]);       MULADD(at[14], at[20]);       MULADD(at[15], at[19]);
5609       COMBA_STORE(C->dp[18]);
5610       /* 19 */
5611       COMBA_FORWARD;
5612       MULADD(at[4], at[31]);       MULADD(at[5], at[30]);       MULADD(at[6], at[29]);       MULADD(at[7], at[28]);       MULADD(at[8], at[27]);       MULADD(at[9], at[26]);       MULADD(at[10], at[25]);       MULADD(at[11], at[24]);       MULADD(at[12], at[23]);       MULADD(at[13], at[22]);       MULADD(at[14], at[21]);       MULADD(at[15], at[20]);
5613       COMBA_STORE(C->dp[19]);
5614       /* 20 */
5615       COMBA_FORWARD;
5616       MULADD(at[5], at[31]);       MULADD(at[6], at[30]);       MULADD(at[7], at[29]);       MULADD(at[8], at[28]);       MULADD(at[9], at[27]);       MULADD(at[10], at[26]);       MULADD(at[11], at[25]);       MULADD(at[12], at[24]);       MULADD(at[13], at[23]);       MULADD(at[14], at[22]);       MULADD(at[15], at[21]);
5617       COMBA_STORE(C->dp[20]);
5618       /* 21 */
5619       COMBA_FORWARD;
5620       MULADD(at[6], at[31]);       MULADD(at[7], at[30]);       MULADD(at[8], at[29]);       MULADD(at[9], at[28]);       MULADD(at[10], at[27]);       MULADD(at[11], at[26]);       MULADD(at[12], at[25]);       MULADD(at[13], at[24]);       MULADD(at[14], at[23]);       MULADD(at[15], at[22]);
5621       COMBA_STORE(C->dp[21]);
5622       /* 22 */
5623       COMBA_FORWARD;
5624       MULADD(at[7], at[31]);       MULADD(at[8], at[30]);       MULADD(at[9], at[29]);       MULADD(at[10], at[28]);       MULADD(at[11], at[27]);       MULADD(at[12], at[26]);       MULADD(at[13], at[25]);       MULADD(at[14], at[24]);       MULADD(at[15], at[23]);
5625       COMBA_STORE(C->dp[22]);
5626       /* 23 */
5627       COMBA_FORWARD;
5628       MULADD(at[8], at[31]);       MULADD(at[9], at[30]);       MULADD(at[10], at[29]);       MULADD(at[11], at[28]);       MULADD(at[12], at[27]);       MULADD(at[13], at[26]);       MULADD(at[14], at[25]);       MULADD(at[15], at[24]);
5629       COMBA_STORE(C->dp[23]);
5630       /* 24 */
5631       COMBA_FORWARD;
5632       MULADD(at[9], at[31]);       MULADD(at[10], at[30]);       MULADD(at[11], at[29]);       MULADD(at[12], at[28]);       MULADD(at[13], at[27]);       MULADD(at[14], at[26]);       MULADD(at[15], at[25]);
5633       COMBA_STORE(C->dp[24]);
5634       /* 25 */
5635       COMBA_FORWARD;
5636       MULADD(at[10], at[31]);       MULADD(at[11], at[30]);       MULADD(at[12], at[29]);       MULADD(at[13], at[28]);       MULADD(at[14], at[27]);       MULADD(at[15], at[26]);
5637       COMBA_STORE(C->dp[25]);
5638       /* 26 */
5639       COMBA_FORWARD;
5640       MULADD(at[11], at[31]);       MULADD(at[12], at[30]);       MULADD(at[13], at[29]);       MULADD(at[14], at[28]);       MULADD(at[15], at[27]);
5641       COMBA_STORE(C->dp[26]);
5642       /* 27 */
5643       COMBA_FORWARD;
5644       MULADD(at[12], at[31]);       MULADD(at[13], at[30]);       MULADD(at[14], at[29]);       MULADD(at[15], at[28]);
5645       COMBA_STORE(C->dp[27]);
5646       /* 28 */
5647       COMBA_FORWARD;
5648       MULADD(at[13], at[31]);       MULADD(at[14], at[30]);       MULADD(at[15], at[29]);
5649       COMBA_STORE(C->dp[28]);
5650       /* 29 */
5651       COMBA_FORWARD;
5652       MULADD(at[14], at[31]);       MULADD(at[15], at[30]);
5653       COMBA_STORE(C->dp[29]);
5654       /* 30 */
5655       COMBA_FORWARD;
5656       MULADD(at[15], at[31]);
5657       COMBA_STORE(C->dp[30]);
5658       COMBA_STORE2(C->dp[31]);
5659       C->used = 32;
5660       C->sign = A->sign ^ B->sign;
5661       tfm_fp_clamp(C);
5662       COMBA_FINI;
5663       break;
5664    }
5665 }
5666
5667 #endif
5668
5669 /* c = a * b */
5670 int tfm_fp_mul_d(tfm_fp_int *a, tfm_fp_digit b, tfm_fp_int *c)
5671 {
5672    tfm_fp_word  w;
5673    int      x, oldused;
5674
5675    if (c->alloc <= a->used + 1)
5676      if (tfm_fp_grow(c, a->used + 1))
5677        return TFM_FP_MEM;
5678
5679    oldused = c->used;
5680    c->used = a->used;
5681    c->sign = a->sign;
5682    w       = 0;
5683    for (x = 0; x < a->used; x++) {
5684        w         = ((tfm_fp_word)a->dp[x]) * ((tfm_fp_word)b) + w;
5685        c->dp[x]  = (tfm_fp_digit)w;
5686        w         = w >> DIGIT_BIT;
5687    }
5688    if (w != 0) {
5689       c->dp[c->used++] = w;
5690       ++x;
5691    }
5692    for (; x < oldused; x++) {
5693       c->dp[x] = 0;
5694    }
5695    tfm_fp_clamp(c);
5696    return TFM_FP_OKAY;
5697 }
5698
5699 /* d = a * b (mod c) */
5700 int tfm_fp_mulmod(tfm_fp_int *a, tfm_fp_int *b, tfm_fp_int *c, tfm_fp_int *d)
5701 {
5702   tfm_fp_int tmp;
5703   int ret;
5704
5705   tfm_fp_init(&tmp);
5706   if (tfm_fp_mul(a, b, &tmp)) {
5707     tfm_fp_zero(&tmp);
5708     return TFM_FP_MEM;
5709   }
5710   ret = tfm_fp_mod(&tmp, c, d);
5711   tfm_fp_zero(&tmp);
5712
5713   return ret;
5714 }
5715
5716 int tfm_fp_radix_size(tfm_fp_int *a, int radix, int *size)
5717 {
5718   int     digs;
5719   tfm_fp_int  t;
5720   tfm_fp_digit d;
5721
5722   *size = 0;
5723
5724   if (radix == 2) {
5725     *size = tfm_fp_count_bits(a) + (a->sign ? 1 : 0) + 1;
5726     return TFM_FP_OKAY;
5727   }
5728
5729   /* check range of the radix */
5730   if (radix < 2 || radix > 64) {
5731     return TFM_FP_VAL;
5732   }
5733
5734   /* quick out if its zero */
5735   if (tfm_fp_iszero(a) == 1) {
5736      *size = 2;
5737      return TFM_FP_OKAY;
5738   }
5739
5740   if (tfm_fp_init_copy(&t, a, a->stack))
5741     return TFM_FP_MEM;
5742
5743   /* if it is negative output a - */
5744   if (t.sign == TFM_FP_NEG) {
5745     (*size)++;
5746     t.sign = TFM_FP_ZPOS;
5747   }
5748
5749   digs = 0;
5750   while (tfm_fp_iszero (&t) == TFM_FP_NO) {
5751     if (tfm_fp_div_d (&t, (tfm_fp_digit) radix, &t, &d)) {
5752       tfm_fp_zero(&t);
5753       return TFM_FP_MEM;
5754     }
5755     (*size)++;
5756   }
5757
5758   /* append a NULL so the string is properly terminated */
5759   (*size)++;
5760
5761   tfm_fp_zero(&t);
5762
5763   return TFM_FP_OKAY;
5764 }
5765
5766 /* chars used in radix conversions */
5767 const char *tfm_fp_s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
5768
5769 int tfm_fp_read_radix(tfm_fp_int *a, char *str, int radix)
5770 {
5771   int     y, neg;
5772   char    ch;
5773
5774   /* make sure the radix is ok */
5775   if (radix < 2 || radix > 64) {
5776     return TFM_FP_VAL;
5777   }
5778
5779   /* if the leading digit is a
5780    * minus set the sign to negative.
5781    */
5782   if (*str == '-') {
5783     ++str;
5784     neg = TFM_FP_NEG;
5785   } else {
5786     neg = TFM_FP_ZPOS;
5787   }
5788
5789   /* set the integer to the default of zero */
5790   tfm_fp_zeroise(a);
5791
5792   /* process each digit of the string */
5793   while (*str) {
5794     /* if the radix < 36 the conversion is case insensitive
5795      * this allows numbers like 1AB and 1ab to represent the same  value
5796      * [e.g. in hex]
5797      */
5798     ch = (char) ((radix < 36) ? toupper (*str) : *str);
5799     for (y = 0; y < 64; y++) {
5800       if (ch == tfm_fp_s_rmap[y]) {
5801          break;
5802       }
5803     }
5804
5805     /* if the char was found in the map
5806      * and is less than the given radix add it
5807      * to the number, otherwise exit the loop.
5808      */
5809     if (y < radix) {
5810       if (tfm_fp_mul_d (a, (tfm_fp_digit) radix, a))
5811         return TFM_FP_MEM;
5812       if (tfm_fp_add_d (a, (tfm_fp_digit) y, a))
5813         return TFM_FP_MEM;
5814     } else {
5815       break;
5816     }
5817     ++str;
5818   }
5819
5820   /* set the sign only if a != 0 */
5821   if (tfm_fp_iszero(a) != TFM_FP_YES) {
5822      a->sign = neg;
5823   }
5824   return TFM_FP_OKAY;
5825 }
5826
5827 void tfm_fp_read_unsigned_bin(tfm_fp_int *a, unsigned char *b, int c)
5828 {
5829   if (a->alloc < 2)
5830     if (tfm_fp_grow(a, 2))
5831       return;
5832
5833   /* zero the int */
5834   tfm_fp_zeroise(a);
5835
5836   /* If we know the endianness of this architecture, and we're using
5837      32-bit tfm_fp_digits, we can optimize this */
5838 #if (defined(ENDIAN_LITTLE) || defined(ENDIAN_BIG)) && !defined(TFM_FP_64BIT)
5839   /* But not for both simultaneously */
5840 #if defined(ENDIAN_LITTLE) && defined(ENDIAN_BIG)
5841 #error Both ENDIAN_LITTLE and ENDIAN_BIG defined.
5842 #endif
5843   {
5844      unsigned char *pd = (unsigned char *)a->dp;
5845
5846      if ((unsigned)c > (TFM_FP_SIZE * sizeof(tfm_fp_digit))) {
5847         int excess = c - (TFM_FP_SIZE * sizeof(tfm_fp_digit));
5848         c -= excess;
5849         b += excess;
5850      }
5851      a->used = (c + sizeof(tfm_fp_digit) - 1)/sizeof(tfm_fp_digit);
5852      /* read the bytes in */
5853 #ifdef ENDIAN_BIG
5854      {
5855        /* Use Duff's device to unroll the loop. */
5856        int idx = (c - 1) & ~3;
5857        switch (c % 4) {
5858        case 0:  do { pd[idx+0] = *b++;
5859        case 3:       pd[idx+1] = *b++;
5860        case 2:       pd[idx+2] = *b++;
5861        case 1:       pd[idx+3] = *b++;
5862                      idx -= 4;
5863                         } while ((c -= 4) > 0);
5864        }
5865      }
5866 #else
5867      for (c -= 1; c >= 0; c -= 1) {
5868        pd[c] = *b++;
5869      }
5870 #endif
5871   }
5872 #else
5873   /* read the bytes in */
5874   for (; c > 0; c--) {
5875      tfm_fp_mul_2d (a, 8, a);
5876      a->dp[0] |= *b++;
5877      a->used += 1;
5878   }
5879 #endif
5880   tfm_fp_clamp (a);
5881 }
5882
5883 /* reverse an array, used for radix code */
5884 void tfm_fp_reverse (unsigned char *s, int len)
5885 {
5886   int     ix, iy;
5887   unsigned char t;
5888
5889   ix = 0;
5890   iy = len - 1;
5891   while (ix < iy) {
5892     t     = s[ix];
5893     s[ix] = s[iy];
5894     s[iy] = t;
5895     ++ix;
5896     --iy;
5897   }
5898 }
5899
5900 void tfm_fp_rshd(tfm_fp_int *a, int x)
5901 {
5902   int y;
5903
5904   /* too many digits just zero and return */
5905   if (x >= a->used) {
5906      tfm_fp_zero(a);
5907      return;
5908   }
5909
5910    /* shift */
5911    for (y = 0; y < a->used - x; y++) {
5912       a->dp[y] = a->dp[y+x];
5913    }
5914
5915    /* zero rest */
5916    for (; y < a->used; y++) {
5917       a->dp[y] = 0;
5918    }
5919
5920    /* decrement count */
5921    a->used -= x;
5922    tfm_fp_clamp(a);
5923 }
5924
5925 int tfm_fp_set(tfm_fp_int *a, tfm_fp_digit b)
5926 {
5927    if (a->used)
5928      memset(a->dp, 0, a->used * sizeof(*a->dp));
5929    if (tfm_fp_grow(a, 1))
5930      return TFM_FP_MEM;
5931    a->dp[0] = b;
5932    a->used  = b ? 1 : 0;
5933    return TFM_FP_OKAY;
5934 }
5935
5936 int tfm_fp_signed_bin_size(tfm_fp_int *a)
5937 {
5938   return 1 + tfm_fp_unsigned_bin_size (a);
5939 }
5940
5941 /* b = a*a  */
5942 int tfm_fp_sqr(tfm_fp_int *A, tfm_fp_int *B)
5943 {
5944     int     y;
5945
5946     y = A->used;
5947 #if defined(TFM_SMALL_SET)
5948         if (y <= 16) {
5949           if (B->alloc < 32 + 1)
5950             if (tfm_fp_grow(B, 32 + 1))
5951               return TFM_FP_MEM;
5952
5953            tfm_fp_sqr_comba_small(A,B);
5954            return TFM_FP_OKAY;
5955         }
5956 #endif
5957 #if defined(TFM_SQR20)
5958         if (y <= 20) {
5959           if (B->alloc < 40 + 1)
5960             if (tfm_fp_grow(B, 40 + 1))
5961               return TFM_FP_MEM;
5962
5963            tfm_fp_sqr_comba20(A,B);
5964            return TFM_FP_OKAY;
5965         }
5966 #endif
5967 #if defined(TFM_SQR24)
5968         if (y <= 24) {
5969           if (B->alloc < 48 + 1)
5970             if (tfm_fp_grow(B, 48 + 1))
5971               return TFM_FP_MEM;
5972
5973            tfm_fp_sqr_comba24(A,B);
5974            return TFM_FP_OKAY;
5975         }
5976 #endif
5977 #if defined(TFM_SQR28)
5978         if (y <= 28) {
5979           if (B->alloc < 56 + 1)
5980             if (tfm_fp_grow(B, 56 + 1))
5981               return TFM_FP_MEM;
5982
5983            tfm_fp_sqr_comba28(A,B);
5984            return TFM_FP_OKAY;
5985         }
5986 #endif
5987 #if defined(TFM_SQR32)
5988         if (y <= 32) {
5989           if (B->alloc < 64 + 1)
5990             if (tfm_fp_grow(B, 64 + 1))
5991               return TFM_FP_MEM;
5992
5993            tfm_fp_sqr_comba32(A,B);
5994            return TFM_FP_OKAY;
5995         }
5996 #endif
5997 #if defined(TFM_SQR48)
5998         if (y <= 48) {
5999           if (B->alloc < 96 + 1)
6000             if (tfm_fp_grow(B, 96 + 1))
6001               return TFM_FP_MEM;
6002
6003            tfm_fp_sqr_comba48(A,B);
6004            return TFM_FP_OKAY;
6005         }
6006 #endif
6007 #if defined(TFM_SQR64)
6008         if (y <= 64) {
6009           if (B->alloc < 128 + 1)
6010             if (tfm_fp_grow(B, 128 + 1))
6011               return TFM_FP_MEM;
6012
6013            tfm_fp_sqr_comba64(A,B);
6014            return TFM_FP_OKAY;
6015         }
6016 #endif
6017
6018         if (B->alloc < A->used + A->used + 1)
6019           if (tfm_fp_grow(B, A->used + A->used + 1))
6020             return TFM_FP_MEM;
6021
6022         return tfm_fp_sqr_comba(A, B);
6023 }
6024
6025 #if defined(TFM_PRESCOTT) && defined(TFM_SSE2)
6026    #undef TFM_SSE2
6027    #define TFM_X86
6028 #endif
6029
6030 #if defined(TFM_X86)
6031
6032 /* x86-32 optimized */
6033
6034 #define COMBA_START
6035
6036 #define CLEAR_CARRY \
6037    c0 = c1 = c2 = 0;
6038
6039 #define COMBA_STORE(x) \
6040    x = c0;
6041
6042 #define COMBA_STORE2(x) \
6043    x = c1;
6044
6045 #define CARRY_FORWARD \
6046    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
6047
6048 #define COMBA_FINI
6049
6050 #define SQRADD(i, j)                                      \
6051 asm(                                            \
6052      "movl  %6,%%eax     \n\t"                            \
6053      "mull  %%eax        \n\t"                            \
6054      "addl  %%eax,%0     \n\t"                            \
6055      "adcl  %%edx,%1     \n\t"                            \
6056      "adcl  $0,%2        \n\t"                            \
6057      :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i) :"%eax","%edx","%cc");
6058
6059 #define SQRADD2(i, j)                                     \
6060 asm(                                            \
6061      "movl  %6,%%eax     \n\t"                            \
6062      "mull  %7           \n\t"                            \
6063      "addl  %%eax,%0     \n\t"                            \
6064      "adcl  %%edx,%1     \n\t"                            \
6065      "adcl  $0,%2        \n\t"                            \
6066      "addl  %%eax,%0     \n\t"                            \
6067      "adcl  %%edx,%1     \n\t"                            \
6068      "adcl  $0,%2        \n\t"                            \
6069      :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j)  :"%eax","%edx","%cc");
6070
6071 #define SQRADDSC(i, j)                                    \
6072 asm(                                                     \
6073      "movl  %6,%%eax     \n\t"                            \
6074      "mull  %7           \n\t"                            \
6075      "movl  %%eax,%0     \n\t"                            \
6076      "movl  %%edx,%1     \n\t"                            \
6077      "xorl  %2,%2        \n\t"                            \
6078      :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%eax","%edx","%cc");
6079
6080 #define SQRADDAC(i, j)                                    \
6081 asm(                                                     \
6082      "movl  %6,%%eax     \n\t"                            \
6083      "mull  %7           \n\t"                            \
6084      "addl  %%eax,%0     \n\t"                            \
6085      "adcl  %%edx,%1     \n\t"                            \
6086      "adcl  $0,%2        \n\t"                            \
6087      :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%eax","%edx","%cc");
6088
6089 #define SQRADDDB                                          \
6090 asm(                                                     \
6091      "addl %6,%0         \n\t"                            \
6092      "adcl %7,%1         \n\t"                            \
6093      "adcl %8,%2         \n\t"                            \
6094      "addl %6,%0         \n\t"                            \
6095      "adcl %7,%1         \n\t"                            \
6096      "adcl %8,%2         \n\t"                            \
6097      :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(sc0), "r"(sc1), "r"(sc2) : "%cc");
6098
6099 #elif defined(TFM_X86_64)
6100 /* x86-64 optimized */
6101
6102 #define COMBA_START
6103
6104 #define CLEAR_CARRY \
6105    c0 = c1 = c2 = 0;
6106
6107 #define COMBA_STORE(x) \
6108    x = c0;
6109
6110 #define COMBA_STORE2(x) \
6111    x = c1;
6112
6113 #define CARRY_FORWARD \
6114    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
6115
6116 #define COMBA_FINI
6117
6118 #define SQRADD(i, j)                                      \
6119 asm(                                                     \
6120      "movq  %6,%%rax     \n\t"                            \
6121      "mulq  %%rax        \n\t"                            \
6122      "addq  %%rax,%0     \n\t"                            \
6123      "adcq  %%rdx,%1     \n\t"                            \
6124      "adcq  $0,%2        \n\t"                            \
6125      :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i) :"%rax","%rdx","%cc");
6126
6127 #define SQRADD2(i, j)                                     \
6128 asm(                                                     \
6129      "movq  %6,%%rax     \n\t"                            \
6130      "mulq  %7           \n\t"                            \
6131      "addq  %%rax,%0     \n\t"                            \
6132      "adcq  %%rdx,%1     \n\t"                            \
6133      "adcq  $0,%2        \n\t"                            \
6134      "addq  %%rax,%0     \n\t"                            \
6135      "adcq  %%rdx,%1     \n\t"                            \
6136      "adcq  $0,%2        \n\t"                            \
6137      :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j)  :"%rax","%rdx","%cc");
6138
6139 #define SQRADDSC(i, j)                                    \
6140 asm(                                                     \
6141      "movq  %3,%%rax     \n\t"                            \
6142      "mulq  %4           \n\t"                            \
6143      "movq  %%rax,%0     \n\t"                            \
6144      "movq  %%rdx,%1     \n\t"                            \
6145      "xorq  %2,%2        \n\t"                            \
6146      :"=r"(sc0), "=r"(sc1), "=r"(sc2): "g"(i), "g"(j) :"%rax","%rdx","%cc");
6147
6148 #define SQRADDAC(i, j)                                                         \
6149 asm(                                                     \
6150      "movq  %6,%%rax     \n\t"                            \
6151      "mulq  %7           \n\t"                            \
6152      "addq  %%rax,%0     \n\t"                            \
6153      "adcq  %%rdx,%1     \n\t"                            \
6154      "adcq  $0,%2        \n\t"                            \
6155      :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%rax","%rdx","%cc");
6156
6157 #define SQRADDDB                                          \
6158 asm(                                                     \
6159      "addq %6,%0         \n\t"                            \
6160      "adcq %7,%1         \n\t"                            \
6161      "adcq %8,%2         \n\t"                            \
6162      "addq %6,%0         \n\t"                            \
6163      "adcq %7,%1         \n\t"                            \
6164      "adcq %8,%2         \n\t"                            \
6165      :"=&r"(c0), "=&r"(c1), "=&r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(sc0), "r"(sc1), "r"(sc2) : "%cc");
6166
6167 #elif defined(TFM_SSE2)
6168
6169 /* SSE2 Optimized */
6170 #define COMBA_START
6171
6172 #define CLEAR_CARRY \
6173    c0 = c1 = c2 = 0;
6174
6175 #define COMBA_STORE(x) \
6176    x = c0;
6177
6178 #define COMBA_STORE2(x) \
6179    x = c1;
6180
6181 #define CARRY_FORWARD \
6182    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
6183
6184 #define COMBA_FINI \
6185    asm("emms");
6186
6187 #define SQRADD(i, j)                                      \
6188 asm(                                            \
6189      "movd  %6,%%mm0     \n\t"                            \
6190      "pmuludq %%mm0,%%mm0\n\t"                            \
6191      "movd  %%mm0,%%eax  \n\t"                            \
6192      "psrlq $32,%%mm0    \n\t"                            \
6193      "addl  %%eax,%0     \n\t"                            \
6194      "movd  %%mm0,%%eax  \n\t"                            \
6195      "adcl  %%eax,%1     \n\t"                            \
6196      "adcl  $0,%2        \n\t"                            \
6197      :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i) :"%eax","%cc");
6198
6199 #define SQRADD2(i, j)                                     \
6200 asm(                                            \
6201      "movd  %6,%%mm0     \n\t"                            \
6202      "movd  %7,%%mm1     \n\t"                            \
6203      "pmuludq %%mm1,%%mm0\n\t"                            \
6204      "movd  %%mm0,%%eax  \n\t"                            \
6205      "psrlq $32,%%mm0    \n\t"                            \
6206      "movd  %%mm0,%%edx  \n\t"                            \
6207      "addl  %%eax,%0     \n\t"                            \
6208      "adcl  %%edx,%1     \n\t"                            \
6209      "adcl  $0,%2        \n\t"                            \
6210      "addl  %%eax,%0     \n\t"                            \
6211      "adcl  %%edx,%1     \n\t"                            \
6212      "adcl  $0,%2        \n\t"                            \
6213      :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j)  :"%eax","%edx","%cc");
6214
6215 #define SQRADDSC(i, j)                                                         \
6216 asm(                                            \
6217      "movd  %6,%%mm0     \n\t"                            \
6218      "movd  %7,%%mm1     \n\t"                            \
6219      "pmuludq %%mm1,%%mm0\n\t"                            \
6220      "movd  %%mm0,%0     \n\t"                            \
6221      "psrlq $32,%%mm0    \n\t"                            \
6222      "movd  %%mm0,%1     \n\t"                            \
6223      "xorl  %2,%2        \n\t"                            \
6224      :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "m"(i), "m"(j));
6225
6226 #define SQRADDAC(i, j)                                                         \
6227 asm(                                            \
6228      "movd  %6,%%mm0     \n\t"                            \
6229      "movd  %7,%%mm1     \n\t"                            \
6230      "pmuludq %%mm1,%%mm0\n\t"                            \
6231      "movd  %%mm0,%%eax  \n\t"                            \
6232      "psrlq $32,%%mm0    \n\t"                            \
6233      "movd  %%mm0,%%edx  \n\t"                            \
6234      "addl  %%eax,%0     \n\t"                            \
6235      "adcl  %%edx,%1     \n\t"                            \
6236      "adcl  $0,%2        \n\t"                            \
6237      :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "m"(i), "m"(j)  :"%eax","%edx","%cc");
6238
6239 #define SQRADDDB                                          \
6240 asm(                                                     \
6241      "addl %6,%0         \n\t"                            \
6242      "adcl %7,%1         \n\t"                            \
6243      "adcl %8,%2         \n\t"                            \
6244      "addl %6,%0         \n\t"                            \
6245      "adcl %7,%1         \n\t"                            \
6246      "adcl %8,%2         \n\t"                            \
6247      :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(sc0), "r"(sc1), "r"(sc2) : "%cc");
6248
6249 #elif defined(TFM_ARM)
6250
6251 /* ARM code */
6252
6253 #define COMBA_START
6254
6255 #define CLEAR_CARRY \
6256    c0 = c1 = c2 = 0;
6257
6258 #define COMBA_STORE(x) \
6259    x = c0;
6260
6261 #define COMBA_STORE2(x) \
6262    x = c1;
6263
6264 #define CARRY_FORWARD \
6265    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
6266
6267 #define COMBA_FINI
6268
6269 /* multiplies point i and j, updates carry "c1" and digit c2 */
6270 #define SQRADD(i, j)                                             \
6271 asm(                                                             \
6272 "  UMULL  r0,r1,%6,%6              \n\t"                         \
6273 "  ADDS   %0,%0,r0                 \n\t"                         \
6274 "  ADCS   %1,%1,r1                 \n\t"                         \
6275 "  ADC    %2,%2,#0                 \n\t"                         \
6276 :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(i) : "r0", "r1", "%cc");
6277
6278 /* for squaring some of the terms are doubled... */
6279 #define SQRADD2(i, j)                                            \
6280 asm(                                                             \
6281 "  UMULL  r0,r1,%6,%7              \n\t"                         \
6282 "  ADDS   %0,%0,r0                 \n\t"                         \
6283 "  ADCS   %1,%1,r1                 \n\t"                         \
6284 "  ADC    %2,%2,#0                 \n\t"                         \
6285 "  ADDS   %0,%0,r0                 \n\t"                         \
6286 "  ADCS   %1,%1,r1                 \n\t"                         \
6287 "  ADC    %2,%2,#0                 \n\t"                         \
6288 :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j) : "r0", "r1", "%cc");
6289
6290 #define SQRADDSC(i, j)                                           \
6291 asm(                                                             \
6292 "  UMULL  %0,%1,%6,%7              \n\t"                         \
6293 "  SUB    %2,%2,%2                 \n\t"                         \
6294 :"=r"(sc0), "=r"(sc1), "=r"(sc2) : "0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j) : "%cc");
6295
6296 #define SQRADDAC(i, j)                                           \
6297 asm(                                                             \
6298 "  UMULL  r0,r1,%6,%7              \n\t"                         \
6299 "  ADDS   %0,%0,r0                 \n\t"                         \
6300 "  ADCS   %1,%1,r1                 \n\t"                         \
6301 "  ADC    %2,%2,#0                 \n\t"                         \
6302 :"=r"(sc0), "=r"(sc1), "=r"(sc2) : "0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j) : "r0", "r1", "%cc");
6303
6304 #define SQRADDDB                                                 \
6305 asm(                                                             \
6306 "  ADDS  %0,%0,%3                     \n\t"                      \
6307 "  ADCS  %1,%1,%4                     \n\t"                      \
6308 "  ADC   %2,%2,%5                     \n\t"                      \
6309 "  ADDS  %0,%0,%3                     \n\t"                      \
6310 "  ADCS  %1,%1,%4                     \n\t"                      \
6311 "  ADC   %2,%2,%5                     \n\t"                      \
6312 :"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "%cc");
6313
6314 #elif defined(TFM_PPC32)
6315
6316 /* PPC32 */
6317
6318 #define COMBA_START
6319
6320 #define CLEAR_CARRY \
6321    c0 = c1 = c2 = 0;
6322
6323 #define COMBA_STORE(x) \
6324    x = c0;
6325
6326 #define COMBA_STORE2(x) \
6327    x = c1;
6328
6329 #define CARRY_FORWARD \
6330    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
6331
6332 #define COMBA_FINI
6333
6334 /* multiplies point i and j, updates carry "c1" and digit c2 */
6335 #define SQRADD(i, j)             \
6336 asm(                             \
6337    " mullw  16,%6,%6       \n\t" \
6338    " addc   %0,%0,16       \n\t" \
6339    " mulhwu 16,%6,%6       \n\t" \
6340    " adde   %1,%1,16       \n\t" \
6341    " addze  %2,%2          \n\t" \
6342 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"16","%cc");
6343
6344 /* for squaring some of the terms are doubled... */
6345 #define SQRADD2(i, j)            \
6346 asm(                             \
6347    " mullw  16,%6,%7       \n\t" \
6348    " mulhwu 17,%6,%7       \n\t" \
6349    " addc   %0,%0,16       \n\t" \
6350    " adde   %1,%1,17       \n\t" \
6351    " addze  %2,%2          \n\t" \
6352    " addc   %0,%0,16       \n\t" \
6353    " adde   %1,%1,17       \n\t" \
6354    " addze  %2,%2          \n\t" \
6355 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16", "17","%cc");
6356
6357 #define SQRADDSC(i, j)            \
6358 asm(                              \
6359    " mullw  %0,%6,%7        \n\t" \
6360    " mulhwu %1,%6,%7        \n\t" \
6361    " xor    %2,%2,%2        \n\t" \
6362 :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i),"r"(j) : "%cc");
6363
6364 #define SQRADDAC(i, j)           \
6365 asm(                             \
6366    " mullw  16,%6,%7       \n\t" \
6367    " addc   %0,%0,16       \n\t" \
6368    " mulhwu 16,%6,%7       \n\t" \
6369    " adde   %1,%1,16       \n\t" \
6370    " addze  %2,%2          \n\t" \
6371 :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"16", "%cc");
6372
6373 #define SQRADDDB                  \
6374 asm(                              \
6375    " addc   %0,%0,%3        \n\t" \
6376    " adde   %1,%1,%4        \n\t" \
6377    " adde   %2,%2,%5        \n\t" \
6378    " addc   %0,%0,%3        \n\t" \
6379    " adde   %1,%1,%4        \n\t" \
6380    " adde   %2,%2,%5        \n\t" \
6381 :"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "%cc");
6382
6383 #elif defined(TFM_PPC64)
6384 /* PPC64 */
6385
6386 #define COMBA_START
6387
6388 #define CLEAR_CARRY \
6389    c0 = c1 = c2 = 0;
6390
6391 #define COMBA_STORE(x) \
6392    x = c0;
6393
6394 #define COMBA_STORE2(x) \
6395    x = c1;
6396
6397 #define CARRY_FORWARD \
6398    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
6399
6400 #define COMBA_FINI
6401
6402 /* multiplies point i and j, updates carry "c1" and digit c2 */
6403 #define SQRADD(i, j)             \
6404 asm(                             \
6405    " mulld  r16,%6,%6       \n\t" \
6406    " addc   %0,%0,r16       \n\t" \
6407    " mulhdu r16,%6,%6       \n\t" \
6408    " adde   %1,%1,r16       \n\t" \
6409    " addze  %2,%2          \n\t" \
6410 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"r16","%cc");
6411
6412 /* for squaring some of the terms are doubled... */
6413 #define SQRADD2(i, j)            \
6414 asm(                             \
6415    " mulld  r16,%6,%7       \n\t" \
6416    " mulhdu r17,%6,%7       \n\t" \
6417    " addc   %0,%0,r16       \n\t" \
6418    " adde   %1,%1,r17       \n\t" \
6419    " addze  %2,%2          \n\t" \
6420    " addc   %0,%0,r16       \n\t" \
6421    " adde   %1,%1,r17       \n\t" \
6422    " addze  %2,%2          \n\t" \
6423 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r16", "r17","%cc");
6424
6425 #define SQRADDSC(i, j)            \
6426 asm(                              \
6427    " mulld  %0,%6,%7        \n\t" \
6428    " mulhdu %1,%6,%7        \n\t" \
6429    " xor    %2,%2,%2        \n\t" \
6430 :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i),"r"(j) : "%cc");
6431
6432 #define SQRADDAC(i, j)           \
6433 asm(                             \
6434    " mulld  r16,%6,%7       \n\t" \
6435    " addc   %0,%0,r16       \n\t" \
6436    " mulhdu r16,%6,%7       \n\t" \
6437    " adde   %1,%1,r16       \n\t" \
6438    " addze  %2,%2          \n\t" \
6439 :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"r16", "%cc");
6440
6441 #define SQRADDDB                  \
6442 asm(                              \
6443    " addc   %0,%0,%3        \n\t" \
6444    " adde   %1,%1,%4        \n\t" \
6445    " adde   %2,%2,%5        \n\t" \
6446    " addc   %0,%0,%3        \n\t" \
6447    " adde   %1,%1,%4        \n\t" \
6448    " adde   %2,%2,%5        \n\t" \
6449 :"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "%cc");
6450
6451
6452 #elif defined(TFM_AVR32)
6453
6454 /* AVR32 */
6455
6456 #define COMBA_START
6457
6458 #define CLEAR_CARRY \
6459    c0 = c1 = c2 = 0;
6460
6461 #define COMBA_STORE(x) \
6462    x = c0;
6463
6464 #define COMBA_STORE2(x) \
6465    x = c1;
6466
6467 #define CARRY_FORWARD \
6468    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
6469
6470 #define COMBA_FINI
6471
6472 /* multiplies point i and j, updates carry "c1" and digit c2 */
6473 #define SQRADD(i, j)             \
6474 asm(                             \
6475    " mulu.d r2,%6,%6       \n\t" \
6476    " add    %0,%0,r2       \n\t" \
6477    " adc    %1,%1,r3       \n\t" \
6478    " acr    %2             \n\t" \
6479 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"r2","r3");
6480
6481 /* for squaring some of the terms are doubled... */
6482 #define SQRADD2(i, j)            \
6483 asm(                             \
6484    " mulu.d r2,%6,%7       \n\t" \
6485    " add    %0,%0,r2       \n\t" \
6486    " adc    %1,%1,r3       \n\t" \
6487    " acr    %2,            \n\t" \
6488    " add    %0,%0,r2       \n\t" \
6489    " adc    %1,%1,r3       \n\t" \
6490    " acr    %2,            \n\t" \
6491 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r2", "r3");
6492
6493 #define SQRADDSC(i, j)            \
6494 asm(                              \
6495    " mulu.d r2,%6,%7        \n\t" \
6496    " mov    %0,r2           \n\t" \
6497    " mov    %1,r3           \n\t" \
6498    " eor    %2,%2           \n\t" \
6499 :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i),"r"(j) : "r2", "r3");
6500
6501 #define SQRADDAC(i, j)           \
6502 asm(                             \
6503    " mulu.d r2,%6,%7       \n\t" \
6504    " add    %0,%0,r2       \n\t" \
6505    " adc    %1,%1,r3       \n\t" \
6506    " acr    %2             \n\t" \
6507 :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"r2", "r3");
6508
6509 #define SQRADDDB                  \
6510 asm(                              \
6511    " add    %0,%0,%3        \n\t" \
6512    " adc    %1,%1,%4        \n\t" \
6513    " adc    %2,%2,%5        \n\t" \
6514    " add    %0,%0,%3        \n\t" \
6515    " adc    %1,%1,%4        \n\t" \
6516    " adc    %2,%2,%5        \n\t" \
6517 :"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "%cc");
6518
6519 #elif defined(TFM_MIPS)
6520
6521 /* MIPS */
6522
6523 #define COMBA_START
6524
6525 #define CLEAR_CARRY \
6526    c0 = c1 = c2 = 0;
6527
6528 #define COMBA_STORE(x) \
6529    x = c0;
6530
6531 #define COMBA_STORE2(x) \
6532    x = c1;
6533
6534 #define CARRY_FORWARD \
6535    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
6536
6537 #define COMBA_FINI
6538
6539 /* multiplies point i and j, updates carry "c1" and digit c2 */
6540 #define SQRADD(i, j)              \
6541 asm(                              \
6542    " multu  %6,%6          \n\t"  \
6543    " mflo   $12            \n\t"  \
6544    " mfhi   $13            \n\t"  \
6545    " addu    %0,%0,$12     \n\t"  \
6546    " sltu   $12,%0,$12     \n\t"  \
6547    " addu    %1,%1,$13     \n\t"  \
6548    " sltu   $13,%1,$13     \n\t"  \
6549    " addu    %1,%1,$12     \n\t"  \
6550    " sltu   $12,%1,$12     \n\t"  \
6551    " addu    %2,%2,$13     \n\t"  \
6552    " addu    %2,%2,$12     \n\t"  \
6553 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"$12","$13");
6554
6555 /* for squaring some of the terms are doubled... */
6556 #define SQRADD2(i, j)            \
6557 asm(                             \
6558    " multu  %6,%7          \n\t" \
6559    " mflo   $12            \n\t" \
6560    " mfhi   $13            \n\t" \
6561                                  \
6562    " addu    %0,%0,$12     \n\t" \
6563    " sltu   $14,%0,$12     \n\t" \
6564    " addu    %1,%1,$13     \n\t" \
6565    " sltu   $15,%1,$13     \n\t" \
6566    " addu    %1,%1,$14     \n\t" \
6567    " sltu   $14,%1,$14     \n\t" \
6568    " addu    %2,%2,$15     \n\t" \
6569    " addu    %2,%2,$14     \n\t" \
6570                                  \
6571    " addu    %0,%0,$12     \n\t" \
6572    " sltu   $14,%0,$12     \n\t" \
6573    " addu    %1,%1,$13     \n\t" \
6574    " sltu   $15,%1,$13     \n\t" \
6575    " addu    %1,%1,$14     \n\t" \
6576    " sltu   $14,%1,$14     \n\t" \
6577    " addu    %2,%2,$15     \n\t" \
6578    " addu    %2,%2,$14     \n\t" \
6579 :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"$12", "$13", "$14", "$15");
6580
6581 #define SQRADDSC(i, j)            \
6582 asm(                              \
6583    " multu  %6,%7          \n\t"  \
6584    " mflo   %0             \n\t"  \
6585    " mfhi   %1             \n\t"  \
6586    " xor    %2,%2,%2       \n\t"  \
6587 :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i),"r"(j) : "%cc");
6588
6589 #define SQRADDAC(i, j)           \
6590 asm(                             \
6591    " multu  %6,%7          \n\t" \
6592    " mflo   $12            \n\t" \
6593    " mfhi   $13            \n\t" \
6594    " addu    %0,%0,$12     \n\t" \
6595    " sltu   $12,%0,$12     \n\t" \
6596    " addu    %1,%1,$13     \n\t" \
6597    " sltu   $13,%1,$13     \n\t" \
6598    " addu    %1,%1,$12     \n\t" \
6599    " sltu   $12,%1,$12     \n\t" \
6600    " addu    %2,%2,$13     \n\t" \
6601    " addu    %2,%2,$12     \n\t" \
6602 :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"$12", "$13", "$14");
6603
6604 #define SQRADDDB                  \
6605 asm(                              \
6606    " addu    %0,%0,%3       \n\t" \
6607    " sltu   $10,%0,%3       \n\t" \
6608    " addu    %1,%1,$10      \n\t" \
6609    " sltu   $10,%1,$10      \n\t" \
6610    " addu    %1,%1,%4       \n\t" \
6611    " sltu   $11,%1,%4       \n\t" \
6612    " addu    %2,%2,$10      \n\t" \
6613    " addu    %2,%2,$11      \n\t" \
6614    " addu    %2,%2,%5       \n\t" \
6615                                   \
6616    " addu    %0,%0,%3       \n\t" \
6617    " sltu   $10,%0,%3       \n\t" \
6618    " addu    %1,%1,$10      \n\t" \
6619    " sltu   $10,%1,$10      \n\t" \
6620    " addu    %1,%1,%4       \n\t" \
6621    " sltu   $11,%1,%4       \n\t" \
6622    " addu    %2,%2,$10      \n\t" \
6623    " addu    %2,%2,$11      \n\t" \
6624    " addu    %2,%2,%5       \n\t" \
6625 :"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "$10", "$11");
6626
6627 #else
6628
6629 #define TFM_ISO
6630
6631 /* ISO C portable code */
6632
6633 #define COMBA_START
6634
6635 #define CLEAR_CARRY \
6636    c0 = c1 = c2 = 0;
6637
6638 #define COMBA_STORE(x) \
6639    x = c0;
6640
6641 #define COMBA_STORE2(x) \
6642    x = c1;
6643
6644 #define CARRY_FORWARD \
6645    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
6646
6647 #define COMBA_FINI
6648
6649 /* multiplies point i and j, updates carry "c1" and digit c2 */
6650 #define SQRADD(i, j)                                 \
6651    do { tfm_fp_word t;                                   \
6652    t = c0 + ((tfm_fp_word)i) * ((tfm_fp_word)j);  c0 = t;    \
6653    t = c1 + (t >> DIGIT_BIT);             c1 = t; c2 += t >> DIGIT_BIT; \
6654    } while (0);
6655
6656
6657 /* for squaring some of the terms are doubled... */
6658 #define SQRADD2(i, j)                                                 \
6659    do { tfm_fp_word t;                                                    \
6660    t  = ((tfm_fp_word)i) * ((tfm_fp_word)j);                                  \
6661    tt = (tfm_fp_word)c0 + t;                 c0 = tt;                              \
6662    tt = (tfm_fp_word)c1 + (tt >> DIGIT_BIT); c1 = tt; c2 += tt >> DIGIT_BIT;       \
6663    tt = (tfm_fp_word)c0 + t;                 c0 = tt;                              \
6664    tt = (tfm_fp_word)c1 + (tt >> DIGIT_BIT); c1 = tt; c2 += tt >> DIGIT_BIT;       \
6665    } while (0);
6666
6667 #define SQRADDSC(i, j)                                                         \
6668    do { tfm_fp_word t;                                                             \
6669       t =  ((tfm_fp_word)i) * ((tfm_fp_word)j);                                        \
6670       sc0 = (tfm_fp_digit)t; sc1 = (t >> DIGIT_BIT); sc2 = 0;                      \
6671    } while (0);
6672
6673 #define SQRADDAC(i, j)                                                         \
6674    do { tfm_fp_word t;                                                             \
6675    t = sc0 + ((tfm_fp_word)i) * ((tfm_fp_word)j);  sc0 = t;                            \
6676    t = sc1 + (t >> DIGIT_BIT);             sc1 = t; sc2 += t >> DIGIT_BIT;     \
6677    } while (0);
6678
6679 #define SQRADDDB                                                               \
6680    do { tfm_fp_word t;                                                             \
6681    t = ((tfm_fp_word)sc0) + ((tfm_fp_word)sc0) + c0; c0 = t;                                                 \
6682    t = ((tfm_fp_word)sc1) + ((tfm_fp_word)sc1) + c1 + (t >> DIGIT_BIT); c1 = t;                              \
6683    c2 = c2 + ((tfm_fp_word)sc2) + ((tfm_fp_word)sc2) + (t >> DIGIT_BIT);                                     \
6684    } while (0);
6685
6686 #endif
6687
6688 #define TFM_DEFINES
6689
6690 #ifdef TFM_SQR20
6691 void tfm_fp_sqr_comba20(tfm_fp_int *A, tfm_fp_int *B)
6692 {
6693    tfm_fp_digit *a, b[40], c0, c1, c2, sc0, sc1, sc2;
6694 #ifdef TFM_ISO
6695    tfm_fp_word tt;
6696 #endif
6697
6698    SILC_LOG_DEBUG(("Start"));
6699    a = A->dp;
6700    COMBA_START;
6701
6702    /* clear carries */
6703    CLEAR_CARRY;
6704
6705    /* output 0 */
6706    SQRADD(a[0],a[0]);
6707    COMBA_STORE(b[0]);
6708
6709    /* output 1 */
6710    CARRY_FORWARD;
6711    SQRADD2(a[0], a[1]);
6712    COMBA_STORE(b[1]);
6713
6714    /* output 2 */
6715    CARRY_FORWARD;
6716    SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]);
6717    COMBA_STORE(b[2]);
6718
6719    /* output 3 */
6720    CARRY_FORWARD;
6721    SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]);
6722    COMBA_STORE(b[3]);
6723
6724    /* output 4 */
6725    CARRY_FORWARD;
6726    SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]);
6727    COMBA_STORE(b[4]);
6728
6729    /* output 5 */
6730    CARRY_FORWARD;
6731    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
6732    COMBA_STORE(b[5]);
6733
6734    /* output 6 */
6735    CARRY_FORWARD;
6736    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
6737    COMBA_STORE(b[6]);
6738
6739    /* output 7 */
6740    CARRY_FORWARD;
6741    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
6742    COMBA_STORE(b[7]);
6743
6744    /* output 8 */
6745    CARRY_FORWARD;
6746    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
6747    COMBA_STORE(b[8]);
6748
6749    /* output 9 */
6750    CARRY_FORWARD;
6751    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
6752    COMBA_STORE(b[9]);
6753
6754    /* output 10 */
6755    CARRY_FORWARD;
6756    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]);
6757    COMBA_STORE(b[10]);
6758
6759    /* output 11 */
6760    CARRY_FORWARD;
6761    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB;
6762    COMBA_STORE(b[11]);
6763
6764    /* output 12 */
6765    CARRY_FORWARD;
6766    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]);
6767    COMBA_STORE(b[12]);
6768
6769    /* output 13 */
6770    CARRY_FORWARD;
6771    SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB;
6772    COMBA_STORE(b[13]);
6773
6774    /* output 14 */
6775    CARRY_FORWARD;
6776    SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]);
6777    COMBA_STORE(b[14]);
6778
6779    /* output 15 */
6780    CARRY_FORWARD;
6781    SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB;
6782    COMBA_STORE(b[15]);
6783
6784    /* output 16 */
6785    CARRY_FORWARD;
6786    SQRADDSC(a[0], a[16]); SQRADDAC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]);
6787    COMBA_STORE(b[16]);
6788
6789    /* output 17 */
6790    CARRY_FORWARD;
6791    SQRADDSC(a[0], a[17]); SQRADDAC(a[1], a[16]); SQRADDAC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB;
6792    COMBA_STORE(b[17]);
6793
6794    /* output 18 */
6795    CARRY_FORWARD;
6796    SQRADDSC(a[0], a[18]); SQRADDAC(a[1], a[17]); SQRADDAC(a[2], a[16]); SQRADDAC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]);
6797    COMBA_STORE(b[18]);
6798
6799    /* output 19 */
6800    CARRY_FORWARD;
6801    SQRADDSC(a[0], a[19]); SQRADDAC(a[1], a[18]); SQRADDAC(a[2], a[17]); SQRADDAC(a[3], a[16]); SQRADDAC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB;
6802    COMBA_STORE(b[19]);
6803
6804    /* output 20 */
6805    CARRY_FORWARD;
6806    SQRADDSC(a[1], a[19]); SQRADDAC(a[2], a[18]); SQRADDAC(a[3], a[17]); SQRADDAC(a[4], a[16]); SQRADDAC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]);
6807    COMBA_STORE(b[20]);
6808
6809    /* output 21 */
6810    CARRY_FORWARD;
6811    SQRADDSC(a[2], a[19]); SQRADDAC(a[3], a[18]); SQRADDAC(a[4], a[17]); SQRADDAC(a[5], a[16]); SQRADDAC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB;
6812    COMBA_STORE(b[21]);
6813
6814    /* output 22 */
6815    CARRY_FORWARD;
6816    SQRADDSC(a[3], a[19]); SQRADDAC(a[4], a[18]); SQRADDAC(a[5], a[17]); SQRADDAC(a[6], a[16]); SQRADDAC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]);
6817    COMBA_STORE(b[22]);
6818
6819    /* output 23 */
6820    CARRY_FORWARD;
6821    SQRADDSC(a[4], a[19]); SQRADDAC(a[5], a[18]); SQRADDAC(a[6], a[17]); SQRADDAC(a[7], a[16]); SQRADDAC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB;
6822    COMBA_STORE(b[23]);
6823
6824    /* output 24 */
6825    CARRY_FORWARD;
6826    SQRADDSC(a[5], a[19]); SQRADDAC(a[6], a[18]); SQRADDAC(a[7], a[17]); SQRADDAC(a[8], a[16]); SQRADDAC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]);
6827    COMBA_STORE(b[24]);
6828
6829    /* output 25 */
6830    CARRY_FORWARD;
6831    SQRADDSC(a[6], a[19]); SQRADDAC(a[7], a[18]); SQRADDAC(a[8], a[17]); SQRADDAC(a[9], a[16]); SQRADDAC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB;
6832    COMBA_STORE(b[25]);
6833
6834    /* output 26 */
6835    CARRY_FORWARD;
6836    SQRADDSC(a[7], a[19]); SQRADDAC(a[8], a[18]); SQRADDAC(a[9], a[17]); SQRADDAC(a[10], a[16]); SQRADDAC(a[11], a[15]); SQRADDAC(a[12], a[14]); SQRADDDB; SQRADD(a[13], a[13]);
6837    COMBA_STORE(b[26]);
6838
6839    /* output 27 */
6840    CARRY_FORWARD;
6841    SQRADDSC(a[8], a[19]); SQRADDAC(a[9], a[18]); SQRADDAC(a[10], a[17]); SQRADDAC(a[11], a[16]); SQRADDAC(a[12], a[15]); SQRADDAC(a[13], a[14]); SQRADDDB;
6842    COMBA_STORE(b[27]);
6843
6844    /* output 28 */
6845    CARRY_FORWARD;
6846    SQRADDSC(a[9], a[19]); SQRADDAC(a[10], a[18]); SQRADDAC(a[11], a[17]); SQRADDAC(a[12], a[16]); SQRADDAC(a[13], a[15]); SQRADDDB; SQRADD(a[14], a[14]);
6847    COMBA_STORE(b[28]);
6848
6849    /* output 29 */
6850    CARRY_FORWARD;
6851    SQRADDSC(a[10], a[19]); SQRADDAC(a[11], a[18]); SQRADDAC(a[12], a[17]); SQRADDAC(a[13], a[16]); SQRADDAC(a[14], a[15]); SQRADDDB;
6852    COMBA_STORE(b[29]);
6853
6854    /* output 30 */
6855    CARRY_FORWARD;
6856    SQRADDSC(a[11], a[19]); SQRADDAC(a[12], a[18]); SQRADDAC(a[13], a[17]); SQRADDAC(a[14], a[16]); SQRADDDB; SQRADD(a[15], a[15]);
6857    COMBA_STORE(b[30]);
6858
6859    /* output 31 */
6860    CARRY_FORWARD;
6861    SQRADDSC(a[12], a[19]); SQRADDAC(a[13], a[18]); SQRADDAC(a[14], a[17]); SQRADDAC(a[15], a[16]); SQRADDDB;
6862    COMBA_STORE(b[31]);
6863
6864    /* output 32 */
6865    CARRY_FORWARD;
6866    SQRADDSC(a[13], a[19]); SQRADDAC(a[14], a[18]); SQRADDAC(a[15], a[17]); SQRADDDB; SQRADD(a[16], a[16]);
6867    COMBA_STORE(b[32]);
6868
6869    /* output 33 */
6870    CARRY_FORWARD;
6871    SQRADDSC(a[14], a[19]); SQRADDAC(a[15], a[18]); SQRADDAC(a[16], a[17]); SQRADDDB;
6872    COMBA_STORE(b[33]);
6873
6874    /* output 34 */
6875    CARRY_FORWARD;
6876    SQRADD2(a[15], a[19]); SQRADD2(a[16], a[18]); SQRADD(a[17], a[17]);
6877    COMBA_STORE(b[34]);
6878
6879    /* output 35 */
6880    CARRY_FORWARD;
6881    SQRADD2(a[16], a[19]); SQRADD2(a[17], a[18]);
6882    COMBA_STORE(b[35]);
6883
6884    /* output 36 */
6885    CARRY_FORWARD;
6886    SQRADD2(a[17], a[19]); SQRADD(a[18], a[18]);
6887    COMBA_STORE(b[36]);
6888
6889    /* output 37 */
6890    CARRY_FORWARD;
6891    SQRADD2(a[18], a[19]);
6892    COMBA_STORE(b[37]);
6893
6894    /* output 38 */
6895    CARRY_FORWARD;
6896    SQRADD(a[19], a[19]);
6897    COMBA_STORE(b[38]);
6898    COMBA_STORE2(b[39]);
6899    COMBA_FINI;
6900
6901    B->used = 40;
6902    B->sign = TFM_FP_ZPOS;
6903    memcpy(B->dp, b, 40 * sizeof(tfm_fp_digit));
6904    tfm_fp_clamp(B);
6905 }
6906 #endif
6907
6908 #define TFM_DEFINES
6909
6910 #ifdef TFM_SQR24
6911 void tfm_fp_sqr_comba24(tfm_fp_int *A, tfm_fp_int *B)
6912 {
6913    tfm_fp_digit *a, b[48], c0, c1, c2, sc0, sc1, sc2;
6914 #ifdef TFM_ISO
6915    tfm_fp_word tt;
6916 #endif
6917
6918    SILC_LOG_DEBUG(("Start"));
6919    a = A->dp;
6920    COMBA_START;
6921
6922    /* clear carries */
6923    CLEAR_CARRY;
6924
6925    /* output 0 */
6926    SQRADD(a[0],a[0]);
6927    COMBA_STORE(b[0]);
6928
6929    /* output 1 */
6930    CARRY_FORWARD;
6931    SQRADD2(a[0], a[1]);
6932    COMBA_STORE(b[1]);
6933
6934    /* output 2 */
6935    CARRY_FORWARD;
6936    SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]);
6937    COMBA_STORE(b[2]);
6938
6939    /* output 3 */
6940    CARRY_FORWARD;
6941    SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]);
6942    COMBA_STORE(b[3]);
6943
6944    /* output 4 */
6945    CARRY_FORWARD;
6946    SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]);
6947    COMBA_STORE(b[4]);
6948
6949    /* output 5 */
6950    CARRY_FORWARD;
6951    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
6952    COMBA_STORE(b[5]);
6953
6954    /* output 6 */
6955    CARRY_FORWARD;
6956    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
6957    COMBA_STORE(b[6]);
6958
6959    /* output 7 */
6960    CARRY_FORWARD;
6961    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
6962    COMBA_STORE(b[7]);
6963
6964    /* output 8 */
6965    CARRY_FORWARD;
6966    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
6967    COMBA_STORE(b[8]);
6968
6969    /* output 9 */
6970    CARRY_FORWARD;
6971    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
6972    COMBA_STORE(b[9]);
6973
6974    /* output 10 */
6975    CARRY_FORWARD;
6976    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]);
6977    COMBA_STORE(b[10]);
6978
6979    /* output 11 */
6980    CARRY_FORWARD;
6981    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB;
6982    COMBA_STORE(b[11]);
6983
6984    /* output 12 */
6985    CARRY_FORWARD;
6986    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]);
6987    COMBA_STORE(b[12]);
6988
6989    /* output 13 */
6990    CARRY_FORWARD;
6991    SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB;
6992    COMBA_STORE(b[13]);
6993
6994    /* output 14 */
6995    CARRY_FORWARD;
6996    SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]);
6997    COMBA_STORE(b[14]);
6998
6999    /* output 15 */
7000    CARRY_FORWARD;
7001    SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB;
7002    COMBA_STORE(b[15]);
7003
7004    /* output 16 */
7005    CARRY_FORWARD;
7006    SQRADDSC(a[0], a[16]); SQRADDAC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]);
7007    COMBA_STORE(b[16]);
7008
7009    /* output 17 */
7010    CARRY_FORWARD;
7011    SQRADDSC(a[0], a[17]); SQRADDAC(a[1], a[16]); SQRADDAC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB;
7012    COMBA_STORE(b[17]);
7013
7014    /* output 18 */
7015    CARRY_FORWARD;
7016    SQRADDSC(a[0], a[18]); SQRADDAC(a[1], a[17]); SQRADDAC(a[2], a[16]); SQRADDAC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]);
7017    COMBA_STORE(b[18]);
7018
7019    /* output 19 */
7020    CARRY_FORWARD;
7021    SQRADDSC(a[0], a[19]); SQRADDAC(a[1], a[18]); SQRADDAC(a[2], a[17]); SQRADDAC(a[3], a[16]); SQRADDAC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB;
7022    COMBA_STORE(b[19]);
7023
7024    /* output 20 */
7025    CARRY_FORWARD;
7026    SQRADDSC(a[0], a[20]); SQRADDAC(a[1], a[19]); SQRADDAC(a[2], a[18]); SQRADDAC(a[3], a[17]); SQRADDAC(a[4], a[16]); SQRADDAC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]);
7027    COMBA_STORE(b[20]);
7028
7029    /* output 21 */
7030    CARRY_FORWARD;
7031    SQRADDSC(a[0], a[21]); SQRADDAC(a[1], a[20]); SQRADDAC(a[2], a[19]); SQRADDAC(a[3], a[18]); SQRADDAC(a[4], a[17]); SQRADDAC(a[5], a[16]); SQRADDAC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB;
7032    COMBA_STORE(b[21]);
7033
7034    /* output 22 */
7035    CARRY_FORWARD;
7036    SQRADDSC(a[0], a[22]); SQRADDAC(a[1], a[21]); SQRADDAC(a[2], a[20]); SQRADDAC(a[3], a[19]); SQRADDAC(a[4], a[18]); SQRADDAC(a[5], a[17]); SQRADDAC(a[6], a[16]); SQRADDAC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]);
7037    COMBA_STORE(b[22]);
7038
7039    /* output 23 */
7040    CARRY_FORWARD;
7041    SQRADDSC(a[0], a[23]); SQRADDAC(a[1], a[22]); SQRADDAC(a[2], a[21]); SQRADDAC(a[3], a[20]); SQRADDAC(a[4], a[19]); SQRADDAC(a[5], a[18]); SQRADDAC(a[6], a[17]); SQRADDAC(a[7], a[16]); SQRADDAC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB;
7042    COMBA_STORE(b[23]);
7043
7044    /* output 24 */
7045    CARRY_FORWARD;
7046    SQRADDSC(a[1], a[23]); SQRADDAC(a[2], a[22]); SQRADDAC(a[3], a[21]); SQRADDAC(a[4], a[20]); SQRADDAC(a[5], a[19]); SQRADDAC(a[6], a[18]); SQRADDAC(a[7], a[17]); SQRADDAC(a[8], a[16]); SQRADDAC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]);
7047    COMBA_STORE(b[24]);
7048
7049    /* output 25 */
7050    CARRY_FORWARD;
7051    SQRADDSC(a[2], a[23]); SQRADDAC(a[3], a[22]); SQRADDAC(a[4], a[21]); SQRADDAC(a[5], a[20]); SQRADDAC(a[6], a[19]); SQRADDAC(a[7], a[18]); SQRADDAC(a[8], a[17]); SQRADDAC(a[9], a[16]); SQRADDAC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB;
7052    COMBA_STORE(b[25]);
7053
7054    /* output 26 */
7055    CARRY_FORWARD;
7056    SQRADDSC(a[3], a[23]); SQRADDAC(a[4], a[22]); SQRADDAC(a[5], a[21]); SQRADDAC(a[6], a[20]); SQRADDAC(a[7], a[19]); SQRADDAC(a[8], a[18]); SQRADDAC(a[9], a[17]); SQRADDAC(a[10], a[16]); SQRADDAC(a[11], a[15]); SQRADDAC(a[12], a[14]); SQRADDDB; SQRADD(a[13], a[13]);
7057    COMBA_STORE(b[26]);
7058
7059    /* output 27 */
7060    CARRY_FORWARD;
7061    SQRADDSC(a[4], a[23]); SQRADDAC(a[5], a[22]); SQRADDAC(a[6], a[21]); SQRADDAC(a[7], a[20]); SQRADDAC(a[8], a[19]); SQRADDAC(a[9], a[18]); SQRADDAC(a[10], a[17]); SQRADDAC(a[11], a[16]); SQRADDAC(a[12], a[15]); SQRADDAC(a[13], a[14]); SQRADDDB;
7062    COMBA_STORE(b[27]);
7063
7064    /* output 28 */
7065    CARRY_FORWARD;
7066    SQRADDSC(a[5], a[23]); SQRADDAC(a[6], a[22]); SQRADDAC(a[7], a[21]); SQRADDAC(a[8], a[20]); SQRADDAC(a[9], a[19]); SQRADDAC(a[10], a[18]); SQRADDAC(a[11], a[17]); SQRADDAC(a[12], a[16]); SQRADDAC(a[13], a[15]); SQRADDDB; SQRADD(a[14], a[14]);
7067    COMBA_STORE(b[28]);
7068
7069    /* output 29 */
7070    CARRY_FORWARD;
7071    SQRADDSC(a[6], a[23]); SQRADDAC(a[7], a[22]); SQRADDAC(a[8], a[21]); SQRADDAC(a[9], a[20]); SQRADDAC(a[10], a[19]); SQRADDAC(a[11], a[18]); SQRADDAC(a[12], a[17]); SQRADDAC(a[13], a[16]); SQRADDAC(a[14], a[15]); SQRADDDB;
7072    COMBA_STORE(b[29]);
7073
7074    /* output 30 */
7075    CARRY_FORWARD;
7076    SQRADDSC(a[7], a[23]); SQRADDAC(a[8], a[22]); SQRADDAC(a[9], a[21]); SQRADDAC(a[10], a[20]); SQRADDAC(a[11], a[19]); SQRADDAC(a[12], a[18]); SQRADDAC(a[13], a[17]); SQRADDAC(a[14], a[16]); SQRADDDB; SQRADD(a[15], a[15]);
7077    COMBA_STORE(b[30]);
7078
7079    /* output 31 */
7080    CARRY_FORWARD;
7081    SQRADDSC(a[8], a[23]); SQRADDAC(a[9], a[22]); SQRADDAC(a[10], a[21]); SQRADDAC(a[11], a[20]); SQRADDAC(a[12], a[19]); SQRADDAC(a[13], a[18]); SQRADDAC(a[14], a[17]); SQRADDAC(a[15], a[16]); SQRADDDB;
7082    COMBA_STORE(b[31]);
7083
7084    /* output 32 */
7085    CARRY_FORWARD;
7086    SQRADDSC(a[9], a[23]); SQRADDAC(a[10], a[22]); SQRADDAC(a[11], a[21]); SQRADDAC(a[12], a[20]); SQRADDAC(a[13], a[19]); SQRADDAC(a[14], a[18]); SQRADDAC(a[15], a[17]); SQRADDDB; SQRADD(a[16], a[16]);
7087    COMBA_STORE(b[32]);
7088
7089    /* output 33 */
7090    CARRY_FORWARD;
7091    SQRADDSC(a[10], a[23]); SQRADDAC(a[11], a[22]); SQRADDAC(a[12], a[21]); SQRADDAC(a[13], a[20]); SQRADDAC(a[14], a[19]); SQRADDAC(a[15], a[18]); SQRADDAC(a[16], a[17]); SQRADDDB;
7092    COMBA_STORE(b[33]);
7093
7094    /* output 34 */
7095    CARRY_FORWARD;
7096    SQRADDSC(a[11], a[23]); SQRADDAC(a[12], a[22]); SQRADDAC(a[13], a[21]); SQRADDAC(a[14], a[20]); SQRADDAC(a[15], a[19]); SQRADDAC(a[16], a[18]); SQRADDDB; SQRADD(a[17], a[17]);
7097    COMBA_STORE(b[34]);
7098
7099    /* output 35 */
7100    CARRY_FORWARD;
7101    SQRADDSC(a[12], a[23]); SQRADDAC(a[13], a[22]); SQRADDAC(a[14], a[21]); SQRADDAC(a[15], a[20]); SQRADDAC(a[16], a[19]); SQRADDAC(a[17], a[18]); SQRADDDB;
7102    COMBA_STORE(b[35]);
7103
7104    /* output 36 */
7105    CARRY_FORWARD;
7106    SQRADDSC(a[13], a[23]); SQRADDAC(a[14], a[22]); SQRADDAC(a[15], a[21]); SQRADDAC(a[16], a[20]); SQRADDAC(a[17], a[19]); SQRADDDB; SQRADD(a[18], a[18]);
7107    COMBA_STORE(b[36]);
7108
7109    /* output 37 */
7110    CARRY_FORWARD;
7111    SQRADDSC(a[14], a[23]); SQRADDAC(a[15], a[22]); SQRADDAC(a[16], a[21]); SQRADDAC(a[17], a[20]); SQRADDAC(a[18], a[19]); SQRADDDB;
7112    COMBA_STORE(b[37]);
7113
7114    /* output 38 */
7115    CARRY_FORWARD;
7116    SQRADDSC(a[15], a[23]); SQRADDAC(a[16], a[22]); SQRADDAC(a[17], a[21]); SQRADDAC(a[18], a[20]); SQRADDDB; SQRADD(a[19], a[19]);
7117    COMBA_STORE(b[38]);
7118
7119    /* output 39 */
7120    CARRY_FORWARD;
7121    SQRADDSC(a[16], a[23]); SQRADDAC(a[17], a[22]); SQRADDAC(a[18], a[21]); SQRADDAC(a[19], a[20]); SQRADDDB;
7122    COMBA_STORE(b[39]);
7123
7124    /* output 40 */
7125    CARRY_FORWARD;
7126    SQRADDSC(a[17], a[23]); SQRADDAC(a[18], a[22]); SQRADDAC(a[19], a[21]); SQRADDDB; SQRADD(a[20], a[20]);
7127    COMBA_STORE(b[40]);
7128
7129    /* output 41 */
7130    CARRY_FORWARD;
7131    SQRADDSC(a[18], a[23]); SQRADDAC(a[19], a[22]); SQRADDAC(a[20], a[21]); SQRADDDB;
7132    COMBA_STORE(b[41]);
7133
7134    /* output 42 */
7135    CARRY_FORWARD;
7136    SQRADD2(a[19], a[23]); SQRADD2(a[20], a[22]); SQRADD(a[21], a[21]);
7137    COMBA_STORE(b[42]);
7138
7139    /* output 43 */
7140    CARRY_FORWARD;
7141    SQRADD2(a[20], a[23]); SQRADD2(a[21], a[22]);
7142    COMBA_STORE(b[43]);
7143
7144    /* output 44 */
7145    CARRY_FORWARD;
7146    SQRADD2(a[21], a[23]); SQRADD(a[22], a[22]);
7147    COMBA_STORE(b[44]);
7148
7149    /* output 45 */
7150    CARRY_FORWARD;
7151    SQRADD2(a[22], a[23]);
7152    COMBA_STORE(b[45]);
7153
7154    /* output 46 */
7155    CARRY_FORWARD;
7156    SQRADD(a[23], a[23]);
7157    COMBA_STORE(b[46]);
7158    COMBA_STORE2(b[47]);
7159    COMBA_FINI;
7160
7161    B->used = 48;
7162    B->sign = TFM_FP_ZPOS;
7163    memcpy(B->dp, b, 48 * sizeof(tfm_fp_digit));
7164    tfm_fp_clamp(B);
7165 }
7166 #endif
7167
7168 #define TFM_DEFINES
7169
7170 #ifdef TFM_SQR28
7171 void tfm_fp_sqr_comba28(tfm_fp_int *A, tfm_fp_int *B)
7172 {
7173    tfm_fp_digit *a, b[56], c0, c1, c2, sc0, sc1, sc2;
7174 #ifdef TFM_ISO
7175    tfm_fp_word tt;
7176 #endif
7177
7178    SILC_LOG_DEBUG(("Start"));
7179    a = A->dp;
7180    COMBA_START;
7181
7182    /* clear carries */
7183    CLEAR_CARRY;
7184
7185    /* output 0 */
7186    SQRADD(a[0],a[0]);
7187    COMBA_STORE(b[0]);
7188
7189    /* output 1 */
7190    CARRY_FORWARD;
7191    SQRADD2(a[0], a[1]);
7192    COMBA_STORE(b[1]);
7193
7194    /* output 2 */
7195    CARRY_FORWARD;
7196    SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]);
7197    COMBA_STORE(b[2]);
7198
7199    /* output 3 */
7200    CARRY_FORWARD;
7201    SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]);
7202    COMBA_STORE(b[3]);
7203
7204    /* output 4 */
7205    CARRY_FORWARD;
7206    SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]);
7207    COMBA_STORE(b[4]);
7208
7209    /* output 5 */
7210    CARRY_FORWARD;
7211    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
7212    COMBA_STORE(b[5]);
7213
7214    /* output 6 */
7215    CARRY_FORWARD;
7216    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
7217    COMBA_STORE(b[6]);
7218
7219    /* output 7 */
7220    CARRY_FORWARD;
7221    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
7222    COMBA_STORE(b[7]);
7223
7224    /* output 8 */
7225    CARRY_FORWARD;
7226    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
7227    COMBA_STORE(b[8]);
7228
7229    /* output 9 */
7230    CARRY_FORWARD;
7231    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
7232    COMBA_STORE(b[9]);
7233
7234    /* output 10 */
7235    CARRY_FORWARD;
7236    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]);
7237    COMBA_STORE(b[10]);
7238
7239    /* output 11 */
7240    CARRY_FORWARD;
7241    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB;
7242    COMBA_STORE(b[11]);
7243
7244    /* output 12 */
7245    CARRY_FORWARD;
7246    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]);
7247    COMBA_STORE(b[12]);
7248
7249    /* output 13 */
7250    CARRY_FORWARD;
7251    SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB;
7252    COMBA_STORE(b[13]);
7253
7254    /* output 14 */
7255    CARRY_FORWARD;
7256    SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]);
7257    COMBA_STORE(b[14]);
7258
7259    /* output 15 */
7260    CARRY_FORWARD;
7261    SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB;
7262    COMBA_STORE(b[15]);
7263
7264    /* output 16 */
7265    CARRY_FORWARD;
7266    SQRADDSC(a[0], a[16]); SQRADDAC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]);
7267    COMBA_STORE(b[16]);
7268
7269    /* output 17 */
7270    CARRY_FORWARD;
7271    SQRADDSC(a[0], a[17]); SQRADDAC(a[1], a[16]); SQRADDAC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB;
7272    COMBA_STORE(b[17]);
7273
7274    /* output 18 */
7275    CARRY_FORWARD;
7276    SQRADDSC(a[0], a[18]); SQRADDAC(a[1], a[17]); SQRADDAC(a[2], a[16]); SQRADDAC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]);
7277    COMBA_STORE(b[18]);
7278
7279    /* output 19 */
7280    CARRY_FORWARD;
7281    SQRADDSC(a[0], a[19]); SQRADDAC(a[1], a[18]); SQRADDAC(a[2], a[17]); SQRADDAC(a[3], a[16]); SQRADDAC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB;
7282    COMBA_STORE(b[19]);
7283
7284    /* output 20 */
7285    CARRY_FORWARD;
7286    SQRADDSC(a[0], a[20]); SQRADDAC(a[1], a[19]); SQRADDAC(a[2], a[18]); SQRADDAC(a[3], a[17]); SQRADDAC(a[4], a[16]); SQRADDAC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]);
7287    COMBA_STORE(b[20]);
7288
7289    /* output 21 */
7290    CARRY_FORWARD;
7291    SQRADDSC(a[0], a[21]); SQRADDAC(a[1], a[20]); SQRADDAC(a[2], a[19]); SQRADDAC(a[3], a[18]); SQRADDAC(a[4], a[17]); SQRADDAC(a[5], a[16]); SQRADDAC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB;
7292    COMBA_STORE(b[21]);
7293
7294    /* output 22 */
7295    CARRY_FORWARD;
7296    SQRADDSC(a[0], a[22]); SQRADDAC(a[1], a[21]); SQRADDAC(a[2], a[20]); SQRADDAC(a[3], a[19]); SQRADDAC(a[4], a[18]); SQRADDAC(a[5], a[17]); SQRADDAC(a[6], a[16]); SQRADDAC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]);
7297    COMBA_STORE(b[22]);
7298
7299    /* output 23 */
7300    CARRY_FORWARD;
7301    SQRADDSC(a[0], a[23]); SQRADDAC(a[1], a[22]); SQRADDAC(a[2], a[21]); SQRADDAC(a[3], a[20]); SQRADDAC(a[4], a[19]); SQRADDAC(a[5], a[18]); SQRADDAC(a[6], a[17]); SQRADDAC(a[7], a[16]); SQRADDAC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB;
7302    COMBA_STORE(b[23]);
7303
7304    /* output 24 */
7305    CARRY_FORWARD;
7306    SQRADDSC(a[0], a[24]); SQRADDAC(a[1], a[23]); SQRADDAC(a[2], a[22]); SQRADDAC(a[3], a[21]); SQRADDAC(a[4], a[20]); SQRADDAC(a[5], a[19]); SQRADDAC(a[6], a[18]); SQRADDAC(a[7], a[17]); SQRADDAC(a[8], a[16]); SQRADDAC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]);
7307    COMBA_STORE(b[24]);
7308
7309    /* output 25 */
7310    CARRY_FORWARD;
7311    SQRADDSC(a[0], a[25]); SQRADDAC(a[1], a[24]); SQRADDAC(a[2], a[23]); SQRADDAC(a[3], a[22]); SQRADDAC(a[4], a[21]); SQRADDAC(a[5], a[20]); SQRADDAC(a[6], a[19]); SQRADDAC(a[7], a[18]); SQRADDAC(a[8], a[17]); SQRADDAC(a[9], a[16]); SQRADDAC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB;
7312    COMBA_STORE(b[25]);
7313
7314    /* output 26 */
7315    CARRY_FORWARD;
7316    SQRADDSC(a[0], a[26]); SQRADDAC(a[1], a[25]); SQRADDAC(a[2], a[24]); SQRADDAC(a[3], a[23]); SQRADDAC(a[4], a[22]); SQRADDAC(a[5], a[21]); SQRADDAC(a[6], a[20]); SQRADDAC(a[7], a[19]); SQRADDAC(a[8], a[18]); SQRADDAC(a[9], a[17]); SQRADDAC(a[10], a[16]); SQRADDAC(a[11], a[15]); SQRADDAC(a[12], a[14]); SQRADDDB; SQRADD(a[13], a[13]);
7317    COMBA_STORE(b[26]);
7318
7319    /* output 27 */
7320    CARRY_FORWARD;
7321    SQRADDSC(a[0], a[27]); SQRADDAC(a[1], a[26]); SQRADDAC(a[2], a[25]); SQRADDAC(a[3], a[24]); SQRADDAC(a[4], a[23]); SQRADDAC(a[5], a[22]); SQRADDAC(a[6], a[21]); SQRADDAC(a[7], a[20]); SQRADDAC(a[8], a[19]); SQRADDAC(a[9], a[18]); SQRADDAC(a[10], a[17]); SQRADDAC(a[11], a[16]); SQRADDAC(a[12], a[15]); SQRADDAC(a[13], a[14]); SQRADDDB;
7322    COMBA_STORE(b[27]);
7323
7324    /* output 28 */
7325    CARRY_FORWARD;
7326    SQRADDSC(a[1], a[27]); SQRADDAC(a[2], a[26]); SQRADDAC(a[3], a[25]); SQRADDAC(a[4], a[24]); SQRADDAC(a[5], a[23]); SQRADDAC(a[6], a[22]); SQRADDAC(a[7], a[21]); SQRADDAC(a[8], a[20]); SQRADDAC(a[9], a[19]); SQRADDAC(a[10], a[18]); SQRADDAC(a[11], a[17]); SQRADDAC(a[12], a[16]); SQRADDAC(a[13], a[15]); SQRADDDB; SQRADD(a[14], a[14]);
7327    COMBA_STORE(b[28]);
7328
7329    /* output 29 */
7330    CARRY_FORWARD;
7331    SQRADDSC(a[2], a[27]); SQRADDAC(a[3], a[26]); SQRADDAC(a[4], a[25]); SQRADDAC(a[5], a[24]); SQRADDAC(a[6], a[23]); SQRADDAC(a[7], a[22]); SQRADDAC(a[8], a[21]); SQRADDAC(a[9], a[20]); SQRADDAC(a[10], a[19]); SQRADDAC(a[11], a[18]); SQRADDAC(a[12], a[17]); SQRADDAC(a[13], a[16]); SQRADDAC(a[14], a[15]); SQRADDDB;
7332    COMBA_STORE(b[29]);
7333
7334    /* output 30 */
7335    CARRY_FORWARD;
7336    SQRADDSC(a[3], a[27]); SQRADDAC(a[4], a[26]); SQRADDAC(a[5], a[25]); SQRADDAC(a[6], a[24]); SQRADDAC(a[7], a[23]); SQRADDAC(a[8], a[22]); SQRADDAC(a[9], a[21]); SQRADDAC(a[10], a[20]); SQRADDAC(a[11], a[19]); SQRADDAC(a[12], a[18]); SQRADDAC(a[13], a[17]); SQRADDAC(a[14], a[16]); SQRADDDB; SQRADD(a[15], a[15]);
7337    COMBA_STORE(b[30]);
7338
7339    /* output 31 */
7340    CARRY_FORWARD;
7341    SQRADDSC(a[4], a[27]); SQRADDAC(a[5], a[26]); SQRADDAC(a[6], a[25]); SQRADDAC(a[7], a[24]); SQRADDAC(a[8], a[23]); SQRADDAC(a[9], a[22]); SQRADDAC(a[10], a[21]); SQRADDAC(a[11], a[20]); SQRADDAC(a[12], a[19]); SQRADDAC(a[13], a[18]); SQRADDAC(a[14], a[17]); SQRADDAC(a[15], a[16]); SQRADDDB;
7342    COMBA_STORE(b[31]);
7343
7344    /* output 32 */
7345    CARRY_FORWARD;
7346    SQRADDSC(a[5], a[27]); SQRADDAC(a[6], a[26]); SQRADDAC(a[7], a[25]); SQRADDAC(a[8], a[24]); SQRADDAC(a[9], a[23]); SQRADDAC(a[10], a[22]); SQRADDAC(a[11], a[21]); SQRADDAC(a[12], a[20]); SQRADDAC(a[13], a[19]); SQRADDAC(a[14], a[18]); SQRADDAC(a[15], a[17]); SQRADDDB; SQRADD(a[16], a[16]);
7347    COMBA_STORE(b[32]);
7348
7349    /* output 33 */
7350    CARRY_FORWARD;
7351    SQRADDSC(a[6], a[27]); SQRADDAC(a[7], a[26]); SQRADDAC(a[8], a[25]); SQRADDAC(a[9], a[24]); SQRADDAC(a[10], a[23]); SQRADDAC(a[11], a[22]); SQRADDAC(a[12], a[21]); SQRADDAC(a[13], a[20]); SQRADDAC(a[14], a[19]); SQRADDAC(a[15], a[18]); SQRADDAC(a[16], a[17]); SQRADDDB;
7352    COMBA_STORE(b[33]);
7353
7354    /* output 34 */
7355    CARRY_FORWARD;
7356    SQRADDSC(a[7], a[27]); SQRADDAC(a[8], a[26]); SQRADDAC(a[9], a[25]); SQRADDAC(a[10], a[24]); SQRADDAC(a[11], a[23]); SQRADDAC(a[12], a[22]); SQRADDAC(a[13], a[21]); SQRADDAC(a[14], a[20]); SQRADDAC(a[15], a[19]); SQRADDAC(a[16], a[18]); SQRADDDB; SQRADD(a[17], a[17]);
7357    COMBA_STORE(b[34]);
7358
7359    /* output 35 */
7360    CARRY_FORWARD;
7361    SQRADDSC(a[8], a[27]); SQRADDAC(a[9], a[26]); SQRADDAC(a[10], a[25]); SQRADDAC(a[11], a[24]); SQRADDAC(a[12], a[23]); SQRADDAC(a[13], a[22]); SQRADDAC(a[14], a[21]); SQRADDAC(a[15], a[20]); SQRADDAC(a[16], a[19]); SQRADDAC(a[17], a[18]); SQRADDDB;
7362    COMBA_STORE(b[35]);
7363
7364    /* output 36 */
7365    CARRY_FORWARD;
7366    SQRADDSC(a[9], a[27]); SQRADDAC(a[10], a[26]); SQRADDAC(a[11], a[25]); SQRADDAC(a[12], a[24]); SQRADDAC(a[13], a[23]); SQRADDAC(a[14], a[22]); SQRADDAC(a[15], a[21]); SQRADDAC(a[16], a[20]); SQRADDAC(a[17], a[19]); SQRADDDB; SQRADD(a[18], a[18]);
7367    COMBA_STORE(b[36]);
7368
7369    /* output 37 */
7370    CARRY_FORWARD;
7371    SQRADDSC(a[10], a[27]); SQRADDAC(a[11], a[26]); SQRADDAC(a[12], a[25]); SQRADDAC(a[13], a[24]); SQRADDAC(a[14], a[23]); SQRADDAC(a[15], a[22]); SQRADDAC(a[16], a[21]); SQRADDAC(a[17], a[20]); SQRADDAC(a[18], a[19]); SQRADDDB;
7372    COMBA_STORE(b[37]);
7373
7374    /* output 38 */
7375    CARRY_FORWARD;
7376    SQRADDSC(a[11], a[27]); SQRADDAC(a[12], a[26]); SQRADDAC(a[13], a[25]); SQRADDAC(a[14], a[24]); SQRADDAC(a[15], a[23]); SQRADDAC(a[16], a[22]); SQRADDAC(a[17], a[21]); SQRADDAC(a[18], a[20]); SQRADDDB; SQRADD(a[19], a[19]);
7377    COMBA_STORE(b[38]);
7378
7379    /* output 39 */
7380    CARRY_FORWARD;
7381    SQRADDSC(a[12], a[27]); SQRADDAC(a[13], a[26]); SQRADDAC(a[14], a[25]); SQRADDAC(a[15], a[24]); SQRADDAC(a[16], a[23]); SQRADDAC(a[17], a[22]); SQRADDAC(a[18], a[21]); SQRADDAC(a[19], a[20]); SQRADDDB;
7382    COMBA_STORE(b[39]);
7383
7384    /* output 40 */
7385    CARRY_FORWARD;
7386    SQRADDSC(a[13], a[27]); SQRADDAC(a[14], a[26]); SQRADDAC(a[15], a[25]); SQRADDAC(a[16], a[24]); SQRADDAC(a[17], a[23]); SQRADDAC(a[18], a[22]); SQRADDAC(a[19], a[21]); SQRADDDB; SQRADD(a[20], a[20]);
7387    COMBA_STORE(b[40]);
7388
7389    /* output 41 */
7390    CARRY_FORWARD;
7391    SQRADDSC(a[14], a[27]); SQRADDAC(a[15], a[26]); SQRADDAC(a[16], a[25]); SQRADDAC(a[17], a[24]); SQRADDAC(a[18], a[23]); SQRADDAC(a[19], a[22]); SQRADDAC(a[20], a[21]); SQRADDDB;
7392    COMBA_STORE(b[41]);
7393
7394    /* output 42 */
7395    CARRY_FORWARD;
7396    SQRADDSC(a[15], a[27]); SQRADDAC(a[16], a[26]); SQRADDAC(a[17], a[25]); SQRADDAC(a[18], a[24]); SQRADDAC(a[19], a[23]); SQRADDAC(a[20], a[22]); SQRADDDB; SQRADD(a[21], a[21]);
7397    COMBA_STORE(b[42]);
7398
7399    /* output 43 */
7400    CARRY_FORWARD;
7401    SQRADDSC(a[16], a[27]); SQRADDAC(a[17], a[26]); SQRADDAC(a[18], a[25]); SQRADDAC(a[19], a[24]); SQRADDAC(a[20], a[23]); SQRADDAC(a[21], a[22]); SQRADDDB;
7402    COMBA_STORE(b[43]);
7403
7404    /* output 44 */
7405    CARRY_FORWARD;
7406    SQRADDSC(a[17], a[27]); SQRADDAC(a[18], a[26]); SQRADDAC(a[19], a[25]); SQRADDAC(a[20], a[24]); SQRADDAC(a[21], a[23]); SQRADDDB; SQRADD(a[22], a[22]);
7407    COMBA_STORE(b[44]);
7408
7409    /* output 45 */
7410    CARRY_FORWARD;
7411    SQRADDSC(a[18], a[27]); SQRADDAC(a[19], a[26]); SQRADDAC(a[20], a[25]); SQRADDAC(a[21], a[24]); SQRADDAC(a[22], a[23]); SQRADDDB;
7412    COMBA_STORE(b[45]);
7413
7414    /* output 46 */
7415    CARRY_FORWARD;
7416    SQRADDSC(a[19], a[27]); SQRADDAC(a[20], a[26]); SQRADDAC(a[21], a[25]); SQRADDAC(a[22], a[24]); SQRADDDB; SQRADD(a[23], a[23]);
7417    COMBA_STORE(b[46]);
7418
7419    /* output 47 */
7420    CARRY_FORWARD;
7421    SQRADDSC(a[20], a[27]); SQRADDAC(a[21], a[26]); SQRADDAC(a[22], a[25]); SQRADDAC(a[23], a[24]); SQRADDDB;
7422    COMBA_STORE(b[47]);
7423
7424    /* output 48 */
7425    CARRY_FORWARD;
7426    SQRADDSC(a[21], a[27]); SQRADDAC(a[22], a[26]); SQRADDAC(a[23], a[25]); SQRADDDB; SQRADD(a[24], a[24]);
7427    COMBA_STORE(b[48]);
7428
7429    /* output 49 */
7430    CARRY_FORWARD;
7431    SQRADDSC(a[22], a[27]); SQRADDAC(a[23], a[26]); SQRADDAC(a[24], a[25]); SQRADDDB;
7432    COMBA_STORE(b[49]);
7433
7434    /* output 50 */
7435    CARRY_FORWARD;
7436    SQRADD2(a[23], a[27]); SQRADD2(a[24], a[26]); SQRADD(a[25], a[25]);
7437    COMBA_STORE(b[50]);
7438
7439    /* output 51 */
7440    CARRY_FORWARD;
7441    SQRADD2(a[24], a[27]); SQRADD2(a[25], a[26]);
7442    COMBA_STORE(b[51]);
7443
7444    /* output 52 */
7445    CARRY_FORWARD;
7446    SQRADD2(a[25], a[27]); SQRADD(a[26], a[26]);
7447    COMBA_STORE(b[52]);
7448
7449    /* output 53 */
7450    CARRY_FORWARD;
7451    SQRADD2(a[26], a[27]);
7452    COMBA_STORE(b[53]);
7453
7454    /* output 54 */
7455    CARRY_FORWARD;
7456    SQRADD(a[27], a[27]);
7457    COMBA_STORE(b[54]);
7458    COMBA_STORE2(b[55]);
7459    COMBA_FINI;
7460
7461    B->used = 56;
7462    B->sign = TFM_FP_ZPOS;
7463    memcpy(B->dp, b, 56 * sizeof(tfm_fp_digit));
7464    tfm_fp_clamp(B);
7465 }
7466 #endif
7467
7468 #define TFM_DEFINES
7469
7470 #ifdef TFM_SQR32
7471 void tfm_fp_sqr_comba32(tfm_fp_int *A, tfm_fp_int *B)
7472 {
7473    tfm_fp_digit *a, b[64], c0, c1, c2, sc0, sc1, sc2;
7474 #ifdef TFM_ISO
7475    tfm_fp_word tt;
7476 #endif
7477
7478    SILC_LOG_DEBUG(("Start"));
7479    a = A->dp;
7480    COMBA_START;
7481
7482    /* clear carries */
7483    CLEAR_CARRY;
7484
7485    /* output 0 */
7486    SQRADD(a[0],a[0]);
7487    COMBA_STORE(b[0]);
7488
7489    /* output 1 */
7490    CARRY_FORWARD;
7491    SQRADD2(a[0], a[1]);
7492    COMBA_STORE(b[1]);
7493
7494    /* output 2 */
7495    CARRY_FORWARD;
7496    SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]);
7497    COMBA_STORE(b[2]);
7498
7499    /* output 3 */
7500    CARRY_FORWARD;
7501    SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]);
7502    COMBA_STORE(b[3]);
7503
7504    /* output 4 */
7505    CARRY_FORWARD;
7506    SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]);
7507    COMBA_STORE(b[4]);
7508
7509    /* output 5 */
7510    CARRY_FORWARD;
7511    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
7512    COMBA_STORE(b[5]);
7513
7514    /* output 6 */
7515    CARRY_FORWARD;
7516    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
7517    COMBA_STORE(b[6]);
7518
7519    /* output 7 */
7520    CARRY_FORWARD;
7521    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
7522    COMBA_STORE(b[7]);
7523
7524    /* output 8 */
7525    CARRY_FORWARD;
7526    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
7527    COMBA_STORE(b[8]);
7528
7529    /* output 9 */
7530    CARRY_FORWARD;
7531    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
7532    COMBA_STORE(b[9]);
7533
7534    /* output 10 */
7535    CARRY_FORWARD;
7536    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]);
7537    COMBA_STORE(b[10]);
7538
7539    /* output 11 */
7540    CARRY_FORWARD;
7541    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB;
7542    COMBA_STORE(b[11]);
7543
7544    /* output 12 */
7545    CARRY_FORWARD;
7546    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]);
7547    COMBA_STORE(b[12]);
7548
7549    /* output 13 */
7550    CARRY_FORWARD;
7551    SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB;
7552    COMBA_STORE(b[13]);
7553
7554    /* output 14 */
7555    CARRY_FORWARD;
7556    SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]);
7557    COMBA_STORE(b[14]);
7558
7559    /* output 15 */
7560    CARRY_FORWARD;
7561    SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB;
7562    COMBA_STORE(b[15]);
7563
7564    /* output 16 */
7565    CARRY_FORWARD;
7566    SQRADDSC(a[0], a[16]); SQRADDAC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]);
7567    COMBA_STORE(b[16]);
7568
7569    /* output 17 */
7570    CARRY_FORWARD;
7571    SQRADDSC(a[0], a[17]); SQRADDAC(a[1], a[16]); SQRADDAC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB;
7572    COMBA_STORE(b[17]);
7573
7574    /* output 18 */
7575    CARRY_FORWARD;
7576    SQRADDSC(a[0], a[18]); SQRADDAC(a[1], a[17]); SQRADDAC(a[2], a[16]); SQRADDAC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]);
7577    COMBA_STORE(b[18]);
7578
7579    /* output 19 */
7580    CARRY_FORWARD;
7581    SQRADDSC(a[0], a[19]); SQRADDAC(a[1], a[18]); SQRADDAC(a[2], a[17]); SQRADDAC(a[3], a[16]); SQRADDAC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB;
7582    COMBA_STORE(b[19]);
7583
7584    /* output 20 */
7585    CARRY_FORWARD;
7586    SQRADDSC(a[0], a[20]); SQRADDAC(a[1], a[19]); SQRADDAC(a[2], a[18]); SQRADDAC(a[3], a[17]); SQRADDAC(a[4], a[16]); SQRADDAC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]);
7587    COMBA_STORE(b[20]);
7588
7589    /* output 21 */
7590    CARRY_FORWARD;
7591    SQRADDSC(a[0], a[21]); SQRADDAC(a[1], a[20]); SQRADDAC(a[2], a[19]); SQRADDAC(a[3], a[18]); SQRADDAC(a[4], a[17]); SQRADDAC(a[5], a[16]); SQRADDAC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB;
7592    COMBA_STORE(b[21]);
7593
7594    /* output 22 */
7595    CARRY_FORWARD;
7596    SQRADDSC(a[0], a[22]); SQRADDAC(a[1], a[21]); SQRADDAC(a[2], a[20]); SQRADDAC(a[3], a[19]); SQRADDAC(a[4], a[18]); SQRADDAC(a[5], a[17]); SQRADDAC(a[6], a[16]); SQRADDAC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]);
7597    COMBA_STORE(b[22]);
7598
7599    /* output 23 */
7600    CARRY_FORWARD;
7601    SQRADDSC(a[0], a[23]); SQRADDAC(a[1], a[22]); SQRADDAC(a[2], a[21]); SQRADDAC(a[3], a[20]); SQRADDAC(a[4], a[19]); SQRADDAC(a[5], a[18]); SQRADDAC(a[6], a[17]); SQRADDAC(a[7], a[16]); SQRADDAC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB;
7602    COMBA_STORE(b[23]);
7603
7604    /* output 24 */
7605    CARRY_FORWARD;
7606    SQRADDSC(a[0], a[24]); SQRADDAC(a[1], a[23]); SQRADDAC(a[2], a[22]); SQRADDAC(a[3], a[21]); SQRADDAC(a[4], a[20]); SQRADDAC(a[5], a[19]); SQRADDAC(a[6], a[18]); SQRADDAC(a[7], a[17]); SQRADDAC(a[8], a[16]); SQRADDAC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]);
7607    COMBA_STORE(b[24]);
7608
7609    /* output 25 */
7610    CARRY_FORWARD;
7611    SQRADDSC(a[0], a[25]); SQRADDAC(a[1], a[24]); SQRADDAC(a[2], a[23]); SQRADDAC(a[3], a[22]); SQRADDAC(a[4], a[21]); SQRADDAC(a[5], a[20]); SQRADDAC(a[6], a[19]); SQRADDAC(a[7], a[18]); SQRADDAC(a[8], a[17]); SQRADDAC(a[9], a[16]); SQRADDAC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB;
7612    COMBA_STORE(b[25]);
7613
7614    /* output 26 */
7615    CARRY_FORWARD;
7616    SQRADDSC(a[0], a[26]); SQRADDAC(a[1], a[25]); SQRADDAC(a[2], a[24]); SQRADDAC(a[3], a[23]); SQRADDAC(a[4], a[22]); SQRADDAC(a[5], a[21]); SQRADDAC(a[6], a[20]); SQRADDAC(a[7], a[19]); SQRADDAC(a[8], a[18]); SQRADDAC(a[9], a[17]); SQRADDAC(a[10], a[16]); SQRADDAC(a[11], a[15]); SQRADDAC(a[12], a[14]); SQRADDDB; SQRADD(a[13], a[13]);
7617    COMBA_STORE(b[26]);
7618
7619    /* output 27 */
7620    CARRY_FORWARD;
7621    SQRADDSC(a[0], a[27]); SQRADDAC(a[1], a[26]); SQRADDAC(a[2], a[25]); SQRADDAC(a[3], a[24]); SQRADDAC(a[4], a[23]); SQRADDAC(a[5], a[22]); SQRADDAC(a[6], a[21]); SQRADDAC(a[7], a[20]); SQRADDAC(a[8], a[19]); SQRADDAC(a[9], a[18]); SQRADDAC(a[10], a[17]); SQRADDAC(a[11], a[16]); SQRADDAC(a[12], a[15]); SQRADDAC(a[13], a[14]); SQRADDDB;
7622    COMBA_STORE(b[27]);
7623
7624    /* output 28 */
7625    CARRY_FORWARD;
7626    SQRADDSC(a[0], a[28]); SQRADDAC(a[1], a[27]); SQRADDAC(a[2], a[26]); SQRADDAC(a[3], a[25]); SQRADDAC(a[4], a[24]); SQRADDAC(a[5], a[23]); SQRADDAC(a[6], a[22]); SQRADDAC(a[7], a[21]); SQRADDAC(a[8], a[20]); SQRADDAC(a[9], a[19]); SQRADDAC(a[10], a[18]); SQRADDAC(a[11], a[17]); SQRADDAC(a[12], a[16]); SQRADDAC(a[13], a[15]); SQRADDDB; SQRADD(a[14], a[14]);
7627    COMBA_STORE(b[28]);
7628
7629    /* output 29 */
7630    CARRY_FORWARD;
7631    SQRADDSC(a[0], a[29]); SQRADDAC(a[1], a[28]); SQRADDAC(a[2], a[27]); SQRADDAC(a[3], a[26]); SQRADDAC(a[4], a[25]); SQRADDAC(a[5], a[24]); SQRADDAC(a[6], a[23]); SQRADDAC(a[7], a[22]); SQRADDAC(a[8], a[21]); SQRADDAC(a[9], a[20]); SQRADDAC(a[10], a[19]); SQRADDAC(a[11], a[18]); SQRADDAC(a[12], a[17]); SQRADDAC(a[13], a[16]); SQRADDAC(a[14], a[15]); SQRADDDB;
7632    COMBA_STORE(b[29]);
7633
7634    /* output 30 */
7635    CARRY_FORWARD;
7636    SQRADDSC(a[0], a[30]); SQRADDAC(a[1], a[29]); SQRADDAC(a[2], a[28]); SQRADDAC(a[3], a[27]); SQRADDAC(a[4], a[26]); SQRADDAC(a[5], a[25]); SQRADDAC(a[6], a[24]); SQRADDAC(a[7], a[23]); SQRADDAC(a[8], a[22]); SQRADDAC(a[9], a[21]); SQRADDAC(a[10], a[20]); SQRADDAC(a[11], a[19]); SQRADDAC(a[12], a[18]); SQRADDAC(a[13], a[17]); SQRADDAC(a[14], a[16]); SQRADDDB; SQRADD(a[15], a[15]);
7637    COMBA_STORE(b[30]);
7638
7639    /* output 31 */
7640    CARRY_FORWARD;
7641    SQRADDSC(a[0], a[31]); SQRADDAC(a[1], a[30]); SQRADDAC(a[2], a[29]); SQRADDAC(a[3], a[28]); SQRADDAC(a[4], a[27]); SQRADDAC(a[5], a[26]); SQRADDAC(a[6], a[25]); SQRADDAC(a[7], a[24]); SQRADDAC(a[8], a[23]); SQRADDAC(a[9], a[22]); SQRADDAC(a[10], a[21]); SQRADDAC(a[11], a[20]); SQRADDAC(a[12], a[19]); SQRADDAC(a[13], a[18]); SQRADDAC(a[14], a[17]); SQRADDAC(a[15], a[16]); SQRADDDB;
7642    COMBA_STORE(b[31]);
7643
7644    /* output 32 */
7645    CARRY_FORWARD;
7646    SQRADDSC(a[1], a[31]); SQRADDAC(a[2], a[30]); SQRADDAC(a[3], a[29]); SQRADDAC(a[4], a[28]); SQRADDAC(a[5], a[27]); SQRADDAC(a[6], a[26]); SQRADDAC(a[7], a[25]); SQRADDAC(a[8], a[24]); SQRADDAC(a[9], a[23]); SQRADDAC(a[10], a[22]); SQRADDAC(a[11], a[21]); SQRADDAC(a[12], a[20]); SQRADDAC(a[13], a[19]); SQRADDAC(a[14], a[18]); SQRADDAC(a[15], a[17]); SQRADDDB; SQRADD(a[16], a[16]);
7647    COMBA_STORE(b[32]);
7648
7649    /* output 33 */
7650    CARRY_FORWARD;
7651    SQRADDSC(a[2], a[31]); SQRADDAC(a[3], a[30]); SQRADDAC(a[4], a[29]); SQRADDAC(a[5], a[28]); SQRADDAC(a[6], a[27]); SQRADDAC(a[7], a[26]); SQRADDAC(a[8], a[25]); SQRADDAC(a[9], a[24]); SQRADDAC(a[10], a[23]); SQRADDAC(a[11], a[22]); SQRADDAC(a[12], a[21]); SQRADDAC(a[13], a[20]); SQRADDAC(a[14], a[19]); SQRADDAC(a[15], a[18]); SQRADDAC(a[16], a[17]); SQRADDDB;
7652    COMBA_STORE(b[33]);
7653
7654    /* output 34 */
7655    CARRY_FORWARD;
7656    SQRADDSC(a[3], a[31]); SQRADDAC(a[4], a[30]); SQRADDAC(a[5], a[29]); SQRADDAC(a[6], a[28]); SQRADDAC(a[7], a[27]); SQRADDAC(a[8], a[26]); SQRADDAC(a[9], a[25]); SQRADDAC(a[10], a[24]); SQRADDAC(a[11], a[23]); SQRADDAC(a[12], a[22]); SQRADDAC(a[13], a[21]); SQRADDAC(a[14], a[20]); SQRADDAC(a[15], a[19]); SQRADDAC(a[16], a[18]); SQRADDDB; SQRADD(a[17], a[17]);
7657    COMBA_STORE(b[34]);
7658
7659    /* output 35 */
7660    CARRY_FORWARD;
7661    SQRADDSC(a[4], a[31]); SQRADDAC(a[5], a[30]); SQRADDAC(a[6], a[29]); SQRADDAC(a[7], a[28]); SQRADDAC(a[8], a[27]); SQRADDAC(a[9], a[26]); SQRADDAC(a[10], a[25]); SQRADDAC(a[11], a[24]); SQRADDAC(a[12], a[23]); SQRADDAC(a[13], a[22]); SQRADDAC(a[14], a[21]); SQRADDAC(a[15], a[20]); SQRADDAC(a[16], a[19]); SQRADDAC(a[17], a[18]); SQRADDDB;
7662    COMBA_STORE(b[35]);
7663
7664    /* output 36 */
7665    CARRY_FORWARD;
7666    SQRADDSC(a[5], a[31]); SQRADDAC(a[6], a[30]); SQRADDAC(a[7], a[29]); SQRADDAC(a[8], a[28]); SQRADDAC(a[9], a[27]); SQRADDAC(a[10], a[26]); SQRADDAC(a[11], a[25]); SQRADDAC(a[12], a[24]); SQRADDAC(a[13], a[23]); SQRADDAC(a[14], a[22]); SQRADDAC(a[15], a[21]); SQRADDAC(a[16], a[20]); SQRADDAC(a[17], a[19]); SQRADDDB; SQRADD(a[18], a[18]);
7667    COMBA_STORE(b[36]);
7668
7669    /* output 37 */
7670    CARRY_FORWARD;
7671    SQRADDSC(a[6], a[31]); SQRADDAC(a[7], a[30]); SQRADDAC(a[8], a[29]); SQRADDAC(a[9], a[28]); SQRADDAC(a[10], a[27]); SQRADDAC(a[11], a[26]); SQRADDAC(a[12], a[25]); SQRADDAC(a[13], a[24]); SQRADDAC(a[14], a[23]); SQRADDAC(a[15], a[22]); SQRADDAC(a[16], a[21]); SQRADDAC(a[17], a[20]); SQRADDAC(a[18], a[19]); SQRADDDB;
7672    COMBA_STORE(b[37]);
7673
7674    /* output 38 */
7675    CARRY_FORWARD;
7676    SQRADDSC(a[7], a[31]); SQRADDAC(a[8], a[30]); SQRADDAC(a[9], a[29]); SQRADDAC(a[10], a[28]); SQRADDAC(a[11], a[27]); SQRADDAC(a[12], a[26]); SQRADDAC(a[13], a[25]); SQRADDAC(a[14], a[24]); SQRADDAC(a[15], a[23]); SQRADDAC(a[16], a[22]); SQRADDAC(a[17], a[21]); SQRADDAC(a[18], a[20]); SQRADDDB; SQRADD(a[19], a[19]);
7677    COMBA_STORE(b[38]);
7678
7679    /* output 39 */
7680    CARRY_FORWARD;
7681    SQRADDSC(a[8], a[31]); SQRADDAC(a[9], a[30]); SQRADDAC(a[10], a[29]); SQRADDAC(a[11], a[28]); SQRADDAC(a[12], a[27]); SQRADDAC(a[13], a[26]); SQRADDAC(a[14], a[25]); SQRADDAC(a[15], a[24]); SQRADDAC(a[16], a[23]); SQRADDAC(a[17], a[22]); SQRADDAC(a[18], a[21]); SQRADDAC(a[19], a[20]); SQRADDDB;
7682    COMBA_STORE(b[39]);
7683
7684    /* output 40 */
7685    CARRY_FORWARD;
7686    SQRADDSC(a[9], a[31]); SQRADDAC(a[10], a[30]); SQRADDAC(a[11], a[29]); SQRADDAC(a[12], a[28]); SQRADDAC(a[13], a[27]); SQRADDAC(a[14], a[26]); SQRADDAC(a[15], a[25]); SQRADDAC(a[16], a[24]); SQRADDAC(a[17], a[23]); SQRADDAC(a[18], a[22]); SQRADDAC(a[19], a[21]); SQRADDDB; SQRADD(a[20], a[20]);
7687    COMBA_STORE(b[40]);
7688
7689    /* output 41 */
7690    CARRY_FORWARD;
7691    SQRADDSC(a[10], a[31]); SQRADDAC(a[11], a[30]); SQRADDAC(a[12], a[29]); SQRADDAC(a[13], a[28]); SQRADDAC(a[14], a[27]); SQRADDAC(a[15], a[26]); SQRADDAC(a[16], a[25]); SQRADDAC(a[17], a[24]); SQRADDAC(a[18], a[23]); SQRADDAC(a[19], a[22]); SQRADDAC(a[20], a[21]); SQRADDDB;
7692    COMBA_STORE(b[41]);
7693
7694    /* output 42 */
7695    CARRY_FORWARD;
7696    SQRADDSC(a[11], a[31]); SQRADDAC(a[12], a[30]); SQRADDAC(a[13], a[29]); SQRADDAC(a[14], a[28]); SQRADDAC(a[15], a[27]); SQRADDAC(a[16], a[26]); SQRADDAC(a[17], a[25]); SQRADDAC(a[18], a[24]); SQRADDAC(a[19], a[23]); SQRADDAC(a[20], a[22]); SQRADDDB; SQRADD(a[21], a[21]);
7697    COMBA_STORE(b[42]);
7698
7699    /* output 43 */
7700    CARRY_FORWARD;
7701    SQRADDSC(a[12], a[31]); SQRADDAC(a[13], a[30]); SQRADDAC(a[14], a[29]); SQRADDAC(a[15], a[28]); SQRADDAC(a[16], a[27]); SQRADDAC(a[17], a[26]); SQRADDAC(a[18], a[25]); SQRADDAC(a[19], a[24]); SQRADDAC(a[20], a[23]); SQRADDAC(a[21], a[22]); SQRADDDB;
7702    COMBA_STORE(b[43]);
7703
7704    /* output 44 */
7705    CARRY_FORWARD;
7706    SQRADDSC(a[13], a[31]); SQRADDAC(a[14], a[30]); SQRADDAC(a[15], a[29]); SQRADDAC(a[16], a[28]); SQRADDAC(a[17], a[27]); SQRADDAC(a[18], a[26]); SQRADDAC(a[19], a[25]); SQRADDAC(a[20], a[24]); SQRADDAC(a[21], a[23]); SQRADDDB; SQRADD(a[22], a[22]);
7707    COMBA_STORE(b[44]);
7708
7709    /* output 45 */
7710    CARRY_FORWARD;
7711    SQRADDSC(a[14], a[31]); SQRADDAC(a[15], a[30]); SQRADDAC(a[16], a[29]); SQRADDAC(a[17], a[28]); SQRADDAC(a[18], a[27]); SQRADDAC(a[19], a[26]); SQRADDAC(a[20], a[25]); SQRADDAC(a[21], a[24]); SQRADDAC(a[22], a[23]); SQRADDDB;
7712    COMBA_STORE(b[45]);
7713
7714    /* output 46 */
7715    CARRY_FORWARD;
7716    SQRADDSC(a[15], a[31]); SQRADDAC(a[16], a[30]); SQRADDAC(a[17], a[29]); SQRADDAC(a[18], a[28]); SQRADDAC(a[19], a[27]); SQRADDAC(a[20], a[26]); SQRADDAC(a[21], a[25]); SQRADDAC(a[22], a[24]); SQRADDDB; SQRADD(a[23], a[23]);
7717    COMBA_STORE(b[46]);
7718
7719    /* output 47 */
7720    CARRY_FORWARD;
7721    SQRADDSC(a[16], a[31]); SQRADDAC(a[17], a[30]); SQRADDAC(a[18], a[29]); SQRADDAC(a[19], a[28]); SQRADDAC(a[20], a[27]); SQRADDAC(a[21], a[26]); SQRADDAC(a[22], a[25]); SQRADDAC(a[23], a[24]); SQRADDDB;
7722    COMBA_STORE(b[47]);
7723
7724    /* output 48 */
7725    CARRY_FORWARD;
7726    SQRADDSC(a[17], a[31]); SQRADDAC(a[18], a[30]); SQRADDAC(a[19], a[29]); SQRADDAC(a[20], a[28]); SQRADDAC(a[21], a[27]); SQRADDAC(a[22], a[26]); SQRADDAC(a[23], a[25]); SQRADDDB; SQRADD(a[24], a[24]);
7727    COMBA_STORE(b[48]);
7728
7729    /* output 49 */
7730    CARRY_FORWARD;
7731    SQRADDSC(a[18], a[31]); SQRADDAC(a[19], a[30]); SQRADDAC(a[20], a[29]); SQRADDAC(a[21], a[28]); SQRADDAC(a[22], a[27]); SQRADDAC(a[23], a[26]); SQRADDAC(a[24], a[25]); SQRADDDB;
7732    COMBA_STORE(b[49]);
7733
7734    /* output 50 */
7735    CARRY_FORWARD;
7736    SQRADDSC(a[19], a[31]); SQRADDAC(a[20], a[30]); SQRADDAC(a[21], a[29]); SQRADDAC(a[22], a[28]); SQRADDAC(a[23], a[27]); SQRADDAC(a[24], a[26]); SQRADDDB; SQRADD(a[25], a[25]);
7737    COMBA_STORE(b[50]);
7738
7739    /* output 51 */
7740    CARRY_FORWARD;
7741    SQRADDSC(a[20], a[31]); SQRADDAC(a[21], a[30]); SQRADDAC(a[22], a[29]); SQRADDAC(a[23], a[28]); SQRADDAC(a[24], a[27]); SQRADDAC(a[25], a[26]); SQRADDDB;
7742    COMBA_STORE(b[51]);
7743
7744    /* output 52 */
7745    CARRY_FORWARD;
7746    SQRADDSC(a[21], a[31]); SQRADDAC(a[22], a[30]); SQRADDAC(a[23], a[29]); SQRADDAC(a[24], a[28]); SQRADDAC(a[25], a[27]); SQRADDDB; SQRADD(a[26], a[26]);
7747    COMBA_STORE(b[52]);
7748
7749    /* output 53 */
7750    CARRY_FORWARD;
7751    SQRADDSC(a[22], a[31]); SQRADDAC(a[23], a[30]); SQRADDAC(a[24], a[29]); SQRADDAC(a[25], a[28]); SQRADDAC(a[26], a[27]); SQRADDDB;
7752    COMBA_STORE(b[53]);
7753
7754    /* output 54 */
7755    CARRY_FORWARD;
7756    SQRADDSC(a[23], a[31]); SQRADDAC(a[24], a[30]); SQRADDAC(a[25], a[29]); SQRADDAC(a[26], a[28]); SQRADDDB; SQRADD(a[27], a[27]);
7757    COMBA_STORE(b[54]);
7758
7759    /* output 55 */
7760    CARRY_FORWARD;
7761    SQRADDSC(a[24], a[31]); SQRADDAC(a[25], a[30]); SQRADDAC(a[26], a[29]); SQRADDAC(a[27], a[28]); SQRADDDB;
7762    COMBA_STORE(b[55]);
7763
7764    /* output 56 */
7765    CARRY_FORWARD;
7766    SQRADDSC(a[25], a[31]); SQRADDAC(a[26], a[30]); SQRADDAC(a[27], a[29]); SQRADDDB; SQRADD(a[28], a[28]);
7767    COMBA_STORE(b[56]);
7768
7769    /* output 57 */
7770    CARRY_FORWARD;
7771    SQRADDSC(a[26], a[31]); SQRADDAC(a[27], a[30]); SQRADDAC(a[28], a[29]); SQRADDDB;
7772    COMBA_STORE(b[57]);
7773
7774    /* output 58 */
7775    CARRY_FORWARD;
7776    SQRADD2(a[27], a[31]); SQRADD2(a[28], a[30]); SQRADD(a[29], a[29]);
7777    COMBA_STORE(b[58]);
7778
7779    /* output 59 */
7780    CARRY_FORWARD;
7781    SQRADD2(a[28], a[31]); SQRADD2(a[29], a[30]);
7782    COMBA_STORE(b[59]);
7783
7784    /* output 60 */
7785    CARRY_FORWARD;
7786    SQRADD2(a[29], a[31]); SQRADD(a[30], a[30]);
7787    COMBA_STORE(b[60]);
7788
7789    /* output 61 */
7790    CARRY_FORWARD;
7791    SQRADD2(a[30], a[31]);
7792    COMBA_STORE(b[61]);
7793
7794    /* output 62 */
7795    CARRY_FORWARD;
7796    SQRADD(a[31], a[31]);
7797    COMBA_STORE(b[62]);
7798    COMBA_STORE2(b[63]);
7799    COMBA_FINI;
7800
7801    B->used = 64;
7802    B->sign = TFM_FP_ZPOS;
7803    memcpy(B->dp, b, 64 * sizeof(tfm_fp_digit));
7804    tfm_fp_clamp(B);
7805 }
7806 #endif
7807
7808 #define TFM_DEFINES
7809
7810 #ifdef TFM_SQR48
7811 void tfm_fp_sqr_comba48(tfm_fp_int *A, tfm_fp_int *B)
7812 {
7813    tfm_fp_digit *a, b[96], c0, c1, c2, sc0, sc1, sc2;
7814 #ifdef TFM_ISO
7815    tfm_fp_word tt;
7816 #endif
7817
7818    SILC_LOG_DEBUG(("Start"));
7819    a = A->dp;
7820    COMBA_START;
7821
7822    /* clear carries */
7823    CLEAR_CARRY;
7824
7825    /* output 0 */
7826    SQRADD(a[0],a[0]);
7827    COMBA_STORE(b[0]);
7828
7829    /* output 1 */
7830    CARRY_FORWARD;
7831    SQRADD2(a[0], a[1]);
7832    COMBA_STORE(b[1]);
7833
7834    /* output 2 */
7835    CARRY_FORWARD;
7836    SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]);
7837    COMBA_STORE(b[2]);
7838
7839    /* output 3 */
7840    CARRY_FORWARD;
7841    SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]);
7842    COMBA_STORE(b[3]);
7843
7844    /* output 4 */
7845    CARRY_FORWARD;
7846    SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]);
7847    COMBA_STORE(b[4]);
7848
7849    /* output 5 */
7850    CARRY_FORWARD;
7851    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
7852    COMBA_STORE(b[5]);
7853
7854    /* output 6 */
7855    CARRY_FORWARD;
7856    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
7857    COMBA_STORE(b[6]);
7858
7859    /* output 7 */
7860    CARRY_FORWARD;
7861    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
7862    COMBA_STORE(b[7]);
7863
7864    /* output 8 */
7865    CARRY_FORWARD;
7866    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
7867    COMBA_STORE(b[8]);
7868
7869    /* output 9 */
7870    CARRY_FORWARD;
7871    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
7872    COMBA_STORE(b[9]);
7873
7874    /* output 10 */
7875    CARRY_FORWARD;
7876    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]);
7877    COMBA_STORE(b[10]);
7878
7879    /* output 11 */
7880    CARRY_FORWARD;
7881    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB;
7882    COMBA_STORE(b[11]);
7883
7884    /* output 12 */
7885    CARRY_FORWARD;
7886    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]);
7887    COMBA_STORE(b[12]);
7888
7889    /* output 13 */
7890    CARRY_FORWARD;
7891    SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB;
7892    COMBA_STORE(b[13]);
7893
7894    /* output 14 */
7895    CARRY_FORWARD;
7896    SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]);
7897    COMBA_STORE(b[14]);
7898
7899    /* output 15 */
7900    CARRY_FORWARD;
7901    SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB;
7902    COMBA_STORE(b[15]);
7903
7904    /* output 16 */
7905    CARRY_FORWARD;
7906    SQRADDSC(a[0], a[16]); SQRADDAC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]);
7907    COMBA_STORE(b[16]);
7908
7909    /* output 17 */
7910    CARRY_FORWARD;
7911    SQRADDSC(a[0], a[17]); SQRADDAC(a[1], a[16]); SQRADDAC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB;
7912    COMBA_STORE(b[17]);
7913
7914    /* output 18 */
7915    CARRY_FORWARD;
7916    SQRADDSC(a[0], a[18]); SQRADDAC(a[1], a[17]); SQRADDAC(a[2], a[16]); SQRADDAC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]);
7917    COMBA_STORE(b[18]);
7918
7919    /* output 19 */
7920    CARRY_FORWARD;
7921    SQRADDSC(a[0], a[19]); SQRADDAC(a[1], a[18]); SQRADDAC(a[2], a[17]); SQRADDAC(a[3], a[16]); SQRADDAC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB;
7922    COMBA_STORE(b[19]);
7923
7924    /* output 20 */
7925    CARRY_FORWARD;
7926    SQRADDSC(a[0], a[20]); SQRADDAC(a[1], a[19]); SQRADDAC(a[2], a[18]); SQRADDAC(a[3], a[17]); SQRADDAC(a[4], a[16]); SQRADDAC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]);
7927    COMBA_STORE(b[20]);
7928
7929    /* output 21 */
7930    CARRY_FORWARD;
7931    SQRADDSC(a[0], a[21]); SQRADDAC(a[1], a[20]); SQRADDAC(a[2], a[19]); SQRADDAC(a[3], a[18]); SQRADDAC(a[4], a[17]); SQRADDAC(a[5], a[16]); SQRADDAC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB;
7932    COMBA_STORE(b[21]);
7933
7934    /* output 22 */
7935    CARRY_FORWARD;
7936    SQRADDSC(a[0], a[22]); SQRADDAC(a[1], a[21]); SQRADDAC(a[2], a[20]); SQRADDAC(a[3], a[19]); SQRADDAC(a[4], a[18]); SQRADDAC(a[5], a[17]); SQRADDAC(a[6], a[16]); SQRADDAC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]);
7937    COMBA_STORE(b[22]);
7938
7939    /* output 23 */
7940    CARRY_FORWARD;
7941    SQRADDSC(a[0], a[23]); SQRADDAC(a[1], a[22]); SQRADDAC(a[2], a[21]); SQRADDAC(a[3], a[20]); SQRADDAC(a[4], a[19]); SQRADDAC(a[5], a[18]); SQRADDAC(a[6], a[17]); SQRADDAC(a[7], a[16]); SQRADDAC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB;
7942    COMBA_STORE(b[23]);
7943
7944    /* output 24 */
7945    CARRY_FORWARD;
7946    SQRADDSC(a[0], a[24]); SQRADDAC(a[1], a[23]); SQRADDAC(a[2], a[22]); SQRADDAC(a[3], a[21]); SQRADDAC(a[4], a[20]); SQRADDAC(a[5], a[19]); SQRADDAC(a[6], a[18]); SQRADDAC(a[7], a[17]); SQRADDAC(a[8], a[16]); SQRADDAC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]);
7947    COMBA_STORE(b[24]);
7948
7949    /* output 25 */
7950    CARRY_FORWARD;
7951    SQRADDSC(a[0], a[25]); SQRADDAC(a[1], a[24]); SQRADDAC(a[2], a[23]); SQRADDAC(a[3], a[22]); SQRADDAC(a[4], a[21]); SQRADDAC(a[5], a[20]); SQRADDAC(a[6], a[19]); SQRADDAC(a[7], a[18]); SQRADDAC(a[8], a[17]); SQRADDAC(a[9], a[16]); SQRADDAC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB;
7952    COMBA_STORE(b[25]);
7953
7954    /* output 26 */
7955    CARRY_FORWARD;
7956    SQRADDSC(a[0], a[26]); SQRADDAC(a[1], a[25]); SQRADDAC(a[2], a[24]); SQRADDAC(a[3], a[23]); SQRADDAC(a[4], a[22]); SQRADDAC(a[5], a[21]); SQRADDAC(a[6], a[20]); SQRADDAC(a[7], a[19]); SQRADDAC(a[8], a[18]); SQRADDAC(a[9], a[17]); SQRADDAC(a[10], a[16]); SQRADDAC(a[11], a[15]); SQRADDAC(a[12], a[14]); SQRADDDB; SQRADD(a[13], a[13]);
7957    COMBA_STORE(b[26]);
7958
7959    /* output 27 */
7960    CARRY_FORWARD;
7961    SQRADDSC(a[0], a[27]); SQRADDAC(a[1], a[26]); SQRADDAC(a[2], a[25]); SQRADDAC(a[3], a[24]); SQRADDAC(a[4], a[23]); SQRADDAC(a[5], a[22]); SQRADDAC(a[6], a[21]); SQRADDAC(a[7], a[20]); SQRADDAC(a[8], a[19]); SQRADDAC(a[9], a[18]); SQRADDAC(a[10], a[17]); SQRADDAC(a[11], a[16]); SQRADDAC(a[12], a[15]); SQRADDAC(a[13], a[14]); SQRADDDB;
7962    COMBA_STORE(b[27]);
7963
7964    /* output 28 */
7965    CARRY_FORWARD;
7966    SQRADDSC(a[0], a[28]); SQRADDAC(a[1], a[27]); SQRADDAC(a[2], a[26]); SQRADDAC(a[3], a[25]); SQRADDAC(a[4], a[24]); SQRADDAC(a[5], a[23]); SQRADDAC(a[6], a[22]); SQRADDAC(a[7], a[21]); SQRADDAC(a[8], a[20]); SQRADDAC(a[9], a[19]); SQRADDAC(a[10], a[18]); SQRADDAC(a[11], a[17]); SQRADDAC(a[12], a[16]); SQRADDAC(a[13], a[15]); SQRADDDB; SQRADD(a[14], a[14]);
7967    COMBA_STORE(b[28]);
7968
7969    /* output 29 */
7970    CARRY_FORWARD;
7971    SQRADDSC(a[0], a[29]); SQRADDAC(a[1], a[28]); SQRADDAC(a[2], a[27]); SQRADDAC(a[3], a[26]); SQRADDAC(a[4], a[25]); SQRADDAC(a[5], a[24]); SQRADDAC(a[6], a[23]); SQRADDAC(a[7], a[22]); SQRADDAC(a[8], a[21]); SQRADDAC(a[9], a[20]); SQRADDAC(a[10], a[19]); SQRADDAC(a[11], a[18]); SQRADDAC(a[12], a[17]); SQRADDAC(a[13], a[16]); SQRADDAC(a[14], a[15]); SQRADDDB;
7972    COMBA_STORE(b[29]);
7973
7974    /* output 30 */
7975    CARRY_FORWARD;
7976    SQRADDSC(a[0], a[30]); SQRADDAC(a[1], a[29]); SQRADDAC(a[2], a[28]); SQRADDAC(a[3], a[27]); SQRADDAC(a[4], a[26]); SQRADDAC(a[5], a[25]); SQRADDAC(a[6], a[24]); SQRADDAC(a[7], a[23]); SQRADDAC(a[8], a[22]); SQRADDAC(a[9], a[21]); SQRADDAC(a[10], a[20]); SQRADDAC(a[11], a[19]); SQRADDAC(a[12], a[18]); SQRADDAC(a[13], a[17]); SQRADDAC(a[14], a[16]); SQRADDDB; SQRADD(a[15], a[15]);
7977    COMBA_STORE(b[30]);
7978
7979    /* output 31 */
7980    CARRY_FORWARD;
7981    SQRADDSC(a[0], a[31]); SQRADDAC(a[1], a[30]); SQRADDAC(a[2], a[29]); SQRADDAC(a[3], a[28]); SQRADDAC(a[4], a[27]); SQRADDAC(a[5], a[26]); SQRADDAC(a[6], a[25]); SQRADDAC(a[7], a[24]); SQRADDAC(a[8], a[23]); SQRADDAC(a[9], a[22]); SQRADDAC(a[10], a[21]); SQRADDAC(a[11], a[20]); SQRADDAC(a[12], a[19]); SQRADDAC(a[13], a[18]); SQRADDAC(a[14], a[17]); SQRADDAC(a[15], a[16]); SQRADDDB;
7982    COMBA_STORE(b[31]);
7983
7984    /* output 32 */
7985    CARRY_FORWARD;
7986    SQRADDSC(a[0], a[32]); SQRADDAC(a[1], a[31]); SQRADDAC(a[2], a[30]); SQRADDAC(a[3], a[29]); SQRADDAC(a[4], a[28]); SQRADDAC(a[5], a[27]); SQRADDAC(a[6], a[26]); SQRADDAC(a[7], a[25]); SQRADDAC(a[8], a[24]); SQRADDAC(a[9], a[23]); SQRADDAC(a[10], a[22]); SQRADDAC(a[11], a[21]); SQRADDAC(a[12], a[20]); SQRADDAC(a[13], a[19]); SQRADDAC(a[14], a[18]); SQRADDAC(a[15], a[17]); SQRADDDB; SQRADD(a[16], a[16]);
7987    COMBA_STORE(b[32]);
7988
7989    /* output 33 */
7990    CARRY_FORWARD;
7991    SQRADDSC(a[0], a[33]); SQRADDAC(a[1], a[32]); SQRADDAC(a[2], a[31]); SQRADDAC(a[3], a[30]); SQRADDAC(a[4], a[29]); SQRADDAC(a[5], a[28]); SQRADDAC(a[6], a[27]); SQRADDAC(a[7], a[26]); SQRADDAC(a[8], a[25]); SQRADDAC(a[9], a[24]); SQRADDAC(a[10], a[23]); SQRADDAC(a[11], a[22]); SQRADDAC(a[12], a[21]); SQRADDAC(a[13], a[20]); SQRADDAC(a[14], a[19]); SQRADDAC(a[15], a[18]); SQRADDAC(a[16], a[17]); SQRADDDB;
7992    COMBA_STORE(b[33]);
7993
7994    /* output 34 */
7995    CARRY_FORWARD;
7996    SQRADDSC(a[0], a[34]); SQRADDAC(a[1], a[33]); SQRADDAC(a[2], a[32]); SQRADDAC(a[3], a[31]); SQRADDAC(a[4], a[30]); SQRADDAC(a[5], a[29]); SQRADDAC(a[6], a[28]); SQRADDAC(a[7], a[27]); SQRADDAC(a[8], a[26]); SQRADDAC(a[9], a[25]); SQRADDAC(a[10], a[24]); SQRADDAC(a[11], a[23]); SQRADDAC(a[12], a[22]); SQRADDAC(a[13], a[21]); SQRADDAC(a[14], a[20]); SQRADDAC(a[15], a[19]); SQRADDAC(a[16], a[18]); SQRADDDB; SQRADD(a[17], a[17]);
7997    COMBA_STORE(b[34]);
7998
7999    /* output 35 */
8000    CARRY_FORWARD;
8001    SQRADDSC(a[0], a[35]); SQRADDAC(a[1], a[34]); SQRADDAC(a[2], a[33]); SQRADDAC(a[3], a[32]); SQRADDAC(a[4], a[31]); SQRADDAC(a[5], a[30]); SQRADDAC(a[6], a[29]); SQRADDAC(a[7], a[28]); SQRADDAC(a[8], a[27]); SQRADDAC(a[9], a[26]); SQRADDAC(a[10], a[25]); SQRADDAC(a[11], a[24]); SQRADDAC(a[12], a[23]); SQRADDAC(a[13], a[22]); SQRADDAC(a[14], a[21]); SQRADDAC(a[15], a[20]); SQRADDAC(a[16], a[19]); SQRADDAC(a[17], a[18]); SQRADDDB;
8002    COMBA_STORE(b[35]);
8003
8004    /* output 36 */
8005    CARRY_FORWARD;
8006    SQRADDSC(a[0], a[36]); SQRADDAC(a[1], a[35]); SQRADDAC(a[2], a[34]); SQRADDAC(a[3], a[33]); SQRADDAC(a[4], a[32]); SQRADDAC(a[5], a[31]); SQRADDAC(a[6], a[30]); SQRADDAC(a[7], a[29]); SQRADDAC(a[8], a[28]); SQRADDAC(a[9], a[27]); SQRADDAC(a[10], a[26]); SQRADDAC(a[11], a[25]); SQRADDAC(a[12], a[24]); SQRADDAC(a[13], a[23]); SQRADDAC(a[14], a[22]); SQRADDAC(a[15], a[21]); SQRADDAC(a[16], a[20]); SQRADDAC(a[17], a[19]); SQRADDDB; SQRADD(a[18], a[18]);
8007    COMBA_STORE(b[36]);
8008
8009    /* output 37 */
8010    CARRY_FORWARD;
8011    SQRADDSC(a[0], a[37]); SQRADDAC(a[1], a[36]); SQRADDAC(a[2], a[35]); SQRADDAC(a[3], a[34]); SQRADDAC(a[4], a[33]); SQRADDAC(a[5], a[32]); SQRADDAC(a[6], a[31]); SQRADDAC(a[7], a[30]); SQRADDAC(a[8], a[29]); SQRADDAC(a[9], a[28]); SQRADDAC(a[10], a[27]); SQRADDAC(a[11], a[26]); SQRADDAC(a[12], a[25]); SQRADDAC(a[13], a[24]); SQRADDAC(a[14], a[23]); SQRADDAC(a[15], a[22]); SQRADDAC(a[16], a[21]); SQRADDAC(a[17], a[20]); SQRADDAC(a[18], a[19]); SQRADDDB;
8012    COMBA_STORE(b[37]);
8013
8014    /* output 38 */
8015    CARRY_FORWARD;
8016    SQRADDSC(a[0], a[38]); SQRADDAC(a[1], a[37]); SQRADDAC(a[2], a[36]); SQRADDAC(a[3], a[35]); SQRADDAC(a[4], a[34]); SQRADDAC(a[5], a[33]); SQRADDAC(a[6], a[32]); SQRADDAC(a[7], a[31]); SQRADDAC(a[8], a[30]); SQRADDAC(a[9], a[29]); SQRADDAC(a[10], a[28]); SQRADDAC(a[11], a[27]); SQRADDAC(a[12], a[26]); SQRADDAC(a[13], a[25]); SQRADDAC(a[14], a[24]); SQRADDAC(a[15], a[23]); SQRADDAC(a[16], a[22]); SQRADDAC(a[17], a[21]); SQRADDAC(a[18], a[20]); SQRADDDB; SQRADD(a[19], a[19]);
8017    COMBA_STORE(b[38]);
8018
8019    /* output 39 */
8020    CARRY_FORWARD;
8021    SQRADDSC(a[0], a[39]); SQRADDAC(a[1], a[38]); SQRADDAC(a[2], a[37]); SQRADDAC(a[3], a[36]); SQRADDAC(a[4], a[35]); SQRADDAC(a[5], a[34]); SQRADDAC(a[6], a[33]); SQRADDAC(a[7], a[32]); SQRADDAC(a[8], a[31]); SQRADDAC(a[9], a[30]); SQRADDAC(a[10], a[29]); SQRADDAC(a[11], a[28]); SQRADDAC(a[12], a[27]); SQRADDAC(a[13], a[26]); SQRADDAC(a[14], a[25]); SQRADDAC(a[15], a[24]); SQRADDAC(a[16], a[23]); SQRADDAC(a[17], a[22]); SQRADDAC(a[18], a[21]); SQRADDAC(a[19], a[20]); SQRADDDB;
8022    COMBA_STORE(b[39]);
8023
8024    /* output 40 */
8025    CARRY_FORWARD;
8026    SQRADDSC(a[0], a[40]); SQRADDAC(a[1], a[39]); SQRADDAC(a[2], a[38]); SQRADDAC(a[3], a[37]); SQRADDAC(a[4], a[36]); SQRADDAC(a[5], a[35]); SQRADDAC(a[6], a[34]); SQRADDAC(a[7], a[33]); SQRADDAC(a[8], a[32]); SQRADDAC(a[9], a[31]); SQRADDAC(a[10], a[30]); SQRADDAC(a[11], a[29]); SQRADDAC(a[12], a[28]); SQRADDAC(a[13], a[27]); SQRADDAC(a[14], a[26]); SQRADDAC(a[15], a[25]); SQRADDAC(a[16], a[24]); SQRADDAC(a[17], a[23]); SQRADDAC(a[18], a[22]); SQRADDAC(a[19], a[21]); SQRADDDB; SQRADD(a[20], a[20]);
8027    COMBA_STORE(b[40]);
8028
8029    /* output 41 */
8030    CARRY_FORWARD;
8031    SQRADDSC(a[0], a[41]); SQRADDAC(a[1], a[40]); SQRADDAC(a[2], a[39]); SQRADDAC(a[3], a[38]); SQRADDAC(a[4], a[37]); SQRADDAC(a[5], a[36]); SQRADDAC(a[6], a[35]); SQRADDAC(a[7], a[34]); SQRADDAC(a[8], a[33]); SQRADDAC(a[9], a[32]); SQRADDAC(a[10], a[31]); SQRADDAC(a[11], a[30]); SQRADDAC(a[12], a[29]); SQRADDAC(a[13], a[28]); SQRADDAC(a[14], a[27]); SQRADDAC(a[15], a[26]); SQRADDAC(a[16], a[25]); SQRADDAC(a[17], a[24]); SQRADDAC(a[18], a[23]); SQRADDAC(a[19], a[22]); SQRADDAC(a[20], a[21]); SQRADDDB;
8032    COMBA_STORE(b[41]);
8033
8034    /* output 42 */
8035    CARRY_FORWARD;
8036    SQRADDSC(a[0], a[42]); SQRADDAC(a[1], a[41]); SQRADDAC(a[2], a[40]); SQRADDAC(a[3], a[39]); SQRADDAC(a[4], a[38]); SQRADDAC(a[5], a[37]); SQRADDAC(a[6], a[36]); SQRADDAC(a[7], a[35]); SQRADDAC(a[8], a[34]); SQRADDAC(a[9], a[33]); SQRADDAC(a[10], a[32]); SQRADDAC(a[11], a[31]); SQRADDAC(a[12], a[30]); SQRADDAC(a[13], a[29]); SQRADDAC(a[14], a[28]); SQRADDAC(a[15], a[27]); SQRADDAC(a[16], a[26]); SQRADDAC(a[17], a[25]); SQRADDAC(a[18], a[24]); SQRADDAC(a[19], a[23]); SQRADDAC(a[20], a[22]); SQRADDDB; SQRADD(a[21], a[21]);
8037    COMBA_STORE(b[42]);
8038
8039    /* output 43 */
8040    CARRY_FORWARD;
8041    SQRADDSC(a[0], a[43]); SQRADDAC(a[1], a[42]); SQRADDAC(a[2], a[41]); SQRADDAC(a[3], a[40]); SQRADDAC(a[4], a[39]); SQRADDAC(a[5], a[38]); SQRADDAC(a[6], a[37]); SQRADDAC(a[7], a[36]); SQRADDAC(a[8], a[35]); SQRADDAC(a[9], a[34]); SQRADDAC(a[10], a[33]); SQRADDAC(a[11], a[32]); SQRADDAC(a[12], a[31]); SQRADDAC(a[13], a[30]); SQRADDAC(a[14], a[29]); SQRADDAC(a[15], a[28]); SQRADDAC(a[16], a[27]); SQRADDAC(a[17], a[26]); SQRADDAC(a[18], a[25]); SQRADDAC(a[19], a[24]); SQRADDAC(a[20], a[23]); SQRADDAC(a[21], a[22]); SQRADDDB;
8042    COMBA_STORE(b[43]);
8043
8044    /* output 44 */
8045    CARRY_FORWARD;
8046    SQRADDSC(a[0], a[44]); SQRADDAC(a[1], a[43]); SQRADDAC(a[2], a[42]); SQRADDAC(a[3], a[41]); SQRADDAC(a[4], a[40]); SQRADDAC(a[5], a[39]); SQRADDAC(a[6], a[38]); SQRADDAC(a[7], a[37]); SQRADDAC(a[8], a[36]); SQRADDAC(a[9], a[35]); SQRADDAC(a[10], a[34]); SQRADDAC(a[11], a[33]); SQRADDAC(a[12], a[32]); SQRADDAC(a[13], a[31]); SQRADDAC(a[14], a[30]); SQRADDAC(a[15], a[29]); SQRADDAC(a[16], a[28]); SQRADDAC(a[17], a[27]); SQRADDAC(a[18], a[26]); SQRADDAC(a[19], a[25]); SQRADDAC(a[20], a[24]); SQRADDAC(a[21], a[23]); SQRADDDB; SQRADD(a[22], a[22]);
8047    COMBA_STORE(b[44]);
8048
8049    /* output 45 */
8050    CARRY_FORWARD;
8051    SQRADDSC(a[0], a[45]); SQRADDAC(a[1], a[44]); SQRADDAC(a[2], a[43]); SQRADDAC(a[3], a[42]); SQRADDAC(a[4], a[41]); SQRADDAC(a[5], a[40]); SQRADDAC(a[6], a[39]); SQRADDAC(a[7], a[38]); SQRADDAC(a[8], a[37]); SQRADDAC(a[9], a[36]); SQRADDAC(a[10], a[35]); SQRADDAC(a[11], a[34]); SQRADDAC(a[12], a[33]); SQRADDAC(a[13], a[32]); SQRADDAC(a[14], a[31]); SQRADDAC(a[15], a[30]); SQRADDAC(a[16], a[29]); SQRADDAC(a[17], a[28]); SQRADDAC(a[18], a[27]); SQRADDAC(a[19], a[26]); SQRADDAC(a[20], a[25]); SQRADDAC(a[21], a[24]); SQRADDAC(a[22], a[23]); SQRADDDB;
8052    COMBA_STORE(b[45]);
8053
8054    /* output 46 */
8055    CARRY_FORWARD;
8056    SQRADDSC(a[0], a[46]); SQRADDAC(a[1], a[45]); SQRADDAC(a[2], a[44]); SQRADDAC(a[3], a[43]); SQRADDAC(a[4], a[42]); SQRADDAC(a[5], a[41]); SQRADDAC(a[6], a[40]); SQRADDAC(a[7], a[39]); SQRADDAC(a[8], a[38]); SQRADDAC(a[9], a[37]); SQRADDAC(a[10], a[36]); SQRADDAC(a[11], a[35]); SQRADDAC(a[12], a[34]); SQRADDAC(a[13], a[33]); SQRADDAC(a[14], a[32]); SQRADDAC(a[15], a[31]); SQRADDAC(a[16], a[30]); SQRADDAC(a[17], a[29]); SQRADDAC(a[18], a[28]); SQRADDAC(a[19], a[27]); SQRADDAC(a[20], a[26]); SQRADDAC(a[21], a[25]); SQRADDAC(a[22], a[24]); SQRADDDB; SQRADD(a[23], a[23]);
8057    COMBA_STORE(b[46]);
8058
8059    /* output 47 */
8060    CARRY_FORWARD;
8061    SQRADDSC(a[0], a[47]); SQRADDAC(a[1], a[46]); SQRADDAC(a[2], a[45]); SQRADDAC(a[3], a[44]); SQRADDAC(a[4], a[43]); SQRADDAC(a[5], a[42]); SQRADDAC(a[6], a[41]); SQRADDAC(a[7], a[40]); SQRADDAC(a[8], a[39]); SQRADDAC(a[9], a[38]); SQRADDAC(a[10], a[37]); SQRADDAC(a[11], a[36]); SQRADDAC(a[12], a[35]); SQRADDAC(a[13], a[34]); SQRADDAC(a[14], a[33]); SQRADDAC(a[15], a[32]); SQRADDAC(a[16], a[31]); SQRADDAC(a[17], a[30]); SQRADDAC(a[18], a[29]); SQRADDAC(a[19], a[28]); SQRADDAC(a[20], a[27]); SQRADDAC(a[21], a[26]); SQRADDAC(a[22], a[25]); SQRADDAC(a[23], a[24]); SQRADDDB;
8062    COMBA_STORE(b[47]);
8063
8064    /* output 48 */
8065    CARRY_FORWARD;
8066    SQRADDSC(a[1], a[47]); SQRADDAC(a[2], a[46]); SQRADDAC(a[3], a[45]); SQRADDAC(a[4], a[44]); SQRADDAC(a[5], a[43]); SQRADDAC(a[6], a[42]); SQRADDAC(a[7], a[41]); SQRADDAC(a[8], a[40]); SQRADDAC(a[9], a[39]); SQRADDAC(a[10], a[38]); SQRADDAC(a[11], a[37]); SQRADDAC(a[12], a[36]); SQRADDAC(a[13], a[35]); SQRADDAC(a[14], a[34]); SQRADDAC(a[15], a[33]); SQRADDAC(a[16], a[32]); SQRADDAC(a[17], a[31]); SQRADDAC(a[18], a[30]); SQRADDAC(a[19], a[29]); SQRADDAC(a[20], a[28]); SQRADDAC(a[21], a[27]); SQRADDAC(a[22], a[26]); SQRADDAC(a[23], a[25]); SQRADDDB; SQRADD(a[24], a[24]);
8067    COMBA_STORE(b[48]);
8068
8069    /* output 49 */
8070    CARRY_FORWARD;
8071    SQRADDSC(a[2], a[47]); SQRADDAC(a[3], a[46]); SQRADDAC(a[4], a[45]); SQRADDAC(a[5], a[44]); SQRADDAC(a[6], a[43]); SQRADDAC(a[7], a[42]); SQRADDAC(a[8], a[41]); SQRADDAC(a[9], a[40]); SQRADDAC(a[10], a[39]); SQRADDAC(a[11], a[38]); SQRADDAC(a[12], a[37]); SQRADDAC(a[13], a[36]); SQRADDAC(a[14], a[35]); SQRADDAC(a[15], a[34]); SQRADDAC(a[16], a[33]); SQRADDAC(a[17], a[32]); SQRADDAC(a[18], a[31]); SQRADDAC(a[19], a[30]); SQRADDAC(a[20], a[29]); SQRADDAC(a[21], a[28]); SQRADDAC(a[22], a[27]); SQRADDAC(a[23], a[26]); SQRADDAC(a[24], a[25]); SQRADDDB;
8072    COMBA_STORE(b[49]);
8073
8074    /* output 50 */
8075    CARRY_FORWARD;
8076    SQRADDSC(a[3], a[47]); SQRADDAC(a[4], a[46]); SQRADDAC(a[5], a[45]); SQRADDAC(a[6], a[44]); SQRADDAC(a[7], a[43]); SQRADDAC(a[8], a[42]); SQRADDAC(a[9], a[41]); SQRADDAC(a[10], a[40]); SQRADDAC(a[11], a[39]); SQRADDAC(a[12], a[38]); SQRADDAC(a[13], a[37]); SQRADDAC(a[14], a[36]); SQRADDAC(a[15], a[35]); SQRADDAC(a[16], a[34]); SQRADDAC(a[17], a[33]); SQRADDAC(a[18], a[32]); SQRADDAC(a[19], a[31]); SQRADDAC(a[20], a[30]); SQRADDAC(a[21], a[29]); SQRADDAC(a[22], a[28]); SQRADDAC(a[23], a[27]); SQRADDAC(a[24], a[26]); SQRADDDB; SQRADD(a[25], a[25]);
8077    COMBA_STORE(b[50]);
8078
8079    /* output 51 */
8080    CARRY_FORWARD;
8081    SQRADDSC(a[4], a[47]); SQRADDAC(a[5], a[46]); SQRADDAC(a[6], a[45]); SQRADDAC(a[7], a[44]); SQRADDAC(a[8], a[43]); SQRADDAC(a[9], a[42]); SQRADDAC(a[10], a[41]); SQRADDAC(a[11], a[40]); SQRADDAC(a[12], a[39]); SQRADDAC(a[13], a[38]); SQRADDAC(a[14], a[37]); SQRADDAC(a[15], a[36]); SQRADDAC(a[16], a[35]); SQRADDAC(a[17], a[34]); SQRADDAC(a[18], a[33]); SQRADDAC(a[19], a[32]); SQRADDAC(a[20], a[31]); SQRADDAC(a[21], a[30]); SQRADDAC(a[22], a[29]); SQRADDAC(a[23], a[28]); SQRADDAC(a[24], a[27]); SQRADDAC(a[25], a[26]); SQRADDDB;
8082    COMBA_STORE(b[51]);
8083
8084    /* output 52 */
8085    CARRY_FORWARD;
8086    SQRADDSC(a[5], a[47]); SQRADDAC(a[6], a[46]); SQRADDAC(a[7], a[45]); SQRADDAC(a[8], a[44]); SQRADDAC(a[9], a[43]); SQRADDAC(a[10], a[42]); SQRADDAC(a[11], a[41]); SQRADDAC(a[12], a[40]); SQRADDAC(a[13], a[39]); SQRADDAC(a[14], a[38]); SQRADDAC(a[15], a[37]); SQRADDAC(a[16], a[36]); SQRADDAC(a[17], a[35]); SQRADDAC(a[18], a[34]); SQRADDAC(a[19], a[33]); SQRADDAC(a[20], a[32]); SQRADDAC(a[21], a[31]); SQRADDAC(a[22], a[30]); SQRADDAC(a[23], a[29]); SQRADDAC(a[24], a[28]); SQRADDAC(a[25], a[27]); SQRADDDB; SQRADD(a[26], a[26]);
8087    COMBA_STORE(b[52]);
8088
8089    /* output 53 */
8090    CARRY_FORWARD;
8091    SQRADDSC(a[6], a[47]); SQRADDAC(a[7], a[46]); SQRADDAC(a[8], a[45]); SQRADDAC(a[9], a[44]); SQRADDAC(a[10], a[43]); SQRADDAC(a[11], a[42]); SQRADDAC(a[12], a[41]); SQRADDAC(a[13], a[40]); SQRADDAC(a[14], a[39]); SQRADDAC(a[15], a[38]); SQRADDAC(a[16], a[37]); SQRADDAC(a[17], a[36]); SQRADDAC(a[18], a[35]); SQRADDAC(a[19], a[34]); SQRADDAC(a[20], a[33]); SQRADDAC(a[21], a[32]); SQRADDAC(a[22], a[31]); SQRADDAC(a[23], a[30]); SQRADDAC(a[24], a[29]); SQRADDAC(a[25], a[28]); SQRADDAC(a[26], a[27]); SQRADDDB;
8092    COMBA_STORE(b[53]);
8093
8094    /* output 54 */
8095    CARRY_FORWARD;
8096    SQRADDSC(a[7], a[47]); SQRADDAC(a[8], a[46]); SQRADDAC(a[9], a[45]); SQRADDAC(a[10], a[44]); SQRADDAC(a[11], a[43]); SQRADDAC(a[12], a[42]); SQRADDAC(a[13], a[41]); SQRADDAC(a[14], a[40]); SQRADDAC(a[15], a[39]); SQRADDAC(a[16], a[38]); SQRADDAC(a[17], a[37]); SQRADDAC(a[18], a[36]); SQRADDAC(a[19], a[35]); SQRADDAC(a[20], a[34]); SQRADDAC(a[21], a[33]); SQRADDAC(a[22], a[32]); SQRADDAC(a[23], a[31]); SQRADDAC(a[24], a[30]); SQRADDAC(a[25], a[29]); SQRADDAC(a[26], a[28]); SQRADDDB; SQRADD(a[27], a[27]);
8097    COMBA_STORE(b[54]);
8098
8099    /* output 55 */
8100    CARRY_FORWARD;
8101    SQRADDSC(a[8], a[47]); SQRADDAC(a[9], a[46]); SQRADDAC(a[10], a[45]); SQRADDAC(a[11], a[44]); SQRADDAC(a[12], a[43]); SQRADDAC(a[13], a[42]); SQRADDAC(a[14], a[41]); SQRADDAC(a[15], a[40]); SQRADDAC(a[16], a[39]); SQRADDAC(a[17], a[38]); SQRADDAC(a[18], a[37]); SQRADDAC(a[19], a[36]); SQRADDAC(a[20], a[35]); SQRADDAC(a[21], a[34]); SQRADDAC(a[22], a[33]); SQRADDAC(a[23], a[32]); SQRADDAC(a[24], a[31]); SQRADDAC(a[25], a[30]); SQRADDAC(a[26], a[29]); SQRADDAC(a[27], a[28]); SQRADDDB;
8102    COMBA_STORE(b[55]);
8103
8104    /* output 56 */
8105    CARRY_FORWARD;
8106    SQRADDSC(a[9], a[47]); SQRADDAC(a[10], a[46]); SQRADDAC(a[11], a[45]); SQRADDAC(a[12], a[44]); SQRADDAC(a[13], a[43]); SQRADDAC(a[14], a[42]); SQRADDAC(a[15], a[41]); SQRADDAC(a[16], a[40]); SQRADDAC(a[17], a[39]); SQRADDAC(a[18], a[38]); SQRADDAC(a[19], a[37]); SQRADDAC(a[20], a[36]); SQRADDAC(a[21], a[35]); SQRADDAC(a[22], a[34]); SQRADDAC(a[23], a[33]); SQRADDAC(a[24], a[32]); SQRADDAC(a[25], a[31]); SQRADDAC(a[26], a[30]); SQRADDAC(a[27], a[29]); SQRADDDB; SQRADD(a[28], a[28]);
8107    COMBA_STORE(b[56]);
8108
8109    /* output 57 */
8110    CARRY_FORWARD;
8111    SQRADDSC(a[10], a[47]); SQRADDAC(a[11], a[46]); SQRADDAC(a[12], a[45]); SQRADDAC(a[13], a[44]); SQRADDAC(a[14], a[43]); SQRADDAC(a[15], a[42]); SQRADDAC(a[16], a[41]); SQRADDAC(a[17], a[40]); SQRADDAC(a[18], a[39]); SQRADDAC(a[19], a[38]); SQRADDAC(a[20], a[37]); SQRADDAC(a[21], a[36]); SQRADDAC(a[22], a[35]); SQRADDAC(a[23], a[34]); SQRADDAC(a[24], a[33]); SQRADDAC(a[25], a[32]); SQRADDAC(a[26], a[31]); SQRADDAC(a[27], a[30]); SQRADDAC(a[28], a[29]); SQRADDDB;
8112    COMBA_STORE(b[57]);
8113
8114    /* output 58 */
8115    CARRY_FORWARD;
8116    SQRADDSC(a[11], a[47]); SQRADDAC(a[12], a[46]); SQRADDAC(a[13], a[45]); SQRADDAC(a[14], a[44]); SQRADDAC(a[15], a[43]); SQRADDAC(a[16], a[42]); SQRADDAC(a[17], a[41]); SQRADDAC(a[18], a[40]); SQRADDAC(a[19], a[39]); SQRADDAC(a[20], a[38]); SQRADDAC(a[21], a[37]); SQRADDAC(a[22], a[36]); SQRADDAC(a[23], a[35]); SQRADDAC(a[24], a[34]); SQRADDAC(a[25], a[33]); SQRADDAC(a[26], a[32]); SQRADDAC(a[27], a[31]); SQRADDAC(a[28], a[30]); SQRADDDB; SQRADD(a[29], a[29]);
8117    COMBA_STORE(b[58]);
8118
8119    /* output 59 */
8120    CARRY_FORWARD;
8121    SQRADDSC(a[12], a[47]); SQRADDAC(a[13], a[46]); SQRADDAC(a[14], a[45]); SQRADDAC(a[15], a[44]); SQRADDAC(a[16], a[43]); SQRADDAC(a[17], a[42]); SQRADDAC(a[18], a[41]); SQRADDAC(a[19], a[40]); SQRADDAC(a[20], a[39]); SQRADDAC(a[21], a[38]); SQRADDAC(a[22], a[37]); SQRADDAC(a[23], a[36]); SQRADDAC(a[24], a[35]); SQRADDAC(a[25], a[34]); SQRADDAC(a[26], a[33]); SQRADDAC(a[27], a[32]); SQRADDAC(a[28], a[31]); SQRADDAC(a[29], a[30]); SQRADDDB;
8122    COMBA_STORE(b[59]);
8123
8124    /* output 60 */
8125    CARRY_FORWARD;
8126    SQRADDSC(a[13], a[47]); SQRADDAC(a[14], a[46]); SQRADDAC(a[15], a[45]); SQRADDAC(a[16], a[44]); SQRADDAC(a[17], a[43]); SQRADDAC(a[18], a[42]); SQRADDAC(a[19], a[41]); SQRADDAC(a[20], a[40]); SQRADDAC(a[21], a[39]); SQRADDAC(a[22], a[38]); SQRADDAC(a[23], a[37]); SQRADDAC(a[24], a[36]); SQRADDAC(a[25], a[35]); SQRADDAC(a[26], a[34]); SQRADDAC(a[27], a[33]); SQRADDAC(a[28], a[32]); SQRADDAC(a[29], a[31]); SQRADDDB; SQRADD(a[30], a[30]);
8127    COMBA_STORE(b[60]);
8128
8129    /* output 61 */
8130    CARRY_FORWARD;
8131    SQRADDSC(a[14], a[47]); SQRADDAC(a[15], a[46]); SQRADDAC(a[16], a[45]); SQRADDAC(a[17], a[44]); SQRADDAC(a[18], a[43]); SQRADDAC(a[19], a[42]); SQRADDAC(a[20], a[41]); SQRADDAC(a[21], a[40]); SQRADDAC(a[22], a[39]); SQRADDAC(a[23], a[38]); SQRADDAC(a[24], a[37]); SQRADDAC(a[25], a[36]); SQRADDAC(a[26], a[35]); SQRADDAC(a[27], a[34]); SQRADDAC(a[28], a[33]); SQRADDAC(a[29], a[32]); SQRADDAC(a[30], a[31]); SQRADDDB;
8132    COMBA_STORE(b[61]);
8133
8134    /* output 62 */
8135    CARRY_FORWARD;
8136    SQRADDSC(a[15], a[47]); SQRADDAC(a[16], a[46]); SQRADDAC(a[17], a[45]); SQRADDAC(a[18], a[44]); SQRADDAC(a[19], a[43]); SQRADDAC(a[20], a[42]); SQRADDAC(a[21], a[41]); SQRADDAC(a[22], a[40]); SQRADDAC(a[23], a[39]); SQRADDAC(a[24], a[38]); SQRADDAC(a[25], a[37]); SQRADDAC(a[26], a[36]); SQRADDAC(a[27], a[35]); SQRADDAC(a[28], a[34]); SQRADDAC(a[29], a[33]); SQRADDAC(a[30], a[32]); SQRADDDB; SQRADD(a[31], a[31]);
8137    COMBA_STORE(b[62]);
8138
8139    /* output 63 */
8140    CARRY_FORWARD;
8141    SQRADDSC(a[16], a[47]); SQRADDAC(a[17], a[46]); SQRADDAC(a[18], a[45]); SQRADDAC(a[19], a[44]); SQRADDAC(a[20], a[43]); SQRADDAC(a[21], a[42]); SQRADDAC(a[22], a[41]); SQRADDAC(a[23], a[40]); SQRADDAC(a[24], a[39]); SQRADDAC(a[25], a[38]); SQRADDAC(a[26], a[37]); SQRADDAC(a[27], a[36]); SQRADDAC(a[28], a[35]); SQRADDAC(a[29], a[34]); SQRADDAC(a[30], a[33]); SQRADDAC(a[31], a[32]); SQRADDDB;
8142    COMBA_STORE(b[63]);
8143
8144    /* output 64 */
8145    CARRY_FORWARD;
8146    SQRADDSC(a[17], a[47]); SQRADDAC(a[18], a[46]); SQRADDAC(a[19], a[45]); SQRADDAC(a[20], a[44]); SQRADDAC(a[21], a[43]); SQRADDAC(a[22], a[42]); SQRADDAC(a[23], a[41]); SQRADDAC(a[24], a[40]); SQRADDAC(a[25], a[39]); SQRADDAC(a[26], a[38]); SQRADDAC(a[27], a[37]); SQRADDAC(a[28], a[36]); SQRADDAC(a[29], a[35]); SQRADDAC(a[30], a[34]); SQRADDAC(a[31], a[33]); SQRADDDB; SQRADD(a[32], a[32]);
8147    COMBA_STORE(b[64]);
8148
8149    /* output 65 */
8150    CARRY_FORWARD;
8151    SQRADDSC(a[18], a[47]); SQRADDAC(a[19], a[46]); SQRADDAC(a[20], a[45]); SQRADDAC(a[21], a[44]); SQRADDAC(a[22], a[43]); SQRADDAC(a[23], a[42]); SQRADDAC(a[24], a[41]); SQRADDAC(a[25], a[40]); SQRADDAC(a[26], a[39]); SQRADDAC(a[27], a[38]); SQRADDAC(a[28], a[37]); SQRADDAC(a[29], a[36]); SQRADDAC(a[30], a[35]); SQRADDAC(a[31], a[34]); SQRADDAC(a[32], a[33]); SQRADDDB;
8152    COMBA_STORE(b[65]);
8153
8154    /* output 66 */
8155    CARRY_FORWARD;
8156    SQRADDSC(a[19], a[47]); SQRADDAC(a[20], a[46]); SQRADDAC(a[21], a[45]); SQRADDAC(a[22], a[44]); SQRADDAC(a[23], a[43]); SQRADDAC(a[24], a[42]); SQRADDAC(a[25], a[41]); SQRADDAC(a[26], a[40]); SQRADDAC(a[27], a[39]); SQRADDAC(a[28], a[38]); SQRADDAC(a[29], a[37]); SQRADDAC(a[30], a[36]); SQRADDAC(a[31], a[35]); SQRADDAC(a[32], a[34]); SQRADDDB; SQRADD(a[33], a[33]);
8157    COMBA_STORE(b[66]);
8158
8159    /* output 67 */
8160    CARRY_FORWARD;
8161    SQRADDSC(a[20], a[47]); SQRADDAC(a[21], a[46]); SQRADDAC(a[22], a[45]); SQRADDAC(a[23], a[44]); SQRADDAC(a[24], a[43]); SQRADDAC(a[25], a[42]); SQRADDAC(a[26], a[41]); SQRADDAC(a[27], a[40]); SQRADDAC(a[28], a[39]); SQRADDAC(a[29], a[38]); SQRADDAC(a[30], a[37]); SQRADDAC(a[31], a[36]); SQRADDAC(a[32], a[35]); SQRADDAC(a[33], a[34]); SQRADDDB;
8162    COMBA_STORE(b[67]);
8163
8164    /* output 68 */
8165    CARRY_FORWARD;
8166    SQRADDSC(a[21], a[47]); SQRADDAC(a[22], a[46]); SQRADDAC(a[23], a[45]); SQRADDAC(a[24], a[44]); SQRADDAC(a[25], a[43]); SQRADDAC(a[26], a[42]); SQRADDAC(a[27], a[41]); SQRADDAC(a[28], a[40]); SQRADDAC(a[29], a[39]); SQRADDAC(a[30], a[38]); SQRADDAC(a[31], a[37]); SQRADDAC(a[32], a[36]); SQRADDAC(a[33], a[35]); SQRADDDB; SQRADD(a[34], a[34]);
8167    COMBA_STORE(b[68]);
8168
8169    /* output 69 */
8170    CARRY_FORWARD;
8171    SQRADDSC(a[22], a[47]); SQRADDAC(a[23], a[46]); SQRADDAC(a[24], a[45]); SQRADDAC(a[25], a[44]); SQRADDAC(a[26], a[43]); SQRADDAC(a[27], a[42]); SQRADDAC(a[28], a[41]); SQRADDAC(a[29], a[40]); SQRADDAC(a[30], a[39]); SQRADDAC(a[31], a[38]); SQRADDAC(a[32], a[37]); SQRADDAC(a[33], a[36]); SQRADDAC(a[34], a[35]); SQRADDDB;
8172    COMBA_STORE(b[69]);
8173
8174    /* output 70 */
8175    CARRY_FORWARD;
8176    SQRADDSC(a[23], a[47]); SQRADDAC(a[24], a[46]); SQRADDAC(a[25], a[45]); SQRADDAC(a[26], a[44]); SQRADDAC(a[27], a[43]); SQRADDAC(a[28], a[42]); SQRADDAC(a[29], a[41]); SQRADDAC(a[30], a[40]); SQRADDAC(a[31], a[39]); SQRADDAC(a[32], a[38]); SQRADDAC(a[33], a[37]); SQRADDAC(a[34], a[36]); SQRADDDB; SQRADD(a[35], a[35]);
8177    COMBA_STORE(b[70]);
8178
8179    /* output 71 */
8180    CARRY_FORWARD;
8181    SQRADDSC(a[24], a[47]); SQRADDAC(a[25], a[46]); SQRADDAC(a[26], a[45]); SQRADDAC(a[27], a[44]); SQRADDAC(a[28], a[43]); SQRADDAC(a[29], a[42]); SQRADDAC(a[30], a[41]); SQRADDAC(a[31], a[40]); SQRADDAC(a[32], a[39]); SQRADDAC(a[33], a[38]); SQRADDAC(a[34], a[37]); SQRADDAC(a[35], a[36]); SQRADDDB;
8182    COMBA_STORE(b[71]);
8183
8184    /* output 72 */
8185    CARRY_FORWARD;
8186    SQRADDSC(a[25], a[47]); SQRADDAC(a[26], a[46]); SQRADDAC(a[27], a[45]); SQRADDAC(a[28], a[44]); SQRADDAC(a[29], a[43]); SQRADDAC(a[30], a[42]); SQRADDAC(a[31], a[41]); SQRADDAC(a[32], a[40]); SQRADDAC(a[33], a[39]); SQRADDAC(a[34], a[38]); SQRADDAC(a[35], a[37]); SQRADDDB; SQRADD(a[36], a[36]);
8187    COMBA_STORE(b[72]);
8188
8189    /* output 73 */
8190    CARRY_FORWARD;
8191    SQRADDSC(a[26], a[47]); SQRADDAC(a[27], a[46]); SQRADDAC(a[28], a[45]); SQRADDAC(a[29], a[44]); SQRADDAC(a[30], a[43]); SQRADDAC(a[31], a[42]); SQRADDAC(a[32], a[41]); SQRADDAC(a[33], a[40]); SQRADDAC(a[34], a[39]); SQRADDAC(a[35], a[38]); SQRADDAC(a[36], a[37]); SQRADDDB;
8192    COMBA_STORE(b[73]);
8193
8194    /* output 74 */
8195    CARRY_FORWARD;
8196    SQRADDSC(a[27], a[47]); SQRADDAC(a[28], a[46]); SQRADDAC(a[29], a[45]); SQRADDAC(a[30], a[44]); SQRADDAC(a[31], a[43]); SQRADDAC(a[32], a[42]); SQRADDAC(a[33], a[41]); SQRADDAC(a[34], a[40]); SQRADDAC(a[35], a[39]); SQRADDAC(a[36], a[38]); SQRADDDB; SQRADD(a[37], a[37]);
8197    COMBA_STORE(b[74]);
8198
8199    /* output 75 */
8200    CARRY_FORWARD;
8201    SQRADDSC(a[28], a[47]); SQRADDAC(a[29], a[46]); SQRADDAC(a[30], a[45]); SQRADDAC(a[31], a[44]); SQRADDAC(a[32], a[43]); SQRADDAC(a[33], a[42]); SQRADDAC(a[34], a[41]); SQRADDAC(a[35], a[40]); SQRADDAC(a[36], a[39]); SQRADDAC(a[37], a[38]); SQRADDDB;
8202    COMBA_STORE(b[75]);
8203
8204    /* output 76 */
8205    CARRY_FORWARD;
8206    SQRADDSC(a[29], a[47]); SQRADDAC(a[30], a[46]); SQRADDAC(a[31], a[45]); SQRADDAC(a[32], a[44]); SQRADDAC(a[33], a[43]); SQRADDAC(a[34], a[42]); SQRADDAC(a[35], a[41]); SQRADDAC(a[36], a[40]); SQRADDAC(a[37], a[39]); SQRADDDB; SQRADD(a[38], a[38]);
8207    COMBA_STORE(b[76]);
8208
8209    /* output 77 */
8210    CARRY_FORWARD;
8211    SQRADDSC(a[30], a[47]); SQRADDAC(a[31], a[46]); SQRADDAC(a[32], a[45]); SQRADDAC(a[33], a[44]); SQRADDAC(a[34], a[43]); SQRADDAC(a[35], a[42]); SQRADDAC(a[36], a[41]); SQRADDAC(a[37], a[40]); SQRADDAC(a[38], a[39]); SQRADDDB;
8212    COMBA_STORE(b[77]);
8213
8214    /* output 78 */
8215    CARRY_FORWARD;
8216    SQRADDSC(a[31], a[47]); SQRADDAC(a[32], a[46]); SQRADDAC(a[33], a[45]); SQRADDAC(a[34], a[44]); SQRADDAC(a[35], a[43]); SQRADDAC(a[36], a[42]); SQRADDAC(a[37], a[41]); SQRADDAC(a[38], a[40]); SQRADDDB; SQRADD(a[39], a[39]);
8217    COMBA_STORE(b[78]);
8218
8219    /* output 79 */
8220    CARRY_FORWARD;
8221    SQRADDSC(a[32], a[47]); SQRADDAC(a[33], a[46]); SQRADDAC(a[34], a[45]); SQRADDAC(a[35], a[44]); SQRADDAC(a[36], a[43]); SQRADDAC(a[37], a[42]); SQRADDAC(a[38], a[41]); SQRADDAC(a[39], a[40]); SQRADDDB;
8222    COMBA_STORE(b[79]);
8223
8224    /* output 80 */
8225    CARRY_FORWARD;
8226    SQRADDSC(a[33], a[47]); SQRADDAC(a[34], a[46]); SQRADDAC(a[35], a[45]); SQRADDAC(a[36], a[44]); SQRADDAC(a[37], a[43]); SQRADDAC(a[38], a[42]); SQRADDAC(a[39], a[41]); SQRADDDB; SQRADD(a[40], a[40]);
8227    COMBA_STORE(b[80]);
8228
8229    /* output 81 */
8230    CARRY_FORWARD;
8231    SQRADDSC(a[34], a[47]); SQRADDAC(a[35], a[46]); SQRADDAC(a[36], a[45]); SQRADDAC(a[37], a[44]); SQRADDAC(a[38], a[43]); SQRADDAC(a[39], a[42]); SQRADDAC(a[40], a[41]); SQRADDDB;
8232    COMBA_STORE(b[81]);
8233
8234    /* output 82 */
8235    CARRY_FORWARD;
8236    SQRADDSC(a[35], a[47]); SQRADDAC(a[36], a[46]); SQRADDAC(a[37], a[45]); SQRADDAC(a[38], a[44]); SQRADDAC(a[39], a[43]); SQRADDAC(a[40], a[42]); SQRADDDB; SQRADD(a[41], a[41]);
8237    COMBA_STORE(b[82]);
8238
8239    /* output 83 */
8240    CARRY_FORWARD;
8241    SQRADDSC(a[36], a[47]); SQRADDAC(a[37], a[46]); SQRADDAC(a[38], a[45]); SQRADDAC(a[39], a[44]); SQRADDAC(a[40], a[43]); SQRADDAC(a[41], a[42]); SQRADDDB;
8242    COMBA_STORE(b[83]);
8243
8244    /* output 84 */
8245    CARRY_FORWARD;
8246    SQRADDSC(a[37], a[47]); SQRADDAC(a[38], a[46]); SQRADDAC(a[39], a[45]); SQRADDAC(a[40], a[44]); SQRADDAC(a[41], a[43]); SQRADDDB; SQRADD(a[42], a[42]);
8247    COMBA_STORE(b[84]);
8248
8249    /* output 85 */
8250    CARRY_FORWARD;
8251    SQRADDSC(a[38], a[47]); SQRADDAC(a[39], a[46]); SQRADDAC(a[40], a[45]); SQRADDAC(a[41], a[44]); SQRADDAC(a[42], a[43]); SQRADDDB;
8252    COMBA_STORE(b[85]);
8253
8254    /* output 86 */
8255    CARRY_FORWARD;
8256    SQRADDSC(a[39], a[47]); SQRADDAC(a[40], a[46]); SQRADDAC(a[41], a[45]); SQRADDAC(a[42], a[44]); SQRADDDB; SQRADD(a[43], a[43]);
8257    COMBA_STORE(b[86]);
8258
8259    /* output 87 */
8260    CARRY_FORWARD;
8261    SQRADDSC(a[40], a[47]); SQRADDAC(a[41], a[46]); SQRADDAC(a[42], a[45]); SQRADDAC(a[43], a[44]); SQRADDDB;
8262    COMBA_STORE(b[87]);
8263
8264    /* output 88 */
8265    CARRY_FORWARD;
8266    SQRADDSC(a[41], a[47]); SQRADDAC(a[42], a[46]); SQRADDAC(a[43], a[45]); SQRADDDB; SQRADD(a[44], a[44]);
8267    COMBA_STORE(b[88]);
8268
8269    /* output 89 */
8270    CARRY_FORWARD;
8271    SQRADDSC(a[42], a[47]); SQRADDAC(a[43], a[46]); SQRADDAC(a[44], a[45]); SQRADDDB;
8272    COMBA_STORE(b[89]);
8273
8274    /* output 90 */
8275    CARRY_FORWARD;
8276    SQRADD2(a[43], a[47]); SQRADD2(a[44], a[46]); SQRADD(a[45], a[45]);
8277    COMBA_STORE(b[90]);
8278
8279    /* output 91 */
8280    CARRY_FORWARD;
8281    SQRADD2(a[44], a[47]); SQRADD2(a[45], a[46]);
8282    COMBA_STORE(b[91]);
8283
8284    /* output 92 */
8285    CARRY_FORWARD;
8286    SQRADD2(a[45], a[47]); SQRADD(a[46], a[46]);
8287    COMBA_STORE(b[92]);
8288
8289    /* output 93 */
8290    CARRY_FORWARD;
8291    SQRADD2(a[46], a[47]);
8292    COMBA_STORE(b[93]);
8293
8294    /* output 94 */
8295    CARRY_FORWARD;
8296    SQRADD(a[47], a[47]);
8297    COMBA_STORE(b[94]);
8298    COMBA_STORE2(b[95]);
8299    COMBA_FINI;
8300
8301    B->used = 96;
8302    B->sign = TFM_FP_ZPOS;
8303    memcpy(B->dp, b, 96 * sizeof(tfm_fp_digit));
8304    tfm_fp_clamp(B);
8305 }
8306 #endif
8307
8308 #define TFM_DEFINES
8309
8310 #ifdef TFM_SQR64
8311 void tfm_fp_sqr_comba64(tfm_fp_int *A, tfm_fp_int *B)
8312 {
8313    tfm_fp_digit *a, b[128], c0, c1, c2, sc0, sc1, sc2;
8314 #ifdef TFM_ISO
8315    tfm_fp_word tt;
8316 #endif
8317
8318    SILC_LOG_DEBUG(("Start"));
8319    a = A->dp;
8320    COMBA_START;
8321
8322    /* clear carries */
8323    CLEAR_CARRY;
8324
8325    /* output 0 */
8326    SQRADD(a[0],a[0]);
8327    COMBA_STORE(b[0]);
8328
8329    /* output 1 */
8330    CARRY_FORWARD;
8331    SQRADD2(a[0], a[1]);
8332    COMBA_STORE(b[1]);
8333
8334    /* output 2 */
8335    CARRY_FORWARD;
8336    SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]);
8337    COMBA_STORE(b[2]);
8338
8339    /* output 3 */
8340    CARRY_FORWARD;
8341    SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]);
8342    COMBA_STORE(b[3]);
8343
8344    /* output 4 */
8345    CARRY_FORWARD;
8346    SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]);
8347    COMBA_STORE(b[4]);
8348
8349    /* output 5 */
8350    CARRY_FORWARD;
8351    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
8352    COMBA_STORE(b[5]);
8353
8354    /* output 6 */
8355    CARRY_FORWARD;
8356    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
8357    COMBA_STORE(b[6]);
8358
8359    /* output 7 */
8360    CARRY_FORWARD;
8361    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
8362    COMBA_STORE(b[7]);
8363
8364    /* output 8 */
8365    CARRY_FORWARD;
8366    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
8367    COMBA_STORE(b[8]);
8368
8369    /* output 9 */
8370    CARRY_FORWARD;
8371    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
8372    COMBA_STORE(b[9]);
8373
8374    /* output 10 */
8375    CARRY_FORWARD;
8376    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]);
8377    COMBA_STORE(b[10]);
8378
8379    /* output 11 */
8380    CARRY_FORWARD;
8381    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB;
8382    COMBA_STORE(b[11]);
8383
8384    /* output 12 */
8385    CARRY_FORWARD;
8386    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]);
8387    COMBA_STORE(b[12]);
8388
8389    /* output 13 */
8390    CARRY_FORWARD;
8391    SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB;
8392    COMBA_STORE(b[13]);
8393
8394    /* output 14 */
8395    CARRY_FORWARD;
8396    SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]);
8397    COMBA_STORE(b[14]);
8398
8399    /* output 15 */
8400    CARRY_FORWARD;
8401    SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB;
8402    COMBA_STORE(b[15]);
8403
8404    /* output 16 */
8405    CARRY_FORWARD;
8406    SQRADDSC(a[0], a[16]); SQRADDAC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]);
8407    COMBA_STORE(b[16]);
8408
8409    /* output 17 */
8410    CARRY_FORWARD;
8411    SQRADDSC(a[0], a[17]); SQRADDAC(a[1], a[16]); SQRADDAC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB;
8412    COMBA_STORE(b[17]);
8413
8414    /* output 18 */
8415    CARRY_FORWARD;
8416    SQRADDSC(a[0], a[18]); SQRADDAC(a[1], a[17]); SQRADDAC(a[2], a[16]); SQRADDAC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]);
8417    COMBA_STORE(b[18]);
8418
8419    /* output 19 */
8420    CARRY_FORWARD;
8421    SQRADDSC(a[0], a[19]); SQRADDAC(a[1], a[18]); SQRADDAC(a[2], a[17]); SQRADDAC(a[3], a[16]); SQRADDAC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB;
8422    COMBA_STORE(b[19]);
8423
8424    /* output 20 */
8425    CARRY_FORWARD;
8426    SQRADDSC(a[0], a[20]); SQRADDAC(a[1], a[19]); SQRADDAC(a[2], a[18]); SQRADDAC(a[3], a[17]); SQRADDAC(a[4], a[16]); SQRADDAC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]);
8427    COMBA_STORE(b[20]);
8428
8429    /* output 21 */
8430    CARRY_FORWARD;
8431    SQRADDSC(a[0], a[21]); SQRADDAC(a[1], a[20]); SQRADDAC(a[2], a[19]); SQRADDAC(a[3], a[18]); SQRADDAC(a[4], a[17]); SQRADDAC(a[5], a[16]); SQRADDAC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB;
8432    COMBA_STORE(b[21]);
8433
8434    /* output 22 */
8435    CARRY_FORWARD;
8436    SQRADDSC(a[0], a[22]); SQRADDAC(a[1], a[21]); SQRADDAC(a[2], a[20]); SQRADDAC(a[3], a[19]); SQRADDAC(a[4], a[18]); SQRADDAC(a[5], a[17]); SQRADDAC(a[6], a[16]); SQRADDAC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]);
8437    COMBA_STORE(b[22]);
8438
8439    /* output 23 */
8440    CARRY_FORWARD;
8441    SQRADDSC(a[0], a[23]); SQRADDAC(a[1], a[22]); SQRADDAC(a[2], a[21]); SQRADDAC(a[3], a[20]); SQRADDAC(a[4], a[19]); SQRADDAC(a[5], a[18]); SQRADDAC(a[6], a[17]); SQRADDAC(a[7], a[16]); SQRADDAC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB;
8442    COMBA_STORE(b[23]);
8443
8444    /* output 24 */
8445    CARRY_FORWARD;
8446    SQRADDSC(a[0], a[24]); SQRADDAC(a[1], a[23]); SQRADDAC(a[2], a[22]); SQRADDAC(a[3], a[21]); SQRADDAC(a[4], a[20]); SQRADDAC(a[5], a[19]); SQRADDAC(a[6], a[18]); SQRADDAC(a[7], a[17]); SQRADDAC(a[8], a[16]); SQRADDAC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]);
8447    COMBA_STORE(b[24]);
8448
8449    /* output 25 */
8450    CARRY_FORWARD;
8451    SQRADDSC(a[0], a[25]); SQRADDAC(a[1], a[24]); SQRADDAC(a[2], a[23]); SQRADDAC(a[3], a[22]); SQRADDAC(a[4], a[21]); SQRADDAC(a[5], a[20]); SQRADDAC(a[6], a[19]); SQRADDAC(a[7], a[18]); SQRADDAC(a[8], a[17]); SQRADDAC(a[9], a[16]); SQRADDAC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB;
8452    COMBA_STORE(b[25]);
8453
8454    /* output 26 */
8455    CARRY_FORWARD;
8456    SQRADDSC(a[0], a[26]); SQRADDAC(a[1], a[25]); SQRADDAC(a[2], a[24]); SQRADDAC(a[3], a[23]); SQRADDAC(a[4], a[22]); SQRADDAC(a[5], a[21]); SQRADDAC(a[6], a[20]); SQRADDAC(a[7], a[19]); SQRADDAC(a[8], a[18]); SQRADDAC(a[9], a[17]); SQRADDAC(a[10], a[16]); SQRADDAC(a[11], a[15]); SQRADDAC(a[12], a[14]); SQRADDDB; SQRADD(a[13], a[13]);
8457    COMBA_STORE(b[26]);
8458
8459    /* output 27 */
8460    CARRY_FORWARD;
8461    SQRADDSC(a[0], a[27]); SQRADDAC(a[1], a[26]); SQRADDAC(a[2], a[25]); SQRADDAC(a[3], a[24]); SQRADDAC(a[4], a[23]); SQRADDAC(a[5], a[22]); SQRADDAC(a[6], a[21]); SQRADDAC(a[7], a[20]); SQRADDAC(a[8], a[19]); SQRADDAC(a[9], a[18]); SQRADDAC(a[10], a[17]); SQRADDAC(a[11], a[16]); SQRADDAC(a[12], a[15]); SQRADDAC(a[13], a[14]); SQRADDDB;
8462    COMBA_STORE(b[27]);
8463
8464    /* output 28 */
8465    CARRY_FORWARD;
8466    SQRADDSC(a[0], a[28]); SQRADDAC(a[1], a[27]); SQRADDAC(a[2], a[26]); SQRADDAC(a[3], a[25]); SQRADDAC(a[4], a[24]); SQRADDAC(a[5], a[23]); SQRADDAC(a[6], a[22]); SQRADDAC(a[7], a[21]); SQRADDAC(a[8], a[20]); SQRADDAC(a[9], a[19]); SQRADDAC(a[10], a[18]); SQRADDAC(a[11], a[17]); SQRADDAC(a[12], a[16]); SQRADDAC(a[13], a[15]); SQRADDDB; SQRADD(a[14], a[14]);
8467    COMBA_STORE(b[28]);
8468
8469    /* output 29 */
8470    CARRY_FORWARD;
8471    SQRADDSC(a[0], a[29]); SQRADDAC(a[1], a[28]); SQRADDAC(a[2], a[27]); SQRADDAC(a[3], a[26]); SQRADDAC(a[4], a[25]); SQRADDAC(a[5], a[24]); SQRADDAC(a[6], a[23]); SQRADDAC(a[7], a[22]); SQRADDAC(a[8], a[21]); SQRADDAC(a[9], a[20]); SQRADDAC(a[10], a[19]); SQRADDAC(a[11], a[18]); SQRADDAC(a[12], a[17]); SQRADDAC(a[13], a[16]); SQRADDAC(a[14], a[15]); SQRADDDB;
8472    COMBA_STORE(b[29]);
8473
8474    /* output 30 */
8475    CARRY_FORWARD;
8476    SQRADDSC(a[0], a[30]); SQRADDAC(a[1], a[29]); SQRADDAC(a[2], a[28]); SQRADDAC(a[3], a[27]); SQRADDAC(a[4], a[26]); SQRADDAC(a[5], a[25]); SQRADDAC(a[6], a[24]); SQRADDAC(a[7], a[23]); SQRADDAC(a[8], a[22]); SQRADDAC(a[9], a[21]); SQRADDAC(a[10], a[20]); SQRADDAC(a[11], a[19]); SQRADDAC(a[12], a[18]); SQRADDAC(a[13], a[17]); SQRADDAC(a[14], a[16]); SQRADDDB; SQRADD(a[15], a[15]);
8477    COMBA_STORE(b[30]);
8478
8479    /* output 31 */
8480    CARRY_FORWARD;
8481    SQRADDSC(a[0], a[31]); SQRADDAC(a[1], a[30]); SQRADDAC(a[2], a[29]); SQRADDAC(a[3], a[28]); SQRADDAC(a[4], a[27]); SQRADDAC(a[5], a[26]); SQRADDAC(a[6], a[25]); SQRADDAC(a[7], a[24]); SQRADDAC(a[8], a[23]); SQRADDAC(a[9], a[22]); SQRADDAC(a[10], a[21]); SQRADDAC(a[11], a[20]); SQRADDAC(a[12], a[19]); SQRADDAC(a[13], a[18]); SQRADDAC(a[14], a[17]); SQRADDAC(a[15], a[16]); SQRADDDB;
8482    COMBA_STORE(b[31]);
8483
8484    /* output 32 */
8485    CARRY_FORWARD;
8486    SQRADDSC(a[0], a[32]); SQRADDAC(a[1], a[31]); SQRADDAC(a[2], a[30]); SQRADDAC(a[3], a[29]); SQRADDAC(a[4], a[28]); SQRADDAC(a[5], a[27]); SQRADDAC(a[6], a[26]); SQRADDAC(a[7], a[25]); SQRADDAC(a[8], a[24]); SQRADDAC(a[9], a[23]); SQRADDAC(a[10], a[22]); SQRADDAC(a[11], a[21]); SQRADDAC(a[12], a[20]); SQRADDAC(a[13], a[19]); SQRADDAC(a[14], a[18]); SQRADDAC(a[15], a[17]); SQRADDDB; SQRADD(a[16], a[16]);
8487    COMBA_STORE(b[32]);
8488
8489    /* output 33 */
8490    CARRY_FORWARD;
8491    SQRADDSC(a[0], a[33]); SQRADDAC(a[1], a[32]); SQRADDAC(a[2], a[31]); SQRADDAC(a[3], a[30]); SQRADDAC(a[4], a[29]); SQRADDAC(a[5], a[28]); SQRADDAC(a[6], a[27]); SQRADDAC(a[7], a[26]); SQRADDAC(a[8], a[25]); SQRADDAC(a[9], a[24]); SQRADDAC(a[10], a[23]); SQRADDAC(a[11], a[22]); SQRADDAC(a[12], a[21]); SQRADDAC(a[13], a[20]); SQRADDAC(a[14], a[19]); SQRADDAC(a[15], a[18]); SQRADDAC(a[16], a[17]); SQRADDDB;
8492    COMBA_STORE(b[33]);
8493
8494    /* output 34 */
8495    CARRY_FORWARD;
8496    SQRADDSC(a[0], a[34]); SQRADDAC(a[1], a[33]); SQRADDAC(a[2], a[32]); SQRADDAC(a[3], a[31]); SQRADDAC(a[4], a[30]); SQRADDAC(a[5], a[29]); SQRADDAC(a[6], a[28]); SQRADDAC(a[7], a[27]); SQRADDAC(a[8], a[26]); SQRADDAC(a[9], a[25]); SQRADDAC(a[10], a[24]); SQRADDAC(a[11], a[23]); SQRADDAC(a[12], a[22]); SQRADDAC(a[13], a[21]); SQRADDAC(a[14], a[20]); SQRADDAC(a[15], a[19]); SQRADDAC(a[16], a[18]); SQRADDDB; SQRADD(a[17], a[17]);
8497    COMBA_STORE(b[34]);
8498
8499    /* output 35 */
8500    CARRY_FORWARD;
8501    SQRADDSC(a[0], a[35]); SQRADDAC(a[1], a[34]); SQRADDAC(a[2], a[33]); SQRADDAC(a[3], a[32]); SQRADDAC(a[4], a[31]); SQRADDAC(a[5], a[30]); SQRADDAC(a[6], a[29]); SQRADDAC(a[7], a[28]); SQRADDAC(a[8], a[27]); SQRADDAC(a[9], a[26]); SQRADDAC(a[10], a[25]); SQRADDAC(a[11], a[24]); SQRADDAC(a[12], a[23]); SQRADDAC(a[13], a[22]); SQRADDAC(a[14], a[21]); SQRADDAC(a[15], a[20]); SQRADDAC(a[16], a[19]); SQRADDAC(a[17], a[18]); SQRADDDB;
8502    COMBA_STORE(b[35]);
8503
8504    /* output 36 */
8505    CARRY_FORWARD;
8506    SQRADDSC(a[0], a[36]); SQRADDAC(a[1], a[35]); SQRADDAC(a[2], a[34]); SQRADDAC(a[3], a[33]); SQRADDAC(a[4], a[32]); SQRADDAC(a[5], a[31]); SQRADDAC(a[6], a[30]); SQRADDAC(a[7], a[29]); SQRADDAC(a[8], a[28]); SQRADDAC(a[9], a[27]); SQRADDAC(a[10], a[26]); SQRADDAC(a[11], a[25]); SQRADDAC(a[12], a[24]); SQRADDAC(a[13], a[23]); SQRADDAC(a[14], a[22]); SQRADDAC(a[15], a[21]); SQRADDAC(a[16], a[20]); SQRADDAC(a[17], a[19]); SQRADDDB; SQRADD(a[18], a[18]);
8507    COMBA_STORE(b[36]);
8508
8509    /* output 37 */
8510    CARRY_FORWARD;
8511    SQRADDSC(a[0], a[37]); SQRADDAC(a[1], a[36]); SQRADDAC(a[2], a[35]); SQRADDAC(a[3], a[34]); SQRADDAC(a[4], a[33]); SQRADDAC(a[5], a[32]); SQRADDAC(a[6], a[31]); SQRADDAC(a[7], a[30]); SQRADDAC(a[8], a[29]); SQRADDAC(a[9], a[28]); SQRADDAC(a[10], a[27]); SQRADDAC(a[11], a[26]); SQRADDAC(a[12], a[25]); SQRADDAC(a[13], a[24]); SQRADDAC(a[14], a[23]); SQRADDAC(a[15], a[22]); SQRADDAC(a[16], a[21]); SQRADDAC(a[17], a[20]); SQRADDAC(a[18], a[19]); SQRADDDB;
8512    COMBA_STORE(b[37]);
8513
8514    /* output 38 */
8515    CARRY_FORWARD;
8516    SQRADDSC(a[0], a[38]); SQRADDAC(a[1], a[37]); SQRADDAC(a[2], a[36]); SQRADDAC(a[3], a[35]); SQRADDAC(a[4], a[34]); SQRADDAC(a[5], a[33]); SQRADDAC(a[6], a[32]); SQRADDAC(a[7], a[31]); SQRADDAC(a[8], a[30]); SQRADDAC(a[9], a[29]); SQRADDAC(a[10], a[28]); SQRADDAC(a[11], a[27]); SQRADDAC(a[12], a[26]); SQRADDAC(a[13], a[25]); SQRADDAC(a[14], a[24]); SQRADDAC(a[15], a[23]); SQRADDAC(a[16], a[22]); SQRADDAC(a[17], a[21]); SQRADDAC(a[18], a[20]); SQRADDDB; SQRADD(a[19], a[19]);
8517    COMBA_STORE(b[38]);
8518
8519    /* output 39 */
8520    CARRY_FORWARD;
8521    SQRADDSC(a[0], a[39]); SQRADDAC(a[1], a[38]); SQRADDAC(a[2], a[37]); SQRADDAC(a[3], a[36]); SQRADDAC(a[4], a[35]); SQRADDAC(a[5], a[34]); SQRADDAC(a[6], a[33]); SQRADDAC(a[7], a[32]); SQRADDAC(a[8], a[31]); SQRADDAC(a[9], a[30]); SQRADDAC(a[10], a[29]); SQRADDAC(a[11], a[28]); SQRADDAC(a[12], a[27]); SQRADDAC(a[13], a[26]); SQRADDAC(a[14], a[25]); SQRADDAC(a[15], a[24]); SQRADDAC(a[16], a[23]); SQRADDAC(a[17], a[22]); SQRADDAC(a[18], a[21]); SQRADDAC(a[19], a[20]); SQRADDDB;
8522    COMBA_STORE(b[39]);
8523
8524    /* output 40 */
8525    CARRY_FORWARD;
8526    SQRADDSC(a[0], a[40]); SQRADDAC(a[1], a[39]); SQRADDAC(a[2], a[38]); SQRADDAC(a[3], a[37]); SQRADDAC(a[4], a[36]); SQRADDAC(a[5], a[35]); SQRADDAC(a[6], a[34]); SQRADDAC(a[7], a[33]); SQRADDAC(a[8], a[32]); SQRADDAC(a[9], a[31]); SQRADDAC(a[10], a[30]); SQRADDAC(a[11], a[29]); SQRADDAC(a[12], a[28]); SQRADDAC(a[13], a[27]); SQRADDAC(a[14], a[26]); SQRADDAC(a[15], a[25]); SQRADDAC(a[16], a[24]); SQRADDAC(a[17], a[23]); SQRADDAC(a[18], a[22]); SQRADDAC(a[19], a[21]); SQRADDDB; SQRADD(a[20], a[20]);
8527    COMBA_STORE(b[40]);
8528
8529    /* output 41 */
8530    CARRY_FORWARD;
8531    SQRADDSC(a[0], a[41]); SQRADDAC(a[1], a[40]); SQRADDAC(a[2], a[39]); SQRADDAC(a[3], a[38]); SQRADDAC(a[4], a[37]); SQRADDAC(a[5], a[36]); SQRADDAC(a[6], a[35]); SQRADDAC(a[7], a[34]); SQRADDAC(a[8], a[33]); SQRADDAC(a[9], a[32]); SQRADDAC(a[10], a[31]); SQRADDAC(a[11], a[30]); SQRADDAC(a[12], a[29]); SQRADDAC(a[13], a[28]); SQRADDAC(a[14], a[27]); SQRADDAC(a[15], a[26]); SQRADDAC(a[16], a[25]); SQRADDAC(a[17], a[24]); SQRADDAC(a[18], a[23]); SQRADDAC(a[19], a[22]); SQRADDAC(a[20], a[21]); SQRADDDB;
8532    COMBA_STORE(b[41]);
8533
8534    /* output 42 */
8535    CARRY_FORWARD;
8536    SQRADDSC(a[0], a[42]); SQRADDAC(a[1], a[41]); SQRADDAC(a[2], a[40]); SQRADDAC(a[3], a[39]); SQRADDAC(a[4], a[38]); SQRADDAC(a[5], a[37]); SQRADDAC(a[6], a[36]); SQRADDAC(a[7], a[35]); SQRADDAC(a[8], a[34]); SQRADDAC(a[9], a[33]); SQRADDAC(a[10], a[32]); SQRADDAC(a[11], a[31]); SQRADDAC(a[12], a[30]); SQRADDAC(a[13], a[29]); SQRADDAC(a[14], a[28]); SQRADDAC(a[15], a[27]); SQRADDAC(a[16], a[26]); SQRADDAC(a[17], a[25]); SQRADDAC(a[18], a[24]); SQRADDAC(a[19], a[23]); SQRADDAC(a[20], a[22]); SQRADDDB; SQRADD(a[21], a[21]);
8537    COMBA_STORE(b[42]);
8538
8539    /* output 43 */
8540    CARRY_FORWARD;
8541    SQRADDSC(a[0], a[43]); SQRADDAC(a[1], a[42]); SQRADDAC(a[2], a[41]); SQRADDAC(a[3], a[40]); SQRADDAC(a[4], a[39]); SQRADDAC(a[5], a[38]); SQRADDAC(a[6], a[37]); SQRADDAC(a[7], a[36]); SQRADDAC(a[8], a[35]); SQRADDAC(a[9], a[34]); SQRADDAC(a[10], a[33]); SQRADDAC(a[11], a[32]); SQRADDAC(a[12], a[31]); SQRADDAC(a[13], a[30]); SQRADDAC(a[14], a[29]); SQRADDAC(a[15], a[28]); SQRADDAC(a[16], a[27]); SQRADDAC(a[17], a[26]); SQRADDAC(a[18], a[25]); SQRADDAC(a[19], a[24]); SQRADDAC(a[20], a[23]); SQRADDAC(a[21], a[22]); SQRADDDB;
8542    COMBA_STORE(b[43]);
8543
8544    /* output 44 */
8545    CARRY_FORWARD;
8546    SQRADDSC(a[0], a[44]); SQRADDAC(a[1], a[43]); SQRADDAC(a[2], a[42]); SQRADDAC(a[3], a[41]); SQRADDAC(a[4], a[40]); SQRADDAC(a[5], a[39]); SQRADDAC(a[6], a[38]); SQRADDAC(a[7], a[37]); SQRADDAC(a[8], a[36]); SQRADDAC(a[9], a[35]); SQRADDAC(a[10], a[34]); SQRADDAC(a[11], a[33]); SQRADDAC(a[12], a[32]); SQRADDAC(a[13], a[31]); SQRADDAC(a[14], a[30]); SQRADDAC(a[15], a[29]); SQRADDAC(a[16], a[28]); SQRADDAC(a[17], a[27]); SQRADDAC(a[18], a[26]); SQRADDAC(a[19], a[25]); SQRADDAC(a[20], a[24]); SQRADDAC(a[21], a[23]); SQRADDDB; SQRADD(a[22], a[22]);
8547    COMBA_STORE(b[44]);
8548
8549    /* output 45 */
8550    CARRY_FORWARD;
8551    SQRADDSC(a[0], a[45]); SQRADDAC(a[1], a[44]); SQRADDAC(a[2], a[43]); SQRADDAC(a[3], a[42]); SQRADDAC(a[4], a[41]); SQRADDAC(a[5], a[40]); SQRADDAC(a[6], a[39]); SQRADDAC(a[7], a[38]); SQRADDAC(a[8], a[37]); SQRADDAC(a[9], a[36]); SQRADDAC(a[10], a[35]); SQRADDAC(a[11], a[34]); SQRADDAC(a[12], a[33]); SQRADDAC(a[13], a[32]); SQRADDAC(a[14], a[31]); SQRADDAC(a[15], a[30]); SQRADDAC(a[16], a[29]); SQRADDAC(a[17], a[28]); SQRADDAC(a[18], a[27]); SQRADDAC(a[19], a[26]); SQRADDAC(a[20], a[25]); SQRADDAC(a[21], a[24]); SQRADDAC(a[22], a[23]); SQRADDDB;
8552    COMBA_STORE(b[45]);
8553
8554    /* output 46 */
8555    CARRY_FORWARD;
8556    SQRADDSC(a[0], a[46]); SQRADDAC(a[1], a[45]); SQRADDAC(a[2], a[44]); SQRADDAC(a[3], a[43]); SQRADDAC(a[4], a[42]); SQRADDAC(a[5], a[41]); SQRADDAC(a[6], a[40]); SQRADDAC(a[7], a[39]); SQRADDAC(a[8], a[38]); SQRADDAC(a[9], a[37]); SQRADDAC(a[10], a[36]); SQRADDAC(a[11], a[35]); SQRADDAC(a[12], a[34]); SQRADDAC(a[13], a[33]); SQRADDAC(a[14], a[32]); SQRADDAC(a[15], a[31]); SQRADDAC(a[16], a[30]); SQRADDAC(a[17], a[29]); SQRADDAC(a[18], a[28]); SQRADDAC(a[19], a[27]); SQRADDAC(a[20], a[26]); SQRADDAC(a[21], a[25]); SQRADDAC(a[22], a[24]); SQRADDDB; SQRADD(a[23], a[23]);
8557    COMBA_STORE(b[46]);
8558
8559    /* output 47 */
8560    CARRY_FORWARD;
8561    SQRADDSC(a[0], a[47]); SQRADDAC(a[1], a[46]); SQRADDAC(a[2], a[45]); SQRADDAC(a[3], a[44]); SQRADDAC(a[4], a[43]); SQRADDAC(a[5], a[42]); SQRADDAC(a[6], a[41]); SQRADDAC(a[7], a[40]); SQRADDAC(a[8], a[39]); SQRADDAC(a[9], a[38]); SQRADDAC(a[10], a[37]); SQRADDAC(a[11], a[36]); SQRADDAC(a[12], a[35]); SQRADDAC(a[13], a[34]); SQRADDAC(a[14], a[33]); SQRADDAC(a[15], a[32]); SQRADDAC(a[16], a[31]); SQRADDAC(a[17], a[30]); SQRADDAC(a[18], a[29]); SQRADDAC(a[19], a[28]); SQRADDAC(a[20], a[27]); SQRADDAC(a[21], a[26]); SQRADDAC(a[22], a[25]); SQRADDAC(a[23], a[24]); SQRADDDB;
8562    COMBA_STORE(b[47]);
8563
8564    /* output 48 */
8565    CARRY_FORWARD;
8566    SQRADDSC(a[0], a[48]); SQRADDAC(a[1], a[47]); SQRADDAC(a[2], a[46]); SQRADDAC(a[3], a[45]); SQRADDAC(a[4], a[44]); SQRADDAC(a[5], a[43]); SQRADDAC(a[6], a[42]); SQRADDAC(a[7], a[41]); SQRADDAC(a[8], a[40]); SQRADDAC(a[9], a[39]); SQRADDAC(a[10], a[38]); SQRADDAC(a[11], a[37]); SQRADDAC(a[12], a[36]); SQRADDAC(a[13], a[35]); SQRADDAC(a[14], a[34]); SQRADDAC(a[15], a[33]); SQRADDAC(a[16], a[32]); SQRADDAC(a[17], a[31]); SQRADDAC(a[18], a[30]); SQRADDAC(a[19], a[29]); SQRADDAC(a[20], a[28]); SQRADDAC(a[21], a[27]); SQRADDAC(a[22], a[26]); SQRADDAC(a[23], a[25]); SQRADDDB; SQRADD(a[24], a[24]);
8567    COMBA_STORE(b[48]);
8568
8569    /* output 49 */
8570    CARRY_FORWARD;
8571    SQRADDSC(a[0], a[49]); SQRADDAC(a[1], a[48]); SQRADDAC(a[2], a[47]); SQRADDAC(a[3], a[46]); SQRADDAC(a[4], a[45]); SQRADDAC(a[5], a[44]); SQRADDAC(a[6], a[43]); SQRADDAC(a[7], a[42]); SQRADDAC(a[8], a[41]); SQRADDAC(a[9], a[40]); SQRADDAC(a[10], a[39]); SQRADDAC(a[11], a[38]); SQRADDAC(a[12], a[37]); SQRADDAC(a[13], a[36]); SQRADDAC(a[14], a[35]); SQRADDAC(a[15], a[34]); SQRADDAC(a[16], a[33]); SQRADDAC(a[17], a[32]); SQRADDAC(a[18], a[31]); SQRADDAC(a[19], a[30]); SQRADDAC(a[20], a[29]); SQRADDAC(a[21], a[28]); SQRADDAC(a[22], a[27]); SQRADDAC(a[23], a[26]); SQRADDAC(a[24], a[25]); SQRADDDB;
8572    COMBA_STORE(b[49]);
8573
8574    /* output 50 */
8575    CARRY_FORWARD;
8576    SQRADDSC(a[0], a[50]); SQRADDAC(a[1], a[49]); SQRADDAC(a[2], a[48]); SQRADDAC(a[3], a[47]); SQRADDAC(a[4], a[46]); SQRADDAC(a[5], a[45]); SQRADDAC(a[6], a[44]); SQRADDAC(a[7], a[43]); SQRADDAC(a[8], a[42]); SQRADDAC(a[9], a[41]); SQRADDAC(a[10], a[40]); SQRADDAC(a[11], a[39]); SQRADDAC(a[12], a[38]); SQRADDAC(a[13], a[37]); SQRADDAC(a[14], a[36]); SQRADDAC(a[15], a[35]); SQRADDAC(a[16], a[34]); SQRADDAC(a[17], a[33]); SQRADDAC(a[18], a[32]); SQRADDAC(a[19], a[31]); SQRADDAC(a[20], a[30]); SQRADDAC(a[21], a[29]); SQRADDAC(a[22], a[28]); SQRADDAC(a[23], a[27]); SQRADDAC(a[24], a[26]); SQRADDDB; SQRADD(a[25], a[25]);
8577    COMBA_STORE(b[50]);
8578
8579    /* output 51 */
8580    CARRY_FORWARD;
8581    SQRADDSC(a[0], a[51]); SQRADDAC(a[1], a[50]); SQRADDAC(a[2], a[49]); SQRADDAC(a[3], a[48]); SQRADDAC(a[4], a[47]); SQRADDAC(a[5], a[46]); SQRADDAC(a[6], a[45]); SQRADDAC(a[7], a[44]); SQRADDAC(a[8], a[43]); SQRADDAC(a[9], a[42]); SQRADDAC(a[10], a[41]); SQRADDAC(a[11], a[40]); SQRADDAC(a[12], a[39]); SQRADDAC(a[13], a[38]); SQRADDAC(a[14], a[37]); SQRADDAC(a[15], a[36]); SQRADDAC(a[16], a[35]); SQRADDAC(a[17], a[34]); SQRADDAC(a[18], a[33]); SQRADDAC(a[19], a[32]); SQRADDAC(a[20], a[31]); SQRADDAC(a[21], a[30]); SQRADDAC(a[22], a[29]); SQRADDAC(a[23], a[28]); SQRADDAC(a[24], a[27]); SQRADDAC(a[25], a[26]); SQRADDDB;
8582    COMBA_STORE(b[51]);
8583
8584    /* output 52 */
8585    CARRY_FORWARD;
8586    SQRADDSC(a[0], a[52]); SQRADDAC(a[1], a[51]); SQRADDAC(a[2], a[50]); SQRADDAC(a[3], a[49]); SQRADDAC(a[4], a[48]); SQRADDAC(a[5], a[47]); SQRADDAC(a[6], a[46]); SQRADDAC(a[7], a[45]); SQRADDAC(a[8], a[44]); SQRADDAC(a[9], a[43]); SQRADDAC(a[10], a[42]); SQRADDAC(a[11], a[41]); SQRADDAC(a[12], a[40]); SQRADDAC(a[13], a[39]); SQRADDAC(a[14], a[38]); SQRADDAC(a[15], a[37]); SQRADDAC(a[16], a[36]); SQRADDAC(a[17], a[35]); SQRADDAC(a[18], a[34]); SQRADDAC(a[19], a[33]); SQRADDAC(a[20], a[32]); SQRADDAC(a[21], a[31]); SQRADDAC(a[22], a[30]); SQRADDAC(a[23], a[29]); SQRADDAC(a[24], a[28]); SQRADDAC(a[25], a[27]); SQRADDDB; SQRADD(a[26], a[26]);
8587    COMBA_STORE(b[52]);
8588
8589    /* output 53 */
8590    CARRY_FORWARD;
8591    SQRADDSC(a[0], a[53]); SQRADDAC(a[1], a[52]); SQRADDAC(a[2], a[51]); SQRADDAC(a[3], a[50]); SQRADDAC(a[4], a[49]); SQRADDAC(a[5], a[48]); SQRADDAC(a[6], a[47]); SQRADDAC(a[7], a[46]); SQRADDAC(a[8], a[45]); SQRADDAC(a[9], a[44]); SQRADDAC(a[10], a[43]); SQRADDAC(a[11], a[42]); SQRADDAC(a[12], a[41]); SQRADDAC(a[13], a[40]); SQRADDAC(a[14], a[39]); SQRADDAC(a[15], a[38]); SQRADDAC(a[16], a[37]); SQRADDAC(a[17], a[36]); SQRADDAC(a[18], a[35]); SQRADDAC(a[19], a[34]); SQRADDAC(a[20], a[33]); SQRADDAC(a[21], a[32]); SQRADDAC(a[22], a[31]); SQRADDAC(a[23], a[30]); SQRADDAC(a[24], a[29]); SQRADDAC(a[25], a[28]); SQRADDAC(a[26], a[27]); SQRADDDB;
8592    COMBA_STORE(b[53]);
8593
8594    /* output 54 */
8595    CARRY_FORWARD;
8596    SQRADDSC(a[0], a[54]); SQRADDAC(a[1], a[53]); SQRADDAC(a[2], a[52]); SQRADDAC(a[3], a[51]); SQRADDAC(a[4], a[50]); SQRADDAC(a[5], a[49]); SQRADDAC(a[6], a[48]); SQRADDAC(a[7], a[47]); SQRADDAC(a[8], a[46]); SQRADDAC(a[9], a[45]); SQRADDAC(a[10], a[44]); SQRADDAC(a[11], a[43]); SQRADDAC(a[12], a[42]); SQRADDAC(a[13], a[41]); SQRADDAC(a[14], a[40]); SQRADDAC(a[15], a[39]); SQRADDAC(a[16], a[38]); SQRADDAC(a[17], a[37]); SQRADDAC(a[18], a[36]); SQRADDAC(a[19], a[35]); SQRADDAC(a[20], a[34]); SQRADDAC(a[21], a[33]); SQRADDAC(a[22], a[32]); SQRADDAC(a[23], a[31]); SQRADDAC(a[24], a[30]); SQRADDAC(a[25], a[29]); SQRADDAC(a[26], a[28]); SQRADDDB; SQRADD(a[27], a[27]);
8597    COMBA_STORE(b[54]);
8598
8599    /* output 55 */
8600    CARRY_FORWARD;
8601    SQRADDSC(a[0], a[55]); SQRADDAC(a[1], a[54]); SQRADDAC(a[2], a[53]); SQRADDAC(a[3], a[52]); SQRADDAC(a[4], a[51]); SQRADDAC(a[5], a[50]); SQRADDAC(a[6], a[49]); SQRADDAC(a[7], a[48]); SQRADDAC(a[8], a[47]); SQRADDAC(a[9], a[46]); SQRADDAC(a[10], a[45]); SQRADDAC(a[11], a[44]); SQRADDAC(a[12], a[43]); SQRADDAC(a[13], a[42]); SQRADDAC(a[14], a[41]); SQRADDAC(a[15], a[40]); SQRADDAC(a[16], a[39]); SQRADDAC(a[17], a[38]); SQRADDAC(a[18], a[37]); SQRADDAC(a[19], a[36]); SQRADDAC(a[20], a[35]); SQRADDAC(a[21], a[34]); SQRADDAC(a[22], a[33]); SQRADDAC(a[23], a[32]); SQRADDAC(a[24], a[31]); SQRADDAC(a[25], a[30]); SQRADDAC(a[26], a[29]); SQRADDAC(a[27], a[28]); SQRADDDB;
8602    COMBA_STORE(b[55]);
8603
8604    /* output 56 */
8605    CARRY_FORWARD;
8606    SQRADDSC(a[0], a[56]); SQRADDAC(a[1], a[55]); SQRADDAC(a[2], a[54]); SQRADDAC(a[3], a[53]); SQRADDAC(a[4], a[52]); SQRADDAC(a[5], a[51]); SQRADDAC(a[6], a[50]); SQRADDAC(a[7], a[49]); SQRADDAC(a[8], a[48]); SQRADDAC(a[9], a[47]); SQRADDAC(a[10], a[46]); SQRADDAC(a[11], a[45]); SQRADDAC(a[12], a[44]); SQRADDAC(a[13], a[43]); SQRADDAC(a[14], a[42]); SQRADDAC(a[15], a[41]); SQRADDAC(a[16], a[40]); SQRADDAC(a[17], a[39]); SQRADDAC(a[18], a[38]); SQRADDAC(a[19], a[37]); SQRADDAC(a[20], a[36]); SQRADDAC(a[21], a[35]); SQRADDAC(a[22], a[34]); SQRADDAC(a[23], a[33]); SQRADDAC(a[24], a[32]); SQRADDAC(a[25], a[31]); SQRADDAC(a[26], a[30]); SQRADDAC(a[27], a[29]); SQRADDDB; SQRADD(a[28], a[28]);
8607    COMBA_STORE(b[56]);
8608
8609    /* output 57 */
8610    CARRY_FORWARD;
8611    SQRADDSC(a[0], a[57]); SQRADDAC(a[1], a[56]); SQRADDAC(a[2], a[55]); SQRADDAC(a[3], a[54]); SQRADDAC(a[4], a[53]); SQRADDAC(a[5], a[52]); SQRADDAC(a[6], a[51]); SQRADDAC(a[7], a[50]); SQRADDAC(a[8], a[49]); SQRADDAC(a[9], a[48]); SQRADDAC(a[10], a[47]); SQRADDAC(a[11], a[46]); SQRADDAC(a[12], a[45]); SQRADDAC(a[13], a[44]); SQRADDAC(a[14], a[43]); SQRADDAC(a[15], a[42]); SQRADDAC(a[16], a[41]); SQRADDAC(a[17], a[40]); SQRADDAC(a[18], a[39]); SQRADDAC(a[19], a[38]); SQRADDAC(a[20], a[37]); SQRADDAC(a[21], a[36]); SQRADDAC(a[22], a[35]); SQRADDAC(a[23], a[34]); SQRADDAC(a[24], a[33]); SQRADDAC(a[25], a[32]); SQRADDAC(a[26], a[31]); SQRADDAC(a[27], a[30]); SQRADDAC(a[28], a[29]); SQRADDDB;
8612    COMBA_STORE(b[57]);
8613
8614    /* output 58 */
8615    CARRY_FORWARD;
8616    SQRADDSC(a[0], a[58]); SQRADDAC(a[1], a[57]); SQRADDAC(a[2], a[56]); SQRADDAC(a[3], a[55]); SQRADDAC(a[4], a[54]); SQRADDAC(a[5], a[53]); SQRADDAC(a[6], a[52]); SQRADDAC(a[7], a[51]); SQRADDAC(a[8], a[50]); SQRADDAC(a[9], a[49]); SQRADDAC(a[10], a[48]); SQRADDAC(a[11], a[47]); SQRADDAC(a[12], a[46]); SQRADDAC(a[13], a[45]); SQRADDAC(a[14], a[44]); SQRADDAC(a[15], a[43]); SQRADDAC(a[16], a[42]); SQRADDAC(a[17], a[41]); SQRADDAC(a[18], a[40]); SQRADDAC(a[19], a[39]); SQRADDAC(a[20], a[38]); SQRADDAC(a[21], a[37]); SQRADDAC(a[22], a[36]); SQRADDAC(a[23], a[35]); SQRADDAC(a[24], a[34]); SQRADDAC(a[25], a[33]); SQRADDAC(a[26], a[32]); SQRADDAC(a[27], a[31]); SQRADDAC(a[28], a[30]); SQRADDDB; SQRADD(a[29], a[29]);
8617    COMBA_STORE(b[58]);
8618
8619    /* output 59 */
8620    CARRY_FORWARD;
8621    SQRADDSC(a[0], a[59]); SQRADDAC(a[1], a[58]); SQRADDAC(a[2], a[57]); SQRADDAC(a[3], a[56]); SQRADDAC(a[4], a[55]); SQRADDAC(a[5], a[54]); SQRADDAC(a[6], a[53]); SQRADDAC(a[7], a[52]); SQRADDAC(a[8], a[51]); SQRADDAC(a[9], a[50]); SQRADDAC(a[10], a[49]); SQRADDAC(a[11], a[48]); SQRADDAC(a[12], a[47]); SQRADDAC(a[13], a[46]); SQRADDAC(a[14], a[45]); SQRADDAC(a[15], a[44]); SQRADDAC(a[16], a[43]); SQRADDAC(a[17], a[42]); SQRADDAC(a[18], a[41]); SQRADDAC(a[19], a[40]); SQRADDAC(a[20], a[39]); SQRADDAC(a[21], a[38]); SQRADDAC(a[22], a[37]); SQRADDAC(a[23], a[36]); SQRADDAC(a[24], a[35]); SQRADDAC(a[25], a[34]); SQRADDAC(a[26], a[33]); SQRADDAC(a[27], a[32]); SQRADDAC(a[28], a[31]); SQRADDAC(a[29], a[30]); SQRADDDB;
8622    COMBA_STORE(b[59]);
8623
8624    /* output 60 */
8625    CARRY_FORWARD;
8626    SQRADDSC(a[0], a[60]); SQRADDAC(a[1], a[59]); SQRADDAC(a[2], a[58]); SQRADDAC(a[3], a[57]); SQRADDAC(a[4], a[56]); SQRADDAC(a[5], a[55]); SQRADDAC(a[6], a[54]); SQRADDAC(a[7], a[53]); SQRADDAC(a[8], a[52]); SQRADDAC(a[9], a[51]); SQRADDAC(a[10], a[50]); SQRADDAC(a[11], a[49]); SQRADDAC(a[12], a[48]); SQRADDAC(a[13], a[47]); SQRADDAC(a[14], a[46]); SQRADDAC(a[15], a[45]); SQRADDAC(a[16], a[44]); SQRADDAC(a[17], a[43]); SQRADDAC(a[18], a[42]); SQRADDAC(a[19], a[41]); SQRADDAC(a[20], a[40]); SQRADDAC(a[21], a[39]); SQRADDAC(a[22], a[38]); SQRADDAC(a[23], a[37]); SQRADDAC(a[24], a[36]); SQRADDAC(a[25], a[35]); SQRADDAC(a[26], a[34]); SQRADDAC(a[27], a[33]); SQRADDAC(a[28], a[32]); SQRADDAC(a[29], a[31]); SQRADDDB; SQRADD(a[30], a[30]);
8627    COMBA_STORE(b[60]);
8628
8629    /* output 61 */
8630    CARRY_FORWARD;
8631    SQRADDSC(a[0], a[61]); SQRADDAC(a[1], a[60]); SQRADDAC(a[2], a[59]); SQRADDAC(a[3], a[58]); SQRADDAC(a[4], a[57]); SQRADDAC(a[5], a[56]); SQRADDAC(a[6], a[55]); SQRADDAC(a[7], a[54]); SQRADDAC(a[8], a[53]); SQRADDAC(a[9], a[52]); SQRADDAC(a[10], a[51]); SQRADDAC(a[11], a[50]); SQRADDAC(a[12], a[49]); SQRADDAC(a[13], a[48]); SQRADDAC(a[14], a[47]); SQRADDAC(a[15], a[46]); SQRADDAC(a[16], a[45]); SQRADDAC(a[17], a[44]); SQRADDAC(a[18], a[43]); SQRADDAC(a[19], a[42]); SQRADDAC(a[20], a[41]); SQRADDAC(a[21], a[40]); SQRADDAC(a[22], a[39]); SQRADDAC(a[23], a[38]); SQRADDAC(a[24], a[37]); SQRADDAC(a[25], a[36]); SQRADDAC(a[26], a[35]); SQRADDAC(a[27], a[34]); SQRADDAC(a[28], a[33]); SQRADDAC(a[29], a[32]); SQRADDAC(a[30], a[31]); SQRADDDB;
8632    COMBA_STORE(b[61]);
8633
8634    /* output 62 */
8635    CARRY_FORWARD;
8636    SQRADDSC(a[0], a[62]); SQRADDAC(a[1], a[61]); SQRADDAC(a[2], a[60]); SQRADDAC(a[3], a[59]); SQRADDAC(a[4], a[58]); SQRADDAC(a[5], a[57]); SQRADDAC(a[6], a[56]); SQRADDAC(a[7], a[55]); SQRADDAC(a[8], a[54]); SQRADDAC(a[9], a[53]); SQRADDAC(a[10], a[52]); SQRADDAC(a[11], a[51]); SQRADDAC(a[12], a[50]); SQRADDAC(a[13], a[49]); SQRADDAC(a[14], a[48]); SQRADDAC(a[15], a[47]); SQRADDAC(a[16], a[46]); SQRADDAC(a[17], a[45]); SQRADDAC(a[18], a[44]); SQRADDAC(a[19], a[43]); SQRADDAC(a[20], a[42]); SQRADDAC(a[21], a[41]); SQRADDAC(a[22], a[40]); SQRADDAC(a[23], a[39]); SQRADDAC(a[24], a[38]); SQRADDAC(a[25], a[37]); SQRADDAC(a[26], a[36]); SQRADDAC(a[27], a[35]); SQRADDAC(a[28], a[34]); SQRADDAC(a[29], a[33]); SQRADDAC(a[30], a[32]); SQRADDDB; SQRADD(a[31], a[31]);
8637    COMBA_STORE(b[62]);
8638
8639    /* output 63 */
8640    CARRY_FORWARD;
8641    SQRADDSC(a[0], a[63]); SQRADDAC(a[1], a[62]); SQRADDAC(a[2], a[61]); SQRADDAC(a[3], a[60]); SQRADDAC(a[4], a[59]); SQRADDAC(a[5], a[58]); SQRADDAC(a[6], a[57]); SQRADDAC(a[7], a[56]); SQRADDAC(a[8], a[55]); SQRADDAC(a[9], a[54]); SQRADDAC(a[10], a[53]); SQRADDAC(a[11], a[52]); SQRADDAC(a[12], a[51]); SQRADDAC(a[13], a[50]); SQRADDAC(a[14], a[49]); SQRADDAC(a[15], a[48]); SQRADDAC(a[16], a[47]); SQRADDAC(a[17], a[46]); SQRADDAC(a[18], a[45]); SQRADDAC(a[19], a[44]); SQRADDAC(a[20], a[43]); SQRADDAC(a[21], a[42]); SQRADDAC(a[22], a[41]); SQRADDAC(a[23], a[40]); SQRADDAC(a[24], a[39]); SQRADDAC(a[25], a[38]); SQRADDAC(a[26], a[37]); SQRADDAC(a[27], a[36]); SQRADDAC(a[28], a[35]); SQRADDAC(a[29], a[34]); SQRADDAC(a[30], a[33]); SQRADDAC(a[31], a[32]); SQRADDDB;
8642    COMBA_STORE(b[63]);
8643
8644    /* output 64 */
8645    CARRY_FORWARD;
8646    SQRADDSC(a[1], a[63]); SQRADDAC(a[2], a[62]); SQRADDAC(a[3], a[61]); SQRADDAC(a[4], a[60]); SQRADDAC(a[5], a[59]); SQRADDAC(a[6], a[58]); SQRADDAC(a[7], a[57]); SQRADDAC(a[8], a[56]); SQRADDAC(a[9], a[55]); SQRADDAC(a[10], a[54]); SQRADDAC(a[11], a[53]); SQRADDAC(a[12], a[52]); SQRADDAC(a[13], a[51]); SQRADDAC(a[14], a[50]); SQRADDAC(a[15], a[49]); SQRADDAC(a[16], a[48]); SQRADDAC(a[17], a[47]); SQRADDAC(a[18], a[46]); SQRADDAC(a[19], a[45]); SQRADDAC(a[20], a[44]); SQRADDAC(a[21], a[43]); SQRADDAC(a[22], a[42]); SQRADDAC(a[23], a[41]); SQRADDAC(a[24], a[40]); SQRADDAC(a[25], a[39]); SQRADDAC(a[26], a[38]); SQRADDAC(a[27], a[37]); SQRADDAC(a[28], a[36]); SQRADDAC(a[29], a[35]); SQRADDAC(a[30], a[34]); SQRADDAC(a[31], a[33]); SQRADDDB; SQRADD(a[32], a[32]);
8647    COMBA_STORE(b[64]);
8648
8649    /* output 65 */
8650    CARRY_FORWARD;
8651    SQRADDSC(a[2], a[63]); SQRADDAC(a[3], a[62]); SQRADDAC(a[4], a[61]); SQRADDAC(a[5], a[60]); SQRADDAC(a[6], a[59]); SQRADDAC(a[7], a[58]); SQRADDAC(a[8], a[57]); SQRADDAC(a[9], a[56]); SQRADDAC(a[10], a[55]); SQRADDAC(a[11], a[54]); SQRADDAC(a[12], a[53]); SQRADDAC(a[13], a[52]); SQRADDAC(a[14], a[51]); SQRADDAC(a[15], a[50]); SQRADDAC(a[16], a[49]); SQRADDAC(a[17], a[48]); SQRADDAC(a[18], a[47]); SQRADDAC(a[19], a[46]); SQRADDAC(a[20], a[45]); SQRADDAC(a[21], a[44]); SQRADDAC(a[22], a[43]); SQRADDAC(a[23], a[42]); SQRADDAC(a[24], a[41]); SQRADDAC(a[25], a[40]); SQRADDAC(a[26], a[39]); SQRADDAC(a[27], a[38]); SQRADDAC(a[28], a[37]); SQRADDAC(a[29], a[36]); SQRADDAC(a[30], a[35]); SQRADDAC(a[31], a[34]); SQRADDAC(a[32], a[33]); SQRADDDB;
8652    COMBA_STORE(b[65]);
8653
8654    /* output 66 */
8655    CARRY_FORWARD;
8656    SQRADDSC(a[3], a[63]); SQRADDAC(a[4], a[62]); SQRADDAC(a[5], a[61]); SQRADDAC(a[6], a[60]); SQRADDAC(a[7], a[59]); SQRADDAC(a[8], a[58]); SQRADDAC(a[9], a[57]); SQRADDAC(a[10], a[56]); SQRADDAC(a[11], a[55]); SQRADDAC(a[12], a[54]); SQRADDAC(a[13], a[53]); SQRADDAC(a[14], a[52]); SQRADDAC(a[15], a[51]); SQRADDAC(a[16], a[50]); SQRADDAC(a[17], a[49]); SQRADDAC(a[18], a[48]); SQRADDAC(a[19], a[47]); SQRADDAC(a[20], a[46]); SQRADDAC(a[21], a[45]); SQRADDAC(a[22], a[44]); SQRADDAC(a[23], a[43]); SQRADDAC(a[24], a[42]); SQRADDAC(a[25], a[41]); SQRADDAC(a[26], a[40]); SQRADDAC(a[27], a[39]); SQRADDAC(a[28], a[38]); SQRADDAC(a[29], a[37]); SQRADDAC(a[30], a[36]); SQRADDAC(a[31], a[35]); SQRADDAC(a[32], a[34]); SQRADDDB; SQRADD(a[33], a[33]);
8657    COMBA_STORE(b[66]);
8658
8659    /* output 67 */
8660    CARRY_FORWARD;
8661    SQRADDSC(a[4], a[63]); SQRADDAC(a[5], a[62]); SQRADDAC(a[6], a[61]); SQRADDAC(a[7], a[60]); SQRADDAC(a[8], a[59]); SQRADDAC(a[9], a[58]); SQRADDAC(a[10], a[57]); SQRADDAC(a[11], a[56]); SQRADDAC(a[12], a[55]); SQRADDAC(a[13], a[54]); SQRADDAC(a[14], a[53]); SQRADDAC(a[15], a[52]); SQRADDAC(a[16], a[51]); SQRADDAC(a[17], a[50]); SQRADDAC(a[18], a[49]); SQRADDAC(a[19], a[48]); SQRADDAC(a[20], a[47]); SQRADDAC(a[21], a[46]); SQRADDAC(a[22], a[45]); SQRADDAC(a[23], a[44]); SQRADDAC(a[24], a[43]); SQRADDAC(a[25], a[42]); SQRADDAC(a[26], a[41]); SQRADDAC(a[27], a[40]); SQRADDAC(a[28], a[39]); SQRADDAC(a[29], a[38]); SQRADDAC(a[30], a[37]); SQRADDAC(a[31], a[36]); SQRADDAC(a[32], a[35]); SQRADDAC(a[33], a[34]); SQRADDDB;
8662    COMBA_STORE(b[67]);
8663
8664    /* output 68 */
8665    CARRY_FORWARD;
8666    SQRADDSC(a[5], a[63]); SQRADDAC(a[6], a[62]); SQRADDAC(a[7], a[61]); SQRADDAC(a[8], a[60]); SQRADDAC(a[9], a[59]); SQRADDAC(a[10], a[58]); SQRADDAC(a[11], a[57]); SQRADDAC(a[12], a[56]); SQRADDAC(a[13], a[55]); SQRADDAC(a[14], a[54]); SQRADDAC(a[15], a[53]); SQRADDAC(a[16], a[52]); SQRADDAC(a[17], a[51]); SQRADDAC(a[18], a[50]); SQRADDAC(a[19], a[49]); SQRADDAC(a[20], a[48]); SQRADDAC(a[21], a[47]); SQRADDAC(a[22], a[46]); SQRADDAC(a[23], a[45]); SQRADDAC(a[24], a[44]); SQRADDAC(a[25], a[43]); SQRADDAC(a[26], a[42]); SQRADDAC(a[27], a[41]); SQRADDAC(a[28], a[40]); SQRADDAC(a[29], a[39]); SQRADDAC(a[30], a[38]); SQRADDAC(a[31], a[37]); SQRADDAC(a[32], a[36]); SQRADDAC(a[33], a[35]); SQRADDDB; SQRADD(a[34], a[34]);
8667    COMBA_STORE(b[68]);
8668
8669    /* output 69 */
8670    CARRY_FORWARD;
8671    SQRADDSC(a[6], a[63]); SQRADDAC(a[7], a[62]); SQRADDAC(a[8], a[61]); SQRADDAC(a[9], a[60]); SQRADDAC(a[10], a[59]); SQRADDAC(a[11], a[58]); SQRADDAC(a[12], a[57]); SQRADDAC(a[13], a[56]); SQRADDAC(a[14], a[55]); SQRADDAC(a[15], a[54]); SQRADDAC(a[16], a[53]); SQRADDAC(a[17], a[52]); SQRADDAC(a[18], a[51]); SQRADDAC(a[19], a[50]); SQRADDAC(a[20], a[49]); SQRADDAC(a[21], a[48]); SQRADDAC(a[22], a[47]); SQRADDAC(a[23], a[46]); SQRADDAC(a[24], a[45]); SQRADDAC(a[25], a[44]); SQRADDAC(a[26], a[43]); SQRADDAC(a[27], a[42]); SQRADDAC(a[28], a[41]); SQRADDAC(a[29], a[40]); SQRADDAC(a[30], a[39]); SQRADDAC(a[31], a[38]); SQRADDAC(a[32], a[37]); SQRADDAC(a[33], a[36]); SQRADDAC(a[34], a[35]); SQRADDDB;
8672    COMBA_STORE(b[69]);
8673
8674    /* output 70 */
8675    CARRY_FORWARD;
8676    SQRADDSC(a[7], a[63]); SQRADDAC(a[8], a[62]); SQRADDAC(a[9], a[61]); SQRADDAC(a[10], a[60]); SQRADDAC(a[11], a[59]); SQRADDAC(a[12], a[58]); SQRADDAC(a[13], a[57]); SQRADDAC(a[14], a[56]); SQRADDAC(a[15], a[55]); SQRADDAC(a[16], a[54]); SQRADDAC(a[17], a[53]); SQRADDAC(a[18], a[52]); SQRADDAC(a[19], a[51]); SQRADDAC(a[20], a[50]); SQRADDAC(a[21], a[49]); SQRADDAC(a[22], a[48]); SQRADDAC(a[23], a[47]); SQRADDAC(a[24], a[46]); SQRADDAC(a[25], a[45]); SQRADDAC(a[26], a[44]); SQRADDAC(a[27], a[43]); SQRADDAC(a[28], a[42]); SQRADDAC(a[29], a[41]); SQRADDAC(a[30], a[40]); SQRADDAC(a[31], a[39]); SQRADDAC(a[32], a[38]); SQRADDAC(a[33], a[37]); SQRADDAC(a[34], a[36]); SQRADDDB; SQRADD(a[35], a[35]);
8677    COMBA_STORE(b[70]);
8678
8679    /* output 71 */
8680    CARRY_FORWARD;
8681    SQRADDSC(a[8], a[63]); SQRADDAC(a[9], a[62]); SQRADDAC(a[10], a[61]); SQRADDAC(a[11], a[60]); SQRADDAC(a[12], a[59]); SQRADDAC(a[13], a[58]); SQRADDAC(a[14], a[57]); SQRADDAC(a[15], a[56]); SQRADDAC(a[16], a[55]); SQRADDAC(a[17], a[54]); SQRADDAC(a[18], a[53]); SQRADDAC(a[19], a[52]); SQRADDAC(a[20], a[51]); SQRADDAC(a[21], a[50]); SQRADDAC(a[22], a[49]); SQRADDAC(a[23], a[48]); SQRADDAC(a[24], a[47]); SQRADDAC(a[25], a[46]); SQRADDAC(a[26], a[45]); SQRADDAC(a[27], a[44]); SQRADDAC(a[28], a[43]); SQRADDAC(a[29], a[42]); SQRADDAC(a[30], a[41]); SQRADDAC(a[31], a[40]); SQRADDAC(a[32], a[39]); SQRADDAC(a[33], a[38]); SQRADDAC(a[34], a[37]); SQRADDAC(a[35], a[36]); SQRADDDB;
8682    COMBA_STORE(b[71]);
8683
8684    /* output 72 */
8685    CARRY_FORWARD;
8686    SQRADDSC(a[9], a[63]); SQRADDAC(a[10], a[62]); SQRADDAC(a[11], a[61]); SQRADDAC(a[12], a[60]); SQRADDAC(a[13], a[59]); SQRADDAC(a[14], a[58]); SQRADDAC(a[15], a[57]); SQRADDAC(a[16], a[56]); SQRADDAC(a[17], a[55]); SQRADDAC(a[18], a[54]); SQRADDAC(a[19], a[53]); SQRADDAC(a[20], a[52]); SQRADDAC(a[21], a[51]); SQRADDAC(a[22], a[50]); SQRADDAC(a[23], a[49]); SQRADDAC(a[24], a[48]); SQRADDAC(a[25], a[47]); SQRADDAC(a[26], a[46]); SQRADDAC(a[27], a[45]); SQRADDAC(a[28], a[44]); SQRADDAC(a[29], a[43]); SQRADDAC(a[30], a[42]); SQRADDAC(a[31], a[41]); SQRADDAC(a[32], a[40]); SQRADDAC(a[33], a[39]); SQRADDAC(a[34], a[38]); SQRADDAC(a[35], a[37]); SQRADDDB; SQRADD(a[36], a[36]);
8687    COMBA_STORE(b[72]);
8688
8689    /* output 73 */
8690    CARRY_FORWARD;
8691    SQRADDSC(a[10], a[63]); SQRADDAC(a[11], a[62]); SQRADDAC(a[12], a[61]); SQRADDAC(a[13], a[60]); SQRADDAC(a[14], a[59]); SQRADDAC(a[15], a[58]); SQRADDAC(a[16], a[57]); SQRADDAC(a[17], a[56]); SQRADDAC(a[18], a[55]); SQRADDAC(a[19], a[54]); SQRADDAC(a[20], a[53]); SQRADDAC(a[21], a[52]); SQRADDAC(a[22], a[51]); SQRADDAC(a[23], a[50]); SQRADDAC(a[24], a[49]); SQRADDAC(a[25], a[48]); SQRADDAC(a[26], a[47]); SQRADDAC(a[27], a[46]); SQRADDAC(a[28], a[45]); SQRADDAC(a[29], a[44]); SQRADDAC(a[30], a[43]); SQRADDAC(a[31], a[42]); SQRADDAC(a[32], a[41]); SQRADDAC(a[33], a[40]); SQRADDAC(a[34], a[39]); SQRADDAC(a[35], a[38]); SQRADDAC(a[36], a[37]); SQRADDDB;
8692    COMBA_STORE(b[73]);
8693
8694    /* output 74 */
8695    CARRY_FORWARD;
8696    SQRADDSC(a[11], a[63]); SQRADDAC(a[12], a[62]); SQRADDAC(a[13], a[61]); SQRADDAC(a[14], a[60]); SQRADDAC(a[15], a[59]); SQRADDAC(a[16], a[58]); SQRADDAC(a[17], a[57]); SQRADDAC(a[18], a[56]); SQRADDAC(a[19], a[55]); SQRADDAC(a[20], a[54]); SQRADDAC(a[21], a[53]); SQRADDAC(a[22], a[52]); SQRADDAC(a[23], a[51]); SQRADDAC(a[24], a[50]); SQRADDAC(a[25], a[49]); SQRADDAC(a[26], a[48]); SQRADDAC(a[27], a[47]); SQRADDAC(a[28], a[46]); SQRADDAC(a[29], a[45]); SQRADDAC(a[30], a[44]); SQRADDAC(a[31], a[43]); SQRADDAC(a[32], a[42]); SQRADDAC(a[33], a[41]); SQRADDAC(a[34], a[40]); SQRADDAC(a[35], a[39]); SQRADDAC(a[36], a[38]); SQRADDDB; SQRADD(a[37], a[37]);
8697    COMBA_STORE(b[74]);
8698
8699    /* output 75 */
8700    CARRY_FORWARD;
8701    SQRADDSC(a[12], a[63]); SQRADDAC(a[13], a[62]); SQRADDAC(a[14], a[61]); SQRADDAC(a[15], a[60]); SQRADDAC(a[16], a[59]); SQRADDAC(a[17], a[58]); SQRADDAC(a[18], a[57]); SQRADDAC(a[19], a[56]); SQRADDAC(a[20], a[55]); SQRADDAC(a[21], a[54]); SQRADDAC(a[22], a[53]); SQRADDAC(a[23], a[52]); SQRADDAC(a[24], a[51]); SQRADDAC(a[25], a[50]); SQRADDAC(a[26], a[49]); SQRADDAC(a[27], a[48]); SQRADDAC(a[28], a[47]); SQRADDAC(a[29], a[46]); SQRADDAC(a[30], a[45]); SQRADDAC(a[31], a[44]); SQRADDAC(a[32], a[43]); SQRADDAC(a[33], a[42]); SQRADDAC(a[34], a[41]); SQRADDAC(a[35], a[40]); SQRADDAC(a[36], a[39]); SQRADDAC(a[37], a[38]); SQRADDDB;
8702    COMBA_STORE(b[75]);
8703
8704    /* output 76 */
8705    CARRY_FORWARD;
8706    SQRADDSC(a[13], a[63]); SQRADDAC(a[14], a[62]); SQRADDAC(a[15], a[61]); SQRADDAC(a[16], a[60]); SQRADDAC(a[17], a[59]); SQRADDAC(a[18], a[58]); SQRADDAC(a[19], a[57]); SQRADDAC(a[20], a[56]); SQRADDAC(a[21], a[55]); SQRADDAC(a[22], a[54]); SQRADDAC(a[23], a[53]); SQRADDAC(a[24], a[52]); SQRADDAC(a[25], a[51]); SQRADDAC(a[26], a[50]); SQRADDAC(a[27], a[49]); SQRADDAC(a[28], a[48]); SQRADDAC(a[29], a[47]); SQRADDAC(a[30], a[46]); SQRADDAC(a[31], a[45]); SQRADDAC(a[32], a[44]); SQRADDAC(a[33], a[43]); SQRADDAC(a[34], a[42]); SQRADDAC(a[35], a[41]); SQRADDAC(a[36], a[40]); SQRADDAC(a[37], a[39]); SQRADDDB; SQRADD(a[38], a[38]);
8707    COMBA_STORE(b[76]);
8708
8709    /* output 77 */
8710    CARRY_FORWARD;
8711    SQRADDSC(a[14], a[63]); SQRADDAC(a[15], a[62]); SQRADDAC(a[16], a[61]); SQRADDAC(a[17], a[60]); SQRADDAC(a[18], a[59]); SQRADDAC(a[19], a[58]); SQRADDAC(a[20], a[57]); SQRADDAC(a[21], a[56]); SQRADDAC(a[22], a[55]); SQRADDAC(a[23], a[54]); SQRADDAC(a[24], a[53]); SQRADDAC(a[25], a[52]); SQRADDAC(a[26], a[51]); SQRADDAC(a[27], a[50]); SQRADDAC(a[28], a[49]); SQRADDAC(a[29], a[48]); SQRADDAC(a[30], a[47]); SQRADDAC(a[31], a[46]); SQRADDAC(a[32], a[45]); SQRADDAC(a[33], a[44]); SQRADDAC(a[34], a[43]); SQRADDAC(a[35], a[42]); SQRADDAC(a[36], a[41]); SQRADDAC(a[37], a[40]); SQRADDAC(a[38], a[39]); SQRADDDB;
8712    COMBA_STORE(b[77]);
8713
8714    /* output 78 */
8715    CARRY_FORWARD;
8716    SQRADDSC(a[15], a[63]); SQRADDAC(a[16], a[62]); SQRADDAC(a[17], a[61]); SQRADDAC(a[18], a[60]); SQRADDAC(a[19], a[59]); SQRADDAC(a[20], a[58]); SQRADDAC(a[21], a[57]); SQRADDAC(a[22], a[56]); SQRADDAC(a[23], a[55]); SQRADDAC(a[24], a[54]); SQRADDAC(a[25], a[53]); SQRADDAC(a[26], a[52]); SQRADDAC(a[27], a[51]); SQRADDAC(a[28], a[50]); SQRADDAC(a[29], a[49]); SQRADDAC(a[30], a[48]); SQRADDAC(a[31], a[47]); SQRADDAC(a[32], a[46]); SQRADDAC(a[33], a[45]); SQRADDAC(a[34], a[44]); SQRADDAC(a[35], a[43]); SQRADDAC(a[36], a[42]); SQRADDAC(a[37], a[41]); SQRADDAC(a[38], a[40]); SQRADDDB; SQRADD(a[39], a[39]);
8717    COMBA_STORE(b[78]);
8718
8719    /* output 79 */
8720    CARRY_FORWARD;
8721    SQRADDSC(a[16], a[63]); SQRADDAC(a[17], a[62]); SQRADDAC(a[18], a[61]); SQRADDAC(a[19], a[60]); SQRADDAC(a[20], a[59]); SQRADDAC(a[21], a[58]); SQRADDAC(a[22], a[57]); SQRADDAC(a[23], a[56]); SQRADDAC(a[24], a[55]); SQRADDAC(a[25], a[54]); SQRADDAC(a[26], a[53]); SQRADDAC(a[27], a[52]); SQRADDAC(a[28], a[51]); SQRADDAC(a[29], a[50]); SQRADDAC(a[30], a[49]); SQRADDAC(a[31], a[48]); SQRADDAC(a[32], a[47]); SQRADDAC(a[33], a[46]); SQRADDAC(a[34], a[45]); SQRADDAC(a[35], a[44]); SQRADDAC(a[36], a[43]); SQRADDAC(a[37], a[42]); SQRADDAC(a[38], a[41]); SQRADDAC(a[39], a[40]); SQRADDDB;
8722    COMBA_STORE(b[79]);
8723
8724    /* output 80 */
8725    CARRY_FORWARD;
8726    SQRADDSC(a[17], a[63]); SQRADDAC(a[18], a[62]); SQRADDAC(a[19], a[61]); SQRADDAC(a[20], a[60]); SQRADDAC(a[21], a[59]); SQRADDAC(a[22], a[58]); SQRADDAC(a[23], a[57]); SQRADDAC(a[24], a[56]); SQRADDAC(a[25], a[55]); SQRADDAC(a[26], a[54]); SQRADDAC(a[27], a[53]); SQRADDAC(a[28], a[52]); SQRADDAC(a[29], a[51]); SQRADDAC(a[30], a[50]); SQRADDAC(a[31], a[49]); SQRADDAC(a[32], a[48]); SQRADDAC(a[33], a[47]); SQRADDAC(a[34], a[46]); SQRADDAC(a[35], a[45]); SQRADDAC(a[36], a[44]); SQRADDAC(a[37], a[43]); SQRADDAC(a[38], a[42]); SQRADDAC(a[39], a[41]); SQRADDDB; SQRADD(a[40], a[40]);
8727    COMBA_STORE(b[80]);
8728
8729    /* output 81 */
8730    CARRY_FORWARD;
8731    SQRADDSC(a[18], a[63]); SQRADDAC(a[19], a[62]); SQRADDAC(a[20], a[61]); SQRADDAC(a[21], a[60]); SQRADDAC(a[22], a[59]); SQRADDAC(a[23], a[58]); SQRADDAC(a[24], a[57]); SQRADDAC(a[25], a[56]); SQRADDAC(a[26], a[55]); SQRADDAC(a[27], a[54]); SQRADDAC(a[28], a[53]); SQRADDAC(a[29], a[52]); SQRADDAC(a[30], a[51]); SQRADDAC(a[31], a[50]); SQRADDAC(a[32], a[49]); SQRADDAC(a[33], a[48]); SQRADDAC(a[34], a[47]); SQRADDAC(a[35], a[46]); SQRADDAC(a[36], a[45]); SQRADDAC(a[37], a[44]); SQRADDAC(a[38], a[43]); SQRADDAC(a[39], a[42]); SQRADDAC(a[40], a[41]); SQRADDDB;
8732    COMBA_STORE(b[81]);
8733
8734    /* output 82 */
8735    CARRY_FORWARD;
8736    SQRADDSC(a[19], a[63]); SQRADDAC(a[20], a[62]); SQRADDAC(a[21], a[61]); SQRADDAC(a[22], a[60]); SQRADDAC(a[23], a[59]); SQRADDAC(a[24], a[58]); SQRADDAC(a[25], a[57]); SQRADDAC(a[26], a[56]); SQRADDAC(a[27], a[55]); SQRADDAC(a[28], a[54]); SQRADDAC(a[29], a[53]); SQRADDAC(a[30], a[52]); SQRADDAC(a[31], a[51]); SQRADDAC(a[32], a[50]); SQRADDAC(a[33], a[49]); SQRADDAC(a[34], a[48]); SQRADDAC(a[35], a[47]); SQRADDAC(a[36], a[46]); SQRADDAC(a[37], a[45]); SQRADDAC(a[38], a[44]); SQRADDAC(a[39], a[43]); SQRADDAC(a[40], a[42]); SQRADDDB; SQRADD(a[41], a[41]);
8737    COMBA_STORE(b[82]);
8738
8739    /* output 83 */
8740    CARRY_FORWARD;
8741    SQRADDSC(a[20], a[63]); SQRADDAC(a[21], a[62]); SQRADDAC(a[22], a[61]); SQRADDAC(a[23], a[60]); SQRADDAC(a[24], a[59]); SQRADDAC(a[25], a[58]); SQRADDAC(a[26], a[57]); SQRADDAC(a[27], a[56]); SQRADDAC(a[28], a[55]); SQRADDAC(a[29], a[54]); SQRADDAC(a[30], a[53]); SQRADDAC(a[31], a[52]); SQRADDAC(a[32], a[51]); SQRADDAC(a[33], a[50]); SQRADDAC(a[34], a[49]); SQRADDAC(a[35], a[48]); SQRADDAC(a[36], a[47]); SQRADDAC(a[37], a[46]); SQRADDAC(a[38], a[45]); SQRADDAC(a[39], a[44]); SQRADDAC(a[40], a[43]); SQRADDAC(a[41], a[42]); SQRADDDB;
8742    COMBA_STORE(b[83]);
8743
8744    /* output 84 */
8745    CARRY_FORWARD;
8746    SQRADDSC(a[21], a[63]); SQRADDAC(a[22], a[62]); SQRADDAC(a[23], a[61]); SQRADDAC(a[24], a[60]); SQRADDAC(a[25], a[59]); SQRADDAC(a[26], a[58]); SQRADDAC(a[27], a[57]); SQRADDAC(a[28], a[56]); SQRADDAC(a[29], a[55]); SQRADDAC(a[30], a[54]); SQRADDAC(a[31], a[53]); SQRADDAC(a[32], a[52]); SQRADDAC(a[33], a[51]); SQRADDAC(a[34], a[50]); SQRADDAC(a[35], a[49]); SQRADDAC(a[36], a[48]); SQRADDAC(a[37], a[47]); SQRADDAC(a[38], a[46]); SQRADDAC(a[39], a[45]); SQRADDAC(a[40], a[44]); SQRADDAC(a[41], a[43]); SQRADDDB; SQRADD(a[42], a[42]);
8747    COMBA_STORE(b[84]);
8748
8749    /* output 85 */
8750    CARRY_FORWARD;
8751    SQRADDSC(a[22], a[63]); SQRADDAC(a[23], a[62]); SQRADDAC(a[24], a[61]); SQRADDAC(a[25], a[60]); SQRADDAC(a[26], a[59]); SQRADDAC(a[27], a[58]); SQRADDAC(a[28], a[57]); SQRADDAC(a[29], a[56]); SQRADDAC(a[30], a[55]); SQRADDAC(a[31], a[54]); SQRADDAC(a[32], a[53]); SQRADDAC(a[33], a[52]); SQRADDAC(a[34], a[51]); SQRADDAC(a[35], a[50]); SQRADDAC(a[36], a[49]); SQRADDAC(a[37], a[48]); SQRADDAC(a[38], a[47]); SQRADDAC(a[39], a[46]); SQRADDAC(a[40], a[45]); SQRADDAC(a[41], a[44]); SQRADDAC(a[42], a[43]); SQRADDDB;
8752    COMBA_STORE(b[85]);
8753
8754    /* output 86 */
8755    CARRY_FORWARD;
8756    SQRADDSC(a[23], a[63]); SQRADDAC(a[24], a[62]); SQRADDAC(a[25], a[61]); SQRADDAC(a[26], a[60]); SQRADDAC(a[27], a[59]); SQRADDAC(a[28], a[58]); SQRADDAC(a[29], a[57]); SQRADDAC(a[30], a[56]); SQRADDAC(a[31], a[55]); SQRADDAC(a[32], a[54]); SQRADDAC(a[33], a[53]); SQRADDAC(a[34], a[52]); SQRADDAC(a[35], a[51]); SQRADDAC(a[36], a[50]); SQRADDAC(a[37], a[49]); SQRADDAC(a[38], a[48]); SQRADDAC(a[39], a[47]); SQRADDAC(a[40], a[46]); SQRADDAC(a[41], a[45]); SQRADDAC(a[42], a[44]); SQRADDDB; SQRADD(a[43], a[43]);
8757    COMBA_STORE(b[86]);
8758
8759    /* output 87 */
8760    CARRY_FORWARD;
8761    SQRADDSC(a[24], a[63]); SQRADDAC(a[25], a[62]); SQRADDAC(a[26], a[61]); SQRADDAC(a[27], a[60]); SQRADDAC(a[28], a[59]); SQRADDAC(a[29], a[58]); SQRADDAC(a[30], a[57]); SQRADDAC(a[31], a[56]); SQRADDAC(a[32], a[55]); SQRADDAC(a[33], a[54]); SQRADDAC(a[34], a[53]); SQRADDAC(a[35], a[52]); SQRADDAC(a[36], a[51]); SQRADDAC(a[37], a[50]); SQRADDAC(a[38], a[49]); SQRADDAC(a[39], a[48]); SQRADDAC(a[40], a[47]); SQRADDAC(a[41], a[46]); SQRADDAC(a[42], a[45]); SQRADDAC(a[43], a[44]); SQRADDDB;
8762    COMBA_STORE(b[87]);
8763
8764    /* output 88 */
8765    CARRY_FORWARD;
8766    SQRADDSC(a[25], a[63]); SQRADDAC(a[26], a[62]); SQRADDAC(a[27], a[61]); SQRADDAC(a[28], a[60]); SQRADDAC(a[29], a[59]); SQRADDAC(a[30], a[58]); SQRADDAC(a[31], a[57]); SQRADDAC(a[32], a[56]); SQRADDAC(a[33], a[55]); SQRADDAC(a[34], a[54]); SQRADDAC(a[35], a[53]); SQRADDAC(a[36], a[52]); SQRADDAC(a[37], a[51]); SQRADDAC(a[38], a[50]); SQRADDAC(a[39], a[49]); SQRADDAC(a[40], a[48]); SQRADDAC(a[41], a[47]); SQRADDAC(a[42], a[46]); SQRADDAC(a[43], a[45]); SQRADDDB; SQRADD(a[44], a[44]);
8767    COMBA_STORE(b[88]);
8768
8769    /* output 89 */
8770    CARRY_FORWARD;
8771    SQRADDSC(a[26], a[63]); SQRADDAC(a[27], a[62]); SQRADDAC(a[28], a[61]); SQRADDAC(a[29], a[60]); SQRADDAC(a[30], a[59]); SQRADDAC(a[31], a[58]); SQRADDAC(a[32], a[57]); SQRADDAC(a[33], a[56]); SQRADDAC(a[34], a[55]); SQRADDAC(a[35], a[54]); SQRADDAC(a[36], a[53]); SQRADDAC(a[37], a[52]); SQRADDAC(a[38], a[51]); SQRADDAC(a[39], a[50]); SQRADDAC(a[40], a[49]); SQRADDAC(a[41], a[48]); SQRADDAC(a[42], a[47]); SQRADDAC(a[43], a[46]); SQRADDAC(a[44], a[45]); SQRADDDB;
8772    COMBA_STORE(b[89]);
8773
8774    /* output 90 */
8775    CARRY_FORWARD;
8776    SQRADDSC(a[27], a[63]); SQRADDAC(a[28], a[62]); SQRADDAC(a[29], a[61]); SQRADDAC(a[30], a[60]); SQRADDAC(a[31], a[59]); SQRADDAC(a[32], a[58]); SQRADDAC(a[33], a[57]); SQRADDAC(a[34], a[56]); SQRADDAC(a[35], a[55]); SQRADDAC(a[36], a[54]); SQRADDAC(a[37], a[53]); SQRADDAC(a[38], a[52]); SQRADDAC(a[39], a[51]); SQRADDAC(a[40], a[50]); SQRADDAC(a[41], a[49]); SQRADDAC(a[42], a[48]); SQRADDAC(a[43], a[47]); SQRADDAC(a[44], a[46]); SQRADDDB; SQRADD(a[45], a[45]);
8777    COMBA_STORE(b[90]);
8778
8779    /* output 91 */
8780    CARRY_FORWARD;
8781    SQRADDSC(a[28], a[63]); SQRADDAC(a[29], a[62]); SQRADDAC(a[30], a[61]); SQRADDAC(a[31], a[60]); SQRADDAC(a[32], a[59]); SQRADDAC(a[33], a[58]); SQRADDAC(a[34], a[57]); SQRADDAC(a[35], a[56]); SQRADDAC(a[36], a[55]); SQRADDAC(a[37], a[54]); SQRADDAC(a[38], a[53]); SQRADDAC(a[39], a[52]); SQRADDAC(a[40], a[51]); SQRADDAC(a[41], a[50]); SQRADDAC(a[42], a[49]); SQRADDAC(a[43], a[48]); SQRADDAC(a[44], a[47]); SQRADDAC(a[45], a[46]); SQRADDDB;
8782    COMBA_STORE(b[91]);
8783
8784    /* output 92 */
8785    CARRY_FORWARD;
8786    SQRADDSC(a[29], a[63]); SQRADDAC(a[30], a[62]); SQRADDAC(a[31], a[61]); SQRADDAC(a[32], a[60]); SQRADDAC(a[33], a[59]); SQRADDAC(a[34], a[58]); SQRADDAC(a[35], a[57]); SQRADDAC(a[36], a[56]); SQRADDAC(a[37], a[55]); SQRADDAC(a[38], a[54]); SQRADDAC(a[39], a[53]); SQRADDAC(a[40], a[52]); SQRADDAC(a[41], a[51]); SQRADDAC(a[42], a[50]); SQRADDAC(a[43], a[49]); SQRADDAC(a[44], a[48]); SQRADDAC(a[45], a[47]); SQRADDDB; SQRADD(a[46], a[46]);
8787    COMBA_STORE(b[92]);
8788
8789    /* output 93 */
8790    CARRY_FORWARD;
8791    SQRADDSC(a[30], a[63]); SQRADDAC(a[31], a[62]); SQRADDAC(a[32], a[61]); SQRADDAC(a[33], a[60]); SQRADDAC(a[34], a[59]); SQRADDAC(a[35], a[58]); SQRADDAC(a[36], a[57]); SQRADDAC(a[37], a[56]); SQRADDAC(a[38], a[55]); SQRADDAC(a[39], a[54]); SQRADDAC(a[40], a[53]); SQRADDAC(a[41], a[52]); SQRADDAC(a[42], a[51]); SQRADDAC(a[43], a[50]); SQRADDAC(a[44], a[49]); SQRADDAC(a[45], a[48]); SQRADDAC(a[46], a[47]); SQRADDDB;
8792    COMBA_STORE(b[93]);
8793
8794    /* output 94 */
8795    CARRY_FORWARD;
8796    SQRADDSC(a[31], a[63]); SQRADDAC(a[32], a[62]); SQRADDAC(a[33], a[61]); SQRADDAC(a[34], a[60]); SQRADDAC(a[35], a[59]); SQRADDAC(a[36], a[58]); SQRADDAC(a[37], a[57]); SQRADDAC(a[38], a[56]); SQRADDAC(a[39], a[55]); SQRADDAC(a[40], a[54]); SQRADDAC(a[41], a[53]); SQRADDAC(a[42], a[52]); SQRADDAC(a[43], a[51]); SQRADDAC(a[44], a[50]); SQRADDAC(a[45], a[49]); SQRADDAC(a[46], a[48]); SQRADDDB; SQRADD(a[47], a[47]);
8797    COMBA_STORE(b[94]);
8798
8799    /* output 95 */
8800    CARRY_FORWARD;
8801    SQRADDSC(a[32], a[63]); SQRADDAC(a[33], a[62]); SQRADDAC(a[34], a[61]); SQRADDAC(a[35], a[60]); SQRADDAC(a[36], a[59]); SQRADDAC(a[37], a[58]); SQRADDAC(a[38], a[57]); SQRADDAC(a[39], a[56]); SQRADDAC(a[40], a[55]); SQRADDAC(a[41], a[54]); SQRADDAC(a[42], a[53]); SQRADDAC(a[43], a[52]); SQRADDAC(a[44], a[51]); SQRADDAC(a[45], a[50]); SQRADDAC(a[46], a[49]); SQRADDAC(a[47], a[48]); SQRADDDB;
8802    COMBA_STORE(b[95]);
8803
8804    /* output 96 */
8805    CARRY_FORWARD;
8806    SQRADDSC(a[33], a[63]); SQRADDAC(a[34], a[62]); SQRADDAC(a[35], a[61]); SQRADDAC(a[36], a[60]); SQRADDAC(a[37], a[59]); SQRADDAC(a[38], a[58]); SQRADDAC(a[39], a[57]); SQRADDAC(a[40], a[56]); SQRADDAC(a[41], a[55]); SQRADDAC(a[42], a[54]); SQRADDAC(a[43], a[53]); SQRADDAC(a[44], a[52]); SQRADDAC(a[45], a[51]); SQRADDAC(a[46], a[50]); SQRADDAC(a[47], a[49]); SQRADDDB; SQRADD(a[48], a[48]);
8807    COMBA_STORE(b[96]);
8808
8809    /* output 97 */
8810    CARRY_FORWARD;
8811    SQRADDSC(a[34], a[63]); SQRADDAC(a[35], a[62]); SQRADDAC(a[36], a[61]); SQRADDAC(a[37], a[60]); SQRADDAC(a[38], a[59]); SQRADDAC(a[39], a[58]); SQRADDAC(a[40], a[57]); SQRADDAC(a[41], a[56]); SQRADDAC(a[42], a[55]); SQRADDAC(a[43], a[54]); SQRADDAC(a[44], a[53]); SQRADDAC(a[45], a[52]); SQRADDAC(a[46], a[51]); SQRADDAC(a[47], a[50]); SQRADDAC(a[48], a[49]); SQRADDDB;
8812    COMBA_STORE(b[97]);
8813
8814    /* output 98 */
8815    CARRY_FORWARD;
8816    SQRADDSC(a[35], a[63]); SQRADDAC(a[36], a[62]); SQRADDAC(a[37], a[61]); SQRADDAC(a[38], a[60]); SQRADDAC(a[39], a[59]); SQRADDAC(a[40], a[58]); SQRADDAC(a[41], a[57]); SQRADDAC(a[42], a[56]); SQRADDAC(a[43], a[55]); SQRADDAC(a[44], a[54]); SQRADDAC(a[45], a[53]); SQRADDAC(a[46], a[52]); SQRADDAC(a[47], a[51]); SQRADDAC(a[48], a[50]); SQRADDDB; SQRADD(a[49], a[49]);
8817    COMBA_STORE(b[98]);
8818
8819    /* output 99 */
8820    CARRY_FORWARD;
8821    SQRADDSC(a[36], a[63]); SQRADDAC(a[37], a[62]); SQRADDAC(a[38], a[61]); SQRADDAC(a[39], a[60]); SQRADDAC(a[40], a[59]); SQRADDAC(a[41], a[58]); SQRADDAC(a[42], a[57]); SQRADDAC(a[43], a[56]); SQRADDAC(a[44], a[55]); SQRADDAC(a[45], a[54]); SQRADDAC(a[46], a[53]); SQRADDAC(a[47], a[52]); SQRADDAC(a[48], a[51]); SQRADDAC(a[49], a[50]); SQRADDDB;
8822    COMBA_STORE(b[99]);
8823
8824    /* output 100 */
8825    CARRY_FORWARD;
8826    SQRADDSC(a[37], a[63]); SQRADDAC(a[38], a[62]); SQRADDAC(a[39], a[61]); SQRADDAC(a[40], a[60]); SQRADDAC(a[41], a[59]); SQRADDAC(a[42], a[58]); SQRADDAC(a[43], a[57]); SQRADDAC(a[44], a[56]); SQRADDAC(a[45], a[55]); SQRADDAC(a[46], a[54]); SQRADDAC(a[47], a[53]); SQRADDAC(a[48], a[52]); SQRADDAC(a[49], a[51]); SQRADDDB; SQRADD(a[50], a[50]);
8827    COMBA_STORE(b[100]);
8828
8829    /* output 101 */
8830    CARRY_FORWARD;
8831    SQRADDSC(a[38], a[63]); SQRADDAC(a[39], a[62]); SQRADDAC(a[40], a[61]); SQRADDAC(a[41], a[60]); SQRADDAC(a[42], a[59]); SQRADDAC(a[43], a[58]); SQRADDAC(a[44], a[57]); SQRADDAC(a[45], a[56]); SQRADDAC(a[46], a[55]); SQRADDAC(a[47], a[54]); SQRADDAC(a[48], a[53]); SQRADDAC(a[49], a[52]); SQRADDAC(a[50], a[51]); SQRADDDB;
8832    COMBA_STORE(b[101]);
8833
8834    /* output 102 */
8835    CARRY_FORWARD;
8836    SQRADDSC(a[39], a[63]); SQRADDAC(a[40], a[62]); SQRADDAC(a[41], a[61]); SQRADDAC(a[42], a[60]); SQRADDAC(a[43], a[59]); SQRADDAC(a[44], a[58]); SQRADDAC(a[45], a[57]); SQRADDAC(a[46], a[56]); SQRADDAC(a[47], a[55]); SQRADDAC(a[48], a[54]); SQRADDAC(a[49], a[53]); SQRADDAC(a[50], a[52]); SQRADDDB; SQRADD(a[51], a[51]);
8837    COMBA_STORE(b[102]);
8838
8839    /* output 103 */
8840    CARRY_FORWARD;
8841    SQRADDSC(a[40], a[63]); SQRADDAC(a[41], a[62]); SQRADDAC(a[42], a[61]); SQRADDAC(a[43], a[60]); SQRADDAC(a[44], a[59]); SQRADDAC(a[45], a[58]); SQRADDAC(a[46], a[57]); SQRADDAC(a[47], a[56]); SQRADDAC(a[48], a[55]); SQRADDAC(a[49], a[54]); SQRADDAC(a[50], a[53]); SQRADDAC(a[51], a[52]); SQRADDDB;
8842    COMBA_STORE(b[103]);
8843
8844    /* output 104 */
8845    CARRY_FORWARD;
8846    SQRADDSC(a[41], a[63]); SQRADDAC(a[42], a[62]); SQRADDAC(a[43], a[61]); SQRADDAC(a[44], a[60]); SQRADDAC(a[45], a[59]); SQRADDAC(a[46], a[58]); SQRADDAC(a[47], a[57]); SQRADDAC(a[48], a[56]); SQRADDAC(a[49], a[55]); SQRADDAC(a[50], a[54]); SQRADDAC(a[51], a[53]); SQRADDDB; SQRADD(a[52], a[52]);
8847    COMBA_STORE(b[104]);
8848
8849    /* output 105 */
8850    CARRY_FORWARD;
8851    SQRADDSC(a[42], a[63]); SQRADDAC(a[43], a[62]); SQRADDAC(a[44], a[61]); SQRADDAC(a[45], a[60]); SQRADDAC(a[46], a[59]); SQRADDAC(a[47], a[58]); SQRADDAC(a[48], a[57]); SQRADDAC(a[49], a[56]); SQRADDAC(a[50], a[55]); SQRADDAC(a[51], a[54]); SQRADDAC(a[52], a[53]); SQRADDDB;
8852    COMBA_STORE(b[105]);
8853
8854    /* output 106 */
8855    CARRY_FORWARD;
8856    SQRADDSC(a[43], a[63]); SQRADDAC(a[44], a[62]); SQRADDAC(a[45], a[61]); SQRADDAC(a[46], a[60]); SQRADDAC(a[47], a[59]); SQRADDAC(a[48], a[58]); SQRADDAC(a[49], a[57]); SQRADDAC(a[50], a[56]); SQRADDAC(a[51], a[55]); SQRADDAC(a[52], a[54]); SQRADDDB; SQRADD(a[53], a[53]);
8857    COMBA_STORE(b[106]);
8858
8859    /* output 107 */
8860    CARRY_FORWARD;
8861    SQRADDSC(a[44], a[63]); SQRADDAC(a[45], a[62]); SQRADDAC(a[46], a[61]); SQRADDAC(a[47], a[60]); SQRADDAC(a[48], a[59]); SQRADDAC(a[49], a[58]); SQRADDAC(a[50], a[57]); SQRADDAC(a[51], a[56]); SQRADDAC(a[52], a[55]); SQRADDAC(a[53], a[54]); SQRADDDB;
8862    COMBA_STORE(b[107]);
8863
8864    /* output 108 */
8865    CARRY_FORWARD;
8866    SQRADDSC(a[45], a[63]); SQRADDAC(a[46], a[62]); SQRADDAC(a[47], a[61]); SQRADDAC(a[48], a[60]); SQRADDAC(a[49], a[59]); SQRADDAC(a[50], a[58]); SQRADDAC(a[51], a[57]); SQRADDAC(a[52], a[56]); SQRADDAC(a[53], a[55]); SQRADDDB; SQRADD(a[54], a[54]);
8867    COMBA_STORE(b[108]);
8868
8869    /* output 109 */
8870    CARRY_FORWARD;
8871    SQRADDSC(a[46], a[63]); SQRADDAC(a[47], a[62]); SQRADDAC(a[48], a[61]); SQRADDAC(a[49], a[60]); SQRADDAC(a[50], a[59]); SQRADDAC(a[51], a[58]); SQRADDAC(a[52], a[57]); SQRADDAC(a[53], a[56]); SQRADDAC(a[54], a[55]); SQRADDDB;
8872    COMBA_STORE(b[109]);
8873
8874    /* output 110 */
8875    CARRY_FORWARD;
8876    SQRADDSC(a[47], a[63]); SQRADDAC(a[48], a[62]); SQRADDAC(a[49], a[61]); SQRADDAC(a[50], a[60]); SQRADDAC(a[51], a[59]); SQRADDAC(a[52], a[58]); SQRADDAC(a[53], a[57]); SQRADDAC(a[54], a[56]); SQRADDDB; SQRADD(a[55], a[55]);
8877    COMBA_STORE(b[110]);
8878
8879    /* output 111 */
8880    CARRY_FORWARD;
8881    SQRADDSC(a[48], a[63]); SQRADDAC(a[49], a[62]); SQRADDAC(a[50], a[61]); SQRADDAC(a[51], a[60]); SQRADDAC(a[52], a[59]); SQRADDAC(a[53], a[58]); SQRADDAC(a[54], a[57]); SQRADDAC(a[55], a[56]); SQRADDDB;
8882    COMBA_STORE(b[111]);
8883
8884    /* output 112 */
8885    CARRY_FORWARD;
8886    SQRADDSC(a[49], a[63]); SQRADDAC(a[50], a[62]); SQRADDAC(a[51], a[61]); SQRADDAC(a[52], a[60]); SQRADDAC(a[53], a[59]); SQRADDAC(a[54], a[58]); SQRADDAC(a[55], a[57]); SQRADDDB; SQRADD(a[56], a[56]);
8887    COMBA_STORE(b[112]);
8888
8889    /* output 113 */
8890    CARRY_FORWARD;
8891    SQRADDSC(a[50], a[63]); SQRADDAC(a[51], a[62]); SQRADDAC(a[52], a[61]); SQRADDAC(a[53], a[60]); SQRADDAC(a[54], a[59]); SQRADDAC(a[55], a[58]); SQRADDAC(a[56], a[57]); SQRADDDB;
8892    COMBA_STORE(b[113]);
8893
8894    /* output 114 */
8895    CARRY_FORWARD;
8896    SQRADDSC(a[51], a[63]); SQRADDAC(a[52], a[62]); SQRADDAC(a[53], a[61]); SQRADDAC(a[54], a[60]); SQRADDAC(a[55], a[59]); SQRADDAC(a[56], a[58]); SQRADDDB; SQRADD(a[57], a[57]);
8897    COMBA_STORE(b[114]);
8898
8899    /* output 115 */
8900    CARRY_FORWARD;
8901    SQRADDSC(a[52], a[63]); SQRADDAC(a[53], a[62]); SQRADDAC(a[54], a[61]); SQRADDAC(a[55], a[60]); SQRADDAC(a[56], a[59]); SQRADDAC(a[57], a[58]); SQRADDDB;
8902    COMBA_STORE(b[115]);
8903
8904    /* output 116 */
8905    CARRY_FORWARD;
8906    SQRADDSC(a[53], a[63]); SQRADDAC(a[54], a[62]); SQRADDAC(a[55], a[61]); SQRADDAC(a[56], a[60]); SQRADDAC(a[57], a[59]); SQRADDDB; SQRADD(a[58], a[58]);
8907    COMBA_STORE(b[116]);
8908
8909    /* output 117 */
8910    CARRY_FORWARD;
8911    SQRADDSC(a[54], a[63]); SQRADDAC(a[55], a[62]); SQRADDAC(a[56], a[61]); SQRADDAC(a[57], a[60]); SQRADDAC(a[58], a[59]); SQRADDDB;
8912    COMBA_STORE(b[117]);
8913
8914    /* output 118 */
8915    CARRY_FORWARD;
8916    SQRADDSC(a[55], a[63]); SQRADDAC(a[56], a[62]); SQRADDAC(a[57], a[61]); SQRADDAC(a[58], a[60]); SQRADDDB; SQRADD(a[59], a[59]);
8917    COMBA_STORE(b[118]);
8918
8919    /* output 119 */
8920    CARRY_FORWARD;
8921    SQRADDSC(a[56], a[63]); SQRADDAC(a[57], a[62]); SQRADDAC(a[58], a[61]); SQRADDAC(a[59], a[60]); SQRADDDB;
8922    COMBA_STORE(b[119]);
8923
8924    /* output 120 */
8925    CARRY_FORWARD;
8926    SQRADDSC(a[57], a[63]); SQRADDAC(a[58], a[62]); SQRADDAC(a[59], a[61]); SQRADDDB; SQRADD(a[60], a[60]);
8927    COMBA_STORE(b[120]);
8928
8929    /* output 121 */
8930    CARRY_FORWARD;
8931    SQRADDSC(a[58], a[63]); SQRADDAC(a[59], a[62]); SQRADDAC(a[60], a[61]); SQRADDDB;
8932    COMBA_STORE(b[121]);
8933
8934    /* output 122 */
8935    CARRY_FORWARD;
8936    SQRADD2(a[59], a[63]); SQRADD2(a[60], a[62]); SQRADD(a[61], a[61]);
8937    COMBA_STORE(b[122]);
8938
8939    /* output 123 */
8940    CARRY_FORWARD;
8941    SQRADD2(a[60], a[63]); SQRADD2(a[61], a[62]);
8942    COMBA_STORE(b[123]);
8943
8944    /* output 124 */
8945    CARRY_FORWARD;
8946    SQRADD2(a[61], a[63]); SQRADD(a[62], a[62]);
8947    COMBA_STORE(b[124]);
8948
8949    /* output 125 */
8950    CARRY_FORWARD;
8951    SQRADD2(a[62], a[63]);
8952    COMBA_STORE(b[125]);
8953
8954    /* output 126 */
8955    CARRY_FORWARD;
8956    SQRADD(a[63], a[63]);
8957    COMBA_STORE(b[126]);
8958    COMBA_STORE2(b[127]);
8959    COMBA_FINI;
8960
8961    B->used = 128;
8962    B->sign = TFM_FP_ZPOS;
8963    memcpy(B->dp, b, 128 * sizeof(tfm_fp_digit));
8964    tfm_fp_clamp(B);
8965 }
8966 #endif
8967
8968 #define TFM_DEFINES
8969
8970 #if defined(TFM_SMALL_SET)
8971 void tfm_fp_sqr_comba_small(tfm_fp_int *A, tfm_fp_int *B)
8972 {
8973    tfm_fp_digit *a, b[32], c0, c1, c2, sc0, sc1, sc2;
8974 #ifdef TFM_ISO
8975    tfm_fp_word   tt;
8976 #endif
8977    SILC_LOG_DEBUG(("Start"));
8978    switch (A->used) {
8979    case 1:
8980       a = A->dp;
8981       COMBA_START;
8982
8983       /* clear carries */
8984       CLEAR_CARRY;
8985
8986       /* output 0 */
8987       SQRADD(a[0],a[0]);
8988       COMBA_STORE(b[0]);
8989       COMBA_STORE2(b[1]);
8990       COMBA_FINI;
8991
8992       B->used = 2;
8993       B->sign = TFM_FP_ZPOS;
8994       memcpy(B->dp, b, 2 * sizeof(tfm_fp_digit));
8995       tfm_fp_clamp(B);
8996       break;
8997
8998    case 2:
8999       a = A->dp;
9000       COMBA_START;
9001
9002       /* clear carries */
9003       CLEAR_CARRY;
9004
9005       /* output 0 */
9006       SQRADD(a[0],a[0]);
9007       COMBA_STORE(b[0]);
9008
9009       /* output 1 */
9010       CARRY_FORWARD;
9011       SQRADD2(a[0], a[1]);
9012       COMBA_STORE(b[1]);
9013
9014       /* output 2 */
9015       CARRY_FORWARD;
9016       SQRADD(a[1], a[1]);
9017       COMBA_STORE(b[2]);
9018       COMBA_STORE2(b[3]);
9019       COMBA_FINI;
9020
9021       B->used = 4;
9022       B->sign = TFM_FP_ZPOS;
9023       memcpy(B->dp, b, 4 * sizeof(tfm_fp_digit));
9024       tfm_fp_clamp(B);
9025       break;
9026
9027    case 3:
9028       a = A->dp;
9029       COMBA_START;
9030
9031       /* clear carries */
9032       CLEAR_CARRY;
9033
9034       /* output 0 */
9035       SQRADD(a[0],a[0]);
9036       COMBA_STORE(b[0]);
9037
9038       /* output 1 */
9039       CARRY_FORWARD;
9040       SQRADD2(a[0], a[1]);
9041       COMBA_STORE(b[1]);
9042
9043       /* output 2 */
9044       CARRY_FORWARD;
9045       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]);
9046       COMBA_STORE(b[2]);
9047
9048       /* output 3 */
9049       CARRY_FORWARD;
9050       SQRADD2(a[1], a[2]);
9051       COMBA_STORE(b[3]);
9052
9053       /* output 4 */
9054       CARRY_FORWARD;
9055       SQRADD(a[2], a[2]);
9056       COMBA_STORE(b[4]);
9057       COMBA_STORE2(b[5]);
9058       COMBA_FINI;
9059
9060       B->used = 6;
9061       B->sign = TFM_FP_ZPOS;
9062       memcpy(B->dp, b, 6 * sizeof(tfm_fp_digit));
9063       tfm_fp_clamp(B);
9064       break;
9065
9066    case 4:
9067       a = A->dp;
9068       COMBA_START;
9069
9070       /* clear carries */
9071       CLEAR_CARRY;
9072
9073       /* output 0 */
9074       SQRADD(a[0],a[0]);
9075       COMBA_STORE(b[0]);
9076
9077       /* output 1 */
9078       CARRY_FORWARD;
9079       SQRADD2(a[0], a[1]);
9080       COMBA_STORE(b[1]);
9081
9082       /* output 2 */
9083       CARRY_FORWARD;
9084       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]);
9085       COMBA_STORE(b[2]);
9086
9087       /* output 3 */
9088       CARRY_FORWARD;
9089       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]);
9090       COMBA_STORE(b[3]);
9091
9092       /* output 4 */
9093       CARRY_FORWARD;
9094       SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]);
9095       COMBA_STORE(b[4]);
9096
9097       /* output 5 */
9098       CARRY_FORWARD;
9099       SQRADD2(a[2], a[3]);
9100       COMBA_STORE(b[5]);
9101
9102       /* output 6 */
9103       CARRY_FORWARD;
9104       SQRADD(a[3], a[3]);
9105       COMBA_STORE(b[6]);
9106       COMBA_STORE2(b[7]);
9107       COMBA_FINI;
9108
9109       B->used = 8;
9110       B->sign = TFM_FP_ZPOS;
9111       memcpy(B->dp, b, 8 * sizeof(tfm_fp_digit));
9112       tfm_fp_clamp(B);
9113       break;
9114
9115    case 5:
9116       a = A->dp;
9117       COMBA_START;
9118
9119       /* clear carries */
9120       CLEAR_CARRY;
9121
9122       /* output 0 */
9123       SQRADD(a[0],a[0]);
9124       COMBA_STORE(b[0]);
9125
9126       /* output 1 */
9127       CARRY_FORWARD;
9128       SQRADD2(a[0], a[1]);
9129       COMBA_STORE(b[1]);
9130
9131       /* output 2 */
9132       CARRY_FORWARD;
9133       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]);
9134       COMBA_STORE(b[2]);
9135
9136       /* output 3 */
9137       CARRY_FORWARD;
9138       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]);
9139       COMBA_STORE(b[3]);
9140
9141       /* output 4 */
9142       CARRY_FORWARD;
9143       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]);
9144       COMBA_STORE(b[4]);
9145
9146       /* output 5 */
9147       CARRY_FORWARD;
9148       SQRADD2(a[1], a[4]);    SQRADD2(a[2], a[3]);
9149       COMBA_STORE(b[5]);
9150
9151       /* output 6 */
9152       CARRY_FORWARD;
9153       SQRADD2(a[2], a[4]);    SQRADD(a[3], a[3]);
9154       COMBA_STORE(b[6]);
9155
9156       /* output 7 */
9157       CARRY_FORWARD;
9158       SQRADD2(a[3], a[4]);
9159       COMBA_STORE(b[7]);
9160
9161       /* output 8 */
9162       CARRY_FORWARD;
9163       SQRADD(a[4], a[4]);
9164       COMBA_STORE(b[8]);
9165       COMBA_STORE2(b[9]);
9166       COMBA_FINI;
9167
9168       B->used = 10;
9169       B->sign = TFM_FP_ZPOS;
9170       memcpy(B->dp, b, 10 * sizeof(tfm_fp_digit));
9171       tfm_fp_clamp(B);
9172       break;
9173
9174    case 6:
9175       a = A->dp;
9176       COMBA_START;
9177
9178       /* clear carries */
9179       CLEAR_CARRY;
9180
9181       /* output 0 */
9182       SQRADD(a[0],a[0]);
9183       COMBA_STORE(b[0]);
9184
9185       /* output 1 */
9186       CARRY_FORWARD;
9187       SQRADD2(a[0], a[1]);
9188       COMBA_STORE(b[1]);
9189
9190       /* output 2 */
9191       CARRY_FORWARD;
9192       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]);
9193       COMBA_STORE(b[2]);
9194
9195       /* output 3 */
9196       CARRY_FORWARD;
9197       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]);
9198       COMBA_STORE(b[3]);
9199
9200       /* output 4 */
9201       CARRY_FORWARD;
9202       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]);
9203       COMBA_STORE(b[4]);
9204
9205       /* output 5 */
9206       CARRY_FORWARD;
9207    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
9208       COMBA_STORE(b[5]);
9209
9210       /* output 6 */
9211       CARRY_FORWARD;
9212       SQRADD2(a[1], a[5]);    SQRADD2(a[2], a[4]);    SQRADD(a[3], a[3]);
9213       COMBA_STORE(b[6]);
9214
9215       /* output 7 */
9216       CARRY_FORWARD;
9217       SQRADD2(a[2], a[5]);    SQRADD2(a[3], a[4]);
9218       COMBA_STORE(b[7]);
9219
9220       /* output 8 */
9221       CARRY_FORWARD;
9222       SQRADD2(a[3], a[5]);    SQRADD(a[4], a[4]);
9223       COMBA_STORE(b[8]);
9224
9225       /* output 9 */
9226       CARRY_FORWARD;
9227       SQRADD2(a[4], a[5]);
9228       COMBA_STORE(b[9]);
9229
9230       /* output 10 */
9231       CARRY_FORWARD;
9232       SQRADD(a[5], a[5]);
9233       COMBA_STORE(b[10]);
9234       COMBA_STORE2(b[11]);
9235       COMBA_FINI;
9236
9237       B->used = 12;
9238       B->sign = TFM_FP_ZPOS;
9239       memcpy(B->dp, b, 12 * sizeof(tfm_fp_digit));
9240       tfm_fp_clamp(B);
9241       break;
9242
9243    case 7:
9244       a = A->dp;
9245       COMBA_START;
9246
9247       /* clear carries */
9248       CLEAR_CARRY;
9249
9250       /* output 0 */
9251       SQRADD(a[0],a[0]);
9252       COMBA_STORE(b[0]);
9253
9254       /* output 1 */
9255       CARRY_FORWARD;
9256       SQRADD2(a[0], a[1]);
9257       COMBA_STORE(b[1]);
9258
9259       /* output 2 */
9260       CARRY_FORWARD;
9261       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]);
9262       COMBA_STORE(b[2]);
9263
9264       /* output 3 */
9265       CARRY_FORWARD;
9266       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]);
9267       COMBA_STORE(b[3]);
9268
9269       /* output 4 */
9270       CARRY_FORWARD;
9271       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]);
9272       COMBA_STORE(b[4]);
9273
9274       /* output 5 */
9275       CARRY_FORWARD;
9276    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
9277       COMBA_STORE(b[5]);
9278
9279       /* output 6 */
9280       CARRY_FORWARD;
9281    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
9282       COMBA_STORE(b[6]);
9283
9284       /* output 7 */
9285       CARRY_FORWARD;
9286    SQRADDSC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
9287       COMBA_STORE(b[7]);
9288
9289       /* output 8 */
9290       CARRY_FORWARD;
9291       SQRADD2(a[2], a[6]);    SQRADD2(a[3], a[5]);    SQRADD(a[4], a[4]);
9292       COMBA_STORE(b[8]);
9293
9294       /* output 9 */
9295       CARRY_FORWARD;
9296       SQRADD2(a[3], a[6]);    SQRADD2(a[4], a[5]);
9297       COMBA_STORE(b[9]);
9298
9299       /* output 10 */
9300       CARRY_FORWARD;
9301       SQRADD2(a[4], a[6]);    SQRADD(a[5], a[5]);
9302       COMBA_STORE(b[10]);
9303
9304       /* output 11 */
9305       CARRY_FORWARD;
9306       SQRADD2(a[5], a[6]);
9307       COMBA_STORE(b[11]);
9308
9309       /* output 12 */
9310       CARRY_FORWARD;
9311       SQRADD(a[6], a[6]);
9312       COMBA_STORE(b[12]);
9313       COMBA_STORE2(b[13]);
9314       COMBA_FINI;
9315
9316       B->used = 14;
9317       B->sign = TFM_FP_ZPOS;
9318       memcpy(B->dp, b, 14 * sizeof(tfm_fp_digit));
9319       tfm_fp_clamp(B);
9320       break;
9321
9322    case 8:
9323       a = A->dp;
9324       COMBA_START;
9325
9326       /* clear carries */
9327       CLEAR_CARRY;
9328
9329       /* output 0 */
9330       SQRADD(a[0],a[0]);
9331       COMBA_STORE(b[0]);
9332
9333       /* output 1 */
9334       CARRY_FORWARD;
9335       SQRADD2(a[0], a[1]);
9336       COMBA_STORE(b[1]);
9337
9338       /* output 2 */
9339       CARRY_FORWARD;
9340       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]);
9341       COMBA_STORE(b[2]);
9342
9343       /* output 3 */
9344       CARRY_FORWARD;
9345       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]);
9346       COMBA_STORE(b[3]);
9347
9348       /* output 4 */
9349       CARRY_FORWARD;
9350       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]);
9351       COMBA_STORE(b[4]);
9352
9353       /* output 5 */
9354       CARRY_FORWARD;
9355    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
9356       COMBA_STORE(b[5]);
9357
9358       /* output 6 */
9359       CARRY_FORWARD;
9360    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
9361       COMBA_STORE(b[6]);
9362
9363       /* output 7 */
9364       CARRY_FORWARD;
9365    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
9366       COMBA_STORE(b[7]);
9367
9368       /* output 8 */
9369       CARRY_FORWARD;
9370    SQRADDSC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
9371       COMBA_STORE(b[8]);
9372
9373       /* output 9 */
9374       CARRY_FORWARD;
9375    SQRADDSC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
9376       COMBA_STORE(b[9]);
9377
9378       /* output 10 */
9379       CARRY_FORWARD;
9380       SQRADD2(a[3], a[7]);    SQRADD2(a[4], a[6]);    SQRADD(a[5], a[5]);
9381       COMBA_STORE(b[10]);
9382
9383       /* output 11 */
9384       CARRY_FORWARD;
9385       SQRADD2(a[4], a[7]);    SQRADD2(a[5], a[6]);
9386       COMBA_STORE(b[11]);
9387
9388       /* output 12 */
9389       CARRY_FORWARD;
9390       SQRADD2(a[5], a[7]);    SQRADD(a[6], a[6]);
9391       COMBA_STORE(b[12]);
9392
9393       /* output 13 */
9394       CARRY_FORWARD;
9395       SQRADD2(a[6], a[7]);
9396       COMBA_STORE(b[13]);
9397
9398       /* output 14 */
9399       CARRY_FORWARD;
9400       SQRADD(a[7], a[7]);
9401       COMBA_STORE(b[14]);
9402       COMBA_STORE2(b[15]);
9403       COMBA_FINI;
9404
9405       B->used = 16;
9406       B->sign = TFM_FP_ZPOS;
9407       memcpy(B->dp, b, 16 * sizeof(tfm_fp_digit));
9408       tfm_fp_clamp(B);
9409       break;
9410
9411    case 9:
9412       a = A->dp;
9413       COMBA_START;
9414
9415       /* clear carries */
9416       CLEAR_CARRY;
9417
9418       /* output 0 */
9419       SQRADD(a[0],a[0]);
9420       COMBA_STORE(b[0]);
9421
9422       /* output 1 */
9423       CARRY_FORWARD;
9424       SQRADD2(a[0], a[1]);
9425       COMBA_STORE(b[1]);
9426
9427       /* output 2 */
9428       CARRY_FORWARD;
9429       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]);
9430       COMBA_STORE(b[2]);
9431
9432       /* output 3 */
9433       CARRY_FORWARD;
9434       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]);
9435       COMBA_STORE(b[3]);
9436
9437       /* output 4 */
9438       CARRY_FORWARD;
9439       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]);
9440       COMBA_STORE(b[4]);
9441
9442       /* output 5 */
9443       CARRY_FORWARD;
9444    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
9445       COMBA_STORE(b[5]);
9446
9447       /* output 6 */
9448       CARRY_FORWARD;
9449    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
9450       COMBA_STORE(b[6]);
9451
9452       /* output 7 */
9453       CARRY_FORWARD;
9454    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
9455       COMBA_STORE(b[7]);
9456
9457       /* output 8 */
9458       CARRY_FORWARD;
9459    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
9460       COMBA_STORE(b[8]);
9461
9462       /* output 9 */
9463       CARRY_FORWARD;
9464    SQRADDSC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
9465       COMBA_STORE(b[9]);
9466
9467       /* output 10 */
9468       CARRY_FORWARD;
9469    SQRADDSC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]);
9470       COMBA_STORE(b[10]);
9471
9472       /* output 11 */
9473       CARRY_FORWARD;
9474    SQRADDSC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB;
9475       COMBA_STORE(b[11]);
9476
9477       /* output 12 */
9478       CARRY_FORWARD;
9479       SQRADD2(a[4], a[8]);    SQRADD2(a[5], a[7]);    SQRADD(a[6], a[6]);
9480       COMBA_STORE(b[12]);
9481
9482       /* output 13 */
9483       CARRY_FORWARD;
9484       SQRADD2(a[5], a[8]);    SQRADD2(a[6], a[7]);
9485       COMBA_STORE(b[13]);
9486
9487       /* output 14 */
9488       CARRY_FORWARD;
9489       SQRADD2(a[6], a[8]);    SQRADD(a[7], a[7]);
9490       COMBA_STORE(b[14]);
9491
9492       /* output 15 */
9493       CARRY_FORWARD;
9494       SQRADD2(a[7], a[8]);
9495       COMBA_STORE(b[15]);
9496
9497       /* output 16 */
9498       CARRY_FORWARD;
9499       SQRADD(a[8], a[8]);
9500       COMBA_STORE(b[16]);
9501       COMBA_STORE2(b[17]);
9502       COMBA_FINI;
9503
9504       B->used = 18;
9505       B->sign = TFM_FP_ZPOS;
9506       memcpy(B->dp, b, 18 * sizeof(tfm_fp_digit));
9507       tfm_fp_clamp(B);
9508       break;
9509
9510    case 10:
9511       a = A->dp;
9512       COMBA_START;
9513
9514       /* clear carries */
9515       CLEAR_CARRY;
9516
9517       /* output 0 */
9518       SQRADD(a[0],a[0]);
9519       COMBA_STORE(b[0]);
9520
9521       /* output 1 */
9522       CARRY_FORWARD;
9523       SQRADD2(a[0], a[1]);
9524       COMBA_STORE(b[1]);
9525
9526       /* output 2 */
9527       CARRY_FORWARD;
9528       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]);
9529       COMBA_STORE(b[2]);
9530
9531       /* output 3 */
9532       CARRY_FORWARD;
9533       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]);
9534       COMBA_STORE(b[3]);
9535
9536       /* output 4 */
9537       CARRY_FORWARD;
9538       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]);
9539       COMBA_STORE(b[4]);
9540
9541       /* output 5 */
9542       CARRY_FORWARD;
9543    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
9544       COMBA_STORE(b[5]);
9545
9546       /* output 6 */
9547       CARRY_FORWARD;
9548    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
9549       COMBA_STORE(b[6]);
9550
9551       /* output 7 */
9552       CARRY_FORWARD;
9553    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
9554       COMBA_STORE(b[7]);
9555
9556       /* output 8 */
9557       CARRY_FORWARD;
9558    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
9559       COMBA_STORE(b[8]);
9560
9561       /* output 9 */
9562       CARRY_FORWARD;
9563    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
9564       COMBA_STORE(b[9]);
9565
9566       /* output 10 */
9567       CARRY_FORWARD;
9568    SQRADDSC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]);
9569       COMBA_STORE(b[10]);
9570
9571       /* output 11 */
9572       CARRY_FORWARD;
9573    SQRADDSC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB;
9574       COMBA_STORE(b[11]);
9575
9576       /* output 12 */
9577       CARRY_FORWARD;
9578    SQRADDSC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]);
9579       COMBA_STORE(b[12]);
9580
9581       /* output 13 */
9582       CARRY_FORWARD;
9583    SQRADDSC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB;
9584       COMBA_STORE(b[13]);
9585
9586       /* output 14 */
9587       CARRY_FORWARD;
9588       SQRADD2(a[5], a[9]);    SQRADD2(a[6], a[8]);    SQRADD(a[7], a[7]);
9589       COMBA_STORE(b[14]);
9590
9591       /* output 15 */
9592       CARRY_FORWARD;
9593       SQRADD2(a[6], a[9]);    SQRADD2(a[7], a[8]);
9594       COMBA_STORE(b[15]);
9595
9596       /* output 16 */
9597       CARRY_FORWARD;
9598       SQRADD2(a[7], a[9]);    SQRADD(a[8], a[8]);
9599       COMBA_STORE(b[16]);
9600
9601       /* output 17 */
9602       CARRY_FORWARD;
9603       SQRADD2(a[8], a[9]);
9604       COMBA_STORE(b[17]);
9605
9606       /* output 18 */
9607       CARRY_FORWARD;
9608       SQRADD(a[9], a[9]);
9609       COMBA_STORE(b[18]);
9610       COMBA_STORE2(b[19]);
9611       COMBA_FINI;
9612
9613       B->used = 20;
9614       B->sign = TFM_FP_ZPOS;
9615       memcpy(B->dp, b, 20 * sizeof(tfm_fp_digit));
9616       tfm_fp_clamp(B);
9617       break;
9618
9619    case 11:
9620       a = A->dp;
9621       COMBA_START;
9622
9623       /* clear carries */
9624       CLEAR_CARRY;
9625
9626       /* output 0 */
9627       SQRADD(a[0],a[0]);
9628       COMBA_STORE(b[0]);
9629
9630       /* output 1 */
9631       CARRY_FORWARD;
9632       SQRADD2(a[0], a[1]);
9633       COMBA_STORE(b[1]);
9634
9635       /* output 2 */
9636       CARRY_FORWARD;
9637       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]);
9638       COMBA_STORE(b[2]);
9639
9640       /* output 3 */
9641       CARRY_FORWARD;
9642       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]);
9643       COMBA_STORE(b[3]);
9644
9645       /* output 4 */
9646       CARRY_FORWARD;
9647       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]);
9648       COMBA_STORE(b[4]);
9649
9650       /* output 5 */
9651       CARRY_FORWARD;
9652    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
9653       COMBA_STORE(b[5]);
9654
9655       /* output 6 */
9656       CARRY_FORWARD;
9657    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
9658       COMBA_STORE(b[6]);
9659
9660       /* output 7 */
9661       CARRY_FORWARD;
9662    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
9663       COMBA_STORE(b[7]);
9664
9665       /* output 8 */
9666       CARRY_FORWARD;
9667    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
9668       COMBA_STORE(b[8]);
9669
9670       /* output 9 */
9671       CARRY_FORWARD;
9672    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
9673       COMBA_STORE(b[9]);
9674
9675       /* output 10 */
9676       CARRY_FORWARD;
9677    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]);
9678       COMBA_STORE(b[10]);
9679
9680       /* output 11 */
9681       CARRY_FORWARD;
9682    SQRADDSC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB;
9683       COMBA_STORE(b[11]);
9684
9685       /* output 12 */
9686       CARRY_FORWARD;
9687    SQRADDSC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]);
9688       COMBA_STORE(b[12]);
9689
9690       /* output 13 */
9691       CARRY_FORWARD;
9692    SQRADDSC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB;
9693       COMBA_STORE(b[13]);
9694
9695       /* output 14 */
9696       CARRY_FORWARD;
9697    SQRADDSC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]);
9698       COMBA_STORE(b[14]);
9699
9700       /* output 15 */
9701       CARRY_FORWARD;
9702    SQRADDSC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB;
9703       COMBA_STORE(b[15]);
9704
9705       /* output 16 */
9706       CARRY_FORWARD;
9707       SQRADD2(a[6], a[10]);    SQRADD2(a[7], a[9]);    SQRADD(a[8], a[8]);
9708       COMBA_STORE(b[16]);
9709
9710       /* output 17 */
9711       CARRY_FORWARD;
9712       SQRADD2(a[7], a[10]);    SQRADD2(a[8], a[9]);
9713       COMBA_STORE(b[17]);
9714
9715       /* output 18 */
9716       CARRY_FORWARD;
9717       SQRADD2(a[8], a[10]);    SQRADD(a[9], a[9]);
9718       COMBA_STORE(b[18]);
9719
9720       /* output 19 */
9721       CARRY_FORWARD;
9722       SQRADD2(a[9], a[10]);
9723       COMBA_STORE(b[19]);
9724
9725       /* output 20 */
9726       CARRY_FORWARD;
9727       SQRADD(a[10], a[10]);
9728       COMBA_STORE(b[20]);
9729       COMBA_STORE2(b[21]);
9730       COMBA_FINI;
9731
9732       B->used = 22;
9733       B->sign = TFM_FP_ZPOS;
9734       memcpy(B->dp, b, 22 * sizeof(tfm_fp_digit));
9735       tfm_fp_clamp(B);
9736       break;
9737
9738    case 12:
9739       a = A->dp;
9740       COMBA_START;
9741
9742       /* clear carries */
9743       CLEAR_CARRY;
9744
9745       /* output 0 */
9746       SQRADD(a[0],a[0]);
9747       COMBA_STORE(b[0]);
9748
9749       /* output 1 */
9750       CARRY_FORWARD;
9751       SQRADD2(a[0], a[1]);
9752       COMBA_STORE(b[1]);
9753
9754       /* output 2 */
9755       CARRY_FORWARD;
9756       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]);
9757       COMBA_STORE(b[2]);
9758
9759       /* output 3 */
9760       CARRY_FORWARD;
9761       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]);
9762       COMBA_STORE(b[3]);
9763
9764       /* output 4 */
9765       CARRY_FORWARD;
9766       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]);
9767       COMBA_STORE(b[4]);
9768
9769       /* output 5 */
9770       CARRY_FORWARD;
9771    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
9772       COMBA_STORE(b[5]);
9773
9774       /* output 6 */
9775       CARRY_FORWARD;
9776    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
9777       COMBA_STORE(b[6]);
9778
9779       /* output 7 */
9780       CARRY_FORWARD;
9781    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
9782       COMBA_STORE(b[7]);
9783
9784       /* output 8 */
9785       CARRY_FORWARD;
9786    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
9787       COMBA_STORE(b[8]);
9788
9789       /* output 9 */
9790       CARRY_FORWARD;
9791    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
9792       COMBA_STORE(b[9]);
9793
9794       /* output 10 */
9795       CARRY_FORWARD;
9796    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]);
9797       COMBA_STORE(b[10]);
9798
9799       /* output 11 */
9800       CARRY_FORWARD;
9801    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB;
9802       COMBA_STORE(b[11]);
9803
9804       /* output 12 */
9805       CARRY_FORWARD;
9806    SQRADDSC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]);
9807       COMBA_STORE(b[12]);
9808
9809       /* output 13 */
9810       CARRY_FORWARD;
9811    SQRADDSC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB;
9812       COMBA_STORE(b[13]);
9813
9814       /* output 14 */
9815       CARRY_FORWARD;
9816    SQRADDSC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]);
9817       COMBA_STORE(b[14]);
9818
9819       /* output 15 */
9820       CARRY_FORWARD;
9821    SQRADDSC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB;
9822       COMBA_STORE(b[15]);
9823
9824       /* output 16 */
9825       CARRY_FORWARD;
9826    SQRADDSC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]);
9827       COMBA_STORE(b[16]);
9828
9829       /* output 17 */
9830       CARRY_FORWARD;
9831    SQRADDSC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB;
9832       COMBA_STORE(b[17]);
9833
9834       /* output 18 */
9835       CARRY_FORWARD;
9836       SQRADD2(a[7], a[11]);    SQRADD2(a[8], a[10]);    SQRADD(a[9], a[9]);
9837       COMBA_STORE(b[18]);
9838
9839       /* output 19 */
9840       CARRY_FORWARD;
9841       SQRADD2(a[8], a[11]);    SQRADD2(a[9], a[10]);
9842       COMBA_STORE(b[19]);
9843
9844       /* output 20 */
9845       CARRY_FORWARD;
9846       SQRADD2(a[9], a[11]);    SQRADD(a[10], a[10]);
9847       COMBA_STORE(b[20]);
9848
9849       /* output 21 */
9850       CARRY_FORWARD;
9851       SQRADD2(a[10], a[11]);
9852       COMBA_STORE(b[21]);
9853
9854       /* output 22 */
9855       CARRY_FORWARD;
9856       SQRADD(a[11], a[11]);
9857       COMBA_STORE(b[22]);
9858       COMBA_STORE2(b[23]);
9859       COMBA_FINI;
9860
9861       B->used = 24;
9862       B->sign = TFM_FP_ZPOS;
9863       memcpy(B->dp, b, 24 * sizeof(tfm_fp_digit));
9864       tfm_fp_clamp(B);
9865       break;
9866
9867    case 13:
9868       a = A->dp;
9869       COMBA_START;
9870
9871       /* clear carries */
9872       CLEAR_CARRY;
9873
9874       /* output 0 */
9875       SQRADD(a[0],a[0]);
9876       COMBA_STORE(b[0]);
9877
9878       /* output 1 */
9879       CARRY_FORWARD;
9880       SQRADD2(a[0], a[1]);
9881       COMBA_STORE(b[1]);
9882
9883       /* output 2 */
9884       CARRY_FORWARD;
9885       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]);
9886       COMBA_STORE(b[2]);
9887
9888       /* output 3 */
9889       CARRY_FORWARD;
9890       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]);
9891       COMBA_STORE(b[3]);
9892
9893       /* output 4 */
9894       CARRY_FORWARD;
9895       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]);
9896       COMBA_STORE(b[4]);
9897
9898       /* output 5 */
9899       CARRY_FORWARD;
9900    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
9901       COMBA_STORE(b[5]);
9902
9903       /* output 6 */
9904       CARRY_FORWARD;
9905    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
9906       COMBA_STORE(b[6]);
9907
9908       /* output 7 */
9909       CARRY_FORWARD;
9910    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
9911       COMBA_STORE(b[7]);
9912
9913       /* output 8 */
9914       CARRY_FORWARD;
9915    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
9916       COMBA_STORE(b[8]);
9917
9918       /* output 9 */
9919       CARRY_FORWARD;
9920    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
9921       COMBA_STORE(b[9]);
9922
9923       /* output 10 */
9924       CARRY_FORWARD;
9925    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]);
9926       COMBA_STORE(b[10]);
9927
9928       /* output 11 */
9929       CARRY_FORWARD;
9930    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB;
9931       COMBA_STORE(b[11]);
9932
9933       /* output 12 */
9934       CARRY_FORWARD;
9935    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]);
9936       COMBA_STORE(b[12]);
9937
9938       /* output 13 */
9939       CARRY_FORWARD;
9940    SQRADDSC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB;
9941       COMBA_STORE(b[13]);
9942
9943       /* output 14 */
9944       CARRY_FORWARD;
9945    SQRADDSC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]);
9946       COMBA_STORE(b[14]);
9947
9948       /* output 15 */
9949       CARRY_FORWARD;
9950    SQRADDSC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB;
9951       COMBA_STORE(b[15]);
9952
9953       /* output 16 */
9954       CARRY_FORWARD;
9955    SQRADDSC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]);
9956       COMBA_STORE(b[16]);
9957
9958       /* output 17 */
9959       CARRY_FORWARD;
9960    SQRADDSC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB;
9961       COMBA_STORE(b[17]);
9962
9963       /* output 18 */
9964       CARRY_FORWARD;
9965    SQRADDSC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]);
9966       COMBA_STORE(b[18]);
9967
9968       /* output 19 */
9969       CARRY_FORWARD;
9970    SQRADDSC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB;
9971       COMBA_STORE(b[19]);
9972
9973       /* output 20 */
9974       CARRY_FORWARD;
9975       SQRADD2(a[8], a[12]);    SQRADD2(a[9], a[11]);    SQRADD(a[10], a[10]);
9976       COMBA_STORE(b[20]);
9977
9978       /* output 21 */
9979       CARRY_FORWARD;
9980       SQRADD2(a[9], a[12]);    SQRADD2(a[10], a[11]);
9981       COMBA_STORE(b[21]);
9982
9983       /* output 22 */
9984       CARRY_FORWARD;
9985       SQRADD2(a[10], a[12]);    SQRADD(a[11], a[11]);
9986       COMBA_STORE(b[22]);
9987
9988       /* output 23 */
9989       CARRY_FORWARD;
9990       SQRADD2(a[11], a[12]);
9991       COMBA_STORE(b[23]);
9992
9993       /* output 24 */
9994       CARRY_FORWARD;
9995       SQRADD(a[12], a[12]);
9996       COMBA_STORE(b[24]);
9997       COMBA_STORE2(b[25]);
9998       COMBA_FINI;
9999
10000       B->used = 26;
10001       B->sign = TFM_FP_ZPOS;
10002       memcpy(B->dp, b, 26 * sizeof(tfm_fp_digit));
10003       tfm_fp_clamp(B);
10004       break;
10005
10006    case 14:
10007       a = A->dp;
10008       COMBA_START;
10009
10010       /* clear carries */
10011       CLEAR_CARRY;
10012
10013       /* output 0 */
10014       SQRADD(a[0],a[0]);
10015       COMBA_STORE(b[0]);
10016
10017       /* output 1 */
10018       CARRY_FORWARD;
10019       SQRADD2(a[0], a[1]);
10020       COMBA_STORE(b[1]);
10021
10022       /* output 2 */
10023       CARRY_FORWARD;
10024       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]);
10025       COMBA_STORE(b[2]);
10026
10027       /* output 3 */
10028       CARRY_FORWARD;
10029       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]);
10030       COMBA_STORE(b[3]);
10031
10032       /* output 4 */
10033       CARRY_FORWARD;
10034       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]);
10035       COMBA_STORE(b[4]);
10036
10037       /* output 5 */
10038       CARRY_FORWARD;
10039    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
10040       COMBA_STORE(b[5]);
10041
10042       /* output 6 */
10043       CARRY_FORWARD;
10044    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
10045       COMBA_STORE(b[6]);
10046
10047       /* output 7 */
10048       CARRY_FORWARD;
10049    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
10050       COMBA_STORE(b[7]);
10051
10052       /* output 8 */
10053       CARRY_FORWARD;
10054    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
10055       COMBA_STORE(b[8]);
10056
10057       /* output 9 */
10058       CARRY_FORWARD;
10059    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
10060       COMBA_STORE(b[9]);
10061
10062       /* output 10 */
10063       CARRY_FORWARD;
10064    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]);
10065       COMBA_STORE(b[10]);
10066
10067       /* output 11 */
10068       CARRY_FORWARD;
10069    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB;
10070       COMBA_STORE(b[11]);
10071
10072       /* output 12 */
10073       CARRY_FORWARD;
10074    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]);
10075       COMBA_STORE(b[12]);
10076
10077       /* output 13 */
10078       CARRY_FORWARD;
10079    SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB;
10080       COMBA_STORE(b[13]);
10081
10082       /* output 14 */
10083       CARRY_FORWARD;
10084    SQRADDSC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]);
10085       COMBA_STORE(b[14]);
10086
10087       /* output 15 */
10088       CARRY_FORWARD;
10089    SQRADDSC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB;
10090       COMBA_STORE(b[15]);
10091
10092       /* output 16 */
10093       CARRY_FORWARD;
10094    SQRADDSC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]);
10095       COMBA_STORE(b[16]);
10096
10097       /* output 17 */
10098       CARRY_FORWARD;
10099    SQRADDSC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB;
10100       COMBA_STORE(b[17]);
10101
10102       /* output 18 */
10103       CARRY_FORWARD;
10104    SQRADDSC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]);
10105       COMBA_STORE(b[18]);
10106
10107       /* output 19 */
10108       CARRY_FORWARD;
10109    SQRADDSC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB;
10110       COMBA_STORE(b[19]);
10111
10112       /* output 20 */
10113       CARRY_FORWARD;
10114    SQRADDSC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]);
10115       COMBA_STORE(b[20]);
10116
10117       /* output 21 */
10118       CARRY_FORWARD;
10119    SQRADDSC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB;
10120       COMBA_STORE(b[21]);
10121
10122       /* output 22 */
10123       CARRY_FORWARD;
10124       SQRADD2(a[9], a[13]);    SQRADD2(a[10], a[12]);    SQRADD(a[11], a[11]);
10125       COMBA_STORE(b[22]);
10126
10127       /* output 23 */
10128       CARRY_FORWARD;
10129       SQRADD2(a[10], a[13]);    SQRADD2(a[11], a[12]);
10130       COMBA_STORE(b[23]);
10131
10132       /* output 24 */
10133       CARRY_FORWARD;
10134       SQRADD2(a[11], a[13]);    SQRADD(a[12], a[12]);
10135       COMBA_STORE(b[24]);
10136
10137       /* output 25 */
10138       CARRY_FORWARD;
10139       SQRADD2(a[12], a[13]);
10140       COMBA_STORE(b[25]);
10141
10142       /* output 26 */
10143       CARRY_FORWARD;
10144       SQRADD(a[13], a[13]);
10145       COMBA_STORE(b[26]);
10146       COMBA_STORE2(b[27]);
10147       COMBA_FINI;
10148
10149       B->used = 28;
10150       B->sign = TFM_FP_ZPOS;
10151       memcpy(B->dp, b, 28 * sizeof(tfm_fp_digit));
10152       tfm_fp_clamp(B);
10153       break;
10154
10155    case 15:
10156       a = A->dp;
10157       COMBA_START;
10158
10159       /* clear carries */
10160       CLEAR_CARRY;
10161
10162       /* output 0 */
10163       SQRADD(a[0],a[0]);
10164       COMBA_STORE(b[0]);
10165
10166       /* output 1 */
10167       CARRY_FORWARD;
10168       SQRADD2(a[0], a[1]);
10169       COMBA_STORE(b[1]);
10170
10171       /* output 2 */
10172       CARRY_FORWARD;
10173       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]);
10174       COMBA_STORE(b[2]);
10175
10176       /* output 3 */
10177       CARRY_FORWARD;
10178       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]);
10179       COMBA_STORE(b[3]);
10180
10181       /* output 4 */
10182       CARRY_FORWARD;
10183       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]);
10184       COMBA_STORE(b[4]);
10185
10186       /* output 5 */
10187       CARRY_FORWARD;
10188    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
10189       COMBA_STORE(b[5]);
10190
10191       /* output 6 */
10192       CARRY_FORWARD;
10193    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
10194       COMBA_STORE(b[6]);
10195
10196       /* output 7 */
10197       CARRY_FORWARD;
10198    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
10199       COMBA_STORE(b[7]);
10200
10201       /* output 8 */
10202       CARRY_FORWARD;
10203    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
10204       COMBA_STORE(b[8]);
10205
10206       /* output 9 */
10207       CARRY_FORWARD;
10208    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
10209       COMBA_STORE(b[9]);
10210
10211       /* output 10 */
10212       CARRY_FORWARD;
10213    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]);
10214       COMBA_STORE(b[10]);
10215
10216       /* output 11 */
10217       CARRY_FORWARD;
10218    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB;
10219       COMBA_STORE(b[11]);
10220
10221       /* output 12 */
10222       CARRY_FORWARD;
10223    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]);
10224       COMBA_STORE(b[12]);
10225
10226       /* output 13 */
10227       CARRY_FORWARD;
10228    SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB;
10229       COMBA_STORE(b[13]);
10230
10231       /* output 14 */
10232       CARRY_FORWARD;
10233    SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]);
10234       COMBA_STORE(b[14]);
10235
10236       /* output 15 */
10237       CARRY_FORWARD;
10238    SQRADDSC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB;
10239       COMBA_STORE(b[15]);
10240
10241       /* output 16 */
10242       CARRY_FORWARD;
10243    SQRADDSC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]);
10244       COMBA_STORE(b[16]);
10245
10246       /* output 17 */
10247       CARRY_FORWARD;
10248    SQRADDSC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB;
10249       COMBA_STORE(b[17]);
10250
10251       /* output 18 */
10252       CARRY_FORWARD;
10253    SQRADDSC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]);
10254       COMBA_STORE(b[18]);
10255
10256       /* output 19 */
10257       CARRY_FORWARD;
10258    SQRADDSC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB;
10259       COMBA_STORE(b[19]);
10260
10261       /* output 20 */
10262       CARRY_FORWARD;
10263    SQRADDSC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]);
10264       COMBA_STORE(b[20]);
10265
10266       /* output 21 */
10267       CARRY_FORWARD;
10268    SQRADDSC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB;
10269       COMBA_STORE(b[21]);
10270
10271       /* output 22 */
10272       CARRY_FORWARD;
10273    SQRADDSC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]);
10274       COMBA_STORE(b[22]);
10275
10276       /* output 23 */
10277       CARRY_FORWARD;
10278    SQRADDSC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB;
10279       COMBA_STORE(b[23]);
10280
10281       /* output 24 */
10282       CARRY_FORWARD;
10283       SQRADD2(a[10], a[14]);    SQRADD2(a[11], a[13]);    SQRADD(a[12], a[12]);
10284       COMBA_STORE(b[24]);
10285
10286       /* output 25 */
10287       CARRY_FORWARD;
10288       SQRADD2(a[11], a[14]);    SQRADD2(a[12], a[13]);
10289       COMBA_STORE(b[25]);
10290
10291       /* output 26 */
10292       CARRY_FORWARD;
10293       SQRADD2(a[12], a[14]);    SQRADD(a[13], a[13]);
10294       COMBA_STORE(b[26]);
10295
10296       /* output 27 */
10297       CARRY_FORWARD;
10298       SQRADD2(a[13], a[14]);
10299       COMBA_STORE(b[27]);
10300
10301       /* output 28 */
10302       CARRY_FORWARD;
10303       SQRADD(a[14], a[14]);
10304       COMBA_STORE(b[28]);
10305       COMBA_STORE2(b[29]);
10306       COMBA_FINI;
10307
10308       B->used = 30;
10309       B->sign = TFM_FP_ZPOS;
10310       memcpy(B->dp, b, 30 * sizeof(tfm_fp_digit));
10311       tfm_fp_clamp(B);
10312       break;
10313
10314    case 16:
10315       a = A->dp;
10316       COMBA_START;
10317
10318       /* clear carries */
10319       CLEAR_CARRY;
10320
10321       /* output 0 */
10322       SQRADD(a[0],a[0]);
10323       COMBA_STORE(b[0]);
10324
10325       /* output 1 */
10326       CARRY_FORWARD;
10327       SQRADD2(a[0], a[1]);
10328       COMBA_STORE(b[1]);
10329
10330       /* output 2 */
10331       CARRY_FORWARD;
10332       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]);
10333       COMBA_STORE(b[2]);
10334
10335       /* output 3 */
10336       CARRY_FORWARD;
10337       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]);
10338       COMBA_STORE(b[3]);
10339
10340       /* output 4 */
10341       CARRY_FORWARD;
10342       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]);
10343       COMBA_STORE(b[4]);
10344
10345       /* output 5 */
10346       CARRY_FORWARD;
10347    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB;
10348       COMBA_STORE(b[5]);
10349
10350       /* output 6 */
10351       CARRY_FORWARD;
10352    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]);
10353       COMBA_STORE(b[6]);
10354
10355       /* output 7 */
10356       CARRY_FORWARD;
10357    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB;
10358       COMBA_STORE(b[7]);
10359
10360       /* output 8 */
10361       CARRY_FORWARD;
10362    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]);
10363       COMBA_STORE(b[8]);
10364
10365       /* output 9 */
10366       CARRY_FORWARD;
10367    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB;
10368       COMBA_STORE(b[9]);
10369
10370       /* output 10 */
10371       CARRY_FORWARD;
10372    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]);
10373       COMBA_STORE(b[10]);
10374
10375       /* output 11 */
10376       CARRY_FORWARD;
10377    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB;
10378       COMBA_STORE(b[11]);
10379
10380       /* output 12 */
10381       CARRY_FORWARD;
10382    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]);
10383       COMBA_STORE(b[12]);
10384
10385       /* output 13 */
10386       CARRY_FORWARD;
10387    SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB;
10388       COMBA_STORE(b[13]);
10389
10390       /* output 14 */
10391       CARRY_FORWARD;
10392    SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]);
10393       COMBA_STORE(b[14]);
10394
10395       /* output 15 */
10396       CARRY_FORWARD;
10397    SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB;
10398       COMBA_STORE(b[15]);
10399
10400       /* output 16 */
10401       CARRY_FORWARD;
10402    SQRADDSC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]);
10403       COMBA_STORE(b[16]);
10404
10405       /* output 17 */
10406       CARRY_FORWARD;
10407    SQRADDSC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB;
10408       COMBA_STORE(b[17]);
10409
10410       /* output 18 */
10411       CARRY_FORWARD;
10412    SQRADDSC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]);
10413       COMBA_STORE(b[18]);
10414
10415       /* output 19 */
10416       CARRY_FORWARD;
10417    SQRADDSC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB;
10418       COMBA_STORE(b[19]);
10419
10420       /* output 20 */
10421       CARRY_FORWARD;
10422    SQRADDSC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]);
10423       COMBA_STORE(b[20]);
10424
10425       /* output 21 */
10426       CARRY_FORWARD;
10427    SQRADDSC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB;
10428       COMBA_STORE(b[21]);
10429
10430       /* output 22 */
10431       CARRY_FORWARD;
10432    SQRADDSC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]);
10433       COMBA_STORE(b[22]);
10434
10435       /* output 23 */
10436       CARRY_FORWARD;
10437    SQRADDSC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB;
10438       COMBA_STORE(b[23]);
10439
10440       /* output 24 */
10441       CARRY_FORWARD;
10442    SQRADDSC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]);
10443       COMBA_STORE(b[24]);
10444
10445       /* output 25 */
10446       CARRY_FORWARD;
10447    SQRADDSC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB;
10448       COMBA_STORE(b[25]);
10449
10450       /* output 26 */
10451       CARRY_FORWARD;
10452       SQRADD2(a[11], a[15]);    SQRADD2(a[12], a[14]);    SQRADD(a[13], a[13]);
10453       COMBA_STORE(b[26]);
10454
10455       /* output 27 */
10456       CARRY_FORWARD;
10457       SQRADD2(a[12], a[15]);    SQRADD2(a[13], a[14]);
10458       COMBA_STORE(b[27]);
10459
10460       /* output 28 */
10461       CARRY_FORWARD;
10462       SQRADD2(a[13], a[15]);    SQRADD(a[14], a[14]);
10463       COMBA_STORE(b[28]);
10464
10465       /* output 29 */
10466       CARRY_FORWARD;
10467       SQRADD2(a[14], a[15]);
10468       COMBA_STORE(b[29]);
10469
10470       /* output 30 */
10471       CARRY_FORWARD;
10472       SQRADD(a[15], a[15]);
10473       COMBA_STORE(b[30]);
10474       COMBA_STORE2(b[31]);
10475       COMBA_FINI;
10476
10477       B->used = 32;
10478       B->sign = TFM_FP_ZPOS;
10479       memcpy(B->dp, b, 32 * sizeof(tfm_fp_digit));
10480       tfm_fp_clamp(B);
10481       break;
10482 }
10483 }
10484 #endif /* TFM_SMALL_SET */
10485
10486 /* c = a * a (mod b) */
10487 int tfm_fp_sqrmod(tfm_fp_int *a, tfm_fp_int *b, tfm_fp_int *c)
10488 {
10489   tfm_fp_int tmp;
10490   int ret;
10491
10492   tfm_fp_init(&tmp);
10493   if (tfm_fp_sqr(a, &tmp)) {
10494     tfm_fp_zero(&tmp);
10495     return TFM_FP_MEM;
10496   }
10497   ret = tfm_fp_mod(&tmp, b, c);
10498   tfm_fp_zero(&tmp);
10499
10500   return ret;
10501 }
10502
10503 /* c = a - b */
10504 int tfm_fp_sub(tfm_fp_int *a, tfm_fp_int *b, tfm_fp_int *c)
10505 {
10506   int     sa, sb;
10507
10508   sa = a->sign;
10509   sb = b->sign;
10510
10511   if (sa != sb) {
10512     /* subtract a negative from a positive, OR */
10513     /* subtract a positive from a negative. */
10514     /* In either case, ADD their magnitudes, */
10515     /* and use the sign of the first number. */
10516     c->sign = sa;
10517     return s_tfm_fp_add (a, b, c);
10518   } else {
10519     /* subtract a positive from a positive, OR */
10520     /* subtract a negative from a negative. */
10521     /* First, take the difference between their */
10522     /* magnitudes, then... */
10523     if (tfm_fp_cmp_mag (a, b) != TFM_FP_LT) {
10524       /* Copy the sign from the first */
10525       c->sign = sa;
10526       /* The first has a larger or equal magnitude */
10527       return s_tfm_fp_sub (a, b, c);
10528     } else {
10529       /* The result has the *opposite* sign from */
10530       /* the first number. */
10531       c->sign = (sa == TFM_FP_ZPOS) ? TFM_FP_NEG : TFM_FP_ZPOS;
10532       /* The second has a larger magnitude */
10533       return s_tfm_fp_sub (b, a, c);
10534     }
10535   }
10536 }
10537
10538 /* c = a - b */
10539 int tfm_fp_sub_d(tfm_fp_int *a, tfm_fp_digit b, tfm_fp_int *c)
10540 {
10541    tfm_fp_int tmp;
10542    int ret;
10543
10544    /* Grow when needed */
10545    if (c->alloc < a->used + 1)
10546      if (tfm_fp_grow(c, a->used + 1))
10547        return TFM_FP_MEM;
10548
10549    tfm_fp_init(&tmp);
10550    if (tfm_fp_set(&tmp, b)) {
10551      tfm_fp_zero(&tmp);
10552      return TFM_FP_MEM;
10553    }
10554    ret = tfm_fp_sub(a, &tmp, c);
10555    tfm_fp_zero(&tmp);
10556
10557    return ret;
10558 }
10559
10560 /* d = a - b (mod c) */
10561 int tfm_fp_submod(tfm_fp_int *a, tfm_fp_int *b, tfm_fp_int *c, tfm_fp_int *d)
10562 {
10563   tfm_fp_int tmp;
10564   int ret;
10565
10566   tfm_fp_init(&tmp);
10567   if (tfm_fp_sub(a, b, &tmp)) {
10568     tfm_fp_zero(&tmp);
10569     return TFM_FP_MEM;
10570   }
10571   ret = tfm_fp_mod(&tmp, c, d);
10572   tfm_fp_zero(&tmp);
10573
10574   return ret;
10575 }
10576
10577 void tfm_fp_to_signed_bin(tfm_fp_int *a, unsigned char *b)
10578 {
10579   tfm_fp_to_unsigned_bin (a, b + 1);
10580   b[0] = (unsigned char) ((a->sign == TFM_FP_ZPOS) ? 0 : 1);
10581 }
10582
10583 void tfm_fp_to_unsigned_bin(tfm_fp_int *a, unsigned char *b)
10584 {
10585   int     x;
10586   tfm_fp_int  t;
10587
10588   if (tfm_fp_init_copy(&t, a, a->stack))
10589     return;
10590
10591   x = 0;
10592   while (tfm_fp_iszero (&t) == TFM_FP_NO) {
10593       b[x++] = (unsigned char) (t.dp[0] & 255);
10594       tfm_fp_div_2d (&t, 8, &t, NULL);
10595   }
10596   tfm_fp_reverse (b, x);
10597 }
10598
10599 int tfm_fp_toradix(tfm_fp_int *a, char *str, int radix)
10600 {
10601   int     digs;
10602   tfm_fp_int  t;
10603   tfm_fp_digit d;
10604   char   *_s = str;
10605
10606   /* check range of the radix */
10607   if (radix < 2 || radix > 64) {
10608     return TFM_FP_VAL;
10609   }
10610
10611   /* quick out if its zero */
10612   if (tfm_fp_iszero(a) == 1) {
10613      *str++ = '0';
10614      *str = '\0';
10615      return TFM_FP_OKAY;
10616   }
10617
10618   if (tfm_fp_init_copy(&t, a, a->stack))
10619     return TFM_FP_MEM;
10620
10621   /* if it is negative output a - */
10622   if (t.sign == TFM_FP_NEG) {
10623     ++_s;
10624     *str++ = '-';
10625     t.sign = TFM_FP_ZPOS;
10626   }
10627
10628   digs = 0;
10629   while (tfm_fp_iszero (&t) == TFM_FP_NO) {
10630     if (tfm_fp_div_d (&t, (tfm_fp_digit) radix, &t, &d)) {
10631       tfm_fp_zero(&t);
10632       return TFM_FP_MEM;
10633     }
10634     *str++ = tfm_fp_s_rmap[d];
10635     ++digs;
10636   }
10637
10638   /* reverse the digits of the string.  In this case _s points
10639    * to the first digit [exluding the sign] of the number]
10640    */
10641   tfm_fp_reverse ((unsigned char *)_s, digs);
10642
10643   /* append a NULL so the string is properly terminated */
10644   *str = '\0';
10645
10646   tfm_fp_zero(&t);
10647   return TFM_FP_OKAY;
10648 }
10649
10650 int tfm_fp_unsigned_bin_size(tfm_fp_int *a)
10651 {
10652   int     size = tfm_fp_count_bits (a);
10653   return (size / 8 + ((size & 7) != 0 ? 1 : 0));
10654 }
10655
10656 /* unsigned addition */
10657 int s_tfm_fp_add(tfm_fp_int *a, tfm_fp_int *b, tfm_fp_int *c)
10658 {
10659   int      x, oldused;
10660   register tfm_fp_word  t;
10661   tfm_fp_int *X, *Y;
10662
10663   oldused = c->used;
10664   if (a->used > b->used) {
10665     c->used = a->used;
10666     X = a;
10667     Y = b;
10668   } else {
10669     c->used = b->used;
10670     X = b;
10671     Y = a;
10672   }
10673
10674   /* Grow when needed */
10675   if (c->alloc < c->used + 1)
10676     if (tfm_fp_grow(c, c->used + 1))
10677       return TFM_FP_MEM;
10678
10679   t = 0;
10680   for (x = 0; x < Y->used; x++) {
10681       t         += ((tfm_fp_word)X->dp[x]) + ((tfm_fp_word)Y->dp[x]);
10682       c->dp[x]   = (tfm_fp_digit)t;
10683       t        >>= DIGIT_BIT;
10684   }
10685   for (; x < X->used; x++) {
10686       t         += ((tfm_fp_word)X->dp[x]);
10687       c->dp[x]   = (tfm_fp_digit)t;
10688       t        >>= DIGIT_BIT;
10689   }
10690   if (t != 0 && x < c->alloc) {
10691      c->dp[c->used++] = (tfm_fp_digit)t;
10692      ++x;
10693   }
10694
10695   c->used = x;
10696   for (; x < oldused; x++) {
10697      c->dp[x] = 0;
10698   }
10699   tfm_fp_clamp(c);
10700   return TFM_FP_OKAY;
10701 }
10702
10703 /* unsigned subtraction ||a|| >= ||b|| ALWAYS! */
10704 int s_tfm_fp_sub(tfm_fp_int *a, tfm_fp_int *b, tfm_fp_int *c)
10705 {
10706   int      x, oldbused, oldused;
10707   tfm_fp_word  t;
10708
10709   oldused  = c->used;
10710   oldbused = b->used;
10711   c->used  = a->used;
10712
10713   /* Grow when needed */
10714   if (c->alloc < a->used)
10715     if (tfm_fp_grow(c, a->used))
10716       return TFM_FP_MEM;
10717
10718   t       = 0;
10719   for (x = 0; x < oldbused; x++) {
10720      t         = ((tfm_fp_word)a->dp[x]) - (((tfm_fp_word)b->dp[x]) + t);
10721      c->dp[x]  = (tfm_fp_digit)t;
10722      t         = (t >> DIGIT_BIT)&1;
10723   }
10724   for (; x < a->used; x++) {
10725      t         = ((tfm_fp_word)a->dp[x]) - t;
10726      c->dp[x]  = (tfm_fp_digit)t;
10727      t         = (t >> DIGIT_BIT);
10728    }
10729   for (; x < oldused; x++) {
10730      c->dp[x] = 0;
10731   }
10732   tfm_fp_clamp(c);
10733   return TFM_FP_OKAY;
10734 }
10735
10736 #define TFM_DEFINES
10737
10738 /* generic comba squarer */
10739 int tfm_fp_sqr_comba(tfm_fp_int *A, tfm_fp_int *B)
10740 {
10741   int       pa, ix, iz;
10742   tfm_fp_digit  c0, c1, c2;
10743   tfm_fp_int    tmp, *dst;
10744 #ifdef TFM_ISO
10745   tfm_fp_word   tt;
10746 #endif
10747
10748   SILC_LOG_DEBUG(("Start"));
10749
10750   /* get size of output and trim */
10751   pa = A->used + A->used;
10752
10753   /* number of output digits to produce */
10754   COMBA_START;
10755   CLEAR_CARRY;
10756
10757   if (A == B) {
10758     if (tfm_fp_init_size(B->stack, &tmp, pa))
10759       return TFM_FP_MEM;
10760     dst = &tmp;
10761   } else {
10762     tfm_fp_zeroise(B);
10763     dst = B;
10764   }
10765
10766   for (ix = 0; ix < pa; ix++) {
10767       int      tx, ty, iy;
10768       tfm_fp_digit *tmpy, *tmpx;
10769
10770       /* get offsets into the two bignums */
10771       ty = MIN(A->used-1, ix);
10772       tx = ix - ty;
10773
10774       /* setup temp aliases */
10775       tmpx = A->dp + tx;
10776       tmpy = A->dp + ty;
10777
10778       /* this is the number of times the loop will iterrate,
10779          while (tx++ < a->used && ty-- >= 0) { ... }
10780        */
10781       iy = MIN(A->used-tx, ty+1);
10782
10783       /* now for squaring tx can never equal ty
10784        * we halve the distance since they approach
10785        * at a rate of 2x and we have to round because
10786        * odd cases need to be executed
10787        */
10788       iy = MIN(iy, (ty-tx+1)>>1);
10789
10790       /* forward carries */
10791       CARRY_FORWARD;
10792
10793       /* execute loop */
10794       for (iz = 0; iz < iy; iz++) {
10795           SQRADD2(*tmpx++, *tmpy--);
10796       }
10797
10798       /* even columns have the square term in them */
10799       if ((ix&1) == 0) {
10800           SQRADD(A->dp[ix>>1], A->dp[ix>>1]);
10801       }
10802
10803       /* store it */
10804       COMBA_STORE(dst->dp[ix]);
10805   }
10806
10807   COMBA_FINI;
10808
10809   /* setup dest */
10810   dst->used = pa;
10811   tfm_fp_clamp (dst);
10812   if (dst != B) {
10813      tfm_fp_exch(dst, B);
10814      tfm_fp_zero(&tmp);
10815   }
10816
10817   return TFM_FP_OKAY;
10818 }
10819
10820 /* XOR two ints together */
10821 int tfm_fp_xor(tfm_fp_int * a, tfm_fp_int * b, tfm_fp_int * c)
10822 {
10823   int     res, ix, px;
10824   tfm_fp_int  t, *x;
10825
10826   if (a->used > b->used) {
10827     /* If result doesn't have stack, assure it doesn't get one */
10828     if ((res = tfm_fp_init_copy (&t, a, c->stack ? a->stack : NULL))) {
10829       return res;
10830     }
10831     px = b->used;
10832     x = b;
10833   } else {
10834     if ((res = tfm_fp_init_copy (&t, b, c->stack ? b->stack : NULL))) {
10835       return res;
10836     }
10837     px = a->used;
10838     x = a;
10839   }
10840
10841   for (ix = 0; ix < px; ix++) {
10842      t.dp[ix] ^= x->dp[ix];
10843   }
10844   tfm_fp_clamp (&t);
10845   tfm_fp_exch (c, &t);
10846   tfm_fp_zero (&t);
10847   return TFM_FP_OKAY;
10848 }
10849
10850 /* AND two ints together */
10851 int tfm_fp_and(tfm_fp_int * a, tfm_fp_int * b, tfm_fp_int * c)
10852 {
10853   int     res, ix, px;
10854   tfm_fp_int  t, *x;
10855
10856   if (a->used > b->used) {
10857     if ((res = tfm_fp_init_copy (&t, a, c->stack ? a->stack : NULL))) {
10858       return res;
10859     }
10860     px = b->used;
10861     x = b;
10862   } else {
10863     if ((res = tfm_fp_init_copy (&t, b, c->stack ? b->stack : NULL))) {
10864       return res;
10865     }
10866     px = a->used;
10867     x = a;
10868   }
10869
10870   for (ix = 0; ix < px; ix++) {
10871     t.dp[ix] &= x->dp[ix];
10872   }
10873
10874   /* zero digits above the last from the smallest tfm_fp_int */
10875   for (; ix < t.used; ix++) {
10876     t.dp[ix] = 0;
10877   }
10878
10879   tfm_fp_clamp (&t);
10880   tfm_fp_exch (c, &t);
10881   tfm_fp_zero (&t);
10882   return TFM_FP_OKAY;
10883 }
10884
10885 /* OR two ints together */
10886 int tfm_fp_or(tfm_fp_int * a, tfm_fp_int * b, tfm_fp_int * c)
10887 {
10888   int     res, ix, px;
10889   tfm_fp_int  t, *x;
10890
10891   if (a->used > b->used) {
10892     if ((res = tfm_fp_init_copy (&t, a, c->stack ? a->stack : NULL))) {
10893       return res;
10894     }
10895     px = b->used;
10896     x = b;
10897   } else {
10898     if ((res = tfm_fp_init_copy (&t, b, c->stack ? b->stack : NULL))) {
10899       return res;
10900     }
10901     px = a->used;
10902     x = a;
10903   }
10904
10905   for (ix = 0; ix < px; ix++) {
10906     t.dp[ix] |= x->dp[ix];
10907   }
10908   tfm_fp_clamp (&t);
10909   tfm_fp_exch (c, &t);
10910   tfm_fp_zero (&t);
10911   return TFM_FP_OKAY;
10912 }
10913
10914 /* calculate c = a**b  using a square-multiply algorithm */
10915 int tfm_fp_expt_d(tfm_fp_int * a, tfm_fp_digit b, tfm_fp_int * c)
10916 {
10917   int     res, x;
10918   tfm_fp_int  g;
10919
10920   if ((res = tfm_fp_init_copy (&g, a, a->stack)) != TFM_FP_OKAY)
10921     return res;
10922
10923   /* set initial result */
10924   if (tfm_fp_set (c, 1))
10925     return TFM_FP_MEM;
10926
10927   for (x = 0; x < (int) DIGIT_BIT; x++) {
10928     /* square */
10929     if ((res = tfm_fp_sqr (c, c)) != TFM_FP_OKAY) {
10930       tfm_fp_zero (&g);
10931       return res;
10932     }
10933
10934     /* if the bit is set multiply */
10935     if ((b & (tfm_fp_digit) (((tfm_fp_digit)1) << (DIGIT_BIT - 1))) != 0) {
10936       if ((res = tfm_fp_mul(c, &g, c)) != TFM_FP_OKAY) {
10937          tfm_fp_zero (&g);
10938          return res;
10939       }
10940     }
10941
10942     /* shift to next bit */
10943     b <<= 1;
10944   }
10945
10946   tfm_fp_zero (&g);
10947   return TFM_FP_OKAY;
10948 }
10949
10950 /* Square root */
10951 int tfm_fp_sqrt(tfm_fp_int *arg, tfm_fp_int *ret)
10952 {
10953   int res;
10954   tfm_fp_int t1,t2;
10955
10956   /* must be positive */
10957   if (arg->sign == TFM_FP_NEG) {
10958     return TFM_FP_VAL;
10959   }
10960
10961   /* easy out */
10962   if (tfm_fp_iszero(arg) == TFM_FP_YES) {
10963     tfm_fp_zero(ret);
10964     return TFM_FP_OKAY;
10965   }
10966
10967   /* If result doesn't have stack, assure it doesn't get one */
10968   if ((res = tfm_fp_init_copy(&t1, arg, ret->stack ? arg->stack : NULL)))
10969     return res;
10970
10971   tfm_fp_init(&t2);
10972
10973   /* First approx. (not very bad for large arg) */
10974   tfm_fp_rshd (&t1,t1.used/2);
10975
10976   /* t1 > 0  */
10977   if ((res = tfm_fp_div(arg,&t1,&t2,NULL)) != TFM_FP_OKAY) {
10978     goto E1;
10979   }
10980   if ((res = tfm_fp_add(&t1,&t2,&t1)) != TFM_FP_OKAY) {
10981     goto E1;
10982   }
10983   if ((res = tfm_fp_div_2(&t1,&t1)) != TFM_FP_OKAY) {
10984     goto E1;
10985   }
10986
10987   /* And now t1 > sqrt(arg) */
10988   do {
10989     if ((res = tfm_fp_div(arg,&t1,&t2,NULL)) != TFM_FP_OKAY) {
10990       goto E1;
10991     }
10992     if ((res = tfm_fp_add(&t1,&t2,&t1)) != TFM_FP_OKAY) {
10993       goto E1;
10994     }
10995     if ((res = tfm_fp_div_2(&t1,&t1)) != TFM_FP_OKAY) {
10996       goto E1;
10997     }
10998     /* t1 >= sqrt(arg) >= t2 at this point */
10999   } while (tfm_fp_cmp_mag(&t1,&t2) == TFM_FP_GT);
11000
11001   tfm_fp_exch(&t1,ret);
11002
11003  E1:
11004   tfm_fp_zero(&t2);
11005   tfm_fp_zero(&t1);
11006
11007   return res;
11008 }