Electroneum
Toggle main menu visibility
Loading...
Searching...
No Matches
ed25519-donna-32bit-sse2.h
Go to the documentation of this file.
1
#if defined(ED25519_GCC_32BIT_SSE_CHOOSE)
2
3
#define HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS
4
5
DONNA_NOINLINE
static
void
6
ge25519_scalarmult_base_choose_niels(
ge25519_niels
*t,
const
uint8_t
table[256][96],
uint32_t
pos,
signed
char
b) {
7
int32_t
breg = (
int32_t
)b;
8
uint32_t
sign = (
uint32_t
)breg >> 31;
9
uint32_t
mask = ~(sign - 1);
10
uint32_t
u = (breg + mask) ^ mask;
11
12
__asm__ __volatile__ (
13
/* ysubx+xaddy */
14
"movl %0, %%eax ;\n"
15
"movd %%eax, %%xmm6 ;\n"
16
"pshufd $0x00, %%xmm6, %%xmm6 ;\n"
17
"pxor %%xmm0, %%xmm0 ;\n"
18
"pxor %%xmm1, %%xmm1 ;\n"
19
"pxor %%xmm2, %%xmm2 ;\n"
20
"pxor %%xmm3, %%xmm3 ;\n"
21
22
/* 0 */
23
"movl $0, %%eax ;\n"
24
"movd %%eax, %%xmm7 ;\n"
25
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
26
"pcmpeqd %%xmm6, %%xmm7 ;\n"
27
"movl $1, %%ecx ;\n"
28
"movd %%ecx, %%xmm4 ;\n"
29
"pxor %%xmm5, %%xmm5 ;\n"
30
"pand %%xmm7, %%xmm4 ;\n"
31
"pand %%xmm7, %%xmm5 ;\n"
32
"por %%xmm4, %%xmm0 ;\n"
33
"por %%xmm5, %%xmm1 ;\n"
34
"por %%xmm4, %%xmm2 ;\n"
35
"por %%xmm5, %%xmm3 ;\n"
36
37
/* 1 */
38
"movl $1, %%eax ;\n"
39
"movd %%eax, %%xmm7 ;\n"
40
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
41
"pcmpeqd %%xmm6, %%xmm7 ;\n"
42
"movdqa 0(%1), %%xmm4 ;\n"
43
"movdqa 16(%1), %%xmm5 ;\n"
44
"pand %%xmm7, %%xmm4 ;\n"
45
"pand %%xmm7, %%xmm5 ;\n"
46
"por %%xmm4, %%xmm0 ;\n"
47
"por %%xmm5, %%xmm1 ;\n"
48
"movdqa 32(%1), %%xmm4 ;\n"
49
"movdqa 48(%1), %%xmm5 ;\n"
50
"pand %%xmm7, %%xmm4 ;\n"
51
"pand %%xmm7, %%xmm5 ;\n"
52
"por %%xmm4, %%xmm2 ;\n"
53
"por %%xmm5, %%xmm3 ;\n"
54
55
/* 2 */
56
"movl $2, %%eax ;\n"
57
"movd %%eax, %%xmm7 ;\n"
58
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
59
"pcmpeqd %%xmm6, %%xmm7 ;\n"
60
"movdqa 96(%1), %%xmm4 ;\n"
61
"movdqa 112(%1), %%xmm5 ;\n"
62
"pand %%xmm7, %%xmm4 ;\n"
63
"pand %%xmm7, %%xmm5 ;\n"
64
"por %%xmm4, %%xmm0 ;\n"
65
"por %%xmm5, %%xmm1 ;\n"
66
"movdqa 128(%1), %%xmm4 ;\n"
67
"movdqa 144(%1), %%xmm5 ;\n"
68
"pand %%xmm7, %%xmm4 ;\n"
69
"pand %%xmm7, %%xmm5 ;\n"
70
"por %%xmm4, %%xmm2 ;\n"
71
"por %%xmm5, %%xmm3 ;\n"
72
73
/* 3 */
74
"movl $3, %%eax ;\n"
75
"movd %%eax, %%xmm7 ;\n"
76
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
77
"pcmpeqd %%xmm6, %%xmm7 ;\n"
78
"movdqa 192(%1), %%xmm4 ;\n"
79
"movdqa 208(%1), %%xmm5 ;\n"
80
"pand %%xmm7, %%xmm4 ;\n"
81
"pand %%xmm7, %%xmm5 ;\n"
82
"por %%xmm4, %%xmm0 ;\n"
83
"por %%xmm5, %%xmm1 ;\n"
84
"movdqa 224(%1), %%xmm4 ;\n"
85
"movdqa 240(%1), %%xmm5 ;\n"
86
"pand %%xmm7, %%xmm4 ;\n"
87
"pand %%xmm7, %%xmm5 ;\n"
88
"por %%xmm4, %%xmm2 ;\n"
89
"por %%xmm5, %%xmm3 ;\n"
90
91
/* 4 */
92
"movl $4, %%eax ;\n"
93
"movd %%eax, %%xmm7 ;\n"
94
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
95
"pcmpeqd %%xmm6, %%xmm7 ;\n"
96
"movdqa 288(%1), %%xmm4 ;\n"
97
"movdqa 304(%1), %%xmm5 ;\n"
98
"pand %%xmm7, %%xmm4 ;\n"
99
"pand %%xmm7, %%xmm5 ;\n"
100
"por %%xmm4, %%xmm0 ;\n"
101
"por %%xmm5, %%xmm1 ;\n"
102
"movdqa 320(%1), %%xmm4 ;\n"
103
"movdqa 336(%1), %%xmm5 ;\n"
104
"pand %%xmm7, %%xmm4 ;\n"
105
"pand %%xmm7, %%xmm5 ;\n"
106
"por %%xmm4, %%xmm2 ;\n"
107
"por %%xmm5, %%xmm3 ;\n"
108
109
/* 5 */
110
"movl $5, %%eax ;\n"
111
"movd %%eax, %%xmm7 ;\n"
112
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
113
"pcmpeqd %%xmm6, %%xmm7 ;\n"
114
"movdqa 384(%1), %%xmm4 ;\n"
115
"movdqa 400(%1), %%xmm5 ;\n"
116
"pand %%xmm7, %%xmm4 ;\n"
117
"pand %%xmm7, %%xmm5 ;\n"
118
"por %%xmm4, %%xmm0 ;\n"
119
"por %%xmm5, %%xmm1 ;\n"
120
"movdqa 416(%1), %%xmm4 ;\n"
121
"movdqa 432(%1), %%xmm5 ;\n"
122
"pand %%xmm7, %%xmm4 ;\n"
123
"pand %%xmm7, %%xmm5 ;\n"
124
"por %%xmm4, %%xmm2 ;\n"
125
"por %%xmm5, %%xmm3 ;\n"
126
127
/* 6 */
128
"movl $6, %%eax ;\n"
129
"movd %%eax, %%xmm7 ;\n"
130
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
131
"pcmpeqd %%xmm6, %%xmm7 ;\n"
132
"movdqa 480(%1), %%xmm4 ;\n"
133
"movdqa 496(%1), %%xmm5 ;\n"
134
"pand %%xmm7, %%xmm4 ;\n"
135
"pand %%xmm7, %%xmm5 ;\n"
136
"por %%xmm4, %%xmm0 ;\n"
137
"por %%xmm5, %%xmm1 ;\n"
138
"movdqa 512(%1), %%xmm4 ;\n"
139
"movdqa 528(%1), %%xmm5 ;\n"
140
"pand %%xmm7, %%xmm4 ;\n"
141
"pand %%xmm7, %%xmm5 ;\n"
142
"por %%xmm4, %%xmm2 ;\n"
143
"por %%xmm5, %%xmm3 ;\n"
144
145
/* 7 */
146
"movl $7, %%eax ;\n"
147
"movd %%eax, %%xmm7 ;\n"
148
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
149
"pcmpeqd %%xmm6, %%xmm7 ;\n"
150
"movdqa 576(%1), %%xmm4 ;\n"
151
"movdqa 592(%1), %%xmm5 ;\n"
152
"pand %%xmm7, %%xmm4 ;\n"
153
"pand %%xmm7, %%xmm5 ;\n"
154
"por %%xmm4, %%xmm0 ;\n"
155
"por %%xmm5, %%xmm1 ;\n"
156
"movdqa 608(%1), %%xmm4 ;\n"
157
"movdqa 624(%1), %%xmm5 ;\n"
158
"pand %%xmm7, %%xmm4 ;\n"
159
"pand %%xmm7, %%xmm5 ;\n"
160
"por %%xmm4, %%xmm2 ;\n"
161
"por %%xmm5, %%xmm3 ;\n"
162
163
/* 8 */
164
"movl $8, %%eax ;\n"
165
"movd %%eax, %%xmm7 ;\n"
166
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
167
"pcmpeqd %%xmm6, %%xmm7 ;\n"
168
"movdqa 672(%1), %%xmm4 ;\n"
169
"movdqa 688(%1), %%xmm5 ;\n"
170
"pand %%xmm7, %%xmm4 ;\n"
171
"pand %%xmm7, %%xmm5 ;\n"
172
"por %%xmm4, %%xmm0 ;\n"
173
"por %%xmm5, %%xmm1 ;\n"
174
"movdqa 704(%1), %%xmm4 ;\n"
175
"movdqa 720(%1), %%xmm5 ;\n"
176
"pand %%xmm7, %%xmm4 ;\n"
177
"pand %%xmm7, %%xmm5 ;\n"
178
"por %%xmm4, %%xmm2 ;\n"
179
"por %%xmm5, %%xmm3 ;\n"
180
181
/* conditional swap based on sign */
182
"movl %3, %%ecx ;\n"
183
"movl %2, %%eax ;\n"
184
"xorl $1, %%ecx ;\n"
185
"movd %%ecx, %%xmm6 ;\n"
186
"pxor %%xmm7, %%xmm7 ;\n"
187
"pshufd $0x00, %%xmm6, %%xmm6 ;\n"
188
"pxor %%xmm0, %%xmm2 ;\n"
189
"pxor %%xmm1, %%xmm3 ;\n"
190
"pcmpeqd %%xmm6, %%xmm7 ;\n"
191
"movdqa %%xmm2, %%xmm4 ;\n"
192
"movdqa %%xmm3, %%xmm5 ;\n"
193
"pand %%xmm7, %%xmm4 ;\n"
194
"pand %%xmm7, %%xmm5 ;\n"
195
"pxor %%xmm4, %%xmm0 ;\n"
196
"pxor %%xmm5, %%xmm1 ;\n"
197
"pxor %%xmm0, %%xmm2 ;\n"
198
"pxor %%xmm1, %%xmm3 ;\n"
199
200
/* store ysubx */
201
"movd %%xmm0, %%ecx ;\n"
202
"movl %%ecx, %%edx ;\n"
203
"pshufd $0x39, %%xmm0, %%xmm0 ;\n"
204
"andl $0x3ffffff, %%ecx ;\n"
205
"movl %%ecx, 0(%%eax) ;\n"
206
"movd %%xmm0, %%ecx ;\n"
207
"pshufd $0x39, %%xmm0, %%xmm0 ;\n"
208
"shrdl $26, %%ecx, %%edx ;\n"
209
"andl $0x1ffffff, %%edx ;\n"
210
"movl %%edx, 4(%%eax) ;\n"
211
"movd %%xmm0, %%edx ;\n"
212
"pshufd $0x39, %%xmm0, %%xmm0 ;\n"
213
"shrdl $19, %%edx, %%ecx ;\n"
214
"andl $0x3ffffff, %%ecx ;\n"
215
"movl %%ecx, 8(%%eax) ;\n"
216
"movd %%xmm0, %%ecx ;\n"
217
"shrdl $13, %%ecx, %%edx ;\n"
218
"andl $0x1ffffff, %%edx ;\n"
219
"movl %%edx, 12(%%eax) ;\n"
220
"movd %%xmm1, %%edx ;\n"
221
"pshufd $0x39, %%xmm1, %%xmm1 ;\n"
222
"shrl $6, %%ecx ;\n"
223
"andl $0x3ffffff, %%ecx ;\n"
224
"movl %%ecx, 16(%%eax) ;\n"
225
"movl %%edx, %%ecx ;\n"
226
"andl $0x1ffffff, %%edx ;\n"
227
"movl %%edx, 20(%%eax) ;\n"
228
"movd %%xmm1, %%edx ;\n"
229
"pshufd $0x39, %%xmm1, %%xmm1 ;\n"
230
"shrdl $25, %%edx, %%ecx ;\n"
231
"andl $0x3ffffff, %%ecx ;\n"
232
"movl %%ecx, 24(%%eax) ;\n"
233
"movd %%xmm1, %%ecx ;\n"
234
"pshufd $0x39, %%xmm1, %%xmm1 ;\n"
235
"shrdl $19, %%ecx, %%edx ;\n"
236
"andl $0x1ffffff, %%edx ;\n"
237
"movl %%edx, 28(%%eax) ;\n"
238
"movd %%xmm1, %%edx ;\n"
239
"shrdl $12, %%edx, %%ecx ;\n"
240
"andl $0x3ffffff, %%ecx ;\n"
241
"movl %%ecx, 32(%%eax) ;\n"
242
"shrl $6, %%edx ;\n"
243
"andl $0x1ffffff, %%edx ;\n"
244
"xorl %%ecx, %%ecx ;\n"
245
"movl %%edx, 36(%%eax) ;\n"
246
"movl %%ecx, 40(%%eax) ;\n"
247
"movl %%ecx, 44(%%eax) ;\n"
248
249
/* store xaddy */
250
"addl $48, %%eax ;\n"
251
"movdqa %%xmm2, %%xmm0 ;\n"
252
"movdqa %%xmm3, %%xmm1 ;\n"
253
"movd %%xmm0, %%ecx ;\n"
254
"movl %%ecx, %%edx ;\n"
255
"pshufd $0x39, %%xmm0, %%xmm0 ;\n"
256
"andl $0x3ffffff, %%ecx ;\n"
257
"movl %%ecx, 0(%%eax) ;\n"
258
"movd %%xmm0, %%ecx ;\n"
259
"pshufd $0x39, %%xmm0, %%xmm0 ;\n"
260
"shrdl $26, %%ecx, %%edx ;\n"
261
"andl $0x1ffffff, %%edx ;\n"
262
"movl %%edx, 4(%%eax) ;\n"
263
"movd %%xmm0, %%edx ;\n"
264
"pshufd $0x39, %%xmm0, %%xmm0 ;\n"
265
"shrdl $19, %%edx, %%ecx ;\n"
266
"andl $0x3ffffff, %%ecx ;\n"
267
"movl %%ecx, 8(%%eax) ;\n"
268
"movd %%xmm0, %%ecx ;\n"
269
"shrdl $13, %%ecx, %%edx ;\n"
270
"andl $0x1ffffff, %%edx ;\n"
271
"movl %%edx, 12(%%eax) ;\n"
272
"movd %%xmm1, %%edx ;\n"
273
"pshufd $0x39, %%xmm1, %%xmm1 ;\n"
274
"shrl $6, %%ecx ;\n"
275
"andl $0x3ffffff, %%ecx ;\n"
276
"movl %%ecx, 16(%%eax) ;\n"
277
"movl %%edx, %%ecx ;\n"
278
"andl $0x1ffffff, %%edx ;\n"
279
"movl %%edx, 20(%%eax) ;\n"
280
"movd %%xmm1, %%edx ;\n"
281
"pshufd $0x39, %%xmm1, %%xmm1 ;\n"
282
"shrdl $25, %%edx, %%ecx ;\n"
283
"andl $0x3ffffff, %%ecx ;\n"
284
"movl %%ecx, 24(%%eax) ;\n"
285
"movd %%xmm1, %%ecx ;\n"
286
"pshufd $0x39, %%xmm1, %%xmm1 ;\n"
287
"shrdl $19, %%ecx, %%edx ;\n"
288
"andl $0x1ffffff, %%edx ;\n"
289
"movl %%edx, 28(%%eax) ;\n"
290
"movd %%xmm1, %%edx ;\n"
291
"shrdl $12, %%edx, %%ecx ;\n"
292
"andl $0x3ffffff, %%ecx ;\n"
293
"movl %%ecx, 32(%%eax) ;\n"
294
"shrl $6, %%edx ;\n"
295
"andl $0x1ffffff, %%edx ;\n"
296
"xorl %%ecx, %%ecx ;\n"
297
"movl %%edx, 36(%%eax) ;\n"
298
"movl %%ecx, 40(%%eax) ;\n"
299
"movl %%ecx, 44(%%eax) ;\n"
300
301
/* t2d */
302
"movl %0, %%eax ;\n"
303
"movd %%eax, %%xmm6 ;\n"
304
"pshufd $0x00, %%xmm6, %%xmm6 ;\n"
305
"pxor %%xmm0, %%xmm0 ;\n"
306
"pxor %%xmm1, %%xmm1 ;\n"
307
308
/* 0 */
309
"movl $0, %%eax ;\n"
310
"movd %%eax, %%xmm7 ;\n"
311
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
312
"pcmpeqd %%xmm6, %%xmm7 ;\n"
313
"pxor %%xmm0, %%xmm0 ;\n"
314
"pxor %%xmm1, %%xmm1 ;\n"
315
316
/* 1 */
317
"movl $1, %%eax ;\n"
318
"movd %%eax, %%xmm7 ;\n"
319
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
320
"pcmpeqd %%xmm6, %%xmm7 ;\n"
321
"movdqa 64(%1), %%xmm3 ;\n"
322
"movdqa 80(%1), %%xmm4 ;\n"
323
"pand %%xmm7, %%xmm3 ;\n"
324
"pand %%xmm7, %%xmm4 ;\n"
325
"por %%xmm3, %%xmm0 ;\n"
326
"por %%xmm4, %%xmm1 ;\n"
327
328
/* 2 */
329
"movl $2, %%eax ;\n"
330
"movd %%eax, %%xmm7 ;\n"
331
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
332
"pcmpeqd %%xmm6, %%xmm7 ;\n"
333
"movdqa 160(%1), %%xmm3 ;\n"
334
"movdqa 176(%1), %%xmm4 ;\n"
335
"pand %%xmm7, %%xmm3 ;\n"
336
"pand %%xmm7, %%xmm4 ;\n"
337
"por %%xmm3, %%xmm0 ;\n"
338
"por %%xmm4, %%xmm1 ;\n"
339
340
/* 3 */
341
"movl $3, %%eax ;\n"
342
"movd %%eax, %%xmm7 ;\n"
343
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
344
"pcmpeqd %%xmm6, %%xmm7 ;\n"
345
"movdqa 256(%1), %%xmm3 ;\n"
346
"movdqa 272(%1), %%xmm4 ;\n"
347
"pand %%xmm7, %%xmm3 ;\n"
348
"pand %%xmm7, %%xmm4 ;\n"
349
"por %%xmm3, %%xmm0 ;\n"
350
"por %%xmm4, %%xmm1 ;\n"
351
352
/* 4 */
353
"movl $4, %%eax ;\n"
354
"movd %%eax, %%xmm7 ;\n"
355
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
356
"pcmpeqd %%xmm6, %%xmm7 ;\n"
357
"movdqa 352(%1), %%xmm3 ;\n"
358
"movdqa 368(%1), %%xmm4 ;\n"
359
"pand %%xmm7, %%xmm3 ;\n"
360
"pand %%xmm7, %%xmm4 ;\n"
361
"por %%xmm3, %%xmm0 ;\n"
362
"por %%xmm4, %%xmm1 ;\n"
363
364
/* 5 */
365
"movl $5, %%eax ;\n"
366
"movd %%eax, %%xmm7 ;\n"
367
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
368
"pcmpeqd %%xmm6, %%xmm7 ;\n"
369
"movdqa 448(%1), %%xmm3 ;\n"
370
"movdqa 464(%1), %%xmm4 ;\n"
371
"pand %%xmm7, %%xmm3 ;\n"
372
"pand %%xmm7, %%xmm4 ;\n"
373
"por %%xmm3, %%xmm0 ;\n"
374
"por %%xmm4, %%xmm1 ;\n"
375
376
/* 6 */
377
"movl $6, %%eax ;\n"
378
"movd %%eax, %%xmm7 ;\n"
379
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
380
"pcmpeqd %%xmm6, %%xmm7 ;\n"
381
"movdqa 544(%1), %%xmm3 ;\n"
382
"movdqa 560(%1), %%xmm4 ;\n"
383
"pand %%xmm7, %%xmm3 ;\n"
384
"pand %%xmm7, %%xmm4 ;\n"
385
"por %%xmm3, %%xmm0 ;\n"
386
"por %%xmm4, %%xmm1 ;\n"
387
388
/* 7 */
389
"movl $7, %%eax ;\n"
390
"movd %%eax, %%xmm7 ;\n"
391
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
392
"pcmpeqd %%xmm6, %%xmm7 ;\n"
393
"movdqa 640(%1), %%xmm3 ;\n"
394
"movdqa 656(%1), %%xmm4 ;\n"
395
"pand %%xmm7, %%xmm3 ;\n"
396
"pand %%xmm7, %%xmm4 ;\n"
397
"por %%xmm3, %%xmm0 ;\n"
398
"por %%xmm4, %%xmm1 ;\n"
399
400
/* 8 */
401
"movl $8, %%eax ;\n"
402
"movd %%eax, %%xmm7 ;\n"
403
"pshufd $0x00, %%xmm7, %%xmm7 ;\n"
404
"pcmpeqd %%xmm6, %%xmm7 ;\n"
405
"movdqa 736(%1), %%xmm3 ;\n"
406
"movdqa 752(%1), %%xmm4 ;\n"
407
"pand %%xmm7, %%xmm3 ;\n"
408
"pand %%xmm7, %%xmm4 ;\n"
409
"por %%xmm3, %%xmm0 ;\n"
410
"por %%xmm4, %%xmm1 ;\n"
411
412
/* store t2d */
413
"movl %2, %%eax ;\n"
414
"addl $96, %%eax ;\n"
415
"movd %%xmm0, %%ecx ;\n"
416
"movl %%ecx, %%edx ;\n"
417
"pshufd $0x39, %%xmm0, %%xmm0 ;\n"
418
"andl $0x3ffffff, %%ecx ;\n"
419
"movl %%ecx, 0(%%eax) ;\n"
420
"movd %%xmm0, %%ecx ;\n"
421
"pshufd $0x39, %%xmm0, %%xmm0 ;\n"
422
"shrdl $26, %%ecx, %%edx ;\n"
423
"andl $0x1ffffff, %%edx ;\n"
424
"movl %%edx, 4(%%eax) ;\n"
425
"movd %%xmm0, %%edx ;\n"
426
"pshufd $0x39, %%xmm0, %%xmm0 ;\n"
427
"shrdl $19, %%edx, %%ecx ;\n"
428
"andl $0x3ffffff, %%ecx ;\n"
429
"movl %%ecx, 8(%%eax) ;\n"
430
"movd %%xmm0, %%ecx ;\n"
431
"shrdl $13, %%ecx, %%edx ;\n"
432
"andl $0x1ffffff, %%edx ;\n"
433
"movl %%edx, 12(%%eax) ;\n"
434
"movd %%xmm1, %%edx ;\n"
435
"pshufd $0x39, %%xmm1, %%xmm1 ;\n"
436
"shrl $6, %%ecx ;\n"
437
"andl $0x3ffffff, %%ecx ;\n"
438
"movl %%ecx, 16(%%eax) ;\n"
439
"movl %%edx, %%ecx ;\n"
440
"andl $0x1ffffff, %%edx ;\n"
441
"movl %%edx, 20(%%eax) ;\n"
442
"movd %%xmm1, %%edx ;\n"
443
"pshufd $0x39, %%xmm1, %%xmm1 ;\n"
444
"shrdl $25, %%edx, %%ecx ;\n"
445
"andl $0x3ffffff, %%ecx ;\n"
446
"movl %%ecx, 24(%%eax) ;\n"
447
"movd %%xmm1, %%ecx ;\n"
448
"pshufd $0x39, %%xmm1, %%xmm1 ;\n"
449
"shrdl $19, %%ecx, %%edx ;\n"
450
"andl $0x1ffffff, %%edx ;\n"
451
"movl %%edx, 28(%%eax) ;\n"
452
"movd %%xmm1, %%edx ;\n"
453
"movd %%xmm1, %%edx ;\n"
454
"shrdl $12, %%edx, %%ecx ;\n"
455
"andl $0x3ffffff, %%ecx ;\n"
456
"movl %%ecx, 32(%%eax) ;\n"
457
"shrl $6, %%edx ;\n"
458
"andl $0x1ffffff, %%edx ;\n"
459
"xorl %%ecx, %%ecx ;\n"
460
"movl %%edx, 36(%%eax) ;\n"
461
"movl %%ecx, 40(%%eax) ;\n"
462
"movl %%ecx, 44(%%eax) ;\n"
463
"movdqa 0(%%eax), %%xmm0 ;\n"
464
"movdqa 16(%%eax), %%xmm1 ;\n"
465
"movdqa 32(%%eax), %%xmm2 ;\n"
466
467
/* conditionally negate t2d */
468
469
/* set up 2p in to 3/4 */
470
"movl $0x7ffffda, %%ecx ;\n"
471
"movl $0x3fffffe, %%edx ;\n"
472
"movd %%ecx, %%xmm3 ;\n"
473
"movd %%edx, %%xmm5 ;\n"
474
"movl $0x7fffffe, %%ecx ;\n"
475
"movd %%ecx, %%xmm4 ;\n"
476
"punpckldq %%xmm5, %%xmm3 ;\n"
477
"punpckldq %%xmm5, %%xmm4 ;\n"
478
"punpcklqdq %%xmm4, %%xmm3 ;\n"
479
"movdqa %%xmm4, %%xmm5 ;\n"
480
"punpcklqdq %%xmm4, %%xmm4 ;\n"
481
482
/* subtract and conditionally move */
483
"movl %3, %%ecx ;\n"
484
"sub $1, %%ecx ;\n"
485
"movd %%ecx, %%xmm6 ;\n"
486
"pshufd $0x00, %%xmm6, %%xmm6 ;\n"
487
"movdqa %%xmm6, %%xmm7 ;\n"
488
"psubd %%xmm0, %%xmm3 ;\n"
489
"psubd %%xmm1, %%xmm4 ;\n"
490
"psubd %%xmm2, %%xmm5 ;\n"
491
"pand %%xmm6, %%xmm0 ;\n"
492
"pand %%xmm6, %%xmm1 ;\n"
493
"pand %%xmm6, %%xmm2 ;\n"
494
"pandn %%xmm3, %%xmm6 ;\n"
495
"movdqa %%xmm7, %%xmm3 ;\n"
496
"pandn %%xmm4, %%xmm7 ;\n"
497
"pandn %%xmm5, %%xmm3 ;\n"
498
"por %%xmm6, %%xmm0 ;\n"
499
"por %%xmm7, %%xmm1 ;\n"
500
"por %%xmm3, %%xmm2 ;\n"
501
502
/* store */
503
"movdqa %%xmm0, 0(%%eax) ;\n"
504
"movdqa %%xmm1, 16(%%eax) ;\n"
505
"movdqa %%xmm2, 32(%%eax) ;\n"
506
:
507
:
"m"
(u),
"r"
(&table[pos * 8]),
"m"
(t),
"m"
(sign)
/* %0 = u, %1 = table, %2 = t, %3 = sign */
508
:
"%eax"
,
"%ecx"
,
"%edx"
,
"%xmm0"
,
"%xmm1"
,
"%xmm2"
,
"%xmm3"
,
"%xmm4"
,
"%xmm5"
,
"%xmm6"
,
"%xmm7"
,
"cc"
,
"memory"
509
);
510
}
511
512
#endif
/* defined(ED25519_GCC_32BIT_SSE_CHOOSE) */
513
DONNA_NOINLINE
#define DONNA_NOINLINE
Definition
ed25519-donna-portable.h:22
ge25519_niels
struct ge25519_niels_t ge25519_niels
uint32_t
unsigned int uint32_t
Definition
stdint.h:126
int32_t
signed int int32_t
Definition
stdint.h:123
uint8_t
unsigned char uint8_t
Definition
stdint.h:124
external
ed25519-donna
ed25519-donna-32bit-sse2.h
Generated on
for Electroneum by
1.17.0