ARM Shanghai IoT Team (Internal) / newMiniTLS-GPL

Fork of MiniTLS-GPL by Donatien Garnier

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers fp_mul_comba_small_set.c Source File

fp_mul_comba_small_set.c

00001 #define TFM_DEFINES
00002 #include "fp_mul_comba.c"
00003 
00004 #if defined(TFM_SMALL_SET)
00005 void fp_mul_comba_small(fp_int *A, fp_int *B, fp_int *C)
00006 {
00007    fp_digit c0, c1, c2, at[32];
00008    switch (MAX(A->used, B->used)) { 
00009 
00010    case 1:
00011       memcpy(at, A->dp, 1 * sizeof(fp_digit));
00012       memcpy(at+1, B->dp, 1 * sizeof(fp_digit));
00013       COMBA_START;
00014 
00015       COMBA_CLEAR;
00016       /* 0 */
00017       MULADD(at[0], at[1]); 
00018       COMBA_STORE(C->dp[0]);
00019       COMBA_STORE2(C->dp[1]);
00020       C->used = 2;
00021       C->sign = A->sign ^ B->sign;
00022       fp_clamp(C);
00023       COMBA_FINI;
00024       break;
00025 
00026    case 2:
00027       memcpy(at, A->dp, 2 * sizeof(fp_digit));
00028       memcpy(at+2, B->dp, 2 * sizeof(fp_digit));
00029       COMBA_START;
00030 
00031       COMBA_CLEAR;
00032       /* 0 */
00033       MULADD(at[0], at[2]); 
00034       COMBA_STORE(C->dp[0]);
00035       /* 1 */
00036       COMBA_FORWARD;
00037       MULADD(at[0], at[3]);       MULADD(at[1], at[2]); 
00038       COMBA_STORE(C->dp[1]);
00039       /* 2 */
00040       COMBA_FORWARD;
00041       MULADD(at[1], at[3]); 
00042       COMBA_STORE(C->dp[2]);
00043       COMBA_STORE2(C->dp[3]);
00044       C->used = 4;
00045       C->sign = A->sign ^ B->sign;
00046       fp_clamp(C);
00047       COMBA_FINI;
00048       break;
00049 
00050    case 3:
00051       memcpy(at, A->dp, 3 * sizeof(fp_digit));
00052       memcpy(at+3, B->dp, 3 * sizeof(fp_digit));
00053       COMBA_START;
00054 
00055       COMBA_CLEAR;
00056       /* 0 */
00057       MULADD(at[0], at[3]); 
00058       COMBA_STORE(C->dp[0]);
00059       /* 1 */
00060       COMBA_FORWARD;
00061       MULADD(at[0], at[4]);       MULADD(at[1], at[3]); 
00062       COMBA_STORE(C->dp[1]);
00063       /* 2 */
00064       COMBA_FORWARD;
00065       MULADD(at[0], at[5]);       MULADD(at[1], at[4]);       MULADD(at[2], at[3]); 
00066       COMBA_STORE(C->dp[2]);
00067       /* 3 */
00068       COMBA_FORWARD;
00069       MULADD(at[1], at[5]);       MULADD(at[2], at[4]); 
00070       COMBA_STORE(C->dp[3]);
00071       /* 4 */
00072       COMBA_FORWARD;
00073       MULADD(at[2], at[5]); 
00074       COMBA_STORE(C->dp[4]);
00075       COMBA_STORE2(C->dp[5]);
00076       C->used = 6;
00077       C->sign = A->sign ^ B->sign;
00078       fp_clamp(C);
00079       COMBA_FINI;
00080       break;
00081 
00082    case 4:
00083       memcpy(at, A->dp, 4 * sizeof(fp_digit));
00084       memcpy(at+4, B->dp, 4 * sizeof(fp_digit));
00085       COMBA_START;
00086 
00087       COMBA_CLEAR;
00088       /* 0 */
00089       MULADD(at[0], at[4]); 
00090       COMBA_STORE(C->dp[0]);
00091       /* 1 */
00092       COMBA_FORWARD;
00093       MULADD(at[0], at[5]);       MULADD(at[1], at[4]); 
00094       COMBA_STORE(C->dp[1]);
00095       /* 2 */
00096       COMBA_FORWARD;
00097       MULADD(at[0], at[6]);       MULADD(at[1], at[5]);       MULADD(at[2], at[4]); 
00098       COMBA_STORE(C->dp[2]);
00099       /* 3 */
00100       COMBA_FORWARD;
00101       MULADD(at[0], at[7]);       MULADD(at[1], at[6]);       MULADD(at[2], at[5]);       MULADD(at[3], at[4]); 
00102       COMBA_STORE(C->dp[3]);
00103       /* 4 */
00104       COMBA_FORWARD;
00105       MULADD(at[1], at[7]);       MULADD(at[2], at[6]);       MULADD(at[3], at[5]); 
00106       COMBA_STORE(C->dp[4]);
00107       /* 5 */
00108       COMBA_FORWARD;
00109       MULADD(at[2], at[7]);       MULADD(at[3], at[6]); 
00110       COMBA_STORE(C->dp[5]);
00111       /* 6 */
00112       COMBA_FORWARD;
00113       MULADD(at[3], at[7]); 
00114       COMBA_STORE(C->dp[6]);
00115       COMBA_STORE2(C->dp[7]);
00116       C->used = 8;
00117       C->sign = A->sign ^ B->sign;
00118       fp_clamp(C);
00119       COMBA_FINI;
00120       break;
00121 
00122    case 5:
00123       memcpy(at, A->dp, 5 * sizeof(fp_digit));
00124       memcpy(at+5, B->dp, 5 * sizeof(fp_digit));
00125       COMBA_START;
00126 
00127       COMBA_CLEAR;
00128       /* 0 */
00129       MULADD(at[0], at[5]); 
00130       COMBA_STORE(C->dp[0]);
00131       /* 1 */
00132       COMBA_FORWARD;
00133       MULADD(at[0], at[6]);       MULADD(at[1], at[5]); 
00134       COMBA_STORE(C->dp[1]);
00135       /* 2 */
00136       COMBA_FORWARD;
00137       MULADD(at[0], at[7]);       MULADD(at[1], at[6]);       MULADD(at[2], at[5]); 
00138       COMBA_STORE(C->dp[2]);
00139       /* 3 */
00140       COMBA_FORWARD;
00141       MULADD(at[0], at[8]);       MULADD(at[1], at[7]);       MULADD(at[2], at[6]);       MULADD(at[3], at[5]); 
00142       COMBA_STORE(C->dp[3]);
00143       /* 4 */
00144       COMBA_FORWARD;
00145       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]); 
00146       COMBA_STORE(C->dp[4]);
00147       /* 5 */
00148       COMBA_FORWARD;
00149       MULADD(at[1], at[9]);       MULADD(at[2], at[8]);       MULADD(at[3], at[7]);       MULADD(at[4], at[6]); 
00150       COMBA_STORE(C->dp[5]);
00151       /* 6 */
00152       COMBA_FORWARD;
00153       MULADD(at[2], at[9]);       MULADD(at[3], at[8]);       MULADD(at[4], at[7]); 
00154       COMBA_STORE(C->dp[6]);
00155       /* 7 */
00156       COMBA_FORWARD;
00157       MULADD(at[3], at[9]);       MULADD(at[4], at[8]); 
00158       COMBA_STORE(C->dp[7]);
00159       /* 8 */
00160       COMBA_FORWARD;
00161       MULADD(at[4], at[9]); 
00162       COMBA_STORE(C->dp[8]);
00163       COMBA_STORE2(C->dp[9]);
00164       C->used = 10;
00165       C->sign = A->sign ^ B->sign;
00166       fp_clamp(C);
00167       COMBA_FINI;
00168       break;
00169 
00170    case 6:
00171       memcpy(at, A->dp, 6 * sizeof(fp_digit));
00172       memcpy(at+6, B->dp, 6 * sizeof(fp_digit));
00173       COMBA_START;
00174 
00175       COMBA_CLEAR;
00176       /* 0 */
00177       MULADD(at[0], at[6]); 
00178       COMBA_STORE(C->dp[0]);
00179       /* 1 */
00180       COMBA_FORWARD;
00181       MULADD(at[0], at[7]);       MULADD(at[1], at[6]); 
00182       COMBA_STORE(C->dp[1]);
00183       /* 2 */
00184       COMBA_FORWARD;
00185       MULADD(at[0], at[8]);       MULADD(at[1], at[7]);       MULADD(at[2], at[6]); 
00186       COMBA_STORE(C->dp[2]);
00187       /* 3 */
00188       COMBA_FORWARD;
00189       MULADD(at[0], at[9]);       MULADD(at[1], at[8]);       MULADD(at[2], at[7]);       MULADD(at[3], at[6]); 
00190       COMBA_STORE(C->dp[3]);
00191       /* 4 */
00192       COMBA_FORWARD;
00193       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]); 
00194       COMBA_STORE(C->dp[4]);
00195       /* 5 */
00196       COMBA_FORWARD;
00197       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]); 
00198       COMBA_STORE(C->dp[5]);
00199       /* 6 */
00200       COMBA_FORWARD;
00201       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]); 
00202       COMBA_STORE(C->dp[6]);
00203       /* 7 */
00204       COMBA_FORWARD;
00205       MULADD(at[2], at[11]);       MULADD(at[3], at[10]);       MULADD(at[4], at[9]);       MULADD(at[5], at[8]); 
00206       COMBA_STORE(C->dp[7]);
00207       /* 8 */
00208       COMBA_FORWARD;
00209       MULADD(at[3], at[11]);       MULADD(at[4], at[10]);       MULADD(at[5], at[9]); 
00210       COMBA_STORE(C->dp[8]);
00211       /* 9 */
00212       COMBA_FORWARD;
00213       MULADD(at[4], at[11]);       MULADD(at[5], at[10]); 
00214       COMBA_STORE(C->dp[9]);
00215       /* 10 */
00216       COMBA_FORWARD;
00217       MULADD(at[5], at[11]); 
00218       COMBA_STORE(C->dp[10]);
00219       COMBA_STORE2(C->dp[11]);
00220       C->used = 12;
00221       C->sign = A->sign ^ B->sign;
00222       fp_clamp(C);
00223       COMBA_FINI;
00224       break;
00225 
00226    case 7:
00227       memcpy(at, A->dp, 7 * sizeof(fp_digit));
00228       memcpy(at+7, B->dp, 7 * sizeof(fp_digit));
00229       COMBA_START;
00230 
00231       COMBA_CLEAR;
00232       /* 0 */
00233       MULADD(at[0], at[7]); 
00234       COMBA_STORE(C->dp[0]);
00235       /* 1 */
00236       COMBA_FORWARD;
00237       MULADD(at[0], at[8]);       MULADD(at[1], at[7]); 
00238       COMBA_STORE(C->dp[1]);
00239       /* 2 */
00240       COMBA_FORWARD;
00241       MULADD(at[0], at[9]);       MULADD(at[1], at[8]);       MULADD(at[2], at[7]); 
00242       COMBA_STORE(C->dp[2]);
00243       /* 3 */
00244       COMBA_FORWARD;
00245       MULADD(at[0], at[10]);       MULADD(at[1], at[9]);       MULADD(at[2], at[8]);       MULADD(at[3], at[7]); 
00246       COMBA_STORE(C->dp[3]);
00247       /* 4 */
00248       COMBA_FORWARD;
00249       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]); 
00250       COMBA_STORE(C->dp[4]);
00251       /* 5 */
00252       COMBA_FORWARD;
00253       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]); 
00254       COMBA_STORE(C->dp[5]);
00255       /* 6 */
00256       COMBA_FORWARD;
00257       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]); 
00258       COMBA_STORE(C->dp[6]);
00259       /* 7 */
00260       COMBA_FORWARD;
00261       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]); 
00262       COMBA_STORE(C->dp[7]);
00263       /* 8 */
00264       COMBA_FORWARD;
00265       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]); 
00266       COMBA_STORE(C->dp[8]);
00267       /* 9 */
00268       COMBA_FORWARD;
00269       MULADD(at[3], at[13]);       MULADD(at[4], at[12]);       MULADD(at[5], at[11]);       MULADD(at[6], at[10]); 
00270       COMBA_STORE(C->dp[9]);
00271       /* 10 */
00272       COMBA_FORWARD;
00273       MULADD(at[4], at[13]);       MULADD(at[5], at[12]);       MULADD(at[6], at[11]); 
00274       COMBA_STORE(C->dp[10]);
00275       /* 11 */
00276       COMBA_FORWARD;
00277       MULADD(at[5], at[13]);       MULADD(at[6], at[12]); 
00278       COMBA_STORE(C->dp[11]);
00279       /* 12 */
00280       COMBA_FORWARD;
00281       MULADD(at[6], at[13]); 
00282       COMBA_STORE(C->dp[12]);
00283       COMBA_STORE2(C->dp[13]);
00284       C->used = 14;
00285       C->sign = A->sign ^ B->sign;
00286       fp_clamp(C);
00287       COMBA_FINI;
00288       break;
00289 
00290    case 8:
00291       memcpy(at, A->dp, 8 * sizeof(fp_digit));
00292       memcpy(at+8, B->dp, 8 * sizeof(fp_digit));
00293       COMBA_START;
00294 
00295       COMBA_CLEAR;
00296       /* 0 */
00297       MULADD(at[0], at[8]); 
00298       COMBA_STORE(C->dp[0]);
00299       /* 1 */
00300       COMBA_FORWARD;
00301       MULADD(at[0], at[9]);       MULADD(at[1], at[8]); 
00302       COMBA_STORE(C->dp[1]);
00303       /* 2 */
00304       COMBA_FORWARD;
00305       MULADD(at[0], at[10]);       MULADD(at[1], at[9]);       MULADD(at[2], at[8]); 
00306       COMBA_STORE(C->dp[2]);
00307       /* 3 */
00308       COMBA_FORWARD;
00309       MULADD(at[0], at[11]);       MULADD(at[1], at[10]);       MULADD(at[2], at[9]);       MULADD(at[3], at[8]); 
00310       COMBA_STORE(C->dp[3]);
00311       /* 4 */
00312       COMBA_FORWARD;
00313       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]); 
00314       COMBA_STORE(C->dp[4]);
00315       /* 5 */
00316       COMBA_FORWARD;
00317       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]); 
00318       COMBA_STORE(C->dp[5]);
00319       /* 6 */
00320       COMBA_FORWARD;
00321       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]); 
00322       COMBA_STORE(C->dp[6]);
00323       /* 7 */
00324       COMBA_FORWARD;
00325       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]); 
00326       COMBA_STORE(C->dp[7]);
00327       /* 8 */
00328       COMBA_FORWARD;
00329       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]); 
00330       COMBA_STORE(C->dp[8]);
00331       /* 9 */
00332       COMBA_FORWARD;
00333       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]); 
00334       COMBA_STORE(C->dp[9]);
00335       /* 10 */
00336       COMBA_FORWARD;
00337       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]); 
00338       COMBA_STORE(C->dp[10]);
00339       /* 11 */
00340       COMBA_FORWARD;
00341       MULADD(at[4], at[15]);       MULADD(at[5], at[14]);       MULADD(at[6], at[13]);       MULADD(at[7], at[12]); 
00342       COMBA_STORE(C->dp[11]);
00343       /* 12 */
00344       COMBA_FORWARD;
00345       MULADD(at[5], at[15]);       MULADD(at[6], at[14]);       MULADD(at[7], at[13]); 
00346       COMBA_STORE(C->dp[12]);
00347       /* 13 */
00348       COMBA_FORWARD;
00349       MULADD(at[6], at[15]);       MULADD(at[7], at[14]); 
00350       COMBA_STORE(C->dp[13]);
00351       /* 14 */
00352       COMBA_FORWARD;
00353       MULADD(at[7], at[15]); 
00354       COMBA_STORE(C->dp[14]);
00355       COMBA_STORE2(C->dp[15]);
00356       C->used = 16;
00357       C->sign = A->sign ^ B->sign;
00358       fp_clamp(C);
00359       COMBA_FINI;
00360       break;
00361 
00362    case 9:
00363       memcpy(at, A->dp, 9 * sizeof(fp_digit));
00364       memcpy(at+9, B->dp, 9 * sizeof(fp_digit));
00365       COMBA_START;
00366 
00367       COMBA_CLEAR;
00368       /* 0 */
00369       MULADD(at[0], at[9]); 
00370       COMBA_STORE(C->dp[0]);
00371       /* 1 */
00372       COMBA_FORWARD;
00373       MULADD(at[0], at[10]);       MULADD(at[1], at[9]); 
00374       COMBA_STORE(C->dp[1]);
00375       /* 2 */
00376       COMBA_FORWARD;
00377       MULADD(at[0], at[11]);       MULADD(at[1], at[10]);       MULADD(at[2], at[9]); 
00378       COMBA_STORE(C->dp[2]);
00379       /* 3 */
00380       COMBA_FORWARD;
00381       MULADD(at[0], at[12]);       MULADD(at[1], at[11]);       MULADD(at[2], at[10]);       MULADD(at[3], at[9]); 
00382       COMBA_STORE(C->dp[3]);
00383       /* 4 */
00384       COMBA_FORWARD;
00385       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]); 
00386       COMBA_STORE(C->dp[4]);
00387       /* 5 */
00388       COMBA_FORWARD;
00389       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]); 
00390       COMBA_STORE(C->dp[5]);
00391       /* 6 */
00392       COMBA_FORWARD;
00393       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]); 
00394       COMBA_STORE(C->dp[6]);
00395       /* 7 */
00396       COMBA_FORWARD;
00397       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]); 
00398       COMBA_STORE(C->dp[7]);
00399       /* 8 */
00400       COMBA_FORWARD;
00401       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]); 
00402       COMBA_STORE(C->dp[8]);
00403       /* 9 */
00404       COMBA_FORWARD;
00405       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]); 
00406       COMBA_STORE(C->dp[9]);
00407       /* 10 */
00408       COMBA_FORWARD;
00409       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]); 
00410       COMBA_STORE(C->dp[10]);
00411       /* 11 */
00412       COMBA_FORWARD;
00413       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]); 
00414       COMBA_STORE(C->dp[11]);
00415       /* 12 */
00416       COMBA_FORWARD;
00417       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]); 
00418       COMBA_STORE(C->dp[12]);
00419       /* 13 */
00420       COMBA_FORWARD;
00421       MULADD(at[5], at[17]);       MULADD(at[6], at[16]);       MULADD(at[7], at[15]);       MULADD(at[8], at[14]); 
00422       COMBA_STORE(C->dp[13]);
00423       /* 14 */
00424       COMBA_FORWARD;
00425       MULADD(at[6], at[17]);       MULADD(at[7], at[16]);       MULADD(at[8], at[15]); 
00426       COMBA_STORE(C->dp[14]);
00427       /* 15 */
00428       COMBA_FORWARD;
00429       MULADD(at[7], at[17]);       MULADD(at[8], at[16]); 
00430       COMBA_STORE(C->dp[15]);
00431       /* 16 */
00432       COMBA_FORWARD;
00433       MULADD(at[8], at[17]); 
00434       COMBA_STORE(C->dp[16]);
00435       COMBA_STORE2(C->dp[17]);
00436       C->used = 18;
00437       C->sign = A->sign ^ B->sign;
00438       fp_clamp(C);
00439       COMBA_FINI;
00440       break;
00441 
00442    case 10:
00443       memcpy(at, A->dp, 10 * sizeof(fp_digit));
00444       memcpy(at+10, B->dp, 10 * sizeof(fp_digit));
00445       COMBA_START;
00446 
00447       COMBA_CLEAR;
00448       /* 0 */
00449       MULADD(at[0], at[10]); 
00450       COMBA_STORE(C->dp[0]);
00451       /* 1 */
00452       COMBA_FORWARD;
00453       MULADD(at[0], at[11]);       MULADD(at[1], at[10]); 
00454       COMBA_STORE(C->dp[1]);
00455       /* 2 */
00456       COMBA_FORWARD;
00457       MULADD(at[0], at[12]);       MULADD(at[1], at[11]);       MULADD(at[2], at[10]); 
00458       COMBA_STORE(C->dp[2]);
00459       /* 3 */
00460       COMBA_FORWARD;
00461       MULADD(at[0], at[13]);       MULADD(at[1], at[12]);       MULADD(at[2], at[11]);       MULADD(at[3], at[10]); 
00462       COMBA_STORE(C->dp[3]);
00463       /* 4 */
00464       COMBA_FORWARD;
00465       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]); 
00466       COMBA_STORE(C->dp[4]);
00467       /* 5 */
00468       COMBA_FORWARD;
00469       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]); 
00470       COMBA_STORE(C->dp[5]);
00471       /* 6 */
00472       COMBA_FORWARD;
00473       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]); 
00474       COMBA_STORE(C->dp[6]);
00475       /* 7 */
00476       COMBA_FORWARD;
00477       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]); 
00478       COMBA_STORE(C->dp[7]);
00479       /* 8 */
00480       COMBA_FORWARD;
00481       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]); 
00482       COMBA_STORE(C->dp[8]);
00483       /* 9 */
00484       COMBA_FORWARD;
00485       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]); 
00486       COMBA_STORE(C->dp[9]);
00487       /* 10 */
00488       COMBA_FORWARD;
00489       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]); 
00490       COMBA_STORE(C->dp[10]);
00491       /* 11 */
00492       COMBA_FORWARD;
00493       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]); 
00494       COMBA_STORE(C->dp[11]);
00495       /* 12 */
00496       COMBA_FORWARD;
00497       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]); 
00498       COMBA_STORE(C->dp[12]);
00499       /* 13 */
00500       COMBA_FORWARD;
00501       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]); 
00502       COMBA_STORE(C->dp[13]);
00503       /* 14 */
00504       COMBA_FORWARD;
00505       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]); 
00506       COMBA_STORE(C->dp[14]);
00507       /* 15 */
00508       COMBA_FORWARD;
00509       MULADD(at[6], at[19]);       MULADD(at[7], at[18]);       MULADD(at[8], at[17]);       MULADD(at[9], at[16]); 
00510       COMBA_STORE(C->dp[15]);
00511       /* 16 */
00512       COMBA_FORWARD;
00513       MULADD(at[7], at[19]);       MULADD(at[8], at[18]);       MULADD(at[9], at[17]); 
00514       COMBA_STORE(C->dp[16]);
00515       /* 17 */
00516       COMBA_FORWARD;
00517       MULADD(at[8], at[19]);       MULADD(at[9], at[18]); 
00518       COMBA_STORE(C->dp[17]);
00519       /* 18 */
00520       COMBA_FORWARD;
00521       MULADD(at[9], at[19]); 
00522       COMBA_STORE(C->dp[18]);
00523       COMBA_STORE2(C->dp[19]);
00524       C->used = 20;
00525       C->sign = A->sign ^ B->sign;
00526       fp_clamp(C);
00527       COMBA_FINI;
00528       break;
00529 
00530    case 11:
00531       memcpy(at, A->dp, 11 * sizeof(fp_digit));
00532       memcpy(at+11, B->dp, 11 * sizeof(fp_digit));
00533       COMBA_START;
00534 
00535       COMBA_CLEAR;
00536       /* 0 */
00537       MULADD(at[0], at[11]); 
00538       COMBA_STORE(C->dp[0]);
00539       /* 1 */
00540       COMBA_FORWARD;
00541       MULADD(at[0], at[12]);       MULADD(at[1], at[11]); 
00542       COMBA_STORE(C->dp[1]);
00543       /* 2 */
00544       COMBA_FORWARD;
00545       MULADD(at[0], at[13]);       MULADD(at[1], at[12]);       MULADD(at[2], at[11]); 
00546       COMBA_STORE(C->dp[2]);
00547       /* 3 */
00548       COMBA_FORWARD;
00549       MULADD(at[0], at[14]);       MULADD(at[1], at[13]);       MULADD(at[2], at[12]);       MULADD(at[3], at[11]); 
00550       COMBA_STORE(C->dp[3]);
00551       /* 4 */
00552       COMBA_FORWARD;
00553       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]); 
00554       COMBA_STORE(C->dp[4]);
00555       /* 5 */
00556       COMBA_FORWARD;
00557       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]); 
00558       COMBA_STORE(C->dp[5]);
00559       /* 6 */
00560       COMBA_FORWARD;
00561       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]); 
00562       COMBA_STORE(C->dp[6]);
00563       /* 7 */
00564       COMBA_FORWARD;
00565       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]); 
00566       COMBA_STORE(C->dp[7]);
00567       /* 8 */
00568       COMBA_FORWARD;
00569       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]); 
00570       COMBA_STORE(C->dp[8]);
00571       /* 9 */
00572       COMBA_FORWARD;
00573       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]); 
00574       COMBA_STORE(C->dp[9]);
00575       /* 10 */
00576       COMBA_FORWARD;
00577       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]); 
00578       COMBA_STORE(C->dp[10]);
00579       /* 11 */
00580       COMBA_FORWARD;
00581       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]); 
00582       COMBA_STORE(C->dp[11]);
00583       /* 12 */
00584       COMBA_FORWARD;
00585       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]); 
00586       COMBA_STORE(C->dp[12]);
00587       /* 13 */
00588       COMBA_FORWARD;
00589       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]); 
00590       COMBA_STORE(C->dp[13]);
00591       /* 14 */
00592       COMBA_FORWARD;
00593       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]); 
00594       COMBA_STORE(C->dp[14]);
00595       /* 15 */
00596       COMBA_FORWARD;
00597       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]); 
00598       COMBA_STORE(C->dp[15]);
00599       /* 16 */
00600       COMBA_FORWARD;
00601       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]); 
00602       COMBA_STORE(C->dp[16]);
00603       /* 17 */
00604       COMBA_FORWARD;
00605       MULADD(at[7], at[21]);       MULADD(at[8], at[20]);       MULADD(at[9], at[19]);       MULADD(at[10], at[18]); 
00606       COMBA_STORE(C->dp[17]);
00607       /* 18 */
00608       COMBA_FORWARD;
00609       MULADD(at[8], at[21]);       MULADD(at[9], at[20]);       MULADD(at[10], at[19]); 
00610       COMBA_STORE(C->dp[18]);
00611       /* 19 */
00612       COMBA_FORWARD;
00613       MULADD(at[9], at[21]);       MULADD(at[10], at[20]); 
00614       COMBA_STORE(C->dp[19]);
00615       /* 20 */
00616       COMBA_FORWARD;
00617       MULADD(at[10], at[21]); 
00618       COMBA_STORE(C->dp[20]);
00619       COMBA_STORE2(C->dp[21]);
00620       C->used = 22;
00621       C->sign = A->sign ^ B->sign;
00622       fp_clamp(C);
00623       COMBA_FINI;
00624       break;
00625 
00626    case 12:
00627       memcpy(at, A->dp, 12 * sizeof(fp_digit));
00628       memcpy(at+12, B->dp, 12 * sizeof(fp_digit));
00629       COMBA_START;
00630 
00631       COMBA_CLEAR;
00632       /* 0 */
00633       MULADD(at[0], at[12]); 
00634       COMBA_STORE(C->dp[0]);
00635       /* 1 */
00636       COMBA_FORWARD;
00637       MULADD(at[0], at[13]);       MULADD(at[1], at[12]); 
00638       COMBA_STORE(C->dp[1]);
00639       /* 2 */
00640       COMBA_FORWARD;
00641       MULADD(at[0], at[14]);       MULADD(at[1], at[13]);       MULADD(at[2], at[12]); 
00642       COMBA_STORE(C->dp[2]);
00643       /* 3 */
00644       COMBA_FORWARD;
00645       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);       MULADD(at[2], at[13]);       MULADD(at[3], at[12]); 
00646       COMBA_STORE(C->dp[3]);
00647       /* 4 */
00648       COMBA_FORWARD;
00649       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]); 
00650       COMBA_STORE(C->dp[4]);
00651       /* 5 */
00652       COMBA_FORWARD;
00653       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]); 
00654       COMBA_STORE(C->dp[5]);
00655       /* 6 */
00656       COMBA_FORWARD;
00657       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]); 
00658       COMBA_STORE(C->dp[6]);
00659       /* 7 */
00660       COMBA_FORWARD;
00661       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]); 
00662       COMBA_STORE(C->dp[7]);
00663       /* 8 */
00664       COMBA_FORWARD;
00665       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]); 
00666       COMBA_STORE(C->dp[8]);
00667       /* 9 */
00668       COMBA_FORWARD;
00669       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]); 
00670       COMBA_STORE(C->dp[9]);
00671       /* 10 */
00672       COMBA_FORWARD;
00673       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]); 
00674       COMBA_STORE(C->dp[10]);
00675       /* 11 */
00676       COMBA_FORWARD;
00677       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]); 
00678       COMBA_STORE(C->dp[11]);
00679       /* 12 */
00680       COMBA_FORWARD;
00681       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]); 
00682       COMBA_STORE(C->dp[12]);
00683       /* 13 */
00684       COMBA_FORWARD;
00685       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]); 
00686       COMBA_STORE(C->dp[13]);
00687       /* 14 */
00688       COMBA_FORWARD;
00689       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]); 
00690       COMBA_STORE(C->dp[14]);
00691       /* 15 */
00692       COMBA_FORWARD;
00693       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]); 
00694       COMBA_STORE(C->dp[15]);
00695       /* 16 */
00696       COMBA_FORWARD;
00697       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]); 
00698       COMBA_STORE(C->dp[16]);
00699       /* 17 */
00700       COMBA_FORWARD;
00701       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]); 
00702       COMBA_STORE(C->dp[17]);
00703       /* 18 */
00704       COMBA_FORWARD;
00705       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]); 
00706       COMBA_STORE(C->dp[18]);
00707       /* 19 */
00708       COMBA_FORWARD;
00709       MULADD(at[8], at[23]);       MULADD(at[9], at[22]);       MULADD(at[10], at[21]);       MULADD(at[11], at[20]); 
00710       COMBA_STORE(C->dp[19]);
00711       /* 20 */
00712       COMBA_FORWARD;
00713       MULADD(at[9], at[23]);       MULADD(at[10], at[22]);       MULADD(at[11], at[21]); 
00714       COMBA_STORE(C->dp[20]);
00715       /* 21 */
00716       COMBA_FORWARD;
00717       MULADD(at[10], at[23]);       MULADD(at[11], at[22]); 
00718       COMBA_STORE(C->dp[21]);
00719       /* 22 */
00720       COMBA_FORWARD;
00721       MULADD(at[11], at[23]); 
00722       COMBA_STORE(C->dp[22]);
00723       COMBA_STORE2(C->dp[23]);
00724       C->used = 24;
00725       C->sign = A->sign ^ B->sign;
00726       fp_clamp(C);
00727       COMBA_FINI;
00728       break;
00729 
00730    case 13:
00731       memcpy(at, A->dp, 13 * sizeof(fp_digit));
00732       memcpy(at+13, B->dp, 13 * sizeof(fp_digit));
00733       COMBA_START;
00734 
00735       COMBA_CLEAR;
00736       /* 0 */
00737       MULADD(at[0], at[13]); 
00738       COMBA_STORE(C->dp[0]);
00739       /* 1 */
00740       COMBA_FORWARD;
00741       MULADD(at[0], at[14]);       MULADD(at[1], at[13]); 
00742       COMBA_STORE(C->dp[1]);
00743       /* 2 */
00744       COMBA_FORWARD;
00745       MULADD(at[0], at[15]);       MULADD(at[1], at[14]);       MULADD(at[2], at[13]); 
00746       COMBA_STORE(C->dp[2]);
00747       /* 3 */
00748       COMBA_FORWARD;
00749       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);       MULADD(at[2], at[14]);       MULADD(at[3], at[13]); 
00750       COMBA_STORE(C->dp[3]);
00751       /* 4 */
00752       COMBA_FORWARD;
00753       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]); 
00754       COMBA_STORE(C->dp[4]);
00755       /* 5 */
00756       COMBA_FORWARD;
00757       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]); 
00758       COMBA_STORE(C->dp[5]);
00759       /* 6 */
00760       COMBA_FORWARD;
00761       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]); 
00762       COMBA_STORE(C->dp[6]);
00763       /* 7 */
00764       COMBA_FORWARD;
00765       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]); 
00766       COMBA_STORE(C->dp[7]);
00767       /* 8 */
00768       COMBA_FORWARD;
00769       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]); 
00770       COMBA_STORE(C->dp[8]);
00771       /* 9 */
00772       COMBA_FORWARD;
00773       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]); 
00774       COMBA_STORE(C->dp[9]);
00775       /* 10 */
00776       COMBA_FORWARD;
00777       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]); 
00778       COMBA_STORE(C->dp[10]);
00779       /* 11 */
00780       COMBA_FORWARD;
00781       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]); 
00782       COMBA_STORE(C->dp[11]);
00783       /* 12 */
00784       COMBA_FORWARD;
00785       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]); 
00786       COMBA_STORE(C->dp[12]);
00787       /* 13 */
00788       COMBA_FORWARD;
00789       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]); 
00790       COMBA_STORE(C->dp[13]);
00791       /* 14 */
00792       COMBA_FORWARD;
00793       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]); 
00794       COMBA_STORE(C->dp[14]);
00795       /* 15 */
00796       COMBA_FORWARD;
00797       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]); 
00798       COMBA_STORE(C->dp[15]);
00799       /* 16 */
00800       COMBA_FORWARD;
00801       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]); 
00802       COMBA_STORE(C->dp[16]);
00803       /* 17 */
00804       COMBA_FORWARD;
00805       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]); 
00806       COMBA_STORE(C->dp[17]);
00807       /* 18 */
00808       COMBA_FORWARD;
00809       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]); 
00810       COMBA_STORE(C->dp[18]);
00811       /* 19 */
00812       COMBA_FORWARD;
00813       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]); 
00814       COMBA_STORE(C->dp[19]);
00815       /* 20 */
00816       COMBA_FORWARD;
00817       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]); 
00818       COMBA_STORE(C->dp[20]);
00819       /* 21 */
00820       COMBA_FORWARD;
00821       MULADD(at[9], at[25]);       MULADD(at[10], at[24]);       MULADD(at[11], at[23]);       MULADD(at[12], at[22]); 
00822       COMBA_STORE(C->dp[21]);
00823       /* 22 */
00824       COMBA_FORWARD;
00825       MULADD(at[10], at[25]);       MULADD(at[11], at[24]);       MULADD(at[12], at[23]); 
00826       COMBA_STORE(C->dp[22]);
00827       /* 23 */
00828       COMBA_FORWARD;
00829       MULADD(at[11], at[25]);       MULADD(at[12], at[24]); 
00830       COMBA_STORE(C->dp[23]);
00831       /* 24 */
00832       COMBA_FORWARD;
00833       MULADD(at[12], at[25]); 
00834       COMBA_STORE(C->dp[24]);
00835       COMBA_STORE2(C->dp[25]);
00836       C->used = 26;
00837       C->sign = A->sign ^ B->sign;
00838       fp_clamp(C);
00839       COMBA_FINI;
00840       break;
00841 
00842    case 14:
00843       memcpy(at, A->dp, 14 * sizeof(fp_digit));
00844       memcpy(at+14, B->dp, 14 * sizeof(fp_digit));
00845       COMBA_START;
00846 
00847       COMBA_CLEAR;
00848       /* 0 */
00849       MULADD(at[0], at[14]); 
00850       COMBA_STORE(C->dp[0]);
00851       /* 1 */
00852       COMBA_FORWARD;
00853       MULADD(at[0], at[15]);       MULADD(at[1], at[14]); 
00854       COMBA_STORE(C->dp[1]);
00855       /* 2 */
00856       COMBA_FORWARD;
00857       MULADD(at[0], at[16]);       MULADD(at[1], at[15]);       MULADD(at[2], at[14]); 
00858       COMBA_STORE(C->dp[2]);
00859       /* 3 */
00860       COMBA_FORWARD;
00861       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]);       MULADD(at[3], at[14]); 
00862       COMBA_STORE(C->dp[3]);
00863       /* 4 */
00864       COMBA_FORWARD;
00865       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]); 
00866       COMBA_STORE(C->dp[4]);
00867       /* 5 */
00868       COMBA_FORWARD;
00869       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]); 
00870       COMBA_STORE(C->dp[5]);
00871       /* 6 */
00872       COMBA_FORWARD;
00873       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]); 
00874       COMBA_STORE(C->dp[6]);
00875       /* 7 */
00876       COMBA_FORWARD;
00877       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]); 
00878       COMBA_STORE(C->dp[7]);
00879       /* 8 */
00880       COMBA_FORWARD;
00881       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]); 
00882       COMBA_STORE(C->dp[8]);
00883       /* 9 */
00884       COMBA_FORWARD;
00885       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]); 
00886       COMBA_STORE(C->dp[9]);
00887       /* 10 */
00888       COMBA_FORWARD;
00889       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]); 
00890       COMBA_STORE(C->dp[10]);
00891       /* 11 */
00892       COMBA_FORWARD;
00893       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]); 
00894       COMBA_STORE(C->dp[11]);
00895       /* 12 */
00896       COMBA_FORWARD;
00897       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]); 
00898       COMBA_STORE(C->dp[12]);
00899       /* 13 */
00900       COMBA_FORWARD;
00901       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]); 
00902       COMBA_STORE(C->dp[13]);
00903       /* 14 */
00904       COMBA_FORWARD;
00905       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]); 
00906       COMBA_STORE(C->dp[14]);
00907       /* 15 */
00908       COMBA_FORWARD;
00909       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]); 
00910       COMBA_STORE(C->dp[15]);
00911       /* 16 */
00912       COMBA_FORWARD;
00913       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]); 
00914       COMBA_STORE(C->dp[16]);
00915       /* 17 */
00916       COMBA_FORWARD;
00917       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]); 
00918       COMBA_STORE(C->dp[17]);
00919       /* 18 */
00920       COMBA_FORWARD;
00921       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]); 
00922       COMBA_STORE(C->dp[18]);
00923       /* 19 */
00924       COMBA_FORWARD;
00925       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]); 
00926       COMBA_STORE(C->dp[19]);
00927       /* 20 */
00928       COMBA_FORWARD;
00929       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]); 
00930       COMBA_STORE(C->dp[20]);
00931       /* 21 */
00932       COMBA_FORWARD;
00933       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]); 
00934       COMBA_STORE(C->dp[21]);
00935       /* 22 */
00936       COMBA_FORWARD;
00937       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]); 
00938       COMBA_STORE(C->dp[22]);
00939       /* 23 */
00940       COMBA_FORWARD;
00941       MULADD(at[10], at[27]);       MULADD(at[11], at[26]);       MULADD(at[12], at[25]);       MULADD(at[13], at[24]); 
00942       COMBA_STORE(C->dp[23]);
00943       /* 24 */
00944       COMBA_FORWARD;
00945       MULADD(at[11], at[27]);       MULADD(at[12], at[26]);       MULADD(at[13], at[25]); 
00946       COMBA_STORE(C->dp[24]);
00947       /* 25 */
00948       COMBA_FORWARD;
00949       MULADD(at[12], at[27]);       MULADD(at[13], at[26]); 
00950       COMBA_STORE(C->dp[25]);
00951       /* 26 */
00952       COMBA_FORWARD;
00953       MULADD(at[13], at[27]); 
00954       COMBA_STORE(C->dp[26]);
00955       COMBA_STORE2(C->dp[27]);
00956       C->used = 28;
00957       C->sign = A->sign ^ B->sign;
00958       fp_clamp(C);
00959       COMBA_FINI;
00960       break;
00961 
00962    case 15:
00963       memcpy(at, A->dp, 15 * sizeof(fp_digit));
00964       memcpy(at+15, B->dp, 15 * sizeof(fp_digit));
00965       COMBA_START;
00966 
00967       COMBA_CLEAR;
00968       /* 0 */
00969       MULADD(at[0], at[15]); 
00970       COMBA_STORE(C->dp[0]);
00971       /* 1 */
00972       COMBA_FORWARD;
00973       MULADD(at[0], at[16]);       MULADD(at[1], at[15]); 
00974       COMBA_STORE(C->dp[1]);
00975       /* 2 */
00976       COMBA_FORWARD;
00977       MULADD(at[0], at[17]);       MULADD(at[1], at[16]);       MULADD(at[2], at[15]); 
00978       COMBA_STORE(C->dp[2]);
00979       /* 3 */
00980       COMBA_FORWARD;
00981       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]);       MULADD(at[3], at[15]); 
00982       COMBA_STORE(C->dp[3]);
00983       /* 4 */
00984       COMBA_FORWARD;
00985       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]); 
00986       COMBA_STORE(C->dp[4]);
00987       /* 5 */
00988       COMBA_FORWARD;
00989       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]); 
00990       COMBA_STORE(C->dp[5]);
00991       /* 6 */
00992       COMBA_FORWARD;
00993       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]); 
00994       COMBA_STORE(C->dp[6]);
00995       /* 7 */
00996       COMBA_FORWARD;
00997       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]); 
00998       COMBA_STORE(C->dp[7]);
00999       /* 8 */
01000       COMBA_FORWARD;
01001       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]); 
01002       COMBA_STORE(C->dp[8]);
01003       /* 9 */
01004       COMBA_FORWARD;
01005       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]); 
01006       COMBA_STORE(C->dp[9]);
01007       /* 10 */
01008       COMBA_FORWARD;
01009       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]); 
01010       COMBA_STORE(C->dp[10]);
01011       /* 11 */
01012       COMBA_FORWARD;
01013       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]); 
01014       COMBA_STORE(C->dp[11]);
01015       /* 12 */
01016       COMBA_FORWARD;
01017       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]); 
01018       COMBA_STORE(C->dp[12]);
01019       /* 13 */
01020       COMBA_FORWARD;
01021       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]); 
01022       COMBA_STORE(C->dp[13]);
01023       /* 14 */
01024       COMBA_FORWARD;
01025       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]); 
01026       COMBA_STORE(C->dp[14]);
01027       /* 15 */
01028       COMBA_FORWARD;
01029       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]); 
01030       COMBA_STORE(C->dp[15]);
01031       /* 16 */
01032       COMBA_FORWARD;
01033       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]); 
01034       COMBA_STORE(C->dp[16]);
01035       /* 17 */
01036       COMBA_FORWARD;
01037       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]); 
01038       COMBA_STORE(C->dp[17]);
01039       /* 18 */
01040       COMBA_FORWARD;
01041       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]); 
01042       COMBA_STORE(C->dp[18]);
01043       /* 19 */
01044       COMBA_FORWARD;
01045       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]); 
01046       COMBA_STORE(C->dp[19]);
01047       /* 20 */
01048       COMBA_FORWARD;
01049       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]); 
01050       COMBA_STORE(C->dp[20]);
01051       /* 21 */
01052       COMBA_FORWARD;
01053       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]); 
01054       COMBA_STORE(C->dp[21]);
01055       /* 22 */
01056       COMBA_FORWARD;
01057       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]); 
01058       COMBA_STORE(C->dp[22]);
01059       /* 23 */
01060       COMBA_FORWARD;
01061       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]); 
01062       COMBA_STORE(C->dp[23]);
01063       /* 24 */
01064       COMBA_FORWARD;
01065       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]); 
01066       COMBA_STORE(C->dp[24]);
01067       /* 25 */
01068       COMBA_FORWARD;
01069       MULADD(at[11], at[29]);       MULADD(at[12], at[28]);       MULADD(at[13], at[27]);       MULADD(at[14], at[26]); 
01070       COMBA_STORE(C->dp[25]);
01071       /* 26 */
01072       COMBA_FORWARD;
01073       MULADD(at[12], at[29]);       MULADD(at[13], at[28]);       MULADD(at[14], at[27]); 
01074       COMBA_STORE(C->dp[26]);
01075       /* 27 */
01076       COMBA_FORWARD;
01077       MULADD(at[13], at[29]);       MULADD(at[14], at[28]); 
01078       COMBA_STORE(C->dp[27]);
01079       /* 28 */
01080       COMBA_FORWARD;
01081       MULADD(at[14], at[29]); 
01082       COMBA_STORE(C->dp[28]);
01083       COMBA_STORE2(C->dp[29]);
01084       C->used = 30;
01085       C->sign = A->sign ^ B->sign;
01086       fp_clamp(C);
01087       COMBA_FINI;
01088       break;
01089 
01090    case 16:
01091       memcpy(at, A->dp, 16 * sizeof(fp_digit));
01092       memcpy(at+16, B->dp, 16 * sizeof(fp_digit));
01093       COMBA_START;
01094 
01095       COMBA_CLEAR;
01096       /* 0 */
01097       MULADD(at[0], at[16]); 
01098       COMBA_STORE(C->dp[0]);
01099       /* 1 */
01100       COMBA_FORWARD;
01101       MULADD(at[0], at[17]);       MULADD(at[1], at[16]); 
01102       COMBA_STORE(C->dp[1]);
01103       /* 2 */
01104       COMBA_FORWARD;
01105       MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]); 
01106       COMBA_STORE(C->dp[2]);
01107       /* 3 */
01108       COMBA_FORWARD;
01109       MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]); 
01110       COMBA_STORE(C->dp[3]);
01111       /* 4 */
01112       COMBA_FORWARD;
01113       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]); 
01114       COMBA_STORE(C->dp[4]);
01115       /* 5 */
01116       COMBA_FORWARD;
01117       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]); 
01118       COMBA_STORE(C->dp[5]);
01119       /* 6 */
01120       COMBA_FORWARD;
01121       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]); 
01122       COMBA_STORE(C->dp[6]);
01123       /* 7 */
01124       COMBA_FORWARD;
01125       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]); 
01126       COMBA_STORE(C->dp[7]);
01127       /* 8 */
01128       COMBA_FORWARD;
01129       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]); 
01130       COMBA_STORE(C->dp[8]);
01131       /* 9 */
01132       COMBA_FORWARD;
01133       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]); 
01134       COMBA_STORE(C->dp[9]);
01135       /* 10 */
01136       COMBA_FORWARD;
01137       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]); 
01138       COMBA_STORE(C->dp[10]);
01139       /* 11 */
01140       COMBA_FORWARD;
01141       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]); 
01142       COMBA_STORE(C->dp[11]);
01143       /* 12 */
01144       COMBA_FORWARD;
01145       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]); 
01146       COMBA_STORE(C->dp[12]);
01147       /* 13 */
01148       COMBA_FORWARD;
01149       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]); 
01150       COMBA_STORE(C->dp[13]);
01151       /* 14 */
01152       COMBA_FORWARD;
01153       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]); 
01154       COMBA_STORE(C->dp[14]);
01155       /* 15 */
01156       COMBA_FORWARD;
01157       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]); 
01158       COMBA_STORE(C->dp[15]);
01159       /* 16 */
01160       COMBA_FORWARD;
01161       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]); 
01162       COMBA_STORE(C->dp[16]);
01163       /* 17 */
01164       COMBA_FORWARD;
01165       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]); 
01166       COMBA_STORE(C->dp[17]);
01167       /* 18 */
01168       COMBA_FORWARD;
01169       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]); 
01170       COMBA_STORE(C->dp[18]);
01171       /* 19 */
01172       COMBA_FORWARD;
01173       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]); 
01174       COMBA_STORE(C->dp[19]);
01175       /* 20 */
01176       COMBA_FORWARD;
01177       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]); 
01178       COMBA_STORE(C->dp[20]);
01179       /* 21 */
01180       COMBA_FORWARD;
01181       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]); 
01182       COMBA_STORE(C->dp[21]);
01183       /* 22 */
01184       COMBA_FORWARD;
01185       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]); 
01186       COMBA_STORE(C->dp[22]);
01187       /* 23 */
01188       COMBA_FORWARD;
01189       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]); 
01190       COMBA_STORE(C->dp[23]);
01191       /* 24 */
01192       COMBA_FORWARD;
01193       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]); 
01194       COMBA_STORE(C->dp[24]);
01195       /* 25 */
01196       COMBA_FORWARD;
01197       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]); 
01198       COMBA_STORE(C->dp[25]);
01199       /* 26 */
01200       COMBA_FORWARD;
01201       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]); 
01202       COMBA_STORE(C->dp[26]);
01203       /* 27 */
01204       COMBA_FORWARD;
01205       MULADD(at[12], at[31]);       MULADD(at[13], at[30]);       MULADD(at[14], at[29]);       MULADD(at[15], at[28]); 
01206       COMBA_STORE(C->dp[27]);
01207       /* 28 */
01208       COMBA_FORWARD;
01209       MULADD(at[13], at[31]);       MULADD(at[14], at[30]);       MULADD(at[15], at[29]); 
01210       COMBA_STORE(C->dp[28]);
01211       /* 29 */
01212       COMBA_FORWARD;
01213       MULADD(at[14], at[31]);       MULADD(at[15], at[30]); 
01214       COMBA_STORE(C->dp[29]);
01215       /* 30 */
01216       COMBA_FORWARD;
01217       MULADD(at[15], at[31]); 
01218       COMBA_STORE(C->dp[30]);
01219       COMBA_STORE2(C->dp[31]);
01220       C->used = 32;
01221       C->sign = A->sign ^ B->sign;
01222       fp_clamp(C);
01223       COMBA_FINI;
01224       break;
01225    }
01226 }
01227 
01228 #endif