1#ifdef IN_SANDY2X
2
3/*
4   This file is basically amd64-51/fe25519_mul.s.
5*/
6#include "fe51_namespace.h"
7#include "consts_namespace.h"
8.text
9.p2align 5
10#ifdef ASM_HIDE_SYMBOL
11ASM_HIDE_SYMBOL fe51_mul
12ASM_HIDE_SYMBOL _fe51_mul
13#endif
14.globl fe51_mul
15.globl _fe51_mul
16#ifdef __ELF__
17.type fe51_mul, @function
18.type _fe51_mul, @function
19#endif
20fe51_mul:
21_fe51_mul:
22mov %rsp,%r11
23and $31,%r11
24add $96,%r11
25sub %r11,%rsp
26movq %r11,0(%rsp)
27movq %r12,8(%rsp)
28movq %r13,16(%rsp)
29movq %r14,24(%rsp)
30movq %r15,32(%rsp)
31movq %rbx,40(%rsp)
32movq %rbp,48(%rsp)
33movq %rdi,56(%rsp)
34mov  %rdx,%rcx
35movq   24(%rsi),%rdx
36imulq  $19,%rdx,%rax
37movq %rax,64(%rsp)
38mulq  16(%rcx)
39mov  %rax,%r8
40mov  %rdx,%r9
41movq   32(%rsi),%rdx
42imulq  $19,%rdx,%rax
43movq %rax,72(%rsp)
44mulq  8(%rcx)
45add  %rax,%r8
46adc %rdx,%r9
47movq   0(%rsi),%rax
48mulq  0(%rcx)
49add  %rax,%r8
50adc %rdx,%r9
51movq   0(%rsi),%rax
52mulq  8(%rcx)
53mov  %rax,%r10
54mov  %rdx,%r11
55movq   0(%rsi),%rax
56mulq  16(%rcx)
57mov  %rax,%r12
58mov  %rdx,%r13
59movq   0(%rsi),%rax
60mulq  24(%rcx)
61mov  %rax,%r14
62mov  %rdx,%r15
63movq   0(%rsi),%rax
64mulq  32(%rcx)
65mov  %rax,%rbx
66mov  %rdx,%rbp
67movq   8(%rsi),%rax
68mulq  0(%rcx)
69add  %rax,%r10
70adc %rdx,%r11
71movq   8(%rsi),%rax
72mulq  8(%rcx)
73add  %rax,%r12
74adc %rdx,%r13
75movq   8(%rsi),%rax
76mulq  16(%rcx)
77add  %rax,%r14
78adc %rdx,%r15
79movq   8(%rsi),%rax
80mulq  24(%rcx)
81add  %rax,%rbx
82adc %rdx,%rbp
83movq   8(%rsi),%rdx
84imulq  $19,%rdx,%rax
85mulq  32(%rcx)
86add  %rax,%r8
87adc %rdx,%r9
88movq   16(%rsi),%rax
89mulq  0(%rcx)
90add  %rax,%r12
91adc %rdx,%r13
92movq   16(%rsi),%rax
93mulq  8(%rcx)
94add  %rax,%r14
95adc %rdx,%r15
96movq   16(%rsi),%rax
97mulq  16(%rcx)
98add  %rax,%rbx
99adc %rdx,%rbp
100movq   16(%rsi),%rdx
101imulq  $19,%rdx,%rax
102mulq  24(%rcx)
103add  %rax,%r8
104adc %rdx,%r9
105movq   16(%rsi),%rdx
106imulq  $19,%rdx,%rax
107mulq  32(%rcx)
108add  %rax,%r10
109adc %rdx,%r11
110movq   24(%rsi),%rax
111mulq  0(%rcx)
112add  %rax,%r14
113adc %rdx,%r15
114movq   24(%rsi),%rax
115mulq  8(%rcx)
116add  %rax,%rbx
117adc %rdx,%rbp
118movq 64(%rsp),%rax
119mulq  24(%rcx)
120add  %rax,%r10
121adc %rdx,%r11
122movq 64(%rsp),%rax
123mulq  32(%rcx)
124add  %rax,%r12
125adc %rdx,%r13
126movq   32(%rsi),%rax
127mulq  0(%rcx)
128add  %rax,%rbx
129adc %rdx,%rbp
130movq 72(%rsp),%rax
131mulq  16(%rcx)
132add  %rax,%r10
133adc %rdx,%r11
134movq 72(%rsp),%rax
135mulq  24(%rcx)
136add  %rax,%r12
137adc %rdx,%r13
138movq 72(%rsp),%rax
139mulq  32(%rcx)
140add  %rax,%r14
141adc %rdx,%r15
142movq REDMASK51(%rip),%rsi
143shld $13,%r8,%r9
144and  %rsi,%r8
145shld $13,%r10,%r11
146and  %rsi,%r10
147add  %r9,%r10
148shld $13,%r12,%r13
149and  %rsi,%r12
150add  %r11,%r12
151shld $13,%r14,%r15
152and  %rsi,%r14
153add  %r13,%r14
154shld $13,%rbx,%rbp
155and  %rsi,%rbx
156add  %r15,%rbx
157imulq  $19,%rbp,%rdx
158add  %rdx,%r8
159mov  %r8,%rdx
160shr  $51,%rdx
161add  %r10,%rdx
162mov  %rdx,%rcx
163shr  $51,%rdx
164and  %rsi,%r8
165add  %r12,%rdx
166mov  %rdx,%r9
167shr  $51,%rdx
168and  %rsi,%rcx
169add  %r14,%rdx
170mov  %rdx,%rax
171shr  $51,%rdx
172and  %rsi,%r9
173add  %rbx,%rdx
174mov  %rdx,%r10
175shr  $51,%rdx
176and  %rsi,%rax
177imulq  $19,%rdx,%rdx
178add  %rdx,%r8
179and  %rsi,%r10
180movq   %r8,0(%rdi)
181movq   %rcx,8(%rdi)
182movq   %r9,16(%rdi)
183movq   %rax,24(%rdi)
184movq   %r10,32(%rdi)
185movq 0(%rsp),%r11
186movq 8(%rsp),%r12
187movq 16(%rsp),%r13
188movq 24(%rsp),%r14
189movq 32(%rsp),%r15
190movq 40(%rsp),%rbx
191movq 48(%rsp),%rbp
192add %r11,%rsp
193mov %rdi,%rax
194mov %rsi,%rdx
195ret
196
197#endif
198