ecp_nistz256-x86_64.S revision 325337
1/* $FreeBSD: stable/11/secure/lib/libcrypto/amd64/ecp_nistz256-x86_64.S 325337 2017-11-02 18:30:41Z jkim $ */
2/* Do not modify. This file is auto-generated from ecp_nistz256-x86_64.pl. */
3.text
4
5
6
7.align	64
8.Lpoly:
9.quad	0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001
10
11
12.LRR:
13.quad	0x0000000000000003, 0xfffffffbffffffff, 0xfffffffffffffffe, 0x00000004fffffffd
14
15.LOne:
16.long	1,1,1,1,1,1,1,1
17.LTwo:
18.long	2,2,2,2,2,2,2,2
19.LThree:
20.long	3,3,3,3,3,3,3,3
21.LONE_mont:
22.quad	0x0000000000000001, 0xffffffff00000000, 0xffffffffffffffff, 0x00000000fffffffe
23
24.globl	ecp_nistz256_mul_by_2
25.type	ecp_nistz256_mul_by_2,@function
26.align	64
27ecp_nistz256_mul_by_2:
28	pushq	%r12
29	pushq	%r13
30
31	movq	0(%rsi),%r8
32	xorq	%r13,%r13
33	movq	8(%rsi),%r9
34	addq	%r8,%r8
35	movq	16(%rsi),%r10
36	adcq	%r9,%r9
37	movq	24(%rsi),%r11
38	leaq	.Lpoly(%rip),%rsi
39	movq	%r8,%rax
40	adcq	%r10,%r10
41	adcq	%r11,%r11
42	movq	%r9,%rdx
43	adcq	$0,%r13
44
45	subq	0(%rsi),%r8
46	movq	%r10,%rcx
47	sbbq	8(%rsi),%r9
48	sbbq	16(%rsi),%r10
49	movq	%r11,%r12
50	sbbq	24(%rsi),%r11
51	sbbq	$0,%r13
52
53	cmovcq	%rax,%r8
54	cmovcq	%rdx,%r9
55	movq	%r8,0(%rdi)
56	cmovcq	%rcx,%r10
57	movq	%r9,8(%rdi)
58	cmovcq	%r12,%r11
59	movq	%r10,16(%rdi)
60	movq	%r11,24(%rdi)
61
62	popq	%r13
63	popq	%r12
64	.byte	0xf3,0xc3
65.size	ecp_nistz256_mul_by_2,.-ecp_nistz256_mul_by_2
66
67
68
69.globl	ecp_nistz256_div_by_2
70.type	ecp_nistz256_div_by_2,@function
71.align	32
72ecp_nistz256_div_by_2:
73	pushq	%r12
74	pushq	%r13
75
76	movq	0(%rsi),%r8
77	movq	8(%rsi),%r9
78	movq	16(%rsi),%r10
79	movq	%r8,%rax
80	movq	24(%rsi),%r11
81	leaq	.Lpoly(%rip),%rsi
82
83	movq	%r9,%rdx
84	xorq	%r13,%r13
85	addq	0(%rsi),%r8
86	movq	%r10,%rcx
87	adcq	8(%rsi),%r9
88	adcq	16(%rsi),%r10
89	movq	%r11,%r12
90	adcq	24(%rsi),%r11
91	adcq	$0,%r13
92	xorq	%rsi,%rsi
93	testq	$1,%rax
94
95	cmovzq	%rax,%r8
96	cmovzq	%rdx,%r9
97	cmovzq	%rcx,%r10
98	cmovzq	%r12,%r11
99	cmovzq	%rsi,%r13
100
101	movq	%r9,%rax
102	shrq	$1,%r8
103	shlq	$63,%rax
104	movq	%r10,%rdx
105	shrq	$1,%r9
106	orq	%rax,%r8
107	shlq	$63,%rdx
108	movq	%r11,%rcx
109	shrq	$1,%r10
110	orq	%rdx,%r9
111	shlq	$63,%rcx
112	shrq	$1,%r11
113	shlq	$63,%r13
114	orq	%rcx,%r10
115	orq	%r13,%r11
116
117	movq	%r8,0(%rdi)
118	movq	%r9,8(%rdi)
119	movq	%r10,16(%rdi)
120	movq	%r11,24(%rdi)
121
122	popq	%r13
123	popq	%r12
124	.byte	0xf3,0xc3
125.size	ecp_nistz256_div_by_2,.-ecp_nistz256_div_by_2
126
127
128
129.globl	ecp_nistz256_mul_by_3
130.type	ecp_nistz256_mul_by_3,@function
131.align	32
132ecp_nistz256_mul_by_3:
133	pushq	%r12
134	pushq	%r13
135
136	movq	0(%rsi),%r8
137	xorq	%r13,%r13
138	movq	8(%rsi),%r9
139	addq	%r8,%r8
140	movq	16(%rsi),%r10
141	adcq	%r9,%r9
142	movq	24(%rsi),%r11
143	movq	%r8,%rax
144	adcq	%r10,%r10
145	adcq	%r11,%r11
146	movq	%r9,%rdx
147	adcq	$0,%r13
148
149	subq	$-1,%r8
150	movq	%r10,%rcx
151	sbbq	.Lpoly+8(%rip),%r9
152	sbbq	$0,%r10
153	movq	%r11,%r12
154	sbbq	.Lpoly+24(%rip),%r11
155	sbbq	$0,%r13
156
157	cmovcq	%rax,%r8
158	cmovcq	%rdx,%r9
159	cmovcq	%rcx,%r10
160	cmovcq	%r12,%r11
161
162	xorq	%r13,%r13
163	addq	0(%rsi),%r8
164	adcq	8(%rsi),%r9
165	movq	%r8,%rax
166	adcq	16(%rsi),%r10
167	adcq	24(%rsi),%r11
168	movq	%r9,%rdx
169	adcq	$0,%r13
170
171	subq	$-1,%r8
172	movq	%r10,%rcx
173	sbbq	.Lpoly+8(%rip),%r9
174	sbbq	$0,%r10
175	movq	%r11,%r12
176	sbbq	.Lpoly+24(%rip),%r11
177	sbbq	$0,%r13
178
179	cmovcq	%rax,%r8
180	cmovcq	%rdx,%r9
181	movq	%r8,0(%rdi)
182	cmovcq	%rcx,%r10
183	movq	%r9,8(%rdi)
184	cmovcq	%r12,%r11
185	movq	%r10,16(%rdi)
186	movq	%r11,24(%rdi)
187
188	popq	%r13
189	popq	%r12
190	.byte	0xf3,0xc3
191.size	ecp_nistz256_mul_by_3,.-ecp_nistz256_mul_by_3
192
193
194
195.globl	ecp_nistz256_add
196.type	ecp_nistz256_add,@function
197.align	32
198ecp_nistz256_add:
199	pushq	%r12
200	pushq	%r13
201
202	movq	0(%rsi),%r8
203	xorq	%r13,%r13
204	movq	8(%rsi),%r9
205	movq	16(%rsi),%r10
206	movq	24(%rsi),%r11
207	leaq	.Lpoly(%rip),%rsi
208
209	addq	0(%rdx),%r8
210	adcq	8(%rdx),%r9
211	movq	%r8,%rax
212	adcq	16(%rdx),%r10
213	adcq	24(%rdx),%r11
214	movq	%r9,%rdx
215	adcq	$0,%r13
216
217	subq	0(%rsi),%r8
218	movq	%r10,%rcx
219	sbbq	8(%rsi),%r9
220	sbbq	16(%rsi),%r10
221	movq	%r11,%r12
222	sbbq	24(%rsi),%r11
223	sbbq	$0,%r13
224
225	cmovcq	%rax,%r8
226	cmovcq	%rdx,%r9
227	movq	%r8,0(%rdi)
228	cmovcq	%rcx,%r10
229	movq	%r9,8(%rdi)
230	cmovcq	%r12,%r11
231	movq	%r10,16(%rdi)
232	movq	%r11,24(%rdi)
233
234	popq	%r13
235	popq	%r12
236	.byte	0xf3,0xc3
237.size	ecp_nistz256_add,.-ecp_nistz256_add
238
239
240
241.globl	ecp_nistz256_sub
242.type	ecp_nistz256_sub,@function
243.align	32
244ecp_nistz256_sub:
245	pushq	%r12
246	pushq	%r13
247
248	movq	0(%rsi),%r8
249	xorq	%r13,%r13
250	movq	8(%rsi),%r9
251	movq	16(%rsi),%r10
252	movq	24(%rsi),%r11
253	leaq	.Lpoly(%rip),%rsi
254
255	subq	0(%rdx),%r8
256	sbbq	8(%rdx),%r9
257	movq	%r8,%rax
258	sbbq	16(%rdx),%r10
259	sbbq	24(%rdx),%r11
260	movq	%r9,%rdx
261	sbbq	$0,%r13
262
263	addq	0(%rsi),%r8
264	movq	%r10,%rcx
265	adcq	8(%rsi),%r9
266	adcq	16(%rsi),%r10
267	movq	%r11,%r12
268	adcq	24(%rsi),%r11
269	testq	%r13,%r13
270
271	cmovzq	%rax,%r8
272	cmovzq	%rdx,%r9
273	movq	%r8,0(%rdi)
274	cmovzq	%rcx,%r10
275	movq	%r9,8(%rdi)
276	cmovzq	%r12,%r11
277	movq	%r10,16(%rdi)
278	movq	%r11,24(%rdi)
279
280	popq	%r13
281	popq	%r12
282	.byte	0xf3,0xc3
283.size	ecp_nistz256_sub,.-ecp_nistz256_sub
284
285
286
287.globl	ecp_nistz256_neg
288.type	ecp_nistz256_neg,@function
289.align	32
290ecp_nistz256_neg:
291	pushq	%r12
292	pushq	%r13
293
294	xorq	%r8,%r8
295	xorq	%r9,%r9
296	xorq	%r10,%r10
297	xorq	%r11,%r11
298	xorq	%r13,%r13
299
300	subq	0(%rsi),%r8
301	sbbq	8(%rsi),%r9
302	sbbq	16(%rsi),%r10
303	movq	%r8,%rax
304	sbbq	24(%rsi),%r11
305	leaq	.Lpoly(%rip),%rsi
306	movq	%r9,%rdx
307	sbbq	$0,%r13
308
309	addq	0(%rsi),%r8
310	movq	%r10,%rcx
311	adcq	8(%rsi),%r9
312	adcq	16(%rsi),%r10
313	movq	%r11,%r12
314	adcq	24(%rsi),%r11
315	testq	%r13,%r13
316
317	cmovzq	%rax,%r8
318	cmovzq	%rdx,%r9
319	movq	%r8,0(%rdi)
320	cmovzq	%rcx,%r10
321	movq	%r9,8(%rdi)
322	cmovzq	%r12,%r11
323	movq	%r10,16(%rdi)
324	movq	%r11,24(%rdi)
325
326	popq	%r13
327	popq	%r12
328	.byte	0xf3,0xc3
329.size	ecp_nistz256_neg,.-ecp_nistz256_neg
330
331
332
333
334.globl	ecp_nistz256_to_mont
335.type	ecp_nistz256_to_mont,@function
336.align	32
337ecp_nistz256_to_mont:
338	movl	$0x80100,%ecx
339	andl	OPENSSL_ia32cap_P+8(%rip),%ecx
340	leaq	.LRR(%rip),%rdx
341	jmp	.Lmul_mont
342.size	ecp_nistz256_to_mont,.-ecp_nistz256_to_mont
343
344
345
346
347
348
349
350.globl	ecp_nistz256_mul_mont
351.type	ecp_nistz256_mul_mont,@function
352.align	32
353ecp_nistz256_mul_mont:
354	movl	$0x80100,%ecx
355	andl	OPENSSL_ia32cap_P+8(%rip),%ecx
356.Lmul_mont:
357	pushq	%rbp
358	pushq	%rbx
359	pushq	%r12
360	pushq	%r13
361	pushq	%r14
362	pushq	%r15
363	cmpl	$0x80100,%ecx
364	je	.Lmul_montx
365	movq	%rdx,%rbx
366	movq	0(%rdx),%rax
367	movq	0(%rsi),%r9
368	movq	8(%rsi),%r10
369	movq	16(%rsi),%r11
370	movq	24(%rsi),%r12
371
372	call	__ecp_nistz256_mul_montq
373	jmp	.Lmul_mont_done
374
375.align	32
376.Lmul_montx:
377	movq	%rdx,%rbx
378	movq	0(%rdx),%rdx
379	movq	0(%rsi),%r9
380	movq	8(%rsi),%r10
381	movq	16(%rsi),%r11
382	movq	24(%rsi),%r12
383	leaq	-128(%rsi),%rsi
384
385	call	__ecp_nistz256_mul_montx
386.Lmul_mont_done:
387	popq	%r15
388	popq	%r14
389	popq	%r13
390	popq	%r12
391	popq	%rbx
392	popq	%rbp
393	.byte	0xf3,0xc3
394.size	ecp_nistz256_mul_mont,.-ecp_nistz256_mul_mont
395
396.type	__ecp_nistz256_mul_montq,@function
397.align	32
398__ecp_nistz256_mul_montq:
399
400
401	movq	%rax,%rbp
402	mulq	%r9
403	movq	.Lpoly+8(%rip),%r14
404	movq	%rax,%r8
405	movq	%rbp,%rax
406	movq	%rdx,%r9
407
408	mulq	%r10
409	movq	.Lpoly+24(%rip),%r15
410	addq	%rax,%r9
411	movq	%rbp,%rax
412	adcq	$0,%rdx
413	movq	%rdx,%r10
414
415	mulq	%r11
416	addq	%rax,%r10
417	movq	%rbp,%rax
418	adcq	$0,%rdx
419	movq	%rdx,%r11
420
421	mulq	%r12
422	addq	%rax,%r11
423	movq	%r8,%rax
424	adcq	$0,%rdx
425	xorq	%r13,%r13
426	movq	%rdx,%r12
427
428
429
430
431
432
433
434
435
436
437	movq	%r8,%rbp
438	shlq	$32,%r8
439	mulq	%r15
440	shrq	$32,%rbp
441	addq	%r8,%r9
442	adcq	%rbp,%r10
443	adcq	%rax,%r11
444	movq	8(%rbx),%rax
445	adcq	%rdx,%r12
446	adcq	$0,%r13
447	xorq	%r8,%r8
448
449
450
451	movq	%rax,%rbp
452	mulq	0(%rsi)
453	addq	%rax,%r9
454	movq	%rbp,%rax
455	adcq	$0,%rdx
456	movq	%rdx,%rcx
457
458	mulq	8(%rsi)
459	addq	%rcx,%r10
460	adcq	$0,%rdx
461	addq	%rax,%r10
462	movq	%rbp,%rax
463	adcq	$0,%rdx
464	movq	%rdx,%rcx
465
466	mulq	16(%rsi)
467	addq	%rcx,%r11
468	adcq	$0,%rdx
469	addq	%rax,%r11
470	movq	%rbp,%rax
471	adcq	$0,%rdx
472	movq	%rdx,%rcx
473
474	mulq	24(%rsi)
475	addq	%rcx,%r12
476	adcq	$0,%rdx
477	addq	%rax,%r12
478	movq	%r9,%rax
479	adcq	%rdx,%r13
480	adcq	$0,%r8
481
482
483
484	movq	%r9,%rbp
485	shlq	$32,%r9
486	mulq	%r15
487	shrq	$32,%rbp
488	addq	%r9,%r10
489	adcq	%rbp,%r11
490	adcq	%rax,%r12
491	movq	16(%rbx),%rax
492	adcq	%rdx,%r13
493	adcq	$0,%r8
494	xorq	%r9,%r9
495
496
497
498	movq	%rax,%rbp
499	mulq	0(%rsi)
500	addq	%rax,%r10
501	movq	%rbp,%rax
502	adcq	$0,%rdx
503	movq	%rdx,%rcx
504
505	mulq	8(%rsi)
506	addq	%rcx,%r11
507	adcq	$0,%rdx
508	addq	%rax,%r11
509	movq	%rbp,%rax
510	adcq	$0,%rdx
511	movq	%rdx,%rcx
512
513	mulq	16(%rsi)
514	addq	%rcx,%r12
515	adcq	$0,%rdx
516	addq	%rax,%r12
517	movq	%rbp,%rax
518	adcq	$0,%rdx
519	movq	%rdx,%rcx
520
521	mulq	24(%rsi)
522	addq	%rcx,%r13
523	adcq	$0,%rdx
524	addq	%rax,%r13
525	movq	%r10,%rax
526	adcq	%rdx,%r8
527	adcq	$0,%r9
528
529
530
531	movq	%r10,%rbp
532	shlq	$32,%r10
533	mulq	%r15
534	shrq	$32,%rbp
535	addq	%r10,%r11
536	adcq	%rbp,%r12
537	adcq	%rax,%r13
538	movq	24(%rbx),%rax
539	adcq	%rdx,%r8
540	adcq	$0,%r9
541	xorq	%r10,%r10
542
543
544
545	movq	%rax,%rbp
546	mulq	0(%rsi)
547	addq	%rax,%r11
548	movq	%rbp,%rax
549	adcq	$0,%rdx
550	movq	%rdx,%rcx
551
552	mulq	8(%rsi)
553	addq	%rcx,%r12
554	adcq	$0,%rdx
555	addq	%rax,%r12
556	movq	%rbp,%rax
557	adcq	$0,%rdx
558	movq	%rdx,%rcx
559
560	mulq	16(%rsi)
561	addq	%rcx,%r13
562	adcq	$0,%rdx
563	addq	%rax,%r13
564	movq	%rbp,%rax
565	adcq	$0,%rdx
566	movq	%rdx,%rcx
567
568	mulq	24(%rsi)
569	addq	%rcx,%r8
570	adcq	$0,%rdx
571	addq	%rax,%r8
572	movq	%r11,%rax
573	adcq	%rdx,%r9
574	adcq	$0,%r10
575
576
577
578	movq	%r11,%rbp
579	shlq	$32,%r11
580	mulq	%r15
581	shrq	$32,%rbp
582	addq	%r11,%r12
583	adcq	%rbp,%r13
584	movq	%r12,%rcx
585	adcq	%rax,%r8
586	adcq	%rdx,%r9
587	movq	%r13,%rbp
588	adcq	$0,%r10
589
590
591
592	subq	$-1,%r12
593	movq	%r8,%rbx
594	sbbq	%r14,%r13
595	sbbq	$0,%r8
596	movq	%r9,%rdx
597	sbbq	%r15,%r9
598	sbbq	$0,%r10
599
600	cmovcq	%rcx,%r12
601	cmovcq	%rbp,%r13
602	movq	%r12,0(%rdi)
603	cmovcq	%rbx,%r8
604	movq	%r13,8(%rdi)
605	cmovcq	%rdx,%r9
606	movq	%r8,16(%rdi)
607	movq	%r9,24(%rdi)
608
609	.byte	0xf3,0xc3
610.size	__ecp_nistz256_mul_montq,.-__ecp_nistz256_mul_montq
611
612
613
614
615
616
617
618
619.globl	ecp_nistz256_sqr_mont
620.type	ecp_nistz256_sqr_mont,@function
621.align	32
622ecp_nistz256_sqr_mont:
623	movl	$0x80100,%ecx
624	andl	OPENSSL_ia32cap_P+8(%rip),%ecx
625	pushq	%rbp
626	pushq	%rbx
627	pushq	%r12
628	pushq	%r13
629	pushq	%r14
630	pushq	%r15
631	cmpl	$0x80100,%ecx
632	je	.Lsqr_montx
633	movq	0(%rsi),%rax
634	movq	8(%rsi),%r14
635	movq	16(%rsi),%r15
636	movq	24(%rsi),%r8
637
638	call	__ecp_nistz256_sqr_montq
639	jmp	.Lsqr_mont_done
640
641.align	32
642.Lsqr_montx:
643	movq	0(%rsi),%rdx
644	movq	8(%rsi),%r14
645	movq	16(%rsi),%r15
646	movq	24(%rsi),%r8
647	leaq	-128(%rsi),%rsi
648
649	call	__ecp_nistz256_sqr_montx
650.Lsqr_mont_done:
651	popq	%r15
652	popq	%r14
653	popq	%r13
654	popq	%r12
655	popq	%rbx
656	popq	%rbp
657	.byte	0xf3,0xc3
658.size	ecp_nistz256_sqr_mont,.-ecp_nistz256_sqr_mont
659
660.type	__ecp_nistz256_sqr_montq,@function
661.align	32
662__ecp_nistz256_sqr_montq:
663	movq	%rax,%r13
664	mulq	%r14
665	movq	%rax,%r9
666	movq	%r15,%rax
667	movq	%rdx,%r10
668
669	mulq	%r13
670	addq	%rax,%r10
671	movq	%r8,%rax
672	adcq	$0,%rdx
673	movq	%rdx,%r11
674
675	mulq	%r13
676	addq	%rax,%r11
677	movq	%r15,%rax
678	adcq	$0,%rdx
679	movq	%rdx,%r12
680
681
682	mulq	%r14
683	addq	%rax,%r11
684	movq	%r8,%rax
685	adcq	$0,%rdx
686	movq	%rdx,%rbp
687
688	mulq	%r14
689	addq	%rax,%r12
690	movq	%r8,%rax
691	adcq	$0,%rdx
692	addq	%rbp,%r12
693	movq	%rdx,%r13
694	adcq	$0,%r13
695
696
697	mulq	%r15
698	xorq	%r15,%r15
699	addq	%rax,%r13
700	movq	0(%rsi),%rax
701	movq	%rdx,%r14
702	adcq	$0,%r14
703
704	addq	%r9,%r9
705	adcq	%r10,%r10
706	adcq	%r11,%r11
707	adcq	%r12,%r12
708	adcq	%r13,%r13
709	adcq	%r14,%r14
710	adcq	$0,%r15
711
712	mulq	%rax
713	movq	%rax,%r8
714	movq	8(%rsi),%rax
715	movq	%rdx,%rcx
716
717	mulq	%rax
718	addq	%rcx,%r9
719	adcq	%rax,%r10
720	movq	16(%rsi),%rax
721	adcq	$0,%rdx
722	movq	%rdx,%rcx
723
724	mulq	%rax
725	addq	%rcx,%r11
726	adcq	%rax,%r12
727	movq	24(%rsi),%rax
728	adcq	$0,%rdx
729	movq	%rdx,%rcx
730
731	mulq	%rax
732	addq	%rcx,%r13
733	adcq	%rax,%r14
734	movq	%r8,%rax
735	adcq	%rdx,%r15
736
737	movq	.Lpoly+8(%rip),%rsi
738	movq	.Lpoly+24(%rip),%rbp
739
740
741
742
743	movq	%r8,%rcx
744	shlq	$32,%r8
745	mulq	%rbp
746	shrq	$32,%rcx
747	addq	%r8,%r9
748	adcq	%rcx,%r10
749	adcq	%rax,%r11
750	movq	%r9,%rax
751	adcq	$0,%rdx
752
753
754
755	movq	%r9,%rcx
756	shlq	$32,%r9
757	movq	%rdx,%r8
758	mulq	%rbp
759	shrq	$32,%rcx
760	addq	%r9,%r10
761	adcq	%rcx,%r11
762	adcq	%rax,%r8
763	movq	%r10,%rax
764	adcq	$0,%rdx
765
766
767
768	movq	%r10,%rcx
769	shlq	$32,%r10
770	movq	%rdx,%r9
771	mulq	%rbp
772	shrq	$32,%rcx
773	addq	%r10,%r11
774	adcq	%rcx,%r8
775	adcq	%rax,%r9
776	movq	%r11,%rax
777	adcq	$0,%rdx
778
779
780
781	movq	%r11,%rcx
782	shlq	$32,%r11
783	movq	%rdx,%r10
784	mulq	%rbp
785	shrq	$32,%rcx
786	addq	%r11,%r8
787	adcq	%rcx,%r9
788	adcq	%rax,%r10
789	adcq	$0,%rdx
790	xorq	%r11,%r11
791
792
793
794	addq	%r8,%r12
795	adcq	%r9,%r13
796	movq	%r12,%r8
797	adcq	%r10,%r14
798	adcq	%rdx,%r15
799	movq	%r13,%r9
800	adcq	$0,%r11
801
802	subq	$-1,%r12
803	movq	%r14,%r10
804	sbbq	%rsi,%r13
805	sbbq	$0,%r14
806	movq	%r15,%rcx
807	sbbq	%rbp,%r15
808	sbbq	$0,%r11
809
810	cmovcq	%r8,%r12
811	cmovcq	%r9,%r13
812	movq	%r12,0(%rdi)
813	cmovcq	%r10,%r14
814	movq	%r13,8(%rdi)
815	cmovcq	%rcx,%r15
816	movq	%r14,16(%rdi)
817	movq	%r15,24(%rdi)
818
819	.byte	0xf3,0xc3
820.size	__ecp_nistz256_sqr_montq,.-__ecp_nistz256_sqr_montq
821.type	__ecp_nistz256_mul_montx,@function
822.align	32
823__ecp_nistz256_mul_montx:
824
825
826	mulxq	%r9,%r8,%r9
827	mulxq	%r10,%rcx,%r10
828	movq	$32,%r14
829	xorq	%r13,%r13
830	mulxq	%r11,%rbp,%r11
831	movq	.Lpoly+24(%rip),%r15
832	adcq	%rcx,%r9
833	mulxq	%r12,%rcx,%r12
834	movq	%r8,%rdx
835	adcq	%rbp,%r10
836	shlxq	%r14,%r8,%rbp
837	adcq	%rcx,%r11
838	shrxq	%r14,%r8,%rcx
839	adcq	$0,%r12
840
841
842
843	addq	%rbp,%r9
844	adcq	%rcx,%r10
845
846	mulxq	%r15,%rcx,%rbp
847	movq	8(%rbx),%rdx
848	adcq	%rcx,%r11
849	adcq	%rbp,%r12
850	adcq	$0,%r13
851	xorq	%r8,%r8
852
853
854
855	mulxq	0+128(%rsi),%rcx,%rbp
856	adcxq	%rcx,%r9
857	adoxq	%rbp,%r10
858
859	mulxq	8+128(%rsi),%rcx,%rbp
860	adcxq	%rcx,%r10
861	adoxq	%rbp,%r11
862
863	mulxq	16+128(%rsi),%rcx,%rbp
864	adcxq	%rcx,%r11
865	adoxq	%rbp,%r12
866
867	mulxq	24+128(%rsi),%rcx,%rbp
868	movq	%r9,%rdx
869	adcxq	%rcx,%r12
870	shlxq	%r14,%r9,%rcx
871	adoxq	%rbp,%r13
872	shrxq	%r14,%r9,%rbp
873
874	adcxq	%r8,%r13
875	adoxq	%r8,%r8
876	adcq	$0,%r8
877
878
879
880	addq	%rcx,%r10
881	adcq	%rbp,%r11
882
883	mulxq	%r15,%rcx,%rbp
884	movq	16(%rbx),%rdx
885	adcq	%rcx,%r12
886	adcq	%rbp,%r13
887	adcq	$0,%r8
888	xorq	%r9,%r9
889
890
891
892	mulxq	0+128(%rsi),%rcx,%rbp
893	adcxq	%rcx,%r10
894	adoxq	%rbp,%r11
895
896	mulxq	8+128(%rsi),%rcx,%rbp
897	adcxq	%rcx,%r11
898	adoxq	%rbp,%r12
899
900	mulxq	16+128(%rsi),%rcx,%rbp
901	adcxq	%rcx,%r12
902	adoxq	%rbp,%r13
903
904	mulxq	24+128(%rsi),%rcx,%rbp
905	movq	%r10,%rdx
906	adcxq	%rcx,%r13
907	shlxq	%r14,%r10,%rcx
908	adoxq	%rbp,%r8
909	shrxq	%r14,%r10,%rbp
910
911	adcxq	%r9,%r8
912	adoxq	%r9,%r9
913	adcq	$0,%r9
914
915
916
917	addq	%rcx,%r11
918	adcq	%rbp,%r12
919
920	mulxq	%r15,%rcx,%rbp
921	movq	24(%rbx),%rdx
922	adcq	%rcx,%r13
923	adcq	%rbp,%r8
924	adcq	$0,%r9
925	xorq	%r10,%r10
926
927
928
929	mulxq	0+128(%rsi),%rcx,%rbp
930	adcxq	%rcx,%r11
931	adoxq	%rbp,%r12
932
933	mulxq	8+128(%rsi),%rcx,%rbp
934	adcxq	%rcx,%r12
935	adoxq	%rbp,%r13
936
937	mulxq	16+128(%rsi),%rcx,%rbp
938	adcxq	%rcx,%r13
939	adoxq	%rbp,%r8
940
941	mulxq	24+128(%rsi),%rcx,%rbp
942	movq	%r11,%rdx
943	adcxq	%rcx,%r8
944	shlxq	%r14,%r11,%rcx
945	adoxq	%rbp,%r9
946	shrxq	%r14,%r11,%rbp
947
948	adcxq	%r10,%r9
949	adoxq	%r10,%r10
950	adcq	$0,%r10
951
952
953
954	addq	%rcx,%r12
955	adcq	%rbp,%r13
956
957	mulxq	%r15,%rcx,%rbp
958	movq	%r12,%rbx
959	movq	.Lpoly+8(%rip),%r14
960	adcq	%rcx,%r8
961	movq	%r13,%rdx
962	adcq	%rbp,%r9
963	adcq	$0,%r10
964
965
966
967	xorl	%eax,%eax
968	movq	%r8,%rcx
969	sbbq	$-1,%r12
970	sbbq	%r14,%r13
971	sbbq	$0,%r8
972	movq	%r9,%rbp
973	sbbq	%r15,%r9
974	sbbq	$0,%r10
975
976	cmovcq	%rbx,%r12
977	cmovcq	%rdx,%r13
978	movq	%r12,0(%rdi)
979	cmovcq	%rcx,%r8
980	movq	%r13,8(%rdi)
981	cmovcq	%rbp,%r9
982	movq	%r8,16(%rdi)
983	movq	%r9,24(%rdi)
984
985	.byte	0xf3,0xc3
986.size	__ecp_nistz256_mul_montx,.-__ecp_nistz256_mul_montx
987
988.type	__ecp_nistz256_sqr_montx,@function
989.align	32
990__ecp_nistz256_sqr_montx:
991	mulxq	%r14,%r9,%r10
992	mulxq	%r15,%rcx,%r11
993	xorl	%eax,%eax
994	adcq	%rcx,%r10
995	mulxq	%r8,%rbp,%r12
996	movq	%r14,%rdx
997	adcq	%rbp,%r11
998	adcq	$0,%r12
999	xorq	%r13,%r13
1000
1001
1002	mulxq	%r15,%rcx,%rbp
1003	adcxq	%rcx,%r11
1004	adoxq	%rbp,%r12
1005
1006	mulxq	%r8,%rcx,%rbp
1007	movq	%r15,%rdx
1008	adcxq	%rcx,%r12
1009	adoxq	%rbp,%r13
1010	adcq	$0,%r13
1011
1012
1013	mulxq	%r8,%rcx,%r14
1014	movq	0+128(%rsi),%rdx
1015	xorq	%r15,%r15
1016	adcxq	%r9,%r9
1017	adoxq	%rcx,%r13
1018	adcxq	%r10,%r10
1019	adoxq	%r15,%r14
1020
1021	mulxq	%rdx,%r8,%rbp
1022	movq	8+128(%rsi),%rdx
1023	adcxq	%r11,%r11
1024	adoxq	%rbp,%r9
1025	adcxq	%r12,%r12
1026	mulxq	%rdx,%rcx,%rax
1027	movq	16+128(%rsi),%rdx
1028	adcxq	%r13,%r13
1029	adoxq	%rcx,%r10
1030	adcxq	%r14,%r14
1031.byte	0x67
1032	mulxq	%rdx,%rcx,%rbp
1033	movq	24+128(%rsi),%rdx
1034	adoxq	%rax,%r11
1035	adcxq	%r15,%r15
1036	adoxq	%rcx,%r12
1037	movq	$32,%rsi
1038	adoxq	%rbp,%r13
1039.byte	0x67,0x67
1040	mulxq	%rdx,%rcx,%rax
1041	movq	.Lpoly+24(%rip),%rdx
1042	adoxq	%rcx,%r14
1043	shlxq	%rsi,%r8,%rcx
1044	adoxq	%rax,%r15
1045	shrxq	%rsi,%r8,%rax
1046	movq	%rdx,%rbp
1047
1048
1049	addq	%rcx,%r9
1050	adcq	%rax,%r10
1051
1052	mulxq	%r8,%rcx,%r8
1053	adcq	%rcx,%r11
1054	shlxq	%rsi,%r9,%rcx
1055	adcq	$0,%r8
1056	shrxq	%rsi,%r9,%rax
1057
1058
1059	addq	%rcx,%r10
1060	adcq	%rax,%r11
1061
1062	mulxq	%r9,%rcx,%r9
1063	adcq	%rcx,%r8
1064	shlxq	%rsi,%r10,%rcx
1065	adcq	$0,%r9
1066	shrxq	%rsi,%r10,%rax
1067
1068
1069	addq	%rcx,%r11
1070	adcq	%rax,%r8
1071
1072	mulxq	%r10,%rcx,%r10
1073	adcq	%rcx,%r9
1074	shlxq	%rsi,%r11,%rcx
1075	adcq	$0,%r10
1076	shrxq	%rsi,%r11,%rax
1077
1078
1079	addq	%rcx,%r8
1080	adcq	%rax,%r9
1081
1082	mulxq	%r11,%rcx,%r11
1083	adcq	%rcx,%r10
1084	adcq	$0,%r11
1085
1086	xorq	%rdx,%rdx
1087	addq	%r8,%r12
1088	movq	.Lpoly+8(%rip),%rsi
1089	adcq	%r9,%r13
1090	movq	%r12,%r8
1091	adcq	%r10,%r14
1092	adcq	%r11,%r15
1093	movq	%r13,%r9
1094	adcq	$0,%rdx
1095
1096	subq	$-1,%r12
1097	movq	%r14,%r10
1098	sbbq	%rsi,%r13
1099	sbbq	$0,%r14
1100	movq	%r15,%r11
1101	sbbq	%rbp,%r15
1102	sbbq	$0,%rdx
1103
1104	cmovcq	%r8,%r12
1105	cmovcq	%r9,%r13
1106	movq	%r12,0(%rdi)
1107	cmovcq	%r10,%r14
1108	movq	%r13,8(%rdi)
1109	cmovcq	%r11,%r15
1110	movq	%r14,16(%rdi)
1111	movq	%r15,24(%rdi)
1112
1113	.byte	0xf3,0xc3
1114.size	__ecp_nistz256_sqr_montx,.-__ecp_nistz256_sqr_montx
1115
1116
1117
1118
1119
1120
1121.globl	ecp_nistz256_from_mont
1122.type	ecp_nistz256_from_mont,@function
1123.align	32
1124ecp_nistz256_from_mont:
1125	pushq	%r12
1126	pushq	%r13
1127
1128	movq	0(%rsi),%rax
1129	movq	.Lpoly+24(%rip),%r13
1130	movq	8(%rsi),%r9
1131	movq	16(%rsi),%r10
1132	movq	24(%rsi),%r11
1133	movq	%rax,%r8
1134	movq	.Lpoly+8(%rip),%r12
1135
1136
1137
1138	movq	%rax,%rcx
1139	shlq	$32,%r8
1140	mulq	%r13
1141	shrq	$32,%rcx
1142	addq	%r8,%r9
1143	adcq	%rcx,%r10
1144	adcq	%rax,%r11
1145	movq	%r9,%rax
1146	adcq	$0,%rdx
1147
1148
1149
1150	movq	%r9,%rcx
1151	shlq	$32,%r9
1152	movq	%rdx,%r8
1153	mulq	%r13
1154	shrq	$32,%rcx
1155	addq	%r9,%r10
1156	adcq	%rcx,%r11
1157	adcq	%rax,%r8
1158	movq	%r10,%rax
1159	adcq	$0,%rdx
1160
1161
1162
1163	movq	%r10,%rcx
1164	shlq	$32,%r10
1165	movq	%rdx,%r9
1166	mulq	%r13
1167	shrq	$32,%rcx
1168	addq	%r10,%r11
1169	adcq	%rcx,%r8
1170	adcq	%rax,%r9
1171	movq	%r11,%rax
1172	adcq	$0,%rdx
1173
1174
1175
1176	movq	%r11,%rcx
1177	shlq	$32,%r11
1178	movq	%rdx,%r10
1179	mulq	%r13
1180	shrq	$32,%rcx
1181	addq	%r11,%r8
1182	adcq	%rcx,%r9
1183	movq	%r8,%rcx
1184	adcq	%rax,%r10
1185	movq	%r9,%rsi
1186	adcq	$0,%rdx
1187
1188
1189
1190	subq	$-1,%r8
1191	movq	%r10,%rax
1192	sbbq	%r12,%r9
1193	sbbq	$0,%r10
1194	movq	%rdx,%r11
1195	sbbq	%r13,%rdx
1196	sbbq	%r13,%r13
1197
1198	cmovnzq	%rcx,%r8
1199	cmovnzq	%rsi,%r9
1200	movq	%r8,0(%rdi)
1201	cmovnzq	%rax,%r10
1202	movq	%r9,8(%rdi)
1203	cmovzq	%rdx,%r11
1204	movq	%r10,16(%rdi)
1205	movq	%r11,24(%rdi)
1206
1207	popq	%r13
1208	popq	%r12
1209	.byte	0xf3,0xc3
1210.size	ecp_nistz256_from_mont,.-ecp_nistz256_from_mont
1211
1212
1213.globl	ecp_nistz256_select_w5
1214.type	ecp_nistz256_select_w5,@function
1215.align	32
1216ecp_nistz256_select_w5:
1217	movl	OPENSSL_ia32cap_P+8(%rip),%eax
1218	testl	$32,%eax
1219	jnz	.Lavx2_select_w5
1220	movdqa	.LOne(%rip),%xmm0
1221	movd	%edx,%xmm1
1222
1223	pxor	%xmm2,%xmm2
1224	pxor	%xmm3,%xmm3
1225	pxor	%xmm4,%xmm4
1226	pxor	%xmm5,%xmm5
1227	pxor	%xmm6,%xmm6
1228	pxor	%xmm7,%xmm7
1229
1230	movdqa	%xmm0,%xmm8
1231	pshufd	$0,%xmm1,%xmm1
1232
1233	movq	$16,%rax
1234.Lselect_loop_sse_w5:
1235
1236	movdqa	%xmm8,%xmm15
1237	paddd	%xmm0,%xmm8
1238	pcmpeqd	%xmm1,%xmm15
1239
1240	movdqa	0(%rsi),%xmm9
1241	movdqa	16(%rsi),%xmm10
1242	movdqa	32(%rsi),%xmm11
1243	movdqa	48(%rsi),%xmm12
1244	movdqa	64(%rsi),%xmm13
1245	movdqa	80(%rsi),%xmm14
1246	leaq	96(%rsi),%rsi
1247
1248	pand	%xmm15,%xmm9
1249	pand	%xmm15,%xmm10
1250	por	%xmm9,%xmm2
1251	pand	%xmm15,%xmm11
1252	por	%xmm10,%xmm3
1253	pand	%xmm15,%xmm12
1254	por	%xmm11,%xmm4
1255	pand	%xmm15,%xmm13
1256	por	%xmm12,%xmm5
1257	pand	%xmm15,%xmm14
1258	por	%xmm13,%xmm6
1259	por	%xmm14,%xmm7
1260
1261	decq	%rax
1262	jnz	.Lselect_loop_sse_w5
1263
1264	movdqu	%xmm2,0(%rdi)
1265	movdqu	%xmm3,16(%rdi)
1266	movdqu	%xmm4,32(%rdi)
1267	movdqu	%xmm5,48(%rdi)
1268	movdqu	%xmm6,64(%rdi)
1269	movdqu	%xmm7,80(%rdi)
1270	.byte	0xf3,0xc3
1271.size	ecp_nistz256_select_w5,.-ecp_nistz256_select_w5
1272
1273
1274
1275.globl	ecp_nistz256_select_w7
1276.type	ecp_nistz256_select_w7,@function
1277.align	32
1278ecp_nistz256_select_w7:
1279	movl	OPENSSL_ia32cap_P+8(%rip),%eax
1280	testl	$32,%eax
1281	jnz	.Lavx2_select_w7
1282	movdqa	.LOne(%rip),%xmm8
1283	movd	%edx,%xmm1
1284
1285	pxor	%xmm2,%xmm2
1286	pxor	%xmm3,%xmm3
1287	pxor	%xmm4,%xmm4
1288	pxor	%xmm5,%xmm5
1289
1290	movdqa	%xmm8,%xmm0
1291	pshufd	$0,%xmm1,%xmm1
1292	movq	$64,%rax
1293
1294.Lselect_loop_sse_w7:
1295	movdqa	%xmm8,%xmm15
1296	paddd	%xmm0,%xmm8
1297	movdqa	0(%rsi),%xmm9
1298	movdqa	16(%rsi),%xmm10
1299	pcmpeqd	%xmm1,%xmm15
1300	movdqa	32(%rsi),%xmm11
1301	movdqa	48(%rsi),%xmm12
1302	leaq	64(%rsi),%rsi
1303
1304	pand	%xmm15,%xmm9
1305	pand	%xmm15,%xmm10
1306	por	%xmm9,%xmm2
1307	pand	%xmm15,%xmm11
1308	por	%xmm10,%xmm3
1309	pand	%xmm15,%xmm12
1310	por	%xmm11,%xmm4
1311	prefetcht0	255(%rsi)
1312	por	%xmm12,%xmm5
1313
1314	decq	%rax
1315	jnz	.Lselect_loop_sse_w7
1316
1317	movdqu	%xmm2,0(%rdi)
1318	movdqu	%xmm3,16(%rdi)
1319	movdqu	%xmm4,32(%rdi)
1320	movdqu	%xmm5,48(%rdi)
1321	.byte	0xf3,0xc3
1322.size	ecp_nistz256_select_w7,.-ecp_nistz256_select_w7
1323
1324
1325.type	ecp_nistz256_avx2_select_w5,@function
1326.align	32
1327ecp_nistz256_avx2_select_w5:
1328.Lavx2_select_w5:
1329	vzeroupper
1330	vmovdqa	.LTwo(%rip),%ymm0
1331
1332	vpxor	%ymm2,%ymm2,%ymm2
1333	vpxor	%ymm3,%ymm3,%ymm3
1334	vpxor	%ymm4,%ymm4,%ymm4
1335
1336	vmovdqa	.LOne(%rip),%ymm5
1337	vmovdqa	.LTwo(%rip),%ymm10
1338
1339	vmovd	%edx,%xmm1
1340	vpermd	%ymm1,%ymm2,%ymm1
1341
1342	movq	$8,%rax
1343.Lselect_loop_avx2_w5:
1344
1345	vmovdqa	0(%rsi),%ymm6
1346	vmovdqa	32(%rsi),%ymm7
1347	vmovdqa	64(%rsi),%ymm8
1348
1349	vmovdqa	96(%rsi),%ymm11
1350	vmovdqa	128(%rsi),%ymm12
1351	vmovdqa	160(%rsi),%ymm13
1352
1353	vpcmpeqd	%ymm1,%ymm5,%ymm9
1354	vpcmpeqd	%ymm1,%ymm10,%ymm14
1355
1356	vpaddd	%ymm0,%ymm5,%ymm5
1357	vpaddd	%ymm0,%ymm10,%ymm10
1358	leaq	192(%rsi),%rsi
1359
1360	vpand	%ymm9,%ymm6,%ymm6
1361	vpand	%ymm9,%ymm7,%ymm7
1362	vpand	%ymm9,%ymm8,%ymm8
1363	vpand	%ymm14,%ymm11,%ymm11
1364	vpand	%ymm14,%ymm12,%ymm12
1365	vpand	%ymm14,%ymm13,%ymm13
1366
1367	vpxor	%ymm6,%ymm2,%ymm2
1368	vpxor	%ymm7,%ymm3,%ymm3
1369	vpxor	%ymm8,%ymm4,%ymm4
1370	vpxor	%ymm11,%ymm2,%ymm2
1371	vpxor	%ymm12,%ymm3,%ymm3
1372	vpxor	%ymm13,%ymm4,%ymm4
1373
1374	decq	%rax
1375	jnz	.Lselect_loop_avx2_w5
1376
1377	vmovdqu	%ymm2,0(%rdi)
1378	vmovdqu	%ymm3,32(%rdi)
1379	vmovdqu	%ymm4,64(%rdi)
1380	vzeroupper
1381	.byte	0xf3,0xc3
1382.size	ecp_nistz256_avx2_select_w5,.-ecp_nistz256_avx2_select_w5
1383
1384
1385
1386.globl	ecp_nistz256_avx2_select_w7
1387.type	ecp_nistz256_avx2_select_w7,@function
1388.align	32
1389ecp_nistz256_avx2_select_w7:
1390.Lavx2_select_w7:
1391	vzeroupper
1392	vmovdqa	.LThree(%rip),%ymm0
1393
1394	vpxor	%ymm2,%ymm2,%ymm2
1395	vpxor	%ymm3,%ymm3,%ymm3
1396
1397	vmovdqa	.LOne(%rip),%ymm4
1398	vmovdqa	.LTwo(%rip),%ymm8
1399	vmovdqa	.LThree(%rip),%ymm12
1400
1401	vmovd	%edx,%xmm1
1402	vpermd	%ymm1,%ymm2,%ymm1
1403
1404
1405	movq	$21,%rax
1406.Lselect_loop_avx2_w7:
1407
1408	vmovdqa	0(%rsi),%ymm5
1409	vmovdqa	32(%rsi),%ymm6
1410
1411	vmovdqa	64(%rsi),%ymm9
1412	vmovdqa	96(%rsi),%ymm10
1413
1414	vmovdqa	128(%rsi),%ymm13
1415	vmovdqa	160(%rsi),%ymm14
1416
1417	vpcmpeqd	%ymm1,%ymm4,%ymm7
1418	vpcmpeqd	%ymm1,%ymm8,%ymm11
1419	vpcmpeqd	%ymm1,%ymm12,%ymm15
1420
1421	vpaddd	%ymm0,%ymm4,%ymm4
1422	vpaddd	%ymm0,%ymm8,%ymm8
1423	vpaddd	%ymm0,%ymm12,%ymm12
1424	leaq	192(%rsi),%rsi
1425
1426	vpand	%ymm7,%ymm5,%ymm5
1427	vpand	%ymm7,%ymm6,%ymm6
1428	vpand	%ymm11,%ymm9,%ymm9
1429	vpand	%ymm11,%ymm10,%ymm10
1430	vpand	%ymm15,%ymm13,%ymm13
1431	vpand	%ymm15,%ymm14,%ymm14
1432
1433	vpxor	%ymm5,%ymm2,%ymm2
1434	vpxor	%ymm6,%ymm3,%ymm3
1435	vpxor	%ymm9,%ymm2,%ymm2
1436	vpxor	%ymm10,%ymm3,%ymm3
1437	vpxor	%ymm13,%ymm2,%ymm2
1438	vpxor	%ymm14,%ymm3,%ymm3
1439
1440	decq	%rax
1441	jnz	.Lselect_loop_avx2_w7
1442
1443
1444	vmovdqa	0(%rsi),%ymm5
1445	vmovdqa	32(%rsi),%ymm6
1446
1447	vpcmpeqd	%ymm1,%ymm4,%ymm7
1448
1449	vpand	%ymm7,%ymm5,%ymm5
1450	vpand	%ymm7,%ymm6,%ymm6
1451
1452	vpxor	%ymm5,%ymm2,%ymm2
1453	vpxor	%ymm6,%ymm3,%ymm3
1454
1455	vmovdqu	%ymm2,0(%rdi)
1456	vmovdqu	%ymm3,32(%rdi)
1457	vzeroupper
1458	.byte	0xf3,0xc3
1459.size	ecp_nistz256_avx2_select_w7,.-ecp_nistz256_avx2_select_w7
1460.type	__ecp_nistz256_add_toq,@function
1461.align	32
1462__ecp_nistz256_add_toq:
1463	xorq	%r11,%r11
1464	addq	0(%rbx),%r12
1465	adcq	8(%rbx),%r13
1466	movq	%r12,%rax
1467	adcq	16(%rbx),%r8
1468	adcq	24(%rbx),%r9
1469	movq	%r13,%rbp
1470	adcq	$0,%r11
1471
1472	subq	$-1,%r12
1473	movq	%r8,%rcx
1474	sbbq	%r14,%r13
1475	sbbq	$0,%r8
1476	movq	%r9,%r10
1477	sbbq	%r15,%r9
1478	sbbq	$0,%r11
1479
1480	cmovcq	%rax,%r12
1481	cmovcq	%rbp,%r13
1482	movq	%r12,0(%rdi)
1483	cmovcq	%rcx,%r8
1484	movq	%r13,8(%rdi)
1485	cmovcq	%r10,%r9
1486	movq	%r8,16(%rdi)
1487	movq	%r9,24(%rdi)
1488
1489	.byte	0xf3,0xc3
1490.size	__ecp_nistz256_add_toq,.-__ecp_nistz256_add_toq
1491
1492.type	__ecp_nistz256_sub_fromq,@function
1493.align	32
1494__ecp_nistz256_sub_fromq:
1495	subq	0(%rbx),%r12
1496	sbbq	8(%rbx),%r13
1497	movq	%r12,%rax
1498	sbbq	16(%rbx),%r8
1499	sbbq	24(%rbx),%r9
1500	movq	%r13,%rbp
1501	sbbq	%r11,%r11
1502
1503	addq	$-1,%r12
1504	movq	%r8,%rcx
1505	adcq	%r14,%r13
1506	adcq	$0,%r8
1507	movq	%r9,%r10
1508	adcq	%r15,%r9
1509	testq	%r11,%r11
1510
1511	cmovzq	%rax,%r12
1512	cmovzq	%rbp,%r13
1513	movq	%r12,0(%rdi)
1514	cmovzq	%rcx,%r8
1515	movq	%r13,8(%rdi)
1516	cmovzq	%r10,%r9
1517	movq	%r8,16(%rdi)
1518	movq	%r9,24(%rdi)
1519
1520	.byte	0xf3,0xc3
1521.size	__ecp_nistz256_sub_fromq,.-__ecp_nistz256_sub_fromq
1522
1523.type	__ecp_nistz256_subq,@function
1524.align	32
1525__ecp_nistz256_subq:
1526	subq	%r12,%rax
1527	sbbq	%r13,%rbp
1528	movq	%rax,%r12
1529	sbbq	%r8,%rcx
1530	sbbq	%r9,%r10
1531	movq	%rbp,%r13
1532	sbbq	%r11,%r11
1533
1534	addq	$-1,%rax
1535	movq	%rcx,%r8
1536	adcq	%r14,%rbp
1537	adcq	$0,%rcx
1538	movq	%r10,%r9
1539	adcq	%r15,%r10
1540	testq	%r11,%r11
1541
1542	cmovnzq	%rax,%r12
1543	cmovnzq	%rbp,%r13
1544	cmovnzq	%rcx,%r8
1545	cmovnzq	%r10,%r9
1546
1547	.byte	0xf3,0xc3
1548.size	__ecp_nistz256_subq,.-__ecp_nistz256_subq
1549
1550.type	__ecp_nistz256_mul_by_2q,@function
1551.align	32
1552__ecp_nistz256_mul_by_2q:
1553	xorq	%r11,%r11
1554	addq	%r12,%r12
1555	adcq	%r13,%r13
1556	movq	%r12,%rax
1557	adcq	%r8,%r8
1558	adcq	%r9,%r9
1559	movq	%r13,%rbp
1560	adcq	$0,%r11
1561
1562	subq	$-1,%r12
1563	movq	%r8,%rcx
1564	sbbq	%r14,%r13
1565	sbbq	$0,%r8
1566	movq	%r9,%r10
1567	sbbq	%r15,%r9
1568	sbbq	$0,%r11
1569
1570	cmovcq	%rax,%r12
1571	cmovcq	%rbp,%r13
1572	movq	%r12,0(%rdi)
1573	cmovcq	%rcx,%r8
1574	movq	%r13,8(%rdi)
1575	cmovcq	%r10,%r9
1576	movq	%r8,16(%rdi)
1577	movq	%r9,24(%rdi)
1578
1579	.byte	0xf3,0xc3
1580.size	__ecp_nistz256_mul_by_2q,.-__ecp_nistz256_mul_by_2q
1581.globl	ecp_nistz256_point_double
1582.type	ecp_nistz256_point_double,@function
1583.align	32
1584ecp_nistz256_point_double:
1585	movl	$0x80100,%ecx
1586	andl	OPENSSL_ia32cap_P+8(%rip),%ecx
1587	cmpl	$0x80100,%ecx
1588	je	.Lpoint_doublex
1589	pushq	%rbp
1590	pushq	%rbx
1591	pushq	%r12
1592	pushq	%r13
1593	pushq	%r14
1594	pushq	%r15
1595	subq	$160+8,%rsp
1596
1597.Lpoint_double_shortcutq:
1598	movdqu	0(%rsi),%xmm0
1599	movq	%rsi,%rbx
1600	movdqu	16(%rsi),%xmm1
1601	movq	32+0(%rsi),%r12
1602	movq	32+8(%rsi),%r13
1603	movq	32+16(%rsi),%r8
1604	movq	32+24(%rsi),%r9
1605	movq	.Lpoly+8(%rip),%r14
1606	movq	.Lpoly+24(%rip),%r15
1607	movdqa	%xmm0,96(%rsp)
1608	movdqa	%xmm1,96+16(%rsp)
1609	leaq	32(%rdi),%r10
1610	leaq	64(%rdi),%r11
1611.byte	102,72,15,110,199
1612.byte	102,73,15,110,202
1613.byte	102,73,15,110,211
1614
1615	leaq	0(%rsp),%rdi
1616	call	__ecp_nistz256_mul_by_2q
1617
1618	movq	64+0(%rsi),%rax
1619	movq	64+8(%rsi),%r14
1620	movq	64+16(%rsi),%r15
1621	movq	64+24(%rsi),%r8
1622	leaq	64-0(%rsi),%rsi
1623	leaq	64(%rsp),%rdi
1624	call	__ecp_nistz256_sqr_montq
1625
1626	movq	0+0(%rsp),%rax
1627	movq	8+0(%rsp),%r14
1628	leaq	0+0(%rsp),%rsi
1629	movq	16+0(%rsp),%r15
1630	movq	24+0(%rsp),%r8
1631	leaq	0(%rsp),%rdi
1632	call	__ecp_nistz256_sqr_montq
1633
1634	movq	32(%rbx),%rax
1635	movq	64+0(%rbx),%r9
1636	movq	64+8(%rbx),%r10
1637	movq	64+16(%rbx),%r11
1638	movq	64+24(%rbx),%r12
1639	leaq	64-0(%rbx),%rsi
1640	leaq	32(%rbx),%rbx
1641.byte	102,72,15,126,215
1642	call	__ecp_nistz256_mul_montq
1643	call	__ecp_nistz256_mul_by_2q
1644
1645	movq	96+0(%rsp),%r12
1646	movq	96+8(%rsp),%r13
1647	leaq	64(%rsp),%rbx
1648	movq	96+16(%rsp),%r8
1649	movq	96+24(%rsp),%r9
1650	leaq	32(%rsp),%rdi
1651	call	__ecp_nistz256_add_toq
1652
1653	movq	96+0(%rsp),%r12
1654	movq	96+8(%rsp),%r13
1655	leaq	64(%rsp),%rbx
1656	movq	96+16(%rsp),%r8
1657	movq	96+24(%rsp),%r9
1658	leaq	64(%rsp),%rdi
1659	call	__ecp_nistz256_sub_fromq
1660
1661	movq	0+0(%rsp),%rax
1662	movq	8+0(%rsp),%r14
1663	leaq	0+0(%rsp),%rsi
1664	movq	16+0(%rsp),%r15
1665	movq	24+0(%rsp),%r8
1666.byte	102,72,15,126,207
1667	call	__ecp_nistz256_sqr_montq
1668	xorq	%r9,%r9
1669	movq	%r12,%rax
1670	addq	$-1,%r12
1671	movq	%r13,%r10
1672	adcq	%rsi,%r13
1673	movq	%r14,%rcx
1674	adcq	$0,%r14
1675	movq	%r15,%r8
1676	adcq	%rbp,%r15
1677	adcq	$0,%r9
1678	xorq	%rsi,%rsi
1679	testq	$1,%rax
1680
1681	cmovzq	%rax,%r12
1682	cmovzq	%r10,%r13
1683	cmovzq	%rcx,%r14
1684	cmovzq	%r8,%r15
1685	cmovzq	%rsi,%r9
1686
1687	movq	%r13,%rax
1688	shrq	$1,%r12
1689	shlq	$63,%rax
1690	movq	%r14,%r10
1691	shrq	$1,%r13
1692	orq	%rax,%r12
1693	shlq	$63,%r10
1694	movq	%r15,%rcx
1695	shrq	$1,%r14
1696	orq	%r10,%r13
1697	shlq	$63,%rcx
1698	movq	%r12,0(%rdi)
1699	shrq	$1,%r15
1700	movq	%r13,8(%rdi)
1701	shlq	$63,%r9
1702	orq	%rcx,%r14
1703	orq	%r9,%r15
1704	movq	%r14,16(%rdi)
1705	movq	%r15,24(%rdi)
1706	movq	64(%rsp),%rax
1707	leaq	64(%rsp),%rbx
1708	movq	0+32(%rsp),%r9
1709	movq	8+32(%rsp),%r10
1710	leaq	0+32(%rsp),%rsi
1711	movq	16+32(%rsp),%r11
1712	movq	24+32(%rsp),%r12
1713	leaq	32(%rsp),%rdi
1714	call	__ecp_nistz256_mul_montq
1715
1716	leaq	128(%rsp),%rdi
1717	call	__ecp_nistz256_mul_by_2q
1718
1719	leaq	32(%rsp),%rbx
1720	leaq	32(%rsp),%rdi
1721	call	__ecp_nistz256_add_toq
1722
1723	movq	96(%rsp),%rax
1724	leaq	96(%rsp),%rbx
1725	movq	0+0(%rsp),%r9
1726	movq	8+0(%rsp),%r10
1727	leaq	0+0(%rsp),%rsi
1728	movq	16+0(%rsp),%r11
1729	movq	24+0(%rsp),%r12
1730	leaq	0(%rsp),%rdi
1731	call	__ecp_nistz256_mul_montq
1732
1733	leaq	128(%rsp),%rdi
1734	call	__ecp_nistz256_mul_by_2q
1735
1736	movq	0+32(%rsp),%rax
1737	movq	8+32(%rsp),%r14
1738	leaq	0+32(%rsp),%rsi
1739	movq	16+32(%rsp),%r15
1740	movq	24+32(%rsp),%r8
1741.byte	102,72,15,126,199
1742	call	__ecp_nistz256_sqr_montq
1743
1744	leaq	128(%rsp),%rbx
1745	movq	%r14,%r8
1746	movq	%r15,%r9
1747	movq	%rsi,%r14
1748	movq	%rbp,%r15
1749	call	__ecp_nistz256_sub_fromq
1750
1751	movq	0+0(%rsp),%rax
1752	movq	0+8(%rsp),%rbp
1753	movq	0+16(%rsp),%rcx
1754	movq	0+24(%rsp),%r10
1755	leaq	0(%rsp),%rdi
1756	call	__ecp_nistz256_subq
1757
1758	movq	32(%rsp),%rax
1759	leaq	32(%rsp),%rbx
1760	movq	%r12,%r14
1761	xorl	%ecx,%ecx
1762	movq	%r12,0+0(%rsp)
1763	movq	%r13,%r10
1764	movq	%r13,0+8(%rsp)
1765	cmovzq	%r8,%r11
1766	movq	%r8,0+16(%rsp)
1767	leaq	0-0(%rsp),%rsi
1768	cmovzq	%r9,%r12
1769	movq	%r9,0+24(%rsp)
1770	movq	%r14,%r9
1771	leaq	0(%rsp),%rdi
1772	call	__ecp_nistz256_mul_montq
1773
1774.byte	102,72,15,126,203
1775.byte	102,72,15,126,207
1776	call	__ecp_nistz256_sub_fromq
1777
1778	addq	$160+8,%rsp
1779	popq	%r15
1780	popq	%r14
1781	popq	%r13
1782	popq	%r12
1783	popq	%rbx
1784	popq	%rbp
1785	.byte	0xf3,0xc3
1786.size	ecp_nistz256_point_double,.-ecp_nistz256_point_double
1787.globl	ecp_nistz256_point_add
1788.type	ecp_nistz256_point_add,@function
1789.align	32
1790ecp_nistz256_point_add:
1791	movl	$0x80100,%ecx
1792	andl	OPENSSL_ia32cap_P+8(%rip),%ecx
1793	cmpl	$0x80100,%ecx
1794	je	.Lpoint_addx
1795	pushq	%rbp
1796	pushq	%rbx
1797	pushq	%r12
1798	pushq	%r13
1799	pushq	%r14
1800	pushq	%r15
1801	subq	$576+8,%rsp
1802
1803	movdqu	0(%rsi),%xmm0
1804	movdqu	16(%rsi),%xmm1
1805	movdqu	32(%rsi),%xmm2
1806	movdqu	48(%rsi),%xmm3
1807	movdqu	64(%rsi),%xmm4
1808	movdqu	80(%rsi),%xmm5
1809	movq	%rsi,%rbx
1810	movq	%rdx,%rsi
1811	movdqa	%xmm0,384(%rsp)
1812	movdqa	%xmm1,384+16(%rsp)
1813	movdqa	%xmm2,416(%rsp)
1814	movdqa	%xmm3,416+16(%rsp)
1815	movdqa	%xmm4,448(%rsp)
1816	movdqa	%xmm5,448+16(%rsp)
1817	por	%xmm4,%xmm5
1818
1819	movdqu	0(%rsi),%xmm0
1820	pshufd	$0xb1,%xmm5,%xmm3
1821	movdqu	16(%rsi),%xmm1
1822	movdqu	32(%rsi),%xmm2
1823	por	%xmm3,%xmm5
1824	movdqu	48(%rsi),%xmm3
1825	movq	64+0(%rsi),%rax
1826	movq	64+8(%rsi),%r14
1827	movq	64+16(%rsi),%r15
1828	movq	64+24(%rsi),%r8
1829	movdqa	%xmm0,480(%rsp)
1830	pshufd	$0x1e,%xmm5,%xmm4
1831	movdqa	%xmm1,480+16(%rsp)
1832	movdqu	64(%rsi),%xmm0
1833	movdqu	80(%rsi),%xmm1
1834	movdqa	%xmm2,512(%rsp)
1835	movdqa	%xmm3,512+16(%rsp)
1836	por	%xmm4,%xmm5
1837	pxor	%xmm4,%xmm4
1838	por	%xmm0,%xmm1
1839.byte	102,72,15,110,199
1840
1841	leaq	64-0(%rsi),%rsi
1842	movq	%rax,544+0(%rsp)
1843	movq	%r14,544+8(%rsp)
1844	movq	%r15,544+16(%rsp)
1845	movq	%r8,544+24(%rsp)
1846	leaq	96(%rsp),%rdi
1847	call	__ecp_nistz256_sqr_montq
1848
1849	pcmpeqd	%xmm4,%xmm5
1850	pshufd	$0xb1,%xmm1,%xmm4
1851	por	%xmm1,%xmm4
1852	pshufd	$0,%xmm5,%xmm5
1853	pshufd	$0x1e,%xmm4,%xmm3
1854	por	%xmm3,%xmm4
1855	pxor	%xmm3,%xmm3
1856	pcmpeqd	%xmm3,%xmm4
1857	pshufd	$0,%xmm4,%xmm4
1858	movq	64+0(%rbx),%rax
1859	movq	64+8(%rbx),%r14
1860	movq	64+16(%rbx),%r15
1861	movq	64+24(%rbx),%r8
1862.byte	102,72,15,110,203
1863
1864	leaq	64-0(%rbx),%rsi
1865	leaq	32(%rsp),%rdi
1866	call	__ecp_nistz256_sqr_montq
1867
1868	movq	544(%rsp),%rax
1869	leaq	544(%rsp),%rbx
1870	movq	0+96(%rsp),%r9
1871	movq	8+96(%rsp),%r10
1872	leaq	0+96(%rsp),%rsi
1873	movq	16+96(%rsp),%r11
1874	movq	24+96(%rsp),%r12
1875	leaq	224(%rsp),%rdi
1876	call	__ecp_nistz256_mul_montq
1877
1878	movq	448(%rsp),%rax
1879	leaq	448(%rsp),%rbx
1880	movq	0+32(%rsp),%r9
1881	movq	8+32(%rsp),%r10
1882	leaq	0+32(%rsp),%rsi
1883	movq	16+32(%rsp),%r11
1884	movq	24+32(%rsp),%r12
1885	leaq	256(%rsp),%rdi
1886	call	__ecp_nistz256_mul_montq
1887
1888	movq	416(%rsp),%rax
1889	leaq	416(%rsp),%rbx
1890	movq	0+224(%rsp),%r9
1891	movq	8+224(%rsp),%r10
1892	leaq	0+224(%rsp),%rsi
1893	movq	16+224(%rsp),%r11
1894	movq	24+224(%rsp),%r12
1895	leaq	224(%rsp),%rdi
1896	call	__ecp_nistz256_mul_montq
1897
1898	movq	512(%rsp),%rax
1899	leaq	512(%rsp),%rbx
1900	movq	0+256(%rsp),%r9
1901	movq	8+256(%rsp),%r10
1902	leaq	0+256(%rsp),%rsi
1903	movq	16+256(%rsp),%r11
1904	movq	24+256(%rsp),%r12
1905	leaq	256(%rsp),%rdi
1906	call	__ecp_nistz256_mul_montq
1907
1908	leaq	224(%rsp),%rbx
1909	leaq	64(%rsp),%rdi
1910	call	__ecp_nistz256_sub_fromq
1911
1912	orq	%r13,%r12
1913	movdqa	%xmm4,%xmm2
1914	orq	%r8,%r12
1915	orq	%r9,%r12
1916	por	%xmm5,%xmm2
1917.byte	102,73,15,110,220
1918
1919	movq	384(%rsp),%rax
1920	leaq	384(%rsp),%rbx
1921	movq	0+96(%rsp),%r9
1922	movq	8+96(%rsp),%r10
1923	leaq	0+96(%rsp),%rsi
1924	movq	16+96(%rsp),%r11
1925	movq	24+96(%rsp),%r12
1926	leaq	160(%rsp),%rdi
1927	call	__ecp_nistz256_mul_montq
1928
1929	movq	480(%rsp),%rax
1930	leaq	480(%rsp),%rbx
1931	movq	0+32(%rsp),%r9
1932	movq	8+32(%rsp),%r10
1933	leaq	0+32(%rsp),%rsi
1934	movq	16+32(%rsp),%r11
1935	movq	24+32(%rsp),%r12
1936	leaq	192(%rsp),%rdi
1937	call	__ecp_nistz256_mul_montq
1938
1939	leaq	160(%rsp),%rbx
1940	leaq	0(%rsp),%rdi
1941	call	__ecp_nistz256_sub_fromq
1942
1943	orq	%r13,%r12
1944	orq	%r8,%r12
1945	orq	%r9,%r12
1946
1947.byte	0x3e
1948	jnz	.Ladd_proceedq
1949.byte	102,73,15,126,208
1950.byte	102,73,15,126,217
1951	testq	%r8,%r8
1952	jnz	.Ladd_proceedq
1953	testq	%r9,%r9
1954	jz	.Ladd_doubleq
1955
1956.byte	102,72,15,126,199
1957	pxor	%xmm0,%xmm0
1958	movdqu	%xmm0,0(%rdi)
1959	movdqu	%xmm0,16(%rdi)
1960	movdqu	%xmm0,32(%rdi)
1961	movdqu	%xmm0,48(%rdi)
1962	movdqu	%xmm0,64(%rdi)
1963	movdqu	%xmm0,80(%rdi)
1964	jmp	.Ladd_doneq
1965
1966.align	32
1967.Ladd_doubleq:
1968.byte	102,72,15,126,206
1969.byte	102,72,15,126,199
1970	addq	$416,%rsp
1971	jmp	.Lpoint_double_shortcutq
1972
1973.align	32
1974.Ladd_proceedq:
1975	movq	0+64(%rsp),%rax
1976	movq	8+64(%rsp),%r14
1977	leaq	0+64(%rsp),%rsi
1978	movq	16+64(%rsp),%r15
1979	movq	24+64(%rsp),%r8
1980	leaq	96(%rsp),%rdi
1981	call	__ecp_nistz256_sqr_montq
1982
1983	movq	448(%rsp),%rax
1984	leaq	448(%rsp),%rbx
1985	movq	0+0(%rsp),%r9
1986	movq	8+0(%rsp),%r10
1987	leaq	0+0(%rsp),%rsi
1988	movq	16+0(%rsp),%r11
1989	movq	24+0(%rsp),%r12
1990	leaq	352(%rsp),%rdi
1991	call	__ecp_nistz256_mul_montq
1992
1993	movq	0+0(%rsp),%rax
1994	movq	8+0(%rsp),%r14
1995	leaq	0+0(%rsp),%rsi
1996	movq	16+0(%rsp),%r15
1997	movq	24+0(%rsp),%r8
1998	leaq	32(%rsp),%rdi
1999	call	__ecp_nistz256_sqr_montq
2000
2001	movq	544(%rsp),%rax
2002	leaq	544(%rsp),%rbx
2003	movq	0+352(%rsp),%r9
2004	movq	8+352(%rsp),%r10
2005	leaq	0+352(%rsp),%rsi
2006	movq	16+352(%rsp),%r11
2007	movq	24+352(%rsp),%r12
2008	leaq	352(%rsp),%rdi
2009	call	__ecp_nistz256_mul_montq
2010
2011	movq	0(%rsp),%rax
2012	leaq	0(%rsp),%rbx
2013	movq	0+32(%rsp),%r9
2014	movq	8+32(%rsp),%r10
2015	leaq	0+32(%rsp),%rsi
2016	movq	16+32(%rsp),%r11
2017	movq	24+32(%rsp),%r12
2018	leaq	128(%rsp),%rdi
2019	call	__ecp_nistz256_mul_montq
2020
2021	movq	160(%rsp),%rax
2022	leaq	160(%rsp),%rbx
2023	movq	0+32(%rsp),%r9
2024	movq	8+32(%rsp),%r10
2025	leaq	0+32(%rsp),%rsi
2026	movq	16+32(%rsp),%r11
2027	movq	24+32(%rsp),%r12
2028	leaq	192(%rsp),%rdi
2029	call	__ecp_nistz256_mul_montq
2030
2031
2032
2033
2034	xorq	%r11,%r11
2035	addq	%r12,%r12
2036	leaq	96(%rsp),%rsi
2037	adcq	%r13,%r13
2038	movq	%r12,%rax
2039	adcq	%r8,%r8
2040	adcq	%r9,%r9
2041	movq	%r13,%rbp
2042	adcq	$0,%r11
2043
2044	subq	$-1,%r12
2045	movq	%r8,%rcx
2046	sbbq	%r14,%r13
2047	sbbq	$0,%r8
2048	movq	%r9,%r10
2049	sbbq	%r15,%r9
2050	sbbq	$0,%r11
2051
2052	cmovcq	%rax,%r12
2053	movq	0(%rsi),%rax
2054	cmovcq	%rbp,%r13
2055	movq	8(%rsi),%rbp
2056	cmovcq	%rcx,%r8
2057	movq	16(%rsi),%rcx
2058	cmovcq	%r10,%r9
2059	movq	24(%rsi),%r10
2060
2061	call	__ecp_nistz256_subq
2062
2063	leaq	128(%rsp),%rbx
2064	leaq	288(%rsp),%rdi
2065	call	__ecp_nistz256_sub_fromq
2066
2067	movq	192+0(%rsp),%rax
2068	movq	192+8(%rsp),%rbp
2069	movq	192+16(%rsp),%rcx
2070	movq	192+24(%rsp),%r10
2071	leaq	320(%rsp),%rdi
2072
2073	call	__ecp_nistz256_subq
2074
2075	movq	%r12,0(%rdi)
2076	movq	%r13,8(%rdi)
2077	movq	%r8,16(%rdi)
2078	movq	%r9,24(%rdi)
2079	movq	128(%rsp),%rax
2080	leaq	128(%rsp),%rbx
2081	movq	0+224(%rsp),%r9
2082	movq	8+224(%rsp),%r10
2083	leaq	0+224(%rsp),%rsi
2084	movq	16+224(%rsp),%r11
2085	movq	24+224(%rsp),%r12
2086	leaq	256(%rsp),%rdi
2087	call	__ecp_nistz256_mul_montq
2088
2089	movq	320(%rsp),%rax
2090	leaq	320(%rsp),%rbx
2091	movq	0+64(%rsp),%r9
2092	movq	8+64(%rsp),%r10
2093	leaq	0+64(%rsp),%rsi
2094	movq	16+64(%rsp),%r11
2095	movq	24+64(%rsp),%r12
2096	leaq	320(%rsp),%rdi
2097	call	__ecp_nistz256_mul_montq
2098
2099	leaq	256(%rsp),%rbx
2100	leaq	320(%rsp),%rdi
2101	call	__ecp_nistz256_sub_fromq
2102
2103.byte	102,72,15,126,199
2104
2105	movdqa	%xmm5,%xmm0
2106	movdqa	%xmm5,%xmm1
2107	pandn	352(%rsp),%xmm0
2108	movdqa	%xmm5,%xmm2
2109	pandn	352+16(%rsp),%xmm1
2110	movdqa	%xmm5,%xmm3
2111	pand	544(%rsp),%xmm2
2112	pand	544+16(%rsp),%xmm3
2113	por	%xmm0,%xmm2
2114	por	%xmm1,%xmm3
2115
2116	movdqa	%xmm4,%xmm0
2117	movdqa	%xmm4,%xmm1
2118	pandn	%xmm2,%xmm0
2119	movdqa	%xmm4,%xmm2
2120	pandn	%xmm3,%xmm1
2121	movdqa	%xmm4,%xmm3
2122	pand	448(%rsp),%xmm2
2123	pand	448+16(%rsp),%xmm3
2124	por	%xmm0,%xmm2
2125	por	%xmm1,%xmm3
2126	movdqu	%xmm2,64(%rdi)
2127	movdqu	%xmm3,80(%rdi)
2128
2129	movdqa	%xmm5,%xmm0
2130	movdqa	%xmm5,%xmm1
2131	pandn	288(%rsp),%xmm0
2132	movdqa	%xmm5,%xmm2
2133	pandn	288+16(%rsp),%xmm1
2134	movdqa	%xmm5,%xmm3
2135	pand	480(%rsp),%xmm2
2136	pand	480+16(%rsp),%xmm3
2137	por	%xmm0,%xmm2
2138	por	%xmm1,%xmm3
2139
2140	movdqa	%xmm4,%xmm0
2141	movdqa	%xmm4,%xmm1
2142	pandn	%xmm2,%xmm0
2143	movdqa	%xmm4,%xmm2
2144	pandn	%xmm3,%xmm1
2145	movdqa	%xmm4,%xmm3
2146	pand	384(%rsp),%xmm2
2147	pand	384+16(%rsp),%xmm3
2148	por	%xmm0,%xmm2
2149	por	%xmm1,%xmm3
2150	movdqu	%xmm2,0(%rdi)
2151	movdqu	%xmm3,16(%rdi)
2152
2153	movdqa	%xmm5,%xmm0
2154	movdqa	%xmm5,%xmm1
2155	pandn	320(%rsp),%xmm0
2156	movdqa	%xmm5,%xmm2
2157	pandn	320+16(%rsp),%xmm1
2158	movdqa	%xmm5,%xmm3
2159	pand	512(%rsp),%xmm2
2160	pand	512+16(%rsp),%xmm3
2161	por	%xmm0,%xmm2
2162	por	%xmm1,%xmm3
2163
2164	movdqa	%xmm4,%xmm0
2165	movdqa	%xmm4,%xmm1
2166	pandn	%xmm2,%xmm0
2167	movdqa	%xmm4,%xmm2
2168	pandn	%xmm3,%xmm1
2169	movdqa	%xmm4,%xmm3
2170	pand	416(%rsp),%xmm2
2171	pand	416+16(%rsp),%xmm3
2172	por	%xmm0,%xmm2
2173	por	%xmm1,%xmm3
2174	movdqu	%xmm2,32(%rdi)
2175	movdqu	%xmm3,48(%rdi)
2176
2177.Ladd_doneq:
2178	addq	$576+8,%rsp
2179	popq	%r15
2180	popq	%r14
2181	popq	%r13
2182	popq	%r12
2183	popq	%rbx
2184	popq	%rbp
2185	.byte	0xf3,0xc3
2186.size	ecp_nistz256_point_add,.-ecp_nistz256_point_add
2187.globl	ecp_nistz256_point_add_affine
2188.type	ecp_nistz256_point_add_affine,@function
2189.align	32
2190ecp_nistz256_point_add_affine:
2191	movl	$0x80100,%ecx
2192	andl	OPENSSL_ia32cap_P+8(%rip),%ecx
2193	cmpl	$0x80100,%ecx
2194	je	.Lpoint_add_affinex
2195	pushq	%rbp
2196	pushq	%rbx
2197	pushq	%r12
2198	pushq	%r13
2199	pushq	%r14
2200	pushq	%r15
2201	subq	$480+8,%rsp
2202
2203	movdqu	0(%rsi),%xmm0
2204	movq	%rdx,%rbx
2205	movdqu	16(%rsi),%xmm1
2206	movdqu	32(%rsi),%xmm2
2207	movdqu	48(%rsi),%xmm3
2208	movdqu	64(%rsi),%xmm4
2209	movdqu	80(%rsi),%xmm5
2210	movq	64+0(%rsi),%rax
2211	movq	64+8(%rsi),%r14
2212	movq	64+16(%rsi),%r15
2213	movq	64+24(%rsi),%r8
2214	movdqa	%xmm0,320(%rsp)
2215	movdqa	%xmm1,320+16(%rsp)
2216	movdqa	%xmm2,352(%rsp)
2217	movdqa	%xmm3,352+16(%rsp)
2218	movdqa	%xmm4,384(%rsp)
2219	movdqa	%xmm5,384+16(%rsp)
2220	por	%xmm4,%xmm5
2221
2222	movdqu	0(%rbx),%xmm0
2223	pshufd	$0xb1,%xmm5,%xmm3
2224	movdqu	16(%rbx),%xmm1
2225	movdqu	32(%rbx),%xmm2
2226	por	%xmm3,%xmm5
2227	movdqu	48(%rbx),%xmm3
2228	movdqa	%xmm0,416(%rsp)
2229	pshufd	$0x1e,%xmm5,%xmm4
2230	movdqa	%xmm1,416+16(%rsp)
2231	por	%xmm0,%xmm1
2232.byte	102,72,15,110,199
2233	movdqa	%xmm2,448(%rsp)
2234	movdqa	%xmm3,448+16(%rsp)
2235	por	%xmm2,%xmm3
2236	por	%xmm4,%xmm5
2237	pxor	%xmm4,%xmm4
2238	por	%xmm1,%xmm3
2239
2240	leaq	64-0(%rsi),%rsi
2241	leaq	32(%rsp),%rdi
2242	call	__ecp_nistz256_sqr_montq
2243
2244	pcmpeqd	%xmm4,%xmm5
2245	pshufd	$0xb1,%xmm3,%xmm4
2246	movq	0(%rbx),%rax
2247
2248	movq	%r12,%r9
2249	por	%xmm3,%xmm4
2250	pshufd	$0,%xmm5,%xmm5
2251	pshufd	$0x1e,%xmm4,%xmm3
2252	movq	%r13,%r10
2253	por	%xmm3,%xmm4
2254	pxor	%xmm3,%xmm3
2255	movq	%r14,%r11
2256	pcmpeqd	%xmm3,%xmm4
2257	pshufd	$0,%xmm4,%xmm4
2258
2259	leaq	32-0(%rsp),%rsi
2260	movq	%r15,%r12
2261	leaq	0(%rsp),%rdi
2262	call	__ecp_nistz256_mul_montq
2263
2264	leaq	320(%rsp),%rbx
2265	leaq	64(%rsp),%rdi
2266	call	__ecp_nistz256_sub_fromq
2267
2268	movq	384(%rsp),%rax
2269	leaq	384(%rsp),%rbx
2270	movq	0+32(%rsp),%r9
2271	movq	8+32(%rsp),%r10
2272	leaq	0+32(%rsp),%rsi
2273	movq	16+32(%rsp),%r11
2274	movq	24+32(%rsp),%r12
2275	leaq	32(%rsp),%rdi
2276	call	__ecp_nistz256_mul_montq
2277
2278	movq	384(%rsp),%rax
2279	leaq	384(%rsp),%rbx
2280	movq	0+64(%rsp),%r9
2281	movq	8+64(%rsp),%r10
2282	leaq	0+64(%rsp),%rsi
2283	movq	16+64(%rsp),%r11
2284	movq	24+64(%rsp),%r12
2285	leaq	288(%rsp),%rdi
2286	call	__ecp_nistz256_mul_montq
2287
2288	movq	448(%rsp),%rax
2289	leaq	448(%rsp),%rbx
2290	movq	0+32(%rsp),%r9
2291	movq	8+32(%rsp),%r10
2292	leaq	0+32(%rsp),%rsi
2293	movq	16+32(%rsp),%r11
2294	movq	24+32(%rsp),%r12
2295	leaq	32(%rsp),%rdi
2296	call	__ecp_nistz256_mul_montq
2297
2298	leaq	352(%rsp),%rbx
2299	leaq	96(%rsp),%rdi
2300	call	__ecp_nistz256_sub_fromq
2301
2302	movq	0+64(%rsp),%rax
2303	movq	8+64(%rsp),%r14
2304	leaq	0+64(%rsp),%rsi
2305	movq	16+64(%rsp),%r15
2306	movq	24+64(%rsp),%r8
2307	leaq	128(%rsp),%rdi
2308	call	__ecp_nistz256_sqr_montq
2309
2310	movq	0+96(%rsp),%rax
2311	movq	8+96(%rsp),%r14
2312	leaq	0+96(%rsp),%rsi
2313	movq	16+96(%rsp),%r15
2314	movq	24+96(%rsp),%r8
2315	leaq	192(%rsp),%rdi
2316	call	__ecp_nistz256_sqr_montq
2317
2318	movq	128(%rsp),%rax
2319	leaq	128(%rsp),%rbx
2320	movq	0+64(%rsp),%r9
2321	movq	8+64(%rsp),%r10
2322	leaq	0+64(%rsp),%rsi
2323	movq	16+64(%rsp),%r11
2324	movq	24+64(%rsp),%r12
2325	leaq	160(%rsp),%rdi
2326	call	__ecp_nistz256_mul_montq
2327
2328	movq	320(%rsp),%rax
2329	leaq	320(%rsp),%rbx
2330	movq	0+128(%rsp),%r9
2331	movq	8+128(%rsp),%r10
2332	leaq	0+128(%rsp),%rsi
2333	movq	16+128(%rsp),%r11
2334	movq	24+128(%rsp),%r12
2335	leaq	0(%rsp),%rdi
2336	call	__ecp_nistz256_mul_montq
2337
2338
2339
2340
2341	xorq	%r11,%r11
2342	addq	%r12,%r12
2343	leaq	192(%rsp),%rsi
2344	adcq	%r13,%r13
2345	movq	%r12,%rax
2346	adcq	%r8,%r8
2347	adcq	%r9,%r9
2348	movq	%r13,%rbp
2349	adcq	$0,%r11
2350
2351	subq	$-1,%r12
2352	movq	%r8,%rcx
2353	sbbq	%r14,%r13
2354	sbbq	$0,%r8
2355	movq	%r9,%r10
2356	sbbq	%r15,%r9
2357	sbbq	$0,%r11
2358
2359	cmovcq	%rax,%r12
2360	movq	0(%rsi),%rax
2361	cmovcq	%rbp,%r13
2362	movq	8(%rsi),%rbp
2363	cmovcq	%rcx,%r8
2364	movq	16(%rsi),%rcx
2365	cmovcq	%r10,%r9
2366	movq	24(%rsi),%r10
2367
2368	call	__ecp_nistz256_subq
2369
2370	leaq	160(%rsp),%rbx
2371	leaq	224(%rsp),%rdi
2372	call	__ecp_nistz256_sub_fromq
2373
2374	movq	0+0(%rsp),%rax
2375	movq	0+8(%rsp),%rbp
2376	movq	0+16(%rsp),%rcx
2377	movq	0+24(%rsp),%r10
2378	leaq	64(%rsp),%rdi
2379
2380	call	__ecp_nistz256_subq
2381
2382	movq	%r12,0(%rdi)
2383	movq	%r13,8(%rdi)
2384	movq	%r8,16(%rdi)
2385	movq	%r9,24(%rdi)
2386	movq	352(%rsp),%rax
2387	leaq	352(%rsp),%rbx
2388	movq	0+160(%rsp),%r9
2389	movq	8+160(%rsp),%r10
2390	leaq	0+160(%rsp),%rsi
2391	movq	16+160(%rsp),%r11
2392	movq	24+160(%rsp),%r12
2393	leaq	32(%rsp),%rdi
2394	call	__ecp_nistz256_mul_montq
2395
2396	movq	96(%rsp),%rax
2397	leaq	96(%rsp),%rbx
2398	movq	0+64(%rsp),%r9
2399	movq	8+64(%rsp),%r10
2400	leaq	0+64(%rsp),%rsi
2401	movq	16+64(%rsp),%r11
2402	movq	24+64(%rsp),%r12
2403	leaq	64(%rsp),%rdi
2404	call	__ecp_nistz256_mul_montq
2405
2406	leaq	32(%rsp),%rbx
2407	leaq	256(%rsp),%rdi
2408	call	__ecp_nistz256_sub_fromq
2409
2410.byte	102,72,15,126,199
2411
2412	movdqa	%xmm5,%xmm0
2413	movdqa	%xmm5,%xmm1
2414	pandn	288(%rsp),%xmm0
2415	movdqa	%xmm5,%xmm2
2416	pandn	288+16(%rsp),%xmm1
2417	movdqa	%xmm5,%xmm3
2418	pand	.LONE_mont(%rip),%xmm2
2419	pand	.LONE_mont+16(%rip),%xmm3
2420	por	%xmm0,%xmm2
2421	por	%xmm1,%xmm3
2422
2423	movdqa	%xmm4,%xmm0
2424	movdqa	%xmm4,%xmm1
2425	pandn	%xmm2,%xmm0
2426	movdqa	%xmm4,%xmm2
2427	pandn	%xmm3,%xmm1
2428	movdqa	%xmm4,%xmm3
2429	pand	384(%rsp),%xmm2
2430	pand	384+16(%rsp),%xmm3
2431	por	%xmm0,%xmm2
2432	por	%xmm1,%xmm3
2433	movdqu	%xmm2,64(%rdi)
2434	movdqu	%xmm3,80(%rdi)
2435
2436	movdqa	%xmm5,%xmm0
2437	movdqa	%xmm5,%xmm1
2438	pandn	224(%rsp),%xmm0
2439	movdqa	%xmm5,%xmm2
2440	pandn	224+16(%rsp),%xmm1
2441	movdqa	%xmm5,%xmm3
2442	pand	416(%rsp),%xmm2
2443	pand	416+16(%rsp),%xmm3
2444	por	%xmm0,%xmm2
2445	por	%xmm1,%xmm3
2446
2447	movdqa	%xmm4,%xmm0
2448	movdqa	%xmm4,%xmm1
2449	pandn	%xmm2,%xmm0
2450	movdqa	%xmm4,%xmm2
2451	pandn	%xmm3,%xmm1
2452	movdqa	%xmm4,%xmm3
2453	pand	320(%rsp),%xmm2
2454	pand	320+16(%rsp),%xmm3
2455	por	%xmm0,%xmm2
2456	por	%xmm1,%xmm3
2457	movdqu	%xmm2,0(%rdi)
2458	movdqu	%xmm3,16(%rdi)
2459
2460	movdqa	%xmm5,%xmm0
2461	movdqa	%xmm5,%xmm1
2462	pandn	256(%rsp),%xmm0
2463	movdqa	%xmm5,%xmm2
2464	pandn	256+16(%rsp),%xmm1
2465	movdqa	%xmm5,%xmm3
2466	pand	448(%rsp),%xmm2
2467	pand	448+16(%rsp),%xmm3
2468	por	%xmm0,%xmm2
2469	por	%xmm1,%xmm3
2470
2471	movdqa	%xmm4,%xmm0
2472	movdqa	%xmm4,%xmm1
2473	pandn	%xmm2,%xmm0
2474	movdqa	%xmm4,%xmm2
2475	pandn	%xmm3,%xmm1
2476	movdqa	%xmm4,%xmm3
2477	pand	352(%rsp),%xmm2
2478	pand	352+16(%rsp),%xmm3
2479	por	%xmm0,%xmm2
2480	por	%xmm1,%xmm3
2481	movdqu	%xmm2,32(%rdi)
2482	movdqu	%xmm3,48(%rdi)
2483
2484	addq	$480+8,%rsp
2485	popq	%r15
2486	popq	%r14
2487	popq	%r13
2488	popq	%r12
2489	popq	%rbx
2490	popq	%rbp
2491	.byte	0xf3,0xc3
2492.size	ecp_nistz256_point_add_affine,.-ecp_nistz256_point_add_affine
2493.type	__ecp_nistz256_add_tox,@function
2494.align	32
2495__ecp_nistz256_add_tox:
2496	xorq	%r11,%r11
2497	adcq	0(%rbx),%r12
2498	adcq	8(%rbx),%r13
2499	movq	%r12,%rax
2500	adcq	16(%rbx),%r8
2501	adcq	24(%rbx),%r9
2502	movq	%r13,%rbp
2503	adcq	$0,%r11
2504
2505	xorq	%r10,%r10
2506	sbbq	$-1,%r12
2507	movq	%r8,%rcx
2508	sbbq	%r14,%r13
2509	sbbq	$0,%r8
2510	movq	%r9,%r10
2511	sbbq	%r15,%r9
2512	sbbq	$0,%r11
2513
2514	cmovcq	%rax,%r12
2515	cmovcq	%rbp,%r13
2516	movq	%r12,0(%rdi)
2517	cmovcq	%rcx,%r8
2518	movq	%r13,8(%rdi)
2519	cmovcq	%r10,%r9
2520	movq	%r8,16(%rdi)
2521	movq	%r9,24(%rdi)
2522
2523	.byte	0xf3,0xc3
2524.size	__ecp_nistz256_add_tox,.-__ecp_nistz256_add_tox
2525
2526.type	__ecp_nistz256_sub_fromx,@function
2527.align	32
2528__ecp_nistz256_sub_fromx:
2529	xorq	%r11,%r11
2530	sbbq	0(%rbx),%r12
2531	sbbq	8(%rbx),%r13
2532	movq	%r12,%rax
2533	sbbq	16(%rbx),%r8
2534	sbbq	24(%rbx),%r9
2535	movq	%r13,%rbp
2536	sbbq	$0,%r11
2537
2538	xorq	%r10,%r10
2539	adcq	$-1,%r12
2540	movq	%r8,%rcx
2541	adcq	%r14,%r13
2542	adcq	$0,%r8
2543	movq	%r9,%r10
2544	adcq	%r15,%r9
2545
2546	btq	$0,%r11
2547	cmovncq	%rax,%r12
2548	cmovncq	%rbp,%r13
2549	movq	%r12,0(%rdi)
2550	cmovncq	%rcx,%r8
2551	movq	%r13,8(%rdi)
2552	cmovncq	%r10,%r9
2553	movq	%r8,16(%rdi)
2554	movq	%r9,24(%rdi)
2555
2556	.byte	0xf3,0xc3
2557.size	__ecp_nistz256_sub_fromx,.-__ecp_nistz256_sub_fromx
2558
2559.type	__ecp_nistz256_subx,@function
2560.align	32
2561__ecp_nistz256_subx:
2562	xorq	%r11,%r11
2563	sbbq	%r12,%rax
2564	sbbq	%r13,%rbp
2565	movq	%rax,%r12
2566	sbbq	%r8,%rcx
2567	sbbq	%r9,%r10
2568	movq	%rbp,%r13
2569	sbbq	$0,%r11
2570
2571	xorq	%r9,%r9
2572	adcq	$-1,%rax
2573	movq	%rcx,%r8
2574	adcq	%r14,%rbp
2575	adcq	$0,%rcx
2576	movq	%r10,%r9
2577	adcq	%r15,%r10
2578
2579	btq	$0,%r11
2580	cmovcq	%rax,%r12
2581	cmovcq	%rbp,%r13
2582	cmovcq	%rcx,%r8
2583	cmovcq	%r10,%r9
2584
2585	.byte	0xf3,0xc3
2586.size	__ecp_nistz256_subx,.-__ecp_nistz256_subx
2587
2588.type	__ecp_nistz256_mul_by_2x,@function
2589.align	32
2590__ecp_nistz256_mul_by_2x:
2591	xorq	%r11,%r11
2592	adcq	%r12,%r12
2593	adcq	%r13,%r13
2594	movq	%r12,%rax
2595	adcq	%r8,%r8
2596	adcq	%r9,%r9
2597	movq	%r13,%rbp
2598	adcq	$0,%r11
2599
2600	xorq	%r10,%r10
2601	sbbq	$-1,%r12
2602	movq	%r8,%rcx
2603	sbbq	%r14,%r13
2604	sbbq	$0,%r8
2605	movq	%r9,%r10
2606	sbbq	%r15,%r9
2607	sbbq	$0,%r11
2608
2609	cmovcq	%rax,%r12
2610	cmovcq	%rbp,%r13
2611	movq	%r12,0(%rdi)
2612	cmovcq	%rcx,%r8
2613	movq	%r13,8(%rdi)
2614	cmovcq	%r10,%r9
2615	movq	%r8,16(%rdi)
2616	movq	%r9,24(%rdi)
2617
2618	.byte	0xf3,0xc3
2619.size	__ecp_nistz256_mul_by_2x,.-__ecp_nistz256_mul_by_2x
2620.type	ecp_nistz256_point_doublex,@function
2621.align	32
2622ecp_nistz256_point_doublex:
2623.Lpoint_doublex:
2624	pushq	%rbp
2625	pushq	%rbx
2626	pushq	%r12
2627	pushq	%r13
2628	pushq	%r14
2629	pushq	%r15
2630	subq	$160+8,%rsp
2631
2632.Lpoint_double_shortcutx:
2633	movdqu	0(%rsi),%xmm0
2634	movq	%rsi,%rbx
2635	movdqu	16(%rsi),%xmm1
2636	movq	32+0(%rsi),%r12
2637	movq	32+8(%rsi),%r13
2638	movq	32+16(%rsi),%r8
2639	movq	32+24(%rsi),%r9
2640	movq	.Lpoly+8(%rip),%r14
2641	movq	.Lpoly+24(%rip),%r15
2642	movdqa	%xmm0,96(%rsp)
2643	movdqa	%xmm1,96+16(%rsp)
2644	leaq	32(%rdi),%r10
2645	leaq	64(%rdi),%r11
2646.byte	102,72,15,110,199
2647.byte	102,73,15,110,202
2648.byte	102,73,15,110,211
2649
2650	leaq	0(%rsp),%rdi
2651	call	__ecp_nistz256_mul_by_2x
2652
2653	movq	64+0(%rsi),%rdx
2654	movq	64+8(%rsi),%r14
2655	movq	64+16(%rsi),%r15
2656	movq	64+24(%rsi),%r8
2657	leaq	64-128(%rsi),%rsi
2658	leaq	64(%rsp),%rdi
2659	call	__ecp_nistz256_sqr_montx
2660
2661	movq	0+0(%rsp),%rdx
2662	movq	8+0(%rsp),%r14
2663	leaq	-128+0(%rsp),%rsi
2664	movq	16+0(%rsp),%r15
2665	movq	24+0(%rsp),%r8
2666	leaq	0(%rsp),%rdi
2667	call	__ecp_nistz256_sqr_montx
2668
2669	movq	32(%rbx),%rdx
2670	movq	64+0(%rbx),%r9
2671	movq	64+8(%rbx),%r10
2672	movq	64+16(%rbx),%r11
2673	movq	64+24(%rbx),%r12
2674	leaq	64-128(%rbx),%rsi
2675	leaq	32(%rbx),%rbx
2676.byte	102,72,15,126,215
2677	call	__ecp_nistz256_mul_montx
2678	call	__ecp_nistz256_mul_by_2x
2679
2680	movq	96+0(%rsp),%r12
2681	movq	96+8(%rsp),%r13
2682	leaq	64(%rsp),%rbx
2683	movq	96+16(%rsp),%r8
2684	movq	96+24(%rsp),%r9
2685	leaq	32(%rsp),%rdi
2686	call	__ecp_nistz256_add_tox
2687
2688	movq	96+0(%rsp),%r12
2689	movq	96+8(%rsp),%r13
2690	leaq	64(%rsp),%rbx
2691	movq	96+16(%rsp),%r8
2692	movq	96+24(%rsp),%r9
2693	leaq	64(%rsp),%rdi
2694	call	__ecp_nistz256_sub_fromx
2695
2696	movq	0+0(%rsp),%rdx
2697	movq	8+0(%rsp),%r14
2698	leaq	-128+0(%rsp),%rsi
2699	movq	16+0(%rsp),%r15
2700	movq	24+0(%rsp),%r8
2701.byte	102,72,15,126,207
2702	call	__ecp_nistz256_sqr_montx
2703	xorq	%r9,%r9
2704	movq	%r12,%rax
2705	addq	$-1,%r12
2706	movq	%r13,%r10
2707	adcq	%rsi,%r13
2708	movq	%r14,%rcx
2709	adcq	$0,%r14
2710	movq	%r15,%r8
2711	adcq	%rbp,%r15
2712	adcq	$0,%r9
2713	xorq	%rsi,%rsi
2714	testq	$1,%rax
2715
2716	cmovzq	%rax,%r12
2717	cmovzq	%r10,%r13
2718	cmovzq	%rcx,%r14
2719	cmovzq	%r8,%r15
2720	cmovzq	%rsi,%r9
2721
2722	movq	%r13,%rax
2723	shrq	$1,%r12
2724	shlq	$63,%rax
2725	movq	%r14,%r10
2726	shrq	$1,%r13
2727	orq	%rax,%r12
2728	shlq	$63,%r10
2729	movq	%r15,%rcx
2730	shrq	$1,%r14
2731	orq	%r10,%r13
2732	shlq	$63,%rcx
2733	movq	%r12,0(%rdi)
2734	shrq	$1,%r15
2735	movq	%r13,8(%rdi)
2736	shlq	$63,%r9
2737	orq	%rcx,%r14
2738	orq	%r9,%r15
2739	movq	%r14,16(%rdi)
2740	movq	%r15,24(%rdi)
2741	movq	64(%rsp),%rdx
2742	leaq	64(%rsp),%rbx
2743	movq	0+32(%rsp),%r9
2744	movq	8+32(%rsp),%r10
2745	leaq	-128+32(%rsp),%rsi
2746	movq	16+32(%rsp),%r11
2747	movq	24+32(%rsp),%r12
2748	leaq	32(%rsp),%rdi
2749	call	__ecp_nistz256_mul_montx
2750
2751	leaq	128(%rsp),%rdi
2752	call	__ecp_nistz256_mul_by_2x
2753
2754	leaq	32(%rsp),%rbx
2755	leaq	32(%rsp),%rdi
2756	call	__ecp_nistz256_add_tox
2757
2758	movq	96(%rsp),%rdx
2759	leaq	96(%rsp),%rbx
2760	movq	0+0(%rsp),%r9
2761	movq	8+0(%rsp),%r10
2762	leaq	-128+0(%rsp),%rsi
2763	movq	16+0(%rsp),%r11
2764	movq	24+0(%rsp),%r12
2765	leaq	0(%rsp),%rdi
2766	call	__ecp_nistz256_mul_montx
2767
2768	leaq	128(%rsp),%rdi
2769	call	__ecp_nistz256_mul_by_2x
2770
2771	movq	0+32(%rsp),%rdx
2772	movq	8+32(%rsp),%r14
2773	leaq	-128+32(%rsp),%rsi
2774	movq	16+32(%rsp),%r15
2775	movq	24+32(%rsp),%r8
2776.byte	102,72,15,126,199
2777	call	__ecp_nistz256_sqr_montx
2778
2779	leaq	128(%rsp),%rbx
2780	movq	%r14,%r8
2781	movq	%r15,%r9
2782	movq	%rsi,%r14
2783	movq	%rbp,%r15
2784	call	__ecp_nistz256_sub_fromx
2785
2786	movq	0+0(%rsp),%rax
2787	movq	0+8(%rsp),%rbp
2788	movq	0+16(%rsp),%rcx
2789	movq	0+24(%rsp),%r10
2790	leaq	0(%rsp),%rdi
2791	call	__ecp_nistz256_subx
2792
2793	movq	32(%rsp),%rdx
2794	leaq	32(%rsp),%rbx
2795	movq	%r12,%r14
2796	xorl	%ecx,%ecx
2797	movq	%r12,0+0(%rsp)
2798	movq	%r13,%r10
2799	movq	%r13,0+8(%rsp)
2800	cmovzq	%r8,%r11
2801	movq	%r8,0+16(%rsp)
2802	leaq	0-128(%rsp),%rsi
2803	cmovzq	%r9,%r12
2804	movq	%r9,0+24(%rsp)
2805	movq	%r14,%r9
2806	leaq	0(%rsp),%rdi
2807	call	__ecp_nistz256_mul_montx
2808
2809.byte	102,72,15,126,203
2810.byte	102,72,15,126,207
2811	call	__ecp_nistz256_sub_fromx
2812
2813	addq	$160+8,%rsp
2814	popq	%r15
2815	popq	%r14
2816	popq	%r13
2817	popq	%r12
2818	popq	%rbx
2819	popq	%rbp
2820	.byte	0xf3,0xc3
2821.size	ecp_nistz256_point_doublex,.-ecp_nistz256_point_doublex
2822.type	ecp_nistz256_point_addx,@function
2823.align	32
2824ecp_nistz256_point_addx:
2825.Lpoint_addx:
2826	pushq	%rbp
2827	pushq	%rbx
2828	pushq	%r12
2829	pushq	%r13
2830	pushq	%r14
2831	pushq	%r15
2832	subq	$576+8,%rsp
2833
2834	movdqu	0(%rsi),%xmm0
2835	movdqu	16(%rsi),%xmm1
2836	movdqu	32(%rsi),%xmm2
2837	movdqu	48(%rsi),%xmm3
2838	movdqu	64(%rsi),%xmm4
2839	movdqu	80(%rsi),%xmm5
2840	movq	%rsi,%rbx
2841	movq	%rdx,%rsi
2842	movdqa	%xmm0,384(%rsp)
2843	movdqa	%xmm1,384+16(%rsp)
2844	movdqa	%xmm2,416(%rsp)
2845	movdqa	%xmm3,416+16(%rsp)
2846	movdqa	%xmm4,448(%rsp)
2847	movdqa	%xmm5,448+16(%rsp)
2848	por	%xmm4,%xmm5
2849
2850	movdqu	0(%rsi),%xmm0
2851	pshufd	$0xb1,%xmm5,%xmm3
2852	movdqu	16(%rsi),%xmm1
2853	movdqu	32(%rsi),%xmm2
2854	por	%xmm3,%xmm5
2855	movdqu	48(%rsi),%xmm3
2856	movq	64+0(%rsi),%rdx
2857	movq	64+8(%rsi),%r14
2858	movq	64+16(%rsi),%r15
2859	movq	64+24(%rsi),%r8
2860	movdqa	%xmm0,480(%rsp)
2861	pshufd	$0x1e,%xmm5,%xmm4
2862	movdqa	%xmm1,480+16(%rsp)
2863	movdqu	64(%rsi),%xmm0
2864	movdqu	80(%rsi),%xmm1
2865	movdqa	%xmm2,512(%rsp)
2866	movdqa	%xmm3,512+16(%rsp)
2867	por	%xmm4,%xmm5
2868	pxor	%xmm4,%xmm4
2869	por	%xmm0,%xmm1
2870.byte	102,72,15,110,199
2871
2872	leaq	64-128(%rsi),%rsi
2873	movq	%rdx,544+0(%rsp)
2874	movq	%r14,544+8(%rsp)
2875	movq	%r15,544+16(%rsp)
2876	movq	%r8,544+24(%rsp)
2877	leaq	96(%rsp),%rdi
2878	call	__ecp_nistz256_sqr_montx
2879
2880	pcmpeqd	%xmm4,%xmm5
2881	pshufd	$0xb1,%xmm1,%xmm4
2882	por	%xmm1,%xmm4
2883	pshufd	$0,%xmm5,%xmm5
2884	pshufd	$0x1e,%xmm4,%xmm3
2885	por	%xmm3,%xmm4
2886	pxor	%xmm3,%xmm3
2887	pcmpeqd	%xmm3,%xmm4
2888	pshufd	$0,%xmm4,%xmm4
2889	movq	64+0(%rbx),%rdx
2890	movq	64+8(%rbx),%r14
2891	movq	64+16(%rbx),%r15
2892	movq	64+24(%rbx),%r8
2893.byte	102,72,15,110,203
2894
2895	leaq	64-128(%rbx),%rsi
2896	leaq	32(%rsp),%rdi
2897	call	__ecp_nistz256_sqr_montx
2898
2899	movq	544(%rsp),%rdx
2900	leaq	544(%rsp),%rbx
2901	movq	0+96(%rsp),%r9
2902	movq	8+96(%rsp),%r10
2903	leaq	-128+96(%rsp),%rsi
2904	movq	16+96(%rsp),%r11
2905	movq	24+96(%rsp),%r12
2906	leaq	224(%rsp),%rdi
2907	call	__ecp_nistz256_mul_montx
2908
2909	movq	448(%rsp),%rdx
2910	leaq	448(%rsp),%rbx
2911	movq	0+32(%rsp),%r9
2912	movq	8+32(%rsp),%r10
2913	leaq	-128+32(%rsp),%rsi
2914	movq	16+32(%rsp),%r11
2915	movq	24+32(%rsp),%r12
2916	leaq	256(%rsp),%rdi
2917	call	__ecp_nistz256_mul_montx
2918
2919	movq	416(%rsp),%rdx
2920	leaq	416(%rsp),%rbx
2921	movq	0+224(%rsp),%r9
2922	movq	8+224(%rsp),%r10
2923	leaq	-128+224(%rsp),%rsi
2924	movq	16+224(%rsp),%r11
2925	movq	24+224(%rsp),%r12
2926	leaq	224(%rsp),%rdi
2927	call	__ecp_nistz256_mul_montx
2928
2929	movq	512(%rsp),%rdx
2930	leaq	512(%rsp),%rbx
2931	movq	0+256(%rsp),%r9
2932	movq	8+256(%rsp),%r10
2933	leaq	-128+256(%rsp),%rsi
2934	movq	16+256(%rsp),%r11
2935	movq	24+256(%rsp),%r12
2936	leaq	256(%rsp),%rdi
2937	call	__ecp_nistz256_mul_montx
2938
2939	leaq	224(%rsp),%rbx
2940	leaq	64(%rsp),%rdi
2941	call	__ecp_nistz256_sub_fromx
2942
2943	orq	%r13,%r12
2944	movdqa	%xmm4,%xmm2
2945	orq	%r8,%r12
2946	orq	%r9,%r12
2947	por	%xmm5,%xmm2
2948.byte	102,73,15,110,220
2949
2950	movq	384(%rsp),%rdx
2951	leaq	384(%rsp),%rbx
2952	movq	0+96(%rsp),%r9
2953	movq	8+96(%rsp),%r10
2954	leaq	-128+96(%rsp),%rsi
2955	movq	16+96(%rsp),%r11
2956	movq	24+96(%rsp),%r12
2957	leaq	160(%rsp),%rdi
2958	call	__ecp_nistz256_mul_montx
2959
2960	movq	480(%rsp),%rdx
2961	leaq	480(%rsp),%rbx
2962	movq	0+32(%rsp),%r9
2963	movq	8+32(%rsp),%r10
2964	leaq	-128+32(%rsp),%rsi
2965	movq	16+32(%rsp),%r11
2966	movq	24+32(%rsp),%r12
2967	leaq	192(%rsp),%rdi
2968	call	__ecp_nistz256_mul_montx
2969
2970	leaq	160(%rsp),%rbx
2971	leaq	0(%rsp),%rdi
2972	call	__ecp_nistz256_sub_fromx
2973
2974	orq	%r13,%r12
2975	orq	%r8,%r12
2976	orq	%r9,%r12
2977
2978.byte	0x3e
2979	jnz	.Ladd_proceedx
2980.byte	102,73,15,126,208
2981.byte	102,73,15,126,217
2982	testq	%r8,%r8
2983	jnz	.Ladd_proceedx
2984	testq	%r9,%r9
2985	jz	.Ladd_doublex
2986
2987.byte	102,72,15,126,199
2988	pxor	%xmm0,%xmm0
2989	movdqu	%xmm0,0(%rdi)
2990	movdqu	%xmm0,16(%rdi)
2991	movdqu	%xmm0,32(%rdi)
2992	movdqu	%xmm0,48(%rdi)
2993	movdqu	%xmm0,64(%rdi)
2994	movdqu	%xmm0,80(%rdi)
2995	jmp	.Ladd_donex
2996
2997.align	32
2998.Ladd_doublex:
2999.byte	102,72,15,126,206
3000.byte	102,72,15,126,199
3001	addq	$416,%rsp
3002	jmp	.Lpoint_double_shortcutx
3003
3004.align	32
3005.Ladd_proceedx:
3006	movq	0+64(%rsp),%rdx
3007	movq	8+64(%rsp),%r14
3008	leaq	-128+64(%rsp),%rsi
3009	movq	16+64(%rsp),%r15
3010	movq	24+64(%rsp),%r8
3011	leaq	96(%rsp),%rdi
3012	call	__ecp_nistz256_sqr_montx
3013
3014	movq	448(%rsp),%rdx
3015	leaq	448(%rsp),%rbx
3016	movq	0+0(%rsp),%r9
3017	movq	8+0(%rsp),%r10
3018	leaq	-128+0(%rsp),%rsi
3019	movq	16+0(%rsp),%r11
3020	movq	24+0(%rsp),%r12
3021	leaq	352(%rsp),%rdi
3022	call	__ecp_nistz256_mul_montx
3023
3024	movq	0+0(%rsp),%rdx
3025	movq	8+0(%rsp),%r14
3026	leaq	-128+0(%rsp),%rsi
3027	movq	16+0(%rsp),%r15
3028	movq	24+0(%rsp),%r8
3029	leaq	32(%rsp),%rdi
3030	call	__ecp_nistz256_sqr_montx
3031
3032	movq	544(%rsp),%rdx
3033	leaq	544(%rsp),%rbx
3034	movq	0+352(%rsp),%r9
3035	movq	8+352(%rsp),%r10
3036	leaq	-128+352(%rsp),%rsi
3037	movq	16+352(%rsp),%r11
3038	movq	24+352(%rsp),%r12
3039	leaq	352(%rsp),%rdi
3040	call	__ecp_nistz256_mul_montx
3041
3042	movq	0(%rsp),%rdx
3043	leaq	0(%rsp),%rbx
3044	movq	0+32(%rsp),%r9
3045	movq	8+32(%rsp),%r10
3046	leaq	-128+32(%rsp),%rsi
3047	movq	16+32(%rsp),%r11
3048	movq	24+32(%rsp),%r12
3049	leaq	128(%rsp),%rdi
3050	call	__ecp_nistz256_mul_montx
3051
3052	movq	160(%rsp),%rdx
3053	leaq	160(%rsp),%rbx
3054	movq	0+32(%rsp),%r9
3055	movq	8+32(%rsp),%r10
3056	leaq	-128+32(%rsp),%rsi
3057	movq	16+32(%rsp),%r11
3058	movq	24+32(%rsp),%r12
3059	leaq	192(%rsp),%rdi
3060	call	__ecp_nistz256_mul_montx
3061
3062
3063
3064
3065	xorq	%r11,%r11
3066	addq	%r12,%r12
3067	leaq	96(%rsp),%rsi
3068	adcq	%r13,%r13
3069	movq	%r12,%rax
3070	adcq	%r8,%r8
3071	adcq	%r9,%r9
3072	movq	%r13,%rbp
3073	adcq	$0,%r11
3074
3075	subq	$-1,%r12
3076	movq	%r8,%rcx
3077	sbbq	%r14,%r13
3078	sbbq	$0,%r8
3079	movq	%r9,%r10
3080	sbbq	%r15,%r9
3081	sbbq	$0,%r11
3082
3083	cmovcq	%rax,%r12
3084	movq	0(%rsi),%rax
3085	cmovcq	%rbp,%r13
3086	movq	8(%rsi),%rbp
3087	cmovcq	%rcx,%r8
3088	movq	16(%rsi),%rcx
3089	cmovcq	%r10,%r9
3090	movq	24(%rsi),%r10
3091
3092	call	__ecp_nistz256_subx
3093
3094	leaq	128(%rsp),%rbx
3095	leaq	288(%rsp),%rdi
3096	call	__ecp_nistz256_sub_fromx
3097
3098	movq	192+0(%rsp),%rax
3099	movq	192+8(%rsp),%rbp
3100	movq	192+16(%rsp),%rcx
3101	movq	192+24(%rsp),%r10
3102	leaq	320(%rsp),%rdi
3103
3104	call	__ecp_nistz256_subx
3105
3106	movq	%r12,0(%rdi)
3107	movq	%r13,8(%rdi)
3108	movq	%r8,16(%rdi)
3109	movq	%r9,24(%rdi)
3110	movq	128(%rsp),%rdx
3111	leaq	128(%rsp),%rbx
3112	movq	0+224(%rsp),%r9
3113	movq	8+224(%rsp),%r10
3114	leaq	-128+224(%rsp),%rsi
3115	movq	16+224(%rsp),%r11
3116	movq	24+224(%rsp),%r12
3117	leaq	256(%rsp),%rdi
3118	call	__ecp_nistz256_mul_montx
3119
3120	movq	320(%rsp),%rdx
3121	leaq	320(%rsp),%rbx
3122	movq	0+64(%rsp),%r9
3123	movq	8+64(%rsp),%r10
3124	leaq	-128+64(%rsp),%rsi
3125	movq	16+64(%rsp),%r11
3126	movq	24+64(%rsp),%r12
3127	leaq	320(%rsp),%rdi
3128	call	__ecp_nistz256_mul_montx
3129
3130	leaq	256(%rsp),%rbx
3131	leaq	320(%rsp),%rdi
3132	call	__ecp_nistz256_sub_fromx
3133
3134.byte	102,72,15,126,199
3135
3136	movdqa	%xmm5,%xmm0
3137	movdqa	%xmm5,%xmm1
3138	pandn	352(%rsp),%xmm0
3139	movdqa	%xmm5,%xmm2
3140	pandn	352+16(%rsp),%xmm1
3141	movdqa	%xmm5,%xmm3
3142	pand	544(%rsp),%xmm2
3143	pand	544+16(%rsp),%xmm3
3144	por	%xmm0,%xmm2
3145	por	%xmm1,%xmm3
3146
3147	movdqa	%xmm4,%xmm0
3148	movdqa	%xmm4,%xmm1
3149	pandn	%xmm2,%xmm0
3150	movdqa	%xmm4,%xmm2
3151	pandn	%xmm3,%xmm1
3152	movdqa	%xmm4,%xmm3
3153	pand	448(%rsp),%xmm2
3154	pand	448+16(%rsp),%xmm3
3155	por	%xmm0,%xmm2
3156	por	%xmm1,%xmm3
3157	movdqu	%xmm2,64(%rdi)
3158	movdqu	%xmm3,80(%rdi)
3159
3160	movdqa	%xmm5,%xmm0
3161	movdqa	%xmm5,%xmm1
3162	pandn	288(%rsp),%xmm0
3163	movdqa	%xmm5,%xmm2
3164	pandn	288+16(%rsp),%xmm1
3165	movdqa	%xmm5,%xmm3
3166	pand	480(%rsp),%xmm2
3167	pand	480+16(%rsp),%xmm3
3168	por	%xmm0,%xmm2
3169	por	%xmm1,%xmm3
3170
3171	movdqa	%xmm4,%xmm0
3172	movdqa	%xmm4,%xmm1
3173	pandn	%xmm2,%xmm0
3174	movdqa	%xmm4,%xmm2
3175	pandn	%xmm3,%xmm1
3176	movdqa	%xmm4,%xmm3
3177	pand	384(%rsp),%xmm2
3178	pand	384+16(%rsp),%xmm3
3179	por	%xmm0,%xmm2
3180	por	%xmm1,%xmm3
3181	movdqu	%xmm2,0(%rdi)
3182	movdqu	%xmm3,16(%rdi)
3183
3184	movdqa	%xmm5,%xmm0
3185	movdqa	%xmm5,%xmm1
3186	pandn	320(%rsp),%xmm0
3187	movdqa	%xmm5,%xmm2
3188	pandn	320+16(%rsp),%xmm1
3189	movdqa	%xmm5,%xmm3
3190	pand	512(%rsp),%xmm2
3191	pand	512+16(%rsp),%xmm3
3192	por	%xmm0,%xmm2
3193	por	%xmm1,%xmm3
3194
3195	movdqa	%xmm4,%xmm0
3196	movdqa	%xmm4,%xmm1
3197	pandn	%xmm2,%xmm0
3198	movdqa	%xmm4,%xmm2
3199	pandn	%xmm3,%xmm1
3200	movdqa	%xmm4,%xmm3
3201	pand	416(%rsp),%xmm2
3202	pand	416+16(%rsp),%xmm3
3203	por	%xmm0,%xmm2
3204	por	%xmm1,%xmm3
3205	movdqu	%xmm2,32(%rdi)
3206	movdqu	%xmm3,48(%rdi)
3207
3208.Ladd_donex:
3209	addq	$576+8,%rsp
3210	popq	%r15
3211	popq	%r14
3212	popq	%r13
3213	popq	%r12
3214	popq	%rbx
3215	popq	%rbp
3216	.byte	0xf3,0xc3
3217.size	ecp_nistz256_point_addx,.-ecp_nistz256_point_addx
3218.type	ecp_nistz256_point_add_affinex,@function
3219.align	32
3220ecp_nistz256_point_add_affinex:
3221.Lpoint_add_affinex:
3222	pushq	%rbp
3223	pushq	%rbx
3224	pushq	%r12
3225	pushq	%r13
3226	pushq	%r14
3227	pushq	%r15
3228	subq	$480+8,%rsp
3229
3230	movdqu	0(%rsi),%xmm0
3231	movq	%rdx,%rbx
3232	movdqu	16(%rsi),%xmm1
3233	movdqu	32(%rsi),%xmm2
3234	movdqu	48(%rsi),%xmm3
3235	movdqu	64(%rsi),%xmm4
3236	movdqu	80(%rsi),%xmm5
3237	movq	64+0(%rsi),%rdx
3238	movq	64+8(%rsi),%r14
3239	movq	64+16(%rsi),%r15
3240	movq	64+24(%rsi),%r8
3241	movdqa	%xmm0,320(%rsp)
3242	movdqa	%xmm1,320+16(%rsp)
3243	movdqa	%xmm2,352(%rsp)
3244	movdqa	%xmm3,352+16(%rsp)
3245	movdqa	%xmm4,384(%rsp)
3246	movdqa	%xmm5,384+16(%rsp)
3247	por	%xmm4,%xmm5
3248
3249	movdqu	0(%rbx),%xmm0
3250	pshufd	$0xb1,%xmm5,%xmm3
3251	movdqu	16(%rbx),%xmm1
3252	movdqu	32(%rbx),%xmm2
3253	por	%xmm3,%xmm5
3254	movdqu	48(%rbx),%xmm3
3255	movdqa	%xmm0,416(%rsp)
3256	pshufd	$0x1e,%xmm5,%xmm4
3257	movdqa	%xmm1,416+16(%rsp)
3258	por	%xmm0,%xmm1
3259.byte	102,72,15,110,199
3260	movdqa	%xmm2,448(%rsp)
3261	movdqa	%xmm3,448+16(%rsp)
3262	por	%xmm2,%xmm3
3263	por	%xmm4,%xmm5
3264	pxor	%xmm4,%xmm4
3265	por	%xmm1,%xmm3
3266
3267	leaq	64-128(%rsi),%rsi
3268	leaq	32(%rsp),%rdi
3269	call	__ecp_nistz256_sqr_montx
3270
3271	pcmpeqd	%xmm4,%xmm5
3272	pshufd	$0xb1,%xmm3,%xmm4
3273	movq	0(%rbx),%rdx
3274
3275	movq	%r12,%r9
3276	por	%xmm3,%xmm4
3277	pshufd	$0,%xmm5,%xmm5
3278	pshufd	$0x1e,%xmm4,%xmm3
3279	movq	%r13,%r10
3280	por	%xmm3,%xmm4
3281	pxor	%xmm3,%xmm3
3282	movq	%r14,%r11
3283	pcmpeqd	%xmm3,%xmm4
3284	pshufd	$0,%xmm4,%xmm4
3285
3286	leaq	32-128(%rsp),%rsi
3287	movq	%r15,%r12
3288	leaq	0(%rsp),%rdi
3289	call	__ecp_nistz256_mul_montx
3290
3291	leaq	320(%rsp),%rbx
3292	leaq	64(%rsp),%rdi
3293	call	__ecp_nistz256_sub_fromx
3294
3295	movq	384(%rsp),%rdx
3296	leaq	384(%rsp),%rbx
3297	movq	0+32(%rsp),%r9
3298	movq	8+32(%rsp),%r10
3299	leaq	-128+32(%rsp),%rsi
3300	movq	16+32(%rsp),%r11
3301	movq	24+32(%rsp),%r12
3302	leaq	32(%rsp),%rdi
3303	call	__ecp_nistz256_mul_montx
3304
3305	movq	384(%rsp),%rdx
3306	leaq	384(%rsp),%rbx
3307	movq	0+64(%rsp),%r9
3308	movq	8+64(%rsp),%r10
3309	leaq	-128+64(%rsp),%rsi
3310	movq	16+64(%rsp),%r11
3311	movq	24+64(%rsp),%r12
3312	leaq	288(%rsp),%rdi
3313	call	__ecp_nistz256_mul_montx
3314
3315	movq	448(%rsp),%rdx
3316	leaq	448(%rsp),%rbx
3317	movq	0+32(%rsp),%r9
3318	movq	8+32(%rsp),%r10
3319	leaq	-128+32(%rsp),%rsi
3320	movq	16+32(%rsp),%r11
3321	movq	24+32(%rsp),%r12
3322	leaq	32(%rsp),%rdi
3323	call	__ecp_nistz256_mul_montx
3324
3325	leaq	352(%rsp),%rbx
3326	leaq	96(%rsp),%rdi
3327	call	__ecp_nistz256_sub_fromx
3328
3329	movq	0+64(%rsp),%rdx
3330	movq	8+64(%rsp),%r14
3331	leaq	-128+64(%rsp),%rsi
3332	movq	16+64(%rsp),%r15
3333	movq	24+64(%rsp),%r8
3334	leaq	128(%rsp),%rdi
3335	call	__ecp_nistz256_sqr_montx
3336
3337	movq	0+96(%rsp),%rdx
3338	movq	8+96(%rsp),%r14
3339	leaq	-128+96(%rsp),%rsi
3340	movq	16+96(%rsp),%r15
3341	movq	24+96(%rsp),%r8
3342	leaq	192(%rsp),%rdi
3343	call	__ecp_nistz256_sqr_montx
3344
3345	movq	128(%rsp),%rdx
3346	leaq	128(%rsp),%rbx
3347	movq	0+64(%rsp),%r9
3348	movq	8+64(%rsp),%r10
3349	leaq	-128+64(%rsp),%rsi
3350	movq	16+64(%rsp),%r11
3351	movq	24+64(%rsp),%r12
3352	leaq	160(%rsp),%rdi
3353	call	__ecp_nistz256_mul_montx
3354
3355	movq	320(%rsp),%rdx
3356	leaq	320(%rsp),%rbx
3357	movq	0+128(%rsp),%r9
3358	movq	8+128(%rsp),%r10
3359	leaq	-128+128(%rsp),%rsi
3360	movq	16+128(%rsp),%r11
3361	movq	24+128(%rsp),%r12
3362	leaq	0(%rsp),%rdi
3363	call	__ecp_nistz256_mul_montx
3364
3365
3366
3367
3368	xorq	%r11,%r11
3369	addq	%r12,%r12
3370	leaq	192(%rsp),%rsi
3371	adcq	%r13,%r13
3372	movq	%r12,%rax
3373	adcq	%r8,%r8
3374	adcq	%r9,%r9
3375	movq	%r13,%rbp
3376	adcq	$0,%r11
3377
3378	subq	$-1,%r12
3379	movq	%r8,%rcx
3380	sbbq	%r14,%r13
3381	sbbq	$0,%r8
3382	movq	%r9,%r10
3383	sbbq	%r15,%r9
3384	sbbq	$0,%r11
3385
3386	cmovcq	%rax,%r12
3387	movq	0(%rsi),%rax
3388	cmovcq	%rbp,%r13
3389	movq	8(%rsi),%rbp
3390	cmovcq	%rcx,%r8
3391	movq	16(%rsi),%rcx
3392	cmovcq	%r10,%r9
3393	movq	24(%rsi),%r10
3394
3395	call	__ecp_nistz256_subx
3396
3397	leaq	160(%rsp),%rbx
3398	leaq	224(%rsp),%rdi
3399	call	__ecp_nistz256_sub_fromx
3400
3401	movq	0+0(%rsp),%rax
3402	movq	0+8(%rsp),%rbp
3403	movq	0+16(%rsp),%rcx
3404	movq	0+24(%rsp),%r10
3405	leaq	64(%rsp),%rdi
3406
3407	call	__ecp_nistz256_subx
3408
3409	movq	%r12,0(%rdi)
3410	movq	%r13,8(%rdi)
3411	movq	%r8,16(%rdi)
3412	movq	%r9,24(%rdi)
3413	movq	352(%rsp),%rdx
3414	leaq	352(%rsp),%rbx
3415	movq	0+160(%rsp),%r9
3416	movq	8+160(%rsp),%r10
3417	leaq	-128+160(%rsp),%rsi
3418	movq	16+160(%rsp),%r11
3419	movq	24+160(%rsp),%r12
3420	leaq	32(%rsp),%rdi
3421	call	__ecp_nistz256_mul_montx
3422
3423	movq	96(%rsp),%rdx
3424	leaq	96(%rsp),%rbx
3425	movq	0+64(%rsp),%r9
3426	movq	8+64(%rsp),%r10
3427	leaq	-128+64(%rsp),%rsi
3428	movq	16+64(%rsp),%r11
3429	movq	24+64(%rsp),%r12
3430	leaq	64(%rsp),%rdi
3431	call	__ecp_nistz256_mul_montx
3432
3433	leaq	32(%rsp),%rbx
3434	leaq	256(%rsp),%rdi
3435	call	__ecp_nistz256_sub_fromx
3436
3437.byte	102,72,15,126,199
3438
3439	movdqa	%xmm5,%xmm0
3440	movdqa	%xmm5,%xmm1
3441	pandn	288(%rsp),%xmm0
3442	movdqa	%xmm5,%xmm2
3443	pandn	288+16(%rsp),%xmm1
3444	movdqa	%xmm5,%xmm3
3445	pand	.LONE_mont(%rip),%xmm2
3446	pand	.LONE_mont+16(%rip),%xmm3
3447	por	%xmm0,%xmm2
3448	por	%xmm1,%xmm3
3449
3450	movdqa	%xmm4,%xmm0
3451	movdqa	%xmm4,%xmm1
3452	pandn	%xmm2,%xmm0
3453	movdqa	%xmm4,%xmm2
3454	pandn	%xmm3,%xmm1
3455	movdqa	%xmm4,%xmm3
3456	pand	384(%rsp),%xmm2
3457	pand	384+16(%rsp),%xmm3
3458	por	%xmm0,%xmm2
3459	por	%xmm1,%xmm3
3460	movdqu	%xmm2,64(%rdi)
3461	movdqu	%xmm3,80(%rdi)
3462
3463	movdqa	%xmm5,%xmm0
3464	movdqa	%xmm5,%xmm1
3465	pandn	224(%rsp),%xmm0
3466	movdqa	%xmm5,%xmm2
3467	pandn	224+16(%rsp),%xmm1
3468	movdqa	%xmm5,%xmm3
3469	pand	416(%rsp),%xmm2
3470	pand	416+16(%rsp),%xmm3
3471	por	%xmm0,%xmm2
3472	por	%xmm1,%xmm3
3473
3474	movdqa	%xmm4,%xmm0
3475	movdqa	%xmm4,%xmm1
3476	pandn	%xmm2,%xmm0
3477	movdqa	%xmm4,%xmm2
3478	pandn	%xmm3,%xmm1
3479	movdqa	%xmm4,%xmm3
3480	pand	320(%rsp),%xmm2
3481	pand	320+16(%rsp),%xmm3
3482	por	%xmm0,%xmm2
3483	por	%xmm1,%xmm3
3484	movdqu	%xmm2,0(%rdi)
3485	movdqu	%xmm3,16(%rdi)
3486
3487	movdqa	%xmm5,%xmm0
3488	movdqa	%xmm5,%xmm1
3489	pandn	256(%rsp),%xmm0
3490	movdqa	%xmm5,%xmm2
3491	pandn	256+16(%rsp),%xmm1
3492	movdqa	%xmm5,%xmm3
3493	pand	448(%rsp),%xmm2
3494	pand	448+16(%rsp),%xmm3
3495	por	%xmm0,%xmm2
3496	por	%xmm1,%xmm3
3497
3498	movdqa	%xmm4,%xmm0
3499	movdqa	%xmm4,%xmm1
3500	pandn	%xmm2,%xmm0
3501	movdqa	%xmm4,%xmm2
3502	pandn	%xmm3,%xmm1
3503	movdqa	%xmm4,%xmm3
3504	pand	352(%rsp),%xmm2
3505	pand	352+16(%rsp),%xmm3
3506	por	%xmm0,%xmm2
3507	por	%xmm1,%xmm3
3508	movdqu	%xmm2,32(%rdi)
3509	movdqu	%xmm3,48(%rdi)
3510
3511	addq	$480+8,%rsp
3512	popq	%r15
3513	popq	%r14
3514	popq	%r13
3515	popq	%r12
3516	popq	%rbx
3517	popq	%rbp
3518	.byte	0xf3,0xc3
3519.size	ecp_nistz256_point_add_affinex,.-ecp_nistz256_point_add_affinex
3520