xref: /freebsd/sys/crypto/openssl/amd64/rsaz-avx2.S (revision 95eb4b873b6a8b527c5bd78d7191975dfca38998)
1/* Do not modify. This file is auto-generated from rsaz-avx2.pl. */
2.text
3
4.globl	rsaz_1024_sqr_avx2
5.type	rsaz_1024_sqr_avx2,@function
6.align	64
7rsaz_1024_sqr_avx2:
8.cfi_startproc
9	leaq	(%rsp),%rax
10.cfi_def_cfa_register	%rax
11	pushq	%rbx
12.cfi_offset	%rbx,-16
13	pushq	%rbp
14.cfi_offset	%rbp,-24
15	pushq	%r12
16.cfi_offset	%r12,-32
17	pushq	%r13
18.cfi_offset	%r13,-40
19	pushq	%r14
20.cfi_offset	%r14,-48
21	pushq	%r15
22.cfi_offset	%r15,-56
23	vzeroupper
24	movq	%rax,%rbp
25.cfi_def_cfa_register	%rbp
26	movq	%rdx,%r13
27	subq	$832,%rsp
28	movq	%r13,%r15
29	subq	$-128,%rdi
30	subq	$-128,%rsi
31	subq	$-128,%r13
32
33	andq	$4095,%r15
34	addq	$320,%r15
35	shrq	$12,%r15
36	vpxor	%ymm9,%ymm9,%ymm9
37	jz	.Lsqr_1024_no_n_copy
38
39
40
41
42
43	subq	$320,%rsp
44	vmovdqu	0-128(%r13),%ymm0
45	andq	$-2048,%rsp
46	vmovdqu	32-128(%r13),%ymm1
47	vmovdqu	64-128(%r13),%ymm2
48	vmovdqu	96-128(%r13),%ymm3
49	vmovdqu	128-128(%r13),%ymm4
50	vmovdqu	160-128(%r13),%ymm5
51	vmovdqu	192-128(%r13),%ymm6
52	vmovdqu	224-128(%r13),%ymm7
53	vmovdqu	256-128(%r13),%ymm8
54	leaq	832+128(%rsp),%r13
55	vmovdqu	%ymm0,0-128(%r13)
56	vmovdqu	%ymm1,32-128(%r13)
57	vmovdqu	%ymm2,64-128(%r13)
58	vmovdqu	%ymm3,96-128(%r13)
59	vmovdqu	%ymm4,128-128(%r13)
60	vmovdqu	%ymm5,160-128(%r13)
61	vmovdqu	%ymm6,192-128(%r13)
62	vmovdqu	%ymm7,224-128(%r13)
63	vmovdqu	%ymm8,256-128(%r13)
64	vmovdqu	%ymm9,288-128(%r13)
65
66.Lsqr_1024_no_n_copy:
67	andq	$-1024,%rsp
68
69	vmovdqu	32-128(%rsi),%ymm1
70	vmovdqu	64-128(%rsi),%ymm2
71	vmovdqu	96-128(%rsi),%ymm3
72	vmovdqu	128-128(%rsi),%ymm4
73	vmovdqu	160-128(%rsi),%ymm5
74	vmovdqu	192-128(%rsi),%ymm6
75	vmovdqu	224-128(%rsi),%ymm7
76	vmovdqu	256-128(%rsi),%ymm8
77
78	leaq	192(%rsp),%rbx
79	vmovdqu	.Land_mask(%rip),%ymm15
80	jmp	.LOOP_GRANDE_SQR_1024
81
82.align	32
83.LOOP_GRANDE_SQR_1024:
84	leaq	576+128(%rsp),%r9
85	leaq	448(%rsp),%r12
86
87
88
89
90	vpaddq	%ymm1,%ymm1,%ymm1
91	vpbroadcastq	0-128(%rsi),%ymm10
92	vpaddq	%ymm2,%ymm2,%ymm2
93	vmovdqa	%ymm1,0-128(%r9)
94	vpaddq	%ymm3,%ymm3,%ymm3
95	vmovdqa	%ymm2,32-128(%r9)
96	vpaddq	%ymm4,%ymm4,%ymm4
97	vmovdqa	%ymm3,64-128(%r9)
98	vpaddq	%ymm5,%ymm5,%ymm5
99	vmovdqa	%ymm4,96-128(%r9)
100	vpaddq	%ymm6,%ymm6,%ymm6
101	vmovdqa	%ymm5,128-128(%r9)
102	vpaddq	%ymm7,%ymm7,%ymm7
103	vmovdqa	%ymm6,160-128(%r9)
104	vpaddq	%ymm8,%ymm8,%ymm8
105	vmovdqa	%ymm7,192-128(%r9)
106	vpxor	%ymm9,%ymm9,%ymm9
107	vmovdqa	%ymm8,224-128(%r9)
108
109	vpmuludq	0-128(%rsi),%ymm10,%ymm0
110	vpbroadcastq	32-128(%rsi),%ymm11
111	vmovdqu	%ymm9,288-192(%rbx)
112	vpmuludq	%ymm10,%ymm1,%ymm1
113	vmovdqu	%ymm9,320-448(%r12)
114	vpmuludq	%ymm10,%ymm2,%ymm2
115	vmovdqu	%ymm9,352-448(%r12)
116	vpmuludq	%ymm10,%ymm3,%ymm3
117	vmovdqu	%ymm9,384-448(%r12)
118	vpmuludq	%ymm10,%ymm4,%ymm4
119	vmovdqu	%ymm9,416-448(%r12)
120	vpmuludq	%ymm10,%ymm5,%ymm5
121	vmovdqu	%ymm9,448-448(%r12)
122	vpmuludq	%ymm10,%ymm6,%ymm6
123	vmovdqu	%ymm9,480-448(%r12)
124	vpmuludq	%ymm10,%ymm7,%ymm7
125	vmovdqu	%ymm9,512-448(%r12)
126	vpmuludq	%ymm10,%ymm8,%ymm8
127	vpbroadcastq	64-128(%rsi),%ymm10
128	vmovdqu	%ymm9,544-448(%r12)
129
130	movq	%rsi,%r15
131	movl	$4,%r14d
132	jmp	.Lsqr_entry_1024
133.align	32
134.LOOP_SQR_1024:
135	vpbroadcastq	32-128(%r15),%ymm11
136	vpmuludq	0-128(%rsi),%ymm10,%ymm0
137	vpaddq	0-192(%rbx),%ymm0,%ymm0
138	vpmuludq	0-128(%r9),%ymm10,%ymm1
139	vpaddq	32-192(%rbx),%ymm1,%ymm1
140	vpmuludq	32-128(%r9),%ymm10,%ymm2
141	vpaddq	64-192(%rbx),%ymm2,%ymm2
142	vpmuludq	64-128(%r9),%ymm10,%ymm3
143	vpaddq	96-192(%rbx),%ymm3,%ymm3
144	vpmuludq	96-128(%r9),%ymm10,%ymm4
145	vpaddq	128-192(%rbx),%ymm4,%ymm4
146	vpmuludq	128-128(%r9),%ymm10,%ymm5
147	vpaddq	160-192(%rbx),%ymm5,%ymm5
148	vpmuludq	160-128(%r9),%ymm10,%ymm6
149	vpaddq	192-192(%rbx),%ymm6,%ymm6
150	vpmuludq	192-128(%r9),%ymm10,%ymm7
151	vpaddq	224-192(%rbx),%ymm7,%ymm7
152	vpmuludq	224-128(%r9),%ymm10,%ymm8
153	vpbroadcastq	64-128(%r15),%ymm10
154	vpaddq	256-192(%rbx),%ymm8,%ymm8
155.Lsqr_entry_1024:
156	vmovdqu	%ymm0,0-192(%rbx)
157	vmovdqu	%ymm1,32-192(%rbx)
158
159	vpmuludq	32-128(%rsi),%ymm11,%ymm12
160	vpaddq	%ymm12,%ymm2,%ymm2
161	vpmuludq	32-128(%r9),%ymm11,%ymm14
162	vpaddq	%ymm14,%ymm3,%ymm3
163	vpmuludq	64-128(%r9),%ymm11,%ymm13
164	vpaddq	%ymm13,%ymm4,%ymm4
165	vpmuludq	96-128(%r9),%ymm11,%ymm12
166	vpaddq	%ymm12,%ymm5,%ymm5
167	vpmuludq	128-128(%r9),%ymm11,%ymm14
168	vpaddq	%ymm14,%ymm6,%ymm6
169	vpmuludq	160-128(%r9),%ymm11,%ymm13
170	vpaddq	%ymm13,%ymm7,%ymm7
171	vpmuludq	192-128(%r9),%ymm11,%ymm12
172	vpaddq	%ymm12,%ymm8,%ymm8
173	vpmuludq	224-128(%r9),%ymm11,%ymm0
174	vpbroadcastq	96-128(%r15),%ymm11
175	vpaddq	288-192(%rbx),%ymm0,%ymm0
176
177	vmovdqu	%ymm2,64-192(%rbx)
178	vmovdqu	%ymm3,96-192(%rbx)
179
180	vpmuludq	64-128(%rsi),%ymm10,%ymm13
181	vpaddq	%ymm13,%ymm4,%ymm4
182	vpmuludq	64-128(%r9),%ymm10,%ymm12
183	vpaddq	%ymm12,%ymm5,%ymm5
184	vpmuludq	96-128(%r9),%ymm10,%ymm14
185	vpaddq	%ymm14,%ymm6,%ymm6
186	vpmuludq	128-128(%r9),%ymm10,%ymm13
187	vpaddq	%ymm13,%ymm7,%ymm7
188	vpmuludq	160-128(%r9),%ymm10,%ymm12
189	vpaddq	%ymm12,%ymm8,%ymm8
190	vpmuludq	192-128(%r9),%ymm10,%ymm14
191	vpaddq	%ymm14,%ymm0,%ymm0
192	vpmuludq	224-128(%r9),%ymm10,%ymm1
193	vpbroadcastq	128-128(%r15),%ymm10
194	vpaddq	320-448(%r12),%ymm1,%ymm1
195
196	vmovdqu	%ymm4,128-192(%rbx)
197	vmovdqu	%ymm5,160-192(%rbx)
198
199	vpmuludq	96-128(%rsi),%ymm11,%ymm12
200	vpaddq	%ymm12,%ymm6,%ymm6
201	vpmuludq	96-128(%r9),%ymm11,%ymm14
202	vpaddq	%ymm14,%ymm7,%ymm7
203	vpmuludq	128-128(%r9),%ymm11,%ymm13
204	vpaddq	%ymm13,%ymm8,%ymm8
205	vpmuludq	160-128(%r9),%ymm11,%ymm12
206	vpaddq	%ymm12,%ymm0,%ymm0
207	vpmuludq	192-128(%r9),%ymm11,%ymm14
208	vpaddq	%ymm14,%ymm1,%ymm1
209	vpmuludq	224-128(%r9),%ymm11,%ymm2
210	vpbroadcastq	160-128(%r15),%ymm11
211	vpaddq	352-448(%r12),%ymm2,%ymm2
212
213	vmovdqu	%ymm6,192-192(%rbx)
214	vmovdqu	%ymm7,224-192(%rbx)
215
216	vpmuludq	128-128(%rsi),%ymm10,%ymm12
217	vpaddq	%ymm12,%ymm8,%ymm8
218	vpmuludq	128-128(%r9),%ymm10,%ymm14
219	vpaddq	%ymm14,%ymm0,%ymm0
220	vpmuludq	160-128(%r9),%ymm10,%ymm13
221	vpaddq	%ymm13,%ymm1,%ymm1
222	vpmuludq	192-128(%r9),%ymm10,%ymm12
223	vpaddq	%ymm12,%ymm2,%ymm2
224	vpmuludq	224-128(%r9),%ymm10,%ymm3
225	vpbroadcastq	192-128(%r15),%ymm10
226	vpaddq	384-448(%r12),%ymm3,%ymm3
227
228	vmovdqu	%ymm8,256-192(%rbx)
229	vmovdqu	%ymm0,288-192(%rbx)
230	leaq	8(%rbx),%rbx
231
232	vpmuludq	160-128(%rsi),%ymm11,%ymm13
233	vpaddq	%ymm13,%ymm1,%ymm1
234	vpmuludq	160-128(%r9),%ymm11,%ymm12
235	vpaddq	%ymm12,%ymm2,%ymm2
236	vpmuludq	192-128(%r9),%ymm11,%ymm14
237	vpaddq	%ymm14,%ymm3,%ymm3
238	vpmuludq	224-128(%r9),%ymm11,%ymm4
239	vpbroadcastq	224-128(%r15),%ymm11
240	vpaddq	416-448(%r12),%ymm4,%ymm4
241
242	vmovdqu	%ymm1,320-448(%r12)
243	vmovdqu	%ymm2,352-448(%r12)
244
245	vpmuludq	192-128(%rsi),%ymm10,%ymm12
246	vpaddq	%ymm12,%ymm3,%ymm3
247	vpmuludq	192-128(%r9),%ymm10,%ymm14
248	vpbroadcastq	256-128(%r15),%ymm0
249	vpaddq	%ymm14,%ymm4,%ymm4
250	vpmuludq	224-128(%r9),%ymm10,%ymm5
251	vpbroadcastq	0+8-128(%r15),%ymm10
252	vpaddq	448-448(%r12),%ymm5,%ymm5
253
254	vmovdqu	%ymm3,384-448(%r12)
255	vmovdqu	%ymm4,416-448(%r12)
256	leaq	8(%r15),%r15
257
258	vpmuludq	224-128(%rsi),%ymm11,%ymm12
259	vpaddq	%ymm12,%ymm5,%ymm5
260	vpmuludq	224-128(%r9),%ymm11,%ymm6
261	vpaddq	480-448(%r12),%ymm6,%ymm6
262
263	vpmuludq	256-128(%rsi),%ymm0,%ymm7
264	vmovdqu	%ymm5,448-448(%r12)
265	vpaddq	512-448(%r12),%ymm7,%ymm7
266	vmovdqu	%ymm6,480-448(%r12)
267	vmovdqu	%ymm7,512-448(%r12)
268	leaq	8(%r12),%r12
269
270	decl	%r14d
271	jnz	.LOOP_SQR_1024
272
273	vmovdqu	256(%rsp),%ymm8
274	vmovdqu	288(%rsp),%ymm1
275	vmovdqu	320(%rsp),%ymm2
276	leaq	192(%rsp),%rbx
277
278	vpsrlq	$29,%ymm8,%ymm14
279	vpand	%ymm15,%ymm8,%ymm8
280	vpsrlq	$29,%ymm1,%ymm11
281	vpand	%ymm15,%ymm1,%ymm1
282
283	vpermq	$0x93,%ymm14,%ymm14
284	vpxor	%ymm9,%ymm9,%ymm9
285	vpermq	$0x93,%ymm11,%ymm11
286
287	vpblendd	$3,%ymm9,%ymm14,%ymm10
288	vpblendd	$3,%ymm14,%ymm11,%ymm14
289	vpaddq	%ymm10,%ymm8,%ymm8
290	vpblendd	$3,%ymm11,%ymm9,%ymm11
291	vpaddq	%ymm14,%ymm1,%ymm1
292	vpaddq	%ymm11,%ymm2,%ymm2
293	vmovdqu	%ymm1,288-192(%rbx)
294	vmovdqu	%ymm2,320-192(%rbx)
295
296	movq	(%rsp),%rax
297	movq	8(%rsp),%r10
298	movq	16(%rsp),%r11
299	movq	24(%rsp),%r12
300	vmovdqu	32(%rsp),%ymm1
301	vmovdqu	64-192(%rbx),%ymm2
302	vmovdqu	96-192(%rbx),%ymm3
303	vmovdqu	128-192(%rbx),%ymm4
304	vmovdqu	160-192(%rbx),%ymm5
305	vmovdqu	192-192(%rbx),%ymm6
306	vmovdqu	224-192(%rbx),%ymm7
307
308	movq	%rax,%r9
309	imull	%ecx,%eax
310	andl	$0x1fffffff,%eax
311	vmovd	%eax,%xmm12
312
313	movq	%rax,%rdx
314	imulq	-128(%r13),%rax
315	vpbroadcastq	%xmm12,%ymm12
316	addq	%rax,%r9
317	movq	%rdx,%rax
318	imulq	8-128(%r13),%rax
319	shrq	$29,%r9
320	addq	%rax,%r10
321	movq	%rdx,%rax
322	imulq	16-128(%r13),%rax
323	addq	%r9,%r10
324	addq	%rax,%r11
325	imulq	24-128(%r13),%rdx
326	addq	%rdx,%r12
327
328	movq	%r10,%rax
329	imull	%ecx,%eax
330	andl	$0x1fffffff,%eax
331
332	movl	$9,%r14d
333	jmp	.LOOP_REDUCE_1024
334
335.align	32
336.LOOP_REDUCE_1024:
337	vmovd	%eax,%xmm13
338	vpbroadcastq	%xmm13,%ymm13
339
340	vpmuludq	32-128(%r13),%ymm12,%ymm10
341	movq	%rax,%rdx
342	imulq	-128(%r13),%rax
343	vpaddq	%ymm10,%ymm1,%ymm1
344	addq	%rax,%r10
345	vpmuludq	64-128(%r13),%ymm12,%ymm14
346	movq	%rdx,%rax
347	imulq	8-128(%r13),%rax
348	vpaddq	%ymm14,%ymm2,%ymm2
349	vpmuludq	96-128(%r13),%ymm12,%ymm11
350.byte	0x67
351	addq	%rax,%r11
352.byte	0x67
353	movq	%rdx,%rax
354	imulq	16-128(%r13),%rax
355	shrq	$29,%r10
356	vpaddq	%ymm11,%ymm3,%ymm3
357	vpmuludq	128-128(%r13),%ymm12,%ymm10
358	addq	%rax,%r12
359	addq	%r10,%r11
360	vpaddq	%ymm10,%ymm4,%ymm4
361	vpmuludq	160-128(%r13),%ymm12,%ymm14
362	movq	%r11,%rax
363	imull	%ecx,%eax
364	vpaddq	%ymm14,%ymm5,%ymm5
365	vpmuludq	192-128(%r13),%ymm12,%ymm11
366	andl	$0x1fffffff,%eax
367	vpaddq	%ymm11,%ymm6,%ymm6
368	vpmuludq	224-128(%r13),%ymm12,%ymm10
369	vpaddq	%ymm10,%ymm7,%ymm7
370	vpmuludq	256-128(%r13),%ymm12,%ymm14
371	vmovd	%eax,%xmm12
372
373	vpaddq	%ymm14,%ymm8,%ymm8
374
375	vpbroadcastq	%xmm12,%ymm12
376
377	vpmuludq	32-8-128(%r13),%ymm13,%ymm11
378	vmovdqu	96-8-128(%r13),%ymm14
379	movq	%rax,%rdx
380	imulq	-128(%r13),%rax
381	vpaddq	%ymm11,%ymm1,%ymm1
382	vpmuludq	64-8-128(%r13),%ymm13,%ymm10
383	vmovdqu	128-8-128(%r13),%ymm11
384	addq	%rax,%r11
385	movq	%rdx,%rax
386	imulq	8-128(%r13),%rax
387	vpaddq	%ymm10,%ymm2,%ymm2
388	addq	%r12,%rax
389	shrq	$29,%r11
390	vpmuludq	%ymm13,%ymm14,%ymm14
391	vmovdqu	160-8-128(%r13),%ymm10
392	addq	%r11,%rax
393	vpaddq	%ymm14,%ymm3,%ymm3
394	vpmuludq	%ymm13,%ymm11,%ymm11
395	vmovdqu	192-8-128(%r13),%ymm14
396.byte	0x67
397	movq	%rax,%r12
398	imull	%ecx,%eax
399	vpaddq	%ymm11,%ymm4,%ymm4
400	vpmuludq	%ymm13,%ymm10,%ymm10
401.byte	0xc4,0x41,0x7e,0x6f,0x9d,0x58,0x00,0x00,0x00
402	andl	$0x1fffffff,%eax
403	vpaddq	%ymm10,%ymm5,%ymm5
404	vpmuludq	%ymm13,%ymm14,%ymm14
405	vmovdqu	256-8-128(%r13),%ymm10
406	vpaddq	%ymm14,%ymm6,%ymm6
407	vpmuludq	%ymm13,%ymm11,%ymm11
408	vmovdqu	288-8-128(%r13),%ymm9
409	vmovd	%eax,%xmm0
410	imulq	-128(%r13),%rax
411	vpaddq	%ymm11,%ymm7,%ymm7
412	vpmuludq	%ymm13,%ymm10,%ymm10
413	vmovdqu	32-16-128(%r13),%ymm14
414	vpbroadcastq	%xmm0,%ymm0
415	vpaddq	%ymm10,%ymm8,%ymm8
416	vpmuludq	%ymm13,%ymm9,%ymm9
417	vmovdqu	64-16-128(%r13),%ymm11
418	addq	%rax,%r12
419
420	vmovdqu	32-24-128(%r13),%ymm13
421	vpmuludq	%ymm12,%ymm14,%ymm14
422	vmovdqu	96-16-128(%r13),%ymm10
423	vpaddq	%ymm14,%ymm1,%ymm1
424	vpmuludq	%ymm0,%ymm13,%ymm13
425	vpmuludq	%ymm12,%ymm11,%ymm11
426.byte	0xc4,0x41,0x7e,0x6f,0xb5,0xf0,0xff,0xff,0xff
427	vpaddq	%ymm1,%ymm13,%ymm13
428	vpaddq	%ymm11,%ymm2,%ymm2
429	vpmuludq	%ymm12,%ymm10,%ymm10
430	vmovdqu	160-16-128(%r13),%ymm11
431.byte	0x67
432	vmovq	%xmm13,%rax
433	vmovdqu	%ymm13,(%rsp)
434	vpaddq	%ymm10,%ymm3,%ymm3
435	vpmuludq	%ymm12,%ymm14,%ymm14
436	vmovdqu	192-16-128(%r13),%ymm10
437	vpaddq	%ymm14,%ymm4,%ymm4
438	vpmuludq	%ymm12,%ymm11,%ymm11
439	vmovdqu	224-16-128(%r13),%ymm14
440	vpaddq	%ymm11,%ymm5,%ymm5
441	vpmuludq	%ymm12,%ymm10,%ymm10
442	vmovdqu	256-16-128(%r13),%ymm11
443	vpaddq	%ymm10,%ymm6,%ymm6
444	vpmuludq	%ymm12,%ymm14,%ymm14
445	shrq	$29,%r12
446	vmovdqu	288-16-128(%r13),%ymm10
447	addq	%r12,%rax
448	vpaddq	%ymm14,%ymm7,%ymm7
449	vpmuludq	%ymm12,%ymm11,%ymm11
450
451	movq	%rax,%r9
452	imull	%ecx,%eax
453	vpaddq	%ymm11,%ymm8,%ymm8
454	vpmuludq	%ymm12,%ymm10,%ymm10
455	andl	$0x1fffffff,%eax
456	vmovd	%eax,%xmm12
457	vmovdqu	96-24-128(%r13),%ymm11
458.byte	0x67
459	vpaddq	%ymm10,%ymm9,%ymm9
460	vpbroadcastq	%xmm12,%ymm12
461
462	vpmuludq	64-24-128(%r13),%ymm0,%ymm14
463	vmovdqu	128-24-128(%r13),%ymm10
464	movq	%rax,%rdx
465	imulq	-128(%r13),%rax
466	movq	8(%rsp),%r10
467	vpaddq	%ymm14,%ymm2,%ymm1
468	vpmuludq	%ymm0,%ymm11,%ymm11
469	vmovdqu	160-24-128(%r13),%ymm14
470	addq	%rax,%r9
471	movq	%rdx,%rax
472	imulq	8-128(%r13),%rax
473.byte	0x67
474	shrq	$29,%r9
475	movq	16(%rsp),%r11
476	vpaddq	%ymm11,%ymm3,%ymm2
477	vpmuludq	%ymm0,%ymm10,%ymm10
478	vmovdqu	192-24-128(%r13),%ymm11
479	addq	%rax,%r10
480	movq	%rdx,%rax
481	imulq	16-128(%r13),%rax
482	vpaddq	%ymm10,%ymm4,%ymm3
483	vpmuludq	%ymm0,%ymm14,%ymm14
484	vmovdqu	224-24-128(%r13),%ymm10
485	imulq	24-128(%r13),%rdx
486	addq	%rax,%r11
487	leaq	(%r9,%r10,1),%rax
488	vpaddq	%ymm14,%ymm5,%ymm4
489	vpmuludq	%ymm0,%ymm11,%ymm11
490	vmovdqu	256-24-128(%r13),%ymm14
491	movq	%rax,%r10
492	imull	%ecx,%eax
493	vpmuludq	%ymm0,%ymm10,%ymm10
494	vpaddq	%ymm11,%ymm6,%ymm5
495	vmovdqu	288-24-128(%r13),%ymm11
496	andl	$0x1fffffff,%eax
497	vpaddq	%ymm10,%ymm7,%ymm6
498	vpmuludq	%ymm0,%ymm14,%ymm14
499	addq	24(%rsp),%rdx
500	vpaddq	%ymm14,%ymm8,%ymm7
501	vpmuludq	%ymm0,%ymm11,%ymm11
502	vpaddq	%ymm11,%ymm9,%ymm8
503	vmovq	%r12,%xmm9
504	movq	%rdx,%r12
505
506	decl	%r14d
507	jnz	.LOOP_REDUCE_1024
508	leaq	448(%rsp),%r12
509	vpaddq	%ymm9,%ymm13,%ymm0
510	vpxor	%ymm9,%ymm9,%ymm9
511
512	vpaddq	288-192(%rbx),%ymm0,%ymm0
513	vpaddq	320-448(%r12),%ymm1,%ymm1
514	vpaddq	352-448(%r12),%ymm2,%ymm2
515	vpaddq	384-448(%r12),%ymm3,%ymm3
516	vpaddq	416-448(%r12),%ymm4,%ymm4
517	vpaddq	448-448(%r12),%ymm5,%ymm5
518	vpaddq	480-448(%r12),%ymm6,%ymm6
519	vpaddq	512-448(%r12),%ymm7,%ymm7
520	vpaddq	544-448(%r12),%ymm8,%ymm8
521
522	vpsrlq	$29,%ymm0,%ymm14
523	vpand	%ymm15,%ymm0,%ymm0
524	vpsrlq	$29,%ymm1,%ymm11
525	vpand	%ymm15,%ymm1,%ymm1
526	vpsrlq	$29,%ymm2,%ymm12
527	vpermq	$0x93,%ymm14,%ymm14
528	vpand	%ymm15,%ymm2,%ymm2
529	vpsrlq	$29,%ymm3,%ymm13
530	vpermq	$0x93,%ymm11,%ymm11
531	vpand	%ymm15,%ymm3,%ymm3
532	vpermq	$0x93,%ymm12,%ymm12
533
534	vpblendd	$3,%ymm9,%ymm14,%ymm10
535	vpermq	$0x93,%ymm13,%ymm13
536	vpblendd	$3,%ymm14,%ymm11,%ymm14
537	vpaddq	%ymm10,%ymm0,%ymm0
538	vpblendd	$3,%ymm11,%ymm12,%ymm11
539	vpaddq	%ymm14,%ymm1,%ymm1
540	vpblendd	$3,%ymm12,%ymm13,%ymm12
541	vpaddq	%ymm11,%ymm2,%ymm2
542	vpblendd	$3,%ymm13,%ymm9,%ymm13
543	vpaddq	%ymm12,%ymm3,%ymm3
544	vpaddq	%ymm13,%ymm4,%ymm4
545
546	vpsrlq	$29,%ymm0,%ymm14
547	vpand	%ymm15,%ymm0,%ymm0
548	vpsrlq	$29,%ymm1,%ymm11
549	vpand	%ymm15,%ymm1,%ymm1
550	vpsrlq	$29,%ymm2,%ymm12
551	vpermq	$0x93,%ymm14,%ymm14
552	vpand	%ymm15,%ymm2,%ymm2
553	vpsrlq	$29,%ymm3,%ymm13
554	vpermq	$0x93,%ymm11,%ymm11
555	vpand	%ymm15,%ymm3,%ymm3
556	vpermq	$0x93,%ymm12,%ymm12
557
558	vpblendd	$3,%ymm9,%ymm14,%ymm10
559	vpermq	$0x93,%ymm13,%ymm13
560	vpblendd	$3,%ymm14,%ymm11,%ymm14
561	vpaddq	%ymm10,%ymm0,%ymm0
562	vpblendd	$3,%ymm11,%ymm12,%ymm11
563	vpaddq	%ymm14,%ymm1,%ymm1
564	vmovdqu	%ymm0,0-128(%rdi)
565	vpblendd	$3,%ymm12,%ymm13,%ymm12
566	vpaddq	%ymm11,%ymm2,%ymm2
567	vmovdqu	%ymm1,32-128(%rdi)
568	vpblendd	$3,%ymm13,%ymm9,%ymm13
569	vpaddq	%ymm12,%ymm3,%ymm3
570	vmovdqu	%ymm2,64-128(%rdi)
571	vpaddq	%ymm13,%ymm4,%ymm4
572	vmovdqu	%ymm3,96-128(%rdi)
573	vpsrlq	$29,%ymm4,%ymm14
574	vpand	%ymm15,%ymm4,%ymm4
575	vpsrlq	$29,%ymm5,%ymm11
576	vpand	%ymm15,%ymm5,%ymm5
577	vpsrlq	$29,%ymm6,%ymm12
578	vpermq	$0x93,%ymm14,%ymm14
579	vpand	%ymm15,%ymm6,%ymm6
580	vpsrlq	$29,%ymm7,%ymm13
581	vpermq	$0x93,%ymm11,%ymm11
582	vpand	%ymm15,%ymm7,%ymm7
583	vpsrlq	$29,%ymm8,%ymm0
584	vpermq	$0x93,%ymm12,%ymm12
585	vpand	%ymm15,%ymm8,%ymm8
586	vpermq	$0x93,%ymm13,%ymm13
587
588	vpblendd	$3,%ymm9,%ymm14,%ymm10
589	vpermq	$0x93,%ymm0,%ymm0
590	vpblendd	$3,%ymm14,%ymm11,%ymm14
591	vpaddq	%ymm10,%ymm4,%ymm4
592	vpblendd	$3,%ymm11,%ymm12,%ymm11
593	vpaddq	%ymm14,%ymm5,%ymm5
594	vpblendd	$3,%ymm12,%ymm13,%ymm12
595	vpaddq	%ymm11,%ymm6,%ymm6
596	vpblendd	$3,%ymm13,%ymm0,%ymm13
597	vpaddq	%ymm12,%ymm7,%ymm7
598	vpaddq	%ymm13,%ymm8,%ymm8
599
600	vpsrlq	$29,%ymm4,%ymm14
601	vpand	%ymm15,%ymm4,%ymm4
602	vpsrlq	$29,%ymm5,%ymm11
603	vpand	%ymm15,%ymm5,%ymm5
604	vpsrlq	$29,%ymm6,%ymm12
605	vpermq	$0x93,%ymm14,%ymm14
606	vpand	%ymm15,%ymm6,%ymm6
607	vpsrlq	$29,%ymm7,%ymm13
608	vpermq	$0x93,%ymm11,%ymm11
609	vpand	%ymm15,%ymm7,%ymm7
610	vpsrlq	$29,%ymm8,%ymm0
611	vpermq	$0x93,%ymm12,%ymm12
612	vpand	%ymm15,%ymm8,%ymm8
613	vpermq	$0x93,%ymm13,%ymm13
614
615	vpblendd	$3,%ymm9,%ymm14,%ymm10
616	vpermq	$0x93,%ymm0,%ymm0
617	vpblendd	$3,%ymm14,%ymm11,%ymm14
618	vpaddq	%ymm10,%ymm4,%ymm4
619	vpblendd	$3,%ymm11,%ymm12,%ymm11
620	vpaddq	%ymm14,%ymm5,%ymm5
621	vmovdqu	%ymm4,128-128(%rdi)
622	vpblendd	$3,%ymm12,%ymm13,%ymm12
623	vpaddq	%ymm11,%ymm6,%ymm6
624	vmovdqu	%ymm5,160-128(%rdi)
625	vpblendd	$3,%ymm13,%ymm0,%ymm13
626	vpaddq	%ymm12,%ymm7,%ymm7
627	vmovdqu	%ymm6,192-128(%rdi)
628	vpaddq	%ymm13,%ymm8,%ymm8
629	vmovdqu	%ymm7,224-128(%rdi)
630	vmovdqu	%ymm8,256-128(%rdi)
631
632	movq	%rdi,%rsi
633	decl	%r8d
634	jne	.LOOP_GRANDE_SQR_1024
635
636	vzeroall
637	movq	%rbp,%rax
638.cfi_def_cfa_register	%rax
639	movq	-48(%rax),%r15
640.cfi_restore	%r15
641	movq	-40(%rax),%r14
642.cfi_restore	%r14
643	movq	-32(%rax),%r13
644.cfi_restore	%r13
645	movq	-24(%rax),%r12
646.cfi_restore	%r12
647	movq	-16(%rax),%rbp
648.cfi_restore	%rbp
649	movq	-8(%rax),%rbx
650.cfi_restore	%rbx
651	leaq	(%rax),%rsp
652.cfi_def_cfa_register	%rsp
653.Lsqr_1024_epilogue:
654	.byte	0xf3,0xc3
655.cfi_endproc
656.size	rsaz_1024_sqr_avx2,.-rsaz_1024_sqr_avx2
657.globl	rsaz_1024_mul_avx2
658.type	rsaz_1024_mul_avx2,@function
659.align	64
660rsaz_1024_mul_avx2:
661.cfi_startproc
662	leaq	(%rsp),%rax
663.cfi_def_cfa_register	%rax
664	pushq	%rbx
665.cfi_offset	%rbx,-16
666	pushq	%rbp
667.cfi_offset	%rbp,-24
668	pushq	%r12
669.cfi_offset	%r12,-32
670	pushq	%r13
671.cfi_offset	%r13,-40
672	pushq	%r14
673.cfi_offset	%r14,-48
674	pushq	%r15
675.cfi_offset	%r15,-56
676	movq	%rax,%rbp
677.cfi_def_cfa_register	%rbp
678	vzeroall
679	movq	%rdx,%r13
680	subq	$64,%rsp
681
682
683
684
685
686
687.byte	0x67,0x67
688	movq	%rsi,%r15
689	andq	$4095,%r15
690	addq	$320,%r15
691	shrq	$12,%r15
692	movq	%rsi,%r15
693	cmovnzq	%r13,%rsi
694	cmovnzq	%r15,%r13
695
696	movq	%rcx,%r15
697	subq	$-128,%rsi
698	subq	$-128,%rcx
699	subq	$-128,%rdi
700
701	andq	$4095,%r15
702	addq	$320,%r15
703.byte	0x67,0x67
704	shrq	$12,%r15
705	jz	.Lmul_1024_no_n_copy
706
707
708
709
710
711	subq	$320,%rsp
712	vmovdqu	0-128(%rcx),%ymm0
713	andq	$-512,%rsp
714	vmovdqu	32-128(%rcx),%ymm1
715	vmovdqu	64-128(%rcx),%ymm2
716	vmovdqu	96-128(%rcx),%ymm3
717	vmovdqu	128-128(%rcx),%ymm4
718	vmovdqu	160-128(%rcx),%ymm5
719	vmovdqu	192-128(%rcx),%ymm6
720	vmovdqu	224-128(%rcx),%ymm7
721	vmovdqu	256-128(%rcx),%ymm8
722	leaq	64+128(%rsp),%rcx
723	vmovdqu	%ymm0,0-128(%rcx)
724	vpxor	%ymm0,%ymm0,%ymm0
725	vmovdqu	%ymm1,32-128(%rcx)
726	vpxor	%ymm1,%ymm1,%ymm1
727	vmovdqu	%ymm2,64-128(%rcx)
728	vpxor	%ymm2,%ymm2,%ymm2
729	vmovdqu	%ymm3,96-128(%rcx)
730	vpxor	%ymm3,%ymm3,%ymm3
731	vmovdqu	%ymm4,128-128(%rcx)
732	vpxor	%ymm4,%ymm4,%ymm4
733	vmovdqu	%ymm5,160-128(%rcx)
734	vpxor	%ymm5,%ymm5,%ymm5
735	vmovdqu	%ymm6,192-128(%rcx)
736	vpxor	%ymm6,%ymm6,%ymm6
737	vmovdqu	%ymm7,224-128(%rcx)
738	vpxor	%ymm7,%ymm7,%ymm7
739	vmovdqu	%ymm8,256-128(%rcx)
740	vmovdqa	%ymm0,%ymm8
741	vmovdqu	%ymm9,288-128(%rcx)
742.Lmul_1024_no_n_copy:
743	andq	$-64,%rsp
744
745	movq	(%r13),%rbx
746	vpbroadcastq	(%r13),%ymm10
747	vmovdqu	%ymm0,(%rsp)
748	xorq	%r9,%r9
749.byte	0x67
750	xorq	%r10,%r10
751	xorq	%r11,%r11
752	xorq	%r12,%r12
753
754	vmovdqu	.Land_mask(%rip),%ymm15
755	movl	$9,%r14d
756	vmovdqu	%ymm9,288-128(%rdi)
757	jmp	.Loop_mul_1024
758
759.align	32
760.Loop_mul_1024:
761	vpsrlq	$29,%ymm3,%ymm9
762	movq	%rbx,%rax
763	imulq	-128(%rsi),%rax
764	addq	%r9,%rax
765	movq	%rbx,%r10
766	imulq	8-128(%rsi),%r10
767	addq	8(%rsp),%r10
768
769	movq	%rax,%r9
770	imull	%r8d,%eax
771	andl	$0x1fffffff,%eax
772
773	movq	%rbx,%r11
774	imulq	16-128(%rsi),%r11
775	addq	16(%rsp),%r11
776
777	movq	%rbx,%r12
778	imulq	24-128(%rsi),%r12
779	addq	24(%rsp),%r12
780	vpmuludq	32-128(%rsi),%ymm10,%ymm0
781	vmovd	%eax,%xmm11
782	vpaddq	%ymm0,%ymm1,%ymm1
783	vpmuludq	64-128(%rsi),%ymm10,%ymm12
784	vpbroadcastq	%xmm11,%ymm11
785	vpaddq	%ymm12,%ymm2,%ymm2
786	vpmuludq	96-128(%rsi),%ymm10,%ymm13
787	vpand	%ymm15,%ymm3,%ymm3
788	vpaddq	%ymm13,%ymm3,%ymm3
789	vpmuludq	128-128(%rsi),%ymm10,%ymm0
790	vpaddq	%ymm0,%ymm4,%ymm4
791	vpmuludq	160-128(%rsi),%ymm10,%ymm12
792	vpaddq	%ymm12,%ymm5,%ymm5
793	vpmuludq	192-128(%rsi),%ymm10,%ymm13
794	vpaddq	%ymm13,%ymm6,%ymm6
795	vpmuludq	224-128(%rsi),%ymm10,%ymm0
796	vpermq	$0x93,%ymm9,%ymm9
797	vpaddq	%ymm0,%ymm7,%ymm7
798	vpmuludq	256-128(%rsi),%ymm10,%ymm12
799	vpbroadcastq	8(%r13),%ymm10
800	vpaddq	%ymm12,%ymm8,%ymm8
801
802	movq	%rax,%rdx
803	imulq	-128(%rcx),%rax
804	addq	%rax,%r9
805	movq	%rdx,%rax
806	imulq	8-128(%rcx),%rax
807	addq	%rax,%r10
808	movq	%rdx,%rax
809	imulq	16-128(%rcx),%rax
810	addq	%rax,%r11
811	shrq	$29,%r9
812	imulq	24-128(%rcx),%rdx
813	addq	%rdx,%r12
814	addq	%r9,%r10
815
816	vpmuludq	32-128(%rcx),%ymm11,%ymm13
817	vmovq	%xmm10,%rbx
818	vpaddq	%ymm13,%ymm1,%ymm1
819	vpmuludq	64-128(%rcx),%ymm11,%ymm0
820	vpaddq	%ymm0,%ymm2,%ymm2
821	vpmuludq	96-128(%rcx),%ymm11,%ymm12
822	vpaddq	%ymm12,%ymm3,%ymm3
823	vpmuludq	128-128(%rcx),%ymm11,%ymm13
824	vpaddq	%ymm13,%ymm4,%ymm4
825	vpmuludq	160-128(%rcx),%ymm11,%ymm0
826	vpaddq	%ymm0,%ymm5,%ymm5
827	vpmuludq	192-128(%rcx),%ymm11,%ymm12
828	vpaddq	%ymm12,%ymm6,%ymm6
829	vpmuludq	224-128(%rcx),%ymm11,%ymm13
830	vpblendd	$3,%ymm14,%ymm9,%ymm12
831	vpaddq	%ymm13,%ymm7,%ymm7
832	vpmuludq	256-128(%rcx),%ymm11,%ymm0
833	vpaddq	%ymm12,%ymm3,%ymm3
834	vpaddq	%ymm0,%ymm8,%ymm8
835
836	movq	%rbx,%rax
837	imulq	-128(%rsi),%rax
838	addq	%rax,%r10
839	vmovdqu	-8+32-128(%rsi),%ymm12
840	movq	%rbx,%rax
841	imulq	8-128(%rsi),%rax
842	addq	%rax,%r11
843	vmovdqu	-8+64-128(%rsi),%ymm13
844
845	movq	%r10,%rax
846	vpblendd	$0xfc,%ymm14,%ymm9,%ymm9
847	imull	%r8d,%eax
848	vpaddq	%ymm9,%ymm4,%ymm4
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	.Loop_mul_1024
1077	vpaddq	(%rsp),%ymm12,%ymm0
1078
1079	vpsrlq	$29,%ymm0,%ymm12
1080	vpand	%ymm15,%ymm0,%ymm0
1081	vpsrlq	$29,%ymm1,%ymm13
1082	vpand	%ymm15,%ymm1,%ymm1
1083	vpsrlq	$29,%ymm2,%ymm10
1084	vpermq	$0x93,%ymm12,%ymm12
1085	vpand	%ymm15,%ymm2,%ymm2
1086	vpsrlq	$29,%ymm3,%ymm11
1087	vpermq	$0x93,%ymm13,%ymm13
1088	vpand	%ymm15,%ymm3,%ymm3
1089
1090	vpblendd	$3,%ymm14,%ymm12,%ymm9
1091	vpermq	$0x93,%ymm10,%ymm10
1092	vpblendd	$3,%ymm12,%ymm13,%ymm12
1093	vpermq	$0x93,%ymm11,%ymm11
1094	vpaddq	%ymm9,%ymm0,%ymm0
1095	vpblendd	$3,%ymm13,%ymm10,%ymm13
1096	vpaddq	%ymm12,%ymm1,%ymm1
1097	vpblendd	$3,%ymm10,%ymm11,%ymm10
1098	vpaddq	%ymm13,%ymm2,%ymm2
1099	vpblendd	$3,%ymm11,%ymm14,%ymm11
1100	vpaddq	%ymm10,%ymm3,%ymm3
1101	vpaddq	%ymm11,%ymm4,%ymm4
1102
1103	vpsrlq	$29,%ymm0,%ymm12
1104	vpand	%ymm15,%ymm0,%ymm0
1105	vpsrlq	$29,%ymm1,%ymm13
1106	vpand	%ymm15,%ymm1,%ymm1
1107	vpsrlq	$29,%ymm2,%ymm10
1108	vpermq	$0x93,%ymm12,%ymm12
1109	vpand	%ymm15,%ymm2,%ymm2
1110	vpsrlq	$29,%ymm3,%ymm11
1111	vpermq	$0x93,%ymm13,%ymm13
1112	vpand	%ymm15,%ymm3,%ymm3
1113	vpermq	$0x93,%ymm10,%ymm10
1114
1115	vpblendd	$3,%ymm14,%ymm12,%ymm9
1116	vpermq	$0x93,%ymm11,%ymm11
1117	vpblendd	$3,%ymm12,%ymm13,%ymm12
1118	vpaddq	%ymm9,%ymm0,%ymm0
1119	vpblendd	$3,%ymm13,%ymm10,%ymm13
1120	vpaddq	%ymm12,%ymm1,%ymm1
1121	vpblendd	$3,%ymm10,%ymm11,%ymm10
1122	vpaddq	%ymm13,%ymm2,%ymm2
1123	vpblendd	$3,%ymm11,%ymm14,%ymm11
1124	vpaddq	%ymm10,%ymm3,%ymm3
1125	vpaddq	%ymm11,%ymm4,%ymm4
1126
1127	vmovdqu	%ymm0,0-128(%rdi)
1128	vmovdqu	%ymm1,32-128(%rdi)
1129	vmovdqu	%ymm2,64-128(%rdi)
1130	vmovdqu	%ymm3,96-128(%rdi)
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	vpsrlq	$29,%ymm4,%ymm12
1159	vpand	%ymm15,%ymm4,%ymm4
1160	vpsrlq	$29,%ymm5,%ymm13
1161	vpand	%ymm15,%ymm5,%ymm5
1162	vpsrlq	$29,%ymm6,%ymm10
1163	vpermq	$0x93,%ymm12,%ymm12
1164	vpand	%ymm15,%ymm6,%ymm6
1165	vpsrlq	$29,%ymm7,%ymm11
1166	vpermq	$0x93,%ymm13,%ymm13
1167	vpand	%ymm15,%ymm7,%ymm7
1168	vpsrlq	$29,%ymm8,%ymm0
1169	vpermq	$0x93,%ymm10,%ymm10
1170	vpand	%ymm15,%ymm8,%ymm8
1171	vpermq	$0x93,%ymm11,%ymm11
1172
1173	vpblendd	$3,%ymm14,%ymm12,%ymm9
1174	vpermq	$0x93,%ymm0,%ymm0
1175	vpblendd	$3,%ymm12,%ymm13,%ymm12
1176	vpaddq	%ymm9,%ymm4,%ymm4
1177	vpblendd	$3,%ymm13,%ymm10,%ymm13
1178	vpaddq	%ymm12,%ymm5,%ymm5
1179	vpblendd	$3,%ymm10,%ymm11,%ymm10
1180	vpaddq	%ymm13,%ymm6,%ymm6
1181	vpblendd	$3,%ymm11,%ymm0,%ymm11
1182	vpaddq	%ymm10,%ymm7,%ymm7
1183	vpaddq	%ymm11,%ymm8,%ymm8
1184
1185	vmovdqu	%ymm4,128-128(%rdi)
1186	vmovdqu	%ymm5,160-128(%rdi)
1187	vmovdqu	%ymm6,192-128(%rdi)
1188	vmovdqu	%ymm7,224-128(%rdi)
1189	vmovdqu	%ymm8,256-128(%rdi)
1190	vzeroupper
1191
1192	movq	%rbp,%rax
1193.cfi_def_cfa_register	%rax
1194	movq	-48(%rax),%r15
1195.cfi_restore	%r15
1196	movq	-40(%rax),%r14
1197.cfi_restore	%r14
1198	movq	-32(%rax),%r13
1199.cfi_restore	%r13
1200	movq	-24(%rax),%r12
1201.cfi_restore	%r12
1202	movq	-16(%rax),%rbp
1203.cfi_restore	%rbp
1204	movq	-8(%rax),%rbx
1205.cfi_restore	%rbx
1206	leaq	(%rax),%rsp
1207.cfi_def_cfa_register	%rsp
1208.Lmul_1024_epilogue:
1209	.byte	0xf3,0xc3
1210.cfi_endproc
1211.size	rsaz_1024_mul_avx2,.-rsaz_1024_mul_avx2
1212.globl	rsaz_1024_red2norm_avx2
1213.type	rsaz_1024_red2norm_avx2,@function
1214.align	32
1215rsaz_1024_red2norm_avx2:
1216.cfi_startproc
1217	subq	$-128,%rsi
1218	xorq	%rax,%rax
1219	movq	-128(%rsi),%r8
1220	movq	-120(%rsi),%r9
1221	movq	-112(%rsi),%r10
1222	shlq	$0,%r8
1223	shlq	$29,%r9
1224	movq	%r10,%r11
1225	shlq	$58,%r10
1226	shrq	$6,%r11
1227	addq	%r8,%rax
1228	addq	%r9,%rax
1229	addq	%r10,%rax
1230	adcq	$0,%r11
1231	movq	%rax,0(%rdi)
1232	movq	%r11,%rax
1233	movq	-104(%rsi),%r8
1234	movq	-96(%rsi),%r9
1235	shlq	$23,%r8
1236	movq	%r9,%r10
1237	shlq	$52,%r9
1238	shrq	$12,%r10
1239	addq	%r8,%rax
1240	addq	%r9,%rax
1241	adcq	$0,%r10
1242	movq	%rax,8(%rdi)
1243	movq	%r10,%rax
1244	movq	-88(%rsi),%r11
1245	movq	-80(%rsi),%r8
1246	shlq	$17,%r11
1247	movq	%r8,%r9
1248	shlq	$46,%r8
1249	shrq	$18,%r9
1250	addq	%r11,%rax
1251	addq	%r8,%rax
1252	adcq	$0,%r9
1253	movq	%rax,16(%rdi)
1254	movq	%r9,%rax
1255	movq	-72(%rsi),%r10
1256	movq	-64(%rsi),%r11
1257	shlq	$11,%r10
1258	movq	%r11,%r8
1259	shlq	$40,%r11
1260	shrq	$24,%r8
1261	addq	%r10,%rax
1262	addq	%r11,%rax
1263	adcq	$0,%r8
1264	movq	%rax,24(%rdi)
1265	movq	%r8,%rax
1266	movq	-56(%rsi),%r9
1267	movq	-48(%rsi),%r10
1268	movq	-40(%rsi),%r11
1269	shlq	$5,%r9
1270	shlq	$34,%r10
1271	movq	%r11,%r8
1272	shlq	$63,%r11
1273	shrq	$1,%r8
1274	addq	%r9,%rax
1275	addq	%r10,%rax
1276	addq	%r11,%rax
1277	adcq	$0,%r8
1278	movq	%rax,32(%rdi)
1279	movq	%r8,%rax
1280	movq	-32(%rsi),%r9
1281	movq	-24(%rsi),%r10
1282	shlq	$28,%r9
1283	movq	%r10,%r11
1284	shlq	$57,%r10
1285	shrq	$7,%r11
1286	addq	%r9,%rax
1287	addq	%r10,%rax
1288	adcq	$0,%r11
1289	movq	%rax,40(%rdi)
1290	movq	%r11,%rax
1291	movq	-16(%rsi),%r8
1292	movq	-8(%rsi),%r9
1293	shlq	$22,%r8
1294	movq	%r9,%r10
1295	shlq	$51,%r9
1296	shrq	$13,%r10
1297	addq	%r8,%rax
1298	addq	%r9,%rax
1299	adcq	$0,%r10
1300	movq	%rax,48(%rdi)
1301	movq	%r10,%rax
1302	movq	0(%rsi),%r11
1303	movq	8(%rsi),%r8
1304	shlq	$16,%r11
1305	movq	%r8,%r9
1306	shlq	$45,%r8
1307	shrq	$19,%r9
1308	addq	%r11,%rax
1309	addq	%r8,%rax
1310	adcq	$0,%r9
1311	movq	%rax,56(%rdi)
1312	movq	%r9,%rax
1313	movq	16(%rsi),%r10
1314	movq	24(%rsi),%r11
1315	shlq	$10,%r10
1316	movq	%r11,%r8
1317	shlq	$39,%r11
1318	shrq	$25,%r8
1319	addq	%r10,%rax
1320	addq	%r11,%rax
1321	adcq	$0,%r8
1322	movq	%rax,64(%rdi)
1323	movq	%r8,%rax
1324	movq	32(%rsi),%r9
1325	movq	40(%rsi),%r10
1326	movq	48(%rsi),%r11
1327	shlq	$4,%r9
1328	shlq	$33,%r10
1329	movq	%r11,%r8
1330	shlq	$62,%r11
1331	shrq	$2,%r8
1332	addq	%r9,%rax
1333	addq	%r10,%rax
1334	addq	%r11,%rax
1335	adcq	$0,%r8
1336	movq	%rax,72(%rdi)
1337	movq	%r8,%rax
1338	movq	56(%rsi),%r9
1339	movq	64(%rsi),%r10
1340	shlq	$27,%r9
1341	movq	%r10,%r11
1342	shlq	$56,%r10
1343	shrq	$8,%r11
1344	addq	%r9,%rax
1345	addq	%r10,%rax
1346	adcq	$0,%r11
1347	movq	%rax,80(%rdi)
1348	movq	%r11,%rax
1349	movq	72(%rsi),%r8
1350	movq	80(%rsi),%r9
1351	shlq	$21,%r8
1352	movq	%r9,%r10
1353	shlq	$50,%r9
1354	shrq	$14,%r10
1355	addq	%r8,%rax
1356	addq	%r9,%rax
1357	adcq	$0,%r10
1358	movq	%rax,88(%rdi)
1359	movq	%r10,%rax
1360	movq	88(%rsi),%r11
1361	movq	96(%rsi),%r8
1362	shlq	$15,%r11
1363	movq	%r8,%r9
1364	shlq	$44,%r8
1365	shrq	$20,%r9
1366	addq	%r11,%rax
1367	addq	%r8,%rax
1368	adcq	$0,%r9
1369	movq	%rax,96(%rdi)
1370	movq	%r9,%rax
1371	movq	104(%rsi),%r10
1372	movq	112(%rsi),%r11
1373	shlq	$9,%r10
1374	movq	%r11,%r8
1375	shlq	$38,%r11
1376	shrq	$26,%r8
1377	addq	%r10,%rax
1378	addq	%r11,%rax
1379	adcq	$0,%r8
1380	movq	%rax,104(%rdi)
1381	movq	%r8,%rax
1382	movq	120(%rsi),%r9
1383	movq	128(%rsi),%r10
1384	movq	136(%rsi),%r11
1385	shlq	$3,%r9
1386	shlq	$32,%r10
1387	movq	%r11,%r8
1388	shlq	$61,%r11
1389	shrq	$3,%r8
1390	addq	%r9,%rax
1391	addq	%r10,%rax
1392	addq	%r11,%rax
1393	adcq	$0,%r8
1394	movq	%rax,112(%rdi)
1395	movq	%r8,%rax
1396	movq	144(%rsi),%r9
1397	movq	152(%rsi),%r10
1398	shlq	$26,%r9
1399	movq	%r10,%r11
1400	shlq	$55,%r10
1401	shrq	$9,%r11
1402	addq	%r9,%rax
1403	addq	%r10,%rax
1404	adcq	$0,%r11
1405	movq	%rax,120(%rdi)
1406	movq	%r11,%rax
1407	.byte	0xf3,0xc3
1408.cfi_endproc
1409.size	rsaz_1024_red2norm_avx2,.-rsaz_1024_red2norm_avx2
1410
1411.globl	rsaz_1024_norm2red_avx2
1412.type	rsaz_1024_norm2red_avx2,@function
1413.align	32
1414rsaz_1024_norm2red_avx2:
1415.cfi_startproc
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.cfi_endproc
1569.size	rsaz_1024_norm2red_avx2,.-rsaz_1024_norm2red_avx2
1570.globl	rsaz_1024_scatter5_avx2
1571.type	rsaz_1024_scatter5_avx2,@function
1572.align	32
1573rsaz_1024_scatter5_avx2:
1574.cfi_startproc
1575	vzeroupper
1576	vmovdqu	.Lscatter_permd(%rip),%ymm5
1577	shll	$4,%edx
1578	leaq	(%rdi,%rdx,1),%rdi
1579	movl	$9,%eax
1580	jmp	.Loop_scatter_1024
1581
1582.align	32
1583.Loop_scatter_1024:
1584	vmovdqu	(%rsi),%ymm0
1585	leaq	32(%rsi),%rsi
1586	vpermd	%ymm0,%ymm5,%ymm0
1587	vmovdqu	%xmm0,(%rdi)
1588	leaq	512(%rdi),%rdi
1589	decl	%eax
1590	jnz	.Loop_scatter_1024
1591
1592	vzeroupper
1593	.byte	0xf3,0xc3
1594.cfi_endproc
1595.size	rsaz_1024_scatter5_avx2,.-rsaz_1024_scatter5_avx2
1596
1597.globl	rsaz_1024_gather5_avx2
1598.type	rsaz_1024_gather5_avx2,@function
1599.align	32
1600rsaz_1024_gather5_avx2:
1601.cfi_startproc
1602	vzeroupper
1603	movq	%rsp,%r11
1604.cfi_def_cfa_register	%r11
1605	leaq	-256(%rsp),%rsp
1606	andq	$-32,%rsp
1607	leaq	.Linc(%rip),%r10
1608	leaq	-128(%rsp),%rax
1609
1610	vmovd	%edx,%xmm4
1611	vmovdqa	(%r10),%ymm0
1612	vmovdqa	32(%r10),%ymm1
1613	vmovdqa	64(%r10),%ymm5
1614	vpbroadcastd	%xmm4,%ymm4
1615
1616	vpaddd	%ymm5,%ymm0,%ymm2
1617	vpcmpeqd	%ymm4,%ymm0,%ymm0
1618	vpaddd	%ymm5,%ymm1,%ymm3
1619	vpcmpeqd	%ymm4,%ymm1,%ymm1
1620	vmovdqa	%ymm0,0+128(%rax)
1621	vpaddd	%ymm5,%ymm2,%ymm0
1622	vpcmpeqd	%ymm4,%ymm2,%ymm2
1623	vmovdqa	%ymm1,32+128(%rax)
1624	vpaddd	%ymm5,%ymm3,%ymm1
1625	vpcmpeqd	%ymm4,%ymm3,%ymm3
1626	vmovdqa	%ymm2,64+128(%rax)
1627	vpaddd	%ymm5,%ymm0,%ymm2
1628	vpcmpeqd	%ymm4,%ymm0,%ymm0
1629	vmovdqa	%ymm3,96+128(%rax)
1630	vpaddd	%ymm5,%ymm1,%ymm3
1631	vpcmpeqd	%ymm4,%ymm1,%ymm1
1632	vmovdqa	%ymm0,128+128(%rax)
1633	vpaddd	%ymm5,%ymm2,%ymm8
1634	vpcmpeqd	%ymm4,%ymm2,%ymm2
1635	vmovdqa	%ymm1,160+128(%rax)
1636	vpaddd	%ymm5,%ymm3,%ymm9
1637	vpcmpeqd	%ymm4,%ymm3,%ymm3
1638	vmovdqa	%ymm2,192+128(%rax)
1639	vpaddd	%ymm5,%ymm8,%ymm10
1640	vpcmpeqd	%ymm4,%ymm8,%ymm8
1641	vmovdqa	%ymm3,224+128(%rax)
1642	vpaddd	%ymm5,%ymm9,%ymm11
1643	vpcmpeqd	%ymm4,%ymm9,%ymm9
1644	vpaddd	%ymm5,%ymm10,%ymm12
1645	vpcmpeqd	%ymm4,%ymm10,%ymm10
1646	vpaddd	%ymm5,%ymm11,%ymm13
1647	vpcmpeqd	%ymm4,%ymm11,%ymm11
1648	vpaddd	%ymm5,%ymm12,%ymm14
1649	vpcmpeqd	%ymm4,%ymm12,%ymm12
1650	vpaddd	%ymm5,%ymm13,%ymm15
1651	vpcmpeqd	%ymm4,%ymm13,%ymm13
1652	vpcmpeqd	%ymm4,%ymm14,%ymm14
1653	vpcmpeqd	%ymm4,%ymm15,%ymm15
1654
1655	vmovdqa	-32(%r10),%ymm7
1656	leaq	128(%rsi),%rsi
1657	movl	$9,%edx
1658
1659.Loop_gather_1024:
1660	vmovdqa	0-128(%rsi),%ymm0
1661	vmovdqa	32-128(%rsi),%ymm1
1662	vmovdqa	64-128(%rsi),%ymm2
1663	vmovdqa	96-128(%rsi),%ymm3
1664	vpand	0+128(%rax),%ymm0,%ymm0
1665	vpand	32+128(%rax),%ymm1,%ymm1
1666	vpand	64+128(%rax),%ymm2,%ymm2
1667	vpor	%ymm0,%ymm1,%ymm4
1668	vpand	96+128(%rax),%ymm3,%ymm3
1669	vmovdqa	128-128(%rsi),%ymm0
1670	vmovdqa	160-128(%rsi),%ymm1
1671	vpor	%ymm2,%ymm3,%ymm5
1672	vmovdqa	192-128(%rsi),%ymm2
1673	vmovdqa	224-128(%rsi),%ymm3
1674	vpand	128+128(%rax),%ymm0,%ymm0
1675	vpand	160+128(%rax),%ymm1,%ymm1
1676	vpand	192+128(%rax),%ymm2,%ymm2
1677	vpor	%ymm0,%ymm4,%ymm4
1678	vpand	224+128(%rax),%ymm3,%ymm3
1679	vpand	256-128(%rsi),%ymm8,%ymm0
1680	vpor	%ymm1,%ymm5,%ymm5
1681	vpand	288-128(%rsi),%ymm9,%ymm1
1682	vpor	%ymm2,%ymm4,%ymm4
1683	vpand	320-128(%rsi),%ymm10,%ymm2
1684	vpor	%ymm3,%ymm5,%ymm5
1685	vpand	352-128(%rsi),%ymm11,%ymm3
1686	vpor	%ymm0,%ymm4,%ymm4
1687	vpand	384-128(%rsi),%ymm12,%ymm0
1688	vpor	%ymm1,%ymm5,%ymm5
1689	vpand	416-128(%rsi),%ymm13,%ymm1
1690	vpor	%ymm2,%ymm4,%ymm4
1691	vpand	448-128(%rsi),%ymm14,%ymm2
1692	vpor	%ymm3,%ymm5,%ymm5
1693	vpand	480-128(%rsi),%ymm15,%ymm3
1694	leaq	512(%rsi),%rsi
1695	vpor	%ymm0,%ymm4,%ymm4
1696	vpor	%ymm1,%ymm5,%ymm5
1697	vpor	%ymm2,%ymm4,%ymm4
1698	vpor	%ymm3,%ymm5,%ymm5
1699
1700	vpor	%ymm5,%ymm4,%ymm4
1701	vextracti128	$1,%ymm4,%xmm5
1702	vpor	%xmm4,%xmm5,%xmm5
1703	vpermd	%ymm5,%ymm7,%ymm5
1704	vmovdqu	%ymm5,(%rdi)
1705	leaq	32(%rdi),%rdi
1706	decl	%edx
1707	jnz	.Loop_gather_1024
1708
1709	vpxor	%ymm0,%ymm0,%ymm0
1710	vmovdqu	%ymm0,(%rdi)
1711	vzeroupper
1712	leaq	(%r11),%rsp
1713.cfi_def_cfa_register	%rsp
1714	.byte	0xf3,0xc3
1715.cfi_endproc
1716.LSEH_end_rsaz_1024_gather5:
1717.size	rsaz_1024_gather5_avx2,.-rsaz_1024_gather5_avx2
1718
1719.globl	rsaz_avx2_eligible
1720.type	rsaz_avx2_eligible,@function
1721.align	32
1722rsaz_avx2_eligible:
1723	movl	OPENSSL_ia32cap_P+8(%rip),%eax
1724	movl	$524544,%ecx
1725	movl	$0,%edx
1726	andl	%eax,%ecx
1727	cmpl	$524544,%ecx
1728	cmovel	%edx,%eax
1729	andl	$32,%eax
1730	shrl	$5,%eax
1731	.byte	0xf3,0xc3
1732.size	rsaz_avx2_eligible,.-rsaz_avx2_eligible
1733
1734.align	64
1735.Land_mask:
1736.quad	0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff
1737.Lscatter_permd:
1738.long	0,2,4,6,7,7,7,7
1739.Lgather_permd:
1740.long	0,7,1,7,2,7,3,7
1741.Linc:
1742.long	0,0,0,0, 1,1,1,1
1743.long	2,2,2,2, 3,3,3,3
1744.long	4,4,4,4, 4,4,4,4
1745.align	64
1746	.section ".note.gnu.property", "a"
1747	.p2align 3
1748	.long 1f - 0f
1749	.long 4f - 1f
1750	.long 5
17510:
1752	# "GNU" encoded with .byte, since .asciz isn't supported
1753	# on Solaris.
1754	.byte 0x47
1755	.byte 0x4e
1756	.byte 0x55
1757	.byte 0
17581:
1759	.p2align 3
1760	.long 0xc0000002
1761	.long 3f - 2f
17622:
1763	.long 3
17643:
1765	.p2align 3
17664:
1767