Update the imported curve448 code to use OpenSSL copyright headers
[openssl.git] / crypto / ec / curve448 / arch_x86_64 / f_impl.c
1 /*
2  * Copyright 2017 The OpenSSL Project Authors. All Rights Reserved.
3  * Copyright 2014 Cryptography Research, Inc.
4  *
5  * Licensed under the OpenSSL license (the "License").  You may not use
6  * this file except in compliance with the License.  You can obtain a copy
7  * in the file LICENSE in the source distribution or at
8  * https://www.openssl.org/source/license.html
9  *
10  * Originally written by Mike Hamburg
11  */
12
13 #include "f_field.h"
14
15 void gf_mul (gf_s *__restrict__ cs, const gf as, const gf bs) {
16     const uint64_t *a = as->limb, *b = bs->limb;
17     uint64_t *c = cs->limb;
18
19     __uint128_t accum0 = 0, accum1 = 0, accum2;
20     uint64_t mask = (1ull<<56) - 1;  
21
22     uint64_t aa[4] VECTOR_ALIGNED, bb[4] VECTOR_ALIGNED, bbb[4] VECTOR_ALIGNED;
23
24     /* For some reason clang doesn't vectorize this without prompting? */
25     unsigned int i;
26     for (i=0; i<sizeof(aa)/sizeof(uint64xn_t); i++) {
27         ((uint64xn_t*)aa)[i] = ((const uint64xn_t*)a)[i] + ((const uint64xn_t*)(&a[4]))[i];
28         ((uint64xn_t*)bb)[i] = ((const uint64xn_t*)b)[i] + ((const uint64xn_t*)(&b[4]))[i]; 
29         ((uint64xn_t*)bbb)[i] = ((const uint64xn_t*)bb)[i] + ((const uint64xn_t*)(&b[4]))[i];     
30     }
31     /*
32     for (int i=0; i<4; i++) {
33     aa[i] = a[i] + a[i+4];
34     bb[i] = b[i] + b[i+4];
35     }
36     */
37
38     accum2  = widemul(&a[0],&b[3]);
39     accum0  = widemul(&aa[0],&bb[3]);
40     accum1  = widemul(&a[4],&b[7]);
41
42     mac(&accum2, &a[1], &b[2]);
43     mac(&accum0, &aa[1], &bb[2]);
44     mac(&accum1, &a[5], &b[6]);
45
46     mac(&accum2, &a[2], &b[1]);
47     mac(&accum0, &aa[2], &bb[1]);
48     mac(&accum1, &a[6], &b[5]);
49
50     mac(&accum2, &a[3], &b[0]);
51     mac(&accum0, &aa[3], &bb[0]);
52     mac(&accum1, &a[7], &b[4]);
53
54     accum0 -= accum2;
55     accum1 += accum2;
56
57     c[3] = ((uint64_t)(accum1)) & mask;
58     c[7] = ((uint64_t)(accum0)) & mask;
59
60     accum0 >>= 56;
61     accum1 >>= 56;
62     
63     mac(&accum0, &aa[1],&bb[3]);
64     mac(&accum1, &a[5], &b[7]);
65     mac(&accum0, &aa[2], &bb[2]);
66     mac(&accum1, &a[6], &b[6]);
67     mac(&accum0, &aa[3], &bb[1]);
68     accum1 += accum0;
69
70     accum2 = widemul(&a[0],&b[0]);
71     accum1 -= accum2;
72     accum0 += accum2;
73     
74     msb(&accum0, &a[1], &b[3]);
75     msb(&accum0, &a[2], &b[2]);
76     mac(&accum1, &a[7], &b[5]);
77     msb(&accum0, &a[3], &b[1]);
78     mac(&accum1, &aa[0], &bb[0]);
79     mac(&accum0, &a[4], &b[4]);
80
81     c[0] = ((uint64_t)(accum0)) & mask;
82     c[4] = ((uint64_t)(accum1)) & mask;
83
84     accum0 >>= 56;
85     accum1 >>= 56;
86
87     accum2  = widemul(&a[2],&b[7]);
88     mac(&accum0, &a[6], &bb[3]);
89     mac(&accum1, &aa[2], &bbb[3]);
90
91     mac(&accum2, &a[3], &b[6]);
92     mac(&accum0, &a[7], &bb[2]);
93     mac(&accum1, &aa[3], &bbb[2]);
94
95     mac(&accum2, &a[0],&b[1]);
96     mac(&accum1, &aa[0], &bb[1]);
97     mac(&accum0, &a[4], &b[5]);
98
99     mac(&accum2, &a[1], &b[0]);
100     mac(&accum1, &aa[1], &bb[0]);
101     mac(&accum0, &a[5], &b[4]);
102
103     accum1 -= accum2;
104     accum0 += accum2;
105
106     c[1] = ((uint64_t)(accum0)) & mask;
107     c[5] = ((uint64_t)(accum1)) & mask;
108
109     accum0 >>= 56;
110     accum1 >>= 56;
111
112     accum2  = widemul(&a[3],&b[7]);
113     mac(&accum0, &a[7], &bb[3]);
114     mac(&accum1, &aa[3], &bbb[3]);
115
116     mac(&accum2, &a[0],&b[2]);
117     mac(&accum1, &aa[0], &bb[2]);
118     mac(&accum0, &a[4], &b[6]);
119
120     mac(&accum2, &a[1], &b[1]);
121     mac(&accum1, &aa[1], &bb[1]);
122     mac(&accum0, &a[5], &b[5]);
123
124     mac(&accum2, &a[2], &b[0]);
125     mac(&accum1, &aa[2], &bb[0]);
126     mac(&accum0, &a[6], &b[4]);
127
128     accum1 -= accum2;
129     accum0 += accum2;
130
131     c[2] = ((uint64_t)(accum0)) & mask;
132     c[6] = ((uint64_t)(accum1)) & mask;
133
134     accum0 >>= 56;
135     accum1 >>= 56;
136
137     accum0 += c[3];
138     accum1 += c[7];
139     c[3] = ((uint64_t)(accum0)) & mask;
140     c[7] = ((uint64_t)(accum1)) & mask;
141
142     /* we could almost stop here, but it wouldn't be stable, so... */
143
144     accum0 >>= 56;
145     accum1 >>= 56;
146     c[4] += ((uint64_t)(accum0)) + ((uint64_t)(accum1));
147     c[0] += ((uint64_t)(accum1));
148 }
149
150 void gf_mulw_unsigned (gf_s *__restrict__ cs, const gf as, uint32_t b) {
151     const uint64_t *a = as->limb;
152     uint64_t *c = cs->limb;
153
154     __uint128_t accum0, accum4;
155     uint64_t mask = (1ull<<56) - 1;  
156
157     accum0 = widemul_rm(b, &a[0]);
158     accum4 = widemul_rm(b, &a[4]);
159
160     c[0] = accum0 & mask; accum0 >>= 56;
161     c[4] = accum4 & mask; accum4 >>= 56;
162
163     mac_rm(&accum0, b, &a[1]);
164     mac_rm(&accum4, b, &a[5]);
165
166     c[1] = accum0 & mask; accum0 >>= 56;
167     c[5] = accum4 & mask; accum4 >>= 56;
168
169     mac_rm(&accum0, b, &a[2]);
170     mac_rm(&accum4, b, &a[6]);
171
172     c[2] = accum0 & mask; accum0 >>= 56;
173     c[6] = accum4 & mask; accum4 >>= 56;
174
175     mac_rm(&accum0, b, &a[3]);
176     mac_rm(&accum4, b, &a[7]);
177
178     c[3] = accum0 & mask; accum0 >>= 56;
179     c[7] = accum4 & mask; accum4 >>= 56;
180     
181     accum0 += accum4 + c[4];
182     c[4] = accum0 & mask;
183     c[5] += accum0 >> 56;
184
185     accum4 += c[0];
186     c[0] = accum4 & mask;
187     c[1] += accum4 >> 56;
188 }
189
190 void gf_sqr (gf_s *__restrict__ cs, const gf as) {
191     const uint64_t *a = as->limb;
192     uint64_t *c = cs->limb;
193
194     __uint128_t accum0 = 0, accum1 = 0, accum2;
195     uint64_t mask = (1ull<<56) - 1;  
196
197     uint64_t aa[4] VECTOR_ALIGNED;
198
199     /* For some reason clang doesn't vectorize this without prompting? */
200     unsigned int i;
201     for (i=0; i<sizeof(aa)/sizeof(uint64xn_t); i++) {
202       ((uint64xn_t*)aa)[i] = ((const uint64xn_t*)a)[i] + ((const uint64xn_t*)(&a[4]))[i];
203     }
204
205     accum2  = widemul(&a[0],&a[3]);
206     accum0  = widemul(&aa[0],&aa[3]);
207     accum1  = widemul(&a[4],&a[7]);
208
209     mac(&accum2, &a[1], &a[2]);
210     mac(&accum0, &aa[1], &aa[2]);
211     mac(&accum1, &a[5], &a[6]);
212
213     accum0 -= accum2;
214     accum1 += accum2;
215
216     c[3] = ((uint64_t)(accum1))<<1 & mask;
217     c[7] = ((uint64_t)(accum0))<<1 & mask;
218
219     accum0 >>= 55;
220     accum1 >>= 55;
221
222     mac2(&accum0, &aa[1],&aa[3]);
223     mac2(&accum1, &a[5], &a[7]);
224     mac(&accum0, &aa[2], &aa[2]);
225     accum1 += accum0;
226
227     msb2(&accum0, &a[1], &a[3]);
228     mac(&accum1, &a[6], &a[6]);
229     
230     accum2 = widemul(&a[0],&a[0]);
231     accum1 -= accum2;
232     accum0 += accum2;
233
234     msb(&accum0, &a[2], &a[2]);
235     mac(&accum1, &aa[0], &aa[0]);
236     mac(&accum0, &a[4], &a[4]);
237
238     c[0] = ((uint64_t)(accum0)) & mask;
239     c[4] = ((uint64_t)(accum1)) & mask;
240
241     accum0 >>= 56;
242     accum1 >>= 56;
243
244     accum2  = widemul2(&aa[2],&aa[3]);
245     msb2(&accum0, &a[2], &a[3]);
246     mac2(&accum1, &a[6], &a[7]);
247
248     accum1 += accum2;
249     accum0 += accum2;
250
251     accum2  = widemul2(&a[0],&a[1]);
252     mac2(&accum1, &aa[0], &aa[1]);
253     mac2(&accum0, &a[4], &a[5]);
254
255     accum1 -= accum2;
256     accum0 += accum2;
257
258     c[1] = ((uint64_t)(accum0)) & mask;
259     c[5] = ((uint64_t)(accum1)) & mask;
260
261     accum0 >>= 56;
262     accum1 >>= 56;
263
264     accum2  = widemul(&aa[3],&aa[3]);
265     msb(&accum0, &a[3], &a[3]);
266     mac(&accum1, &a[7], &a[7]);
267
268     accum1 += accum2;
269     accum0 += accum2;
270
271     accum2  = widemul2(&a[0],&a[2]);
272     mac2(&accum1, &aa[0], &aa[2]);
273     mac2(&accum0, &a[4], &a[6]);
274
275     mac(&accum2, &a[1], &a[1]);
276     mac(&accum1, &aa[1], &aa[1]);
277     mac(&accum0, &a[5], &a[5]);
278
279     accum1 -= accum2;
280     accum0 += accum2;
281
282     c[2] = ((uint64_t)(accum0)) & mask;
283     c[6] = ((uint64_t)(accum1)) & mask;
284
285     accum0 >>= 56;
286     accum1 >>= 56;
287
288     accum0 += c[3];
289     accum1 += c[7];
290     c[3] = ((uint64_t)(accum0)) & mask;
291     c[7] = ((uint64_t)(accum1)) & mask;
292
293     /* we could almost stop here, but it wouldn't be stable, so... */
294
295     accum0 >>= 56;
296     accum1 >>= 56;
297     c[4] += ((uint64_t)(accum0)) + ((uint64_t)(accum1));
298     c[0] += ((uint64_t)(accum1));
299 }