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