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