]> git.sur5r.net Git - freertos/blob - FreeRTOS-Plus/Source/WolfSSL/wolfcrypt/src/fp_sqr_comba_small_set.i
Update WolfSSL library to the latest version.
[freertos] / FreeRTOS-Plus / Source / WolfSSL / wolfcrypt / src / fp_sqr_comba_small_set.i
1 /* fp_sqr_comba_small_set.i
2  *
3  * Copyright (C) 2006-2015 wolfSSL Inc.
4  *
5  * This file is part of wolfSSL. (formerly known as CyaSSL)
6  *
7  * wolfSSL is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * wolfSSL is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22
23 #if defined(TFM_SMALL_SET)
24 void fp_sqr_comba_small(fp_int *A, fp_int *B)
25 {
26    fp_digit *a, b[32], c0, c1, c2, sc0, sc1, sc2;
27 #ifdef TFM_ISO
28    fp_word   tt;   
29 #endif   
30    switch (A->used) { 
31    case 1:
32       a = A->dp;
33       COMBA_START; 
34
35       /* clear carries */
36       CLEAR_CARRY;
37
38       /* output 0 */
39       SQRADD(a[0],a[0]);
40       COMBA_STORE(b[0]);
41       COMBA_STORE2(b[1]);
42       COMBA_FINI;
43
44       B->used = 2;
45       B->sign = FP_ZPOS;
46       memcpy(B->dp, b, 2 * sizeof(fp_digit));
47       fp_clamp(B);
48       break;
49
50    case 2:
51       a = A->dp;
52       COMBA_START; 
53
54       /* clear carries */
55       CLEAR_CARRY;
56
57       /* output 0 */
58       SQRADD(a[0],a[0]);
59       COMBA_STORE(b[0]);
60
61       /* output 1 */
62       CARRY_FORWARD;
63       SQRADD2(a[0], a[1]); 
64       COMBA_STORE(b[1]);
65
66       /* output 2 */
67       CARRY_FORWARD;
68       SQRADD(a[1], a[1]); 
69       COMBA_STORE(b[2]);
70       COMBA_STORE2(b[3]);
71       COMBA_FINI;
72
73       B->used = 4;
74       B->sign = FP_ZPOS;
75       memcpy(B->dp, b, 4 * sizeof(fp_digit));
76       fp_clamp(B);
77       break;
78
79    case 3:
80       a = A->dp;
81       COMBA_START; 
82
83       /* clear carries */
84       CLEAR_CARRY;
85
86       /* output 0 */
87       SQRADD(a[0],a[0]);
88       COMBA_STORE(b[0]);
89
90       /* output 1 */
91       CARRY_FORWARD;
92       SQRADD2(a[0], a[1]); 
93       COMBA_STORE(b[1]);
94
95       /* output 2 */
96       CARRY_FORWARD;
97       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
98       COMBA_STORE(b[2]);
99
100       /* output 3 */
101       CARRY_FORWARD;
102       SQRADD2(a[1], a[2]); 
103       COMBA_STORE(b[3]);
104
105       /* output 4 */
106       CARRY_FORWARD;
107       SQRADD(a[2], a[2]); 
108       COMBA_STORE(b[4]);
109       COMBA_STORE2(b[5]);
110       COMBA_FINI;
111
112       B->used = 6;
113       B->sign = FP_ZPOS;
114       memcpy(B->dp, b, 6 * sizeof(fp_digit));
115       fp_clamp(B);
116       break;
117
118    case 4:
119       a = A->dp;
120       COMBA_START; 
121
122       /* clear carries */
123       CLEAR_CARRY;
124
125       /* output 0 */
126       SQRADD(a[0],a[0]);
127       COMBA_STORE(b[0]);
128
129       /* output 1 */
130       CARRY_FORWARD;
131       SQRADD2(a[0], a[1]); 
132       COMBA_STORE(b[1]);
133
134       /* output 2 */
135       CARRY_FORWARD;
136       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
137       COMBA_STORE(b[2]);
138
139       /* output 3 */
140       CARRY_FORWARD;
141       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
142       COMBA_STORE(b[3]);
143
144       /* output 4 */
145       CARRY_FORWARD;
146       SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
147       COMBA_STORE(b[4]);
148
149       /* output 5 */
150       CARRY_FORWARD;
151       SQRADD2(a[2], a[3]); 
152       COMBA_STORE(b[5]);
153
154       /* output 6 */
155       CARRY_FORWARD;
156       SQRADD(a[3], a[3]); 
157       COMBA_STORE(b[6]);
158       COMBA_STORE2(b[7]);
159       COMBA_FINI;
160
161       B->used = 8;
162       B->sign = FP_ZPOS;
163       memcpy(B->dp, b, 8 * sizeof(fp_digit));
164       fp_clamp(B);
165       break;
166
167    case 5:
168       a = A->dp;
169       COMBA_START; 
170
171       /* clear carries */
172       CLEAR_CARRY;
173
174       /* output 0 */
175       SQRADD(a[0],a[0]);
176       COMBA_STORE(b[0]);
177
178       /* output 1 */
179       CARRY_FORWARD;
180       SQRADD2(a[0], a[1]); 
181       COMBA_STORE(b[1]);
182
183       /* output 2 */
184       CARRY_FORWARD;
185       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
186       COMBA_STORE(b[2]);
187
188       /* output 3 */
189       CARRY_FORWARD;
190       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
191       COMBA_STORE(b[3]);
192
193       /* output 4 */
194       CARRY_FORWARD;
195       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
196       COMBA_STORE(b[4]);
197
198       /* output 5 */
199       CARRY_FORWARD;
200       SQRADD2(a[1], a[4]);    SQRADD2(a[2], a[3]); 
201       COMBA_STORE(b[5]);
202
203       /* output 6 */
204       CARRY_FORWARD;
205       SQRADD2(a[2], a[4]);    SQRADD(a[3], a[3]); 
206       COMBA_STORE(b[6]);
207
208       /* output 7 */
209       CARRY_FORWARD;
210       SQRADD2(a[3], a[4]); 
211       COMBA_STORE(b[7]);
212
213       /* output 8 */
214       CARRY_FORWARD;
215       SQRADD(a[4], a[4]); 
216       COMBA_STORE(b[8]);
217       COMBA_STORE2(b[9]);
218       COMBA_FINI;
219
220       B->used = 10;
221       B->sign = FP_ZPOS;
222       memcpy(B->dp, b, 10 * sizeof(fp_digit));
223       fp_clamp(B);
224       break;
225
226    case 6:
227       a = A->dp;
228       COMBA_START; 
229
230       /* clear carries */
231       CLEAR_CARRY;
232
233       /* output 0 */
234       SQRADD(a[0],a[0]);
235       COMBA_STORE(b[0]);
236
237       /* output 1 */
238       CARRY_FORWARD;
239       SQRADD2(a[0], a[1]); 
240       COMBA_STORE(b[1]);
241
242       /* output 2 */
243       CARRY_FORWARD;
244       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
245       COMBA_STORE(b[2]);
246
247       /* output 3 */
248       CARRY_FORWARD;
249       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
250       COMBA_STORE(b[3]);
251
252       /* output 4 */
253       CARRY_FORWARD;
254       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
255       COMBA_STORE(b[4]);
256
257       /* output 5 */
258       CARRY_FORWARD;
259    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 
260       COMBA_STORE(b[5]);
261
262       /* output 6 */
263       CARRY_FORWARD;
264       SQRADD2(a[1], a[5]);    SQRADD2(a[2], a[4]);    SQRADD(a[3], a[3]); 
265       COMBA_STORE(b[6]);
266
267       /* output 7 */
268       CARRY_FORWARD;
269       SQRADD2(a[2], a[5]);    SQRADD2(a[3], a[4]); 
270       COMBA_STORE(b[7]);
271
272       /* output 8 */
273       CARRY_FORWARD;
274       SQRADD2(a[3], a[5]);    SQRADD(a[4], a[4]); 
275       COMBA_STORE(b[8]);
276
277       /* output 9 */
278       CARRY_FORWARD;
279       SQRADD2(a[4], a[5]); 
280       COMBA_STORE(b[9]);
281
282       /* output 10 */
283       CARRY_FORWARD;
284       SQRADD(a[5], a[5]); 
285       COMBA_STORE(b[10]);
286       COMBA_STORE2(b[11]);
287       COMBA_FINI;
288
289       B->used = 12;
290       B->sign = FP_ZPOS;
291       memcpy(B->dp, b, 12 * sizeof(fp_digit));
292       fp_clamp(B);
293       break;
294
295    case 7:
296       a = A->dp;
297       COMBA_START; 
298
299       /* clear carries */
300       CLEAR_CARRY;
301
302       /* output 0 */
303       SQRADD(a[0],a[0]);
304       COMBA_STORE(b[0]);
305
306       /* output 1 */
307       CARRY_FORWARD;
308       SQRADD2(a[0], a[1]); 
309       COMBA_STORE(b[1]);
310
311       /* output 2 */
312       CARRY_FORWARD;
313       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
314       COMBA_STORE(b[2]);
315
316       /* output 3 */
317       CARRY_FORWARD;
318       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
319       COMBA_STORE(b[3]);
320
321       /* output 4 */
322       CARRY_FORWARD;
323       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
324       COMBA_STORE(b[4]);
325
326       /* output 5 */
327       CARRY_FORWARD;
328    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 
329       COMBA_STORE(b[5]);
330
331       /* output 6 */
332       CARRY_FORWARD;
333    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 
334       COMBA_STORE(b[6]);
335
336       /* output 7 */
337       CARRY_FORWARD;
338    SQRADDSC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 
339       COMBA_STORE(b[7]);
340
341       /* output 8 */
342       CARRY_FORWARD;
343       SQRADD2(a[2], a[6]);    SQRADD2(a[3], a[5]);    SQRADD(a[4], a[4]); 
344       COMBA_STORE(b[8]);
345
346       /* output 9 */
347       CARRY_FORWARD;
348       SQRADD2(a[3], a[6]);    SQRADD2(a[4], a[5]); 
349       COMBA_STORE(b[9]);
350
351       /* output 10 */
352       CARRY_FORWARD;
353       SQRADD2(a[4], a[6]);    SQRADD(a[5], a[5]); 
354       COMBA_STORE(b[10]);
355
356       /* output 11 */
357       CARRY_FORWARD;
358       SQRADD2(a[5], a[6]); 
359       COMBA_STORE(b[11]);
360
361       /* output 12 */
362       CARRY_FORWARD;
363       SQRADD(a[6], a[6]); 
364       COMBA_STORE(b[12]);
365       COMBA_STORE2(b[13]);
366       COMBA_FINI;
367
368       B->used = 14;
369       B->sign = FP_ZPOS;
370       memcpy(B->dp, b, 14 * sizeof(fp_digit));
371       fp_clamp(B);
372       break;
373
374    case 8:
375       a = A->dp;
376       COMBA_START; 
377
378       /* clear carries */
379       CLEAR_CARRY;
380
381       /* output 0 */
382       SQRADD(a[0],a[0]);
383       COMBA_STORE(b[0]);
384
385       /* output 1 */
386       CARRY_FORWARD;
387       SQRADD2(a[0], a[1]); 
388       COMBA_STORE(b[1]);
389
390       /* output 2 */
391       CARRY_FORWARD;
392       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
393       COMBA_STORE(b[2]);
394
395       /* output 3 */
396       CARRY_FORWARD;
397       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
398       COMBA_STORE(b[3]);
399
400       /* output 4 */
401       CARRY_FORWARD;
402       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
403       COMBA_STORE(b[4]);
404
405       /* output 5 */
406       CARRY_FORWARD;
407    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 
408       COMBA_STORE(b[5]);
409
410       /* output 6 */
411       CARRY_FORWARD;
412    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 
413       COMBA_STORE(b[6]);
414
415       /* output 7 */
416       CARRY_FORWARD;
417    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 
418       COMBA_STORE(b[7]);
419
420       /* output 8 */
421       CARRY_FORWARD;
422    SQRADDSC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); 
423       COMBA_STORE(b[8]);
424
425       /* output 9 */
426       CARRY_FORWARD;
427    SQRADDSC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; 
428       COMBA_STORE(b[9]);
429
430       /* output 10 */
431       CARRY_FORWARD;
432       SQRADD2(a[3], a[7]);    SQRADD2(a[4], a[6]);    SQRADD(a[5], a[5]); 
433       COMBA_STORE(b[10]);
434
435       /* output 11 */
436       CARRY_FORWARD;
437       SQRADD2(a[4], a[7]);    SQRADD2(a[5], a[6]); 
438       COMBA_STORE(b[11]);
439
440       /* output 12 */
441       CARRY_FORWARD;
442       SQRADD2(a[5], a[7]);    SQRADD(a[6], a[6]); 
443       COMBA_STORE(b[12]);
444
445       /* output 13 */
446       CARRY_FORWARD;
447       SQRADD2(a[6], a[7]); 
448       COMBA_STORE(b[13]);
449
450       /* output 14 */
451       CARRY_FORWARD;
452       SQRADD(a[7], a[7]); 
453       COMBA_STORE(b[14]);
454       COMBA_STORE2(b[15]);
455       COMBA_FINI;
456
457       B->used = 16;
458       B->sign = FP_ZPOS;
459       memcpy(B->dp, b, 16 * sizeof(fp_digit));
460       fp_clamp(B);
461       break;
462
463    case 9:
464       a = A->dp;
465       COMBA_START; 
466
467       /* clear carries */
468       CLEAR_CARRY;
469
470       /* output 0 */
471       SQRADD(a[0],a[0]);
472       COMBA_STORE(b[0]);
473
474       /* output 1 */
475       CARRY_FORWARD;
476       SQRADD2(a[0], a[1]); 
477       COMBA_STORE(b[1]);
478
479       /* output 2 */
480       CARRY_FORWARD;
481       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
482       COMBA_STORE(b[2]);
483
484       /* output 3 */
485       CARRY_FORWARD;
486       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
487       COMBA_STORE(b[3]);
488
489       /* output 4 */
490       CARRY_FORWARD;
491       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
492       COMBA_STORE(b[4]);
493
494       /* output 5 */
495       CARRY_FORWARD;
496    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 
497       COMBA_STORE(b[5]);
498
499       /* output 6 */
500       CARRY_FORWARD;
501    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 
502       COMBA_STORE(b[6]);
503
504       /* output 7 */
505       CARRY_FORWARD;
506    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 
507       COMBA_STORE(b[7]);
508
509       /* output 8 */
510       CARRY_FORWARD;
511    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); 
512       COMBA_STORE(b[8]);
513
514       /* output 9 */
515       CARRY_FORWARD;
516    SQRADDSC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; 
517       COMBA_STORE(b[9]);
518
519       /* output 10 */
520       CARRY_FORWARD;
521    SQRADDSC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); 
522       COMBA_STORE(b[10]);
523
524       /* output 11 */
525       CARRY_FORWARD;
526    SQRADDSC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; 
527       COMBA_STORE(b[11]);
528
529       /* output 12 */
530       CARRY_FORWARD;
531       SQRADD2(a[4], a[8]);    SQRADD2(a[5], a[7]);    SQRADD(a[6], a[6]); 
532       COMBA_STORE(b[12]);
533
534       /* output 13 */
535       CARRY_FORWARD;
536       SQRADD2(a[5], a[8]);    SQRADD2(a[6], a[7]); 
537       COMBA_STORE(b[13]);
538
539       /* output 14 */
540       CARRY_FORWARD;
541       SQRADD2(a[6], a[8]);    SQRADD(a[7], a[7]); 
542       COMBA_STORE(b[14]);
543
544       /* output 15 */
545       CARRY_FORWARD;
546       SQRADD2(a[7], a[8]); 
547       COMBA_STORE(b[15]);
548
549       /* output 16 */
550       CARRY_FORWARD;
551       SQRADD(a[8], a[8]); 
552       COMBA_STORE(b[16]);
553       COMBA_STORE2(b[17]);
554       COMBA_FINI;
555
556       B->used = 18;
557       B->sign = FP_ZPOS;
558       memcpy(B->dp, b, 18 * sizeof(fp_digit));
559       fp_clamp(B);
560       break;
561
562    case 10:
563       a = A->dp;
564       COMBA_START; 
565
566       /* clear carries */
567       CLEAR_CARRY;
568
569       /* output 0 */
570       SQRADD(a[0],a[0]);
571       COMBA_STORE(b[0]);
572
573       /* output 1 */
574       CARRY_FORWARD;
575       SQRADD2(a[0], a[1]); 
576       COMBA_STORE(b[1]);
577
578       /* output 2 */
579       CARRY_FORWARD;
580       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
581       COMBA_STORE(b[2]);
582
583       /* output 3 */
584       CARRY_FORWARD;
585       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
586       COMBA_STORE(b[3]);
587
588       /* output 4 */
589       CARRY_FORWARD;
590       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
591       COMBA_STORE(b[4]);
592
593       /* output 5 */
594       CARRY_FORWARD;
595    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 
596       COMBA_STORE(b[5]);
597
598       /* output 6 */
599       CARRY_FORWARD;
600    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 
601       COMBA_STORE(b[6]);
602
603       /* output 7 */
604       CARRY_FORWARD;
605    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 
606       COMBA_STORE(b[7]);
607
608       /* output 8 */
609       CARRY_FORWARD;
610    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); 
611       COMBA_STORE(b[8]);
612
613       /* output 9 */
614       CARRY_FORWARD;
615    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; 
616       COMBA_STORE(b[9]);
617
618       /* output 10 */
619       CARRY_FORWARD;
620    SQRADDSC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); 
621       COMBA_STORE(b[10]);
622
623       /* output 11 */
624       CARRY_FORWARD;
625    SQRADDSC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; 
626       COMBA_STORE(b[11]);
627
628       /* output 12 */
629       CARRY_FORWARD;
630    SQRADDSC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); 
631       COMBA_STORE(b[12]);
632
633       /* output 13 */
634       CARRY_FORWARD;
635    SQRADDSC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; 
636       COMBA_STORE(b[13]);
637
638       /* output 14 */
639       CARRY_FORWARD;
640       SQRADD2(a[5], a[9]);    SQRADD2(a[6], a[8]);    SQRADD(a[7], a[7]); 
641       COMBA_STORE(b[14]);
642
643       /* output 15 */
644       CARRY_FORWARD;
645       SQRADD2(a[6], a[9]);    SQRADD2(a[7], a[8]); 
646       COMBA_STORE(b[15]);
647
648       /* output 16 */
649       CARRY_FORWARD;
650       SQRADD2(a[7], a[9]);    SQRADD(a[8], a[8]); 
651       COMBA_STORE(b[16]);
652
653       /* output 17 */
654       CARRY_FORWARD;
655       SQRADD2(a[8], a[9]); 
656       COMBA_STORE(b[17]);
657
658       /* output 18 */
659       CARRY_FORWARD;
660       SQRADD(a[9], a[9]); 
661       COMBA_STORE(b[18]);
662       COMBA_STORE2(b[19]);
663       COMBA_FINI;
664
665       B->used = 20;
666       B->sign = FP_ZPOS;
667       memcpy(B->dp, b, 20 * sizeof(fp_digit));
668       fp_clamp(B);
669       break;
670
671    case 11:
672       a = A->dp;
673       COMBA_START; 
674
675       /* clear carries */
676       CLEAR_CARRY;
677
678       /* output 0 */
679       SQRADD(a[0],a[0]);
680       COMBA_STORE(b[0]);
681
682       /* output 1 */
683       CARRY_FORWARD;
684       SQRADD2(a[0], a[1]); 
685       COMBA_STORE(b[1]);
686
687       /* output 2 */
688       CARRY_FORWARD;
689       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
690       COMBA_STORE(b[2]);
691
692       /* output 3 */
693       CARRY_FORWARD;
694       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
695       COMBA_STORE(b[3]);
696
697       /* output 4 */
698       CARRY_FORWARD;
699       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
700       COMBA_STORE(b[4]);
701
702       /* output 5 */
703       CARRY_FORWARD;
704    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 
705       COMBA_STORE(b[5]);
706
707       /* output 6 */
708       CARRY_FORWARD;
709    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 
710       COMBA_STORE(b[6]);
711
712       /* output 7 */
713       CARRY_FORWARD;
714    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 
715       COMBA_STORE(b[7]);
716
717       /* output 8 */
718       CARRY_FORWARD;
719    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); 
720       COMBA_STORE(b[8]);
721
722       /* output 9 */
723       CARRY_FORWARD;
724    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; 
725       COMBA_STORE(b[9]);
726
727       /* output 10 */
728       CARRY_FORWARD;
729    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); 
730       COMBA_STORE(b[10]);
731
732       /* output 11 */
733       CARRY_FORWARD;
734    SQRADDSC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; 
735       COMBA_STORE(b[11]);
736
737       /* output 12 */
738       CARRY_FORWARD;
739    SQRADDSC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); 
740       COMBA_STORE(b[12]);
741
742       /* output 13 */
743       CARRY_FORWARD;
744    SQRADDSC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; 
745       COMBA_STORE(b[13]);
746
747       /* output 14 */
748       CARRY_FORWARD;
749    SQRADDSC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]); 
750       COMBA_STORE(b[14]);
751
752       /* output 15 */
753       CARRY_FORWARD;
754    SQRADDSC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB; 
755       COMBA_STORE(b[15]);
756
757       /* output 16 */
758       CARRY_FORWARD;
759       SQRADD2(a[6], a[10]);    SQRADD2(a[7], a[9]);    SQRADD(a[8], a[8]); 
760       COMBA_STORE(b[16]);
761
762       /* output 17 */
763       CARRY_FORWARD;
764       SQRADD2(a[7], a[10]);    SQRADD2(a[8], a[9]); 
765       COMBA_STORE(b[17]);
766
767       /* output 18 */
768       CARRY_FORWARD;
769       SQRADD2(a[8], a[10]);    SQRADD(a[9], a[9]); 
770       COMBA_STORE(b[18]);
771
772       /* output 19 */
773       CARRY_FORWARD;
774       SQRADD2(a[9], a[10]); 
775       COMBA_STORE(b[19]);
776
777       /* output 20 */
778       CARRY_FORWARD;
779       SQRADD(a[10], a[10]); 
780       COMBA_STORE(b[20]);
781       COMBA_STORE2(b[21]);
782       COMBA_FINI;
783
784       B->used = 22;
785       B->sign = FP_ZPOS;
786       memcpy(B->dp, b, 22 * sizeof(fp_digit));
787       fp_clamp(B);
788       break;
789
790    case 12:
791       a = A->dp;
792       COMBA_START; 
793
794       /* clear carries */
795       CLEAR_CARRY;
796
797       /* output 0 */
798       SQRADD(a[0],a[0]);
799       COMBA_STORE(b[0]);
800
801       /* output 1 */
802       CARRY_FORWARD;
803       SQRADD2(a[0], a[1]); 
804       COMBA_STORE(b[1]);
805
806       /* output 2 */
807       CARRY_FORWARD;
808       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
809       COMBA_STORE(b[2]);
810
811       /* output 3 */
812       CARRY_FORWARD;
813       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
814       COMBA_STORE(b[3]);
815
816       /* output 4 */
817       CARRY_FORWARD;
818       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
819       COMBA_STORE(b[4]);
820
821       /* output 5 */
822       CARRY_FORWARD;
823    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 
824       COMBA_STORE(b[5]);
825
826       /* output 6 */
827       CARRY_FORWARD;
828    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 
829       COMBA_STORE(b[6]);
830
831       /* output 7 */
832       CARRY_FORWARD;
833    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 
834       COMBA_STORE(b[7]);
835
836       /* output 8 */
837       CARRY_FORWARD;
838    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); 
839       COMBA_STORE(b[8]);
840
841       /* output 9 */
842       CARRY_FORWARD;
843    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; 
844       COMBA_STORE(b[9]);
845
846       /* output 10 */
847       CARRY_FORWARD;
848    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); 
849       COMBA_STORE(b[10]);
850
851       /* output 11 */
852       CARRY_FORWARD;
853    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; 
854       COMBA_STORE(b[11]);
855
856       /* output 12 */
857       CARRY_FORWARD;
858    SQRADDSC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); 
859       COMBA_STORE(b[12]);
860
861       /* output 13 */
862       CARRY_FORWARD;
863    SQRADDSC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; 
864       COMBA_STORE(b[13]);
865
866       /* output 14 */
867       CARRY_FORWARD;
868    SQRADDSC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]); 
869       COMBA_STORE(b[14]);
870
871       /* output 15 */
872       CARRY_FORWARD;
873    SQRADDSC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB; 
874       COMBA_STORE(b[15]);
875
876       /* output 16 */
877       CARRY_FORWARD;
878    SQRADDSC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]); 
879       COMBA_STORE(b[16]);
880
881       /* output 17 */
882       CARRY_FORWARD;
883    SQRADDSC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB; 
884       COMBA_STORE(b[17]);
885
886       /* output 18 */
887       CARRY_FORWARD;
888       SQRADD2(a[7], a[11]);    SQRADD2(a[8], a[10]);    SQRADD(a[9], a[9]); 
889       COMBA_STORE(b[18]);
890
891       /* output 19 */
892       CARRY_FORWARD;
893       SQRADD2(a[8], a[11]);    SQRADD2(a[9], a[10]); 
894       COMBA_STORE(b[19]);
895
896       /* output 20 */
897       CARRY_FORWARD;
898       SQRADD2(a[9], a[11]);    SQRADD(a[10], a[10]); 
899       COMBA_STORE(b[20]);
900
901       /* output 21 */
902       CARRY_FORWARD;
903       SQRADD2(a[10], a[11]); 
904       COMBA_STORE(b[21]);
905
906       /* output 22 */
907       CARRY_FORWARD;
908       SQRADD(a[11], a[11]); 
909       COMBA_STORE(b[22]);
910       COMBA_STORE2(b[23]);
911       COMBA_FINI;
912
913       B->used = 24;
914       B->sign = FP_ZPOS;
915       memcpy(B->dp, b, 24 * sizeof(fp_digit));
916       fp_clamp(B);
917       break;
918
919    case 13:
920       a = A->dp;
921       COMBA_START; 
922
923       /* clear carries */
924       CLEAR_CARRY;
925
926       /* output 0 */
927       SQRADD(a[0],a[0]);
928       COMBA_STORE(b[0]);
929
930       /* output 1 */
931       CARRY_FORWARD;
932       SQRADD2(a[0], a[1]); 
933       COMBA_STORE(b[1]);
934
935       /* output 2 */
936       CARRY_FORWARD;
937       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
938       COMBA_STORE(b[2]);
939
940       /* output 3 */
941       CARRY_FORWARD;
942       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
943       COMBA_STORE(b[3]);
944
945       /* output 4 */
946       CARRY_FORWARD;
947       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
948       COMBA_STORE(b[4]);
949
950       /* output 5 */
951       CARRY_FORWARD;
952    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 
953       COMBA_STORE(b[5]);
954
955       /* output 6 */
956       CARRY_FORWARD;
957    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 
958       COMBA_STORE(b[6]);
959
960       /* output 7 */
961       CARRY_FORWARD;
962    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 
963       COMBA_STORE(b[7]);
964
965       /* output 8 */
966       CARRY_FORWARD;
967    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); 
968       COMBA_STORE(b[8]);
969
970       /* output 9 */
971       CARRY_FORWARD;
972    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; 
973       COMBA_STORE(b[9]);
974
975       /* output 10 */
976       CARRY_FORWARD;
977    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); 
978       COMBA_STORE(b[10]);
979
980       /* output 11 */
981       CARRY_FORWARD;
982    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; 
983       COMBA_STORE(b[11]);
984
985       /* output 12 */
986       CARRY_FORWARD;
987    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); 
988       COMBA_STORE(b[12]);
989
990       /* output 13 */
991       CARRY_FORWARD;
992    SQRADDSC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; 
993       COMBA_STORE(b[13]);
994
995       /* output 14 */
996       CARRY_FORWARD;
997    SQRADDSC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]); 
998       COMBA_STORE(b[14]);
999
1000       /* output 15 */
1001       CARRY_FORWARD;
1002    SQRADDSC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB; 
1003       COMBA_STORE(b[15]);
1004
1005       /* output 16 */
1006       CARRY_FORWARD;
1007    SQRADDSC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]); 
1008       COMBA_STORE(b[16]);
1009
1010       /* output 17 */
1011       CARRY_FORWARD;
1012    SQRADDSC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB; 
1013       COMBA_STORE(b[17]);
1014
1015       /* output 18 */
1016       CARRY_FORWARD;
1017    SQRADDSC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]); 
1018       COMBA_STORE(b[18]);
1019
1020       /* output 19 */
1021       CARRY_FORWARD;
1022    SQRADDSC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB; 
1023       COMBA_STORE(b[19]);
1024
1025       /* output 20 */
1026       CARRY_FORWARD;
1027       SQRADD2(a[8], a[12]);    SQRADD2(a[9], a[11]);    SQRADD(a[10], a[10]); 
1028       COMBA_STORE(b[20]);
1029
1030       /* output 21 */
1031       CARRY_FORWARD;
1032       SQRADD2(a[9], a[12]);    SQRADD2(a[10], a[11]); 
1033       COMBA_STORE(b[21]);
1034
1035       /* output 22 */
1036       CARRY_FORWARD;
1037       SQRADD2(a[10], a[12]);    SQRADD(a[11], a[11]); 
1038       COMBA_STORE(b[22]);
1039
1040       /* output 23 */
1041       CARRY_FORWARD;
1042       SQRADD2(a[11], a[12]); 
1043       COMBA_STORE(b[23]);
1044
1045       /* output 24 */
1046       CARRY_FORWARD;
1047       SQRADD(a[12], a[12]); 
1048       COMBA_STORE(b[24]);
1049       COMBA_STORE2(b[25]);
1050       COMBA_FINI;
1051
1052       B->used = 26;
1053       B->sign = FP_ZPOS;
1054       memcpy(B->dp, b, 26 * sizeof(fp_digit));
1055       fp_clamp(B);
1056       break;
1057
1058    case 14:
1059       a = A->dp;
1060       COMBA_START; 
1061
1062       /* clear carries */
1063       CLEAR_CARRY;
1064
1065       /* output 0 */
1066       SQRADD(a[0],a[0]);
1067       COMBA_STORE(b[0]);
1068
1069       /* output 1 */
1070       CARRY_FORWARD;
1071       SQRADD2(a[0], a[1]); 
1072       COMBA_STORE(b[1]);
1073
1074       /* output 2 */
1075       CARRY_FORWARD;
1076       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
1077       COMBA_STORE(b[2]);
1078
1079       /* output 3 */
1080       CARRY_FORWARD;
1081       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
1082       COMBA_STORE(b[3]);
1083
1084       /* output 4 */
1085       CARRY_FORWARD;
1086       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
1087       COMBA_STORE(b[4]);
1088
1089       /* output 5 */
1090       CARRY_FORWARD;
1091    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 
1092       COMBA_STORE(b[5]);
1093
1094       /* output 6 */
1095       CARRY_FORWARD;
1096    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 
1097       COMBA_STORE(b[6]);
1098
1099       /* output 7 */
1100       CARRY_FORWARD;
1101    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 
1102       COMBA_STORE(b[7]);
1103
1104       /* output 8 */
1105       CARRY_FORWARD;
1106    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); 
1107       COMBA_STORE(b[8]);
1108
1109       /* output 9 */
1110       CARRY_FORWARD;
1111    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; 
1112       COMBA_STORE(b[9]);
1113
1114       /* output 10 */
1115       CARRY_FORWARD;
1116    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); 
1117       COMBA_STORE(b[10]);
1118
1119       /* output 11 */
1120       CARRY_FORWARD;
1121    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; 
1122       COMBA_STORE(b[11]);
1123
1124       /* output 12 */
1125       CARRY_FORWARD;
1126    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); 
1127       COMBA_STORE(b[12]);
1128
1129       /* output 13 */
1130       CARRY_FORWARD;
1131    SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; 
1132       COMBA_STORE(b[13]);
1133
1134       /* output 14 */
1135       CARRY_FORWARD;
1136    SQRADDSC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]); 
1137       COMBA_STORE(b[14]);
1138
1139       /* output 15 */
1140       CARRY_FORWARD;
1141    SQRADDSC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB; 
1142       COMBA_STORE(b[15]);
1143
1144       /* output 16 */
1145       CARRY_FORWARD;
1146    SQRADDSC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]); 
1147       COMBA_STORE(b[16]);
1148
1149       /* output 17 */
1150       CARRY_FORWARD;
1151    SQRADDSC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB; 
1152       COMBA_STORE(b[17]);
1153
1154       /* output 18 */
1155       CARRY_FORWARD;
1156    SQRADDSC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]); 
1157       COMBA_STORE(b[18]);
1158
1159       /* output 19 */
1160       CARRY_FORWARD;
1161    SQRADDSC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB; 
1162       COMBA_STORE(b[19]);
1163
1164       /* output 20 */
1165       CARRY_FORWARD;
1166    SQRADDSC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]); 
1167       COMBA_STORE(b[20]);
1168
1169       /* output 21 */
1170       CARRY_FORWARD;
1171    SQRADDSC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB; 
1172       COMBA_STORE(b[21]);
1173
1174       /* output 22 */
1175       CARRY_FORWARD;
1176       SQRADD2(a[9], a[13]);    SQRADD2(a[10], a[12]);    SQRADD(a[11], a[11]); 
1177       COMBA_STORE(b[22]);
1178
1179       /* output 23 */
1180       CARRY_FORWARD;
1181       SQRADD2(a[10], a[13]);    SQRADD2(a[11], a[12]); 
1182       COMBA_STORE(b[23]);
1183
1184       /* output 24 */
1185       CARRY_FORWARD;
1186       SQRADD2(a[11], a[13]);    SQRADD(a[12], a[12]); 
1187       COMBA_STORE(b[24]);
1188
1189       /* output 25 */
1190       CARRY_FORWARD;
1191       SQRADD2(a[12], a[13]); 
1192       COMBA_STORE(b[25]);
1193
1194       /* output 26 */
1195       CARRY_FORWARD;
1196       SQRADD(a[13], a[13]); 
1197       COMBA_STORE(b[26]);
1198       COMBA_STORE2(b[27]);
1199       COMBA_FINI;
1200
1201       B->used = 28;
1202       B->sign = FP_ZPOS;
1203       memcpy(B->dp, b, 28 * sizeof(fp_digit));
1204       fp_clamp(B);
1205       break;
1206
1207    case 15:
1208       a = A->dp;
1209       COMBA_START; 
1210
1211       /* clear carries */
1212       CLEAR_CARRY;
1213
1214       /* output 0 */
1215       SQRADD(a[0],a[0]);
1216       COMBA_STORE(b[0]);
1217
1218       /* output 1 */
1219       CARRY_FORWARD;
1220       SQRADD2(a[0], a[1]); 
1221       COMBA_STORE(b[1]);
1222
1223       /* output 2 */
1224       CARRY_FORWARD;
1225       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
1226       COMBA_STORE(b[2]);
1227
1228       /* output 3 */
1229       CARRY_FORWARD;
1230       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
1231       COMBA_STORE(b[3]);
1232
1233       /* output 4 */
1234       CARRY_FORWARD;
1235       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
1236       COMBA_STORE(b[4]);
1237
1238       /* output 5 */
1239       CARRY_FORWARD;
1240    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 
1241       COMBA_STORE(b[5]);
1242
1243       /* output 6 */
1244       CARRY_FORWARD;
1245    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 
1246       COMBA_STORE(b[6]);
1247
1248       /* output 7 */
1249       CARRY_FORWARD;
1250    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 
1251       COMBA_STORE(b[7]);
1252
1253       /* output 8 */
1254       CARRY_FORWARD;
1255    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); 
1256       COMBA_STORE(b[8]);
1257
1258       /* output 9 */
1259       CARRY_FORWARD;
1260    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; 
1261       COMBA_STORE(b[9]);
1262
1263       /* output 10 */
1264       CARRY_FORWARD;
1265    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); 
1266       COMBA_STORE(b[10]);
1267
1268       /* output 11 */
1269       CARRY_FORWARD;
1270    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; 
1271       COMBA_STORE(b[11]);
1272
1273       /* output 12 */
1274       CARRY_FORWARD;
1275    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); 
1276       COMBA_STORE(b[12]);
1277
1278       /* output 13 */
1279       CARRY_FORWARD;
1280    SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; 
1281       COMBA_STORE(b[13]);
1282
1283       /* output 14 */
1284       CARRY_FORWARD;
1285    SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]); 
1286       COMBA_STORE(b[14]);
1287
1288       /* output 15 */
1289       CARRY_FORWARD;
1290    SQRADDSC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB; 
1291       COMBA_STORE(b[15]);
1292
1293       /* output 16 */
1294       CARRY_FORWARD;
1295    SQRADDSC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]); 
1296       COMBA_STORE(b[16]);
1297
1298       /* output 17 */
1299       CARRY_FORWARD;
1300    SQRADDSC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB; 
1301       COMBA_STORE(b[17]);
1302
1303       /* output 18 */
1304       CARRY_FORWARD;
1305    SQRADDSC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]); 
1306       COMBA_STORE(b[18]);
1307
1308       /* output 19 */
1309       CARRY_FORWARD;
1310    SQRADDSC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB; 
1311       COMBA_STORE(b[19]);
1312
1313       /* output 20 */
1314       CARRY_FORWARD;
1315    SQRADDSC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]); 
1316       COMBA_STORE(b[20]);
1317
1318       /* output 21 */
1319       CARRY_FORWARD;
1320    SQRADDSC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB; 
1321       COMBA_STORE(b[21]);
1322
1323       /* output 22 */
1324       CARRY_FORWARD;
1325    SQRADDSC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]); 
1326       COMBA_STORE(b[22]);
1327
1328       /* output 23 */
1329       CARRY_FORWARD;
1330    SQRADDSC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB; 
1331       COMBA_STORE(b[23]);
1332
1333       /* output 24 */
1334       CARRY_FORWARD;
1335       SQRADD2(a[10], a[14]);    SQRADD2(a[11], a[13]);    SQRADD(a[12], a[12]); 
1336       COMBA_STORE(b[24]);
1337
1338       /* output 25 */
1339       CARRY_FORWARD;
1340       SQRADD2(a[11], a[14]);    SQRADD2(a[12], a[13]); 
1341       COMBA_STORE(b[25]);
1342
1343       /* output 26 */
1344       CARRY_FORWARD;
1345       SQRADD2(a[12], a[14]);    SQRADD(a[13], a[13]); 
1346       COMBA_STORE(b[26]);
1347
1348       /* output 27 */
1349       CARRY_FORWARD;
1350       SQRADD2(a[13], a[14]); 
1351       COMBA_STORE(b[27]);
1352
1353       /* output 28 */
1354       CARRY_FORWARD;
1355       SQRADD(a[14], a[14]); 
1356       COMBA_STORE(b[28]);
1357       COMBA_STORE2(b[29]);
1358       COMBA_FINI;
1359
1360       B->used = 30;
1361       B->sign = FP_ZPOS;
1362       memcpy(B->dp, b, 30 * sizeof(fp_digit));
1363       fp_clamp(B);
1364       break;
1365
1366    case 16:
1367       a = A->dp;
1368       COMBA_START; 
1369
1370       /* clear carries */
1371       CLEAR_CARRY;
1372
1373       /* output 0 */
1374       SQRADD(a[0],a[0]);
1375       COMBA_STORE(b[0]);
1376
1377       /* output 1 */
1378       CARRY_FORWARD;
1379       SQRADD2(a[0], a[1]); 
1380       COMBA_STORE(b[1]);
1381
1382       /* output 2 */
1383       CARRY_FORWARD;
1384       SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
1385       COMBA_STORE(b[2]);
1386
1387       /* output 3 */
1388       CARRY_FORWARD;
1389       SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
1390       COMBA_STORE(b[3]);
1391
1392       /* output 4 */
1393       CARRY_FORWARD;
1394       SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
1395       COMBA_STORE(b[4]);
1396
1397       /* output 5 */
1398       CARRY_FORWARD;
1399    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 
1400       COMBA_STORE(b[5]);
1401
1402       /* output 6 */
1403       CARRY_FORWARD;
1404    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 
1405       COMBA_STORE(b[6]);
1406
1407       /* output 7 */
1408       CARRY_FORWARD;
1409    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 
1410       COMBA_STORE(b[7]);
1411
1412       /* output 8 */
1413       CARRY_FORWARD;
1414    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); 
1415       COMBA_STORE(b[8]);
1416
1417       /* output 9 */
1418       CARRY_FORWARD;
1419    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; 
1420       COMBA_STORE(b[9]);
1421
1422       /* output 10 */
1423       CARRY_FORWARD;
1424    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); 
1425       COMBA_STORE(b[10]);
1426
1427       /* output 11 */
1428       CARRY_FORWARD;
1429    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; 
1430       COMBA_STORE(b[11]);
1431
1432       /* output 12 */
1433       CARRY_FORWARD;
1434    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); 
1435       COMBA_STORE(b[12]);
1436
1437       /* output 13 */
1438       CARRY_FORWARD;
1439    SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; 
1440       COMBA_STORE(b[13]);
1441
1442       /* output 14 */
1443       CARRY_FORWARD;
1444    SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]); 
1445       COMBA_STORE(b[14]);
1446
1447       /* output 15 */
1448       CARRY_FORWARD;
1449    SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB; 
1450       COMBA_STORE(b[15]);
1451
1452       /* output 16 */
1453       CARRY_FORWARD;
1454    SQRADDSC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]); 
1455       COMBA_STORE(b[16]);
1456
1457       /* output 17 */
1458       CARRY_FORWARD;
1459    SQRADDSC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB; 
1460       COMBA_STORE(b[17]);
1461
1462       /* output 18 */
1463       CARRY_FORWARD;
1464    SQRADDSC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]); 
1465       COMBA_STORE(b[18]);
1466
1467       /* output 19 */
1468       CARRY_FORWARD;
1469    SQRADDSC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB; 
1470       COMBA_STORE(b[19]);
1471
1472       /* output 20 */
1473       CARRY_FORWARD;
1474    SQRADDSC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]); 
1475       COMBA_STORE(b[20]);
1476
1477       /* output 21 */
1478       CARRY_FORWARD;
1479    SQRADDSC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB; 
1480       COMBA_STORE(b[21]);
1481
1482       /* output 22 */
1483       CARRY_FORWARD;
1484    SQRADDSC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]); 
1485       COMBA_STORE(b[22]);
1486
1487       /* output 23 */
1488       CARRY_FORWARD;
1489    SQRADDSC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB; 
1490       COMBA_STORE(b[23]);
1491
1492       /* output 24 */
1493       CARRY_FORWARD;
1494    SQRADDSC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]); 
1495       COMBA_STORE(b[24]);
1496
1497       /* output 25 */
1498       CARRY_FORWARD;
1499    SQRADDSC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB; 
1500       COMBA_STORE(b[25]);
1501
1502       /* output 26 */
1503       CARRY_FORWARD;
1504       SQRADD2(a[11], a[15]);    SQRADD2(a[12], a[14]);    SQRADD(a[13], a[13]); 
1505       COMBA_STORE(b[26]);
1506
1507       /* output 27 */
1508       CARRY_FORWARD;
1509       SQRADD2(a[12], a[15]);    SQRADD2(a[13], a[14]); 
1510       COMBA_STORE(b[27]);
1511
1512       /* output 28 */
1513       CARRY_FORWARD;
1514       SQRADD2(a[13], a[15]);    SQRADD(a[14], a[14]); 
1515       COMBA_STORE(b[28]);
1516
1517       /* output 29 */
1518       CARRY_FORWARD;
1519       SQRADD2(a[14], a[15]); 
1520       COMBA_STORE(b[29]);
1521
1522       /* output 30 */
1523       CARRY_FORWARD;
1524       SQRADD(a[15], a[15]); 
1525       COMBA_STORE(b[30]);
1526       COMBA_STORE2(b[31]);
1527       COMBA_FINI;
1528
1529       B->used = 32;
1530       B->sign = FP_ZPOS;
1531       memcpy(B->dp, b, 32 * sizeof(fp_digit));
1532       fp_clamp(B);
1533       break;
1534
1535    default:
1536       break;
1537 }
1538 }
1539
1540 #endif /* TFM_SMALL_SET */