1/* Copyright (c) 2015, Google Inc.
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14
15/* This file is adapted from crypto_scalarmult/curve25519/amd64-51/ in
16 * SUPERCOP 20141124 (http://bench.cr.yp.to/supercop.html). That code is public
17 * domain licensed but the standard ISC license is included above to keep
18 * licensing simple. */
19
20#if !defined(OPENSSL_NO_ASM)
21#if defined(__x86_64__)
22
23.data
24.p2align 4
25
26#if defined(__APPLE__)
27/* OS X's C ABI prefixes functions with underscore. */
28#define C_ABI(x) _ ## x
29#define HIDDEN .private_extern
30#else
31#define C_ABI(x) x
32#define HIDDEN .hidden
33#endif
34
35x25519_x86_64_REDMASK51:   .quad 0x0007FFFFFFFFFFFF
36x25519_x86_64_121666_213:  .quad 996687872
37x25519_x86_64_2P0:         .quad 0xFFFFFFFFFFFDA
38x25519_x86_64_2P1234:      .quad 0xFFFFFFFFFFFFE
39x25519_x86_64_4P0:         .quad 0x1FFFFFFFFFFFB4
40x25519_x86_64_4P1234:      .quad 0x1FFFFFFFFFFFFC
41x25519_x86_64_MU0:         .quad 0xED9CE5A30A2C131B
42x25519_x86_64_MU1:         .quad 0x2106215D086329A7
43x25519_x86_64_MU2:         .quad 0xFFFFFFFFFFFFFFEB
44x25519_x86_64_MU3:         .quad 0xFFFFFFFFFFFFFFFF
45x25519_x86_64_MU4:         .quad 0x000000000000000F
46x25519_x86_64_ORDER0:      .quad 0x5812631A5CF5D3ED
47x25519_x86_64_ORDER1:      .quad 0x14DEF9DEA2F79CD6
48x25519_x86_64_ORDER2:      .quad 0x0000000000000000
49x25519_x86_64_ORDER3:      .quad 0x1000000000000000
50x25519_x86_64_EC2D0:       .quad 1859910466990425
51x25519_x86_64_EC2D1:       .quad 932731440258426
52x25519_x86_64_EC2D2:       .quad 1072319116312658
53x25519_x86_64_EC2D3:       .quad 1815898335770999
54x25519_x86_64_EC2D4:       .quad 633789495995903
55x25519_x86_64__38:         .quad 38
56
57.text
58.p2align 5
59
60.globl C_ABI(x25519_x86_64_freeze)
61HIDDEN C_ABI(x25519_x86_64_freeze)
62C_ABI(x25519_x86_64_freeze):
63.cfi_startproc
64/* This is a leaf function and uses the redzone for saving registers. */
65movq %r12,-8(%rsp)
66.cfi_rel_offset r12, -8
67movq   0(%rdi),%rsi
68movq   8(%rdi),%rdx
69movq   16(%rdi),%rcx
70movq   24(%rdi),%r8
71movq   32(%rdi),%r9
72movq x25519_x86_64_REDMASK51(%rip),%rax
73mov  %rax,%r10
74sub  $18,%r10
75mov  $3,%r11
76._reduceloop:
77mov  %rsi,%r12
78shr  $51,%r12
79and  %rax,%rsi
80add  %r12,%rdx
81mov  %rdx,%r12
82shr  $51,%r12
83and  %rax,%rdx
84add  %r12,%rcx
85mov  %rcx,%r12
86shr  $51,%r12
87and  %rax,%rcx
88add  %r12,%r8
89mov  %r8,%r12
90shr  $51,%r12
91and  %rax,%r8
92add  %r12,%r9
93mov  %r9,%r12
94shr  $51,%r12
95and  %rax,%r9
96imulq  $19,%r12,%r12
97add  %r12,%rsi
98sub  $1,%r11
99ja ._reduceloop
100mov  $1,%r12
101cmp  %r10,%rsi
102cmovl %r11,%r12
103cmp  %rax,%rdx
104cmovne %r11,%r12
105cmp  %rax,%rcx
106cmovne %r11,%r12
107cmp  %rax,%r8
108cmovne %r11,%r12
109cmp  %rax,%r9
110cmovne %r11,%r12
111neg  %r12
112and  %r12,%rax
113and  %r12,%r10
114sub  %r10,%rsi
115sub  %rax,%rdx
116sub  %rax,%rcx
117sub  %rax,%r8
118sub  %rax,%r9
119movq   %rsi,0(%rdi)
120movq   %rdx,8(%rdi)
121movq   %rcx,16(%rdi)
122movq   %r8,24(%rdi)
123movq   %r9,32(%rdi)
124movq -8(%rsp),%r12
125ret
126.cfi_endproc
127
128.p2align 5
129.globl C_ABI(x25519_x86_64_mul)
130HIDDEN C_ABI(x25519_x86_64_mul)
131C_ABI(x25519_x86_64_mul):
132.cfi_startproc
133/* This is a leaf function and uses the redzone for saving registers. */
134movq %r12,-8(%rsp)
135.cfi_rel_offset r12, -8
136movq %r13,-16(%rsp)
137.cfi_rel_offset r13, -16
138movq %r14,-24(%rsp)
139.cfi_rel_offset r14, -24
140movq %r15,-32(%rsp)
141.cfi_rel_offset r15, -32
142movq %rbx,-40(%rsp)
143.cfi_rel_offset rbx, -40
144movq %rbp,-48(%rsp)
145.cfi_rel_offset rbp, -48
146mov  %rdx,%rcx
147movq   24(%rsi),%rdx
148imulq  $19,%rdx,%rax
149movq %rax,-64(%rsp)
150mulq  16(%rcx)
151mov  %rax,%r8
152mov  %rdx,%r9
153movq   32(%rsi),%rdx
154imulq  $19,%rdx,%rax
155movq %rax,-72(%rsp)
156mulq  8(%rcx)
157add  %rax,%r8
158adc %rdx,%r9
159movq   0(%rsi),%rax
160mulq  0(%rcx)
161add  %rax,%r8
162adc %rdx,%r9
163movq   0(%rsi),%rax
164mulq  8(%rcx)
165mov  %rax,%r10
166mov  %rdx,%r11
167movq   0(%rsi),%rax
168mulq  16(%rcx)
169mov  %rax,%r12
170mov  %rdx,%r13
171movq   0(%rsi),%rax
172mulq  24(%rcx)
173mov  %rax,%r14
174mov  %rdx,%r15
175movq   0(%rsi),%rax
176mulq  32(%rcx)
177mov  %rax,%rbx
178mov  %rdx,%rbp
179movq   8(%rsi),%rax
180mulq  0(%rcx)
181add  %rax,%r10
182adc %rdx,%r11
183movq   8(%rsi),%rax
184mulq  8(%rcx)
185add  %rax,%r12
186adc %rdx,%r13
187movq   8(%rsi),%rax
188mulq  16(%rcx)
189add  %rax,%r14
190adc %rdx,%r15
191movq   8(%rsi),%rax
192mulq  24(%rcx)
193add  %rax,%rbx
194adc %rdx,%rbp
195movq   8(%rsi),%rdx
196imulq  $19,%rdx,%rax
197mulq  32(%rcx)
198add  %rax,%r8
199adc %rdx,%r9
200movq   16(%rsi),%rax
201mulq  0(%rcx)
202add  %rax,%r12
203adc %rdx,%r13
204movq   16(%rsi),%rax
205mulq  8(%rcx)
206add  %rax,%r14
207adc %rdx,%r15
208movq   16(%rsi),%rax
209mulq  16(%rcx)
210add  %rax,%rbx
211adc %rdx,%rbp
212movq   16(%rsi),%rdx
213imulq  $19,%rdx,%rax
214mulq  24(%rcx)
215add  %rax,%r8
216adc %rdx,%r9
217movq   16(%rsi),%rdx
218imulq  $19,%rdx,%rax
219mulq  32(%rcx)
220add  %rax,%r10
221adc %rdx,%r11
222movq   24(%rsi),%rax
223mulq  0(%rcx)
224add  %rax,%r14
225adc %rdx,%r15
226movq   24(%rsi),%rax
227mulq  8(%rcx)
228add  %rax,%rbx
229adc %rdx,%rbp
230movq -64(%rsp),%rax
231mulq  24(%rcx)
232add  %rax,%r10
233adc %rdx,%r11
234movq -64(%rsp),%rax
235mulq  32(%rcx)
236add  %rax,%r12
237adc %rdx,%r13
238movq   32(%rsi),%rax
239mulq  0(%rcx)
240add  %rax,%rbx
241adc %rdx,%rbp
242movq -72(%rsp),%rax
243mulq  16(%rcx)
244add  %rax,%r10
245adc %rdx,%r11
246movq -72(%rsp),%rax
247mulq  24(%rcx)
248add  %rax,%r12
249adc %rdx,%r13
250movq -72(%rsp),%rax
251mulq  32(%rcx)
252add  %rax,%r14
253adc %rdx,%r15
254movq x25519_x86_64_REDMASK51(%rip),%rsi
255shld $13,%r8,%r9
256and  %rsi,%r8
257shld $13,%r10,%r11
258and  %rsi,%r10
259add  %r9,%r10
260shld $13,%r12,%r13
261and  %rsi,%r12
262add  %r11,%r12
263shld $13,%r14,%r15
264and  %rsi,%r14
265add  %r13,%r14
266shld $13,%rbx,%rbp
267and  %rsi,%rbx
268add  %r15,%rbx
269imulq  $19,%rbp,%rdx
270add  %rdx,%r8
271mov  %r8,%rdx
272shr  $51,%rdx
273add  %r10,%rdx
274mov  %rdx,%rcx
275shr  $51,%rdx
276and  %rsi,%r8
277add  %r12,%rdx
278mov  %rdx,%r9
279shr  $51,%rdx
280and  %rsi,%rcx
281add  %r14,%rdx
282mov  %rdx,%rax
283shr  $51,%rdx
284and  %rsi,%r9
285add  %rbx,%rdx
286mov  %rdx,%r10
287shr  $51,%rdx
288and  %rsi,%rax
289imulq  $19,%rdx,%rdx
290add  %rdx,%r8
291and  %rsi,%r10
292movq   %r8,0(%rdi)
293movq   %rcx,8(%rdi)
294movq   %r9,16(%rdi)
295movq   %rax,24(%rdi)
296movq   %r10,32(%rdi)
297movq -8(%rsp),%r12
298movq -16(%rsp),%r13
299movq -24(%rsp),%r14
300movq -32(%rsp),%r15
301movq -40(%rsp),%rbx
302movq -48(%rsp),%rbp
303ret
304.cfi_endproc
305
306.p2align 5
307.globl C_ABI(x25519_x86_64_square)
308HIDDEN C_ABI(x25519_x86_64_square)
309C_ABI(x25519_x86_64_square):
310.cfi_startproc
311/* This is a leaf function and uses the redzone for saving registers. */
312movq %r12,-8(%rsp)
313.cfi_rel_offset r12, -8
314movq %r13,-16(%rsp)
315.cfi_rel_offset r13, -16
316movq %r14,-24(%rsp)
317.cfi_rel_offset r14, -24
318movq %r15,-32(%rsp)
319.cfi_rel_offset r15, -32
320movq %rbx,-40(%rsp)
321.cfi_rel_offset rbx, -40
322movq   0(%rsi),%rax
323mulq  0(%rsi)
324mov  %rax,%rcx
325mov  %rdx,%r8
326movq   0(%rsi),%rax
327shl  $1,%rax
328mulq  8(%rsi)
329mov  %rax,%r9
330mov  %rdx,%r10
331movq   0(%rsi),%rax
332shl  $1,%rax
333mulq  16(%rsi)
334mov  %rax,%r11
335mov  %rdx,%r12
336movq   0(%rsi),%rax
337shl  $1,%rax
338mulq  24(%rsi)
339mov  %rax,%r13
340mov  %rdx,%r14
341movq   0(%rsi),%rax
342shl  $1,%rax
343mulq  32(%rsi)
344mov  %rax,%r15
345mov  %rdx,%rbx
346movq   8(%rsi),%rax
347mulq  8(%rsi)
348add  %rax,%r11
349adc %rdx,%r12
350movq   8(%rsi),%rax
351shl  $1,%rax
352mulq  16(%rsi)
353add  %rax,%r13
354adc %rdx,%r14
355movq   8(%rsi),%rax
356shl  $1,%rax
357mulq  24(%rsi)
358add  %rax,%r15
359adc %rdx,%rbx
360movq   8(%rsi),%rdx
361imulq  $38,%rdx,%rax
362mulq  32(%rsi)
363add  %rax,%rcx
364adc %rdx,%r8
365movq   16(%rsi),%rax
366mulq  16(%rsi)
367add  %rax,%r15
368adc %rdx,%rbx
369movq   16(%rsi),%rdx
370imulq  $38,%rdx,%rax
371mulq  24(%rsi)
372add  %rax,%rcx
373adc %rdx,%r8
374movq   16(%rsi),%rdx
375imulq  $38,%rdx,%rax
376mulq  32(%rsi)
377add  %rax,%r9
378adc %rdx,%r10
379movq   24(%rsi),%rdx
380imulq  $19,%rdx,%rax
381mulq  24(%rsi)
382add  %rax,%r9
383adc %rdx,%r10
384movq   24(%rsi),%rdx
385imulq  $38,%rdx,%rax
386mulq  32(%rsi)
387add  %rax,%r11
388adc %rdx,%r12
389movq   32(%rsi),%rdx
390imulq  $19,%rdx,%rax
391mulq  32(%rsi)
392add  %rax,%r13
393adc %rdx,%r14
394movq x25519_x86_64_REDMASK51(%rip),%rsi
395shld $13,%rcx,%r8
396and  %rsi,%rcx
397shld $13,%r9,%r10
398and  %rsi,%r9
399add  %r8,%r9
400shld $13,%r11,%r12
401and  %rsi,%r11
402add  %r10,%r11
403shld $13,%r13,%r14
404and  %rsi,%r13
405add  %r12,%r13
406shld $13,%r15,%rbx
407and  %rsi,%r15
408add  %r14,%r15
409imulq  $19,%rbx,%rdx
410add  %rdx,%rcx
411mov  %rcx,%rdx
412shr  $51,%rdx
413add  %r9,%rdx
414and  %rsi,%rcx
415mov  %rdx,%r8
416shr  $51,%rdx
417add  %r11,%rdx
418and  %rsi,%r8
419mov  %rdx,%r9
420shr  $51,%rdx
421add  %r13,%rdx
422and  %rsi,%r9
423mov  %rdx,%rax
424shr  $51,%rdx
425add  %r15,%rdx
426and  %rsi,%rax
427mov  %rdx,%r10
428shr  $51,%rdx
429imulq  $19,%rdx,%rdx
430add  %rdx,%rcx
431and  %rsi,%r10
432movq   %rcx,0(%rdi)
433movq   %r8,8(%rdi)
434movq   %r9,16(%rdi)
435movq   %rax,24(%rdi)
436movq   %r10,32(%rdi)
437movq -8(%rsp),%r12
438movq -16(%rsp),%r13
439movq -24(%rsp),%r14
440movq -32(%rsp),%r15
441movq -40(%rsp),%rbx
442ret
443.cfi_endproc
444
445.p2align 5
446.globl C_ABI(x25519_x86_64_ladderstep)
447HIDDEN C_ABI(x25519_x86_64_ladderstep)
448C_ABI(x25519_x86_64_ladderstep):
449.cfi_startproc
450sub $344,%rsp
451.cfi_adjust_cfa_offset 344
452movq %r12,296(%rsp)
453.cfi_rel_offset r12, 296
454movq %r13,304(%rsp)
455.cfi_rel_offset r13, 304
456movq %r14,312(%rsp)
457.cfi_rel_offset r14, 312
458movq %r15,320(%rsp)
459.cfi_rel_offset r15, 320
460movq %rbx,328(%rsp)
461.cfi_rel_offset rbx, 328
462movq %rbp,336(%rsp)
463.cfi_rel_offset rbp, 336
464movq   40(%rdi),%rsi
465movq   48(%rdi),%rdx
466movq   56(%rdi),%rcx
467movq   64(%rdi),%r8
468movq   72(%rdi),%r9
469mov  %rsi,%rax
470mov  %rdx,%r10
471mov  %rcx,%r11
472mov  %r8,%r12
473mov  %r9,%r13
474add  x25519_x86_64_2P0(%rip),%rax
475add  x25519_x86_64_2P1234(%rip),%r10
476add  x25519_x86_64_2P1234(%rip),%r11
477add  x25519_x86_64_2P1234(%rip),%r12
478add  x25519_x86_64_2P1234(%rip),%r13
479addq 80(%rdi),%rsi
480addq 88(%rdi),%rdx
481addq 96(%rdi),%rcx
482addq 104(%rdi),%r8
483addq 112(%rdi),%r9
484subq 80(%rdi),%rax
485subq 88(%rdi),%r10
486subq 96(%rdi),%r11
487subq 104(%rdi),%r12
488subq 112(%rdi),%r13
489movq %rsi,0(%rsp)
490movq %rdx,8(%rsp)
491movq %rcx,16(%rsp)
492movq %r8,24(%rsp)
493movq %r9,32(%rsp)
494movq %rax,40(%rsp)
495movq %r10,48(%rsp)
496movq %r11,56(%rsp)
497movq %r12,64(%rsp)
498movq %r13,72(%rsp)
499movq 40(%rsp),%rax
500mulq  40(%rsp)
501mov  %rax,%rsi
502mov  %rdx,%rcx
503movq 40(%rsp),%rax
504shl  $1,%rax
505mulq  48(%rsp)
506mov  %rax,%r8
507mov  %rdx,%r9
508movq 40(%rsp),%rax
509shl  $1,%rax
510mulq  56(%rsp)
511mov  %rax,%r10
512mov  %rdx,%r11
513movq 40(%rsp),%rax
514shl  $1,%rax
515mulq  64(%rsp)
516mov  %rax,%r12
517mov  %rdx,%r13
518movq 40(%rsp),%rax
519shl  $1,%rax
520mulq  72(%rsp)
521mov  %rax,%r14
522mov  %rdx,%r15
523movq 48(%rsp),%rax
524mulq  48(%rsp)
525add  %rax,%r10
526adc %rdx,%r11
527movq 48(%rsp),%rax
528shl  $1,%rax
529mulq  56(%rsp)
530add  %rax,%r12
531adc %rdx,%r13
532movq 48(%rsp),%rax
533shl  $1,%rax
534mulq  64(%rsp)
535add  %rax,%r14
536adc %rdx,%r15
537movq 48(%rsp),%rdx
538imulq  $38,%rdx,%rax
539mulq  72(%rsp)
540add  %rax,%rsi
541adc %rdx,%rcx
542movq 56(%rsp),%rax
543mulq  56(%rsp)
544add  %rax,%r14
545adc %rdx,%r15
546movq 56(%rsp),%rdx
547imulq  $38,%rdx,%rax
548mulq  64(%rsp)
549add  %rax,%rsi
550adc %rdx,%rcx
551movq 56(%rsp),%rdx
552imulq  $38,%rdx,%rax
553mulq  72(%rsp)
554add  %rax,%r8
555adc %rdx,%r9
556movq 64(%rsp),%rdx
557imulq  $19,%rdx,%rax
558mulq  64(%rsp)
559add  %rax,%r8
560adc %rdx,%r9
561movq 64(%rsp),%rdx
562imulq  $38,%rdx,%rax
563mulq  72(%rsp)
564add  %rax,%r10
565adc %rdx,%r11
566movq 72(%rsp),%rdx
567imulq  $19,%rdx,%rax
568mulq  72(%rsp)
569add  %rax,%r12
570adc %rdx,%r13
571movq x25519_x86_64_REDMASK51(%rip),%rdx
572shld $13,%rsi,%rcx
573and  %rdx,%rsi
574shld $13,%r8,%r9
575and  %rdx,%r8
576add  %rcx,%r8
577shld $13,%r10,%r11
578and  %rdx,%r10
579add  %r9,%r10
580shld $13,%r12,%r13
581and  %rdx,%r12
582add  %r11,%r12
583shld $13,%r14,%r15
584and  %rdx,%r14
585add  %r13,%r14
586imulq  $19,%r15,%rcx
587add  %rcx,%rsi
588mov  %rsi,%rcx
589shr  $51,%rcx
590add  %r8,%rcx
591and  %rdx,%rsi
592mov  %rcx,%r8
593shr  $51,%rcx
594add  %r10,%rcx
595and  %rdx,%r8
596mov  %rcx,%r9
597shr  $51,%rcx
598add  %r12,%rcx
599and  %rdx,%r9
600mov  %rcx,%rax
601shr  $51,%rcx
602add  %r14,%rcx
603and  %rdx,%rax
604mov  %rcx,%r10
605shr  $51,%rcx
606imulq  $19,%rcx,%rcx
607add  %rcx,%rsi
608and  %rdx,%r10
609movq %rsi,80(%rsp)
610movq %r8,88(%rsp)
611movq %r9,96(%rsp)
612movq %rax,104(%rsp)
613movq %r10,112(%rsp)
614movq 0(%rsp),%rax
615mulq  0(%rsp)
616mov  %rax,%rsi
617mov  %rdx,%rcx
618movq 0(%rsp),%rax
619shl  $1,%rax
620mulq  8(%rsp)
621mov  %rax,%r8
622mov  %rdx,%r9
623movq 0(%rsp),%rax
624shl  $1,%rax
625mulq  16(%rsp)
626mov  %rax,%r10
627mov  %rdx,%r11
628movq 0(%rsp),%rax
629shl  $1,%rax
630mulq  24(%rsp)
631mov  %rax,%r12
632mov  %rdx,%r13
633movq 0(%rsp),%rax
634shl  $1,%rax
635mulq  32(%rsp)
636mov  %rax,%r14
637mov  %rdx,%r15
638movq 8(%rsp),%rax
639mulq  8(%rsp)
640add  %rax,%r10
641adc %rdx,%r11
642movq 8(%rsp),%rax
643shl  $1,%rax
644mulq  16(%rsp)
645add  %rax,%r12
646adc %rdx,%r13
647movq 8(%rsp),%rax
648shl  $1,%rax
649mulq  24(%rsp)
650add  %rax,%r14
651adc %rdx,%r15
652movq 8(%rsp),%rdx
653imulq  $38,%rdx,%rax
654mulq  32(%rsp)
655add  %rax,%rsi
656adc %rdx,%rcx
657movq 16(%rsp),%rax
658mulq  16(%rsp)
659add  %rax,%r14
660adc %rdx,%r15
661movq 16(%rsp),%rdx
662imulq  $38,%rdx,%rax
663mulq  24(%rsp)
664add  %rax,%rsi
665adc %rdx,%rcx
666movq 16(%rsp),%rdx
667imulq  $38,%rdx,%rax
668mulq  32(%rsp)
669add  %rax,%r8
670adc %rdx,%r9
671movq 24(%rsp),%rdx
672imulq  $19,%rdx,%rax
673mulq  24(%rsp)
674add  %rax,%r8
675adc %rdx,%r9
676movq 24(%rsp),%rdx
677imulq  $38,%rdx,%rax
678mulq  32(%rsp)
679add  %rax,%r10
680adc %rdx,%r11
681movq 32(%rsp),%rdx
682imulq  $19,%rdx,%rax
683mulq  32(%rsp)
684add  %rax,%r12
685adc %rdx,%r13
686movq x25519_x86_64_REDMASK51(%rip),%rdx
687shld $13,%rsi,%rcx
688and  %rdx,%rsi
689shld $13,%r8,%r9
690and  %rdx,%r8
691add  %rcx,%r8
692shld $13,%r10,%r11
693and  %rdx,%r10
694add  %r9,%r10
695shld $13,%r12,%r13
696and  %rdx,%r12
697add  %r11,%r12
698shld $13,%r14,%r15
699and  %rdx,%r14
700add  %r13,%r14
701imulq  $19,%r15,%rcx
702add  %rcx,%rsi
703mov  %rsi,%rcx
704shr  $51,%rcx
705add  %r8,%rcx
706and  %rdx,%rsi
707mov  %rcx,%r8
708shr  $51,%rcx
709add  %r10,%rcx
710and  %rdx,%r8
711mov  %rcx,%r9
712shr  $51,%rcx
713add  %r12,%rcx
714and  %rdx,%r9
715mov  %rcx,%rax
716shr  $51,%rcx
717add  %r14,%rcx
718and  %rdx,%rax
719mov  %rcx,%r10
720shr  $51,%rcx
721imulq  $19,%rcx,%rcx
722add  %rcx,%rsi
723and  %rdx,%r10
724movq %rsi,120(%rsp)
725movq %r8,128(%rsp)
726movq %r9,136(%rsp)
727movq %rax,144(%rsp)
728movq %r10,152(%rsp)
729mov  %rsi,%rsi
730mov  %r8,%rdx
731mov  %r9,%rcx
732mov  %rax,%r8
733mov  %r10,%r9
734add  x25519_x86_64_2P0(%rip),%rsi
735add  x25519_x86_64_2P1234(%rip),%rdx
736add  x25519_x86_64_2P1234(%rip),%rcx
737add  x25519_x86_64_2P1234(%rip),%r8
738add  x25519_x86_64_2P1234(%rip),%r9
739subq 80(%rsp),%rsi
740subq 88(%rsp),%rdx
741subq 96(%rsp),%rcx
742subq 104(%rsp),%r8
743subq 112(%rsp),%r9
744movq %rsi,160(%rsp)
745movq %rdx,168(%rsp)
746movq %rcx,176(%rsp)
747movq %r8,184(%rsp)
748movq %r9,192(%rsp)
749movq   120(%rdi),%rsi
750movq   128(%rdi),%rdx
751movq   136(%rdi),%rcx
752movq   144(%rdi),%r8
753movq   152(%rdi),%r9
754mov  %rsi,%rax
755mov  %rdx,%r10
756mov  %rcx,%r11
757mov  %r8,%r12
758mov  %r9,%r13
759add  x25519_x86_64_2P0(%rip),%rax
760add  x25519_x86_64_2P1234(%rip),%r10
761add  x25519_x86_64_2P1234(%rip),%r11
762add  x25519_x86_64_2P1234(%rip),%r12
763add  x25519_x86_64_2P1234(%rip),%r13
764addq 160(%rdi),%rsi
765addq 168(%rdi),%rdx
766addq 176(%rdi),%rcx
767addq 184(%rdi),%r8
768addq 192(%rdi),%r9
769subq 160(%rdi),%rax
770subq 168(%rdi),%r10
771subq 176(%rdi),%r11
772subq 184(%rdi),%r12
773subq 192(%rdi),%r13
774movq %rsi,200(%rsp)
775movq %rdx,208(%rsp)
776movq %rcx,216(%rsp)
777movq %r8,224(%rsp)
778movq %r9,232(%rsp)
779movq %rax,240(%rsp)
780movq %r10,248(%rsp)
781movq %r11,256(%rsp)
782movq %r12,264(%rsp)
783movq %r13,272(%rsp)
784movq 224(%rsp),%rsi
785imulq  $19,%rsi,%rax
786movq %rax,280(%rsp)
787mulq  56(%rsp)
788mov  %rax,%rsi
789mov  %rdx,%rcx
790movq 232(%rsp),%rdx
791imulq  $19,%rdx,%rax
792movq %rax,288(%rsp)
793mulq  48(%rsp)
794add  %rax,%rsi
795adc %rdx,%rcx
796movq 200(%rsp),%rax
797mulq  40(%rsp)
798add  %rax,%rsi
799adc %rdx,%rcx
800movq 200(%rsp),%rax
801mulq  48(%rsp)
802mov  %rax,%r8
803mov  %rdx,%r9
804movq 200(%rsp),%rax
805mulq  56(%rsp)
806mov  %rax,%r10
807mov  %rdx,%r11
808movq 200(%rsp),%rax
809mulq  64(%rsp)
810mov  %rax,%r12
811mov  %rdx,%r13
812movq 200(%rsp),%rax
813mulq  72(%rsp)
814mov  %rax,%r14
815mov  %rdx,%r15
816movq 208(%rsp),%rax
817mulq  40(%rsp)
818add  %rax,%r8
819adc %rdx,%r9
820movq 208(%rsp),%rax
821mulq  48(%rsp)
822add  %rax,%r10
823adc %rdx,%r11
824movq 208(%rsp),%rax
825mulq  56(%rsp)
826add  %rax,%r12
827adc %rdx,%r13
828movq 208(%rsp),%rax
829mulq  64(%rsp)
830add  %rax,%r14
831adc %rdx,%r15
832movq 208(%rsp),%rdx
833imulq  $19,%rdx,%rax
834mulq  72(%rsp)
835add  %rax,%rsi
836adc %rdx,%rcx
837movq 216(%rsp),%rax
838mulq  40(%rsp)
839add  %rax,%r10
840adc %rdx,%r11
841movq 216(%rsp),%rax
842mulq  48(%rsp)
843add  %rax,%r12
844adc %rdx,%r13
845movq 216(%rsp),%rax
846mulq  56(%rsp)
847add  %rax,%r14
848adc %rdx,%r15
849movq 216(%rsp),%rdx
850imulq  $19,%rdx,%rax
851mulq  64(%rsp)
852add  %rax,%rsi
853adc %rdx,%rcx
854movq 216(%rsp),%rdx
855imulq  $19,%rdx,%rax
856mulq  72(%rsp)
857add  %rax,%r8
858adc %rdx,%r9
859movq 224(%rsp),%rax
860mulq  40(%rsp)
861add  %rax,%r12
862adc %rdx,%r13
863movq 224(%rsp),%rax
864mulq  48(%rsp)
865add  %rax,%r14
866adc %rdx,%r15
867movq 280(%rsp),%rax
868mulq  64(%rsp)
869add  %rax,%r8
870adc %rdx,%r9
871movq 280(%rsp),%rax
872mulq  72(%rsp)
873add  %rax,%r10
874adc %rdx,%r11
875movq 232(%rsp),%rax
876mulq  40(%rsp)
877add  %rax,%r14
878adc %rdx,%r15
879movq 288(%rsp),%rax
880mulq  56(%rsp)
881add  %rax,%r8
882adc %rdx,%r9
883movq 288(%rsp),%rax
884mulq  64(%rsp)
885add  %rax,%r10
886adc %rdx,%r11
887movq 288(%rsp),%rax
888mulq  72(%rsp)
889add  %rax,%r12
890adc %rdx,%r13
891movq x25519_x86_64_REDMASK51(%rip),%rdx
892shld $13,%rsi,%rcx
893and  %rdx,%rsi
894shld $13,%r8,%r9
895and  %rdx,%r8
896add  %rcx,%r8
897shld $13,%r10,%r11
898and  %rdx,%r10
899add  %r9,%r10
900shld $13,%r12,%r13
901and  %rdx,%r12
902add  %r11,%r12
903shld $13,%r14,%r15
904and  %rdx,%r14
905add  %r13,%r14
906imulq  $19,%r15,%rcx
907add  %rcx,%rsi
908mov  %rsi,%rcx
909shr  $51,%rcx
910add  %r8,%rcx
911mov  %rcx,%r8
912shr  $51,%rcx
913and  %rdx,%rsi
914add  %r10,%rcx
915mov  %rcx,%r9
916shr  $51,%rcx
917and  %rdx,%r8
918add  %r12,%rcx
919mov  %rcx,%rax
920shr  $51,%rcx
921and  %rdx,%r9
922add  %r14,%rcx
923mov  %rcx,%r10
924shr  $51,%rcx
925and  %rdx,%rax
926imulq  $19,%rcx,%rcx
927add  %rcx,%rsi
928and  %rdx,%r10
929movq %rsi,40(%rsp)
930movq %r8,48(%rsp)
931movq %r9,56(%rsp)
932movq %rax,64(%rsp)
933movq %r10,72(%rsp)
934movq 264(%rsp),%rsi
935imulq  $19,%rsi,%rax
936movq %rax,200(%rsp)
937mulq  16(%rsp)
938mov  %rax,%rsi
939mov  %rdx,%rcx
940movq 272(%rsp),%rdx
941imulq  $19,%rdx,%rax
942movq %rax,208(%rsp)
943mulq  8(%rsp)
944add  %rax,%rsi
945adc %rdx,%rcx
946movq 240(%rsp),%rax
947mulq  0(%rsp)
948add  %rax,%rsi
949adc %rdx,%rcx
950movq 240(%rsp),%rax
951mulq  8(%rsp)
952mov  %rax,%r8
953mov  %rdx,%r9
954movq 240(%rsp),%rax
955mulq  16(%rsp)
956mov  %rax,%r10
957mov  %rdx,%r11
958movq 240(%rsp),%rax
959mulq  24(%rsp)
960mov  %rax,%r12
961mov  %rdx,%r13
962movq 240(%rsp),%rax
963mulq  32(%rsp)
964mov  %rax,%r14
965mov  %rdx,%r15
966movq 248(%rsp),%rax
967mulq  0(%rsp)
968add  %rax,%r8
969adc %rdx,%r9
970movq 248(%rsp),%rax
971mulq  8(%rsp)
972add  %rax,%r10
973adc %rdx,%r11
974movq 248(%rsp),%rax
975mulq  16(%rsp)
976add  %rax,%r12
977adc %rdx,%r13
978movq 248(%rsp),%rax
979mulq  24(%rsp)
980add  %rax,%r14
981adc %rdx,%r15
982movq 248(%rsp),%rdx
983imulq  $19,%rdx,%rax
984mulq  32(%rsp)
985add  %rax,%rsi
986adc %rdx,%rcx
987movq 256(%rsp),%rax
988mulq  0(%rsp)
989add  %rax,%r10
990adc %rdx,%r11
991movq 256(%rsp),%rax
992mulq  8(%rsp)
993add  %rax,%r12
994adc %rdx,%r13
995movq 256(%rsp),%rax
996mulq  16(%rsp)
997add  %rax,%r14
998adc %rdx,%r15
999movq 256(%rsp),%rdx
1000imulq  $19,%rdx,%rax
1001mulq  24(%rsp)
1002add  %rax,%rsi
1003adc %rdx,%rcx
1004movq 256(%rsp),%rdx
1005imulq  $19,%rdx,%rax
1006mulq  32(%rsp)
1007add  %rax,%r8
1008adc %rdx,%r9
1009movq 264(%rsp),%rax
1010mulq  0(%rsp)
1011add  %rax,%r12
1012adc %rdx,%r13
1013movq 264(%rsp),%rax
1014mulq  8(%rsp)
1015add  %rax,%r14
1016adc %rdx,%r15
1017movq 200(%rsp),%rax
1018mulq  24(%rsp)
1019add  %rax,%r8
1020adc %rdx,%r9
1021movq 200(%rsp),%rax
1022mulq  32(%rsp)
1023add  %rax,%r10
1024adc %rdx,%r11
1025movq 272(%rsp),%rax
1026mulq  0(%rsp)
1027add  %rax,%r14
1028adc %rdx,%r15
1029movq 208(%rsp),%rax
1030mulq  16(%rsp)
1031add  %rax,%r8
1032adc %rdx,%r9
1033movq 208(%rsp),%rax
1034mulq  24(%rsp)
1035add  %rax,%r10
1036adc %rdx,%r11
1037movq 208(%rsp),%rax
1038mulq  32(%rsp)
1039add  %rax,%r12
1040adc %rdx,%r13
1041movq x25519_x86_64_REDMASK51(%rip),%rdx
1042shld $13,%rsi,%rcx
1043and  %rdx,%rsi
1044shld $13,%r8,%r9
1045and  %rdx,%r8
1046add  %rcx,%r8
1047shld $13,%r10,%r11
1048and  %rdx,%r10
1049add  %r9,%r10
1050shld $13,%r12,%r13
1051and  %rdx,%r12
1052add  %r11,%r12
1053shld $13,%r14,%r15
1054and  %rdx,%r14
1055add  %r13,%r14
1056imulq  $19,%r15,%rcx
1057add  %rcx,%rsi
1058mov  %rsi,%rcx
1059shr  $51,%rcx
1060add  %r8,%rcx
1061mov  %rcx,%r8
1062shr  $51,%rcx
1063and  %rdx,%rsi
1064add  %r10,%rcx
1065mov  %rcx,%r9
1066shr  $51,%rcx
1067and  %rdx,%r8
1068add  %r12,%rcx
1069mov  %rcx,%rax
1070shr  $51,%rcx
1071and  %rdx,%r9
1072add  %r14,%rcx
1073mov  %rcx,%r10
1074shr  $51,%rcx
1075and  %rdx,%rax
1076imulq  $19,%rcx,%rcx
1077add  %rcx,%rsi
1078and  %rdx,%r10
1079mov  %rsi,%rdx
1080mov  %r8,%rcx
1081mov  %r9,%r11
1082mov  %rax,%r12
1083mov  %r10,%r13
1084add  x25519_x86_64_2P0(%rip),%rdx
1085add  x25519_x86_64_2P1234(%rip),%rcx
1086add  x25519_x86_64_2P1234(%rip),%r11
1087add  x25519_x86_64_2P1234(%rip),%r12
1088add  x25519_x86_64_2P1234(%rip),%r13
1089addq 40(%rsp),%rsi
1090addq 48(%rsp),%r8
1091addq 56(%rsp),%r9
1092addq 64(%rsp),%rax
1093addq 72(%rsp),%r10
1094subq 40(%rsp),%rdx
1095subq 48(%rsp),%rcx
1096subq 56(%rsp),%r11
1097subq 64(%rsp),%r12
1098subq 72(%rsp),%r13
1099movq   %rsi,120(%rdi)
1100movq   %r8,128(%rdi)
1101movq   %r9,136(%rdi)
1102movq   %rax,144(%rdi)
1103movq   %r10,152(%rdi)
1104movq   %rdx,160(%rdi)
1105movq   %rcx,168(%rdi)
1106movq   %r11,176(%rdi)
1107movq   %r12,184(%rdi)
1108movq   %r13,192(%rdi)
1109movq   120(%rdi),%rax
1110mulq  120(%rdi)
1111mov  %rax,%rsi
1112mov  %rdx,%rcx
1113movq   120(%rdi),%rax
1114shl  $1,%rax
1115mulq  128(%rdi)
1116mov  %rax,%r8
1117mov  %rdx,%r9
1118movq   120(%rdi),%rax
1119shl  $1,%rax
1120mulq  136(%rdi)
1121mov  %rax,%r10
1122mov  %rdx,%r11
1123movq   120(%rdi),%rax
1124shl  $1,%rax
1125mulq  144(%rdi)
1126mov  %rax,%r12
1127mov  %rdx,%r13
1128movq   120(%rdi),%rax
1129shl  $1,%rax
1130mulq  152(%rdi)
1131mov  %rax,%r14
1132mov  %rdx,%r15
1133movq   128(%rdi),%rax
1134mulq  128(%rdi)
1135add  %rax,%r10
1136adc %rdx,%r11
1137movq   128(%rdi),%rax
1138shl  $1,%rax
1139mulq  136(%rdi)
1140add  %rax,%r12
1141adc %rdx,%r13
1142movq   128(%rdi),%rax
1143shl  $1,%rax
1144mulq  144(%rdi)
1145add  %rax,%r14
1146adc %rdx,%r15
1147movq   128(%rdi),%rdx
1148imulq  $38,%rdx,%rax
1149mulq  152(%rdi)
1150add  %rax,%rsi
1151adc %rdx,%rcx
1152movq   136(%rdi),%rax
1153mulq  136(%rdi)
1154add  %rax,%r14
1155adc %rdx,%r15
1156movq   136(%rdi),%rdx
1157imulq  $38,%rdx,%rax
1158mulq  144(%rdi)
1159add  %rax,%rsi
1160adc %rdx,%rcx
1161movq   136(%rdi),%rdx
1162imulq  $38,%rdx,%rax
1163mulq  152(%rdi)
1164add  %rax,%r8
1165adc %rdx,%r9
1166movq   144(%rdi),%rdx
1167imulq  $19,%rdx,%rax
1168mulq  144(%rdi)
1169add  %rax,%r8
1170adc %rdx,%r9
1171movq   144(%rdi),%rdx
1172imulq  $38,%rdx,%rax
1173mulq  152(%rdi)
1174add  %rax,%r10
1175adc %rdx,%r11
1176movq   152(%rdi),%rdx
1177imulq  $19,%rdx,%rax
1178mulq  152(%rdi)
1179add  %rax,%r12
1180adc %rdx,%r13
1181movq x25519_x86_64_REDMASK51(%rip),%rdx
1182shld $13,%rsi,%rcx
1183and  %rdx,%rsi
1184shld $13,%r8,%r9
1185and  %rdx,%r8
1186add  %rcx,%r8
1187shld $13,%r10,%r11
1188and  %rdx,%r10
1189add  %r9,%r10
1190shld $13,%r12,%r13
1191and  %rdx,%r12
1192add  %r11,%r12
1193shld $13,%r14,%r15
1194and  %rdx,%r14
1195add  %r13,%r14
1196imulq  $19,%r15,%rcx
1197add  %rcx,%rsi
1198mov  %rsi,%rcx
1199shr  $51,%rcx
1200add  %r8,%rcx
1201and  %rdx,%rsi
1202mov  %rcx,%r8
1203shr  $51,%rcx
1204add  %r10,%rcx
1205and  %rdx,%r8
1206mov  %rcx,%r9
1207shr  $51,%rcx
1208add  %r12,%rcx
1209and  %rdx,%r9
1210mov  %rcx,%rax
1211shr  $51,%rcx
1212add  %r14,%rcx
1213and  %rdx,%rax
1214mov  %rcx,%r10
1215shr  $51,%rcx
1216imulq  $19,%rcx,%rcx
1217add  %rcx,%rsi
1218and  %rdx,%r10
1219movq   %rsi,120(%rdi)
1220movq   %r8,128(%rdi)
1221movq   %r9,136(%rdi)
1222movq   %rax,144(%rdi)
1223movq   %r10,152(%rdi)
1224movq   160(%rdi),%rax
1225mulq  160(%rdi)
1226mov  %rax,%rsi
1227mov  %rdx,%rcx
1228movq   160(%rdi),%rax
1229shl  $1,%rax
1230mulq  168(%rdi)
1231mov  %rax,%r8
1232mov  %rdx,%r9
1233movq   160(%rdi),%rax
1234shl  $1,%rax
1235mulq  176(%rdi)
1236mov  %rax,%r10
1237mov  %rdx,%r11
1238movq   160(%rdi),%rax
1239shl  $1,%rax
1240mulq  184(%rdi)
1241mov  %rax,%r12
1242mov  %rdx,%r13
1243movq   160(%rdi),%rax
1244shl  $1,%rax
1245mulq  192(%rdi)
1246mov  %rax,%r14
1247mov  %rdx,%r15
1248movq   168(%rdi),%rax
1249mulq  168(%rdi)
1250add  %rax,%r10
1251adc %rdx,%r11
1252movq   168(%rdi),%rax
1253shl  $1,%rax
1254mulq  176(%rdi)
1255add  %rax,%r12
1256adc %rdx,%r13
1257movq   168(%rdi),%rax
1258shl  $1,%rax
1259mulq  184(%rdi)
1260add  %rax,%r14
1261adc %rdx,%r15
1262movq   168(%rdi),%rdx
1263imulq  $38,%rdx,%rax
1264mulq  192(%rdi)
1265add  %rax,%rsi
1266adc %rdx,%rcx
1267movq   176(%rdi),%rax
1268mulq  176(%rdi)
1269add  %rax,%r14
1270adc %rdx,%r15
1271movq   176(%rdi),%rdx
1272imulq  $38,%rdx,%rax
1273mulq  184(%rdi)
1274add  %rax,%rsi
1275adc %rdx,%rcx
1276movq   176(%rdi),%rdx
1277imulq  $38,%rdx,%rax
1278mulq  192(%rdi)
1279add  %rax,%r8
1280adc %rdx,%r9
1281movq   184(%rdi),%rdx
1282imulq  $19,%rdx,%rax
1283mulq  184(%rdi)
1284add  %rax,%r8
1285adc %rdx,%r9
1286movq   184(%rdi),%rdx
1287imulq  $38,%rdx,%rax
1288mulq  192(%rdi)
1289add  %rax,%r10
1290adc %rdx,%r11
1291movq   192(%rdi),%rdx
1292imulq  $19,%rdx,%rax
1293mulq  192(%rdi)
1294add  %rax,%r12
1295adc %rdx,%r13
1296movq x25519_x86_64_REDMASK51(%rip),%rdx
1297shld $13,%rsi,%rcx
1298and  %rdx,%rsi
1299shld $13,%r8,%r9
1300and  %rdx,%r8
1301add  %rcx,%r8
1302shld $13,%r10,%r11
1303and  %rdx,%r10
1304add  %r9,%r10
1305shld $13,%r12,%r13
1306and  %rdx,%r12
1307add  %r11,%r12
1308shld $13,%r14,%r15
1309and  %rdx,%r14
1310add  %r13,%r14
1311imulq  $19,%r15,%rcx
1312add  %rcx,%rsi
1313mov  %rsi,%rcx
1314shr  $51,%rcx
1315add  %r8,%rcx
1316and  %rdx,%rsi
1317mov  %rcx,%r8
1318shr  $51,%rcx
1319add  %r10,%rcx
1320and  %rdx,%r8
1321mov  %rcx,%r9
1322shr  $51,%rcx
1323add  %r12,%rcx
1324and  %rdx,%r9
1325mov  %rcx,%rax
1326shr  $51,%rcx
1327add  %r14,%rcx
1328and  %rdx,%rax
1329mov  %rcx,%r10
1330shr  $51,%rcx
1331imulq  $19,%rcx,%rcx
1332add  %rcx,%rsi
1333and  %rdx,%r10
1334movq   %rsi,160(%rdi)
1335movq   %r8,168(%rdi)
1336movq   %r9,176(%rdi)
1337movq   %rax,184(%rdi)
1338movq   %r10,192(%rdi)
1339movq   184(%rdi),%rsi
1340imulq  $19,%rsi,%rax
1341movq %rax,0(%rsp)
1342mulq  16(%rdi)
1343mov  %rax,%rsi
1344mov  %rdx,%rcx
1345movq   192(%rdi),%rdx
1346imulq  $19,%rdx,%rax
1347movq %rax,8(%rsp)
1348mulq  8(%rdi)
1349add  %rax,%rsi
1350adc %rdx,%rcx
1351movq   160(%rdi),%rax
1352mulq  0(%rdi)
1353add  %rax,%rsi
1354adc %rdx,%rcx
1355movq   160(%rdi),%rax
1356mulq  8(%rdi)
1357mov  %rax,%r8
1358mov  %rdx,%r9
1359movq   160(%rdi),%rax
1360mulq  16(%rdi)
1361mov  %rax,%r10
1362mov  %rdx,%r11
1363movq   160(%rdi),%rax
1364mulq  24(%rdi)
1365mov  %rax,%r12
1366mov  %rdx,%r13
1367movq   160(%rdi),%rax
1368mulq  32(%rdi)
1369mov  %rax,%r14
1370mov  %rdx,%r15
1371movq   168(%rdi),%rax
1372mulq  0(%rdi)
1373add  %rax,%r8
1374adc %rdx,%r9
1375movq   168(%rdi),%rax
1376mulq  8(%rdi)
1377add  %rax,%r10
1378adc %rdx,%r11
1379movq   168(%rdi),%rax
1380mulq  16(%rdi)
1381add  %rax,%r12
1382adc %rdx,%r13
1383movq   168(%rdi),%rax
1384mulq  24(%rdi)
1385add  %rax,%r14
1386adc %rdx,%r15
1387movq   168(%rdi),%rdx
1388imulq  $19,%rdx,%rax
1389mulq  32(%rdi)
1390add  %rax,%rsi
1391adc %rdx,%rcx
1392movq   176(%rdi),%rax
1393mulq  0(%rdi)
1394add  %rax,%r10
1395adc %rdx,%r11
1396movq   176(%rdi),%rax
1397mulq  8(%rdi)
1398add  %rax,%r12
1399adc %rdx,%r13
1400movq   176(%rdi),%rax
1401mulq  16(%rdi)
1402add  %rax,%r14
1403adc %rdx,%r15
1404movq   176(%rdi),%rdx
1405imulq  $19,%rdx,%rax
1406mulq  24(%rdi)
1407add  %rax,%rsi
1408adc %rdx,%rcx
1409movq   176(%rdi),%rdx
1410imulq  $19,%rdx,%rax
1411mulq  32(%rdi)
1412add  %rax,%r8
1413adc %rdx,%r9
1414movq   184(%rdi),%rax
1415mulq  0(%rdi)
1416add  %rax,%r12
1417adc %rdx,%r13
1418movq   184(%rdi),%rax
1419mulq  8(%rdi)
1420add  %rax,%r14
1421adc %rdx,%r15
1422movq 0(%rsp),%rax
1423mulq  24(%rdi)
1424add  %rax,%r8
1425adc %rdx,%r9
1426movq 0(%rsp),%rax
1427mulq  32(%rdi)
1428add  %rax,%r10
1429adc %rdx,%r11
1430movq   192(%rdi),%rax
1431mulq  0(%rdi)
1432add  %rax,%r14
1433adc %rdx,%r15
1434movq 8(%rsp),%rax
1435mulq  16(%rdi)
1436add  %rax,%r8
1437adc %rdx,%r9
1438movq 8(%rsp),%rax
1439mulq  24(%rdi)
1440add  %rax,%r10
1441adc %rdx,%r11
1442movq 8(%rsp),%rax
1443mulq  32(%rdi)
1444add  %rax,%r12
1445adc %rdx,%r13
1446movq x25519_x86_64_REDMASK51(%rip),%rdx
1447shld $13,%rsi,%rcx
1448and  %rdx,%rsi
1449shld $13,%r8,%r9
1450and  %rdx,%r8
1451add  %rcx,%r8
1452shld $13,%r10,%r11
1453and  %rdx,%r10
1454add  %r9,%r10
1455shld $13,%r12,%r13
1456and  %rdx,%r12
1457add  %r11,%r12
1458shld $13,%r14,%r15
1459and  %rdx,%r14
1460add  %r13,%r14
1461imulq  $19,%r15,%rcx
1462add  %rcx,%rsi
1463mov  %rsi,%rcx
1464shr  $51,%rcx
1465add  %r8,%rcx
1466mov  %rcx,%r8
1467shr  $51,%rcx
1468and  %rdx,%rsi
1469add  %r10,%rcx
1470mov  %rcx,%r9
1471shr  $51,%rcx
1472and  %rdx,%r8
1473add  %r12,%rcx
1474mov  %rcx,%rax
1475shr  $51,%rcx
1476and  %rdx,%r9
1477add  %r14,%rcx
1478mov  %rcx,%r10
1479shr  $51,%rcx
1480and  %rdx,%rax
1481imulq  $19,%rcx,%rcx
1482add  %rcx,%rsi
1483and  %rdx,%r10
1484movq   %rsi,160(%rdi)
1485movq   %r8,168(%rdi)
1486movq   %r9,176(%rdi)
1487movq   %rax,184(%rdi)
1488movq   %r10,192(%rdi)
1489movq 144(%rsp),%rsi
1490imulq  $19,%rsi,%rax
1491movq %rax,0(%rsp)
1492mulq  96(%rsp)
1493mov  %rax,%rsi
1494mov  %rdx,%rcx
1495movq 152(%rsp),%rdx
1496imulq  $19,%rdx,%rax
1497movq %rax,8(%rsp)
1498mulq  88(%rsp)
1499add  %rax,%rsi
1500adc %rdx,%rcx
1501movq 120(%rsp),%rax
1502mulq  80(%rsp)
1503add  %rax,%rsi
1504adc %rdx,%rcx
1505movq 120(%rsp),%rax
1506mulq  88(%rsp)
1507mov  %rax,%r8
1508mov  %rdx,%r9
1509movq 120(%rsp),%rax
1510mulq  96(%rsp)
1511mov  %rax,%r10
1512mov  %rdx,%r11
1513movq 120(%rsp),%rax
1514mulq  104(%rsp)
1515mov  %rax,%r12
1516mov  %rdx,%r13
1517movq 120(%rsp),%rax
1518mulq  112(%rsp)
1519mov  %rax,%r14
1520mov  %rdx,%r15
1521movq 128(%rsp),%rax
1522mulq  80(%rsp)
1523add  %rax,%r8
1524adc %rdx,%r9
1525movq 128(%rsp),%rax
1526mulq  88(%rsp)
1527add  %rax,%r10
1528adc %rdx,%r11
1529movq 128(%rsp),%rax
1530mulq  96(%rsp)
1531add  %rax,%r12
1532adc %rdx,%r13
1533movq 128(%rsp),%rax
1534mulq  104(%rsp)
1535add  %rax,%r14
1536adc %rdx,%r15
1537movq 128(%rsp),%rdx
1538imulq  $19,%rdx,%rax
1539mulq  112(%rsp)
1540add  %rax,%rsi
1541adc %rdx,%rcx
1542movq 136(%rsp),%rax
1543mulq  80(%rsp)
1544add  %rax,%r10
1545adc %rdx,%r11
1546movq 136(%rsp),%rax
1547mulq  88(%rsp)
1548add  %rax,%r12
1549adc %rdx,%r13
1550movq 136(%rsp),%rax
1551mulq  96(%rsp)
1552add  %rax,%r14
1553adc %rdx,%r15
1554movq 136(%rsp),%rdx
1555imulq  $19,%rdx,%rax
1556mulq  104(%rsp)
1557add  %rax,%rsi
1558adc %rdx,%rcx
1559movq 136(%rsp),%rdx
1560imulq  $19,%rdx,%rax
1561mulq  112(%rsp)
1562add  %rax,%r8
1563adc %rdx,%r9
1564movq 144(%rsp),%rax
1565mulq  80(%rsp)
1566add  %rax,%r12
1567adc %rdx,%r13
1568movq 144(%rsp),%rax
1569mulq  88(%rsp)
1570add  %rax,%r14
1571adc %rdx,%r15
1572movq 0(%rsp),%rax
1573mulq  104(%rsp)
1574add  %rax,%r8
1575adc %rdx,%r9
1576movq 0(%rsp),%rax
1577mulq  112(%rsp)
1578add  %rax,%r10
1579adc %rdx,%r11
1580movq 152(%rsp),%rax
1581mulq  80(%rsp)
1582add  %rax,%r14
1583adc %rdx,%r15
1584movq 8(%rsp),%rax
1585mulq  96(%rsp)
1586add  %rax,%r8
1587adc %rdx,%r9
1588movq 8(%rsp),%rax
1589mulq  104(%rsp)
1590add  %rax,%r10
1591adc %rdx,%r11
1592movq 8(%rsp),%rax
1593mulq  112(%rsp)
1594add  %rax,%r12
1595adc %rdx,%r13
1596movq x25519_x86_64_REDMASK51(%rip),%rdx
1597shld $13,%rsi,%rcx
1598and  %rdx,%rsi
1599shld $13,%r8,%r9
1600and  %rdx,%r8
1601add  %rcx,%r8
1602shld $13,%r10,%r11
1603and  %rdx,%r10
1604add  %r9,%r10
1605shld $13,%r12,%r13
1606and  %rdx,%r12
1607add  %r11,%r12
1608shld $13,%r14,%r15
1609and  %rdx,%r14
1610add  %r13,%r14
1611imulq  $19,%r15,%rcx
1612add  %rcx,%rsi
1613mov  %rsi,%rcx
1614shr  $51,%rcx
1615add  %r8,%rcx
1616mov  %rcx,%r8
1617shr  $51,%rcx
1618and  %rdx,%rsi
1619add  %r10,%rcx
1620mov  %rcx,%r9
1621shr  $51,%rcx
1622and  %rdx,%r8
1623add  %r12,%rcx
1624mov  %rcx,%rax
1625shr  $51,%rcx
1626and  %rdx,%r9
1627add  %r14,%rcx
1628mov  %rcx,%r10
1629shr  $51,%rcx
1630and  %rdx,%rax
1631imulq  $19,%rcx,%rcx
1632add  %rcx,%rsi
1633and  %rdx,%r10
1634movq   %rsi,40(%rdi)
1635movq   %r8,48(%rdi)
1636movq   %r9,56(%rdi)
1637movq   %rax,64(%rdi)
1638movq   %r10,72(%rdi)
1639movq 160(%rsp),%rax
1640mulq  x25519_x86_64_121666_213(%rip)
1641shr  $13,%rax
1642mov  %rax,%rsi
1643mov  %rdx,%rcx
1644movq 168(%rsp),%rax
1645mulq  x25519_x86_64_121666_213(%rip)
1646shr  $13,%rax
1647add  %rax,%rcx
1648mov  %rdx,%r8
1649movq 176(%rsp),%rax
1650mulq  x25519_x86_64_121666_213(%rip)
1651shr  $13,%rax
1652add  %rax,%r8
1653mov  %rdx,%r9
1654movq 184(%rsp),%rax
1655mulq  x25519_x86_64_121666_213(%rip)
1656shr  $13,%rax
1657add  %rax,%r9
1658mov  %rdx,%r10
1659movq 192(%rsp),%rax
1660mulq  x25519_x86_64_121666_213(%rip)
1661shr  $13,%rax
1662add  %rax,%r10
1663imulq  $19,%rdx,%rdx
1664add  %rdx,%rsi
1665addq 80(%rsp),%rsi
1666addq 88(%rsp),%rcx
1667addq 96(%rsp),%r8
1668addq 104(%rsp),%r9
1669addq 112(%rsp),%r10
1670movq   %rsi,80(%rdi)
1671movq   %rcx,88(%rdi)
1672movq   %r8,96(%rdi)
1673movq   %r9,104(%rdi)
1674movq   %r10,112(%rdi)
1675movq   104(%rdi),%rsi
1676imulq  $19,%rsi,%rax
1677movq %rax,0(%rsp)
1678mulq  176(%rsp)
1679mov  %rax,%rsi
1680mov  %rdx,%rcx
1681movq   112(%rdi),%rdx
1682imulq  $19,%rdx,%rax
1683movq %rax,8(%rsp)
1684mulq  168(%rsp)
1685add  %rax,%rsi
1686adc %rdx,%rcx
1687movq   80(%rdi),%rax
1688mulq  160(%rsp)
1689add  %rax,%rsi
1690adc %rdx,%rcx
1691movq   80(%rdi),%rax
1692mulq  168(%rsp)
1693mov  %rax,%r8
1694mov  %rdx,%r9
1695movq   80(%rdi),%rax
1696mulq  176(%rsp)
1697mov  %rax,%r10
1698mov  %rdx,%r11
1699movq   80(%rdi),%rax
1700mulq  184(%rsp)
1701mov  %rax,%r12
1702mov  %rdx,%r13
1703movq   80(%rdi),%rax
1704mulq  192(%rsp)
1705mov  %rax,%r14
1706mov  %rdx,%r15
1707movq   88(%rdi),%rax
1708mulq  160(%rsp)
1709add  %rax,%r8
1710adc %rdx,%r9
1711movq   88(%rdi),%rax
1712mulq  168(%rsp)
1713add  %rax,%r10
1714adc %rdx,%r11
1715movq   88(%rdi),%rax
1716mulq  176(%rsp)
1717add  %rax,%r12
1718adc %rdx,%r13
1719movq   88(%rdi),%rax
1720mulq  184(%rsp)
1721add  %rax,%r14
1722adc %rdx,%r15
1723movq   88(%rdi),%rdx
1724imulq  $19,%rdx,%rax
1725mulq  192(%rsp)
1726add  %rax,%rsi
1727adc %rdx,%rcx
1728movq   96(%rdi),%rax
1729mulq  160(%rsp)
1730add  %rax,%r10
1731adc %rdx,%r11
1732movq   96(%rdi),%rax
1733mulq  168(%rsp)
1734add  %rax,%r12
1735adc %rdx,%r13
1736movq   96(%rdi),%rax
1737mulq  176(%rsp)
1738add  %rax,%r14
1739adc %rdx,%r15
1740movq   96(%rdi),%rdx
1741imulq  $19,%rdx,%rax
1742mulq  184(%rsp)
1743add  %rax,%rsi
1744adc %rdx,%rcx
1745movq   96(%rdi),%rdx
1746imulq  $19,%rdx,%rax
1747mulq  192(%rsp)
1748add  %rax,%r8
1749adc %rdx,%r9
1750movq   104(%rdi),%rax
1751mulq  160(%rsp)
1752add  %rax,%r12
1753adc %rdx,%r13
1754movq   104(%rdi),%rax
1755mulq  168(%rsp)
1756add  %rax,%r14
1757adc %rdx,%r15
1758movq 0(%rsp),%rax
1759mulq  184(%rsp)
1760add  %rax,%r8
1761adc %rdx,%r9
1762movq 0(%rsp),%rax
1763mulq  192(%rsp)
1764add  %rax,%r10
1765adc %rdx,%r11
1766movq   112(%rdi),%rax
1767mulq  160(%rsp)
1768add  %rax,%r14
1769adc %rdx,%r15
1770movq 8(%rsp),%rax
1771mulq  176(%rsp)
1772add  %rax,%r8
1773adc %rdx,%r9
1774movq 8(%rsp),%rax
1775mulq  184(%rsp)
1776add  %rax,%r10
1777adc %rdx,%r11
1778movq 8(%rsp),%rax
1779mulq  192(%rsp)
1780add  %rax,%r12
1781adc %rdx,%r13
1782movq x25519_x86_64_REDMASK51(%rip),%rdx
1783shld $13,%rsi,%rcx
1784and  %rdx,%rsi
1785shld $13,%r8,%r9
1786and  %rdx,%r8
1787add  %rcx,%r8
1788shld $13,%r10,%r11
1789and  %rdx,%r10
1790add  %r9,%r10
1791shld $13,%r12,%r13
1792and  %rdx,%r12
1793add  %r11,%r12
1794shld $13,%r14,%r15
1795and  %rdx,%r14
1796add  %r13,%r14
1797imulq  $19,%r15,%rcx
1798add  %rcx,%rsi
1799mov  %rsi,%rcx
1800shr  $51,%rcx
1801add  %r8,%rcx
1802mov  %rcx,%r8
1803shr  $51,%rcx
1804and  %rdx,%rsi
1805add  %r10,%rcx
1806mov  %rcx,%r9
1807shr  $51,%rcx
1808and  %rdx,%r8
1809add  %r12,%rcx
1810mov  %rcx,%rax
1811shr  $51,%rcx
1812and  %rdx,%r9
1813add  %r14,%rcx
1814mov  %rcx,%r10
1815shr  $51,%rcx
1816and  %rdx,%rax
1817imulq  $19,%rcx,%rcx
1818add  %rcx,%rsi
1819and  %rdx,%r10
1820movq   %rsi,80(%rdi)
1821movq   %r8,88(%rdi)
1822movq   %r9,96(%rdi)
1823movq   %rax,104(%rdi)
1824movq   %r10,112(%rdi)
1825movq 296(%rsp),%r12
1826movq 304(%rsp),%r13
1827movq 312(%rsp),%r14
1828movq 320(%rsp),%r15
1829movq 328(%rsp),%rbx
1830movq 336(%rsp),%rbp
1831add $344,%rsp
1832.cfi_adjust_cfa_offset -344
1833ret
1834.cfi_endproc
1835
1836.p2align 5
1837.globl C_ABI(x25519_x86_64_work_cswap)
1838HIDDEN C_ABI(x25519_x86_64_work_cswap)
1839C_ABI(x25519_x86_64_work_cswap):
1840.cfi_startproc
1841subq $1,%rsi
1842notq %rsi
1843movq %rsi,%xmm15
1844pshufd $0x44,%xmm15,%xmm15
1845movdqu 0(%rdi),%xmm0
1846movdqu 16(%rdi),%xmm2
1847movdqu 32(%rdi),%xmm4
1848movdqu 48(%rdi),%xmm6
1849movdqu 64(%rdi),%xmm8
1850movdqu 80(%rdi),%xmm1
1851movdqu 96(%rdi),%xmm3
1852movdqu 112(%rdi),%xmm5
1853movdqu 128(%rdi),%xmm7
1854movdqu 144(%rdi),%xmm9
1855movdqa %xmm1,%xmm10
1856movdqa %xmm3,%xmm11
1857movdqa %xmm5,%xmm12
1858movdqa %xmm7,%xmm13
1859movdqa %xmm9,%xmm14
1860pxor %xmm0,%xmm10
1861pxor %xmm2,%xmm11
1862pxor %xmm4,%xmm12
1863pxor %xmm6,%xmm13
1864pxor %xmm8,%xmm14
1865pand %xmm15,%xmm10
1866pand %xmm15,%xmm11
1867pand %xmm15,%xmm12
1868pand %xmm15,%xmm13
1869pand %xmm15,%xmm14
1870pxor %xmm10,%xmm0
1871pxor %xmm10,%xmm1
1872pxor %xmm11,%xmm2
1873pxor %xmm11,%xmm3
1874pxor %xmm12,%xmm4
1875pxor %xmm12,%xmm5
1876pxor %xmm13,%xmm6
1877pxor %xmm13,%xmm7
1878pxor %xmm14,%xmm8
1879pxor %xmm14,%xmm9
1880movdqu %xmm0,0(%rdi)
1881movdqu %xmm2,16(%rdi)
1882movdqu %xmm4,32(%rdi)
1883movdqu %xmm6,48(%rdi)
1884movdqu %xmm8,64(%rdi)
1885movdqu %xmm1,80(%rdi)
1886movdqu %xmm3,96(%rdi)
1887movdqu %xmm5,112(%rdi)
1888movdqu %xmm7,128(%rdi)
1889movdqu %xmm9,144(%rdi)
1890ret
1891.cfi_endproc
1892
1893#endif  /* __x86_64__ */
1894#endif  /* !OPENSSL_NO_ASM */
1895