1# This file is generated from a similarly-named Perl script in the BoringSSL
2# source tree. Do not edit by hand.
3
4#if defined(__has_feature)
5#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
6#define OPENSSL_NO_ASM
7#endif
8#endif
9
10#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM)
11#if defined(BORINGSSL_PREFIX)
12#include <boringssl_prefix_symbols_asm.h>
13#endif
14.text
15
16
17.private_extern	_beeu_mod_inverse_vartime
18.globl	_beeu_mod_inverse_vartime
19.private_extern _beeu_mod_inverse_vartime
20.p2align	5
21_beeu_mod_inverse_vartime:
22
23	pushq	%rbp
24
25	pushq	%r12
26
27	pushq	%r13
28
29	pushq	%r14
30
31	pushq	%r15
32
33	pushq	%rbx
34
35	pushq	%rsi
36
37
38	subq	$80,%rsp
39
40	movq	%rdi,0(%rsp)
41
42
43	movq	$1,%r8
44	xorq	%r9,%r9
45	xorq	%r10,%r10
46	xorq	%r11,%r11
47	xorq	%rdi,%rdi
48
49	xorq	%r12,%r12
50	xorq	%r13,%r13
51	xorq	%r14,%r14
52	xorq	%r15,%r15
53	xorq	%rbp,%rbp
54
55
56	vmovdqu	0(%rsi),%xmm0
57	vmovdqu	16(%rsi),%xmm1
58	vmovdqu	%xmm0,48(%rsp)
59	vmovdqu	%xmm1,64(%rsp)
60
61	vmovdqu	0(%rdx),%xmm0
62	vmovdqu	16(%rdx),%xmm1
63	vmovdqu	%xmm0,16(%rsp)
64	vmovdqu	%xmm1,32(%rsp)
65
66L$beeu_loop:
67	xorq	%rbx,%rbx
68	orq	48(%rsp),%rbx
69	orq	56(%rsp),%rbx
70	orq	64(%rsp),%rbx
71	orq	72(%rsp),%rbx
72	jz	L$beeu_loop_end
73
74
75
76
77
78
79
80
81
82
83	movq	$1,%rcx
84
85
86L$beeu_shift_loop_XB:
87	movq	%rcx,%rbx
88	andq	48(%rsp),%rbx
89	jnz	L$beeu_shift_loop_end_XB
90
91
92	movq	$1,%rbx
93	andq	%r8,%rbx
94	jz	L$shift1_0
95	addq	0(%rdx),%r8
96	adcq	8(%rdx),%r9
97	adcq	16(%rdx),%r10
98	adcq	24(%rdx),%r11
99	adcq	$0,%rdi
100
101L$shift1_0:
102	shrdq	$1,%r9,%r8
103	shrdq	$1,%r10,%r9
104	shrdq	$1,%r11,%r10
105	shrdq	$1,%rdi,%r11
106	shrq	$1,%rdi
107
108	shlq	$1,%rcx
109
110
111
112
113
114	cmpq	$0x8000000,%rcx
115	jne	L$beeu_shift_loop_XB
116
117L$beeu_shift_loop_end_XB:
118	bsfq	%rcx,%rcx
119	testq	%rcx,%rcx
120	jz	L$beeu_no_shift_XB
121
122
123
124	movq	8+48(%rsp),%rax
125	movq	16+48(%rsp),%rbx
126	movq	24+48(%rsp),%rsi
127
128	shrdq	%cl,%rax,0+48(%rsp)
129	shrdq	%cl,%rbx,8+48(%rsp)
130	shrdq	%cl,%rsi,16+48(%rsp)
131
132	shrq	%cl,%rsi
133	movq	%rsi,24+48(%rsp)
134
135
136L$beeu_no_shift_XB:
137
138	movq	$1,%rcx
139
140
141L$beeu_shift_loop_YA:
142	movq	%rcx,%rbx
143	andq	16(%rsp),%rbx
144	jnz	L$beeu_shift_loop_end_YA
145
146
147	movq	$1,%rbx
148	andq	%r12,%rbx
149	jz	L$shift1_1
150	addq	0(%rdx),%r12
151	adcq	8(%rdx),%r13
152	adcq	16(%rdx),%r14
153	adcq	24(%rdx),%r15
154	adcq	$0,%rbp
155
156L$shift1_1:
157	shrdq	$1,%r13,%r12
158	shrdq	$1,%r14,%r13
159	shrdq	$1,%r15,%r14
160	shrdq	$1,%rbp,%r15
161	shrq	$1,%rbp
162
163	shlq	$1,%rcx
164
165
166
167
168
169	cmpq	$0x8000000,%rcx
170	jne	L$beeu_shift_loop_YA
171
172L$beeu_shift_loop_end_YA:
173	bsfq	%rcx,%rcx
174	testq	%rcx,%rcx
175	jz	L$beeu_no_shift_YA
176
177
178
179	movq	8+16(%rsp),%rax
180	movq	16+16(%rsp),%rbx
181	movq	24+16(%rsp),%rsi
182
183	shrdq	%cl,%rax,0+16(%rsp)
184	shrdq	%cl,%rbx,8+16(%rsp)
185	shrdq	%cl,%rsi,16+16(%rsp)
186
187	shrq	%cl,%rsi
188	movq	%rsi,24+16(%rsp)
189
190
191L$beeu_no_shift_YA:
192
193	movq	48(%rsp),%rax
194	movq	56(%rsp),%rbx
195	movq	64(%rsp),%rsi
196	movq	72(%rsp),%rcx
197	subq	16(%rsp),%rax
198	sbbq	24(%rsp),%rbx
199	sbbq	32(%rsp),%rsi
200	sbbq	40(%rsp),%rcx
201	jnc	L$beeu_B_bigger_than_A
202
203
204	movq	16(%rsp),%rax
205	movq	24(%rsp),%rbx
206	movq	32(%rsp),%rsi
207	movq	40(%rsp),%rcx
208	subq	48(%rsp),%rax
209	sbbq	56(%rsp),%rbx
210	sbbq	64(%rsp),%rsi
211	sbbq	72(%rsp),%rcx
212	movq	%rax,16(%rsp)
213	movq	%rbx,24(%rsp)
214	movq	%rsi,32(%rsp)
215	movq	%rcx,40(%rsp)
216
217
218	addq	%r8,%r12
219	adcq	%r9,%r13
220	adcq	%r10,%r14
221	adcq	%r11,%r15
222	adcq	%rdi,%rbp
223	jmp	L$beeu_loop
224
225L$beeu_B_bigger_than_A:
226
227	movq	%rax,48(%rsp)
228	movq	%rbx,56(%rsp)
229	movq	%rsi,64(%rsp)
230	movq	%rcx,72(%rsp)
231
232
233	addq	%r12,%r8
234	adcq	%r13,%r9
235	adcq	%r14,%r10
236	adcq	%r15,%r11
237	adcq	%rbp,%rdi
238
239	jmp	L$beeu_loop
240
241L$beeu_loop_end:
242
243
244
245
246	movq	16(%rsp),%rbx
247	subq	$1,%rbx
248	orq	24(%rsp),%rbx
249	orq	32(%rsp),%rbx
250	orq	40(%rsp),%rbx
251
252	jnz	L$beeu_err
253
254
255
256
257	movq	0(%rdx),%r8
258	movq	8(%rdx),%r9
259	movq	16(%rdx),%r10
260	movq	24(%rdx),%r11
261	xorq	%rdi,%rdi
262
263L$beeu_reduction_loop:
264	movq	%r12,16(%rsp)
265	movq	%r13,24(%rsp)
266	movq	%r14,32(%rsp)
267	movq	%r15,40(%rsp)
268	movq	%rbp,48(%rsp)
269
270
271	subq	%r8,%r12
272	sbbq	%r9,%r13
273	sbbq	%r10,%r14
274	sbbq	%r11,%r15
275	sbbq	$0,%rbp
276
277
278	cmovcq	16(%rsp),%r12
279	cmovcq	24(%rsp),%r13
280	cmovcq	32(%rsp),%r14
281	cmovcq	40(%rsp),%r15
282	jnc	L$beeu_reduction_loop
283
284
285	subq	%r12,%r8
286	sbbq	%r13,%r9
287	sbbq	%r14,%r10
288	sbbq	%r15,%r11
289
290L$beeu_save:
291
292	movq	0(%rsp),%rdi
293
294	movq	%r8,0(%rdi)
295	movq	%r9,8(%rdi)
296	movq	%r10,16(%rdi)
297	movq	%r11,24(%rdi)
298
299
300	movq	$1,%rax
301	jmp	L$beeu_finish
302
303L$beeu_err:
304
305	xorq	%rax,%rax
306
307L$beeu_finish:
308	addq	$80,%rsp
309
310	popq	%rsi
311
312	popq	%rbx
313
314	popq	%r15
315
316	popq	%r14
317
318	popq	%r13
319
320	popq	%r12
321
322	popq	%rbp
323
324	.byte	0xf3,0xc3
325
326
327
328#endif
329