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