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

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

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

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

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

mercurial