1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/lib/freebl/mpi/mp_comba.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,1298 @@ 1.4 +/* 1.5 + * The below file is derived from TFM v0.03. 1.6 + * It contains code from fp_mul_comba.c and 1.7 + * fp_sqr_comba.c, which contained the following license. 1.8 + * 1.9 + * Right now, the assembly in this file limits 1.10 + * this code to AMD 64. 1.11 + * 1.12 + * This file is public domain. 1.13 + */ 1.14 + 1.15 +/* TomsFastMath, a fast ISO C bignum library. 1.16 + * 1.17 + * This project is meant to fill in where LibTomMath 1.18 + * falls short. That is speed ;-) 1.19 + * 1.20 + * This project is public domain and free for all purposes. 1.21 + * 1.22 + * Tom St Denis, tomstdenis@iahu.ca 1.23 + */ 1.24 + 1.25 + 1.26 +#include "mpi-priv.h" 1.27 + 1.28 + 1.29 + 1.30 +/* clamp digits */ 1.31 +#define mp_clamp(a) { while ((a)->used && (a)->dp[(a)->used-1] == 0) --((a)->used); (a)->sign = (a)->used ? (a)->sign : ZPOS; } 1.32 + 1.33 +/* anything you need at the start */ 1.34 +#define COMBA_START 1.35 + 1.36 +/* clear the chaining variables */ 1.37 +#define COMBA_CLEAR \ 1.38 + c0 = c1 = c2 = 0; 1.39 + 1.40 +/* forward the carry to the next digit */ 1.41 +#define COMBA_FORWARD \ 1.42 + do { c0 = c1; c1 = c2; c2 = 0; } while (0); 1.43 + 1.44 +/* anything you need at the end */ 1.45 +#define COMBA_FINI 1.46 + 1.47 +/* this should multiply i and j */ 1.48 +#define MULADD(i, j) \ 1.49 +__asm__ ( \ 1.50 + "movq %6,%%rax \n\t" \ 1.51 + "mulq %7 \n\t" \ 1.52 + "addq %%rax,%0 \n\t" \ 1.53 + "adcq %%rdx,%1 \n\t" \ 1.54 + "adcq $0,%2 \n\t" \ 1.55 + :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) :"%rax","%rdx","cc"); 1.56 + 1.57 + 1.58 + 1.59 + 1.60 +/* sqr macros only */ 1.61 +#define CLEAR_CARRY \ 1.62 + c0 = c1 = c2 = 0; 1.63 + 1.64 +#define COMBA_STORE(x) \ 1.65 + x = c0; 1.66 + 1.67 +#define COMBA_STORE2(x) \ 1.68 + x = c1; 1.69 + 1.70 +#define CARRY_FORWARD \ 1.71 + do { c0 = c1; c1 = c2; c2 = 0; } while (0); 1.72 + 1.73 +#define COMBA_FINI 1.74 + 1.75 +#define SQRADD(i, j) \ 1.76 +__asm__ ( \ 1.77 + "movq %6,%%rax \n\t" \ 1.78 + "mulq %%rax \n\t" \ 1.79 + "addq %%rax,%0 \n\t" \ 1.80 + "adcq %%rdx,%1 \n\t" \ 1.81 + "adcq $0,%2 \n\t" \ 1.82 + :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i) :"%rax","%rdx","cc"); 1.83 + 1.84 +#define SQRADD2(i, j) \ 1.85 +__asm__ ( \ 1.86 + "movq %6,%%rax \n\t" \ 1.87 + "mulq %7 \n\t" \ 1.88 + "addq %%rax,%0 \n\t" \ 1.89 + "adcq %%rdx,%1 \n\t" \ 1.90 + "adcq $0,%2 \n\t" \ 1.91 + "addq %%rax,%0 \n\t" \ 1.92 + "adcq %%rdx,%1 \n\t" \ 1.93 + "adcq $0,%2 \n\t" \ 1.94 + :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) :"%rax","%rdx","cc"); 1.95 + 1.96 +#define SQRADDSC(i, j) \ 1.97 +__asm__ ( \ 1.98 + "movq %3,%%rax \n\t" \ 1.99 + "mulq %4 \n\t" \ 1.100 + "movq %%rax,%0 \n\t" \ 1.101 + "movq %%rdx,%1 \n\t" \ 1.102 + "xorq %2,%2 \n\t" \ 1.103 + :"=r"(sc0), "=r"(sc1), "=r"(sc2): "g"(i), "g"(j) :"%rax","%rdx","cc"); 1.104 + 1.105 +#define SQRADDAC(i, j) \ 1.106 +__asm__ ( \ 1.107 + "movq %6,%%rax \n\t" \ 1.108 + "mulq %7 \n\t" \ 1.109 + "addq %%rax,%0 \n\t" \ 1.110 + "adcq %%rdx,%1 \n\t" \ 1.111 + "adcq $0,%2 \n\t" \ 1.112 + :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%rax","%rdx","cc"); 1.113 + 1.114 +#define SQRADDDB \ 1.115 +__asm__ ( \ 1.116 + "addq %6,%0 \n\t" \ 1.117 + "adcq %7,%1 \n\t" \ 1.118 + "adcq %8,%2 \n\t" \ 1.119 + "addq %6,%0 \n\t" \ 1.120 + "adcq %7,%1 \n\t" \ 1.121 + "adcq %8,%2 \n\t" \ 1.122 + :"=&r"(c0), "=&r"(c1), "=&r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(sc0), "r"(sc1), "r"(sc2) : "cc"); 1.123 + 1.124 + 1.125 + 1.126 + 1.127 + 1.128 +void s_mp_mul_comba_4(const mp_int *A, const mp_int *B, mp_int *C) 1.129 +{ 1.130 + mp_digit c0, c1, c2, at[8]; 1.131 + 1.132 + memcpy(at, A->dp, 4 * sizeof(mp_digit)); 1.133 + memcpy(at+4, B->dp, 4 * sizeof(mp_digit)); 1.134 + COMBA_START; 1.135 + 1.136 + COMBA_CLEAR; 1.137 + /* 0 */ 1.138 + MULADD(at[0], at[4]); 1.139 + COMBA_STORE(C->dp[0]); 1.140 + /* 1 */ 1.141 + COMBA_FORWARD; 1.142 + MULADD(at[0], at[5]); MULADD(at[1], at[4]); 1.143 + COMBA_STORE(C->dp[1]); 1.144 + /* 2 */ 1.145 + COMBA_FORWARD; 1.146 + MULADD(at[0], at[6]); MULADD(at[1], at[5]); MULADD(at[2], at[4]); 1.147 + COMBA_STORE(C->dp[2]); 1.148 + /* 3 */ 1.149 + COMBA_FORWARD; 1.150 + MULADD(at[0], at[7]); MULADD(at[1], at[6]); MULADD(at[2], at[5]); MULADD(at[3], at[4]); 1.151 + COMBA_STORE(C->dp[3]); 1.152 + /* 4 */ 1.153 + COMBA_FORWARD; 1.154 + MULADD(at[1], at[7]); MULADD(at[2], at[6]); MULADD(at[3], at[5]); 1.155 + COMBA_STORE(C->dp[4]); 1.156 + /* 5 */ 1.157 + COMBA_FORWARD; 1.158 + MULADD(at[2], at[7]); MULADD(at[3], at[6]); 1.159 + COMBA_STORE(C->dp[5]); 1.160 + /* 6 */ 1.161 + COMBA_FORWARD; 1.162 + MULADD(at[3], at[7]); 1.163 + COMBA_STORE(C->dp[6]); 1.164 + COMBA_STORE2(C->dp[7]); 1.165 + C->used = 8; 1.166 + C->sign = A->sign ^ B->sign; 1.167 + mp_clamp(C); 1.168 + COMBA_FINI; 1.169 +} 1.170 + 1.171 +void s_mp_mul_comba_8(const mp_int *A, const mp_int *B, mp_int *C) 1.172 +{ 1.173 + mp_digit c0, c1, c2, at[16]; 1.174 + 1.175 + memcpy(at, A->dp, 8 * sizeof(mp_digit)); 1.176 + memcpy(at+8, B->dp, 8 * sizeof(mp_digit)); 1.177 + COMBA_START; 1.178 + 1.179 + COMBA_CLEAR; 1.180 + /* 0 */ 1.181 + MULADD(at[0], at[8]); 1.182 + COMBA_STORE(C->dp[0]); 1.183 + /* 1 */ 1.184 + COMBA_FORWARD; 1.185 + MULADD(at[0], at[9]); MULADD(at[1], at[8]); 1.186 + COMBA_STORE(C->dp[1]); 1.187 + /* 2 */ 1.188 + COMBA_FORWARD; 1.189 + MULADD(at[0], at[10]); MULADD(at[1], at[9]); MULADD(at[2], at[8]); 1.190 + COMBA_STORE(C->dp[2]); 1.191 + /* 3 */ 1.192 + COMBA_FORWARD; 1.193 + MULADD(at[0], at[11]); MULADD(at[1], at[10]); MULADD(at[2], at[9]); MULADD(at[3], at[8]); 1.194 + COMBA_STORE(C->dp[3]); 1.195 + /* 4 */ 1.196 + COMBA_FORWARD; 1.197 + 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]); 1.198 + COMBA_STORE(C->dp[4]); 1.199 + /* 5 */ 1.200 + COMBA_FORWARD; 1.201 + 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]); 1.202 + COMBA_STORE(C->dp[5]); 1.203 + /* 6 */ 1.204 + COMBA_FORWARD; 1.205 + 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]); 1.206 + COMBA_STORE(C->dp[6]); 1.207 + /* 7 */ 1.208 + COMBA_FORWARD; 1.209 + 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]); 1.210 + COMBA_STORE(C->dp[7]); 1.211 + /* 8 */ 1.212 + COMBA_FORWARD; 1.213 + 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]); 1.214 + COMBA_STORE(C->dp[8]); 1.215 + /* 9 */ 1.216 + COMBA_FORWARD; 1.217 + 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]); 1.218 + COMBA_STORE(C->dp[9]); 1.219 + /* 10 */ 1.220 + COMBA_FORWARD; 1.221 + 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]); 1.222 + COMBA_STORE(C->dp[10]); 1.223 + /* 11 */ 1.224 + COMBA_FORWARD; 1.225 + MULADD(at[4], at[15]); MULADD(at[5], at[14]); MULADD(at[6], at[13]); MULADD(at[7], at[12]); 1.226 + COMBA_STORE(C->dp[11]); 1.227 + /* 12 */ 1.228 + COMBA_FORWARD; 1.229 + MULADD(at[5], at[15]); MULADD(at[6], at[14]); MULADD(at[7], at[13]); 1.230 + COMBA_STORE(C->dp[12]); 1.231 + /* 13 */ 1.232 + COMBA_FORWARD; 1.233 + MULADD(at[6], at[15]); MULADD(at[7], at[14]); 1.234 + COMBA_STORE(C->dp[13]); 1.235 + /* 14 */ 1.236 + COMBA_FORWARD; 1.237 + MULADD(at[7], at[15]); 1.238 + COMBA_STORE(C->dp[14]); 1.239 + COMBA_STORE2(C->dp[15]); 1.240 + C->used = 16; 1.241 + C->sign = A->sign ^ B->sign; 1.242 + mp_clamp(C); 1.243 + COMBA_FINI; 1.244 +} 1.245 + 1.246 +void s_mp_mul_comba_16(const mp_int *A, const mp_int *B, mp_int *C) 1.247 +{ 1.248 + mp_digit c0, c1, c2, at[32]; 1.249 + 1.250 + memcpy(at, A->dp, 16 * sizeof(mp_digit)); 1.251 + memcpy(at+16, B->dp, 16 * sizeof(mp_digit)); 1.252 + COMBA_START; 1.253 + 1.254 + COMBA_CLEAR; 1.255 + /* 0 */ 1.256 + MULADD(at[0], at[16]); 1.257 + COMBA_STORE(C->dp[0]); 1.258 + /* 1 */ 1.259 + COMBA_FORWARD; 1.260 + MULADD(at[0], at[17]); MULADD(at[1], at[16]); 1.261 + COMBA_STORE(C->dp[1]); 1.262 + /* 2 */ 1.263 + COMBA_FORWARD; 1.264 + MULADD(at[0], at[18]); MULADD(at[1], at[17]); MULADD(at[2], at[16]); 1.265 + COMBA_STORE(C->dp[2]); 1.266 + /* 3 */ 1.267 + COMBA_FORWARD; 1.268 + MULADD(at[0], at[19]); MULADD(at[1], at[18]); MULADD(at[2], at[17]); MULADD(at[3], at[16]); 1.269 + COMBA_STORE(C->dp[3]); 1.270 + /* 4 */ 1.271 + COMBA_FORWARD; 1.272 + 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]); 1.273 + COMBA_STORE(C->dp[4]); 1.274 + /* 5 */ 1.275 + COMBA_FORWARD; 1.276 + 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]); 1.277 + COMBA_STORE(C->dp[5]); 1.278 + /* 6 */ 1.279 + COMBA_FORWARD; 1.280 + 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]); 1.281 + COMBA_STORE(C->dp[6]); 1.282 + /* 7 */ 1.283 + COMBA_FORWARD; 1.284 + 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]); 1.285 + COMBA_STORE(C->dp[7]); 1.286 + /* 8 */ 1.287 + COMBA_FORWARD; 1.288 + 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]); 1.289 + COMBA_STORE(C->dp[8]); 1.290 + /* 9 */ 1.291 + COMBA_FORWARD; 1.292 + 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]); 1.293 + COMBA_STORE(C->dp[9]); 1.294 + /* 10 */ 1.295 + COMBA_FORWARD; 1.296 + 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]); 1.297 + COMBA_STORE(C->dp[10]); 1.298 + /* 11 */ 1.299 + COMBA_FORWARD; 1.300 + 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]); 1.301 + COMBA_STORE(C->dp[11]); 1.302 + /* 12 */ 1.303 + COMBA_FORWARD; 1.304 + 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]); 1.305 + COMBA_STORE(C->dp[12]); 1.306 + /* 13 */ 1.307 + COMBA_FORWARD; 1.308 + 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]); 1.309 + COMBA_STORE(C->dp[13]); 1.310 + /* 14 */ 1.311 + COMBA_FORWARD; 1.312 + 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]); 1.313 + COMBA_STORE(C->dp[14]); 1.314 + /* 15 */ 1.315 + COMBA_FORWARD; 1.316 + 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]); 1.317 + COMBA_STORE(C->dp[15]); 1.318 + /* 16 */ 1.319 + COMBA_FORWARD; 1.320 + 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]); 1.321 + COMBA_STORE(C->dp[16]); 1.322 + /* 17 */ 1.323 + COMBA_FORWARD; 1.324 + 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]); 1.325 + COMBA_STORE(C->dp[17]); 1.326 + /* 18 */ 1.327 + COMBA_FORWARD; 1.328 + 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]); 1.329 + COMBA_STORE(C->dp[18]); 1.330 + /* 19 */ 1.331 + COMBA_FORWARD; 1.332 + 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]); 1.333 + COMBA_STORE(C->dp[19]); 1.334 + /* 20 */ 1.335 + COMBA_FORWARD; 1.336 + 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]); 1.337 + COMBA_STORE(C->dp[20]); 1.338 + /* 21 */ 1.339 + COMBA_FORWARD; 1.340 + 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]); 1.341 + COMBA_STORE(C->dp[21]); 1.342 + /* 22 */ 1.343 + COMBA_FORWARD; 1.344 + 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]); 1.345 + COMBA_STORE(C->dp[22]); 1.346 + /* 23 */ 1.347 + COMBA_FORWARD; 1.348 + 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]); 1.349 + COMBA_STORE(C->dp[23]); 1.350 + /* 24 */ 1.351 + COMBA_FORWARD; 1.352 + 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]); 1.353 + COMBA_STORE(C->dp[24]); 1.354 + /* 25 */ 1.355 + COMBA_FORWARD; 1.356 + 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]); 1.357 + COMBA_STORE(C->dp[25]); 1.358 + /* 26 */ 1.359 + COMBA_FORWARD; 1.360 + 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]); 1.361 + COMBA_STORE(C->dp[26]); 1.362 + /* 27 */ 1.363 + COMBA_FORWARD; 1.364 + MULADD(at[12], at[31]); MULADD(at[13], at[30]); MULADD(at[14], at[29]); MULADD(at[15], at[28]); 1.365 + COMBA_STORE(C->dp[27]); 1.366 + /* 28 */ 1.367 + COMBA_FORWARD; 1.368 + MULADD(at[13], at[31]); MULADD(at[14], at[30]); MULADD(at[15], at[29]); 1.369 + COMBA_STORE(C->dp[28]); 1.370 + /* 29 */ 1.371 + COMBA_FORWARD; 1.372 + MULADD(at[14], at[31]); MULADD(at[15], at[30]); 1.373 + COMBA_STORE(C->dp[29]); 1.374 + /* 30 */ 1.375 + COMBA_FORWARD; 1.376 + MULADD(at[15], at[31]); 1.377 + COMBA_STORE(C->dp[30]); 1.378 + COMBA_STORE2(C->dp[31]); 1.379 + C->used = 32; 1.380 + C->sign = A->sign ^ B->sign; 1.381 + mp_clamp(C); 1.382 + COMBA_FINI; 1.383 +} 1.384 + 1.385 +void s_mp_mul_comba_32(const mp_int *A, const mp_int *B, mp_int *C) 1.386 +{ 1.387 + mp_digit c0, c1, c2, at[64]; 1.388 + 1.389 + memcpy(at, A->dp, 32 * sizeof(mp_digit)); 1.390 + memcpy(at+32, B->dp, 32 * sizeof(mp_digit)); 1.391 + COMBA_START; 1.392 + 1.393 + COMBA_CLEAR; 1.394 + /* 0 */ 1.395 + MULADD(at[0], at[32]); 1.396 + COMBA_STORE(C->dp[0]); 1.397 + /* 1 */ 1.398 + COMBA_FORWARD; 1.399 + MULADD(at[0], at[33]); MULADD(at[1], at[32]); 1.400 + COMBA_STORE(C->dp[1]); 1.401 + /* 2 */ 1.402 + COMBA_FORWARD; 1.403 + MULADD(at[0], at[34]); MULADD(at[1], at[33]); MULADD(at[2], at[32]); 1.404 + COMBA_STORE(C->dp[2]); 1.405 + /* 3 */ 1.406 + COMBA_FORWARD; 1.407 + MULADD(at[0], at[35]); MULADD(at[1], at[34]); MULADD(at[2], at[33]); MULADD(at[3], at[32]); 1.408 + COMBA_STORE(C->dp[3]); 1.409 + /* 4 */ 1.410 + COMBA_FORWARD; 1.411 + 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]); 1.412 + COMBA_STORE(C->dp[4]); 1.413 + /* 5 */ 1.414 + COMBA_FORWARD; 1.415 + 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]); 1.416 + COMBA_STORE(C->dp[5]); 1.417 + /* 6 */ 1.418 + COMBA_FORWARD; 1.419 + 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]); 1.420 + COMBA_STORE(C->dp[6]); 1.421 + /* 7 */ 1.422 + COMBA_FORWARD; 1.423 + 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]); 1.424 + COMBA_STORE(C->dp[7]); 1.425 + /* 8 */ 1.426 + COMBA_FORWARD; 1.427 + 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]); 1.428 + COMBA_STORE(C->dp[8]); 1.429 + /* 9 */ 1.430 + COMBA_FORWARD; 1.431 + 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]); 1.432 + COMBA_STORE(C->dp[9]); 1.433 + /* 10 */ 1.434 + COMBA_FORWARD; 1.435 + 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]); 1.436 + COMBA_STORE(C->dp[10]); 1.437 + /* 11 */ 1.438 + COMBA_FORWARD; 1.439 + 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]); 1.440 + COMBA_STORE(C->dp[11]); 1.441 + /* 12 */ 1.442 + COMBA_FORWARD; 1.443 + 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]); 1.444 + COMBA_STORE(C->dp[12]); 1.445 + /* 13 */ 1.446 + COMBA_FORWARD; 1.447 + 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]); 1.448 + COMBA_STORE(C->dp[13]); 1.449 + /* 14 */ 1.450 + COMBA_FORWARD; 1.451 + 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]); 1.452 + COMBA_STORE(C->dp[14]); 1.453 + /* 15 */ 1.454 + COMBA_FORWARD; 1.455 + 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]); 1.456 + COMBA_STORE(C->dp[15]); 1.457 + /* 16 */ 1.458 + COMBA_FORWARD; 1.459 + 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]); 1.460 + COMBA_STORE(C->dp[16]); 1.461 + /* 17 */ 1.462 + COMBA_FORWARD; 1.463 + 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]); 1.464 + COMBA_STORE(C->dp[17]); 1.465 + /* 18 */ 1.466 + COMBA_FORWARD; 1.467 + 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]); 1.468 + COMBA_STORE(C->dp[18]); 1.469 + /* 19 */ 1.470 + COMBA_FORWARD; 1.471 + 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]); 1.472 + COMBA_STORE(C->dp[19]); 1.473 + /* 20 */ 1.474 + COMBA_FORWARD; 1.475 + 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]); 1.476 + COMBA_STORE(C->dp[20]); 1.477 + /* 21 */ 1.478 + COMBA_FORWARD; 1.479 + 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]); 1.480 + COMBA_STORE(C->dp[21]); 1.481 + /* 22 */ 1.482 + COMBA_FORWARD; 1.483 + 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]); 1.484 + COMBA_STORE(C->dp[22]); 1.485 + /* 23 */ 1.486 + COMBA_FORWARD; 1.487 + 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]); 1.488 + COMBA_STORE(C->dp[23]); 1.489 + /* 24 */ 1.490 + COMBA_FORWARD; 1.491 + 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]); 1.492 + COMBA_STORE(C->dp[24]); 1.493 + /* 25 */ 1.494 + COMBA_FORWARD; 1.495 + 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]); 1.496 + COMBA_STORE(C->dp[25]); 1.497 + /* 26 */ 1.498 + COMBA_FORWARD; 1.499 + 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]); 1.500 + COMBA_STORE(C->dp[26]); 1.501 + /* 27 */ 1.502 + COMBA_FORWARD; 1.503 + 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]); 1.504 + COMBA_STORE(C->dp[27]); 1.505 + /* 28 */ 1.506 + COMBA_FORWARD; 1.507 + 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]); 1.508 + COMBA_STORE(C->dp[28]); 1.509 + /* 29 */ 1.510 + COMBA_FORWARD; 1.511 + 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]); 1.512 + COMBA_STORE(C->dp[29]); 1.513 + /* 30 */ 1.514 + COMBA_FORWARD; 1.515 + 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]); 1.516 + COMBA_STORE(C->dp[30]); 1.517 + /* 31 */ 1.518 + COMBA_FORWARD; 1.519 + 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]); 1.520 + COMBA_STORE(C->dp[31]); 1.521 + /* 32 */ 1.522 + COMBA_FORWARD; 1.523 + 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]); 1.524 + COMBA_STORE(C->dp[32]); 1.525 + /* 33 */ 1.526 + COMBA_FORWARD; 1.527 + 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]); 1.528 + COMBA_STORE(C->dp[33]); 1.529 + /* 34 */ 1.530 + COMBA_FORWARD; 1.531 + 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]); 1.532 + COMBA_STORE(C->dp[34]); 1.533 + /* 35 */ 1.534 + COMBA_FORWARD; 1.535 + 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]); 1.536 + COMBA_STORE(C->dp[35]); 1.537 + /* 36 */ 1.538 + COMBA_FORWARD; 1.539 + 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]); 1.540 + COMBA_STORE(C->dp[36]); 1.541 + /* 37 */ 1.542 + COMBA_FORWARD; 1.543 + 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]); 1.544 + COMBA_STORE(C->dp[37]); 1.545 + /* 38 */ 1.546 + COMBA_FORWARD; 1.547 + 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]); 1.548 + COMBA_STORE(C->dp[38]); 1.549 + /* 39 */ 1.550 + COMBA_FORWARD; 1.551 + 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]); 1.552 + COMBA_STORE(C->dp[39]); 1.553 + /* 40 */ 1.554 + COMBA_FORWARD; 1.555 + 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]); 1.556 + COMBA_STORE(C->dp[40]); 1.557 + /* 41 */ 1.558 + COMBA_FORWARD; 1.559 + 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]); 1.560 + COMBA_STORE(C->dp[41]); 1.561 + /* 42 */ 1.562 + COMBA_FORWARD; 1.563 + 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]); 1.564 + COMBA_STORE(C->dp[42]); 1.565 + /* 43 */ 1.566 + COMBA_FORWARD; 1.567 + 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]); 1.568 + COMBA_STORE(C->dp[43]); 1.569 + /* 44 */ 1.570 + COMBA_FORWARD; 1.571 + 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]); 1.572 + COMBA_STORE(C->dp[44]); 1.573 + /* 45 */ 1.574 + COMBA_FORWARD; 1.575 + 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]); 1.576 + COMBA_STORE(C->dp[45]); 1.577 + /* 46 */ 1.578 + COMBA_FORWARD; 1.579 + 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]); 1.580 + COMBA_STORE(C->dp[46]); 1.581 + /* 47 */ 1.582 + COMBA_FORWARD; 1.583 + 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]); 1.584 + COMBA_STORE(C->dp[47]); 1.585 + /* 48 */ 1.586 + COMBA_FORWARD; 1.587 + 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]); 1.588 + COMBA_STORE(C->dp[48]); 1.589 + /* 49 */ 1.590 + COMBA_FORWARD; 1.591 + 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]); 1.592 + COMBA_STORE(C->dp[49]); 1.593 + /* 50 */ 1.594 + COMBA_FORWARD; 1.595 + 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]); 1.596 + COMBA_STORE(C->dp[50]); 1.597 + /* 51 */ 1.598 + COMBA_FORWARD; 1.599 + 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]); 1.600 + COMBA_STORE(C->dp[51]); 1.601 + /* 52 */ 1.602 + COMBA_FORWARD; 1.603 + 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]); 1.604 + COMBA_STORE(C->dp[52]); 1.605 + /* 53 */ 1.606 + COMBA_FORWARD; 1.607 + 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]); 1.608 + COMBA_STORE(C->dp[53]); 1.609 + /* 54 */ 1.610 + COMBA_FORWARD; 1.611 + 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]); 1.612 + COMBA_STORE(C->dp[54]); 1.613 + /* 55 */ 1.614 + COMBA_FORWARD; 1.615 + 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]); 1.616 + COMBA_STORE(C->dp[55]); 1.617 + /* 56 */ 1.618 + COMBA_FORWARD; 1.619 + 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]); 1.620 + COMBA_STORE(C->dp[56]); 1.621 + /* 57 */ 1.622 + COMBA_FORWARD; 1.623 + 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]); 1.624 + COMBA_STORE(C->dp[57]); 1.625 + /* 58 */ 1.626 + COMBA_FORWARD; 1.627 + 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]); 1.628 + COMBA_STORE(C->dp[58]); 1.629 + /* 59 */ 1.630 + COMBA_FORWARD; 1.631 + MULADD(at[28], at[63]); MULADD(at[29], at[62]); MULADD(at[30], at[61]); MULADD(at[31], at[60]); 1.632 + COMBA_STORE(C->dp[59]); 1.633 + /* 60 */ 1.634 + COMBA_FORWARD; 1.635 + MULADD(at[29], at[63]); MULADD(at[30], at[62]); MULADD(at[31], at[61]); 1.636 + COMBA_STORE(C->dp[60]); 1.637 + /* 61 */ 1.638 + COMBA_FORWARD; 1.639 + MULADD(at[30], at[63]); MULADD(at[31], at[62]); 1.640 + COMBA_STORE(C->dp[61]); 1.641 + /* 62 */ 1.642 + COMBA_FORWARD; 1.643 + MULADD(at[31], at[63]); 1.644 + COMBA_STORE(C->dp[62]); 1.645 + COMBA_STORE2(C->dp[63]); 1.646 + C->used = 64; 1.647 + C->sign = A->sign ^ B->sign; 1.648 + mp_clamp(C); 1.649 + COMBA_FINI; 1.650 +} 1.651 + 1.652 + 1.653 + 1.654 +void s_mp_sqr_comba_4(const mp_int *A, mp_int *B) 1.655 +{ 1.656 + mp_digit *a, b[8], c0, c1, c2; 1.657 + 1.658 + a = A->dp; 1.659 + COMBA_START; 1.660 + 1.661 + /* clear carries */ 1.662 + CLEAR_CARRY; 1.663 + 1.664 + /* output 0 */ 1.665 + SQRADD(a[0],a[0]); 1.666 + COMBA_STORE(b[0]); 1.667 + 1.668 + /* output 1 */ 1.669 + CARRY_FORWARD; 1.670 + SQRADD2(a[0], a[1]); 1.671 + COMBA_STORE(b[1]); 1.672 + 1.673 + /* output 2 */ 1.674 + CARRY_FORWARD; 1.675 + SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); 1.676 + COMBA_STORE(b[2]); 1.677 + 1.678 + /* output 3 */ 1.679 + CARRY_FORWARD; 1.680 + SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); 1.681 + COMBA_STORE(b[3]); 1.682 + 1.683 + /* output 4 */ 1.684 + CARRY_FORWARD; 1.685 + SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); 1.686 + COMBA_STORE(b[4]); 1.687 + 1.688 + /* output 5 */ 1.689 + CARRY_FORWARD; 1.690 + SQRADD2(a[2], a[3]); 1.691 + COMBA_STORE(b[5]); 1.692 + 1.693 + /* output 6 */ 1.694 + CARRY_FORWARD; 1.695 + SQRADD(a[3], a[3]); 1.696 + COMBA_STORE(b[6]); 1.697 + COMBA_STORE2(b[7]); 1.698 + COMBA_FINI; 1.699 + 1.700 + B->used = 8; 1.701 + B->sign = ZPOS; 1.702 + memcpy(B->dp, b, 8 * sizeof(mp_digit)); 1.703 + mp_clamp(B); 1.704 +} 1.705 + 1.706 +void s_mp_sqr_comba_8(const mp_int *A, mp_int *B) 1.707 +{ 1.708 + mp_digit *a, b[16], c0, c1, c2, sc0, sc1, sc2; 1.709 + 1.710 + a = A->dp; 1.711 + COMBA_START; 1.712 + 1.713 + /* clear carries */ 1.714 + CLEAR_CARRY; 1.715 + 1.716 + /* output 0 */ 1.717 + SQRADD(a[0],a[0]); 1.718 + COMBA_STORE(b[0]); 1.719 + 1.720 + /* output 1 */ 1.721 + CARRY_FORWARD; 1.722 + SQRADD2(a[0], a[1]); 1.723 + COMBA_STORE(b[1]); 1.724 + 1.725 + /* output 2 */ 1.726 + CARRY_FORWARD; 1.727 + SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); 1.728 + COMBA_STORE(b[2]); 1.729 + 1.730 + /* output 3 */ 1.731 + CARRY_FORWARD; 1.732 + SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); 1.733 + COMBA_STORE(b[3]); 1.734 + 1.735 + /* output 4 */ 1.736 + CARRY_FORWARD; 1.737 + SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); 1.738 + COMBA_STORE(b[4]); 1.739 + 1.740 + /* output 5 */ 1.741 + CARRY_FORWARD; 1.742 + SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 1.743 + COMBA_STORE(b[5]); 1.744 + 1.745 + /* output 6 */ 1.746 + CARRY_FORWARD; 1.747 + SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 1.748 + COMBA_STORE(b[6]); 1.749 + 1.750 + /* output 7 */ 1.751 + CARRY_FORWARD; 1.752 + SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 1.753 + COMBA_STORE(b[7]); 1.754 + 1.755 + /* output 8 */ 1.756 + CARRY_FORWARD; 1.757 + SQRADDSC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); 1.758 + COMBA_STORE(b[8]); 1.759 + 1.760 + /* output 9 */ 1.761 + CARRY_FORWARD; 1.762 + SQRADDSC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; 1.763 + COMBA_STORE(b[9]); 1.764 + 1.765 + /* output 10 */ 1.766 + CARRY_FORWARD; 1.767 + SQRADD2(a[3], a[7]); SQRADD2(a[4], a[6]); SQRADD(a[5], a[5]); 1.768 + COMBA_STORE(b[10]); 1.769 + 1.770 + /* output 11 */ 1.771 + CARRY_FORWARD; 1.772 + SQRADD2(a[4], a[7]); SQRADD2(a[5], a[6]); 1.773 + COMBA_STORE(b[11]); 1.774 + 1.775 + /* output 12 */ 1.776 + CARRY_FORWARD; 1.777 + SQRADD2(a[5], a[7]); SQRADD(a[6], a[6]); 1.778 + COMBA_STORE(b[12]); 1.779 + 1.780 + /* output 13 */ 1.781 + CARRY_FORWARD; 1.782 + SQRADD2(a[6], a[7]); 1.783 + COMBA_STORE(b[13]); 1.784 + 1.785 + /* output 14 */ 1.786 + CARRY_FORWARD; 1.787 + SQRADD(a[7], a[7]); 1.788 + COMBA_STORE(b[14]); 1.789 + COMBA_STORE2(b[15]); 1.790 + COMBA_FINI; 1.791 + 1.792 + B->used = 16; 1.793 + B->sign = ZPOS; 1.794 + memcpy(B->dp, b, 16 * sizeof(mp_digit)); 1.795 + mp_clamp(B); 1.796 +} 1.797 + 1.798 +void s_mp_sqr_comba_16(const mp_int *A, mp_int *B) 1.799 +{ 1.800 + mp_digit *a, b[32], c0, c1, c2, sc0, sc1, sc2; 1.801 + 1.802 + a = A->dp; 1.803 + COMBA_START; 1.804 + 1.805 + /* clear carries */ 1.806 + CLEAR_CARRY; 1.807 + 1.808 + /* output 0 */ 1.809 + SQRADD(a[0],a[0]); 1.810 + COMBA_STORE(b[0]); 1.811 + 1.812 + /* output 1 */ 1.813 + CARRY_FORWARD; 1.814 + SQRADD2(a[0], a[1]); 1.815 + COMBA_STORE(b[1]); 1.816 + 1.817 + /* output 2 */ 1.818 + CARRY_FORWARD; 1.819 + SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); 1.820 + COMBA_STORE(b[2]); 1.821 + 1.822 + /* output 3 */ 1.823 + CARRY_FORWARD; 1.824 + SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); 1.825 + COMBA_STORE(b[3]); 1.826 + 1.827 + /* output 4 */ 1.828 + CARRY_FORWARD; 1.829 + SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); 1.830 + COMBA_STORE(b[4]); 1.831 + 1.832 + /* output 5 */ 1.833 + CARRY_FORWARD; 1.834 + SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 1.835 + COMBA_STORE(b[5]); 1.836 + 1.837 + /* output 6 */ 1.838 + CARRY_FORWARD; 1.839 + SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 1.840 + COMBA_STORE(b[6]); 1.841 + 1.842 + /* output 7 */ 1.843 + CARRY_FORWARD; 1.844 + SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 1.845 + COMBA_STORE(b[7]); 1.846 + 1.847 + /* output 8 */ 1.848 + CARRY_FORWARD; 1.849 + 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]); 1.850 + COMBA_STORE(b[8]); 1.851 + 1.852 + /* output 9 */ 1.853 + CARRY_FORWARD; 1.854 + 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; 1.855 + COMBA_STORE(b[9]); 1.856 + 1.857 + /* output 10 */ 1.858 + CARRY_FORWARD; 1.859 + 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]); 1.860 + COMBA_STORE(b[10]); 1.861 + 1.862 + /* output 11 */ 1.863 + CARRY_FORWARD; 1.864 + 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; 1.865 + COMBA_STORE(b[11]); 1.866 + 1.867 + /* output 12 */ 1.868 + CARRY_FORWARD; 1.869 + 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]); 1.870 + COMBA_STORE(b[12]); 1.871 + 1.872 + /* output 13 */ 1.873 + CARRY_FORWARD; 1.874 + 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; 1.875 + COMBA_STORE(b[13]); 1.876 + 1.877 + /* output 14 */ 1.878 + CARRY_FORWARD; 1.879 + 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]); 1.880 + COMBA_STORE(b[14]); 1.881 + 1.882 + /* output 15 */ 1.883 + CARRY_FORWARD; 1.884 + 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; 1.885 + COMBA_STORE(b[15]); 1.886 + 1.887 + /* output 16 */ 1.888 + CARRY_FORWARD; 1.889 + 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]); 1.890 + COMBA_STORE(b[16]); 1.891 + 1.892 + /* output 17 */ 1.893 + CARRY_FORWARD; 1.894 + 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; 1.895 + COMBA_STORE(b[17]); 1.896 + 1.897 + /* output 18 */ 1.898 + CARRY_FORWARD; 1.899 + 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]); 1.900 + COMBA_STORE(b[18]); 1.901 + 1.902 + /* output 19 */ 1.903 + CARRY_FORWARD; 1.904 + 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; 1.905 + COMBA_STORE(b[19]); 1.906 + 1.907 + /* output 20 */ 1.908 + CARRY_FORWARD; 1.909 + 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]); 1.910 + COMBA_STORE(b[20]); 1.911 + 1.912 + /* output 21 */ 1.913 + CARRY_FORWARD; 1.914 + 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; 1.915 + COMBA_STORE(b[21]); 1.916 + 1.917 + /* output 22 */ 1.918 + CARRY_FORWARD; 1.919 + 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]); 1.920 + COMBA_STORE(b[22]); 1.921 + 1.922 + /* output 23 */ 1.923 + CARRY_FORWARD; 1.924 + SQRADDSC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB; 1.925 + COMBA_STORE(b[23]); 1.926 + 1.927 + /* output 24 */ 1.928 + CARRY_FORWARD; 1.929 + SQRADDSC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]); 1.930 + COMBA_STORE(b[24]); 1.931 + 1.932 + /* output 25 */ 1.933 + CARRY_FORWARD; 1.934 + SQRADDSC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB; 1.935 + COMBA_STORE(b[25]); 1.936 + 1.937 + /* output 26 */ 1.938 + CARRY_FORWARD; 1.939 + SQRADD2(a[11], a[15]); SQRADD2(a[12], a[14]); SQRADD(a[13], a[13]); 1.940 + COMBA_STORE(b[26]); 1.941 + 1.942 + /* output 27 */ 1.943 + CARRY_FORWARD; 1.944 + SQRADD2(a[12], a[15]); SQRADD2(a[13], a[14]); 1.945 + COMBA_STORE(b[27]); 1.946 + 1.947 + /* output 28 */ 1.948 + CARRY_FORWARD; 1.949 + SQRADD2(a[13], a[15]); SQRADD(a[14], a[14]); 1.950 + COMBA_STORE(b[28]); 1.951 + 1.952 + /* output 29 */ 1.953 + CARRY_FORWARD; 1.954 + SQRADD2(a[14], a[15]); 1.955 + COMBA_STORE(b[29]); 1.956 + 1.957 + /* output 30 */ 1.958 + CARRY_FORWARD; 1.959 + SQRADD(a[15], a[15]); 1.960 + COMBA_STORE(b[30]); 1.961 + COMBA_STORE2(b[31]); 1.962 + COMBA_FINI; 1.963 + 1.964 + B->used = 32; 1.965 + B->sign = ZPOS; 1.966 + memcpy(B->dp, b, 32 * sizeof(mp_digit)); 1.967 + mp_clamp(B); 1.968 +} 1.969 + 1.970 + 1.971 +void s_mp_sqr_comba_32(const mp_int *A, mp_int *B) 1.972 +{ 1.973 + mp_digit *a, b[64], c0, c1, c2, sc0, sc1, sc2; 1.974 + 1.975 + a = A->dp; 1.976 + COMBA_START; 1.977 + 1.978 + /* clear carries */ 1.979 + CLEAR_CARRY; 1.980 + 1.981 + /* output 0 */ 1.982 + SQRADD(a[0],a[0]); 1.983 + COMBA_STORE(b[0]); 1.984 + 1.985 + /* output 1 */ 1.986 + CARRY_FORWARD; 1.987 + SQRADD2(a[0], a[1]); 1.988 + COMBA_STORE(b[1]); 1.989 + 1.990 + /* output 2 */ 1.991 + CARRY_FORWARD; 1.992 + SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); 1.993 + COMBA_STORE(b[2]); 1.994 + 1.995 + /* output 3 */ 1.996 + CARRY_FORWARD; 1.997 + SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); 1.998 + COMBA_STORE(b[3]); 1.999 + 1.1000 + /* output 4 */ 1.1001 + CARRY_FORWARD; 1.1002 + SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); 1.1003 + COMBA_STORE(b[4]); 1.1004 + 1.1005 + /* output 5 */ 1.1006 + CARRY_FORWARD; 1.1007 + SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; 1.1008 + COMBA_STORE(b[5]); 1.1009 + 1.1010 + /* output 6 */ 1.1011 + CARRY_FORWARD; 1.1012 + SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); 1.1013 + COMBA_STORE(b[6]); 1.1014 + 1.1015 + /* output 7 */ 1.1016 + CARRY_FORWARD; 1.1017 + SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; 1.1018 + COMBA_STORE(b[7]); 1.1019 + 1.1020 + /* output 8 */ 1.1021 + CARRY_FORWARD; 1.1022 + 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]); 1.1023 + COMBA_STORE(b[8]); 1.1024 + 1.1025 + /* output 9 */ 1.1026 + CARRY_FORWARD; 1.1027 + 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; 1.1028 + COMBA_STORE(b[9]); 1.1029 + 1.1030 + /* output 10 */ 1.1031 + CARRY_FORWARD; 1.1032 + 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]); 1.1033 + COMBA_STORE(b[10]); 1.1034 + 1.1035 + /* output 11 */ 1.1036 + CARRY_FORWARD; 1.1037 + 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; 1.1038 + COMBA_STORE(b[11]); 1.1039 + 1.1040 + /* output 12 */ 1.1041 + CARRY_FORWARD; 1.1042 + 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]); 1.1043 + COMBA_STORE(b[12]); 1.1044 + 1.1045 + /* output 13 */ 1.1046 + CARRY_FORWARD; 1.1047 + 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; 1.1048 + COMBA_STORE(b[13]); 1.1049 + 1.1050 + /* output 14 */ 1.1051 + CARRY_FORWARD; 1.1052 + 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]); 1.1053 + COMBA_STORE(b[14]); 1.1054 + 1.1055 + /* output 15 */ 1.1056 + CARRY_FORWARD; 1.1057 + 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; 1.1058 + COMBA_STORE(b[15]); 1.1059 + 1.1060 + /* output 16 */ 1.1061 + CARRY_FORWARD; 1.1062 + 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]); 1.1063 + COMBA_STORE(b[16]); 1.1064 + 1.1065 + /* output 17 */ 1.1066 + CARRY_FORWARD; 1.1067 + 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; 1.1068 + COMBA_STORE(b[17]); 1.1069 + 1.1070 + /* output 18 */ 1.1071 + CARRY_FORWARD; 1.1072 + 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]); 1.1073 + COMBA_STORE(b[18]); 1.1074 + 1.1075 + /* output 19 */ 1.1076 + CARRY_FORWARD; 1.1077 + 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; 1.1078 + COMBA_STORE(b[19]); 1.1079 + 1.1080 + /* output 20 */ 1.1081 + CARRY_FORWARD; 1.1082 + 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]); 1.1083 + COMBA_STORE(b[20]); 1.1084 + 1.1085 + /* output 21 */ 1.1086 + CARRY_FORWARD; 1.1087 + 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; 1.1088 + COMBA_STORE(b[21]); 1.1089 + 1.1090 + /* output 22 */ 1.1091 + CARRY_FORWARD; 1.1092 + 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]); 1.1093 + COMBA_STORE(b[22]); 1.1094 + 1.1095 + /* output 23 */ 1.1096 + CARRY_FORWARD; 1.1097 + 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; 1.1098 + COMBA_STORE(b[23]); 1.1099 + 1.1100 + /* output 24 */ 1.1101 + CARRY_FORWARD; 1.1102 + 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]); 1.1103 + COMBA_STORE(b[24]); 1.1104 + 1.1105 + /* output 25 */ 1.1106 + CARRY_FORWARD; 1.1107 + 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; 1.1108 + COMBA_STORE(b[25]); 1.1109 + 1.1110 + /* output 26 */ 1.1111 + CARRY_FORWARD; 1.1112 + 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]); 1.1113 + COMBA_STORE(b[26]); 1.1114 + 1.1115 + /* output 27 */ 1.1116 + CARRY_FORWARD; 1.1117 + 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; 1.1118 + COMBA_STORE(b[27]); 1.1119 + 1.1120 + /* output 28 */ 1.1121 + CARRY_FORWARD; 1.1122 + 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]); 1.1123 + COMBA_STORE(b[28]); 1.1124 + 1.1125 + /* output 29 */ 1.1126 + CARRY_FORWARD; 1.1127 + 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; 1.1128 + COMBA_STORE(b[29]); 1.1129 + 1.1130 + /* output 30 */ 1.1131 + CARRY_FORWARD; 1.1132 + 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]); 1.1133 + COMBA_STORE(b[30]); 1.1134 + 1.1135 + /* output 31 */ 1.1136 + CARRY_FORWARD; 1.1137 + 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; 1.1138 + COMBA_STORE(b[31]); 1.1139 + 1.1140 + /* output 32 */ 1.1141 + CARRY_FORWARD; 1.1142 + 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]); 1.1143 + COMBA_STORE(b[32]); 1.1144 + 1.1145 + /* output 33 */ 1.1146 + CARRY_FORWARD; 1.1147 + 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; 1.1148 + COMBA_STORE(b[33]); 1.1149 + 1.1150 + /* output 34 */ 1.1151 + CARRY_FORWARD; 1.1152 + 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]); 1.1153 + COMBA_STORE(b[34]); 1.1154 + 1.1155 + /* output 35 */ 1.1156 + CARRY_FORWARD; 1.1157 + 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; 1.1158 + COMBA_STORE(b[35]); 1.1159 + 1.1160 + /* output 36 */ 1.1161 + CARRY_FORWARD; 1.1162 + 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]); 1.1163 + COMBA_STORE(b[36]); 1.1164 + 1.1165 + /* output 37 */ 1.1166 + CARRY_FORWARD; 1.1167 + 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; 1.1168 + COMBA_STORE(b[37]); 1.1169 + 1.1170 + /* output 38 */ 1.1171 + CARRY_FORWARD; 1.1172 + 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]); 1.1173 + COMBA_STORE(b[38]); 1.1174 + 1.1175 + /* output 39 */ 1.1176 + CARRY_FORWARD; 1.1177 + 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; 1.1178 + COMBA_STORE(b[39]); 1.1179 + 1.1180 + /* output 40 */ 1.1181 + CARRY_FORWARD; 1.1182 + 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]); 1.1183 + COMBA_STORE(b[40]); 1.1184 + 1.1185 + /* output 41 */ 1.1186 + CARRY_FORWARD; 1.1187 + 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; 1.1188 + COMBA_STORE(b[41]); 1.1189 + 1.1190 + /* output 42 */ 1.1191 + CARRY_FORWARD; 1.1192 + 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]); 1.1193 + COMBA_STORE(b[42]); 1.1194 + 1.1195 + /* output 43 */ 1.1196 + CARRY_FORWARD; 1.1197 + 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; 1.1198 + COMBA_STORE(b[43]); 1.1199 + 1.1200 + /* output 44 */ 1.1201 + CARRY_FORWARD; 1.1202 + 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]); 1.1203 + COMBA_STORE(b[44]); 1.1204 + 1.1205 + /* output 45 */ 1.1206 + CARRY_FORWARD; 1.1207 + 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; 1.1208 + COMBA_STORE(b[45]); 1.1209 + 1.1210 + /* output 46 */ 1.1211 + CARRY_FORWARD; 1.1212 + 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]); 1.1213 + COMBA_STORE(b[46]); 1.1214 + 1.1215 + /* output 47 */ 1.1216 + CARRY_FORWARD; 1.1217 + 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; 1.1218 + COMBA_STORE(b[47]); 1.1219 + 1.1220 + /* output 48 */ 1.1221 + CARRY_FORWARD; 1.1222 + 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]); 1.1223 + COMBA_STORE(b[48]); 1.1224 + 1.1225 + /* output 49 */ 1.1226 + CARRY_FORWARD; 1.1227 + 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; 1.1228 + COMBA_STORE(b[49]); 1.1229 + 1.1230 + /* output 50 */ 1.1231 + CARRY_FORWARD; 1.1232 + 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]); 1.1233 + COMBA_STORE(b[50]); 1.1234 + 1.1235 + /* output 51 */ 1.1236 + CARRY_FORWARD; 1.1237 + 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; 1.1238 + COMBA_STORE(b[51]); 1.1239 + 1.1240 + /* output 52 */ 1.1241 + CARRY_FORWARD; 1.1242 + 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]); 1.1243 + COMBA_STORE(b[52]); 1.1244 + 1.1245 + /* output 53 */ 1.1246 + CARRY_FORWARD; 1.1247 + 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; 1.1248 + COMBA_STORE(b[53]); 1.1249 + 1.1250 + /* output 54 */ 1.1251 + CARRY_FORWARD; 1.1252 + 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]); 1.1253 + COMBA_STORE(b[54]); 1.1254 + 1.1255 + /* output 55 */ 1.1256 + CARRY_FORWARD; 1.1257 + SQRADDSC(a[24], a[31]); SQRADDAC(a[25], a[30]); SQRADDAC(a[26], a[29]); SQRADDAC(a[27], a[28]); SQRADDDB; 1.1258 + COMBA_STORE(b[55]); 1.1259 + 1.1260 + /* output 56 */ 1.1261 + CARRY_FORWARD; 1.1262 + SQRADDSC(a[25], a[31]); SQRADDAC(a[26], a[30]); SQRADDAC(a[27], a[29]); SQRADDDB; SQRADD(a[28], a[28]); 1.1263 + COMBA_STORE(b[56]); 1.1264 + 1.1265 + /* output 57 */ 1.1266 + CARRY_FORWARD; 1.1267 + SQRADDSC(a[26], a[31]); SQRADDAC(a[27], a[30]); SQRADDAC(a[28], a[29]); SQRADDDB; 1.1268 + COMBA_STORE(b[57]); 1.1269 + 1.1270 + /* output 58 */ 1.1271 + CARRY_FORWARD; 1.1272 + SQRADD2(a[27], a[31]); SQRADD2(a[28], a[30]); SQRADD(a[29], a[29]); 1.1273 + COMBA_STORE(b[58]); 1.1274 + 1.1275 + /* output 59 */ 1.1276 + CARRY_FORWARD; 1.1277 + SQRADD2(a[28], a[31]); SQRADD2(a[29], a[30]); 1.1278 + COMBA_STORE(b[59]); 1.1279 + 1.1280 + /* output 60 */ 1.1281 + CARRY_FORWARD; 1.1282 + SQRADD2(a[29], a[31]); SQRADD(a[30], a[30]); 1.1283 + COMBA_STORE(b[60]); 1.1284 + 1.1285 + /* output 61 */ 1.1286 + CARRY_FORWARD; 1.1287 + SQRADD2(a[30], a[31]); 1.1288 + COMBA_STORE(b[61]); 1.1289 + 1.1290 + /* output 62 */ 1.1291 + CARRY_FORWARD; 1.1292 + SQRADD(a[31], a[31]); 1.1293 + COMBA_STORE(b[62]); 1.1294 + COMBA_STORE2(b[63]); 1.1295 + COMBA_FINI; 1.1296 + 1.1297 + B->used = 64; 1.1298 + B->sign = ZPOS; 1.1299 + memcpy(B->dp, b, 64 * sizeof(mp_digit)); 1.1300 + mp_clamp(B); 1.1301 +}