rsaz-avx2.S revision 305153
1/* $FreeBSD: stable/11/secure/lib/libcrypto/amd64/rsaz-avx2.S 305153 2016-08-31 20:33:59Z 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	vpbroadcastq	.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,%ymm9
805	vpaddq	%ymm13,%ymm7,%ymm7
806	vpmuludq	256-128(%rcx),%ymm11,%ymm0
807	vpaddq	%ymm9,%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	imull	%r8d,%eax
821	andl	$0x1fffffff,%eax
822
823	imulq	16-128(%rsi),%rbx
824	addq	%rbx,%r12
825	vpmuludq	%ymm10,%ymm12,%ymm12
826	vmovd	%eax,%xmm11
827	vmovdqu	-8+96-128(%rsi),%ymm0
828	vpaddq	%ymm12,%ymm1,%ymm1
829	vpmuludq	%ymm10,%ymm13,%ymm13
830	vpbroadcastq	%xmm11,%ymm11
831	vmovdqu	-8+128-128(%rsi),%ymm12
832	vpaddq	%ymm13,%ymm2,%ymm2
833	vpmuludq	%ymm10,%ymm0,%ymm0
834	vmovdqu	-8+160-128(%rsi),%ymm13
835	vpaddq	%ymm0,%ymm3,%ymm3
836	vpmuludq	%ymm10,%ymm12,%ymm12
837	vmovdqu	-8+192-128(%rsi),%ymm0
838	vpaddq	%ymm12,%ymm4,%ymm4
839	vpmuludq	%ymm10,%ymm13,%ymm13
840	vmovdqu	-8+224-128(%rsi),%ymm12
841	vpaddq	%ymm13,%ymm5,%ymm5
842	vpmuludq	%ymm10,%ymm0,%ymm0
843	vmovdqu	-8+256-128(%rsi),%ymm13
844	vpaddq	%ymm0,%ymm6,%ymm6
845	vpmuludq	%ymm10,%ymm12,%ymm12
846	vmovdqu	-8+288-128(%rsi),%ymm9
847	vpaddq	%ymm12,%ymm7,%ymm7
848	vpmuludq	%ymm10,%ymm13,%ymm13
849	vpaddq	%ymm13,%ymm8,%ymm8
850	vpmuludq	%ymm10,%ymm9,%ymm9
851	vpbroadcastq	16(%r13),%ymm10
852
853	movq	%rax,%rdx
854	imulq	-128(%rcx),%rax
855	addq	%rax,%r10
856	vmovdqu	-8+32-128(%rcx),%ymm0
857	movq	%rdx,%rax
858	imulq	8-128(%rcx),%rax
859	addq	%rax,%r11
860	vmovdqu	-8+64-128(%rcx),%ymm12
861	shrq	$29,%r10
862	imulq	16-128(%rcx),%rdx
863	addq	%rdx,%r12
864	addq	%r10,%r11
865
866	vpmuludq	%ymm11,%ymm0,%ymm0
867	vmovq	%xmm10,%rbx
868	vmovdqu	-8+96-128(%rcx),%ymm13
869	vpaddq	%ymm0,%ymm1,%ymm1
870	vpmuludq	%ymm11,%ymm12,%ymm12
871	vmovdqu	-8+128-128(%rcx),%ymm0
872	vpaddq	%ymm12,%ymm2,%ymm2
873	vpmuludq	%ymm11,%ymm13,%ymm13
874	vmovdqu	-8+160-128(%rcx),%ymm12
875	vpaddq	%ymm13,%ymm3,%ymm3
876	vpmuludq	%ymm11,%ymm0,%ymm0
877	vmovdqu	-8+192-128(%rcx),%ymm13
878	vpaddq	%ymm0,%ymm4,%ymm4
879	vpmuludq	%ymm11,%ymm12,%ymm12
880	vmovdqu	-8+224-128(%rcx),%ymm0
881	vpaddq	%ymm12,%ymm5,%ymm5
882	vpmuludq	%ymm11,%ymm13,%ymm13
883	vmovdqu	-8+256-128(%rcx),%ymm12
884	vpaddq	%ymm13,%ymm6,%ymm6
885	vpmuludq	%ymm11,%ymm0,%ymm0
886	vmovdqu	-8+288-128(%rcx),%ymm13
887	vpaddq	%ymm0,%ymm7,%ymm7
888	vpmuludq	%ymm11,%ymm12,%ymm12
889	vpaddq	%ymm12,%ymm8,%ymm8
890	vpmuludq	%ymm11,%ymm13,%ymm13
891	vpaddq	%ymm13,%ymm9,%ymm9
892
893	vmovdqu	-16+32-128(%rsi),%ymm0
894	movq	%rbx,%rax
895	imulq	-128(%rsi),%rax
896	addq	%r11,%rax
897
898	vmovdqu	-16+64-128(%rsi),%ymm12
899	movq	%rax,%r11
900	imull	%r8d,%eax
901	andl	$0x1fffffff,%eax
902
903	imulq	8-128(%rsi),%rbx
904	addq	%rbx,%r12
905	vpmuludq	%ymm10,%ymm0,%ymm0
906	vmovd	%eax,%xmm11
907	vmovdqu	-16+96-128(%rsi),%ymm13
908	vpaddq	%ymm0,%ymm1,%ymm1
909	vpmuludq	%ymm10,%ymm12,%ymm12
910	vpbroadcastq	%xmm11,%ymm11
911	vmovdqu	-16+128-128(%rsi),%ymm0
912	vpaddq	%ymm12,%ymm2,%ymm2
913	vpmuludq	%ymm10,%ymm13,%ymm13
914	vmovdqu	-16+160-128(%rsi),%ymm12
915	vpaddq	%ymm13,%ymm3,%ymm3
916	vpmuludq	%ymm10,%ymm0,%ymm0
917	vmovdqu	-16+192-128(%rsi),%ymm13
918	vpaddq	%ymm0,%ymm4,%ymm4
919	vpmuludq	%ymm10,%ymm12,%ymm12
920	vmovdqu	-16+224-128(%rsi),%ymm0
921	vpaddq	%ymm12,%ymm5,%ymm5
922	vpmuludq	%ymm10,%ymm13,%ymm13
923	vmovdqu	-16+256-128(%rsi),%ymm12
924	vpaddq	%ymm13,%ymm6,%ymm6
925	vpmuludq	%ymm10,%ymm0,%ymm0
926	vmovdqu	-16+288-128(%rsi),%ymm13
927	vpaddq	%ymm0,%ymm7,%ymm7
928	vpmuludq	%ymm10,%ymm12,%ymm12
929	vpaddq	%ymm12,%ymm8,%ymm8
930	vpmuludq	%ymm10,%ymm13,%ymm13
931	vpbroadcastq	24(%r13),%ymm10
932	vpaddq	%ymm13,%ymm9,%ymm9
933
934	vmovdqu	-16+32-128(%rcx),%ymm0
935	movq	%rax,%rdx
936	imulq	-128(%rcx),%rax
937	addq	%rax,%r11
938	vmovdqu	-16+64-128(%rcx),%ymm12
939	imulq	8-128(%rcx),%rdx
940	addq	%rdx,%r12
941	shrq	$29,%r11
942
943	vpmuludq	%ymm11,%ymm0,%ymm0
944	vmovq	%xmm10,%rbx
945	vmovdqu	-16+96-128(%rcx),%ymm13
946	vpaddq	%ymm0,%ymm1,%ymm1
947	vpmuludq	%ymm11,%ymm12,%ymm12
948	vmovdqu	-16+128-128(%rcx),%ymm0
949	vpaddq	%ymm12,%ymm2,%ymm2
950	vpmuludq	%ymm11,%ymm13,%ymm13
951	vmovdqu	-16+160-128(%rcx),%ymm12
952	vpaddq	%ymm13,%ymm3,%ymm3
953	vpmuludq	%ymm11,%ymm0,%ymm0
954	vmovdqu	-16+192-128(%rcx),%ymm13
955	vpaddq	%ymm0,%ymm4,%ymm4
956	vpmuludq	%ymm11,%ymm12,%ymm12
957	vmovdqu	-16+224-128(%rcx),%ymm0
958	vpaddq	%ymm12,%ymm5,%ymm5
959	vpmuludq	%ymm11,%ymm13,%ymm13
960	vmovdqu	-16+256-128(%rcx),%ymm12
961	vpaddq	%ymm13,%ymm6,%ymm6
962	vpmuludq	%ymm11,%ymm0,%ymm0
963	vmovdqu	-16+288-128(%rcx),%ymm13
964	vpaddq	%ymm0,%ymm7,%ymm7
965	vpmuludq	%ymm11,%ymm12,%ymm12
966	vmovdqu	-24+32-128(%rsi),%ymm0
967	vpaddq	%ymm12,%ymm8,%ymm8
968	vpmuludq	%ymm11,%ymm13,%ymm13
969	vmovdqu	-24+64-128(%rsi),%ymm12
970	vpaddq	%ymm13,%ymm9,%ymm9
971
972	addq	%r11,%r12
973	imulq	-128(%rsi),%rbx
974	addq	%rbx,%r12
975
976	movq	%r12,%rax
977	imull	%r8d,%eax
978	andl	$0x1fffffff,%eax
979
980	vpmuludq	%ymm10,%ymm0,%ymm0
981	vmovd	%eax,%xmm11
982	vmovdqu	-24+96-128(%rsi),%ymm13
983	vpaddq	%ymm0,%ymm1,%ymm1
984	vpmuludq	%ymm10,%ymm12,%ymm12
985	vpbroadcastq	%xmm11,%ymm11
986	vmovdqu	-24+128-128(%rsi),%ymm0
987	vpaddq	%ymm12,%ymm2,%ymm2
988	vpmuludq	%ymm10,%ymm13,%ymm13
989	vmovdqu	-24+160-128(%rsi),%ymm12
990	vpaddq	%ymm13,%ymm3,%ymm3
991	vpmuludq	%ymm10,%ymm0,%ymm0
992	vmovdqu	-24+192-128(%rsi),%ymm13
993	vpaddq	%ymm0,%ymm4,%ymm4
994	vpmuludq	%ymm10,%ymm12,%ymm12
995	vmovdqu	-24+224-128(%rsi),%ymm0
996	vpaddq	%ymm12,%ymm5,%ymm5
997	vpmuludq	%ymm10,%ymm13,%ymm13
998	vmovdqu	-24+256-128(%rsi),%ymm12
999	vpaddq	%ymm13,%ymm6,%ymm6
1000	vpmuludq	%ymm10,%ymm0,%ymm0
1001	vmovdqu	-24+288-128(%rsi),%ymm13
1002	vpaddq	%ymm0,%ymm7,%ymm7
1003	vpmuludq	%ymm10,%ymm12,%ymm12
1004	vpaddq	%ymm12,%ymm8,%ymm8
1005	vpmuludq	%ymm10,%ymm13,%ymm13
1006	vpbroadcastq	32(%r13),%ymm10
1007	vpaddq	%ymm13,%ymm9,%ymm9
1008	addq	$32,%r13
1009
1010	vmovdqu	-24+32-128(%rcx),%ymm0
1011	imulq	-128(%rcx),%rax
1012	addq	%rax,%r12
1013	shrq	$29,%r12
1014
1015	vmovdqu	-24+64-128(%rcx),%ymm12
1016	vpmuludq	%ymm11,%ymm0,%ymm0
1017	vmovq	%xmm10,%rbx
1018	vmovdqu	-24+96-128(%rcx),%ymm13
1019	vpaddq	%ymm0,%ymm1,%ymm0
1020	vpmuludq	%ymm11,%ymm12,%ymm12
1021	vmovdqu	%ymm0,(%rsp)
1022	vpaddq	%ymm12,%ymm2,%ymm1
1023	vmovdqu	-24+128-128(%rcx),%ymm0
1024	vpmuludq	%ymm11,%ymm13,%ymm13
1025	vmovdqu	-24+160-128(%rcx),%ymm12
1026	vpaddq	%ymm13,%ymm3,%ymm2
1027	vpmuludq	%ymm11,%ymm0,%ymm0
1028	vmovdqu	-24+192-128(%rcx),%ymm13
1029	vpaddq	%ymm0,%ymm4,%ymm3
1030	vpmuludq	%ymm11,%ymm12,%ymm12
1031	vmovdqu	-24+224-128(%rcx),%ymm0
1032	vpaddq	%ymm12,%ymm5,%ymm4
1033	vpmuludq	%ymm11,%ymm13,%ymm13
1034	vmovdqu	-24+256-128(%rcx),%ymm12
1035	vpaddq	%ymm13,%ymm6,%ymm5
1036	vpmuludq	%ymm11,%ymm0,%ymm0
1037	vmovdqu	-24+288-128(%rcx),%ymm13
1038	movq	%r12,%r9
1039	vpaddq	%ymm0,%ymm7,%ymm6
1040	vpmuludq	%ymm11,%ymm12,%ymm12
1041	addq	(%rsp),%r9
1042	vpaddq	%ymm12,%ymm8,%ymm7
1043	vpmuludq	%ymm11,%ymm13,%ymm13
1044	vmovq	%r12,%xmm12
1045	vpaddq	%ymm13,%ymm9,%ymm8
1046
1047	decl	%r14d
1048	jnz	.Loop_mul_1024
1049	vpermq	$0,%ymm15,%ymm15
1050	vpaddq	(%rsp),%ymm12,%ymm0
1051
1052	vpsrlq	$29,%ymm0,%ymm12
1053	vpand	%ymm15,%ymm0,%ymm0
1054	vpsrlq	$29,%ymm1,%ymm13
1055	vpand	%ymm15,%ymm1,%ymm1
1056	vpsrlq	$29,%ymm2,%ymm10
1057	vpermq	$0x93,%ymm12,%ymm12
1058	vpand	%ymm15,%ymm2,%ymm2
1059	vpsrlq	$29,%ymm3,%ymm11
1060	vpermq	$0x93,%ymm13,%ymm13
1061	vpand	%ymm15,%ymm3,%ymm3
1062
1063	vpblendd	$3,%ymm14,%ymm12,%ymm9
1064	vpermq	$0x93,%ymm10,%ymm10
1065	vpblendd	$3,%ymm12,%ymm13,%ymm12
1066	vpermq	$0x93,%ymm11,%ymm11
1067	vpaddq	%ymm9,%ymm0,%ymm0
1068	vpblendd	$3,%ymm13,%ymm10,%ymm13
1069	vpaddq	%ymm12,%ymm1,%ymm1
1070	vpblendd	$3,%ymm10,%ymm11,%ymm10
1071	vpaddq	%ymm13,%ymm2,%ymm2
1072	vpblendd	$3,%ymm11,%ymm14,%ymm11
1073	vpaddq	%ymm10,%ymm3,%ymm3
1074	vpaddq	%ymm11,%ymm4,%ymm4
1075
1076	vpsrlq	$29,%ymm0,%ymm12
1077	vpand	%ymm15,%ymm0,%ymm0
1078	vpsrlq	$29,%ymm1,%ymm13
1079	vpand	%ymm15,%ymm1,%ymm1
1080	vpsrlq	$29,%ymm2,%ymm10
1081	vpermq	$0x93,%ymm12,%ymm12
1082	vpand	%ymm15,%ymm2,%ymm2
1083	vpsrlq	$29,%ymm3,%ymm11
1084	vpermq	$0x93,%ymm13,%ymm13
1085	vpand	%ymm15,%ymm3,%ymm3
1086	vpermq	$0x93,%ymm10,%ymm10
1087
1088	vpblendd	$3,%ymm14,%ymm12,%ymm9
1089	vpermq	$0x93,%ymm11,%ymm11
1090	vpblendd	$3,%ymm12,%ymm13,%ymm12
1091	vpaddq	%ymm9,%ymm0,%ymm0
1092	vpblendd	$3,%ymm13,%ymm10,%ymm13
1093	vpaddq	%ymm12,%ymm1,%ymm1
1094	vpblendd	$3,%ymm10,%ymm11,%ymm10
1095	vpaddq	%ymm13,%ymm2,%ymm2
1096	vpblendd	$3,%ymm11,%ymm14,%ymm11
1097	vpaddq	%ymm10,%ymm3,%ymm3
1098	vpaddq	%ymm11,%ymm4,%ymm4
1099
1100	vmovdqu	%ymm0,0-128(%rdi)
1101	vmovdqu	%ymm1,32-128(%rdi)
1102	vmovdqu	%ymm2,64-128(%rdi)
1103	vmovdqu	%ymm3,96-128(%rdi)
1104	vpsrlq	$29,%ymm4,%ymm12
1105	vpand	%ymm15,%ymm4,%ymm4
1106	vpsrlq	$29,%ymm5,%ymm13
1107	vpand	%ymm15,%ymm5,%ymm5
1108	vpsrlq	$29,%ymm6,%ymm10
1109	vpermq	$0x93,%ymm12,%ymm12
1110	vpand	%ymm15,%ymm6,%ymm6
1111	vpsrlq	$29,%ymm7,%ymm11
1112	vpermq	$0x93,%ymm13,%ymm13
1113	vpand	%ymm15,%ymm7,%ymm7
1114	vpsrlq	$29,%ymm8,%ymm0
1115	vpermq	$0x93,%ymm10,%ymm10
1116	vpand	%ymm15,%ymm8,%ymm8
1117	vpermq	$0x93,%ymm11,%ymm11
1118
1119	vpblendd	$3,%ymm14,%ymm12,%ymm9
1120	vpermq	$0x93,%ymm0,%ymm0
1121	vpblendd	$3,%ymm12,%ymm13,%ymm12
1122	vpaddq	%ymm9,%ymm4,%ymm4
1123	vpblendd	$3,%ymm13,%ymm10,%ymm13
1124	vpaddq	%ymm12,%ymm5,%ymm5
1125	vpblendd	$3,%ymm10,%ymm11,%ymm10
1126	vpaddq	%ymm13,%ymm6,%ymm6
1127	vpblendd	$3,%ymm11,%ymm0,%ymm11
1128	vpaddq	%ymm10,%ymm7,%ymm7
1129	vpaddq	%ymm11,%ymm8,%ymm8
1130
1131	vpsrlq	$29,%ymm4,%ymm12
1132	vpand	%ymm15,%ymm4,%ymm4
1133	vpsrlq	$29,%ymm5,%ymm13
1134	vpand	%ymm15,%ymm5,%ymm5
1135	vpsrlq	$29,%ymm6,%ymm10
1136	vpermq	$0x93,%ymm12,%ymm12
1137	vpand	%ymm15,%ymm6,%ymm6
1138	vpsrlq	$29,%ymm7,%ymm11
1139	vpermq	$0x93,%ymm13,%ymm13
1140	vpand	%ymm15,%ymm7,%ymm7
1141	vpsrlq	$29,%ymm8,%ymm0
1142	vpermq	$0x93,%ymm10,%ymm10
1143	vpand	%ymm15,%ymm8,%ymm8
1144	vpermq	$0x93,%ymm11,%ymm11
1145
1146	vpblendd	$3,%ymm14,%ymm12,%ymm9
1147	vpermq	$0x93,%ymm0,%ymm0
1148	vpblendd	$3,%ymm12,%ymm13,%ymm12
1149	vpaddq	%ymm9,%ymm4,%ymm4
1150	vpblendd	$3,%ymm13,%ymm10,%ymm13
1151	vpaddq	%ymm12,%ymm5,%ymm5
1152	vpblendd	$3,%ymm10,%ymm11,%ymm10
1153	vpaddq	%ymm13,%ymm6,%ymm6
1154	vpblendd	$3,%ymm11,%ymm0,%ymm11
1155	vpaddq	%ymm10,%ymm7,%ymm7
1156	vpaddq	%ymm11,%ymm8,%ymm8
1157
1158	vmovdqu	%ymm4,128-128(%rdi)
1159	vmovdqu	%ymm5,160-128(%rdi)
1160	vmovdqu	%ymm6,192-128(%rdi)
1161	vmovdqu	%ymm7,224-128(%rdi)
1162	vmovdqu	%ymm8,256-128(%rdi)
1163	vzeroupper
1164
1165	movq	%rbp,%rax
1166	movq	-48(%rax),%r15
1167	movq	-40(%rax),%r14
1168	movq	-32(%rax),%r13
1169	movq	-24(%rax),%r12
1170	movq	-16(%rax),%rbp
1171	movq	-8(%rax),%rbx
1172	leaq	(%rax),%rsp
1173.Lmul_1024_epilogue:
1174	.byte	0xf3,0xc3
1175.size	rsaz_1024_mul_avx2,.-rsaz_1024_mul_avx2
1176.globl	rsaz_1024_red2norm_avx2
1177.type	rsaz_1024_red2norm_avx2,@function
1178.align	32
1179rsaz_1024_red2norm_avx2:
1180	subq	$-128,%rsi
1181	xorq	%rax,%rax
1182	movq	-128(%rsi),%r8
1183	movq	-120(%rsi),%r9
1184	movq	-112(%rsi),%r10
1185	shlq	$0,%r8
1186	shlq	$29,%r9
1187	movq	%r10,%r11
1188	shlq	$58,%r10
1189	shrq	$6,%r11
1190	addq	%r8,%rax
1191	addq	%r9,%rax
1192	addq	%r10,%rax
1193	adcq	$0,%r11
1194	movq	%rax,0(%rdi)
1195	movq	%r11,%rax
1196	movq	-104(%rsi),%r8
1197	movq	-96(%rsi),%r9
1198	shlq	$23,%r8
1199	movq	%r9,%r10
1200	shlq	$52,%r9
1201	shrq	$12,%r10
1202	addq	%r8,%rax
1203	addq	%r9,%rax
1204	adcq	$0,%r10
1205	movq	%rax,8(%rdi)
1206	movq	%r10,%rax
1207	movq	-88(%rsi),%r11
1208	movq	-80(%rsi),%r8
1209	shlq	$17,%r11
1210	movq	%r8,%r9
1211	shlq	$46,%r8
1212	shrq	$18,%r9
1213	addq	%r11,%rax
1214	addq	%r8,%rax
1215	adcq	$0,%r9
1216	movq	%rax,16(%rdi)
1217	movq	%r9,%rax
1218	movq	-72(%rsi),%r10
1219	movq	-64(%rsi),%r11
1220	shlq	$11,%r10
1221	movq	%r11,%r8
1222	shlq	$40,%r11
1223	shrq	$24,%r8
1224	addq	%r10,%rax
1225	addq	%r11,%rax
1226	adcq	$0,%r8
1227	movq	%rax,24(%rdi)
1228	movq	%r8,%rax
1229	movq	-56(%rsi),%r9
1230	movq	-48(%rsi),%r10
1231	movq	-40(%rsi),%r11
1232	shlq	$5,%r9
1233	shlq	$34,%r10
1234	movq	%r11,%r8
1235	shlq	$63,%r11
1236	shrq	$1,%r8
1237	addq	%r9,%rax
1238	addq	%r10,%rax
1239	addq	%r11,%rax
1240	adcq	$0,%r8
1241	movq	%rax,32(%rdi)
1242	movq	%r8,%rax
1243	movq	-32(%rsi),%r9
1244	movq	-24(%rsi),%r10
1245	shlq	$28,%r9
1246	movq	%r10,%r11
1247	shlq	$57,%r10
1248	shrq	$7,%r11
1249	addq	%r9,%rax
1250	addq	%r10,%rax
1251	adcq	$0,%r11
1252	movq	%rax,40(%rdi)
1253	movq	%r11,%rax
1254	movq	-16(%rsi),%r8
1255	movq	-8(%rsi),%r9
1256	shlq	$22,%r8
1257	movq	%r9,%r10
1258	shlq	$51,%r9
1259	shrq	$13,%r10
1260	addq	%r8,%rax
1261	addq	%r9,%rax
1262	adcq	$0,%r10
1263	movq	%rax,48(%rdi)
1264	movq	%r10,%rax
1265	movq	0(%rsi),%r11
1266	movq	8(%rsi),%r8
1267	shlq	$16,%r11
1268	movq	%r8,%r9
1269	shlq	$45,%r8
1270	shrq	$19,%r9
1271	addq	%r11,%rax
1272	addq	%r8,%rax
1273	adcq	$0,%r9
1274	movq	%rax,56(%rdi)
1275	movq	%r9,%rax
1276	movq	16(%rsi),%r10
1277	movq	24(%rsi),%r11
1278	shlq	$10,%r10
1279	movq	%r11,%r8
1280	shlq	$39,%r11
1281	shrq	$25,%r8
1282	addq	%r10,%rax
1283	addq	%r11,%rax
1284	adcq	$0,%r8
1285	movq	%rax,64(%rdi)
1286	movq	%r8,%rax
1287	movq	32(%rsi),%r9
1288	movq	40(%rsi),%r10
1289	movq	48(%rsi),%r11
1290	shlq	$4,%r9
1291	shlq	$33,%r10
1292	movq	%r11,%r8
1293	shlq	$62,%r11
1294	shrq	$2,%r8
1295	addq	%r9,%rax
1296	addq	%r10,%rax
1297	addq	%r11,%rax
1298	adcq	$0,%r8
1299	movq	%rax,72(%rdi)
1300	movq	%r8,%rax
1301	movq	56(%rsi),%r9
1302	movq	64(%rsi),%r10
1303	shlq	$27,%r9
1304	movq	%r10,%r11
1305	shlq	$56,%r10
1306	shrq	$8,%r11
1307	addq	%r9,%rax
1308	addq	%r10,%rax
1309	adcq	$0,%r11
1310	movq	%rax,80(%rdi)
1311	movq	%r11,%rax
1312	movq	72(%rsi),%r8
1313	movq	80(%rsi),%r9
1314	shlq	$21,%r8
1315	movq	%r9,%r10
1316	shlq	$50,%r9
1317	shrq	$14,%r10
1318	addq	%r8,%rax
1319	addq	%r9,%rax
1320	adcq	$0,%r10
1321	movq	%rax,88(%rdi)
1322	movq	%r10,%rax
1323	movq	88(%rsi),%r11
1324	movq	96(%rsi),%r8
1325	shlq	$15,%r11
1326	movq	%r8,%r9
1327	shlq	$44,%r8
1328	shrq	$20,%r9
1329	addq	%r11,%rax
1330	addq	%r8,%rax
1331	adcq	$0,%r9
1332	movq	%rax,96(%rdi)
1333	movq	%r9,%rax
1334	movq	104(%rsi),%r10
1335	movq	112(%rsi),%r11
1336	shlq	$9,%r10
1337	movq	%r11,%r8
1338	shlq	$38,%r11
1339	shrq	$26,%r8
1340	addq	%r10,%rax
1341	addq	%r11,%rax
1342	adcq	$0,%r8
1343	movq	%rax,104(%rdi)
1344	movq	%r8,%rax
1345	movq	120(%rsi),%r9
1346	movq	128(%rsi),%r10
1347	movq	136(%rsi),%r11
1348	shlq	$3,%r9
1349	shlq	$32,%r10
1350	movq	%r11,%r8
1351	shlq	$61,%r11
1352	shrq	$3,%r8
1353	addq	%r9,%rax
1354	addq	%r10,%rax
1355	addq	%r11,%rax
1356	adcq	$0,%r8
1357	movq	%rax,112(%rdi)
1358	movq	%r8,%rax
1359	movq	144(%rsi),%r9
1360	movq	152(%rsi),%r10
1361	shlq	$26,%r9
1362	movq	%r10,%r11
1363	shlq	$55,%r10
1364	shrq	$9,%r11
1365	addq	%r9,%rax
1366	addq	%r10,%rax
1367	adcq	$0,%r11
1368	movq	%rax,120(%rdi)
1369	movq	%r11,%rax
1370	.byte	0xf3,0xc3
1371.size	rsaz_1024_red2norm_avx2,.-rsaz_1024_red2norm_avx2
1372
1373.globl	rsaz_1024_norm2red_avx2
1374.type	rsaz_1024_norm2red_avx2,@function
1375.align	32
1376rsaz_1024_norm2red_avx2:
1377	subq	$-128,%rdi
1378	movq	(%rsi),%r8
1379	movl	$0x1fffffff,%eax
1380	movq	8(%rsi),%r9
1381	movq	%r8,%r11
1382	shrq	$0,%r11
1383	andq	%rax,%r11
1384	movq	%r11,-128(%rdi)
1385	movq	%r8,%r10
1386	shrq	$29,%r10
1387	andq	%rax,%r10
1388	movq	%r10,-120(%rdi)
1389	shrdq	$58,%r9,%r8
1390	andq	%rax,%r8
1391	movq	%r8,-112(%rdi)
1392	movq	16(%rsi),%r10
1393	movq	%r9,%r8
1394	shrq	$23,%r8
1395	andq	%rax,%r8
1396	movq	%r8,-104(%rdi)
1397	shrdq	$52,%r10,%r9
1398	andq	%rax,%r9
1399	movq	%r9,-96(%rdi)
1400	movq	24(%rsi),%r11
1401	movq	%r10,%r9
1402	shrq	$17,%r9
1403	andq	%rax,%r9
1404	movq	%r9,-88(%rdi)
1405	shrdq	$46,%r11,%r10
1406	andq	%rax,%r10
1407	movq	%r10,-80(%rdi)
1408	movq	32(%rsi),%r8
1409	movq	%r11,%r10
1410	shrq	$11,%r10
1411	andq	%rax,%r10
1412	movq	%r10,-72(%rdi)
1413	shrdq	$40,%r8,%r11
1414	andq	%rax,%r11
1415	movq	%r11,-64(%rdi)
1416	movq	40(%rsi),%r9
1417	movq	%r8,%r11
1418	shrq	$5,%r11
1419	andq	%rax,%r11
1420	movq	%r11,-56(%rdi)
1421	movq	%r8,%r10
1422	shrq	$34,%r10
1423	andq	%rax,%r10
1424	movq	%r10,-48(%rdi)
1425	shrdq	$63,%r9,%r8
1426	andq	%rax,%r8
1427	movq	%r8,-40(%rdi)
1428	movq	48(%rsi),%r10
1429	movq	%r9,%r8
1430	shrq	$28,%r8
1431	andq	%rax,%r8
1432	movq	%r8,-32(%rdi)
1433	shrdq	$57,%r10,%r9
1434	andq	%rax,%r9
1435	movq	%r9,-24(%rdi)
1436	movq	56(%rsi),%r11
1437	movq	%r10,%r9
1438	shrq	$22,%r9
1439	andq	%rax,%r9
1440	movq	%r9,-16(%rdi)
1441	shrdq	$51,%r11,%r10
1442	andq	%rax,%r10
1443	movq	%r10,-8(%rdi)
1444	movq	64(%rsi),%r8
1445	movq	%r11,%r10
1446	shrq	$16,%r10
1447	andq	%rax,%r10
1448	movq	%r10,0(%rdi)
1449	shrdq	$45,%r8,%r11
1450	andq	%rax,%r11
1451	movq	%r11,8(%rdi)
1452	movq	72(%rsi),%r9
1453	movq	%r8,%r11
1454	shrq	$10,%r11
1455	andq	%rax,%r11
1456	movq	%r11,16(%rdi)
1457	shrdq	$39,%r9,%r8
1458	andq	%rax,%r8
1459	movq	%r8,24(%rdi)
1460	movq	80(%rsi),%r10
1461	movq	%r9,%r8
1462	shrq	$4,%r8
1463	andq	%rax,%r8
1464	movq	%r8,32(%rdi)
1465	movq	%r9,%r11
1466	shrq	$33,%r11
1467	andq	%rax,%r11
1468	movq	%r11,40(%rdi)
1469	shrdq	$62,%r10,%r9
1470	andq	%rax,%r9
1471	movq	%r9,48(%rdi)
1472	movq	88(%rsi),%r11
1473	movq	%r10,%r9
1474	shrq	$27,%r9
1475	andq	%rax,%r9
1476	movq	%r9,56(%rdi)
1477	shrdq	$56,%r11,%r10
1478	andq	%rax,%r10
1479	movq	%r10,64(%rdi)
1480	movq	96(%rsi),%r8
1481	movq	%r11,%r10
1482	shrq	$21,%r10
1483	andq	%rax,%r10
1484	movq	%r10,72(%rdi)
1485	shrdq	$50,%r8,%r11
1486	andq	%rax,%r11
1487	movq	%r11,80(%rdi)
1488	movq	104(%rsi),%r9
1489	movq	%r8,%r11
1490	shrq	$15,%r11
1491	andq	%rax,%r11
1492	movq	%r11,88(%rdi)
1493	shrdq	$44,%r9,%r8
1494	andq	%rax,%r8
1495	movq	%r8,96(%rdi)
1496	movq	112(%rsi),%r10
1497	movq	%r9,%r8
1498	shrq	$9,%r8
1499	andq	%rax,%r8
1500	movq	%r8,104(%rdi)
1501	shrdq	$38,%r10,%r9
1502	andq	%rax,%r9
1503	movq	%r9,112(%rdi)
1504	movq	120(%rsi),%r11
1505	movq	%r10,%r9
1506	shrq	$3,%r9
1507	andq	%rax,%r9
1508	movq	%r9,120(%rdi)
1509	movq	%r10,%r8
1510	shrq	$32,%r8
1511	andq	%rax,%r8
1512	movq	%r8,128(%rdi)
1513	shrdq	$61,%r11,%r10
1514	andq	%rax,%r10
1515	movq	%r10,136(%rdi)
1516	xorq	%r8,%r8
1517	movq	%r11,%r10
1518	shrq	$26,%r10
1519	andq	%rax,%r10
1520	movq	%r10,144(%rdi)
1521	shrdq	$55,%r8,%r11
1522	andq	%rax,%r11
1523	movq	%r11,152(%rdi)
1524	movq	%r8,160(%rdi)
1525	movq	%r8,168(%rdi)
1526	movq	%r8,176(%rdi)
1527	movq	%r8,184(%rdi)
1528	.byte	0xf3,0xc3
1529.size	rsaz_1024_norm2red_avx2,.-rsaz_1024_norm2red_avx2
1530.globl	rsaz_1024_scatter5_avx2
1531.type	rsaz_1024_scatter5_avx2,@function
1532.align	32
1533rsaz_1024_scatter5_avx2:
1534	vzeroupper
1535	vmovdqu	.Lscatter_permd(%rip),%ymm5
1536	shll	$4,%edx
1537	leaq	(%rdi,%rdx,1),%rdi
1538	movl	$9,%eax
1539	jmp	.Loop_scatter_1024
1540
1541.align	32
1542.Loop_scatter_1024:
1543	vmovdqu	(%rsi),%ymm0
1544	leaq	32(%rsi),%rsi
1545	vpermd	%ymm0,%ymm5,%ymm0
1546	vmovdqu	%xmm0,(%rdi)
1547	leaq	512(%rdi),%rdi
1548	decl	%eax
1549	jnz	.Loop_scatter_1024
1550
1551	vzeroupper
1552	.byte	0xf3,0xc3
1553.size	rsaz_1024_scatter5_avx2,.-rsaz_1024_scatter5_avx2
1554
1555.globl	rsaz_1024_gather5_avx2
1556.type	rsaz_1024_gather5_avx2,@function
1557.align	32
1558rsaz_1024_gather5_avx2:
1559	vzeroupper
1560	movq	%rsp,%r11
1561	leaq	-256(%rsp),%rsp
1562	andq	$-32,%rsp
1563	leaq	.Linc(%rip),%r10
1564	leaq	-128(%rsp),%rax
1565
1566	vmovd	%edx,%xmm4
1567	vmovdqa	(%r10),%ymm0
1568	vmovdqa	32(%r10),%ymm1
1569	vmovdqa	64(%r10),%ymm5
1570	vpbroadcastd	%xmm4,%ymm4
1571
1572	vpaddd	%ymm5,%ymm0,%ymm2
1573	vpcmpeqd	%ymm4,%ymm0,%ymm0
1574	vpaddd	%ymm5,%ymm1,%ymm3
1575	vpcmpeqd	%ymm4,%ymm1,%ymm1
1576	vmovdqa	%ymm0,0+128(%rax)
1577	vpaddd	%ymm5,%ymm2,%ymm0
1578	vpcmpeqd	%ymm4,%ymm2,%ymm2
1579	vmovdqa	%ymm1,32+128(%rax)
1580	vpaddd	%ymm5,%ymm3,%ymm1
1581	vpcmpeqd	%ymm4,%ymm3,%ymm3
1582	vmovdqa	%ymm2,64+128(%rax)
1583	vpaddd	%ymm5,%ymm0,%ymm2
1584	vpcmpeqd	%ymm4,%ymm0,%ymm0
1585	vmovdqa	%ymm3,96+128(%rax)
1586	vpaddd	%ymm5,%ymm1,%ymm3
1587	vpcmpeqd	%ymm4,%ymm1,%ymm1
1588	vmovdqa	%ymm0,128+128(%rax)
1589	vpaddd	%ymm5,%ymm2,%ymm8
1590	vpcmpeqd	%ymm4,%ymm2,%ymm2
1591	vmovdqa	%ymm1,160+128(%rax)
1592	vpaddd	%ymm5,%ymm3,%ymm9
1593	vpcmpeqd	%ymm4,%ymm3,%ymm3
1594	vmovdqa	%ymm2,192+128(%rax)
1595	vpaddd	%ymm5,%ymm8,%ymm10
1596	vpcmpeqd	%ymm4,%ymm8,%ymm8
1597	vmovdqa	%ymm3,224+128(%rax)
1598	vpaddd	%ymm5,%ymm9,%ymm11
1599	vpcmpeqd	%ymm4,%ymm9,%ymm9
1600	vpaddd	%ymm5,%ymm10,%ymm12
1601	vpcmpeqd	%ymm4,%ymm10,%ymm10
1602	vpaddd	%ymm5,%ymm11,%ymm13
1603	vpcmpeqd	%ymm4,%ymm11,%ymm11
1604	vpaddd	%ymm5,%ymm12,%ymm14
1605	vpcmpeqd	%ymm4,%ymm12,%ymm12
1606	vpaddd	%ymm5,%ymm13,%ymm15
1607	vpcmpeqd	%ymm4,%ymm13,%ymm13
1608	vpcmpeqd	%ymm4,%ymm14,%ymm14
1609	vpcmpeqd	%ymm4,%ymm15,%ymm15
1610
1611	vmovdqa	-32(%r10),%ymm7
1612	leaq	128(%rsi),%rsi
1613	movl	$9,%edx
1614
1615.Loop_gather_1024:
1616	vmovdqa	0-128(%rsi),%ymm0
1617	vmovdqa	32-128(%rsi),%ymm1
1618	vmovdqa	64-128(%rsi),%ymm2
1619	vmovdqa	96-128(%rsi),%ymm3
1620	vpand	0+128(%rax),%ymm0,%ymm0
1621	vpand	32+128(%rax),%ymm1,%ymm1
1622	vpand	64+128(%rax),%ymm2,%ymm2
1623	vpor	%ymm0,%ymm1,%ymm4
1624	vpand	96+128(%rax),%ymm3,%ymm3
1625	vmovdqa	128-128(%rsi),%ymm0
1626	vmovdqa	160-128(%rsi),%ymm1
1627	vpor	%ymm2,%ymm3,%ymm5
1628	vmovdqa	192-128(%rsi),%ymm2
1629	vmovdqa	224-128(%rsi),%ymm3
1630	vpand	128+128(%rax),%ymm0,%ymm0
1631	vpand	160+128(%rax),%ymm1,%ymm1
1632	vpand	192+128(%rax),%ymm2,%ymm2
1633	vpor	%ymm0,%ymm4,%ymm4
1634	vpand	224+128(%rax),%ymm3,%ymm3
1635	vpand	256-128(%rsi),%ymm8,%ymm0
1636	vpor	%ymm1,%ymm5,%ymm5
1637	vpand	288-128(%rsi),%ymm9,%ymm1
1638	vpor	%ymm2,%ymm4,%ymm4
1639	vpand	320-128(%rsi),%ymm10,%ymm2
1640	vpor	%ymm3,%ymm5,%ymm5
1641	vpand	352-128(%rsi),%ymm11,%ymm3
1642	vpor	%ymm0,%ymm4,%ymm4
1643	vpand	384-128(%rsi),%ymm12,%ymm0
1644	vpor	%ymm1,%ymm5,%ymm5
1645	vpand	416-128(%rsi),%ymm13,%ymm1
1646	vpor	%ymm2,%ymm4,%ymm4
1647	vpand	448-128(%rsi),%ymm14,%ymm2
1648	vpor	%ymm3,%ymm5,%ymm5
1649	vpand	480-128(%rsi),%ymm15,%ymm3
1650	leaq	512(%rsi),%rsi
1651	vpor	%ymm0,%ymm4,%ymm4
1652	vpor	%ymm1,%ymm5,%ymm5
1653	vpor	%ymm2,%ymm4,%ymm4
1654	vpor	%ymm3,%ymm5,%ymm5
1655
1656	vpor	%ymm5,%ymm4,%ymm4
1657	vextracti128	$1,%ymm4,%xmm5
1658	vpor	%xmm4,%xmm5,%xmm5
1659	vpermd	%ymm5,%ymm7,%ymm5
1660	vmovdqu	%ymm5,(%rdi)
1661	leaq	32(%rdi),%rdi
1662	decl	%edx
1663	jnz	.Loop_gather_1024
1664
1665	vpxor	%ymm0,%ymm0,%ymm0
1666	vmovdqu	%ymm0,(%rdi)
1667	vzeroupper
1668	leaq	(%r11),%rsp
1669	.byte	0xf3,0xc3
1670.size	rsaz_1024_gather5_avx2,.-rsaz_1024_gather5_avx2
1671
1672.globl	rsaz_avx2_eligible
1673.type	rsaz_avx2_eligible,@function
1674.align	32
1675rsaz_avx2_eligible:
1676	movl	OPENSSL_ia32cap_P+8(%rip),%eax
1677	movl	$524544,%ecx
1678	movl	$0,%edx
1679	andl	%eax,%ecx
1680	cmpl	$524544,%ecx
1681	cmovel	%edx,%eax
1682	andl	$32,%eax
1683	shrl	$5,%eax
1684	.byte	0xf3,0xc3
1685.size	rsaz_avx2_eligible,.-rsaz_avx2_eligible
1686
1687.align	64
1688.Land_mask:
1689.quad	0x1fffffff,0x1fffffff,0x1fffffff,-1
1690.Lscatter_permd:
1691.long	0,2,4,6,7,7,7,7
1692.Lgather_permd:
1693.long	0,7,1,7,2,7,3,7
1694.Linc:
1695.long	0,0,0,0, 1,1,1,1
1696.long	2,2,2,2, 3,3,3,3
1697.long	4,4,4,4, 4,4,4,4
1698.align	64
1699