Botan 3.4.0
Crypto and TLS for C&
mp_comba.cpp
Go to the documentation of this file.
1/*
2* Comba Multiplication and Squaring
3*
4* This file was automatically generated by ./src/scripts/dev_tools/gen_mp_comba.py on 2024-03-29
5*
6* Botan is released under the Simplified BSD License (see license.txt)
7*/
8
9#include <botan/internal/mp_core.h>
10
11namespace Botan {
12
13/*
14* Comba 4x4 Squaring
15*/
16void bigint_comba_sqr4(word z[8], const word x[4]) {
17 word w2 = 0, w1 = 0, w0 = 0;
18
19 word3_muladd(&w2, &w1, &w0, x[0], x[0]);
20 z[0] = w0;
21 w0 = 0;
22
23 word3_muladd_2(&w0, &w2, &w1, x[0], x[1]);
24 z[1] = w1;
25 w1 = 0;
26
27 word3_muladd_2(&w1, &w0, &w2, x[0], x[2]);
28 word3_muladd(&w1, &w0, &w2, x[1], x[1]);
29 z[2] = w2;
30 w2 = 0;
31
32 word3_muladd_2(&w2, &w1, &w0, x[0], x[3]);
33 word3_muladd_2(&w2, &w1, &w0, x[1], x[2]);
34 z[3] = w0;
35 w0 = 0;
36
37 word3_muladd_2(&w0, &w2, &w1, x[1], x[3]);
38 word3_muladd(&w0, &w2, &w1, x[2], x[2]);
39 z[4] = w1;
40 w1 = 0;
41
42 word3_muladd_2(&w1, &w0, &w2, x[2], x[3]);
43 z[5] = w2;
44 w2 = 0;
45
46 word3_muladd(&w2, &w1, &w0, x[3], x[3]);
47 z[6] = w0;
48 z[7] = w1;
49}
50
51/*
52* Comba 4x4 Multiplication
53*/
54void bigint_comba_mul4(word z[8], const word x[4], const word y[4]) {
55 word w2 = 0, w1 = 0, w0 = 0;
56
57 word3_muladd(&w2, &w1, &w0, x[0], y[0]);
58 z[0] = w0;
59 w0 = 0;
60
61 word3_muladd(&w0, &w2, &w1, x[0], y[1]);
62 word3_muladd(&w0, &w2, &w1, x[1], y[0]);
63 z[1] = w1;
64 w1 = 0;
65
66 word3_muladd(&w1, &w0, &w2, x[0], y[2]);
67 word3_muladd(&w1, &w0, &w2, x[1], y[1]);
68 word3_muladd(&w1, &w0, &w2, x[2], y[0]);
69 z[2] = w2;
70 w2 = 0;
71
72 word3_muladd(&w2, &w1, &w0, x[0], y[3]);
73 word3_muladd(&w2, &w1, &w0, x[1], y[2]);
74 word3_muladd(&w2, &w1, &w0, x[2], y[1]);
75 word3_muladd(&w2, &w1, &w0, x[3], y[0]);
76 z[3] = w0;
77 w0 = 0;
78
79 word3_muladd(&w0, &w2, &w1, x[1], y[3]);
80 word3_muladd(&w0, &w2, &w1, x[2], y[2]);
81 word3_muladd(&w0, &w2, &w1, x[3], y[1]);
82 z[4] = w1;
83 w1 = 0;
84
85 word3_muladd(&w1, &w0, &w2, x[2], y[3]);
86 word3_muladd(&w1, &w0, &w2, x[3], y[2]);
87 z[5] = w2;
88 w2 = 0;
89
90 word3_muladd(&w2, &w1, &w0, x[3], y[3]);
91 z[6] = w0;
92 z[7] = w1;
93}
94
95/*
96* Comba 6x6 Squaring
97*/
98void bigint_comba_sqr6(word z[12], const word x[6]) {
99 word w2 = 0, w1 = 0, w0 = 0;
100
101 word3_muladd(&w2, &w1, &w0, x[0], x[0]);
102 z[0] = w0;
103 w0 = 0;
104
105 word3_muladd_2(&w0, &w2, &w1, x[0], x[1]);
106 z[1] = w1;
107 w1 = 0;
108
109 word3_muladd_2(&w1, &w0, &w2, x[0], x[2]);
110 word3_muladd(&w1, &w0, &w2, x[1], x[1]);
111 z[2] = w2;
112 w2 = 0;
113
114 word3_muladd_2(&w2, &w1, &w0, x[0], x[3]);
115 word3_muladd_2(&w2, &w1, &w0, x[1], x[2]);
116 z[3] = w0;
117 w0 = 0;
118
119 word3_muladd_2(&w0, &w2, &w1, x[0], x[4]);
120 word3_muladd_2(&w0, &w2, &w1, x[1], x[3]);
121 word3_muladd(&w0, &w2, &w1, x[2], x[2]);
122 z[4] = w1;
123 w1 = 0;
124
125 word3_muladd_2(&w1, &w0, &w2, x[0], x[5]);
126 word3_muladd_2(&w1, &w0, &w2, x[1], x[4]);
127 word3_muladd_2(&w1, &w0, &w2, x[2], x[3]);
128 z[5] = w2;
129 w2 = 0;
130
131 word3_muladd_2(&w2, &w1, &w0, x[1], x[5]);
132 word3_muladd_2(&w2, &w1, &w0, x[2], x[4]);
133 word3_muladd(&w2, &w1, &w0, x[3], x[3]);
134 z[6] = w0;
135 w0 = 0;
136
137 word3_muladd_2(&w0, &w2, &w1, x[2], x[5]);
138 word3_muladd_2(&w0, &w2, &w1, x[3], x[4]);
139 z[7] = w1;
140 w1 = 0;
141
142 word3_muladd_2(&w1, &w0, &w2, x[3], x[5]);
143 word3_muladd(&w1, &w0, &w2, x[4], x[4]);
144 z[8] = w2;
145 w2 = 0;
146
147 word3_muladd_2(&w2, &w1, &w0, x[4], x[5]);
148 z[9] = w0;
149 w0 = 0;
150
151 word3_muladd(&w0, &w2, &w1, x[5], x[5]);
152 z[10] = w1;
153 z[11] = w2;
154}
155
156/*
157* Comba 6x6 Multiplication
158*/
159void bigint_comba_mul6(word z[12], const word x[6], const word y[6]) {
160 word w2 = 0, w1 = 0, w0 = 0;
161
162 word3_muladd(&w2, &w1, &w0, x[0], y[0]);
163 z[0] = w0;
164 w0 = 0;
165
166 word3_muladd(&w0, &w2, &w1, x[0], y[1]);
167 word3_muladd(&w0, &w2, &w1, x[1], y[0]);
168 z[1] = w1;
169 w1 = 0;
170
171 word3_muladd(&w1, &w0, &w2, x[0], y[2]);
172 word3_muladd(&w1, &w0, &w2, x[1], y[1]);
173 word3_muladd(&w1, &w0, &w2, x[2], y[0]);
174 z[2] = w2;
175 w2 = 0;
176
177 word3_muladd(&w2, &w1, &w0, x[0], y[3]);
178 word3_muladd(&w2, &w1, &w0, x[1], y[2]);
179 word3_muladd(&w2, &w1, &w0, x[2], y[1]);
180 word3_muladd(&w2, &w1, &w0, x[3], y[0]);
181 z[3] = w0;
182 w0 = 0;
183
184 word3_muladd(&w0, &w2, &w1, x[0], y[4]);
185 word3_muladd(&w0, &w2, &w1, x[1], y[3]);
186 word3_muladd(&w0, &w2, &w1, x[2], y[2]);
187 word3_muladd(&w0, &w2, &w1, x[3], y[1]);
188 word3_muladd(&w0, &w2, &w1, x[4], y[0]);
189 z[4] = w1;
190 w1 = 0;
191
192 word3_muladd(&w1, &w0, &w2, x[0], y[5]);
193 word3_muladd(&w1, &w0, &w2, x[1], y[4]);
194 word3_muladd(&w1, &w0, &w2, x[2], y[3]);
195 word3_muladd(&w1, &w0, &w2, x[3], y[2]);
196 word3_muladd(&w1, &w0, &w2, x[4], y[1]);
197 word3_muladd(&w1, &w0, &w2, x[5], y[0]);
198 z[5] = w2;
199 w2 = 0;
200
201 word3_muladd(&w2, &w1, &w0, x[1], y[5]);
202 word3_muladd(&w2, &w1, &w0, x[2], y[4]);
203 word3_muladd(&w2, &w1, &w0, x[3], y[3]);
204 word3_muladd(&w2, &w1, &w0, x[4], y[2]);
205 word3_muladd(&w2, &w1, &w0, x[5], y[1]);
206 z[6] = w0;
207 w0 = 0;
208
209 word3_muladd(&w0, &w2, &w1, x[2], y[5]);
210 word3_muladd(&w0, &w2, &w1, x[3], y[4]);
211 word3_muladd(&w0, &w2, &w1, x[4], y[3]);
212 word3_muladd(&w0, &w2, &w1, x[5], y[2]);
213 z[7] = w1;
214 w1 = 0;
215
216 word3_muladd(&w1, &w0, &w2, x[3], y[5]);
217 word3_muladd(&w1, &w0, &w2, x[4], y[4]);
218 word3_muladd(&w1, &w0, &w2, x[5], y[3]);
219 z[8] = w2;
220 w2 = 0;
221
222 word3_muladd(&w2, &w1, &w0, x[4], y[5]);
223 word3_muladd(&w2, &w1, &w0, x[5], y[4]);
224 z[9] = w0;
225 w0 = 0;
226
227 word3_muladd(&w0, &w2, &w1, x[5], y[5]);
228 z[10] = w1;
229 z[11] = w2;
230}
231
232/*
233* Comba 8x8 Squaring
234*/
235void bigint_comba_sqr8(word z[16], const word x[8]) {
236 word w2 = 0, w1 = 0, w0 = 0;
237
238 word3_muladd(&w2, &w1, &w0, x[0], x[0]);
239 z[0] = w0;
240 w0 = 0;
241
242 word3_muladd_2(&w0, &w2, &w1, x[0], x[1]);
243 z[1] = w1;
244 w1 = 0;
245
246 word3_muladd_2(&w1, &w0, &w2, x[0], x[2]);
247 word3_muladd(&w1, &w0, &w2, x[1], x[1]);
248 z[2] = w2;
249 w2 = 0;
250
251 word3_muladd_2(&w2, &w1, &w0, x[0], x[3]);
252 word3_muladd_2(&w2, &w1, &w0, x[1], x[2]);
253 z[3] = w0;
254 w0 = 0;
255
256 word3_muladd_2(&w0, &w2, &w1, x[0], x[4]);
257 word3_muladd_2(&w0, &w2, &w1, x[1], x[3]);
258 word3_muladd(&w0, &w2, &w1, x[2], x[2]);
259 z[4] = w1;
260 w1 = 0;
261
262 word3_muladd_2(&w1, &w0, &w2, x[0], x[5]);
263 word3_muladd_2(&w1, &w0, &w2, x[1], x[4]);
264 word3_muladd_2(&w1, &w0, &w2, x[2], x[3]);
265 z[5] = w2;
266 w2 = 0;
267
268 word3_muladd_2(&w2, &w1, &w0, x[0], x[6]);
269 word3_muladd_2(&w2, &w1, &w0, x[1], x[5]);
270 word3_muladd_2(&w2, &w1, &w0, x[2], x[4]);
271 word3_muladd(&w2, &w1, &w0, x[3], x[3]);
272 z[6] = w0;
273 w0 = 0;
274
275 word3_muladd_2(&w0, &w2, &w1, x[0], x[7]);
276 word3_muladd_2(&w0, &w2, &w1, x[1], x[6]);
277 word3_muladd_2(&w0, &w2, &w1, x[2], x[5]);
278 word3_muladd_2(&w0, &w2, &w1, x[3], x[4]);
279 z[7] = w1;
280 w1 = 0;
281
282 word3_muladd_2(&w1, &w0, &w2, x[1], x[7]);
283 word3_muladd_2(&w1, &w0, &w2, x[2], x[6]);
284 word3_muladd_2(&w1, &w0, &w2, x[3], x[5]);
285 word3_muladd(&w1, &w0, &w2, x[4], x[4]);
286 z[8] = w2;
287 w2 = 0;
288
289 word3_muladd_2(&w2, &w1, &w0, x[2], x[7]);
290 word3_muladd_2(&w2, &w1, &w0, x[3], x[6]);
291 word3_muladd_2(&w2, &w1, &w0, x[4], x[5]);
292 z[9] = w0;
293 w0 = 0;
294
295 word3_muladd_2(&w0, &w2, &w1, x[3], x[7]);
296 word3_muladd_2(&w0, &w2, &w1, x[4], x[6]);
297 word3_muladd(&w0, &w2, &w1, x[5], x[5]);
298 z[10] = w1;
299 w1 = 0;
300
301 word3_muladd_2(&w1, &w0, &w2, x[4], x[7]);
302 word3_muladd_2(&w1, &w0, &w2, x[5], x[6]);
303 z[11] = w2;
304 w2 = 0;
305
306 word3_muladd_2(&w2, &w1, &w0, x[5], x[7]);
307 word3_muladd(&w2, &w1, &w0, x[6], x[6]);
308 z[12] = w0;
309 w0 = 0;
310
311 word3_muladd_2(&w0, &w2, &w1, x[6], x[7]);
312 z[13] = w1;
313 w1 = 0;
314
315 word3_muladd(&w1, &w0, &w2, x[7], x[7]);
316 z[14] = w2;
317 z[15] = w0;
318}
319
320/*
321* Comba 8x8 Multiplication
322*/
323void bigint_comba_mul8(word z[16], const word x[8], const word y[8]) {
324 word w2 = 0, w1 = 0, w0 = 0;
325
326 word3_muladd(&w2, &w1, &w0, x[0], y[0]);
327 z[0] = w0;
328 w0 = 0;
329
330 word3_muladd(&w0, &w2, &w1, x[0], y[1]);
331 word3_muladd(&w0, &w2, &w1, x[1], y[0]);
332 z[1] = w1;
333 w1 = 0;
334
335 word3_muladd(&w1, &w0, &w2, x[0], y[2]);
336 word3_muladd(&w1, &w0, &w2, x[1], y[1]);
337 word3_muladd(&w1, &w0, &w2, x[2], y[0]);
338 z[2] = w2;
339 w2 = 0;
340
341 word3_muladd(&w2, &w1, &w0, x[0], y[3]);
342 word3_muladd(&w2, &w1, &w0, x[1], y[2]);
343 word3_muladd(&w2, &w1, &w0, x[2], y[1]);
344 word3_muladd(&w2, &w1, &w0, x[3], y[0]);
345 z[3] = w0;
346 w0 = 0;
347
348 word3_muladd(&w0, &w2, &w1, x[0], y[4]);
349 word3_muladd(&w0, &w2, &w1, x[1], y[3]);
350 word3_muladd(&w0, &w2, &w1, x[2], y[2]);
351 word3_muladd(&w0, &w2, &w1, x[3], y[1]);
352 word3_muladd(&w0, &w2, &w1, x[4], y[0]);
353 z[4] = w1;
354 w1 = 0;
355
356 word3_muladd(&w1, &w0, &w2, x[0], y[5]);
357 word3_muladd(&w1, &w0, &w2, x[1], y[4]);
358 word3_muladd(&w1, &w0, &w2, x[2], y[3]);
359 word3_muladd(&w1, &w0, &w2, x[3], y[2]);
360 word3_muladd(&w1, &w0, &w2, x[4], y[1]);
361 word3_muladd(&w1, &w0, &w2, x[5], y[0]);
362 z[5] = w2;
363 w2 = 0;
364
365 word3_muladd(&w2, &w1, &w0, x[0], y[6]);
366 word3_muladd(&w2, &w1, &w0, x[1], y[5]);
367 word3_muladd(&w2, &w1, &w0, x[2], y[4]);
368 word3_muladd(&w2, &w1, &w0, x[3], y[3]);
369 word3_muladd(&w2, &w1, &w0, x[4], y[2]);
370 word3_muladd(&w2, &w1, &w0, x[5], y[1]);
371 word3_muladd(&w2, &w1, &w0, x[6], y[0]);
372 z[6] = w0;
373 w0 = 0;
374
375 word3_muladd(&w0, &w2, &w1, x[0], y[7]);
376 word3_muladd(&w0, &w2, &w1, x[1], y[6]);
377 word3_muladd(&w0, &w2, &w1, x[2], y[5]);
378 word3_muladd(&w0, &w2, &w1, x[3], y[4]);
379 word3_muladd(&w0, &w2, &w1, x[4], y[3]);
380 word3_muladd(&w0, &w2, &w1, x[5], y[2]);
381 word3_muladd(&w0, &w2, &w1, x[6], y[1]);
382 word3_muladd(&w0, &w2, &w1, x[7], y[0]);
383 z[7] = w1;
384 w1 = 0;
385
386 word3_muladd(&w1, &w0, &w2, x[1], y[7]);
387 word3_muladd(&w1, &w0, &w2, x[2], y[6]);
388 word3_muladd(&w1, &w0, &w2, x[3], y[5]);
389 word3_muladd(&w1, &w0, &w2, x[4], y[4]);
390 word3_muladd(&w1, &w0, &w2, x[5], y[3]);
391 word3_muladd(&w1, &w0, &w2, x[6], y[2]);
392 word3_muladd(&w1, &w0, &w2, x[7], y[1]);
393 z[8] = w2;
394 w2 = 0;
395
396 word3_muladd(&w2, &w1, &w0, x[2], y[7]);
397 word3_muladd(&w2, &w1, &w0, x[3], y[6]);
398 word3_muladd(&w2, &w1, &w0, x[4], y[5]);
399 word3_muladd(&w2, &w1, &w0, x[5], y[4]);
400 word3_muladd(&w2, &w1, &w0, x[6], y[3]);
401 word3_muladd(&w2, &w1, &w0, x[7], y[2]);
402 z[9] = w0;
403 w0 = 0;
404
405 word3_muladd(&w0, &w2, &w1, x[3], y[7]);
406 word3_muladd(&w0, &w2, &w1, x[4], y[6]);
407 word3_muladd(&w0, &w2, &w1, x[5], y[5]);
408 word3_muladd(&w0, &w2, &w1, x[6], y[4]);
409 word3_muladd(&w0, &w2, &w1, x[7], y[3]);
410 z[10] = w1;
411 w1 = 0;
412
413 word3_muladd(&w1, &w0, &w2, x[4], y[7]);
414 word3_muladd(&w1, &w0, &w2, x[5], y[6]);
415 word3_muladd(&w1, &w0, &w2, x[6], y[5]);
416 word3_muladd(&w1, &w0, &w2, x[7], y[4]);
417 z[11] = w2;
418 w2 = 0;
419
420 word3_muladd(&w2, &w1, &w0, x[5], y[7]);
421 word3_muladd(&w2, &w1, &w0, x[6], y[6]);
422 word3_muladd(&w2, &w1, &w0, x[7], y[5]);
423 z[12] = w0;
424 w0 = 0;
425
426 word3_muladd(&w0, &w2, &w1, x[6], y[7]);
427 word3_muladd(&w0, &w2, &w1, x[7], y[6]);
428 z[13] = w1;
429 w1 = 0;
430
431 word3_muladd(&w1, &w0, &w2, x[7], y[7]);
432 z[14] = w2;
433 z[15] = w0;
434}
435
436/*
437* Comba 9x9 Squaring
438*/
439void bigint_comba_sqr9(word z[18], const word x[9]) {
440 word w2 = 0, w1 = 0, w0 = 0;
441
442 word3_muladd(&w2, &w1, &w0, x[0], x[0]);
443 z[0] = w0;
444 w0 = 0;
445
446 word3_muladd_2(&w0, &w2, &w1, x[0], x[1]);
447 z[1] = w1;
448 w1 = 0;
449
450 word3_muladd_2(&w1, &w0, &w2, x[0], x[2]);
451 word3_muladd(&w1, &w0, &w2, x[1], x[1]);
452 z[2] = w2;
453 w2 = 0;
454
455 word3_muladd_2(&w2, &w1, &w0, x[0], x[3]);
456 word3_muladd_2(&w2, &w1, &w0, x[1], x[2]);
457 z[3] = w0;
458 w0 = 0;
459
460 word3_muladd_2(&w0, &w2, &w1, x[0], x[4]);
461 word3_muladd_2(&w0, &w2, &w1, x[1], x[3]);
462 word3_muladd(&w0, &w2, &w1, x[2], x[2]);
463 z[4] = w1;
464 w1 = 0;
465
466 word3_muladd_2(&w1, &w0, &w2, x[0], x[5]);
467 word3_muladd_2(&w1, &w0, &w2, x[1], x[4]);
468 word3_muladd_2(&w1, &w0, &w2, x[2], x[3]);
469 z[5] = w2;
470 w2 = 0;
471
472 word3_muladd_2(&w2, &w1, &w0, x[0], x[6]);
473 word3_muladd_2(&w2, &w1, &w0, x[1], x[5]);
474 word3_muladd_2(&w2, &w1, &w0, x[2], x[4]);
475 word3_muladd(&w2, &w1, &w0, x[3], x[3]);
476 z[6] = w0;
477 w0 = 0;
478
479 word3_muladd_2(&w0, &w2, &w1, x[0], x[7]);
480 word3_muladd_2(&w0, &w2, &w1, x[1], x[6]);
481 word3_muladd_2(&w0, &w2, &w1, x[2], x[5]);
482 word3_muladd_2(&w0, &w2, &w1, x[3], x[4]);
483 z[7] = w1;
484 w1 = 0;
485
486 word3_muladd_2(&w1, &w0, &w2, x[0], x[8]);
487 word3_muladd_2(&w1, &w0, &w2, x[1], x[7]);
488 word3_muladd_2(&w1, &w0, &w2, x[2], x[6]);
489 word3_muladd_2(&w1, &w0, &w2, x[3], x[5]);
490 word3_muladd(&w1, &w0, &w2, x[4], x[4]);
491 z[8] = w2;
492 w2 = 0;
493
494 word3_muladd_2(&w2, &w1, &w0, x[1], x[8]);
495 word3_muladd_2(&w2, &w1, &w0, x[2], x[7]);
496 word3_muladd_2(&w2, &w1, &w0, x[3], x[6]);
497 word3_muladd_2(&w2, &w1, &w0, x[4], x[5]);
498 z[9] = w0;
499 w0 = 0;
500
501 word3_muladd_2(&w0, &w2, &w1, x[2], x[8]);
502 word3_muladd_2(&w0, &w2, &w1, x[3], x[7]);
503 word3_muladd_2(&w0, &w2, &w1, x[4], x[6]);
504 word3_muladd(&w0, &w2, &w1, x[5], x[5]);
505 z[10] = w1;
506 w1 = 0;
507
508 word3_muladd_2(&w1, &w0, &w2, x[3], x[8]);
509 word3_muladd_2(&w1, &w0, &w2, x[4], x[7]);
510 word3_muladd_2(&w1, &w0, &w2, x[5], x[6]);
511 z[11] = w2;
512 w2 = 0;
513
514 word3_muladd_2(&w2, &w1, &w0, x[4], x[8]);
515 word3_muladd_2(&w2, &w1, &w0, x[5], x[7]);
516 word3_muladd(&w2, &w1, &w0, x[6], x[6]);
517 z[12] = w0;
518 w0 = 0;
519
520 word3_muladd_2(&w0, &w2, &w1, x[5], x[8]);
521 word3_muladd_2(&w0, &w2, &w1, x[6], x[7]);
522 z[13] = w1;
523 w1 = 0;
524
525 word3_muladd_2(&w1, &w0, &w2, x[6], x[8]);
526 word3_muladd(&w1, &w0, &w2, x[7], x[7]);
527 z[14] = w2;
528 w2 = 0;
529
530 word3_muladd_2(&w2, &w1, &w0, x[7], x[8]);
531 z[15] = w0;
532 w0 = 0;
533
534 word3_muladd(&w0, &w2, &w1, x[8], x[8]);
535 z[16] = w1;
536 z[17] = w2;
537}
538
539/*
540* Comba 9x9 Multiplication
541*/
542void bigint_comba_mul9(word z[18], const word x[9], const word y[9]) {
543 word w2 = 0, w1 = 0, w0 = 0;
544
545 word3_muladd(&w2, &w1, &w0, x[0], y[0]);
546 z[0] = w0;
547 w0 = 0;
548
549 word3_muladd(&w0, &w2, &w1, x[0], y[1]);
550 word3_muladd(&w0, &w2, &w1, x[1], y[0]);
551 z[1] = w1;
552 w1 = 0;
553
554 word3_muladd(&w1, &w0, &w2, x[0], y[2]);
555 word3_muladd(&w1, &w0, &w2, x[1], y[1]);
556 word3_muladd(&w1, &w0, &w2, x[2], y[0]);
557 z[2] = w2;
558 w2 = 0;
559
560 word3_muladd(&w2, &w1, &w0, x[0], y[3]);
561 word3_muladd(&w2, &w1, &w0, x[1], y[2]);
562 word3_muladd(&w2, &w1, &w0, x[2], y[1]);
563 word3_muladd(&w2, &w1, &w0, x[3], y[0]);
564 z[3] = w0;
565 w0 = 0;
566
567 word3_muladd(&w0, &w2, &w1, x[0], y[4]);
568 word3_muladd(&w0, &w2, &w1, x[1], y[3]);
569 word3_muladd(&w0, &w2, &w1, x[2], y[2]);
570 word3_muladd(&w0, &w2, &w1, x[3], y[1]);
571 word3_muladd(&w0, &w2, &w1, x[4], y[0]);
572 z[4] = w1;
573 w1 = 0;
574
575 word3_muladd(&w1, &w0, &w2, x[0], y[5]);
576 word3_muladd(&w1, &w0, &w2, x[1], y[4]);
577 word3_muladd(&w1, &w0, &w2, x[2], y[3]);
578 word3_muladd(&w1, &w0, &w2, x[3], y[2]);
579 word3_muladd(&w1, &w0, &w2, x[4], y[1]);
580 word3_muladd(&w1, &w0, &w2, x[5], y[0]);
581 z[5] = w2;
582 w2 = 0;
583
584 word3_muladd(&w2, &w1, &w0, x[0], y[6]);
585 word3_muladd(&w2, &w1, &w0, x[1], y[5]);
586 word3_muladd(&w2, &w1, &w0, x[2], y[4]);
587 word3_muladd(&w2, &w1, &w0, x[3], y[3]);
588 word3_muladd(&w2, &w1, &w0, x[4], y[2]);
589 word3_muladd(&w2, &w1, &w0, x[5], y[1]);
590 word3_muladd(&w2, &w1, &w0, x[6], y[0]);
591 z[6] = w0;
592 w0 = 0;
593
594 word3_muladd(&w0, &w2, &w1, x[0], y[7]);
595 word3_muladd(&w0, &w2, &w1, x[1], y[6]);
596 word3_muladd(&w0, &w2, &w1, x[2], y[5]);
597 word3_muladd(&w0, &w2, &w1, x[3], y[4]);
598 word3_muladd(&w0, &w2, &w1, x[4], y[3]);
599 word3_muladd(&w0, &w2, &w1, x[5], y[2]);
600 word3_muladd(&w0, &w2, &w1, x[6], y[1]);
601 word3_muladd(&w0, &w2, &w1, x[7], y[0]);
602 z[7] = w1;
603 w1 = 0;
604
605 word3_muladd(&w1, &w0, &w2, x[0], y[8]);
606 word3_muladd(&w1, &w0, &w2, x[1], y[7]);
607 word3_muladd(&w1, &w0, &w2, x[2], y[6]);
608 word3_muladd(&w1, &w0, &w2, x[3], y[5]);
609 word3_muladd(&w1, &w0, &w2, x[4], y[4]);
610 word3_muladd(&w1, &w0, &w2, x[5], y[3]);
611 word3_muladd(&w1, &w0, &w2, x[6], y[2]);
612 word3_muladd(&w1, &w0, &w2, x[7], y[1]);
613 word3_muladd(&w1, &w0, &w2, x[8], y[0]);
614 z[8] = w2;
615 w2 = 0;
616
617 word3_muladd(&w2, &w1, &w0, x[1], y[8]);
618 word3_muladd(&w2, &w1, &w0, x[2], y[7]);
619 word3_muladd(&w2, &w1, &w0, x[3], y[6]);
620 word3_muladd(&w2, &w1, &w0, x[4], y[5]);
621 word3_muladd(&w2, &w1, &w0, x[5], y[4]);
622 word3_muladd(&w2, &w1, &w0, x[6], y[3]);
623 word3_muladd(&w2, &w1, &w0, x[7], y[2]);
624 word3_muladd(&w2, &w1, &w0, x[8], y[1]);
625 z[9] = w0;
626 w0 = 0;
627
628 word3_muladd(&w0, &w2, &w1, x[2], y[8]);
629 word3_muladd(&w0, &w2, &w1, x[3], y[7]);
630 word3_muladd(&w0, &w2, &w1, x[4], y[6]);
631 word3_muladd(&w0, &w2, &w1, x[5], y[5]);
632 word3_muladd(&w0, &w2, &w1, x[6], y[4]);
633 word3_muladd(&w0, &w2, &w1, x[7], y[3]);
634 word3_muladd(&w0, &w2, &w1, x[8], y[2]);
635 z[10] = w1;
636 w1 = 0;
637
638 word3_muladd(&w1, &w0, &w2, x[3], y[8]);
639 word3_muladd(&w1, &w0, &w2, x[4], y[7]);
640 word3_muladd(&w1, &w0, &w2, x[5], y[6]);
641 word3_muladd(&w1, &w0, &w2, x[6], y[5]);
642 word3_muladd(&w1, &w0, &w2, x[7], y[4]);
643 word3_muladd(&w1, &w0, &w2, x[8], y[3]);
644 z[11] = w2;
645 w2 = 0;
646
647 word3_muladd(&w2, &w1, &w0, x[4], y[8]);
648 word3_muladd(&w2, &w1, &w0, x[5], y[7]);
649 word3_muladd(&w2, &w1, &w0, x[6], y[6]);
650 word3_muladd(&w2, &w1, &w0, x[7], y[5]);
651 word3_muladd(&w2, &w1, &w0, x[8], y[4]);
652 z[12] = w0;
653 w0 = 0;
654
655 word3_muladd(&w0, &w2, &w1, x[5], y[8]);
656 word3_muladd(&w0, &w2, &w1, x[6], y[7]);
657 word3_muladd(&w0, &w2, &w1, x[7], y[6]);
658 word3_muladd(&w0, &w2, &w1, x[8], y[5]);
659 z[13] = w1;
660 w1 = 0;
661
662 word3_muladd(&w1, &w0, &w2, x[6], y[8]);
663 word3_muladd(&w1, &w0, &w2, x[7], y[7]);
664 word3_muladd(&w1, &w0, &w2, x[8], y[6]);
665 z[14] = w2;
666 w2 = 0;
667
668 word3_muladd(&w2, &w1, &w0, x[7], y[8]);
669 word3_muladd(&w2, &w1, &w0, x[8], y[7]);
670 z[15] = w0;
671 w0 = 0;
672
673 word3_muladd(&w0, &w2, &w1, x[8], y[8]);
674 z[16] = w1;
675 z[17] = w2;
676}
677
678/*
679* Comba 16x16 Squaring
680*/
681void bigint_comba_sqr16(word z[32], const word x[16]) {
682 word w2 = 0, w1 = 0, w0 = 0;
683
684 word3_muladd(&w2, &w1, &w0, x[0], x[0]);
685 z[0] = w0;
686 w0 = 0;
687
688 word3_muladd_2(&w0, &w2, &w1, x[0], x[1]);
689 z[1] = w1;
690 w1 = 0;
691
692 word3_muladd_2(&w1, &w0, &w2, x[0], x[2]);
693 word3_muladd(&w1, &w0, &w2, x[1], x[1]);
694 z[2] = w2;
695 w2 = 0;
696
697 word3_muladd_2(&w2, &w1, &w0, x[0], x[3]);
698 word3_muladd_2(&w2, &w1, &w0, x[1], x[2]);
699 z[3] = w0;
700 w0 = 0;
701
702 word3_muladd_2(&w0, &w2, &w1, x[0], x[4]);
703 word3_muladd_2(&w0, &w2, &w1, x[1], x[3]);
704 word3_muladd(&w0, &w2, &w1, x[2], x[2]);
705 z[4] = w1;
706 w1 = 0;
707
708 word3_muladd_2(&w1, &w0, &w2, x[0], x[5]);
709 word3_muladd_2(&w1, &w0, &w2, x[1], x[4]);
710 word3_muladd_2(&w1, &w0, &w2, x[2], x[3]);
711 z[5] = w2;
712 w2 = 0;
713
714 word3_muladd_2(&w2, &w1, &w0, x[0], x[6]);
715 word3_muladd_2(&w2, &w1, &w0, x[1], x[5]);
716 word3_muladd_2(&w2, &w1, &w0, x[2], x[4]);
717 word3_muladd(&w2, &w1, &w0, x[3], x[3]);
718 z[6] = w0;
719 w0 = 0;
720
721 word3_muladd_2(&w0, &w2, &w1, x[0], x[7]);
722 word3_muladd_2(&w0, &w2, &w1, x[1], x[6]);
723 word3_muladd_2(&w0, &w2, &w1, x[2], x[5]);
724 word3_muladd_2(&w0, &w2, &w1, x[3], x[4]);
725 z[7] = w1;
726 w1 = 0;
727
728 word3_muladd_2(&w1, &w0, &w2, x[0], x[8]);
729 word3_muladd_2(&w1, &w0, &w2, x[1], x[7]);
730 word3_muladd_2(&w1, &w0, &w2, x[2], x[6]);
731 word3_muladd_2(&w1, &w0, &w2, x[3], x[5]);
732 word3_muladd(&w1, &w0, &w2, x[4], x[4]);
733 z[8] = w2;
734 w2 = 0;
735
736 word3_muladd_2(&w2, &w1, &w0, x[0], x[9]);
737 word3_muladd_2(&w2, &w1, &w0, x[1], x[8]);
738 word3_muladd_2(&w2, &w1, &w0, x[2], x[7]);
739 word3_muladd_2(&w2, &w1, &w0, x[3], x[6]);
740 word3_muladd_2(&w2, &w1, &w0, x[4], x[5]);
741 z[9] = w0;
742 w0 = 0;
743
744 word3_muladd_2(&w0, &w2, &w1, x[0], x[10]);
745 word3_muladd_2(&w0, &w2, &w1, x[1], x[9]);
746 word3_muladd_2(&w0, &w2, &w1, x[2], x[8]);
747 word3_muladd_2(&w0, &w2, &w1, x[3], x[7]);
748 word3_muladd_2(&w0, &w2, &w1, x[4], x[6]);
749 word3_muladd(&w0, &w2, &w1, x[5], x[5]);
750 z[10] = w1;
751 w1 = 0;
752
753 word3_muladd_2(&w1, &w0, &w2, x[0], x[11]);
754 word3_muladd_2(&w1, &w0, &w2, x[1], x[10]);
755 word3_muladd_2(&w1, &w0, &w2, x[2], x[9]);
756 word3_muladd_2(&w1, &w0, &w2, x[3], x[8]);
757 word3_muladd_2(&w1, &w0, &w2, x[4], x[7]);
758 word3_muladd_2(&w1, &w0, &w2, x[5], x[6]);
759 z[11] = w2;
760 w2 = 0;
761
762 word3_muladd_2(&w2, &w1, &w0, x[0], x[12]);
763 word3_muladd_2(&w2, &w1, &w0, x[1], x[11]);
764 word3_muladd_2(&w2, &w1, &w0, x[2], x[10]);
765 word3_muladd_2(&w2, &w1, &w0, x[3], x[9]);
766 word3_muladd_2(&w2, &w1, &w0, x[4], x[8]);
767 word3_muladd_2(&w2, &w1, &w0, x[5], x[7]);
768 word3_muladd(&w2, &w1, &w0, x[6], x[6]);
769 z[12] = w0;
770 w0 = 0;
771
772 word3_muladd_2(&w0, &w2, &w1, x[0], x[13]);
773 word3_muladd_2(&w0, &w2, &w1, x[1], x[12]);
774 word3_muladd_2(&w0, &w2, &w1, x[2], x[11]);
775 word3_muladd_2(&w0, &w2, &w1, x[3], x[10]);
776 word3_muladd_2(&w0, &w2, &w1, x[4], x[9]);
777 word3_muladd_2(&w0, &w2, &w1, x[5], x[8]);
778 word3_muladd_2(&w0, &w2, &w1, x[6], x[7]);
779 z[13] = w1;
780 w1 = 0;
781
782 word3_muladd_2(&w1, &w0, &w2, x[0], x[14]);
783 word3_muladd_2(&w1, &w0, &w2, x[1], x[13]);
784 word3_muladd_2(&w1, &w0, &w2, x[2], x[12]);
785 word3_muladd_2(&w1, &w0, &w2, x[3], x[11]);
786 word3_muladd_2(&w1, &w0, &w2, x[4], x[10]);
787 word3_muladd_2(&w1, &w0, &w2, x[5], x[9]);
788 word3_muladd_2(&w1, &w0, &w2, x[6], x[8]);
789 word3_muladd(&w1, &w0, &w2, x[7], x[7]);
790 z[14] = w2;
791 w2 = 0;
792
793 word3_muladd_2(&w2, &w1, &w0, x[0], x[15]);
794 word3_muladd_2(&w2, &w1, &w0, x[1], x[14]);
795 word3_muladd_2(&w2, &w1, &w0, x[2], x[13]);
796 word3_muladd_2(&w2, &w1, &w0, x[3], x[12]);
797 word3_muladd_2(&w2, &w1, &w0, x[4], x[11]);
798 word3_muladd_2(&w2, &w1, &w0, x[5], x[10]);
799 word3_muladd_2(&w2, &w1, &w0, x[6], x[9]);
800 word3_muladd_2(&w2, &w1, &w0, x[7], x[8]);
801 z[15] = w0;
802 w0 = 0;
803
804 word3_muladd_2(&w0, &w2, &w1, x[1], x[15]);
805 word3_muladd_2(&w0, &w2, &w1, x[2], x[14]);
806 word3_muladd_2(&w0, &w2, &w1, x[3], x[13]);
807 word3_muladd_2(&w0, &w2, &w1, x[4], x[12]);
808 word3_muladd_2(&w0, &w2, &w1, x[5], x[11]);
809 word3_muladd_2(&w0, &w2, &w1, x[6], x[10]);
810 word3_muladd_2(&w0, &w2, &w1, x[7], x[9]);
811 word3_muladd(&w0, &w2, &w1, x[8], x[8]);
812 z[16] = w1;
813 w1 = 0;
814
815 word3_muladd_2(&w1, &w0, &w2, x[2], x[15]);
816 word3_muladd_2(&w1, &w0, &w2, x[3], x[14]);
817 word3_muladd_2(&w1, &w0, &w2, x[4], x[13]);
818 word3_muladd_2(&w1, &w0, &w2, x[5], x[12]);
819 word3_muladd_2(&w1, &w0, &w2, x[6], x[11]);
820 word3_muladd_2(&w1, &w0, &w2, x[7], x[10]);
821 word3_muladd_2(&w1, &w0, &w2, x[8], x[9]);
822 z[17] = w2;
823 w2 = 0;
824
825 word3_muladd_2(&w2, &w1, &w0, x[3], x[15]);
826 word3_muladd_2(&w2, &w1, &w0, x[4], x[14]);
827 word3_muladd_2(&w2, &w1, &w0, x[5], x[13]);
828 word3_muladd_2(&w2, &w1, &w0, x[6], x[12]);
829 word3_muladd_2(&w2, &w1, &w0, x[7], x[11]);
830 word3_muladd_2(&w2, &w1, &w0, x[8], x[10]);
831 word3_muladd(&w2, &w1, &w0, x[9], x[9]);
832 z[18] = w0;
833 w0 = 0;
834
835 word3_muladd_2(&w0, &w2, &w1, x[4], x[15]);
836 word3_muladd_2(&w0, &w2, &w1, x[5], x[14]);
837 word3_muladd_2(&w0, &w2, &w1, x[6], x[13]);
838 word3_muladd_2(&w0, &w2, &w1, x[7], x[12]);
839 word3_muladd_2(&w0, &w2, &w1, x[8], x[11]);
840 word3_muladd_2(&w0, &w2, &w1, x[9], x[10]);
841 z[19] = w1;
842 w1 = 0;
843
844 word3_muladd_2(&w1, &w0, &w2, x[5], x[15]);
845 word3_muladd_2(&w1, &w0, &w2, x[6], x[14]);
846 word3_muladd_2(&w1, &w0, &w2, x[7], x[13]);
847 word3_muladd_2(&w1, &w0, &w2, x[8], x[12]);
848 word3_muladd_2(&w1, &w0, &w2, x[9], x[11]);
849 word3_muladd(&w1, &w0, &w2, x[10], x[10]);
850 z[20] = w2;
851 w2 = 0;
852
853 word3_muladd_2(&w2, &w1, &w0, x[6], x[15]);
854 word3_muladd_2(&w2, &w1, &w0, x[7], x[14]);
855 word3_muladd_2(&w2, &w1, &w0, x[8], x[13]);
856 word3_muladd_2(&w2, &w1, &w0, x[9], x[12]);
857 word3_muladd_2(&w2, &w1, &w0, x[10], x[11]);
858 z[21] = w0;
859 w0 = 0;
860
861 word3_muladd_2(&w0, &w2, &w1, x[7], x[15]);
862 word3_muladd_2(&w0, &w2, &w1, x[8], x[14]);
863 word3_muladd_2(&w0, &w2, &w1, x[9], x[13]);
864 word3_muladd_2(&w0, &w2, &w1, x[10], x[12]);
865 word3_muladd(&w0, &w2, &w1, x[11], x[11]);
866 z[22] = w1;
867 w1 = 0;
868
869 word3_muladd_2(&w1, &w0, &w2, x[8], x[15]);
870 word3_muladd_2(&w1, &w0, &w2, x[9], x[14]);
871 word3_muladd_2(&w1, &w0, &w2, x[10], x[13]);
872 word3_muladd_2(&w1, &w0, &w2, x[11], x[12]);
873 z[23] = w2;
874 w2 = 0;
875
876 word3_muladd_2(&w2, &w1, &w0, x[9], x[15]);
877 word3_muladd_2(&w2, &w1, &w0, x[10], x[14]);
878 word3_muladd_2(&w2, &w1, &w0, x[11], x[13]);
879 word3_muladd(&w2, &w1, &w0, x[12], x[12]);
880 z[24] = w0;
881 w0 = 0;
882
883 word3_muladd_2(&w0, &w2, &w1, x[10], x[15]);
884 word3_muladd_2(&w0, &w2, &w1, x[11], x[14]);
885 word3_muladd_2(&w0, &w2, &w1, x[12], x[13]);
886 z[25] = w1;
887 w1 = 0;
888
889 word3_muladd_2(&w1, &w0, &w2, x[11], x[15]);
890 word3_muladd_2(&w1, &w0, &w2, x[12], x[14]);
891 word3_muladd(&w1, &w0, &w2, x[13], x[13]);
892 z[26] = w2;
893 w2 = 0;
894
895 word3_muladd_2(&w2, &w1, &w0, x[12], x[15]);
896 word3_muladd_2(&w2, &w1, &w0, x[13], x[14]);
897 z[27] = w0;
898 w0 = 0;
899
900 word3_muladd_2(&w0, &w2, &w1, x[13], x[15]);
901 word3_muladd(&w0, &w2, &w1, x[14], x[14]);
902 z[28] = w1;
903 w1 = 0;
904
905 word3_muladd_2(&w1, &w0, &w2, x[14], x[15]);
906 z[29] = w2;
907 w2 = 0;
908
909 word3_muladd(&w2, &w1, &w0, x[15], x[15]);
910 z[30] = w0;
911 z[31] = w1;
912}
913
914/*
915* Comba 16x16 Multiplication
916*/
917void bigint_comba_mul16(word z[32], const word x[16], const word y[16]) {
918 word w2 = 0, w1 = 0, w0 = 0;
919
920 word3_muladd(&w2, &w1, &w0, x[0], y[0]);
921 z[0] = w0;
922 w0 = 0;
923
924 word3_muladd(&w0, &w2, &w1, x[0], y[1]);
925 word3_muladd(&w0, &w2, &w1, x[1], y[0]);
926 z[1] = w1;
927 w1 = 0;
928
929 word3_muladd(&w1, &w0, &w2, x[0], y[2]);
930 word3_muladd(&w1, &w0, &w2, x[1], y[1]);
931 word3_muladd(&w1, &w0, &w2, x[2], y[0]);
932 z[2] = w2;
933 w2 = 0;
934
935 word3_muladd(&w2, &w1, &w0, x[0], y[3]);
936 word3_muladd(&w2, &w1, &w0, x[1], y[2]);
937 word3_muladd(&w2, &w1, &w0, x[2], y[1]);
938 word3_muladd(&w2, &w1, &w0, x[3], y[0]);
939 z[3] = w0;
940 w0 = 0;
941
942 word3_muladd(&w0, &w2, &w1, x[0], y[4]);
943 word3_muladd(&w0, &w2, &w1, x[1], y[3]);
944 word3_muladd(&w0, &w2, &w1, x[2], y[2]);
945 word3_muladd(&w0, &w2, &w1, x[3], y[1]);
946 word3_muladd(&w0, &w2, &w1, x[4], y[0]);
947 z[4] = w1;
948 w1 = 0;
949
950 word3_muladd(&w1, &w0, &w2, x[0], y[5]);
951 word3_muladd(&w1, &w0, &w2, x[1], y[4]);
952 word3_muladd(&w1, &w0, &w2, x[2], y[3]);
953 word3_muladd(&w1, &w0, &w2, x[3], y[2]);
954 word3_muladd(&w1, &w0, &w2, x[4], y[1]);
955 word3_muladd(&w1, &w0, &w2, x[5], y[0]);
956 z[5] = w2;
957 w2 = 0;
958
959 word3_muladd(&w2, &w1, &w0, x[0], y[6]);
960 word3_muladd(&w2, &w1, &w0, x[1], y[5]);
961 word3_muladd(&w2, &w1, &w0, x[2], y[4]);
962 word3_muladd(&w2, &w1, &w0, x[3], y[3]);
963 word3_muladd(&w2, &w1, &w0, x[4], y[2]);
964 word3_muladd(&w2, &w1, &w0, x[5], y[1]);
965 word3_muladd(&w2, &w1, &w0, x[6], y[0]);
966 z[6] = w0;
967 w0 = 0;
968
969 word3_muladd(&w0, &w2, &w1, x[0], y[7]);
970 word3_muladd(&w0, &w2, &w1, x[1], y[6]);
971 word3_muladd(&w0, &w2, &w1, x[2], y[5]);
972 word3_muladd(&w0, &w2, &w1, x[3], y[4]);
973 word3_muladd(&w0, &w2, &w1, x[4], y[3]);
974 word3_muladd(&w0, &w2, &w1, x[5], y[2]);
975 word3_muladd(&w0, &w2, &w1, x[6], y[1]);
976 word3_muladd(&w0, &w2, &w1, x[7], y[0]);
977 z[7] = w1;
978 w1 = 0;
979
980 word3_muladd(&w1, &w0, &w2, x[0], y[8]);
981 word3_muladd(&w1, &w0, &w2, x[1], y[7]);
982 word3_muladd(&w1, &w0, &w2, x[2], y[6]);
983 word3_muladd(&w1, &w0, &w2, x[3], y[5]);
984 word3_muladd(&w1, &w0, &w2, x[4], y[4]);
985 word3_muladd(&w1, &w0, &w2, x[5], y[3]);
986 word3_muladd(&w1, &w0, &w2, x[6], y[2]);
987 word3_muladd(&w1, &w0, &w2, x[7], y[1]);
988 word3_muladd(&w1, &w0, &w2, x[8], y[0]);
989 z[8] = w2;
990 w2 = 0;
991
992 word3_muladd(&w2, &w1, &w0, x[0], y[9]);
993 word3_muladd(&w2, &w1, &w0, x[1], y[8]);
994 word3_muladd(&w2, &w1, &w0, x[2], y[7]);
995 word3_muladd(&w2, &w1, &w0, x[3], y[6]);
996 word3_muladd(&w2, &w1, &w0, x[4], y[5]);
997 word3_muladd(&w2, &w1, &w0, x[5], y[4]);
998 word3_muladd(&w2, &w1, &w0, x[6], y[3]);
999 word3_muladd(&w2, &w1, &w0, x[7], y[2]);
1000 word3_muladd(&w2, &w1, &w0, x[8], y[1]);
1001 word3_muladd(&w2, &w1, &w0, x[9], y[0]);
1002 z[9] = w0;
1003 w0 = 0;
1004
1005 word3_muladd(&w0, &w2, &w1, x[0], y[10]);
1006 word3_muladd(&w0, &w2, &w1, x[1], y[9]);
1007 word3_muladd(&w0, &w2, &w1, x[2], y[8]);
1008 word3_muladd(&w0, &w2, &w1, x[3], y[7]);
1009 word3_muladd(&w0, &w2, &w1, x[4], y[6]);
1010 word3_muladd(&w0, &w2, &w1, x[5], y[5]);
1011 word3_muladd(&w0, &w2, &w1, x[6], y[4]);
1012 word3_muladd(&w0, &w2, &w1, x[7], y[3]);
1013 word3_muladd(&w0, &w2, &w1, x[8], y[2]);
1014 word3_muladd(&w0, &w2, &w1, x[9], y[1]);
1015 word3_muladd(&w0, &w2, &w1, x[10], y[0]);
1016 z[10] = w1;
1017 w1 = 0;
1018
1019 word3_muladd(&w1, &w0, &w2, x[0], y[11]);
1020 word3_muladd(&w1, &w0, &w2, x[1], y[10]);
1021 word3_muladd(&w1, &w0, &w2, x[2], y[9]);
1022 word3_muladd(&w1, &w0, &w2, x[3], y[8]);
1023 word3_muladd(&w1, &w0, &w2, x[4], y[7]);
1024 word3_muladd(&w1, &w0, &w2, x[5], y[6]);
1025 word3_muladd(&w1, &w0, &w2, x[6], y[5]);
1026 word3_muladd(&w1, &w0, &w2, x[7], y[4]);
1027 word3_muladd(&w1, &w0, &w2, x[8], y[3]);
1028 word3_muladd(&w1, &w0, &w2, x[9], y[2]);
1029 word3_muladd(&w1, &w0, &w2, x[10], y[1]);
1030 word3_muladd(&w1, &w0, &w2, x[11], y[0]);
1031 z[11] = w2;
1032 w2 = 0;
1033
1034 word3_muladd(&w2, &w1, &w0, x[0], y[12]);
1035 word3_muladd(&w2, &w1, &w0, x[1], y[11]);
1036 word3_muladd(&w2, &w1, &w0, x[2], y[10]);
1037 word3_muladd(&w2, &w1, &w0, x[3], y[9]);
1038 word3_muladd(&w2, &w1, &w0, x[4], y[8]);
1039 word3_muladd(&w2, &w1, &w0, x[5], y[7]);
1040 word3_muladd(&w2, &w1, &w0, x[6], y[6]);
1041 word3_muladd(&w2, &w1, &w0, x[7], y[5]);
1042 word3_muladd(&w2, &w1, &w0, x[8], y[4]);
1043 word3_muladd(&w2, &w1, &w0, x[9], y[3]);
1044 word3_muladd(&w2, &w1, &w0, x[10], y[2]);
1045 word3_muladd(&w2, &w1, &w0, x[11], y[1]);
1046 word3_muladd(&w2, &w1, &w0, x[12], y[0]);
1047 z[12] = w0;
1048 w0 = 0;
1049
1050 word3_muladd(&w0, &w2, &w1, x[0], y[13]);
1051 word3_muladd(&w0, &w2, &w1, x[1], y[12]);
1052 word3_muladd(&w0, &w2, &w1, x[2], y[11]);
1053 word3_muladd(&w0, &w2, &w1, x[3], y[10]);
1054 word3_muladd(&w0, &w2, &w1, x[4], y[9]);
1055 word3_muladd(&w0, &w2, &w1, x[5], y[8]);
1056 word3_muladd(&w0, &w2, &w1, x[6], y[7]);
1057 word3_muladd(&w0, &w2, &w1, x[7], y[6]);
1058 word3_muladd(&w0, &w2, &w1, x[8], y[5]);
1059 word3_muladd(&w0, &w2, &w1, x[9], y[4]);
1060 word3_muladd(&w0, &w2, &w1, x[10], y[3]);
1061 word3_muladd(&w0, &w2, &w1, x[11], y[2]);
1062 word3_muladd(&w0, &w2, &w1, x[12], y[1]);
1063 word3_muladd(&w0, &w2, &w1, x[13], y[0]);
1064 z[13] = w1;
1065 w1 = 0;
1066
1067 word3_muladd(&w1, &w0, &w2, x[0], y[14]);
1068 word3_muladd(&w1, &w0, &w2, x[1], y[13]);
1069 word3_muladd(&w1, &w0, &w2, x[2], y[12]);
1070 word3_muladd(&w1, &w0, &w2, x[3], y[11]);
1071 word3_muladd(&w1, &w0, &w2, x[4], y[10]);
1072 word3_muladd(&w1, &w0, &w2, x[5], y[9]);
1073 word3_muladd(&w1, &w0, &w2, x[6], y[8]);
1074 word3_muladd(&w1, &w0, &w2, x[7], y[7]);
1075 word3_muladd(&w1, &w0, &w2, x[8], y[6]);
1076 word3_muladd(&w1, &w0, &w2, x[9], y[5]);
1077 word3_muladd(&w1, &w0, &w2, x[10], y[4]);
1078 word3_muladd(&w1, &w0, &w2, x[11], y[3]);
1079 word3_muladd(&w1, &w0, &w2, x[12], y[2]);
1080 word3_muladd(&w1, &w0, &w2, x[13], y[1]);
1081 word3_muladd(&w1, &w0, &w2, x[14], y[0]);
1082 z[14] = w2;
1083 w2 = 0;
1084
1085 word3_muladd(&w2, &w1, &w0, x[0], y[15]);
1086 word3_muladd(&w2, &w1, &w0, x[1], y[14]);
1087 word3_muladd(&w2, &w1, &w0, x[2], y[13]);
1088 word3_muladd(&w2, &w1, &w0, x[3], y[12]);
1089 word3_muladd(&w2, &w1, &w0, x[4], y[11]);
1090 word3_muladd(&w2, &w1, &w0, x[5], y[10]);
1091 word3_muladd(&w2, &w1, &w0, x[6], y[9]);
1092 word3_muladd(&w2, &w1, &w0, x[7], y[8]);
1093 word3_muladd(&w2, &w1, &w0, x[8], y[7]);
1094 word3_muladd(&w2, &w1, &w0, x[9], y[6]);
1095 word3_muladd(&w2, &w1, &w0, x[10], y[5]);
1096 word3_muladd(&w2, &w1, &w0, x[11], y[4]);
1097 word3_muladd(&w2, &w1, &w0, x[12], y[3]);
1098 word3_muladd(&w2, &w1, &w0, x[13], y[2]);
1099 word3_muladd(&w2, &w1, &w0, x[14], y[1]);
1100 word3_muladd(&w2, &w1, &w0, x[15], y[0]);
1101 z[15] = w0;
1102 w0 = 0;
1103
1104 word3_muladd(&w0, &w2, &w1, x[1], y[15]);
1105 word3_muladd(&w0, &w2, &w1, x[2], y[14]);
1106 word3_muladd(&w0, &w2, &w1, x[3], y[13]);
1107 word3_muladd(&w0, &w2, &w1, x[4], y[12]);
1108 word3_muladd(&w0, &w2, &w1, x[5], y[11]);
1109 word3_muladd(&w0, &w2, &w1, x[6], y[10]);
1110 word3_muladd(&w0, &w2, &w1, x[7], y[9]);
1111 word3_muladd(&w0, &w2, &w1, x[8], y[8]);
1112 word3_muladd(&w0, &w2, &w1, x[9], y[7]);
1113 word3_muladd(&w0, &w2, &w1, x[10], y[6]);
1114 word3_muladd(&w0, &w2, &w1, x[11], y[5]);
1115 word3_muladd(&w0, &w2, &w1, x[12], y[4]);
1116 word3_muladd(&w0, &w2, &w1, x[13], y[3]);
1117 word3_muladd(&w0, &w2, &w1, x[14], y[2]);
1118 word3_muladd(&w0, &w2, &w1, x[15], y[1]);
1119 z[16] = w1;
1120 w1 = 0;
1121
1122 word3_muladd(&w1, &w0, &w2, x[2], y[15]);
1123 word3_muladd(&w1, &w0, &w2, x[3], y[14]);
1124 word3_muladd(&w1, &w0, &w2, x[4], y[13]);
1125 word3_muladd(&w1, &w0, &w2, x[5], y[12]);
1126 word3_muladd(&w1, &w0, &w2, x[6], y[11]);
1127 word3_muladd(&w1, &w0, &w2, x[7], y[10]);
1128 word3_muladd(&w1, &w0, &w2, x[8], y[9]);
1129 word3_muladd(&w1, &w0, &w2, x[9], y[8]);
1130 word3_muladd(&w1, &w0, &w2, x[10], y[7]);
1131 word3_muladd(&w1, &w0, &w2, x[11], y[6]);
1132 word3_muladd(&w1, &w0, &w2, x[12], y[5]);
1133 word3_muladd(&w1, &w0, &w2, x[13], y[4]);
1134 word3_muladd(&w1, &w0, &w2, x[14], y[3]);
1135 word3_muladd(&w1, &w0, &w2, x[15], y[2]);
1136 z[17] = w2;
1137 w2 = 0;
1138
1139 word3_muladd(&w2, &w1, &w0, x[3], y[15]);
1140 word3_muladd(&w2, &w1, &w0, x[4], y[14]);
1141 word3_muladd(&w2, &w1, &w0, x[5], y[13]);
1142 word3_muladd(&w2, &w1, &w0, x[6], y[12]);
1143 word3_muladd(&w2, &w1, &w0, x[7], y[11]);
1144 word3_muladd(&w2, &w1, &w0, x[8], y[10]);
1145 word3_muladd(&w2, &w1, &w0, x[9], y[9]);
1146 word3_muladd(&w2, &w1, &w0, x[10], y[8]);
1147 word3_muladd(&w2, &w1, &w0, x[11], y[7]);
1148 word3_muladd(&w2, &w1, &w0, x[12], y[6]);
1149 word3_muladd(&w2, &w1, &w0, x[13], y[5]);
1150 word3_muladd(&w2, &w1, &w0, x[14], y[4]);
1151 word3_muladd(&w2, &w1, &w0, x[15], y[3]);
1152 z[18] = w0;
1153 w0 = 0;
1154
1155 word3_muladd(&w0, &w2, &w1, x[4], y[15]);
1156 word3_muladd(&w0, &w2, &w1, x[5], y[14]);
1157 word3_muladd(&w0, &w2, &w1, x[6], y[13]);
1158 word3_muladd(&w0, &w2, &w1, x[7], y[12]);
1159 word3_muladd(&w0, &w2, &w1, x[8], y[11]);
1160 word3_muladd(&w0, &w2, &w1, x[9], y[10]);
1161 word3_muladd(&w0, &w2, &w1, x[10], y[9]);
1162 word3_muladd(&w0, &w2, &w1, x[11], y[8]);
1163 word3_muladd(&w0, &w2, &w1, x[12], y[7]);
1164 word3_muladd(&w0, &w2, &w1, x[13], y[6]);
1165 word3_muladd(&w0, &w2, &w1, x[14], y[5]);
1166 word3_muladd(&w0, &w2, &w1, x[15], y[4]);
1167 z[19] = w1;
1168 w1 = 0;
1169
1170 word3_muladd(&w1, &w0, &w2, x[5], y[15]);
1171 word3_muladd(&w1, &w0, &w2, x[6], y[14]);
1172 word3_muladd(&w1, &w0, &w2, x[7], y[13]);
1173 word3_muladd(&w1, &w0, &w2, x[8], y[12]);
1174 word3_muladd(&w1, &w0, &w2, x[9], y[11]);
1175 word3_muladd(&w1, &w0, &w2, x[10], y[10]);
1176 word3_muladd(&w1, &w0, &w2, x[11], y[9]);
1177 word3_muladd(&w1, &w0, &w2, x[12], y[8]);
1178 word3_muladd(&w1, &w0, &w2, x[13], y[7]);
1179 word3_muladd(&w1, &w0, &w2, x[14], y[6]);
1180 word3_muladd(&w1, &w0, &w2, x[15], y[5]);
1181 z[20] = w2;
1182 w2 = 0;
1183
1184 word3_muladd(&w2, &w1, &w0, x[6], y[15]);
1185 word3_muladd(&w2, &w1, &w0, x[7], y[14]);
1186 word3_muladd(&w2, &w1, &w0, x[8], y[13]);
1187 word3_muladd(&w2, &w1, &w0, x[9], y[12]);
1188 word3_muladd(&w2, &w1, &w0, x[10], y[11]);
1189 word3_muladd(&w2, &w1, &w0, x[11], y[10]);
1190 word3_muladd(&w2, &w1, &w0, x[12], y[9]);
1191 word3_muladd(&w2, &w1, &w0, x[13], y[8]);
1192 word3_muladd(&w2, &w1, &w0, x[14], y[7]);
1193 word3_muladd(&w2, &w1, &w0, x[15], y[6]);
1194 z[21] = w0;
1195 w0 = 0;
1196
1197 word3_muladd(&w0, &w2, &w1, x[7], y[15]);
1198 word3_muladd(&w0, &w2, &w1, x[8], y[14]);
1199 word3_muladd(&w0, &w2, &w1, x[9], y[13]);
1200 word3_muladd(&w0, &w2, &w1, x[10], y[12]);
1201 word3_muladd(&w0, &w2, &w1, x[11], y[11]);
1202 word3_muladd(&w0, &w2, &w1, x[12], y[10]);
1203 word3_muladd(&w0, &w2, &w1, x[13], y[9]);
1204 word3_muladd(&w0, &w2, &w1, x[14], y[8]);
1205 word3_muladd(&w0, &w2, &w1, x[15], y[7]);
1206 z[22] = w1;
1207 w1 = 0;
1208
1209 word3_muladd(&w1, &w0, &w2, x[8], y[15]);
1210 word3_muladd(&w1, &w0, &w2, x[9], y[14]);
1211 word3_muladd(&w1, &w0, &w2, x[10], y[13]);
1212 word3_muladd(&w1, &w0, &w2, x[11], y[12]);
1213 word3_muladd(&w1, &w0, &w2, x[12], y[11]);
1214 word3_muladd(&w1, &w0, &w2, x[13], y[10]);
1215 word3_muladd(&w1, &w0, &w2, x[14], y[9]);
1216 word3_muladd(&w1, &w0, &w2, x[15], y[8]);
1217 z[23] = w2;
1218 w2 = 0;
1219
1220 word3_muladd(&w2, &w1, &w0, x[9], y[15]);
1221 word3_muladd(&w2, &w1, &w0, x[10], y[14]);
1222 word3_muladd(&w2, &w1, &w0, x[11], y[13]);
1223 word3_muladd(&w2, &w1, &w0, x[12], y[12]);
1224 word3_muladd(&w2, &w1, &w0, x[13], y[11]);
1225 word3_muladd(&w2, &w1, &w0, x[14], y[10]);
1226 word3_muladd(&w2, &w1, &w0, x[15], y[9]);
1227 z[24] = w0;
1228 w0 = 0;
1229
1230 word3_muladd(&w0, &w2, &w1, x[10], y[15]);
1231 word3_muladd(&w0, &w2, &w1, x[11], y[14]);
1232 word3_muladd(&w0, &w2, &w1, x[12], y[13]);
1233 word3_muladd(&w0, &w2, &w1, x[13], y[12]);
1234 word3_muladd(&w0, &w2, &w1, x[14], y[11]);
1235 word3_muladd(&w0, &w2, &w1, x[15], y[10]);
1236 z[25] = w1;
1237 w1 = 0;
1238
1239 word3_muladd(&w1, &w0, &w2, x[11], y[15]);
1240 word3_muladd(&w1, &w0, &w2, x[12], y[14]);
1241 word3_muladd(&w1, &w0, &w2, x[13], y[13]);
1242 word3_muladd(&w1, &w0, &w2, x[14], y[12]);
1243 word3_muladd(&w1, &w0, &w2, x[15], y[11]);
1244 z[26] = w2;
1245 w2 = 0;
1246
1247 word3_muladd(&w2, &w1, &w0, x[12], y[15]);
1248 word3_muladd(&w2, &w1, &w0, x[13], y[14]);
1249 word3_muladd(&w2, &w1, &w0, x[14], y[13]);
1250 word3_muladd(&w2, &w1, &w0, x[15], y[12]);
1251 z[27] = w0;
1252 w0 = 0;
1253
1254 word3_muladd(&w0, &w2, &w1, x[13], y[15]);
1255 word3_muladd(&w0, &w2, &w1, x[14], y[14]);
1256 word3_muladd(&w0, &w2, &w1, x[15], y[13]);
1257 z[28] = w1;
1258 w1 = 0;
1259
1260 word3_muladd(&w1, &w0, &w2, x[14], y[15]);
1261 word3_muladd(&w1, &w0, &w2, x[15], y[14]);
1262 z[29] = w2;
1263 w2 = 0;
1264
1265 word3_muladd(&w2, &w1, &w0, x[15], y[15]);
1266 z[30] = w0;
1267 z[31] = w1;
1268}
1269
1270/*
1271* Comba 24x24 Squaring
1272*/
1273void bigint_comba_sqr24(word z[48], const word x[24]) {
1274 word w2 = 0, w1 = 0, w0 = 0;
1275
1276 word3_muladd(&w2, &w1, &w0, x[0], x[0]);
1277 z[0] = w0;
1278 w0 = 0;
1279
1280 word3_muladd_2(&w0, &w2, &w1, x[0], x[1]);
1281 z[1] = w1;
1282 w1 = 0;
1283
1284 word3_muladd_2(&w1, &w0, &w2, x[0], x[2]);
1285 word3_muladd(&w1, &w0, &w2, x[1], x[1]);
1286 z[2] = w2;
1287 w2 = 0;
1288
1289 word3_muladd_2(&w2, &w1, &w0, x[0], x[3]);
1290 word3_muladd_2(&w2, &w1, &w0, x[1], x[2]);
1291 z[3] = w0;
1292 w0 = 0;
1293
1294 word3_muladd_2(&w0, &w2, &w1, x[0], x[4]);
1295 word3_muladd_2(&w0, &w2, &w1, x[1], x[3]);
1296 word3_muladd(&w0, &w2, &w1, x[2], x[2]);
1297 z[4] = w1;
1298 w1 = 0;
1299
1300 word3_muladd_2(&w1, &w0, &w2, x[0], x[5]);
1301 word3_muladd_2(&w1, &w0, &w2, x[1], x[4]);
1302 word3_muladd_2(&w1, &w0, &w2, x[2], x[3]);
1303 z[5] = w2;
1304 w2 = 0;
1305
1306 word3_muladd_2(&w2, &w1, &w0, x[0], x[6]);
1307 word3_muladd_2(&w2, &w1, &w0, x[1], x[5]);
1308 word3_muladd_2(&w2, &w1, &w0, x[2], x[4]);
1309 word3_muladd(&w2, &w1, &w0, x[3], x[3]);
1310 z[6] = w0;
1311 w0 = 0;
1312
1313 word3_muladd_2(&w0, &w2, &w1, x[0], x[7]);
1314 word3_muladd_2(&w0, &w2, &w1, x[1], x[6]);
1315 word3_muladd_2(&w0, &w2, &w1, x[2], x[5]);
1316 word3_muladd_2(&w0, &w2, &w1, x[3], x[4]);
1317 z[7] = w1;
1318 w1 = 0;
1319
1320 word3_muladd_2(&w1, &w0, &w2, x[0], x[8]);
1321 word3_muladd_2(&w1, &w0, &w2, x[1], x[7]);
1322 word3_muladd_2(&w1, &w0, &w2, x[2], x[6]);
1323 word3_muladd_2(&w1, &w0, &w2, x[3], x[5]);
1324 word3_muladd(&w1, &w0, &w2, x[4], x[4]);
1325 z[8] = w2;
1326 w2 = 0;
1327
1328 word3_muladd_2(&w2, &w1, &w0, x[0], x[9]);
1329 word3_muladd_2(&w2, &w1, &w0, x[1], x[8]);
1330 word3_muladd_2(&w2, &w1, &w0, x[2], x[7]);
1331 word3_muladd_2(&w2, &w1, &w0, x[3], x[6]);
1332 word3_muladd_2(&w2, &w1, &w0, x[4], x[5]);
1333 z[9] = w0;
1334 w0 = 0;
1335
1336 word3_muladd_2(&w0, &w2, &w1, x[0], x[10]);
1337 word3_muladd_2(&w0, &w2, &w1, x[1], x[9]);
1338 word3_muladd_2(&w0, &w2, &w1, x[2], x[8]);
1339 word3_muladd_2(&w0, &w2, &w1, x[3], x[7]);
1340 word3_muladd_2(&w0, &w2, &w1, x[4], x[6]);
1341 word3_muladd(&w0, &w2, &w1, x[5], x[5]);
1342 z[10] = w1;
1343 w1 = 0;
1344
1345 word3_muladd_2(&w1, &w0, &w2, x[0], x[11]);
1346 word3_muladd_2(&w1, &w0, &w2, x[1], x[10]);
1347 word3_muladd_2(&w1, &w0, &w2, x[2], x[9]);
1348 word3_muladd_2(&w1, &w0, &w2, x[3], x[8]);
1349 word3_muladd_2(&w1, &w0, &w2, x[4], x[7]);
1350 word3_muladd_2(&w1, &w0, &w2, x[5], x[6]);
1351 z[11] = w2;
1352 w2 = 0;
1353
1354 word3_muladd_2(&w2, &w1, &w0, x[0], x[12]);
1355 word3_muladd_2(&w2, &w1, &w0, x[1], x[11]);
1356 word3_muladd_2(&w2, &w1, &w0, x[2], x[10]);
1357 word3_muladd_2(&w2, &w1, &w0, x[3], x[9]);
1358 word3_muladd_2(&w2, &w1, &w0, x[4], x[8]);
1359 word3_muladd_2(&w2, &w1, &w0, x[5], x[7]);
1360 word3_muladd(&w2, &w1, &w0, x[6], x[6]);
1361 z[12] = w0;
1362 w0 = 0;
1363
1364 word3_muladd_2(&w0, &w2, &w1, x[0], x[13]);
1365 word3_muladd_2(&w0, &w2, &w1, x[1], x[12]);
1366 word3_muladd_2(&w0, &w2, &w1, x[2], x[11]);
1367 word3_muladd_2(&w0, &w2, &w1, x[3], x[10]);
1368 word3_muladd_2(&w0, &w2, &w1, x[4], x[9]);
1369 word3_muladd_2(&w0, &w2, &w1, x[5], x[8]);
1370 word3_muladd_2(&w0, &w2, &w1, x[6], x[7]);
1371 z[13] = w1;
1372 w1 = 0;
1373
1374 word3_muladd_2(&w1, &w0, &w2, x[0], x[14]);
1375 word3_muladd_2(&w1, &w0, &w2, x[1], x[13]);
1376 word3_muladd_2(&w1, &w0, &w2, x[2], x[12]);
1377 word3_muladd_2(&w1, &w0, &w2, x[3], x[11]);
1378 word3_muladd_2(&w1, &w0, &w2, x[4], x[10]);
1379 word3_muladd_2(&w1, &w0, &w2, x[5], x[9]);
1380 word3_muladd_2(&w1, &w0, &w2, x[6], x[8]);
1381 word3_muladd(&w1, &w0, &w2, x[7], x[7]);
1382 z[14] = w2;
1383 w2 = 0;
1384
1385 word3_muladd_2(&w2, &w1, &w0, x[0], x[15]);
1386 word3_muladd_2(&w2, &w1, &w0, x[1], x[14]);
1387 word3_muladd_2(&w2, &w1, &w0, x[2], x[13]);
1388 word3_muladd_2(&w2, &w1, &w0, x[3], x[12]);
1389 word3_muladd_2(&w2, &w1, &w0, x[4], x[11]);
1390 word3_muladd_2(&w2, &w1, &w0, x[5], x[10]);
1391 word3_muladd_2(&w2, &w1, &w0, x[6], x[9]);
1392 word3_muladd_2(&w2, &w1, &w0, x[7], x[8]);
1393 z[15] = w0;
1394 w0 = 0;
1395
1396 word3_muladd_2(&w0, &w2, &w1, x[0], x[16]);
1397 word3_muladd_2(&w0, &w2, &w1, x[1], x[15]);
1398 word3_muladd_2(&w0, &w2, &w1, x[2], x[14]);
1399 word3_muladd_2(&w0, &w2, &w1, x[3], x[13]);
1400 word3_muladd_2(&w0, &w2, &w1, x[4], x[12]);
1401 word3_muladd_2(&w0, &w2, &w1, x[5], x[11]);
1402 word3_muladd_2(&w0, &w2, &w1, x[6], x[10]);
1403 word3_muladd_2(&w0, &w2, &w1, x[7], x[9]);
1404 word3_muladd(&w0, &w2, &w1, x[8], x[8]);
1405 z[16] = w1;
1406 w1 = 0;
1407
1408 word3_muladd_2(&w1, &w0, &w2, x[0], x[17]);
1409 word3_muladd_2(&w1, &w0, &w2, x[1], x[16]);
1410 word3_muladd_2(&w1, &w0, &w2, x[2], x[15]);
1411 word3_muladd_2(&w1, &w0, &w2, x[3], x[14]);
1412 word3_muladd_2(&w1, &w0, &w2, x[4], x[13]);
1413 word3_muladd_2(&w1, &w0, &w2, x[5], x[12]);
1414 word3_muladd_2(&w1, &w0, &w2, x[6], x[11]);
1415 word3_muladd_2(&w1, &w0, &w2, x[7], x[10]);
1416 word3_muladd_2(&w1, &w0, &w2, x[8], x[9]);
1417 z[17] = w2;
1418 w2 = 0;
1419
1420 word3_muladd_2(&w2, &w1, &w0, x[0], x[18]);
1421 word3_muladd_2(&w2, &w1, &w0, x[1], x[17]);
1422 word3_muladd_2(&w2, &w1, &w0, x[2], x[16]);
1423 word3_muladd_2(&w2, &w1, &w0, x[3], x[15]);
1424 word3_muladd_2(&w2, &w1, &w0, x[4], x[14]);
1425 word3_muladd_2(&w2, &w1, &w0, x[5], x[13]);
1426 word3_muladd_2(&w2, &w1, &w0, x[6], x[12]);
1427 word3_muladd_2(&w2, &w1, &w0, x[7], x[11]);
1428 word3_muladd_2(&w2, &w1, &w0, x[8], x[10]);
1429 word3_muladd(&w2, &w1, &w0, x[9], x[9]);
1430 z[18] = w0;
1431 w0 = 0;
1432
1433 word3_muladd_2(&w0, &w2, &w1, x[0], x[19]);
1434 word3_muladd_2(&w0, &w2, &w1, x[1], x[18]);
1435 word3_muladd_2(&w0, &w2, &w1, x[2], x[17]);
1436 word3_muladd_2(&w0, &w2, &w1, x[3], x[16]);
1437 word3_muladd_2(&w0, &w2, &w1, x[4], x[15]);
1438 word3_muladd_2(&w0, &w2, &w1, x[5], x[14]);
1439 word3_muladd_2(&w0, &w2, &w1, x[6], x[13]);
1440 word3_muladd_2(&w0, &w2, &w1, x[7], x[12]);
1441 word3_muladd_2(&w0, &w2, &w1, x[8], x[11]);
1442 word3_muladd_2(&w0, &w2, &w1, x[9], x[10]);
1443 z[19] = w1;
1444 w1 = 0;
1445
1446 word3_muladd_2(&w1, &w0, &w2, x[0], x[20]);
1447 word3_muladd_2(&w1, &w0, &w2, x[1], x[19]);
1448 word3_muladd_2(&w1, &w0, &w2, x[2], x[18]);
1449 word3_muladd_2(&w1, &w0, &w2, x[3], x[17]);
1450 word3_muladd_2(&w1, &w0, &w2, x[4], x[16]);
1451 word3_muladd_2(&w1, &w0, &w2, x[5], x[15]);
1452 word3_muladd_2(&w1, &w0, &w2, x[6], x[14]);
1453 word3_muladd_2(&w1, &w0, &w2, x[7], x[13]);
1454 word3_muladd_2(&w1, &w0, &w2, x[8], x[12]);
1455 word3_muladd_2(&w1, &w0, &w2, x[9], x[11]);
1456 word3_muladd(&w1, &w0, &w2, x[10], x[10]);
1457 z[20] = w2;
1458 w2 = 0;
1459
1460 word3_muladd_2(&w2, &w1, &w0, x[0], x[21]);
1461 word3_muladd_2(&w2, &w1, &w0, x[1], x[20]);
1462 word3_muladd_2(&w2, &w1, &w0, x[2], x[19]);
1463 word3_muladd_2(&w2, &w1, &w0, x[3], x[18]);
1464 word3_muladd_2(&w2, &w1, &w0, x[4], x[17]);
1465 word3_muladd_2(&w2, &w1, &w0, x[5], x[16]);
1466 word3_muladd_2(&w2, &w1, &w0, x[6], x[15]);
1467 word3_muladd_2(&w2, &w1, &w0, x[7], x[14]);
1468 word3_muladd_2(&w2, &w1, &w0, x[8], x[13]);
1469 word3_muladd_2(&w2, &w1, &w0, x[9], x[12]);
1470 word3_muladd_2(&w2, &w1, &w0, x[10], x[11]);
1471 z[21] = w0;
1472 w0 = 0;
1473
1474 word3_muladd_2(&w0, &w2, &w1, x[0], x[22]);
1475 word3_muladd_2(&w0, &w2, &w1, x[1], x[21]);
1476 word3_muladd_2(&w0, &w2, &w1, x[2], x[20]);
1477 word3_muladd_2(&w0, &w2, &w1, x[3], x[19]);
1478 word3_muladd_2(&w0, &w2, &w1, x[4], x[18]);
1479 word3_muladd_2(&w0, &w2, &w1, x[5], x[17]);
1480 word3_muladd_2(&w0, &w2, &w1, x[6], x[16]);
1481 word3_muladd_2(&w0, &w2, &w1, x[7], x[15]);
1482 word3_muladd_2(&w0, &w2, &w1, x[8], x[14]);
1483 word3_muladd_2(&w0, &w2, &w1, x[9], x[13]);
1484 word3_muladd_2(&w0, &w2, &w1, x[10], x[12]);
1485 word3_muladd(&w0, &w2, &w1, x[11], x[11]);
1486 z[22] = w1;
1487 w1 = 0;
1488
1489 word3_muladd_2(&w1, &w0, &w2, x[0], x[23]);
1490 word3_muladd_2(&w1, &w0, &w2, x[1], x[22]);
1491 word3_muladd_2(&w1, &w0, &w2, x[2], x[21]);
1492 word3_muladd_2(&w1, &w0, &w2, x[3], x[20]);
1493 word3_muladd_2(&w1, &w0, &w2, x[4], x[19]);
1494 word3_muladd_2(&w1, &w0, &w2, x[5], x[18]);
1495 word3_muladd_2(&w1, &w0, &w2, x[6], x[17]);
1496 word3_muladd_2(&w1, &w0, &w2, x[7], x[16]);
1497 word3_muladd_2(&w1, &w0, &w2, x[8], x[15]);
1498 word3_muladd_2(&w1, &w0, &w2, x[9], x[14]);
1499 word3_muladd_2(&w1, &w0, &w2, x[10], x[13]);
1500 word3_muladd_2(&w1, &w0, &w2, x[11], x[12]);
1501 z[23] = w2;
1502 w2 = 0;
1503
1504 word3_muladd_2(&w2, &w1, &w0, x[1], x[23]);
1505 word3_muladd_2(&w2, &w1, &w0, x[2], x[22]);
1506 word3_muladd_2(&w2, &w1, &w0, x[3], x[21]);
1507 word3_muladd_2(&w2, &w1, &w0, x[4], x[20]);
1508 word3_muladd_2(&w2, &w1, &w0, x[5], x[19]);
1509 word3_muladd_2(&w2, &w1, &w0, x[6], x[18]);
1510 word3_muladd_2(&w2, &w1, &w0, x[7], x[17]);
1511 word3_muladd_2(&w2, &w1, &w0, x[8], x[16]);
1512 word3_muladd_2(&w2, &w1, &w0, x[9], x[15]);
1513 word3_muladd_2(&w2, &w1, &w0, x[10], x[14]);
1514 word3_muladd_2(&w2, &w1, &w0, x[11], x[13]);
1515 word3_muladd(&w2, &w1, &w0, x[12], x[12]);
1516 z[24] = w0;
1517 w0 = 0;
1518
1519 word3_muladd_2(&w0, &w2, &w1, x[2], x[23]);
1520 word3_muladd_2(&w0, &w2, &w1, x[3], x[22]);
1521 word3_muladd_2(&w0, &w2, &w1, x[4], x[21]);
1522 word3_muladd_2(&w0, &w2, &w1, x[5], x[20]);
1523 word3_muladd_2(&w0, &w2, &w1, x[6], x[19]);
1524 word3_muladd_2(&w0, &w2, &w1, x[7], x[18]);
1525 word3_muladd_2(&w0, &w2, &w1, x[8], x[17]);
1526 word3_muladd_2(&w0, &w2, &w1, x[9], x[16]);
1527 word3_muladd_2(&w0, &w2, &w1, x[10], x[15]);
1528 word3_muladd_2(&w0, &w2, &w1, x[11], x[14]);
1529 word3_muladd_2(&w0, &w2, &w1, x[12], x[13]);
1530 z[25] = w1;
1531 w1 = 0;
1532
1533 word3_muladd_2(&w1, &w0, &w2, x[3], x[23]);
1534 word3_muladd_2(&w1, &w0, &w2, x[4], x[22]);
1535 word3_muladd_2(&w1, &w0, &w2, x[5], x[21]);
1536 word3_muladd_2(&w1, &w0, &w2, x[6], x[20]);
1537 word3_muladd_2(&w1, &w0, &w2, x[7], x[19]);
1538 word3_muladd_2(&w1, &w0, &w2, x[8], x[18]);
1539 word3_muladd_2(&w1, &w0, &w2, x[9], x[17]);
1540 word3_muladd_2(&w1, &w0, &w2, x[10], x[16]);
1541 word3_muladd_2(&w1, &w0, &w2, x[11], x[15]);
1542 word3_muladd_2(&w1, &w0, &w2, x[12], x[14]);
1543 word3_muladd(&w1, &w0, &w2, x[13], x[13]);
1544 z[26] = w2;
1545 w2 = 0;
1546
1547 word3_muladd_2(&w2, &w1, &w0, x[4], x[23]);
1548 word3_muladd_2(&w2, &w1, &w0, x[5], x[22]);
1549 word3_muladd_2(&w2, &w1, &w0, x[6], x[21]);
1550 word3_muladd_2(&w2, &w1, &w0, x[7], x[20]);
1551 word3_muladd_2(&w2, &w1, &w0, x[8], x[19]);
1552 word3_muladd_2(&w2, &w1, &w0, x[9], x[18]);
1553 word3_muladd_2(&w2, &w1, &w0, x[10], x[17]);
1554 word3_muladd_2(&w2, &w1, &w0, x[11], x[16]);
1555 word3_muladd_2(&w2, &w1, &w0, x[12], x[15]);
1556 word3_muladd_2(&w2, &w1, &w0, x[13], x[14]);
1557 z[27] = w0;
1558 w0 = 0;
1559
1560 word3_muladd_2(&w0, &w2, &w1, x[5], x[23]);
1561 word3_muladd_2(&w0, &w2, &w1, x[6], x[22]);
1562 word3_muladd_2(&w0, &w2, &w1, x[7], x[21]);
1563 word3_muladd_2(&w0, &w2, &w1, x[8], x[20]);
1564 word3_muladd_2(&w0, &w2, &w1, x[9], x[19]);
1565 word3_muladd_2(&w0, &w2, &w1, x[10], x[18]);
1566 word3_muladd_2(&w0, &w2, &w1, x[11], x[17]);
1567 word3_muladd_2(&w0, &w2, &w1, x[12], x[16]);
1568 word3_muladd_2(&w0, &w2, &w1, x[13], x[15]);
1569 word3_muladd(&w0, &w2, &w1, x[14], x[14]);
1570 z[28] = w1;
1571 w1 = 0;
1572
1573 word3_muladd_2(&w1, &w0, &w2, x[6], x[23]);
1574 word3_muladd_2(&w1, &w0, &w2, x[7], x[22]);
1575 word3_muladd_2(&w1, &w0, &w2, x[8], x[21]);
1576 word3_muladd_2(&w1, &w0, &w2, x[9], x[20]);
1577 word3_muladd_2(&w1, &w0, &w2, x[10], x[19]);
1578 word3_muladd_2(&w1, &w0, &w2, x[11], x[18]);
1579 word3_muladd_2(&w1, &w0, &w2, x[12], x[17]);
1580 word3_muladd_2(&w1, &w0, &w2, x[13], x[16]);
1581 word3_muladd_2(&w1, &w0, &w2, x[14], x[15]);
1582 z[29] = w2;
1583 w2 = 0;
1584
1585 word3_muladd_2(&w2, &w1, &w0, x[7], x[23]);
1586 word3_muladd_2(&w2, &w1, &w0, x[8], x[22]);
1587 word3_muladd_2(&w2, &w1, &w0, x[9], x[21]);
1588 word3_muladd_2(&w2, &w1, &w0, x[10], x[20]);
1589 word3_muladd_2(&w2, &w1, &w0, x[11], x[19]);
1590 word3_muladd_2(&w2, &w1, &w0, x[12], x[18]);
1591 word3_muladd_2(&w2, &w1, &w0, x[13], x[17]);
1592 word3_muladd_2(&w2, &w1, &w0, x[14], x[16]);
1593 word3_muladd(&w2, &w1, &w0, x[15], x[15]);
1594 z[30] = w0;
1595 w0 = 0;
1596
1597 word3_muladd_2(&w0, &w2, &w1, x[8], x[23]);
1598 word3_muladd_2(&w0, &w2, &w1, x[9], x[22]);
1599 word3_muladd_2(&w0, &w2, &w1, x[10], x[21]);
1600 word3_muladd_2(&w0, &w2, &w1, x[11], x[20]);
1601 word3_muladd_2(&w0, &w2, &w1, x[12], x[19]);
1602 word3_muladd_2(&w0, &w2, &w1, x[13], x[18]);
1603 word3_muladd_2(&w0, &w2, &w1, x[14], x[17]);
1604 word3_muladd_2(&w0, &w2, &w1, x[15], x[16]);
1605 z[31] = w1;
1606 w1 = 0;
1607
1608 word3_muladd_2(&w1, &w0, &w2, x[9], x[23]);
1609 word3_muladd_2(&w1, &w0, &w2, x[10], x[22]);
1610 word3_muladd_2(&w1, &w0, &w2, x[11], x[21]);
1611 word3_muladd_2(&w1, &w0, &w2, x[12], x[20]);
1612 word3_muladd_2(&w1, &w0, &w2, x[13], x[19]);
1613 word3_muladd_2(&w1, &w0, &w2, x[14], x[18]);
1614 word3_muladd_2(&w1, &w0, &w2, x[15], x[17]);
1615 word3_muladd(&w1, &w0, &w2, x[16], x[16]);
1616 z[32] = w2;
1617 w2 = 0;
1618
1619 word3_muladd_2(&w2, &w1, &w0, x[10], x[23]);
1620 word3_muladd_2(&w2, &w1, &w0, x[11], x[22]);
1621 word3_muladd_2(&w2, &w1, &w0, x[12], x[21]);
1622 word3_muladd_2(&w2, &w1, &w0, x[13], x[20]);
1623 word3_muladd_2(&w2, &w1, &w0, x[14], x[19]);
1624 word3_muladd_2(&w2, &w1, &w0, x[15], x[18]);
1625 word3_muladd_2(&w2, &w1, &w0, x[16], x[17]);
1626 z[33] = w0;
1627 w0 = 0;
1628
1629 word3_muladd_2(&w0, &w2, &w1, x[11], x[23]);
1630 word3_muladd_2(&w0, &w2, &w1, x[12], x[22]);
1631 word3_muladd_2(&w0, &w2, &w1, x[13], x[21]);
1632 word3_muladd_2(&w0, &w2, &w1, x[14], x[20]);
1633 word3_muladd_2(&w0, &w2, &w1, x[15], x[19]);
1634 word3_muladd_2(&w0, &w2, &w1, x[16], x[18]);
1635 word3_muladd(&w0, &w2, &w1, x[17], x[17]);
1636 z[34] = w1;
1637 w1 = 0;
1638
1639 word3_muladd_2(&w1, &w0, &w2, x[12], x[23]);
1640 word3_muladd_2(&w1, &w0, &w2, x[13], x[22]);
1641 word3_muladd_2(&w1, &w0, &w2, x[14], x[21]);
1642 word3_muladd_2(&w1, &w0, &w2, x[15], x[20]);
1643 word3_muladd_2(&w1, &w0, &w2, x[16], x[19]);
1644 word3_muladd_2(&w1, &w0, &w2, x[17], x[18]);
1645 z[35] = w2;
1646 w2 = 0;
1647
1648 word3_muladd_2(&w2, &w1, &w0, x[13], x[23]);
1649 word3_muladd_2(&w2, &w1, &w0, x[14], x[22]);
1650 word3_muladd_2(&w2, &w1, &w0, x[15], x[21]);
1651 word3_muladd_2(&w2, &w1, &w0, x[16], x[20]);
1652 word3_muladd_2(&w2, &w1, &w0, x[17], x[19]);
1653 word3_muladd(&w2, &w1, &w0, x[18], x[18]);
1654 z[36] = w0;
1655 w0 = 0;
1656
1657 word3_muladd_2(&w0, &w2, &w1, x[14], x[23]);
1658 word3_muladd_2(&w0, &w2, &w1, x[15], x[22]);
1659 word3_muladd_2(&w0, &w2, &w1, x[16], x[21]);
1660 word3_muladd_2(&w0, &w2, &w1, x[17], x[20]);
1661 word3_muladd_2(&w0, &w2, &w1, x[18], x[19]);
1662 z[37] = w1;
1663 w1 = 0;
1664
1665 word3_muladd_2(&w1, &w0, &w2, x[15], x[23]);
1666 word3_muladd_2(&w1, &w0, &w2, x[16], x[22]);
1667 word3_muladd_2(&w1, &w0, &w2, x[17], x[21]);
1668 word3_muladd_2(&w1, &w0, &w2, x[18], x[20]);
1669 word3_muladd(&w1, &w0, &w2, x[19], x[19]);
1670 z[38] = w2;
1671 w2 = 0;
1672
1673 word3_muladd_2(&w2, &w1, &w0, x[16], x[23]);
1674 word3_muladd_2(&w2, &w1, &w0, x[17], x[22]);
1675 word3_muladd_2(&w2, &w1, &w0, x[18], x[21]);
1676 word3_muladd_2(&w2, &w1, &w0, x[19], x[20]);
1677 z[39] = w0;
1678 w0 = 0;
1679
1680 word3_muladd_2(&w0, &w2, &w1, x[17], x[23]);
1681 word3_muladd_2(&w0, &w2, &w1, x[18], x[22]);
1682 word3_muladd_2(&w0, &w2, &w1, x[19], x[21]);
1683 word3_muladd(&w0, &w2, &w1, x[20], x[20]);
1684 z[40] = w1;
1685 w1 = 0;
1686
1687 word3_muladd_2(&w1, &w0, &w2, x[18], x[23]);
1688 word3_muladd_2(&w1, &w0, &w2, x[19], x[22]);
1689 word3_muladd_2(&w1, &w0, &w2, x[20], x[21]);
1690 z[41] = w2;
1691 w2 = 0;
1692
1693 word3_muladd_2(&w2, &w1, &w0, x[19], x[23]);
1694 word3_muladd_2(&w2, &w1, &w0, x[20], x[22]);
1695 word3_muladd(&w2, &w1, &w0, x[21], x[21]);
1696 z[42] = w0;
1697 w0 = 0;
1698
1699 word3_muladd_2(&w0, &w2, &w1, x[20], x[23]);
1700 word3_muladd_2(&w0, &w2, &w1, x[21], x[22]);
1701 z[43] = w1;
1702 w1 = 0;
1703
1704 word3_muladd_2(&w1, &w0, &w2, x[21], x[23]);
1705 word3_muladd(&w1, &w0, &w2, x[22], x[22]);
1706 z[44] = w2;
1707 w2 = 0;
1708
1709 word3_muladd_2(&w2, &w1, &w0, x[22], x[23]);
1710 z[45] = w0;
1711 w0 = 0;
1712
1713 word3_muladd(&w0, &w2, &w1, x[23], x[23]);
1714 z[46] = w1;
1715 z[47] = w2;
1716}
1717
1718/*
1719* Comba 24x24 Multiplication
1720*/
1721void bigint_comba_mul24(word z[48], const word x[24], const word y[24]) {
1722 word w2 = 0, w1 = 0, w0 = 0;
1723
1724 word3_muladd(&w2, &w1, &w0, x[0], y[0]);
1725 z[0] = w0;
1726 w0 = 0;
1727
1728 word3_muladd(&w0, &w2, &w1, x[0], y[1]);
1729 word3_muladd(&w0, &w2, &w1, x[1], y[0]);
1730 z[1] = w1;
1731 w1 = 0;
1732
1733 word3_muladd(&w1, &w0, &w2, x[0], y[2]);
1734 word3_muladd(&w1, &w0, &w2, x[1], y[1]);
1735 word3_muladd(&w1, &w0, &w2, x[2], y[0]);
1736 z[2] = w2;
1737 w2 = 0;
1738
1739 word3_muladd(&w2, &w1, &w0, x[0], y[3]);
1740 word3_muladd(&w2, &w1, &w0, x[1], y[2]);
1741 word3_muladd(&w2, &w1, &w0, x[2], y[1]);
1742 word3_muladd(&w2, &w1, &w0, x[3], y[0]);
1743 z[3] = w0;
1744 w0 = 0;
1745
1746 word3_muladd(&w0, &w2, &w1, x[0], y[4]);
1747 word3_muladd(&w0, &w2, &w1, x[1], y[3]);
1748 word3_muladd(&w0, &w2, &w1, x[2], y[2]);
1749 word3_muladd(&w0, &w2, &w1, x[3], y[1]);
1750 word3_muladd(&w0, &w2, &w1, x[4], y[0]);
1751 z[4] = w1;
1752 w1 = 0;
1753
1754 word3_muladd(&w1, &w0, &w2, x[0], y[5]);
1755 word3_muladd(&w1, &w0, &w2, x[1], y[4]);
1756 word3_muladd(&w1, &w0, &w2, x[2], y[3]);
1757 word3_muladd(&w1, &w0, &w2, x[3], y[2]);
1758 word3_muladd(&w1, &w0, &w2, x[4], y[1]);
1759 word3_muladd(&w1, &w0, &w2, x[5], y[0]);
1760 z[5] = w2;
1761 w2 = 0;
1762
1763 word3_muladd(&w2, &w1, &w0, x[0], y[6]);
1764 word3_muladd(&w2, &w1, &w0, x[1], y[5]);
1765 word3_muladd(&w2, &w1, &w0, x[2], y[4]);
1766 word3_muladd(&w2, &w1, &w0, x[3], y[3]);
1767 word3_muladd(&w2, &w1, &w0, x[4], y[2]);
1768 word3_muladd(&w2, &w1, &w0, x[5], y[1]);
1769 word3_muladd(&w2, &w1, &w0, x[6], y[0]);
1770 z[6] = w0;
1771 w0 = 0;
1772
1773 word3_muladd(&w0, &w2, &w1, x[0], y[7]);
1774 word3_muladd(&w0, &w2, &w1, x[1], y[6]);
1775 word3_muladd(&w0, &w2, &w1, x[2], y[5]);
1776 word3_muladd(&w0, &w2, &w1, x[3], y[4]);
1777 word3_muladd(&w0, &w2, &w1, x[4], y[3]);
1778 word3_muladd(&w0, &w2, &w1, x[5], y[2]);
1779 word3_muladd(&w0, &w2, &w1, x[6], y[1]);
1780 word3_muladd(&w0, &w2, &w1, x[7], y[0]);
1781 z[7] = w1;
1782 w1 = 0;
1783
1784 word3_muladd(&w1, &w0, &w2, x[0], y[8]);
1785 word3_muladd(&w1, &w0, &w2, x[1], y[7]);
1786 word3_muladd(&w1, &w0, &w2, x[2], y[6]);
1787 word3_muladd(&w1, &w0, &w2, x[3], y[5]);
1788 word3_muladd(&w1, &w0, &w2, x[4], y[4]);
1789 word3_muladd(&w1, &w0, &w2, x[5], y[3]);
1790 word3_muladd(&w1, &w0, &w2, x[6], y[2]);
1791 word3_muladd(&w1, &w0, &w2, x[7], y[1]);
1792 word3_muladd(&w1, &w0, &w2, x[8], y[0]);
1793 z[8] = w2;
1794 w2 = 0;
1795
1796 word3_muladd(&w2, &w1, &w0, x[0], y[9]);
1797 word3_muladd(&w2, &w1, &w0, x[1], y[8]);
1798 word3_muladd(&w2, &w1, &w0, x[2], y[7]);
1799 word3_muladd(&w2, &w1, &w0, x[3], y[6]);
1800 word3_muladd(&w2, &w1, &w0, x[4], y[5]);
1801 word3_muladd(&w2, &w1, &w0, x[5], y[4]);
1802 word3_muladd(&w2, &w1, &w0, x[6], y[3]);
1803 word3_muladd(&w2, &w1, &w0, x[7], y[2]);
1804 word3_muladd(&w2, &w1, &w0, x[8], y[1]);
1805 word3_muladd(&w2, &w1, &w0, x[9], y[0]);
1806 z[9] = w0;
1807 w0 = 0;
1808
1809 word3_muladd(&w0, &w2, &w1, x[0], y[10]);
1810 word3_muladd(&w0, &w2, &w1, x[1], y[9]);
1811 word3_muladd(&w0, &w2, &w1, x[2], y[8]);
1812 word3_muladd(&w0, &w2, &w1, x[3], y[7]);
1813 word3_muladd(&w0, &w2, &w1, x[4], y[6]);
1814 word3_muladd(&w0, &w2, &w1, x[5], y[5]);
1815 word3_muladd(&w0, &w2, &w1, x[6], y[4]);
1816 word3_muladd(&w0, &w2, &w1, x[7], y[3]);
1817 word3_muladd(&w0, &w2, &w1, x[8], y[2]);
1818 word3_muladd(&w0, &w2, &w1, x[9], y[1]);
1819 word3_muladd(&w0, &w2, &w1, x[10], y[0]);
1820 z[10] = w1;
1821 w1 = 0;
1822
1823 word3_muladd(&w1, &w0, &w2, x[0], y[11]);
1824 word3_muladd(&w1, &w0, &w2, x[1], y[10]);
1825 word3_muladd(&w1, &w0, &w2, x[2], y[9]);
1826 word3_muladd(&w1, &w0, &w2, x[3], y[8]);
1827 word3_muladd(&w1, &w0, &w2, x[4], y[7]);
1828 word3_muladd(&w1, &w0, &w2, x[5], y[6]);
1829 word3_muladd(&w1, &w0, &w2, x[6], y[5]);
1830 word3_muladd(&w1, &w0, &w2, x[7], y[4]);
1831 word3_muladd(&w1, &w0, &w2, x[8], y[3]);
1832 word3_muladd(&w1, &w0, &w2, x[9], y[2]);
1833 word3_muladd(&w1, &w0, &w2, x[10], y[1]);
1834 word3_muladd(&w1, &w0, &w2, x[11], y[0]);
1835 z[11] = w2;
1836 w2 = 0;
1837
1838 word3_muladd(&w2, &w1, &w0, x[0], y[12]);
1839 word3_muladd(&w2, &w1, &w0, x[1], y[11]);
1840 word3_muladd(&w2, &w1, &w0, x[2], y[10]);
1841 word3_muladd(&w2, &w1, &w0, x[3], y[9]);
1842 word3_muladd(&w2, &w1, &w0, x[4], y[8]);
1843 word3_muladd(&w2, &w1, &w0, x[5], y[7]);
1844 word3_muladd(&w2, &w1, &w0, x[6], y[6]);
1845 word3_muladd(&w2, &w1, &w0, x[7], y[5]);
1846 word3_muladd(&w2, &w1, &w0, x[8], y[4]);
1847 word3_muladd(&w2, &w1, &w0, x[9], y[3]);
1848 word3_muladd(&w2, &w1, &w0, x[10], y[2]);
1849 word3_muladd(&w2, &w1, &w0, x[11], y[1]);
1850 word3_muladd(&w2, &w1, &w0, x[12], y[0]);
1851 z[12] = w0;
1852 w0 = 0;
1853
1854 word3_muladd(&w0, &w2, &w1, x[0], y[13]);
1855 word3_muladd(&w0, &w2, &w1, x[1], y[12]);
1856 word3_muladd(&w0, &w2, &w1, x[2], y[11]);
1857 word3_muladd(&w0, &w2, &w1, x[3], y[10]);
1858 word3_muladd(&w0, &w2, &w1, x[4], y[9]);
1859 word3_muladd(&w0, &w2, &w1, x[5], y[8]);
1860 word3_muladd(&w0, &w2, &w1, x[6], y[7]);
1861 word3_muladd(&w0, &w2, &w1, x[7], y[6]);
1862 word3_muladd(&w0, &w2, &w1, x[8], y[5]);
1863 word3_muladd(&w0, &w2, &w1, x[9], y[4]);
1864 word3_muladd(&w0, &w2, &w1, x[10], y[3]);
1865 word3_muladd(&w0, &w2, &w1, x[11], y[2]);
1866 word3_muladd(&w0, &w2, &w1, x[12], y[1]);
1867 word3_muladd(&w0, &w2, &w1, x[13], y[0]);
1868 z[13] = w1;
1869 w1 = 0;
1870
1871 word3_muladd(&w1, &w0, &w2, x[0], y[14]);
1872 word3_muladd(&w1, &w0, &w2, x[1], y[13]);
1873 word3_muladd(&w1, &w0, &w2, x[2], y[12]);
1874 word3_muladd(&w1, &w0, &w2, x[3], y[11]);
1875 word3_muladd(&w1, &w0, &w2, x[4], y[10]);
1876 word3_muladd(&w1, &w0, &w2, x[5], y[9]);
1877 word3_muladd(&w1, &w0, &w2, x[6], y[8]);
1878 word3_muladd(&w1, &w0, &w2, x[7], y[7]);
1879 word3_muladd(&w1, &w0, &w2, x[8], y[6]);
1880 word3_muladd(&w1, &w0, &w2, x[9], y[5]);
1881 word3_muladd(&w1, &w0, &w2, x[10], y[4]);
1882 word3_muladd(&w1, &w0, &w2, x[11], y[3]);
1883 word3_muladd(&w1, &w0, &w2, x[12], y[2]);
1884 word3_muladd(&w1, &w0, &w2, x[13], y[1]);
1885 word3_muladd(&w1, &w0, &w2, x[14], y[0]);
1886 z[14] = w2;
1887 w2 = 0;
1888
1889 word3_muladd(&w2, &w1, &w0, x[0], y[15]);
1890 word3_muladd(&w2, &w1, &w0, x[1], y[14]);
1891 word3_muladd(&w2, &w1, &w0, x[2], y[13]);
1892 word3_muladd(&w2, &w1, &w0, x[3], y[12]);
1893 word3_muladd(&w2, &w1, &w0, x[4], y[11]);
1894 word3_muladd(&w2, &w1, &w0, x[5], y[10]);
1895 word3_muladd(&w2, &w1, &w0, x[6], y[9]);
1896 word3_muladd(&w2, &w1, &w0, x[7], y[8]);
1897 word3_muladd(&w2, &w1, &w0, x[8], y[7]);
1898 word3_muladd(&w2, &w1, &w0, x[9], y[6]);
1899 word3_muladd(&w2, &w1, &w0, x[10], y[5]);
1900 word3_muladd(&w2, &w1, &w0, x[11], y[4]);
1901 word3_muladd(&w2, &w1, &w0, x[12], y[3]);
1902 word3_muladd(&w2, &w1, &w0, x[13], y[2]);
1903 word3_muladd(&w2, &w1, &w0, x[14], y[1]);
1904 word3_muladd(&w2, &w1, &w0, x[15], y[0]);
1905 z[15] = w0;
1906 w0 = 0;
1907
1908 word3_muladd(&w0, &w2, &w1, x[0], y[16]);
1909 word3_muladd(&w0, &w2, &w1, x[1], y[15]);
1910 word3_muladd(&w0, &w2, &w1, x[2], y[14]);
1911 word3_muladd(&w0, &w2, &w1, x[3], y[13]);
1912 word3_muladd(&w0, &w2, &w1, x[4], y[12]);
1913 word3_muladd(&w0, &w2, &w1, x[5], y[11]);
1914 word3_muladd(&w0, &w2, &w1, x[6], y[10]);
1915 word3_muladd(&w0, &w2, &w1, x[7], y[9]);
1916 word3_muladd(&w0, &w2, &w1, x[8], y[8]);
1917 word3_muladd(&w0, &w2, &w1, x[9], y[7]);
1918 word3_muladd(&w0, &w2, &w1, x[10], y[6]);
1919 word3_muladd(&w0, &w2, &w1, x[11], y[5]);
1920 word3_muladd(&w0, &w2, &w1, x[12], y[4]);
1921 word3_muladd(&w0, &w2, &w1, x[13], y[3]);
1922 word3_muladd(&w0, &w2, &w1, x[14], y[2]);
1923 word3_muladd(&w0, &w2, &w1, x[15], y[1]);
1924 word3_muladd(&w0, &w2, &w1, x[16], y[0]);
1925 z[16] = w1;
1926 w1 = 0;
1927
1928 word3_muladd(&w1, &w0, &w2, x[0], y[17]);
1929 word3_muladd(&w1, &w0, &w2, x[1], y[16]);
1930 word3_muladd(&w1, &w0, &w2, x[2], y[15]);
1931 word3_muladd(&w1, &w0, &w2, x[3], y[14]);
1932 word3_muladd(&w1, &w0, &w2, x[4], y[13]);
1933 word3_muladd(&w1, &w0, &w2, x[5], y[12]);
1934 word3_muladd(&w1, &w0, &w2, x[6], y[11]);
1935 word3_muladd(&w1, &w0, &w2, x[7], y[10]);
1936 word3_muladd(&w1, &w0, &w2, x[8], y[9]);
1937 word3_muladd(&w1, &w0, &w2, x[9], y[8]);
1938 word3_muladd(&w1, &w0, &w2, x[10], y[7]);
1939 word3_muladd(&w1, &w0, &w2, x[11], y[6]);
1940 word3_muladd(&w1, &w0, &w2, x[12], y[5]);
1941 word3_muladd(&w1, &w0, &w2, x[13], y[4]);
1942 word3_muladd(&w1, &w0, &w2, x[14], y[3]);
1943 word3_muladd(&w1, &w0, &w2, x[15], y[2]);
1944 word3_muladd(&w1, &w0, &w2, x[16], y[1]);
1945 word3_muladd(&w1, &w0, &w2, x[17], y[0]);
1946 z[17] = w2;
1947 w2 = 0;
1948
1949 word3_muladd(&w2, &w1, &w0, x[0], y[18]);
1950 word3_muladd(&w2, &w1, &w0, x[1], y[17]);
1951 word3_muladd(&w2, &w1, &w0, x[2], y[16]);
1952 word3_muladd(&w2, &w1, &w0, x[3], y[15]);
1953 word3_muladd(&w2, &w1, &w0, x[4], y[14]);
1954 word3_muladd(&w2, &w1, &w0, x[5], y[13]);
1955 word3_muladd(&w2, &w1, &w0, x[6], y[12]);
1956 word3_muladd(&w2, &w1, &w0, x[7], y[11]);
1957 word3_muladd(&w2, &w1, &w0, x[8], y[10]);
1958 word3_muladd(&w2, &w1, &w0, x[9], y[9]);
1959 word3_muladd(&w2, &w1, &w0, x[10], y[8]);
1960 word3_muladd(&w2, &w1, &w0, x[11], y[7]);
1961 word3_muladd(&w2, &w1, &w0, x[12], y[6]);
1962 word3_muladd(&w2, &w1, &w0, x[13], y[5]);
1963 word3_muladd(&w2, &w1, &w0, x[14], y[4]);
1964 word3_muladd(&w2, &w1, &w0, x[15], y[3]);
1965 word3_muladd(&w2, &w1, &w0, x[16], y[2]);
1966 word3_muladd(&w2, &w1, &w0, x[17], y[1]);
1967 word3_muladd(&w2, &w1, &w0, x[18], y[0]);
1968 z[18] = w0;
1969 w0 = 0;
1970
1971 word3_muladd(&w0, &w2, &w1, x[0], y[19]);
1972 word3_muladd(&w0, &w2, &w1, x[1], y[18]);
1973 word3_muladd(&w0, &w2, &w1, x[2], y[17]);
1974 word3_muladd(&w0, &w2, &w1, x[3], y[16]);
1975 word3_muladd(&w0, &w2, &w1, x[4], y[15]);
1976 word3_muladd(&w0, &w2, &w1, x[5], y[14]);
1977 word3_muladd(&w0, &w2, &w1, x[6], y[13]);
1978 word3_muladd(&w0, &w2, &w1, x[7], y[12]);
1979 word3_muladd(&w0, &w2, &w1, x[8], y[11]);
1980 word3_muladd(&w0, &w2, &w1, x[9], y[10]);
1981 word3_muladd(&w0, &w2, &w1, x[10], y[9]);
1982 word3_muladd(&w0, &w2, &w1, x[11], y[8]);
1983 word3_muladd(&w0, &w2, &w1, x[12], y[7]);
1984 word3_muladd(&w0, &w2, &w1, x[13], y[6]);
1985 word3_muladd(&w0, &w2, &w1, x[14], y[5]);
1986 word3_muladd(&w0, &w2, &w1, x[15], y[4]);
1987 word3_muladd(&w0, &w2, &w1, x[16], y[3]);
1988 word3_muladd(&w0, &w2, &w1, x[17], y[2]);
1989 word3_muladd(&w0, &w2, &w1, x[18], y[1]);
1990 word3_muladd(&w0, &w2, &w1, x[19], y[0]);
1991 z[19] = w1;
1992 w1 = 0;
1993
1994 word3_muladd(&w1, &w0, &w2, x[0], y[20]);
1995 word3_muladd(&w1, &w0, &w2, x[1], y[19]);
1996 word3_muladd(&w1, &w0, &w2, x[2], y[18]);
1997 word3_muladd(&w1, &w0, &w2, x[3], y[17]);
1998 word3_muladd(&w1, &w0, &w2, x[4], y[16]);
1999 word3_muladd(&w1, &w0, &w2, x[5], y[15]);
2000 word3_muladd(&w1, &w0, &w2, x[6], y[14]);
2001 word3_muladd(&w1, &w0, &w2, x[7], y[13]);
2002 word3_muladd(&w1, &w0, &w2, x[8], y[12]);
2003 word3_muladd(&w1, &w0, &w2, x[9], y[11]);
2004 word3_muladd(&w1, &w0, &w2, x[10], y[10]);
2005 word3_muladd(&w1, &w0, &w2, x[11], y[9]);
2006 word3_muladd(&w1, &w0, &w2, x[12], y[8]);
2007 word3_muladd(&w1, &w0, &w2, x[13], y[7]);
2008 word3_muladd(&w1, &w0, &w2, x[14], y[6]);
2009 word3_muladd(&w1, &w0, &w2, x[15], y[5]);
2010 word3_muladd(&w1, &w0, &w2, x[16], y[4]);
2011 word3_muladd(&w1, &w0, &w2, x[17], y[3]);
2012 word3_muladd(&w1, &w0, &w2, x[18], y[2]);
2013 word3_muladd(&w1, &w0, &w2, x[19], y[1]);
2014 word3_muladd(&w1, &w0, &w2, x[20], y[0]);
2015 z[20] = w2;
2016 w2 = 0;
2017
2018 word3_muladd(&w2, &w1, &w0, x[0], y[21]);
2019 word3_muladd(&w2, &w1, &w0, x[1], y[20]);
2020 word3_muladd(&w2, &w1, &w0, x[2], y[19]);
2021 word3_muladd(&w2, &w1, &w0, x[3], y[18]);
2022 word3_muladd(&w2, &w1, &w0, x[4], y[17]);
2023 word3_muladd(&w2, &w1, &w0, x[5], y[16]);
2024 word3_muladd(&w2, &w1, &w0, x[6], y[15]);
2025 word3_muladd(&w2, &w1, &w0, x[7], y[14]);
2026 word3_muladd(&w2, &w1, &w0, x[8], y[13]);
2027 word3_muladd(&w2, &w1, &w0, x[9], y[12]);
2028 word3_muladd(&w2, &w1, &w0, x[10], y[11]);
2029 word3_muladd(&w2, &w1, &w0, x[11], y[10]);
2030 word3_muladd(&w2, &w1, &w0, x[12], y[9]);
2031 word3_muladd(&w2, &w1, &w0, x[13], y[8]);
2032 word3_muladd(&w2, &w1, &w0, x[14], y[7]);
2033 word3_muladd(&w2, &w1, &w0, x[15], y[6]);
2034 word3_muladd(&w2, &w1, &w0, x[16], y[5]);
2035 word3_muladd(&w2, &w1, &w0, x[17], y[4]);
2036 word3_muladd(&w2, &w1, &w0, x[18], y[3]);
2037 word3_muladd(&w2, &w1, &w0, x[19], y[2]);
2038 word3_muladd(&w2, &w1, &w0, x[20], y[1]);
2039 word3_muladd(&w2, &w1, &w0, x[21], y[0]);
2040 z[21] = w0;
2041 w0 = 0;
2042
2043 word3_muladd(&w0, &w2, &w1, x[0], y[22]);
2044 word3_muladd(&w0, &w2, &w1, x[1], y[21]);
2045 word3_muladd(&w0, &w2, &w1, x[2], y[20]);
2046 word3_muladd(&w0, &w2, &w1, x[3], y[19]);
2047 word3_muladd(&w0, &w2, &w1, x[4], y[18]);
2048 word3_muladd(&w0, &w2, &w1, x[5], y[17]);
2049 word3_muladd(&w0, &w2, &w1, x[6], y[16]);
2050 word3_muladd(&w0, &w2, &w1, x[7], y[15]);
2051 word3_muladd(&w0, &w2, &w1, x[8], y[14]);
2052 word3_muladd(&w0, &w2, &w1, x[9], y[13]);
2053 word3_muladd(&w0, &w2, &w1, x[10], y[12]);
2054 word3_muladd(&w0, &w2, &w1, x[11], y[11]);
2055 word3_muladd(&w0, &w2, &w1, x[12], y[10]);
2056 word3_muladd(&w0, &w2, &w1, x[13], y[9]);
2057 word3_muladd(&w0, &w2, &w1, x[14], y[8]);
2058 word3_muladd(&w0, &w2, &w1, x[15], y[7]);
2059 word3_muladd(&w0, &w2, &w1, x[16], y[6]);
2060 word3_muladd(&w0, &w2, &w1, x[17], y[5]);
2061 word3_muladd(&w0, &w2, &w1, x[18], y[4]);
2062 word3_muladd(&w0, &w2, &w1, x[19], y[3]);
2063 word3_muladd(&w0, &w2, &w1, x[20], y[2]);
2064 word3_muladd(&w0, &w2, &w1, x[21], y[1]);
2065 word3_muladd(&w0, &w2, &w1, x[22], y[0]);
2066 z[22] = w1;
2067 w1 = 0;
2068
2069 word3_muladd(&w1, &w0, &w2, x[0], y[23]);
2070 word3_muladd(&w1, &w0, &w2, x[1], y[22]);
2071 word3_muladd(&w1, &w0, &w2, x[2], y[21]);
2072 word3_muladd(&w1, &w0, &w2, x[3], y[20]);
2073 word3_muladd(&w1, &w0, &w2, x[4], y[19]);
2074 word3_muladd(&w1, &w0, &w2, x[5], y[18]);
2075 word3_muladd(&w1, &w0, &w2, x[6], y[17]);
2076 word3_muladd(&w1, &w0, &w2, x[7], y[16]);
2077 word3_muladd(&w1, &w0, &w2, x[8], y[15]);
2078 word3_muladd(&w1, &w0, &w2, x[9], y[14]);
2079 word3_muladd(&w1, &w0, &w2, x[10], y[13]);
2080 word3_muladd(&w1, &w0, &w2, x[11], y[12]);
2081 word3_muladd(&w1, &w0, &w2, x[12], y[11]);
2082 word3_muladd(&w1, &w0, &w2, x[13], y[10]);
2083 word3_muladd(&w1, &w0, &w2, x[14], y[9]);
2084 word3_muladd(&w1, &w0, &w2, x[15], y[8]);
2085 word3_muladd(&w1, &w0, &w2, x[16], y[7]);
2086 word3_muladd(&w1, &w0, &w2, x[17], y[6]);
2087 word3_muladd(&w1, &w0, &w2, x[18], y[5]);
2088 word3_muladd(&w1, &w0, &w2, x[19], y[4]);
2089 word3_muladd(&w1, &w0, &w2, x[20], y[3]);
2090 word3_muladd(&w1, &w0, &w2, x[21], y[2]);
2091 word3_muladd(&w1, &w0, &w2, x[22], y[1]);
2092 word3_muladd(&w1, &w0, &w2, x[23], y[0]);
2093 z[23] = w2;
2094 w2 = 0;
2095
2096 word3_muladd(&w2, &w1, &w0, x[1], y[23]);
2097 word3_muladd(&w2, &w1, &w0, x[2], y[22]);
2098 word3_muladd(&w2, &w1, &w0, x[3], y[21]);
2099 word3_muladd(&w2, &w1, &w0, x[4], y[20]);
2100 word3_muladd(&w2, &w1, &w0, x[5], y[19]);
2101 word3_muladd(&w2, &w1, &w0, x[6], y[18]);
2102 word3_muladd(&w2, &w1, &w0, x[7], y[17]);
2103 word3_muladd(&w2, &w1, &w0, x[8], y[16]);
2104 word3_muladd(&w2, &w1, &w0, x[9], y[15]);
2105 word3_muladd(&w2, &w1, &w0, x[10], y[14]);
2106 word3_muladd(&w2, &w1, &w0, x[11], y[13]);
2107 word3_muladd(&w2, &w1, &w0, x[12], y[12]);
2108 word3_muladd(&w2, &w1, &w0, x[13], y[11]);
2109 word3_muladd(&w2, &w1, &w0, x[14], y[10]);
2110 word3_muladd(&w2, &w1, &w0, x[15], y[9]);
2111 word3_muladd(&w2, &w1, &w0, x[16], y[8]);
2112 word3_muladd(&w2, &w1, &w0, x[17], y[7]);
2113 word3_muladd(&w2, &w1, &w0, x[18], y[6]);
2114 word3_muladd(&w2, &w1, &w0, x[19], y[5]);
2115 word3_muladd(&w2, &w1, &w0, x[20], y[4]);
2116 word3_muladd(&w2, &w1, &w0, x[21], y[3]);
2117 word3_muladd(&w2, &w1, &w0, x[22], y[2]);
2118 word3_muladd(&w2, &w1, &w0, x[23], y[1]);
2119 z[24] = w0;
2120 w0 = 0;
2121
2122 word3_muladd(&w0, &w2, &w1, x[2], y[23]);
2123 word3_muladd(&w0, &w2, &w1, x[3], y[22]);
2124 word3_muladd(&w0, &w2, &w1, x[4], y[21]);
2125 word3_muladd(&w0, &w2, &w1, x[5], y[20]);
2126 word3_muladd(&w0, &w2, &w1, x[6], y[19]);
2127 word3_muladd(&w0, &w2, &w1, x[7], y[18]);
2128 word3_muladd(&w0, &w2, &w1, x[8], y[17]);
2129 word3_muladd(&w0, &w2, &w1, x[9], y[16]);
2130 word3_muladd(&w0, &w2, &w1, x[10], y[15]);
2131 word3_muladd(&w0, &w2, &w1, x[11], y[14]);
2132 word3_muladd(&w0, &w2, &w1, x[12], y[13]);
2133 word3_muladd(&w0, &w2, &w1, x[13], y[12]);
2134 word3_muladd(&w0, &w2, &w1, x[14], y[11]);
2135 word3_muladd(&w0, &w2, &w1, x[15], y[10]);
2136 word3_muladd(&w0, &w2, &w1, x[16], y[9]);
2137 word3_muladd(&w0, &w2, &w1, x[17], y[8]);
2138 word3_muladd(&w0, &w2, &w1, x[18], y[7]);
2139 word3_muladd(&w0, &w2, &w1, x[19], y[6]);
2140 word3_muladd(&w0, &w2, &w1, x[20], y[5]);
2141 word3_muladd(&w0, &w2, &w1, x[21], y[4]);
2142 word3_muladd(&w0, &w2, &w1, x[22], y[3]);
2143 word3_muladd(&w0, &w2, &w1, x[23], y[2]);
2144 z[25] = w1;
2145 w1 = 0;
2146
2147 word3_muladd(&w1, &w0, &w2, x[3], y[23]);
2148 word3_muladd(&w1, &w0, &w2, x[4], y[22]);
2149 word3_muladd(&w1, &w0, &w2, x[5], y[21]);
2150 word3_muladd(&w1, &w0, &w2, x[6], y[20]);
2151 word3_muladd(&w1, &w0, &w2, x[7], y[19]);
2152 word3_muladd(&w1, &w0, &w2, x[8], y[18]);
2153 word3_muladd(&w1, &w0, &w2, x[9], y[17]);
2154 word3_muladd(&w1, &w0, &w2, x[10], y[16]);
2155 word3_muladd(&w1, &w0, &w2, x[11], y[15]);
2156 word3_muladd(&w1, &w0, &w2, x[12], y[14]);
2157 word3_muladd(&w1, &w0, &w2, x[13], y[13]);
2158 word3_muladd(&w1, &w0, &w2, x[14], y[12]);
2159 word3_muladd(&w1, &w0, &w2, x[15], y[11]);
2160 word3_muladd(&w1, &w0, &w2, x[16], y[10]);
2161 word3_muladd(&w1, &w0, &w2, x[17], y[9]);
2162 word3_muladd(&w1, &w0, &w2, x[18], y[8]);
2163 word3_muladd(&w1, &w0, &w2, x[19], y[7]);
2164 word3_muladd(&w1, &w0, &w2, x[20], y[6]);
2165 word3_muladd(&w1, &w0, &w2, x[21], y[5]);
2166 word3_muladd(&w1, &w0, &w2, x[22], y[4]);
2167 word3_muladd(&w1, &w0, &w2, x[23], y[3]);
2168 z[26] = w2;
2169 w2 = 0;
2170
2171 word3_muladd(&w2, &w1, &w0, x[4], y[23]);
2172 word3_muladd(&w2, &w1, &w0, x[5], y[22]);
2173 word3_muladd(&w2, &w1, &w0, x[6], y[21]);
2174 word3_muladd(&w2, &w1, &w0, x[7], y[20]);
2175 word3_muladd(&w2, &w1, &w0, x[8], y[19]);
2176 word3_muladd(&w2, &w1, &w0, x[9], y[18]);
2177 word3_muladd(&w2, &w1, &w0, x[10], y[17]);
2178 word3_muladd(&w2, &w1, &w0, x[11], y[16]);
2179 word3_muladd(&w2, &w1, &w0, x[12], y[15]);
2180 word3_muladd(&w2, &w1, &w0, x[13], y[14]);
2181 word3_muladd(&w2, &w1, &w0, x[14], y[13]);
2182 word3_muladd(&w2, &w1, &w0, x[15], y[12]);
2183 word3_muladd(&w2, &w1, &w0, x[16], y[11]);
2184 word3_muladd(&w2, &w1, &w0, x[17], y[10]);
2185 word3_muladd(&w2, &w1, &w0, x[18], y[9]);
2186 word3_muladd(&w2, &w1, &w0, x[19], y[8]);
2187 word3_muladd(&w2, &w1, &w0, x[20], y[7]);
2188 word3_muladd(&w2, &w1, &w0, x[21], y[6]);
2189 word3_muladd(&w2, &w1, &w0, x[22], y[5]);
2190 word3_muladd(&w2, &w1, &w0, x[23], y[4]);
2191 z[27] = w0;
2192 w0 = 0;
2193
2194 word3_muladd(&w0, &w2, &w1, x[5], y[23]);
2195 word3_muladd(&w0, &w2, &w1, x[6], y[22]);
2196 word3_muladd(&w0, &w2, &w1, x[7], y[21]);
2197 word3_muladd(&w0, &w2, &w1, x[8], y[20]);
2198 word3_muladd(&w0, &w2, &w1, x[9], y[19]);
2199 word3_muladd(&w0, &w2, &w1, x[10], y[18]);
2200 word3_muladd(&w0, &w2, &w1, x[11], y[17]);
2201 word3_muladd(&w0, &w2, &w1, x[12], y[16]);
2202 word3_muladd(&w0, &w2, &w1, x[13], y[15]);
2203 word3_muladd(&w0, &w2, &w1, x[14], y[14]);
2204 word3_muladd(&w0, &w2, &w1, x[15], y[13]);
2205 word3_muladd(&w0, &w2, &w1, x[16], y[12]);
2206 word3_muladd(&w0, &w2, &w1, x[17], y[11]);
2207 word3_muladd(&w0, &w2, &w1, x[18], y[10]);
2208 word3_muladd(&w0, &w2, &w1, x[19], y[9]);
2209 word3_muladd(&w0, &w2, &w1, x[20], y[8]);
2210 word3_muladd(&w0, &w2, &w1, x[21], y[7]);
2211 word3_muladd(&w0, &w2, &w1, x[22], y[6]);
2212 word3_muladd(&w0, &w2, &w1, x[23], y[5]);
2213 z[28] = w1;
2214 w1 = 0;
2215
2216 word3_muladd(&w1, &w0, &w2, x[6], y[23]);
2217 word3_muladd(&w1, &w0, &w2, x[7], y[22]);
2218 word3_muladd(&w1, &w0, &w2, x[8], y[21]);
2219 word3_muladd(&w1, &w0, &w2, x[9], y[20]);
2220 word3_muladd(&w1, &w0, &w2, x[10], y[19]);
2221 word3_muladd(&w1, &w0, &w2, x[11], y[18]);
2222 word3_muladd(&w1, &w0, &w2, x[12], y[17]);
2223 word3_muladd(&w1, &w0, &w2, x[13], y[16]);
2224 word3_muladd(&w1, &w0, &w2, x[14], y[15]);
2225 word3_muladd(&w1, &w0, &w2, x[15], y[14]);
2226 word3_muladd(&w1, &w0, &w2, x[16], y[13]);
2227 word3_muladd(&w1, &w0, &w2, x[17], y[12]);
2228 word3_muladd(&w1, &w0, &w2, x[18], y[11]);
2229 word3_muladd(&w1, &w0, &w2, x[19], y[10]);
2230 word3_muladd(&w1, &w0, &w2, x[20], y[9]);
2231 word3_muladd(&w1, &w0, &w2, x[21], y[8]);
2232 word3_muladd(&w1, &w0, &w2, x[22], y[7]);
2233 word3_muladd(&w1, &w0, &w2, x[23], y[6]);
2234 z[29] = w2;
2235 w2 = 0;
2236
2237 word3_muladd(&w2, &w1, &w0, x[7], y[23]);
2238 word3_muladd(&w2, &w1, &w0, x[8], y[22]);
2239 word3_muladd(&w2, &w1, &w0, x[9], y[21]);
2240 word3_muladd(&w2, &w1, &w0, x[10], y[20]);
2241 word3_muladd(&w2, &w1, &w0, x[11], y[19]);
2242 word3_muladd(&w2, &w1, &w0, x[12], y[18]);
2243 word3_muladd(&w2, &w1, &w0, x[13], y[17]);
2244 word3_muladd(&w2, &w1, &w0, x[14], y[16]);
2245 word3_muladd(&w2, &w1, &w0, x[15], y[15]);
2246 word3_muladd(&w2, &w1, &w0, x[16], y[14]);
2247 word3_muladd(&w2, &w1, &w0, x[17], y[13]);
2248 word3_muladd(&w2, &w1, &w0, x[18], y[12]);
2249 word3_muladd(&w2, &w1, &w0, x[19], y[11]);
2250 word3_muladd(&w2, &w1, &w0, x[20], y[10]);
2251 word3_muladd(&w2, &w1, &w0, x[21], y[9]);
2252 word3_muladd(&w2, &w1, &w0, x[22], y[8]);
2253 word3_muladd(&w2, &w1, &w0, x[23], y[7]);
2254 z[30] = w0;
2255 w0 = 0;
2256
2257 word3_muladd(&w0, &w2, &w1, x[8], y[23]);
2258 word3_muladd(&w0, &w2, &w1, x[9], y[22]);
2259 word3_muladd(&w0, &w2, &w1, x[10], y[21]);
2260 word3_muladd(&w0, &w2, &w1, x[11], y[20]);
2261 word3_muladd(&w0, &w2, &w1, x[12], y[19]);
2262 word3_muladd(&w0, &w2, &w1, x[13], y[18]);
2263 word3_muladd(&w0, &w2, &w1, x[14], y[17]);
2264 word3_muladd(&w0, &w2, &w1, x[15], y[16]);
2265 word3_muladd(&w0, &w2, &w1, x[16], y[15]);
2266 word3_muladd(&w0, &w2, &w1, x[17], y[14]);
2267 word3_muladd(&w0, &w2, &w1, x[18], y[13]);
2268 word3_muladd(&w0, &w2, &w1, x[19], y[12]);
2269 word3_muladd(&w0, &w2, &w1, x[20], y[11]);
2270 word3_muladd(&w0, &w2, &w1, x[21], y[10]);
2271 word3_muladd(&w0, &w2, &w1, x[22], y[9]);
2272 word3_muladd(&w0, &w2, &w1, x[23], y[8]);
2273 z[31] = w1;
2274 w1 = 0;
2275
2276 word3_muladd(&w1, &w0, &w2, x[9], y[23]);
2277 word3_muladd(&w1, &w0, &w2, x[10], y[22]);
2278 word3_muladd(&w1, &w0, &w2, x[11], y[21]);
2279 word3_muladd(&w1, &w0, &w2, x[12], y[20]);
2280 word3_muladd(&w1, &w0, &w2, x[13], y[19]);
2281 word3_muladd(&w1, &w0, &w2, x[14], y[18]);
2282 word3_muladd(&w1, &w0, &w2, x[15], y[17]);
2283 word3_muladd(&w1, &w0, &w2, x[16], y[16]);
2284 word3_muladd(&w1, &w0, &w2, x[17], y[15]);
2285 word3_muladd(&w1, &w0, &w2, x[18], y[14]);
2286 word3_muladd(&w1, &w0, &w2, x[19], y[13]);
2287 word3_muladd(&w1, &w0, &w2, x[20], y[12]);
2288 word3_muladd(&w1, &w0, &w2, x[21], y[11]);
2289 word3_muladd(&w1, &w0, &w2, x[22], y[10]);
2290 word3_muladd(&w1, &w0, &w2, x[23], y[9]);
2291 z[32] = w2;
2292 w2 = 0;
2293
2294 word3_muladd(&w2, &w1, &w0, x[10], y[23]);
2295 word3_muladd(&w2, &w1, &w0, x[11], y[22]);
2296 word3_muladd(&w2, &w1, &w0, x[12], y[21]);
2297 word3_muladd(&w2, &w1, &w0, x[13], y[20]);
2298 word3_muladd(&w2, &w1, &w0, x[14], y[19]);
2299 word3_muladd(&w2, &w1, &w0, x[15], y[18]);
2300 word3_muladd(&w2, &w1, &w0, x[16], y[17]);
2301 word3_muladd(&w2, &w1, &w0, x[17], y[16]);
2302 word3_muladd(&w2, &w1, &w0, x[18], y[15]);
2303 word3_muladd(&w2, &w1, &w0, x[19], y[14]);
2304 word3_muladd(&w2, &w1, &w0, x[20], y[13]);
2305 word3_muladd(&w2, &w1, &w0, x[21], y[12]);
2306 word3_muladd(&w2, &w1, &w0, x[22], y[11]);
2307 word3_muladd(&w2, &w1, &w0, x[23], y[10]);
2308 z[33] = w0;
2309 w0 = 0;
2310
2311 word3_muladd(&w0, &w2, &w1, x[11], y[23]);
2312 word3_muladd(&w0, &w2, &w1, x[12], y[22]);
2313 word3_muladd(&w0, &w2, &w1, x[13], y[21]);
2314 word3_muladd(&w0, &w2, &w1, x[14], y[20]);
2315 word3_muladd(&w0, &w2, &w1, x[15], y[19]);
2316 word3_muladd(&w0, &w2, &w1, x[16], y[18]);
2317 word3_muladd(&w0, &w2, &w1, x[17], y[17]);
2318 word3_muladd(&w0, &w2, &w1, x[18], y[16]);
2319 word3_muladd(&w0, &w2, &w1, x[19], y[15]);
2320 word3_muladd(&w0, &w2, &w1, x[20], y[14]);
2321 word3_muladd(&w0, &w2, &w1, x[21], y[13]);
2322 word3_muladd(&w0, &w2, &w1, x[22], y[12]);
2323 word3_muladd(&w0, &w2, &w1, x[23], y[11]);
2324 z[34] = w1;
2325 w1 = 0;
2326
2327 word3_muladd(&w1, &w0, &w2, x[12], y[23]);
2328 word3_muladd(&w1, &w0, &w2, x[13], y[22]);
2329 word3_muladd(&w1, &w0, &w2, x[14], y[21]);
2330 word3_muladd(&w1, &w0, &w2, x[15], y[20]);
2331 word3_muladd(&w1, &w0, &w2, x[16], y[19]);
2332 word3_muladd(&w1, &w0, &w2, x[17], y[18]);
2333 word3_muladd(&w1, &w0, &w2, x[18], y[17]);
2334 word3_muladd(&w1, &w0, &w2, x[19], y[16]);
2335 word3_muladd(&w1, &w0, &w2, x[20], y[15]);
2336 word3_muladd(&w1, &w0, &w2, x[21], y[14]);
2337 word3_muladd(&w1, &w0, &w2, x[22], y[13]);
2338 word3_muladd(&w1, &w0, &w2, x[23], y[12]);
2339 z[35] = w2;
2340 w2 = 0;
2341
2342 word3_muladd(&w2, &w1, &w0, x[13], y[23]);
2343 word3_muladd(&w2, &w1, &w0, x[14], y[22]);
2344 word3_muladd(&w2, &w1, &w0, x[15], y[21]);
2345 word3_muladd(&w2, &w1, &w0, x[16], y[20]);
2346 word3_muladd(&w2, &w1, &w0, x[17], y[19]);
2347 word3_muladd(&w2, &w1, &w0, x[18], y[18]);
2348 word3_muladd(&w2, &w1, &w0, x[19], y[17]);
2349 word3_muladd(&w2, &w1, &w0, x[20], y[16]);
2350 word3_muladd(&w2, &w1, &w0, x[21], y[15]);
2351 word3_muladd(&w2, &w1, &w0, x[22], y[14]);
2352 word3_muladd(&w2, &w1, &w0, x[23], y[13]);
2353 z[36] = w0;
2354 w0 = 0;
2355
2356 word3_muladd(&w0, &w2, &w1, x[14], y[23]);
2357 word3_muladd(&w0, &w2, &w1, x[15], y[22]);
2358 word3_muladd(&w0, &w2, &w1, x[16], y[21]);
2359 word3_muladd(&w0, &w2, &w1, x[17], y[20]);
2360 word3_muladd(&w0, &w2, &w1, x[18], y[19]);
2361 word3_muladd(&w0, &w2, &w1, x[19], y[18]);
2362 word3_muladd(&w0, &w2, &w1, x[20], y[17]);
2363 word3_muladd(&w0, &w2, &w1, x[21], y[16]);
2364 word3_muladd(&w0, &w2, &w1, x[22], y[15]);
2365 word3_muladd(&w0, &w2, &w1, x[23], y[14]);
2366 z[37] = w1;
2367 w1 = 0;
2368
2369 word3_muladd(&w1, &w0, &w2, x[15], y[23]);
2370 word3_muladd(&w1, &w0, &w2, x[16], y[22]);
2371 word3_muladd(&w1, &w0, &w2, x[17], y[21]);
2372 word3_muladd(&w1, &w0, &w2, x[18], y[20]);
2373 word3_muladd(&w1, &w0, &w2, x[19], y[19]);
2374 word3_muladd(&w1, &w0, &w2, x[20], y[18]);
2375 word3_muladd(&w1, &w0, &w2, x[21], y[17]);
2376 word3_muladd(&w1, &w0, &w2, x[22], y[16]);
2377 word3_muladd(&w1, &w0, &w2, x[23], y[15]);
2378 z[38] = w2;
2379 w2 = 0;
2380
2381 word3_muladd(&w2, &w1, &w0, x[16], y[23]);
2382 word3_muladd(&w2, &w1, &w0, x[17], y[22]);
2383 word3_muladd(&w2, &w1, &w0, x[18], y[21]);
2384 word3_muladd(&w2, &w1, &w0, x[19], y[20]);
2385 word3_muladd(&w2, &w1, &w0, x[20], y[19]);
2386 word3_muladd(&w2, &w1, &w0, x[21], y[18]);
2387 word3_muladd(&w2, &w1, &w0, x[22], y[17]);
2388 word3_muladd(&w2, &w1, &w0, x[23], y[16]);
2389 z[39] = w0;
2390 w0 = 0;
2391
2392 word3_muladd(&w0, &w2, &w1, x[17], y[23]);
2393 word3_muladd(&w0, &w2, &w1, x[18], y[22]);
2394 word3_muladd(&w0, &w2, &w1, x[19], y[21]);
2395 word3_muladd(&w0, &w2, &w1, x[20], y[20]);
2396 word3_muladd(&w0, &w2, &w1, x[21], y[19]);
2397 word3_muladd(&w0, &w2, &w1, x[22], y[18]);
2398 word3_muladd(&w0, &w2, &w1, x[23], y[17]);
2399 z[40] = w1;
2400 w1 = 0;
2401
2402 word3_muladd(&w1, &w0, &w2, x[18], y[23]);
2403 word3_muladd(&w1, &w0, &w2, x[19], y[22]);
2404 word3_muladd(&w1, &w0, &w2, x[20], y[21]);
2405 word3_muladd(&w1, &w0, &w2, x[21], y[20]);
2406 word3_muladd(&w1, &w0, &w2, x[22], y[19]);
2407 word3_muladd(&w1, &w0, &w2, x[23], y[18]);
2408 z[41] = w2;
2409 w2 = 0;
2410
2411 word3_muladd(&w2, &w1, &w0, x[19], y[23]);
2412 word3_muladd(&w2, &w1, &w0, x[20], y[22]);
2413 word3_muladd(&w2, &w1, &w0, x[21], y[21]);
2414 word3_muladd(&w2, &w1, &w0, x[22], y[20]);
2415 word3_muladd(&w2, &w1, &w0, x[23], y[19]);
2416 z[42] = w0;
2417 w0 = 0;
2418
2419 word3_muladd(&w0, &w2, &w1, x[20], y[23]);
2420 word3_muladd(&w0, &w2, &w1, x[21], y[22]);
2421 word3_muladd(&w0, &w2, &w1, x[22], y[21]);
2422 word3_muladd(&w0, &w2, &w1, x[23], y[20]);
2423 z[43] = w1;
2424 w1 = 0;
2425
2426 word3_muladd(&w1, &w0, &w2, x[21], y[23]);
2427 word3_muladd(&w1, &w0, &w2, x[22], y[22]);
2428 word3_muladd(&w1, &w0, &w2, x[23], y[21]);
2429 z[44] = w2;
2430 w2 = 0;
2431
2432 word3_muladd(&w2, &w1, &w0, x[22], y[23]);
2433 word3_muladd(&w2, &w1, &w0, x[23], y[22]);
2434 z[45] = w0;
2435 w0 = 0;
2436
2437 word3_muladd(&w0, &w2, &w1, x[23], y[23]);
2438 z[46] = w1;
2439 z[47] = w2;
2440}
2441
2442} // namespace Botan
void bigint_comba_sqr4(word z[8], const word x[4])
Definition mp_comba.cpp:16
void bigint_comba_sqr6(word z[12], const word x[6])
Definition mp_comba.cpp:98
void bigint_comba_mul4(word z[8], const word x[4], const word y[4])
Definition mp_comba.cpp:54
void bigint_comba_mul16(word z[32], const word x[16], const word y[16])
Definition mp_comba.cpp:917
void bigint_comba_mul6(word z[12], const word x[6], const word y[6])
Definition mp_comba.cpp:159
constexpr void word3_muladd_2(W *w2, W *w1, W *w0, W x, W y)
Definition mp_asmi.h:690
void bigint_comba_mul9(word z[18], const word x[9], const word y[9])
Definition mp_comba.cpp:542
constexpr void word3_muladd(W *w2, W *w1, W *w0, W x, W y)
Definition mp_asmi.h:601
void bigint_comba_mul24(word z[48], const word x[24], const word y[24])
void bigint_comba_sqr8(word z[16], const word x[8])
Definition mp_comba.cpp:235
void bigint_comba_sqr16(word z[32], const word x[16])
Definition mp_comba.cpp:681
void bigint_comba_sqr9(word z[18], const word x[9])
Definition mp_comba.cpp:439
void bigint_comba_sqr24(word z[48], const word x[24])
void bigint_comba_mul8(word z[16], const word x[8], const word y[8])
Definition mp_comba.cpp:323