]> git.sur5r.net Git - freertos/blob - FreeRTOS-Plus/CyaSSL/ctaocrypt/src/fp_mul_comba_small_set.i
Add FreeRTOS-Plus directory.
[freertos] / FreeRTOS-Plus / CyaSSL / ctaocrypt / src / fp_mul_comba_small_set.i
1 /* fp_mul_comba_small_set.i
2  *
3  * Copyright (C) 2006-2011 Sawtooth Consulting Ltd.
4  *
5  * This file is part of CyaSSL.
6  *
7  * CyaSSL 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  * CyaSSL 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20  */
21
22
23 #if defined(TFM_SMALL_SET)
24 void fp_mul_comba_small(fp_int *A, fp_int *B, fp_int *C)
25 {
26    fp_digit c0, c1, c2, at[32];
27    switch (MAX(A->used, B->used)) { 
28
29    case 1:
30       memcpy(at, A->dp, 1 * sizeof(fp_digit));
31       memcpy(at+1, B->dp, 1 * sizeof(fp_digit));
32       COMBA_START;
33
34       COMBA_CLEAR;
35       /* 0 */
36       MULADD(at[0], at[1]); 
37       COMBA_STORE(C->dp[0]);
38       COMBA_STORE2(C->dp[1]);
39       C->used = 2;
40       C->sign = A->sign ^ B->sign;
41       fp_clamp(C);
42       COMBA_FINI;
43       break;
44
45    case 2:
46       memcpy(at, A->dp, 2 * sizeof(fp_digit));
47       memcpy(at+2, B->dp, 2 * sizeof(fp_digit));
48       COMBA_START;
49
50       COMBA_CLEAR;
51       /* 0 */
52       MULADD(at[0], at[2]); 
53       COMBA_STORE(C->dp[0]);
54       /* 1 */
55       COMBA_FORWARD;
56       MULADD(at[0], at[3]);       MULADD(at[1], at[2]); 
57       COMBA_STORE(C->dp[1]);
58       /* 2 */
59       COMBA_FORWARD;
60       MULADD(at[1], at[3]); 
61       COMBA_STORE(C->dp[2]);
62       COMBA_STORE2(C->dp[3]);
63       C->used = 4;
64       C->sign = A->sign ^ B->sign;
65       fp_clamp(C);
66       COMBA_FINI;
67       break;
68
69    case 3:
70       memcpy(at, A->dp, 3 * sizeof(fp_digit));
71       memcpy(at+3, B->dp, 3 * sizeof(fp_digit));
72       COMBA_START;
73
74       COMBA_CLEAR;
75       /* 0 */
76       MULADD(at[0], at[3]); 
77       COMBA_STORE(C->dp[0]);
78       /* 1 */
79       COMBA_FORWARD;
80       MULADD(at[0], at[4]);       MULADD(at[1], at[3]); 
81       COMBA_STORE(C->dp[1]);
82       /* 2 */
83       COMBA_FORWARD;
84       MULADD(at[0], at[5]);       MULADD(at[1], at[4]);       MULADD(at[2], at[3]); 
85       COMBA_STORE(C->dp[2]);
86       /* 3 */
87       COMBA_FORWARD;
88       MULADD(at[1], at[5]);       MULADD(at[2], at[4]); 
89       COMBA_STORE(C->dp[3]);
90       /* 4 */
91       COMBA_FORWARD;
92       MULADD(at[2], at[5]); 
93       COMBA_STORE(C->dp[4]);
94       COMBA_STORE2(C->dp[5]);
95       C->used = 6;
96       C->sign = A->sign ^ B->sign;
97       fp_clamp(C);
98       COMBA_FINI;
99       break;
100
101    case 4:
102       memcpy(at, A->dp, 4 * sizeof(fp_digit));
103       memcpy(at+4, B->dp, 4 * sizeof(fp_digit));
104       COMBA_START;
105
106       COMBA_CLEAR;
107       /* 0 */
108       MULADD(at[0], at[4]); 
109       COMBA_STORE(C->dp[0]);
110       /* 1 */
111       COMBA_FORWARD;
112       MULADD(at[0], at[5]);       MULADD(at[1], at[4]); 
113       COMBA_STORE(C->dp[1]);
114       /* 2 */
115       COMBA_FORWARD;
116       MULADD(at[0], at[6]);       MULADD(at[1], at[5]);       MULADD(at[2], at[4]); 
117       COMBA_STORE(C->dp[2]);
118       /* 3 */
119       COMBA_FORWARD;
120       MULADD(at[0], at[7]);       MULADD(at[1], at[6]);       MULADD(at[2], at[5]);       MULADD(at[3], at[4]); 
121       COMBA_STORE(C->dp[3]);
122       /* 4 */
123       COMBA_FORWARD;
124       MULADD(at[1], at[7]);       MULADD(at[2], at[6]);       MULADD(at[3], at[5]); 
125       COMBA_STORE(C->dp[4]);
126       /* 5 */
127       COMBA_FORWARD;
128       MULADD(at[2], at[7]);       MULADD(at[3], at[6]); 
129       COMBA_STORE(C->dp[5]);
130       /* 6 */
131       COMBA_FORWARD;
132       MULADD(at[3], at[7]); 
133       COMBA_STORE(C->dp[6]);
134       COMBA_STORE2(C->dp[7]);
135       C->used = 8;
136       C->sign = A->sign ^ B->sign;
137       fp_clamp(C);
138       COMBA_FINI;
139       break;
140
141    case 5:
142       memcpy(at, A->dp, 5 * sizeof(fp_digit));
143       memcpy(at+5, B->dp, 5 * sizeof(fp_digit));
144       COMBA_START;
145
146       COMBA_CLEAR;
147       /* 0 */
148       MULADD(at[0], at[5]); 
149       COMBA_STORE(C->dp[0]);
150       /* 1 */
151       COMBA_FORWARD;
152       MULADD(at[0], at[6]);       MULADD(at[1], at[5]); 
153       COMBA_STORE(C->dp[1]);
154       /* 2 */
155       COMBA_FORWARD;
156       MULADD(at[0], at[7]);       MULADD(at[1], at[6]);       MULADD(at[2], at[5]); 
157       COMBA_STORE(C->dp[2]);
158       /* 3 */
159       COMBA_FORWARD;
160       MULADD(at[0], at[8]);       MULADD(at[1], at[7]);       MULADD(at[2], at[6]);       MULADD(at[3], at[5]); 
161       COMBA_STORE(C->dp[3]);
162       /* 4 */
163       COMBA_FORWARD;
164       MULADD(at[0], at[9]);       MULADD(at[1], at[8]);       MULADD(at[2], at[7]);       MULADD(at[3], at[6]);       MULADD(at[4], at[5]); 
165       COMBA_STORE(C->dp[4]);
166       /* 5 */
167       COMBA_FORWARD;
168       MULADD(at[1], at[9]);       MULADD(at[2], at[8]);       MULADD(at[3], at[7]);       MULADD(at[4], at[6]); 
169       COMBA_STORE(C->dp[5]);
170       /* 6 */
171       COMBA_FORWARD;
172       MULADD(at[2], at[9]);       MULADD(at[3], at[8]);       MULADD(at[4], at[7]); 
173       COMBA_STORE(C->dp[6]);
174       /* 7 */
175       COMBA_FORWARD;
176       MULADD(at[3], at[9]);       MULADD(at[4], at[8]); 
177       COMBA_STORE(C->dp[7]);
178       /* 8 */
179       COMBA_FORWARD;
180       MULADD(at[4], at[9]); 
181       COMBA_STORE(C->dp[8]);
182       COMBA_STORE2(C->dp[9]);
183       C->used = 10;
184       C->sign = A->sign ^ B->sign;
185       fp_clamp(C);
186       COMBA_FINI;
187       break;
188
189    case 6:
190       memcpy(at, A->dp, 6 * sizeof(fp_digit));
191       memcpy(at+6, B->dp, 6 * sizeof(fp_digit));
192       COMBA_START;
193
194       COMBA_CLEAR;
195       /* 0 */
196       MULADD(at[0], at[6]); 
197       COMBA_STORE(C->dp[0]);
198       /* 1 */
199       COMBA_FORWARD;
200       MULADD(at[0], at[7]);       MULADD(at[1], at[6]); 
201       COMBA_STORE(C->dp[1]);
202       /* 2 */
203       COMBA_FORWARD;
204       MULADD(at[0], at[8]);       MULADD(at[1], at[7]);       MULADD(at[2], at[6]); 
205       COMBA_STORE(C->dp[2]);
206       /* 3 */
207       COMBA_FORWARD;
208       MULADD(at[0], at[9]);       MULADD(at[1], at[8]);       MULADD(at[2], at[7]);       MULADD(at[3], at[6]); 
209       COMBA_STORE(C->dp[3]);
210       /* 4 */
211       COMBA_FORWARD;
212       MULADD(at[0], at[10]);       MULADD(at[1], at[9]);       MULADD(at[2], at[8]);       MULADD(at[3], at[7]);       MULADD(at[4], at[6]); 
213       COMBA_STORE(C->dp[4]);
214       /* 5 */
215       COMBA_FORWARD;
216       MULADD(at[0], at[11]);       MULADD(at[1], at[10]);       MULADD(at[2], at[9]);       MULADD(at[3], at[8]);       MULADD(at[4], at[7]);       MULADD(at[5], at[6]); 
217       COMBA_STORE(C->dp[5]);
218       /* 6 */
219       COMBA_FORWARD;
220       MULADD(at[1], at[11]);       MULADD(at[2], at[10]);       MULADD(at[3], at[9]);       MULADD(at[4], at[8]);       MULADD(at[5], at[7]); 
221       COMBA_STORE(C->dp[6]);
222       /* 7 */
223       COMBA_FORWARD;
224       MULADD(at[2], at[11]);       MULADD(at[3], at[10]);       MULADD(at[4], at[9]);       MULADD(at[5], at[8]); 
225       COMBA_STORE(C->dp[7]);
226       /* 8 */
227       COMBA_FORWARD;
228       MULADD(at[3], at[11]);       MULADD(at[4], at[10]);       MULADD(at[5], at[9]); 
229       COMBA_STORE(C->dp[8]);
230       /* 9 */
231       COMBA_FORWARD;
232       MULADD(at[4], at[11]);       MULADD(at[5], at[10]); 
233       COMBA_STORE(C->dp[9]);
234       /* 10 */
235       COMBA_FORWARD;
236       MULADD(at[5], at[11]); 
237       COMBA_STORE(C->dp[10]);
238       COMBA_STORE2(C->dp[11]);
239       C->used = 12;
240       C->sign = A->sign ^ B->sign;
241       fp_clamp(C);
242       COMBA_FINI;
243       break;
244
245    case 7:
246       memcpy(at, A->dp, 7 * sizeof(fp_digit));
247       memcpy(at+7, B->dp, 7 * sizeof(fp_digit));
248       COMBA_START;
249
250       COMBA_CLEAR;
251       /* 0 */
252       MULADD(at[0], at[7]); 
253       COMBA_STORE(C->dp[0]);
254       /* 1 */
255       COMBA_FORWARD;
256       MULADD(at[0], at[8]);       MULADD(at[1], at[7]); 
257       COMBA_STORE(C->dp[1]);
258       /* 2 */
259       COMBA_FORWARD;
260       MULADD(at[0], at[9]);       MULADD(at[1], at[8]);       MULADD(at[2], at[7]); 
261       COMBA_STORE(C->dp[2]);
262       /* 3 */
263       COMBA_FORWARD;
264       MULADD(at[0], at[10]);       MULADD(at[1], at[9]);       MULADD(at[2], at[8]);       MULADD(at[3], at[7]); 
265       COMBA_STORE(C->dp[3]);
266       /* 4 */
267       COMBA_FORWARD;
268       MULADD(at[0], at[11]);       MULADD(at[1], at[10]);       MULADD(at[2], at[9]);       MULADD(at[3], at[8]);       MULADD(at[4], at[7]); 
269       COMBA_STORE(C->dp[4]);
270       /* 5 */
271       COMBA_FORWARD;
272       MULADD(at[0], at[12]);       MULADD(at[1], at[11]);       MULADD(at[2], at[10]);       MULADD(at[3], at[9]);       MULADD(at[4], at[8]);       MULADD(at[5], at[7]); 
273       COMBA_STORE(C->dp[5]);
274       /* 6 */
275       COMBA_FORWARD;
276       MULADD(at[0], at[13]);       MULADD(at[1], at[12]);       MULADD(at[2], at[11]);       MULADD(at[3], at[10]);       MULADD(at[4], at[9]);       MULADD(at[5], at[8]);       MULADD(at[6], at[7]); 
277       COMBA_STORE(C->dp[6]);
278       /* 7 */
279       COMBA_FORWARD;
280       MULADD(at[1], at[13]);       MULADD(at[2], at[12]);       MULADD(at[3], at[11]);       MULADD(at[4], at[10]);       MULADD(at[5], at[9]);       MULADD(at[6], at[8]); 
281       COMBA_STORE(C->dp[7]);
282       /* 8 */
283       COMBA_FORWARD;
284       MULADD(at[2], at[13]);       MULADD(at[3], at[12]);       MULADD(at[4], at[11]);       MULADD(at[5], at[10]);       MULADD(at[6], at[9]); 
285       COMBA_STORE(C->dp[8]);
286       /* 9 */
287       COMBA_FORWARD;
288       MULADD(at[3], at[13]);       MULADD(at[4], at[12]);       MULADD(at[5], at[11]);       MULADD(at[6], at[10]); 
289       COMBA_STORE(C->dp[9]);
290       /* 10 */
291       COMBA_FORWARD;
292       MULADD(at[4], at[13]);       MULADD(at[5], at[12]);       MULADD(at[6], at[11]); 
293       COMBA_STORE(C->dp[10]);
294       /* 11 */
295       COMBA_FORWARD;
296       MULADD(at[5], at[13]);       MULADD(at[6], at[12]); 
297       COMBA_STORE(C->dp[11]);
298       /* 12 */
299       COMBA_FORWARD;
300       MULADD(at[6], at[13]); 
301       COMBA_STORE(C->dp[12]);
302       COMBA_STORE2(C->dp[13]);
303       C->used = 14;
304       C->sign = A->sign ^ B->sign;
305       fp_clamp(C);
306       COMBA_FINI;
307       break;
308
309    case 8:
310       memcpy(at, A->dp, 8 * sizeof(fp_digit));
311       memcpy(at+8, B->dp, 8 * sizeof(fp_digit));
312       COMBA_START;
313
314       COMBA_CLEAR;
315       /* 0 */
316       MULADD(at[0], at[8]); 
317       COMBA_STORE(C->dp[0]);
318       /* 1 */
319       COMBA_FORWARD;
320       MULADD(at[0], at[9]);       MULADD(at[1], at[8]); 
321       COMBA_STORE(C->dp[1]);
322       /* 2 */
323       COMBA_FORWARD;
324       MULADD(at[0], at[10]);       MULADD(at[1], at[9]);       MULADD(at[2], at[8]); 
325       COMBA_STORE(C->dp[2]);
326       /* 3 */
327       COMBA_FORWARD;
328       MULADD(at[0], at[11]);       MULADD(at[1], at[10]);       MULADD(at[2], at[9]);       MULADD(at[3], at[8]); 
329       COMBA_STORE(C->dp[3]);
330       /* 4 */
331       COMBA_FORWARD;
332       MULADD(at[0], at[12]);       MULADD(at[1], at[11]);       MULADD(at[2], at[10]);       MULADD(at[3], at[9]);       MULADD(at[4], at[8]); 
333       COMBA_STORE(C->dp[4]);
334       /* 5 */
335       COMBA_FORWARD;
336       MULADD(at[0], at[13]);       MULADD(at[1], at[12]);       MULADD(at[2], at[11]);       MULADD(at[3], at[10]);       MULADD(at[4], at[9]);       MULADD(at[5], at[8]); 
337       COMBA_STORE(C->dp[5]);
338       /* 6 */
339       COMBA_FORWARD;
340       MULADD(at[0], at[14]);       MULADD(at[1], at[13]);       MULADD(at[2], at[12]);       MULADD(at[3], at[11]);       MULADD(at[4], at[10]);       MULADD(at[5], at[9]);       MULADD(at[6], at[8]); 
341       COMBA_STORE(C->dp[6]);
342       /* 7 */
343       COMBA_FORWARD;
344       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);       MULADD(at[2], at[13]);       MULADD(at[3], at[12]);       MULADD(at[4], at[11]);       MULADD(at[5], at[10]);       MULADD(at[6], at[9]);       MULADD(at[7], at[8]); 
345       COMBA_STORE(C->dp[7]);
346       /* 8 */
347       COMBA_FORWARD;
348       MULADD(at[1], at[15]);       MULADD(at[2], at[14]);       MULADD(at[3], at[13]);       MULADD(at[4], at[12]);       MULADD(at[5], at[11]);       MULADD(at[6], at[10]);       MULADD(at[7], at[9]); 
349       COMBA_STORE(C->dp[8]);
350       /* 9 */
351       COMBA_FORWARD;
352       MULADD(at[2], at[15]);       MULADD(at[3], at[14]);       MULADD(at[4], at[13]);       MULADD(at[5], at[12]);       MULADD(at[6], at[11]);       MULADD(at[7], at[10]); 
353       COMBA_STORE(C->dp[9]);
354       /* 10 */
355       COMBA_FORWARD;
356       MULADD(at[3], at[15]);       MULADD(at[4], at[14]);       MULADD(at[5], at[13]);       MULADD(at[6], at[12]);       MULADD(at[7], at[11]); 
357       COMBA_STORE(C->dp[10]);
358       /* 11 */
359       COMBA_FORWARD;
360       MULADD(at[4], at[15]);       MULADD(at[5], at[14]);       MULADD(at[6], at[13]);       MULADD(at[7], at[12]); 
361       COMBA_STORE(C->dp[11]);
362       /* 12 */
363       COMBA_FORWARD;
364       MULADD(at[5], at[15]);       MULADD(at[6], at[14]);       MULADD(at[7], at[13]); 
365       COMBA_STORE(C->dp[12]);
366       /* 13 */
367       COMBA_FORWARD;
368       MULADD(at[6], at[15]);       MULADD(at[7], at[14]); 
369       COMBA_STORE(C->dp[13]);
370       /* 14 */
371       COMBA_FORWARD;
372       MULADD(at[7], at[15]); 
373       COMBA_STORE(C->dp[14]);
374       COMBA_STORE2(C->dp[15]);
375       C->used = 16;
376       C->sign = A->sign ^ B->sign;
377       fp_clamp(C);
378       COMBA_FINI;
379       break;
380
381    case 9:
382       memcpy(at, A->dp, 9 * sizeof(fp_digit));
383       memcpy(at+9, B->dp, 9 * sizeof(fp_digit));
384       COMBA_START;
385
386       COMBA_CLEAR;
387       /* 0 */
388       MULADD(at[0], at[9]); 
389       COMBA_STORE(C->dp[0]);
390       /* 1 */
391       COMBA_FORWARD;
392       MULADD(at[0], at[10]);       MULADD(at[1], at[9]); 
393       COMBA_STORE(C->dp[1]);
394       /* 2 */
395       COMBA_FORWARD;
396       MULADD(at[0], at[11]);       MULADD(at[1], at[10]);       MULADD(at[2], at[9]); 
397       COMBA_STORE(C->dp[2]);
398       /* 3 */
399       COMBA_FORWARD;
400       MULADD(at[0], at[12]);       MULADD(at[1], at[11]);       MULADD(at[2], at[10]);       MULADD(at[3], at[9]); 
401       COMBA_STORE(C->dp[3]);
402       /* 4 */
403       COMBA_FORWARD;
404       MULADD(at[0], at[13]);       MULADD(at[1], at[12]);       MULADD(at[2], at[11]);       MULADD(at[3], at[10]);       MULADD(at[4], at[9]); 
405       COMBA_STORE(C->dp[4]);
406       /* 5 */
407       COMBA_FORWARD;
408       MULADD(at[0], at[14]);       MULADD(at[1], at[13]);       MULADD(at[2], at[12]);       MULADD(at[3], at[11]);       MULADD(at[4], at[10]);       MULADD(at[5], at[9]); 
409       COMBA_STORE(C->dp[5]);
410       /* 6 */
411       COMBA_FORWARD;
412       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);       MULADD(at[2], at[13]);       MULADD(at[3], at[12]);       MULADD(at[4], at[11]);       MULADD(at[5], at[10]);       MULADD(at[6], at[9]); 
413       COMBA_STORE(C->dp[6]);
414       /* 7 */
415       COMBA_FORWARD;
416       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);       MULADD(at[2], at[14]);       MULADD(at[3], at[13]);       MULADD(at[4], at[12]);       MULADD(at[5], at[11]);       MULADD(at[6], at[10]);       MULADD(at[7], at[9]); 
417       COMBA_STORE(C->dp[7]);
418       /* 8 */
419       COMBA_FORWARD;
420       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]);       MULADD(at[3], at[14]);       MULADD(at[4], at[13]);       MULADD(at[5], at[12]);       MULADD(at[6], at[11]);       MULADD(at[7], at[10]);       MULADD(at[8], at[9]); 
421       COMBA_STORE(C->dp[8]);
422       /* 9 */
423       COMBA_FORWARD;
424       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]);       MULADD(at[4], at[14]);       MULADD(at[5], at[13]);       MULADD(at[6], at[12]);       MULADD(at[7], at[11]);       MULADD(at[8], at[10]); 
425       COMBA_STORE(C->dp[9]);
426       /* 10 */
427       COMBA_FORWARD;
428       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);       MULADD(at[4], at[15]);       MULADD(at[5], at[14]);       MULADD(at[6], at[13]);       MULADD(at[7], at[12]);       MULADD(at[8], at[11]); 
429       COMBA_STORE(C->dp[10]);
430       /* 11 */
431       COMBA_FORWARD;
432       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);       MULADD(at[5], at[15]);       MULADD(at[6], at[14]);       MULADD(at[7], at[13]);       MULADD(at[8], at[12]); 
433       COMBA_STORE(C->dp[11]);
434       /* 12 */
435       COMBA_FORWARD;
436       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);       MULADD(at[6], at[15]);       MULADD(at[7], at[14]);       MULADD(at[8], at[13]); 
437       COMBA_STORE(C->dp[12]);
438       /* 13 */
439       COMBA_FORWARD;
440       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]);       MULADD(at[8], at[14]); 
441       COMBA_STORE(C->dp[13]);
442       /* 14 */
443       COMBA_FORWARD;
444       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]); 
445       COMBA_STORE(C->dp[14]);
446       /* 15 */
447       COMBA_FORWARD;
448       MULADD(at[7], at[17]);       MULADD(at[8], at[16]); 
449       COMBA_STORE(C->dp[15]);
450       /* 16 */
451       COMBA_FORWARD;
452       MULADD(at[8], at[17]); 
453       COMBA_STORE(C->dp[16]);
454       COMBA_STORE2(C->dp[17]);
455       C->used = 18;
456       C->sign = A->sign ^ B->sign;
457       fp_clamp(C);
458       COMBA_FINI;
459       break;
460
461    case 10:
462       memcpy(at, A->dp, 10 * sizeof(fp_digit));
463       memcpy(at+10, B->dp, 10 * sizeof(fp_digit));
464       COMBA_START;
465
466       COMBA_CLEAR;
467       /* 0 */
468       MULADD(at[0], at[10]); 
469       COMBA_STORE(C->dp[0]);
470       /* 1 */
471       COMBA_FORWARD;
472       MULADD(at[0], at[11]);       MULADD(at[1], at[10]); 
473       COMBA_STORE(C->dp[1]);
474       /* 2 */
475       COMBA_FORWARD;
476       MULADD(at[0], at[12]);       MULADD(at[1], at[11]);       MULADD(at[2], at[10]); 
477       COMBA_STORE(C->dp[2]);
478       /* 3 */
479       COMBA_FORWARD;
480       MULADD(at[0], at[13]);       MULADD(at[1], at[12]);       MULADD(at[2], at[11]);       MULADD(at[3], at[10]); 
481       COMBA_STORE(C->dp[3]);
482       /* 4 */
483       COMBA_FORWARD;
484       MULADD(at[0], at[14]);       MULADD(at[1], at[13]);       MULADD(at[2], at[12]);       MULADD(at[3], at[11]);       MULADD(at[4], at[10]); 
485       COMBA_STORE(C->dp[4]);
486       /* 5 */
487       COMBA_FORWARD;
488       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);       MULADD(at[2], at[13]);       MULADD(at[3], at[12]);       MULADD(at[4], at[11]);       MULADD(at[5], at[10]); 
489       COMBA_STORE(C->dp[5]);
490       /* 6 */
491       COMBA_FORWARD;
492       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);       MULADD(at[2], at[14]);       MULADD(at[3], at[13]);       MULADD(at[4], at[12]);       MULADD(at[5], at[11]);       MULADD(at[6], at[10]); 
493       COMBA_STORE(C->dp[6]);
494       /* 7 */
495       COMBA_FORWARD;
496       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]);       MULADD(at[3], at[14]);       MULADD(at[4], at[13]);       MULADD(at[5], at[12]);       MULADD(at[6], at[11]);       MULADD(at[7], at[10]); 
497       COMBA_STORE(C->dp[7]);
498       /* 8 */
499       COMBA_FORWARD;
500       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]);       MULADD(at[4], at[14]);       MULADD(at[5], at[13]);       MULADD(at[6], at[12]);       MULADD(at[7], at[11]);       MULADD(at[8], at[10]); 
501       COMBA_STORE(C->dp[8]);
502       /* 9 */
503       COMBA_FORWARD;
504       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);       MULADD(at[4], at[15]);       MULADD(at[5], at[14]);       MULADD(at[6], at[13]);       MULADD(at[7], at[12]);       MULADD(at[8], at[11]);       MULADD(at[9], at[10]); 
505       COMBA_STORE(C->dp[9]);
506       /* 10 */
507       COMBA_FORWARD;
508       MULADD(at[1], at[19]);       MULADD(at[2], at[18]);       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);       MULADD(at[5], at[15]);       MULADD(at[6], at[14]);       MULADD(at[7], at[13]);       MULADD(at[8], at[12]);       MULADD(at[9], at[11]); 
509       COMBA_STORE(C->dp[10]);
510       /* 11 */
511       COMBA_FORWARD;
512       MULADD(at[2], at[19]);       MULADD(at[3], at[18]);       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);       MULADD(at[6], at[15]);       MULADD(at[7], at[14]);       MULADD(at[8], at[13]);       MULADD(at[9], at[12]); 
513       COMBA_STORE(C->dp[11]);
514       /* 12 */
515       COMBA_FORWARD;
516       MULADD(at[3], at[19]);       MULADD(at[4], at[18]);       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]);       MULADD(at[8], at[14]);       MULADD(at[9], at[13]); 
517       COMBA_STORE(C->dp[12]);
518       /* 13 */
519       COMBA_FORWARD;
520       MULADD(at[4], at[19]);       MULADD(at[5], at[18]);       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]);       MULADD(at[9], at[14]); 
521       COMBA_STORE(C->dp[13]);
522       /* 14 */
523       COMBA_FORWARD;
524       MULADD(at[5], at[19]);       MULADD(at[6], at[18]);       MULADD(at[7], at[17]);       MULADD(at[8], at[16]);       MULADD(at[9], at[15]); 
525       COMBA_STORE(C->dp[14]);
526       /* 15 */
527       COMBA_FORWARD;
528       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]); 
529       COMBA_STORE(C->dp[15]);
530       /* 16 */
531       COMBA_FORWARD;
532       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]); 
533       COMBA_STORE(C->dp[16]);
534       /* 17 */
535       COMBA_FORWARD;
536       MULADD(at[8], at[19]);       MULADD(at[9], at[18]); 
537       COMBA_STORE(C->dp[17]);
538       /* 18 */
539       COMBA_FORWARD;
540       MULADD(at[9], at[19]); 
541       COMBA_STORE(C->dp[18]);
542       COMBA_STORE2(C->dp[19]);
543       C->used = 20;
544       C->sign = A->sign ^ B->sign;
545       fp_clamp(C);
546       COMBA_FINI;
547       break;
548
549    case 11:
550       memcpy(at, A->dp, 11 * sizeof(fp_digit));
551       memcpy(at+11, B->dp, 11 * sizeof(fp_digit));
552       COMBA_START;
553
554       COMBA_CLEAR;
555       /* 0 */
556       MULADD(at[0], at[11]); 
557       COMBA_STORE(C->dp[0]);
558       /* 1 */
559       COMBA_FORWARD;
560       MULADD(at[0], at[12]);       MULADD(at[1], at[11]); 
561       COMBA_STORE(C->dp[1]);
562       /* 2 */
563       COMBA_FORWARD;
564       MULADD(at[0], at[13]);       MULADD(at[1], at[12]);       MULADD(at[2], at[11]); 
565       COMBA_STORE(C->dp[2]);
566       /* 3 */
567       COMBA_FORWARD;
568       MULADD(at[0], at[14]);       MULADD(at[1], at[13]);       MULADD(at[2], at[12]);       MULADD(at[3], at[11]); 
569       COMBA_STORE(C->dp[3]);
570       /* 4 */
571       COMBA_FORWARD;
572       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);       MULADD(at[2], at[13]);       MULADD(at[3], at[12]);       MULADD(at[4], at[11]); 
573       COMBA_STORE(C->dp[4]);
574       /* 5 */
575       COMBA_FORWARD;
576       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);       MULADD(at[2], at[14]);       MULADD(at[3], at[13]);       MULADD(at[4], at[12]);       MULADD(at[5], at[11]); 
577       COMBA_STORE(C->dp[5]);
578       /* 6 */
579       COMBA_FORWARD;
580       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]);       MULADD(at[3], at[14]);       MULADD(at[4], at[13]);       MULADD(at[5], at[12]);       MULADD(at[6], at[11]); 
581       COMBA_STORE(C->dp[6]);
582       /* 7 */
583       COMBA_FORWARD;
584       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]);       MULADD(at[4], at[14]);       MULADD(at[5], at[13]);       MULADD(at[6], at[12]);       MULADD(at[7], at[11]); 
585       COMBA_STORE(C->dp[7]);
586       /* 8 */
587       COMBA_FORWARD;
588       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);       MULADD(at[4], at[15]);       MULADD(at[5], at[14]);       MULADD(at[6], at[13]);       MULADD(at[7], at[12]);       MULADD(at[8], at[11]); 
589       COMBA_STORE(C->dp[8]);
590       /* 9 */
591       COMBA_FORWARD;
592       MULADD(at[0], at[20]);       MULADD(at[1], at[19]);       MULADD(at[2], at[18]);       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);       MULADD(at[5], at[15]);       MULADD(at[6], at[14]);       MULADD(at[7], at[13]);       MULADD(at[8], at[12]);       MULADD(at[9], at[11]); 
593       COMBA_STORE(C->dp[9]);
594       /* 10 */
595       COMBA_FORWARD;
596       MULADD(at[0], at[21]);       MULADD(at[1], at[20]);       MULADD(at[2], at[19]);       MULADD(at[3], at[18]);       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);       MULADD(at[6], at[15]);       MULADD(at[7], at[14]);       MULADD(at[8], at[13]);       MULADD(at[9], at[12]);       MULADD(at[10], at[11]); 
597       COMBA_STORE(C->dp[10]);
598       /* 11 */
599       COMBA_FORWARD;
600       MULADD(at[1], at[21]);       MULADD(at[2], at[20]);       MULADD(at[3], at[19]);       MULADD(at[4], at[18]);       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]);       MULADD(at[8], at[14]);       MULADD(at[9], at[13]);       MULADD(at[10], at[12]); 
601       COMBA_STORE(C->dp[11]);
602       /* 12 */
603       COMBA_FORWARD;
604       MULADD(at[2], at[21]);       MULADD(at[3], at[20]);       MULADD(at[4], at[19]);       MULADD(at[5], at[18]);       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]);       MULADD(at[9], at[14]);       MULADD(at[10], at[13]); 
605       COMBA_STORE(C->dp[12]);
606       /* 13 */
607       COMBA_FORWARD;
608       MULADD(at[3], at[21]);       MULADD(at[4], at[20]);       MULADD(at[5], at[19]);       MULADD(at[6], at[18]);       MULADD(at[7], at[17]);       MULADD(at[8], at[16]);       MULADD(at[9], at[15]);       MULADD(at[10], at[14]); 
609       COMBA_STORE(C->dp[13]);
610       /* 14 */
611       COMBA_FORWARD;
612       MULADD(at[4], at[21]);       MULADD(at[5], at[20]);       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]);       MULADD(at[10], at[15]); 
613       COMBA_STORE(C->dp[14]);
614       /* 15 */
615       COMBA_FORWARD;
616       MULADD(at[5], at[21]);       MULADD(at[6], at[20]);       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]);       MULADD(at[10], at[16]); 
617       COMBA_STORE(C->dp[15]);
618       /* 16 */
619       COMBA_FORWARD;
620       MULADD(at[6], at[21]);       MULADD(at[7], at[20]);       MULADD(at[8], at[19]);       MULADD(at[9], at[18]);       MULADD(at[10], at[17]); 
621       COMBA_STORE(C->dp[16]);
622       /* 17 */
623       COMBA_FORWARD;
624       MULADD(at[7], at[21]);       MULADD(at[8], at[20]);       MULADD(at[9], at[19]);       MULADD(at[10], at[18]); 
625       COMBA_STORE(C->dp[17]);
626       /* 18 */
627       COMBA_FORWARD;
628       MULADD(at[8], at[21]);       MULADD(at[9], at[20]);       MULADD(at[10], at[19]); 
629       COMBA_STORE(C->dp[18]);
630       /* 19 */
631       COMBA_FORWARD;
632       MULADD(at[9], at[21]);       MULADD(at[10], at[20]); 
633       COMBA_STORE(C->dp[19]);
634       /* 20 */
635       COMBA_FORWARD;
636       MULADD(at[10], at[21]); 
637       COMBA_STORE(C->dp[20]);
638       COMBA_STORE2(C->dp[21]);
639       C->used = 22;
640       C->sign = A->sign ^ B->sign;
641       fp_clamp(C);
642       COMBA_FINI;
643       break;
644
645    case 12:
646       memcpy(at, A->dp, 12 * sizeof(fp_digit));
647       memcpy(at+12, B->dp, 12 * sizeof(fp_digit));
648       COMBA_START;
649
650       COMBA_CLEAR;
651       /* 0 */
652       MULADD(at[0], at[12]); 
653       COMBA_STORE(C->dp[0]);
654       /* 1 */
655       COMBA_FORWARD;
656       MULADD(at[0], at[13]);       MULADD(at[1], at[12]); 
657       COMBA_STORE(C->dp[1]);
658       /* 2 */
659       COMBA_FORWARD;
660       MULADD(at[0], at[14]);       MULADD(at[1], at[13]);       MULADD(at[2], at[12]); 
661       COMBA_STORE(C->dp[2]);
662       /* 3 */
663       COMBA_FORWARD;
664       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);       MULADD(at[2], at[13]);       MULADD(at[3], at[12]); 
665       COMBA_STORE(C->dp[3]);
666       /* 4 */
667       COMBA_FORWARD;
668       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);       MULADD(at[2], at[14]);       MULADD(at[3], at[13]);       MULADD(at[4], at[12]); 
669       COMBA_STORE(C->dp[4]);
670       /* 5 */
671       COMBA_FORWARD;
672       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]);       MULADD(at[3], at[14]);       MULADD(at[4], at[13]);       MULADD(at[5], at[12]); 
673       COMBA_STORE(C->dp[5]);
674       /* 6 */
675       COMBA_FORWARD;
676       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]);       MULADD(at[4], at[14]);       MULADD(at[5], at[13]);       MULADD(at[6], at[12]); 
677       COMBA_STORE(C->dp[6]);
678       /* 7 */
679       COMBA_FORWARD;
680       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);       MULADD(at[4], at[15]);       MULADD(at[5], at[14]);       MULADD(at[6], at[13]);       MULADD(at[7], at[12]); 
681       COMBA_STORE(C->dp[7]);
682       /* 8 */
683       COMBA_FORWARD;
684       MULADD(at[0], at[20]);       MULADD(at[1], at[19]);       MULADD(at[2], at[18]);       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);       MULADD(at[5], at[15]);       MULADD(at[6], at[14]);       MULADD(at[7], at[13]);       MULADD(at[8], at[12]); 
685       COMBA_STORE(C->dp[8]);
686       /* 9 */
687       COMBA_FORWARD;
688       MULADD(at[0], at[21]);       MULADD(at[1], at[20]);       MULADD(at[2], at[19]);       MULADD(at[3], at[18]);       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);       MULADD(at[6], at[15]);       MULADD(at[7], at[14]);       MULADD(at[8], at[13]);       MULADD(at[9], at[12]); 
689       COMBA_STORE(C->dp[9]);
690       /* 10 */
691       COMBA_FORWARD;
692       MULADD(at[0], at[22]);       MULADD(at[1], at[21]);       MULADD(at[2], at[20]);       MULADD(at[3], at[19]);       MULADD(at[4], at[18]);       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]);       MULADD(at[8], at[14]);       MULADD(at[9], at[13]);       MULADD(at[10], at[12]); 
693       COMBA_STORE(C->dp[10]);
694       /* 11 */
695       COMBA_FORWARD;
696       MULADD(at[0], at[23]);       MULADD(at[1], at[22]);       MULADD(at[2], at[21]);       MULADD(at[3], at[20]);       MULADD(at[4], at[19]);       MULADD(at[5], at[18]);       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]);       MULADD(at[9], at[14]);       MULADD(at[10], at[13]);       MULADD(at[11], at[12]); 
697       COMBA_STORE(C->dp[11]);
698       /* 12 */
699       COMBA_FORWARD;
700       MULADD(at[1], at[23]);       MULADD(at[2], at[22]);       MULADD(at[3], at[21]);       MULADD(at[4], at[20]);       MULADD(at[5], at[19]);       MULADD(at[6], at[18]);       MULADD(at[7], at[17]);       MULADD(at[8], at[16]);       MULADD(at[9], at[15]);       MULADD(at[10], at[14]);       MULADD(at[11], at[13]); 
701       COMBA_STORE(C->dp[12]);
702       /* 13 */
703       COMBA_FORWARD;
704       MULADD(at[2], at[23]);       MULADD(at[3], at[22]);       MULADD(at[4], at[21]);       MULADD(at[5], at[20]);       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]);       MULADD(at[10], at[15]);       MULADD(at[11], at[14]); 
705       COMBA_STORE(C->dp[13]);
706       /* 14 */
707       COMBA_FORWARD;
708       MULADD(at[3], at[23]);       MULADD(at[4], at[22]);       MULADD(at[5], at[21]);       MULADD(at[6], at[20]);       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]);       MULADD(at[10], at[16]);       MULADD(at[11], at[15]); 
709       COMBA_STORE(C->dp[14]);
710       /* 15 */
711       COMBA_FORWARD;
712       MULADD(at[4], at[23]);       MULADD(at[5], at[22]);       MULADD(at[6], at[21]);       MULADD(at[7], at[20]);       MULADD(at[8], at[19]);       MULADD(at[9], at[18]);       MULADD(at[10], at[17]);       MULADD(at[11], at[16]); 
713       COMBA_STORE(C->dp[15]);
714       /* 16 */
715       COMBA_FORWARD;
716       MULADD(at[5], at[23]);       MULADD(at[6], at[22]);       MULADD(at[7], at[21]);       MULADD(at[8], at[20]);       MULADD(at[9], at[19]);       MULADD(at[10], at[18]);       MULADD(at[11], at[17]); 
717       COMBA_STORE(C->dp[16]);
718       /* 17 */
719       COMBA_FORWARD;
720       MULADD(at[6], at[23]);       MULADD(at[7], at[22]);       MULADD(at[8], at[21]);       MULADD(at[9], at[20]);       MULADD(at[10], at[19]);       MULADD(at[11], at[18]); 
721       COMBA_STORE(C->dp[17]);
722       /* 18 */
723       COMBA_FORWARD;
724       MULADD(at[7], at[23]);       MULADD(at[8], at[22]);       MULADD(at[9], at[21]);       MULADD(at[10], at[20]);       MULADD(at[11], at[19]); 
725       COMBA_STORE(C->dp[18]);
726       /* 19 */
727       COMBA_FORWARD;
728       MULADD(at[8], at[23]);       MULADD(at[9], at[22]);       MULADD(at[10], at[21]);       MULADD(at[11], at[20]); 
729       COMBA_STORE(C->dp[19]);
730       /* 20 */
731       COMBA_FORWARD;
732       MULADD(at[9], at[23]);       MULADD(at[10], at[22]);       MULADD(at[11], at[21]); 
733       COMBA_STORE(C->dp[20]);
734       /* 21 */
735       COMBA_FORWARD;
736       MULADD(at[10], at[23]);       MULADD(at[11], at[22]); 
737       COMBA_STORE(C->dp[21]);
738       /* 22 */
739       COMBA_FORWARD;
740       MULADD(at[11], at[23]); 
741       COMBA_STORE(C->dp[22]);
742       COMBA_STORE2(C->dp[23]);
743       C->used = 24;
744       C->sign = A->sign ^ B->sign;
745       fp_clamp(C);
746       COMBA_FINI;
747       break;
748
749    case 13:
750       memcpy(at, A->dp, 13 * sizeof(fp_digit));
751       memcpy(at+13, B->dp, 13 * sizeof(fp_digit));
752       COMBA_START;
753
754       COMBA_CLEAR;
755       /* 0 */
756       MULADD(at[0], at[13]); 
757       COMBA_STORE(C->dp[0]);
758       /* 1 */
759       COMBA_FORWARD;
760       MULADD(at[0], at[14]);       MULADD(at[1], at[13]); 
761       COMBA_STORE(C->dp[1]);
762       /* 2 */
763       COMBA_FORWARD;
764       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);       MULADD(at[2], at[13]); 
765       COMBA_STORE(C->dp[2]);
766       /* 3 */
767       COMBA_FORWARD;
768       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);       MULADD(at[2], at[14]);       MULADD(at[3], at[13]); 
769       COMBA_STORE(C->dp[3]);
770       /* 4 */
771       COMBA_FORWARD;
772       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]);       MULADD(at[3], at[14]);       MULADD(at[4], at[13]); 
773       COMBA_STORE(C->dp[4]);
774       /* 5 */
775       COMBA_FORWARD;
776       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]);       MULADD(at[4], at[14]);       MULADD(at[5], at[13]); 
777       COMBA_STORE(C->dp[5]);
778       /* 6 */
779       COMBA_FORWARD;
780       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);       MULADD(at[4], at[15]);       MULADD(at[5], at[14]);       MULADD(at[6], at[13]); 
781       COMBA_STORE(C->dp[6]);
782       /* 7 */
783       COMBA_FORWARD;
784       MULADD(at[0], at[20]);       MULADD(at[1], at[19]);       MULADD(at[2], at[18]);       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);       MULADD(at[5], at[15]);       MULADD(at[6], at[14]);       MULADD(at[7], at[13]); 
785       COMBA_STORE(C->dp[7]);
786       /* 8 */
787       COMBA_FORWARD;
788       MULADD(at[0], at[21]);       MULADD(at[1], at[20]);       MULADD(at[2], at[19]);       MULADD(at[3], at[18]);       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);       MULADD(at[6], at[15]);       MULADD(at[7], at[14]);       MULADD(at[8], at[13]); 
789       COMBA_STORE(C->dp[8]);
790       /* 9 */
791       COMBA_FORWARD;
792       MULADD(at[0], at[22]);       MULADD(at[1], at[21]);       MULADD(at[2], at[20]);       MULADD(at[3], at[19]);       MULADD(at[4], at[18]);       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]);       MULADD(at[8], at[14]);       MULADD(at[9], at[13]); 
793       COMBA_STORE(C->dp[9]);
794       /* 10 */
795       COMBA_FORWARD;
796       MULADD(at[0], at[23]);       MULADD(at[1], at[22]);       MULADD(at[2], at[21]);       MULADD(at[3], at[20]);       MULADD(at[4], at[19]);       MULADD(at[5], at[18]);       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]);       MULADD(at[9], at[14]);       MULADD(at[10], at[13]); 
797       COMBA_STORE(C->dp[10]);
798       /* 11 */
799       COMBA_FORWARD;
800       MULADD(at[0], at[24]);       MULADD(at[1], at[23]);       MULADD(at[2], at[22]);       MULADD(at[3], at[21]);       MULADD(at[4], at[20]);       MULADD(at[5], at[19]);       MULADD(at[6], at[18]);       MULADD(at[7], at[17]);       MULADD(at[8], at[16]);       MULADD(at[9], at[15]);       MULADD(at[10], at[14]);       MULADD(at[11], at[13]); 
801       COMBA_STORE(C->dp[11]);
802       /* 12 */
803       COMBA_FORWARD;
804       MULADD(at[0], at[25]);       MULADD(at[1], at[24]);       MULADD(at[2], at[23]);       MULADD(at[3], at[22]);       MULADD(at[4], at[21]);       MULADD(at[5], at[20]);       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]);       MULADD(at[10], at[15]);       MULADD(at[11], at[14]);       MULADD(at[12], at[13]); 
805       COMBA_STORE(C->dp[12]);
806       /* 13 */
807       COMBA_FORWARD;
808       MULADD(at[1], at[25]);       MULADD(at[2], at[24]);       MULADD(at[3], at[23]);       MULADD(at[4], at[22]);       MULADD(at[5], at[21]);       MULADD(at[6], at[20]);       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]);       MULADD(at[10], at[16]);       MULADD(at[11], at[15]);       MULADD(at[12], at[14]); 
809       COMBA_STORE(C->dp[13]);
810       /* 14 */
811       COMBA_FORWARD;
812       MULADD(at[2], at[25]);       MULADD(at[3], at[24]);       MULADD(at[4], at[23]);       MULADD(at[5], at[22]);       MULADD(at[6], at[21]);       MULADD(at[7], at[20]);       MULADD(at[8], at[19]);       MULADD(at[9], at[18]);       MULADD(at[10], at[17]);       MULADD(at[11], at[16]);       MULADD(at[12], at[15]); 
813       COMBA_STORE(C->dp[14]);
814       /* 15 */
815       COMBA_FORWARD;
816       MULADD(at[3], at[25]);       MULADD(at[4], at[24]);       MULADD(at[5], at[23]);       MULADD(at[6], at[22]);       MULADD(at[7], at[21]);       MULADD(at[8], at[20]);       MULADD(at[9], at[19]);       MULADD(at[10], at[18]);       MULADD(at[11], at[17]);       MULADD(at[12], at[16]); 
817       COMBA_STORE(C->dp[15]);
818       /* 16 */
819       COMBA_FORWARD;
820       MULADD(at[4], at[25]);       MULADD(at[5], at[24]);       MULADD(at[6], at[23]);       MULADD(at[7], at[22]);       MULADD(at[8], at[21]);       MULADD(at[9], at[20]);       MULADD(at[10], at[19]);       MULADD(at[11], at[18]);       MULADD(at[12], at[17]); 
821       COMBA_STORE(C->dp[16]);
822       /* 17 */
823       COMBA_FORWARD;
824       MULADD(at[5], at[25]);       MULADD(at[6], at[24]);       MULADD(at[7], at[23]);       MULADD(at[8], at[22]);       MULADD(at[9], at[21]);       MULADD(at[10], at[20]);       MULADD(at[11], at[19]);       MULADD(at[12], at[18]); 
825       COMBA_STORE(C->dp[17]);
826       /* 18 */
827       COMBA_FORWARD;
828       MULADD(at[6], at[25]);       MULADD(at[7], at[24]);       MULADD(at[8], at[23]);       MULADD(at[9], at[22]);       MULADD(at[10], at[21]);       MULADD(at[11], at[20]);       MULADD(at[12], at[19]); 
829       COMBA_STORE(C->dp[18]);
830       /* 19 */
831       COMBA_FORWARD;
832       MULADD(at[7], at[25]);       MULADD(at[8], at[24]);       MULADD(at[9], at[23]);       MULADD(at[10], at[22]);       MULADD(at[11], at[21]);       MULADD(at[12], at[20]); 
833       COMBA_STORE(C->dp[19]);
834       /* 20 */
835       COMBA_FORWARD;
836       MULADD(at[8], at[25]);       MULADD(at[9], at[24]);       MULADD(at[10], at[23]);       MULADD(at[11], at[22]);       MULADD(at[12], at[21]); 
837       COMBA_STORE(C->dp[20]);
838       /* 21 */
839       COMBA_FORWARD;
840       MULADD(at[9], at[25]);       MULADD(at[10], at[24]);       MULADD(at[11], at[23]);       MULADD(at[12], at[22]); 
841       COMBA_STORE(C->dp[21]);
842       /* 22 */
843       COMBA_FORWARD;
844       MULADD(at[10], at[25]);       MULADD(at[11], at[24]);       MULADD(at[12], at[23]); 
845       COMBA_STORE(C->dp[22]);
846       /* 23 */
847       COMBA_FORWARD;
848       MULADD(at[11], at[25]);       MULADD(at[12], at[24]); 
849       COMBA_STORE(C->dp[23]);
850       /* 24 */
851       COMBA_FORWARD;
852       MULADD(at[12], at[25]); 
853       COMBA_STORE(C->dp[24]);
854       COMBA_STORE2(C->dp[25]);
855       C->used = 26;
856       C->sign = A->sign ^ B->sign;
857       fp_clamp(C);
858       COMBA_FINI;
859       break;
860
861    case 14:
862       memcpy(at, A->dp, 14 * sizeof(fp_digit));
863       memcpy(at+14, B->dp, 14 * sizeof(fp_digit));
864       COMBA_START;
865
866       COMBA_CLEAR;
867       /* 0 */
868       MULADD(at[0], at[14]); 
869       COMBA_STORE(C->dp[0]);
870       /* 1 */
871       COMBA_FORWARD;
872       MULADD(at[0], at[15]);       MULADD(at[1], at[14]); 
873       COMBA_STORE(C->dp[1]);
874       /* 2 */
875       COMBA_FORWARD;
876       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);       MULADD(at[2], at[14]); 
877       COMBA_STORE(C->dp[2]);
878       /* 3 */
879       COMBA_FORWARD;
880       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]);       MULADD(at[3], at[14]); 
881       COMBA_STORE(C->dp[3]);
882       /* 4 */
883       COMBA_FORWARD;
884       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]);       MULADD(at[4], at[14]); 
885       COMBA_STORE(C->dp[4]);
886       /* 5 */
887       COMBA_FORWARD;
888       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);       MULADD(at[4], at[15]);       MULADD(at[5], at[14]); 
889       COMBA_STORE(C->dp[5]);
890       /* 6 */
891       COMBA_FORWARD;
892       MULADD(at[0], at[20]);       MULADD(at[1], at[19]);       MULADD(at[2], at[18]);       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);       MULADD(at[5], at[15]);       MULADD(at[6], at[14]); 
893       COMBA_STORE(C->dp[6]);
894       /* 7 */
895       COMBA_FORWARD;
896       MULADD(at[0], at[21]);       MULADD(at[1], at[20]);       MULADD(at[2], at[19]);       MULADD(at[3], at[18]);       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);       MULADD(at[6], at[15]);       MULADD(at[7], at[14]); 
897       COMBA_STORE(C->dp[7]);
898       /* 8 */
899       COMBA_FORWARD;
900       MULADD(at[0], at[22]);       MULADD(at[1], at[21]);       MULADD(at[2], at[20]);       MULADD(at[3], at[19]);       MULADD(at[4], at[18]);       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]);       MULADD(at[8], at[14]); 
901       COMBA_STORE(C->dp[8]);
902       /* 9 */
903       COMBA_FORWARD;
904       MULADD(at[0], at[23]);       MULADD(at[1], at[22]);       MULADD(at[2], at[21]);       MULADD(at[3], at[20]);       MULADD(at[4], at[19]);       MULADD(at[5], at[18]);       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]);       MULADD(at[9], at[14]); 
905       COMBA_STORE(C->dp[9]);
906       /* 10 */
907       COMBA_FORWARD;
908       MULADD(at[0], at[24]);       MULADD(at[1], at[23]);       MULADD(at[2], at[22]);       MULADD(at[3], at[21]);       MULADD(at[4], at[20]);       MULADD(at[5], at[19]);       MULADD(at[6], at[18]);       MULADD(at[7], at[17]);       MULADD(at[8], at[16]);       MULADD(at[9], at[15]);       MULADD(at[10], at[14]); 
909       COMBA_STORE(C->dp[10]);
910       /* 11 */
911       COMBA_FORWARD;
912       MULADD(at[0], at[25]);       MULADD(at[1], at[24]);       MULADD(at[2], at[23]);       MULADD(at[3], at[22]);       MULADD(at[4], at[21]);       MULADD(at[5], at[20]);       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]);       MULADD(at[10], at[15]);       MULADD(at[11], at[14]); 
913       COMBA_STORE(C->dp[11]);
914       /* 12 */
915       COMBA_FORWARD;
916       MULADD(at[0], at[26]);       MULADD(at[1], at[25]);       MULADD(at[2], at[24]);       MULADD(at[3], at[23]);       MULADD(at[4], at[22]);       MULADD(at[5], at[21]);       MULADD(at[6], at[20]);       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]);       MULADD(at[10], at[16]);       MULADD(at[11], at[15]);       MULADD(at[12], at[14]); 
917       COMBA_STORE(C->dp[12]);
918       /* 13 */
919       COMBA_FORWARD;
920       MULADD(at[0], at[27]);       MULADD(at[1], at[26]);       MULADD(at[2], at[25]);       MULADD(at[3], at[24]);       MULADD(at[4], at[23]);       MULADD(at[5], at[22]);       MULADD(at[6], at[21]);       MULADD(at[7], at[20]);       MULADD(at[8], at[19]);       MULADD(at[9], at[18]);       MULADD(at[10], at[17]);       MULADD(at[11], at[16]);       MULADD(at[12], at[15]);       MULADD(at[13], at[14]); 
921       COMBA_STORE(C->dp[13]);
922       /* 14 */
923       COMBA_FORWARD;
924       MULADD(at[1], at[27]);       MULADD(at[2], at[26]);       MULADD(at[3], at[25]);       MULADD(at[4], at[24]);       MULADD(at[5], at[23]);       MULADD(at[6], at[22]);       MULADD(at[7], at[21]);       MULADD(at[8], at[20]);       MULADD(at[9], at[19]);       MULADD(at[10], at[18]);       MULADD(at[11], at[17]);       MULADD(at[12], at[16]);       MULADD(at[13], at[15]); 
925       COMBA_STORE(C->dp[14]);
926       /* 15 */
927       COMBA_FORWARD;
928       MULADD(at[2], at[27]);       MULADD(at[3], at[26]);       MULADD(at[4], at[25]);       MULADD(at[5], at[24]);       MULADD(at[6], at[23]);       MULADD(at[7], at[22]);       MULADD(at[8], at[21]);       MULADD(at[9], at[20]);       MULADD(at[10], at[19]);       MULADD(at[11], at[18]);       MULADD(at[12], at[17]);       MULADD(at[13], at[16]); 
929       COMBA_STORE(C->dp[15]);
930       /* 16 */
931       COMBA_FORWARD;
932       MULADD(at[3], at[27]);       MULADD(at[4], at[26]);       MULADD(at[5], at[25]);       MULADD(at[6], at[24]);       MULADD(at[7], at[23]);       MULADD(at[8], at[22]);       MULADD(at[9], at[21]);       MULADD(at[10], at[20]);       MULADD(at[11], at[19]);       MULADD(at[12], at[18]);       MULADD(at[13], at[17]); 
933       COMBA_STORE(C->dp[16]);
934       /* 17 */
935       COMBA_FORWARD;
936       MULADD(at[4], at[27]);       MULADD(at[5], at[26]);       MULADD(at[6], at[25]);       MULADD(at[7], at[24]);       MULADD(at[8], at[23]);       MULADD(at[9], at[22]);       MULADD(at[10], at[21]);       MULADD(at[11], at[20]);       MULADD(at[12], at[19]);       MULADD(at[13], at[18]); 
937       COMBA_STORE(C->dp[17]);
938       /* 18 */
939       COMBA_FORWARD;
940       MULADD(at[5], at[27]);       MULADD(at[6], at[26]);       MULADD(at[7], at[25]);       MULADD(at[8], at[24]);       MULADD(at[9], at[23]);       MULADD(at[10], at[22]);       MULADD(at[11], at[21]);       MULADD(at[12], at[20]);       MULADD(at[13], at[19]); 
941       COMBA_STORE(C->dp[18]);
942       /* 19 */
943       COMBA_FORWARD;
944       MULADD(at[6], at[27]);       MULADD(at[7], at[26]);       MULADD(at[8], at[25]);       MULADD(at[9], at[24]);       MULADD(at[10], at[23]);       MULADD(at[11], at[22]);       MULADD(at[12], at[21]);       MULADD(at[13], at[20]); 
945       COMBA_STORE(C->dp[19]);
946       /* 20 */
947       COMBA_FORWARD;
948       MULADD(at[7], at[27]);       MULADD(at[8], at[26]);       MULADD(at[9], at[25]);       MULADD(at[10], at[24]);       MULADD(at[11], at[23]);       MULADD(at[12], at[22]);       MULADD(at[13], at[21]); 
949       COMBA_STORE(C->dp[20]);
950       /* 21 */
951       COMBA_FORWARD;
952       MULADD(at[8], at[27]);       MULADD(at[9], at[26]);       MULADD(at[10], at[25]);       MULADD(at[11], at[24]);       MULADD(at[12], at[23]);       MULADD(at[13], at[22]); 
953       COMBA_STORE(C->dp[21]);
954       /* 22 */
955       COMBA_FORWARD;
956       MULADD(at[9], at[27]);       MULADD(at[10], at[26]);       MULADD(at[11], at[25]);       MULADD(at[12], at[24]);       MULADD(at[13], at[23]); 
957       COMBA_STORE(C->dp[22]);
958       /* 23 */
959       COMBA_FORWARD;
960       MULADD(at[10], at[27]);       MULADD(at[11], at[26]);       MULADD(at[12], at[25]);       MULADD(at[13], at[24]); 
961       COMBA_STORE(C->dp[23]);
962       /* 24 */
963       COMBA_FORWARD;
964       MULADD(at[11], at[27]);       MULADD(at[12], at[26]);       MULADD(at[13], at[25]); 
965       COMBA_STORE(C->dp[24]);
966       /* 25 */
967       COMBA_FORWARD;
968       MULADD(at[12], at[27]);       MULADD(at[13], at[26]); 
969       COMBA_STORE(C->dp[25]);
970       /* 26 */
971       COMBA_FORWARD;
972       MULADD(at[13], at[27]); 
973       COMBA_STORE(C->dp[26]);
974       COMBA_STORE2(C->dp[27]);
975       C->used = 28;
976       C->sign = A->sign ^ B->sign;
977       fp_clamp(C);
978       COMBA_FINI;
979       break;
980
981    case 15:
982       memcpy(at, A->dp, 15 * sizeof(fp_digit));
983       memcpy(at+15, B->dp, 15 * sizeof(fp_digit));
984       COMBA_START;
985
986       COMBA_CLEAR;
987       /* 0 */
988       MULADD(at[0], at[15]); 
989       COMBA_STORE(C->dp[0]);
990       /* 1 */
991       COMBA_FORWARD;
992       MULADD(at[0], at[16]);       MULADD(at[1], at[15]); 
993       COMBA_STORE(C->dp[1]);
994       /* 2 */
995       COMBA_FORWARD;
996       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]); 
997       COMBA_STORE(C->dp[2]);
998       /* 3 */
999       COMBA_FORWARD;
1000       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]); 
1001       COMBA_STORE(C->dp[3]);
1002       /* 4 */
1003       COMBA_FORWARD;
1004       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]);       MULADD(at[4], at[15]); 
1005       COMBA_STORE(C->dp[4]);
1006       /* 5 */
1007       COMBA_FORWARD;
1008       MULADD(at[0], at[20]);       MULADD(at[1], at[19]);       MULADD(at[2], at[18]);       MULADD(at[3], at[17]);       MULADD(at[4], at[16]);       MULADD(at[5], at[15]); 
1009       COMBA_STORE(C->dp[5]);
1010       /* 6 */
1011       COMBA_FORWARD;
1012       MULADD(at[0], at[21]);       MULADD(at[1], at[20]);       MULADD(at[2], at[19]);       MULADD(at[3], at[18]);       MULADD(at[4], at[17]);       MULADD(at[5], at[16]);       MULADD(at[6], at[15]); 
1013       COMBA_STORE(C->dp[6]);
1014       /* 7 */
1015       COMBA_FORWARD;
1016       MULADD(at[0], at[22]);       MULADD(at[1], at[21]);       MULADD(at[2], at[20]);       MULADD(at[3], at[19]);       MULADD(at[4], at[18]);       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]); 
1017       COMBA_STORE(C->dp[7]);
1018       /* 8 */
1019       COMBA_FORWARD;
1020       MULADD(at[0], at[23]);       MULADD(at[1], at[22]);       MULADD(at[2], at[21]);       MULADD(at[3], at[20]);       MULADD(at[4], at[19]);       MULADD(at[5], at[18]);       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]); 
1021       COMBA_STORE(C->dp[8]);
1022       /* 9 */
1023       COMBA_FORWARD;
1024       MULADD(at[0], at[24]);       MULADD(at[1], at[23]);       MULADD(at[2], at[22]);       MULADD(at[3], at[21]);       MULADD(at[4], at[20]);       MULADD(at[5], at[19]);       MULADD(at[6], at[18]);       MULADD(at[7], at[17]);       MULADD(at[8], at[16]);       MULADD(at[9], at[15]); 
1025       COMBA_STORE(C->dp[9]);
1026       /* 10 */
1027       COMBA_FORWARD;
1028       MULADD(at[0], at[25]);       MULADD(at[1], at[24]);       MULADD(at[2], at[23]);       MULADD(at[3], at[22]);       MULADD(at[4], at[21]);       MULADD(at[5], at[20]);       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]);       MULADD(at[10], at[15]); 
1029       COMBA_STORE(C->dp[10]);
1030       /* 11 */
1031       COMBA_FORWARD;
1032       MULADD(at[0], at[26]);       MULADD(at[1], at[25]);       MULADD(at[2], at[24]);       MULADD(at[3], at[23]);       MULADD(at[4], at[22]);       MULADD(at[5], at[21]);       MULADD(at[6], at[20]);       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]);       MULADD(at[10], at[16]);       MULADD(at[11], at[15]); 
1033       COMBA_STORE(C->dp[11]);
1034       /* 12 */
1035       COMBA_FORWARD;
1036       MULADD(at[0], at[27]);       MULADD(at[1], at[26]);       MULADD(at[2], at[25]);       MULADD(at[3], at[24]);       MULADD(at[4], at[23]);       MULADD(at[5], at[22]);       MULADD(at[6], at[21]);       MULADD(at[7], at[20]);       MULADD(at[8], at[19]);       MULADD(at[9], at[18]);       MULADD(at[10], at[17]);       MULADD(at[11], at[16]);       MULADD(at[12], at[15]); 
1037       COMBA_STORE(C->dp[12]);
1038       /* 13 */
1039       COMBA_FORWARD;
1040       MULADD(at[0], at[28]);       MULADD(at[1], at[27]);       MULADD(at[2], at[26]);       MULADD(at[3], at[25]);       MULADD(at[4], at[24]);       MULADD(at[5], at[23]);       MULADD(at[6], at[22]);       MULADD(at[7], at[21]);       MULADD(at[8], at[20]);       MULADD(at[9], at[19]);       MULADD(at[10], at[18]);       MULADD(at[11], at[17]);       MULADD(at[12], at[16]);       MULADD(at[13], at[15]); 
1041       COMBA_STORE(C->dp[13]);
1042       /* 14 */
1043       COMBA_FORWARD;
1044       MULADD(at[0], at[29]);       MULADD(at[1], at[28]);       MULADD(at[2], at[27]);       MULADD(at[3], at[26]);       MULADD(at[4], at[25]);       MULADD(at[5], at[24]);       MULADD(at[6], at[23]);       MULADD(at[7], at[22]);       MULADD(at[8], at[21]);       MULADD(at[9], at[20]);       MULADD(at[10], at[19]);       MULADD(at[11], at[18]);       MULADD(at[12], at[17]);       MULADD(at[13], at[16]);       MULADD(at[14], at[15]); 
1045       COMBA_STORE(C->dp[14]);
1046       /* 15 */
1047       COMBA_FORWARD;
1048       MULADD(at[1], at[29]);       MULADD(at[2], at[28]);       MULADD(at[3], at[27]);       MULADD(at[4], at[26]);       MULADD(at[5], at[25]);       MULADD(at[6], at[24]);       MULADD(at[7], at[23]);       MULADD(at[8], at[22]);       MULADD(at[9], at[21]);       MULADD(at[10], at[20]);       MULADD(at[11], at[19]);       MULADD(at[12], at[18]);       MULADD(at[13], at[17]);       MULADD(at[14], at[16]); 
1049       COMBA_STORE(C->dp[15]);
1050       /* 16 */
1051       COMBA_FORWARD;
1052       MULADD(at[2], at[29]);       MULADD(at[3], at[28]);       MULADD(at[4], at[27]);       MULADD(at[5], at[26]);       MULADD(at[6], at[25]);       MULADD(at[7], at[24]);       MULADD(at[8], at[23]);       MULADD(at[9], at[22]);       MULADD(at[10], at[21]);       MULADD(at[11], at[20]);       MULADD(at[12], at[19]);       MULADD(at[13], at[18]);       MULADD(at[14], at[17]); 
1053       COMBA_STORE(C->dp[16]);
1054       /* 17 */
1055       COMBA_FORWARD;
1056       MULADD(at[3], at[29]);       MULADD(at[4], at[28]);       MULADD(at[5], at[27]);       MULADD(at[6], at[26]);       MULADD(at[7], at[25]);       MULADD(at[8], at[24]);       MULADD(at[9], at[23]);       MULADD(at[10], at[22]);       MULADD(at[11], at[21]);       MULADD(at[12], at[20]);       MULADD(at[13], at[19]);       MULADD(at[14], at[18]); 
1057       COMBA_STORE(C->dp[17]);
1058       /* 18 */
1059       COMBA_FORWARD;
1060       MULADD(at[4], at[29]);       MULADD(at[5], at[28]);       MULADD(at[6], at[27]);       MULADD(at[7], at[26]);       MULADD(at[8], at[25]);       MULADD(at[9], at[24]);       MULADD(at[10], at[23]);       MULADD(at[11], at[22]);       MULADD(at[12], at[21]);       MULADD(at[13], at[20]);       MULADD(at[14], at[19]); 
1061       COMBA_STORE(C->dp[18]);
1062       /* 19 */
1063       COMBA_FORWARD;
1064       MULADD(at[5], at[29]);       MULADD(at[6], at[28]);       MULADD(at[7], at[27]);       MULADD(at[8], at[26]);       MULADD(at[9], at[25]);       MULADD(at[10], at[24]);       MULADD(at[11], at[23]);       MULADD(at[12], at[22]);       MULADD(at[13], at[21]);       MULADD(at[14], at[20]); 
1065       COMBA_STORE(C->dp[19]);
1066       /* 20 */
1067       COMBA_FORWARD;
1068       MULADD(at[6], at[29]);       MULADD(at[7], at[28]);       MULADD(at[8], at[27]);       MULADD(at[9], at[26]);       MULADD(at[10], at[25]);       MULADD(at[11], at[24]);       MULADD(at[12], at[23]);       MULADD(at[13], at[22]);       MULADD(at[14], at[21]); 
1069       COMBA_STORE(C->dp[20]);
1070       /* 21 */
1071       COMBA_FORWARD;
1072       MULADD(at[7], at[29]);       MULADD(at[8], at[28]);       MULADD(at[9], at[27]);       MULADD(at[10], at[26]);       MULADD(at[11], at[25]);       MULADD(at[12], at[24]);       MULADD(at[13], at[23]);       MULADD(at[14], at[22]); 
1073       COMBA_STORE(C->dp[21]);
1074       /* 22 */
1075       COMBA_FORWARD;
1076       MULADD(at[8], at[29]);       MULADD(at[9], at[28]);       MULADD(at[10], at[27]);       MULADD(at[11], at[26]);       MULADD(at[12], at[25]);       MULADD(at[13], at[24]);       MULADD(at[14], at[23]); 
1077       COMBA_STORE(C->dp[22]);
1078       /* 23 */
1079       COMBA_FORWARD;
1080       MULADD(at[9], at[29]);       MULADD(at[10], at[28]);       MULADD(at[11], at[27]);       MULADD(at[12], at[26]);       MULADD(at[13], at[25]);       MULADD(at[14], at[24]); 
1081       COMBA_STORE(C->dp[23]);
1082       /* 24 */
1083       COMBA_FORWARD;
1084       MULADD(at[10], at[29]);       MULADD(at[11], at[28]);       MULADD(at[12], at[27]);       MULADD(at[13], at[26]);       MULADD(at[14], at[25]); 
1085       COMBA_STORE(C->dp[24]);
1086       /* 25 */
1087       COMBA_FORWARD;
1088       MULADD(at[11], at[29]);       MULADD(at[12], at[28]);       MULADD(at[13], at[27]);       MULADD(at[14], at[26]); 
1089       COMBA_STORE(C->dp[25]);
1090       /* 26 */
1091       COMBA_FORWARD;
1092       MULADD(at[12], at[29]);       MULADD(at[13], at[28]);       MULADD(at[14], at[27]); 
1093       COMBA_STORE(C->dp[26]);
1094       /* 27 */
1095       COMBA_FORWARD;
1096       MULADD(at[13], at[29]);       MULADD(at[14], at[28]); 
1097       COMBA_STORE(C->dp[27]);
1098       /* 28 */
1099       COMBA_FORWARD;
1100       MULADD(at[14], at[29]); 
1101       COMBA_STORE(C->dp[28]);
1102       COMBA_STORE2(C->dp[29]);
1103       C->used = 30;
1104       C->sign = A->sign ^ B->sign;
1105       fp_clamp(C);
1106       COMBA_FINI;
1107       break;
1108
1109    case 16:
1110       memcpy(at, A->dp, 16 * sizeof(fp_digit));
1111       memcpy(at+16, B->dp, 16 * sizeof(fp_digit));
1112       COMBA_START;
1113
1114       COMBA_CLEAR;
1115       /* 0 */
1116       MULADD(at[0], at[16]); 
1117       COMBA_STORE(C->dp[0]);
1118       /* 1 */
1119       COMBA_FORWARD;
1120       MULADD(at[0], at[17]);       MULADD(at[1], at[16]); 
1121       COMBA_STORE(C->dp[1]);
1122       /* 2 */
1123       COMBA_FORWARD;
1124       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]); 
1125       COMBA_STORE(C->dp[2]);
1126       /* 3 */
1127       COMBA_FORWARD;
1128       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]); 
1129       COMBA_STORE(C->dp[3]);
1130       /* 4 */
1131       COMBA_FORWARD;
1132       MULADD(at[0], at[20]);       MULADD(at[1], at[19]);       MULADD(at[2], at[18]);       MULADD(at[3], at[17]);       MULADD(at[4], at[16]); 
1133       COMBA_STORE(C->dp[4]);
1134       /* 5 */
1135       COMBA_FORWARD;
1136       MULADD(at[0], at[21]);       MULADD(at[1], at[20]);       MULADD(at[2], at[19]);       MULADD(at[3], at[18]);       MULADD(at[4], at[17]);       MULADD(at[5], at[16]); 
1137       COMBA_STORE(C->dp[5]);
1138       /* 6 */
1139       COMBA_FORWARD;
1140       MULADD(at[0], at[22]);       MULADD(at[1], at[21]);       MULADD(at[2], at[20]);       MULADD(at[3], at[19]);       MULADD(at[4], at[18]);       MULADD(at[5], at[17]);       MULADD(at[6], at[16]); 
1141       COMBA_STORE(C->dp[6]);
1142       /* 7 */
1143       COMBA_FORWARD;
1144       MULADD(at[0], at[23]);       MULADD(at[1], at[22]);       MULADD(at[2], at[21]);       MULADD(at[3], at[20]);       MULADD(at[4], at[19]);       MULADD(at[5], at[18]);       MULADD(at[6], at[17]);       MULADD(at[7], at[16]); 
1145       COMBA_STORE(C->dp[7]);
1146       /* 8 */
1147       COMBA_FORWARD;
1148       MULADD(at[0], at[24]);       MULADD(at[1], at[23]);       MULADD(at[2], at[22]);       MULADD(at[3], at[21]);       MULADD(at[4], at[20]);       MULADD(at[5], at[19]);       MULADD(at[6], at[18]);       MULADD(at[7], at[17]);       MULADD(at[8], at[16]); 
1149       COMBA_STORE(C->dp[8]);
1150       /* 9 */
1151       COMBA_FORWARD;
1152       MULADD(at[0], at[25]);       MULADD(at[1], at[24]);       MULADD(at[2], at[23]);       MULADD(at[3], at[22]);       MULADD(at[4], at[21]);       MULADD(at[5], at[20]);       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]); 
1153       COMBA_STORE(C->dp[9]);
1154       /* 10 */
1155       COMBA_FORWARD;
1156       MULADD(at[0], at[26]);       MULADD(at[1], at[25]);       MULADD(at[2], at[24]);       MULADD(at[3], at[23]);       MULADD(at[4], at[22]);       MULADD(at[5], at[21]);       MULADD(at[6], at[20]);       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]);       MULADD(at[10], at[16]); 
1157       COMBA_STORE(C->dp[10]);
1158       /* 11 */
1159       COMBA_FORWARD;
1160       MULADD(at[0], at[27]);       MULADD(at[1], at[26]);       MULADD(at[2], at[25]);       MULADD(at[3], at[24]);       MULADD(at[4], at[23]);       MULADD(at[5], at[22]);       MULADD(at[6], at[21]);       MULADD(at[7], at[20]);       MULADD(at[8], at[19]);       MULADD(at[9], at[18]);       MULADD(at[10], at[17]);       MULADD(at[11], at[16]); 
1161       COMBA_STORE(C->dp[11]);
1162       /* 12 */
1163       COMBA_FORWARD;
1164       MULADD(at[0], at[28]);       MULADD(at[1], at[27]);       MULADD(at[2], at[26]);       MULADD(at[3], at[25]);       MULADD(at[4], at[24]);       MULADD(at[5], at[23]);       MULADD(at[6], at[22]);       MULADD(at[7], at[21]);       MULADD(at[8], at[20]);       MULADD(at[9], at[19]);       MULADD(at[10], at[18]);       MULADD(at[11], at[17]);       MULADD(at[12], at[16]); 
1165       COMBA_STORE(C->dp[12]);
1166       /* 13 */
1167       COMBA_FORWARD;
1168       MULADD(at[0], at[29]);       MULADD(at[1], at[28]);       MULADD(at[2], at[27]);       MULADD(at[3], at[26]);       MULADD(at[4], at[25]);       MULADD(at[5], at[24]);       MULADD(at[6], at[23]);       MULADD(at[7], at[22]);       MULADD(at[8], at[21]);       MULADD(at[9], at[20]);       MULADD(at[10], at[19]);       MULADD(at[11], at[18]);       MULADD(at[12], at[17]);       MULADD(at[13], at[16]); 
1169       COMBA_STORE(C->dp[13]);
1170       /* 14 */
1171       COMBA_FORWARD;
1172       MULADD(at[0], at[30]);       MULADD(at[1], at[29]);       MULADD(at[2], at[28]);       MULADD(at[3], at[27]);       MULADD(at[4], at[26]);       MULADD(at[5], at[25]);       MULADD(at[6], at[24]);       MULADD(at[7], at[23]);       MULADD(at[8], at[22]);       MULADD(at[9], at[21]);       MULADD(at[10], at[20]);       MULADD(at[11], at[19]);       MULADD(at[12], at[18]);       MULADD(at[13], at[17]);       MULADD(at[14], at[16]); 
1173       COMBA_STORE(C->dp[14]);
1174       /* 15 */
1175       COMBA_FORWARD;
1176       MULADD(at[0], at[31]);       MULADD(at[1], at[30]);       MULADD(at[2], at[29]);       MULADD(at[3], at[28]);       MULADD(at[4], at[27]);       MULADD(at[5], at[26]);       MULADD(at[6], at[25]);       MULADD(at[7], at[24]);       MULADD(at[8], at[23]);       MULADD(at[9], at[22]);       MULADD(at[10], at[21]);       MULADD(at[11], at[20]);       MULADD(at[12], at[19]);       MULADD(at[13], at[18]);       MULADD(at[14], at[17]);       MULADD(at[15], at[16]); 
1177       COMBA_STORE(C->dp[15]);
1178       /* 16 */
1179       COMBA_FORWARD;
1180       MULADD(at[1], at[31]);       MULADD(at[2], at[30]);       MULADD(at[3], at[29]);       MULADD(at[4], at[28]);       MULADD(at[5], at[27]);       MULADD(at[6], at[26]);       MULADD(at[7], at[25]);       MULADD(at[8], at[24]);       MULADD(at[9], at[23]);       MULADD(at[10], at[22]);       MULADD(at[11], at[21]);       MULADD(at[12], at[20]);       MULADD(at[13], at[19]);       MULADD(at[14], at[18]);       MULADD(at[15], at[17]); 
1181       COMBA_STORE(C->dp[16]);
1182       /* 17 */
1183       COMBA_FORWARD;
1184       MULADD(at[2], at[31]);       MULADD(at[3], at[30]);       MULADD(at[4], at[29]);       MULADD(at[5], at[28]);       MULADD(at[6], at[27]);       MULADD(at[7], at[26]);       MULADD(at[8], at[25]);       MULADD(at[9], at[24]);       MULADD(at[10], at[23]);       MULADD(at[11], at[22]);       MULADD(at[12], at[21]);       MULADD(at[13], at[20]);       MULADD(at[14], at[19]);       MULADD(at[15], at[18]); 
1185       COMBA_STORE(C->dp[17]);
1186       /* 18 */
1187       COMBA_FORWARD;
1188       MULADD(at[3], at[31]);       MULADD(at[4], at[30]);       MULADD(at[5], at[29]);       MULADD(at[6], at[28]);       MULADD(at[7], at[27]);       MULADD(at[8], at[26]);       MULADD(at[9], at[25]);       MULADD(at[10], at[24]);       MULADD(at[11], at[23]);       MULADD(at[12], at[22]);       MULADD(at[13], at[21]);       MULADD(at[14], at[20]);       MULADD(at[15], at[19]); 
1189       COMBA_STORE(C->dp[18]);
1190       /* 19 */
1191       COMBA_FORWARD;
1192       MULADD(at[4], at[31]);       MULADD(at[5], at[30]);       MULADD(at[6], at[29]);       MULADD(at[7], at[28]);       MULADD(at[8], at[27]);       MULADD(at[9], at[26]);       MULADD(at[10], at[25]);       MULADD(at[11], at[24]);       MULADD(at[12], at[23]);       MULADD(at[13], at[22]);       MULADD(at[14], at[21]);       MULADD(at[15], at[20]); 
1193       COMBA_STORE(C->dp[19]);
1194       /* 20 */
1195       COMBA_FORWARD;
1196       MULADD(at[5], at[31]);       MULADD(at[6], at[30]);       MULADD(at[7], at[29]);       MULADD(at[8], at[28]);       MULADD(at[9], at[27]);       MULADD(at[10], at[26]);       MULADD(at[11], at[25]);       MULADD(at[12], at[24]);       MULADD(at[13], at[23]);       MULADD(at[14], at[22]);       MULADD(at[15], at[21]); 
1197       COMBA_STORE(C->dp[20]);
1198       /* 21 */
1199       COMBA_FORWARD;
1200       MULADD(at[6], at[31]);       MULADD(at[7], at[30]);       MULADD(at[8], at[29]);       MULADD(at[9], at[28]);       MULADD(at[10], at[27]);       MULADD(at[11], at[26]);       MULADD(at[12], at[25]);       MULADD(at[13], at[24]);       MULADD(at[14], at[23]);       MULADD(at[15], at[22]); 
1201       COMBA_STORE(C->dp[21]);
1202       /* 22 */
1203       COMBA_FORWARD;
1204       MULADD(at[7], at[31]);       MULADD(at[8], at[30]);       MULADD(at[9], at[29]);       MULADD(at[10], at[28]);       MULADD(at[11], at[27]);       MULADD(at[12], at[26]);       MULADD(at[13], at[25]);       MULADD(at[14], at[24]);       MULADD(at[15], at[23]); 
1205       COMBA_STORE(C->dp[22]);
1206       /* 23 */
1207       COMBA_FORWARD;
1208       MULADD(at[8], at[31]);       MULADD(at[9], at[30]);       MULADD(at[10], at[29]);       MULADD(at[11], at[28]);       MULADD(at[12], at[27]);       MULADD(at[13], at[26]);       MULADD(at[14], at[25]);       MULADD(at[15], at[24]); 
1209       COMBA_STORE(C->dp[23]);
1210       /* 24 */
1211       COMBA_FORWARD;
1212       MULADD(at[9], at[31]);       MULADD(at[10], at[30]);       MULADD(at[11], at[29]);       MULADD(at[12], at[28]);       MULADD(at[13], at[27]);       MULADD(at[14], at[26]);       MULADD(at[15], at[25]); 
1213       COMBA_STORE(C->dp[24]);
1214       /* 25 */
1215       COMBA_FORWARD;
1216       MULADD(at[10], at[31]);       MULADD(at[11], at[30]);       MULADD(at[12], at[29]);       MULADD(at[13], at[28]);       MULADD(at[14], at[27]);       MULADD(at[15], at[26]); 
1217       COMBA_STORE(C->dp[25]);
1218       /* 26 */
1219       COMBA_FORWARD;
1220       MULADD(at[11], at[31]);       MULADD(at[12], at[30]);       MULADD(at[13], at[29]);       MULADD(at[14], at[28]);       MULADD(at[15], at[27]); 
1221       COMBA_STORE(C->dp[26]);
1222       /* 27 */
1223       COMBA_FORWARD;
1224       MULADD(at[12], at[31]);       MULADD(at[13], at[30]);       MULADD(at[14], at[29]);       MULADD(at[15], at[28]); 
1225       COMBA_STORE(C->dp[27]);
1226       /* 28 */
1227       COMBA_FORWARD;
1228       MULADD(at[13], at[31]);       MULADD(at[14], at[30]);       MULADD(at[15], at[29]); 
1229       COMBA_STORE(C->dp[28]);
1230       /* 29 */
1231       COMBA_FORWARD;
1232       MULADD(at[14], at[31]);       MULADD(at[15], at[30]); 
1233       COMBA_STORE(C->dp[29]);
1234       /* 30 */
1235       COMBA_FORWARD;
1236       MULADD(at[15], at[31]); 
1237       COMBA_STORE(C->dp[30]);
1238       COMBA_STORE2(C->dp[31]);
1239       C->used = 32;
1240       C->sign = A->sign ^ B->sign;
1241       fp_clamp(C);
1242       COMBA_FINI;
1243       break;
1244
1245    default:
1246       break;
1247    }
1248 }
1249
1250 #endif