~ubuntu-branches/debian/sid/botan/sid

« back to all changes in this revision

Viewing changes to src/lib/math/mp/mp_comba.cpp

  • Committer: Package Import Robot
  • Author(s): Laszlo Boszormenyi (GCS)
  • Date: 2018-03-01 22:23:25 UTC
  • mfrom: (1.2.2)
  • Revision ID: package-import@ubuntu.com-20180301222325-7p7vc45gu3hta34d
Tags: 2.4.0-2
* Don't remove .doctrees from the manual if it doesn't exist.
* Don't specify parallel to debhelper.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
* Comba Multiplication and Squaring
 
3
*
 
4
* This file was automatically generated by ./src/scripts/comba.py on 2016-01-01
 
5
*
 
6
* Botan is released under the Simplified BSD License (see license.txt)
 
7
*/
 
8
 
 
9
#include <botan/internal/mp_core.h>
 
10
#include <botan/internal/mp_asmi.h>
 
11
 
 
12
namespace Botan {
 
13
 
 
14
/*
 
15
* Comba 4x4 Squaring
 
16
*/
 
17
void bigint_comba_sqr4(word z[8], const word x[4])
 
18
   {
 
19
   word w2 = 0, w1 = 0, w0 = 0;
 
20
 
 
21
   word3_muladd  (&w2, &w1, &w0, x[ 0], x[ 0]);
 
22
   z[ 0] = w0; w0 = 0;
 
23
 
 
24
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
 
25
   z[ 1] = w1; 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; w2 = 0;
 
30
 
 
31
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]);
 
32
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]);
 
33
   z[ 3] = w0; w0 = 0;
 
34
 
 
35
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
 
36
   word3_muladd  (&w0, &w2, &w1, x[ 2], x[ 2]);
 
37
   z[ 4] = w1; w1 = 0;
 
38
 
 
39
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
 
40
   z[ 5] = w2; w2 = 0;
 
41
 
 
42
   word3_muladd  (&w2, &w1, &w0, x[ 3], x[ 3]);
 
43
   z[ 6] = w0;
 
44
   z[ 7] = w1;
 
45
   }
 
46
 
 
47
/*
 
48
* Comba 4x4 Multiplication
 
49
*/
 
50
void bigint_comba_mul4(word z[8], const word x[4], const word y[4])
 
51
   {
 
52
   word w2 = 0, w1 = 0, w0 = 0;
 
53
 
 
54
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
 
55
   z[ 0] = w0; w0 = 0;
 
56
 
 
57
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
 
58
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
 
59
   z[ 1] = w1; w1 = 0;
 
60
 
 
61
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
 
62
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
 
63
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
 
64
   z[ 2] = w2; w2 = 0;
 
65
 
 
66
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
 
67
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
 
68
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
 
69
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
 
70
   z[ 3] = w0; w0 = 0;
 
71
 
 
72
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
 
73
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
 
74
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
 
75
   z[ 4] = w1; w1 = 0;
 
76
 
 
77
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
 
78
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
 
79
   z[ 5] = w2; w2 = 0;
 
80
 
 
81
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
 
82
   z[ 6] = w0;
 
83
   z[ 7] = w1;
 
84
   }
 
85
 
 
86
/*
 
87
* Comba 6x6 Squaring
 
88
*/
 
89
void bigint_comba_sqr6(word z[12], const word x[6])
 
90
   {
 
91
   word w2 = 0, w1 = 0, w0 = 0;
 
92
 
 
93
   word3_muladd  (&w2, &w1, &w0, x[ 0], x[ 0]);
 
94
   z[ 0] = w0; w0 = 0;
 
95
 
 
96
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
 
97
   z[ 1] = w1; w1 = 0;
 
98
 
 
99
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]);
 
100
   word3_muladd  (&w1, &w0, &w2, x[ 1], x[ 1]);
 
101
   z[ 2] = w2; w2 = 0;
 
102
 
 
103
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]);
 
104
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]);
 
105
   z[ 3] = w0; w0 = 0;
 
106
 
 
107
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]);
 
108
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
 
109
   word3_muladd  (&w0, &w2, &w1, x[ 2], x[ 2]);
 
110
   z[ 4] = w1; w1 = 0;
 
111
 
 
112
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]);
 
113
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]);
 
114
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
 
115
   z[ 5] = w2; w2 = 0;
 
116
 
 
117
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]);
 
118
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]);
 
119
   word3_muladd  (&w2, &w1, &w0, x[ 3], x[ 3]);
 
120
   z[ 6] = w0; w0 = 0;
 
121
 
 
122
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]);
 
123
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]);
 
124
   z[ 7] = w1; w1 = 0;
 
125
 
 
126
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]);
 
127
   word3_muladd  (&w1, &w0, &w2, x[ 4], x[ 4]);
 
128
   z[ 8] = w2; w2 = 0;
 
129
 
 
130
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]);
 
131
   z[ 9] = w0; w0 = 0;
 
132
 
 
133
   word3_muladd  (&w0, &w2, &w1, x[ 5], x[ 5]);
 
134
   z[10] = w1;
 
135
   z[11] = w2;
 
136
   }
 
137
 
 
138
/*
 
139
* Comba 6x6 Multiplication
 
140
*/
 
141
void bigint_comba_mul6(word z[12], const word x[6], const word y[6])
 
142
   {
 
143
   word w2 = 0, w1 = 0, w0 = 0;
 
144
 
 
145
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
 
146
   z[ 0] = w0; w0 = 0;
 
147
 
 
148
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
 
149
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
 
150
   z[ 1] = w1; w1 = 0;
 
151
 
 
152
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
 
153
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
 
154
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
 
155
   z[ 2] = w2; w2 = 0;
 
156
 
 
157
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
 
158
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
 
159
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
 
160
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
 
161
   z[ 3] = w0; w0 = 0;
 
162
 
 
163
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]);
 
164
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
 
165
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
 
166
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
 
167
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]);
 
168
   z[ 4] = w1; w1 = 0;
 
169
 
 
170
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]);
 
171
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]);
 
172
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
 
173
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
 
174
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]);
 
175
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]);
 
176
   z[ 5] = w2; w2 = 0;
 
177
 
 
178
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]);
 
179
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]);
 
180
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
 
181
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]);
 
182
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]);
 
183
   z[ 6] = w0; w0 = 0;
 
184
 
 
185
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]);
 
186
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]);
 
187
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]);
 
188
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]);
 
189
   z[ 7] = w1; w1 = 0;
 
190
 
 
191
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]);
 
192
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]);
 
193
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]);
 
194
   z[ 8] = w2; w2 = 0;
 
195
 
 
196
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]);
 
197
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]);
 
198
   z[ 9] = w0; w0 = 0;
 
199
 
 
200
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]);
 
201
   z[10] = w1;
 
202
   z[11] = w2;
 
203
   }
 
204
 
 
205
/*
 
206
* Comba 8x8 Squaring
 
207
*/
 
208
void bigint_comba_sqr8(word z[16], const word x[8])
 
209
   {
 
210
   word w2 = 0, w1 = 0, w0 = 0;
 
211
 
 
212
   word3_muladd  (&w2, &w1, &w0, x[ 0], x[ 0]);
 
213
   z[ 0] = w0; w0 = 0;
 
214
 
 
215
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
 
216
   z[ 1] = w1; w1 = 0;
 
217
 
 
218
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]);
 
219
   word3_muladd  (&w1, &w0, &w2, x[ 1], x[ 1]);
 
220
   z[ 2] = w2; w2 = 0;
 
221
 
 
222
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]);
 
223
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]);
 
224
   z[ 3] = w0; w0 = 0;
 
225
 
 
226
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]);
 
227
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
 
228
   word3_muladd  (&w0, &w2, &w1, x[ 2], x[ 2]);
 
229
   z[ 4] = w1; w1 = 0;
 
230
 
 
231
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]);
 
232
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]);
 
233
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
 
234
   z[ 5] = w2; w2 = 0;
 
235
 
 
236
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]);
 
237
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]);
 
238
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]);
 
239
   word3_muladd  (&w2, &w1, &w0, x[ 3], x[ 3]);
 
240
   z[ 6] = w0; w0 = 0;
 
241
 
 
242
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]);
 
243
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]);
 
244
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]);
 
245
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]);
 
246
   z[ 7] = w1; w1 = 0;
 
247
 
 
248
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]);
 
249
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]);
 
250
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]);
 
251
   word3_muladd  (&w1, &w0, &w2, x[ 4], x[ 4]);
 
252
   z[ 8] = w2; w2 = 0;
 
253
 
 
254
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]);
 
255
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]);
 
256
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]);
 
257
   z[ 9] = w0; w0 = 0;
 
258
 
 
259
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]);
 
260
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]);
 
261
   word3_muladd  (&w0, &w2, &w1, x[ 5], x[ 5]);
 
262
   z[10] = w1; w1 = 0;
 
263
 
 
264
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]);
 
265
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]);
 
266
   z[11] = w2; w2 = 0;
 
267
 
 
268
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]);
 
269
   word3_muladd  (&w2, &w1, &w0, x[ 6], x[ 6]);
 
270
   z[12] = w0; w0 = 0;
 
271
 
 
272
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]);
 
273
   z[13] = w1; w1 = 0;
 
274
 
 
275
   word3_muladd  (&w1, &w0, &w2, x[ 7], x[ 7]);
 
276
   z[14] = w2;
 
277
   z[15] = w0;
 
278
   }
 
279
 
 
280
/*
 
281
* Comba 8x8 Multiplication
 
282
*/
 
283
void bigint_comba_mul8(word z[16], const word x[8], const word y[8])
 
284
   {
 
285
   word w2 = 0, w1 = 0, w0 = 0;
 
286
 
 
287
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
 
288
   z[ 0] = w0; w0 = 0;
 
289
 
 
290
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
 
291
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
 
292
   z[ 1] = w1; w1 = 0;
 
293
 
 
294
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
 
295
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
 
296
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
 
297
   z[ 2] = w2; w2 = 0;
 
298
 
 
299
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
 
300
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
 
301
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
 
302
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
 
303
   z[ 3] = w0; w0 = 0;
 
304
 
 
305
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]);
 
306
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
 
307
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
 
308
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
 
309
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]);
 
310
   z[ 4] = w1; w1 = 0;
 
311
 
 
312
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]);
 
313
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]);
 
314
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
 
315
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
 
316
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]);
 
317
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]);
 
318
   z[ 5] = w2; w2 = 0;
 
319
 
 
320
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]);
 
321
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]);
 
322
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]);
 
323
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
 
324
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]);
 
325
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]);
 
326
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]);
 
327
   z[ 6] = w0; w0 = 0;
 
328
 
 
329
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]);
 
330
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]);
 
331
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]);
 
332
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]);
 
333
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]);
 
334
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]);
 
335
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]);
 
336
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]);
 
337
   z[ 7] = w1; w1 = 0;
 
338
 
 
339
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]);
 
340
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]);
 
341
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]);
 
342
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]);
 
343
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]);
 
344
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 2]);
 
345
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 1]);
 
346
   z[ 8] = w2; w2 = 0;
 
347
 
 
348
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]);
 
349
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]);
 
350
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]);
 
351
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]);
 
352
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]);
 
353
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]);
 
354
   z[ 9] = w0; w0 = 0;
 
355
 
 
356
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 7]);
 
357
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 6]);
 
358
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]);
 
359
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 4]);
 
360
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 3]);
 
361
   z[10] = w1; w1 = 0;
 
362
 
 
363
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 7]);
 
364
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 6]);
 
365
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 5]);
 
366
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 4]);
 
367
   z[11] = w2; w2 = 0;
 
368
 
 
369
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]);
 
370
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]);
 
371
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]);
 
372
   z[12] = w0; w0 = 0;
 
373
 
 
374
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 7]);
 
375
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 6]);
 
376
   z[13] = w1; w1 = 0;
 
377
 
 
378
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 7]);
 
379
   z[14] = w2;
 
380
   z[15] = w0;
 
381
   }
 
382
 
 
383
/*
 
384
* Comba 9x9 Squaring
 
385
*/
 
386
void bigint_comba_sqr9(word z[18], const word x[9])
 
387
   {
 
388
   word w2 = 0, w1 = 0, w0 = 0;
 
389
 
 
390
   word3_muladd  (&w2, &w1, &w0, x[ 0], x[ 0]);
 
391
   z[ 0] = w0; w0 = 0;
 
392
 
 
393
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
 
394
   z[ 1] = w1; w1 = 0;
 
395
 
 
396
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]);
 
397
   word3_muladd  (&w1, &w0, &w2, x[ 1], x[ 1]);
 
398
   z[ 2] = w2; w2 = 0;
 
399
 
 
400
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]);
 
401
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]);
 
402
   z[ 3] = w0; w0 = 0;
 
403
 
 
404
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]);
 
405
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
 
406
   word3_muladd  (&w0, &w2, &w1, x[ 2], x[ 2]);
 
407
   z[ 4] = w1; w1 = 0;
 
408
 
 
409
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]);
 
410
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]);
 
411
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
 
412
   z[ 5] = w2; w2 = 0;
 
413
 
 
414
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]);
 
415
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]);
 
416
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]);
 
417
   word3_muladd  (&w2, &w1, &w0, x[ 3], x[ 3]);
 
418
   z[ 6] = w0; w0 = 0;
 
419
 
 
420
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]);
 
421
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]);
 
422
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]);
 
423
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]);
 
424
   z[ 7] = w1; w1 = 0;
 
425
 
 
426
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 8]);
 
427
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]);
 
428
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]);
 
429
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]);
 
430
   word3_muladd  (&w1, &w0, &w2, x[ 4], x[ 4]);
 
431
   z[ 8] = w2; w2 = 0;
 
432
 
 
433
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 8]);
 
434
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]);
 
435
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]);
 
436
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]);
 
437
   z[ 9] = w0; w0 = 0;
 
438
 
 
439
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 8]);
 
440
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]);
 
441
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]);
 
442
   word3_muladd  (&w0, &w2, &w1, x[ 5], x[ 5]);
 
443
   z[10] = w1; w1 = 0;
 
444
 
 
445
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 8]);
 
446
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]);
 
447
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]);
 
448
   z[11] = w2; w2 = 0;
 
449
 
 
450
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 8]);
 
451
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]);
 
452
   word3_muladd  (&w2, &w1, &w0, x[ 6], x[ 6]);
 
453
   z[12] = w0; w0 = 0;
 
454
 
 
455
   word3_muladd_2(&w0, &w2, &w1, x[ 5], x[ 8]);
 
456
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]);
 
457
   z[13] = w1; w1 = 0;
 
458
 
 
459
   word3_muladd_2(&w1, &w0, &w2, x[ 6], x[ 8]);
 
460
   word3_muladd  (&w1, &w0, &w2, x[ 7], x[ 7]);
 
461
   z[14] = w2; w2 = 0;
 
462
 
 
463
   word3_muladd_2(&w2, &w1, &w0, x[ 7], x[ 8]);
 
464
   z[15] = w0; w0 = 0;
 
465
 
 
466
   word3_muladd  (&w0, &w2, &w1, x[ 8], x[ 8]);
 
467
   z[16] = w1;
 
468
   z[17] = w2;
 
469
   }
 
470
 
 
471
/*
 
472
* Comba 9x9 Multiplication
 
473
*/
 
474
void bigint_comba_mul9(word z[18], const word x[9], const word y[9])
 
475
   {
 
476
   word w2 = 0, w1 = 0, w0 = 0;
 
477
 
 
478
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
 
479
   z[ 0] = w0; w0 = 0;
 
480
 
 
481
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
 
482
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
 
483
   z[ 1] = w1; w1 = 0;
 
484
 
 
485
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
 
486
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
 
487
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
 
488
   z[ 2] = w2; w2 = 0;
 
489
 
 
490
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
 
491
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
 
492
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
 
493
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
 
494
   z[ 3] = w0; w0 = 0;
 
495
 
 
496
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]);
 
497
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
 
498
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
 
499
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
 
500
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]);
 
501
   z[ 4] = w1; w1 = 0;
 
502
 
 
503
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]);
 
504
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]);
 
505
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
 
506
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
 
507
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]);
 
508
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]);
 
509
   z[ 5] = w2; w2 = 0;
 
510
 
 
511
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]);
 
512
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]);
 
513
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]);
 
514
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
 
515
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]);
 
516
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]);
 
517
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]);
 
518
   z[ 6] = w0; w0 = 0;
 
519
 
 
520
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]);
 
521
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]);
 
522
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]);
 
523
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]);
 
524
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]);
 
525
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]);
 
526
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]);
 
527
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]);
 
528
   z[ 7] = w1; w1 = 0;
 
529
 
 
530
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 8]);
 
531
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]);
 
532
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]);
 
533
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]);
 
534
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]);
 
535
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]);
 
536
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 2]);
 
537
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 1]);
 
538
   word3_muladd(&w1, &w0, &w2, x[ 8], y[ 0]);
 
539
   z[ 8] = w2; w2 = 0;
 
540
 
 
541
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 8]);
 
542
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]);
 
543
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]);
 
544
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]);
 
545
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]);
 
546
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]);
 
547
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]);
 
548
   word3_muladd(&w2, &w1, &w0, x[ 8], y[ 1]);
 
549
   z[ 9] = w0; w0 = 0;
 
550
 
 
551
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 8]);
 
552
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 7]);
 
553
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 6]);
 
554
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]);
 
555
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 4]);
 
556
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 3]);
 
557
   word3_muladd(&w0, &w2, &w1, x[ 8], y[ 2]);
 
558
   z[10] = w1; w1 = 0;
 
559
 
 
560
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 8]);
 
561
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 7]);
 
562
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 6]);
 
563
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 5]);
 
564
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 4]);
 
565
   word3_muladd(&w1, &w0, &w2, x[ 8], y[ 3]);
 
566
   z[11] = w2; w2 = 0;
 
567
 
 
568
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 8]);
 
569
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]);
 
570
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]);
 
571
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]);
 
572
   word3_muladd(&w2, &w1, &w0, x[ 8], y[ 4]);
 
573
   z[12] = w0; w0 = 0;
 
574
 
 
575
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 8]);
 
576
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 7]);
 
577
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 6]);
 
578
   word3_muladd(&w0, &w2, &w1, x[ 8], y[ 5]);
 
579
   z[13] = w1; w1 = 0;
 
580
 
 
581
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 8]);
 
582
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 7]);
 
583
   word3_muladd(&w1, &w0, &w2, x[ 8], y[ 6]);
 
584
   z[14] = w2; w2 = 0;
 
585
 
 
586
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 8]);
 
587
   word3_muladd(&w2, &w1, &w0, x[ 8], y[ 7]);
 
588
   z[15] = w0; w0 = 0;
 
589
 
 
590
   word3_muladd(&w0, &w2, &w1, x[ 8], y[ 8]);
 
591
   z[16] = w1;
 
592
   z[17] = w2;
 
593
   }
 
594
 
 
595
/*
 
596
* Comba 16x16 Squaring
 
597
*/
 
598
void bigint_comba_sqr16(word z[32], const word x[16])
 
599
   {
 
600
   word w2 = 0, w1 = 0, w0 = 0;
 
601
 
 
602
   word3_muladd  (&w2, &w1, &w0, x[ 0], x[ 0]);
 
603
   z[ 0] = w0; w0 = 0;
 
604
 
 
605
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]);
 
606
   z[ 1] = w1; w1 = 0;
 
607
 
 
608
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]);
 
609
   word3_muladd  (&w1, &w0, &w2, x[ 1], x[ 1]);
 
610
   z[ 2] = w2; w2 = 0;
 
611
 
 
612
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]);
 
613
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]);
 
614
   z[ 3] = w0; w0 = 0;
 
615
 
 
616
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]);
 
617
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]);
 
618
   word3_muladd  (&w0, &w2, &w1, x[ 2], x[ 2]);
 
619
   z[ 4] = w1; w1 = 0;
 
620
 
 
621
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]);
 
622
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]);
 
623
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]);
 
624
   z[ 5] = w2; w2 = 0;
 
625
 
 
626
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]);
 
627
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]);
 
628
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]);
 
629
   word3_muladd  (&w2, &w1, &w0, x[ 3], x[ 3]);
 
630
   z[ 6] = w0; w0 = 0;
 
631
 
 
632
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]);
 
633
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]);
 
634
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]);
 
635
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]);
 
636
   z[ 7] = w1; w1 = 0;
 
637
 
 
638
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 8]);
 
639
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]);
 
640
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]);
 
641
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]);
 
642
   word3_muladd  (&w1, &w0, &w2, x[ 4], x[ 4]);
 
643
   z[ 8] = w2; w2 = 0;
 
644
 
 
645
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 9]);
 
646
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 8]);
 
647
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]);
 
648
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]);
 
649
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]);
 
650
   z[ 9] = w0; w0 = 0;
 
651
 
 
652
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[10]);
 
653
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 9]);
 
654
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 8]);
 
655
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]);
 
656
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]);
 
657
   word3_muladd  (&w0, &w2, &w1, x[ 5], x[ 5]);
 
658
   z[10] = w1; w1 = 0;
 
659
 
 
660
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[11]);
 
661
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[10]);
 
662
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 9]);
 
663
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 8]);
 
664
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]);
 
665
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]);
 
666
   z[11] = w2; w2 = 0;
 
667
 
 
668
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[12]);
 
669
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[11]);
 
670
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[10]);
 
671
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 9]);
 
672
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 8]);
 
673
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]);
 
674
   word3_muladd  (&w2, &w1, &w0, x[ 6], x[ 6]);
 
675
   z[12] = w0; w0 = 0;
 
676
 
 
677
   word3_muladd_2(&w0, &w2, &w1, x[ 0], x[13]);
 
678
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[12]);
 
679
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[11]);
 
680
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[10]);
 
681
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 9]);
 
682
   word3_muladd_2(&w0, &w2, &w1, x[ 5], x[ 8]);
 
683
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]);
 
684
   z[13] = w1; w1 = 0;
 
685
 
 
686
   word3_muladd_2(&w1, &w0, &w2, x[ 0], x[14]);
 
687
   word3_muladd_2(&w1, &w0, &w2, x[ 1], x[13]);
 
688
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[12]);
 
689
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[11]);
 
690
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[10]);
 
691
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 9]);
 
692
   word3_muladd_2(&w1, &w0, &w2, x[ 6], x[ 8]);
 
693
   word3_muladd  (&w1, &w0, &w2, x[ 7], x[ 7]);
 
694
   z[14] = w2; w2 = 0;
 
695
 
 
696
   word3_muladd_2(&w2, &w1, &w0, x[ 0], x[15]);
 
697
   word3_muladd_2(&w2, &w1, &w0, x[ 1], x[14]);
 
698
   word3_muladd_2(&w2, &w1, &w0, x[ 2], x[13]);
 
699
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[12]);
 
700
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[11]);
 
701
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[10]);
 
702
   word3_muladd_2(&w2, &w1, &w0, x[ 6], x[ 9]);
 
703
   word3_muladd_2(&w2, &w1, &w0, x[ 7], x[ 8]);
 
704
   z[15] = w0; w0 = 0;
 
705
 
 
706
   word3_muladd_2(&w0, &w2, &w1, x[ 1], x[15]);
 
707
   word3_muladd_2(&w0, &w2, &w1, x[ 2], x[14]);
 
708
   word3_muladd_2(&w0, &w2, &w1, x[ 3], x[13]);
 
709
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[12]);
 
710
   word3_muladd_2(&w0, &w2, &w1, x[ 5], x[11]);
 
711
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[10]);
 
712
   word3_muladd_2(&w0, &w2, &w1, x[ 7], x[ 9]);
 
713
   word3_muladd  (&w0, &w2, &w1, x[ 8], x[ 8]);
 
714
   z[16] = w1; w1 = 0;
 
715
 
 
716
   word3_muladd_2(&w1, &w0, &w2, x[ 2], x[15]);
 
717
   word3_muladd_2(&w1, &w0, &w2, x[ 3], x[14]);
 
718
   word3_muladd_2(&w1, &w0, &w2, x[ 4], x[13]);
 
719
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[12]);
 
720
   word3_muladd_2(&w1, &w0, &w2, x[ 6], x[11]);
 
721
   word3_muladd_2(&w1, &w0, &w2, x[ 7], x[10]);
 
722
   word3_muladd_2(&w1, &w0, &w2, x[ 8], x[ 9]);
 
723
   z[17] = w2; w2 = 0;
 
724
 
 
725
   word3_muladd_2(&w2, &w1, &w0, x[ 3], x[15]);
 
726
   word3_muladd_2(&w2, &w1, &w0, x[ 4], x[14]);
 
727
   word3_muladd_2(&w2, &w1, &w0, x[ 5], x[13]);
 
728
   word3_muladd_2(&w2, &w1, &w0, x[ 6], x[12]);
 
729
   word3_muladd_2(&w2, &w1, &w0, x[ 7], x[11]);
 
730
   word3_muladd_2(&w2, &w1, &w0, x[ 8], x[10]);
 
731
   word3_muladd  (&w2, &w1, &w0, x[ 9], x[ 9]);
 
732
   z[18] = w0; w0 = 0;
 
733
 
 
734
   word3_muladd_2(&w0, &w2, &w1, x[ 4], x[15]);
 
735
   word3_muladd_2(&w0, &w2, &w1, x[ 5], x[14]);
 
736
   word3_muladd_2(&w0, &w2, &w1, x[ 6], x[13]);
 
737
   word3_muladd_2(&w0, &w2, &w1, x[ 7], x[12]);
 
738
   word3_muladd_2(&w0, &w2, &w1, x[ 8], x[11]);
 
739
   word3_muladd_2(&w0, &w2, &w1, x[ 9], x[10]);
 
740
   z[19] = w1; w1 = 0;
 
741
 
 
742
   word3_muladd_2(&w1, &w0, &w2, x[ 5], x[15]);
 
743
   word3_muladd_2(&w1, &w0, &w2, x[ 6], x[14]);
 
744
   word3_muladd_2(&w1, &w0, &w2, x[ 7], x[13]);
 
745
   word3_muladd_2(&w1, &w0, &w2, x[ 8], x[12]);
 
746
   word3_muladd_2(&w1, &w0, &w2, x[ 9], x[11]);
 
747
   word3_muladd  (&w1, &w0, &w2, x[10], x[10]);
 
748
   z[20] = w2; w2 = 0;
 
749
 
 
750
   word3_muladd_2(&w2, &w1, &w0, x[ 6], x[15]);
 
751
   word3_muladd_2(&w2, &w1, &w0, x[ 7], x[14]);
 
752
   word3_muladd_2(&w2, &w1, &w0, x[ 8], x[13]);
 
753
   word3_muladd_2(&w2, &w1, &w0, x[ 9], x[12]);
 
754
   word3_muladd_2(&w2, &w1, &w0, x[10], x[11]);
 
755
   z[21] = w0; w0 = 0;
 
756
 
 
757
   word3_muladd_2(&w0, &w2, &w1, x[ 7], x[15]);
 
758
   word3_muladd_2(&w0, &w2, &w1, x[ 8], x[14]);
 
759
   word3_muladd_2(&w0, &w2, &w1, x[ 9], x[13]);
 
760
   word3_muladd_2(&w0, &w2, &w1, x[10], x[12]);
 
761
   word3_muladd  (&w0, &w2, &w1, x[11], x[11]);
 
762
   z[22] = w1; w1 = 0;
 
763
 
 
764
   word3_muladd_2(&w1, &w0, &w2, x[ 8], x[15]);
 
765
   word3_muladd_2(&w1, &w0, &w2, x[ 9], x[14]);
 
766
   word3_muladd_2(&w1, &w0, &w2, x[10], x[13]);
 
767
   word3_muladd_2(&w1, &w0, &w2, x[11], x[12]);
 
768
   z[23] = w2; w2 = 0;
 
769
 
 
770
   word3_muladd_2(&w2, &w1, &w0, x[ 9], x[15]);
 
771
   word3_muladd_2(&w2, &w1, &w0, x[10], x[14]);
 
772
   word3_muladd_2(&w2, &w1, &w0, x[11], x[13]);
 
773
   word3_muladd  (&w2, &w1, &w0, x[12], x[12]);
 
774
   z[24] = w0; w0 = 0;
 
775
 
 
776
   word3_muladd_2(&w0, &w2, &w1, x[10], x[15]);
 
777
   word3_muladd_2(&w0, &w2, &w1, x[11], x[14]);
 
778
   word3_muladd_2(&w0, &w2, &w1, x[12], x[13]);
 
779
   z[25] = w1; w1 = 0;
 
780
 
 
781
   word3_muladd_2(&w1, &w0, &w2, x[11], x[15]);
 
782
   word3_muladd_2(&w1, &w0, &w2, x[12], x[14]);
 
783
   word3_muladd  (&w1, &w0, &w2, x[13], x[13]);
 
784
   z[26] = w2; w2 = 0;
 
785
 
 
786
   word3_muladd_2(&w2, &w1, &w0, x[12], x[15]);
 
787
   word3_muladd_2(&w2, &w1, &w0, x[13], x[14]);
 
788
   z[27] = w0; w0 = 0;
 
789
 
 
790
   word3_muladd_2(&w0, &w2, &w1, x[13], x[15]);
 
791
   word3_muladd  (&w0, &w2, &w1, x[14], x[14]);
 
792
   z[28] = w1; w1 = 0;
 
793
 
 
794
   word3_muladd_2(&w1, &w0, &w2, x[14], x[15]);
 
795
   z[29] = w2; w2 = 0;
 
796
 
 
797
   word3_muladd  (&w2, &w1, &w0, x[15], x[15]);
 
798
   z[30] = w0;
 
799
   z[31] = w1;
 
800
   }
 
801
 
 
802
/*
 
803
* Comba 16x16 Multiplication
 
804
*/
 
805
void bigint_comba_mul16(word z[32], const word x[16], const word y[16])
 
806
   {
 
807
   word w2 = 0, w1 = 0, w0 = 0;
 
808
 
 
809
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]);
 
810
   z[ 0] = w0; w0 = 0;
 
811
 
 
812
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]);
 
813
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]);
 
814
   z[ 1] = w1; w1 = 0;
 
815
 
 
816
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]);
 
817
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]);
 
818
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]);
 
819
   z[ 2] = w2; w2 = 0;
 
820
 
 
821
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]);
 
822
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]);
 
823
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]);
 
824
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]);
 
825
   z[ 3] = w0; w0 = 0;
 
826
 
 
827
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]);
 
828
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]);
 
829
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]);
 
830
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]);
 
831
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]);
 
832
   z[ 4] = w1; w1 = 0;
 
833
 
 
834
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]);
 
835
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]);
 
836
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]);
 
837
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]);
 
838
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]);
 
839
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]);
 
840
   z[ 5] = w2; w2 = 0;
 
841
 
 
842
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]);
 
843
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]);
 
844
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]);
 
845
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]);
 
846
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]);
 
847
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]);
 
848
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]);
 
849
   z[ 6] = w0; w0 = 0;
 
850
 
 
851
   word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]);
 
852
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]);
 
853
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]);
 
854
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]);
 
855
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]);
 
856
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]);
 
857
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]);
 
858
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]);
 
859
   z[ 7] = w1; w1 = 0;
 
860
 
 
861
   word3_muladd(&w1, &w0, &w2, x[ 0], y[ 8]);
 
862
   word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]);
 
863
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]);
 
864
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]);
 
865
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]);
 
866
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]);
 
867
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 2]);
 
868
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 1]);
 
869
   word3_muladd(&w1, &w0, &w2, x[ 8], y[ 0]);
 
870
   z[ 8] = w2; w2 = 0;
 
871
 
 
872
   word3_muladd(&w2, &w1, &w0, x[ 0], y[ 9]);
 
873
   word3_muladd(&w2, &w1, &w0, x[ 1], y[ 8]);
 
874
   word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]);
 
875
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]);
 
876
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]);
 
877
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]);
 
878
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]);
 
879
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]);
 
880
   word3_muladd(&w2, &w1, &w0, x[ 8], y[ 1]);
 
881
   word3_muladd(&w2, &w1, &w0, x[ 9], y[ 0]);
 
882
   z[ 9] = w0; w0 = 0;
 
883
 
 
884
   word3_muladd(&w0, &w2, &w1, x[ 0], y[10]);
 
885
   word3_muladd(&w0, &w2, &w1, x[ 1], y[ 9]);
 
886
   word3_muladd(&w0, &w2, &w1, x[ 2], y[ 8]);
 
887
   word3_muladd(&w0, &w2, &w1, x[ 3], y[ 7]);
 
888
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 6]);
 
889
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]);
 
890
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 4]);
 
891
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 3]);
 
892
   word3_muladd(&w0, &w2, &w1, x[ 8], y[ 2]);
 
893
   word3_muladd(&w0, &w2, &w1, x[ 9], y[ 1]);
 
894
   word3_muladd(&w0, &w2, &w1, x[10], y[ 0]);
 
895
   z[10] = w1; w1 = 0;
 
896
 
 
897
   word3_muladd(&w1, &w0, &w2, x[ 0], y[11]);
 
898
   word3_muladd(&w1, &w0, &w2, x[ 1], y[10]);
 
899
   word3_muladd(&w1, &w0, &w2, x[ 2], y[ 9]);
 
900
   word3_muladd(&w1, &w0, &w2, x[ 3], y[ 8]);
 
901
   word3_muladd(&w1, &w0, &w2, x[ 4], y[ 7]);
 
902
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 6]);
 
903
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 5]);
 
904
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 4]);
 
905
   word3_muladd(&w1, &w0, &w2, x[ 8], y[ 3]);
 
906
   word3_muladd(&w1, &w0, &w2, x[ 9], y[ 2]);
 
907
   word3_muladd(&w1, &w0, &w2, x[10], y[ 1]);
 
908
   word3_muladd(&w1, &w0, &w2, x[11], y[ 0]);
 
909
   z[11] = w2; w2 = 0;
 
910
 
 
911
   word3_muladd(&w2, &w1, &w0, x[ 0], y[12]);
 
912
   word3_muladd(&w2, &w1, &w0, x[ 1], y[11]);
 
913
   word3_muladd(&w2, &w1, &w0, x[ 2], y[10]);
 
914
   word3_muladd(&w2, &w1, &w0, x[ 3], y[ 9]);
 
915
   word3_muladd(&w2, &w1, &w0, x[ 4], y[ 8]);
 
916
   word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]);
 
917
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]);
 
918
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]);
 
919
   word3_muladd(&w2, &w1, &w0, x[ 8], y[ 4]);
 
920
   word3_muladd(&w2, &w1, &w0, x[ 9], y[ 3]);
 
921
   word3_muladd(&w2, &w1, &w0, x[10], y[ 2]);
 
922
   word3_muladd(&w2, &w1, &w0, x[11], y[ 1]);
 
923
   word3_muladd(&w2, &w1, &w0, x[12], y[ 0]);
 
924
   z[12] = w0; w0 = 0;
 
925
 
 
926
   word3_muladd(&w0, &w2, &w1, x[ 0], y[13]);
 
927
   word3_muladd(&w0, &w2, &w1, x[ 1], y[12]);
 
928
   word3_muladd(&w0, &w2, &w1, x[ 2], y[11]);
 
929
   word3_muladd(&w0, &w2, &w1, x[ 3], y[10]);
 
930
   word3_muladd(&w0, &w2, &w1, x[ 4], y[ 9]);
 
931
   word3_muladd(&w0, &w2, &w1, x[ 5], y[ 8]);
 
932
   word3_muladd(&w0, &w2, &w1, x[ 6], y[ 7]);
 
933
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 6]);
 
934
   word3_muladd(&w0, &w2, &w1, x[ 8], y[ 5]);
 
935
   word3_muladd(&w0, &w2, &w1, x[ 9], y[ 4]);
 
936
   word3_muladd(&w0, &w2, &w1, x[10], y[ 3]);
 
937
   word3_muladd(&w0, &w2, &w1, x[11], y[ 2]);
 
938
   word3_muladd(&w0, &w2, &w1, x[12], y[ 1]);
 
939
   word3_muladd(&w0, &w2, &w1, x[13], y[ 0]);
 
940
   z[13] = w1; w1 = 0;
 
941
 
 
942
   word3_muladd(&w1, &w0, &w2, x[ 0], y[14]);
 
943
   word3_muladd(&w1, &w0, &w2, x[ 1], y[13]);
 
944
   word3_muladd(&w1, &w0, &w2, x[ 2], y[12]);
 
945
   word3_muladd(&w1, &w0, &w2, x[ 3], y[11]);
 
946
   word3_muladd(&w1, &w0, &w2, x[ 4], y[10]);
 
947
   word3_muladd(&w1, &w0, &w2, x[ 5], y[ 9]);
 
948
   word3_muladd(&w1, &w0, &w2, x[ 6], y[ 8]);
 
949
   word3_muladd(&w1, &w0, &w2, x[ 7], y[ 7]);
 
950
   word3_muladd(&w1, &w0, &w2, x[ 8], y[ 6]);
 
951
   word3_muladd(&w1, &w0, &w2, x[ 9], y[ 5]);
 
952
   word3_muladd(&w1, &w0, &w2, x[10], y[ 4]);
 
953
   word3_muladd(&w1, &w0, &w2, x[11], y[ 3]);
 
954
   word3_muladd(&w1, &w0, &w2, x[12], y[ 2]);
 
955
   word3_muladd(&w1, &w0, &w2, x[13], y[ 1]);
 
956
   word3_muladd(&w1, &w0, &w2, x[14], y[ 0]);
 
957
   z[14] = w2; w2 = 0;
 
958
 
 
959
   word3_muladd(&w2, &w1, &w0, x[ 0], y[15]);
 
960
   word3_muladd(&w2, &w1, &w0, x[ 1], y[14]);
 
961
   word3_muladd(&w2, &w1, &w0, x[ 2], y[13]);
 
962
   word3_muladd(&w2, &w1, &w0, x[ 3], y[12]);
 
963
   word3_muladd(&w2, &w1, &w0, x[ 4], y[11]);
 
964
   word3_muladd(&w2, &w1, &w0, x[ 5], y[10]);
 
965
   word3_muladd(&w2, &w1, &w0, x[ 6], y[ 9]);
 
966
   word3_muladd(&w2, &w1, &w0, x[ 7], y[ 8]);
 
967
   word3_muladd(&w2, &w1, &w0, x[ 8], y[ 7]);
 
968
   word3_muladd(&w2, &w1, &w0, x[ 9], y[ 6]);
 
969
   word3_muladd(&w2, &w1, &w0, x[10], y[ 5]);
 
970
   word3_muladd(&w2, &w1, &w0, x[11], y[ 4]);
 
971
   word3_muladd(&w2, &w1, &w0, x[12], y[ 3]);
 
972
   word3_muladd(&w2, &w1, &w0, x[13], y[ 2]);
 
973
   word3_muladd(&w2, &w1, &w0, x[14], y[ 1]);
 
974
   word3_muladd(&w2, &w1, &w0, x[15], y[ 0]);
 
975
   z[15] = w0; w0 = 0;
 
976
 
 
977
   word3_muladd(&w0, &w2, &w1, x[ 1], y[15]);
 
978
   word3_muladd(&w0, &w2, &w1, x[ 2], y[14]);
 
979
   word3_muladd(&w0, &w2, &w1, x[ 3], y[13]);
 
980
   word3_muladd(&w0, &w2, &w1, x[ 4], y[12]);
 
981
   word3_muladd(&w0, &w2, &w1, x[ 5], y[11]);
 
982
   word3_muladd(&w0, &w2, &w1, x[ 6], y[10]);
 
983
   word3_muladd(&w0, &w2, &w1, x[ 7], y[ 9]);
 
984
   word3_muladd(&w0, &w2, &w1, x[ 8], y[ 8]);
 
985
   word3_muladd(&w0, &w2, &w1, x[ 9], y[ 7]);
 
986
   word3_muladd(&w0, &w2, &w1, x[10], y[ 6]);
 
987
   word3_muladd(&w0, &w2, &w1, x[11], y[ 5]);
 
988
   word3_muladd(&w0, &w2, &w1, x[12], y[ 4]);
 
989
   word3_muladd(&w0, &w2, &w1, x[13], y[ 3]);
 
990
   word3_muladd(&w0, &w2, &w1, x[14], y[ 2]);
 
991
   word3_muladd(&w0, &w2, &w1, x[15], y[ 1]);
 
992
   z[16] = w1; w1 = 0;
 
993
 
 
994
   word3_muladd(&w1, &w0, &w2, x[ 2], y[15]);
 
995
   word3_muladd(&w1, &w0, &w2, x[ 3], y[14]);
 
996
   word3_muladd(&w1, &w0, &w2, x[ 4], y[13]);
 
997
   word3_muladd(&w1, &w0, &w2, x[ 5], y[12]);
 
998
   word3_muladd(&w1, &w0, &w2, x[ 6], y[11]);
 
999
   word3_muladd(&w1, &w0, &w2, x[ 7], y[10]);
 
1000
   word3_muladd(&w1, &w0, &w2, x[ 8], y[ 9]);
 
1001
   word3_muladd(&w1, &w0, &w2, x[ 9], y[ 8]);
 
1002
   word3_muladd(&w1, &w0, &w2, x[10], y[ 7]);
 
1003
   word3_muladd(&w1, &w0, &w2, x[11], y[ 6]);
 
1004
   word3_muladd(&w1, &w0, &w2, x[12], y[ 5]);
 
1005
   word3_muladd(&w1, &w0, &w2, x[13], y[ 4]);
 
1006
   word3_muladd(&w1, &w0, &w2, x[14], y[ 3]);
 
1007
   word3_muladd(&w1, &w0, &w2, x[15], y[ 2]);
 
1008
   z[17] = w2; w2 = 0;
 
1009
 
 
1010
   word3_muladd(&w2, &w1, &w0, x[ 3], y[15]);
 
1011
   word3_muladd(&w2, &w1, &w0, x[ 4], y[14]);
 
1012
   word3_muladd(&w2, &w1, &w0, x[ 5], y[13]);
 
1013
   word3_muladd(&w2, &w1, &w0, x[ 6], y[12]);
 
1014
   word3_muladd(&w2, &w1, &w0, x[ 7], y[11]);
 
1015
   word3_muladd(&w2, &w1, &w0, x[ 8], y[10]);
 
1016
   word3_muladd(&w2, &w1, &w0, x[ 9], y[ 9]);
 
1017
   word3_muladd(&w2, &w1, &w0, x[10], y[ 8]);
 
1018
   word3_muladd(&w2, &w1, &w0, x[11], y[ 7]);
 
1019
   word3_muladd(&w2, &w1, &w0, x[12], y[ 6]);
 
1020
   word3_muladd(&w2, &w1, &w0, x[13], y[ 5]);
 
1021
   word3_muladd(&w2, &w1, &w0, x[14], y[ 4]);
 
1022
   word3_muladd(&w2, &w1, &w0, x[15], y[ 3]);
 
1023
   z[18] = w0; w0 = 0;
 
1024
 
 
1025
   word3_muladd(&w0, &w2, &w1, x[ 4], y[15]);
 
1026
   word3_muladd(&w0, &w2, &w1, x[ 5], y[14]);
 
1027
   word3_muladd(&w0, &w2, &w1, x[ 6], y[13]);
 
1028
   word3_muladd(&w0, &w2, &w1, x[ 7], y[12]);
 
1029
   word3_muladd(&w0, &w2, &w1, x[ 8], y[11]);
 
1030
   word3_muladd(&w0, &w2, &w1, x[ 9], y[10]);
 
1031
   word3_muladd(&w0, &w2, &w1, x[10], y[ 9]);
 
1032
   word3_muladd(&w0, &w2, &w1, x[11], y[ 8]);
 
1033
   word3_muladd(&w0, &w2, &w1, x[12], y[ 7]);
 
1034
   word3_muladd(&w0, &w2, &w1, x[13], y[ 6]);
 
1035
   word3_muladd(&w0, &w2, &w1, x[14], y[ 5]);
 
1036
   word3_muladd(&w0, &w2, &w1, x[15], y[ 4]);
 
1037
   z[19] = w1; w1 = 0;
 
1038
 
 
1039
   word3_muladd(&w1, &w0, &w2, x[ 5], y[15]);
 
1040
   word3_muladd(&w1, &w0, &w2, x[ 6], y[14]);
 
1041
   word3_muladd(&w1, &w0, &w2, x[ 7], y[13]);
 
1042
   word3_muladd(&w1, &w0, &w2, x[ 8], y[12]);
 
1043
   word3_muladd(&w1, &w0, &w2, x[ 9], y[11]);
 
1044
   word3_muladd(&w1, &w0, &w2, x[10], y[10]);
 
1045
   word3_muladd(&w1, &w0, &w2, x[11], y[ 9]);
 
1046
   word3_muladd(&w1, &w0, &w2, x[12], y[ 8]);
 
1047
   word3_muladd(&w1, &w0, &w2, x[13], y[ 7]);
 
1048
   word3_muladd(&w1, &w0, &w2, x[14], y[ 6]);
 
1049
   word3_muladd(&w1, &w0, &w2, x[15], y[ 5]);
 
1050
   z[20] = w2; w2 = 0;
 
1051
 
 
1052
   word3_muladd(&w2, &w1, &w0, x[ 6], y[15]);
 
1053
   word3_muladd(&w2, &w1, &w0, x[ 7], y[14]);
 
1054
   word3_muladd(&w2, &w1, &w0, x[ 8], y[13]);
 
1055
   word3_muladd(&w2, &w1, &w0, x[ 9], y[12]);
 
1056
   word3_muladd(&w2, &w1, &w0, x[10], y[11]);
 
1057
   word3_muladd(&w2, &w1, &w0, x[11], y[10]);
 
1058
   word3_muladd(&w2, &w1, &w0, x[12], y[ 9]);
 
1059
   word3_muladd(&w2, &w1, &w0, x[13], y[ 8]);
 
1060
   word3_muladd(&w2, &w1, &w0, x[14], y[ 7]);
 
1061
   word3_muladd(&w2, &w1, &w0, x[15], y[ 6]);
 
1062
   z[21] = w0; w0 = 0;
 
1063
 
 
1064
   word3_muladd(&w0, &w2, &w1, x[ 7], y[15]);
 
1065
   word3_muladd(&w0, &w2, &w1, x[ 8], y[14]);
 
1066
   word3_muladd(&w0, &w2, &w1, x[ 9], y[13]);
 
1067
   word3_muladd(&w0, &w2, &w1, x[10], y[12]);
 
1068
   word3_muladd(&w0, &w2, &w1, x[11], y[11]);
 
1069
   word3_muladd(&w0, &w2, &w1, x[12], y[10]);
 
1070
   word3_muladd(&w0, &w2, &w1, x[13], y[ 9]);
 
1071
   word3_muladd(&w0, &w2, &w1, x[14], y[ 8]);
 
1072
   word3_muladd(&w0, &w2, &w1, x[15], y[ 7]);
 
1073
   z[22] = w1; w1 = 0;
 
1074
 
 
1075
   word3_muladd(&w1, &w0, &w2, x[ 8], y[15]);
 
1076
   word3_muladd(&w1, &w0, &w2, x[ 9], y[14]);
 
1077
   word3_muladd(&w1, &w0, &w2, x[10], y[13]);
 
1078
   word3_muladd(&w1, &w0, &w2, x[11], y[12]);
 
1079
   word3_muladd(&w1, &w0, &w2, x[12], y[11]);
 
1080
   word3_muladd(&w1, &w0, &w2, x[13], y[10]);
 
1081
   word3_muladd(&w1, &w0, &w2, x[14], y[ 9]);
 
1082
   word3_muladd(&w1, &w0, &w2, x[15], y[ 8]);
 
1083
   z[23] = w2; w2 = 0;
 
1084
 
 
1085
   word3_muladd(&w2, &w1, &w0, x[ 9], y[15]);
 
1086
   word3_muladd(&w2, &w1, &w0, x[10], y[14]);
 
1087
   word3_muladd(&w2, &w1, &w0, x[11], y[13]);
 
1088
   word3_muladd(&w2, &w1, &w0, x[12], y[12]);
 
1089
   word3_muladd(&w2, &w1, &w0, x[13], y[11]);
 
1090
   word3_muladd(&w2, &w1, &w0, x[14], y[10]);
 
1091
   word3_muladd(&w2, &w1, &w0, x[15], y[ 9]);
 
1092
   z[24] = w0; w0 = 0;
 
1093
 
 
1094
   word3_muladd(&w0, &w2, &w1, x[10], y[15]);
 
1095
   word3_muladd(&w0, &w2, &w1, x[11], y[14]);
 
1096
   word3_muladd(&w0, &w2, &w1, x[12], y[13]);
 
1097
   word3_muladd(&w0, &w2, &w1, x[13], y[12]);
 
1098
   word3_muladd(&w0, &w2, &w1, x[14], y[11]);
 
1099
   word3_muladd(&w0, &w2, &w1, x[15], y[10]);
 
1100
   z[25] = w1; w1 = 0;
 
1101
 
 
1102
   word3_muladd(&w1, &w0, &w2, x[11], y[15]);
 
1103
   word3_muladd(&w1, &w0, &w2, x[12], y[14]);
 
1104
   word3_muladd(&w1, &w0, &w2, x[13], y[13]);
 
1105
   word3_muladd(&w1, &w0, &w2, x[14], y[12]);
 
1106
   word3_muladd(&w1, &w0, &w2, x[15], y[11]);
 
1107
   z[26] = w2; w2 = 0;
 
1108
 
 
1109
   word3_muladd(&w2, &w1, &w0, x[12], y[15]);
 
1110
   word3_muladd(&w2, &w1, &w0, x[13], y[14]);
 
1111
   word3_muladd(&w2, &w1, &w0, x[14], y[13]);
 
1112
   word3_muladd(&w2, &w1, &w0, x[15], y[12]);
 
1113
   z[27] = w0; w0 = 0;
 
1114
 
 
1115
   word3_muladd(&w0, &w2, &w1, x[13], y[15]);
 
1116
   word3_muladd(&w0, &w2, &w1, x[14], y[14]);
 
1117
   word3_muladd(&w0, &w2, &w1, x[15], y[13]);
 
1118
   z[28] = w1; w1 = 0;
 
1119
 
 
1120
   word3_muladd(&w1, &w0, &w2, x[14], y[15]);
 
1121
   word3_muladd(&w1, &w0, &w2, x[15], y[14]);
 
1122
   z[29] = w2; w2 = 0;
 
1123
 
 
1124
   word3_muladd(&w2, &w1, &w0, x[15], y[15]);
 
1125
   z[30] = w0;
 
1126
   z[31] = w1;
 
1127
   }
 
1128
 
 
1129
}