Botan 1.10.17
mp_comba.cpp
Go to the documentation of this file.
1/*
2* Comba Multiplication and Squaring
3* (C) 1999-2007,2011 Jack Lloyd
4*
5* Distributed under the terms of the Botan license
6*/
7
8#include <botan/internal/mp_core.h>
9#include <botan/internal/mp_asmi.h>
10
11namespace Botan {
12
13extern "C" {
14
15/*
16* Comba 4x4 Squaring
17*/
18void bigint_comba_sqr4(word z[8], const word x[4])
19 {
20 word w2 = 0, w1 = 0, w0 = 0;
21
22 word3_muladd(&w2, &w1, &w0, x[ 0], x[ 0]);
23 z[ 0] = w0; w0 = 0;
24
25 word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
26 z[ 1] = w1; w1 = 0;
27
28 word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]);
29 word3_muladd(&w1, &w0, &w2, x[ 1], x[ 1]);
30 z[ 2] = w2; 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; w0 = 0;
35
36 word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
37 word3_muladd(&w0, &w2, &w1, x[ 2], x[ 2]);
38 z[ 4] = w1; w1 = 0;
39
40 word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
41 z[ 5] = w2; w2 = 0;
42
43 word3_muladd(&w2, &w1, &w0, x[ 3], x[ 3]);
44 z[ 6] = w0;
45 z[ 7] = w1;
46 }
47
48/*
49* Comba 4x4 Multiplication
50*/
51void bigint_comba_mul4(word z[8], const word x[4], const word y[4])
52 {
53 word w2 = 0, w1 = 0, w0 = 0;
54
55 word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
56 z[ 0] = w0; w0 = 0;
57
58 word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
59 word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
60 z[ 1] = w1; w1 = 0;
61
62 word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
63 word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
64 word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
65 z[ 2] = w2; w2 = 0;
66
67 word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
68 word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
69 word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
70 word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
71 z[ 3] = w0; w0 = 0;
72
73 word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
74 word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
75 word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
76 z[ 4] = w1; w1 = 0;
77
78 word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
79 word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
80 z[ 5] = w2; w2 = 0;
81
82 word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
83 z[ 6] = w0;
84 z[ 7] = w1;
85 }
86
87/*
88* Comba 6x6 Squaring
89*/
90void bigint_comba_sqr6(word z[12], const word x[6])
91 {
92 word w2 = 0, w1 = 0, w0 = 0;
93
94 word3_muladd(&w2, &w1, &w0, x[ 0], x[ 0]);
95 z[ 0] = w0; w0 = 0;
96
97 word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
98 z[ 1] = w1; w1 = 0;
99
100 word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]);
101 word3_muladd(&w1, &w0, &w2, x[ 1], x[ 1]);
102 z[ 2] = w2; w2 = 0;
103
104 word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]);
105 word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]);
106 z[ 3] = w0; w0 = 0;
107
108 word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]);
109 word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
110 word3_muladd(&w0, &w2, &w1, x[ 2], x[ 2]);
111 z[ 4] = w1; w1 = 0;
112
113 word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]);
114 word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]);
115 word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
116 z[ 5] = w2; w2 = 0;
117
118 word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]);
119 word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]);
120 word3_muladd(&w2, &w1, &w0, x[ 3], x[ 3]);
121 z[ 6] = w0; w0 = 0;
122
123 word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]);
124 word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]);
125 z[ 7] = w1; w1 = 0;
126
127 word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]);
128 word3_muladd(&w1, &w0, &w2, x[ 4], x[ 4]);
129 z[ 8] = w2; w2 = 0;
130
131 word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]);
132 z[ 9] = w0; w0 = 0;
133
134 word3_muladd(&w0, &w2, &w1, x[ 5], x[ 5]);
135 z[10] = w1;
136 z[11] = w2;
137 }
138
139/*
140* Comba 6x6 Multiplication
141*/
142void bigint_comba_mul6(word z[12], const word x[6], const word y[6])
143 {
144 word w2 = 0, w1 = 0, w0 = 0;
145
146 word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
147 z[ 0] = w0; w0 = 0;
148
149 word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
150 word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
151 z[ 1] = w1; w1 = 0;
152
153 word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
154 word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
155 word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
156 z[ 2] = w2; w2 = 0;
157
158 word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
159 word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
160 word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
161 word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
162 z[ 3] = w0; w0 = 0;
163
164 word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]);
165 word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
166 word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
167 word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
168 word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]);
169 z[ 4] = w1; w1 = 0;
170
171 word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]);
172 word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]);
173 word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
174 word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
175 word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]);
176 word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]);
177 z[ 5] = w2; w2 = 0;
178
179 word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]);
180 word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]);
181 word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
182 word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]);
183 word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]);
184 z[ 6] = w0; w0 = 0;
185
186 word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]);
187 word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]);
188 word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]);
189 word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]);
190 z[ 7] = w1; w1 = 0;
191
192 word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]);
193 word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]);
194 word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]);
195 z[ 8] = w2; w2 = 0;
196
197 word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]);
198 word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]);
199 z[ 9] = w0; w0 = 0;
200
201 word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]);
202 z[10] = w1;
203 z[11] = w2;
204 }
205
206/*
207* Comba 8x8 Squaring
208*/
209void bigint_comba_sqr8(word z[16], const word x[8])
210 {
211 word w2 = 0, w1 = 0, w0 = 0;
212
213 word3_muladd(&w2, &w1, &w0, x[ 0], x[ 0]);
214 z[ 0] = w0; w0 = 0;
215
216 word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
217 z[ 1] = w1; w1 = 0;
218
219 word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]);
220 word3_muladd(&w1, &w0, &w2, x[ 1], x[ 1]);
221 z[ 2] = w2; w2 = 0;
222
223 word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]);
224 word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]);
225 z[ 3] = w0; w0 = 0;
226
227 word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]);
228 word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
229 word3_muladd(&w0, &w2, &w1, x[ 2], x[ 2]);
230 z[ 4] = w1; w1 = 0;
231
232 word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]);
233 word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]);
234 word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
235 z[ 5] = w2; w2 = 0;
236
237 word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]);
238 word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]);
239 word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]);
240 word3_muladd(&w2, &w1, &w0, x[ 3], x[ 3]);
241 z[ 6] = w0; w0 = 0;
242
243 word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]);
244 word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]);
245 word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]);
246 word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]);
247 z[ 7] = w1; w1 = 0;
248
249 word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]);
250 word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]);
251 word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]);
252 word3_muladd(&w1, &w0, &w2, x[ 4], x[ 4]);
253 z[ 8] = w2; w2 = 0;
254
255 word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]);
256 word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]);
257 word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]);
258 z[ 9] = w0; w0 = 0;
259
260 word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]);
261 word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]);
262 word3_muladd(&w0, &w2, &w1, x[ 5], x[ 5]);
263 z[10] = w1; w1 = 0;
264
265 word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]);
266 word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]);
267 z[11] = w2; w2 = 0;
268
269 word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]);
270 word3_muladd(&w2, &w1, &w0, x[ 6], x[ 6]);
271 z[12] = w0; w0 = 0;
272
273 word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]);
274 z[13] = w1; w1 = 0;
275
276 word3_muladd(&w1, &w0, &w2, x[ 7], x[ 7]);
277 z[14] = w2;
278 z[15] = w0;
279 }
280
281/*
282* Comba 8x8 Multiplication
283*/
284void bigint_comba_mul8(word z[16], const word x[8], const word y[8])
285 {
286 word w2 = 0, w1 = 0, w0 = 0;
287
288 word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
289 z[ 0] = w0; w0 = 0;
290
291 word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
292 word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
293 z[ 1] = w1; w1 = 0;
294
295 word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
296 word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
297 word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
298 z[ 2] = w2; w2 = 0;
299
300 word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
301 word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
302 word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
303 word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
304 z[ 3] = w0; w0 = 0;
305
306 word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]);
307 word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
308 word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
309 word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
310 word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]);
311 z[ 4] = w1; w1 = 0;
312
313 word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]);
314 word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]);
315 word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
316 word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
317 word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]);
318 word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]);
319 z[ 5] = w2; w2 = 0;
320
321 word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]);
322 word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]);
323 word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]);
324 word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
325 word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]);
326 word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]);
327 word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]);
328 z[ 6] = w0; w0 = 0;
329
330 word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]);
331 word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]);
332 word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]);
333 word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]);
334 word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]);
335 word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]);
336 word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]);
337 word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]);
338 z[ 7] = w1; w1 = 0;
339
340 word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]);
341 word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]);
342 word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]);
343 word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]);
344 word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]);
345 word3_muladd(&w1, &w0, &w2, x[ 6], y[ 2]);
346 word3_muladd(&w1, &w0, &w2, x[ 7], y[ 1]);
347 z[ 8] = w2; w2 = 0;
348
349 word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]);
350 word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]);
351 word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]);
352 word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]);
353 word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]);
354 word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]);
355 z[ 9] = w0; w0 = 0;
356
357 word3_muladd(&w0, &w2, &w1, x[ 3], y[ 7]);
358 word3_muladd(&w0, &w2, &w1, x[ 4], y[ 6]);
359 word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]);
360 word3_muladd(&w0, &w2, &w1, x[ 6], y[ 4]);
361 word3_muladd(&w0, &w2, &w1, x[ 7], y[ 3]);
362 z[10] = w1; w1 = 0;
363
364 word3_muladd(&w1, &w0, &w2, x[ 4], y[ 7]);
365 word3_muladd(&w1, &w0, &w2, x[ 5], y[ 6]);
366 word3_muladd(&w1, &w0, &w2, x[ 6], y[ 5]);
367 word3_muladd(&w1, &w0, &w2, x[ 7], y[ 4]);
368 z[11] = w2; w2 = 0;
369
370 word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]);
371 word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]);
372 word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]);
373 z[12] = w0; w0 = 0;
374
375 word3_muladd(&w0, &w2, &w1, x[ 6], y[ 7]);
376 word3_muladd(&w0, &w2, &w1, x[ 7], y[ 6]);
377 z[13] = w1; w1 = 0;
378
379 word3_muladd(&w1, &w0, &w2, x[ 7], y[ 7]);
380 z[14] = w2;
381 z[15] = w0;
382 }
383
384/*
385* Comba 16x16 Squaring
386*/
387void bigint_comba_sqr16(word z[32], const word x[16])
388 {
389 word w2 = 0, w1 = 0, w0 = 0;
390
391 word3_muladd(&w2, &w1, &w0, x[ 0], x[ 0]);
392 z[ 0] = w0; w0 = 0;
393
394 word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
395 z[ 1] = w1; w1 = 0;
396
397 word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]);
398 word3_muladd(&w1, &w0, &w2, x[ 1], x[ 1]);
399 z[ 2] = w2; w2 = 0;
400
401 word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]);
402 word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]);
403 z[ 3] = w0; w0 = 0;
404
405 word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]);
406 word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
407 word3_muladd(&w0, &w2, &w1, x[ 2], x[ 2]);
408 z[ 4] = w1; w1 = 0;
409
410 word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]);
411 word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]);
412 word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
413 z[ 5] = w2; w2 = 0;
414
415 word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]);
416 word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]);
417 word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]);
418 word3_muladd(&w2, &w1, &w0, x[ 3], x[ 3]);
419 z[ 6] = w0; w0 = 0;
420
421 word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]);
422 word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]);
423 word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]);
424 word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]);
425 z[ 7] = w1; w1 = 0;
426
427 word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 8]);
428 word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]);
429 word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]);
430 word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]);
431 word3_muladd(&w1, &w0, &w2, x[ 4], x[ 4]);
432 z[ 8] = w2; w2 = 0;
433
434 word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 9]);
435 word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 8]);
436 word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]);
437 word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]);
438 word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]);
439 z[ 9] = w0; w0 = 0;
440
441 word3_muladd_2(&w0, &w2, &w1, x[ 0], x[10]);
442 word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 9]);
443 word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 8]);
444 word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]);
445 word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]);
446 word3_muladd(&w0, &w2, &w1, x[ 5], x[ 5]);
447 z[10] = w1; w1 = 0;
448
449 word3_muladd_2(&w1, &w0, &w2, x[ 0], x[11]);
450 word3_muladd_2(&w1, &w0, &w2, x[ 1], x[10]);
451 word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 9]);
452 word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 8]);
453 word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]);
454 word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]);
455 z[11] = w2; w2 = 0;
456
457 word3_muladd_2(&w2, &w1, &w0, x[ 0], x[12]);
458 word3_muladd_2(&w2, &w1, &w0, x[ 1], x[11]);
459 word3_muladd_2(&w2, &w1, &w0, x[ 2], x[10]);
460 word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 9]);
461 word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 8]);
462 word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]);
463 word3_muladd(&w2, &w1, &w0, x[ 6], x[ 6]);
464 z[12] = w0; w0 = 0;
465
466 word3_muladd_2(&w0, &w2, &w1, x[ 0], x[13]);
467 word3_muladd_2(&w0, &w2, &w1, x[ 1], x[12]);
468 word3_muladd_2(&w0, &w2, &w1, x[ 2], x[11]);
469 word3_muladd_2(&w0, &w2, &w1, x[ 3], x[10]);
470 word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 9]);
471 word3_muladd_2(&w0, &w2, &w1, x[ 5], x[ 8]);
472 word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]);
473 z[13] = w1; w1 = 0;
474
475 word3_muladd_2(&w1, &w0, &w2, x[ 0], x[14]);
476 word3_muladd_2(&w1, &w0, &w2, x[ 1], x[13]);
477 word3_muladd_2(&w1, &w0, &w2, x[ 2], x[12]);
478 word3_muladd_2(&w1, &w0, &w2, x[ 3], x[11]);
479 word3_muladd_2(&w1, &w0, &w2, x[ 4], x[10]);
480 word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 9]);
481 word3_muladd_2(&w1, &w0, &w2, x[ 6], x[ 8]);
482 word3_muladd(&w1, &w0, &w2, x[ 7], x[ 7]);
483 z[14] = w2; w2 = 0;
484
485 word3_muladd_2(&w2, &w1, &w0, x[ 0], x[15]);
486 word3_muladd_2(&w2, &w1, &w0, x[ 1], x[14]);
487 word3_muladd_2(&w2, &w1, &w0, x[ 2], x[13]);
488 word3_muladd_2(&w2, &w1, &w0, x[ 3], x[12]);
489 word3_muladd_2(&w2, &w1, &w0, x[ 4], x[11]);
490 word3_muladd_2(&w2, &w1, &w0, x[ 5], x[10]);
491 word3_muladd_2(&w2, &w1, &w0, x[ 6], x[ 9]);
492 word3_muladd_2(&w2, &w1, &w0, x[ 7], x[ 8]);
493 z[15] = w0; w0 = 0;
494
495 word3_muladd_2(&w0, &w2, &w1, x[ 1], x[15]);
496 word3_muladd_2(&w0, &w2, &w1, x[ 2], x[14]);
497 word3_muladd_2(&w0, &w2, &w1, x[ 3], x[13]);
498 word3_muladd_2(&w0, &w2, &w1, x[ 4], x[12]);
499 word3_muladd_2(&w0, &w2, &w1, x[ 5], x[11]);
500 word3_muladd_2(&w0, &w2, &w1, x[ 6], x[10]);
501 word3_muladd_2(&w0, &w2, &w1, x[ 7], x[ 9]);
502 word3_muladd(&w0, &w2, &w1, x[ 8], x[ 8]);
503 z[16] = w1; w1 = 0;
504
505 word3_muladd_2(&w1, &w0, &w2, x[ 2], x[15]);
506 word3_muladd_2(&w1, &w0, &w2, x[ 3], x[14]);
507 word3_muladd_2(&w1, &w0, &w2, x[ 4], x[13]);
508 word3_muladd_2(&w1, &w0, &w2, x[ 5], x[12]);
509 word3_muladd_2(&w1, &w0, &w2, x[ 6], x[11]);
510 word3_muladd_2(&w1, &w0, &w2, x[ 7], x[10]);
511 word3_muladd_2(&w1, &w0, &w2, x[ 8], x[ 9]);
512 z[17] = w2; w2 = 0;
513
514 word3_muladd_2(&w2, &w1, &w0, x[ 3], x[15]);
515 word3_muladd_2(&w2, &w1, &w0, x[ 4], x[14]);
516 word3_muladd_2(&w2, &w1, &w0, x[ 5], x[13]);
517 word3_muladd_2(&w2, &w1, &w0, x[ 6], x[12]);
518 word3_muladd_2(&w2, &w1, &w0, x[ 7], x[11]);
519 word3_muladd_2(&w2, &w1, &w0, x[ 8], x[10]);
520 word3_muladd(&w2, &w1, &w0, x[ 9], x[ 9]);
521 z[18] = w0; w0 = 0;
522
523 word3_muladd_2(&w0, &w2, &w1, x[ 4], x[15]);
524 word3_muladd_2(&w0, &w2, &w1, x[ 5], x[14]);
525 word3_muladd_2(&w0, &w2, &w1, x[ 6], x[13]);
526 word3_muladd_2(&w0, &w2, &w1, x[ 7], x[12]);
527 word3_muladd_2(&w0, &w2, &w1, x[ 8], x[11]);
528 word3_muladd_2(&w0, &w2, &w1, x[ 9], x[10]);
529 z[19] = w1; w1 = 0;
530
531 word3_muladd_2(&w1, &w0, &w2, x[ 5], x[15]);
532 word3_muladd_2(&w1, &w0, &w2, x[ 6], x[14]);
533 word3_muladd_2(&w1, &w0, &w2, x[ 7], x[13]);
534 word3_muladd_2(&w1, &w0, &w2, x[ 8], x[12]);
535 word3_muladd_2(&w1, &w0, &w2, x[ 9], x[11]);
536 word3_muladd(&w1, &w0, &w2, x[10], x[10]);
537 z[20] = w2; w2 = 0;
538
539 word3_muladd_2(&w2, &w1, &w0, x[ 6], x[15]);
540 word3_muladd_2(&w2, &w1, &w0, x[ 7], x[14]);
541 word3_muladd_2(&w2, &w1, &w0, x[ 8], x[13]);
542 word3_muladd_2(&w2, &w1, &w0, x[ 9], x[12]);
543 word3_muladd_2(&w2, &w1, &w0, x[10], x[11]);
544 z[21] = w0; w0 = 0;
545
546 word3_muladd_2(&w0, &w2, &w1, x[ 7], x[15]);
547 word3_muladd_2(&w0, &w2, &w1, x[ 8], x[14]);
548 word3_muladd_2(&w0, &w2, &w1, x[ 9], x[13]);
549 word3_muladd_2(&w0, &w2, &w1, x[10], x[12]);
550 word3_muladd(&w0, &w2, &w1, x[11], x[11]);
551 z[22] = w1; w1 = 0;
552
553 word3_muladd_2(&w1, &w0, &w2, x[ 8], x[15]);
554 word3_muladd_2(&w1, &w0, &w2, x[ 9], x[14]);
555 word3_muladd_2(&w1, &w0, &w2, x[10], x[13]);
556 word3_muladd_2(&w1, &w0, &w2, x[11], x[12]);
557 z[23] = w2; w2 = 0;
558
559 word3_muladd_2(&w2, &w1, &w0, x[ 9], x[15]);
560 word3_muladd_2(&w2, &w1, &w0, x[10], x[14]);
561 word3_muladd_2(&w2, &w1, &w0, x[11], x[13]);
562 word3_muladd(&w2, &w1, &w0, x[12], x[12]);
563 z[24] = w0; w0 = 0;
564
565 word3_muladd_2(&w0, &w2, &w1, x[10], x[15]);
566 word3_muladd_2(&w0, &w2, &w1, x[11], x[14]);
567 word3_muladd_2(&w0, &w2, &w1, x[12], x[13]);
568 z[25] = w1; w1 = 0;
569
570 word3_muladd_2(&w1, &w0, &w2, x[11], x[15]);
571 word3_muladd_2(&w1, &w0, &w2, x[12], x[14]);
572 word3_muladd(&w1, &w0, &w2, x[13], x[13]);
573 z[26] = w2; w2 = 0;
574
575 word3_muladd_2(&w2, &w1, &w0, x[12], x[15]);
576 word3_muladd_2(&w2, &w1, &w0, x[13], x[14]);
577 z[27] = w0; w0 = 0;
578
579 word3_muladd_2(&w0, &w2, &w1, x[13], x[15]);
580 word3_muladd(&w0, &w2, &w1, x[14], x[14]);
581 z[28] = w1; w1 = 0;
582
583 word3_muladd_2(&w1, &w0, &w2, x[14], x[15]);
584 z[29] = w2; w2 = 0;
585
586 word3_muladd(&w2, &w1, &w0, x[15], x[15]);
587 z[30] = w0;
588 z[31] = w1;
589 }
590
591/*
592* Comba 16x16 Multiplication
593*/
594void bigint_comba_mul16(word z[32], const word x[16], const word y[16])
595 {
596 word w2 = 0, w1 = 0, w0 = 0;
597
598 word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
599 z[ 0] = w0; w0 = 0;
600
601 word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
602 word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
603 z[ 1] = w1; w1 = 0;
604
605 word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
606 word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
607 word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
608 z[ 2] = w2; w2 = 0;
609
610 word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
611 word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
612 word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
613 word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
614 z[ 3] = w0; w0 = 0;
615
616 word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]);
617 word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
618 word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
619 word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
620 word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]);
621 z[ 4] = w1; w1 = 0;
622
623 word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]);
624 word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]);
625 word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
626 word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
627 word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]);
628 word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]);
629 z[ 5] = w2; w2 = 0;
630
631 word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]);
632 word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]);
633 word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]);
634 word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
635 word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]);
636 word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]);
637 word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]);
638 z[ 6] = w0; w0 = 0;
639
640 word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]);
641 word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]);
642 word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]);
643 word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]);
644 word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]);
645 word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]);
646 word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]);
647 word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]);
648 z[ 7] = w1; w1 = 0;
649
650 word3_muladd(&w1, &w0, &w2, x[ 0], y[ 8]);
651 word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]);
652 word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]);
653 word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]);
654 word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]);
655 word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]);
656 word3_muladd(&w1, &w0, &w2, x[ 6], y[ 2]);
657 word3_muladd(&w1, &w0, &w2, x[ 7], y[ 1]);
658 word3_muladd(&w1, &w0, &w2, x[ 8], y[ 0]);
659 z[ 8] = w2; w2 = 0;
660
661 word3_muladd(&w2, &w1, &w0, x[ 0], y[ 9]);
662 word3_muladd(&w2, &w1, &w0, x[ 1], y[ 8]);
663 word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]);
664 word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]);
665 word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]);
666 word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]);
667 word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]);
668 word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]);
669 word3_muladd(&w2, &w1, &w0, x[ 8], y[ 1]);
670 word3_muladd(&w2, &w1, &w0, x[ 9], y[ 0]);
671 z[ 9] = w0; w0 = 0;
672
673 word3_muladd(&w0, &w2, &w1, x[ 0], y[10]);
674 word3_muladd(&w0, &w2, &w1, x[ 1], y[ 9]);
675 word3_muladd(&w0, &w2, &w1, x[ 2], y[ 8]);
676 word3_muladd(&w0, &w2, &w1, x[ 3], y[ 7]);
677 word3_muladd(&w0, &w2, &w1, x[ 4], y[ 6]);
678 word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]);
679 word3_muladd(&w0, &w2, &w1, x[ 6], y[ 4]);
680 word3_muladd(&w0, &w2, &w1, x[ 7], y[ 3]);
681 word3_muladd(&w0, &w2, &w1, x[ 8], y[ 2]);
682 word3_muladd(&w0, &w2, &w1, x[ 9], y[ 1]);
683 word3_muladd(&w0, &w2, &w1, x[10], y[ 0]);
684 z[10] = w1; w1 = 0;
685
686 word3_muladd(&w1, &w0, &w2, x[ 0], y[11]);
687 word3_muladd(&w1, &w0, &w2, x[ 1], y[10]);
688 word3_muladd(&w1, &w0, &w2, x[ 2], y[ 9]);
689 word3_muladd(&w1, &w0, &w2, x[ 3], y[ 8]);
690 word3_muladd(&w1, &w0, &w2, x[ 4], y[ 7]);
691 word3_muladd(&w1, &w0, &w2, x[ 5], y[ 6]);
692 word3_muladd(&w1, &w0, &w2, x[ 6], y[ 5]);
693 word3_muladd(&w1, &w0, &w2, x[ 7], y[ 4]);
694 word3_muladd(&w1, &w0, &w2, x[ 8], y[ 3]);
695 word3_muladd(&w1, &w0, &w2, x[ 9], y[ 2]);
696 word3_muladd(&w1, &w0, &w2, x[10], y[ 1]);
697 word3_muladd(&w1, &w0, &w2, x[11], y[ 0]);
698 z[11] = w2; w2 = 0;
699
700 word3_muladd(&w2, &w1, &w0, x[ 0], y[12]);
701 word3_muladd(&w2, &w1, &w0, x[ 1], y[11]);
702 word3_muladd(&w2, &w1, &w0, x[ 2], y[10]);
703 word3_muladd(&w2, &w1, &w0, x[ 3], y[ 9]);
704 word3_muladd(&w2, &w1, &w0, x[ 4], y[ 8]);
705 word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]);
706 word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]);
707 word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]);
708 word3_muladd(&w2, &w1, &w0, x[ 8], y[ 4]);
709 word3_muladd(&w2, &w1, &w0, x[ 9], y[ 3]);
710 word3_muladd(&w2, &w1, &w0, x[10], y[ 2]);
711 word3_muladd(&w2, &w1, &w0, x[11], y[ 1]);
712 word3_muladd(&w2, &w1, &w0, x[12], y[ 0]);
713 z[12] = w0; w0 = 0;
714
715 word3_muladd(&w0, &w2, &w1, x[ 0], y[13]);
716 word3_muladd(&w0, &w2, &w1, x[ 1], y[12]);
717 word3_muladd(&w0, &w2, &w1, x[ 2], y[11]);
718 word3_muladd(&w0, &w2, &w1, x[ 3], y[10]);
719 word3_muladd(&w0, &w2, &w1, x[ 4], y[ 9]);
720 word3_muladd(&w0, &w2, &w1, x[ 5], y[ 8]);
721 word3_muladd(&w0, &w2, &w1, x[ 6], y[ 7]);
722 word3_muladd(&w0, &w2, &w1, x[ 7], y[ 6]);
723 word3_muladd(&w0, &w2, &w1, x[ 8], y[ 5]);
724 word3_muladd(&w0, &w2, &w1, x[ 9], y[ 4]);
725 word3_muladd(&w0, &w2, &w1, x[10], y[ 3]);
726 word3_muladd(&w0, &w2, &w1, x[11], y[ 2]);
727 word3_muladd(&w0, &w2, &w1, x[12], y[ 1]);
728 word3_muladd(&w0, &w2, &w1, x[13], y[ 0]);
729 z[13] = w1; w1 = 0;
730
731 word3_muladd(&w1, &w0, &w2, x[ 0], y[14]);
732 word3_muladd(&w1, &w0, &w2, x[ 1], y[13]);
733 word3_muladd(&w1, &w0, &w2, x[ 2], y[12]);
734 word3_muladd(&w1, &w0, &w2, x[ 3], y[11]);
735 word3_muladd(&w1, &w0, &w2, x[ 4], y[10]);
736 word3_muladd(&w1, &w0, &w2, x[ 5], y[ 9]);
737 word3_muladd(&w1, &w0, &w2, x[ 6], y[ 8]);
738 word3_muladd(&w1, &w0, &w2, x[ 7], y[ 7]);
739 word3_muladd(&w1, &w0, &w2, x[ 8], y[ 6]);
740 word3_muladd(&w1, &w0, &w2, x[ 9], y[ 5]);
741 word3_muladd(&w1, &w0, &w2, x[10], y[ 4]);
742 word3_muladd(&w1, &w0, &w2, x[11], y[ 3]);
743 word3_muladd(&w1, &w0, &w2, x[12], y[ 2]);
744 word3_muladd(&w1, &w0, &w2, x[13], y[ 1]);
745 word3_muladd(&w1, &w0, &w2, x[14], y[ 0]);
746 z[14] = w2; w2 = 0;
747
748 word3_muladd(&w2, &w1, &w0, x[ 0], y[15]);
749 word3_muladd(&w2, &w1, &w0, x[ 1], y[14]);
750 word3_muladd(&w2, &w1, &w0, x[ 2], y[13]);
751 word3_muladd(&w2, &w1, &w0, x[ 3], y[12]);
752 word3_muladd(&w2, &w1, &w0, x[ 4], y[11]);
753 word3_muladd(&w2, &w1, &w0, x[ 5], y[10]);
754 word3_muladd(&w2, &w1, &w0, x[ 6], y[ 9]);
755 word3_muladd(&w2, &w1, &w0, x[ 7], y[ 8]);
756 word3_muladd(&w2, &w1, &w0, x[ 8], y[ 7]);
757 word3_muladd(&w2, &w1, &w0, x[ 9], y[ 6]);
758 word3_muladd(&w2, &w1, &w0, x[10], y[ 5]);
759 word3_muladd(&w2, &w1, &w0, x[11], y[ 4]);
760 word3_muladd(&w2, &w1, &w0, x[12], y[ 3]);
761 word3_muladd(&w2, &w1, &w0, x[13], y[ 2]);
762 word3_muladd(&w2, &w1, &w0, x[14], y[ 1]);
763 word3_muladd(&w2, &w1, &w0, x[15], y[ 0]);
764 z[15] = w0; w0 = 0;
765
766 word3_muladd(&w0, &w2, &w1, x[ 1], y[15]);
767 word3_muladd(&w0, &w2, &w1, x[ 2], y[14]);
768 word3_muladd(&w0, &w2, &w1, x[ 3], y[13]);
769 word3_muladd(&w0, &w2, &w1, x[ 4], y[12]);
770 word3_muladd(&w0, &w2, &w1, x[ 5], y[11]);
771 word3_muladd(&w0, &w2, &w1, x[ 6], y[10]);
772 word3_muladd(&w0, &w2, &w1, x[ 7], y[ 9]);
773 word3_muladd(&w0, &w2, &w1, x[ 8], y[ 8]);
774 word3_muladd(&w0, &w2, &w1, x[ 9], y[ 7]);
775 word3_muladd(&w0, &w2, &w1, x[10], y[ 6]);
776 word3_muladd(&w0, &w2, &w1, x[11], y[ 5]);
777 word3_muladd(&w0, &w2, &w1, x[12], y[ 4]);
778 word3_muladd(&w0, &w2, &w1, x[13], y[ 3]);
779 word3_muladd(&w0, &w2, &w1, x[14], y[ 2]);
780 word3_muladd(&w0, &w2, &w1, x[15], y[ 1]);
781 z[16] = w1; w1 = 0;
782
783 word3_muladd(&w1, &w0, &w2, x[ 2], y[15]);
784 word3_muladd(&w1, &w0, &w2, x[ 3], y[14]);
785 word3_muladd(&w1, &w0, &w2, x[ 4], y[13]);
786 word3_muladd(&w1, &w0, &w2, x[ 5], y[12]);
787 word3_muladd(&w1, &w0, &w2, x[ 6], y[11]);
788 word3_muladd(&w1, &w0, &w2, x[ 7], y[10]);
789 word3_muladd(&w1, &w0, &w2, x[ 8], y[ 9]);
790 word3_muladd(&w1, &w0, &w2, x[ 9], y[ 8]);
791 word3_muladd(&w1, &w0, &w2, x[10], y[ 7]);
792 word3_muladd(&w1, &w0, &w2, x[11], y[ 6]);
793 word3_muladd(&w1, &w0, &w2, x[12], y[ 5]);
794 word3_muladd(&w1, &w0, &w2, x[13], y[ 4]);
795 word3_muladd(&w1, &w0, &w2, x[14], y[ 3]);
796 word3_muladd(&w1, &w0, &w2, x[15], y[ 2]);
797 z[17] = w2; w2 = 0;
798
799 word3_muladd(&w2, &w1, &w0, x[ 3], y[15]);
800 word3_muladd(&w2, &w1, &w0, x[ 4], y[14]);
801 word3_muladd(&w2, &w1, &w0, x[ 5], y[13]);
802 word3_muladd(&w2, &w1, &w0, x[ 6], y[12]);
803 word3_muladd(&w2, &w1, &w0, x[ 7], y[11]);
804 word3_muladd(&w2, &w1, &w0, x[ 8], y[10]);
805 word3_muladd(&w2, &w1, &w0, x[ 9], y[ 9]);
806 word3_muladd(&w2, &w1, &w0, x[10], y[ 8]);
807 word3_muladd(&w2, &w1, &w0, x[11], y[ 7]);
808 word3_muladd(&w2, &w1, &w0, x[12], y[ 6]);
809 word3_muladd(&w2, &w1, &w0, x[13], y[ 5]);
810 word3_muladd(&w2, &w1, &w0, x[14], y[ 4]);
811 word3_muladd(&w2, &w1, &w0, x[15], y[ 3]);
812 z[18] = w0; w0 = 0;
813
814 word3_muladd(&w0, &w2, &w1, x[ 4], y[15]);
815 word3_muladd(&w0, &w2, &w1, x[ 5], y[14]);
816 word3_muladd(&w0, &w2, &w1, x[ 6], y[13]);
817 word3_muladd(&w0, &w2, &w1, x[ 7], y[12]);
818 word3_muladd(&w0, &w2, &w1, x[ 8], y[11]);
819 word3_muladd(&w0, &w2, &w1, x[ 9], y[10]);
820 word3_muladd(&w0, &w2, &w1, x[10], y[ 9]);
821 word3_muladd(&w0, &w2, &w1, x[11], y[ 8]);
822 word3_muladd(&w0, &w2, &w1, x[12], y[ 7]);
823 word3_muladd(&w0, &w2, &w1, x[13], y[ 6]);
824 word3_muladd(&w0, &w2, &w1, x[14], y[ 5]);
825 word3_muladd(&w0, &w2, &w1, x[15], y[ 4]);
826 z[19] = w1; w1 = 0;
827
828 word3_muladd(&w1, &w0, &w2, x[ 5], y[15]);
829 word3_muladd(&w1, &w0, &w2, x[ 6], y[14]);
830 word3_muladd(&w1, &w0, &w2, x[ 7], y[13]);
831 word3_muladd(&w1, &w0, &w2, x[ 8], y[12]);
832 word3_muladd(&w1, &w0, &w2, x[ 9], y[11]);
833 word3_muladd(&w1, &w0, &w2, x[10], y[10]);
834 word3_muladd(&w1, &w0, &w2, x[11], y[ 9]);
835 word3_muladd(&w1, &w0, &w2, x[12], y[ 8]);
836 word3_muladd(&w1, &w0, &w2, x[13], y[ 7]);
837 word3_muladd(&w1, &w0, &w2, x[14], y[ 6]);
838 word3_muladd(&w1, &w0, &w2, x[15], y[ 5]);
839 z[20] = w2; w2 = 0;
840
841 word3_muladd(&w2, &w1, &w0, x[ 6], y[15]);
842 word3_muladd(&w2, &w1, &w0, x[ 7], y[14]);
843 word3_muladd(&w2, &w1, &w0, x[ 8], y[13]);
844 word3_muladd(&w2, &w1, &w0, x[ 9], y[12]);
845 word3_muladd(&w2, &w1, &w0, x[10], y[11]);
846 word3_muladd(&w2, &w1, &w0, x[11], y[10]);
847 word3_muladd(&w2, &w1, &w0, x[12], y[ 9]);
848 word3_muladd(&w2, &w1, &w0, x[13], y[ 8]);
849 word3_muladd(&w2, &w1, &w0, x[14], y[ 7]);
850 word3_muladd(&w2, &w1, &w0, x[15], y[ 6]);
851 z[21] = w0; w0 = 0;
852
853 word3_muladd(&w0, &w2, &w1, x[ 7], y[15]);
854 word3_muladd(&w0, &w2, &w1, x[ 8], y[14]);
855 word3_muladd(&w0, &w2, &w1, x[ 9], y[13]);
856 word3_muladd(&w0, &w2, &w1, x[10], y[12]);
857 word3_muladd(&w0, &w2, &w1, x[11], y[11]);
858 word3_muladd(&w0, &w2, &w1, x[12], y[10]);
859 word3_muladd(&w0, &w2, &w1, x[13], y[ 9]);
860 word3_muladd(&w0, &w2, &w1, x[14], y[ 8]);
861 word3_muladd(&w0, &w2, &w1, x[15], y[ 7]);
862 z[22] = w1; w1 = 0;
863
864 word3_muladd(&w1, &w0, &w2, x[ 8], y[15]);
865 word3_muladd(&w1, &w0, &w2, x[ 9], y[14]);
866 word3_muladd(&w1, &w0, &w2, x[10], y[13]);
867 word3_muladd(&w1, &w0, &w2, x[11], y[12]);
868 word3_muladd(&w1, &w0, &w2, x[12], y[11]);
869 word3_muladd(&w1, &w0, &w2, x[13], y[10]);
870 word3_muladd(&w1, &w0, &w2, x[14], y[ 9]);
871 word3_muladd(&w1, &w0, &w2, x[15], y[ 8]);
872 z[23] = w2; w2 = 0;
873
874 word3_muladd(&w2, &w1, &w0, x[ 9], y[15]);
875 word3_muladd(&w2, &w1, &w0, x[10], y[14]);
876 word3_muladd(&w2, &w1, &w0, x[11], y[13]);
877 word3_muladd(&w2, &w1, &w0, x[12], y[12]);
878 word3_muladd(&w2, &w1, &w0, x[13], y[11]);
879 word3_muladd(&w2, &w1, &w0, x[14], y[10]);
880 word3_muladd(&w2, &w1, &w0, x[15], y[ 9]);
881 z[24] = w0; w0 = 0;
882
883 word3_muladd(&w0, &w2, &w1, x[10], y[15]);
884 word3_muladd(&w0, &w2, &w1, x[11], y[14]);
885 word3_muladd(&w0, &w2, &w1, x[12], y[13]);
886 word3_muladd(&w0, &w2, &w1, x[13], y[12]);
887 word3_muladd(&w0, &w2, &w1, x[14], y[11]);
888 word3_muladd(&w0, &w2, &w1, x[15], y[10]);
889 z[25] = w1; w1 = 0;
890
891 word3_muladd(&w1, &w0, &w2, x[11], y[15]);
892 word3_muladd(&w1, &w0, &w2, x[12], y[14]);
893 word3_muladd(&w1, &w0, &w2, x[13], y[13]);
894 word3_muladd(&w1, &w0, &w2, x[14], y[12]);
895 word3_muladd(&w1, &w0, &w2, x[15], y[11]);
896 z[26] = w2; w2 = 0;
897
898 word3_muladd(&w2, &w1, &w0, x[12], y[15]);
899 word3_muladd(&w2, &w1, &w0, x[13], y[14]);
900 word3_muladd(&w2, &w1, &w0, x[14], y[13]);
901 word3_muladd(&w2, &w1, &w0, x[15], y[12]);
902 z[27] = w0; w0 = 0;
903
904 word3_muladd(&w0, &w2, &w1, x[13], y[15]);
905 word3_muladd(&w0, &w2, &w1, x[14], y[14]);
906 word3_muladd(&w0, &w2, &w1, x[15], y[13]);
907 z[28] = w1; w1 = 0;
908
909 word3_muladd(&w1, &w0, &w2, x[14], y[15]);
910 word3_muladd(&w1, &w0, &w2, x[15], y[14]);
911 z[29] = w2; w2 = 0;
912
913 word3_muladd(&w2, &w1, &w0, x[15], y[15]);
914 z[30] = w0;
915 z[31] = w1;
916 }
917
918}
919
920}
void bigint_comba_mul4(word z[8], const word x[4], const word y[4])
Definition mp_comba.cpp:51
void bigint_comba_sqr6(word z[12], const word x[6])
Definition mp_comba.cpp:90
void bigint_comba_sqr16(word z[32], const word x[16])
Definition mp_comba.cpp:387
void bigint_comba_mul8(word z[16], const word x[8], const word y[8])
Definition mp_comba.cpp:284
void bigint_comba_sqr4(word z[8], const word x[4])
Definition mp_comba.cpp:18
void word3_muladd(word *w2, word *w1, word *w0, word a, word b)
Definition mp_asmi.h:175
void word3_muladd_2(word *w2, word *w1, word *w0, word a, word b)
Definition mp_asmi.h:186
void bigint_comba_mul16(word z[32], const word x[16], const word y[16])
Definition mp_comba.cpp:594
void bigint_comba_mul6(word z[12], const word x[6], const word y[6])
Definition mp_comba.cpp:142
void bigint_comba_sqr8(word z[16], const word x[8])
Definition mp_comba.cpp:209