randombit / botan
1
/*
2
* Comba Multiplication and Squaring
3
*
4
* This file was automatically generated by ./src/scripts/comba.py on 2021-05-01
5
*
6
* Botan is released under the Simplified BSD License (see license.txt)
7
*/
8

9
#include <botan/internal/mp_core.h>
10

11
namespace Botan {
12

13
/*
14
* Comba 4x4 Squaring
15
*/
16 1
void bigint_comba_sqr4(word z[8], const word x[4])
17
   {
18 1
   word w2 = 0, w1 = 0, w0 = 0;
19

20 1
   word3_muladd  (&w2, &w1, &w0, x[ 0], x[ 0]);
21 1
   z[ 0] = w0; w0 = 0;
22

23 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
24 1
   z[ 1] = w1; w1 = 0;
25

26 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]);
27 1
   word3_muladd  (&w1, &w0, &w2, x[ 1], x[ 1]);
28 1
   z[ 2] = w2; w2 = 0;
29

30 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]);
31 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]);
32 1
   z[ 3] = w0; w0 = 0;
33

34 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
35 1
   word3_muladd  (&w0, &w2, &w1, x[ 2], x[ 2]);
36 1
   z[ 4] = w1; w1 = 0;
37

38 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
39 1
   z[ 5] = w2; w2 = 0;
40

41 1
   word3_muladd  (&w2, &w1, &w0, x[ 3], x[ 3]);
42 1
   z[ 6] = w0;
43 1
   z[ 7] = w1;
44 1
   }
45

46
/*
47
* Comba 4x4 Multiplication
48
*/
49 1
void bigint_comba_mul4(word z[8], const word x[4], const word y[4])
50
   {
51 1
   word w2 = 0, w1 = 0, w0 = 0;
52

53 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
54 1
   z[ 0] = w0; w0 = 0;
55

56 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
57 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
58 1
   z[ 1] = w1; w1 = 0;
59

60 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
61 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
62 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
63 1
   z[ 2] = w2; w2 = 0;
64

65 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
66 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
67 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
68 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
69 1
   z[ 3] = w0; w0 = 0;
70

71 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
72 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
73 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
74 1
   z[ 4] = w1; w1 = 0;
75

76 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
77 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
78 1
   z[ 5] = w2; w2 = 0;
79

80 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
81 1
   z[ 6] = w0;
82 1
   z[ 7] = w1;
83 1
   }
84

85
/*
86
* Comba 6x6 Squaring
87
*/
88 1
void bigint_comba_sqr6(word z[12], const word x[6])
89
   {
90 1
   word w2 = 0, w1 = 0, w0 = 0;
91

92 1
   word3_muladd  (&w2, &w1, &w0, x[ 0], x[ 0]);
93 1
   z[ 0] = w0; w0 = 0;
94

95 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
96 1
   z[ 1] = w1; w1 = 0;
97

98 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]);
99 1
   word3_muladd  (&w1, &w0, &w2, x[ 1], x[ 1]);
100 1
   z[ 2] = w2; w2 = 0;
101

102 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]);
103 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]);
104 1
   z[ 3] = w0; w0 = 0;
105

106 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]);
107 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
108 1
   word3_muladd  (&w0, &w2, &w1, x[ 2], x[ 2]);
109 1
   z[ 4] = w1; w1 = 0;
110

111 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]);
112 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]);
113 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
114 1
   z[ 5] = w2; w2 = 0;
115

116 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]);
117 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]);
118 1
   word3_muladd  (&w2, &w1, &w0, x[ 3], x[ 3]);
119 1
   z[ 6] = w0; w0 = 0;
120

121 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]);
122 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]);
123 1
   z[ 7] = w1; w1 = 0;
124

125 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]);
126 1
   word3_muladd  (&w1, &w0, &w2, x[ 4], x[ 4]);
127 1
   z[ 8] = w2; w2 = 0;
128

129 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]);
130 1
   z[ 9] = w0; w0 = 0;
131

132 1
   word3_muladd  (&w0, &w2, &w1, x[ 5], x[ 5]);
133 1
   z[10] = w1;
134 1
   z[11] = w2;
135 1
   }
136

137
/*
138
* Comba 6x6 Multiplication
139
*/
140 1
void bigint_comba_mul6(word z[12], const word x[6], const word y[6])
141
   {
142 1
   word w2 = 0, w1 = 0, w0 = 0;
143

144 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
145 1
   z[ 0] = w0; w0 = 0;
146

147 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
148 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
149 1
   z[ 1] = w1; w1 = 0;
150

151 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
152 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
153 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
154 1
   z[ 2] = w2; w2 = 0;
155

156 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
157 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
158 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
159 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
160 1
   z[ 3] = w0; w0 = 0;
161

162 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]);
163 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
164 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
165 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
166 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]);
167 1
   z[ 4] = w1; w1 = 0;
168

169 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]);
170 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]);
171 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
172 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
173 1
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]);
174 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]);
175 1
   z[ 5] = w2; w2 = 0;
176

177 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]);
178 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]);
179 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
180 1
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]);
181 1
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]);
182 1
   z[ 6] = w0; w0 = 0;
183

184 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]);
185 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]);
186 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]);
187 1
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]);
188 1
   z[ 7] = w1; w1 = 0;
189

190 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]);
191 1
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]);
192 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]);
193 1
   z[ 8] = w2; w2 = 0;
194

195 1
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]);
196 1
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]);
197 1
   z[ 9] = w0; w0 = 0;
198

199 1
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]);
200 1
   z[10] = w1;
201 1
   z[11] = w2;
202 1
   }
203

204
/*
205
* Comba 8x8 Squaring
206
*/
207 1
void bigint_comba_sqr8(word z[16], const word x[8])
208
   {
209 1
   word w2 = 0, w1 = 0, w0 = 0;
210

211 1
   word3_muladd  (&w2, &w1, &w0, x[ 0], x[ 0]);
212 1
   z[ 0] = w0; w0 = 0;
213

214 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
215 1
   z[ 1] = w1; w1 = 0;
216

217 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]);
218 1
   word3_muladd  (&w1, &w0, &w2, x[ 1], x[ 1]);
219 1
   z[ 2] = w2; w2 = 0;
220

221 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]);
222 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]);
223 1
   z[ 3] = w0; w0 = 0;
224

225 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]);
226 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
227 1
   word3_muladd  (&w0, &w2, &w1, x[ 2], x[ 2]);
228 1
   z[ 4] = w1; w1 = 0;
229

230 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]);
231 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]);
232 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
233 1
   z[ 5] = w2; w2 = 0;
234

235 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]);
236 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]);
237 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]);
238 1
   word3_muladd  (&w2, &w1, &w0, x[ 3], x[ 3]);
239 1
   z[ 6] = w0; w0 = 0;
240

241 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]);
242 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]);
243 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]);
244 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]);
245 1
   z[ 7] = w1; w1 = 0;
246

247 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]);
248 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]);
249 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]);
250 1
   word3_muladd  (&w1, &w0, &w2, x[ 4], x[ 4]);
251 1
   z[ 8] = w2; w2 = 0;
252

253 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]);
254 1
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]);
255 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]);
256 1
   z[ 9] = w0; w0 = 0;
257

258 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]);
259 1
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]);
260 1
   word3_muladd  (&w0, &w2, &w1, x[ 5], x[ 5]);
261 1
   z[10] = w1; w1 = 0;
262

263 1
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]);
264 1
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]);
265 1
   z[11] = w2; w2 = 0;
266

267 1
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]);
268 1
   word3_muladd  (&w2, &w1, &w0, x[ 6], x[ 6]);
269 1
   z[12] = w0; w0 = 0;
270

271 1
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]);
272 1
   z[13] = w1; w1 = 0;
273

274 1
   word3_muladd  (&w1, &w0, &w2, x[ 7], x[ 7]);
275 1
   z[14] = w2;
276 1
   z[15] = w0;
277 1
   }
278

279
/*
280
* Comba 8x8 Multiplication
281
*/
282 1
void bigint_comba_mul8(word z[16], const word x[8], const word y[8])
283
   {
284 1
   word w2 = 0, w1 = 0, w0 = 0;
285

286 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
287 1
   z[ 0] = w0; w0 = 0;
288

289 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
290 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
291 1
   z[ 1] = w1; w1 = 0;
292

293 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
294 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
295 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
296 1
   z[ 2] = w2; w2 = 0;
297

298 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
299 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
300 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
301 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
302 1
   z[ 3] = w0; w0 = 0;
303

304 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]);
305 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
306 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
307 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
308 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]);
309 1
   z[ 4] = w1; w1 = 0;
310

311 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]);
312 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]);
313 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
314 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
315 1
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]);
316 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]);
317 1
   z[ 5] = w2; w2 = 0;
318

319 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]);
320 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]);
321 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]);
322 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
323 1
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]);
324 1
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]);
325 1
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]);
326 1
   z[ 6] = w0; w0 = 0;
327

328 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]);
329 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]);
330 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]);
331 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]);
332 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]);
333 1
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]);
334 1
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]);
335 1
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]);
336 1
   z[ 7] = w1; w1 = 0;
337

338 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]);
339 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]);
340 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]);
341 1
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]);
342 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]);
343 1
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 2]);
344 1
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 1]);
345 1
   z[ 8] = w2; w2 = 0;
346

347 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]);
348 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]);
349 1
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]);
350 1
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]);
351 1
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]);
352 1
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]);
353 1
   z[ 9] = w0; w0 = 0;
354

355 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 7]);
356 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 6]);
357 1
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]);
358 1
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 4]);
359 1
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 3]);
360 1
   z[10] = w1; w1 = 0;
361

362 1
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 7]);
363 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 6]);
364 1
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 5]);
365 1
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 4]);
366 1
   z[11] = w2; w2 = 0;
367

368 1
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]);
369 1
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]);
370 1
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]);
371 1
   z[12] = w0; w0 = 0;
372

373 1
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 7]);
374 1
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 6]);
375 1
   z[13] = w1; w1 = 0;
376

377 1
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 7]);
378 1
   z[14] = w2;
379 1
   z[15] = w0;
380 1
   }
381

382
/*
383
* Comba 9x9 Squaring
384
*/
385 1
void bigint_comba_sqr9(word z[18], const word x[9])
386
   {
387 1
   word w2 = 0, w1 = 0, w0 = 0;
388

389 1
   word3_muladd  (&w2, &w1, &w0, x[ 0], x[ 0]);
390 1
   z[ 0] = w0; w0 = 0;
391

392 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
393 1
   z[ 1] = w1; w1 = 0;
394

395 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]);
396 1
   word3_muladd  (&w1, &w0, &w2, x[ 1], x[ 1]);
397 1
   z[ 2] = w2; w2 = 0;
398

399 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]);
400 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]);
401 1
   z[ 3] = w0; w0 = 0;
402

403 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]);
404 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
405 1
   word3_muladd  (&w0, &w2, &w1, x[ 2], x[ 2]);
406 1
   z[ 4] = w1; w1 = 0;
407

408 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]);
409 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]);
410 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
411 1
   z[ 5] = w2; w2 = 0;
412

413 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]);
414 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]);
415 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]);
416 1
   word3_muladd  (&w2, &w1, &w0, x[ 3], x[ 3]);
417 1
   z[ 6] = w0; w0 = 0;
418

419 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]);
420 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]);
421 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]);
422 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]);
423 1
   z[ 7] = w1; w1 = 0;
424

425 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 8]);
426 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]);
427 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]);
428 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]);
429 1
   word3_muladd  (&w1, &w0, &w2, x[ 4], x[ 4]);
430 1
   z[ 8] = w2; w2 = 0;
431

432 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 8]);
433 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]);
434 1
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]);
435 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]);
436 1
   z[ 9] = w0; w0 = 0;
437

438 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 8]);
439 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]);
440 1
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]);
441 1
   word3_muladd  (&w0, &w2, &w1, x[ 5], x[ 5]);
442 1
   z[10] = w1; w1 = 0;
443

444 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 8]);
445 1
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]);
446 1
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]);
447 1
   z[11] = w2; w2 = 0;
448

449 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 8]);
450 1
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]);
451 1
   word3_muladd  (&w2, &w1, &w0, x[ 6], x[ 6]);
452 1
   z[12] = w0; w0 = 0;
453

454 1
   word3_muladd_2(&w0, &w2, &w1, x[ 5], x[ 8]);
455 1
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]);
456 1
   z[13] = w1; w1 = 0;
457

458 1
   word3_muladd_2(&w1, &w0, &w2, x[ 6], x[ 8]);
459 1
   word3_muladd  (&w1, &w0, &w2, x[ 7], x[ 7]);
460 1
   z[14] = w2; w2 = 0;
461

462 1
   word3_muladd_2(&w2, &w1, &w0, x[ 7], x[ 8]);
463 1
   z[15] = w0; w0 = 0;
464

465 1
   word3_muladd  (&w0, &w2, &w1, x[ 8], x[ 8]);
466 1
   z[16] = w1;
467 1
   z[17] = w2;
468 1
   }
469

470
/*
471
* Comba 9x9 Multiplication
472
*/
473 1
void bigint_comba_mul9(word z[18], const word x[9], const word y[9])
474
   {
475 1
   word w2 = 0, w1 = 0, w0 = 0;
476

477 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
478 1
   z[ 0] = w0; w0 = 0;
479

480 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
481 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
482 1
   z[ 1] = w1; w1 = 0;
483

484 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
485 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
486 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
487 1
   z[ 2] = w2; w2 = 0;
488

489 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
490 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
491 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
492 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
493 1
   z[ 3] = w0; w0 = 0;
494

495 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]);
496 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
497 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
498 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
499 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]);
500 1
   z[ 4] = w1; w1 = 0;
501

502 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]);
503 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]);
504 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
505 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
506 1
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]);
507 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]);
508 1
   z[ 5] = w2; w2 = 0;
509

510 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]);
511 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]);
512 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]);
513 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
514 1
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]);
515 1
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]);
516 1
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]);
517 1
   z[ 6] = w0; w0 = 0;
518

519 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]);
520 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]);
521 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]);
522 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]);
523 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]);
524 1
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]);
525 1
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]);
526 1
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]);
527 1
   z[ 7] = w1; w1 = 0;
528

529 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 8]);
530 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]);
531 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]);
532 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]);
533 1
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]);
534 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]);
535 1
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 2]);
536 1
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 1]);
537 1
   word3_muladd(&w1, &w0, &w2, x[ 8], y[ 0]);
538 1
   z[ 8] = w2; w2 = 0;
539

540 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 8]);
541 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]);
542 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]);
543 1
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]);
544 1
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]);
545 1
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]);
546 1
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]);
547 1
   word3_muladd(&w2, &w1, &w0, x[ 8], y[ 1]);
548 1
   z[ 9] = w0; w0 = 0;
549

550 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 8]);
551 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 7]);
552 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 6]);
553 1
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]);
554 1
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 4]);
555 1
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 3]);
556 1
   word3_muladd(&w0, &w2, &w1, x[ 8], y[ 2]);
557 1
   z[10] = w1; w1 = 0;
558

559 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 8]);
560 1
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 7]);
561 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 6]);
562 1
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 5]);
563 1
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 4]);
564 1
   word3_muladd(&w1, &w0, &w2, x[ 8], y[ 3]);
565 1
   z[11] = w2; w2 = 0;
566

567 1
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 8]);
568 1
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]);
569 1
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]);
570 1
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]);
571 1
   word3_muladd(&w2, &w1, &w0, x[ 8], y[ 4]);
572 1
   z[12] = w0; w0 = 0;
573

574 1
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 8]);
575 1
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 7]);
576 1
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 6]);
577 1
   word3_muladd(&w0, &w2, &w1, x[ 8], y[ 5]);
578 1
   z[13] = w1; w1 = 0;
579

580 1
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 8]);
581 1
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 7]);
582 1
   word3_muladd(&w1, &w0, &w2, x[ 8], y[ 6]);
583 1
   z[14] = w2; w2 = 0;
584

585 1
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 8]);
586 1
   word3_muladd(&w2, &w1, &w0, x[ 8], y[ 7]);
587 1
   z[15] = w0; w0 = 0;
588

589 1
   word3_muladd(&w0, &w2, &w1, x[ 8], y[ 8]);
590 1
   z[16] = w1;
591 1
   z[17] = w2;
592 1
   }
593

594
/*
595
* Comba 16x16 Squaring
596
*/
597 1
void bigint_comba_sqr16(word z[32], const word x[16])
598
   {
599 1
   word w2 = 0, w1 = 0, w0 = 0;
600

601 1
   word3_muladd  (&w2, &w1, &w0, x[ 0], x[ 0]);
602 1
   z[ 0] = w0; w0 = 0;
603

604 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
605 1
   z[ 1] = w1; w1 = 0;
606

607 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]);
608 1
   word3_muladd  (&w1, &w0, &w2, x[ 1], x[ 1]);
609 1
   z[ 2] = w2; w2 = 0;
610

611 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]);
612 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]);
613 1
   z[ 3] = w0; w0 = 0;
614

615 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]);
616 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
617 1
   word3_muladd  (&w0, &w2, &w1, x[ 2], x[ 2]);
618 1
   z[ 4] = w1; w1 = 0;
619

620 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]);
621 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]);
622 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
623 1
   z[ 5] = w2; w2 = 0;
624

625 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]);
626 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]);
627 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]);
628 1
   word3_muladd  (&w2, &w1, &w0, x[ 3], x[ 3]);
629 1
   z[ 6] = w0; w0 = 0;
630

631 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]);
632 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]);
633 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]);
634 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]);
635 1
   z[ 7] = w1; w1 = 0;
636

637 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 8]);
638 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]);
639 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]);
640 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]);
641 1
   word3_muladd  (&w1, &w0, &w2, x[ 4], x[ 4]);
642 1
   z[ 8] = w2; w2 = 0;
643

644 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 9]);
645 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 8]);
646 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]);
647 1
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]);
648 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]);
649 1
   z[ 9] = w0; w0 = 0;
650

651 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[10]);
652 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 9]);
653 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 8]);
654 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]);
655 1
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]);
656 1
   word3_muladd  (&w0, &w2, &w1, x[ 5], x[ 5]);
657 1
   z[10] = w1; w1 = 0;
658

659 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[11]);
660 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[10]);
661 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 9]);
662 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 8]);
663 1
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]);
664 1
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]);
665 1
   z[11] = w2; w2 = 0;
666

667 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[12]);
668 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[11]);
669 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[10]);
670 1
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 9]);
671 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 8]);
672 1
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]);
673 1
   word3_muladd  (&w2, &w1, &w0, x[ 6], x[ 6]);
674 1
   z[12] = w0; w0 = 0;
675

676 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[13]);
677 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[12]);
678 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[11]);
679 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[10]);
680 1
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 9]);
681 1
   word3_muladd_2(&w0, &w2, &w1, x[ 5], x[ 8]);
682 1
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]);
683 1
   z[13] = w1; w1 = 0;
684

685 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[14]);
686 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[13]);
687 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[12]);
688 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[11]);
689 1
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[10]);
690 1
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 9]);
691 1
   word3_muladd_2(&w1, &w0, &w2, x[ 6], x[ 8]);
692 1
   word3_muladd  (&w1, &w0, &w2, x[ 7], x[ 7]);
693 1
   z[14] = w2; w2 = 0;
694

695 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[15]);
696 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[14]);
697 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[13]);
698 1
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[12]);
699 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[11]);
700 1
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[10]);
701 1
   word3_muladd_2(&w2, &w1, &w0, x[ 6], x[ 9]);
702 1
   word3_muladd_2(&w2, &w1, &w0, x[ 7], x[ 8]);
703 1
   z[15] = w0; w0 = 0;
704

705 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[15]);
706 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[14]);
707 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[13]);
708 1
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[12]);
709 1
   word3_muladd_2(&w0, &w2, &w1, x[ 5], x[11]);
710 1
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[10]);
711 1
   word3_muladd_2(&w0, &w2, &w1, x[ 7], x[ 9]);
712 1
   word3_muladd  (&w0, &w2, &w1, x[ 8], x[ 8]);
713 1
   z[16] = w1; w1 = 0;
714

715 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[15]);
716 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[14]);
717 1
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[13]);
718 1
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[12]);
719 1
   word3_muladd_2(&w1, &w0, &w2, x[ 6], x[11]);
720 1
   word3_muladd_2(&w1, &w0, &w2, x[ 7], x[10]);
721 1
   word3_muladd_2(&w1, &w0, &w2, x[ 8], x[ 9]);
722 1
   z[17] = w2; w2 = 0;
723

724 1
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[15]);
725 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[14]);
726 1
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[13]);
727 1
   word3_muladd_2(&w2, &w1, &w0, x[ 6], x[12]);
728 1
   word3_muladd_2(&w2, &w1, &w0, x[ 7], x[11]);
729 1
   word3_muladd_2(&w2, &w1, &w0, x[ 8], x[10]);
730 1
   word3_muladd  (&w2, &w1, &w0, x[ 9], x[ 9]);
731 1
   z[18] = w0; w0 = 0;
732

733 1
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[15]);
734 1
   word3_muladd_2(&w0, &w2, &w1, x[ 5], x[14]);
735 1
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[13]);
736 1
   word3_muladd_2(&w0, &w2, &w1, x[ 7], x[12]);
737 1
   word3_muladd_2(&w0, &w2, &w1, x[ 8], x[11]);
738 1
   word3_muladd_2(&w0, &w2, &w1, x[ 9], x[10]);
739 1
   z[19] = w1; w1 = 0;
740

741 1
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[15]);
742 1
   word3_muladd_2(&w1, &w0, &w2, x[ 6], x[14]);
743 1
   word3_muladd_2(&w1, &w0, &w2, x[ 7], x[13]);
744 1
   word3_muladd_2(&w1, &w0, &w2, x[ 8], x[12]);
745 1
   word3_muladd_2(&w1, &w0, &w2, x[ 9], x[11]);
746 1
   word3_muladd  (&w1, &w0, &w2, x[10], x[10]);
747 1
   z[20] = w2; w2 = 0;
748

749 1
   word3_muladd_2(&w2, &w1, &w0, x[ 6], x[15]);
750 1
   word3_muladd_2(&w2, &w1, &w0, x[ 7], x[14]);
751 1
   word3_muladd_2(&w2, &w1, &w0, x[ 8], x[13]);
752 1
   word3_muladd_2(&w2, &w1, &w0, x[ 9], x[12]);
753 1
   word3_muladd_2(&w2, &w1, &w0, x[10], x[11]);
754 1
   z[21] = w0; w0 = 0;
755

756 1
   word3_muladd_2(&w0, &w2, &w1, x[ 7], x[15]);
757 1
   word3_muladd_2(&w0, &w2, &w1, x[ 8], x[14]);
758 1
   word3_muladd_2(&w0, &w2, &w1, x[ 9], x[13]);
759 1
   word3_muladd_2(&w0, &w2, &w1, x[10], x[12]);
760 1
   word3_muladd  (&w0, &w2, &w1, x[11], x[11]);
761 1
   z[22] = w1; w1 = 0;
762

763 1
   word3_muladd_2(&w1, &w0, &w2, x[ 8], x[15]);
764 1
   word3_muladd_2(&w1, &w0, &w2, x[ 9], x[14]);
765 1
   word3_muladd_2(&w1, &w0, &w2, x[10], x[13]);
766 1
   word3_muladd_2(&w1, &w0, &w2, x[11], x[12]);
767 1
   z[23] = w2; w2 = 0;
768

769 1
   word3_muladd_2(&w2, &w1, &w0, x[ 9], x[15]);
770 1
   word3_muladd_2(&w2, &w1, &w0, x[10], x[14]);
771 1
   word3_muladd_2(&w2, &w1, &w0, x[11], x[13]);
772 1
   word3_muladd  (&w2, &w1, &w0, x[12], x[12]);
773 1
   z[24] = w0; w0 = 0;
774

775 1
   word3_muladd_2(&w0, &w2, &w1, x[10], x[15]);
776 1
   word3_muladd_2(&w0, &w2, &w1, x[11], x[14]);
777 1
   word3_muladd_2(&w0, &w2, &w1, x[12], x[13]);
778 1
   z[25] = w1; w1 = 0;
779

780 1
   word3_muladd_2(&w1, &w0, &w2, x[11], x[15]);
781 1
   word3_muladd_2(&w1, &w0, &w2, x[12], x[14]);
782 1
   word3_muladd  (&w1, &w0, &w2, x[13], x[13]);
783 1
   z[26] = w2; w2 = 0;
784

785 1
   word3_muladd_2(&w2, &w1, &w0, x[12], x[15]);
786 1
   word3_muladd_2(&w2, &w1, &w0, x[13], x[14]);
787 1
   z[27] = w0; w0 = 0;
788

789 1
   word3_muladd_2(&w0, &w2, &w1, x[13], x[15]);
790 1
   word3_muladd  (&w0, &w2, &w1, x[14], x[14]);
791 1
   z[28] = w1; w1 = 0;
792

793 1
   word3_muladd_2(&w1, &w0, &w2, x[14], x[15]);
794 1
   z[29] = w2; w2 = 0;
795

796 1
   word3_muladd  (&w2, &w1, &w0, x[15], x[15]);
797 1
   z[30] = w0;
798 1
   z[31] = w1;
799 1
   }
800

801
/*
802
* Comba 16x16 Multiplication
803
*/
804 1
void bigint_comba_mul16(word z[32], const word x[16], const word y[16])
805
   {
806 1
   word w2 = 0, w1 = 0, w0 = 0;
807

808 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
809 1
   z[ 0] = w0; w0 = 0;
810

811 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
812 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
813 1
   z[ 1] = w1; w1 = 0;
814

815 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
816 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
817 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
818 1
   z[ 2] = w2; w2 = 0;
819

820 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
821 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
822 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
823 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
824 1
   z[ 3] = w0; w0 = 0;
825

826 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]);
827 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
828 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
829 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
830 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]);
831 1
   z[ 4] = w1; w1 = 0;
832

833 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]);
834 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]);
835 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
836 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
837 1
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]);
838 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]);
839 1
   z[ 5] = w2; w2 = 0;
840

841 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]);
842 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]);
843 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]);
844 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
845 1
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]);
846 1
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]);
847 1
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]);
848 1
   z[ 6] = w0; w0 = 0;
849

850 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]);
851 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]);
852 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]);
853 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]);
854 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]);
855 1
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]);
856 1
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]);
857 1
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]);
858 1
   z[ 7] = w1; w1 = 0;
859

860 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 8]);
861 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]);
862 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]);
863 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]);
864 1
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]);
865 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]);
866 1
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 2]);
867 1
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 1]);
868 1
   word3_muladd(&w1, &w0, &w2, x[ 8], y[ 0]);
869 1
   z[ 8] = w2; w2 = 0;
870

871 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 9]);
872 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 8]);
873 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]);
874 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]);
875 1
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]);
876 1
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]);
877 1
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]);
878 1
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]);
879 1
   word3_muladd(&w2, &w1, &w0, x[ 8], y[ 1]);
880 1
   word3_muladd(&w2, &w1, &w0, x[ 9], y[ 0]);
881 1
   z[ 9] = w0; w0 = 0;
882

883 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[10]);
884 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 9]);
885 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 8]);
886 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 7]);
887 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 6]);
888 1
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]);
889 1
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 4]);
890 1
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 3]);
891 1
   word3_muladd(&w0, &w2, &w1, x[ 8], y[ 2]);
892 1
   word3_muladd(&w0, &w2, &w1, x[ 9], y[ 1]);
893 1
   word3_muladd(&w0, &w2, &w1, x[10], y[ 0]);
894 1
   z[10] = w1; w1 = 0;
895

896 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[11]);
897 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[10]);
898 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 9]);
899 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 8]);
900 1
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 7]);
901 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 6]);
902 1
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 5]);
903 1
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 4]);
904 1
   word3_muladd(&w1, &w0, &w2, x[ 8], y[ 3]);
905 1
   word3_muladd(&w1, &w0, &w2, x[ 9], y[ 2]);
906 1
   word3_muladd(&w1, &w0, &w2, x[10], y[ 1]);
907 1
   word3_muladd(&w1, &w0, &w2, x[11], y[ 0]);
908 1
   z[11] = w2; w2 = 0;
909

910 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[12]);
911 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[11]);
912 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[10]);
913 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 9]);
914 1
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 8]);
915 1
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]);
916 1
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]);
917 1
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]);
918 1
   word3_muladd(&w2, &w1, &w0, x[ 8], y[ 4]);
919 1
   word3_muladd(&w2, &w1, &w0, x[ 9], y[ 3]);
920 1
   word3_muladd(&w2, &w1, &w0, x[10], y[ 2]);
921 1
   word3_muladd(&w2, &w1, &w0, x[11], y[ 1]);
922 1
   word3_muladd(&w2, &w1, &w0, x[12], y[ 0]);
923 1
   z[12] = w0; w0 = 0;
924

925 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[13]);
926 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[12]);
927 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[11]);
928 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[10]);
929 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 9]);
930 1
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 8]);
931 1
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 7]);
932 1
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 6]);
933 1
   word3_muladd(&w0, &w2, &w1, x[ 8], y[ 5]);
934 1
   word3_muladd(&w0, &w2, &w1, x[ 9], y[ 4]);
935 1
   word3_muladd(&w0, &w2, &w1, x[10], y[ 3]);
936 1
   word3_muladd(&w0, &w2, &w1, x[11], y[ 2]);
937 1
   word3_muladd(&w0, &w2, &w1, x[12], y[ 1]);
938 1
   word3_muladd(&w0, &w2, &w1, x[13], y[ 0]);
939 1
   z[13] = w1; w1 = 0;
940

941 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[14]);
942 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[13]);
943 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[12]);
944 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[11]);
945 1
   word3_muladd(&w1, &w0, &w2, x[ 4], y[10]);
946 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 9]);
947 1
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 8]);
948 1
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 7]);
949 1
   word3_muladd(&w1, &w0, &w2, x[ 8], y[ 6]);
950 1
   word3_muladd(&w1, &w0, &w2, x[ 9], y[ 5]);
951 1
   word3_muladd(&w1, &w0, &w2, x[10], y[ 4]);
952 1
   word3_muladd(&w1, &w0, &w2, x[11], y[ 3]);
953 1
   word3_muladd(&w1, &w0, &w2, x[12], y[ 2]);
954 1
   word3_muladd(&w1, &w0, &w2, x[13], y[ 1]);
955 1
   word3_muladd(&w1, &w0, &w2, x[14], y[ 0]);
956 1
   z[14] = w2; w2 = 0;
957

958 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[15]);
959 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[14]);
960 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[13]);
961 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[12]);
962 1
   word3_muladd(&w2, &w1, &w0, x[ 4], y[11]);
963 1
   word3_muladd(&w2, &w1, &w0, x[ 5], y[10]);
964 1
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 9]);
965 1
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 8]);
966 1
   word3_muladd(&w2, &w1, &w0, x[ 8], y[ 7]);
967 1
   word3_muladd(&w2, &w1, &w0, x[ 9], y[ 6]);
968 1
   word3_muladd(&w2, &w1, &w0, x[10], y[ 5]);
969 1
   word3_muladd(&w2, &w1, &w0, x[11], y[ 4]);
970 1
   word3_muladd(&w2, &w1, &w0, x[12], y[ 3]);
971 1
   word3_muladd(&w2, &w1, &w0, x[13], y[ 2]);
972 1
   word3_muladd(&w2, &w1, &w0, x[14], y[ 1]);
973 1
   word3_muladd(&w2, &w1, &w0, x[15], y[ 0]);
974 1
   z[15] = w0; w0 = 0;
975

976 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[15]);
977 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[14]);
978 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[13]);
979 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[12]);
980 1
   word3_muladd(&w0, &w2, &w1, x[ 5], y[11]);
981 1
   word3_muladd(&w0, &w2, &w1, x[ 6], y[10]);
982 1
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 9]);
983 1
   word3_muladd(&w0, &w2, &w1, x[ 8], y[ 8]);
984 1
   word3_muladd(&w0, &w2, &w1, x[ 9], y[ 7]);
985 1
   word3_muladd(&w0, &w2, &w1, x[10], y[ 6]);
986 1
   word3_muladd(&w0, &w2, &w1, x[11], y[ 5]);
987 1
   word3_muladd(&w0, &w2, &w1, x[12], y[ 4]);
988 1
   word3_muladd(&w0, &w2, &w1, x[13], y[ 3]);
989 1
   word3_muladd(&w0, &w2, &w1, x[14], y[ 2]);
990 1
   word3_muladd(&w0, &w2, &w1, x[15], y[ 1]);
991 1
   z[16] = w1; w1 = 0;
992

993 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[15]);
994 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[14]);
995 1
   word3_muladd(&w1, &w0, &w2, x[ 4], y[13]);
996 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[12]);
997 1
   word3_muladd(&w1, &w0, &w2, x[ 6], y[11]);
998 1
   word3_muladd(&w1, &w0, &w2, x[ 7], y[10]);
999 1
   word3_muladd(&w1, &w0, &w2, x[ 8], y[ 9]);
1000 1
   word3_muladd(&w1, &w0, &w2, x[ 9], y[ 8]);
1001 1
   word3_muladd(&w1, &w0, &w2, x[10], y[ 7]);
1002 1
   word3_muladd(&w1, &w0, &w2, x[11], y[ 6]);
1003 1
   word3_muladd(&w1, &w0, &w2, x[12], y[ 5]);
1004 1
   word3_muladd(&w1, &w0, &w2, x[13], y[ 4]);
1005 1
   word3_muladd(&w1, &w0, &w2, x[14], y[ 3]);
1006 1
   word3_muladd(&w1, &w0, &w2, x[15], y[ 2]);
1007 1
   z[17] = w2; w2 = 0;
1008

1009 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[15]);
1010 1
   word3_muladd(&w2, &w1, &w0, x[ 4], y[14]);
1011 1
   word3_muladd(&w2, &w1, &w0, x[ 5], y[13]);
1012 1
   word3_muladd(&w2, &w1, &w0, x[ 6], y[12]);
1013 1
   word3_muladd(&w2, &w1, &w0, x[ 7], y[11]);
1014 1
   word3_muladd(&w2, &w1, &w0, x[ 8], y[10]);
1015 1
   word3_muladd(&w2, &w1, &w0, x[ 9], y[ 9]);
1016 1
   word3_muladd(&w2, &w1, &w0, x[10], y[ 8]);
1017 1
   word3_muladd(&w2, &w1, &w0, x[11], y[ 7]);
1018 1
   word3_muladd(&w2, &w1, &w0, x[12], y[ 6]);
1019 1
   word3_muladd(&w2, &w1, &w0, x[13], y[ 5]);
1020 1
   word3_muladd(&w2, &w1, &w0, x[14], y[ 4]);
1021 1
   word3_muladd(&w2, &w1, &w0, x[15], y[ 3]);
1022 1
   z[18] = w0; w0 = 0;
1023

1024 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[15]);
1025 1
   word3_muladd(&w0, &w2, &w1, x[ 5], y[14]);
1026 1
   word3_muladd(&w0, &w2, &w1, x[ 6], y[13]);
1027 1
   word3_muladd(&w0, &w2, &w1, x[ 7], y[12]);
1028 1
   word3_muladd(&w0, &w2, &w1, x[ 8], y[11]);
1029 1
   word3_muladd(&w0, &w2, &w1, x[ 9], y[10]);
1030 1
   word3_muladd(&w0, &w2, &w1, x[10], y[ 9]);
1031 1
   word3_muladd(&w0, &w2, &w1, x[11], y[ 8]);
1032 1
   word3_muladd(&w0, &w2, &w1, x[12], y[ 7]);
1033 1
   word3_muladd(&w0, &w2, &w1, x[13], y[ 6]);
1034 1
   word3_muladd(&w0, &w2, &w1, x[14], y[ 5]);
1035 1
   word3_muladd(&w0, &w2, &w1, x[15], y[ 4]);
1036 1
   z[19] = w1; w1 = 0;
1037

1038 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[15]);
1039 1
   word3_muladd(&w1, &w0, &w2, x[ 6], y[14]);
1040 1
   word3_muladd(&w1, &w0, &w2, x[ 7], y[13]);
1041 1
   word3_muladd(&w1, &w0, &w2, x[ 8], y[12]);
1042 1
   word3_muladd(&w1, &w0, &w2, x[ 9], y[11]);
1043 1
   word3_muladd(&w1, &w0, &w2, x[10], y[10]);
1044 1
   word3_muladd(&w1, &w0, &w2, x[11], y[ 9]);
1045 1
   word3_muladd(&w1, &w0, &w2, x[12], y[ 8]);
1046 1
   word3_muladd(&w1, &w0, &w2, x[13], y[ 7]);
1047 1
   word3_muladd(&w1, &w0, &w2, x[14], y[ 6]);
1048 1
   word3_muladd(&w1, &w0, &w2, x[15], y[ 5]);
1049 1
   z[20] = w2; w2 = 0;
1050

1051 1
   word3_muladd(&w2, &w1, &w0, x[ 6], y[15]);
1052 1
   word3_muladd(&w2, &w1, &w0, x[ 7], y[14]);
1053 1
   word3_muladd(&w2, &w1, &w0, x[ 8], y[13]);
1054 1
   word3_muladd(&w2, &w1, &w0, x[ 9], y[12]);
1055 1
   word3_muladd(&w2, &w1, &w0, x[10], y[11]);
1056 1
   word3_muladd(&w2, &w1, &w0, x[11], y[10]);
1057 1
   word3_muladd(&w2, &w1, &w0, x[12], y[ 9]);
1058 1
   word3_muladd(&w2, &w1, &w0, x[13], y[ 8]);
1059 1
   word3_muladd(&w2, &w1, &w0, x[14], y[ 7]);
1060 1
   word3_muladd(&w2, &w1, &w0, x[15], y[ 6]);
1061 1
   z[21] = w0; w0 = 0;
1062

1063 1
   word3_muladd(&w0, &w2, &w1, x[ 7], y[15]);
1064 1
   word3_muladd(&w0, &w2, &w1, x[ 8], y[14]);
1065 1
   word3_muladd(&w0, &w2, &w1, x[ 9], y[13]);
1066 1
   word3_muladd(&w0, &w2, &w1, x[10], y[12]);
1067 1
   word3_muladd(&w0, &w2, &w1, x[11], y[11]);
1068 1
   word3_muladd(&w0, &w2, &w1, x[12], y[10]);
1069 1
   word3_muladd(&w0, &w2, &w1, x[13], y[ 9]);
1070 1
   word3_muladd(&w0, &w2, &w1, x[14], y[ 8]);
1071 1
   word3_muladd(&w0, &w2, &w1, x[15], y[ 7]);
1072 1
   z[22] = w1; w1 = 0;
1073

1074 1
   word3_muladd(&w1, &w0, &w2, x[ 8], y[15]);
1075 1
   word3_muladd(&w1, &w0, &w2, x[ 9], y[14]);
1076 1
   word3_muladd(&w1, &w0, &w2, x[10], y[13]);
1077 1
   word3_muladd(&w1, &w0, &w2, x[11], y[12]);
1078 1
   word3_muladd(&w1, &w0, &w2, x[12], y[11]);
1079 1
   word3_muladd(&w1, &w0, &w2, x[13], y[10]);
1080 1
   word3_muladd(&w1, &w0, &w2, x[14], y[ 9]);
1081 1
   word3_muladd(&w1, &w0, &w2, x[15], y[ 8]);
1082 1
   z[23] = w2; w2 = 0;
1083

1084 1
   word3_muladd(&w2, &w1, &w0, x[ 9], y[15]);
1085 1
   word3_muladd(&w2, &w1, &w0, x[10], y[14]);
1086 1
   word3_muladd(&w2, &w1, &w0, x[11], y[13]);
1087 1
   word3_muladd(&w2, &w1, &w0, x[12], y[12]);
1088 1
   word3_muladd(&w2, &w1, &w0, x[13], y[11]);
1089 1
   word3_muladd(&w2, &w1, &w0, x[14], y[10]);
1090 1
   word3_muladd(&w2, &w1, &w0, x[15], y[ 9]);
1091 1
   z[24] = w0; w0 = 0;
1092

1093 1
   word3_muladd(&w0, &w2, &w1, x[10], y[15]);
1094 1
   word3_muladd(&w0, &w2, &w1, x[11], y[14]);
1095 1
   word3_muladd(&w0, &w2, &w1, x[12], y[13]);
1096 1
   word3_muladd(&w0, &w2, &w1, x[13], y[12]);
1097 1
   word3_muladd(&w0, &w2, &w1, x[14], y[11]);
1098 1
   word3_muladd(&w0, &w2, &w1, x[15], y[10]);
1099 1
   z[25] = w1; w1 = 0;
1100

1101 1
   word3_muladd(&w1, &w0, &w2, x[11], y[15]);
1102 1
   word3_muladd(&w1, &w0, &w2, x[12], y[14]);
1103 1
   word3_muladd(&w1, &w0, &w2, x[13], y[13]);
1104 1
   word3_muladd(&w1, &w0, &w2, x[14], y[12]);
1105 1
   word3_muladd(&w1, &w0, &w2, x[15], y[11]);
1106 1
   z[26] = w2; w2 = 0;
1107

1108 1
   word3_muladd(&w2, &w1, &w0, x[12], y[15]);
1109 1
   word3_muladd(&w2, &w1, &w0, x[13], y[14]);
1110 1
   word3_muladd(&w2, &w1, &w0, x[14], y[13]);
1111 1
   word3_muladd(&w2, &w1, &w0, x[15], y[12]);
1112 1
   z[27] = w0; w0 = 0;
1113

1114 1
   word3_muladd(&w0, &w2, &w1, x[13], y[15]);
1115 1
   word3_muladd(&w0, &w2, &w1, x[14], y[14]);
1116 1
   word3_muladd(&w0, &w2, &w1, x[15], y[13]);
1117 1
   z[28] = w1; w1 = 0;
1118

1119 1
   word3_muladd(&w1, &w0, &w2, x[14], y[15]);
1120 1
   word3_muladd(&w1, &w0, &w2, x[15], y[14]);
1121 1
   z[29] = w2; w2 = 0;
1122

1123 1
   word3_muladd(&w2, &w1, &w0, x[15], y[15]);
1124 1
   z[30] = w0;
1125 1
   z[31] = w1;
1126 1
   }
1127

1128
/*
1129
* Comba 24x24 Squaring
1130
*/
1131 1
void bigint_comba_sqr24(word z[48], const word x[24])
1132
   {
1133 1
   word w2 = 0, w1 = 0, w0 = 0;
1134

1135 1
   word3_muladd  (&w2, &w1, &w0, x[ 0], x[ 0]);
1136 1
   z[ 0] = w0; w0 = 0;
1137

1138 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
1139 1
   z[ 1] = w1; w1 = 0;
1140

1141 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]);
1142 1
   word3_muladd  (&w1, &w0, &w2, x[ 1], x[ 1]);
1143 1
   z[ 2] = w2; w2 = 0;
1144

1145 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]);
1146 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]);
1147 1
   z[ 3] = w0; w0 = 0;
1148

1149 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]);
1150 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
1151 1
   word3_muladd  (&w0, &w2, &w1, x[ 2], x[ 2]);
1152 1
   z[ 4] = w1; w1 = 0;
1153

1154 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]);
1155 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]);
1156 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
1157 1
   z[ 5] = w2; w2 = 0;
1158

1159 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]);
1160 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]);
1161 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]);
1162 1
   word3_muladd  (&w2, &w1, &w0, x[ 3], x[ 3]);
1163 1
   z[ 6] = w0; w0 = 0;
1164

1165 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]);
1166 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]);
1167 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]);
1168 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]);
1169 1
   z[ 7] = w1; w1 = 0;
1170

1171 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 8]);
1172 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]);
1173 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]);
1174 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]);
1175 1
   word3_muladd  (&w1, &w0, &w2, x[ 4], x[ 4]);
1176 1
   z[ 8] = w2; w2 = 0;
1177

1178 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 9]);
1179 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 8]);
1180 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]);
1181 1
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]);
1182 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]);
1183 1
   z[ 9] = w0; w0 = 0;
1184

1185 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[10]);
1186 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 9]);
1187 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 8]);
1188 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]);
1189 1
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]);
1190 1
   word3_muladd  (&w0, &w2, &w1, x[ 5], x[ 5]);
1191 1
   z[10] = w1; w1 = 0;
1192

1193 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[11]);
1194 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[10]);
1195 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 9]);
1196 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 8]);
1197 1
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]);
1198 1
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]);
1199 1
   z[11] = w2; w2 = 0;
1200

1201 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[12]);
1202 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[11]);
1203 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[10]);
1204 1
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 9]);
1205 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 8]);
1206 1
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]);
1207 1
   word3_muladd  (&w2, &w1, &w0, x[ 6], x[ 6]);
1208 1
   z[12] = w0; w0 = 0;
1209

1210 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[13]);
1211 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[12]);
1212 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[11]);
1213 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[10]);
1214 1
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 9]);
1215 1
   word3_muladd_2(&w0, &w2, &w1, x[ 5], x[ 8]);
1216 1
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]);
1217 1
   z[13] = w1; w1 = 0;
1218

1219 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[14]);
1220 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[13]);
1221 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[12]);
1222 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[11]);
1223 1
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[10]);
1224 1
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 9]);
1225 1
   word3_muladd_2(&w1, &w0, &w2, x[ 6], x[ 8]);
1226 1
   word3_muladd  (&w1, &w0, &w2, x[ 7], x[ 7]);
1227 1
   z[14] = w2; w2 = 0;
1228

1229 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[15]);
1230 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[14]);
1231 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[13]);
1232 1
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[12]);
1233 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[11]);
1234 1
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[10]);
1235 1
   word3_muladd_2(&w2, &w1, &w0, x[ 6], x[ 9]);
1236 1
   word3_muladd_2(&w2, &w1, &w0, x[ 7], x[ 8]);
1237 1
   z[15] = w0; w0 = 0;
1238

1239 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[16]);
1240 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[15]);
1241 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[14]);
1242 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[13]);
1243 1
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[12]);
1244 1
   word3_muladd_2(&w0, &w2, &w1, x[ 5], x[11]);
1245 1
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[10]);
1246 1
   word3_muladd_2(&w0, &w2, &w1, x[ 7], x[ 9]);
1247 1
   word3_muladd  (&w0, &w2, &w1, x[ 8], x[ 8]);
1248 1
   z[16] = w1; w1 = 0;
1249

1250 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[17]);
1251 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[16]);
1252 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[15]);
1253 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[14]);
1254 1
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[13]);
1255 1
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[12]);
1256 1
   word3_muladd_2(&w1, &w0, &w2, x[ 6], x[11]);
1257 1
   word3_muladd_2(&w1, &w0, &w2, x[ 7], x[10]);
1258 1
   word3_muladd_2(&w1, &w0, &w2, x[ 8], x[ 9]);
1259 1
   z[17] = w2; w2 = 0;
1260

1261 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[18]);
1262 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[17]);
1263 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[16]);
1264 1
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[15]);
1265 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[14]);
1266 1
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[13]);
1267 1
   word3_muladd_2(&w2, &w1, &w0, x[ 6], x[12]);
1268 1
   word3_muladd_2(&w2, &w1, &w0, x[ 7], x[11]);
1269 1
   word3_muladd_2(&w2, &w1, &w0, x[ 8], x[10]);
1270 1
   word3_muladd  (&w2, &w1, &w0, x[ 9], x[ 9]);
1271 1
   z[18] = w0; w0 = 0;
1272

1273 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[19]);
1274 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[18]);
1275 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[17]);
1276 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[16]);
1277 1
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[15]);
1278 1
   word3_muladd_2(&w0, &w2, &w1, x[ 5], x[14]);
1279 1
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[13]);
1280 1
   word3_muladd_2(&w0, &w2, &w1, x[ 7], x[12]);
1281 1
   word3_muladd_2(&w0, &w2, &w1, x[ 8], x[11]);
1282 1
   word3_muladd_2(&w0, &w2, &w1, x[ 9], x[10]);
1283 1
   z[19] = w1; w1 = 0;
1284

1285 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[20]);
1286 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[19]);
1287 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[18]);
1288 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[17]);
1289 1
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[16]);
1290 1
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[15]);
1291 1
   word3_muladd_2(&w1, &w0, &w2, x[ 6], x[14]);
1292 1
   word3_muladd_2(&w1, &w0, &w2, x[ 7], x[13]);
1293 1
   word3_muladd_2(&w1, &w0, &w2, x[ 8], x[12]);
1294 1
   word3_muladd_2(&w1, &w0, &w2, x[ 9], x[11]);
1295 1
   word3_muladd  (&w1, &w0, &w2, x[10], x[10]);
1296 1
   z[20] = w2; w2 = 0;
1297

1298 1
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[21]);
1299 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[20]);
1300 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[19]);
1301 1
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[18]);
1302 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[17]);
1303 1
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[16]);
1304 1
   word3_muladd_2(&w2, &w1, &w0, x[ 6], x[15]);
1305 1
   word3_muladd_2(&w2, &w1, &w0, x[ 7], x[14]);
1306 1
   word3_muladd_2(&w2, &w1, &w0, x[ 8], x[13]);
1307 1
   word3_muladd_2(&w2, &w1, &w0, x[ 9], x[12]);
1308 1
   word3_muladd_2(&w2, &w1, &w0, x[10], x[11]);
1309 1
   z[21] = w0; w0 = 0;
1310

1311 1
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[22]);
1312 1
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[21]);
1313 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[20]);
1314 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[19]);
1315 1
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[18]);
1316 1
   word3_muladd_2(&w0, &w2, &w1, x[ 5], x[17]);
1317 1
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[16]);
1318 1
   word3_muladd_2(&w0, &w2, &w1, x[ 7], x[15]);
1319 1
   word3_muladd_2(&w0, &w2, &w1, x[ 8], x[14]);
1320 1
   word3_muladd_2(&w0, &w2, &w1, x[ 9], x[13]);
1321 1
   word3_muladd_2(&w0, &w2, &w1, x[10], x[12]);
1322 1
   word3_muladd  (&w0, &w2, &w1, x[11], x[11]);
1323 1
   z[22] = w1; w1 = 0;
1324

1325 1
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[23]);
1326 1
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[22]);
1327 1
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[21]);
1328 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[20]);
1329 1
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[19]);
1330 1
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[18]);
1331 1
   word3_muladd_2(&w1, &w0, &w2, x[ 6], x[17]);
1332 1
   word3_muladd_2(&w1, &w0, &w2, x[ 7], x[16]);
1333 1
   word3_muladd_2(&w1, &w0, &w2, x[ 8], x[15]);
1334 1
   word3_muladd_2(&w1, &w0, &w2, x[ 9], x[14]);
1335 1
   word3_muladd_2(&w1, &w0, &w2, x[10], x[13]);
1336 1
   word3_muladd_2(&w1, &w0, &w2, x[11], x[12]);
1337 1
   z[23] = w2; w2 = 0;
1338

1339 1
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[23]);
1340 1
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[22]);
1341 1
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[21]);
1342 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[20]);
1343 1
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[19]);
1344 1
   word3_muladd_2(&w2, &w1, &w0, x[ 6], x[18]);
1345 1
   word3_muladd_2(&w2, &w1, &w0, x[ 7], x[17]);
1346 1
   word3_muladd_2(&w2, &w1, &w0, x[ 8], x[16]);
1347 1
   word3_muladd_2(&w2, &w1, &w0, x[ 9], x[15]);
1348 1
   word3_muladd_2(&w2, &w1, &w0, x[10], x[14]);
1349 1
   word3_muladd_2(&w2, &w1, &w0, x[11], x[13]);
1350 1
   word3_muladd  (&w2, &w1, &w0, x[12], x[12]);
1351 1
   z[24] = w0; w0 = 0;
1352

1353 1
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[23]);
1354 1
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[22]);
1355 1
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[21]);
1356 1
   word3_muladd_2(&w0, &w2, &w1, x[ 5], x[20]);
1357 1
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[19]);
1358 1
   word3_muladd_2(&w0, &w2, &w1, x[ 7], x[18]);
1359 1
   word3_muladd_2(&w0, &w2, &w1, x[ 8], x[17]);
1360 1
   word3_muladd_2(&w0, &w2, &w1, x[ 9], x[16]);
1361 1
   word3_muladd_2(&w0, &w2, &w1, x[10], x[15]);
1362 1
   word3_muladd_2(&w0, &w2, &w1, x[11], x[14]);
1363 1
   word3_muladd_2(&w0, &w2, &w1, x[12], x[13]);
1364 1
   z[25] = w1; w1 = 0;
1365

1366 1
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[23]);
1367 1
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[22]);
1368 1
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[21]);
1369 1
   word3_muladd_2(&w1, &w0, &w2, x[ 6], x[20]);
1370 1
   word3_muladd_2(&w1, &w0, &w2, x[ 7], x[19]);
1371 1
   word3_muladd_2(&w1, &w0, &w2, x[ 8], x[18]);
1372 1
   word3_muladd_2(&w1, &w0, &w2, x[ 9], x[17]);
1373 1
   word3_muladd_2(&w1, &w0, &w2, x[10], x[16]);
1374 1
   word3_muladd_2(&w1, &w0, &w2, x[11], x[15]);
1375 1
   word3_muladd_2(&w1, &w0, &w2, x[12], x[14]);
1376 1
   word3_muladd  (&w1, &w0, &w2, x[13], x[13]);
1377 1
   z[26] = w2; w2 = 0;
1378

1379 1
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[23]);
1380 1
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[22]);
1381 1
   word3_muladd_2(&w2, &w1, &w0, x[ 6], x[21]);
1382 1
   word3_muladd_2(&w2, &w1, &w0, x[ 7], x[20]);
1383 1
   word3_muladd_2(&w2, &w1, &w0, x[ 8], x[19]);
1384 1
   word3_muladd_2(&w2, &w1, &w0, x[ 9], x[18]);
1385 1
   word3_muladd_2(&w2, &w1, &w0, x[10], x[17]);
1386 1
   word3_muladd_2(&w2, &w1, &w0, x[11], x[16]);
1387 1
   word3_muladd_2(&w2, &w1, &w0, x[12], x[15]);
1388 1
   word3_muladd_2(&w2, &w1, &w0, x[13], x[14]);
1389 1
   z[27] = w0; w0 = 0;
1390

1391 1
   word3_muladd_2(&w0, &w2, &w1, x[ 5], x[23]);
1392 1
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[22]);
1393 1
   word3_muladd_2(&w0, &w2, &w1, x[ 7], x[21]);
1394 1
   word3_muladd_2(&w0, &w2, &w1, x[ 8], x[20]);
1395 1
   word3_muladd_2(&w0, &w2, &w1, x[ 9], x[19]);
1396 1
   word3_muladd_2(&w0, &w2, &w1, x[10], x[18]);
1397 1
   word3_muladd_2(&w0, &w2, &w1, x[11], x[17]);
1398 1
   word3_muladd_2(&w0, &w2, &w1, x[12], x[16]);
1399 1
   word3_muladd_2(&w0, &w2, &w1, x[13], x[15]);
1400 1
   word3_muladd  (&w0, &w2, &w1, x[14], x[14]);
1401 1
   z[28] = w1; w1 = 0;
1402

1403 1
   word3_muladd_2(&w1, &w0, &w2, x[ 6], x[23]);
1404 1
   word3_muladd_2(&w1, &w0, &w2, x[ 7], x[22]);
1405 1
   word3_muladd_2(&w1, &w0, &w2, x[ 8], x[21]);
1406 1
   word3_muladd_2(&w1, &w0, &w2, x[ 9], x[20]);
1407 1
   word3_muladd_2(&w1, &w0, &w2, x[10], x[19]);
1408 1
   word3_muladd_2(&w1, &w0, &w2, x[11], x[18]);
1409 1
   word3_muladd_2(&w1, &w0, &w2, x[12], x[17]);
1410 1
   word3_muladd_2(&w1, &w0, &w2, x[13], x[16]);
1411 1
   word3_muladd_2(&w1, &w0, &w2, x[14], x[15]);
1412 1
   z[29] = w2; w2 = 0;
1413

1414 1
   word3_muladd_2(&w2, &w1, &w0, x[ 7], x[23]);
1415 1
   word3_muladd_2(&w2, &w1, &w0, x[ 8], x[22]);
1416 1
   word3_muladd_2(&w2, &w1, &w0, x[ 9], x[21]);
1417 1
   word3_muladd_2(&w2, &w1, &w0, x[10], x[20]);
1418 1
   word3_muladd_2(&w2, &w1, &w0, x[11], x[19]);
1419 1
   word3_muladd_2(&w2, &w1, &w0, x[12], x[18]);
1420 1
   word3_muladd_2(&w2, &w1, &w0, x[13], x[17]);
1421 1
   word3_muladd_2(&w2, &w1, &w0, x[14], x[16]);
1422 1
   word3_muladd  (&w2, &w1, &w0, x[15], x[15]);
1423 1
   z[30] = w0; w0 = 0;
1424

1425 1
   word3_muladd_2(&w0, &w2, &w1, x[ 8], x[23]);
1426 1
   word3_muladd_2(&w0, &w2, &w1, x[ 9], x[22]);
1427 1
   word3_muladd_2(&w0, &w2, &w1, x[10], x[21]);
1428 1
   word3_muladd_2(&w0, &w2, &w1, x[11], x[20]);
1429 1
   word3_muladd_2(&w0, &w2, &w1, x[12], x[19]);
1430 1
   word3_muladd_2(&w0, &w2, &w1, x[13], x[18]);
1431 1
   word3_muladd_2(&w0, &w2, &w1, x[14], x[17]);
1432 1
   word3_muladd_2(&w0, &w2, &w1, x[15], x[16]);
1433 1
   z[31] = w1; w1 = 0;
1434

1435 1
   word3_muladd_2(&w1, &w0, &w2, x[ 9], x[23]);
1436 1
   word3_muladd_2(&w1, &w0, &w2, x[10], x[22]);
1437 1
   word3_muladd_2(&w1, &w0, &w2, x[11], x[21]);
1438 1
   word3_muladd_2(&w1, &w0, &w2, x[12], x[20]);
1439 1
   word3_muladd_2(&w1, &w0, &w2, x[13], x[19]);
1440 1
   word3_muladd_2(&w1, &w0, &w2, x[14], x[18]);
1441 1
   word3_muladd_2(&w1, &w0, &w2, x[15], x[17]);
1442 1
   word3_muladd  (&w1, &w0, &w2, x[16], x[16]);
1443 1
   z[32] = w2; w2 = 0;
1444

1445 1
   word3_muladd_2(&w2, &w1, &w0, x[10], x[23]);
1446 1
   word3_muladd_2(&w2, &w1, &w0, x[11], x[22]);
1447 1
   word3_muladd_2(&w2, &w1, &w0, x[12], x[21]);
1448 1
   word3_muladd_2(&w2, &w1, &w0, x[13], x[20]);
1449 1
   word3_muladd_2(&w2, &w1, &w0, x[14], x[19]);
1450 1
   word3_muladd_2(&w2, &w1, &w0, x[15], x[18]);
1451 1
   word3_muladd_2(&w2, &w1, &w0, x[16], x[17]);
1452 1
   z[33] = w0; w0 = 0;
1453

1454 1
   word3_muladd_2(&w0, &w2, &w1, x[11], x[23]);
1455 1
   word3_muladd_2(&w0, &w2, &w1, x[12], x[22]);
1456 1
   word3_muladd_2(&w0, &w2, &w1, x[13], x[21]);
1457 1
   word3_muladd_2(&w0, &w2, &w1, x[14], x[20]);
1458 1
   word3_muladd_2(&w0, &w2, &w1, x[15], x[19]);
1459 1
   word3_muladd_2(&w0, &w2, &w1, x[16], x[18]);
1460 1
   word3_muladd  (&w0, &w2, &w1, x[17], x[17]);
1461 1
   z[34] = w1; w1 = 0;
1462

1463 1
   word3_muladd_2(&w1, &w0, &w2, x[12], x[23]);
1464 1
   word3_muladd_2(&w1, &w0, &w2, x[13], x[22]);
1465 1
   word3_muladd_2(&w1, &w0, &w2, x[14], x[21]);
1466 1
   word3_muladd_2(&w1, &w0, &w2, x[15], x[20]);
1467 1
   word3_muladd_2(&w1, &w0, &w2, x[16], x[19]);
1468 1
   word3_muladd_2(&w1, &w0, &w2, x[17], x[18]);
1469 1
   z[35] = w2; w2 = 0;
1470

1471 1
   word3_muladd_2(&w2, &w1, &w0, x[13], x[23]);
1472 1
   word3_muladd_2(&w2, &w1, &w0, x[14], x[22]);
1473 1
   word3_muladd_2(&w2, &w1, &w0, x[15], x[21]);
1474 1
   word3_muladd_2(&w2, &w1, &w0, x[16], x[20]);
1475 1
   word3_muladd_2(&w2, &w1, &w0, x[17], x[19]);
1476 1
   word3_muladd  (&w2, &w1, &w0, x[18], x[18]);
1477 1
   z[36] = w0; w0 = 0;
1478

1479 1
   word3_muladd_2(&w0, &w2, &w1, x[14], x[23]);
1480 1
   word3_muladd_2(&w0, &w2, &w1, x[15], x[22]);
1481 1
   word3_muladd_2(&w0, &w2, &w1, x[16], x[21]);
1482 1
   word3_muladd_2(&w0, &w2, &w1, x[17], x[20]);
1483 1
   word3_muladd_2(&w0, &w2, &w1, x[18], x[19]);
1484 1
   z[37] = w1; w1 = 0;
1485

1486 1
   word3_muladd_2(&w1, &w0, &w2, x[15], x[23]);
1487 1
   word3_muladd_2(&w1, &w0, &w2, x[16], x[22]);
1488 1
   word3_muladd_2(&w1, &w0, &w2, x[17], x[21]);
1489 1
   word3_muladd_2(&w1, &w0, &w2, x[18], x[20]);
1490 1
   word3_muladd  (&w1, &w0, &w2, x[19], x[19]);
1491 1
   z[38] = w2; w2 = 0;
1492

1493 1
   word3_muladd_2(&w2, &w1, &w0, x[16], x[23]);
1494 1
   word3_muladd_2(&w2, &w1, &w0, x[17], x[22]);
1495 1
   word3_muladd_2(&w2, &w1, &w0, x[18], x[21]);
1496 1
   word3_muladd_2(&w2, &w1, &w0, x[19], x[20]);
1497 1
   z[39] = w0; w0 = 0;
1498

1499 1
   word3_muladd_2(&w0, &w2, &w1, x[17], x[23]);
1500 1
   word3_muladd_2(&w0, &w2, &w1, x[18], x[22]);
1501 1
   word3_muladd_2(&w0, &w2, &w1, x[19], x[21]);
1502 1
   word3_muladd  (&w0, &w2, &w1, x[20], x[20]);
1503 1
   z[40] = w1; w1 = 0;
1504

1505 1
   word3_muladd_2(&w1, &w0, &w2, x[18], x[23]);
1506 1
   word3_muladd_2(&w1, &w0, &w2, x[19], x[22]);
1507 1
   word3_muladd_2(&w1, &w0, &w2, x[20], x[21]);
1508 1
   z[41] = w2; w2 = 0;
1509

1510 1
   word3_muladd_2(&w2, &w1, &w0, x[19], x[23]);
1511 1
   word3_muladd_2(&w2, &w1, &w0, x[20], x[22]);
1512 1
   word3_muladd  (&w2, &w1, &w0, x[21], x[21]);
1513 1
   z[42] = w0; w0 = 0;
1514

1515 1
   word3_muladd_2(&w0, &w2, &w1, x[20], x[23]);
1516 1
   word3_muladd_2(&w0, &w2, &w1, x[21], x[22]);
1517 1
   z[43] = w1; w1 = 0;
1518

1519 1
   word3_muladd_2(&w1, &w0, &w2, x[21], x[23]);
1520 1
   word3_muladd  (&w1, &w0, &w2, x[22], x[22]);
1521 1
   z[44] = w2; w2 = 0;
1522

1523 1
   word3_muladd_2(&w2, &w1, &w0, x[22], x[23]);
1524 1
   z[45] = w0; w0 = 0;
1525

1526 1
   word3_muladd  (&w0, &w2, &w1, x[23], x[23]);
1527 1
   z[46] = w1;
1528 1
   z[47] = w2;
1529 1
   }
1530

1531
/*
1532
* Comba 24x24 Multiplication
1533
*/
1534 1
void bigint_comba_mul24(word z[48], const word x[24], const word y[24])
1535
   {
1536 1
   word w2 = 0, w1 = 0, w0 = 0;
1537

1538 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
1539 1
   z[ 0] = w0; w0 = 0;
1540

1541 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
1542 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
1543 1
   z[ 1] = w1; w1 = 0;
1544

1545 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
1546 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
1547 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
1548 1
   z[ 2] = w2; w2 = 0;
1549

1550 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
1551 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
1552 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
1553 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
1554 1
   z[ 3] = w0; w0 = 0;
1555

1556 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]);
1557 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
1558 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
1559 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
1560 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]);
1561 1
   z[ 4] = w1; w1 = 0;
1562

1563 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]);
1564 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]);
1565 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
1566 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
1567 1
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]);
1568 1
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]);
1569 1
   z[ 5] = w2; w2 = 0;
1570

1571 1
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]);
1572 1
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]);
1573 1
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]);
1574 1
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
1575 1
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]);
1576 1
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]);
1577 1
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]);
1578 1
   z[ 6] = w0; w0 = 0;
1579

1580 1
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]);
1581 1
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]);
1582 1
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]);
1583 1
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]);
1584 1
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]);
1585 1
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]);
1586 1
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]);
1587 1
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]);
1588 1
   z[ 7] = w1; w1 = 0;
1589

1590 1
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 8]);
1591 1
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]);
1592 1
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]);
1593 1
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]);
1594