Electroneum
Toggle main menu visibility
Loading...
Searching...
No Matches
ed25519-donna-64bit-x86.h
Go to the documentation of this file.
1
#if defined(ED25519_GCC_64BIT_X86_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
int64_t
breg = (
int64_t
)b;
8
uint64_t
sign = (
uint64_t
)breg >> 63;
9
uint64_t
mask = ~(sign - 1);
10
uint64_t
u = (breg + mask) ^ mask;
11
12
__asm__ __volatile__ (
13
/* ysubx+xaddy+t2d */
14
"movq %0, %%rax ;\n"
15
"movd %%rax, %%xmm14 ;\n"
16
"pshufd $0x00, %%xmm14, %%xmm14 ;\n"
17
"pxor %%xmm0, %%xmm0 ;\n"
18
"pxor %%xmm1, %%xmm1 ;\n"
19
"pxor %%xmm2, %%xmm2 ;\n"
20
"pxor %%xmm3, %%xmm3 ;\n"
21
"pxor %%xmm4, %%xmm4 ;\n"
22
"pxor %%xmm5, %%xmm5 ;\n"
23
24
/* 0 */
25
"movq $0, %%rax ;\n"
26
"movd %%rax, %%xmm15 ;\n"
27
"pshufd $0x00, %%xmm15, %%xmm15 ;\n"
28
"pcmpeqd %%xmm14, %%xmm15 ;\n"
29
"movq $1, %%rax ;\n"
30
"movd %%rax, %%xmm6 ;\n"
31
"pxor %%xmm7, %%xmm7 ;\n"
32
"pand %%xmm15, %%xmm6 ;\n"
33
"pand %%xmm15, %%xmm7 ;\n"
34
"por %%xmm6, %%xmm0 ;\n"
35
"por %%xmm7, %%xmm1 ;\n"
36
"por %%xmm6, %%xmm2 ;\n"
37
"por %%xmm7, %%xmm3 ;\n"
38
39
/* 1 */
40
"movq $1, %%rax ;\n"
41
"movd %%rax, %%xmm15 ;\n"
42
"pshufd $0x00, %%xmm15, %%xmm15 ;\n"
43
"pcmpeqd %%xmm14, %%xmm15 ;\n"
44
"movdqa 0(%1), %%xmm6 ;\n"
45
"movdqa 16(%1), %%xmm7 ;\n"
46
"movdqa 32(%1), %%xmm8 ;\n"
47
"movdqa 48(%1), %%xmm9 ;\n"
48
"movdqa 64(%1), %%xmm10 ;\n"
49
"movdqa 80(%1), %%xmm11 ;\n"
50
"pand %%xmm15, %%xmm6 ;\n"
51
"pand %%xmm15, %%xmm7 ;\n"
52
"pand %%xmm15, %%xmm8 ;\n"
53
"pand %%xmm15, %%xmm9 ;\n"
54
"pand %%xmm15, %%xmm10 ;\n"
55
"pand %%xmm15, %%xmm11 ;\n"
56
"por %%xmm6, %%xmm0 ;\n"
57
"por %%xmm7, %%xmm1 ;\n"
58
"por %%xmm8, %%xmm2 ;\n"
59
"por %%xmm9, %%xmm3 ;\n"
60
"por %%xmm10, %%xmm4 ;\n"
61
"por %%xmm11, %%xmm5 ;\n"
62
63
/* 2 */
64
"movq $2, %%rax ;\n"
65
"movd %%rax, %%xmm15 ;\n"
66
"pshufd $0x00, %%xmm15, %%xmm15 ;\n"
67
"pcmpeqd %%xmm14, %%xmm15 ;\n"
68
"movdqa 96(%1), %%xmm6 ;\n"
69
"movdqa 112(%1), %%xmm7 ;\n"
70
"movdqa 128(%1), %%xmm8 ;\n"
71
"movdqa 144(%1), %%xmm9 ;\n"
72
"movdqa 160(%1), %%xmm10 ;\n"
73
"movdqa 176(%1), %%xmm11 ;\n"
74
"pand %%xmm15, %%xmm6 ;\n"
75
"pand %%xmm15, %%xmm7 ;\n"
76
"pand %%xmm15, %%xmm8 ;\n"
77
"pand %%xmm15, %%xmm9 ;\n"
78
"pand %%xmm15, %%xmm10 ;\n"
79
"pand %%xmm15, %%xmm11 ;\n"
80
"por %%xmm6, %%xmm0 ;\n"
81
"por %%xmm7, %%xmm1 ;\n"
82
"por %%xmm8, %%xmm2 ;\n"
83
"por %%xmm9, %%xmm3 ;\n"
84
"por %%xmm10, %%xmm4 ;\n"
85
"por %%xmm11, %%xmm5 ;\n"
86
87
/* 3 */
88
"movq $3, %%rax ;\n"
89
"movd %%rax, %%xmm15 ;\n"
90
"pshufd $0x00, %%xmm15, %%xmm15 ;\n"
91
"pcmpeqd %%xmm14, %%xmm15 ;\n"
92
"movdqa 192(%1), %%xmm6 ;\n"
93
"movdqa 208(%1), %%xmm7 ;\n"
94
"movdqa 224(%1), %%xmm8 ;\n"
95
"movdqa 240(%1), %%xmm9 ;\n"
96
"movdqa 256(%1), %%xmm10 ;\n"
97
"movdqa 272(%1), %%xmm11 ;\n"
98
"pand %%xmm15, %%xmm6 ;\n"
99
"pand %%xmm15, %%xmm7 ;\n"
100
"pand %%xmm15, %%xmm8 ;\n"
101
"pand %%xmm15, %%xmm9 ;\n"
102
"pand %%xmm15, %%xmm10 ;\n"
103
"pand %%xmm15, %%xmm11 ;\n"
104
"por %%xmm6, %%xmm0 ;\n"
105
"por %%xmm7, %%xmm1 ;\n"
106
"por %%xmm8, %%xmm2 ;\n"
107
"por %%xmm9, %%xmm3 ;\n"
108
"por %%xmm10, %%xmm4 ;\n"
109
"por %%xmm11, %%xmm5 ;\n"
110
111
/* 4 */
112
"movq $4, %%rax ;\n"
113
"movd %%rax, %%xmm15 ;\n"
114
"pshufd $0x00, %%xmm15, %%xmm15 ;\n"
115
"pcmpeqd %%xmm14, %%xmm15 ;\n"
116
"movdqa 288(%1), %%xmm6 ;\n"
117
"movdqa 304(%1), %%xmm7 ;\n"
118
"movdqa 320(%1), %%xmm8 ;\n"
119
"movdqa 336(%1), %%xmm9 ;\n"
120
"movdqa 352(%1), %%xmm10 ;\n"
121
"movdqa 368(%1), %%xmm11 ;\n"
122
"pand %%xmm15, %%xmm6 ;\n"
123
"pand %%xmm15, %%xmm7 ;\n"
124
"pand %%xmm15, %%xmm8 ;\n"
125
"pand %%xmm15, %%xmm9 ;\n"
126
"pand %%xmm15, %%xmm10 ;\n"
127
"pand %%xmm15, %%xmm11 ;\n"
128
"por %%xmm6, %%xmm0 ;\n"
129
"por %%xmm7, %%xmm1 ;\n"
130
"por %%xmm8, %%xmm2 ;\n"
131
"por %%xmm9, %%xmm3 ;\n"
132
"por %%xmm10, %%xmm4 ;\n"
133
"por %%xmm11, %%xmm5 ;\n"
134
135
/* 5 */
136
"movq $5, %%rax ;\n"
137
"movd %%rax, %%xmm15 ;\n"
138
"pshufd $0x00, %%xmm15, %%xmm15 ;\n"
139
"pcmpeqd %%xmm14, %%xmm15 ;\n"
140
"movdqa 384(%1), %%xmm6 ;\n"
141
"movdqa 400(%1), %%xmm7 ;\n"
142
"movdqa 416(%1), %%xmm8 ;\n"
143
"movdqa 432(%1), %%xmm9 ;\n"
144
"movdqa 448(%1), %%xmm10 ;\n"
145
"movdqa 464(%1), %%xmm11 ;\n"
146
"pand %%xmm15, %%xmm6 ;\n"
147
"pand %%xmm15, %%xmm7 ;\n"
148
"pand %%xmm15, %%xmm8 ;\n"
149
"pand %%xmm15, %%xmm9 ;\n"
150
"pand %%xmm15, %%xmm10 ;\n"
151
"pand %%xmm15, %%xmm11 ;\n"
152
"por %%xmm6, %%xmm0 ;\n"
153
"por %%xmm7, %%xmm1 ;\n"
154
"por %%xmm8, %%xmm2 ;\n"
155
"por %%xmm9, %%xmm3 ;\n"
156
"por %%xmm10, %%xmm4 ;\n"
157
"por %%xmm11, %%xmm5 ;\n"
158
159
/* 6 */
160
"movq $6, %%rax ;\n"
161
"movd %%rax, %%xmm15 ;\n"
162
"pshufd $0x00, %%xmm15, %%xmm15 ;\n"
163
"pcmpeqd %%xmm14, %%xmm15 ;\n"
164
"movdqa 480(%1), %%xmm6 ;\n"
165
"movdqa 496(%1), %%xmm7 ;\n"
166
"movdqa 512(%1), %%xmm8 ;\n"
167
"movdqa 528(%1), %%xmm9 ;\n"
168
"movdqa 544(%1), %%xmm10 ;\n"
169
"movdqa 560(%1), %%xmm11 ;\n"
170
"pand %%xmm15, %%xmm6 ;\n"
171
"pand %%xmm15, %%xmm7 ;\n"
172
"pand %%xmm15, %%xmm8 ;\n"
173
"pand %%xmm15, %%xmm9 ;\n"
174
"pand %%xmm15, %%xmm10 ;\n"
175
"pand %%xmm15, %%xmm11 ;\n"
176
"por %%xmm6, %%xmm0 ;\n"
177
"por %%xmm7, %%xmm1 ;\n"
178
"por %%xmm8, %%xmm2 ;\n"
179
"por %%xmm9, %%xmm3 ;\n"
180
"por %%xmm10, %%xmm4 ;\n"
181
"por %%xmm11, %%xmm5 ;\n"
182
183
/* 7 */
184
"movq $7, %%rax ;\n"
185
"movd %%rax, %%xmm15 ;\n"
186
"pshufd $0x00, %%xmm15, %%xmm15 ;\n"
187
"pcmpeqd %%xmm14, %%xmm15 ;\n"
188
"movdqa 576(%1), %%xmm6 ;\n"
189
"movdqa 592(%1), %%xmm7 ;\n"
190
"movdqa 608(%1), %%xmm8 ;\n"
191
"movdqa 624(%1), %%xmm9 ;\n"
192
"movdqa 640(%1), %%xmm10 ;\n"
193
"movdqa 656(%1), %%xmm11 ;\n"
194
"pand %%xmm15, %%xmm6 ;\n"
195
"pand %%xmm15, %%xmm7 ;\n"
196
"pand %%xmm15, %%xmm8 ;\n"
197
"pand %%xmm15, %%xmm9 ;\n"
198
"pand %%xmm15, %%xmm10 ;\n"
199
"pand %%xmm15, %%xmm11 ;\n"
200
"por %%xmm6, %%xmm0 ;\n"
201
"por %%xmm7, %%xmm1 ;\n"
202
"por %%xmm8, %%xmm2 ;\n"
203
"por %%xmm9, %%xmm3 ;\n"
204
"por %%xmm10, %%xmm4 ;\n"
205
"por %%xmm11, %%xmm5 ;\n"
206
207
/* 8 */
208
"movq $8, %%rax ;\n"
209
"movd %%rax, %%xmm15 ;\n"
210
"pshufd $0x00, %%xmm15, %%xmm15 ;\n"
211
"pcmpeqd %%xmm14, %%xmm15 ;\n"
212
"movdqa 672(%1), %%xmm6 ;\n"
213
"movdqa 688(%1), %%xmm7 ;\n"
214
"movdqa 704(%1), %%xmm8 ;\n"
215
"movdqa 720(%1), %%xmm9 ;\n"
216
"movdqa 736(%1), %%xmm10 ;\n"
217
"movdqa 752(%1), %%xmm11 ;\n"
218
"pand %%xmm15, %%xmm6 ;\n"
219
"pand %%xmm15, %%xmm7 ;\n"
220
"pand %%xmm15, %%xmm8 ;\n"
221
"pand %%xmm15, %%xmm9 ;\n"
222
"pand %%xmm15, %%xmm10 ;\n"
223
"pand %%xmm15, %%xmm11 ;\n"
224
"por %%xmm6, %%xmm0 ;\n"
225
"por %%xmm7, %%xmm1 ;\n"
226
"por %%xmm8, %%xmm2 ;\n"
227
"por %%xmm9, %%xmm3 ;\n"
228
"por %%xmm10, %%xmm4 ;\n"
229
"por %%xmm11, %%xmm5 ;\n"
230
231
/* conditionally swap ysubx and xaddy */
232
"movq %3, %%rax ;\n"
233
"xorq $1, %%rax ;\n"
234
"movd %%rax, %%xmm14 ;\n"
235
"pxor %%xmm15, %%xmm15 ;\n"
236
"pshufd $0x00, %%xmm14, %%xmm14 ;\n"
237
"pxor %%xmm0, %%xmm2 ;\n"
238
"pxor %%xmm1, %%xmm3 ;\n"
239
"pcmpeqd %%xmm14, %%xmm15 ;\n"
240
"movdqa %%xmm2, %%xmm6 ;\n"
241
"movdqa %%xmm3, %%xmm7 ;\n"
242
"pand %%xmm15, %%xmm6 ;\n"
243
"pand %%xmm15, %%xmm7 ;\n"
244
"pxor %%xmm6, %%xmm0 ;\n"
245
"pxor %%xmm7, %%xmm1 ;\n"
246
"pxor %%xmm0, %%xmm2 ;\n"
247
"pxor %%xmm1, %%xmm3 ;\n"
248
249
/* store ysubx */
250
"movq $0x7ffffffffffff, %%rax ;\n"
251
"movd %%xmm0, %%rcx ;\n"
252
"movd %%xmm0, %%r8 ;\n"
253
"movd %%xmm1, %%rsi ;\n"
254
"pshufd $0xee, %%xmm0, %%xmm0 ;\n"
255
"pshufd $0xee, %%xmm1, %%xmm1 ;\n"
256
"movd %%xmm0, %%rdx ;\n"
257
"movd %%xmm1, %%rdi ;\n"
258
"shrdq $51, %%rdx, %%r8 ;\n"
259
"shrdq $38, %%rsi, %%rdx ;\n"
260
"shrdq $25, %%rdi, %%rsi ;\n"
261
"shrq $12, %%rdi ;\n"
262
"andq %%rax, %%rcx ;\n"
263
"andq %%rax, %%r8 ;\n"
264
"andq %%rax, %%rdx ;\n"
265
"andq %%rax, %%rsi ;\n"
266
"andq %%rax, %%rdi ;\n"
267
"movq %%rcx, 0(%2) ;\n"
268
"movq %%r8, 8(%2) ;\n"
269
"movq %%rdx, 16(%2) ;\n"
270
"movq %%rsi, 24(%2) ;\n"
271
"movq %%rdi, 32(%2) ;\n"
272
273
/* store xaddy */
274
"movq $0x7ffffffffffff, %%rax ;\n"
275
"movd %%xmm2, %%rcx ;\n"
276
"movd %%xmm2, %%r8 ;\n"
277
"movd %%xmm3, %%rsi ;\n"
278
"pshufd $0xee, %%xmm2, %%xmm2 ;\n"
279
"pshufd $0xee, %%xmm3, %%xmm3 ;\n"
280
"movd %%xmm2, %%rdx ;\n"
281
"movd %%xmm3, %%rdi ;\n"
282
"shrdq $51, %%rdx, %%r8 ;\n"
283
"shrdq $38, %%rsi, %%rdx ;\n"
284
"shrdq $25, %%rdi, %%rsi ;\n"
285
"shrq $12, %%rdi ;\n"
286
"andq %%rax, %%rcx ;\n"
287
"andq %%rax, %%r8 ;\n"
288
"andq %%rax, %%rdx ;\n"
289
"andq %%rax, %%rsi ;\n"
290
"andq %%rax, %%rdi ;\n"
291
"movq %%rcx, 40(%2) ;\n"
292
"movq %%r8, 48(%2) ;\n"
293
"movq %%rdx, 56(%2) ;\n"
294
"movq %%rsi, 64(%2) ;\n"
295
"movq %%rdi, 72(%2) ;\n"
296
297
/* extract t2d */
298
"movq $0x7ffffffffffff, %%rax ;\n"
299
"movd %%xmm4, %%rcx ;\n"
300
"movd %%xmm4, %%r8 ;\n"
301
"movd %%xmm5, %%rsi ;\n"
302
"pshufd $0xee, %%xmm4, %%xmm4 ;\n"
303
"pshufd $0xee, %%xmm5, %%xmm5 ;\n"
304
"movd %%xmm4, %%rdx ;\n"
305
"movd %%xmm5, %%rdi ;\n"
306
"shrdq $51, %%rdx, %%r8 ;\n"
307
"shrdq $38, %%rsi, %%rdx ;\n"
308
"shrdq $25, %%rdi, %%rsi ;\n"
309
"shrq $12, %%rdi ;\n"
310
"andq %%rax, %%rcx ;\n"
311
"andq %%rax, %%r8 ;\n"
312
"andq %%rax, %%rdx ;\n"
313
"andq %%rax, %%rsi ;\n"
314
"andq %%rax, %%rdi ;\n"
315
316
/* conditionally negate t2d */
317
"movq %3, %%rax ;\n"
318
"movq $0xfffffffffffda, %%r9 ;\n"
319
"movq $0xffffffffffffe, %%r10 ;\n"
320
"movq %%r10, %%r11 ;\n"
321
"movq %%r10, %%r12 ;\n"
322
"movq %%r10, %%r13 ;\n"
323
"subq %%rcx, %%r9 ;\n"
324
"subq %%r8, %%r10 ;\n"
325
"subq %%rdx, %%r11 ;\n"
326
"subq %%rsi, %%r12 ;\n"
327
"subq %%rdi, %%r13 ;\n"
328
"cmpq $1, %%rax ;\n"
329
"cmove %%r9, %%rcx ;\n"
330
"cmove %%r10, %%r8 ;\n"
331
"cmove %%r11, %%rdx ;\n"
332
"cmove %%r12, %%rsi ;\n"
333
"cmove %%r13, %%rdi ;\n"
334
335
/* store t2d */
336
"movq %%rcx, 80(%2) ;\n"
337
"movq %%r8, 88(%2) ;\n"
338
"movq %%rdx, 96(%2) ;\n"
339
"movq %%rsi, 104(%2) ;\n"
340
"movq %%rdi, 112(%2) ;\n"
341
:
342
:
"m"
(u),
"r"
(&table[pos * 8]),
"r"
(t),
"m"
(sign)
/* %0 = u, %1 = table, %2 = t, %3 = sign */
343
:
344
"%rax"
,
"%rcx"
,
"%rdx"
,
"%rdi"
,
"%rsi"
,
"%r8"
,
"%r9"
,
"%r10"
,
"%r11"
,
"%r12"
,
"%r13"
,
345
"%xmm0"
,
"%xmm1"
,
"%xmm2"
,
"%xmm3"
,
"%xmm4"
,
"%xmm5"
,
"%xmm6"
,
"%xmm7"
,
"%xmm8"
,
"%xmm9"
,
"%xmm10"
,
"%xmm11"
,
"%xmm14"
,
"%xmm14"
,
346
"cc"
,
"memory"
347
);
348
}
349
350
#endif
/* defined(ED25519_GCC_64BIT_X86_CHOOSE) */
351
DONNA_NOINLINE
#define DONNA_NOINLINE
Definition
ed25519-donna-portable.h:22
ge25519_niels
struct ge25519_niels_t ge25519_niels
int64_t
signed __int64 int64_t
Definition
stdint.h:135
uint32_t
unsigned int uint32_t
Definition
stdint.h:126
uint8_t
unsigned char uint8_t
Definition
stdint.h:124
uint64_t
unsigned __int64 uint64_t
Definition
stdint.h:136
external
ed25519-donna
ed25519-donna-64bit-x86.h
Generated on
for Electroneum by
1.17.0