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