tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

mp_comba.c (79362B)


      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 */
     11 
     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 */
     21 
     22 #include "mpi-priv.h"
     23 
     24 /* clamp digits */
     25 #define mp_clamp(a)                                      \
     26    {                                                    \
     27        while ((a)->used && (a)->dp[(a)->used - 1] == 0) \
     28            --((a)->used);                               \
     29        (a)->sign = (a)->used ? (a)->sign : ZPOS;        \
     30    }
     31 
     32 /* anything you need at the start */
     33 #define COMBA_START
     34 
     35 /* clear the chaining variables */
     36 #define COMBA_CLEAR \
     37    c0 = c1 = c2 = 0;
     38 
     39 /* forward the carry to the next digit */
     40 #define COMBA_FORWARD \
     41    do {              \
     42        c0 = c1;      \
     43        c1 = c2;      \
     44        c2 = 0;       \
     45    } while (0);
     46 
     47 /* anything you need at the end */
     48 #define COMBA_FINI
     49 
     50 /* this should multiply i and j  */
     51 #define MULADD(i, j)                                \
     52    __asm__(                                        \
     53        "movq  %6,%%rax     \n\t"                   \
     54        "mulq  %7           \n\t"                   \
     55        "addq  %%rax,%0     \n\t"                   \
     56        "adcq  %%rdx,%1     \n\t"                   \
     57        "adcq  $0,%2        \n\t"                   \
     58        : "=r"(c0), "=r"(c1), "=r"(c2)              \
     59        : "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) \
     60        : "%rax", "%rdx", "cc");
     61 
     62 /* sqr macros only */
     63 #define CLEAR_CARRY \
     64    c0 = c1 = c2 = 0;
     65 
     66 #define COMBA_STORE(x) \
     67    x = c0;
     68 
     69 #define COMBA_STORE2(x) \
     70    x = c1;
     71 
     72 #define CARRY_FORWARD \
     73    do {              \
     74        c0 = c1;      \
     75        c1 = c2;      \
     76        c2 = 0;       \
     77    } while (0);
     78 
     79 #define COMBA_FINI
     80 
     81 #define SQRADD(i, j)                        \
     82    __asm__(                                \
     83        "movq  %6,%%rax     \n\t"           \
     84        "mulq  %%rax        \n\t"           \
     85        "addq  %%rax,%0     \n\t"           \
     86        "adcq  %%rdx,%1     \n\t"           \
     87        "adcq  $0,%2        \n\t"           \
     88        : "=r"(c0), "=r"(c1), "=r"(c2)      \
     89        : "0"(c0), "1"(c1), "2"(c2), "g"(i) \
     90        : "%rax", "%rdx", "cc");
     91 
     92 #define SQRADD2(i, j)                               \
     93    __asm__(                                        \
     94        "movq  %6,%%rax     \n\t"                   \
     95        "mulq  %7           \n\t"                   \
     96        "addq  %%rax,%0     \n\t"                   \
     97        "adcq  %%rdx,%1     \n\t"                   \
     98        "adcq  $0,%2        \n\t"                   \
     99        "addq  %%rax,%0     \n\t"                   \
    100        "adcq  %%rdx,%1     \n\t"                   \
    101        "adcq  $0,%2        \n\t"                   \
    102        : "=r"(c0), "=r"(c1), "=r"(c2)              \
    103        : "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) \
    104        : "%rax", "%rdx", "cc");
    105 
    106 #define SQRADDSC(i, j)                    \
    107    __asm__(                              \
    108        "movq  %3,%%rax     \n\t"         \
    109        "mulq  %4           \n\t"         \
    110        "movq  %%rax,%0     \n\t"         \
    111        "movq  %%rdx,%1     \n\t"         \
    112        "xorq  %2,%2        \n\t"         \
    113        : "=r"(sc0), "=r"(sc1), "=r"(sc2) \
    114        : "g"(i), "g"(j)                  \
    115        : "%rax", "%rdx", "cc");
    116 
    117 #define SQRADDAC(i, j)                                 \
    118    __asm__(                                           \
    119        "movq  %6,%%rax     \n\t"                      \
    120        "mulq  %7           \n\t"                      \
    121        "addq  %%rax,%0     \n\t"                      \
    122        "adcq  %%rdx,%1     \n\t"                      \
    123        "adcq  $0,%2        \n\t"                      \
    124        : "=r"(sc0), "=r"(sc1), "=r"(sc2)              \
    125        : "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) \
    126        : "%rax", "%rdx", "cc");
    127 
    128 #define SQRADDDB                                                  \
    129    __asm__(                                                      \
    130        "addq %6,%0         \n\t"                                 \
    131        "adcq %7,%1         \n\t"                                 \
    132        "adcq %8,%2         \n\t"                                 \
    133        "addq %6,%0         \n\t"                                 \
    134        "adcq %7,%1         \n\t"                                 \
    135        "adcq %8,%2         \n\t"                                 \
    136        : "=&r"(c0), "=&r"(c1), "=&r"(c2)                         \
    137        : "0"(c0), "1"(c1), "2"(c2), "r"(sc0), "r"(sc1), "r"(sc2) \
    138        : "cc");
    139 
    140 void
    141 s_mp_mul_comba_4(const mp_int *A, const mp_int *B, mp_int *C)
    142 {
    143    mp_digit c0, c1, c2, at[8];
    144 
    145    memcpy(at, A->dp, 4 * sizeof(mp_digit));
    146    memcpy(at + 4, B->dp, 4 * sizeof(mp_digit));
    147    COMBA_START;
    148 
    149    COMBA_CLEAR;
    150    /* 0 */
    151    MULADD(at[0], at[4]);
    152    COMBA_STORE(C->dp[0]);
    153    /* 1 */
    154    COMBA_FORWARD;
    155    MULADD(at[0], at[5]);
    156    MULADD(at[1], at[4]);
    157    COMBA_STORE(C->dp[1]);
    158    /* 2 */
    159    COMBA_FORWARD;
    160    MULADD(at[0], at[6]);
    161    MULADD(at[1], at[5]);
    162    MULADD(at[2], at[4]);
    163    COMBA_STORE(C->dp[2]);
    164    /* 3 */
    165    COMBA_FORWARD;
    166    MULADD(at[0], at[7]);
    167    MULADD(at[1], at[6]);
    168    MULADD(at[2], at[5]);
    169    MULADD(at[3], at[4]);
    170    COMBA_STORE(C->dp[3]);
    171    /* 4 */
    172    COMBA_FORWARD;
    173    MULADD(at[1], at[7]);
    174    MULADD(at[2], at[6]);
    175    MULADD(at[3], at[5]);
    176    COMBA_STORE(C->dp[4]);
    177    /* 5 */
    178    COMBA_FORWARD;
    179    MULADD(at[2], at[7]);
    180    MULADD(at[3], at[6]);
    181    COMBA_STORE(C->dp[5]);
    182    /* 6 */
    183    COMBA_FORWARD;
    184    MULADD(at[3], at[7]);
    185    COMBA_STORE(C->dp[6]);
    186    COMBA_STORE2(C->dp[7]);
    187    C->used = 8;
    188    C->sign = A->sign ^ B->sign;
    189    mp_clamp(C);
    190    COMBA_FINI;
    191 }
    192 
    193 void
    194 s_mp_mul_comba_8(const mp_int *A, const mp_int *B, mp_int *C)
    195 {
    196    mp_digit c0, c1, c2, at[16];
    197 
    198    memcpy(at, A->dp, 8 * sizeof(mp_digit));
    199    memcpy(at + 8, B->dp, 8 * sizeof(mp_digit));
    200    COMBA_START;
    201 
    202    COMBA_CLEAR;
    203    /* 0 */
    204    MULADD(at[0], at[8]);
    205    COMBA_STORE(C->dp[0]);
    206    /* 1 */
    207    COMBA_FORWARD;
    208    MULADD(at[0], at[9]);
    209    MULADD(at[1], at[8]);
    210    COMBA_STORE(C->dp[1]);
    211    /* 2 */
    212    COMBA_FORWARD;
    213    MULADD(at[0], at[10]);
    214    MULADD(at[1], at[9]);
    215    MULADD(at[2], at[8]);
    216    COMBA_STORE(C->dp[2]);
    217    /* 3 */
    218    COMBA_FORWARD;
    219    MULADD(at[0], at[11]);
    220    MULADD(at[1], at[10]);
    221    MULADD(at[2], at[9]);
    222    MULADD(at[3], at[8]);
    223    COMBA_STORE(C->dp[3]);
    224    /* 4 */
    225    COMBA_FORWARD;
    226    MULADD(at[0], at[12]);
    227    MULADD(at[1], at[11]);
    228    MULADD(at[2], at[10]);
    229    MULADD(at[3], at[9]);
    230    MULADD(at[4], at[8]);
    231    COMBA_STORE(C->dp[4]);
    232    /* 5 */
    233    COMBA_FORWARD;
    234    MULADD(at[0], at[13]);
    235    MULADD(at[1], at[12]);
    236    MULADD(at[2], at[11]);
    237    MULADD(at[3], at[10]);
    238    MULADD(at[4], at[9]);
    239    MULADD(at[5], at[8]);
    240    COMBA_STORE(C->dp[5]);
    241    /* 6 */
    242    COMBA_FORWARD;
    243    MULADD(at[0], at[14]);
    244    MULADD(at[1], at[13]);
    245    MULADD(at[2], at[12]);
    246    MULADD(at[3], at[11]);
    247    MULADD(at[4], at[10]);
    248    MULADD(at[5], at[9]);
    249    MULADD(at[6], at[8]);
    250    COMBA_STORE(C->dp[6]);
    251    /* 7 */
    252    COMBA_FORWARD;
    253    MULADD(at[0], at[15]);
    254    MULADD(at[1], at[14]);
    255    MULADD(at[2], at[13]);
    256    MULADD(at[3], at[12]);
    257    MULADD(at[4], at[11]);
    258    MULADD(at[5], at[10]);
    259    MULADD(at[6], at[9]);
    260    MULADD(at[7], at[8]);
    261    COMBA_STORE(C->dp[7]);
    262    /* 8 */
    263    COMBA_FORWARD;
    264    MULADD(at[1], at[15]);
    265    MULADD(at[2], at[14]);
    266    MULADD(at[3], at[13]);
    267    MULADD(at[4], at[12]);
    268    MULADD(at[5], at[11]);
    269    MULADD(at[6], at[10]);
    270    MULADD(at[7], at[9]);
    271    COMBA_STORE(C->dp[8]);
    272    /* 9 */
    273    COMBA_FORWARD;
    274    MULADD(at[2], at[15]);
    275    MULADD(at[3], at[14]);
    276    MULADD(at[4], at[13]);
    277    MULADD(at[5], at[12]);
    278    MULADD(at[6], at[11]);
    279    MULADD(at[7], at[10]);
    280    COMBA_STORE(C->dp[9]);
    281    /* 10 */
    282    COMBA_FORWARD;
    283    MULADD(at[3], at[15]);
    284    MULADD(at[4], at[14]);
    285    MULADD(at[5], at[13]);
    286    MULADD(at[6], at[12]);
    287    MULADD(at[7], at[11]);
    288    COMBA_STORE(C->dp[10]);
    289    /* 11 */
    290    COMBA_FORWARD;
    291    MULADD(at[4], at[15]);
    292    MULADD(at[5], at[14]);
    293    MULADD(at[6], at[13]);
    294    MULADD(at[7], at[12]);
    295    COMBA_STORE(C->dp[11]);
    296    /* 12 */
    297    COMBA_FORWARD;
    298    MULADD(at[5], at[15]);
    299    MULADD(at[6], at[14]);
    300    MULADD(at[7], at[13]);
    301    COMBA_STORE(C->dp[12]);
    302    /* 13 */
    303    COMBA_FORWARD;
    304    MULADD(at[6], at[15]);
    305    MULADD(at[7], at[14]);
    306    COMBA_STORE(C->dp[13]);
    307    /* 14 */
    308    COMBA_FORWARD;
    309    MULADD(at[7], at[15]);
    310    COMBA_STORE(C->dp[14]);
    311    COMBA_STORE2(C->dp[15]);
    312    C->used = 16;
    313    C->sign = A->sign ^ B->sign;
    314    mp_clamp(C);
    315    COMBA_FINI;
    316 }
    317 
    318 void
    319 s_mp_mul_comba_16(const mp_int *A, const mp_int *B, mp_int *C)
    320 {
    321    mp_digit c0, c1, c2, at[32];
    322 
    323    memcpy(at, A->dp, 16 * sizeof(mp_digit));
    324    memcpy(at + 16, B->dp, 16 * sizeof(mp_digit));
    325    COMBA_START;
    326 
    327    COMBA_CLEAR;
    328    /* 0 */
    329    MULADD(at[0], at[16]);
    330    COMBA_STORE(C->dp[0]);
    331    /* 1 */
    332    COMBA_FORWARD;
    333    MULADD(at[0], at[17]);
    334    MULADD(at[1], at[16]);
    335    COMBA_STORE(C->dp[1]);
    336    /* 2 */
    337    COMBA_FORWARD;
    338    MULADD(at[0], at[18]);
    339    MULADD(at[1], at[17]);
    340    MULADD(at[2], at[16]);
    341    COMBA_STORE(C->dp[2]);
    342    /* 3 */
    343    COMBA_FORWARD;
    344    MULADD(at[0], at[19]);
    345    MULADD(at[1], at[18]);
    346    MULADD(at[2], at[17]);
    347    MULADD(at[3], at[16]);
    348    COMBA_STORE(C->dp[3]);
    349    /* 4 */
    350    COMBA_FORWARD;
    351    MULADD(at[0], at[20]);
    352    MULADD(at[1], at[19]);
    353    MULADD(at[2], at[18]);
    354    MULADD(at[3], at[17]);
    355    MULADD(at[4], at[16]);
    356    COMBA_STORE(C->dp[4]);
    357    /* 5 */
    358    COMBA_FORWARD;
    359    MULADD(at[0], at[21]);
    360    MULADD(at[1], at[20]);
    361    MULADD(at[2], at[19]);
    362    MULADD(at[3], at[18]);
    363    MULADD(at[4], at[17]);
    364    MULADD(at[5], at[16]);
    365    COMBA_STORE(C->dp[5]);
    366    /* 6 */
    367    COMBA_FORWARD;
    368    MULADD(at[0], at[22]);
    369    MULADD(at[1], at[21]);
    370    MULADD(at[2], at[20]);
    371    MULADD(at[3], at[19]);
    372    MULADD(at[4], at[18]);
    373    MULADD(at[5], at[17]);
    374    MULADD(at[6], at[16]);
    375    COMBA_STORE(C->dp[6]);
    376    /* 7 */
    377    COMBA_FORWARD;
    378    MULADD(at[0], at[23]);
    379    MULADD(at[1], at[22]);
    380    MULADD(at[2], at[21]);
    381    MULADD(at[3], at[20]);
    382    MULADD(at[4], at[19]);
    383    MULADD(at[5], at[18]);
    384    MULADD(at[6], at[17]);
    385    MULADD(at[7], at[16]);
    386    COMBA_STORE(C->dp[7]);
    387    /* 8 */
    388    COMBA_FORWARD;
    389    MULADD(at[0], at[24]);
    390    MULADD(at[1], at[23]);
    391    MULADD(at[2], at[22]);
    392    MULADD(at[3], at[21]);
    393    MULADD(at[4], at[20]);
    394    MULADD(at[5], at[19]);
    395    MULADD(at[6], at[18]);
    396    MULADD(at[7], at[17]);
    397    MULADD(at[8], at[16]);
    398    COMBA_STORE(C->dp[8]);
    399    /* 9 */
    400    COMBA_FORWARD;
    401    MULADD(at[0], at[25]);
    402    MULADD(at[1], at[24]);
    403    MULADD(at[2], at[23]);
    404    MULADD(at[3], at[22]);
    405    MULADD(at[4], at[21]);
    406    MULADD(at[5], at[20]);
    407    MULADD(at[6], at[19]);
    408    MULADD(at[7], at[18]);
    409    MULADD(at[8], at[17]);
    410    MULADD(at[9], at[16]);
    411    COMBA_STORE(C->dp[9]);
    412    /* 10 */
    413    COMBA_FORWARD;
    414    MULADD(at[0], at[26]);
    415    MULADD(at[1], at[25]);
    416    MULADD(at[2], at[24]);
    417    MULADD(at[3], at[23]);
    418    MULADD(at[4], at[22]);
    419    MULADD(at[5], at[21]);
    420    MULADD(at[6], at[20]);
    421    MULADD(at[7], at[19]);
    422    MULADD(at[8], at[18]);
    423    MULADD(at[9], at[17]);
    424    MULADD(at[10], at[16]);
    425    COMBA_STORE(C->dp[10]);
    426    /* 11 */
    427    COMBA_FORWARD;
    428    MULADD(at[0], at[27]);
    429    MULADD(at[1], at[26]);
    430    MULADD(at[2], at[25]);
    431    MULADD(at[3], at[24]);
    432    MULADD(at[4], at[23]);
    433    MULADD(at[5], at[22]);
    434    MULADD(at[6], at[21]);
    435    MULADD(at[7], at[20]);
    436    MULADD(at[8], at[19]);
    437    MULADD(at[9], at[18]);
    438    MULADD(at[10], at[17]);
    439    MULADD(at[11], at[16]);
    440    COMBA_STORE(C->dp[11]);
    441    /* 12 */
    442    COMBA_FORWARD;
    443    MULADD(at[0], at[28]);
    444    MULADD(at[1], at[27]);
    445    MULADD(at[2], at[26]);
    446    MULADD(at[3], at[25]);
    447    MULADD(at[4], at[24]);
    448    MULADD(at[5], at[23]);
    449    MULADD(at[6], at[22]);
    450    MULADD(at[7], at[21]);
    451    MULADD(at[8], at[20]);
    452    MULADD(at[9], at[19]);
    453    MULADD(at[10], at[18]);
    454    MULADD(at[11], at[17]);
    455    MULADD(at[12], at[16]);
    456    COMBA_STORE(C->dp[12]);
    457    /* 13 */
    458    COMBA_FORWARD;
    459    MULADD(at[0], at[29]);
    460    MULADD(at[1], at[28]);
    461    MULADD(at[2], at[27]);
    462    MULADD(at[3], at[26]);
    463    MULADD(at[4], at[25]);
    464    MULADD(at[5], at[24]);
    465    MULADD(at[6], at[23]);
    466    MULADD(at[7], at[22]);
    467    MULADD(at[8], at[21]);
    468    MULADD(at[9], at[20]);
    469    MULADD(at[10], at[19]);
    470    MULADD(at[11], at[18]);
    471    MULADD(at[12], at[17]);
    472    MULADD(at[13], at[16]);
    473    COMBA_STORE(C->dp[13]);
    474    /* 14 */
    475    COMBA_FORWARD;
    476    MULADD(at[0], at[30]);
    477    MULADD(at[1], at[29]);
    478    MULADD(at[2], at[28]);
    479    MULADD(at[3], at[27]);
    480    MULADD(at[4], at[26]);
    481    MULADD(at[5], at[25]);
    482    MULADD(at[6], at[24]);
    483    MULADD(at[7], at[23]);
    484    MULADD(at[8], at[22]);
    485    MULADD(at[9], at[21]);
    486    MULADD(at[10], at[20]);
    487    MULADD(at[11], at[19]);
    488    MULADD(at[12], at[18]);
    489    MULADD(at[13], at[17]);
    490    MULADD(at[14], at[16]);
    491    COMBA_STORE(C->dp[14]);
    492    /* 15 */
    493    COMBA_FORWARD;
    494    MULADD(at[0], at[31]);
    495    MULADD(at[1], at[30]);
    496    MULADD(at[2], at[29]);
    497    MULADD(at[3], at[28]);
    498    MULADD(at[4], at[27]);
    499    MULADD(at[5], at[26]);
    500    MULADD(at[6], at[25]);
    501    MULADD(at[7], at[24]);
    502    MULADD(at[8], at[23]);
    503    MULADD(at[9], at[22]);
    504    MULADD(at[10], at[21]);
    505    MULADD(at[11], at[20]);
    506    MULADD(at[12], at[19]);
    507    MULADD(at[13], at[18]);
    508    MULADD(at[14], at[17]);
    509    MULADD(at[15], at[16]);
    510    COMBA_STORE(C->dp[15]);
    511    /* 16 */
    512    COMBA_FORWARD;
    513    MULADD(at[1], at[31]);
    514    MULADD(at[2], at[30]);
    515    MULADD(at[3], at[29]);
    516    MULADD(at[4], at[28]);
    517    MULADD(at[5], at[27]);
    518    MULADD(at[6], at[26]);
    519    MULADD(at[7], at[25]);
    520    MULADD(at[8], at[24]);
    521    MULADD(at[9], at[23]);
    522    MULADD(at[10], at[22]);
    523    MULADD(at[11], at[21]);
    524    MULADD(at[12], at[20]);
    525    MULADD(at[13], at[19]);
    526    MULADD(at[14], at[18]);
    527    MULADD(at[15], at[17]);
    528    COMBA_STORE(C->dp[16]);
    529    /* 17 */
    530    COMBA_FORWARD;
    531    MULADD(at[2], at[31]);
    532    MULADD(at[3], at[30]);
    533    MULADD(at[4], at[29]);
    534    MULADD(at[5], at[28]);
    535    MULADD(at[6], at[27]);
    536    MULADD(at[7], at[26]);
    537    MULADD(at[8], at[25]);
    538    MULADD(at[9], at[24]);
    539    MULADD(at[10], at[23]);
    540    MULADD(at[11], at[22]);
    541    MULADD(at[12], at[21]);
    542    MULADD(at[13], at[20]);
    543    MULADD(at[14], at[19]);
    544    MULADD(at[15], at[18]);
    545    COMBA_STORE(C->dp[17]);
    546    /* 18 */
    547    COMBA_FORWARD;
    548    MULADD(at[3], at[31]);
    549    MULADD(at[4], at[30]);
    550    MULADD(at[5], at[29]);
    551    MULADD(at[6], at[28]);
    552    MULADD(at[7], at[27]);
    553    MULADD(at[8], at[26]);
    554    MULADD(at[9], at[25]);
    555    MULADD(at[10], at[24]);
    556    MULADD(at[11], at[23]);
    557    MULADD(at[12], at[22]);
    558    MULADD(at[13], at[21]);
    559    MULADD(at[14], at[20]);
    560    MULADD(at[15], at[19]);
    561    COMBA_STORE(C->dp[18]);
    562    /* 19 */
    563    COMBA_FORWARD;
    564    MULADD(at[4], at[31]);
    565    MULADD(at[5], at[30]);
    566    MULADD(at[6], at[29]);
    567    MULADD(at[7], at[28]);
    568    MULADD(at[8], at[27]);
    569    MULADD(at[9], at[26]);
    570    MULADD(at[10], at[25]);
    571    MULADD(at[11], at[24]);
    572    MULADD(at[12], at[23]);
    573    MULADD(at[13], at[22]);
    574    MULADD(at[14], at[21]);
    575    MULADD(at[15], at[20]);
    576    COMBA_STORE(C->dp[19]);
    577    /* 20 */
    578    COMBA_FORWARD;
    579    MULADD(at[5], at[31]);
    580    MULADD(at[6], at[30]);
    581    MULADD(at[7], at[29]);
    582    MULADD(at[8], at[28]);
    583    MULADD(at[9], at[27]);
    584    MULADD(at[10], at[26]);
    585    MULADD(at[11], at[25]);
    586    MULADD(at[12], at[24]);
    587    MULADD(at[13], at[23]);
    588    MULADD(at[14], at[22]);
    589    MULADD(at[15], at[21]);
    590    COMBA_STORE(C->dp[20]);
    591    /* 21 */
    592    COMBA_FORWARD;
    593    MULADD(at[6], at[31]);
    594    MULADD(at[7], at[30]);
    595    MULADD(at[8], at[29]);
    596    MULADD(at[9], at[28]);
    597    MULADD(at[10], at[27]);
    598    MULADD(at[11], at[26]);
    599    MULADD(at[12], at[25]);
    600    MULADD(at[13], at[24]);
    601    MULADD(at[14], at[23]);
    602    MULADD(at[15], at[22]);
    603    COMBA_STORE(C->dp[21]);
    604    /* 22 */
    605    COMBA_FORWARD;
    606    MULADD(at[7], at[31]);
    607    MULADD(at[8], at[30]);
    608    MULADD(at[9], at[29]);
    609    MULADD(at[10], at[28]);
    610    MULADD(at[11], at[27]);
    611    MULADD(at[12], at[26]);
    612    MULADD(at[13], at[25]);
    613    MULADD(at[14], at[24]);
    614    MULADD(at[15], at[23]);
    615    COMBA_STORE(C->dp[22]);
    616    /* 23 */
    617    COMBA_FORWARD;
    618    MULADD(at[8], at[31]);
    619    MULADD(at[9], at[30]);
    620    MULADD(at[10], at[29]);
    621    MULADD(at[11], at[28]);
    622    MULADD(at[12], at[27]);
    623    MULADD(at[13], at[26]);
    624    MULADD(at[14], at[25]);
    625    MULADD(at[15], at[24]);
    626    COMBA_STORE(C->dp[23]);
    627    /* 24 */
    628    COMBA_FORWARD;
    629    MULADD(at[9], at[31]);
    630    MULADD(at[10], at[30]);
    631    MULADD(at[11], at[29]);
    632    MULADD(at[12], at[28]);
    633    MULADD(at[13], at[27]);
    634    MULADD(at[14], at[26]);
    635    MULADD(at[15], at[25]);
    636    COMBA_STORE(C->dp[24]);
    637    /* 25 */
    638    COMBA_FORWARD;
    639    MULADD(at[10], at[31]);
    640    MULADD(at[11], at[30]);
    641    MULADD(at[12], at[29]);
    642    MULADD(at[13], at[28]);
    643    MULADD(at[14], at[27]);
    644    MULADD(at[15], at[26]);
    645    COMBA_STORE(C->dp[25]);
    646    /* 26 */
    647    COMBA_FORWARD;
    648    MULADD(at[11], at[31]);
    649    MULADD(at[12], at[30]);
    650    MULADD(at[13], at[29]);
    651    MULADD(at[14], at[28]);
    652    MULADD(at[15], at[27]);
    653    COMBA_STORE(C->dp[26]);
    654    /* 27 */
    655    COMBA_FORWARD;
    656    MULADD(at[12], at[31]);
    657    MULADD(at[13], at[30]);
    658    MULADD(at[14], at[29]);
    659    MULADD(at[15], at[28]);
    660    COMBA_STORE(C->dp[27]);
    661    /* 28 */
    662    COMBA_FORWARD;
    663    MULADD(at[13], at[31]);
    664    MULADD(at[14], at[30]);
    665    MULADD(at[15], at[29]);
    666    COMBA_STORE(C->dp[28]);
    667    /* 29 */
    668    COMBA_FORWARD;
    669    MULADD(at[14], at[31]);
    670    MULADD(at[15], at[30]);
    671    COMBA_STORE(C->dp[29]);
    672    /* 30 */
    673    COMBA_FORWARD;
    674    MULADD(at[15], at[31]);
    675    COMBA_STORE(C->dp[30]);
    676    COMBA_STORE2(C->dp[31]);
    677    C->used = 32;
    678    C->sign = A->sign ^ B->sign;
    679    mp_clamp(C);
    680    COMBA_FINI;
    681 }
    682 
    683 void
    684 s_mp_mul_comba_32(const mp_int *A, const mp_int *B, mp_int *C)
    685 {
    686    mp_digit c0, c1, c2, at[64];
    687 
    688    memcpy(at, A->dp, 32 * sizeof(mp_digit));
    689    memcpy(at + 32, B->dp, 32 * sizeof(mp_digit));
    690    COMBA_START;
    691 
    692    COMBA_CLEAR;
    693    /* 0 */
    694    MULADD(at[0], at[32]);
    695    COMBA_STORE(C->dp[0]);
    696    /* 1 */
    697    COMBA_FORWARD;
    698    MULADD(at[0], at[33]);
    699    MULADD(at[1], at[32]);
    700    COMBA_STORE(C->dp[1]);
    701    /* 2 */
    702    COMBA_FORWARD;
    703    MULADD(at[0], at[34]);
    704    MULADD(at[1], at[33]);
    705    MULADD(at[2], at[32]);
    706    COMBA_STORE(C->dp[2]);
    707    /* 3 */
    708    COMBA_FORWARD;
    709    MULADD(at[0], at[35]);
    710    MULADD(at[1], at[34]);
    711    MULADD(at[2], at[33]);
    712    MULADD(at[3], at[32]);
    713    COMBA_STORE(C->dp[3]);
    714    /* 4 */
    715    COMBA_FORWARD;
    716    MULADD(at[0], at[36]);
    717    MULADD(at[1], at[35]);
    718    MULADD(at[2], at[34]);
    719    MULADD(at[3], at[33]);
    720    MULADD(at[4], at[32]);
    721    COMBA_STORE(C->dp[4]);
    722    /* 5 */
    723    COMBA_FORWARD;
    724    MULADD(at[0], at[37]);
    725    MULADD(at[1], at[36]);
    726    MULADD(at[2], at[35]);
    727    MULADD(at[3], at[34]);
    728    MULADD(at[4], at[33]);
    729    MULADD(at[5], at[32]);
    730    COMBA_STORE(C->dp[5]);
    731    /* 6 */
    732    COMBA_FORWARD;
    733    MULADD(at[0], at[38]);
    734    MULADD(at[1], at[37]);
    735    MULADD(at[2], at[36]);
    736    MULADD(at[3], at[35]);
    737    MULADD(at[4], at[34]);
    738    MULADD(at[5], at[33]);
    739    MULADD(at[6], at[32]);
    740    COMBA_STORE(C->dp[6]);
    741    /* 7 */
    742    COMBA_FORWARD;
    743    MULADD(at[0], at[39]);
    744    MULADD(at[1], at[38]);
    745    MULADD(at[2], at[37]);
    746    MULADD(at[3], at[36]);
    747    MULADD(at[4], at[35]);
    748    MULADD(at[5], at[34]);
    749    MULADD(at[6], at[33]);
    750    MULADD(at[7], at[32]);
    751    COMBA_STORE(C->dp[7]);
    752    /* 8 */
    753    COMBA_FORWARD;
    754    MULADD(at[0], at[40]);
    755    MULADD(at[1], at[39]);
    756    MULADD(at[2], at[38]);
    757    MULADD(at[3], at[37]);
    758    MULADD(at[4], at[36]);
    759    MULADD(at[5], at[35]);
    760    MULADD(at[6], at[34]);
    761    MULADD(at[7], at[33]);
    762    MULADD(at[8], at[32]);
    763    COMBA_STORE(C->dp[8]);
    764    /* 9 */
    765    COMBA_FORWARD;
    766    MULADD(at[0], at[41]);
    767    MULADD(at[1], at[40]);
    768    MULADD(at[2], at[39]);
    769    MULADD(at[3], at[38]);
    770    MULADD(at[4], at[37]);
    771    MULADD(at[5], at[36]);
    772    MULADD(at[6], at[35]);
    773    MULADD(at[7], at[34]);
    774    MULADD(at[8], at[33]);
    775    MULADD(at[9], at[32]);
    776    COMBA_STORE(C->dp[9]);
    777    /* 10 */
    778    COMBA_FORWARD;
    779    MULADD(at[0], at[42]);
    780    MULADD(at[1], at[41]);
    781    MULADD(at[2], at[40]);
    782    MULADD(at[3], at[39]);
    783    MULADD(at[4], at[38]);
    784    MULADD(at[5], at[37]);
    785    MULADD(at[6], at[36]);
    786    MULADD(at[7], at[35]);
    787    MULADD(at[8], at[34]);
    788    MULADD(at[9], at[33]);
    789    MULADD(at[10], at[32]);
    790    COMBA_STORE(C->dp[10]);
    791    /* 11 */
    792    COMBA_FORWARD;
    793    MULADD(at[0], at[43]);
    794    MULADD(at[1], at[42]);
    795    MULADD(at[2], at[41]);
    796    MULADD(at[3], at[40]);
    797    MULADD(at[4], at[39]);
    798    MULADD(at[5], at[38]);
    799    MULADD(at[6], at[37]);
    800    MULADD(at[7], at[36]);
    801    MULADD(at[8], at[35]);
    802    MULADD(at[9], at[34]);
    803    MULADD(at[10], at[33]);
    804    MULADD(at[11], at[32]);
    805    COMBA_STORE(C->dp[11]);
    806    /* 12 */
    807    COMBA_FORWARD;
    808    MULADD(at[0], at[44]);
    809    MULADD(at[1], at[43]);
    810    MULADD(at[2], at[42]);
    811    MULADD(at[3], at[41]);
    812    MULADD(at[4], at[40]);
    813    MULADD(at[5], at[39]);
    814    MULADD(at[6], at[38]);
    815    MULADD(at[7], at[37]);
    816    MULADD(at[8], at[36]);
    817    MULADD(at[9], at[35]);
    818    MULADD(at[10], at[34]);
    819    MULADD(at[11], at[33]);
    820    MULADD(at[12], at[32]);
    821    COMBA_STORE(C->dp[12]);
    822    /* 13 */
    823    COMBA_FORWARD;
    824    MULADD(at[0], at[45]);
    825    MULADD(at[1], at[44]);
    826    MULADD(at[2], at[43]);
    827    MULADD(at[3], at[42]);
    828    MULADD(at[4], at[41]);
    829    MULADD(at[5], at[40]);
    830    MULADD(at[6], at[39]);
    831    MULADD(at[7], at[38]);
    832    MULADD(at[8], at[37]);
    833    MULADD(at[9], at[36]);
    834    MULADD(at[10], at[35]);
    835    MULADD(at[11], at[34]);
    836    MULADD(at[12], at[33]);
    837    MULADD(at[13], at[32]);
    838    COMBA_STORE(C->dp[13]);
    839    /* 14 */
    840    COMBA_FORWARD;
    841    MULADD(at[0], at[46]);
    842    MULADD(at[1], at[45]);
    843    MULADD(at[2], at[44]);
    844    MULADD(at[3], at[43]);
    845    MULADD(at[4], at[42]);
    846    MULADD(at[5], at[41]);
    847    MULADD(at[6], at[40]);
    848    MULADD(at[7], at[39]);
    849    MULADD(at[8], at[38]);
    850    MULADD(at[9], at[37]);
    851    MULADD(at[10], at[36]);
    852    MULADD(at[11], at[35]);
    853    MULADD(at[12], at[34]);
    854    MULADD(at[13], at[33]);
    855    MULADD(at[14], at[32]);
    856    COMBA_STORE(C->dp[14]);
    857    /* 15 */
    858    COMBA_FORWARD;
    859    MULADD(at[0], at[47]);
    860    MULADD(at[1], at[46]);
    861    MULADD(at[2], at[45]);
    862    MULADD(at[3], at[44]);
    863    MULADD(at[4], at[43]);
    864    MULADD(at[5], at[42]);
    865    MULADD(at[6], at[41]);
    866    MULADD(at[7], at[40]);
    867    MULADD(at[8], at[39]);
    868    MULADD(at[9], at[38]);
    869    MULADD(at[10], at[37]);
    870    MULADD(at[11], at[36]);
    871    MULADD(at[12], at[35]);
    872    MULADD(at[13], at[34]);
    873    MULADD(at[14], at[33]);
    874    MULADD(at[15], at[32]);
    875    COMBA_STORE(C->dp[15]);
    876    /* 16 */
    877    COMBA_FORWARD;
    878    MULADD(at[0], at[48]);
    879    MULADD(at[1], at[47]);
    880    MULADD(at[2], at[46]);
    881    MULADD(at[3], at[45]);
    882    MULADD(at[4], at[44]);
    883    MULADD(at[5], at[43]);
    884    MULADD(at[6], at[42]);
    885    MULADD(at[7], at[41]);
    886    MULADD(at[8], at[40]);
    887    MULADD(at[9], at[39]);
    888    MULADD(at[10], at[38]);
    889    MULADD(at[11], at[37]);
    890    MULADD(at[12], at[36]);
    891    MULADD(at[13], at[35]);
    892    MULADD(at[14], at[34]);
    893    MULADD(at[15], at[33]);
    894    MULADD(at[16], at[32]);
    895    COMBA_STORE(C->dp[16]);
    896    /* 17 */
    897    COMBA_FORWARD;
    898    MULADD(at[0], at[49]);
    899    MULADD(at[1], at[48]);
    900    MULADD(at[2], at[47]);
    901    MULADD(at[3], at[46]);
    902    MULADD(at[4], at[45]);
    903    MULADD(at[5], at[44]);
    904    MULADD(at[6], at[43]);
    905    MULADD(at[7], at[42]);
    906    MULADD(at[8], at[41]);
    907    MULADD(at[9], at[40]);
    908    MULADD(at[10], at[39]);
    909    MULADD(at[11], at[38]);
    910    MULADD(at[12], at[37]);
    911    MULADD(at[13], at[36]);
    912    MULADD(at[14], at[35]);
    913    MULADD(at[15], at[34]);
    914    MULADD(at[16], at[33]);
    915    MULADD(at[17], at[32]);
    916    COMBA_STORE(C->dp[17]);
    917    /* 18 */
    918    COMBA_FORWARD;
    919    MULADD(at[0], at[50]);
    920    MULADD(at[1], at[49]);
    921    MULADD(at[2], at[48]);
    922    MULADD(at[3], at[47]);
    923    MULADD(at[4], at[46]);
    924    MULADD(at[5], at[45]);
    925    MULADD(at[6], at[44]);
    926    MULADD(at[7], at[43]);
    927    MULADD(at[8], at[42]);
    928    MULADD(at[9], at[41]);
    929    MULADD(at[10], at[40]);
    930    MULADD(at[11], at[39]);
    931    MULADD(at[12], at[38]);
    932    MULADD(at[13], at[37]);
    933    MULADD(at[14], at[36]);
    934    MULADD(at[15], at[35]);
    935    MULADD(at[16], at[34]);
    936    MULADD(at[17], at[33]);
    937    MULADD(at[18], at[32]);
    938    COMBA_STORE(C->dp[18]);
    939    /* 19 */
    940    COMBA_FORWARD;
    941    MULADD(at[0], at[51]);
    942    MULADD(at[1], at[50]);
    943    MULADD(at[2], at[49]);
    944    MULADD(at[3], at[48]);
    945    MULADD(at[4], at[47]);
    946    MULADD(at[5], at[46]);
    947    MULADD(at[6], at[45]);
    948    MULADD(at[7], at[44]);
    949    MULADD(at[8], at[43]);
    950    MULADD(at[9], at[42]);
    951    MULADD(at[10], at[41]);
    952    MULADD(at[11], at[40]);
    953    MULADD(at[12], at[39]);
    954    MULADD(at[13], at[38]);
    955    MULADD(at[14], at[37]);
    956    MULADD(at[15], at[36]);
    957    MULADD(at[16], at[35]);
    958    MULADD(at[17], at[34]);
    959    MULADD(at[18], at[33]);
    960    MULADD(at[19], at[32]);
    961    COMBA_STORE(C->dp[19]);
    962    /* 20 */
    963    COMBA_FORWARD;
    964    MULADD(at[0], at[52]);
    965    MULADD(at[1], at[51]);
    966    MULADD(at[2], at[50]);
    967    MULADD(at[3], at[49]);
    968    MULADD(at[4], at[48]);
    969    MULADD(at[5], at[47]);
    970    MULADD(at[6], at[46]);
    971    MULADD(at[7], at[45]);
    972    MULADD(at[8], at[44]);
    973    MULADD(at[9], at[43]);
    974    MULADD(at[10], at[42]);
    975    MULADD(at[11], at[41]);
    976    MULADD(at[12], at[40]);
    977    MULADD(at[13], at[39]);
    978    MULADD(at[14], at[38]);
    979    MULADD(at[15], at[37]);
    980    MULADD(at[16], at[36]);
    981    MULADD(at[17], at[35]);
    982    MULADD(at[18], at[34]);
    983    MULADD(at[19], at[33]);
    984    MULADD(at[20], at[32]);
    985    COMBA_STORE(C->dp[20]);
    986    /* 21 */
    987    COMBA_FORWARD;
    988    MULADD(at[0], at[53]);
    989    MULADD(at[1], at[52]);
    990    MULADD(at[2], at[51]);
    991    MULADD(at[3], at[50]);
    992    MULADD(at[4], at[49]);
    993    MULADD(at[5], at[48]);
    994    MULADD(at[6], at[47]);
    995    MULADD(at[7], at[46]);
    996    MULADD(at[8], at[45]);
    997    MULADD(at[9], at[44]);
    998    MULADD(at[10], at[43]);
    999    MULADD(at[11], at[42]);
   1000    MULADD(at[12], at[41]);
   1001    MULADD(at[13], at[40]);
   1002    MULADD(at[14], at[39]);
   1003    MULADD(at[15], at[38]);
   1004    MULADD(at[16], at[37]);
   1005    MULADD(at[17], at[36]);
   1006    MULADD(at[18], at[35]);
   1007    MULADD(at[19], at[34]);
   1008    MULADD(at[20], at[33]);
   1009    MULADD(at[21], at[32]);
   1010    COMBA_STORE(C->dp[21]);
   1011    /* 22 */
   1012    COMBA_FORWARD;
   1013    MULADD(at[0], at[54]);
   1014    MULADD(at[1], at[53]);
   1015    MULADD(at[2], at[52]);
   1016    MULADD(at[3], at[51]);
   1017    MULADD(at[4], at[50]);
   1018    MULADD(at[5], at[49]);
   1019    MULADD(at[6], at[48]);
   1020    MULADD(at[7], at[47]);
   1021    MULADD(at[8], at[46]);
   1022    MULADD(at[9], at[45]);
   1023    MULADD(at[10], at[44]);
   1024    MULADD(at[11], at[43]);
   1025    MULADD(at[12], at[42]);
   1026    MULADD(at[13], at[41]);
   1027    MULADD(at[14], at[40]);
   1028    MULADD(at[15], at[39]);
   1029    MULADD(at[16], at[38]);
   1030    MULADD(at[17], at[37]);
   1031    MULADD(at[18], at[36]);
   1032    MULADD(at[19], at[35]);
   1033    MULADD(at[20], at[34]);
   1034    MULADD(at[21], at[33]);
   1035    MULADD(at[22], at[32]);
   1036    COMBA_STORE(C->dp[22]);
   1037    /* 23 */
   1038    COMBA_FORWARD;
   1039    MULADD(at[0], at[55]);
   1040    MULADD(at[1], at[54]);
   1041    MULADD(at[2], at[53]);
   1042    MULADD(at[3], at[52]);
   1043    MULADD(at[4], at[51]);
   1044    MULADD(at[5], at[50]);
   1045    MULADD(at[6], at[49]);
   1046    MULADD(at[7], at[48]);
   1047    MULADD(at[8], at[47]);
   1048    MULADD(at[9], at[46]);
   1049    MULADD(at[10], at[45]);
   1050    MULADD(at[11], at[44]);
   1051    MULADD(at[12], at[43]);
   1052    MULADD(at[13], at[42]);
   1053    MULADD(at[14], at[41]);
   1054    MULADD(at[15], at[40]);
   1055    MULADD(at[16], at[39]);
   1056    MULADD(at[17], at[38]);
   1057    MULADD(at[18], at[37]);
   1058    MULADD(at[19], at[36]);
   1059    MULADD(at[20], at[35]);
   1060    MULADD(at[21], at[34]);
   1061    MULADD(at[22], at[33]);
   1062    MULADD(at[23], at[32]);
   1063    COMBA_STORE(C->dp[23]);
   1064    /* 24 */
   1065    COMBA_FORWARD;
   1066    MULADD(at[0], at[56]);
   1067    MULADD(at[1], at[55]);
   1068    MULADD(at[2], at[54]);
   1069    MULADD(at[3], at[53]);
   1070    MULADD(at[4], at[52]);
   1071    MULADD(at[5], at[51]);
   1072    MULADD(at[6], at[50]);
   1073    MULADD(at[7], at[49]);
   1074    MULADD(at[8], at[48]);
   1075    MULADD(at[9], at[47]);
   1076    MULADD(at[10], at[46]);
   1077    MULADD(at[11], at[45]);
   1078    MULADD(at[12], at[44]);
   1079    MULADD(at[13], at[43]);
   1080    MULADD(at[14], at[42]);
   1081    MULADD(at[15], at[41]);
   1082    MULADD(at[16], at[40]);
   1083    MULADD(at[17], at[39]);
   1084    MULADD(at[18], at[38]);
   1085    MULADD(at[19], at[37]);
   1086    MULADD(at[20], at[36]);
   1087    MULADD(at[21], at[35]);
   1088    MULADD(at[22], at[34]);
   1089    MULADD(at[23], at[33]);
   1090    MULADD(at[24], at[32]);
   1091    COMBA_STORE(C->dp[24]);
   1092    /* 25 */
   1093    COMBA_FORWARD;
   1094    MULADD(at[0], at[57]);
   1095    MULADD(at[1], at[56]);
   1096    MULADD(at[2], at[55]);
   1097    MULADD(at[3], at[54]);
   1098    MULADD(at[4], at[53]);
   1099    MULADD(at[5], at[52]);
   1100    MULADD(at[6], at[51]);
   1101    MULADD(at[7], at[50]);
   1102    MULADD(at[8], at[49]);
   1103    MULADD(at[9], at[48]);
   1104    MULADD(at[10], at[47]);
   1105    MULADD(at[11], at[46]);
   1106    MULADD(at[12], at[45]);
   1107    MULADD(at[13], at[44]);
   1108    MULADD(at[14], at[43]);
   1109    MULADD(at[15], at[42]);
   1110    MULADD(at[16], at[41]);
   1111    MULADD(at[17], at[40]);
   1112    MULADD(at[18], at[39]);
   1113    MULADD(at[19], at[38]);
   1114    MULADD(at[20], at[37]);
   1115    MULADD(at[21], at[36]);
   1116    MULADD(at[22], at[35]);
   1117    MULADD(at[23], at[34]);
   1118    MULADD(at[24], at[33]);
   1119    MULADD(at[25], at[32]);
   1120    COMBA_STORE(C->dp[25]);
   1121    /* 26 */
   1122    COMBA_FORWARD;
   1123    MULADD(at[0], at[58]);
   1124    MULADD(at[1], at[57]);
   1125    MULADD(at[2], at[56]);
   1126    MULADD(at[3], at[55]);
   1127    MULADD(at[4], at[54]);
   1128    MULADD(at[5], at[53]);
   1129    MULADD(at[6], at[52]);
   1130    MULADD(at[7], at[51]);
   1131    MULADD(at[8], at[50]);
   1132    MULADD(at[9], at[49]);
   1133    MULADD(at[10], at[48]);
   1134    MULADD(at[11], at[47]);
   1135    MULADD(at[12], at[46]);
   1136    MULADD(at[13], at[45]);
   1137    MULADD(at[14], at[44]);
   1138    MULADD(at[15], at[43]);
   1139    MULADD(at[16], at[42]);
   1140    MULADD(at[17], at[41]);
   1141    MULADD(at[18], at[40]);
   1142    MULADD(at[19], at[39]);
   1143    MULADD(at[20], at[38]);
   1144    MULADD(at[21], at[37]);
   1145    MULADD(at[22], at[36]);
   1146    MULADD(at[23], at[35]);
   1147    MULADD(at[24], at[34]);
   1148    MULADD(at[25], at[33]);
   1149    MULADD(at[26], at[32]);
   1150    COMBA_STORE(C->dp[26]);
   1151    /* 27 */
   1152    COMBA_FORWARD;
   1153    MULADD(at[0], at[59]);
   1154    MULADD(at[1], at[58]);
   1155    MULADD(at[2], at[57]);
   1156    MULADD(at[3], at[56]);
   1157    MULADD(at[4], at[55]);
   1158    MULADD(at[5], at[54]);
   1159    MULADD(at[6], at[53]);
   1160    MULADD(at[7], at[52]);
   1161    MULADD(at[8], at[51]);
   1162    MULADD(at[9], at[50]);
   1163    MULADD(at[10], at[49]);
   1164    MULADD(at[11], at[48]);
   1165    MULADD(at[12], at[47]);
   1166    MULADD(at[13], at[46]);
   1167    MULADD(at[14], at[45]);
   1168    MULADD(at[15], at[44]);
   1169    MULADD(at[16], at[43]);
   1170    MULADD(at[17], at[42]);
   1171    MULADD(at[18], at[41]);
   1172    MULADD(at[19], at[40]);
   1173    MULADD(at[20], at[39]);
   1174    MULADD(at[21], at[38]);
   1175    MULADD(at[22], at[37]);
   1176    MULADD(at[23], at[36]);
   1177    MULADD(at[24], at[35]);
   1178    MULADD(at[25], at[34]);
   1179    MULADD(at[26], at[33]);
   1180    MULADD(at[27], at[32]);
   1181    COMBA_STORE(C->dp[27]);
   1182    /* 28 */
   1183    COMBA_FORWARD;
   1184    MULADD(at[0], at[60]);
   1185    MULADD(at[1], at[59]);
   1186    MULADD(at[2], at[58]);
   1187    MULADD(at[3], at[57]);
   1188    MULADD(at[4], at[56]);
   1189    MULADD(at[5], at[55]);
   1190    MULADD(at[6], at[54]);
   1191    MULADD(at[7], at[53]);
   1192    MULADD(at[8], at[52]);
   1193    MULADD(at[9], at[51]);
   1194    MULADD(at[10], at[50]);
   1195    MULADD(at[11], at[49]);
   1196    MULADD(at[12], at[48]);
   1197    MULADD(at[13], at[47]);
   1198    MULADD(at[14], at[46]);
   1199    MULADD(at[15], at[45]);
   1200    MULADD(at[16], at[44]);
   1201    MULADD(at[17], at[43]);
   1202    MULADD(at[18], at[42]);
   1203    MULADD(at[19], at[41]);
   1204    MULADD(at[20], at[40]);
   1205    MULADD(at[21], at[39]);
   1206    MULADD(at[22], at[38]);
   1207    MULADD(at[23], at[37]);
   1208    MULADD(at[24], at[36]);
   1209    MULADD(at[25], at[35]);
   1210    MULADD(at[26], at[34]);
   1211    MULADD(at[27], at[33]);
   1212    MULADD(at[28], at[32]);
   1213    COMBA_STORE(C->dp[28]);
   1214    /* 29 */
   1215    COMBA_FORWARD;
   1216    MULADD(at[0], at[61]);
   1217    MULADD(at[1], at[60]);
   1218    MULADD(at[2], at[59]);
   1219    MULADD(at[3], at[58]);
   1220    MULADD(at[4], at[57]);
   1221    MULADD(at[5], at[56]);
   1222    MULADD(at[6], at[55]);
   1223    MULADD(at[7], at[54]);
   1224    MULADD(at[8], at[53]);
   1225    MULADD(at[9], at[52]);
   1226    MULADD(at[10], at[51]);
   1227    MULADD(at[11], at[50]);
   1228    MULADD(at[12], at[49]);
   1229    MULADD(at[13], at[48]);
   1230    MULADD(at[14], at[47]);
   1231    MULADD(at[15], at[46]);
   1232    MULADD(at[16], at[45]);
   1233    MULADD(at[17], at[44]);
   1234    MULADD(at[18], at[43]);
   1235    MULADD(at[19], at[42]);
   1236    MULADD(at[20], at[41]);
   1237    MULADD(at[21], at[40]);
   1238    MULADD(at[22], at[39]);
   1239    MULADD(at[23], at[38]);
   1240    MULADD(at[24], at[37]);
   1241    MULADD(at[25], at[36]);
   1242    MULADD(at[26], at[35]);
   1243    MULADD(at[27], at[34]);
   1244    MULADD(at[28], at[33]);
   1245    MULADD(at[29], at[32]);
   1246    COMBA_STORE(C->dp[29]);
   1247    /* 30 */
   1248    COMBA_FORWARD;
   1249    MULADD(at[0], at[62]);
   1250    MULADD(at[1], at[61]);
   1251    MULADD(at[2], at[60]);
   1252    MULADD(at[3], at[59]);
   1253    MULADD(at[4], at[58]);
   1254    MULADD(at[5], at[57]);
   1255    MULADD(at[6], at[56]);
   1256    MULADD(at[7], at[55]);
   1257    MULADD(at[8], at[54]);
   1258    MULADD(at[9], at[53]);
   1259    MULADD(at[10], at[52]);
   1260    MULADD(at[11], at[51]);
   1261    MULADD(at[12], at[50]);
   1262    MULADD(at[13], at[49]);
   1263    MULADD(at[14], at[48]);
   1264    MULADD(at[15], at[47]);
   1265    MULADD(at[16], at[46]);
   1266    MULADD(at[17], at[45]);
   1267    MULADD(at[18], at[44]);
   1268    MULADD(at[19], at[43]);
   1269    MULADD(at[20], at[42]);
   1270    MULADD(at[21], at[41]);
   1271    MULADD(at[22], at[40]);
   1272    MULADD(at[23], at[39]);
   1273    MULADD(at[24], at[38]);
   1274    MULADD(at[25], at[37]);
   1275    MULADD(at[26], at[36]);
   1276    MULADD(at[27], at[35]);
   1277    MULADD(at[28], at[34]);
   1278    MULADD(at[29], at[33]);
   1279    MULADD(at[30], at[32]);
   1280    COMBA_STORE(C->dp[30]);
   1281    /* 31 */
   1282    COMBA_FORWARD;
   1283    MULADD(at[0], at[63]);
   1284    MULADD(at[1], at[62]);
   1285    MULADD(at[2], at[61]);
   1286    MULADD(at[3], at[60]);
   1287    MULADD(at[4], at[59]);
   1288    MULADD(at[5], at[58]);
   1289    MULADD(at[6], at[57]);
   1290    MULADD(at[7], at[56]);
   1291    MULADD(at[8], at[55]);
   1292    MULADD(at[9], at[54]);
   1293    MULADD(at[10], at[53]);
   1294    MULADD(at[11], at[52]);
   1295    MULADD(at[12], at[51]);
   1296    MULADD(at[13], at[50]);
   1297    MULADD(at[14], at[49]);
   1298    MULADD(at[15], at[48]);
   1299    MULADD(at[16], at[47]);
   1300    MULADD(at[17], at[46]);
   1301    MULADD(at[18], at[45]);
   1302    MULADD(at[19], at[44]);
   1303    MULADD(at[20], at[43]);
   1304    MULADD(at[21], at[42]);
   1305    MULADD(at[22], at[41]);
   1306    MULADD(at[23], at[40]);
   1307    MULADD(at[24], at[39]);
   1308    MULADD(at[25], at[38]);
   1309    MULADD(at[26], at[37]);
   1310    MULADD(at[27], at[36]);
   1311    MULADD(at[28], at[35]);
   1312    MULADD(at[29], at[34]);
   1313    MULADD(at[30], at[33]);
   1314    MULADD(at[31], at[32]);
   1315    COMBA_STORE(C->dp[31]);
   1316    /* 32 */
   1317    COMBA_FORWARD;
   1318    MULADD(at[1], at[63]);
   1319    MULADD(at[2], at[62]);
   1320    MULADD(at[3], at[61]);
   1321    MULADD(at[4], at[60]);
   1322    MULADD(at[5], at[59]);
   1323    MULADD(at[6], at[58]);
   1324    MULADD(at[7], at[57]);
   1325    MULADD(at[8], at[56]);
   1326    MULADD(at[9], at[55]);
   1327    MULADD(at[10], at[54]);
   1328    MULADD(at[11], at[53]);
   1329    MULADD(at[12], at[52]);
   1330    MULADD(at[13], at[51]);
   1331    MULADD(at[14], at[50]);
   1332    MULADD(at[15], at[49]);
   1333    MULADD(at[16], at[48]);
   1334    MULADD(at[17], at[47]);
   1335    MULADD(at[18], at[46]);
   1336    MULADD(at[19], at[45]);
   1337    MULADD(at[20], at[44]);
   1338    MULADD(at[21], at[43]);
   1339    MULADD(at[22], at[42]);
   1340    MULADD(at[23], at[41]);
   1341    MULADD(at[24], at[40]);
   1342    MULADD(at[25], at[39]);
   1343    MULADD(at[26], at[38]);
   1344    MULADD(at[27], at[37]);
   1345    MULADD(at[28], at[36]);
   1346    MULADD(at[29], at[35]);
   1347    MULADD(at[30], at[34]);
   1348    MULADD(at[31], at[33]);
   1349    COMBA_STORE(C->dp[32]);
   1350    /* 33 */
   1351    COMBA_FORWARD;
   1352    MULADD(at[2], at[63]);
   1353    MULADD(at[3], at[62]);
   1354    MULADD(at[4], at[61]);
   1355    MULADD(at[5], at[60]);
   1356    MULADD(at[6], at[59]);
   1357    MULADD(at[7], at[58]);
   1358    MULADD(at[8], at[57]);
   1359    MULADD(at[9], at[56]);
   1360    MULADD(at[10], at[55]);
   1361    MULADD(at[11], at[54]);
   1362    MULADD(at[12], at[53]);
   1363    MULADD(at[13], at[52]);
   1364    MULADD(at[14], at[51]);
   1365    MULADD(at[15], at[50]);
   1366    MULADD(at[16], at[49]);
   1367    MULADD(at[17], at[48]);
   1368    MULADD(at[18], at[47]);
   1369    MULADD(at[19], at[46]);
   1370    MULADD(at[20], at[45]);
   1371    MULADD(at[21], at[44]);
   1372    MULADD(at[22], at[43]);
   1373    MULADD(at[23], at[42]);
   1374    MULADD(at[24], at[41]);
   1375    MULADD(at[25], at[40]);
   1376    MULADD(at[26], at[39]);
   1377    MULADD(at[27], at[38]);
   1378    MULADD(at[28], at[37]);
   1379    MULADD(at[29], at[36]);
   1380    MULADD(at[30], at[35]);
   1381    MULADD(at[31], at[34]);
   1382    COMBA_STORE(C->dp[33]);
   1383    /* 34 */
   1384    COMBA_FORWARD;
   1385    MULADD(at[3], at[63]);
   1386    MULADD(at[4], at[62]);
   1387    MULADD(at[5], at[61]);
   1388    MULADD(at[6], at[60]);
   1389    MULADD(at[7], at[59]);
   1390    MULADD(at[8], at[58]);
   1391    MULADD(at[9], at[57]);
   1392    MULADD(at[10], at[56]);
   1393    MULADD(at[11], at[55]);
   1394    MULADD(at[12], at[54]);
   1395    MULADD(at[13], at[53]);
   1396    MULADD(at[14], at[52]);
   1397    MULADD(at[15], at[51]);
   1398    MULADD(at[16], at[50]);
   1399    MULADD(at[17], at[49]);
   1400    MULADD(at[18], at[48]);
   1401    MULADD(at[19], at[47]);
   1402    MULADD(at[20], at[46]);
   1403    MULADD(at[21], at[45]);
   1404    MULADD(at[22], at[44]);
   1405    MULADD(at[23], at[43]);
   1406    MULADD(at[24], at[42]);
   1407    MULADD(at[25], at[41]);
   1408    MULADD(at[26], at[40]);
   1409    MULADD(at[27], at[39]);
   1410    MULADD(at[28], at[38]);
   1411    MULADD(at[29], at[37]);
   1412    MULADD(at[30], at[36]);
   1413    MULADD(at[31], at[35]);
   1414    COMBA_STORE(C->dp[34]);
   1415    /* 35 */
   1416    COMBA_FORWARD;
   1417    MULADD(at[4], at[63]);
   1418    MULADD(at[5], at[62]);
   1419    MULADD(at[6], at[61]);
   1420    MULADD(at[7], at[60]);
   1421    MULADD(at[8], at[59]);
   1422    MULADD(at[9], at[58]);
   1423    MULADD(at[10], at[57]);
   1424    MULADD(at[11], at[56]);
   1425    MULADD(at[12], at[55]);
   1426    MULADD(at[13], at[54]);
   1427    MULADD(at[14], at[53]);
   1428    MULADD(at[15], at[52]);
   1429    MULADD(at[16], at[51]);
   1430    MULADD(at[17], at[50]);
   1431    MULADD(at[18], at[49]);
   1432    MULADD(at[19], at[48]);
   1433    MULADD(at[20], at[47]);
   1434    MULADD(at[21], at[46]);
   1435    MULADD(at[22], at[45]);
   1436    MULADD(at[23], at[44]);
   1437    MULADD(at[24], at[43]);
   1438    MULADD(at[25], at[42]);
   1439    MULADD(at[26], at[41]);
   1440    MULADD(at[27], at[40]);
   1441    MULADD(at[28], at[39]);
   1442    MULADD(at[29], at[38]);
   1443    MULADD(at[30], at[37]);
   1444    MULADD(at[31], at[36]);
   1445    COMBA_STORE(C->dp[35]);
   1446    /* 36 */
   1447    COMBA_FORWARD;
   1448    MULADD(at[5], at[63]);
   1449    MULADD(at[6], at[62]);
   1450    MULADD(at[7], at[61]);
   1451    MULADD(at[8], at[60]);
   1452    MULADD(at[9], at[59]);
   1453    MULADD(at[10], at[58]);
   1454    MULADD(at[11], at[57]);
   1455    MULADD(at[12], at[56]);
   1456    MULADD(at[13], at[55]);
   1457    MULADD(at[14], at[54]);
   1458    MULADD(at[15], at[53]);
   1459    MULADD(at[16], at[52]);
   1460    MULADD(at[17], at[51]);
   1461    MULADD(at[18], at[50]);
   1462    MULADD(at[19], at[49]);
   1463    MULADD(at[20], at[48]);
   1464    MULADD(at[21], at[47]);
   1465    MULADD(at[22], at[46]);
   1466    MULADD(at[23], at[45]);
   1467    MULADD(at[24], at[44]);
   1468    MULADD(at[25], at[43]);
   1469    MULADD(at[26], at[42]);
   1470    MULADD(at[27], at[41]);
   1471    MULADD(at[28], at[40]);
   1472    MULADD(at[29], at[39]);
   1473    MULADD(at[30], at[38]);
   1474    MULADD(at[31], at[37]);
   1475    COMBA_STORE(C->dp[36]);
   1476    /* 37 */
   1477    COMBA_FORWARD;
   1478    MULADD(at[6], at[63]);
   1479    MULADD(at[7], at[62]);
   1480    MULADD(at[8], at[61]);
   1481    MULADD(at[9], at[60]);
   1482    MULADD(at[10], at[59]);
   1483    MULADD(at[11], at[58]);
   1484    MULADD(at[12], at[57]);
   1485    MULADD(at[13], at[56]);
   1486    MULADD(at[14], at[55]);
   1487    MULADD(at[15], at[54]);
   1488    MULADD(at[16], at[53]);
   1489    MULADD(at[17], at[52]);
   1490    MULADD(at[18], at[51]);
   1491    MULADD(at[19], at[50]);
   1492    MULADD(at[20], at[49]);
   1493    MULADD(at[21], at[48]);
   1494    MULADD(at[22], at[47]);
   1495    MULADD(at[23], at[46]);
   1496    MULADD(at[24], at[45]);
   1497    MULADD(at[25], at[44]);
   1498    MULADD(at[26], at[43]);
   1499    MULADD(at[27], at[42]);
   1500    MULADD(at[28], at[41]);
   1501    MULADD(at[29], at[40]);
   1502    MULADD(at[30], at[39]);
   1503    MULADD(at[31], at[38]);
   1504    COMBA_STORE(C->dp[37]);
   1505    /* 38 */
   1506    COMBA_FORWARD;
   1507    MULADD(at[7], at[63]);
   1508    MULADD(at[8], at[62]);
   1509    MULADD(at[9], at[61]);
   1510    MULADD(at[10], at[60]);
   1511    MULADD(at[11], at[59]);
   1512    MULADD(at[12], at[58]);
   1513    MULADD(at[13], at[57]);
   1514    MULADD(at[14], at[56]);
   1515    MULADD(at[15], at[55]);
   1516    MULADD(at[16], at[54]);
   1517    MULADD(at[17], at[53]);
   1518    MULADD(at[18], at[52]);
   1519    MULADD(at[19], at[51]);
   1520    MULADD(at[20], at[50]);
   1521    MULADD(at[21], at[49]);
   1522    MULADD(at[22], at[48]);
   1523    MULADD(at[23], at[47]);
   1524    MULADD(at[24], at[46]);
   1525    MULADD(at[25], at[45]);
   1526    MULADD(at[26], at[44]);
   1527    MULADD(at[27], at[43]);
   1528    MULADD(at[28], at[42]);
   1529    MULADD(at[29], at[41]);
   1530    MULADD(at[30], at[40]);
   1531    MULADD(at[31], at[39]);
   1532    COMBA_STORE(C->dp[38]);
   1533    /* 39 */
   1534    COMBA_FORWARD;
   1535    MULADD(at[8], at[63]);
   1536    MULADD(at[9], at[62]);
   1537    MULADD(at[10], at[61]);
   1538    MULADD(at[11], at[60]);
   1539    MULADD(at[12], at[59]);
   1540    MULADD(at[13], at[58]);
   1541    MULADD(at[14], at[57]);
   1542    MULADD(at[15], at[56]);
   1543    MULADD(at[16], at[55]);
   1544    MULADD(at[17], at[54]);
   1545    MULADD(at[18], at[53]);
   1546    MULADD(at[19], at[52]);
   1547    MULADD(at[20], at[51]);
   1548    MULADD(at[21], at[50]);
   1549    MULADD(at[22], at[49]);
   1550    MULADD(at[23], at[48]);
   1551    MULADD(at[24], at[47]);
   1552    MULADD(at[25], at[46]);
   1553    MULADD(at[26], at[45]);
   1554    MULADD(at[27], at[44]);
   1555    MULADD(at[28], at[43]);
   1556    MULADD(at[29], at[42]);
   1557    MULADD(at[30], at[41]);
   1558    MULADD(at[31], at[40]);
   1559    COMBA_STORE(C->dp[39]);
   1560    /* 40 */
   1561    COMBA_FORWARD;
   1562    MULADD(at[9], at[63]);
   1563    MULADD(at[10], at[62]);
   1564    MULADD(at[11], at[61]);
   1565    MULADD(at[12], at[60]);
   1566    MULADD(at[13], at[59]);
   1567    MULADD(at[14], at[58]);
   1568    MULADD(at[15], at[57]);
   1569    MULADD(at[16], at[56]);
   1570    MULADD(at[17], at[55]);
   1571    MULADD(at[18], at[54]);
   1572    MULADD(at[19], at[53]);
   1573    MULADD(at[20], at[52]);
   1574    MULADD(at[21], at[51]);
   1575    MULADD(at[22], at[50]);
   1576    MULADD(at[23], at[49]);
   1577    MULADD(at[24], at[48]);
   1578    MULADD(at[25], at[47]);
   1579    MULADD(at[26], at[46]);
   1580    MULADD(at[27], at[45]);
   1581    MULADD(at[28], at[44]);
   1582    MULADD(at[29], at[43]);
   1583    MULADD(at[30], at[42]);
   1584    MULADD(at[31], at[41]);
   1585    COMBA_STORE(C->dp[40]);
   1586    /* 41 */
   1587    COMBA_FORWARD;
   1588    MULADD(at[10], at[63]);
   1589    MULADD(at[11], at[62]);
   1590    MULADD(at[12], at[61]);
   1591    MULADD(at[13], at[60]);
   1592    MULADD(at[14], at[59]);
   1593    MULADD(at[15], at[58]);
   1594    MULADD(at[16], at[57]);
   1595    MULADD(at[17], at[56]);
   1596    MULADD(at[18], at[55]);
   1597    MULADD(at[19], at[54]);
   1598    MULADD(at[20], at[53]);
   1599    MULADD(at[21], at[52]);
   1600    MULADD(at[22], at[51]);
   1601    MULADD(at[23], at[50]);
   1602    MULADD(at[24], at[49]);
   1603    MULADD(at[25], at[48]);
   1604    MULADD(at[26], at[47]);
   1605    MULADD(at[27], at[46]);
   1606    MULADD(at[28], at[45]);
   1607    MULADD(at[29], at[44]);
   1608    MULADD(at[30], at[43]);
   1609    MULADD(at[31], at[42]);
   1610    COMBA_STORE(C->dp[41]);
   1611    /* 42 */
   1612    COMBA_FORWARD;
   1613    MULADD(at[11], at[63]);
   1614    MULADD(at[12], at[62]);
   1615    MULADD(at[13], at[61]);
   1616    MULADD(at[14], at[60]);
   1617    MULADD(at[15], at[59]);
   1618    MULADD(at[16], at[58]);
   1619    MULADD(at[17], at[57]);
   1620    MULADD(at[18], at[56]);
   1621    MULADD(at[19], at[55]);
   1622    MULADD(at[20], at[54]);
   1623    MULADD(at[21], at[53]);
   1624    MULADD(at[22], at[52]);
   1625    MULADD(at[23], at[51]);
   1626    MULADD(at[24], at[50]);
   1627    MULADD(at[25], at[49]);
   1628    MULADD(at[26], at[48]);
   1629    MULADD(at[27], at[47]);
   1630    MULADD(at[28], at[46]);
   1631    MULADD(at[29], at[45]);
   1632    MULADD(at[30], at[44]);
   1633    MULADD(at[31], at[43]);
   1634    COMBA_STORE(C->dp[42]);
   1635    /* 43 */
   1636    COMBA_FORWARD;
   1637    MULADD(at[12], at[63]);
   1638    MULADD(at[13], at[62]);
   1639    MULADD(at[14], at[61]);
   1640    MULADD(at[15], at[60]);
   1641    MULADD(at[16], at[59]);
   1642    MULADD(at[17], at[58]);
   1643    MULADD(at[18], at[57]);
   1644    MULADD(at[19], at[56]);
   1645    MULADD(at[20], at[55]);
   1646    MULADD(at[21], at[54]);
   1647    MULADD(at[22], at[53]);
   1648    MULADD(at[23], at[52]);
   1649    MULADD(at[24], at[51]);
   1650    MULADD(at[25], at[50]);
   1651    MULADD(at[26], at[49]);
   1652    MULADD(at[27], at[48]);
   1653    MULADD(at[28], at[47]);
   1654    MULADD(at[29], at[46]);
   1655    MULADD(at[30], at[45]);
   1656    MULADD(at[31], at[44]);
   1657    COMBA_STORE(C->dp[43]);
   1658    /* 44 */
   1659    COMBA_FORWARD;
   1660    MULADD(at[13], at[63]);
   1661    MULADD(at[14], at[62]);
   1662    MULADD(at[15], at[61]);
   1663    MULADD(at[16], at[60]);
   1664    MULADD(at[17], at[59]);
   1665    MULADD(at[18], at[58]);
   1666    MULADD(at[19], at[57]);
   1667    MULADD(at[20], at[56]);
   1668    MULADD(at[21], at[55]);
   1669    MULADD(at[22], at[54]);
   1670    MULADD(at[23], at[53]);
   1671    MULADD(at[24], at[52]);
   1672    MULADD(at[25], at[51]);
   1673    MULADD(at[26], at[50]);
   1674    MULADD(at[27], at[49]);
   1675    MULADD(at[28], at[48]);
   1676    MULADD(at[29], at[47]);
   1677    MULADD(at[30], at[46]);
   1678    MULADD(at[31], at[45]);
   1679    COMBA_STORE(C->dp[44]);
   1680    /* 45 */
   1681    COMBA_FORWARD;
   1682    MULADD(at[14], at[63]);
   1683    MULADD(at[15], at[62]);
   1684    MULADD(at[16], at[61]);
   1685    MULADD(at[17], at[60]);
   1686    MULADD(at[18], at[59]);
   1687    MULADD(at[19], at[58]);
   1688    MULADD(at[20], at[57]);
   1689    MULADD(at[21], at[56]);
   1690    MULADD(at[22], at[55]);
   1691    MULADD(at[23], at[54]);
   1692    MULADD(at[24], at[53]);
   1693    MULADD(at[25], at[52]);
   1694    MULADD(at[26], at[51]);
   1695    MULADD(at[27], at[50]);
   1696    MULADD(at[28], at[49]);
   1697    MULADD(at[29], at[48]);
   1698    MULADD(at[30], at[47]);
   1699    MULADD(at[31], at[46]);
   1700    COMBA_STORE(C->dp[45]);
   1701    /* 46 */
   1702    COMBA_FORWARD;
   1703    MULADD(at[15], at[63]);
   1704    MULADD(at[16], at[62]);
   1705    MULADD(at[17], at[61]);
   1706    MULADD(at[18], at[60]);
   1707    MULADD(at[19], at[59]);
   1708    MULADD(at[20], at[58]);
   1709    MULADD(at[21], at[57]);
   1710    MULADD(at[22], at[56]);
   1711    MULADD(at[23], at[55]);
   1712    MULADD(at[24], at[54]);
   1713    MULADD(at[25], at[53]);
   1714    MULADD(at[26], at[52]);
   1715    MULADD(at[27], at[51]);
   1716    MULADD(at[28], at[50]);
   1717    MULADD(at[29], at[49]);
   1718    MULADD(at[30], at[48]);
   1719    MULADD(at[31], at[47]);
   1720    COMBA_STORE(C->dp[46]);
   1721    /* 47 */
   1722    COMBA_FORWARD;
   1723    MULADD(at[16], at[63]);
   1724    MULADD(at[17], at[62]);
   1725    MULADD(at[18], at[61]);
   1726    MULADD(at[19], at[60]);
   1727    MULADD(at[20], at[59]);
   1728    MULADD(at[21], at[58]);
   1729    MULADD(at[22], at[57]);
   1730    MULADD(at[23], at[56]);
   1731    MULADD(at[24], at[55]);
   1732    MULADD(at[25], at[54]);
   1733    MULADD(at[26], at[53]);
   1734    MULADD(at[27], at[52]);
   1735    MULADD(at[28], at[51]);
   1736    MULADD(at[29], at[50]);
   1737    MULADD(at[30], at[49]);
   1738    MULADD(at[31], at[48]);
   1739    COMBA_STORE(C->dp[47]);
   1740    /* 48 */
   1741    COMBA_FORWARD;
   1742    MULADD(at[17], at[63]);
   1743    MULADD(at[18], at[62]);
   1744    MULADD(at[19], at[61]);
   1745    MULADD(at[20], at[60]);
   1746    MULADD(at[21], at[59]);
   1747    MULADD(at[22], at[58]);
   1748    MULADD(at[23], at[57]);
   1749    MULADD(at[24], at[56]);
   1750    MULADD(at[25], at[55]);
   1751    MULADD(at[26], at[54]);
   1752    MULADD(at[27], at[53]);
   1753    MULADD(at[28], at[52]);
   1754    MULADD(at[29], at[51]);
   1755    MULADD(at[30], at[50]);
   1756    MULADD(at[31], at[49]);
   1757    COMBA_STORE(C->dp[48]);
   1758    /* 49 */
   1759    COMBA_FORWARD;
   1760    MULADD(at[18], at[63]);
   1761    MULADD(at[19], at[62]);
   1762    MULADD(at[20], at[61]);
   1763    MULADD(at[21], at[60]);
   1764    MULADD(at[22], at[59]);
   1765    MULADD(at[23], at[58]);
   1766    MULADD(at[24], at[57]);
   1767    MULADD(at[25], at[56]);
   1768    MULADD(at[26], at[55]);
   1769    MULADD(at[27], at[54]);
   1770    MULADD(at[28], at[53]);
   1771    MULADD(at[29], at[52]);
   1772    MULADD(at[30], at[51]);
   1773    MULADD(at[31], at[50]);
   1774    COMBA_STORE(C->dp[49]);
   1775    /* 50 */
   1776    COMBA_FORWARD;
   1777    MULADD(at[19], at[63]);
   1778    MULADD(at[20], at[62]);
   1779    MULADD(at[21], at[61]);
   1780    MULADD(at[22], at[60]);
   1781    MULADD(at[23], at[59]);
   1782    MULADD(at[24], at[58]);
   1783    MULADD(at[25], at[57]);
   1784    MULADD(at[26], at[56]);
   1785    MULADD(at[27], at[55]);
   1786    MULADD(at[28], at[54]);
   1787    MULADD(at[29], at[53]);
   1788    MULADD(at[30], at[52]);
   1789    MULADD(at[31], at[51]);
   1790    COMBA_STORE(C->dp[50]);
   1791    /* 51 */
   1792    COMBA_FORWARD;
   1793    MULADD(at[20], at[63]);
   1794    MULADD(at[21], at[62]);
   1795    MULADD(at[22], at[61]);
   1796    MULADD(at[23], at[60]);
   1797    MULADD(at[24], at[59]);
   1798    MULADD(at[25], at[58]);
   1799    MULADD(at[26], at[57]);
   1800    MULADD(at[27], at[56]);
   1801    MULADD(at[28], at[55]);
   1802    MULADD(at[29], at[54]);
   1803    MULADD(at[30], at[53]);
   1804    MULADD(at[31], at[52]);
   1805    COMBA_STORE(C->dp[51]);
   1806    /* 52 */
   1807    COMBA_FORWARD;
   1808    MULADD(at[21], at[63]);
   1809    MULADD(at[22], at[62]);
   1810    MULADD(at[23], at[61]);
   1811    MULADD(at[24], at[60]);
   1812    MULADD(at[25], at[59]);
   1813    MULADD(at[26], at[58]);
   1814    MULADD(at[27], at[57]);
   1815    MULADD(at[28], at[56]);
   1816    MULADD(at[29], at[55]);
   1817    MULADD(at[30], at[54]);
   1818    MULADD(at[31], at[53]);
   1819    COMBA_STORE(C->dp[52]);
   1820    /* 53 */
   1821    COMBA_FORWARD;
   1822    MULADD(at[22], at[63]);
   1823    MULADD(at[23], at[62]);
   1824    MULADD(at[24], at[61]);
   1825    MULADD(at[25], at[60]);
   1826    MULADD(at[26], at[59]);
   1827    MULADD(at[27], at[58]);
   1828    MULADD(at[28], at[57]);
   1829    MULADD(at[29], at[56]);
   1830    MULADD(at[30], at[55]);
   1831    MULADD(at[31], at[54]);
   1832    COMBA_STORE(C->dp[53]);
   1833    /* 54 */
   1834    COMBA_FORWARD;
   1835    MULADD(at[23], at[63]);
   1836    MULADD(at[24], at[62]);
   1837    MULADD(at[25], at[61]);
   1838    MULADD(at[26], at[60]);
   1839    MULADD(at[27], at[59]);
   1840    MULADD(at[28], at[58]);
   1841    MULADD(at[29], at[57]);
   1842    MULADD(at[30], at[56]);
   1843    MULADD(at[31], at[55]);
   1844    COMBA_STORE(C->dp[54]);
   1845    /* 55 */
   1846    COMBA_FORWARD;
   1847    MULADD(at[24], at[63]);
   1848    MULADD(at[25], at[62]);
   1849    MULADD(at[26], at[61]);
   1850    MULADD(at[27], at[60]);
   1851    MULADD(at[28], at[59]);
   1852    MULADD(at[29], at[58]);
   1853    MULADD(at[30], at[57]);
   1854    MULADD(at[31], at[56]);
   1855    COMBA_STORE(C->dp[55]);
   1856    /* 56 */
   1857    COMBA_FORWARD;
   1858    MULADD(at[25], at[63]);
   1859    MULADD(at[26], at[62]);
   1860    MULADD(at[27], at[61]);
   1861    MULADD(at[28], at[60]);
   1862    MULADD(at[29], at[59]);
   1863    MULADD(at[30], at[58]);
   1864    MULADD(at[31], at[57]);
   1865    COMBA_STORE(C->dp[56]);
   1866    /* 57 */
   1867    COMBA_FORWARD;
   1868    MULADD(at[26], at[63]);
   1869    MULADD(at[27], at[62]);
   1870    MULADD(at[28], at[61]);
   1871    MULADD(at[29], at[60]);
   1872    MULADD(at[30], at[59]);
   1873    MULADD(at[31], at[58]);
   1874    COMBA_STORE(C->dp[57]);
   1875    /* 58 */
   1876    COMBA_FORWARD;
   1877    MULADD(at[27], at[63]);
   1878    MULADD(at[28], at[62]);
   1879    MULADD(at[29], at[61]);
   1880    MULADD(at[30], at[60]);
   1881    MULADD(at[31], at[59]);
   1882    COMBA_STORE(C->dp[58]);
   1883    /* 59 */
   1884    COMBA_FORWARD;
   1885    MULADD(at[28], at[63]);
   1886    MULADD(at[29], at[62]);
   1887    MULADD(at[30], at[61]);
   1888    MULADD(at[31], at[60]);
   1889    COMBA_STORE(C->dp[59]);
   1890    /* 60 */
   1891    COMBA_FORWARD;
   1892    MULADD(at[29], at[63]);
   1893    MULADD(at[30], at[62]);
   1894    MULADD(at[31], at[61]);
   1895    COMBA_STORE(C->dp[60]);
   1896    /* 61 */
   1897    COMBA_FORWARD;
   1898    MULADD(at[30], at[63]);
   1899    MULADD(at[31], at[62]);
   1900    COMBA_STORE(C->dp[61]);
   1901    /* 62 */
   1902    COMBA_FORWARD;
   1903    MULADD(at[31], at[63]);
   1904    COMBA_STORE(C->dp[62]);
   1905    COMBA_STORE2(C->dp[63]);
   1906    C->used = 64;
   1907    C->sign = A->sign ^ B->sign;
   1908    mp_clamp(C);
   1909    COMBA_FINI;
   1910 }
   1911 
   1912 void
   1913 s_mp_sqr_comba_4(const mp_int *A, mp_int *B)
   1914 {
   1915    mp_digit *a, b[8], c0, c1, c2;
   1916 
   1917    a = A->dp;
   1918    COMBA_START;
   1919 
   1920    /* clear carries */
   1921    CLEAR_CARRY;
   1922 
   1923    /* output 0 */
   1924    SQRADD(a[0], a[0]);
   1925    COMBA_STORE(b[0]);
   1926 
   1927    /* output 1 */
   1928    CARRY_FORWARD;
   1929    SQRADD2(a[0], a[1]);
   1930    COMBA_STORE(b[1]);
   1931 
   1932    /* output 2 */
   1933    CARRY_FORWARD;
   1934    SQRADD2(a[0], a[2]);
   1935    SQRADD(a[1], a[1]);
   1936    COMBA_STORE(b[2]);
   1937 
   1938    /* output 3 */
   1939    CARRY_FORWARD;
   1940    SQRADD2(a[0], a[3]);
   1941    SQRADD2(a[1], a[2]);
   1942    COMBA_STORE(b[3]);
   1943 
   1944    /* output 4 */
   1945    CARRY_FORWARD;
   1946    SQRADD2(a[1], a[3]);
   1947    SQRADD(a[2], a[2]);
   1948    COMBA_STORE(b[4]);
   1949 
   1950    /* output 5 */
   1951    CARRY_FORWARD;
   1952    SQRADD2(a[2], a[3]);
   1953    COMBA_STORE(b[5]);
   1954 
   1955    /* output 6 */
   1956    CARRY_FORWARD;
   1957    SQRADD(a[3], a[3]);
   1958    COMBA_STORE(b[6]);
   1959    COMBA_STORE2(b[7]);
   1960    COMBA_FINI;
   1961 
   1962    B->used = 8;
   1963    B->sign = ZPOS;
   1964    memcpy(B->dp, b, 8 * sizeof(mp_digit));
   1965    mp_clamp(B);
   1966 }
   1967 
   1968 void
   1969 s_mp_sqr_comba_8(const mp_int *A, mp_int *B)
   1970 {
   1971    mp_digit *a, b[16], c0, c1, c2, sc0, sc1, sc2;
   1972 
   1973    a = A->dp;
   1974    COMBA_START;
   1975 
   1976    /* clear carries */
   1977    CLEAR_CARRY;
   1978 
   1979    /* output 0 */
   1980    SQRADD(a[0], a[0]);
   1981    COMBA_STORE(b[0]);
   1982 
   1983    /* output 1 */
   1984    CARRY_FORWARD;
   1985    SQRADD2(a[0], a[1]);
   1986    COMBA_STORE(b[1]);
   1987 
   1988    /* output 2 */
   1989    CARRY_FORWARD;
   1990    SQRADD2(a[0], a[2]);
   1991    SQRADD(a[1], a[1]);
   1992    COMBA_STORE(b[2]);
   1993 
   1994    /* output 3 */
   1995    CARRY_FORWARD;
   1996    SQRADD2(a[0], a[3]);
   1997    SQRADD2(a[1], a[2]);
   1998    COMBA_STORE(b[3]);
   1999 
   2000    /* output 4 */
   2001    CARRY_FORWARD;
   2002    SQRADD2(a[0], a[4]);
   2003    SQRADD2(a[1], a[3]);
   2004    SQRADD(a[2], a[2]);
   2005    COMBA_STORE(b[4]);
   2006 
   2007    /* output 5 */
   2008    CARRY_FORWARD;
   2009    SQRADDSC(a[0], a[5]);
   2010    SQRADDAC(a[1], a[4]);
   2011    SQRADDAC(a[2], a[3]);
   2012    SQRADDDB;
   2013    COMBA_STORE(b[5]);
   2014 
   2015    /* output 6 */
   2016    CARRY_FORWARD;
   2017    SQRADDSC(a[0], a[6]);
   2018    SQRADDAC(a[1], a[5]);
   2019    SQRADDAC(a[2], a[4]);
   2020    SQRADDDB;
   2021    SQRADD(a[3], a[3]);
   2022    COMBA_STORE(b[6]);
   2023 
   2024    /* output 7 */
   2025    CARRY_FORWARD;
   2026    SQRADDSC(a[0], a[7]);
   2027    SQRADDAC(a[1], a[6]);
   2028    SQRADDAC(a[2], a[5]);
   2029    SQRADDAC(a[3], a[4]);
   2030    SQRADDDB;
   2031    COMBA_STORE(b[7]);
   2032 
   2033    /* output 8 */
   2034    CARRY_FORWARD;
   2035    SQRADDSC(a[1], a[7]);
   2036    SQRADDAC(a[2], a[6]);
   2037    SQRADDAC(a[3], a[5]);
   2038    SQRADDDB;
   2039    SQRADD(a[4], a[4]);
   2040    COMBA_STORE(b[8]);
   2041 
   2042    /* output 9 */
   2043    CARRY_FORWARD;
   2044    SQRADDSC(a[2], a[7]);
   2045    SQRADDAC(a[3], a[6]);
   2046    SQRADDAC(a[4], a[5]);
   2047    SQRADDDB;
   2048    COMBA_STORE(b[9]);
   2049 
   2050    /* output 10 */
   2051    CARRY_FORWARD;
   2052    SQRADD2(a[3], a[7]);
   2053    SQRADD2(a[4], a[6]);
   2054    SQRADD(a[5], a[5]);
   2055    COMBA_STORE(b[10]);
   2056 
   2057    /* output 11 */
   2058    CARRY_FORWARD;
   2059    SQRADD2(a[4], a[7]);
   2060    SQRADD2(a[5], a[6]);
   2061    COMBA_STORE(b[11]);
   2062 
   2063    /* output 12 */
   2064    CARRY_FORWARD;
   2065    SQRADD2(a[5], a[7]);
   2066    SQRADD(a[6], a[6]);
   2067    COMBA_STORE(b[12]);
   2068 
   2069    /* output 13 */
   2070    CARRY_FORWARD;
   2071    SQRADD2(a[6], a[7]);
   2072    COMBA_STORE(b[13]);
   2073 
   2074    /* output 14 */
   2075    CARRY_FORWARD;
   2076    SQRADD(a[7], a[7]);
   2077    COMBA_STORE(b[14]);
   2078    COMBA_STORE2(b[15]);
   2079    COMBA_FINI;
   2080 
   2081    B->used = 16;
   2082    B->sign = ZPOS;
   2083    memcpy(B->dp, b, 16 * sizeof(mp_digit));
   2084    mp_clamp(B);
   2085 }
   2086 
   2087 void
   2088 s_mp_sqr_comba_16(const mp_int *A, mp_int *B)
   2089 {
   2090    mp_digit *a, b[32], c0, c1, c2, sc0, sc1, sc2;
   2091 
   2092    a = A->dp;
   2093    COMBA_START;
   2094 
   2095    /* clear carries */
   2096    CLEAR_CARRY;
   2097 
   2098    /* output 0 */
   2099    SQRADD(a[0], a[0]);
   2100    COMBA_STORE(b[0]);
   2101 
   2102    /* output 1 */
   2103    CARRY_FORWARD;
   2104    SQRADD2(a[0], a[1]);
   2105    COMBA_STORE(b[1]);
   2106 
   2107    /* output 2 */
   2108    CARRY_FORWARD;
   2109    SQRADD2(a[0], a[2]);
   2110    SQRADD(a[1], a[1]);
   2111    COMBA_STORE(b[2]);
   2112 
   2113    /* output 3 */
   2114    CARRY_FORWARD;
   2115    SQRADD2(a[0], a[3]);
   2116    SQRADD2(a[1], a[2]);
   2117    COMBA_STORE(b[3]);
   2118 
   2119    /* output 4 */
   2120    CARRY_FORWARD;
   2121    SQRADD2(a[0], a[4]);
   2122    SQRADD2(a[1], a[3]);
   2123    SQRADD(a[2], a[2]);
   2124    COMBA_STORE(b[4]);
   2125 
   2126    /* output 5 */
   2127    CARRY_FORWARD;
   2128    SQRADDSC(a[0], a[5]);
   2129    SQRADDAC(a[1], a[4]);
   2130    SQRADDAC(a[2], a[3]);
   2131    SQRADDDB;
   2132    COMBA_STORE(b[5]);
   2133 
   2134    /* output 6 */
   2135    CARRY_FORWARD;
   2136    SQRADDSC(a[0], a[6]);
   2137    SQRADDAC(a[1], a[5]);
   2138    SQRADDAC(a[2], a[4]);
   2139    SQRADDDB;
   2140    SQRADD(a[3], a[3]);
   2141    COMBA_STORE(b[6]);
   2142 
   2143    /* output 7 */
   2144    CARRY_FORWARD;
   2145    SQRADDSC(a[0], a[7]);
   2146    SQRADDAC(a[1], a[6]);
   2147    SQRADDAC(a[2], a[5]);
   2148    SQRADDAC(a[3], a[4]);
   2149    SQRADDDB;
   2150    COMBA_STORE(b[7]);
   2151 
   2152    /* output 8 */
   2153    CARRY_FORWARD;
   2154    SQRADDSC(a[0], a[8]);
   2155    SQRADDAC(a[1], a[7]);
   2156    SQRADDAC(a[2], a[6]);
   2157    SQRADDAC(a[3], a[5]);
   2158    SQRADDDB;
   2159    SQRADD(a[4], a[4]);
   2160    COMBA_STORE(b[8]);
   2161 
   2162    /* output 9 */
   2163    CARRY_FORWARD;
   2164    SQRADDSC(a[0], a[9]);
   2165    SQRADDAC(a[1], a[8]);
   2166    SQRADDAC(a[2], a[7]);
   2167    SQRADDAC(a[3], a[6]);
   2168    SQRADDAC(a[4], a[5]);
   2169    SQRADDDB;
   2170    COMBA_STORE(b[9]);
   2171 
   2172    /* output 10 */
   2173    CARRY_FORWARD;
   2174    SQRADDSC(a[0], a[10]);
   2175    SQRADDAC(a[1], a[9]);
   2176    SQRADDAC(a[2], a[8]);
   2177    SQRADDAC(a[3], a[7]);
   2178    SQRADDAC(a[4], a[6]);
   2179    SQRADDDB;
   2180    SQRADD(a[5], a[5]);
   2181    COMBA_STORE(b[10]);
   2182 
   2183    /* output 11 */
   2184    CARRY_FORWARD;
   2185    SQRADDSC(a[0], a[11]);
   2186    SQRADDAC(a[1], a[10]);
   2187    SQRADDAC(a[2], a[9]);
   2188    SQRADDAC(a[3], a[8]);
   2189    SQRADDAC(a[4], a[7]);
   2190    SQRADDAC(a[5], a[6]);
   2191    SQRADDDB;
   2192    COMBA_STORE(b[11]);
   2193 
   2194    /* output 12 */
   2195    CARRY_FORWARD;
   2196    SQRADDSC(a[0], a[12]);
   2197    SQRADDAC(a[1], a[11]);
   2198    SQRADDAC(a[2], a[10]);
   2199    SQRADDAC(a[3], a[9]);
   2200    SQRADDAC(a[4], a[8]);
   2201    SQRADDAC(a[5], a[7]);
   2202    SQRADDDB;
   2203    SQRADD(a[6], a[6]);
   2204    COMBA_STORE(b[12]);
   2205 
   2206    /* output 13 */
   2207    CARRY_FORWARD;
   2208    SQRADDSC(a[0], a[13]);
   2209    SQRADDAC(a[1], a[12]);
   2210    SQRADDAC(a[2], a[11]);
   2211    SQRADDAC(a[3], a[10]);
   2212    SQRADDAC(a[4], a[9]);
   2213    SQRADDAC(a[5], a[8]);
   2214    SQRADDAC(a[6], a[7]);
   2215    SQRADDDB;
   2216    COMBA_STORE(b[13]);
   2217 
   2218    /* output 14 */
   2219    CARRY_FORWARD;
   2220    SQRADDSC(a[0], a[14]);
   2221    SQRADDAC(a[1], a[13]);
   2222    SQRADDAC(a[2], a[12]);
   2223    SQRADDAC(a[3], a[11]);
   2224    SQRADDAC(a[4], a[10]);
   2225    SQRADDAC(a[5], a[9]);
   2226    SQRADDAC(a[6], a[8]);
   2227    SQRADDDB;
   2228    SQRADD(a[7], a[7]);
   2229    COMBA_STORE(b[14]);
   2230 
   2231    /* output 15 */
   2232    CARRY_FORWARD;
   2233    SQRADDSC(a[0], a[15]);
   2234    SQRADDAC(a[1], a[14]);
   2235    SQRADDAC(a[2], a[13]);
   2236    SQRADDAC(a[3], a[12]);
   2237    SQRADDAC(a[4], a[11]);
   2238    SQRADDAC(a[5], a[10]);
   2239    SQRADDAC(a[6], a[9]);
   2240    SQRADDAC(a[7], a[8]);
   2241    SQRADDDB;
   2242    COMBA_STORE(b[15]);
   2243 
   2244    /* output 16 */
   2245    CARRY_FORWARD;
   2246    SQRADDSC(a[1], a[15]);
   2247    SQRADDAC(a[2], a[14]);
   2248    SQRADDAC(a[3], a[13]);
   2249    SQRADDAC(a[4], a[12]);
   2250    SQRADDAC(a[5], a[11]);
   2251    SQRADDAC(a[6], a[10]);
   2252    SQRADDAC(a[7], a[9]);
   2253    SQRADDDB;
   2254    SQRADD(a[8], a[8]);
   2255    COMBA_STORE(b[16]);
   2256 
   2257    /* output 17 */
   2258    CARRY_FORWARD;
   2259    SQRADDSC(a[2], a[15]);
   2260    SQRADDAC(a[3], a[14]);
   2261    SQRADDAC(a[4], a[13]);
   2262    SQRADDAC(a[5], a[12]);
   2263    SQRADDAC(a[6], a[11]);
   2264    SQRADDAC(a[7], a[10]);
   2265    SQRADDAC(a[8], a[9]);
   2266    SQRADDDB;
   2267    COMBA_STORE(b[17]);
   2268 
   2269    /* output 18 */
   2270    CARRY_FORWARD;
   2271    SQRADDSC(a[3], a[15]);
   2272    SQRADDAC(a[4], a[14]);
   2273    SQRADDAC(a[5], a[13]);
   2274    SQRADDAC(a[6], a[12]);
   2275    SQRADDAC(a[7], a[11]);
   2276    SQRADDAC(a[8], a[10]);
   2277    SQRADDDB;
   2278    SQRADD(a[9], a[9]);
   2279    COMBA_STORE(b[18]);
   2280 
   2281    /* output 19 */
   2282    CARRY_FORWARD;
   2283    SQRADDSC(a[4], a[15]);
   2284    SQRADDAC(a[5], a[14]);
   2285    SQRADDAC(a[6], a[13]);
   2286    SQRADDAC(a[7], a[12]);
   2287    SQRADDAC(a[8], a[11]);
   2288    SQRADDAC(a[9], a[10]);
   2289    SQRADDDB;
   2290    COMBA_STORE(b[19]);
   2291 
   2292    /* output 20 */
   2293    CARRY_FORWARD;
   2294    SQRADDSC(a[5], a[15]);
   2295    SQRADDAC(a[6], a[14]);
   2296    SQRADDAC(a[7], a[13]);
   2297    SQRADDAC(a[8], a[12]);
   2298    SQRADDAC(a[9], a[11]);
   2299    SQRADDDB;
   2300    SQRADD(a[10], a[10]);
   2301    COMBA_STORE(b[20]);
   2302 
   2303    /* output 21 */
   2304    CARRY_FORWARD;
   2305    SQRADDSC(a[6], a[15]);
   2306    SQRADDAC(a[7], a[14]);
   2307    SQRADDAC(a[8], a[13]);
   2308    SQRADDAC(a[9], a[12]);
   2309    SQRADDAC(a[10], a[11]);
   2310    SQRADDDB;
   2311    COMBA_STORE(b[21]);
   2312 
   2313    /* output 22 */
   2314    CARRY_FORWARD;
   2315    SQRADDSC(a[7], a[15]);
   2316    SQRADDAC(a[8], a[14]);
   2317    SQRADDAC(a[9], a[13]);
   2318    SQRADDAC(a[10], a[12]);
   2319    SQRADDDB;
   2320    SQRADD(a[11], a[11]);
   2321    COMBA_STORE(b[22]);
   2322 
   2323    /* output 23 */
   2324    CARRY_FORWARD;
   2325    SQRADDSC(a[8], a[15]);
   2326    SQRADDAC(a[9], a[14]);
   2327    SQRADDAC(a[10], a[13]);
   2328    SQRADDAC(a[11], a[12]);
   2329    SQRADDDB;
   2330    COMBA_STORE(b[23]);
   2331 
   2332    /* output 24 */
   2333    CARRY_FORWARD;
   2334    SQRADDSC(a[9], a[15]);
   2335    SQRADDAC(a[10], a[14]);
   2336    SQRADDAC(a[11], a[13]);
   2337    SQRADDDB;
   2338    SQRADD(a[12], a[12]);
   2339    COMBA_STORE(b[24]);
   2340 
   2341    /* output 25 */
   2342    CARRY_FORWARD;
   2343    SQRADDSC(a[10], a[15]);
   2344    SQRADDAC(a[11], a[14]);
   2345    SQRADDAC(a[12], a[13]);
   2346    SQRADDDB;
   2347    COMBA_STORE(b[25]);
   2348 
   2349    /* output 26 */
   2350    CARRY_FORWARD;
   2351    SQRADD2(a[11], a[15]);
   2352    SQRADD2(a[12], a[14]);
   2353    SQRADD(a[13], a[13]);
   2354    COMBA_STORE(b[26]);
   2355 
   2356    /* output 27 */
   2357    CARRY_FORWARD;
   2358    SQRADD2(a[12], a[15]);
   2359    SQRADD2(a[13], a[14]);
   2360    COMBA_STORE(b[27]);
   2361 
   2362    /* output 28 */
   2363    CARRY_FORWARD;
   2364    SQRADD2(a[13], a[15]);
   2365    SQRADD(a[14], a[14]);
   2366    COMBA_STORE(b[28]);
   2367 
   2368    /* output 29 */
   2369    CARRY_FORWARD;
   2370    SQRADD2(a[14], a[15]);
   2371    COMBA_STORE(b[29]);
   2372 
   2373    /* output 30 */
   2374    CARRY_FORWARD;
   2375    SQRADD(a[15], a[15]);
   2376    COMBA_STORE(b[30]);
   2377    COMBA_STORE2(b[31]);
   2378    COMBA_FINI;
   2379 
   2380    B->used = 32;
   2381    B->sign = ZPOS;
   2382    memcpy(B->dp, b, 32 * sizeof(mp_digit));
   2383    mp_clamp(B);
   2384 }
   2385 
   2386 void
   2387 s_mp_sqr_comba_32(const mp_int *A, mp_int *B)
   2388 {
   2389    mp_digit *a, b[64], c0, c1, c2, sc0, sc1, sc2;
   2390 
   2391    a = A->dp;
   2392    COMBA_START;
   2393 
   2394    /* clear carries */
   2395    CLEAR_CARRY;
   2396 
   2397    /* output 0 */
   2398    SQRADD(a[0], a[0]);
   2399    COMBA_STORE(b[0]);
   2400 
   2401    /* output 1 */
   2402    CARRY_FORWARD;
   2403    SQRADD2(a[0], a[1]);
   2404    COMBA_STORE(b[1]);
   2405 
   2406    /* output 2 */
   2407    CARRY_FORWARD;
   2408    SQRADD2(a[0], a[2]);
   2409    SQRADD(a[1], a[1]);
   2410    COMBA_STORE(b[2]);
   2411 
   2412    /* output 3 */
   2413    CARRY_FORWARD;
   2414    SQRADD2(a[0], a[3]);
   2415    SQRADD2(a[1], a[2]);
   2416    COMBA_STORE(b[3]);
   2417 
   2418    /* output 4 */
   2419    CARRY_FORWARD;
   2420    SQRADD2(a[0], a[4]);
   2421    SQRADD2(a[1], a[3]);
   2422    SQRADD(a[2], a[2]);
   2423    COMBA_STORE(b[4]);
   2424 
   2425    /* output 5 */
   2426    CARRY_FORWARD;
   2427    SQRADDSC(a[0], a[5]);
   2428    SQRADDAC(a[1], a[4]);
   2429    SQRADDAC(a[2], a[3]);
   2430    SQRADDDB;
   2431    COMBA_STORE(b[5]);
   2432 
   2433    /* output 6 */
   2434    CARRY_FORWARD;
   2435    SQRADDSC(a[0], a[6]);
   2436    SQRADDAC(a[1], a[5]);
   2437    SQRADDAC(a[2], a[4]);
   2438    SQRADDDB;
   2439    SQRADD(a[3], a[3]);
   2440    COMBA_STORE(b[6]);
   2441 
   2442    /* output 7 */
   2443    CARRY_FORWARD;
   2444    SQRADDSC(a[0], a[7]);
   2445    SQRADDAC(a[1], a[6]);
   2446    SQRADDAC(a[2], a[5]);
   2447    SQRADDAC(a[3], a[4]);
   2448    SQRADDDB;
   2449    COMBA_STORE(b[7]);
   2450 
   2451    /* output 8 */
   2452    CARRY_FORWARD;
   2453    SQRADDSC(a[0], a[8]);
   2454    SQRADDAC(a[1], a[7]);
   2455    SQRADDAC(a[2], a[6]);
   2456    SQRADDAC(a[3], a[5]);
   2457    SQRADDDB;
   2458    SQRADD(a[4], a[4]);
   2459    COMBA_STORE(b[8]);
   2460 
   2461    /* output 9 */
   2462    CARRY_FORWARD;
   2463    SQRADDSC(a[0], a[9]);
   2464    SQRADDAC(a[1], a[8]);
   2465    SQRADDAC(a[2], a[7]);
   2466    SQRADDAC(a[3], a[6]);
   2467    SQRADDAC(a[4], a[5]);
   2468    SQRADDDB;
   2469    COMBA_STORE(b[9]);
   2470 
   2471    /* output 10 */
   2472    CARRY_FORWARD;
   2473    SQRADDSC(a[0], a[10]);
   2474    SQRADDAC(a[1], a[9]);
   2475    SQRADDAC(a[2], a[8]);
   2476    SQRADDAC(a[3], a[7]);
   2477    SQRADDAC(a[4], a[6]);
   2478    SQRADDDB;
   2479    SQRADD(a[5], a[5]);
   2480    COMBA_STORE(b[10]);
   2481 
   2482    /* output 11 */
   2483    CARRY_FORWARD;
   2484    SQRADDSC(a[0], a[11]);
   2485    SQRADDAC(a[1], a[10]);
   2486    SQRADDAC(a[2], a[9]);
   2487    SQRADDAC(a[3], a[8]);
   2488    SQRADDAC(a[4], a[7]);
   2489    SQRADDAC(a[5], a[6]);
   2490    SQRADDDB;
   2491    COMBA_STORE(b[11]);
   2492 
   2493    /* output 12 */
   2494    CARRY_FORWARD;
   2495    SQRADDSC(a[0], a[12]);
   2496    SQRADDAC(a[1], a[11]);
   2497    SQRADDAC(a[2], a[10]);
   2498    SQRADDAC(a[3], a[9]);
   2499    SQRADDAC(a[4], a[8]);
   2500    SQRADDAC(a[5], a[7]);
   2501    SQRADDDB;
   2502    SQRADD(a[6], a[6]);
   2503    COMBA_STORE(b[12]);
   2504 
   2505    /* output 13 */
   2506    CARRY_FORWARD;
   2507    SQRADDSC(a[0], a[13]);
   2508    SQRADDAC(a[1], a[12]);
   2509    SQRADDAC(a[2], a[11]);
   2510    SQRADDAC(a[3], a[10]);
   2511    SQRADDAC(a[4], a[9]);
   2512    SQRADDAC(a[5], a[8]);
   2513    SQRADDAC(a[6], a[7]);
   2514    SQRADDDB;
   2515    COMBA_STORE(b[13]);
   2516 
   2517    /* output 14 */
   2518    CARRY_FORWARD;
   2519    SQRADDSC(a[0], a[14]);
   2520    SQRADDAC(a[1], a[13]);
   2521    SQRADDAC(a[2], a[12]);
   2522    SQRADDAC(a[3], a[11]);
   2523    SQRADDAC(a[4], a[10]);
   2524    SQRADDAC(a[5], a[9]);
   2525    SQRADDAC(a[6], a[8]);
   2526    SQRADDDB;
   2527    SQRADD(a[7], a[7]);
   2528    COMBA_STORE(b[14]);
   2529 
   2530    /* output 15 */
   2531    CARRY_FORWARD;
   2532    SQRADDSC(a[0], a[15]);
   2533    SQRADDAC(a[1], a[14]);
   2534    SQRADDAC(a[2], a[13]);
   2535    SQRADDAC(a[3], a[12]);
   2536    SQRADDAC(a[4], a[11]);
   2537    SQRADDAC(a[5], a[10]);
   2538    SQRADDAC(a[6], a[9]);
   2539    SQRADDAC(a[7], a[8]);
   2540    SQRADDDB;
   2541    COMBA_STORE(b[15]);
   2542 
   2543    /* output 16 */
   2544    CARRY_FORWARD;
   2545    SQRADDSC(a[0], a[16]);
   2546    SQRADDAC(a[1], a[15]);
   2547    SQRADDAC(a[2], a[14]);
   2548    SQRADDAC(a[3], a[13]);
   2549    SQRADDAC(a[4], a[12]);
   2550    SQRADDAC(a[5], a[11]);
   2551    SQRADDAC(a[6], a[10]);
   2552    SQRADDAC(a[7], a[9]);
   2553    SQRADDDB;
   2554    SQRADD(a[8], a[8]);
   2555    COMBA_STORE(b[16]);
   2556 
   2557    /* output 17 */
   2558    CARRY_FORWARD;
   2559    SQRADDSC(a[0], a[17]);
   2560    SQRADDAC(a[1], a[16]);
   2561    SQRADDAC(a[2], a[15]);
   2562    SQRADDAC(a[3], a[14]);
   2563    SQRADDAC(a[4], a[13]);
   2564    SQRADDAC(a[5], a[12]);
   2565    SQRADDAC(a[6], a[11]);
   2566    SQRADDAC(a[7], a[10]);
   2567    SQRADDAC(a[8], a[9]);
   2568    SQRADDDB;
   2569    COMBA_STORE(b[17]);
   2570 
   2571    /* output 18 */
   2572    CARRY_FORWARD;
   2573    SQRADDSC(a[0], a[18]);
   2574    SQRADDAC(a[1], a[17]);
   2575    SQRADDAC(a[2], a[16]);
   2576    SQRADDAC(a[3], a[15]);
   2577    SQRADDAC(a[4], a[14]);
   2578    SQRADDAC(a[5], a[13]);
   2579    SQRADDAC(a[6], a[12]);
   2580    SQRADDAC(a[7], a[11]);
   2581    SQRADDAC(a[8], a[10]);
   2582    SQRADDDB;
   2583    SQRADD(a[9], a[9]);
   2584    COMBA_STORE(b[18]);
   2585 
   2586    /* output 19 */
   2587    CARRY_FORWARD;
   2588    SQRADDSC(a[0], a[19]);
   2589    SQRADDAC(a[1], a[18]);
   2590    SQRADDAC(a[2], a[17]);
   2591    SQRADDAC(a[3], a[16]);
   2592    SQRADDAC(a[4], a[15]);
   2593    SQRADDAC(a[5], a[14]);
   2594    SQRADDAC(a[6], a[13]);
   2595    SQRADDAC(a[7], a[12]);
   2596    SQRADDAC(a[8], a[11]);
   2597    SQRADDAC(a[9], a[10]);
   2598    SQRADDDB;
   2599    COMBA_STORE(b[19]);
   2600 
   2601    /* output 20 */
   2602    CARRY_FORWARD;
   2603    SQRADDSC(a[0], a[20]);
   2604    SQRADDAC(a[1], a[19]);
   2605    SQRADDAC(a[2], a[18]);
   2606    SQRADDAC(a[3], a[17]);
   2607    SQRADDAC(a[4], a[16]);
   2608    SQRADDAC(a[5], a[15]);
   2609    SQRADDAC(a[6], a[14]);
   2610    SQRADDAC(a[7], a[13]);
   2611    SQRADDAC(a[8], a[12]);
   2612    SQRADDAC(a[9], a[11]);
   2613    SQRADDDB;
   2614    SQRADD(a[10], a[10]);
   2615    COMBA_STORE(b[20]);
   2616 
   2617    /* output 21 */
   2618    CARRY_FORWARD;
   2619    SQRADDSC(a[0], a[21]);
   2620    SQRADDAC(a[1], a[20]);
   2621    SQRADDAC(a[2], a[19]);
   2622    SQRADDAC(a[3], a[18]);
   2623    SQRADDAC(a[4], a[17]);
   2624    SQRADDAC(a[5], a[16]);
   2625    SQRADDAC(a[6], a[15]);
   2626    SQRADDAC(a[7], a[14]);
   2627    SQRADDAC(a[8], a[13]);
   2628    SQRADDAC(a[9], a[12]);
   2629    SQRADDAC(a[10], a[11]);
   2630    SQRADDDB;
   2631    COMBA_STORE(b[21]);
   2632 
   2633    /* output 22 */
   2634    CARRY_FORWARD;
   2635    SQRADDSC(a[0], a[22]);
   2636    SQRADDAC(a[1], a[21]);
   2637    SQRADDAC(a[2], a[20]);
   2638    SQRADDAC(a[3], a[19]);
   2639    SQRADDAC(a[4], a[18]);
   2640    SQRADDAC(a[5], a[17]);
   2641    SQRADDAC(a[6], a[16]);
   2642    SQRADDAC(a[7], a[15]);
   2643    SQRADDAC(a[8], a[14]);
   2644    SQRADDAC(a[9], a[13]);
   2645    SQRADDAC(a[10], a[12]);
   2646    SQRADDDB;
   2647    SQRADD(a[11], a[11]);
   2648    COMBA_STORE(b[22]);
   2649 
   2650    /* output 23 */
   2651    CARRY_FORWARD;
   2652    SQRADDSC(a[0], a[23]);
   2653    SQRADDAC(a[1], a[22]);
   2654    SQRADDAC(a[2], a[21]);
   2655    SQRADDAC(a[3], a[20]);
   2656    SQRADDAC(a[4], a[19]);
   2657    SQRADDAC(a[5], a[18]);
   2658    SQRADDAC(a[6], a[17]);
   2659    SQRADDAC(a[7], a[16]);
   2660    SQRADDAC(a[8], a[15]);
   2661    SQRADDAC(a[9], a[14]);
   2662    SQRADDAC(a[10], a[13]);
   2663    SQRADDAC(a[11], a[12]);
   2664    SQRADDDB;
   2665    COMBA_STORE(b[23]);
   2666 
   2667    /* output 24 */
   2668    CARRY_FORWARD;
   2669    SQRADDSC(a[0], a[24]);
   2670    SQRADDAC(a[1], a[23]);
   2671    SQRADDAC(a[2], a[22]);
   2672    SQRADDAC(a[3], a[21]);
   2673    SQRADDAC(a[4], a[20]);
   2674    SQRADDAC(a[5], a[19]);
   2675    SQRADDAC(a[6], a[18]);
   2676    SQRADDAC(a[7], a[17]);
   2677    SQRADDAC(a[8], a[16]);
   2678    SQRADDAC(a[9], a[15]);
   2679    SQRADDAC(a[10], a[14]);
   2680    SQRADDAC(a[11], a[13]);
   2681    SQRADDDB;
   2682    SQRADD(a[12], a[12]);
   2683    COMBA_STORE(b[24]);
   2684 
   2685    /* output 25 */
   2686    CARRY_FORWARD;
   2687    SQRADDSC(a[0], a[25]);
   2688    SQRADDAC(a[1], a[24]);
   2689    SQRADDAC(a[2], a[23]);
   2690    SQRADDAC(a[3], a[22]);
   2691    SQRADDAC(a[4], a[21]);
   2692    SQRADDAC(a[5], a[20]);
   2693    SQRADDAC(a[6], a[19]);
   2694    SQRADDAC(a[7], a[18]);
   2695    SQRADDAC(a[8], a[17]);
   2696    SQRADDAC(a[9], a[16]);
   2697    SQRADDAC(a[10], a[15]);
   2698    SQRADDAC(a[11], a[14]);
   2699    SQRADDAC(a[12], a[13]);
   2700    SQRADDDB;
   2701    COMBA_STORE(b[25]);
   2702 
   2703    /* output 26 */
   2704    CARRY_FORWARD;
   2705    SQRADDSC(a[0], a[26]);
   2706    SQRADDAC(a[1], a[25]);
   2707    SQRADDAC(a[2], a[24]);
   2708    SQRADDAC(a[3], a[23]);
   2709    SQRADDAC(a[4], a[22]);
   2710    SQRADDAC(a[5], a[21]);
   2711    SQRADDAC(a[6], a[20]);
   2712    SQRADDAC(a[7], a[19]);
   2713    SQRADDAC(a[8], a[18]);
   2714    SQRADDAC(a[9], a[17]);
   2715    SQRADDAC(a[10], a[16]);
   2716    SQRADDAC(a[11], a[15]);
   2717    SQRADDAC(a[12], a[14]);
   2718    SQRADDDB;
   2719    SQRADD(a[13], a[13]);
   2720    COMBA_STORE(b[26]);
   2721 
   2722    /* output 27 */
   2723    CARRY_FORWARD;
   2724    SQRADDSC(a[0], a[27]);
   2725    SQRADDAC(a[1], a[26]);
   2726    SQRADDAC(a[2], a[25]);
   2727    SQRADDAC(a[3], a[24]);
   2728    SQRADDAC(a[4], a[23]);
   2729    SQRADDAC(a[5], a[22]);
   2730    SQRADDAC(a[6], a[21]);
   2731    SQRADDAC(a[7], a[20]);
   2732    SQRADDAC(a[8], a[19]);
   2733    SQRADDAC(a[9], a[18]);
   2734    SQRADDAC(a[10], a[17]);
   2735    SQRADDAC(a[11], a[16]);
   2736    SQRADDAC(a[12], a[15]);
   2737    SQRADDAC(a[13], a[14]);
   2738    SQRADDDB;
   2739    COMBA_STORE(b[27]);
   2740 
   2741    /* output 28 */
   2742    CARRY_FORWARD;
   2743    SQRADDSC(a[0], a[28]);
   2744    SQRADDAC(a[1], a[27]);
   2745    SQRADDAC(a[2], a[26]);
   2746    SQRADDAC(a[3], a[25]);
   2747    SQRADDAC(a[4], a[24]);
   2748    SQRADDAC(a[5], a[23]);
   2749    SQRADDAC(a[6], a[22]);
   2750    SQRADDAC(a[7], a[21]);
   2751    SQRADDAC(a[8], a[20]);
   2752    SQRADDAC(a[9], a[19]);
   2753    SQRADDAC(a[10], a[18]);
   2754    SQRADDAC(a[11], a[17]);
   2755    SQRADDAC(a[12], a[16]);
   2756    SQRADDAC(a[13], a[15]);
   2757    SQRADDDB;
   2758    SQRADD(a[14], a[14]);
   2759    COMBA_STORE(b[28]);
   2760 
   2761    /* output 29 */
   2762    CARRY_FORWARD;
   2763    SQRADDSC(a[0], a[29]);
   2764    SQRADDAC(a[1], a[28]);
   2765    SQRADDAC(a[2], a[27]);
   2766    SQRADDAC(a[3], a[26]);
   2767    SQRADDAC(a[4], a[25]);
   2768    SQRADDAC(a[5], a[24]);
   2769    SQRADDAC(a[6], a[23]);
   2770    SQRADDAC(a[7], a[22]);
   2771    SQRADDAC(a[8], a[21]);
   2772    SQRADDAC(a[9], a[20]);
   2773    SQRADDAC(a[10], a[19]);
   2774    SQRADDAC(a[11], a[18]);
   2775    SQRADDAC(a[12], a[17]);
   2776    SQRADDAC(a[13], a[16]);
   2777    SQRADDAC(a[14], a[15]);
   2778    SQRADDDB;
   2779    COMBA_STORE(b[29]);
   2780 
   2781    /* output 30 */
   2782    CARRY_FORWARD;
   2783    SQRADDSC(a[0], a[30]);
   2784    SQRADDAC(a[1], a[29]);
   2785    SQRADDAC(a[2], a[28]);
   2786    SQRADDAC(a[3], a[27]);
   2787    SQRADDAC(a[4], a[26]);
   2788    SQRADDAC(a[5], a[25]);
   2789    SQRADDAC(a[6], a[24]);
   2790    SQRADDAC(a[7], a[23]);
   2791    SQRADDAC(a[8], a[22]);
   2792    SQRADDAC(a[9], a[21]);
   2793    SQRADDAC(a[10], a[20]);
   2794    SQRADDAC(a[11], a[19]);
   2795    SQRADDAC(a[12], a[18]);
   2796    SQRADDAC(a[13], a[17]);
   2797    SQRADDAC(a[14], a[16]);
   2798    SQRADDDB;
   2799    SQRADD(a[15], a[15]);
   2800    COMBA_STORE(b[30]);
   2801 
   2802    /* output 31 */
   2803    CARRY_FORWARD;
   2804    SQRADDSC(a[0], a[31]);
   2805    SQRADDAC(a[1], a[30]);
   2806    SQRADDAC(a[2], a[29]);
   2807    SQRADDAC(a[3], a[28]);
   2808    SQRADDAC(a[4], a[27]);
   2809    SQRADDAC(a[5], a[26]);
   2810    SQRADDAC(a[6], a[25]);
   2811    SQRADDAC(a[7], a[24]);
   2812    SQRADDAC(a[8], a[23]);
   2813    SQRADDAC(a[9], a[22]);
   2814    SQRADDAC(a[10], a[21]);
   2815    SQRADDAC(a[11], a[20]);
   2816    SQRADDAC(a[12], a[19]);
   2817    SQRADDAC(a[13], a[18]);
   2818    SQRADDAC(a[14], a[17]);
   2819    SQRADDAC(a[15], a[16]);
   2820    SQRADDDB;
   2821    COMBA_STORE(b[31]);
   2822 
   2823    /* output 32 */
   2824    CARRY_FORWARD;
   2825    SQRADDSC(a[1], a[31]);
   2826    SQRADDAC(a[2], a[30]);
   2827    SQRADDAC(a[3], a[29]);
   2828    SQRADDAC(a[4], a[28]);
   2829    SQRADDAC(a[5], a[27]);
   2830    SQRADDAC(a[6], a[26]);
   2831    SQRADDAC(a[7], a[25]);
   2832    SQRADDAC(a[8], a[24]);
   2833    SQRADDAC(a[9], a[23]);
   2834    SQRADDAC(a[10], a[22]);
   2835    SQRADDAC(a[11], a[21]);
   2836    SQRADDAC(a[12], a[20]);
   2837    SQRADDAC(a[13], a[19]);
   2838    SQRADDAC(a[14], a[18]);
   2839    SQRADDAC(a[15], a[17]);
   2840    SQRADDDB;
   2841    SQRADD(a[16], a[16]);
   2842    COMBA_STORE(b[32]);
   2843 
   2844    /* output 33 */
   2845    CARRY_FORWARD;
   2846    SQRADDSC(a[2], a[31]);
   2847    SQRADDAC(a[3], a[30]);
   2848    SQRADDAC(a[4], a[29]);
   2849    SQRADDAC(a[5], a[28]);
   2850    SQRADDAC(a[6], a[27]);
   2851    SQRADDAC(a[7], a[26]);
   2852    SQRADDAC(a[8], a[25]);
   2853    SQRADDAC(a[9], a[24]);
   2854    SQRADDAC(a[10], a[23]);
   2855    SQRADDAC(a[11], a[22]);
   2856    SQRADDAC(a[12], a[21]);
   2857    SQRADDAC(a[13], a[20]);
   2858    SQRADDAC(a[14], a[19]);
   2859    SQRADDAC(a[15], a[18]);
   2860    SQRADDAC(a[16], a[17]);
   2861    SQRADDDB;
   2862    COMBA_STORE(b[33]);
   2863 
   2864    /* output 34 */
   2865    CARRY_FORWARD;
   2866    SQRADDSC(a[3], a[31]);
   2867    SQRADDAC(a[4], a[30]);
   2868    SQRADDAC(a[5], a[29]);
   2869    SQRADDAC(a[6], a[28]);
   2870    SQRADDAC(a[7], a[27]);
   2871    SQRADDAC(a[8], a[26]);
   2872    SQRADDAC(a[9], a[25]);
   2873    SQRADDAC(a[10], a[24]);
   2874    SQRADDAC(a[11], a[23]);
   2875    SQRADDAC(a[12], a[22]);
   2876    SQRADDAC(a[13], a[21]);
   2877    SQRADDAC(a[14], a[20]);
   2878    SQRADDAC(a[15], a[19]);
   2879    SQRADDAC(a[16], a[18]);
   2880    SQRADDDB;
   2881    SQRADD(a[17], a[17]);
   2882    COMBA_STORE(b[34]);
   2883 
   2884    /* output 35 */
   2885    CARRY_FORWARD;
   2886    SQRADDSC(a[4], a[31]);
   2887    SQRADDAC(a[5], a[30]);
   2888    SQRADDAC(a[6], a[29]);
   2889    SQRADDAC(a[7], a[28]);
   2890    SQRADDAC(a[8], a[27]);
   2891    SQRADDAC(a[9], a[26]);
   2892    SQRADDAC(a[10], a[25]);
   2893    SQRADDAC(a[11], a[24]);
   2894    SQRADDAC(a[12], a[23]);
   2895    SQRADDAC(a[13], a[22]);
   2896    SQRADDAC(a[14], a[21]);
   2897    SQRADDAC(a[15], a[20]);
   2898    SQRADDAC(a[16], a[19]);
   2899    SQRADDAC(a[17], a[18]);
   2900    SQRADDDB;
   2901    COMBA_STORE(b[35]);
   2902 
   2903    /* output 36 */
   2904    CARRY_FORWARD;
   2905    SQRADDSC(a[5], a[31]);
   2906    SQRADDAC(a[6], a[30]);
   2907    SQRADDAC(a[7], a[29]);
   2908    SQRADDAC(a[8], a[28]);
   2909    SQRADDAC(a[9], a[27]);
   2910    SQRADDAC(a[10], a[26]);
   2911    SQRADDAC(a[11], a[25]);
   2912    SQRADDAC(a[12], a[24]);
   2913    SQRADDAC(a[13], a[23]);
   2914    SQRADDAC(a[14], a[22]);
   2915    SQRADDAC(a[15], a[21]);
   2916    SQRADDAC(a[16], a[20]);
   2917    SQRADDAC(a[17], a[19]);
   2918    SQRADDDB;
   2919    SQRADD(a[18], a[18]);
   2920    COMBA_STORE(b[36]);
   2921 
   2922    /* output 37 */
   2923    CARRY_FORWARD;
   2924    SQRADDSC(a[6], a[31]);
   2925    SQRADDAC(a[7], a[30]);
   2926    SQRADDAC(a[8], a[29]);
   2927    SQRADDAC(a[9], a[28]);
   2928    SQRADDAC(a[10], a[27]);
   2929    SQRADDAC(a[11], a[26]);
   2930    SQRADDAC(a[12], a[25]);
   2931    SQRADDAC(a[13], a[24]);
   2932    SQRADDAC(a[14], a[23]);
   2933    SQRADDAC(a[15], a[22]);
   2934    SQRADDAC(a[16], a[21]);
   2935    SQRADDAC(a[17], a[20]);
   2936    SQRADDAC(a[18], a[19]);
   2937    SQRADDDB;
   2938    COMBA_STORE(b[37]);
   2939 
   2940    /* output 38 */
   2941    CARRY_FORWARD;
   2942    SQRADDSC(a[7], a[31]);
   2943    SQRADDAC(a[8], a[30]);
   2944    SQRADDAC(a[9], a[29]);
   2945    SQRADDAC(a[10], a[28]);
   2946    SQRADDAC(a[11], a[27]);
   2947    SQRADDAC(a[12], a[26]);
   2948    SQRADDAC(a[13], a[25]);
   2949    SQRADDAC(a[14], a[24]);
   2950    SQRADDAC(a[15], a[23]);
   2951    SQRADDAC(a[16], a[22]);
   2952    SQRADDAC(a[17], a[21]);
   2953    SQRADDAC(a[18], a[20]);
   2954    SQRADDDB;
   2955    SQRADD(a[19], a[19]);
   2956    COMBA_STORE(b[38]);
   2957 
   2958    /* output 39 */
   2959    CARRY_FORWARD;
   2960    SQRADDSC(a[8], a[31]);
   2961    SQRADDAC(a[9], a[30]);
   2962    SQRADDAC(a[10], a[29]);
   2963    SQRADDAC(a[11], a[28]);
   2964    SQRADDAC(a[12], a[27]);
   2965    SQRADDAC(a[13], a[26]);
   2966    SQRADDAC(a[14], a[25]);
   2967    SQRADDAC(a[15], a[24]);
   2968    SQRADDAC(a[16], a[23]);
   2969    SQRADDAC(a[17], a[22]);
   2970    SQRADDAC(a[18], a[21]);
   2971    SQRADDAC(a[19], a[20]);
   2972    SQRADDDB;
   2973    COMBA_STORE(b[39]);
   2974 
   2975    /* output 40 */
   2976    CARRY_FORWARD;
   2977    SQRADDSC(a[9], a[31]);
   2978    SQRADDAC(a[10], a[30]);
   2979    SQRADDAC(a[11], a[29]);
   2980    SQRADDAC(a[12], a[28]);
   2981    SQRADDAC(a[13], a[27]);
   2982    SQRADDAC(a[14], a[26]);
   2983    SQRADDAC(a[15], a[25]);
   2984    SQRADDAC(a[16], a[24]);
   2985    SQRADDAC(a[17], a[23]);
   2986    SQRADDAC(a[18], a[22]);
   2987    SQRADDAC(a[19], a[21]);
   2988    SQRADDDB;
   2989    SQRADD(a[20], a[20]);
   2990    COMBA_STORE(b[40]);
   2991 
   2992    /* output 41 */
   2993    CARRY_FORWARD;
   2994    SQRADDSC(a[10], a[31]);
   2995    SQRADDAC(a[11], a[30]);
   2996    SQRADDAC(a[12], a[29]);
   2997    SQRADDAC(a[13], a[28]);
   2998    SQRADDAC(a[14], a[27]);
   2999    SQRADDAC(a[15], a[26]);
   3000    SQRADDAC(a[16], a[25]);
   3001    SQRADDAC(a[17], a[24]);
   3002    SQRADDAC(a[18], a[23]);
   3003    SQRADDAC(a[19], a[22]);
   3004    SQRADDAC(a[20], a[21]);
   3005    SQRADDDB;
   3006    COMBA_STORE(b[41]);
   3007 
   3008    /* output 42 */
   3009    CARRY_FORWARD;
   3010    SQRADDSC(a[11], a[31]);
   3011    SQRADDAC(a[12], a[30]);
   3012    SQRADDAC(a[13], a[29]);
   3013    SQRADDAC(a[14], a[28]);
   3014    SQRADDAC(a[15], a[27]);
   3015    SQRADDAC(a[16], a[26]);
   3016    SQRADDAC(a[17], a[25]);
   3017    SQRADDAC(a[18], a[24]);
   3018    SQRADDAC(a[19], a[23]);
   3019    SQRADDAC(a[20], a[22]);
   3020    SQRADDDB;
   3021    SQRADD(a[21], a[21]);
   3022    COMBA_STORE(b[42]);
   3023 
   3024    /* output 43 */
   3025    CARRY_FORWARD;
   3026    SQRADDSC(a[12], a[31]);
   3027    SQRADDAC(a[13], a[30]);
   3028    SQRADDAC(a[14], a[29]);
   3029    SQRADDAC(a[15], a[28]);
   3030    SQRADDAC(a[16], a[27]);
   3031    SQRADDAC(a[17], a[26]);
   3032    SQRADDAC(a[18], a[25]);
   3033    SQRADDAC(a[19], a[24]);
   3034    SQRADDAC(a[20], a[23]);
   3035    SQRADDAC(a[21], a[22]);
   3036    SQRADDDB;
   3037    COMBA_STORE(b[43]);
   3038 
   3039    /* output 44 */
   3040    CARRY_FORWARD;
   3041    SQRADDSC(a[13], a[31]);
   3042    SQRADDAC(a[14], a[30]);
   3043    SQRADDAC(a[15], a[29]);
   3044    SQRADDAC(a[16], a[28]);
   3045    SQRADDAC(a[17], a[27]);
   3046    SQRADDAC(a[18], a[26]);
   3047    SQRADDAC(a[19], a[25]);
   3048    SQRADDAC(a[20], a[24]);
   3049    SQRADDAC(a[21], a[23]);
   3050    SQRADDDB;
   3051    SQRADD(a[22], a[22]);
   3052    COMBA_STORE(b[44]);
   3053 
   3054    /* output 45 */
   3055    CARRY_FORWARD;
   3056    SQRADDSC(a[14], a[31]);
   3057    SQRADDAC(a[15], a[30]);
   3058    SQRADDAC(a[16], a[29]);
   3059    SQRADDAC(a[17], a[28]);
   3060    SQRADDAC(a[18], a[27]);
   3061    SQRADDAC(a[19], a[26]);
   3062    SQRADDAC(a[20], a[25]);
   3063    SQRADDAC(a[21], a[24]);
   3064    SQRADDAC(a[22], a[23]);
   3065    SQRADDDB;
   3066    COMBA_STORE(b[45]);
   3067 
   3068    /* output 46 */
   3069    CARRY_FORWARD;
   3070    SQRADDSC(a[15], a[31]);
   3071    SQRADDAC(a[16], a[30]);
   3072    SQRADDAC(a[17], a[29]);
   3073    SQRADDAC(a[18], a[28]);
   3074    SQRADDAC(a[19], a[27]);
   3075    SQRADDAC(a[20], a[26]);
   3076    SQRADDAC(a[21], a[25]);
   3077    SQRADDAC(a[22], a[24]);
   3078    SQRADDDB;
   3079    SQRADD(a[23], a[23]);
   3080    COMBA_STORE(b[46]);
   3081 
   3082    /* output 47 */
   3083    CARRY_FORWARD;
   3084    SQRADDSC(a[16], a[31]);
   3085    SQRADDAC(a[17], a[30]);
   3086    SQRADDAC(a[18], a[29]);
   3087    SQRADDAC(a[19], a[28]);
   3088    SQRADDAC(a[20], a[27]);
   3089    SQRADDAC(a[21], a[26]);
   3090    SQRADDAC(a[22], a[25]);
   3091    SQRADDAC(a[23], a[24]);
   3092    SQRADDDB;
   3093    COMBA_STORE(b[47]);
   3094 
   3095    /* output 48 */
   3096    CARRY_FORWARD;
   3097    SQRADDSC(a[17], a[31]);
   3098    SQRADDAC(a[18], a[30]);
   3099    SQRADDAC(a[19], a[29]);
   3100    SQRADDAC(a[20], a[28]);
   3101    SQRADDAC(a[21], a[27]);
   3102    SQRADDAC(a[22], a[26]);
   3103    SQRADDAC(a[23], a[25]);
   3104    SQRADDDB;
   3105    SQRADD(a[24], a[24]);
   3106    COMBA_STORE(b[48]);
   3107 
   3108    /* output 49 */
   3109    CARRY_FORWARD;
   3110    SQRADDSC(a[18], a[31]);
   3111    SQRADDAC(a[19], a[30]);
   3112    SQRADDAC(a[20], a[29]);
   3113    SQRADDAC(a[21], a[28]);
   3114    SQRADDAC(a[22], a[27]);
   3115    SQRADDAC(a[23], a[26]);
   3116    SQRADDAC(a[24], a[25]);
   3117    SQRADDDB;
   3118    COMBA_STORE(b[49]);
   3119 
   3120    /* output 50 */
   3121    CARRY_FORWARD;
   3122    SQRADDSC(a[19], a[31]);
   3123    SQRADDAC(a[20], a[30]);
   3124    SQRADDAC(a[21], a[29]);
   3125    SQRADDAC(a[22], a[28]);
   3126    SQRADDAC(a[23], a[27]);
   3127    SQRADDAC(a[24], a[26]);
   3128    SQRADDDB;
   3129    SQRADD(a[25], a[25]);
   3130    COMBA_STORE(b[50]);
   3131 
   3132    /* output 51 */
   3133    CARRY_FORWARD;
   3134    SQRADDSC(a[20], a[31]);
   3135    SQRADDAC(a[21], a[30]);
   3136    SQRADDAC(a[22], a[29]);
   3137    SQRADDAC(a[23], a[28]);
   3138    SQRADDAC(a[24], a[27]);
   3139    SQRADDAC(a[25], a[26]);
   3140    SQRADDDB;
   3141    COMBA_STORE(b[51]);
   3142 
   3143    /* output 52 */
   3144    CARRY_FORWARD;
   3145    SQRADDSC(a[21], a[31]);
   3146    SQRADDAC(a[22], a[30]);
   3147    SQRADDAC(a[23], a[29]);
   3148    SQRADDAC(a[24], a[28]);
   3149    SQRADDAC(a[25], a[27]);
   3150    SQRADDDB;
   3151    SQRADD(a[26], a[26]);
   3152    COMBA_STORE(b[52]);
   3153 
   3154    /* output 53 */
   3155    CARRY_FORWARD;
   3156    SQRADDSC(a[22], a[31]);
   3157    SQRADDAC(a[23], a[30]);
   3158    SQRADDAC(a[24], a[29]);
   3159    SQRADDAC(a[25], a[28]);
   3160    SQRADDAC(a[26], a[27]);
   3161    SQRADDDB;
   3162    COMBA_STORE(b[53]);
   3163 
   3164    /* output 54 */
   3165    CARRY_FORWARD;
   3166    SQRADDSC(a[23], a[31]);
   3167    SQRADDAC(a[24], a[30]);
   3168    SQRADDAC(a[25], a[29]);
   3169    SQRADDAC(a[26], a[28]);
   3170    SQRADDDB;
   3171    SQRADD(a[27], a[27]);
   3172    COMBA_STORE(b[54]);
   3173 
   3174    /* output 55 */
   3175    CARRY_FORWARD;
   3176    SQRADDSC(a[24], a[31]);
   3177    SQRADDAC(a[25], a[30]);
   3178    SQRADDAC(a[26], a[29]);
   3179    SQRADDAC(a[27], a[28]);
   3180    SQRADDDB;
   3181    COMBA_STORE(b[55]);
   3182 
   3183    /* output 56 */
   3184    CARRY_FORWARD;
   3185    SQRADDSC(a[25], a[31]);
   3186    SQRADDAC(a[26], a[30]);
   3187    SQRADDAC(a[27], a[29]);
   3188    SQRADDDB;
   3189    SQRADD(a[28], a[28]);
   3190    COMBA_STORE(b[56]);
   3191 
   3192    /* output 57 */
   3193    CARRY_FORWARD;
   3194    SQRADDSC(a[26], a[31]);
   3195    SQRADDAC(a[27], a[30]);
   3196    SQRADDAC(a[28], a[29]);
   3197    SQRADDDB;
   3198    COMBA_STORE(b[57]);
   3199 
   3200    /* output 58 */
   3201    CARRY_FORWARD;
   3202    SQRADD2(a[27], a[31]);
   3203    SQRADD2(a[28], a[30]);
   3204    SQRADD(a[29], a[29]);
   3205    COMBA_STORE(b[58]);
   3206 
   3207    /* output 59 */
   3208    CARRY_FORWARD;
   3209    SQRADD2(a[28], a[31]);
   3210    SQRADD2(a[29], a[30]);
   3211    COMBA_STORE(b[59]);
   3212 
   3213    /* output 60 */
   3214    CARRY_FORWARD;
   3215    SQRADD2(a[29], a[31]);
   3216    SQRADD(a[30], a[30]);
   3217    COMBA_STORE(b[60]);
   3218 
   3219    /* output 61 */
   3220    CARRY_FORWARD;
   3221    SQRADD2(a[30], a[31]);
   3222    COMBA_STORE(b[61]);
   3223 
   3224    /* output 62 */
   3225    CARRY_FORWARD;
   3226    SQRADD(a[31], a[31]);
   3227    COMBA_STORE(b[62]);
   3228    COMBA_STORE2(b[63]);
   3229    COMBA_FINI;
   3230 
   3231    B->used = 64;
   3232    B->sign = ZPOS;
   3233    memcpy(B->dp, b, 64 * sizeof(mp_digit));
   3234    mp_clamp(B);
   3235 }