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