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