xref: /aosp_15_r20/external/boringssl/src/gen/bcm/rsaz-avx2-win.asm (revision 8fb009dc861624b67b6cdb62ea21f0f22d0c584b)
1; This file is generated from a similarly-named Perl script in the BoringSSL
2; source tree. Do not edit by hand.
3
4%ifidn __OUTPUT_FORMAT__, win64
5default	rel
6%define XMMWORD
7%define YMMWORD
8%define ZMMWORD
9%define _CET_ENDBR
10
11%ifdef BORINGSSL_PREFIX
12%include "boringssl_prefix_symbols_nasm.inc"
13%endif
14section	.text code align=64
15
16
17global	rsaz_1024_sqr_avx2
18
19ALIGN	64
20rsaz_1024_sqr_avx2:
21	mov	QWORD[8+rsp],rdi	;WIN64 prologue
22	mov	QWORD[16+rsp],rsi
23	mov	rax,rsp
24$L$SEH_begin_rsaz_1024_sqr_avx2:
25	mov	rdi,rcx
26	mov	rsi,rdx
27	mov	rdx,r8
28	mov	rcx,r9
29	mov	r8,QWORD[40+rsp]
30
31
32
33_CET_ENDBR
34	lea	rax,[rsp]
35
36	push	rbx
37
38	push	rbp
39
40	push	r12
41
42	push	r13
43
44	push	r14
45
46	push	r15
47
48	vzeroupper
49	lea	rsp,[((-168))+rsp]
50	vmovaps	XMMWORD[(-216)+rax],xmm6
51	vmovaps	XMMWORD[(-200)+rax],xmm7
52	vmovaps	XMMWORD[(-184)+rax],xmm8
53	vmovaps	XMMWORD[(-168)+rax],xmm9
54	vmovaps	XMMWORD[(-152)+rax],xmm10
55	vmovaps	XMMWORD[(-136)+rax],xmm11
56	vmovaps	XMMWORD[(-120)+rax],xmm12
57	vmovaps	XMMWORD[(-104)+rax],xmm13
58	vmovaps	XMMWORD[(-88)+rax],xmm14
59	vmovaps	XMMWORD[(-72)+rax],xmm15
60$L$sqr_1024_body:
61	mov	rbp,rax
62
63	mov	r13,rdx
64	sub	rsp,832
65	mov	r15,r13
66	sub	rdi,-128
67	sub	rsi,-128
68	sub	r13,-128
69
70	and	r15,4095
71	add	r15,32*10
72	shr	r15,12
73	vpxor	ymm9,ymm9,ymm9
74	jz	NEAR $L$sqr_1024_no_n_copy
75
76
77
78
79
80	sub	rsp,32*10
81	vmovdqu	ymm0,YMMWORD[((0-128))+r13]
82	and	rsp,-2048
83	vmovdqu	ymm1,YMMWORD[((32-128))+r13]
84	vmovdqu	ymm2,YMMWORD[((64-128))+r13]
85	vmovdqu	ymm3,YMMWORD[((96-128))+r13]
86	vmovdqu	ymm4,YMMWORD[((128-128))+r13]
87	vmovdqu	ymm5,YMMWORD[((160-128))+r13]
88	vmovdqu	ymm6,YMMWORD[((192-128))+r13]
89	vmovdqu	ymm7,YMMWORD[((224-128))+r13]
90	vmovdqu	ymm8,YMMWORD[((256-128))+r13]
91	lea	r13,[((832+128))+rsp]
92	vmovdqu	YMMWORD[(0-128)+r13],ymm0
93	vmovdqu	YMMWORD[(32-128)+r13],ymm1
94	vmovdqu	YMMWORD[(64-128)+r13],ymm2
95	vmovdqu	YMMWORD[(96-128)+r13],ymm3
96	vmovdqu	YMMWORD[(128-128)+r13],ymm4
97	vmovdqu	YMMWORD[(160-128)+r13],ymm5
98	vmovdqu	YMMWORD[(192-128)+r13],ymm6
99	vmovdqu	YMMWORD[(224-128)+r13],ymm7
100	vmovdqu	YMMWORD[(256-128)+r13],ymm8
101	vmovdqu	YMMWORD[(288-128)+r13],ymm9
102
103$L$sqr_1024_no_n_copy:
104	and	rsp,-1024
105
106	vmovdqu	ymm1,YMMWORD[((32-128))+rsi]
107	vmovdqu	ymm2,YMMWORD[((64-128))+rsi]
108	vmovdqu	ymm3,YMMWORD[((96-128))+rsi]
109	vmovdqu	ymm4,YMMWORD[((128-128))+rsi]
110	vmovdqu	ymm5,YMMWORD[((160-128))+rsi]
111	vmovdqu	ymm6,YMMWORD[((192-128))+rsi]
112	vmovdqu	ymm7,YMMWORD[((224-128))+rsi]
113	vmovdqu	ymm8,YMMWORD[((256-128))+rsi]
114
115	lea	rbx,[192+rsp]
116	vmovdqu	ymm15,YMMWORD[$L$and_mask]
117	jmp	NEAR $L$OOP_GRANDE_SQR_1024
118
119ALIGN	32
120$L$OOP_GRANDE_SQR_1024:
121	lea	r9,[((576+128))+rsp]
122	lea	r12,[448+rsp]
123
124
125
126
127	vpaddq	ymm1,ymm1,ymm1
128	vpbroadcastq	ymm10,QWORD[((0-128))+rsi]
129	vpaddq	ymm2,ymm2,ymm2
130	vmovdqa	YMMWORD[(0-128)+r9],ymm1
131	vpaddq	ymm3,ymm3,ymm3
132	vmovdqa	YMMWORD[(32-128)+r9],ymm2
133	vpaddq	ymm4,ymm4,ymm4
134	vmovdqa	YMMWORD[(64-128)+r9],ymm3
135	vpaddq	ymm5,ymm5,ymm5
136	vmovdqa	YMMWORD[(96-128)+r9],ymm4
137	vpaddq	ymm6,ymm6,ymm6
138	vmovdqa	YMMWORD[(128-128)+r9],ymm5
139	vpaddq	ymm7,ymm7,ymm7
140	vmovdqa	YMMWORD[(160-128)+r9],ymm6
141	vpaddq	ymm8,ymm8,ymm8
142	vmovdqa	YMMWORD[(192-128)+r9],ymm7
143	vpxor	ymm9,ymm9,ymm9
144	vmovdqa	YMMWORD[(224-128)+r9],ymm8
145
146	vpmuludq	ymm0,ymm10,YMMWORD[((0-128))+rsi]
147	vpbroadcastq	ymm11,QWORD[((32-128))+rsi]
148	vmovdqu	YMMWORD[(288-192)+rbx],ymm9
149	vpmuludq	ymm1,ymm1,ymm10
150	vmovdqu	YMMWORD[(320-448)+r12],ymm9
151	vpmuludq	ymm2,ymm2,ymm10
152	vmovdqu	YMMWORD[(352-448)+r12],ymm9
153	vpmuludq	ymm3,ymm3,ymm10
154	vmovdqu	YMMWORD[(384-448)+r12],ymm9
155	vpmuludq	ymm4,ymm4,ymm10
156	vmovdqu	YMMWORD[(416-448)+r12],ymm9
157	vpmuludq	ymm5,ymm5,ymm10
158	vmovdqu	YMMWORD[(448-448)+r12],ymm9
159	vpmuludq	ymm6,ymm6,ymm10
160	vmovdqu	YMMWORD[(480-448)+r12],ymm9
161	vpmuludq	ymm7,ymm7,ymm10
162	vmovdqu	YMMWORD[(512-448)+r12],ymm9
163	vpmuludq	ymm8,ymm8,ymm10
164	vpbroadcastq	ymm10,QWORD[((64-128))+rsi]
165	vmovdqu	YMMWORD[(544-448)+r12],ymm9
166
167	mov	r15,rsi
168	mov	r14d,4
169	jmp	NEAR $L$sqr_entry_1024
170ALIGN	32
171$L$OOP_SQR_1024:
172	vpbroadcastq	ymm11,QWORD[((32-128))+r15]
173	vpmuludq	ymm0,ymm10,YMMWORD[((0-128))+rsi]
174	vpaddq	ymm0,ymm0,YMMWORD[((0-192))+rbx]
175	vpmuludq	ymm1,ymm10,YMMWORD[((0-128))+r9]
176	vpaddq	ymm1,ymm1,YMMWORD[((32-192))+rbx]
177	vpmuludq	ymm2,ymm10,YMMWORD[((32-128))+r9]
178	vpaddq	ymm2,ymm2,YMMWORD[((64-192))+rbx]
179	vpmuludq	ymm3,ymm10,YMMWORD[((64-128))+r9]
180	vpaddq	ymm3,ymm3,YMMWORD[((96-192))+rbx]
181	vpmuludq	ymm4,ymm10,YMMWORD[((96-128))+r9]
182	vpaddq	ymm4,ymm4,YMMWORD[((128-192))+rbx]
183	vpmuludq	ymm5,ymm10,YMMWORD[((128-128))+r9]
184	vpaddq	ymm5,ymm5,YMMWORD[((160-192))+rbx]
185	vpmuludq	ymm6,ymm10,YMMWORD[((160-128))+r9]
186	vpaddq	ymm6,ymm6,YMMWORD[((192-192))+rbx]
187	vpmuludq	ymm7,ymm10,YMMWORD[((192-128))+r9]
188	vpaddq	ymm7,ymm7,YMMWORD[((224-192))+rbx]
189	vpmuludq	ymm8,ymm10,YMMWORD[((224-128))+r9]
190	vpbroadcastq	ymm10,QWORD[((64-128))+r15]
191	vpaddq	ymm8,ymm8,YMMWORD[((256-192))+rbx]
192$L$sqr_entry_1024:
193	vmovdqu	YMMWORD[(0-192)+rbx],ymm0
194	vmovdqu	YMMWORD[(32-192)+rbx],ymm1
195
196	vpmuludq	ymm12,ymm11,YMMWORD[((32-128))+rsi]
197	vpaddq	ymm2,ymm2,ymm12
198	vpmuludq	ymm14,ymm11,YMMWORD[((32-128))+r9]
199	vpaddq	ymm3,ymm3,ymm14
200	vpmuludq	ymm13,ymm11,YMMWORD[((64-128))+r9]
201	vpaddq	ymm4,ymm4,ymm13
202	vpmuludq	ymm12,ymm11,YMMWORD[((96-128))+r9]
203	vpaddq	ymm5,ymm5,ymm12
204	vpmuludq	ymm14,ymm11,YMMWORD[((128-128))+r9]
205	vpaddq	ymm6,ymm6,ymm14
206	vpmuludq	ymm13,ymm11,YMMWORD[((160-128))+r9]
207	vpaddq	ymm7,ymm7,ymm13
208	vpmuludq	ymm12,ymm11,YMMWORD[((192-128))+r9]
209	vpaddq	ymm8,ymm8,ymm12
210	vpmuludq	ymm0,ymm11,YMMWORD[((224-128))+r9]
211	vpbroadcastq	ymm11,QWORD[((96-128))+r15]
212	vpaddq	ymm0,ymm0,YMMWORD[((288-192))+rbx]
213
214	vmovdqu	YMMWORD[(64-192)+rbx],ymm2
215	vmovdqu	YMMWORD[(96-192)+rbx],ymm3
216
217	vpmuludq	ymm13,ymm10,YMMWORD[((64-128))+rsi]
218	vpaddq	ymm4,ymm4,ymm13
219	vpmuludq	ymm12,ymm10,YMMWORD[((64-128))+r9]
220	vpaddq	ymm5,ymm5,ymm12
221	vpmuludq	ymm14,ymm10,YMMWORD[((96-128))+r9]
222	vpaddq	ymm6,ymm6,ymm14
223	vpmuludq	ymm13,ymm10,YMMWORD[((128-128))+r9]
224	vpaddq	ymm7,ymm7,ymm13
225	vpmuludq	ymm12,ymm10,YMMWORD[((160-128))+r9]
226	vpaddq	ymm8,ymm8,ymm12
227	vpmuludq	ymm14,ymm10,YMMWORD[((192-128))+r9]
228	vpaddq	ymm0,ymm0,ymm14
229	vpmuludq	ymm1,ymm10,YMMWORD[((224-128))+r9]
230	vpbroadcastq	ymm10,QWORD[((128-128))+r15]
231	vpaddq	ymm1,ymm1,YMMWORD[((320-448))+r12]
232
233	vmovdqu	YMMWORD[(128-192)+rbx],ymm4
234	vmovdqu	YMMWORD[(160-192)+rbx],ymm5
235
236	vpmuludq	ymm12,ymm11,YMMWORD[((96-128))+rsi]
237	vpaddq	ymm6,ymm6,ymm12
238	vpmuludq	ymm14,ymm11,YMMWORD[((96-128))+r9]
239	vpaddq	ymm7,ymm7,ymm14
240	vpmuludq	ymm13,ymm11,YMMWORD[((128-128))+r9]
241	vpaddq	ymm8,ymm8,ymm13
242	vpmuludq	ymm12,ymm11,YMMWORD[((160-128))+r9]
243	vpaddq	ymm0,ymm0,ymm12
244	vpmuludq	ymm14,ymm11,YMMWORD[((192-128))+r9]
245	vpaddq	ymm1,ymm1,ymm14
246	vpmuludq	ymm2,ymm11,YMMWORD[((224-128))+r9]
247	vpbroadcastq	ymm11,QWORD[((160-128))+r15]
248	vpaddq	ymm2,ymm2,YMMWORD[((352-448))+r12]
249
250	vmovdqu	YMMWORD[(192-192)+rbx],ymm6
251	vmovdqu	YMMWORD[(224-192)+rbx],ymm7
252
253	vpmuludq	ymm12,ymm10,YMMWORD[((128-128))+rsi]
254	vpaddq	ymm8,ymm8,ymm12
255	vpmuludq	ymm14,ymm10,YMMWORD[((128-128))+r9]
256	vpaddq	ymm0,ymm0,ymm14
257	vpmuludq	ymm13,ymm10,YMMWORD[((160-128))+r9]
258	vpaddq	ymm1,ymm1,ymm13
259	vpmuludq	ymm12,ymm10,YMMWORD[((192-128))+r9]
260	vpaddq	ymm2,ymm2,ymm12
261	vpmuludq	ymm3,ymm10,YMMWORD[((224-128))+r9]
262	vpbroadcastq	ymm10,QWORD[((192-128))+r15]
263	vpaddq	ymm3,ymm3,YMMWORD[((384-448))+r12]
264
265	vmovdqu	YMMWORD[(256-192)+rbx],ymm8
266	vmovdqu	YMMWORD[(288-192)+rbx],ymm0
267	lea	rbx,[8+rbx]
268
269	vpmuludq	ymm13,ymm11,YMMWORD[((160-128))+rsi]
270	vpaddq	ymm1,ymm1,ymm13
271	vpmuludq	ymm12,ymm11,YMMWORD[((160-128))+r9]
272	vpaddq	ymm2,ymm2,ymm12
273	vpmuludq	ymm14,ymm11,YMMWORD[((192-128))+r9]
274	vpaddq	ymm3,ymm3,ymm14
275	vpmuludq	ymm4,ymm11,YMMWORD[((224-128))+r9]
276	vpbroadcastq	ymm11,QWORD[((224-128))+r15]
277	vpaddq	ymm4,ymm4,YMMWORD[((416-448))+r12]
278
279	vmovdqu	YMMWORD[(320-448)+r12],ymm1
280	vmovdqu	YMMWORD[(352-448)+r12],ymm2
281
282	vpmuludq	ymm12,ymm10,YMMWORD[((192-128))+rsi]
283	vpaddq	ymm3,ymm3,ymm12
284	vpmuludq	ymm14,ymm10,YMMWORD[((192-128))+r9]
285	vpbroadcastq	ymm0,QWORD[((256-128))+r15]
286	vpaddq	ymm4,ymm4,ymm14
287	vpmuludq	ymm5,ymm10,YMMWORD[((224-128))+r9]
288	vpbroadcastq	ymm10,QWORD[((0+8-128))+r15]
289	vpaddq	ymm5,ymm5,YMMWORD[((448-448))+r12]
290
291	vmovdqu	YMMWORD[(384-448)+r12],ymm3
292	vmovdqu	YMMWORD[(416-448)+r12],ymm4
293	lea	r15,[8+r15]
294
295	vpmuludq	ymm12,ymm11,YMMWORD[((224-128))+rsi]
296	vpaddq	ymm5,ymm5,ymm12
297	vpmuludq	ymm6,ymm11,YMMWORD[((224-128))+r9]
298	vpaddq	ymm6,ymm6,YMMWORD[((480-448))+r12]
299
300	vpmuludq	ymm7,ymm0,YMMWORD[((256-128))+rsi]
301	vmovdqu	YMMWORD[(448-448)+r12],ymm5
302	vpaddq	ymm7,ymm7,YMMWORD[((512-448))+r12]
303	vmovdqu	YMMWORD[(480-448)+r12],ymm6
304	vmovdqu	YMMWORD[(512-448)+r12],ymm7
305	lea	r12,[8+r12]
306
307	dec	r14d
308	jnz	NEAR $L$OOP_SQR_1024
309
310	vmovdqu	ymm8,YMMWORD[256+rsp]
311	vmovdqu	ymm1,YMMWORD[288+rsp]
312	vmovdqu	ymm2,YMMWORD[320+rsp]
313	lea	rbx,[192+rsp]
314
315	vpsrlq	ymm14,ymm8,29
316	vpand	ymm8,ymm8,ymm15
317	vpsrlq	ymm11,ymm1,29
318	vpand	ymm1,ymm1,ymm15
319
320	vpermq	ymm14,ymm14,0x93
321	vpxor	ymm9,ymm9,ymm9
322	vpermq	ymm11,ymm11,0x93
323
324	vpblendd	ymm10,ymm14,ymm9,3
325	vpblendd	ymm14,ymm11,ymm14,3
326	vpaddq	ymm8,ymm8,ymm10
327	vpblendd	ymm11,ymm9,ymm11,3
328	vpaddq	ymm1,ymm1,ymm14
329	vpaddq	ymm2,ymm2,ymm11
330	vmovdqu	YMMWORD[(288-192)+rbx],ymm1
331	vmovdqu	YMMWORD[(320-192)+rbx],ymm2
332
333	mov	rax,QWORD[rsp]
334	mov	r10,QWORD[8+rsp]
335	mov	r11,QWORD[16+rsp]
336	mov	r12,QWORD[24+rsp]
337	vmovdqu	ymm1,YMMWORD[32+rsp]
338	vmovdqu	ymm2,YMMWORD[((64-192))+rbx]
339	vmovdqu	ymm3,YMMWORD[((96-192))+rbx]
340	vmovdqu	ymm4,YMMWORD[((128-192))+rbx]
341	vmovdqu	ymm5,YMMWORD[((160-192))+rbx]
342	vmovdqu	ymm6,YMMWORD[((192-192))+rbx]
343	vmovdqu	ymm7,YMMWORD[((224-192))+rbx]
344
345	mov	r9,rax
346	imul	eax,ecx
347	and	eax,0x1fffffff
348	vmovd	xmm12,eax
349
350	mov	rdx,rax
351	imul	rax,QWORD[((-128))+r13]
352	vpbroadcastq	ymm12,xmm12
353	add	r9,rax
354	mov	rax,rdx
355	imul	rax,QWORD[((8-128))+r13]
356	shr	r9,29
357	add	r10,rax
358	mov	rax,rdx
359	imul	rax,QWORD[((16-128))+r13]
360	add	r10,r9
361	add	r11,rax
362	imul	rdx,QWORD[((24-128))+r13]
363	add	r12,rdx
364
365	mov	rax,r10
366	imul	eax,ecx
367	and	eax,0x1fffffff
368
369	mov	r14d,9
370	jmp	NEAR $L$OOP_REDUCE_1024
371
372ALIGN	32
373$L$OOP_REDUCE_1024:
374	vmovd	xmm13,eax
375	vpbroadcastq	ymm13,xmm13
376
377	vpmuludq	ymm10,ymm12,YMMWORD[((32-128))+r13]
378	mov	rdx,rax
379	imul	rax,QWORD[((-128))+r13]
380	vpaddq	ymm1,ymm1,ymm10
381	add	r10,rax
382	vpmuludq	ymm14,ymm12,YMMWORD[((64-128))+r13]
383	mov	rax,rdx
384	imul	rax,QWORD[((8-128))+r13]
385	vpaddq	ymm2,ymm2,ymm14
386	vpmuludq	ymm11,ymm12,YMMWORD[((96-128))+r13]
387	DB	0x67
388	add	r11,rax
389	DB	0x67
390	mov	rax,rdx
391	imul	rax,QWORD[((16-128))+r13]
392	shr	r10,29
393	vpaddq	ymm3,ymm3,ymm11
394	vpmuludq	ymm10,ymm12,YMMWORD[((128-128))+r13]
395	add	r12,rax
396	add	r11,r10
397	vpaddq	ymm4,ymm4,ymm10
398	vpmuludq	ymm14,ymm12,YMMWORD[((160-128))+r13]
399	mov	rax,r11
400	imul	eax,ecx
401	vpaddq	ymm5,ymm5,ymm14
402	vpmuludq	ymm11,ymm12,YMMWORD[((192-128))+r13]
403	and	eax,0x1fffffff
404	vpaddq	ymm6,ymm6,ymm11
405	vpmuludq	ymm10,ymm12,YMMWORD[((224-128))+r13]
406	vpaddq	ymm7,ymm7,ymm10
407	vpmuludq	ymm14,ymm12,YMMWORD[((256-128))+r13]
408	vmovd	xmm12,eax
409
410	vpaddq	ymm8,ymm8,ymm14
411
412	vpbroadcastq	ymm12,xmm12
413
414	vpmuludq	ymm11,ymm13,YMMWORD[((32-8-128))+r13]
415	vmovdqu	ymm14,YMMWORD[((96-8-128))+r13]
416	mov	rdx,rax
417	imul	rax,QWORD[((-128))+r13]
418	vpaddq	ymm1,ymm1,ymm11
419	vpmuludq	ymm10,ymm13,YMMWORD[((64-8-128))+r13]
420	vmovdqu	ymm11,YMMWORD[((128-8-128))+r13]
421	add	r11,rax
422	mov	rax,rdx
423	imul	rax,QWORD[((8-128))+r13]
424	vpaddq	ymm2,ymm2,ymm10
425	add	rax,r12
426	shr	r11,29
427	vpmuludq	ymm14,ymm14,ymm13
428	vmovdqu	ymm10,YMMWORD[((160-8-128))+r13]
429	add	rax,r11
430	vpaddq	ymm3,ymm3,ymm14
431	vpmuludq	ymm11,ymm11,ymm13
432	vmovdqu	ymm14,YMMWORD[((192-8-128))+r13]
433	DB	0x67
434	mov	r12,rax
435	imul	eax,ecx
436	vpaddq	ymm4,ymm4,ymm11
437	vpmuludq	ymm10,ymm10,ymm13
438	DB	0xc4,0x41,0x7e,0x6f,0x9d,0x58,0x00,0x00,0x00
439	and	eax,0x1fffffff
440	vpaddq	ymm5,ymm5,ymm10
441	vpmuludq	ymm14,ymm14,ymm13
442	vmovdqu	ymm10,YMMWORD[((256-8-128))+r13]
443	vpaddq	ymm6,ymm6,ymm14
444	vpmuludq	ymm11,ymm11,ymm13
445	vmovdqu	ymm9,YMMWORD[((288-8-128))+r13]
446	vmovd	xmm0,eax
447	imul	rax,QWORD[((-128))+r13]
448	vpaddq	ymm7,ymm7,ymm11
449	vpmuludq	ymm10,ymm10,ymm13
450	vmovdqu	ymm14,YMMWORD[((32-16-128))+r13]
451	vpbroadcastq	ymm0,xmm0
452	vpaddq	ymm8,ymm8,ymm10
453	vpmuludq	ymm9,ymm9,ymm13
454	vmovdqu	ymm11,YMMWORD[((64-16-128))+r13]
455	add	r12,rax
456
457	vmovdqu	ymm13,YMMWORD[((32-24-128))+r13]
458	vpmuludq	ymm14,ymm14,ymm12
459	vmovdqu	ymm10,YMMWORD[((96-16-128))+r13]
460	vpaddq	ymm1,ymm1,ymm14
461	vpmuludq	ymm13,ymm13,ymm0
462	vpmuludq	ymm11,ymm11,ymm12
463	DB	0xc4,0x41,0x7e,0x6f,0xb5,0xf0,0xff,0xff,0xff
464	vpaddq	ymm13,ymm13,ymm1
465	vpaddq	ymm2,ymm2,ymm11
466	vpmuludq	ymm10,ymm10,ymm12
467	vmovdqu	ymm11,YMMWORD[((160-16-128))+r13]
468	DB	0x67
469	vmovq	rax,xmm13
470	vmovdqu	YMMWORD[rsp],ymm13
471	vpaddq	ymm3,ymm3,ymm10
472	vpmuludq	ymm14,ymm14,ymm12
473	vmovdqu	ymm10,YMMWORD[((192-16-128))+r13]
474	vpaddq	ymm4,ymm4,ymm14
475	vpmuludq	ymm11,ymm11,ymm12
476	vmovdqu	ymm14,YMMWORD[((224-16-128))+r13]
477	vpaddq	ymm5,ymm5,ymm11
478	vpmuludq	ymm10,ymm10,ymm12
479	vmovdqu	ymm11,YMMWORD[((256-16-128))+r13]
480	vpaddq	ymm6,ymm6,ymm10
481	vpmuludq	ymm14,ymm14,ymm12
482	shr	r12,29
483	vmovdqu	ymm10,YMMWORD[((288-16-128))+r13]
484	add	rax,r12
485	vpaddq	ymm7,ymm7,ymm14
486	vpmuludq	ymm11,ymm11,ymm12
487
488	mov	r9,rax
489	imul	eax,ecx
490	vpaddq	ymm8,ymm8,ymm11
491	vpmuludq	ymm10,ymm10,ymm12
492	and	eax,0x1fffffff
493	vmovd	xmm12,eax
494	vmovdqu	ymm11,YMMWORD[((96-24-128))+r13]
495	DB	0x67
496	vpaddq	ymm9,ymm9,ymm10
497	vpbroadcastq	ymm12,xmm12
498
499	vpmuludq	ymm14,ymm0,YMMWORD[((64-24-128))+r13]
500	vmovdqu	ymm10,YMMWORD[((128-24-128))+r13]
501	mov	rdx,rax
502	imul	rax,QWORD[((-128))+r13]
503	mov	r10,QWORD[8+rsp]
504	vpaddq	ymm1,ymm2,ymm14
505	vpmuludq	ymm11,ymm11,ymm0
506	vmovdqu	ymm14,YMMWORD[((160-24-128))+r13]
507	add	r9,rax
508	mov	rax,rdx
509	imul	rax,QWORD[((8-128))+r13]
510	DB	0x67
511	shr	r9,29
512	mov	r11,QWORD[16+rsp]
513	vpaddq	ymm2,ymm3,ymm11
514	vpmuludq	ymm10,ymm10,ymm0
515	vmovdqu	ymm11,YMMWORD[((192-24-128))+r13]
516	add	r10,rax
517	mov	rax,rdx
518	imul	rax,QWORD[((16-128))+r13]
519	vpaddq	ymm3,ymm4,ymm10
520	vpmuludq	ymm14,ymm14,ymm0
521	vmovdqu	ymm10,YMMWORD[((224-24-128))+r13]
522	imul	rdx,QWORD[((24-128))+r13]
523	add	r11,rax
524	lea	rax,[r10*1+r9]
525	vpaddq	ymm4,ymm5,ymm14
526	vpmuludq	ymm11,ymm11,ymm0
527	vmovdqu	ymm14,YMMWORD[((256-24-128))+r13]
528	mov	r10,rax
529	imul	eax,ecx
530	vpmuludq	ymm10,ymm10,ymm0
531	vpaddq	ymm5,ymm6,ymm11
532	vmovdqu	ymm11,YMMWORD[((288-24-128))+r13]
533	and	eax,0x1fffffff
534	vpaddq	ymm6,ymm7,ymm10
535	vpmuludq	ymm14,ymm14,ymm0
536	add	rdx,QWORD[24+rsp]
537	vpaddq	ymm7,ymm8,ymm14
538	vpmuludq	ymm11,ymm11,ymm0
539	vpaddq	ymm8,ymm9,ymm11
540	vmovq	xmm9,r12
541	mov	r12,rdx
542
543	dec	r14d
544	jnz	NEAR $L$OOP_REDUCE_1024
545	lea	r12,[448+rsp]
546	vpaddq	ymm0,ymm13,ymm9
547	vpxor	ymm9,ymm9,ymm9
548
549	vpaddq	ymm0,ymm0,YMMWORD[((288-192))+rbx]
550	vpaddq	ymm1,ymm1,YMMWORD[((320-448))+r12]
551	vpaddq	ymm2,ymm2,YMMWORD[((352-448))+r12]
552	vpaddq	ymm3,ymm3,YMMWORD[((384-448))+r12]
553	vpaddq	ymm4,ymm4,YMMWORD[((416-448))+r12]
554	vpaddq	ymm5,ymm5,YMMWORD[((448-448))+r12]
555	vpaddq	ymm6,ymm6,YMMWORD[((480-448))+r12]
556	vpaddq	ymm7,ymm7,YMMWORD[((512-448))+r12]
557	vpaddq	ymm8,ymm8,YMMWORD[((544-448))+r12]
558
559	vpsrlq	ymm14,ymm0,29
560	vpand	ymm0,ymm0,ymm15
561	vpsrlq	ymm11,ymm1,29
562	vpand	ymm1,ymm1,ymm15
563	vpsrlq	ymm12,ymm2,29
564	vpermq	ymm14,ymm14,0x93
565	vpand	ymm2,ymm2,ymm15
566	vpsrlq	ymm13,ymm3,29
567	vpermq	ymm11,ymm11,0x93
568	vpand	ymm3,ymm3,ymm15
569	vpermq	ymm12,ymm12,0x93
570
571	vpblendd	ymm10,ymm14,ymm9,3
572	vpermq	ymm13,ymm13,0x93
573	vpblendd	ymm14,ymm11,ymm14,3
574	vpaddq	ymm0,ymm0,ymm10
575	vpblendd	ymm11,ymm12,ymm11,3
576	vpaddq	ymm1,ymm1,ymm14
577	vpblendd	ymm12,ymm13,ymm12,3
578	vpaddq	ymm2,ymm2,ymm11
579	vpblendd	ymm13,ymm9,ymm13,3
580	vpaddq	ymm3,ymm3,ymm12
581	vpaddq	ymm4,ymm4,ymm13
582
583	vpsrlq	ymm14,ymm0,29
584	vpand	ymm0,ymm0,ymm15
585	vpsrlq	ymm11,ymm1,29
586	vpand	ymm1,ymm1,ymm15
587	vpsrlq	ymm12,ymm2,29
588	vpermq	ymm14,ymm14,0x93
589	vpand	ymm2,ymm2,ymm15
590	vpsrlq	ymm13,ymm3,29
591	vpermq	ymm11,ymm11,0x93
592	vpand	ymm3,ymm3,ymm15
593	vpermq	ymm12,ymm12,0x93
594
595	vpblendd	ymm10,ymm14,ymm9,3
596	vpermq	ymm13,ymm13,0x93
597	vpblendd	ymm14,ymm11,ymm14,3
598	vpaddq	ymm0,ymm0,ymm10
599	vpblendd	ymm11,ymm12,ymm11,3
600	vpaddq	ymm1,ymm1,ymm14
601	vmovdqu	YMMWORD[(0-128)+rdi],ymm0
602	vpblendd	ymm12,ymm13,ymm12,3
603	vpaddq	ymm2,ymm2,ymm11
604	vmovdqu	YMMWORD[(32-128)+rdi],ymm1
605	vpblendd	ymm13,ymm9,ymm13,3
606	vpaddq	ymm3,ymm3,ymm12
607	vmovdqu	YMMWORD[(64-128)+rdi],ymm2
608	vpaddq	ymm4,ymm4,ymm13
609	vmovdqu	YMMWORD[(96-128)+rdi],ymm3
610	vpsrlq	ymm14,ymm4,29
611	vpand	ymm4,ymm4,ymm15
612	vpsrlq	ymm11,ymm5,29
613	vpand	ymm5,ymm5,ymm15
614	vpsrlq	ymm12,ymm6,29
615	vpermq	ymm14,ymm14,0x93
616	vpand	ymm6,ymm6,ymm15
617	vpsrlq	ymm13,ymm7,29
618	vpermq	ymm11,ymm11,0x93
619	vpand	ymm7,ymm7,ymm15
620	vpsrlq	ymm0,ymm8,29
621	vpermq	ymm12,ymm12,0x93
622	vpand	ymm8,ymm8,ymm15
623	vpermq	ymm13,ymm13,0x93
624
625	vpblendd	ymm10,ymm14,ymm9,3
626	vpermq	ymm0,ymm0,0x93
627	vpblendd	ymm14,ymm11,ymm14,3
628	vpaddq	ymm4,ymm4,ymm10
629	vpblendd	ymm11,ymm12,ymm11,3
630	vpaddq	ymm5,ymm5,ymm14
631	vpblendd	ymm12,ymm13,ymm12,3
632	vpaddq	ymm6,ymm6,ymm11
633	vpblendd	ymm13,ymm0,ymm13,3
634	vpaddq	ymm7,ymm7,ymm12
635	vpaddq	ymm8,ymm8,ymm13
636
637	vpsrlq	ymm14,ymm4,29
638	vpand	ymm4,ymm4,ymm15
639	vpsrlq	ymm11,ymm5,29
640	vpand	ymm5,ymm5,ymm15
641	vpsrlq	ymm12,ymm6,29
642	vpermq	ymm14,ymm14,0x93
643	vpand	ymm6,ymm6,ymm15
644	vpsrlq	ymm13,ymm7,29
645	vpermq	ymm11,ymm11,0x93
646	vpand	ymm7,ymm7,ymm15
647	vpsrlq	ymm0,ymm8,29
648	vpermq	ymm12,ymm12,0x93
649	vpand	ymm8,ymm8,ymm15
650	vpermq	ymm13,ymm13,0x93
651
652	vpblendd	ymm10,ymm14,ymm9,3
653	vpermq	ymm0,ymm0,0x93
654	vpblendd	ymm14,ymm11,ymm14,3
655	vpaddq	ymm4,ymm4,ymm10
656	vpblendd	ymm11,ymm12,ymm11,3
657	vpaddq	ymm5,ymm5,ymm14
658	vmovdqu	YMMWORD[(128-128)+rdi],ymm4
659	vpblendd	ymm12,ymm13,ymm12,3
660	vpaddq	ymm6,ymm6,ymm11
661	vmovdqu	YMMWORD[(160-128)+rdi],ymm5
662	vpblendd	ymm13,ymm0,ymm13,3
663	vpaddq	ymm7,ymm7,ymm12
664	vmovdqu	YMMWORD[(192-128)+rdi],ymm6
665	vpaddq	ymm8,ymm8,ymm13
666	vmovdqu	YMMWORD[(224-128)+rdi],ymm7
667	vmovdqu	YMMWORD[(256-128)+rdi],ymm8
668
669	mov	rsi,rdi
670	dec	r8d
671	jne	NEAR $L$OOP_GRANDE_SQR_1024
672
673	vzeroall
674	mov	rax,rbp
675
676$L$sqr_1024_in_tail:
677	movaps	xmm6,XMMWORD[((-216))+rax]
678	movaps	xmm7,XMMWORD[((-200))+rax]
679	movaps	xmm8,XMMWORD[((-184))+rax]
680	movaps	xmm9,XMMWORD[((-168))+rax]
681	movaps	xmm10,XMMWORD[((-152))+rax]
682	movaps	xmm11,XMMWORD[((-136))+rax]
683	movaps	xmm12,XMMWORD[((-120))+rax]
684	movaps	xmm13,XMMWORD[((-104))+rax]
685	movaps	xmm14,XMMWORD[((-88))+rax]
686	movaps	xmm15,XMMWORD[((-72))+rax]
687	mov	r15,QWORD[((-48))+rax]
688
689	mov	r14,QWORD[((-40))+rax]
690
691	mov	r13,QWORD[((-32))+rax]
692
693	mov	r12,QWORD[((-24))+rax]
694
695	mov	rbp,QWORD[((-16))+rax]
696
697	mov	rbx,QWORD[((-8))+rax]
698
699	lea	rsp,[rax]
700
701$L$sqr_1024_epilogue:
702	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
703	mov	rsi,QWORD[16+rsp]
704	ret
705
706$L$SEH_end_rsaz_1024_sqr_avx2:
707global	rsaz_1024_mul_avx2
708
709ALIGN	64
710rsaz_1024_mul_avx2:
711	mov	QWORD[8+rsp],rdi	;WIN64 prologue
712	mov	QWORD[16+rsp],rsi
713	mov	rax,rsp
714$L$SEH_begin_rsaz_1024_mul_avx2:
715	mov	rdi,rcx
716	mov	rsi,rdx
717	mov	rdx,r8
718	mov	rcx,r9
719	mov	r8,QWORD[40+rsp]
720
721
722
723_CET_ENDBR
724	lea	rax,[rsp]
725
726	push	rbx
727
728	push	rbp
729
730	push	r12
731
732	push	r13
733
734	push	r14
735
736	push	r15
737
738	vzeroupper
739	lea	rsp,[((-168))+rsp]
740	vmovaps	XMMWORD[(-216)+rax],xmm6
741	vmovaps	XMMWORD[(-200)+rax],xmm7
742	vmovaps	XMMWORD[(-184)+rax],xmm8
743	vmovaps	XMMWORD[(-168)+rax],xmm9
744	vmovaps	XMMWORD[(-152)+rax],xmm10
745	vmovaps	XMMWORD[(-136)+rax],xmm11
746	vmovaps	XMMWORD[(-120)+rax],xmm12
747	vmovaps	XMMWORD[(-104)+rax],xmm13
748	vmovaps	XMMWORD[(-88)+rax],xmm14
749	vmovaps	XMMWORD[(-72)+rax],xmm15
750$L$mul_1024_body:
751	mov	rbp,rax
752
753	vzeroall
754	mov	r13,rdx
755	sub	rsp,64
756
757
758
759
760
761
762	DB	0x67,0x67
763	mov	r15,rsi
764	and	r15,4095
765	add	r15,32*10
766	shr	r15,12
767	mov	r15,rsi
768	cmovnz	rsi,r13
769	cmovnz	r13,r15
770
771	mov	r15,rcx
772	sub	rsi,-128
773	sub	rcx,-128
774	sub	rdi,-128
775
776	and	r15,4095
777	add	r15,32*10
778	DB	0x67,0x67
779	shr	r15,12
780	jz	NEAR $L$mul_1024_no_n_copy
781
782
783
784
785
786	sub	rsp,32*10
787	vmovdqu	ymm0,YMMWORD[((0-128))+rcx]
788	and	rsp,-512
789	vmovdqu	ymm1,YMMWORD[((32-128))+rcx]
790	vmovdqu	ymm2,YMMWORD[((64-128))+rcx]
791	vmovdqu	ymm3,YMMWORD[((96-128))+rcx]
792	vmovdqu	ymm4,YMMWORD[((128-128))+rcx]
793	vmovdqu	ymm5,YMMWORD[((160-128))+rcx]
794	vmovdqu	ymm6,YMMWORD[((192-128))+rcx]
795	vmovdqu	ymm7,YMMWORD[((224-128))+rcx]
796	vmovdqu	ymm8,YMMWORD[((256-128))+rcx]
797	lea	rcx,[((64+128))+rsp]
798	vmovdqu	YMMWORD[(0-128)+rcx],ymm0
799	vpxor	ymm0,ymm0,ymm0
800	vmovdqu	YMMWORD[(32-128)+rcx],ymm1
801	vpxor	ymm1,ymm1,ymm1
802	vmovdqu	YMMWORD[(64-128)+rcx],ymm2
803	vpxor	ymm2,ymm2,ymm2
804	vmovdqu	YMMWORD[(96-128)+rcx],ymm3
805	vpxor	ymm3,ymm3,ymm3
806	vmovdqu	YMMWORD[(128-128)+rcx],ymm4
807	vpxor	ymm4,ymm4,ymm4
808	vmovdqu	YMMWORD[(160-128)+rcx],ymm5
809	vpxor	ymm5,ymm5,ymm5
810	vmovdqu	YMMWORD[(192-128)+rcx],ymm6
811	vpxor	ymm6,ymm6,ymm6
812	vmovdqu	YMMWORD[(224-128)+rcx],ymm7
813	vpxor	ymm7,ymm7,ymm7
814	vmovdqu	YMMWORD[(256-128)+rcx],ymm8
815	vmovdqa	ymm8,ymm0
816	vmovdqu	YMMWORD[(288-128)+rcx],ymm9
817$L$mul_1024_no_n_copy:
818	and	rsp,-64
819
820	mov	rbx,QWORD[r13]
821	vpbroadcastq	ymm10,QWORD[r13]
822	vmovdqu	YMMWORD[rsp],ymm0
823	xor	r9,r9
824	DB	0x67
825	xor	r10,r10
826	xor	r11,r11
827	xor	r12,r12
828
829	vmovdqu	ymm15,YMMWORD[$L$and_mask]
830	mov	r14d,9
831	vmovdqu	YMMWORD[(288-128)+rdi],ymm9
832	jmp	NEAR $L$oop_mul_1024
833
834ALIGN	32
835$L$oop_mul_1024:
836	vpsrlq	ymm9,ymm3,29
837	mov	rax,rbx
838	imul	rax,QWORD[((-128))+rsi]
839	add	rax,r9
840	mov	r10,rbx
841	imul	r10,QWORD[((8-128))+rsi]
842	add	r10,QWORD[8+rsp]
843
844	mov	r9,rax
845	imul	eax,r8d
846	and	eax,0x1fffffff
847
848	mov	r11,rbx
849	imul	r11,QWORD[((16-128))+rsi]
850	add	r11,QWORD[16+rsp]
851
852	mov	r12,rbx
853	imul	r12,QWORD[((24-128))+rsi]
854	add	r12,QWORD[24+rsp]
855	vpmuludq	ymm0,ymm10,YMMWORD[((32-128))+rsi]
856	vmovd	xmm11,eax
857	vpaddq	ymm1,ymm1,ymm0
858	vpmuludq	ymm12,ymm10,YMMWORD[((64-128))+rsi]
859	vpbroadcastq	ymm11,xmm11
860	vpaddq	ymm2,ymm2,ymm12
861	vpmuludq	ymm13,ymm10,YMMWORD[((96-128))+rsi]
862	vpand	ymm3,ymm3,ymm15
863	vpaddq	ymm3,ymm3,ymm13
864	vpmuludq	ymm0,ymm10,YMMWORD[((128-128))+rsi]
865	vpaddq	ymm4,ymm4,ymm0
866	vpmuludq	ymm12,ymm10,YMMWORD[((160-128))+rsi]
867	vpaddq	ymm5,ymm5,ymm12
868	vpmuludq	ymm13,ymm10,YMMWORD[((192-128))+rsi]
869	vpaddq	ymm6,ymm6,ymm13
870	vpmuludq	ymm0,ymm10,YMMWORD[((224-128))+rsi]
871	vpermq	ymm9,ymm9,0x93
872	vpaddq	ymm7,ymm7,ymm0
873	vpmuludq	ymm12,ymm10,YMMWORD[((256-128))+rsi]
874	vpbroadcastq	ymm10,QWORD[8+r13]
875	vpaddq	ymm8,ymm8,ymm12
876
877	mov	rdx,rax
878	imul	rax,QWORD[((-128))+rcx]
879	add	r9,rax
880	mov	rax,rdx
881	imul	rax,QWORD[((8-128))+rcx]
882	add	r10,rax
883	mov	rax,rdx
884	imul	rax,QWORD[((16-128))+rcx]
885	add	r11,rax
886	shr	r9,29
887	imul	rdx,QWORD[((24-128))+rcx]
888	add	r12,rdx
889	add	r10,r9
890
891	vpmuludq	ymm13,ymm11,YMMWORD[((32-128))+rcx]
892	vmovq	rbx,xmm10
893	vpaddq	ymm1,ymm1,ymm13
894	vpmuludq	ymm0,ymm11,YMMWORD[((64-128))+rcx]
895	vpaddq	ymm2,ymm2,ymm0
896	vpmuludq	ymm12,ymm11,YMMWORD[((96-128))+rcx]
897	vpaddq	ymm3,ymm3,ymm12
898	vpmuludq	ymm13,ymm11,YMMWORD[((128-128))+rcx]
899	vpaddq	ymm4,ymm4,ymm13
900	vpmuludq	ymm0,ymm11,YMMWORD[((160-128))+rcx]
901	vpaddq	ymm5,ymm5,ymm0
902	vpmuludq	ymm12,ymm11,YMMWORD[((192-128))+rcx]
903	vpaddq	ymm6,ymm6,ymm12
904	vpmuludq	ymm13,ymm11,YMMWORD[((224-128))+rcx]
905	vpblendd	ymm12,ymm9,ymm14,3
906	vpaddq	ymm7,ymm7,ymm13
907	vpmuludq	ymm0,ymm11,YMMWORD[((256-128))+rcx]
908	vpaddq	ymm3,ymm3,ymm12
909	vpaddq	ymm8,ymm8,ymm0
910
911	mov	rax,rbx
912	imul	rax,QWORD[((-128))+rsi]
913	add	r10,rax
914	vmovdqu	ymm12,YMMWORD[((-8+32-128))+rsi]
915	mov	rax,rbx
916	imul	rax,QWORD[((8-128))+rsi]
917	add	r11,rax
918	vmovdqu	ymm13,YMMWORD[((-8+64-128))+rsi]
919
920	mov	rax,r10
921	vpblendd	ymm9,ymm9,ymm14,0xfc
922	imul	eax,r8d
923	vpaddq	ymm4,ymm4,ymm9
924	and	eax,0x1fffffff
925
926	imul	rbx,QWORD[((16-128))+rsi]
927	add	r12,rbx
928	vpmuludq	ymm12,ymm12,ymm10
929	vmovd	xmm11,eax
930	vmovdqu	ymm0,YMMWORD[((-8+96-128))+rsi]
931	vpaddq	ymm1,ymm1,ymm12
932	vpmuludq	ymm13,ymm13,ymm10
933	vpbroadcastq	ymm11,xmm11
934	vmovdqu	ymm12,YMMWORD[((-8+128-128))+rsi]
935	vpaddq	ymm2,ymm2,ymm13
936	vpmuludq	ymm0,ymm0,ymm10
937	vmovdqu	ymm13,YMMWORD[((-8+160-128))+rsi]
938	vpaddq	ymm3,ymm3,ymm0
939	vpmuludq	ymm12,ymm12,ymm10
940	vmovdqu	ymm0,YMMWORD[((-8+192-128))+rsi]
941	vpaddq	ymm4,ymm4,ymm12
942	vpmuludq	ymm13,ymm13,ymm10
943	vmovdqu	ymm12,YMMWORD[((-8+224-128))+rsi]
944	vpaddq	ymm5,ymm5,ymm13
945	vpmuludq	ymm0,ymm0,ymm10
946	vmovdqu	ymm13,YMMWORD[((-8+256-128))+rsi]
947	vpaddq	ymm6,ymm6,ymm0
948	vpmuludq	ymm12,ymm12,ymm10
949	vmovdqu	ymm9,YMMWORD[((-8+288-128))+rsi]
950	vpaddq	ymm7,ymm7,ymm12
951	vpmuludq	ymm13,ymm13,ymm10
952	vpaddq	ymm8,ymm8,ymm13
953	vpmuludq	ymm9,ymm9,ymm10
954	vpbroadcastq	ymm10,QWORD[16+r13]
955
956	mov	rdx,rax
957	imul	rax,QWORD[((-128))+rcx]
958	add	r10,rax
959	vmovdqu	ymm0,YMMWORD[((-8+32-128))+rcx]
960	mov	rax,rdx
961	imul	rax,QWORD[((8-128))+rcx]
962	add	r11,rax
963	vmovdqu	ymm12,YMMWORD[((-8+64-128))+rcx]
964	shr	r10,29
965	imul	rdx,QWORD[((16-128))+rcx]
966	add	r12,rdx
967	add	r11,r10
968
969	vpmuludq	ymm0,ymm0,ymm11
970	vmovq	rbx,xmm10
971	vmovdqu	ymm13,YMMWORD[((-8+96-128))+rcx]
972	vpaddq	ymm1,ymm1,ymm0
973	vpmuludq	ymm12,ymm12,ymm11
974	vmovdqu	ymm0,YMMWORD[((-8+128-128))+rcx]
975	vpaddq	ymm2,ymm2,ymm12
976	vpmuludq	ymm13,ymm13,ymm11
977	vmovdqu	ymm12,YMMWORD[((-8+160-128))+rcx]
978	vpaddq	ymm3,ymm3,ymm13
979	vpmuludq	ymm0,ymm0,ymm11
980	vmovdqu	ymm13,YMMWORD[((-8+192-128))+rcx]
981	vpaddq	ymm4,ymm4,ymm0
982	vpmuludq	ymm12,ymm12,ymm11
983	vmovdqu	ymm0,YMMWORD[((-8+224-128))+rcx]
984	vpaddq	ymm5,ymm5,ymm12
985	vpmuludq	ymm13,ymm13,ymm11
986	vmovdqu	ymm12,YMMWORD[((-8+256-128))+rcx]
987	vpaddq	ymm6,ymm6,ymm13
988	vpmuludq	ymm0,ymm0,ymm11
989	vmovdqu	ymm13,YMMWORD[((-8+288-128))+rcx]
990	vpaddq	ymm7,ymm7,ymm0
991	vpmuludq	ymm12,ymm12,ymm11
992	vpaddq	ymm8,ymm8,ymm12
993	vpmuludq	ymm13,ymm13,ymm11
994	vpaddq	ymm9,ymm9,ymm13
995
996	vmovdqu	ymm0,YMMWORD[((-16+32-128))+rsi]
997	mov	rax,rbx
998	imul	rax,QWORD[((-128))+rsi]
999	add	rax,r11
1000
1001	vmovdqu	ymm12,YMMWORD[((-16+64-128))+rsi]
1002	mov	r11,rax
1003	imul	eax,r8d
1004	and	eax,0x1fffffff
1005
1006	imul	rbx,QWORD[((8-128))+rsi]
1007	add	r12,rbx
1008	vpmuludq	ymm0,ymm0,ymm10
1009	vmovd	xmm11,eax
1010	vmovdqu	ymm13,YMMWORD[((-16+96-128))+rsi]
1011	vpaddq	ymm1,ymm1,ymm0
1012	vpmuludq	ymm12,ymm12,ymm10
1013	vpbroadcastq	ymm11,xmm11
1014	vmovdqu	ymm0,YMMWORD[((-16+128-128))+rsi]
1015	vpaddq	ymm2,ymm2,ymm12
1016	vpmuludq	ymm13,ymm13,ymm10
1017	vmovdqu	ymm12,YMMWORD[((-16+160-128))+rsi]
1018	vpaddq	ymm3,ymm3,ymm13
1019	vpmuludq	ymm0,ymm0,ymm10
1020	vmovdqu	ymm13,YMMWORD[((-16+192-128))+rsi]
1021	vpaddq	ymm4,ymm4,ymm0
1022	vpmuludq	ymm12,ymm12,ymm10
1023	vmovdqu	ymm0,YMMWORD[((-16+224-128))+rsi]
1024	vpaddq	ymm5,ymm5,ymm12
1025	vpmuludq	ymm13,ymm13,ymm10
1026	vmovdqu	ymm12,YMMWORD[((-16+256-128))+rsi]
1027	vpaddq	ymm6,ymm6,ymm13
1028	vpmuludq	ymm0,ymm0,ymm10
1029	vmovdqu	ymm13,YMMWORD[((-16+288-128))+rsi]
1030	vpaddq	ymm7,ymm7,ymm0
1031	vpmuludq	ymm12,ymm12,ymm10
1032	vpaddq	ymm8,ymm8,ymm12
1033	vpmuludq	ymm13,ymm13,ymm10
1034	vpbroadcastq	ymm10,QWORD[24+r13]
1035	vpaddq	ymm9,ymm9,ymm13
1036
1037	vmovdqu	ymm0,YMMWORD[((-16+32-128))+rcx]
1038	mov	rdx,rax
1039	imul	rax,QWORD[((-128))+rcx]
1040	add	r11,rax
1041	vmovdqu	ymm12,YMMWORD[((-16+64-128))+rcx]
1042	imul	rdx,QWORD[((8-128))+rcx]
1043	add	r12,rdx
1044	shr	r11,29
1045
1046	vpmuludq	ymm0,ymm0,ymm11
1047	vmovq	rbx,xmm10
1048	vmovdqu	ymm13,YMMWORD[((-16+96-128))+rcx]
1049	vpaddq	ymm1,ymm1,ymm0
1050	vpmuludq	ymm12,ymm12,ymm11
1051	vmovdqu	ymm0,YMMWORD[((-16+128-128))+rcx]
1052	vpaddq	ymm2,ymm2,ymm12
1053	vpmuludq	ymm13,ymm13,ymm11
1054	vmovdqu	ymm12,YMMWORD[((-16+160-128))+rcx]
1055	vpaddq	ymm3,ymm3,ymm13
1056	vpmuludq	ymm0,ymm0,ymm11
1057	vmovdqu	ymm13,YMMWORD[((-16+192-128))+rcx]
1058	vpaddq	ymm4,ymm4,ymm0
1059	vpmuludq	ymm12,ymm12,ymm11
1060	vmovdqu	ymm0,YMMWORD[((-16+224-128))+rcx]
1061	vpaddq	ymm5,ymm5,ymm12
1062	vpmuludq	ymm13,ymm13,ymm11
1063	vmovdqu	ymm12,YMMWORD[((-16+256-128))+rcx]
1064	vpaddq	ymm6,ymm6,ymm13
1065	vpmuludq	ymm0,ymm0,ymm11
1066	vmovdqu	ymm13,YMMWORD[((-16+288-128))+rcx]
1067	vpaddq	ymm7,ymm7,ymm0
1068	vpmuludq	ymm12,ymm12,ymm11
1069	vmovdqu	ymm0,YMMWORD[((-24+32-128))+rsi]
1070	vpaddq	ymm8,ymm8,ymm12
1071	vpmuludq	ymm13,ymm13,ymm11
1072	vmovdqu	ymm12,YMMWORD[((-24+64-128))+rsi]
1073	vpaddq	ymm9,ymm9,ymm13
1074
1075	add	r12,r11
1076	imul	rbx,QWORD[((-128))+rsi]
1077	add	r12,rbx
1078
1079	mov	rax,r12
1080	imul	eax,r8d
1081	and	eax,0x1fffffff
1082
1083	vpmuludq	ymm0,ymm0,ymm10
1084	vmovd	xmm11,eax
1085	vmovdqu	ymm13,YMMWORD[((-24+96-128))+rsi]
1086	vpaddq	ymm1,ymm1,ymm0
1087	vpmuludq	ymm12,ymm12,ymm10
1088	vpbroadcastq	ymm11,xmm11
1089	vmovdqu	ymm0,YMMWORD[((-24+128-128))+rsi]
1090	vpaddq	ymm2,ymm2,ymm12
1091	vpmuludq	ymm13,ymm13,ymm10
1092	vmovdqu	ymm12,YMMWORD[((-24+160-128))+rsi]
1093	vpaddq	ymm3,ymm3,ymm13
1094	vpmuludq	ymm0,ymm0,ymm10
1095	vmovdqu	ymm13,YMMWORD[((-24+192-128))+rsi]
1096	vpaddq	ymm4,ymm4,ymm0
1097	vpmuludq	ymm12,ymm12,ymm10
1098	vmovdqu	ymm0,YMMWORD[((-24+224-128))+rsi]
1099	vpaddq	ymm5,ymm5,ymm12
1100	vpmuludq	ymm13,ymm13,ymm10
1101	vmovdqu	ymm12,YMMWORD[((-24+256-128))+rsi]
1102	vpaddq	ymm6,ymm6,ymm13
1103	vpmuludq	ymm0,ymm0,ymm10
1104	vmovdqu	ymm13,YMMWORD[((-24+288-128))+rsi]
1105	vpaddq	ymm7,ymm7,ymm0
1106	vpmuludq	ymm12,ymm12,ymm10
1107	vpaddq	ymm8,ymm8,ymm12
1108	vpmuludq	ymm13,ymm13,ymm10
1109	vpbroadcastq	ymm10,QWORD[32+r13]
1110	vpaddq	ymm9,ymm9,ymm13
1111	add	r13,32
1112
1113	vmovdqu	ymm0,YMMWORD[((-24+32-128))+rcx]
1114	imul	rax,QWORD[((-128))+rcx]
1115	add	r12,rax
1116	shr	r12,29
1117
1118	vmovdqu	ymm12,YMMWORD[((-24+64-128))+rcx]
1119	vpmuludq	ymm0,ymm0,ymm11
1120	vmovq	rbx,xmm10
1121	vmovdqu	ymm13,YMMWORD[((-24+96-128))+rcx]
1122	vpaddq	ymm0,ymm1,ymm0
1123	vpmuludq	ymm12,ymm12,ymm11
1124	vmovdqu	YMMWORD[rsp],ymm0
1125	vpaddq	ymm1,ymm2,ymm12
1126	vmovdqu	ymm0,YMMWORD[((-24+128-128))+rcx]
1127	vpmuludq	ymm13,ymm13,ymm11
1128	vmovdqu	ymm12,YMMWORD[((-24+160-128))+rcx]
1129	vpaddq	ymm2,ymm3,ymm13
1130	vpmuludq	ymm0,ymm0,ymm11
1131	vmovdqu	ymm13,YMMWORD[((-24+192-128))+rcx]
1132	vpaddq	ymm3,ymm4,ymm0
1133	vpmuludq	ymm12,ymm12,ymm11
1134	vmovdqu	ymm0,YMMWORD[((-24+224-128))+rcx]
1135	vpaddq	ymm4,ymm5,ymm12
1136	vpmuludq	ymm13,ymm13,ymm11
1137	vmovdqu	ymm12,YMMWORD[((-24+256-128))+rcx]
1138	vpaddq	ymm5,ymm6,ymm13
1139	vpmuludq	ymm0,ymm0,ymm11
1140	vmovdqu	ymm13,YMMWORD[((-24+288-128))+rcx]
1141	mov	r9,r12
1142	vpaddq	ymm6,ymm7,ymm0
1143	vpmuludq	ymm12,ymm12,ymm11
1144	add	r9,QWORD[rsp]
1145	vpaddq	ymm7,ymm8,ymm12
1146	vpmuludq	ymm13,ymm13,ymm11
1147	vmovq	xmm12,r12
1148	vpaddq	ymm8,ymm9,ymm13
1149
1150	dec	r14d
1151	jnz	NEAR $L$oop_mul_1024
1152	vpaddq	ymm0,ymm12,YMMWORD[rsp]
1153
1154	vpsrlq	ymm12,ymm0,29
1155	vpand	ymm0,ymm0,ymm15
1156	vpsrlq	ymm13,ymm1,29
1157	vpand	ymm1,ymm1,ymm15
1158	vpsrlq	ymm10,ymm2,29
1159	vpermq	ymm12,ymm12,0x93
1160	vpand	ymm2,ymm2,ymm15
1161	vpsrlq	ymm11,ymm3,29
1162	vpermq	ymm13,ymm13,0x93
1163	vpand	ymm3,ymm3,ymm15
1164
1165	vpblendd	ymm9,ymm12,ymm14,3
1166	vpermq	ymm10,ymm10,0x93
1167	vpblendd	ymm12,ymm13,ymm12,3
1168	vpermq	ymm11,ymm11,0x93
1169	vpaddq	ymm0,ymm0,ymm9
1170	vpblendd	ymm13,ymm10,ymm13,3
1171	vpaddq	ymm1,ymm1,ymm12
1172	vpblendd	ymm10,ymm11,ymm10,3
1173	vpaddq	ymm2,ymm2,ymm13
1174	vpblendd	ymm11,ymm14,ymm11,3
1175	vpaddq	ymm3,ymm3,ymm10
1176	vpaddq	ymm4,ymm4,ymm11
1177
1178	vpsrlq	ymm12,ymm0,29
1179	vpand	ymm0,ymm0,ymm15
1180	vpsrlq	ymm13,ymm1,29
1181	vpand	ymm1,ymm1,ymm15
1182	vpsrlq	ymm10,ymm2,29
1183	vpermq	ymm12,ymm12,0x93
1184	vpand	ymm2,ymm2,ymm15
1185	vpsrlq	ymm11,ymm3,29
1186	vpermq	ymm13,ymm13,0x93
1187	vpand	ymm3,ymm3,ymm15
1188	vpermq	ymm10,ymm10,0x93
1189
1190	vpblendd	ymm9,ymm12,ymm14,3
1191	vpermq	ymm11,ymm11,0x93
1192	vpblendd	ymm12,ymm13,ymm12,3
1193	vpaddq	ymm0,ymm0,ymm9
1194	vpblendd	ymm13,ymm10,ymm13,3
1195	vpaddq	ymm1,ymm1,ymm12
1196	vpblendd	ymm10,ymm11,ymm10,3
1197	vpaddq	ymm2,ymm2,ymm13
1198	vpblendd	ymm11,ymm14,ymm11,3
1199	vpaddq	ymm3,ymm3,ymm10
1200	vpaddq	ymm4,ymm4,ymm11
1201
1202	vmovdqu	YMMWORD[(0-128)+rdi],ymm0
1203	vmovdqu	YMMWORD[(32-128)+rdi],ymm1
1204	vmovdqu	YMMWORD[(64-128)+rdi],ymm2
1205	vmovdqu	YMMWORD[(96-128)+rdi],ymm3
1206	vpsrlq	ymm12,ymm4,29
1207	vpand	ymm4,ymm4,ymm15
1208	vpsrlq	ymm13,ymm5,29
1209	vpand	ymm5,ymm5,ymm15
1210	vpsrlq	ymm10,ymm6,29
1211	vpermq	ymm12,ymm12,0x93
1212	vpand	ymm6,ymm6,ymm15
1213	vpsrlq	ymm11,ymm7,29
1214	vpermq	ymm13,ymm13,0x93
1215	vpand	ymm7,ymm7,ymm15
1216	vpsrlq	ymm0,ymm8,29
1217	vpermq	ymm10,ymm10,0x93
1218	vpand	ymm8,ymm8,ymm15
1219	vpermq	ymm11,ymm11,0x93
1220
1221	vpblendd	ymm9,ymm12,ymm14,3
1222	vpermq	ymm0,ymm0,0x93
1223	vpblendd	ymm12,ymm13,ymm12,3
1224	vpaddq	ymm4,ymm4,ymm9
1225	vpblendd	ymm13,ymm10,ymm13,3
1226	vpaddq	ymm5,ymm5,ymm12
1227	vpblendd	ymm10,ymm11,ymm10,3
1228	vpaddq	ymm6,ymm6,ymm13
1229	vpblendd	ymm11,ymm0,ymm11,3
1230	vpaddq	ymm7,ymm7,ymm10
1231	vpaddq	ymm8,ymm8,ymm11
1232
1233	vpsrlq	ymm12,ymm4,29
1234	vpand	ymm4,ymm4,ymm15
1235	vpsrlq	ymm13,ymm5,29
1236	vpand	ymm5,ymm5,ymm15
1237	vpsrlq	ymm10,ymm6,29
1238	vpermq	ymm12,ymm12,0x93
1239	vpand	ymm6,ymm6,ymm15
1240	vpsrlq	ymm11,ymm7,29
1241	vpermq	ymm13,ymm13,0x93
1242	vpand	ymm7,ymm7,ymm15
1243	vpsrlq	ymm0,ymm8,29
1244	vpermq	ymm10,ymm10,0x93
1245	vpand	ymm8,ymm8,ymm15
1246	vpermq	ymm11,ymm11,0x93
1247
1248	vpblendd	ymm9,ymm12,ymm14,3
1249	vpermq	ymm0,ymm0,0x93
1250	vpblendd	ymm12,ymm13,ymm12,3
1251	vpaddq	ymm4,ymm4,ymm9
1252	vpblendd	ymm13,ymm10,ymm13,3
1253	vpaddq	ymm5,ymm5,ymm12
1254	vpblendd	ymm10,ymm11,ymm10,3
1255	vpaddq	ymm6,ymm6,ymm13
1256	vpblendd	ymm11,ymm0,ymm11,3
1257	vpaddq	ymm7,ymm7,ymm10
1258	vpaddq	ymm8,ymm8,ymm11
1259
1260	vmovdqu	YMMWORD[(128-128)+rdi],ymm4
1261	vmovdqu	YMMWORD[(160-128)+rdi],ymm5
1262	vmovdqu	YMMWORD[(192-128)+rdi],ymm6
1263	vmovdqu	YMMWORD[(224-128)+rdi],ymm7
1264	vmovdqu	YMMWORD[(256-128)+rdi],ymm8
1265	vzeroupper
1266
1267	mov	rax,rbp
1268
1269$L$mul_1024_in_tail:
1270	movaps	xmm6,XMMWORD[((-216))+rax]
1271	movaps	xmm7,XMMWORD[((-200))+rax]
1272	movaps	xmm8,XMMWORD[((-184))+rax]
1273	movaps	xmm9,XMMWORD[((-168))+rax]
1274	movaps	xmm10,XMMWORD[((-152))+rax]
1275	movaps	xmm11,XMMWORD[((-136))+rax]
1276	movaps	xmm12,XMMWORD[((-120))+rax]
1277	movaps	xmm13,XMMWORD[((-104))+rax]
1278	movaps	xmm14,XMMWORD[((-88))+rax]
1279	movaps	xmm15,XMMWORD[((-72))+rax]
1280	mov	r15,QWORD[((-48))+rax]
1281
1282	mov	r14,QWORD[((-40))+rax]
1283
1284	mov	r13,QWORD[((-32))+rax]
1285
1286	mov	r12,QWORD[((-24))+rax]
1287
1288	mov	rbp,QWORD[((-16))+rax]
1289
1290	mov	rbx,QWORD[((-8))+rax]
1291
1292	lea	rsp,[rax]
1293
1294$L$mul_1024_epilogue:
1295	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
1296	mov	rsi,QWORD[16+rsp]
1297	ret
1298
1299$L$SEH_end_rsaz_1024_mul_avx2:
1300global	rsaz_1024_red2norm_avx2
1301
1302ALIGN	32
1303rsaz_1024_red2norm_avx2:
1304
1305_CET_ENDBR
1306	sub	rdx,-128
1307	xor	rax,rax
1308	mov	r8,QWORD[((-128))+rdx]
1309	mov	r9,QWORD[((-120))+rdx]
1310	mov	r10,QWORD[((-112))+rdx]
1311	shl	r8,0
1312	shl	r9,29
1313	mov	r11,r10
1314	shl	r10,58
1315	shr	r11,6
1316	add	rax,r8
1317	add	rax,r9
1318	add	rax,r10
1319	adc	r11,0
1320	mov	QWORD[rcx],rax
1321	mov	rax,r11
1322	mov	r8,QWORD[((-104))+rdx]
1323	mov	r9,QWORD[((-96))+rdx]
1324	shl	r8,23
1325	mov	r10,r9
1326	shl	r9,52
1327	shr	r10,12
1328	add	rax,r8
1329	add	rax,r9
1330	adc	r10,0
1331	mov	QWORD[8+rcx],rax
1332	mov	rax,r10
1333	mov	r11,QWORD[((-88))+rdx]
1334	mov	r8,QWORD[((-80))+rdx]
1335	shl	r11,17
1336	mov	r9,r8
1337	shl	r8,46
1338	shr	r9,18
1339	add	rax,r11
1340	add	rax,r8
1341	adc	r9,0
1342	mov	QWORD[16+rcx],rax
1343	mov	rax,r9
1344	mov	r10,QWORD[((-72))+rdx]
1345	mov	r11,QWORD[((-64))+rdx]
1346	shl	r10,11
1347	mov	r8,r11
1348	shl	r11,40
1349	shr	r8,24
1350	add	rax,r10
1351	add	rax,r11
1352	adc	r8,0
1353	mov	QWORD[24+rcx],rax
1354	mov	rax,r8
1355	mov	r9,QWORD[((-56))+rdx]
1356	mov	r10,QWORD[((-48))+rdx]
1357	mov	r11,QWORD[((-40))+rdx]
1358	shl	r9,5
1359	shl	r10,34
1360	mov	r8,r11
1361	shl	r11,63
1362	shr	r8,1
1363	add	rax,r9
1364	add	rax,r10
1365	add	rax,r11
1366	adc	r8,0
1367	mov	QWORD[32+rcx],rax
1368	mov	rax,r8
1369	mov	r9,QWORD[((-32))+rdx]
1370	mov	r10,QWORD[((-24))+rdx]
1371	shl	r9,28
1372	mov	r11,r10
1373	shl	r10,57
1374	shr	r11,7
1375	add	rax,r9
1376	add	rax,r10
1377	adc	r11,0
1378	mov	QWORD[40+rcx],rax
1379	mov	rax,r11
1380	mov	r8,QWORD[((-16))+rdx]
1381	mov	r9,QWORD[((-8))+rdx]
1382	shl	r8,22
1383	mov	r10,r9
1384	shl	r9,51
1385	shr	r10,13
1386	add	rax,r8
1387	add	rax,r9
1388	adc	r10,0
1389	mov	QWORD[48+rcx],rax
1390	mov	rax,r10
1391	mov	r11,QWORD[rdx]
1392	mov	r8,QWORD[8+rdx]
1393	shl	r11,16
1394	mov	r9,r8
1395	shl	r8,45
1396	shr	r9,19
1397	add	rax,r11
1398	add	rax,r8
1399	adc	r9,0
1400	mov	QWORD[56+rcx],rax
1401	mov	rax,r9
1402	mov	r10,QWORD[16+rdx]
1403	mov	r11,QWORD[24+rdx]
1404	shl	r10,10
1405	mov	r8,r11
1406	shl	r11,39
1407	shr	r8,25
1408	add	rax,r10
1409	add	rax,r11
1410	adc	r8,0
1411	mov	QWORD[64+rcx],rax
1412	mov	rax,r8
1413	mov	r9,QWORD[32+rdx]
1414	mov	r10,QWORD[40+rdx]
1415	mov	r11,QWORD[48+rdx]
1416	shl	r9,4
1417	shl	r10,33
1418	mov	r8,r11
1419	shl	r11,62
1420	shr	r8,2
1421	add	rax,r9
1422	add	rax,r10
1423	add	rax,r11
1424	adc	r8,0
1425	mov	QWORD[72+rcx],rax
1426	mov	rax,r8
1427	mov	r9,QWORD[56+rdx]
1428	mov	r10,QWORD[64+rdx]
1429	shl	r9,27
1430	mov	r11,r10
1431	shl	r10,56
1432	shr	r11,8
1433	add	rax,r9
1434	add	rax,r10
1435	adc	r11,0
1436	mov	QWORD[80+rcx],rax
1437	mov	rax,r11
1438	mov	r8,QWORD[72+rdx]
1439	mov	r9,QWORD[80+rdx]
1440	shl	r8,21
1441	mov	r10,r9
1442	shl	r9,50
1443	shr	r10,14
1444	add	rax,r8
1445	add	rax,r9
1446	adc	r10,0
1447	mov	QWORD[88+rcx],rax
1448	mov	rax,r10
1449	mov	r11,QWORD[88+rdx]
1450	mov	r8,QWORD[96+rdx]
1451	shl	r11,15
1452	mov	r9,r8
1453	shl	r8,44
1454	shr	r9,20
1455	add	rax,r11
1456	add	rax,r8
1457	adc	r9,0
1458	mov	QWORD[96+rcx],rax
1459	mov	rax,r9
1460	mov	r10,QWORD[104+rdx]
1461	mov	r11,QWORD[112+rdx]
1462	shl	r10,9
1463	mov	r8,r11
1464	shl	r11,38
1465	shr	r8,26
1466	add	rax,r10
1467	add	rax,r11
1468	adc	r8,0
1469	mov	QWORD[104+rcx],rax
1470	mov	rax,r8
1471	mov	r9,QWORD[120+rdx]
1472	mov	r10,QWORD[128+rdx]
1473	mov	r11,QWORD[136+rdx]
1474	shl	r9,3
1475	shl	r10,32
1476	mov	r8,r11
1477	shl	r11,61
1478	shr	r8,3
1479	add	rax,r9
1480	add	rax,r10
1481	add	rax,r11
1482	adc	r8,0
1483	mov	QWORD[112+rcx],rax
1484	mov	rax,r8
1485	mov	r9,QWORD[144+rdx]
1486	mov	r10,QWORD[152+rdx]
1487	shl	r9,26
1488	mov	r11,r10
1489	shl	r10,55
1490	shr	r11,9
1491	add	rax,r9
1492	add	rax,r10
1493	adc	r11,0
1494	mov	QWORD[120+rcx],rax
1495	mov	rax,r11
1496	ret
1497
1498
1499
1500global	rsaz_1024_norm2red_avx2
1501
1502ALIGN	32
1503rsaz_1024_norm2red_avx2:
1504
1505_CET_ENDBR
1506	sub	rcx,-128
1507	mov	r8,QWORD[rdx]
1508	mov	eax,0x1fffffff
1509	mov	r9,QWORD[8+rdx]
1510	mov	r11,r8
1511	shr	r11,0
1512	and	r11,rax
1513	mov	QWORD[((-128))+rcx],r11
1514	mov	r10,r8
1515	shr	r10,29
1516	and	r10,rax
1517	mov	QWORD[((-120))+rcx],r10
1518	shrd	r8,r9,58
1519	and	r8,rax
1520	mov	QWORD[((-112))+rcx],r8
1521	mov	r10,QWORD[16+rdx]
1522	mov	r8,r9
1523	shr	r8,23
1524	and	r8,rax
1525	mov	QWORD[((-104))+rcx],r8
1526	shrd	r9,r10,52
1527	and	r9,rax
1528	mov	QWORD[((-96))+rcx],r9
1529	mov	r11,QWORD[24+rdx]
1530	mov	r9,r10
1531	shr	r9,17
1532	and	r9,rax
1533	mov	QWORD[((-88))+rcx],r9
1534	shrd	r10,r11,46
1535	and	r10,rax
1536	mov	QWORD[((-80))+rcx],r10
1537	mov	r8,QWORD[32+rdx]
1538	mov	r10,r11
1539	shr	r10,11
1540	and	r10,rax
1541	mov	QWORD[((-72))+rcx],r10
1542	shrd	r11,r8,40
1543	and	r11,rax
1544	mov	QWORD[((-64))+rcx],r11
1545	mov	r9,QWORD[40+rdx]
1546	mov	r11,r8
1547	shr	r11,5
1548	and	r11,rax
1549	mov	QWORD[((-56))+rcx],r11
1550	mov	r10,r8
1551	shr	r10,34
1552	and	r10,rax
1553	mov	QWORD[((-48))+rcx],r10
1554	shrd	r8,r9,63
1555	and	r8,rax
1556	mov	QWORD[((-40))+rcx],r8
1557	mov	r10,QWORD[48+rdx]
1558	mov	r8,r9
1559	shr	r8,28
1560	and	r8,rax
1561	mov	QWORD[((-32))+rcx],r8
1562	shrd	r9,r10,57
1563	and	r9,rax
1564	mov	QWORD[((-24))+rcx],r9
1565	mov	r11,QWORD[56+rdx]
1566	mov	r9,r10
1567	shr	r9,22
1568	and	r9,rax
1569	mov	QWORD[((-16))+rcx],r9
1570	shrd	r10,r11,51
1571	and	r10,rax
1572	mov	QWORD[((-8))+rcx],r10
1573	mov	r8,QWORD[64+rdx]
1574	mov	r10,r11
1575	shr	r10,16
1576	and	r10,rax
1577	mov	QWORD[rcx],r10
1578	shrd	r11,r8,45
1579	and	r11,rax
1580	mov	QWORD[8+rcx],r11
1581	mov	r9,QWORD[72+rdx]
1582	mov	r11,r8
1583	shr	r11,10
1584	and	r11,rax
1585	mov	QWORD[16+rcx],r11
1586	shrd	r8,r9,39
1587	and	r8,rax
1588	mov	QWORD[24+rcx],r8
1589	mov	r10,QWORD[80+rdx]
1590	mov	r8,r9
1591	shr	r8,4
1592	and	r8,rax
1593	mov	QWORD[32+rcx],r8
1594	mov	r11,r9
1595	shr	r11,33
1596	and	r11,rax
1597	mov	QWORD[40+rcx],r11
1598	shrd	r9,r10,62
1599	and	r9,rax
1600	mov	QWORD[48+rcx],r9
1601	mov	r11,QWORD[88+rdx]
1602	mov	r9,r10
1603	shr	r9,27
1604	and	r9,rax
1605	mov	QWORD[56+rcx],r9
1606	shrd	r10,r11,56
1607	and	r10,rax
1608	mov	QWORD[64+rcx],r10
1609	mov	r8,QWORD[96+rdx]
1610	mov	r10,r11
1611	shr	r10,21
1612	and	r10,rax
1613	mov	QWORD[72+rcx],r10
1614	shrd	r11,r8,50
1615	and	r11,rax
1616	mov	QWORD[80+rcx],r11
1617	mov	r9,QWORD[104+rdx]
1618	mov	r11,r8
1619	shr	r11,15
1620	and	r11,rax
1621	mov	QWORD[88+rcx],r11
1622	shrd	r8,r9,44
1623	and	r8,rax
1624	mov	QWORD[96+rcx],r8
1625	mov	r10,QWORD[112+rdx]
1626	mov	r8,r9
1627	shr	r8,9
1628	and	r8,rax
1629	mov	QWORD[104+rcx],r8
1630	shrd	r9,r10,38
1631	and	r9,rax
1632	mov	QWORD[112+rcx],r9
1633	mov	r11,QWORD[120+rdx]
1634	mov	r9,r10
1635	shr	r9,3
1636	and	r9,rax
1637	mov	QWORD[120+rcx],r9
1638	mov	r8,r10
1639	shr	r8,32
1640	and	r8,rax
1641	mov	QWORD[128+rcx],r8
1642	shrd	r10,r11,61
1643	and	r10,rax
1644	mov	QWORD[136+rcx],r10
1645	xor	r8,r8
1646	mov	r10,r11
1647	shr	r10,26
1648	and	r10,rax
1649	mov	QWORD[144+rcx],r10
1650	shrd	r11,r8,55
1651	and	r11,rax
1652	mov	QWORD[152+rcx],r11
1653	mov	QWORD[160+rcx],r8
1654	mov	QWORD[168+rcx],r8
1655	mov	QWORD[176+rcx],r8
1656	mov	QWORD[184+rcx],r8
1657	ret
1658
1659
1660global	rsaz_1024_scatter5_avx2
1661
1662ALIGN	32
1663rsaz_1024_scatter5_avx2:
1664
1665_CET_ENDBR
1666	vzeroupper
1667	vmovdqu	ymm5,YMMWORD[$L$scatter_permd]
1668	shl	r8d,4
1669	lea	rcx,[r8*1+rcx]
1670	mov	eax,9
1671	jmp	NEAR $L$oop_scatter_1024
1672
1673ALIGN	32
1674$L$oop_scatter_1024:
1675	vmovdqu	ymm0,YMMWORD[rdx]
1676	lea	rdx,[32+rdx]
1677	vpermd	ymm0,ymm5,ymm0
1678	vmovdqu	XMMWORD[rcx],xmm0
1679	lea	rcx,[512+rcx]
1680	dec	eax
1681	jnz	NEAR $L$oop_scatter_1024
1682
1683	vzeroupper
1684	ret
1685
1686
1687
1688global	rsaz_1024_gather5_avx2
1689
1690ALIGN	32
1691rsaz_1024_gather5_avx2:
1692
1693_CET_ENDBR
1694	vzeroupper
1695	mov	r11,rsp
1696
1697	lea	rax,[((-136))+rsp]
1698$L$SEH_begin_rsaz_1024_gather5:
1699
1700	DB	0x48,0x8d,0x60,0xe0
1701	DB	0xc5,0xf8,0x29,0x70,0xe0
1702	DB	0xc5,0xf8,0x29,0x78,0xf0
1703	DB	0xc5,0x78,0x29,0x40,0x00
1704	DB	0xc5,0x78,0x29,0x48,0x10
1705	DB	0xc5,0x78,0x29,0x50,0x20
1706	DB	0xc5,0x78,0x29,0x58,0x30
1707	DB	0xc5,0x78,0x29,0x60,0x40
1708	DB	0xc5,0x78,0x29,0x68,0x50
1709	DB	0xc5,0x78,0x29,0x70,0x60
1710	DB	0xc5,0x78,0x29,0x78,0x70
1711	lea	rsp,[((-256))+rsp]
1712	and	rsp,-32
1713	lea	r10,[$L$inc]
1714	lea	rax,[((-128))+rsp]
1715
1716	vmovd	xmm4,r8d
1717	vmovdqa	ymm0,YMMWORD[r10]
1718	vmovdqa	ymm1,YMMWORD[32+r10]
1719	vmovdqa	ymm5,YMMWORD[64+r10]
1720	vpbroadcastd	ymm4,xmm4
1721
1722	vpaddd	ymm2,ymm0,ymm5
1723	vpcmpeqd	ymm0,ymm0,ymm4
1724	vpaddd	ymm3,ymm1,ymm5
1725	vpcmpeqd	ymm1,ymm1,ymm4
1726	vmovdqa	YMMWORD[(0+128)+rax],ymm0
1727	vpaddd	ymm0,ymm2,ymm5
1728	vpcmpeqd	ymm2,ymm2,ymm4
1729	vmovdqa	YMMWORD[(32+128)+rax],ymm1
1730	vpaddd	ymm1,ymm3,ymm5
1731	vpcmpeqd	ymm3,ymm3,ymm4
1732	vmovdqa	YMMWORD[(64+128)+rax],ymm2
1733	vpaddd	ymm2,ymm0,ymm5
1734	vpcmpeqd	ymm0,ymm0,ymm4
1735	vmovdqa	YMMWORD[(96+128)+rax],ymm3
1736	vpaddd	ymm3,ymm1,ymm5
1737	vpcmpeqd	ymm1,ymm1,ymm4
1738	vmovdqa	YMMWORD[(128+128)+rax],ymm0
1739	vpaddd	ymm8,ymm2,ymm5
1740	vpcmpeqd	ymm2,ymm2,ymm4
1741	vmovdqa	YMMWORD[(160+128)+rax],ymm1
1742	vpaddd	ymm9,ymm3,ymm5
1743	vpcmpeqd	ymm3,ymm3,ymm4
1744	vmovdqa	YMMWORD[(192+128)+rax],ymm2
1745	vpaddd	ymm10,ymm8,ymm5
1746	vpcmpeqd	ymm8,ymm8,ymm4
1747	vmovdqa	YMMWORD[(224+128)+rax],ymm3
1748	vpaddd	ymm11,ymm9,ymm5
1749	vpcmpeqd	ymm9,ymm9,ymm4
1750	vpaddd	ymm12,ymm10,ymm5
1751	vpcmpeqd	ymm10,ymm10,ymm4
1752	vpaddd	ymm13,ymm11,ymm5
1753	vpcmpeqd	ymm11,ymm11,ymm4
1754	vpaddd	ymm14,ymm12,ymm5
1755	vpcmpeqd	ymm12,ymm12,ymm4
1756	vpaddd	ymm15,ymm13,ymm5
1757	vpcmpeqd	ymm13,ymm13,ymm4
1758	vpcmpeqd	ymm14,ymm14,ymm4
1759	vpcmpeqd	ymm15,ymm15,ymm4
1760
1761	vmovdqa	ymm7,YMMWORD[((-32))+r10]
1762	lea	rdx,[128+rdx]
1763	mov	r8d,9
1764
1765$L$oop_gather_1024:
1766	vmovdqa	ymm0,YMMWORD[((0-128))+rdx]
1767	vmovdqa	ymm1,YMMWORD[((32-128))+rdx]
1768	vmovdqa	ymm2,YMMWORD[((64-128))+rdx]
1769	vmovdqa	ymm3,YMMWORD[((96-128))+rdx]
1770	vpand	ymm0,ymm0,YMMWORD[((0+128))+rax]
1771	vpand	ymm1,ymm1,YMMWORD[((32+128))+rax]
1772	vpand	ymm2,ymm2,YMMWORD[((64+128))+rax]
1773	vpor	ymm4,ymm1,ymm0
1774	vpand	ymm3,ymm3,YMMWORD[((96+128))+rax]
1775	vmovdqa	ymm0,YMMWORD[((128-128))+rdx]
1776	vmovdqa	ymm1,YMMWORD[((160-128))+rdx]
1777	vpor	ymm5,ymm3,ymm2
1778	vmovdqa	ymm2,YMMWORD[((192-128))+rdx]
1779	vmovdqa	ymm3,YMMWORD[((224-128))+rdx]
1780	vpand	ymm0,ymm0,YMMWORD[((128+128))+rax]
1781	vpand	ymm1,ymm1,YMMWORD[((160+128))+rax]
1782	vpand	ymm2,ymm2,YMMWORD[((192+128))+rax]
1783	vpor	ymm4,ymm4,ymm0
1784	vpand	ymm3,ymm3,YMMWORD[((224+128))+rax]
1785	vpand	ymm0,ymm8,YMMWORD[((256-128))+rdx]
1786	vpor	ymm5,ymm5,ymm1
1787	vpand	ymm1,ymm9,YMMWORD[((288-128))+rdx]
1788	vpor	ymm4,ymm4,ymm2
1789	vpand	ymm2,ymm10,YMMWORD[((320-128))+rdx]
1790	vpor	ymm5,ymm5,ymm3
1791	vpand	ymm3,ymm11,YMMWORD[((352-128))+rdx]
1792	vpor	ymm4,ymm4,ymm0
1793	vpand	ymm0,ymm12,YMMWORD[((384-128))+rdx]
1794	vpor	ymm5,ymm5,ymm1
1795	vpand	ymm1,ymm13,YMMWORD[((416-128))+rdx]
1796	vpor	ymm4,ymm4,ymm2
1797	vpand	ymm2,ymm14,YMMWORD[((448-128))+rdx]
1798	vpor	ymm5,ymm5,ymm3
1799	vpand	ymm3,ymm15,YMMWORD[((480-128))+rdx]
1800	lea	rdx,[512+rdx]
1801	vpor	ymm4,ymm4,ymm0
1802	vpor	ymm5,ymm5,ymm1
1803	vpor	ymm4,ymm4,ymm2
1804	vpor	ymm5,ymm5,ymm3
1805
1806	vpor	ymm4,ymm4,ymm5
1807	vextracti128	xmm5,ymm4,1
1808	vpor	xmm5,xmm5,xmm4
1809	vpermd	ymm5,ymm7,ymm5
1810	vmovdqu	YMMWORD[rcx],ymm5
1811	lea	rcx,[32+rcx]
1812	dec	r8d
1813	jnz	NEAR $L$oop_gather_1024
1814
1815	vpxor	ymm0,ymm0,ymm0
1816	vmovdqu	YMMWORD[rcx],ymm0
1817	vzeroupper
1818	movaps	xmm6,XMMWORD[((-168))+r11]
1819	movaps	xmm7,XMMWORD[((-152))+r11]
1820	movaps	xmm8,XMMWORD[((-136))+r11]
1821	movaps	xmm9,XMMWORD[((-120))+r11]
1822	movaps	xmm10,XMMWORD[((-104))+r11]
1823	movaps	xmm11,XMMWORD[((-88))+r11]
1824	movaps	xmm12,XMMWORD[((-72))+r11]
1825	movaps	xmm13,XMMWORD[((-56))+r11]
1826	movaps	xmm14,XMMWORD[((-40))+r11]
1827	movaps	xmm15,XMMWORD[((-24))+r11]
1828	lea	rsp,[r11]
1829
1830	ret
1831
1832$L$SEH_end_rsaz_1024_gather5:
1833
1834section	.rdata rdata align=8
1835ALIGN	64
1836$L$and_mask:
1837	DQ	0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff
1838$L$scatter_permd:
1839	DD	0,2,4,6,7,7,7,7
1840$L$gather_permd:
1841	DD	0,7,1,7,2,7,3,7
1842$L$inc:
1843	DD	0,0,0,0,1,1,1,1
1844	DD	2,2,2,2,3,3,3,3
1845	DD	4,4,4,4,4,4,4,4
1846ALIGN	64
1847section	.text
1848
1849EXTERN	__imp_RtlVirtualUnwind
1850
1851ALIGN	16
1852rsaz_se_handler:
1853	push	rsi
1854	push	rdi
1855	push	rbx
1856	push	rbp
1857	push	r12
1858	push	r13
1859	push	r14
1860	push	r15
1861	pushfq
1862	sub	rsp,64
1863
1864	mov	rax,QWORD[120+r8]
1865	mov	rbx,QWORD[248+r8]
1866
1867	mov	rsi,QWORD[8+r9]
1868	mov	r11,QWORD[56+r9]
1869
1870	mov	r10d,DWORD[r11]
1871	lea	r10,[r10*1+rsi]
1872	cmp	rbx,r10
1873	jb	NEAR $L$common_seh_tail
1874
1875	mov	r10d,DWORD[4+r11]
1876	lea	r10,[r10*1+rsi]
1877	cmp	rbx,r10
1878	jae	NEAR $L$common_seh_tail
1879
1880	mov	rbp,QWORD[160+r8]
1881
1882	mov	r10d,DWORD[8+r11]
1883	lea	r10,[r10*1+rsi]
1884	cmp	rbx,r10
1885	cmovc	rax,rbp
1886
1887	mov	r15,QWORD[((-48))+rax]
1888	mov	r14,QWORD[((-40))+rax]
1889	mov	r13,QWORD[((-32))+rax]
1890	mov	r12,QWORD[((-24))+rax]
1891	mov	rbp,QWORD[((-16))+rax]
1892	mov	rbx,QWORD[((-8))+rax]
1893	mov	QWORD[240+r8],r15
1894	mov	QWORD[232+r8],r14
1895	mov	QWORD[224+r8],r13
1896	mov	QWORD[216+r8],r12
1897	mov	QWORD[160+r8],rbp
1898	mov	QWORD[144+r8],rbx
1899
1900	lea	rsi,[((-216))+rax]
1901	lea	rdi,[512+r8]
1902	mov	ecx,20
1903	DD	0xa548f3fc
1904
1905$L$common_seh_tail:
1906	mov	rdi,QWORD[8+rax]
1907	mov	rsi,QWORD[16+rax]
1908	mov	QWORD[152+r8],rax
1909	mov	QWORD[168+r8],rsi
1910	mov	QWORD[176+r8],rdi
1911
1912	mov	rdi,QWORD[40+r9]
1913	mov	rsi,r8
1914	mov	ecx,154
1915	DD	0xa548f3fc
1916
1917	mov	rsi,r9
1918	xor	rcx,rcx
1919	mov	rdx,QWORD[8+rsi]
1920	mov	r8,QWORD[rsi]
1921	mov	r9,QWORD[16+rsi]
1922	mov	r10,QWORD[40+rsi]
1923	lea	r11,[56+rsi]
1924	lea	r12,[24+rsi]
1925	mov	QWORD[32+rsp],r10
1926	mov	QWORD[40+rsp],r11
1927	mov	QWORD[48+rsp],r12
1928	mov	QWORD[56+rsp],rcx
1929	call	QWORD[__imp_RtlVirtualUnwind]
1930
1931	mov	eax,1
1932	add	rsp,64
1933	popfq
1934	pop	r15
1935	pop	r14
1936	pop	r13
1937	pop	r12
1938	pop	rbp
1939	pop	rbx
1940	pop	rdi
1941	pop	rsi
1942	ret
1943
1944
1945section	.pdata rdata align=4
1946ALIGN	4
1947	DD	$L$SEH_begin_rsaz_1024_sqr_avx2 wrt ..imagebase
1948	DD	$L$SEH_end_rsaz_1024_sqr_avx2 wrt ..imagebase
1949	DD	$L$SEH_info_rsaz_1024_sqr_avx2 wrt ..imagebase
1950
1951	DD	$L$SEH_begin_rsaz_1024_mul_avx2 wrt ..imagebase
1952	DD	$L$SEH_end_rsaz_1024_mul_avx2 wrt ..imagebase
1953	DD	$L$SEH_info_rsaz_1024_mul_avx2 wrt ..imagebase
1954
1955	DD	$L$SEH_begin_rsaz_1024_gather5 wrt ..imagebase
1956	DD	$L$SEH_end_rsaz_1024_gather5 wrt ..imagebase
1957	DD	$L$SEH_info_rsaz_1024_gather5 wrt ..imagebase
1958section	.xdata rdata align=8
1959ALIGN	8
1960$L$SEH_info_rsaz_1024_sqr_avx2:
1961	DB	9,0,0,0
1962	DD	rsaz_se_handler wrt ..imagebase
1963	DD	$L$sqr_1024_body wrt ..imagebase,$L$sqr_1024_epilogue wrt ..imagebase,$L$sqr_1024_in_tail wrt ..imagebase
1964	DD	0
1965$L$SEH_info_rsaz_1024_mul_avx2:
1966	DB	9,0,0,0
1967	DD	rsaz_se_handler wrt ..imagebase
1968	DD	$L$mul_1024_body wrt ..imagebase,$L$mul_1024_epilogue wrt ..imagebase,$L$mul_1024_in_tail wrt ..imagebase
1969	DD	0
1970$L$SEH_info_rsaz_1024_gather5:
1971	DB	0x01,0x36,0x17,0x0b
1972	DB	0x36,0xf8,0x09,0x00
1973	DB	0x31,0xe8,0x08,0x00
1974	DB	0x2c,0xd8,0x07,0x00
1975	DB	0x27,0xc8,0x06,0x00
1976	DB	0x22,0xb8,0x05,0x00
1977	DB	0x1d,0xa8,0x04,0x00
1978	DB	0x18,0x98,0x03,0x00
1979	DB	0x13,0x88,0x02,0x00
1980	DB	0x0e,0x78,0x01,0x00
1981	DB	0x09,0x68,0x00,0x00
1982	DB	0x04,0x01,0x15,0x00
1983	DB	0x00,0xb3,0x00,0x00
1984%else
1985; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738
1986ret
1987%endif
1988