security/nss/lib/freebl/mpi/mp_comba.c

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /*
     2  * The below file is derived from TFM v0.03.
     3  * It contains code from fp_mul_comba.c and
     4  * fp_sqr_comba.c, which contained the following license.
     5  *
     6  * Right now, the assembly in this file limits
     7  * this code to AMD 64.
     8  *
     9  * This file is public domain.
    10  */
    12 /* TomsFastMath, a fast ISO C bignum library.
    13  * 
    14  * This project is meant to fill in where LibTomMath
    15  * falls short.  That is speed ;-)
    16  *
    17  * This project is public domain and free for all purposes.
    18  * 
    19  * Tom St Denis, tomstdenis@iahu.ca
    20  */
    23 #include "mpi-priv.h"
    27 /* clamp digits */
    28 #define mp_clamp(a)   { while ((a)->used && (a)->dp[(a)->used-1] == 0) --((a)->used); (a)->sign = (a)->used ? (a)->sign : ZPOS; }
    30 /* anything you need at the start */
    31 #define COMBA_START
    33 /* clear the chaining variables */
    34 #define COMBA_CLEAR \
    35    c0 = c1 = c2 = 0;
    37 /* forward the carry to the next digit */
    38 #define COMBA_FORWARD \
    39    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
    41 /* anything you need at the end */
    42 #define COMBA_FINI
    44 /* this should multiply i and j  */
    45 #define MULADD(i, j)                                      \
    46 __asm__  (                                                    \
    47      "movq  %6,%%rax     \n\t"                            \
    48      "mulq  %7           \n\t"                            \
    49      "addq  %%rax,%0     \n\t"                            \
    50      "adcq  %%rdx,%1     \n\t"                            \
    51      "adcq  $0,%2        \n\t"                            \
    52      :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j)  :"%rax","%rdx","cc");
    57 /* sqr macros only */
    58 #define CLEAR_CARRY \
    59    c0 = c1 = c2 = 0;
    61 #define COMBA_STORE(x) \
    62    x = c0;
    64 #define COMBA_STORE2(x) \
    65    x = c1;
    67 #define CARRY_FORWARD \
    68    do { c0 = c1; c1 = c2; c2 = 0; } while (0);
    70 #define COMBA_FINI
    72 #define SQRADD(i, j)                                      \
    73 __asm__ (                                                     \
    74      "movq  %6,%%rax     \n\t"                            \
    75      "mulq  %%rax        \n\t"                            \
    76      "addq  %%rax,%0     \n\t"                            \
    77      "adcq  %%rdx,%1     \n\t"                            \
    78      "adcq  $0,%2        \n\t"                            \
    79      :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i) :"%rax","%rdx","cc");
    81 #define SQRADD2(i, j)                                     \
    82 __asm__ (                                                     \
    83      "movq  %6,%%rax     \n\t"                            \
    84      "mulq  %7           \n\t"                            \
    85      "addq  %%rax,%0     \n\t"                            \
    86      "adcq  %%rdx,%1     \n\t"                            \
    87      "adcq  $0,%2        \n\t"                            \
    88      "addq  %%rax,%0     \n\t"                            \
    89      "adcq  %%rdx,%1     \n\t"                            \
    90      "adcq  $0,%2        \n\t"                            \
    91      :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j)  :"%rax","%rdx","cc");
    93 #define SQRADDSC(i, j)                                    \
    94 __asm__ (                                                     \
    95      "movq  %3,%%rax     \n\t"                            \
    96      "mulq  %4           \n\t"                            \
    97      "movq  %%rax,%0     \n\t"                            \
    98      "movq  %%rdx,%1     \n\t"                            \
    99      "xorq  %2,%2        \n\t"                            \
   100      :"=r"(sc0), "=r"(sc1), "=r"(sc2): "g"(i), "g"(j) :"%rax","%rdx","cc");
   102 #define SQRADDAC(i, j)                                                         \
   103 __asm__ (                                                     \
   104      "movq  %6,%%rax     \n\t"                            \
   105      "mulq  %7           \n\t"                            \
   106      "addq  %%rax,%0     \n\t"                            \
   107      "adcq  %%rdx,%1     \n\t"                            \
   108      "adcq  $0,%2        \n\t"                            \
   109      :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%rax","%rdx","cc");
   111 #define SQRADDDB                                                               \
   112 __asm__ (                                                     \
   113      "addq %6,%0         \n\t"                            \
   114      "adcq %7,%1         \n\t"                            \
   115      "adcq %8,%2         \n\t"                            \
   116      "addq %6,%0         \n\t"                            \
   117      "adcq %7,%1         \n\t"                            \
   118      "adcq %8,%2         \n\t"                            \
   119      :"=&r"(c0), "=&r"(c1), "=&r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(sc0), "r"(sc1), "r"(sc2) : "cc");
   125 void s_mp_mul_comba_4(const mp_int *A, const mp_int *B, mp_int *C)
   126 {
   127    mp_digit c0, c1, c2, at[8];
   129    memcpy(at, A->dp, 4 * sizeof(mp_digit));
   130    memcpy(at+4, B->dp, 4 * sizeof(mp_digit));
   131    COMBA_START;
   133    COMBA_CLEAR;
   134    /* 0 */
   135    MULADD(at[0], at[4]); 
   136    COMBA_STORE(C->dp[0]);
   137    /* 1 */
   138    COMBA_FORWARD;
   139    MULADD(at[0], at[5]);       MULADD(at[1], at[4]); 
   140    COMBA_STORE(C->dp[1]);
   141    /* 2 */
   142    COMBA_FORWARD;
   143    MULADD(at[0], at[6]);       MULADD(at[1], at[5]);       MULADD(at[2], at[4]); 
   144    COMBA_STORE(C->dp[2]);
   145    /* 3 */
   146    COMBA_FORWARD;
   147    MULADD(at[0], at[7]);       MULADD(at[1], at[6]);       MULADD(at[2], at[5]);       MULADD(at[3], at[4]); 
   148    COMBA_STORE(C->dp[3]);
   149    /* 4 */
   150    COMBA_FORWARD;
   151    MULADD(at[1], at[7]);       MULADD(at[2], at[6]);       MULADD(at[3], at[5]); 
   152    COMBA_STORE(C->dp[4]);
   153    /* 5 */
   154    COMBA_FORWARD;
   155    MULADD(at[2], at[7]);       MULADD(at[3], at[6]); 
   156    COMBA_STORE(C->dp[5]);
   157    /* 6 */
   158    COMBA_FORWARD;
   159    MULADD(at[3], at[7]); 
   160    COMBA_STORE(C->dp[6]);
   161    COMBA_STORE2(C->dp[7]);
   162    C->used = 8;
   163    C->sign = A->sign ^ B->sign;
   164    mp_clamp(C);
   165    COMBA_FINI;
   166 }
   168 void s_mp_mul_comba_8(const mp_int *A, const mp_int *B, mp_int *C)
   169 {
   170    mp_digit c0, c1, c2, at[16];
   172    memcpy(at, A->dp, 8 * sizeof(mp_digit));
   173    memcpy(at+8, B->dp, 8 * sizeof(mp_digit));
   174    COMBA_START;
   176    COMBA_CLEAR;
   177    /* 0 */
   178    MULADD(at[0], at[8]); 
   179    COMBA_STORE(C->dp[0]);
   180    /* 1 */
   181    COMBA_FORWARD;
   182    MULADD(at[0], at[9]);       MULADD(at[1], at[8]); 
   183    COMBA_STORE(C->dp[1]);
   184    /* 2 */
   185    COMBA_FORWARD;
   186    MULADD(at[0], at[10]);       MULADD(at[1], at[9]);       MULADD(at[2], at[8]); 
   187    COMBA_STORE(C->dp[2]);
   188    /* 3 */
   189    COMBA_FORWARD;
   190    MULADD(at[0], at[11]);       MULADD(at[1], at[10]);       MULADD(at[2], at[9]);       MULADD(at[3], at[8]); 
   191    COMBA_STORE(C->dp[3]);
   192    /* 4 */
   193    COMBA_FORWARD;
   194    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]); 
   195    COMBA_STORE(C->dp[4]);
   196    /* 5 */
   197    COMBA_FORWARD;
   198    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]); 
   199    COMBA_STORE(C->dp[5]);
   200    /* 6 */
   201    COMBA_FORWARD;
   202    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]); 
   203    COMBA_STORE(C->dp[6]);
   204    /* 7 */
   205    COMBA_FORWARD;
   206    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]); 
   207    COMBA_STORE(C->dp[7]);
   208    /* 8 */
   209    COMBA_FORWARD;
   210    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]); 
   211    COMBA_STORE(C->dp[8]);
   212    /* 9 */
   213    COMBA_FORWARD;
   214    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]); 
   215    COMBA_STORE(C->dp[9]);
   216    /* 10 */
   217    COMBA_FORWARD;
   218    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]); 
   219    COMBA_STORE(C->dp[10]);
   220    /* 11 */
   221    COMBA_FORWARD;
   222    MULADD(at[4], at[15]);       MULADD(at[5], at[14]);       MULADD(at[6], at[13]);       MULADD(at[7], at[12]); 
   223    COMBA_STORE(C->dp[11]);
   224    /* 12 */
   225    COMBA_FORWARD;
   226    MULADD(at[5], at[15]);       MULADD(at[6], at[14]);       MULADD(at[7], at[13]); 
   227    COMBA_STORE(C->dp[12]);
   228    /* 13 */
   229    COMBA_FORWARD;
   230    MULADD(at[6], at[15]);       MULADD(at[7], at[14]); 
   231    COMBA_STORE(C->dp[13]);
   232    /* 14 */
   233    COMBA_FORWARD;
   234    MULADD(at[7], at[15]); 
   235    COMBA_STORE(C->dp[14]);
   236    COMBA_STORE2(C->dp[15]);
   237    C->used = 16;
   238    C->sign = A->sign ^ B->sign;
   239    mp_clamp(C);
   240    COMBA_FINI;
   241 }
   243 void s_mp_mul_comba_16(const mp_int *A, const mp_int *B, mp_int *C)
   244 {
   245    mp_digit c0, c1, c2, at[32];
   247    memcpy(at, A->dp, 16 * sizeof(mp_digit));
   248    memcpy(at+16, B->dp, 16 * sizeof(mp_digit));
   249    COMBA_START;
   251    COMBA_CLEAR;
   252    /* 0 */
   253    MULADD(at[0], at[16]); 
   254    COMBA_STORE(C->dp[0]);
   255    /* 1 */
   256    COMBA_FORWARD;
   257    MULADD(at[0], at[17]);       MULADD(at[1], at[16]); 
   258    COMBA_STORE(C->dp[1]);
   259    /* 2 */
   260    COMBA_FORWARD;
   261    MULADD(at[0], at[18]);       MULADD(at[1], at[17]);       MULADD(at[2], at[16]); 
   262    COMBA_STORE(C->dp[2]);
   263    /* 3 */
   264    COMBA_FORWARD;
   265    MULADD(at[0], at[19]);       MULADD(at[1], at[18]);       MULADD(at[2], at[17]);       MULADD(at[3], at[16]); 
   266    COMBA_STORE(C->dp[3]);
   267    /* 4 */
   268    COMBA_FORWARD;
   269    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]); 
   270    COMBA_STORE(C->dp[4]);
   271    /* 5 */
   272    COMBA_FORWARD;
   273    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]); 
   274    COMBA_STORE(C->dp[5]);
   275    /* 6 */
   276    COMBA_FORWARD;
   277    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]); 
   278    COMBA_STORE(C->dp[6]);
   279    /* 7 */
   280    COMBA_FORWARD;
   281    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]); 
   282    COMBA_STORE(C->dp[7]);
   283    /* 8 */
   284    COMBA_FORWARD;
   285    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]); 
   286    COMBA_STORE(C->dp[8]);
   287    /* 9 */
   288    COMBA_FORWARD;
   289    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]); 
   290    COMBA_STORE(C->dp[9]);
   291    /* 10 */
   292    COMBA_FORWARD;
   293    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]); 
   294    COMBA_STORE(C->dp[10]);
   295    /* 11 */
   296    COMBA_FORWARD;
   297    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]); 
   298    COMBA_STORE(C->dp[11]);
   299    /* 12 */
   300    COMBA_FORWARD;
   301    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]); 
   302    COMBA_STORE(C->dp[12]);
   303    /* 13 */
   304    COMBA_FORWARD;
   305    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]); 
   306    COMBA_STORE(C->dp[13]);
   307    /* 14 */
   308    COMBA_FORWARD;
   309    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]); 
   310    COMBA_STORE(C->dp[14]);
   311    /* 15 */
   312    COMBA_FORWARD;
   313    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]); 
   314    COMBA_STORE(C->dp[15]);
   315    /* 16 */
   316    COMBA_FORWARD;
   317    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]); 
   318    COMBA_STORE(C->dp[16]);
   319    /* 17 */
   320    COMBA_FORWARD;
   321    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]); 
   322    COMBA_STORE(C->dp[17]);
   323    /* 18 */
   324    COMBA_FORWARD;
   325    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]); 
   326    COMBA_STORE(C->dp[18]);
   327    /* 19 */
   328    COMBA_FORWARD;
   329    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]); 
   330    COMBA_STORE(C->dp[19]);
   331    /* 20 */
   332    COMBA_FORWARD;
   333    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]); 
   334    COMBA_STORE(C->dp[20]);
   335    /* 21 */
   336    COMBA_FORWARD;
   337    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]); 
   338    COMBA_STORE(C->dp[21]);
   339    /* 22 */
   340    COMBA_FORWARD;
   341    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]); 
   342    COMBA_STORE(C->dp[22]);
   343    /* 23 */
   344    COMBA_FORWARD;
   345    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]); 
   346    COMBA_STORE(C->dp[23]);
   347    /* 24 */
   348    COMBA_FORWARD;
   349    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]); 
   350    COMBA_STORE(C->dp[24]);
   351    /* 25 */
   352    COMBA_FORWARD;
   353    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]); 
   354    COMBA_STORE(C->dp[25]);
   355    /* 26 */
   356    COMBA_FORWARD;
   357    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]); 
   358    COMBA_STORE(C->dp[26]);
   359    /* 27 */
   360    COMBA_FORWARD;
   361    MULADD(at[12], at[31]);       MULADD(at[13], at[30]);       MULADD(at[14], at[29]);       MULADD(at[15], at[28]); 
   362    COMBA_STORE(C->dp[27]);
   363    /* 28 */
   364    COMBA_FORWARD;
   365    MULADD(at[13], at[31]);       MULADD(at[14], at[30]);       MULADD(at[15], at[29]); 
   366    COMBA_STORE(C->dp[28]);
   367    /* 29 */
   368    COMBA_FORWARD;
   369    MULADD(at[14], at[31]);       MULADD(at[15], at[30]); 
   370    COMBA_STORE(C->dp[29]);
   371    /* 30 */
   372    COMBA_FORWARD;
   373    MULADD(at[15], at[31]); 
   374    COMBA_STORE(C->dp[30]);
   375    COMBA_STORE2(C->dp[31]);
   376    C->used = 32;
   377    C->sign = A->sign ^ B->sign;
   378    mp_clamp(C);
   379    COMBA_FINI;
   380 }
   382 void s_mp_mul_comba_32(const mp_int *A, const mp_int *B, mp_int *C)
   383 {
   384    mp_digit c0, c1, c2, at[64];
   386    memcpy(at, A->dp, 32 * sizeof(mp_digit));
   387    memcpy(at+32, B->dp, 32 * sizeof(mp_digit));
   388    COMBA_START;
   390    COMBA_CLEAR;
   391    /* 0 */
   392    MULADD(at[0], at[32]); 
   393    COMBA_STORE(C->dp[0]);
   394    /* 1 */
   395    COMBA_FORWARD;
   396    MULADD(at[0], at[33]);    MULADD(at[1], at[32]); 
   397    COMBA_STORE(C->dp[1]);
   398    /* 2 */
   399    COMBA_FORWARD;
   400    MULADD(at[0], at[34]);    MULADD(at[1], at[33]);    MULADD(at[2], at[32]); 
   401    COMBA_STORE(C->dp[2]);
   402    /* 3 */
   403    COMBA_FORWARD;
   404    MULADD(at[0], at[35]);    MULADD(at[1], at[34]);    MULADD(at[2], at[33]);    MULADD(at[3], at[32]); 
   405    COMBA_STORE(C->dp[3]);
   406    /* 4 */
   407    COMBA_FORWARD;
   408    MULADD(at[0], at[36]);    MULADD(at[1], at[35]);    MULADD(at[2], at[34]);    MULADD(at[3], at[33]);    MULADD(at[4], at[32]); 
   409    COMBA_STORE(C->dp[4]);
   410    /* 5 */
   411    COMBA_FORWARD;
   412    MULADD(at[0], at[37]);    MULADD(at[1], at[36]);    MULADD(at[2], at[35]);    MULADD(at[3], at[34]);    MULADD(at[4], at[33]);    MULADD(at[5], at[32]); 
   413    COMBA_STORE(C->dp[5]);
   414    /* 6 */
   415    COMBA_FORWARD;
   416    MULADD(at[0], at[38]);    MULADD(at[1], at[37]);    MULADD(at[2], at[36]);    MULADD(at[3], at[35]);    MULADD(at[4], at[34]);    MULADD(at[5], at[33]);    MULADD(at[6], at[32]); 
   417    COMBA_STORE(C->dp[6]);
   418    /* 7 */
   419    COMBA_FORWARD;
   420    MULADD(at[0], at[39]);    MULADD(at[1], at[38]);    MULADD(at[2], at[37]);    MULADD(at[3], at[36]);    MULADD(at[4], at[35]);    MULADD(at[5], at[34]);    MULADD(at[6], at[33]);    MULADD(at[7], at[32]); 
   421    COMBA_STORE(C->dp[7]);
   422    /* 8 */
   423    COMBA_FORWARD;
   424    MULADD(at[0], at[40]);    MULADD(at[1], at[39]);    MULADD(at[2], at[38]);    MULADD(at[3], at[37]);    MULADD(at[4], at[36]);    MULADD(at[5], at[35]);    MULADD(at[6], at[34]);    MULADD(at[7], at[33]);    MULADD(at[8], at[32]); 
   425    COMBA_STORE(C->dp[8]);
   426    /* 9 */
   427    COMBA_FORWARD;
   428    MULADD(at[0], at[41]);    MULADD(at[1], at[40]);    MULADD(at[2], at[39]);    MULADD(at[3], at[38]);    MULADD(at[4], at[37]);    MULADD(at[5], at[36]);    MULADD(at[6], at[35]);    MULADD(at[7], at[34]);    MULADD(at[8], at[33]);    MULADD(at[9], at[32]); 
   429    COMBA_STORE(C->dp[9]);
   430    /* 10 */
   431    COMBA_FORWARD;
   432    MULADD(at[0], at[42]);    MULADD(at[1], at[41]);    MULADD(at[2], at[40]);    MULADD(at[3], at[39]);    MULADD(at[4], at[38]);    MULADD(at[5], at[37]);    MULADD(at[6], at[36]);    MULADD(at[7], at[35]);    MULADD(at[8], at[34]);    MULADD(at[9], at[33]);    MULADD(at[10], at[32]); 
   433    COMBA_STORE(C->dp[10]);
   434    /* 11 */
   435    COMBA_FORWARD;
   436    MULADD(at[0], at[43]);    MULADD(at[1], at[42]);    MULADD(at[2], at[41]);    MULADD(at[3], at[40]);    MULADD(at[4], at[39]);    MULADD(at[5], at[38]);    MULADD(at[6], at[37]);    MULADD(at[7], at[36]);    MULADD(at[8], at[35]);    MULADD(at[9], at[34]);    MULADD(at[10], at[33]);    MULADD(at[11], at[32]); 
   437    COMBA_STORE(C->dp[11]);
   438    /* 12 */
   439    COMBA_FORWARD;
   440    MULADD(at[0], at[44]);    MULADD(at[1], at[43]);    MULADD(at[2], at[42]);    MULADD(at[3], at[41]);    MULADD(at[4], at[40]);    MULADD(at[5], at[39]);    MULADD(at[6], at[38]);    MULADD(at[7], at[37]);    MULADD(at[8], at[36]);    MULADD(at[9], at[35]);    MULADD(at[10], at[34]);    MULADD(at[11], at[33]);    MULADD(at[12], at[32]); 
   441    COMBA_STORE(C->dp[12]);
   442    /* 13 */
   443    COMBA_FORWARD;
   444    MULADD(at[0], at[45]);    MULADD(at[1], at[44]);    MULADD(at[2], at[43]);    MULADD(at[3], at[42]);    MULADD(at[4], at[41]);    MULADD(at[5], at[40]);    MULADD(at[6], at[39]);    MULADD(at[7], at[38]);    MULADD(at[8], at[37]);    MULADD(at[9], at[36]);    MULADD(at[10], at[35]);    MULADD(at[11], at[34]);    MULADD(at[12], at[33]);    MULADD(at[13], at[32]); 
   445    COMBA_STORE(C->dp[13]);
   446    /* 14 */
   447    COMBA_FORWARD;
   448    MULADD(at[0], at[46]);    MULADD(at[1], at[45]);    MULADD(at[2], at[44]);    MULADD(at[3], at[43]);    MULADD(at[4], at[42]);    MULADD(at[5], at[41]);    MULADD(at[6], at[40]);    MULADD(at[7], at[39]);    MULADD(at[8], at[38]);    MULADD(at[9], at[37]);    MULADD(at[10], at[36]);    MULADD(at[11], at[35]);    MULADD(at[12], at[34]);    MULADD(at[13], at[33]);    MULADD(at[14], at[32]); 
   449    COMBA_STORE(C->dp[14]);
   450    /* 15 */
   451    COMBA_FORWARD;
   452    MULADD(at[0], at[47]);    MULADD(at[1], at[46]);    MULADD(at[2], at[45]);    MULADD(at[3], at[44]);    MULADD(at[4], at[43]);    MULADD(at[5], at[42]);    MULADD(at[6], at[41]);    MULADD(at[7], at[40]);    MULADD(at[8], at[39]);    MULADD(at[9], at[38]);    MULADD(at[10], at[37]);    MULADD(at[11], at[36]);    MULADD(at[12], at[35]);    MULADD(at[13], at[34]);    MULADD(at[14], at[33]);    MULADD(at[15], at[32]); 
   453    COMBA_STORE(C->dp[15]);
   454    /* 16 */
   455    COMBA_FORWARD;
   456    MULADD(at[0], at[48]);    MULADD(at[1], at[47]);    MULADD(at[2], at[46]);    MULADD(at[3], at[45]);    MULADD(at[4], at[44]);    MULADD(at[5], at[43]);    MULADD(at[6], at[42]);    MULADD(at[7], at[41]);    MULADD(at[8], at[40]);    MULADD(at[9], at[39]);    MULADD(at[10], at[38]);    MULADD(at[11], at[37]);    MULADD(at[12], at[36]);    MULADD(at[13], at[35]);    MULADD(at[14], at[34]);    MULADD(at[15], at[33]);    MULADD(at[16], at[32]); 
   457    COMBA_STORE(C->dp[16]);
   458    /* 17 */
   459    COMBA_FORWARD;
   460    MULADD(at[0], at[49]);    MULADD(at[1], at[48]);    MULADD(at[2], at[47]);    MULADD(at[3], at[46]);    MULADD(at[4], at[45]);    MULADD(at[5], at[44]);    MULADD(at[6], at[43]);    MULADD(at[7], at[42]);    MULADD(at[8], at[41]);    MULADD(at[9], at[40]);    MULADD(at[10], at[39]);    MULADD(at[11], at[38]);    MULADD(at[12], at[37]);    MULADD(at[13], at[36]);    MULADD(at[14], at[35]);    MULADD(at[15], at[34]);    MULADD(at[16], at[33]);    MULADD(at[17], at[32]); 
   461    COMBA_STORE(C->dp[17]);
   462    /* 18 */
   463    COMBA_FORWARD;
   464    MULADD(at[0], at[50]);    MULADD(at[1], at[49]);    MULADD(at[2], at[48]);    MULADD(at[3], at[47]);    MULADD(at[4], at[46]);    MULADD(at[5], at[45]);    MULADD(at[6], at[44]);    MULADD(at[7], at[43]);    MULADD(at[8], at[42]);    MULADD(at[9], at[41]);    MULADD(at[10], at[40]);    MULADD(at[11], at[39]);    MULADD(at[12], at[38]);    MULADD(at[13], at[37]);    MULADD(at[14], at[36]);    MULADD(at[15], at[35]);    MULADD(at[16], at[34]);    MULADD(at[17], at[33]);    MULADD(at[18], at[32]); 
   465    COMBA_STORE(C->dp[18]);
   466    /* 19 */
   467    COMBA_FORWARD;
   468    MULADD(at[0], at[51]);    MULADD(at[1], at[50]);    MULADD(at[2], at[49]);    MULADD(at[3], at[48]);    MULADD(at[4], at[47]);    MULADD(at[5], at[46]);    MULADD(at[6], at[45]);    MULADD(at[7], at[44]);    MULADD(at[8], at[43]);    MULADD(at[9], at[42]);    MULADD(at[10], at[41]);    MULADD(at[11], at[40]);    MULADD(at[12], at[39]);    MULADD(at[13], at[38]);    MULADD(at[14], at[37]);    MULADD(at[15], at[36]);    MULADD(at[16], at[35]);    MULADD(at[17], at[34]);    MULADD(at[18], at[33]);    MULADD(at[19], at[32]); 
   469    COMBA_STORE(C->dp[19]);
   470    /* 20 */
   471    COMBA_FORWARD;
   472    MULADD(at[0], at[52]);    MULADD(at[1], at[51]);    MULADD(at[2], at[50]);    MULADD(at[3], at[49]);    MULADD(at[4], at[48]);    MULADD(at[5], at[47]);    MULADD(at[6], at[46]);    MULADD(at[7], at[45]);    MULADD(at[8], at[44]);    MULADD(at[9], at[43]);    MULADD(at[10], at[42]);    MULADD(at[11], at[41]);    MULADD(at[12], at[40]);    MULADD(at[13], at[39]);    MULADD(at[14], at[38]);    MULADD(at[15], at[37]);    MULADD(at[16], at[36]);    MULADD(at[17], at[35]);    MULADD(at[18], at[34]);    MULADD(at[19], at[33]);    MULADD(at[20], at[32]); 
   473    COMBA_STORE(C->dp[20]);
   474    /* 21 */
   475    COMBA_FORWARD;
   476    MULADD(at[0], at[53]);    MULADD(at[1], at[52]);    MULADD(at[2], at[51]);    MULADD(at[3], at[50]);    MULADD(at[4], at[49]);    MULADD(at[5], at[48]);    MULADD(at[6], at[47]);    MULADD(at[7], at[46]);    MULADD(at[8], at[45]);    MULADD(at[9], at[44]);    MULADD(at[10], at[43]);    MULADD(at[11], at[42]);    MULADD(at[12], at[41]);    MULADD(at[13], at[40]);    MULADD(at[14], at[39]);    MULADD(at[15], at[38]);    MULADD(at[16], at[37]);    MULADD(at[17], at[36]);    MULADD(at[18], at[35]);    MULADD(at[19], at[34]);    MULADD(at[20], at[33]);    MULADD(at[21], at[32]); 
   477    COMBA_STORE(C->dp[21]);
   478    /* 22 */
   479    COMBA_FORWARD;
   480    MULADD(at[0], at[54]);    MULADD(at[1], at[53]);    MULADD(at[2], at[52]);    MULADD(at[3], at[51]);    MULADD(at[4], at[50]);    MULADD(at[5], at[49]);    MULADD(at[6], at[48]);    MULADD(at[7], at[47]);    MULADD(at[8], at[46]);    MULADD(at[9], at[45]);    MULADD(at[10], at[44]);    MULADD(at[11], at[43]);    MULADD(at[12], at[42]);    MULADD(at[13], at[41]);    MULADD(at[14], at[40]);    MULADD(at[15], at[39]);    MULADD(at[16], at[38]);    MULADD(at[17], at[37]);    MULADD(at[18], at[36]);    MULADD(at[19], at[35]);    MULADD(at[20], at[34]);    MULADD(at[21], at[33]);    MULADD(at[22], at[32]); 
   481    COMBA_STORE(C->dp[22]);
   482    /* 23 */
   483    COMBA_FORWARD;
   484    MULADD(at[0], at[55]);    MULADD(at[1], at[54]);    MULADD(at[2], at[53]);    MULADD(at[3], at[52]);    MULADD(at[4], at[51]);    MULADD(at[5], at[50]);    MULADD(at[6], at[49]);    MULADD(at[7], at[48]);    MULADD(at[8], at[47]);    MULADD(at[9], at[46]);    MULADD(at[10], at[45]);    MULADD(at[11], at[44]);    MULADD(at[12], at[43]);    MULADD(at[13], at[42]);    MULADD(at[14], at[41]);    MULADD(at[15], at[40]);    MULADD(at[16], at[39]);    MULADD(at[17], at[38]);    MULADD(at[18], at[37]);    MULADD(at[19], at[36]);    MULADD(at[20], at[35]);    MULADD(at[21], at[34]);    MULADD(at[22], at[33]);    MULADD(at[23], at[32]); 
   485    COMBA_STORE(C->dp[23]);
   486    /* 24 */
   487    COMBA_FORWARD;
   488    MULADD(at[0], at[56]);    MULADD(at[1], at[55]);    MULADD(at[2], at[54]);    MULADD(at[3], at[53]);    MULADD(at[4], at[52]);    MULADD(at[5], at[51]);    MULADD(at[6], at[50]);    MULADD(at[7], at[49]);    MULADD(at[8], at[48]);    MULADD(at[9], at[47]);    MULADD(at[10], at[46]);    MULADD(at[11], at[45]);    MULADD(at[12], at[44]);    MULADD(at[13], at[43]);    MULADD(at[14], at[42]);    MULADD(at[15], at[41]);    MULADD(at[16], at[40]);    MULADD(at[17], at[39]);    MULADD(at[18], at[38]);    MULADD(at[19], at[37]);    MULADD(at[20], at[36]);    MULADD(at[21], at[35]);    MULADD(at[22], at[34]);    MULADD(at[23], at[33]);    MULADD(at[24], at[32]); 
   489    COMBA_STORE(C->dp[24]);
   490    /* 25 */
   491    COMBA_FORWARD;
   492    MULADD(at[0], at[57]);    MULADD(at[1], at[56]);    MULADD(at[2], at[55]);    MULADD(at[3], at[54]);    MULADD(at[4], at[53]);    MULADD(at[5], at[52]);    MULADD(at[6], at[51]);    MULADD(at[7], at[50]);    MULADD(at[8], at[49]);    MULADD(at[9], at[48]);    MULADD(at[10], at[47]);    MULADD(at[11], at[46]);    MULADD(at[12], at[45]);    MULADD(at[13], at[44]);    MULADD(at[14], at[43]);    MULADD(at[15], at[42]);    MULADD(at[16], at[41]);    MULADD(at[17], at[40]);    MULADD(at[18], at[39]);    MULADD(at[19], at[38]);    MULADD(at[20], at[37]);    MULADD(at[21], at[36]);    MULADD(at[22], at[35]);    MULADD(at[23], at[34]);    MULADD(at[24], at[33]);    MULADD(at[25], at[32]); 
   493    COMBA_STORE(C->dp[25]);
   494    /* 26 */
   495    COMBA_FORWARD;
   496    MULADD(at[0], at[58]);    MULADD(at[1], at[57]);    MULADD(at[2], at[56]);    MULADD(at[3], at[55]);    MULADD(at[4], at[54]);    MULADD(at[5], at[53]);    MULADD(at[6], at[52]);    MULADD(at[7], at[51]);    MULADD(at[8], at[50]);    MULADD(at[9], at[49]);    MULADD(at[10], at[48]);    MULADD(at[11], at[47]);    MULADD(at[12], at[46]);    MULADD(at[13], at[45]);    MULADD(at[14], at[44]);    MULADD(at[15], at[43]);    MULADD(at[16], at[42]);    MULADD(at[17], at[41]);    MULADD(at[18], at[40]);    MULADD(at[19], at[39]);    MULADD(at[20], at[38]);    MULADD(at[21], at[37]);    MULADD(at[22], at[36]);    MULADD(at[23], at[35]);    MULADD(at[24], at[34]);    MULADD(at[25], at[33]);    MULADD(at[26], at[32]); 
   497    COMBA_STORE(C->dp[26]);
   498    /* 27 */
   499    COMBA_FORWARD;
   500    MULADD(at[0], at[59]);    MULADD(at[1], at[58]);    MULADD(at[2], at[57]);    MULADD(at[3], at[56]);    MULADD(at[4], at[55]);    MULADD(at[5], at[54]);    MULADD(at[6], at[53]);    MULADD(at[7], at[52]);    MULADD(at[8], at[51]);    MULADD(at[9], at[50]);    MULADD(at[10], at[49]);    MULADD(at[11], at[48]);    MULADD(at[12], at[47]);    MULADD(at[13], at[46]);    MULADD(at[14], at[45]);    MULADD(at[15], at[44]);    MULADD(at[16], at[43]);    MULADD(at[17], at[42]);    MULADD(at[18], at[41]);    MULADD(at[19], at[40]);    MULADD(at[20], at[39]);    MULADD(at[21], at[38]);    MULADD(at[22], at[37]);    MULADD(at[23], at[36]);    MULADD(at[24], at[35]);    MULADD(at[25], at[34]);    MULADD(at[26], at[33]);    MULADD(at[27], at[32]); 
   501    COMBA_STORE(C->dp[27]);
   502    /* 28 */
   503    COMBA_FORWARD;
   504    MULADD(at[0], at[60]);    MULADD(at[1], at[59]);    MULADD(at[2], at[58]);    MULADD(at[3], at[57]);    MULADD(at[4], at[56]);    MULADD(at[5], at[55]);    MULADD(at[6], at[54]);    MULADD(at[7], at[53]);    MULADD(at[8], at[52]);    MULADD(at[9], at[51]);    MULADD(at[10], at[50]);    MULADD(at[11], at[49]);    MULADD(at[12], at[48]);    MULADD(at[13], at[47]);    MULADD(at[14], at[46]);    MULADD(at[15], at[45]);    MULADD(at[16], at[44]);    MULADD(at[17], at[43]);    MULADD(at[18], at[42]);    MULADD(at[19], at[41]);    MULADD(at[20], at[40]);    MULADD(at[21], at[39]);    MULADD(at[22], at[38]);    MULADD(at[23], at[37]);    MULADD(at[24], at[36]);    MULADD(at[25], at[35]);    MULADD(at[26], at[34]);    MULADD(at[27], at[33]);    MULADD(at[28], at[32]); 
   505    COMBA_STORE(C->dp[28]);
   506    /* 29 */
   507    COMBA_FORWARD;
   508    MULADD(at[0], at[61]);    MULADD(at[1], at[60]);    MULADD(at[2], at[59]);    MULADD(at[3], at[58]);    MULADD(at[4], at[57]);    MULADD(at[5], at[56]);    MULADD(at[6], at[55]);    MULADD(at[7], at[54]);    MULADD(at[8], at[53]);    MULADD(at[9], at[52]);    MULADD(at[10], at[51]);    MULADD(at[11], at[50]);    MULADD(at[12], at[49]);    MULADD(at[13], at[48]);    MULADD(at[14], at[47]);    MULADD(at[15], at[46]);    MULADD(at[16], at[45]);    MULADD(at[17], at[44]);    MULADD(at[18], at[43]);    MULADD(at[19], at[42]);    MULADD(at[20], at[41]);    MULADD(at[21], at[40]);    MULADD(at[22], at[39]);    MULADD(at[23], at[38]);    MULADD(at[24], at[37]);    MULADD(at[25], at[36]);    MULADD(at[26], at[35]);    MULADD(at[27], at[34]);    MULADD(at[28], at[33]);    MULADD(at[29], at[32]); 
   509    COMBA_STORE(C->dp[29]);
   510    /* 30 */
   511    COMBA_FORWARD;
   512    MULADD(at[0], at[62]);    MULADD(at[1], at[61]);    MULADD(at[2], at[60]);    MULADD(at[3], at[59]);    MULADD(at[4], at[58]);    MULADD(at[5], at[57]);    MULADD(at[6], at[56]);    MULADD(at[7], at[55]);    MULADD(at[8], at[54]);    MULADD(at[9], at[53]);    MULADD(at[10], at[52]);    MULADD(at[11], at[51]);    MULADD(at[12], at[50]);    MULADD(at[13], at[49]);    MULADD(at[14], at[48]);    MULADD(at[15], at[47]);    MULADD(at[16], at[46]);    MULADD(at[17], at[45]);    MULADD(at[18], at[44]);    MULADD(at[19], at[43]);    MULADD(at[20], at[42]);    MULADD(at[21], at[41]);    MULADD(at[22], at[40]);    MULADD(at[23], at[39]);    MULADD(at[24], at[38]);    MULADD(at[25], at[37]);    MULADD(at[26], at[36]);    MULADD(at[27], at[35]);    MULADD(at[28], at[34]);    MULADD(at[29], at[33]);    MULADD(at[30], at[32]); 
   513    COMBA_STORE(C->dp[30]);
   514    /* 31 */
   515    COMBA_FORWARD;
   516    MULADD(at[0], at[63]);    MULADD(at[1], at[62]);    MULADD(at[2], at[61]);    MULADD(at[3], at[60]);    MULADD(at[4], at[59]);    MULADD(at[5], at[58]);    MULADD(at[6], at[57]);    MULADD(at[7], at[56]);    MULADD(at[8], at[55]);    MULADD(at[9], at[54]);    MULADD(at[10], at[53]);    MULADD(at[11], at[52]);    MULADD(at[12], at[51]);    MULADD(at[13], at[50]);    MULADD(at[14], at[49]);    MULADD(at[15], at[48]);    MULADD(at[16], at[47]);    MULADD(at[17], at[46]);    MULADD(at[18], at[45]);    MULADD(at[19], at[44]);    MULADD(at[20], at[43]);    MULADD(at[21], at[42]);    MULADD(at[22], at[41]);    MULADD(at[23], at[40]);    MULADD(at[24], at[39]);    MULADD(at[25], at[38]);    MULADD(at[26], at[37]);    MULADD(at[27], at[36]);    MULADD(at[28], at[35]);    MULADD(at[29], at[34]);    MULADD(at[30], at[33]);    MULADD(at[31], at[32]); 
   517    COMBA_STORE(C->dp[31]);
   518    /* 32 */
   519    COMBA_FORWARD;
   520    MULADD(at[1], at[63]);    MULADD(at[2], at[62]);    MULADD(at[3], at[61]);    MULADD(at[4], at[60]);    MULADD(at[5], at[59]);    MULADD(at[6], at[58]);    MULADD(at[7], at[57]);    MULADD(at[8], at[56]);    MULADD(at[9], at[55]);    MULADD(at[10], at[54]);    MULADD(at[11], at[53]);    MULADD(at[12], at[52]);    MULADD(at[13], at[51]);    MULADD(at[14], at[50]);    MULADD(at[15], at[49]);    MULADD(at[16], at[48]);    MULADD(at[17], at[47]);    MULADD(at[18], at[46]);    MULADD(at[19], at[45]);    MULADD(at[20], at[44]);    MULADD(at[21], at[43]);    MULADD(at[22], at[42]);    MULADD(at[23], at[41]);    MULADD(at[24], at[40]);    MULADD(at[25], at[39]);    MULADD(at[26], at[38]);    MULADD(at[27], at[37]);    MULADD(at[28], at[36]);    MULADD(at[29], at[35]);    MULADD(at[30], at[34]);    MULADD(at[31], at[33]); 
   521    COMBA_STORE(C->dp[32]);
   522    /* 33 */
   523    COMBA_FORWARD;
   524    MULADD(at[2], at[63]);    MULADD(at[3], at[62]);    MULADD(at[4], at[61]);    MULADD(at[5], at[60]);    MULADD(at[6], at[59]);    MULADD(at[7], at[58]);    MULADD(at[8], at[57]);    MULADD(at[9], at[56]);    MULADD(at[10], at[55]);    MULADD(at[11], at[54]);    MULADD(at[12], at[53]);    MULADD(at[13], at[52]);    MULADD(at[14], at[51]);    MULADD(at[15], at[50]);    MULADD(at[16], at[49]);    MULADD(at[17], at[48]);    MULADD(at[18], at[47]);    MULADD(at[19], at[46]);    MULADD(at[20], at[45]);    MULADD(at[21], at[44]);    MULADD(at[22], at[43]);    MULADD(at[23], at[42]);    MULADD(at[24], at[41]);    MULADD(at[25], at[40]);    MULADD(at[26], at[39]);    MULADD(at[27], at[38]);    MULADD(at[28], at[37]);    MULADD(at[29], at[36]);    MULADD(at[30], at[35]);    MULADD(at[31], at[34]); 
   525    COMBA_STORE(C->dp[33]);
   526    /* 34 */
   527    COMBA_FORWARD;
   528    MULADD(at[3], at[63]);    MULADD(at[4], at[62]);    MULADD(at[5], at[61]);    MULADD(at[6], at[60]);    MULADD(at[7], at[59]);    MULADD(at[8], at[58]);    MULADD(at[9], at[57]);    MULADD(at[10], at[56]);    MULADD(at[11], at[55]);    MULADD(at[12], at[54]);    MULADD(at[13], at[53]);    MULADD(at[14], at[52]);    MULADD(at[15], at[51]);    MULADD(at[16], at[50]);    MULADD(at[17], at[49]);    MULADD(at[18], at[48]);    MULADD(at[19], at[47]);    MULADD(at[20], at[46]);    MULADD(at[21], at[45]);    MULADD(at[22], at[44]);    MULADD(at[23], at[43]);    MULADD(at[24], at[42]);    MULADD(at[25], at[41]);    MULADD(at[26], at[40]);    MULADD(at[27], at[39]);    MULADD(at[28], at[38]);    MULADD(at[29], at[37]);    MULADD(at[30], at[36]);    MULADD(at[31], at[35]); 
   529    COMBA_STORE(C->dp[34]);
   530    /* 35 */
   531    COMBA_FORWARD;
   532    MULADD(at[4], at[63]);    MULADD(at[5], at[62]);    MULADD(at[6], at[61]);    MULADD(at[7], at[60]);    MULADD(at[8], at[59]);    MULADD(at[9], at[58]);    MULADD(at[10], at[57]);    MULADD(at[11], at[56]);    MULADD(at[12], at[55]);    MULADD(at[13], at[54]);    MULADD(at[14], at[53]);    MULADD(at[15], at[52]);    MULADD(at[16], at[51]);    MULADD(at[17], at[50]);    MULADD(at[18], at[49]);    MULADD(at[19], at[48]);    MULADD(at[20], at[47]);    MULADD(at[21], at[46]);    MULADD(at[22], at[45]);    MULADD(at[23], at[44]);    MULADD(at[24], at[43]);    MULADD(at[25], at[42]);    MULADD(at[26], at[41]);    MULADD(at[27], at[40]);    MULADD(at[28], at[39]);    MULADD(at[29], at[38]);    MULADD(at[30], at[37]);    MULADD(at[31], at[36]); 
   533    COMBA_STORE(C->dp[35]);
   534    /* 36 */
   535    COMBA_FORWARD;
   536    MULADD(at[5], at[63]);    MULADD(at[6], at[62]);    MULADD(at[7], at[61]);    MULADD(at[8], at[60]);    MULADD(at[9], at[59]);    MULADD(at[10], at[58]);    MULADD(at[11], at[57]);    MULADD(at[12], at[56]);    MULADD(at[13], at[55]);    MULADD(at[14], at[54]);    MULADD(at[15], at[53]);    MULADD(at[16], at[52]);    MULADD(at[17], at[51]);    MULADD(at[18], at[50]);    MULADD(at[19], at[49]);    MULADD(at[20], at[48]);    MULADD(at[21], at[47]);    MULADD(at[22], at[46]);    MULADD(at[23], at[45]);    MULADD(at[24], at[44]);    MULADD(at[25], at[43]);    MULADD(at[26], at[42]);    MULADD(at[27], at[41]);    MULADD(at[28], at[40]);    MULADD(at[29], at[39]);    MULADD(at[30], at[38]);    MULADD(at[31], at[37]); 
   537    COMBA_STORE(C->dp[36]);
   538    /* 37 */
   539    COMBA_FORWARD;
   540    MULADD(at[6], at[63]);    MULADD(at[7], at[62]);    MULADD(at[8], at[61]);    MULADD(at[9], at[60]);    MULADD(at[10], at[59]);    MULADD(at[11], at[58]);    MULADD(at[12], at[57]);    MULADD(at[13], at[56]);    MULADD(at[14], at[55]);    MULADD(at[15], at[54]);    MULADD(at[16], at[53]);    MULADD(at[17], at[52]);    MULADD(at[18], at[51]);    MULADD(at[19], at[50]);    MULADD(at[20], at[49]);    MULADD(at[21], at[48]);    MULADD(at[22], at[47]);    MULADD(at[23], at[46]);    MULADD(at[24], at[45]);    MULADD(at[25], at[44]);    MULADD(at[26], at[43]);    MULADD(at[27], at[42]);    MULADD(at[28], at[41]);    MULADD(at[29], at[40]);    MULADD(at[30], at[39]);    MULADD(at[31], at[38]); 
   541    COMBA_STORE(C->dp[37]);
   542    /* 38 */
   543    COMBA_FORWARD;
   544    MULADD(at[7], at[63]);    MULADD(at[8], at[62]);    MULADD(at[9], at[61]);    MULADD(at[10], at[60]);    MULADD(at[11], at[59]);    MULADD(at[12], at[58]);    MULADD(at[13], at[57]);    MULADD(at[14], at[56]);    MULADD(at[15], at[55]);    MULADD(at[16], at[54]);    MULADD(at[17], at[53]);    MULADD(at[18], at[52]);    MULADD(at[19], at[51]);    MULADD(at[20], at[50]);    MULADD(at[21], at[49]);    MULADD(at[22], at[48]);    MULADD(at[23], at[47]);    MULADD(at[24], at[46]);    MULADD(at[25], at[45]);    MULADD(at[26], at[44]);    MULADD(at[27], at[43]);    MULADD(at[28], at[42]);    MULADD(at[29], at[41]);    MULADD(at[30], at[40]);    MULADD(at[31], at[39]); 
   545    COMBA_STORE(C->dp[38]);
   546    /* 39 */
   547    COMBA_FORWARD;
   548    MULADD(at[8], at[63]);    MULADD(at[9], at[62]);    MULADD(at[10], at[61]);    MULADD(at[11], at[60]);    MULADD(at[12], at[59]);    MULADD(at[13], at[58]);    MULADD(at[14], at[57]);    MULADD(at[15], at[56]);    MULADD(at[16], at[55]);    MULADD(at[17], at[54]);    MULADD(at[18], at[53]);    MULADD(at[19], at[52]);    MULADD(at[20], at[51]);    MULADD(at[21], at[50]);    MULADD(at[22], at[49]);    MULADD(at[23], at[48]);    MULADD(at[24], at[47]);    MULADD(at[25], at[46]);    MULADD(at[26], at[45]);    MULADD(at[27], at[44]);    MULADD(at[28], at[43]);    MULADD(at[29], at[42]);    MULADD(at[30], at[41]);    MULADD(at[31], at[40]); 
   549    COMBA_STORE(C->dp[39]);
   550    /* 40 */
   551    COMBA_FORWARD;
   552    MULADD(at[9], at[63]);    MULADD(at[10], at[62]);    MULADD(at[11], at[61]);    MULADD(at[12], at[60]);    MULADD(at[13], at[59]);    MULADD(at[14], at[58]);    MULADD(at[15], at[57]);    MULADD(at[16], at[56]);    MULADD(at[17], at[55]);    MULADD(at[18], at[54]);    MULADD(at[19], at[53]);    MULADD(at[20], at[52]);    MULADD(at[21], at[51]);    MULADD(at[22], at[50]);    MULADD(at[23], at[49]);    MULADD(at[24], at[48]);    MULADD(at[25], at[47]);    MULADD(at[26], at[46]);    MULADD(at[27], at[45]);    MULADD(at[28], at[44]);    MULADD(at[29], at[43]);    MULADD(at[30], at[42]);    MULADD(at[31], at[41]); 
   553    COMBA_STORE(C->dp[40]);
   554    /* 41 */
   555    COMBA_FORWARD;
   556    MULADD(at[10], at[63]);    MULADD(at[11], at[62]);    MULADD(at[12], at[61]);    MULADD(at[13], at[60]);    MULADD(at[14], at[59]);    MULADD(at[15], at[58]);    MULADD(at[16], at[57]);    MULADD(at[17], at[56]);    MULADD(at[18], at[55]);    MULADD(at[19], at[54]);    MULADD(at[20], at[53]);    MULADD(at[21], at[52]);    MULADD(at[22], at[51]);    MULADD(at[23], at[50]);    MULADD(at[24], at[49]);    MULADD(at[25], at[48]);    MULADD(at[26], at[47]);    MULADD(at[27], at[46]);    MULADD(at[28], at[45]);    MULADD(at[29], at[44]);    MULADD(at[30], at[43]);    MULADD(at[31], at[42]); 
   557    COMBA_STORE(C->dp[41]);
   558    /* 42 */
   559    COMBA_FORWARD;
   560    MULADD(at[11], at[63]);    MULADD(at[12], at[62]);    MULADD(at[13], at[61]);    MULADD(at[14], at[60]);    MULADD(at[15], at[59]);    MULADD(at[16], at[58]);    MULADD(at[17], at[57]);    MULADD(at[18], at[56]);    MULADD(at[19], at[55]);    MULADD(at[20], at[54]);    MULADD(at[21], at[53]);    MULADD(at[22], at[52]);    MULADD(at[23], at[51]);    MULADD(at[24], at[50]);    MULADD(at[25], at[49]);    MULADD(at[26], at[48]);    MULADD(at[27], at[47]);    MULADD(at[28], at[46]);    MULADD(at[29], at[45]);    MULADD(at[30], at[44]);    MULADD(at[31], at[43]); 
   561    COMBA_STORE(C->dp[42]);
   562    /* 43 */
   563    COMBA_FORWARD;
   564    MULADD(at[12], at[63]);    MULADD(at[13], at[62]);    MULADD(at[14], at[61]);    MULADD(at[15], at[60]);    MULADD(at[16], at[59]);    MULADD(at[17], at[58]);    MULADD(at[18], at[57]);    MULADD(at[19], at[56]);    MULADD(at[20], at[55]);    MULADD(at[21], at[54]);    MULADD(at[22], at[53]);    MULADD(at[23], at[52]);    MULADD(at[24], at[51]);    MULADD(at[25], at[50]);    MULADD(at[26], at[49]);    MULADD(at[27], at[48]);    MULADD(at[28], at[47]);    MULADD(at[29], at[46]);    MULADD(at[30], at[45]);    MULADD(at[31], at[44]); 
   565    COMBA_STORE(C->dp[43]);
   566    /* 44 */
   567    COMBA_FORWARD;
   568    MULADD(at[13], at[63]);    MULADD(at[14], at[62]);    MULADD(at[15], at[61]);    MULADD(at[16], at[60]);    MULADD(at[17], at[59]);    MULADD(at[18], at[58]);    MULADD(at[19], at[57]);    MULADD(at[20], at[56]);    MULADD(at[21], at[55]);    MULADD(at[22], at[54]);    MULADD(at[23], at[53]);    MULADD(at[24], at[52]);    MULADD(at[25], at[51]);    MULADD(at[26], at[50]);    MULADD(at[27], at[49]);    MULADD(at[28], at[48]);    MULADD(at[29], at[47]);    MULADD(at[30], at[46]);    MULADD(at[31], at[45]); 
   569    COMBA_STORE(C->dp[44]);
   570    /* 45 */
   571    COMBA_FORWARD;
   572    MULADD(at[14], at[63]);    MULADD(at[15], at[62]);    MULADD(at[16], at[61]);    MULADD(at[17], at[60]);    MULADD(at[18], at[59]);    MULADD(at[19], at[58]);    MULADD(at[20], at[57]);    MULADD(at[21], at[56]);    MULADD(at[22], at[55]);    MULADD(at[23], at[54]);    MULADD(at[24], at[53]);    MULADD(at[25], at[52]);    MULADD(at[26], at[51]);    MULADD(at[27], at[50]);    MULADD(at[28], at[49]);    MULADD(at[29], at[48]);    MULADD(at[30], at[47]);    MULADD(at[31], at[46]); 
   573    COMBA_STORE(C->dp[45]);
   574    /* 46 */
   575    COMBA_FORWARD;
   576    MULADD(at[15], at[63]);    MULADD(at[16], at[62]);    MULADD(at[17], at[61]);    MULADD(at[18], at[60]);    MULADD(at[19], at[59]);    MULADD(at[20], at[58]);    MULADD(at[21], at[57]);    MULADD(at[22], at[56]);    MULADD(at[23], at[55]);    MULADD(at[24], at[54]);    MULADD(at[25], at[53]);    MULADD(at[26], at[52]);    MULADD(at[27], at[51]);    MULADD(at[28], at[50]);    MULADD(at[29], at[49]);    MULADD(at[30], at[48]);    MULADD(at[31], at[47]); 
   577    COMBA_STORE(C->dp[46]);
   578    /* 47 */
   579    COMBA_FORWARD;
   580    MULADD(at[16], at[63]);    MULADD(at[17], at[62]);    MULADD(at[18], at[61]);    MULADD(at[19], at[60]);    MULADD(at[20], at[59]);    MULADD(at[21], at[58]);    MULADD(at[22], at[57]);    MULADD(at[23], at[56]);    MULADD(at[24], at[55]);    MULADD(at[25], at[54]);    MULADD(at[26], at[53]);    MULADD(at[27], at[52]);    MULADD(at[28], at[51]);    MULADD(at[29], at[50]);    MULADD(at[30], at[49]);    MULADD(at[31], at[48]); 
   581    COMBA_STORE(C->dp[47]);
   582    /* 48 */
   583    COMBA_FORWARD;
   584    MULADD(at[17], at[63]);    MULADD(at[18], at[62]);    MULADD(at[19], at[61]);    MULADD(at[20], at[60]);    MULADD(at[21], at[59]);    MULADD(at[22], at[58]);    MULADD(at[23], at[57]);    MULADD(at[24], at[56]);    MULADD(at[25], at[55]);    MULADD(at[26], at[54]);    MULADD(at[27], at[53]);    MULADD(at[28], at[52]);    MULADD(at[29], at[51]);    MULADD(at[30], at[50]);    MULADD(at[31], at[49]); 
   585    COMBA_STORE(C->dp[48]);
   586    /* 49 */
   587    COMBA_FORWARD;
   588    MULADD(at[18], at[63]);    MULADD(at[19], at[62]);    MULADD(at[20], at[61]);    MULADD(at[21], at[60]);    MULADD(at[22], at[59]);    MULADD(at[23], at[58]);    MULADD(at[24], at[57]);    MULADD(at[25], at[56]);    MULADD(at[26], at[55]);    MULADD(at[27], at[54]);    MULADD(at[28], at[53]);    MULADD(at[29], at[52]);    MULADD(at[30], at[51]);    MULADD(at[31], at[50]); 
   589    COMBA_STORE(C->dp[49]);
   590    /* 50 */
   591    COMBA_FORWARD;
   592    MULADD(at[19], at[63]);    MULADD(at[20], at[62]);    MULADD(at[21], at[61]);    MULADD(at[22], at[60]);    MULADD(at[23], at[59]);    MULADD(at[24], at[58]);    MULADD(at[25], at[57]);    MULADD(at[26], at[56]);    MULADD(at[27], at[55]);    MULADD(at[28], at[54]);    MULADD(at[29], at[53]);    MULADD(at[30], at[52]);    MULADD(at[31], at[51]); 
   593    COMBA_STORE(C->dp[50]);
   594    /* 51 */
   595    COMBA_FORWARD;
   596    MULADD(at[20], at[63]);    MULADD(at[21], at[62]);    MULADD(at[22], at[61]);    MULADD(at[23], at[60]);    MULADD(at[24], at[59]);    MULADD(at[25], at[58]);    MULADD(at[26], at[57]);    MULADD(at[27], at[56]);    MULADD(at[28], at[55]);    MULADD(at[29], at[54]);    MULADD(at[30], at[53]);    MULADD(at[31], at[52]); 
   597    COMBA_STORE(C->dp[51]);
   598    /* 52 */
   599    COMBA_FORWARD;
   600    MULADD(at[21], at[63]);    MULADD(at[22], at[62]);    MULADD(at[23], at[61]);    MULADD(at[24], at[60]);    MULADD(at[25], at[59]);    MULADD(at[26], at[58]);    MULADD(at[27], at[57]);    MULADD(at[28], at[56]);    MULADD(at[29], at[55]);    MULADD(at[30], at[54]);    MULADD(at[31], at[53]); 
   601    COMBA_STORE(C->dp[52]);
   602    /* 53 */
   603    COMBA_FORWARD;
   604    MULADD(at[22], at[63]);    MULADD(at[23], at[62]);    MULADD(at[24], at[61]);    MULADD(at[25], at[60]);    MULADD(at[26], at[59]);    MULADD(at[27], at[58]);    MULADD(at[28], at[57]);    MULADD(at[29], at[56]);    MULADD(at[30], at[55]);    MULADD(at[31], at[54]); 
   605    COMBA_STORE(C->dp[53]);
   606    /* 54 */
   607    COMBA_FORWARD;
   608    MULADD(at[23], at[63]);    MULADD(at[24], at[62]);    MULADD(at[25], at[61]);    MULADD(at[26], at[60]);    MULADD(at[27], at[59]);    MULADD(at[28], at[58]);    MULADD(at[29], at[57]);    MULADD(at[30], at[56]);    MULADD(at[31], at[55]); 
   609    COMBA_STORE(C->dp[54]);
   610    /* 55 */
   611    COMBA_FORWARD;
   612    MULADD(at[24], at[63]);    MULADD(at[25], at[62]);    MULADD(at[26], at[61]);    MULADD(at[27], at[60]);    MULADD(at[28], at[59]);    MULADD(at[29], at[58]);    MULADD(at[30], at[57]);    MULADD(at[31], at[56]); 
   613    COMBA_STORE(C->dp[55]);
   614    /* 56 */
   615    COMBA_FORWARD;
   616    MULADD(at[25], at[63]);    MULADD(at[26], at[62]);    MULADD(at[27], at[61]);    MULADD(at[28], at[60]);    MULADD(at[29], at[59]);    MULADD(at[30], at[58]);    MULADD(at[31], at[57]); 
   617    COMBA_STORE(C->dp[56]);
   618    /* 57 */
   619    COMBA_FORWARD;
   620    MULADD(at[26], at[63]);    MULADD(at[27], at[62]);    MULADD(at[28], at[61]);    MULADD(at[29], at[60]);    MULADD(at[30], at[59]);    MULADD(at[31], at[58]); 
   621    COMBA_STORE(C->dp[57]);
   622    /* 58 */
   623    COMBA_FORWARD;
   624    MULADD(at[27], at[63]);    MULADD(at[28], at[62]);    MULADD(at[29], at[61]);    MULADD(at[30], at[60]);    MULADD(at[31], at[59]); 
   625    COMBA_STORE(C->dp[58]);
   626    /* 59 */
   627    COMBA_FORWARD;
   628    MULADD(at[28], at[63]);    MULADD(at[29], at[62]);    MULADD(at[30], at[61]);    MULADD(at[31], at[60]); 
   629    COMBA_STORE(C->dp[59]);
   630    /* 60 */
   631    COMBA_FORWARD;
   632    MULADD(at[29], at[63]);    MULADD(at[30], at[62]);    MULADD(at[31], at[61]); 
   633    COMBA_STORE(C->dp[60]);
   634    /* 61 */
   635    COMBA_FORWARD;
   636    MULADD(at[30], at[63]);    MULADD(at[31], at[62]); 
   637    COMBA_STORE(C->dp[61]);
   638    /* 62 */
   639    COMBA_FORWARD;
   640    MULADD(at[31], at[63]); 
   641    COMBA_STORE(C->dp[62]);
   642    COMBA_STORE2(C->dp[63]);
   643    C->used = 64;
   644    C->sign = A->sign ^ B->sign;
   645    mp_clamp(C);
   646    COMBA_FINI;
   647 }
   651 void s_mp_sqr_comba_4(const mp_int *A, mp_int *B)
   652 {
   653    mp_digit *a, b[8], c0, c1, c2;
   655    a = A->dp;
   656    COMBA_START; 
   658    /* clear carries */
   659    CLEAR_CARRY;
   661    /* output 0 */
   662    SQRADD(a[0],a[0]);
   663    COMBA_STORE(b[0]);
   665    /* output 1 */
   666    CARRY_FORWARD;
   667    SQRADD2(a[0], a[1]); 
   668    COMBA_STORE(b[1]);
   670    /* output 2 */
   671    CARRY_FORWARD;
   672    SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
   673    COMBA_STORE(b[2]);
   675    /* output 3 */
   676    CARRY_FORWARD;
   677    SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
   678    COMBA_STORE(b[3]);
   680    /* output 4 */
   681    CARRY_FORWARD;
   682    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
   683    COMBA_STORE(b[4]);
   685    /* output 5 */
   686    CARRY_FORWARD;
   687    SQRADD2(a[2], a[3]); 
   688    COMBA_STORE(b[5]);
   690    /* output 6 */
   691    CARRY_FORWARD;
   692    SQRADD(a[3], a[3]); 
   693    COMBA_STORE(b[6]);
   694    COMBA_STORE2(b[7]);
   695    COMBA_FINI;
   697    B->used = 8;
   698    B->sign = ZPOS;
   699    memcpy(B->dp, b, 8 * sizeof(mp_digit));
   700    mp_clamp(B);
   701 }
   703 void s_mp_sqr_comba_8(const mp_int *A, mp_int *B)
   704 {
   705    mp_digit *a, b[16], c0, c1, c2, sc0, sc1, sc2;
   707    a = A->dp;
   708    COMBA_START; 
   710    /* clear carries */
   711    CLEAR_CARRY;
   713    /* output 0 */
   714    SQRADD(a[0],a[0]);
   715    COMBA_STORE(b[0]);
   717    /* output 1 */
   718    CARRY_FORWARD;
   719    SQRADD2(a[0], a[1]); 
   720    COMBA_STORE(b[1]);
   722    /* output 2 */
   723    CARRY_FORWARD;
   724    SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
   725    COMBA_STORE(b[2]);
   727    /* output 3 */
   728    CARRY_FORWARD;
   729    SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
   730    COMBA_STORE(b[3]);
   732    /* output 4 */
   733    CARRY_FORWARD;
   734    SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
   735    COMBA_STORE(b[4]);
   737    /* output 5 */
   738    CARRY_FORWARD;
   739    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 
   740    COMBA_STORE(b[5]);
   742    /* output 6 */
   743    CARRY_FORWARD;
   744    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 
   745    COMBA_STORE(b[6]);
   747    /* output 7 */
   748    CARRY_FORWARD;
   749    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 
   750    COMBA_STORE(b[7]);
   752    /* output 8 */
   753    CARRY_FORWARD;
   754    SQRADDSC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); 
   755    COMBA_STORE(b[8]);
   757    /* output 9 */
   758    CARRY_FORWARD;
   759    SQRADDSC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; 
   760    COMBA_STORE(b[9]);
   762    /* output 10 */
   763    CARRY_FORWARD;
   764    SQRADD2(a[3], a[7]);    SQRADD2(a[4], a[6]);    SQRADD(a[5], a[5]); 
   765    COMBA_STORE(b[10]);
   767    /* output 11 */
   768    CARRY_FORWARD;
   769    SQRADD2(a[4], a[7]);    SQRADD2(a[5], a[6]); 
   770    COMBA_STORE(b[11]);
   772    /* output 12 */
   773    CARRY_FORWARD;
   774    SQRADD2(a[5], a[7]);    SQRADD(a[6], a[6]); 
   775    COMBA_STORE(b[12]);
   777    /* output 13 */
   778    CARRY_FORWARD;
   779    SQRADD2(a[6], a[7]); 
   780    COMBA_STORE(b[13]);
   782    /* output 14 */
   783    CARRY_FORWARD;
   784    SQRADD(a[7], a[7]); 
   785    COMBA_STORE(b[14]);
   786    COMBA_STORE2(b[15]);
   787    COMBA_FINI;
   789    B->used = 16;
   790    B->sign = ZPOS;
   791    memcpy(B->dp, b, 16 * sizeof(mp_digit));
   792    mp_clamp(B);
   793 }
   795 void s_mp_sqr_comba_16(const mp_int *A, mp_int *B)
   796 {
   797    mp_digit *a, b[32], c0, c1, c2, sc0, sc1, sc2;
   799    a = A->dp;
   800    COMBA_START; 
   802    /* clear carries */
   803    CLEAR_CARRY;
   805    /* output 0 */
   806    SQRADD(a[0],a[0]);
   807    COMBA_STORE(b[0]);
   809    /* output 1 */
   810    CARRY_FORWARD;
   811    SQRADD2(a[0], a[1]); 
   812    COMBA_STORE(b[1]);
   814    /* output 2 */
   815    CARRY_FORWARD;
   816    SQRADD2(a[0], a[2]);    SQRADD(a[1], a[1]); 
   817    COMBA_STORE(b[2]);
   819    /* output 3 */
   820    CARRY_FORWARD;
   821    SQRADD2(a[0], a[3]);    SQRADD2(a[1], a[2]); 
   822    COMBA_STORE(b[3]);
   824    /* output 4 */
   825    CARRY_FORWARD;
   826    SQRADD2(a[0], a[4]);    SQRADD2(a[1], a[3]);    SQRADD(a[2], a[2]); 
   827    COMBA_STORE(b[4]);
   829    /* output 5 */
   830    CARRY_FORWARD;
   831    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 
   832    COMBA_STORE(b[5]);
   834    /* output 6 */
   835    CARRY_FORWARD;
   836    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 
   837    COMBA_STORE(b[6]);
   839    /* output 7 */
   840    CARRY_FORWARD;
   841    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 
   842    COMBA_STORE(b[7]);
   844    /* output 8 */
   845    CARRY_FORWARD;
   846    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); 
   847    COMBA_STORE(b[8]);
   849    /* output 9 */
   850    CARRY_FORWARD;
   851    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; 
   852    COMBA_STORE(b[9]);
   854    /* output 10 */
   855    CARRY_FORWARD;
   856    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); 
   857    COMBA_STORE(b[10]);
   859    /* output 11 */
   860    CARRY_FORWARD;
   861    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; 
   862    COMBA_STORE(b[11]);
   864    /* output 12 */
   865    CARRY_FORWARD;
   866    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); 
   867    COMBA_STORE(b[12]);
   869    /* output 13 */
   870    CARRY_FORWARD;
   871    SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; 
   872    COMBA_STORE(b[13]);
   874    /* output 14 */
   875    CARRY_FORWARD;
   876    SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]); 
   877    COMBA_STORE(b[14]);
   879    /* output 15 */
   880    CARRY_FORWARD;
   881    SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB; 
   882    COMBA_STORE(b[15]);
   884    /* output 16 */
   885    CARRY_FORWARD;
   886    SQRADDSC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]); 
   887    COMBA_STORE(b[16]);
   889    /* output 17 */
   890    CARRY_FORWARD;
   891    SQRADDSC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB; 
   892    COMBA_STORE(b[17]);
   894    /* output 18 */
   895    CARRY_FORWARD;
   896    SQRADDSC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]); 
   897    COMBA_STORE(b[18]);
   899    /* output 19 */
   900    CARRY_FORWARD;
   901    SQRADDSC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB; 
   902    COMBA_STORE(b[19]);
   904    /* output 20 */
   905    CARRY_FORWARD;
   906    SQRADDSC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]); 
   907    COMBA_STORE(b[20]);
   909    /* output 21 */
   910    CARRY_FORWARD;
   911    SQRADDSC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB; 
   912    COMBA_STORE(b[21]);
   914    /* output 22 */
   915    CARRY_FORWARD;
   916    SQRADDSC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]); 
   917    COMBA_STORE(b[22]);
   919    /* output 23 */
   920    CARRY_FORWARD;
   921    SQRADDSC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB; 
   922    COMBA_STORE(b[23]);
   924    /* output 24 */
   925    CARRY_FORWARD;
   926    SQRADDSC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]); 
   927    COMBA_STORE(b[24]);
   929    /* output 25 */
   930    CARRY_FORWARD;
   931    SQRADDSC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB; 
   932    COMBA_STORE(b[25]);
   934    /* output 26 */
   935    CARRY_FORWARD;
   936    SQRADD2(a[11], a[15]);    SQRADD2(a[12], a[14]);    SQRADD(a[13], a[13]); 
   937    COMBA_STORE(b[26]);
   939    /* output 27 */
   940    CARRY_FORWARD;
   941    SQRADD2(a[12], a[15]);    SQRADD2(a[13], a[14]); 
   942    COMBA_STORE(b[27]);
   944    /* output 28 */
   945    CARRY_FORWARD;
   946    SQRADD2(a[13], a[15]);    SQRADD(a[14], a[14]); 
   947    COMBA_STORE(b[28]);
   949    /* output 29 */
   950    CARRY_FORWARD;
   951    SQRADD2(a[14], a[15]); 
   952    COMBA_STORE(b[29]);
   954    /* output 30 */
   955    CARRY_FORWARD;
   956    SQRADD(a[15], a[15]); 
   957    COMBA_STORE(b[30]);
   958    COMBA_STORE2(b[31]);
   959    COMBA_FINI;
   961    B->used = 32;
   962    B->sign = ZPOS;
   963    memcpy(B->dp, b, 32 * sizeof(mp_digit));
   964    mp_clamp(B);
   965 }
   968 void s_mp_sqr_comba_32(const mp_int *A, mp_int *B)
   969 {
   970    mp_digit *a, b[64], c0, c1, c2, sc0, sc1, sc2;
   972    a = A->dp;
   973    COMBA_START; 
   975    /* clear carries */
   976    CLEAR_CARRY;
   978    /* output 0 */
   979    SQRADD(a[0],a[0]);
   980    COMBA_STORE(b[0]);
   982    /* output 1 */
   983    CARRY_FORWARD;
   984    SQRADD2(a[0], a[1]); 
   985    COMBA_STORE(b[1]);
   987    /* output 2 */
   988    CARRY_FORWARD;
   989    SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); 
   990    COMBA_STORE(b[2]);
   992    /* output 3 */
   993    CARRY_FORWARD;
   994    SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); 
   995    COMBA_STORE(b[3]);
   997    /* output 4 */
   998    CARRY_FORWARD;
   999    SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); 
  1000    COMBA_STORE(b[4]);
  1002    /* output 5 */
  1003    CARRY_FORWARD;
  1004    SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 
  1005    COMBA_STORE(b[5]);
  1007    /* output 6 */
  1008    CARRY_FORWARD;
  1009    SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 
  1010    COMBA_STORE(b[6]);
  1012    /* output 7 */
  1013    CARRY_FORWARD;
  1014    SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 
  1015    COMBA_STORE(b[7]);
  1017    /* output 8 */
  1018    CARRY_FORWARD;
  1019    SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); 
  1020    COMBA_STORE(b[8]);
  1022    /* output 9 */
  1023    CARRY_FORWARD;
  1024    SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; 
  1025    COMBA_STORE(b[9]);
  1027    /* output 10 */
  1028    CARRY_FORWARD;
  1029    SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); 
  1030    COMBA_STORE(b[10]);
  1032    /* output 11 */
  1033    CARRY_FORWARD;
  1034    SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; 
  1035    COMBA_STORE(b[11]);
  1037    /* output 12 */
  1038    CARRY_FORWARD;
  1039    SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); 
  1040    COMBA_STORE(b[12]);
  1042    /* output 13 */
  1043    CARRY_FORWARD;
  1044    SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; 
  1045    COMBA_STORE(b[13]);
  1047    /* output 14 */
  1048    CARRY_FORWARD;
  1049    SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]); 
  1050    COMBA_STORE(b[14]);
  1052    /* output 15 */
  1053    CARRY_FORWARD;
  1054    SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB; 
  1055    COMBA_STORE(b[15]);
  1057    /* output 16 */
  1058    CARRY_FORWARD;
  1059    SQRADDSC(a[0], a[16]); SQRADDAC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]); 
  1060    COMBA_STORE(b[16]);
  1062    /* output 17 */
  1063    CARRY_FORWARD;
  1064    SQRADDSC(a[0], a[17]); SQRADDAC(a[1], a[16]); SQRADDAC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB; 
  1065    COMBA_STORE(b[17]);
  1067    /* output 18 */
  1068    CARRY_FORWARD;
  1069    SQRADDSC(a[0], a[18]); SQRADDAC(a[1], a[17]); SQRADDAC(a[2], a[16]); SQRADDAC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]); 
  1070    COMBA_STORE(b[18]);
  1072    /* output 19 */
  1073    CARRY_FORWARD;
  1074    SQRADDSC(a[0], a[19]); SQRADDAC(a[1], a[18]); SQRADDAC(a[2], a[17]); SQRADDAC(a[3], a[16]); SQRADDAC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB; 
  1075    COMBA_STORE(b[19]);
  1077    /* output 20 */
  1078    CARRY_FORWARD;
  1079    SQRADDSC(a[0], a[20]); SQRADDAC(a[1], a[19]); SQRADDAC(a[2], a[18]); SQRADDAC(a[3], a[17]); SQRADDAC(a[4], a[16]); SQRADDAC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]); 
  1080    COMBA_STORE(b[20]);
  1082    /* output 21 */
  1083    CARRY_FORWARD;
  1084    SQRADDSC(a[0], a[21]); SQRADDAC(a[1], a[20]); SQRADDAC(a[2], a[19]); SQRADDAC(a[3], a[18]); SQRADDAC(a[4], a[17]); SQRADDAC(a[5], a[16]); SQRADDAC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB; 
  1085    COMBA_STORE(b[21]);
  1087    /* output 22 */
  1088    CARRY_FORWARD;
  1089    SQRADDSC(a[0], a[22]); SQRADDAC(a[1], a[21]); SQRADDAC(a[2], a[20]); SQRADDAC(a[3], a[19]); SQRADDAC(a[4], a[18]); SQRADDAC(a[5], a[17]); SQRADDAC(a[6], a[16]); SQRADDAC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]); 
  1090    COMBA_STORE(b[22]);
  1092    /* output 23 */
  1093    CARRY_FORWARD;
  1094    SQRADDSC(a[0], a[23]); SQRADDAC(a[1], a[22]); SQRADDAC(a[2], a[21]); SQRADDAC(a[3], a[20]); SQRADDAC(a[4], a[19]); SQRADDAC(a[5], a[18]); SQRADDAC(a[6], a[17]); SQRADDAC(a[7], a[16]); SQRADDAC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB; 
  1095    COMBA_STORE(b[23]);
  1097    /* output 24 */
  1098    CARRY_FORWARD;
  1099    SQRADDSC(a[0], a[24]); SQRADDAC(a[1], a[23]); SQRADDAC(a[2], a[22]); SQRADDAC(a[3], a[21]); SQRADDAC(a[4], a[20]); SQRADDAC(a[5], a[19]); SQRADDAC(a[6], a[18]); SQRADDAC(a[7], a[17]); SQRADDAC(a[8], a[16]); SQRADDAC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]); 
  1100    COMBA_STORE(b[24]);
  1102    /* output 25 */
  1103    CARRY_FORWARD;
  1104    SQRADDSC(a[0], a[25]); SQRADDAC(a[1], a[24]); SQRADDAC(a[2], a[23]); SQRADDAC(a[3], a[22]); SQRADDAC(a[4], a[21]); SQRADDAC(a[5], a[20]); SQRADDAC(a[6], a[19]); SQRADDAC(a[7], a[18]); SQRADDAC(a[8], a[17]); SQRADDAC(a[9], a[16]); SQRADDAC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB; 
  1105    COMBA_STORE(b[25]);
  1107    /* output 26 */
  1108    CARRY_FORWARD;
  1109    SQRADDSC(a[0], a[26]); SQRADDAC(a[1], a[25]); SQRADDAC(a[2], a[24]); SQRADDAC(a[3], a[23]); SQRADDAC(a[4], a[22]); SQRADDAC(a[5], a[21]); SQRADDAC(a[6], a[20]); SQRADDAC(a[7], a[19]); SQRADDAC(a[8], a[18]); SQRADDAC(a[9], a[17]); SQRADDAC(a[10], a[16]); SQRADDAC(a[11], a[15]); SQRADDAC(a[12], a[14]); SQRADDDB; SQRADD(a[13], a[13]); 
  1110    COMBA_STORE(b[26]);
  1112    /* output 27 */
  1113    CARRY_FORWARD;
  1114    SQRADDSC(a[0], a[27]); SQRADDAC(a[1], a[26]); SQRADDAC(a[2], a[25]); SQRADDAC(a[3], a[24]); SQRADDAC(a[4], a[23]); SQRADDAC(a[5], a[22]); SQRADDAC(a[6], a[21]); SQRADDAC(a[7], a[20]); SQRADDAC(a[8], a[19]); SQRADDAC(a[9], a[18]); SQRADDAC(a[10], a[17]); SQRADDAC(a[11], a[16]); SQRADDAC(a[12], a[15]); SQRADDAC(a[13], a[14]); SQRADDDB; 
  1115    COMBA_STORE(b[27]);
  1117    /* output 28 */
  1118    CARRY_FORWARD;
  1119    SQRADDSC(a[0], a[28]); SQRADDAC(a[1], a[27]); SQRADDAC(a[2], a[26]); SQRADDAC(a[3], a[25]); SQRADDAC(a[4], a[24]); SQRADDAC(a[5], a[23]); SQRADDAC(a[6], a[22]); SQRADDAC(a[7], a[21]); SQRADDAC(a[8], a[20]); SQRADDAC(a[9], a[19]); SQRADDAC(a[10], a[18]); SQRADDAC(a[11], a[17]); SQRADDAC(a[12], a[16]); SQRADDAC(a[13], a[15]); SQRADDDB; SQRADD(a[14], a[14]); 
  1120    COMBA_STORE(b[28]);
  1122    /* output 29 */
  1123    CARRY_FORWARD;
  1124    SQRADDSC(a[0], a[29]); SQRADDAC(a[1], a[28]); SQRADDAC(a[2], a[27]); SQRADDAC(a[3], a[26]); SQRADDAC(a[4], a[25]); SQRADDAC(a[5], a[24]); SQRADDAC(a[6], a[23]); SQRADDAC(a[7], a[22]); SQRADDAC(a[8], a[21]); SQRADDAC(a[9], a[20]); SQRADDAC(a[10], a[19]); SQRADDAC(a[11], a[18]); SQRADDAC(a[12], a[17]); SQRADDAC(a[13], a[16]); SQRADDAC(a[14], a[15]); SQRADDDB; 
  1125    COMBA_STORE(b[29]);
  1127    /* output 30 */
  1128    CARRY_FORWARD;
  1129    SQRADDSC(a[0], a[30]); SQRADDAC(a[1], a[29]); SQRADDAC(a[2], a[28]); SQRADDAC(a[3], a[27]); SQRADDAC(a[4], a[26]); SQRADDAC(a[5], a[25]); SQRADDAC(a[6], a[24]); SQRADDAC(a[7], a[23]); SQRADDAC(a[8], a[22]); SQRADDAC(a[9], a[21]); SQRADDAC(a[10], a[20]); SQRADDAC(a[11], a[19]); SQRADDAC(a[12], a[18]); SQRADDAC(a[13], a[17]); SQRADDAC(a[14], a[16]); SQRADDDB; SQRADD(a[15], a[15]); 
  1130    COMBA_STORE(b[30]);
  1132    /* output 31 */
  1133    CARRY_FORWARD;
  1134    SQRADDSC(a[0], a[31]); SQRADDAC(a[1], a[30]); SQRADDAC(a[2], a[29]); SQRADDAC(a[3], a[28]); SQRADDAC(a[4], a[27]); SQRADDAC(a[5], a[26]); SQRADDAC(a[6], a[25]); SQRADDAC(a[7], a[24]); SQRADDAC(a[8], a[23]); SQRADDAC(a[9], a[22]); SQRADDAC(a[10], a[21]); SQRADDAC(a[11], a[20]); SQRADDAC(a[12], a[19]); SQRADDAC(a[13], a[18]); SQRADDAC(a[14], a[17]); SQRADDAC(a[15], a[16]); SQRADDDB; 
  1135    COMBA_STORE(b[31]);
  1137    /* output 32 */
  1138    CARRY_FORWARD;
  1139    SQRADDSC(a[1], a[31]); SQRADDAC(a[2], a[30]); SQRADDAC(a[3], a[29]); SQRADDAC(a[4], a[28]); SQRADDAC(a[5], a[27]); SQRADDAC(a[6], a[26]); SQRADDAC(a[7], a[25]); SQRADDAC(a[8], a[24]); SQRADDAC(a[9], a[23]); SQRADDAC(a[10], a[22]); SQRADDAC(a[11], a[21]); SQRADDAC(a[12], a[20]); SQRADDAC(a[13], a[19]); SQRADDAC(a[14], a[18]); SQRADDAC(a[15], a[17]); SQRADDDB; SQRADD(a[16], a[16]); 
  1140    COMBA_STORE(b[32]);
  1142    /* output 33 */
  1143    CARRY_FORWARD;
  1144    SQRADDSC(a[2], a[31]); SQRADDAC(a[3], a[30]); SQRADDAC(a[4], a[29]); SQRADDAC(a[5], a[28]); SQRADDAC(a[6], a[27]); SQRADDAC(a[7], a[26]); SQRADDAC(a[8], a[25]); SQRADDAC(a[9], a[24]); SQRADDAC(a[10], a[23]); SQRADDAC(a[11], a[22]); SQRADDAC(a[12], a[21]); SQRADDAC(a[13], a[20]); SQRADDAC(a[14], a[19]); SQRADDAC(a[15], a[18]); SQRADDAC(a[16], a[17]); SQRADDDB; 
  1145    COMBA_STORE(b[33]);
  1147    /* output 34 */
  1148    CARRY_FORWARD;
  1149    SQRADDSC(a[3], a[31]); SQRADDAC(a[4], a[30]); SQRADDAC(a[5], a[29]); SQRADDAC(a[6], a[28]); SQRADDAC(a[7], a[27]); SQRADDAC(a[8], a[26]); SQRADDAC(a[9], a[25]); SQRADDAC(a[10], a[24]); SQRADDAC(a[11], a[23]); SQRADDAC(a[12], a[22]); SQRADDAC(a[13], a[21]); SQRADDAC(a[14], a[20]); SQRADDAC(a[15], a[19]); SQRADDAC(a[16], a[18]); SQRADDDB; SQRADD(a[17], a[17]); 
  1150    COMBA_STORE(b[34]);
  1152    /* output 35 */
  1153    CARRY_FORWARD;
  1154    SQRADDSC(a[4], a[31]); SQRADDAC(a[5], a[30]); SQRADDAC(a[6], a[29]); SQRADDAC(a[7], a[28]); SQRADDAC(a[8], a[27]); SQRADDAC(a[9], a[26]); SQRADDAC(a[10], a[25]); SQRADDAC(a[11], a[24]); SQRADDAC(a[12], a[23]); SQRADDAC(a[13], a[22]); SQRADDAC(a[14], a[21]); SQRADDAC(a[15], a[20]); SQRADDAC(a[16], a[19]); SQRADDAC(a[17], a[18]); SQRADDDB; 
  1155    COMBA_STORE(b[35]);
  1157    /* output 36 */
  1158    CARRY_FORWARD;
  1159    SQRADDSC(a[5], a[31]); SQRADDAC(a[6], a[30]); SQRADDAC(a[7], a[29]); SQRADDAC(a[8], a[28]); SQRADDAC(a[9], a[27]); SQRADDAC(a[10], a[26]); SQRADDAC(a[11], a[25]); SQRADDAC(a[12], a[24]); SQRADDAC(a[13], a[23]); SQRADDAC(a[14], a[22]); SQRADDAC(a[15], a[21]); SQRADDAC(a[16], a[20]); SQRADDAC(a[17], a[19]); SQRADDDB; SQRADD(a[18], a[18]); 
  1160    COMBA_STORE(b[36]);
  1162    /* output 37 */
  1163    CARRY_FORWARD;
  1164    SQRADDSC(a[6], a[31]); SQRADDAC(a[7], a[30]); SQRADDAC(a[8], a[29]); SQRADDAC(a[9], a[28]); SQRADDAC(a[10], a[27]); SQRADDAC(a[11], a[26]); SQRADDAC(a[12], a[25]); SQRADDAC(a[13], a[24]); SQRADDAC(a[14], a[23]); SQRADDAC(a[15], a[22]); SQRADDAC(a[16], a[21]); SQRADDAC(a[17], a[20]); SQRADDAC(a[18], a[19]); SQRADDDB; 
  1165    COMBA_STORE(b[37]);
  1167    /* output 38 */
  1168    CARRY_FORWARD;
  1169    SQRADDSC(a[7], a[31]); SQRADDAC(a[8], a[30]); SQRADDAC(a[9], a[29]); SQRADDAC(a[10], a[28]); SQRADDAC(a[11], a[27]); SQRADDAC(a[12], a[26]); SQRADDAC(a[13], a[25]); SQRADDAC(a[14], a[24]); SQRADDAC(a[15], a[23]); SQRADDAC(a[16], a[22]); SQRADDAC(a[17], a[21]); SQRADDAC(a[18], a[20]); SQRADDDB; SQRADD(a[19], a[19]); 
  1170    COMBA_STORE(b[38]);
  1172    /* output 39 */
  1173    CARRY_FORWARD;
  1174    SQRADDSC(a[8], a[31]); SQRADDAC(a[9], a[30]); SQRADDAC(a[10], a[29]); SQRADDAC(a[11], a[28]); SQRADDAC(a[12], a[27]); SQRADDAC(a[13], a[26]); SQRADDAC(a[14], a[25]); SQRADDAC(a[15], a[24]); SQRADDAC(a[16], a[23]); SQRADDAC(a[17], a[22]); SQRADDAC(a[18], a[21]); SQRADDAC(a[19], a[20]); SQRADDDB; 
  1175    COMBA_STORE(b[39]);
  1177    /* output 40 */
  1178    CARRY_FORWARD;
  1179    SQRADDSC(a[9], a[31]); SQRADDAC(a[10], a[30]); SQRADDAC(a[11], a[29]); SQRADDAC(a[12], a[28]); SQRADDAC(a[13], a[27]); SQRADDAC(a[14], a[26]); SQRADDAC(a[15], a[25]); SQRADDAC(a[16], a[24]); SQRADDAC(a[17], a[23]); SQRADDAC(a[18], a[22]); SQRADDAC(a[19], a[21]); SQRADDDB; SQRADD(a[20], a[20]); 
  1180    COMBA_STORE(b[40]);
  1182    /* output 41 */
  1183    CARRY_FORWARD;
  1184    SQRADDSC(a[10], a[31]); SQRADDAC(a[11], a[30]); SQRADDAC(a[12], a[29]); SQRADDAC(a[13], a[28]); SQRADDAC(a[14], a[27]); SQRADDAC(a[15], a[26]); SQRADDAC(a[16], a[25]); SQRADDAC(a[17], a[24]); SQRADDAC(a[18], a[23]); SQRADDAC(a[19], a[22]); SQRADDAC(a[20], a[21]); SQRADDDB; 
  1185    COMBA_STORE(b[41]);
  1187    /* output 42 */
  1188    CARRY_FORWARD;
  1189    SQRADDSC(a[11], a[31]); SQRADDAC(a[12], a[30]); SQRADDAC(a[13], a[29]); SQRADDAC(a[14], a[28]); SQRADDAC(a[15], a[27]); SQRADDAC(a[16], a[26]); SQRADDAC(a[17], a[25]); SQRADDAC(a[18], a[24]); SQRADDAC(a[19], a[23]); SQRADDAC(a[20], a[22]); SQRADDDB; SQRADD(a[21], a[21]); 
  1190    COMBA_STORE(b[42]);
  1192    /* output 43 */
  1193    CARRY_FORWARD;
  1194    SQRADDSC(a[12], a[31]); SQRADDAC(a[13], a[30]); SQRADDAC(a[14], a[29]); SQRADDAC(a[15], a[28]); SQRADDAC(a[16], a[27]); SQRADDAC(a[17], a[26]); SQRADDAC(a[18], a[25]); SQRADDAC(a[19], a[24]); SQRADDAC(a[20], a[23]); SQRADDAC(a[21], a[22]); SQRADDDB; 
  1195    COMBA_STORE(b[43]);
  1197    /* output 44 */
  1198    CARRY_FORWARD;
  1199    SQRADDSC(a[13], a[31]); SQRADDAC(a[14], a[30]); SQRADDAC(a[15], a[29]); SQRADDAC(a[16], a[28]); SQRADDAC(a[17], a[27]); SQRADDAC(a[18], a[26]); SQRADDAC(a[19], a[25]); SQRADDAC(a[20], a[24]); SQRADDAC(a[21], a[23]); SQRADDDB; SQRADD(a[22], a[22]); 
  1200    COMBA_STORE(b[44]);
  1202    /* output 45 */
  1203    CARRY_FORWARD;
  1204    SQRADDSC(a[14], a[31]); SQRADDAC(a[15], a[30]); SQRADDAC(a[16], a[29]); SQRADDAC(a[17], a[28]); SQRADDAC(a[18], a[27]); SQRADDAC(a[19], a[26]); SQRADDAC(a[20], a[25]); SQRADDAC(a[21], a[24]); SQRADDAC(a[22], a[23]); SQRADDDB; 
  1205    COMBA_STORE(b[45]);
  1207    /* output 46 */
  1208    CARRY_FORWARD;
  1209    SQRADDSC(a[15], a[31]); SQRADDAC(a[16], a[30]); SQRADDAC(a[17], a[29]); SQRADDAC(a[18], a[28]); SQRADDAC(a[19], a[27]); SQRADDAC(a[20], a[26]); SQRADDAC(a[21], a[25]); SQRADDAC(a[22], a[24]); SQRADDDB; SQRADD(a[23], a[23]); 
  1210    COMBA_STORE(b[46]);
  1212    /* output 47 */
  1213    CARRY_FORWARD;
  1214    SQRADDSC(a[16], a[31]); SQRADDAC(a[17], a[30]); SQRADDAC(a[18], a[29]); SQRADDAC(a[19], a[28]); SQRADDAC(a[20], a[27]); SQRADDAC(a[21], a[26]); SQRADDAC(a[22], a[25]); SQRADDAC(a[23], a[24]); SQRADDDB; 
  1215    COMBA_STORE(b[47]);
  1217    /* output 48 */
  1218    CARRY_FORWARD;
  1219    SQRADDSC(a[17], a[31]); SQRADDAC(a[18], a[30]); SQRADDAC(a[19], a[29]); SQRADDAC(a[20], a[28]); SQRADDAC(a[21], a[27]); SQRADDAC(a[22], a[26]); SQRADDAC(a[23], a[25]); SQRADDDB; SQRADD(a[24], a[24]); 
  1220    COMBA_STORE(b[48]);
  1222    /* output 49 */
  1223    CARRY_FORWARD;
  1224    SQRADDSC(a[18], a[31]); SQRADDAC(a[19], a[30]); SQRADDAC(a[20], a[29]); SQRADDAC(a[21], a[28]); SQRADDAC(a[22], a[27]); SQRADDAC(a[23], a[26]); SQRADDAC(a[24], a[25]); SQRADDDB; 
  1225    COMBA_STORE(b[49]);
  1227    /* output 50 */
  1228    CARRY_FORWARD;
  1229    SQRADDSC(a[19], a[31]); SQRADDAC(a[20], a[30]); SQRADDAC(a[21], a[29]); SQRADDAC(a[22], a[28]); SQRADDAC(a[23], a[27]); SQRADDAC(a[24], a[26]); SQRADDDB; SQRADD(a[25], a[25]); 
  1230    COMBA_STORE(b[50]);
  1232    /* output 51 */
  1233    CARRY_FORWARD;
  1234    SQRADDSC(a[20], a[31]); SQRADDAC(a[21], a[30]); SQRADDAC(a[22], a[29]); SQRADDAC(a[23], a[28]); SQRADDAC(a[24], a[27]); SQRADDAC(a[25], a[26]); SQRADDDB; 
  1235    COMBA_STORE(b[51]);
  1237    /* output 52 */
  1238    CARRY_FORWARD;
  1239    SQRADDSC(a[21], a[31]); SQRADDAC(a[22], a[30]); SQRADDAC(a[23], a[29]); SQRADDAC(a[24], a[28]); SQRADDAC(a[25], a[27]); SQRADDDB; SQRADD(a[26], a[26]); 
  1240    COMBA_STORE(b[52]);
  1242    /* output 53 */
  1243    CARRY_FORWARD;
  1244    SQRADDSC(a[22], a[31]); SQRADDAC(a[23], a[30]); SQRADDAC(a[24], a[29]); SQRADDAC(a[25], a[28]); SQRADDAC(a[26], a[27]); SQRADDDB; 
  1245    COMBA_STORE(b[53]);
  1247    /* output 54 */
  1248    CARRY_FORWARD;
  1249    SQRADDSC(a[23], a[31]); SQRADDAC(a[24], a[30]); SQRADDAC(a[25], a[29]); SQRADDAC(a[26], a[28]); SQRADDDB; SQRADD(a[27], a[27]); 
  1250    COMBA_STORE(b[54]);
  1252    /* output 55 */
  1253    CARRY_FORWARD;
  1254    SQRADDSC(a[24], a[31]); SQRADDAC(a[25], a[30]); SQRADDAC(a[26], a[29]); SQRADDAC(a[27], a[28]); SQRADDDB; 
  1255    COMBA_STORE(b[55]);
  1257    /* output 56 */
  1258    CARRY_FORWARD;
  1259    SQRADDSC(a[25], a[31]); SQRADDAC(a[26], a[30]); SQRADDAC(a[27], a[29]); SQRADDDB; SQRADD(a[28], a[28]); 
  1260    COMBA_STORE(b[56]);
  1262    /* output 57 */
  1263    CARRY_FORWARD;
  1264    SQRADDSC(a[26], a[31]); SQRADDAC(a[27], a[30]); SQRADDAC(a[28], a[29]); SQRADDDB; 
  1265    COMBA_STORE(b[57]);
  1267    /* output 58 */
  1268    CARRY_FORWARD;
  1269    SQRADD2(a[27], a[31]); SQRADD2(a[28], a[30]); SQRADD(a[29], a[29]); 
  1270    COMBA_STORE(b[58]);
  1272    /* output 59 */
  1273    CARRY_FORWARD;
  1274    SQRADD2(a[28], a[31]); SQRADD2(a[29], a[30]); 
  1275    COMBA_STORE(b[59]);
  1277    /* output 60 */
  1278    CARRY_FORWARD;
  1279    SQRADD2(a[29], a[31]); SQRADD(a[30], a[30]); 
  1280    COMBA_STORE(b[60]);
  1282    /* output 61 */
  1283    CARRY_FORWARD;
  1284    SQRADD2(a[30], a[31]); 
  1285    COMBA_STORE(b[61]);
  1287    /* output 62 */
  1288    CARRY_FORWARD;
  1289    SQRADD(a[31], a[31]); 
  1290    COMBA_STORE(b[62]);
  1291    COMBA_STORE2(b[63]);
  1292    COMBA_FINI;
  1294    B->used = 64;
  1295    B->sign = ZPOS;
  1296    memcpy(B->dp, b, 64 * sizeof(mp_digit));
  1297    mp_clamp(B);

mercurial