Coverage Report

Created: 2025-07-01 06:25

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