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