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