• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM)
2.text
3
4
5
6.p2align	6
7L$poly:
8.quad	0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001
9
10L$One:
11.long	1,1,1,1,1,1,1,1
12L$Two:
13.long	2,2,2,2,2,2,2,2
14L$Three:
15.long	3,3,3,3,3,3,3,3
16L$ONE_mont:
17.quad	0x0000000000000001, 0xffffffff00000000, 0xffffffffffffffff, 0x00000000fffffffe
18
19
20
21.globl	_ecp_nistz256_neg
22.private_extern _ecp_nistz256_neg
23
24.p2align	5
25_ecp_nistz256_neg:
26	pushq	%r12
27	pushq	%r13
28
29	xorq	%r8,%r8
30	xorq	%r9,%r9
31	xorq	%r10,%r10
32	xorq	%r11,%r11
33	xorq	%r13,%r13
34
35	subq	0(%rsi),%r8
36	sbbq	8(%rsi),%r9
37	sbbq	16(%rsi),%r10
38	movq	%r8,%rax
39	sbbq	24(%rsi),%r11
40	leaq	L$poly(%rip),%rsi
41	movq	%r9,%rdx
42	sbbq	$0,%r13
43
44	addq	0(%rsi),%r8
45	movq	%r10,%rcx
46	adcq	8(%rsi),%r9
47	adcq	16(%rsi),%r10
48	movq	%r11,%r12
49	adcq	24(%rsi),%r11
50	testq	%r13,%r13
51
52	cmovzq	%rax,%r8
53	cmovzq	%rdx,%r9
54	movq	%r8,0(%rdi)
55	cmovzq	%rcx,%r10
56	movq	%r9,8(%rdi)
57	cmovzq	%r12,%r11
58	movq	%r10,16(%rdi)
59	movq	%r11,24(%rdi)
60
61	popq	%r13
62	popq	%r12
63	.byte	0xf3,0xc3
64
65
66
67
68
69
70
71.globl	_ecp_nistz256_mul_mont
72.private_extern _ecp_nistz256_mul_mont
73
74.p2align	5
75_ecp_nistz256_mul_mont:
76L$mul_mont:
77	pushq	%rbp
78	pushq	%rbx
79	pushq	%r12
80	pushq	%r13
81	pushq	%r14
82	pushq	%r15
83	movq	%rdx,%rbx
84	movq	0(%rdx),%rax
85	movq	0(%rsi),%r9
86	movq	8(%rsi),%r10
87	movq	16(%rsi),%r11
88	movq	24(%rsi),%r12
89
90	call	__ecp_nistz256_mul_montq
91L$mul_mont_done:
92	popq	%r15
93	popq	%r14
94	popq	%r13
95	popq	%r12
96	popq	%rbx
97	popq	%rbp
98	.byte	0xf3,0xc3
99
100
101
102.p2align	5
103__ecp_nistz256_mul_montq:
104
105
106	movq	%rax,%rbp
107	mulq	%r9
108	movq	L$poly+8(%rip),%r14
109	movq	%rax,%r8
110	movq	%rbp,%rax
111	movq	%rdx,%r9
112
113	mulq	%r10
114	movq	L$poly+24(%rip),%r15
115	addq	%rax,%r9
116	movq	%rbp,%rax
117	adcq	$0,%rdx
118	movq	%rdx,%r10
119
120	mulq	%r11
121	addq	%rax,%r10
122	movq	%rbp,%rax
123	adcq	$0,%rdx
124	movq	%rdx,%r11
125
126	mulq	%r12
127	addq	%rax,%r11
128	movq	%r8,%rax
129	adcq	$0,%rdx
130	xorq	%r13,%r13
131	movq	%rdx,%r12
132
133
134
135
136
137
138
139
140
141
142	movq	%r8,%rbp
143	shlq	$32,%r8
144	mulq	%r15
145	shrq	$32,%rbp
146	addq	%r8,%r9
147	adcq	%rbp,%r10
148	adcq	%rax,%r11
149	movq	8(%rbx),%rax
150	adcq	%rdx,%r12
151	adcq	$0,%r13
152	xorq	%r8,%r8
153
154
155
156	movq	%rax,%rbp
157	mulq	0(%rsi)
158	addq	%rax,%r9
159	movq	%rbp,%rax
160	adcq	$0,%rdx
161	movq	%rdx,%rcx
162
163	mulq	8(%rsi)
164	addq	%rcx,%r10
165	adcq	$0,%rdx
166	addq	%rax,%r10
167	movq	%rbp,%rax
168	adcq	$0,%rdx
169	movq	%rdx,%rcx
170
171	mulq	16(%rsi)
172	addq	%rcx,%r11
173	adcq	$0,%rdx
174	addq	%rax,%r11
175	movq	%rbp,%rax
176	adcq	$0,%rdx
177	movq	%rdx,%rcx
178
179	mulq	24(%rsi)
180	addq	%rcx,%r12
181	adcq	$0,%rdx
182	addq	%rax,%r12
183	movq	%r9,%rax
184	adcq	%rdx,%r13
185	adcq	$0,%r8
186
187
188
189	movq	%r9,%rbp
190	shlq	$32,%r9
191	mulq	%r15
192	shrq	$32,%rbp
193	addq	%r9,%r10
194	adcq	%rbp,%r11
195	adcq	%rax,%r12
196	movq	16(%rbx),%rax
197	adcq	%rdx,%r13
198	adcq	$0,%r8
199	xorq	%r9,%r9
200
201
202
203	movq	%rax,%rbp
204	mulq	0(%rsi)
205	addq	%rax,%r10
206	movq	%rbp,%rax
207	adcq	$0,%rdx
208	movq	%rdx,%rcx
209
210	mulq	8(%rsi)
211	addq	%rcx,%r11
212	adcq	$0,%rdx
213	addq	%rax,%r11
214	movq	%rbp,%rax
215	adcq	$0,%rdx
216	movq	%rdx,%rcx
217
218	mulq	16(%rsi)
219	addq	%rcx,%r12
220	adcq	$0,%rdx
221	addq	%rax,%r12
222	movq	%rbp,%rax
223	adcq	$0,%rdx
224	movq	%rdx,%rcx
225
226	mulq	24(%rsi)
227	addq	%rcx,%r13
228	adcq	$0,%rdx
229	addq	%rax,%r13
230	movq	%r10,%rax
231	adcq	%rdx,%r8
232	adcq	$0,%r9
233
234
235
236	movq	%r10,%rbp
237	shlq	$32,%r10
238	mulq	%r15
239	shrq	$32,%rbp
240	addq	%r10,%r11
241	adcq	%rbp,%r12
242	adcq	%rax,%r13
243	movq	24(%rbx),%rax
244	adcq	%rdx,%r8
245	adcq	$0,%r9
246	xorq	%r10,%r10
247
248
249
250	movq	%rax,%rbp
251	mulq	0(%rsi)
252	addq	%rax,%r11
253	movq	%rbp,%rax
254	adcq	$0,%rdx
255	movq	%rdx,%rcx
256
257	mulq	8(%rsi)
258	addq	%rcx,%r12
259	adcq	$0,%rdx
260	addq	%rax,%r12
261	movq	%rbp,%rax
262	adcq	$0,%rdx
263	movq	%rdx,%rcx
264
265	mulq	16(%rsi)
266	addq	%rcx,%r13
267	adcq	$0,%rdx
268	addq	%rax,%r13
269	movq	%rbp,%rax
270	adcq	$0,%rdx
271	movq	%rdx,%rcx
272
273	mulq	24(%rsi)
274	addq	%rcx,%r8
275	adcq	$0,%rdx
276	addq	%rax,%r8
277	movq	%r11,%rax
278	adcq	%rdx,%r9
279	adcq	$0,%r10
280
281
282
283	movq	%r11,%rbp
284	shlq	$32,%r11
285	mulq	%r15
286	shrq	$32,%rbp
287	addq	%r11,%r12
288	adcq	%rbp,%r13
289	movq	%r12,%rcx
290	adcq	%rax,%r8
291	adcq	%rdx,%r9
292	movq	%r13,%rbp
293	adcq	$0,%r10
294
295
296
297	subq	$-1,%r12
298	movq	%r8,%rbx
299	sbbq	%r14,%r13
300	sbbq	$0,%r8
301	movq	%r9,%rdx
302	sbbq	%r15,%r9
303	sbbq	$0,%r10
304
305	cmovcq	%rcx,%r12
306	cmovcq	%rbp,%r13
307	movq	%r12,0(%rdi)
308	cmovcq	%rbx,%r8
309	movq	%r13,8(%rdi)
310	cmovcq	%rdx,%r9
311	movq	%r8,16(%rdi)
312	movq	%r9,24(%rdi)
313
314	.byte	0xf3,0xc3
315
316
317
318
319
320
321
322
323
324.globl	_ecp_nistz256_sqr_mont
325.private_extern _ecp_nistz256_sqr_mont
326
327.p2align	5
328_ecp_nistz256_sqr_mont:
329	pushq	%rbp
330	pushq	%rbx
331	pushq	%r12
332	pushq	%r13
333	pushq	%r14
334	pushq	%r15
335	movq	0(%rsi),%rax
336	movq	8(%rsi),%r14
337	movq	16(%rsi),%r15
338	movq	24(%rsi),%r8
339
340	call	__ecp_nistz256_sqr_montq
341L$sqr_mont_done:
342	popq	%r15
343	popq	%r14
344	popq	%r13
345	popq	%r12
346	popq	%rbx
347	popq	%rbp
348	.byte	0xf3,0xc3
349
350
351
352.p2align	5
353__ecp_nistz256_sqr_montq:
354	movq	%rax,%r13
355	mulq	%r14
356	movq	%rax,%r9
357	movq	%r15,%rax
358	movq	%rdx,%r10
359
360	mulq	%r13
361	addq	%rax,%r10
362	movq	%r8,%rax
363	adcq	$0,%rdx
364	movq	%rdx,%r11
365
366	mulq	%r13
367	addq	%rax,%r11
368	movq	%r15,%rax
369	adcq	$0,%rdx
370	movq	%rdx,%r12
371
372
373	mulq	%r14
374	addq	%rax,%r11
375	movq	%r8,%rax
376	adcq	$0,%rdx
377	movq	%rdx,%rbp
378
379	mulq	%r14
380	addq	%rax,%r12
381	movq	%r8,%rax
382	adcq	$0,%rdx
383	addq	%rbp,%r12
384	movq	%rdx,%r13
385	adcq	$0,%r13
386
387
388	mulq	%r15
389	xorq	%r15,%r15
390	addq	%rax,%r13
391	movq	0(%rsi),%rax
392	movq	%rdx,%r14
393	adcq	$0,%r14
394
395	addq	%r9,%r9
396	adcq	%r10,%r10
397	adcq	%r11,%r11
398	adcq	%r12,%r12
399	adcq	%r13,%r13
400	adcq	%r14,%r14
401	adcq	$0,%r15
402
403	mulq	%rax
404	movq	%rax,%r8
405	movq	8(%rsi),%rax
406	movq	%rdx,%rcx
407
408	mulq	%rax
409	addq	%rcx,%r9
410	adcq	%rax,%r10
411	movq	16(%rsi),%rax
412	adcq	$0,%rdx
413	movq	%rdx,%rcx
414
415	mulq	%rax
416	addq	%rcx,%r11
417	adcq	%rax,%r12
418	movq	24(%rsi),%rax
419	adcq	$0,%rdx
420	movq	%rdx,%rcx
421
422	mulq	%rax
423	addq	%rcx,%r13
424	adcq	%rax,%r14
425	movq	%r8,%rax
426	adcq	%rdx,%r15
427
428	movq	L$poly+8(%rip),%rsi
429	movq	L$poly+24(%rip),%rbp
430
431
432
433
434	movq	%r8,%rcx
435	shlq	$32,%r8
436	mulq	%rbp
437	shrq	$32,%rcx
438	addq	%r8,%r9
439	adcq	%rcx,%r10
440	adcq	%rax,%r11
441	movq	%r9,%rax
442	adcq	$0,%rdx
443
444
445
446	movq	%r9,%rcx
447	shlq	$32,%r9
448	movq	%rdx,%r8
449	mulq	%rbp
450	shrq	$32,%rcx
451	addq	%r9,%r10
452	adcq	%rcx,%r11
453	adcq	%rax,%r8
454	movq	%r10,%rax
455	adcq	$0,%rdx
456
457
458
459	movq	%r10,%rcx
460	shlq	$32,%r10
461	movq	%rdx,%r9
462	mulq	%rbp
463	shrq	$32,%rcx
464	addq	%r10,%r11
465	adcq	%rcx,%r8
466	adcq	%rax,%r9
467	movq	%r11,%rax
468	adcq	$0,%rdx
469
470
471
472	movq	%r11,%rcx
473	shlq	$32,%r11
474	movq	%rdx,%r10
475	mulq	%rbp
476	shrq	$32,%rcx
477	addq	%r11,%r8
478	adcq	%rcx,%r9
479	adcq	%rax,%r10
480	adcq	$0,%rdx
481	xorq	%r11,%r11
482
483
484
485	addq	%r8,%r12
486	adcq	%r9,%r13
487	movq	%r12,%r8
488	adcq	%r10,%r14
489	adcq	%rdx,%r15
490	movq	%r13,%r9
491	adcq	$0,%r11
492
493	subq	$-1,%r12
494	movq	%r14,%r10
495	sbbq	%rsi,%r13
496	sbbq	$0,%r14
497	movq	%r15,%rcx
498	sbbq	%rbp,%r15
499	sbbq	$0,%r11
500
501	cmovcq	%r8,%r12
502	cmovcq	%r9,%r13
503	movq	%r12,0(%rdi)
504	cmovcq	%r10,%r14
505	movq	%r13,8(%rdi)
506	cmovcq	%rcx,%r15
507	movq	%r14,16(%rdi)
508	movq	%r15,24(%rdi)
509
510	.byte	0xf3,0xc3
511
512
513
514.globl	_ecp_nistz256_select_w5
515.private_extern _ecp_nistz256_select_w5
516
517.p2align	5
518_ecp_nistz256_select_w5:
519	movdqa	L$One(%rip),%xmm0
520	movd	%edx,%xmm1
521
522	pxor	%xmm2,%xmm2
523	pxor	%xmm3,%xmm3
524	pxor	%xmm4,%xmm4
525	pxor	%xmm5,%xmm5
526	pxor	%xmm6,%xmm6
527	pxor	%xmm7,%xmm7
528
529	movdqa	%xmm0,%xmm8
530	pshufd	$0,%xmm1,%xmm1
531
532	movq	$16,%rax
533L$select_loop_sse_w5:
534
535	movdqa	%xmm8,%xmm15
536	paddd	%xmm0,%xmm8
537	pcmpeqd	%xmm1,%xmm15
538
539	movdqa	0(%rsi),%xmm9
540	movdqa	16(%rsi),%xmm10
541	movdqa	32(%rsi),%xmm11
542	movdqa	48(%rsi),%xmm12
543	movdqa	64(%rsi),%xmm13
544	movdqa	80(%rsi),%xmm14
545	leaq	96(%rsi),%rsi
546
547	pand	%xmm15,%xmm9
548	pand	%xmm15,%xmm10
549	por	%xmm9,%xmm2
550	pand	%xmm15,%xmm11
551	por	%xmm10,%xmm3
552	pand	%xmm15,%xmm12
553	por	%xmm11,%xmm4
554	pand	%xmm15,%xmm13
555	por	%xmm12,%xmm5
556	pand	%xmm15,%xmm14
557	por	%xmm13,%xmm6
558	por	%xmm14,%xmm7
559
560	decq	%rax
561	jnz	L$select_loop_sse_w5
562
563	movdqu	%xmm2,0(%rdi)
564	movdqu	%xmm3,16(%rdi)
565	movdqu	%xmm4,32(%rdi)
566	movdqu	%xmm5,48(%rdi)
567	movdqu	%xmm6,64(%rdi)
568	movdqu	%xmm7,80(%rdi)
569	.byte	0xf3,0xc3
570
571
572
573
574.globl	_ecp_nistz256_select_w7
575.private_extern _ecp_nistz256_select_w7
576
577.p2align	5
578_ecp_nistz256_select_w7:
579	movdqa	L$One(%rip),%xmm8
580	movd	%edx,%xmm1
581
582	pxor	%xmm2,%xmm2
583	pxor	%xmm3,%xmm3
584	pxor	%xmm4,%xmm4
585	pxor	%xmm5,%xmm5
586
587	movdqa	%xmm8,%xmm0
588	pshufd	$0,%xmm1,%xmm1
589	movq	$64,%rax
590
591L$select_loop_sse_w7:
592	movdqa	%xmm8,%xmm15
593	paddd	%xmm0,%xmm8
594	movdqa	0(%rsi),%xmm9
595	movdqa	16(%rsi),%xmm10
596	pcmpeqd	%xmm1,%xmm15
597	movdqa	32(%rsi),%xmm11
598	movdqa	48(%rsi),%xmm12
599	leaq	64(%rsi),%rsi
600
601	pand	%xmm15,%xmm9
602	pand	%xmm15,%xmm10
603	por	%xmm9,%xmm2
604	pand	%xmm15,%xmm11
605	por	%xmm10,%xmm3
606	pand	%xmm15,%xmm12
607	por	%xmm11,%xmm4
608	prefetcht0	255(%rsi)
609	por	%xmm12,%xmm5
610
611	decq	%rax
612	jnz	L$select_loop_sse_w7
613
614	movdqu	%xmm2,0(%rdi)
615	movdqu	%xmm3,16(%rdi)
616	movdqu	%xmm4,32(%rdi)
617	movdqu	%xmm5,48(%rdi)
618	.byte	0xf3,0xc3
619
620.globl	_ecp_nistz256_avx2_select_w7
621.private_extern _ecp_nistz256_avx2_select_w7
622
623.p2align	5
624_ecp_nistz256_avx2_select_w7:
625.byte	0x0f,0x0b
626	.byte	0xf3,0xc3
627
628
629.p2align	5
630__ecp_nistz256_add_toq:
631	xorq	%r11,%r11
632	addq	0(%rbx),%r12
633	adcq	8(%rbx),%r13
634	movq	%r12,%rax
635	adcq	16(%rbx),%r8
636	adcq	24(%rbx),%r9
637	movq	%r13,%rbp
638	adcq	$0,%r11
639
640	subq	$-1,%r12
641	movq	%r8,%rcx
642	sbbq	%r14,%r13
643	sbbq	$0,%r8
644	movq	%r9,%r10
645	sbbq	%r15,%r9
646	sbbq	$0,%r11
647
648	cmovcq	%rax,%r12
649	cmovcq	%rbp,%r13
650	movq	%r12,0(%rdi)
651	cmovcq	%rcx,%r8
652	movq	%r13,8(%rdi)
653	cmovcq	%r10,%r9
654	movq	%r8,16(%rdi)
655	movq	%r9,24(%rdi)
656
657	.byte	0xf3,0xc3
658
659
660
661.p2align	5
662__ecp_nistz256_sub_fromq:
663	subq	0(%rbx),%r12
664	sbbq	8(%rbx),%r13
665	movq	%r12,%rax
666	sbbq	16(%rbx),%r8
667	sbbq	24(%rbx),%r9
668	movq	%r13,%rbp
669	sbbq	%r11,%r11
670
671	addq	$-1,%r12
672	movq	%r8,%rcx
673	adcq	%r14,%r13
674	adcq	$0,%r8
675	movq	%r9,%r10
676	adcq	%r15,%r9
677	testq	%r11,%r11
678
679	cmovzq	%rax,%r12
680	cmovzq	%rbp,%r13
681	movq	%r12,0(%rdi)
682	cmovzq	%rcx,%r8
683	movq	%r13,8(%rdi)
684	cmovzq	%r10,%r9
685	movq	%r8,16(%rdi)
686	movq	%r9,24(%rdi)
687
688	.byte	0xf3,0xc3
689
690
691
692.p2align	5
693__ecp_nistz256_subq:
694	subq	%r12,%rax
695	sbbq	%r13,%rbp
696	movq	%rax,%r12
697	sbbq	%r8,%rcx
698	sbbq	%r9,%r10
699	movq	%rbp,%r13
700	sbbq	%r11,%r11
701
702	addq	$-1,%rax
703	movq	%rcx,%r8
704	adcq	%r14,%rbp
705	adcq	$0,%rcx
706	movq	%r10,%r9
707	adcq	%r15,%r10
708	testq	%r11,%r11
709
710	cmovnzq	%rax,%r12
711	cmovnzq	%rbp,%r13
712	cmovnzq	%rcx,%r8
713	cmovnzq	%r10,%r9
714
715	.byte	0xf3,0xc3
716
717
718
719.p2align	5
720__ecp_nistz256_mul_by_2q:
721	xorq	%r11,%r11
722	addq	%r12,%r12
723	adcq	%r13,%r13
724	movq	%r12,%rax
725	adcq	%r8,%r8
726	adcq	%r9,%r9
727	movq	%r13,%rbp
728	adcq	$0,%r11
729
730	subq	$-1,%r12
731	movq	%r8,%rcx
732	sbbq	%r14,%r13
733	sbbq	$0,%r8
734	movq	%r9,%r10
735	sbbq	%r15,%r9
736	sbbq	$0,%r11
737
738	cmovcq	%rax,%r12
739	cmovcq	%rbp,%r13
740	movq	%r12,0(%rdi)
741	cmovcq	%rcx,%r8
742	movq	%r13,8(%rdi)
743	cmovcq	%r10,%r9
744	movq	%r8,16(%rdi)
745	movq	%r9,24(%rdi)
746
747	.byte	0xf3,0xc3
748
749.globl	_ecp_nistz256_point_double
750.private_extern _ecp_nistz256_point_double
751
752.p2align	5
753_ecp_nistz256_point_double:
754	pushq	%rbp
755	pushq	%rbx
756	pushq	%r12
757	pushq	%r13
758	pushq	%r14
759	pushq	%r15
760	subq	$160+8,%rsp
761
762L$point_double_shortcutq:
763	movdqu	0(%rsi),%xmm0
764	movq	%rsi,%rbx
765	movdqu	16(%rsi),%xmm1
766	movq	32+0(%rsi),%r12
767	movq	32+8(%rsi),%r13
768	movq	32+16(%rsi),%r8
769	movq	32+24(%rsi),%r9
770	movq	L$poly+8(%rip),%r14
771	movq	L$poly+24(%rip),%r15
772	movdqa	%xmm0,96(%rsp)
773	movdqa	%xmm1,96+16(%rsp)
774	leaq	32(%rdi),%r10
775	leaq	64(%rdi),%r11
776.byte	102,72,15,110,199
777.byte	102,73,15,110,202
778.byte	102,73,15,110,211
779
780	leaq	0(%rsp),%rdi
781	call	__ecp_nistz256_mul_by_2q
782
783	movq	64+0(%rsi),%rax
784	movq	64+8(%rsi),%r14
785	movq	64+16(%rsi),%r15
786	movq	64+24(%rsi),%r8
787	leaq	64-0(%rsi),%rsi
788	leaq	64(%rsp),%rdi
789	call	__ecp_nistz256_sqr_montq
790
791	movq	0+0(%rsp),%rax
792	movq	8+0(%rsp),%r14
793	leaq	0+0(%rsp),%rsi
794	movq	16+0(%rsp),%r15
795	movq	24+0(%rsp),%r8
796	leaq	0(%rsp),%rdi
797	call	__ecp_nistz256_sqr_montq
798
799	movq	32(%rbx),%rax
800	movq	64+0(%rbx),%r9
801	movq	64+8(%rbx),%r10
802	movq	64+16(%rbx),%r11
803	movq	64+24(%rbx),%r12
804	leaq	64-0(%rbx),%rsi
805	leaq	32(%rbx),%rbx
806.byte	102,72,15,126,215
807	call	__ecp_nistz256_mul_montq
808	call	__ecp_nistz256_mul_by_2q
809
810	movq	96+0(%rsp),%r12
811	movq	96+8(%rsp),%r13
812	leaq	64(%rsp),%rbx
813	movq	96+16(%rsp),%r8
814	movq	96+24(%rsp),%r9
815	leaq	32(%rsp),%rdi
816	call	__ecp_nistz256_add_toq
817
818	movq	96+0(%rsp),%r12
819	movq	96+8(%rsp),%r13
820	leaq	64(%rsp),%rbx
821	movq	96+16(%rsp),%r8
822	movq	96+24(%rsp),%r9
823	leaq	64(%rsp),%rdi
824	call	__ecp_nistz256_sub_fromq
825
826	movq	0+0(%rsp),%rax
827	movq	8+0(%rsp),%r14
828	leaq	0+0(%rsp),%rsi
829	movq	16+0(%rsp),%r15
830	movq	24+0(%rsp),%r8
831.byte	102,72,15,126,207
832	call	__ecp_nistz256_sqr_montq
833	xorq	%r9,%r9
834	movq	%r12,%rax
835	addq	$-1,%r12
836	movq	%r13,%r10
837	adcq	%rsi,%r13
838	movq	%r14,%rcx
839	adcq	$0,%r14
840	movq	%r15,%r8
841	adcq	%rbp,%r15
842	adcq	$0,%r9
843	xorq	%rsi,%rsi
844	testq	$1,%rax
845
846	cmovzq	%rax,%r12
847	cmovzq	%r10,%r13
848	cmovzq	%rcx,%r14
849	cmovzq	%r8,%r15
850	cmovzq	%rsi,%r9
851
852	movq	%r13,%rax
853	shrq	$1,%r12
854	shlq	$63,%rax
855	movq	%r14,%r10
856	shrq	$1,%r13
857	orq	%rax,%r12
858	shlq	$63,%r10
859	movq	%r15,%rcx
860	shrq	$1,%r14
861	orq	%r10,%r13
862	shlq	$63,%rcx
863	movq	%r12,0(%rdi)
864	shrq	$1,%r15
865	movq	%r13,8(%rdi)
866	shlq	$63,%r9
867	orq	%rcx,%r14
868	orq	%r9,%r15
869	movq	%r14,16(%rdi)
870	movq	%r15,24(%rdi)
871	movq	64(%rsp),%rax
872	leaq	64(%rsp),%rbx
873	movq	0+32(%rsp),%r9
874	movq	8+32(%rsp),%r10
875	leaq	0+32(%rsp),%rsi
876	movq	16+32(%rsp),%r11
877	movq	24+32(%rsp),%r12
878	leaq	32(%rsp),%rdi
879	call	__ecp_nistz256_mul_montq
880
881	leaq	128(%rsp),%rdi
882	call	__ecp_nistz256_mul_by_2q
883
884	leaq	32(%rsp),%rbx
885	leaq	32(%rsp),%rdi
886	call	__ecp_nistz256_add_toq
887
888	movq	96(%rsp),%rax
889	leaq	96(%rsp),%rbx
890	movq	0+0(%rsp),%r9
891	movq	8+0(%rsp),%r10
892	leaq	0+0(%rsp),%rsi
893	movq	16+0(%rsp),%r11
894	movq	24+0(%rsp),%r12
895	leaq	0(%rsp),%rdi
896	call	__ecp_nistz256_mul_montq
897
898	leaq	128(%rsp),%rdi
899	call	__ecp_nistz256_mul_by_2q
900
901	movq	0+32(%rsp),%rax
902	movq	8+32(%rsp),%r14
903	leaq	0+32(%rsp),%rsi
904	movq	16+32(%rsp),%r15
905	movq	24+32(%rsp),%r8
906.byte	102,72,15,126,199
907	call	__ecp_nistz256_sqr_montq
908
909	leaq	128(%rsp),%rbx
910	movq	%r14,%r8
911	movq	%r15,%r9
912	movq	%rsi,%r14
913	movq	%rbp,%r15
914	call	__ecp_nistz256_sub_fromq
915
916	movq	0+0(%rsp),%rax
917	movq	0+8(%rsp),%rbp
918	movq	0+16(%rsp),%rcx
919	movq	0+24(%rsp),%r10
920	leaq	0(%rsp),%rdi
921	call	__ecp_nistz256_subq
922
923	movq	32(%rsp),%rax
924	leaq	32(%rsp),%rbx
925	movq	%r12,%r14
926	xorl	%ecx,%ecx
927	movq	%r12,0+0(%rsp)
928	movq	%r13,%r10
929	movq	%r13,0+8(%rsp)
930	cmovzq	%r8,%r11
931	movq	%r8,0+16(%rsp)
932	leaq	0-0(%rsp),%rsi
933	cmovzq	%r9,%r12
934	movq	%r9,0+24(%rsp)
935	movq	%r14,%r9
936	leaq	0(%rsp),%rdi
937	call	__ecp_nistz256_mul_montq
938
939.byte	102,72,15,126,203
940.byte	102,72,15,126,207
941	call	__ecp_nistz256_sub_fromq
942
943	addq	$160+8,%rsp
944	popq	%r15
945	popq	%r14
946	popq	%r13
947	popq	%r12
948	popq	%rbx
949	popq	%rbp
950	.byte	0xf3,0xc3
951
952.globl	_ecp_nistz256_point_add
953.private_extern _ecp_nistz256_point_add
954
955.p2align	5
956_ecp_nistz256_point_add:
957	pushq	%rbp
958	pushq	%rbx
959	pushq	%r12
960	pushq	%r13
961	pushq	%r14
962	pushq	%r15
963	subq	$576+8,%rsp
964
965	movdqu	0(%rsi),%xmm0
966	movdqu	16(%rsi),%xmm1
967	movdqu	32(%rsi),%xmm2
968	movdqu	48(%rsi),%xmm3
969	movdqu	64(%rsi),%xmm4
970	movdqu	80(%rsi),%xmm5
971	movq	%rsi,%rbx
972	movq	%rdx,%rsi
973	movdqa	%xmm0,384(%rsp)
974	movdqa	%xmm1,384+16(%rsp)
975	movdqa	%xmm2,416(%rsp)
976	movdqa	%xmm3,416+16(%rsp)
977	movdqa	%xmm4,448(%rsp)
978	movdqa	%xmm5,448+16(%rsp)
979	por	%xmm4,%xmm5
980
981	movdqu	0(%rsi),%xmm0
982	pshufd	$0xb1,%xmm5,%xmm3
983	movdqu	16(%rsi),%xmm1
984	movdqu	32(%rsi),%xmm2
985	por	%xmm3,%xmm5
986	movdqu	48(%rsi),%xmm3
987	movq	64+0(%rsi),%rax
988	movq	64+8(%rsi),%r14
989	movq	64+16(%rsi),%r15
990	movq	64+24(%rsi),%r8
991	movdqa	%xmm0,480(%rsp)
992	pshufd	$0x1e,%xmm5,%xmm4
993	movdqa	%xmm1,480+16(%rsp)
994	movdqu	64(%rsi),%xmm0
995	movdqu	80(%rsi),%xmm1
996	movdqa	%xmm2,512(%rsp)
997	movdqa	%xmm3,512+16(%rsp)
998	por	%xmm4,%xmm5
999	pxor	%xmm4,%xmm4
1000	por	%xmm0,%xmm1
1001.byte	102,72,15,110,199
1002
1003	leaq	64-0(%rsi),%rsi
1004	movq	%rax,544+0(%rsp)
1005	movq	%r14,544+8(%rsp)
1006	movq	%r15,544+16(%rsp)
1007	movq	%r8,544+24(%rsp)
1008	leaq	96(%rsp),%rdi
1009	call	__ecp_nistz256_sqr_montq
1010
1011	pcmpeqd	%xmm4,%xmm5
1012	pshufd	$0xb1,%xmm1,%xmm4
1013	por	%xmm1,%xmm4
1014	pshufd	$0,%xmm5,%xmm5
1015	pshufd	$0x1e,%xmm4,%xmm3
1016	por	%xmm3,%xmm4
1017	pxor	%xmm3,%xmm3
1018	pcmpeqd	%xmm3,%xmm4
1019	pshufd	$0,%xmm4,%xmm4
1020	movq	64+0(%rbx),%rax
1021	movq	64+8(%rbx),%r14
1022	movq	64+16(%rbx),%r15
1023	movq	64+24(%rbx),%r8
1024.byte	102,72,15,110,203
1025
1026	leaq	64-0(%rbx),%rsi
1027	leaq	32(%rsp),%rdi
1028	call	__ecp_nistz256_sqr_montq
1029
1030	movq	544(%rsp),%rax
1031	leaq	544(%rsp),%rbx
1032	movq	0+96(%rsp),%r9
1033	movq	8+96(%rsp),%r10
1034	leaq	0+96(%rsp),%rsi
1035	movq	16+96(%rsp),%r11
1036	movq	24+96(%rsp),%r12
1037	leaq	224(%rsp),%rdi
1038	call	__ecp_nistz256_mul_montq
1039
1040	movq	448(%rsp),%rax
1041	leaq	448(%rsp),%rbx
1042	movq	0+32(%rsp),%r9
1043	movq	8+32(%rsp),%r10
1044	leaq	0+32(%rsp),%rsi
1045	movq	16+32(%rsp),%r11
1046	movq	24+32(%rsp),%r12
1047	leaq	256(%rsp),%rdi
1048	call	__ecp_nistz256_mul_montq
1049
1050	movq	416(%rsp),%rax
1051	leaq	416(%rsp),%rbx
1052	movq	0+224(%rsp),%r9
1053	movq	8+224(%rsp),%r10
1054	leaq	0+224(%rsp),%rsi
1055	movq	16+224(%rsp),%r11
1056	movq	24+224(%rsp),%r12
1057	leaq	224(%rsp),%rdi
1058	call	__ecp_nistz256_mul_montq
1059
1060	movq	512(%rsp),%rax
1061	leaq	512(%rsp),%rbx
1062	movq	0+256(%rsp),%r9
1063	movq	8+256(%rsp),%r10
1064	leaq	0+256(%rsp),%rsi
1065	movq	16+256(%rsp),%r11
1066	movq	24+256(%rsp),%r12
1067	leaq	256(%rsp),%rdi
1068	call	__ecp_nistz256_mul_montq
1069
1070	leaq	224(%rsp),%rbx
1071	leaq	64(%rsp),%rdi
1072	call	__ecp_nistz256_sub_fromq
1073
1074	orq	%r13,%r12
1075	movdqa	%xmm4,%xmm2
1076	orq	%r8,%r12
1077	orq	%r9,%r12
1078	por	%xmm5,%xmm2
1079.byte	102,73,15,110,220
1080
1081	movq	384(%rsp),%rax
1082	leaq	384(%rsp),%rbx
1083	movq	0+96(%rsp),%r9
1084	movq	8+96(%rsp),%r10
1085	leaq	0+96(%rsp),%rsi
1086	movq	16+96(%rsp),%r11
1087	movq	24+96(%rsp),%r12
1088	leaq	160(%rsp),%rdi
1089	call	__ecp_nistz256_mul_montq
1090
1091	movq	480(%rsp),%rax
1092	leaq	480(%rsp),%rbx
1093	movq	0+32(%rsp),%r9
1094	movq	8+32(%rsp),%r10
1095	leaq	0+32(%rsp),%rsi
1096	movq	16+32(%rsp),%r11
1097	movq	24+32(%rsp),%r12
1098	leaq	192(%rsp),%rdi
1099	call	__ecp_nistz256_mul_montq
1100
1101	leaq	160(%rsp),%rbx
1102	leaq	0(%rsp),%rdi
1103	call	__ecp_nistz256_sub_fromq
1104
1105	orq	%r13,%r12
1106	orq	%r8,%r12
1107	orq	%r9,%r12
1108
1109.byte	0x3e
1110	jnz	L$add_proceedq
1111.byte	102,73,15,126,208
1112.byte	102,73,15,126,217
1113	testq	%r8,%r8
1114	jnz	L$add_proceedq
1115	testq	%r9,%r9
1116	jz	L$add_doubleq
1117
1118.byte	102,72,15,126,199
1119	pxor	%xmm0,%xmm0
1120	movdqu	%xmm0,0(%rdi)
1121	movdqu	%xmm0,16(%rdi)
1122	movdqu	%xmm0,32(%rdi)
1123	movdqu	%xmm0,48(%rdi)
1124	movdqu	%xmm0,64(%rdi)
1125	movdqu	%xmm0,80(%rdi)
1126	jmp	L$add_doneq
1127
1128.p2align	5
1129L$add_doubleq:
1130.byte	102,72,15,126,206
1131.byte	102,72,15,126,199
1132	addq	$416,%rsp
1133	jmp	L$point_double_shortcutq
1134
1135.p2align	5
1136L$add_proceedq:
1137	movq	0+64(%rsp),%rax
1138	movq	8+64(%rsp),%r14
1139	leaq	0+64(%rsp),%rsi
1140	movq	16+64(%rsp),%r15
1141	movq	24+64(%rsp),%r8
1142	leaq	96(%rsp),%rdi
1143	call	__ecp_nistz256_sqr_montq
1144
1145	movq	448(%rsp),%rax
1146	leaq	448(%rsp),%rbx
1147	movq	0+0(%rsp),%r9
1148	movq	8+0(%rsp),%r10
1149	leaq	0+0(%rsp),%rsi
1150	movq	16+0(%rsp),%r11
1151	movq	24+0(%rsp),%r12
1152	leaq	352(%rsp),%rdi
1153	call	__ecp_nistz256_mul_montq
1154
1155	movq	0+0(%rsp),%rax
1156	movq	8+0(%rsp),%r14
1157	leaq	0+0(%rsp),%rsi
1158	movq	16+0(%rsp),%r15
1159	movq	24+0(%rsp),%r8
1160	leaq	32(%rsp),%rdi
1161	call	__ecp_nistz256_sqr_montq
1162
1163	movq	544(%rsp),%rax
1164	leaq	544(%rsp),%rbx
1165	movq	0+352(%rsp),%r9
1166	movq	8+352(%rsp),%r10
1167	leaq	0+352(%rsp),%rsi
1168	movq	16+352(%rsp),%r11
1169	movq	24+352(%rsp),%r12
1170	leaq	352(%rsp),%rdi
1171	call	__ecp_nistz256_mul_montq
1172
1173	movq	0(%rsp),%rax
1174	leaq	0(%rsp),%rbx
1175	movq	0+32(%rsp),%r9
1176	movq	8+32(%rsp),%r10
1177	leaq	0+32(%rsp),%rsi
1178	movq	16+32(%rsp),%r11
1179	movq	24+32(%rsp),%r12
1180	leaq	128(%rsp),%rdi
1181	call	__ecp_nistz256_mul_montq
1182
1183	movq	160(%rsp),%rax
1184	leaq	160(%rsp),%rbx
1185	movq	0+32(%rsp),%r9
1186	movq	8+32(%rsp),%r10
1187	leaq	0+32(%rsp),%rsi
1188	movq	16+32(%rsp),%r11
1189	movq	24+32(%rsp),%r12
1190	leaq	192(%rsp),%rdi
1191	call	__ecp_nistz256_mul_montq
1192
1193
1194
1195
1196	xorq	%r11,%r11
1197	addq	%r12,%r12
1198	leaq	96(%rsp),%rsi
1199	adcq	%r13,%r13
1200	movq	%r12,%rax
1201	adcq	%r8,%r8
1202	adcq	%r9,%r9
1203	movq	%r13,%rbp
1204	adcq	$0,%r11
1205
1206	subq	$-1,%r12
1207	movq	%r8,%rcx
1208	sbbq	%r14,%r13
1209	sbbq	$0,%r8
1210	movq	%r9,%r10
1211	sbbq	%r15,%r9
1212	sbbq	$0,%r11
1213
1214	cmovcq	%rax,%r12
1215	movq	0(%rsi),%rax
1216	cmovcq	%rbp,%r13
1217	movq	8(%rsi),%rbp
1218	cmovcq	%rcx,%r8
1219	movq	16(%rsi),%rcx
1220	cmovcq	%r10,%r9
1221	movq	24(%rsi),%r10
1222
1223	call	__ecp_nistz256_subq
1224
1225	leaq	128(%rsp),%rbx
1226	leaq	288(%rsp),%rdi
1227	call	__ecp_nistz256_sub_fromq
1228
1229	movq	192+0(%rsp),%rax
1230	movq	192+8(%rsp),%rbp
1231	movq	192+16(%rsp),%rcx
1232	movq	192+24(%rsp),%r10
1233	leaq	320(%rsp),%rdi
1234
1235	call	__ecp_nistz256_subq
1236
1237	movq	%r12,0(%rdi)
1238	movq	%r13,8(%rdi)
1239	movq	%r8,16(%rdi)
1240	movq	%r9,24(%rdi)
1241	movq	128(%rsp),%rax
1242	leaq	128(%rsp),%rbx
1243	movq	0+224(%rsp),%r9
1244	movq	8+224(%rsp),%r10
1245	leaq	0+224(%rsp),%rsi
1246	movq	16+224(%rsp),%r11
1247	movq	24+224(%rsp),%r12
1248	leaq	256(%rsp),%rdi
1249	call	__ecp_nistz256_mul_montq
1250
1251	movq	320(%rsp),%rax
1252	leaq	320(%rsp),%rbx
1253	movq	0+64(%rsp),%r9
1254	movq	8+64(%rsp),%r10
1255	leaq	0+64(%rsp),%rsi
1256	movq	16+64(%rsp),%r11
1257	movq	24+64(%rsp),%r12
1258	leaq	320(%rsp),%rdi
1259	call	__ecp_nistz256_mul_montq
1260
1261	leaq	256(%rsp),%rbx
1262	leaq	320(%rsp),%rdi
1263	call	__ecp_nistz256_sub_fromq
1264
1265.byte	102,72,15,126,199
1266
1267	movdqa	%xmm5,%xmm0
1268	movdqa	%xmm5,%xmm1
1269	pandn	352(%rsp),%xmm0
1270	movdqa	%xmm5,%xmm2
1271	pandn	352+16(%rsp),%xmm1
1272	movdqa	%xmm5,%xmm3
1273	pand	544(%rsp),%xmm2
1274	pand	544+16(%rsp),%xmm3
1275	por	%xmm0,%xmm2
1276	por	%xmm1,%xmm3
1277
1278	movdqa	%xmm4,%xmm0
1279	movdqa	%xmm4,%xmm1
1280	pandn	%xmm2,%xmm0
1281	movdqa	%xmm4,%xmm2
1282	pandn	%xmm3,%xmm1
1283	movdqa	%xmm4,%xmm3
1284	pand	448(%rsp),%xmm2
1285	pand	448+16(%rsp),%xmm3
1286	por	%xmm0,%xmm2
1287	por	%xmm1,%xmm3
1288	movdqu	%xmm2,64(%rdi)
1289	movdqu	%xmm3,80(%rdi)
1290
1291	movdqa	%xmm5,%xmm0
1292	movdqa	%xmm5,%xmm1
1293	pandn	288(%rsp),%xmm0
1294	movdqa	%xmm5,%xmm2
1295	pandn	288+16(%rsp),%xmm1
1296	movdqa	%xmm5,%xmm3
1297	pand	480(%rsp),%xmm2
1298	pand	480+16(%rsp),%xmm3
1299	por	%xmm0,%xmm2
1300	por	%xmm1,%xmm3
1301
1302	movdqa	%xmm4,%xmm0
1303	movdqa	%xmm4,%xmm1
1304	pandn	%xmm2,%xmm0
1305	movdqa	%xmm4,%xmm2
1306	pandn	%xmm3,%xmm1
1307	movdqa	%xmm4,%xmm3
1308	pand	384(%rsp),%xmm2
1309	pand	384+16(%rsp),%xmm3
1310	por	%xmm0,%xmm2
1311	por	%xmm1,%xmm3
1312	movdqu	%xmm2,0(%rdi)
1313	movdqu	%xmm3,16(%rdi)
1314
1315	movdqa	%xmm5,%xmm0
1316	movdqa	%xmm5,%xmm1
1317	pandn	320(%rsp),%xmm0
1318	movdqa	%xmm5,%xmm2
1319	pandn	320+16(%rsp),%xmm1
1320	movdqa	%xmm5,%xmm3
1321	pand	512(%rsp),%xmm2
1322	pand	512+16(%rsp),%xmm3
1323	por	%xmm0,%xmm2
1324	por	%xmm1,%xmm3
1325
1326	movdqa	%xmm4,%xmm0
1327	movdqa	%xmm4,%xmm1
1328	pandn	%xmm2,%xmm0
1329	movdqa	%xmm4,%xmm2
1330	pandn	%xmm3,%xmm1
1331	movdqa	%xmm4,%xmm3
1332	pand	416(%rsp),%xmm2
1333	pand	416+16(%rsp),%xmm3
1334	por	%xmm0,%xmm2
1335	por	%xmm1,%xmm3
1336	movdqu	%xmm2,32(%rdi)
1337	movdqu	%xmm3,48(%rdi)
1338
1339L$add_doneq:
1340	addq	$576+8,%rsp
1341	popq	%r15
1342	popq	%r14
1343	popq	%r13
1344	popq	%r12
1345	popq	%rbx
1346	popq	%rbp
1347	.byte	0xf3,0xc3
1348
1349.globl	_ecp_nistz256_point_add_affine
1350.private_extern _ecp_nistz256_point_add_affine
1351
1352.p2align	5
1353_ecp_nistz256_point_add_affine:
1354	pushq	%rbp
1355	pushq	%rbx
1356	pushq	%r12
1357	pushq	%r13
1358	pushq	%r14
1359	pushq	%r15
1360	subq	$480+8,%rsp
1361
1362	movdqu	0(%rsi),%xmm0
1363	movq	%rdx,%rbx
1364	movdqu	16(%rsi),%xmm1
1365	movdqu	32(%rsi),%xmm2
1366	movdqu	48(%rsi),%xmm3
1367	movdqu	64(%rsi),%xmm4
1368	movdqu	80(%rsi),%xmm5
1369	movq	64+0(%rsi),%rax
1370	movq	64+8(%rsi),%r14
1371	movq	64+16(%rsi),%r15
1372	movq	64+24(%rsi),%r8
1373	movdqa	%xmm0,320(%rsp)
1374	movdqa	%xmm1,320+16(%rsp)
1375	movdqa	%xmm2,352(%rsp)
1376	movdqa	%xmm3,352+16(%rsp)
1377	movdqa	%xmm4,384(%rsp)
1378	movdqa	%xmm5,384+16(%rsp)
1379	por	%xmm4,%xmm5
1380
1381	movdqu	0(%rbx),%xmm0
1382	pshufd	$0xb1,%xmm5,%xmm3
1383	movdqu	16(%rbx),%xmm1
1384	movdqu	32(%rbx),%xmm2
1385	por	%xmm3,%xmm5
1386	movdqu	48(%rbx),%xmm3
1387	movdqa	%xmm0,416(%rsp)
1388	pshufd	$0x1e,%xmm5,%xmm4
1389	movdqa	%xmm1,416+16(%rsp)
1390	por	%xmm0,%xmm1
1391.byte	102,72,15,110,199
1392	movdqa	%xmm2,448(%rsp)
1393	movdqa	%xmm3,448+16(%rsp)
1394	por	%xmm2,%xmm3
1395	por	%xmm4,%xmm5
1396	pxor	%xmm4,%xmm4
1397	por	%xmm1,%xmm3
1398
1399	leaq	64-0(%rsi),%rsi
1400	leaq	32(%rsp),%rdi
1401	call	__ecp_nistz256_sqr_montq
1402
1403	pcmpeqd	%xmm4,%xmm5
1404	pshufd	$0xb1,%xmm3,%xmm4
1405	movq	0(%rbx),%rax
1406
1407	movq	%r12,%r9
1408	por	%xmm3,%xmm4
1409	pshufd	$0,%xmm5,%xmm5
1410	pshufd	$0x1e,%xmm4,%xmm3
1411	movq	%r13,%r10
1412	por	%xmm3,%xmm4
1413	pxor	%xmm3,%xmm3
1414	movq	%r14,%r11
1415	pcmpeqd	%xmm3,%xmm4
1416	pshufd	$0,%xmm4,%xmm4
1417
1418	leaq	32-0(%rsp),%rsi
1419	movq	%r15,%r12
1420	leaq	0(%rsp),%rdi
1421	call	__ecp_nistz256_mul_montq
1422
1423	leaq	320(%rsp),%rbx
1424	leaq	64(%rsp),%rdi
1425	call	__ecp_nistz256_sub_fromq
1426
1427	movq	384(%rsp),%rax
1428	leaq	384(%rsp),%rbx
1429	movq	0+32(%rsp),%r9
1430	movq	8+32(%rsp),%r10
1431	leaq	0+32(%rsp),%rsi
1432	movq	16+32(%rsp),%r11
1433	movq	24+32(%rsp),%r12
1434	leaq	32(%rsp),%rdi
1435	call	__ecp_nistz256_mul_montq
1436
1437	movq	384(%rsp),%rax
1438	leaq	384(%rsp),%rbx
1439	movq	0+64(%rsp),%r9
1440	movq	8+64(%rsp),%r10
1441	leaq	0+64(%rsp),%rsi
1442	movq	16+64(%rsp),%r11
1443	movq	24+64(%rsp),%r12
1444	leaq	288(%rsp),%rdi
1445	call	__ecp_nistz256_mul_montq
1446
1447	movq	448(%rsp),%rax
1448	leaq	448(%rsp),%rbx
1449	movq	0+32(%rsp),%r9
1450	movq	8+32(%rsp),%r10
1451	leaq	0+32(%rsp),%rsi
1452	movq	16+32(%rsp),%r11
1453	movq	24+32(%rsp),%r12
1454	leaq	32(%rsp),%rdi
1455	call	__ecp_nistz256_mul_montq
1456
1457	leaq	352(%rsp),%rbx
1458	leaq	96(%rsp),%rdi
1459	call	__ecp_nistz256_sub_fromq
1460
1461	movq	0+64(%rsp),%rax
1462	movq	8+64(%rsp),%r14
1463	leaq	0+64(%rsp),%rsi
1464	movq	16+64(%rsp),%r15
1465	movq	24+64(%rsp),%r8
1466	leaq	128(%rsp),%rdi
1467	call	__ecp_nistz256_sqr_montq
1468
1469	movq	0+96(%rsp),%rax
1470	movq	8+96(%rsp),%r14
1471	leaq	0+96(%rsp),%rsi
1472	movq	16+96(%rsp),%r15
1473	movq	24+96(%rsp),%r8
1474	leaq	192(%rsp),%rdi
1475	call	__ecp_nistz256_sqr_montq
1476
1477	movq	128(%rsp),%rax
1478	leaq	128(%rsp),%rbx
1479	movq	0+64(%rsp),%r9
1480	movq	8+64(%rsp),%r10
1481	leaq	0+64(%rsp),%rsi
1482	movq	16+64(%rsp),%r11
1483	movq	24+64(%rsp),%r12
1484	leaq	160(%rsp),%rdi
1485	call	__ecp_nistz256_mul_montq
1486
1487	movq	320(%rsp),%rax
1488	leaq	320(%rsp),%rbx
1489	movq	0+128(%rsp),%r9
1490	movq	8+128(%rsp),%r10
1491	leaq	0+128(%rsp),%rsi
1492	movq	16+128(%rsp),%r11
1493	movq	24+128(%rsp),%r12
1494	leaq	0(%rsp),%rdi
1495	call	__ecp_nistz256_mul_montq
1496
1497
1498
1499
1500	xorq	%r11,%r11
1501	addq	%r12,%r12
1502	leaq	192(%rsp),%rsi
1503	adcq	%r13,%r13
1504	movq	%r12,%rax
1505	adcq	%r8,%r8
1506	adcq	%r9,%r9
1507	movq	%r13,%rbp
1508	adcq	$0,%r11
1509
1510	subq	$-1,%r12
1511	movq	%r8,%rcx
1512	sbbq	%r14,%r13
1513	sbbq	$0,%r8
1514	movq	%r9,%r10
1515	sbbq	%r15,%r9
1516	sbbq	$0,%r11
1517
1518	cmovcq	%rax,%r12
1519	movq	0(%rsi),%rax
1520	cmovcq	%rbp,%r13
1521	movq	8(%rsi),%rbp
1522	cmovcq	%rcx,%r8
1523	movq	16(%rsi),%rcx
1524	cmovcq	%r10,%r9
1525	movq	24(%rsi),%r10
1526
1527	call	__ecp_nistz256_subq
1528
1529	leaq	160(%rsp),%rbx
1530	leaq	224(%rsp),%rdi
1531	call	__ecp_nistz256_sub_fromq
1532
1533	movq	0+0(%rsp),%rax
1534	movq	0+8(%rsp),%rbp
1535	movq	0+16(%rsp),%rcx
1536	movq	0+24(%rsp),%r10
1537	leaq	64(%rsp),%rdi
1538
1539	call	__ecp_nistz256_subq
1540
1541	movq	%r12,0(%rdi)
1542	movq	%r13,8(%rdi)
1543	movq	%r8,16(%rdi)
1544	movq	%r9,24(%rdi)
1545	movq	352(%rsp),%rax
1546	leaq	352(%rsp),%rbx
1547	movq	0+160(%rsp),%r9
1548	movq	8+160(%rsp),%r10
1549	leaq	0+160(%rsp),%rsi
1550	movq	16+160(%rsp),%r11
1551	movq	24+160(%rsp),%r12
1552	leaq	32(%rsp),%rdi
1553	call	__ecp_nistz256_mul_montq
1554
1555	movq	96(%rsp),%rax
1556	leaq	96(%rsp),%rbx
1557	movq	0+64(%rsp),%r9
1558	movq	8+64(%rsp),%r10
1559	leaq	0+64(%rsp),%rsi
1560	movq	16+64(%rsp),%r11
1561	movq	24+64(%rsp),%r12
1562	leaq	64(%rsp),%rdi
1563	call	__ecp_nistz256_mul_montq
1564
1565	leaq	32(%rsp),%rbx
1566	leaq	256(%rsp),%rdi
1567	call	__ecp_nistz256_sub_fromq
1568
1569.byte	102,72,15,126,199
1570
1571	movdqa	%xmm5,%xmm0
1572	movdqa	%xmm5,%xmm1
1573	pandn	288(%rsp),%xmm0
1574	movdqa	%xmm5,%xmm2
1575	pandn	288+16(%rsp),%xmm1
1576	movdqa	%xmm5,%xmm3
1577	pand	L$ONE_mont(%rip),%xmm2
1578	pand	L$ONE_mont+16(%rip),%xmm3
1579	por	%xmm0,%xmm2
1580	por	%xmm1,%xmm3
1581
1582	movdqa	%xmm4,%xmm0
1583	movdqa	%xmm4,%xmm1
1584	pandn	%xmm2,%xmm0
1585	movdqa	%xmm4,%xmm2
1586	pandn	%xmm3,%xmm1
1587	movdqa	%xmm4,%xmm3
1588	pand	384(%rsp),%xmm2
1589	pand	384+16(%rsp),%xmm3
1590	por	%xmm0,%xmm2
1591	por	%xmm1,%xmm3
1592	movdqu	%xmm2,64(%rdi)
1593	movdqu	%xmm3,80(%rdi)
1594
1595	movdqa	%xmm5,%xmm0
1596	movdqa	%xmm5,%xmm1
1597	pandn	224(%rsp),%xmm0
1598	movdqa	%xmm5,%xmm2
1599	pandn	224+16(%rsp),%xmm1
1600	movdqa	%xmm5,%xmm3
1601	pand	416(%rsp),%xmm2
1602	pand	416+16(%rsp),%xmm3
1603	por	%xmm0,%xmm2
1604	por	%xmm1,%xmm3
1605
1606	movdqa	%xmm4,%xmm0
1607	movdqa	%xmm4,%xmm1
1608	pandn	%xmm2,%xmm0
1609	movdqa	%xmm4,%xmm2
1610	pandn	%xmm3,%xmm1
1611	movdqa	%xmm4,%xmm3
1612	pand	320(%rsp),%xmm2
1613	pand	320+16(%rsp),%xmm3
1614	por	%xmm0,%xmm2
1615	por	%xmm1,%xmm3
1616	movdqu	%xmm2,0(%rdi)
1617	movdqu	%xmm3,16(%rdi)
1618
1619	movdqa	%xmm5,%xmm0
1620	movdqa	%xmm5,%xmm1
1621	pandn	256(%rsp),%xmm0
1622	movdqa	%xmm5,%xmm2
1623	pandn	256+16(%rsp),%xmm1
1624	movdqa	%xmm5,%xmm3
1625	pand	448(%rsp),%xmm2
1626	pand	448+16(%rsp),%xmm3
1627	por	%xmm0,%xmm2
1628	por	%xmm1,%xmm3
1629
1630	movdqa	%xmm4,%xmm0
1631	movdqa	%xmm4,%xmm1
1632	pandn	%xmm2,%xmm0
1633	movdqa	%xmm4,%xmm2
1634	pandn	%xmm3,%xmm1
1635	movdqa	%xmm4,%xmm3
1636	pand	352(%rsp),%xmm2
1637	pand	352+16(%rsp),%xmm3
1638	por	%xmm0,%xmm2
1639	por	%xmm1,%xmm3
1640	movdqu	%xmm2,32(%rdi)
1641	movdqu	%xmm3,48(%rdi)
1642
1643	addq	$480+8,%rsp
1644	popq	%r15
1645	popq	%r14
1646	popq	%r13
1647	popq	%r12
1648	popq	%rbx
1649	popq	%rbp
1650	.byte	0xf3,0xc3
1651
1652#endif
1653