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