xref: /freebsd/sys/contrib/openzfs/module/icp/asm-x86_64/modes/aesni-gcm-avx2-vaes.S (revision 53a2e2635ab2d17bed1de7b4e0d782dd23ceb6ea)
1// SPDX-License-Identifier: Apache-2.0
2// This file is generated from a similarly-named Perl script in the BoringSSL
3// source tree. Do not edit by hand.
4
5#if defined(__x86_64__) && defined(HAVE_AVX) && \
6    defined(HAVE_VAES) && defined(HAVE_VPCLMULQDQ)
7
8#define _ASM
9#include <sys/asm_linkage.h>
10
11/* Windows userland links with OpenSSL */
12#if !defined (_WIN32) || defined (_KERNEL)
13
14.section	.rodata
15.balign	16
16
17
18.Lbswap_mask:
19.quad	0x08090a0b0c0d0e0f, 0x0001020304050607
20
21
22
23
24
25
26
27
28.Lgfpoly:
29.quad	1, 0xc200000000000000
30
31
32.Lgfpoly_and_internal_carrybit:
33.quad	1, 0xc200000000000001
34
35.balign	32
36
37.Lctr_pattern:
38.quad	0, 0
39.quad	1, 0
40.Linc_2blocks:
41.quad	2, 0
42.quad	2, 0
43
44ENTRY_ALIGN(gcm_init_vpclmulqdq_avx2, 32)
45.cfi_startproc
46
47ENDBR
48
49
50
51
52
53	vmovdqu	(%rsi),%xmm3
54	// KCF/ICP stores H in network byte order with the hi qword first
55	// so we need to swap all bytes, not the 2 qwords.
56	vmovdqu	.Lbswap_mask(%rip),%xmm4
57	vpshufb	%xmm4,%xmm3,%xmm3
58
59
60
61
62
63	vpshufd	$0xd3,%xmm3,%xmm0
64	vpsrad	$31,%xmm0,%xmm0
65	vpaddq	%xmm3,%xmm3,%xmm3
66	vpand	.Lgfpoly_and_internal_carrybit(%rip),%xmm0,%xmm0
67	vpxor	%xmm0,%xmm3,%xmm3
68
69	vbroadcasti128	.Lgfpoly(%rip),%ymm6
70
71
72	vpclmulqdq	$0x00,%xmm3,%xmm3,%xmm0
73	vpclmulqdq	$0x11,%xmm3,%xmm3,%xmm5
74	vpclmulqdq	$0x01,%xmm0,%xmm6,%xmm1
75	vpshufd	$0x4e,%xmm0,%xmm0
76	vpxor	%xmm0,%xmm1,%xmm1
77	vpclmulqdq	$0x01,%xmm1,%xmm6,%xmm0
78	vpshufd	$0x4e,%xmm1,%xmm1
79	vpxor	%xmm1,%xmm5,%xmm5
80	vpxor	%xmm0,%xmm5,%xmm5
81
82
83
84	vinserti128	$1,%xmm3,%ymm5,%ymm3
85	vinserti128	$1,%xmm5,%ymm5,%ymm5
86
87
88	vpclmulqdq	$0x00,%ymm5,%ymm3,%ymm0
89	vpclmulqdq	$0x01,%ymm5,%ymm3,%ymm1
90	vpclmulqdq	$0x10,%ymm5,%ymm3,%ymm2
91	vpxor	%ymm2,%ymm1,%ymm1
92	vpclmulqdq	$0x01,%ymm0,%ymm6,%ymm2
93	vpshufd	$0x4e,%ymm0,%ymm0
94	vpxor	%ymm0,%ymm1,%ymm1
95	vpxor	%ymm2,%ymm1,%ymm1
96	vpclmulqdq	$0x11,%ymm5,%ymm3,%ymm4
97	vpclmulqdq	$0x01,%ymm1,%ymm6,%ymm0
98	vpshufd	$0x4e,%ymm1,%ymm1
99	vpxor	%ymm1,%ymm4,%ymm4
100	vpxor	%ymm0,%ymm4,%ymm4
101
102
103
104	vmovdqu	%ymm3,96(%rdi)
105	vmovdqu	%ymm4,64(%rdi)
106
107
108
109	vpunpcklqdq	%ymm3,%ymm4,%ymm0
110	vpunpckhqdq	%ymm3,%ymm4,%ymm1
111	vpxor	%ymm1,%ymm0,%ymm0
112	vmovdqu	%ymm0,128+32(%rdi)
113
114
115	vpclmulqdq	$0x00,%ymm5,%ymm4,%ymm0
116	vpclmulqdq	$0x01,%ymm5,%ymm4,%ymm1
117	vpclmulqdq	$0x10,%ymm5,%ymm4,%ymm2
118	vpxor	%ymm2,%ymm1,%ymm1
119	vpclmulqdq	$0x01,%ymm0,%ymm6,%ymm2
120	vpshufd	$0x4e,%ymm0,%ymm0
121	vpxor	%ymm0,%ymm1,%ymm1
122	vpxor	%ymm2,%ymm1,%ymm1
123	vpclmulqdq	$0x11,%ymm5,%ymm4,%ymm3
124	vpclmulqdq	$0x01,%ymm1,%ymm6,%ymm0
125	vpshufd	$0x4e,%ymm1,%ymm1
126	vpxor	%ymm1,%ymm3,%ymm3
127	vpxor	%ymm0,%ymm3,%ymm3
128
129	vpclmulqdq	$0x00,%ymm5,%ymm3,%ymm0
130	vpclmulqdq	$0x01,%ymm5,%ymm3,%ymm1
131	vpclmulqdq	$0x10,%ymm5,%ymm3,%ymm2
132	vpxor	%ymm2,%ymm1,%ymm1
133	vpclmulqdq	$0x01,%ymm0,%ymm6,%ymm2
134	vpshufd	$0x4e,%ymm0,%ymm0
135	vpxor	%ymm0,%ymm1,%ymm1
136	vpxor	%ymm2,%ymm1,%ymm1
137	vpclmulqdq	$0x11,%ymm5,%ymm3,%ymm4
138	vpclmulqdq	$0x01,%ymm1,%ymm6,%ymm0
139	vpshufd	$0x4e,%ymm1,%ymm1
140	vpxor	%ymm1,%ymm4,%ymm4
141	vpxor	%ymm0,%ymm4,%ymm4
142
143	vmovdqu	%ymm3,32(%rdi)
144	vmovdqu	%ymm4,0(%rdi)
145
146
147
148	vpunpcklqdq	%ymm3,%ymm4,%ymm0
149	vpunpckhqdq	%ymm3,%ymm4,%ymm1
150	vpxor	%ymm1,%ymm0,%ymm0
151	vmovdqu	%ymm0,128(%rdi)
152
153	vzeroupper
154	RET
155
156.cfi_endproc
157SET_SIZE(gcm_init_vpclmulqdq_avx2)
158ENTRY_ALIGN(gcm_gmult_vpclmulqdq_avx2, 32)
159.cfi_startproc
160
161ENDBR
162
163
164
165	vmovdqu	(%rdi),%xmm0
166	vmovdqu	.Lbswap_mask(%rip),%xmm1
167	vmovdqu	128-16(%rsi),%xmm2
168	vmovdqu	.Lgfpoly(%rip),%xmm3
169	vpshufb	%xmm1,%xmm0,%xmm0
170
171	vpclmulqdq	$0x00,%xmm2,%xmm0,%xmm4
172	vpclmulqdq	$0x01,%xmm2,%xmm0,%xmm5
173	vpclmulqdq	$0x10,%xmm2,%xmm0,%xmm6
174	vpxor	%xmm6,%xmm5,%xmm5
175	vpclmulqdq	$0x01,%xmm4,%xmm3,%xmm6
176	vpshufd	$0x4e,%xmm4,%xmm4
177	vpxor	%xmm4,%xmm5,%xmm5
178	vpxor	%xmm6,%xmm5,%xmm5
179	vpclmulqdq	$0x11,%xmm2,%xmm0,%xmm0
180	vpclmulqdq	$0x01,%xmm5,%xmm3,%xmm4
181	vpshufd	$0x4e,%xmm5,%xmm5
182	vpxor	%xmm5,%xmm0,%xmm0
183	vpxor	%xmm4,%xmm0,%xmm0
184
185
186	vpshufb	%xmm1,%xmm0,%xmm0
187	vmovdqu	%xmm0,(%rdi)
188
189
190	RET
191
192.cfi_endproc
193SET_SIZE(gcm_gmult_vpclmulqdq_avx2)
194ENTRY_ALIGN(gcm_ghash_vpclmulqdq_avx2, 32)
195.cfi_startproc
196
197ENDBR
198
199
200
201
202
203
204	vmovdqu	.Lbswap_mask(%rip),%xmm6
205	vmovdqu	.Lgfpoly(%rip),%xmm7
206
207
208	vmovdqu	(%rdi),%xmm5
209	vpshufb	%xmm6,%xmm5,%xmm5
210
211
212	cmpq	$32,%rcx
213	jb	.Lghash_lastblock
214
215
216
217	vinserti128	$1,%xmm6,%ymm6,%ymm6
218	vinserti128	$1,%xmm7,%ymm7,%ymm7
219
220	cmpq	$127,%rcx
221	jbe	.Lghash_loop_1x
222
223
224	vmovdqu	128(%rsi),%ymm8
225	vmovdqu	128+32(%rsi),%ymm9
226.Lghash_loop_4x:
227
228	vmovdqu	0(%rdx),%ymm1
229	vpshufb	%ymm6,%ymm1,%ymm1
230	vmovdqu	0(%rsi),%ymm2
231	vpxor	%ymm5,%ymm1,%ymm1
232	vpclmulqdq	$0x00,%ymm2,%ymm1,%ymm3
233	vpclmulqdq	$0x11,%ymm2,%ymm1,%ymm5
234	vpunpckhqdq	%ymm1,%ymm1,%ymm0
235	vpxor	%ymm1,%ymm0,%ymm0
236	vpclmulqdq	$0x00,%ymm8,%ymm0,%ymm4
237
238	vmovdqu	32(%rdx),%ymm1
239	vpshufb	%ymm6,%ymm1,%ymm1
240	vmovdqu	32(%rsi),%ymm2
241	vpclmulqdq	$0x00,%ymm2,%ymm1,%ymm0
242	vpxor	%ymm0,%ymm3,%ymm3
243	vpclmulqdq	$0x11,%ymm2,%ymm1,%ymm0
244	vpxor	%ymm0,%ymm5,%ymm5
245	vpunpckhqdq	%ymm1,%ymm1,%ymm0
246	vpxor	%ymm1,%ymm0,%ymm0
247	vpclmulqdq	$0x10,%ymm8,%ymm0,%ymm0
248	vpxor	%ymm0,%ymm4,%ymm4
249
250	vmovdqu	64(%rdx),%ymm1
251	vpshufb	%ymm6,%ymm1,%ymm1
252	vmovdqu	64(%rsi),%ymm2
253	vpclmulqdq	$0x00,%ymm2,%ymm1,%ymm0
254	vpxor	%ymm0,%ymm3,%ymm3
255	vpclmulqdq	$0x11,%ymm2,%ymm1,%ymm0
256	vpxor	%ymm0,%ymm5,%ymm5
257	vpunpckhqdq	%ymm1,%ymm1,%ymm0
258	vpxor	%ymm1,%ymm0,%ymm0
259	vpclmulqdq	$0x00,%ymm9,%ymm0,%ymm0
260	vpxor	%ymm0,%ymm4,%ymm4
261
262
263	vmovdqu	96(%rdx),%ymm1
264	vpshufb	%ymm6,%ymm1,%ymm1
265	vmovdqu	96(%rsi),%ymm2
266	vpclmulqdq	$0x00,%ymm2,%ymm1,%ymm0
267	vpxor	%ymm0,%ymm3,%ymm3
268	vpclmulqdq	$0x11,%ymm2,%ymm1,%ymm0
269	vpxor	%ymm0,%ymm5,%ymm5
270	vpunpckhqdq	%ymm1,%ymm1,%ymm0
271	vpxor	%ymm1,%ymm0,%ymm0
272	vpclmulqdq	$0x10,%ymm9,%ymm0,%ymm0
273	vpxor	%ymm0,%ymm4,%ymm4
274
275	vpxor	%ymm3,%ymm4,%ymm4
276	vpxor	%ymm5,%ymm4,%ymm4
277
278
279	vbroadcasti128	.Lgfpoly(%rip),%ymm2
280	vpclmulqdq	$0x01,%ymm3,%ymm2,%ymm0
281	vpshufd	$0x4e,%ymm3,%ymm3
282	vpxor	%ymm3,%ymm4,%ymm4
283	vpxor	%ymm0,%ymm4,%ymm4
284
285	vpclmulqdq	$0x01,%ymm4,%ymm2,%ymm0
286	vpshufd	$0x4e,%ymm4,%ymm4
287	vpxor	%ymm4,%ymm5,%ymm5
288	vpxor	%ymm0,%ymm5,%ymm5
289	vextracti128	$1,%ymm5,%xmm0
290	vpxor	%xmm0,%xmm5,%xmm5
291
292	subq	$-128,%rdx
293	addq	$-128,%rcx
294	cmpq	$127,%rcx
295	ja	.Lghash_loop_4x
296
297
298	cmpq	$32,%rcx
299	jb	.Lghash_loop_1x_done
300.Lghash_loop_1x:
301	vmovdqu	(%rdx),%ymm0
302	vpshufb	%ymm6,%ymm0,%ymm0
303	vpxor	%ymm0,%ymm5,%ymm5
304	vmovdqu	128-32(%rsi),%ymm0
305	vpclmulqdq	$0x00,%ymm0,%ymm5,%ymm1
306	vpclmulqdq	$0x01,%ymm0,%ymm5,%ymm2
307	vpclmulqdq	$0x10,%ymm0,%ymm5,%ymm3
308	vpxor	%ymm3,%ymm2,%ymm2
309	vpclmulqdq	$0x01,%ymm1,%ymm7,%ymm3
310	vpshufd	$0x4e,%ymm1,%ymm1
311	vpxor	%ymm1,%ymm2,%ymm2
312	vpxor	%ymm3,%ymm2,%ymm2
313	vpclmulqdq	$0x11,%ymm0,%ymm5,%ymm5
314	vpclmulqdq	$0x01,%ymm2,%ymm7,%ymm1
315	vpshufd	$0x4e,%ymm2,%ymm2
316	vpxor	%ymm2,%ymm5,%ymm5
317	vpxor	%ymm1,%ymm5,%ymm5
318
319	vextracti128	$1,%ymm5,%xmm0
320	vpxor	%xmm0,%xmm5,%xmm5
321	addq	$32,%rdx
322	subq	$32,%rcx
323	cmpq	$32,%rcx
324	jae	.Lghash_loop_1x
325.Lghash_loop_1x_done:
326
327
328.Lghash_lastblock:
329	testq	%rcx,%rcx
330	jz	.Lghash_done
331	vmovdqu	(%rdx),%xmm0
332	vpshufb	%xmm6,%xmm0,%xmm0
333	vpxor	%xmm0,%xmm5,%xmm5
334	vmovdqu	128-16(%rsi),%xmm0
335	vpclmulqdq	$0x00,%xmm0,%xmm5,%xmm1
336	vpclmulqdq	$0x01,%xmm0,%xmm5,%xmm2
337	vpclmulqdq	$0x10,%xmm0,%xmm5,%xmm3
338	vpxor	%xmm3,%xmm2,%xmm2
339	vpclmulqdq	$0x01,%xmm1,%xmm7,%xmm3
340	vpshufd	$0x4e,%xmm1,%xmm1
341	vpxor	%xmm1,%xmm2,%xmm2
342	vpxor	%xmm3,%xmm2,%xmm2
343	vpclmulqdq	$0x11,%xmm0,%xmm5,%xmm5
344	vpclmulqdq	$0x01,%xmm2,%xmm7,%xmm1
345	vpshufd	$0x4e,%xmm2,%xmm2
346	vpxor	%xmm2,%xmm5,%xmm5
347	vpxor	%xmm1,%xmm5,%xmm5
348
349
350.Lghash_done:
351
352	vpshufb	%xmm6,%xmm5,%xmm5
353	vmovdqu	%xmm5,(%rdi)
354
355	vzeroupper
356	RET
357
358.cfi_endproc
359SET_SIZE(gcm_ghash_vpclmulqdq_avx2)
360ENTRY_ALIGN(aes_gcm_enc_update_vaes_avx2, 32)
361.cfi_startproc
362
363ENDBR
364	pushq	%r12
365.cfi_adjust_cfa_offset	8
366.cfi_offset	%r12,-16
367
368	movq	16(%rsp),%r12
369#ifdef BORINGSSL_DISPATCH_TEST
370.extern	BORINGSSL_function_hit
371.hidden BORINGSSL_function_hit
372	movb	$1,BORINGSSL_function_hit+6(%rip)
373#endif
374	vbroadcasti128	.Lbswap_mask(%rip),%ymm0
375
376
377
378	vmovdqu	(%r12),%xmm1
379	vpshufb	%xmm0,%xmm1,%xmm1
380	vbroadcasti128	(%r8),%ymm11
381	vpshufb	%ymm0,%ymm11,%ymm11
382
383
384
385	movl	504(%rcx),%r10d		// ICP has a larger offset for rounds.
386	leal	-24(,%r10,4),%r10d	// ICP uses 10,12,14 not 9,11,13 for rounds.
387
388
389
390
391	leaq	96(%rcx,%r10,4),%r11
392	vbroadcasti128	(%rcx),%ymm9
393	vbroadcasti128	(%r11),%ymm10
394
395
396	vpaddd	.Lctr_pattern(%rip),%ymm11,%ymm11
397
398
399
400	cmpq	$127,%rdx
401	jbe	.Lcrypt_loop_4x_done__func1
402
403	vmovdqu	128(%r9),%ymm7
404	vmovdqu	128+32(%r9),%ymm8
405
406
407
408	vmovdqu	.Linc_2blocks(%rip),%ymm2
409	vpshufb	%ymm0,%ymm11,%ymm12
410	vpaddd	%ymm2,%ymm11,%ymm11
411	vpshufb	%ymm0,%ymm11,%ymm13
412	vpaddd	%ymm2,%ymm11,%ymm11
413	vpshufb	%ymm0,%ymm11,%ymm14
414	vpaddd	%ymm2,%ymm11,%ymm11
415	vpshufb	%ymm0,%ymm11,%ymm15
416	vpaddd	%ymm2,%ymm11,%ymm11
417
418
419	vpxor	%ymm9,%ymm12,%ymm12
420	vpxor	%ymm9,%ymm13,%ymm13
421	vpxor	%ymm9,%ymm14,%ymm14
422	vpxor	%ymm9,%ymm15,%ymm15
423
424	leaq	16(%rcx),%rax
425.Lvaesenc_loop_first_4_vecs__func1:
426	vbroadcasti128	(%rax),%ymm2
427	vaesenc	%ymm2,%ymm12,%ymm12
428	vaesenc	%ymm2,%ymm13,%ymm13
429	vaesenc	%ymm2,%ymm14,%ymm14
430	vaesenc	%ymm2,%ymm15,%ymm15
431
432	addq	$16,%rax
433	cmpq	%rax,%r11
434	jne	.Lvaesenc_loop_first_4_vecs__func1
435	vpxor	0(%rdi),%ymm10,%ymm2
436	vpxor	32(%rdi),%ymm10,%ymm3
437	vpxor	64(%rdi),%ymm10,%ymm5
438	vpxor	96(%rdi),%ymm10,%ymm6
439	vaesenclast	%ymm2,%ymm12,%ymm12
440	vaesenclast	%ymm3,%ymm13,%ymm13
441	vaesenclast	%ymm5,%ymm14,%ymm14
442	vaesenclast	%ymm6,%ymm15,%ymm15
443	vmovdqu	%ymm12,0(%rsi)
444	vmovdqu	%ymm13,32(%rsi)
445	vmovdqu	%ymm14,64(%rsi)
446	vmovdqu	%ymm15,96(%rsi)
447
448	subq	$-128,%rdi
449	addq	$-128,%rdx
450	cmpq	$127,%rdx
451	jbe	.Lghash_last_ciphertext_4x__func1
452.balign	16
453.Lcrypt_loop_4x__func1:
454
455
456
457
458	vmovdqu	.Linc_2blocks(%rip),%ymm2
459	vpshufb	%ymm0,%ymm11,%ymm12
460	vpaddd	%ymm2,%ymm11,%ymm11
461	vpshufb	%ymm0,%ymm11,%ymm13
462	vpaddd	%ymm2,%ymm11,%ymm11
463	vpshufb	%ymm0,%ymm11,%ymm14
464	vpaddd	%ymm2,%ymm11,%ymm11
465	vpshufb	%ymm0,%ymm11,%ymm15
466	vpaddd	%ymm2,%ymm11,%ymm11
467
468
469	vpxor	%ymm9,%ymm12,%ymm12
470	vpxor	%ymm9,%ymm13,%ymm13
471	vpxor	%ymm9,%ymm14,%ymm14
472	vpxor	%ymm9,%ymm15,%ymm15
473
474	cmpl	$24,%r10d
475	jl	.Laes128__func1
476	je	.Laes192__func1
477
478	vbroadcasti128	-208(%r11),%ymm2
479	vaesenc	%ymm2,%ymm12,%ymm12
480	vaesenc	%ymm2,%ymm13,%ymm13
481	vaesenc	%ymm2,%ymm14,%ymm14
482	vaesenc	%ymm2,%ymm15,%ymm15
483
484	vbroadcasti128	-192(%r11),%ymm2
485	vaesenc	%ymm2,%ymm12,%ymm12
486	vaesenc	%ymm2,%ymm13,%ymm13
487	vaesenc	%ymm2,%ymm14,%ymm14
488	vaesenc	%ymm2,%ymm15,%ymm15
489
490.Laes192__func1:
491	vbroadcasti128	-176(%r11),%ymm2
492	vaesenc	%ymm2,%ymm12,%ymm12
493	vaesenc	%ymm2,%ymm13,%ymm13
494	vaesenc	%ymm2,%ymm14,%ymm14
495	vaesenc	%ymm2,%ymm15,%ymm15
496
497	vbroadcasti128	-160(%r11),%ymm2
498	vaesenc	%ymm2,%ymm12,%ymm12
499	vaesenc	%ymm2,%ymm13,%ymm13
500	vaesenc	%ymm2,%ymm14,%ymm14
501	vaesenc	%ymm2,%ymm15,%ymm15
502
503.Laes128__func1:
504	prefetcht0	512(%rdi)
505	prefetcht0	512+64(%rdi)
506
507	vmovdqu	0(%rsi),%ymm3
508	vpshufb	%ymm0,%ymm3,%ymm3
509	vmovdqu	0(%r9),%ymm4
510	vpxor	%ymm1,%ymm3,%ymm3
511	vpclmulqdq	$0x00,%ymm4,%ymm3,%ymm5
512	vpclmulqdq	$0x11,%ymm4,%ymm3,%ymm1
513	vpunpckhqdq	%ymm3,%ymm3,%ymm2
514	vpxor	%ymm3,%ymm2,%ymm2
515	vpclmulqdq	$0x00,%ymm7,%ymm2,%ymm6
516
517	vbroadcasti128	-144(%r11),%ymm2
518	vaesenc	%ymm2,%ymm12,%ymm12
519	vaesenc	%ymm2,%ymm13,%ymm13
520	vaesenc	%ymm2,%ymm14,%ymm14
521	vaesenc	%ymm2,%ymm15,%ymm15
522
523
524	vbroadcasti128	-128(%r11),%ymm2
525	vaesenc	%ymm2,%ymm12,%ymm12
526	vaesenc	%ymm2,%ymm13,%ymm13
527	vaesenc	%ymm2,%ymm14,%ymm14
528	vaesenc	%ymm2,%ymm15,%ymm15
529
530
531	vmovdqu	32(%rsi),%ymm3
532	vpshufb	%ymm0,%ymm3,%ymm3
533	vmovdqu	32(%r9),%ymm4
534	vpclmulqdq	$0x00,%ymm4,%ymm3,%ymm2
535	vpxor	%ymm2,%ymm5,%ymm5
536	vpclmulqdq	$0x11,%ymm4,%ymm3,%ymm2
537	vpxor	%ymm2,%ymm1,%ymm1
538	vpunpckhqdq	%ymm3,%ymm3,%ymm2
539	vpxor	%ymm3,%ymm2,%ymm2
540	vpclmulqdq	$0x10,%ymm7,%ymm2,%ymm2
541	vpxor	%ymm2,%ymm6,%ymm6
542
543	vbroadcasti128	-112(%r11),%ymm2
544	vaesenc	%ymm2,%ymm12,%ymm12
545	vaesenc	%ymm2,%ymm13,%ymm13
546	vaesenc	%ymm2,%ymm14,%ymm14
547	vaesenc	%ymm2,%ymm15,%ymm15
548
549
550	vmovdqu	64(%rsi),%ymm3
551	vpshufb	%ymm0,%ymm3,%ymm3
552	vmovdqu	64(%r9),%ymm4
553
554	vbroadcasti128	-96(%r11),%ymm2
555	vaesenc	%ymm2,%ymm12,%ymm12
556	vaesenc	%ymm2,%ymm13,%ymm13
557	vaesenc	%ymm2,%ymm14,%ymm14
558	vaesenc	%ymm2,%ymm15,%ymm15
559
560	vpclmulqdq	$0x00,%ymm4,%ymm3,%ymm2
561	vpxor	%ymm2,%ymm5,%ymm5
562	vpclmulqdq	$0x11,%ymm4,%ymm3,%ymm2
563	vpxor	%ymm2,%ymm1,%ymm1
564
565	vbroadcasti128	-80(%r11),%ymm2
566	vaesenc	%ymm2,%ymm12,%ymm12
567	vaesenc	%ymm2,%ymm13,%ymm13
568	vaesenc	%ymm2,%ymm14,%ymm14
569	vaesenc	%ymm2,%ymm15,%ymm15
570
571	vpunpckhqdq	%ymm3,%ymm3,%ymm2
572	vpxor	%ymm3,%ymm2,%ymm2
573	vpclmulqdq	$0x00,%ymm8,%ymm2,%ymm2
574	vpxor	%ymm2,%ymm6,%ymm6
575
576
577	vmovdqu	96(%rsi),%ymm3
578	vpshufb	%ymm0,%ymm3,%ymm3
579
580	vbroadcasti128	-64(%r11),%ymm2
581	vaesenc	%ymm2,%ymm12,%ymm12
582	vaesenc	%ymm2,%ymm13,%ymm13
583	vaesenc	%ymm2,%ymm14,%ymm14
584	vaesenc	%ymm2,%ymm15,%ymm15
585
586	vmovdqu	96(%r9),%ymm4
587	vpclmulqdq	$0x00,%ymm4,%ymm3,%ymm2
588	vpxor	%ymm2,%ymm5,%ymm5
589	vpclmulqdq	$0x11,%ymm4,%ymm3,%ymm2
590	vpxor	%ymm2,%ymm1,%ymm1
591	vpunpckhqdq	%ymm3,%ymm3,%ymm2
592	vpxor	%ymm3,%ymm2,%ymm2
593	vpclmulqdq	$0x10,%ymm8,%ymm2,%ymm2
594	vpxor	%ymm2,%ymm6,%ymm6
595
596	vbroadcasti128	-48(%r11),%ymm2
597	vaesenc	%ymm2,%ymm12,%ymm12
598	vaesenc	%ymm2,%ymm13,%ymm13
599	vaesenc	%ymm2,%ymm14,%ymm14
600	vaesenc	%ymm2,%ymm15,%ymm15
601
602
603	vpxor	%ymm5,%ymm6,%ymm6
604	vpxor	%ymm1,%ymm6,%ymm6
605
606
607	vbroadcasti128	.Lgfpoly(%rip),%ymm4
608	vpclmulqdq	$0x01,%ymm5,%ymm4,%ymm2
609	vpshufd	$0x4e,%ymm5,%ymm5
610	vpxor	%ymm5,%ymm6,%ymm6
611	vpxor	%ymm2,%ymm6,%ymm6
612
613	vbroadcasti128	-32(%r11),%ymm2
614	vaesenc	%ymm2,%ymm12,%ymm12
615	vaesenc	%ymm2,%ymm13,%ymm13
616	vaesenc	%ymm2,%ymm14,%ymm14
617	vaesenc	%ymm2,%ymm15,%ymm15
618
619
620	vpclmulqdq	$0x01,%ymm6,%ymm4,%ymm2
621	vpshufd	$0x4e,%ymm6,%ymm6
622	vpxor	%ymm6,%ymm1,%ymm1
623	vpxor	%ymm2,%ymm1,%ymm1
624
625	vbroadcasti128	-16(%r11),%ymm2
626	vaesenc	%ymm2,%ymm12,%ymm12
627	vaesenc	%ymm2,%ymm13,%ymm13
628	vaesenc	%ymm2,%ymm14,%ymm14
629	vaesenc	%ymm2,%ymm15,%ymm15
630
631	vextracti128	$1,%ymm1,%xmm2
632	vpxor	%xmm2,%xmm1,%xmm1
633
634
635	subq	$-128,%rsi
636	vpxor	0(%rdi),%ymm10,%ymm2
637	vpxor	32(%rdi),%ymm10,%ymm3
638	vpxor	64(%rdi),%ymm10,%ymm5
639	vpxor	96(%rdi),%ymm10,%ymm6
640	vaesenclast	%ymm2,%ymm12,%ymm12
641	vaesenclast	%ymm3,%ymm13,%ymm13
642	vaesenclast	%ymm5,%ymm14,%ymm14
643	vaesenclast	%ymm6,%ymm15,%ymm15
644	vmovdqu	%ymm12,0(%rsi)
645	vmovdqu	%ymm13,32(%rsi)
646	vmovdqu	%ymm14,64(%rsi)
647	vmovdqu	%ymm15,96(%rsi)
648
649	subq	$-128,%rdi
650
651	addq	$-128,%rdx
652	cmpq	$127,%rdx
653	ja	.Lcrypt_loop_4x__func1
654.Lghash_last_ciphertext_4x__func1:
655
656	vmovdqu	0(%rsi),%ymm3
657	vpshufb	%ymm0,%ymm3,%ymm3
658	vmovdqu	0(%r9),%ymm4
659	vpxor	%ymm1,%ymm3,%ymm3
660	vpclmulqdq	$0x00,%ymm4,%ymm3,%ymm5
661	vpclmulqdq	$0x11,%ymm4,%ymm3,%ymm1
662	vpunpckhqdq	%ymm3,%ymm3,%ymm2
663	vpxor	%ymm3,%ymm2,%ymm2
664	vpclmulqdq	$0x00,%ymm7,%ymm2,%ymm6
665
666	vmovdqu	32(%rsi),%ymm3
667	vpshufb	%ymm0,%ymm3,%ymm3
668	vmovdqu	32(%r9),%ymm4
669	vpclmulqdq	$0x00,%ymm4,%ymm3,%ymm2
670	vpxor	%ymm2,%ymm5,%ymm5
671	vpclmulqdq	$0x11,%ymm4,%ymm3,%ymm2
672	vpxor	%ymm2,%ymm1,%ymm1
673	vpunpckhqdq	%ymm3,%ymm3,%ymm2
674	vpxor	%ymm3,%ymm2,%ymm2
675	vpclmulqdq	$0x10,%ymm7,%ymm2,%ymm2
676	vpxor	%ymm2,%ymm6,%ymm6
677
678	vmovdqu	64(%rsi),%ymm3
679	vpshufb	%ymm0,%ymm3,%ymm3
680	vmovdqu	64(%r9),%ymm4
681	vpclmulqdq	$0x00,%ymm4,%ymm3,%ymm2
682	vpxor	%ymm2,%ymm5,%ymm5
683	vpclmulqdq	$0x11,%ymm4,%ymm3,%ymm2
684	vpxor	%ymm2,%ymm1,%ymm1
685	vpunpckhqdq	%ymm3,%ymm3,%ymm2
686	vpxor	%ymm3,%ymm2,%ymm2
687	vpclmulqdq	$0x00,%ymm8,%ymm2,%ymm2
688	vpxor	%ymm2,%ymm6,%ymm6
689
690
691	vmovdqu	96(%rsi),%ymm3
692	vpshufb	%ymm0,%ymm3,%ymm3
693	vmovdqu	96(%r9),%ymm4
694	vpclmulqdq	$0x00,%ymm4,%ymm3,%ymm2
695	vpxor	%ymm2,%ymm5,%ymm5
696	vpclmulqdq	$0x11,%ymm4,%ymm3,%ymm2
697	vpxor	%ymm2,%ymm1,%ymm1
698	vpunpckhqdq	%ymm3,%ymm3,%ymm2
699	vpxor	%ymm3,%ymm2,%ymm2
700	vpclmulqdq	$0x10,%ymm8,%ymm2,%ymm2
701	vpxor	%ymm2,%ymm6,%ymm6
702
703	vpxor	%ymm5,%ymm6,%ymm6
704	vpxor	%ymm1,%ymm6,%ymm6
705
706
707	vbroadcasti128	.Lgfpoly(%rip),%ymm4
708	vpclmulqdq	$0x01,%ymm5,%ymm4,%ymm2
709	vpshufd	$0x4e,%ymm5,%ymm5
710	vpxor	%ymm5,%ymm6,%ymm6
711	vpxor	%ymm2,%ymm6,%ymm6
712
713	vpclmulqdq	$0x01,%ymm6,%ymm4,%ymm2
714	vpshufd	$0x4e,%ymm6,%ymm6
715	vpxor	%ymm6,%ymm1,%ymm1
716	vpxor	%ymm2,%ymm1,%ymm1
717	vextracti128	$1,%ymm1,%xmm2
718	vpxor	%xmm2,%xmm1,%xmm1
719
720	subq	$-128,%rsi
721.Lcrypt_loop_4x_done__func1:
722
723	testq	%rdx,%rdx
724	jz	.Ldone__func1
725
726
727
728
729
730	leaq	128(%r9),%r8
731	subq	%rdx,%r8
732
733
734	vpxor	%xmm5,%xmm5,%xmm5
735	vpxor	%xmm6,%xmm6,%xmm6
736	vpxor	%xmm7,%xmm7,%xmm7
737
738	cmpq	$64,%rdx
739	jb	.Llessthan64bytes__func1
740
741
742	vpshufb	%ymm0,%ymm11,%ymm12
743	vpaddd	.Linc_2blocks(%rip),%ymm11,%ymm11
744	vpshufb	%ymm0,%ymm11,%ymm13
745	vpaddd	.Linc_2blocks(%rip),%ymm11,%ymm11
746	vpxor	%ymm9,%ymm12,%ymm12
747	vpxor	%ymm9,%ymm13,%ymm13
748	leaq	16(%rcx),%rax
749.Lvaesenc_loop_tail_1__func1:
750	vbroadcasti128	(%rax),%ymm2
751	vaesenc	%ymm2,%ymm12,%ymm12
752	vaesenc	%ymm2,%ymm13,%ymm13
753	addq	$16,%rax
754	cmpq	%rax,%r11
755	jne	.Lvaesenc_loop_tail_1__func1
756	vaesenclast	%ymm10,%ymm12,%ymm12
757	vaesenclast	%ymm10,%ymm13,%ymm13
758
759
760	vmovdqu	0(%rdi),%ymm2
761	vmovdqu	32(%rdi),%ymm3
762	vpxor	%ymm2,%ymm12,%ymm12
763	vpxor	%ymm3,%ymm13,%ymm13
764	vmovdqu	%ymm12,0(%rsi)
765	vmovdqu	%ymm13,32(%rsi)
766
767
768	vpshufb	%ymm0,%ymm12,%ymm12
769	vpshufb	%ymm0,%ymm13,%ymm13
770	vpxor	%ymm1,%ymm12,%ymm12
771	vmovdqu	(%r8),%ymm2
772	vmovdqu	32(%r8),%ymm3
773	vpclmulqdq	$0x00,%ymm2,%ymm12,%ymm5
774	vpclmulqdq	$0x01,%ymm2,%ymm12,%ymm6
775	vpclmulqdq	$0x10,%ymm2,%ymm12,%ymm4
776	vpxor	%ymm4,%ymm6,%ymm6
777	vpclmulqdq	$0x11,%ymm2,%ymm12,%ymm7
778	vpclmulqdq	$0x00,%ymm3,%ymm13,%ymm4
779	vpxor	%ymm4,%ymm5,%ymm5
780	vpclmulqdq	$0x01,%ymm3,%ymm13,%ymm4
781	vpxor	%ymm4,%ymm6,%ymm6
782	vpclmulqdq	$0x10,%ymm3,%ymm13,%ymm4
783	vpxor	%ymm4,%ymm6,%ymm6
784	vpclmulqdq	$0x11,%ymm3,%ymm13,%ymm4
785	vpxor	%ymm4,%ymm7,%ymm7
786
787	addq	$64,%r8
788	addq	$64,%rdi
789	addq	$64,%rsi
790	subq	$64,%rdx
791	jz	.Lreduce__func1
792
793	vpxor	%xmm1,%xmm1,%xmm1
794
795
796.Llessthan64bytes__func1:
797	vpshufb	%ymm0,%ymm11,%ymm12
798	vpaddd	.Linc_2blocks(%rip),%ymm11,%ymm11
799	vpshufb	%ymm0,%ymm11,%ymm13
800	vpxor	%ymm9,%ymm12,%ymm12
801	vpxor	%ymm9,%ymm13,%ymm13
802	leaq	16(%rcx),%rax
803.Lvaesenc_loop_tail_2__func1:
804	vbroadcasti128	(%rax),%ymm2
805	vaesenc	%ymm2,%ymm12,%ymm12
806	vaesenc	%ymm2,%ymm13,%ymm13
807	addq	$16,%rax
808	cmpq	%rax,%r11
809	jne	.Lvaesenc_loop_tail_2__func1
810	vaesenclast	%ymm10,%ymm12,%ymm12
811	vaesenclast	%ymm10,%ymm13,%ymm13
812
813
814
815
816	cmpq	$32,%rdx
817	jb	.Lxor_one_block__func1
818	je	.Lxor_two_blocks__func1
819
820.Lxor_three_blocks__func1:
821	vmovdqu	0(%rdi),%ymm2
822	vmovdqu	32(%rdi),%xmm3
823	vpxor	%ymm2,%ymm12,%ymm12
824	vpxor	%xmm3,%xmm13,%xmm13
825	vmovdqu	%ymm12,0(%rsi)
826	vmovdqu	%xmm13,32(%rsi)
827
828	vpshufb	%ymm0,%ymm12,%ymm12
829	vpshufb	%xmm0,%xmm13,%xmm13
830	vpxor	%ymm1,%ymm12,%ymm12
831	vmovdqu	(%r8),%ymm2
832	vmovdqu	32(%r8),%xmm3
833	vpclmulqdq	$0x00,%xmm3,%xmm13,%xmm4
834	vpxor	%ymm4,%ymm5,%ymm5
835	vpclmulqdq	$0x01,%xmm3,%xmm13,%xmm4
836	vpxor	%ymm4,%ymm6,%ymm6
837	vpclmulqdq	$0x10,%xmm3,%xmm13,%xmm4
838	vpxor	%ymm4,%ymm6,%ymm6
839	vpclmulqdq	$0x11,%xmm3,%xmm13,%xmm4
840	vpxor	%ymm4,%ymm7,%ymm7
841	jmp	.Lghash_mul_one_vec_unreduced__func1
842
843.Lxor_two_blocks__func1:
844	vmovdqu	(%rdi),%ymm2
845	vpxor	%ymm2,%ymm12,%ymm12
846	vmovdqu	%ymm12,(%rsi)
847	vpshufb	%ymm0,%ymm12,%ymm12
848	vpxor	%ymm1,%ymm12,%ymm12
849	vmovdqu	(%r8),%ymm2
850	jmp	.Lghash_mul_one_vec_unreduced__func1
851
852.Lxor_one_block__func1:
853	vmovdqu	(%rdi),%xmm2
854	vpxor	%xmm2,%xmm12,%xmm12
855	vmovdqu	%xmm12,(%rsi)
856	vpshufb	%xmm0,%xmm12,%xmm12
857	vpxor	%xmm1,%xmm12,%xmm12
858	vmovdqu	(%r8),%xmm2
859
860.Lghash_mul_one_vec_unreduced__func1:
861	vpclmulqdq	$0x00,%ymm2,%ymm12,%ymm4
862	vpxor	%ymm4,%ymm5,%ymm5
863	vpclmulqdq	$0x01,%ymm2,%ymm12,%ymm4
864	vpxor	%ymm4,%ymm6,%ymm6
865	vpclmulqdq	$0x10,%ymm2,%ymm12,%ymm4
866	vpxor	%ymm4,%ymm6,%ymm6
867	vpclmulqdq	$0x11,%ymm2,%ymm12,%ymm4
868	vpxor	%ymm4,%ymm7,%ymm7
869
870.Lreduce__func1:
871
872	vbroadcasti128	.Lgfpoly(%rip),%ymm2
873	vpclmulqdq	$0x01,%ymm5,%ymm2,%ymm3
874	vpshufd	$0x4e,%ymm5,%ymm5
875	vpxor	%ymm5,%ymm6,%ymm6
876	vpxor	%ymm3,%ymm6,%ymm6
877	vpclmulqdq	$0x01,%ymm6,%ymm2,%ymm3
878	vpshufd	$0x4e,%ymm6,%ymm6
879	vpxor	%ymm6,%ymm7,%ymm7
880	vpxor	%ymm3,%ymm7,%ymm7
881	vextracti128	$1,%ymm7,%xmm1
882	vpxor	%xmm7,%xmm1,%xmm1
883
884.Ldone__func1:
885
886	vpshufb	%xmm0,%xmm1,%xmm1
887	vmovdqu	%xmm1,(%r12)
888
889	vzeroupper
890	popq	%r12
891.cfi_adjust_cfa_offset	-8
892.cfi_restore	%r12
893	RET
894
895.cfi_endproc
896SET_SIZE(aes_gcm_enc_update_vaes_avx2)
897ENTRY_ALIGN(aes_gcm_dec_update_vaes_avx2, 32)
898.cfi_startproc
899
900ENDBR
901	pushq	%r12
902.cfi_adjust_cfa_offset	8
903.cfi_offset	%r12,-16
904
905	movq	16(%rsp),%r12
906	vbroadcasti128	.Lbswap_mask(%rip),%ymm0
907
908
909
910	vmovdqu	(%r12),%xmm1
911	vpshufb	%xmm0,%xmm1,%xmm1
912	vbroadcasti128	(%r8),%ymm11
913	vpshufb	%ymm0,%ymm11,%ymm11
914
915
916
917	movl	504(%rcx),%r10d		// ICP has a larger offset for rounds.
918	leal	-24(,%r10,4),%r10d	// ICP uses 10,12,14 not 9,11,13 for rounds.
919
920
921
922
923	leaq	96(%rcx,%r10,4),%r11
924	vbroadcasti128	(%rcx),%ymm9
925	vbroadcasti128	(%r11),%ymm10
926
927
928	vpaddd	.Lctr_pattern(%rip),%ymm11,%ymm11
929
930
931
932	cmpq	$127,%rdx
933	jbe	.Lcrypt_loop_4x_done__func2
934
935	vmovdqu	128(%r9),%ymm7
936	vmovdqu	128+32(%r9),%ymm8
937.balign	16
938.Lcrypt_loop_4x__func2:
939
940
941
942
943	vmovdqu	.Linc_2blocks(%rip),%ymm2
944	vpshufb	%ymm0,%ymm11,%ymm12
945	vpaddd	%ymm2,%ymm11,%ymm11
946	vpshufb	%ymm0,%ymm11,%ymm13
947	vpaddd	%ymm2,%ymm11,%ymm11
948	vpshufb	%ymm0,%ymm11,%ymm14
949	vpaddd	%ymm2,%ymm11,%ymm11
950	vpshufb	%ymm0,%ymm11,%ymm15
951	vpaddd	%ymm2,%ymm11,%ymm11
952
953
954	vpxor	%ymm9,%ymm12,%ymm12
955	vpxor	%ymm9,%ymm13,%ymm13
956	vpxor	%ymm9,%ymm14,%ymm14
957	vpxor	%ymm9,%ymm15,%ymm15
958
959	cmpl	$24,%r10d
960	jl	.Laes128__func2
961	je	.Laes192__func2
962
963	vbroadcasti128	-208(%r11),%ymm2
964	vaesenc	%ymm2,%ymm12,%ymm12
965	vaesenc	%ymm2,%ymm13,%ymm13
966	vaesenc	%ymm2,%ymm14,%ymm14
967	vaesenc	%ymm2,%ymm15,%ymm15
968
969	vbroadcasti128	-192(%r11),%ymm2
970	vaesenc	%ymm2,%ymm12,%ymm12
971	vaesenc	%ymm2,%ymm13,%ymm13
972	vaesenc	%ymm2,%ymm14,%ymm14
973	vaesenc	%ymm2,%ymm15,%ymm15
974
975.Laes192__func2:
976	vbroadcasti128	-176(%r11),%ymm2
977	vaesenc	%ymm2,%ymm12,%ymm12
978	vaesenc	%ymm2,%ymm13,%ymm13
979	vaesenc	%ymm2,%ymm14,%ymm14
980	vaesenc	%ymm2,%ymm15,%ymm15
981
982	vbroadcasti128	-160(%r11),%ymm2
983	vaesenc	%ymm2,%ymm12,%ymm12
984	vaesenc	%ymm2,%ymm13,%ymm13
985	vaesenc	%ymm2,%ymm14,%ymm14
986	vaesenc	%ymm2,%ymm15,%ymm15
987
988.Laes128__func2:
989	prefetcht0	512(%rdi)
990	prefetcht0	512+64(%rdi)
991
992	vmovdqu	0(%rdi),%ymm3
993	vpshufb	%ymm0,%ymm3,%ymm3
994	vmovdqu	0(%r9),%ymm4
995	vpxor	%ymm1,%ymm3,%ymm3
996	vpclmulqdq	$0x00,%ymm4,%ymm3,%ymm5
997	vpclmulqdq	$0x11,%ymm4,%ymm3,%ymm1
998	vpunpckhqdq	%ymm3,%ymm3,%ymm2
999	vpxor	%ymm3,%ymm2,%ymm2
1000	vpclmulqdq	$0x00,%ymm7,%ymm2,%ymm6
1001
1002	vbroadcasti128	-144(%r11),%ymm2
1003	vaesenc	%ymm2,%ymm12,%ymm12
1004	vaesenc	%ymm2,%ymm13,%ymm13
1005	vaesenc	%ymm2,%ymm14,%ymm14
1006	vaesenc	%ymm2,%ymm15,%ymm15
1007
1008
1009	vbroadcasti128	-128(%r11),%ymm2
1010	vaesenc	%ymm2,%ymm12,%ymm12
1011	vaesenc	%ymm2,%ymm13,%ymm13
1012	vaesenc	%ymm2,%ymm14,%ymm14
1013	vaesenc	%ymm2,%ymm15,%ymm15
1014
1015
1016	vmovdqu	32(%rdi),%ymm3
1017	vpshufb	%ymm0,%ymm3,%ymm3
1018	vmovdqu	32(%r9),%ymm4
1019	vpclmulqdq	$0x00,%ymm4,%ymm3,%ymm2
1020	vpxor	%ymm2,%ymm5,%ymm5
1021	vpclmulqdq	$0x11,%ymm4,%ymm3,%ymm2
1022	vpxor	%ymm2,%ymm1,%ymm1
1023	vpunpckhqdq	%ymm3,%ymm3,%ymm2
1024	vpxor	%ymm3,%ymm2,%ymm2
1025	vpclmulqdq	$0x10,%ymm7,%ymm2,%ymm2
1026	vpxor	%ymm2,%ymm6,%ymm6
1027
1028	vbroadcasti128	-112(%r11),%ymm2
1029	vaesenc	%ymm2,%ymm12,%ymm12
1030	vaesenc	%ymm2,%ymm13,%ymm13
1031	vaesenc	%ymm2,%ymm14,%ymm14
1032	vaesenc	%ymm2,%ymm15,%ymm15
1033
1034
1035	vmovdqu	64(%rdi),%ymm3
1036	vpshufb	%ymm0,%ymm3,%ymm3
1037	vmovdqu	64(%r9),%ymm4
1038
1039	vbroadcasti128	-96(%r11),%ymm2
1040	vaesenc	%ymm2,%ymm12,%ymm12
1041	vaesenc	%ymm2,%ymm13,%ymm13
1042	vaesenc	%ymm2,%ymm14,%ymm14
1043	vaesenc	%ymm2,%ymm15,%ymm15
1044
1045	vpclmulqdq	$0x00,%ymm4,%ymm3,%ymm2
1046	vpxor	%ymm2,%ymm5,%ymm5
1047	vpclmulqdq	$0x11,%ymm4,%ymm3,%ymm2
1048	vpxor	%ymm2,%ymm1,%ymm1
1049
1050	vbroadcasti128	-80(%r11),%ymm2
1051	vaesenc	%ymm2,%ymm12,%ymm12
1052	vaesenc	%ymm2,%ymm13,%ymm13
1053	vaesenc	%ymm2,%ymm14,%ymm14
1054	vaesenc	%ymm2,%ymm15,%ymm15
1055
1056	vpunpckhqdq	%ymm3,%ymm3,%ymm2
1057	vpxor	%ymm3,%ymm2,%ymm2
1058	vpclmulqdq	$0x00,%ymm8,%ymm2,%ymm2
1059	vpxor	%ymm2,%ymm6,%ymm6
1060
1061
1062	vmovdqu	96(%rdi),%ymm3
1063	vpshufb	%ymm0,%ymm3,%ymm3
1064
1065	vbroadcasti128	-64(%r11),%ymm2
1066	vaesenc	%ymm2,%ymm12,%ymm12
1067	vaesenc	%ymm2,%ymm13,%ymm13
1068	vaesenc	%ymm2,%ymm14,%ymm14
1069	vaesenc	%ymm2,%ymm15,%ymm15
1070
1071	vmovdqu	96(%r9),%ymm4
1072	vpclmulqdq	$0x00,%ymm4,%ymm3,%ymm2
1073	vpxor	%ymm2,%ymm5,%ymm5
1074	vpclmulqdq	$0x11,%ymm4,%ymm3,%ymm2
1075	vpxor	%ymm2,%ymm1,%ymm1
1076	vpunpckhqdq	%ymm3,%ymm3,%ymm2
1077	vpxor	%ymm3,%ymm2,%ymm2
1078	vpclmulqdq	$0x10,%ymm8,%ymm2,%ymm2
1079	vpxor	%ymm2,%ymm6,%ymm6
1080
1081	vbroadcasti128	-48(%r11),%ymm2
1082	vaesenc	%ymm2,%ymm12,%ymm12
1083	vaesenc	%ymm2,%ymm13,%ymm13
1084	vaesenc	%ymm2,%ymm14,%ymm14
1085	vaesenc	%ymm2,%ymm15,%ymm15
1086
1087
1088	vpxor	%ymm5,%ymm6,%ymm6
1089	vpxor	%ymm1,%ymm6,%ymm6
1090
1091
1092	vbroadcasti128	.Lgfpoly(%rip),%ymm4
1093	vpclmulqdq	$0x01,%ymm5,%ymm4,%ymm2
1094	vpshufd	$0x4e,%ymm5,%ymm5
1095	vpxor	%ymm5,%ymm6,%ymm6
1096	vpxor	%ymm2,%ymm6,%ymm6
1097
1098	vbroadcasti128	-32(%r11),%ymm2
1099	vaesenc	%ymm2,%ymm12,%ymm12
1100	vaesenc	%ymm2,%ymm13,%ymm13
1101	vaesenc	%ymm2,%ymm14,%ymm14
1102	vaesenc	%ymm2,%ymm15,%ymm15
1103
1104
1105	vpclmulqdq	$0x01,%ymm6,%ymm4,%ymm2
1106	vpshufd	$0x4e,%ymm6,%ymm6
1107	vpxor	%ymm6,%ymm1,%ymm1
1108	vpxor	%ymm2,%ymm1,%ymm1
1109
1110	vbroadcasti128	-16(%r11),%ymm2
1111	vaesenc	%ymm2,%ymm12,%ymm12
1112	vaesenc	%ymm2,%ymm13,%ymm13
1113	vaesenc	%ymm2,%ymm14,%ymm14
1114	vaesenc	%ymm2,%ymm15,%ymm15
1115
1116	vextracti128	$1,%ymm1,%xmm2
1117	vpxor	%xmm2,%xmm1,%xmm1
1118
1119
1120
1121	vpxor	0(%rdi),%ymm10,%ymm2
1122	vpxor	32(%rdi),%ymm10,%ymm3
1123	vpxor	64(%rdi),%ymm10,%ymm5
1124	vpxor	96(%rdi),%ymm10,%ymm6
1125	vaesenclast	%ymm2,%ymm12,%ymm12
1126	vaesenclast	%ymm3,%ymm13,%ymm13
1127	vaesenclast	%ymm5,%ymm14,%ymm14
1128	vaesenclast	%ymm6,%ymm15,%ymm15
1129	vmovdqu	%ymm12,0(%rsi)
1130	vmovdqu	%ymm13,32(%rsi)
1131	vmovdqu	%ymm14,64(%rsi)
1132	vmovdqu	%ymm15,96(%rsi)
1133
1134	subq	$-128,%rdi
1135	subq	$-128,%rsi
1136	addq	$-128,%rdx
1137	cmpq	$127,%rdx
1138	ja	.Lcrypt_loop_4x__func2
1139.Lcrypt_loop_4x_done__func2:
1140
1141	testq	%rdx,%rdx
1142	jz	.Ldone__func2
1143
1144
1145
1146
1147
1148	leaq	128(%r9),%r8
1149	subq	%rdx,%r8
1150
1151
1152	vpxor	%xmm5,%xmm5,%xmm5
1153	vpxor	%xmm6,%xmm6,%xmm6
1154	vpxor	%xmm7,%xmm7,%xmm7
1155
1156	cmpq	$64,%rdx
1157	jb	.Llessthan64bytes__func2
1158
1159
1160	vpshufb	%ymm0,%ymm11,%ymm12
1161	vpaddd	.Linc_2blocks(%rip),%ymm11,%ymm11
1162	vpshufb	%ymm0,%ymm11,%ymm13
1163	vpaddd	.Linc_2blocks(%rip),%ymm11,%ymm11
1164	vpxor	%ymm9,%ymm12,%ymm12
1165	vpxor	%ymm9,%ymm13,%ymm13
1166	leaq	16(%rcx),%rax
1167.Lvaesenc_loop_tail_1__func2:
1168	vbroadcasti128	(%rax),%ymm2
1169	vaesenc	%ymm2,%ymm12,%ymm12
1170	vaesenc	%ymm2,%ymm13,%ymm13
1171	addq	$16,%rax
1172	cmpq	%rax,%r11
1173	jne	.Lvaesenc_loop_tail_1__func2
1174	vaesenclast	%ymm10,%ymm12,%ymm12
1175	vaesenclast	%ymm10,%ymm13,%ymm13
1176
1177
1178	vmovdqu	0(%rdi),%ymm2
1179	vmovdqu	32(%rdi),%ymm3
1180	vpxor	%ymm2,%ymm12,%ymm12
1181	vpxor	%ymm3,%ymm13,%ymm13
1182	vmovdqu	%ymm12,0(%rsi)
1183	vmovdqu	%ymm13,32(%rsi)
1184
1185
1186	vpshufb	%ymm0,%ymm2,%ymm12
1187	vpshufb	%ymm0,%ymm3,%ymm13
1188	vpxor	%ymm1,%ymm12,%ymm12
1189	vmovdqu	(%r8),%ymm2
1190	vmovdqu	32(%r8),%ymm3
1191	vpclmulqdq	$0x00,%ymm2,%ymm12,%ymm5
1192	vpclmulqdq	$0x01,%ymm2,%ymm12,%ymm6
1193	vpclmulqdq	$0x10,%ymm2,%ymm12,%ymm4
1194	vpxor	%ymm4,%ymm6,%ymm6
1195	vpclmulqdq	$0x11,%ymm2,%ymm12,%ymm7
1196	vpclmulqdq	$0x00,%ymm3,%ymm13,%ymm4
1197	vpxor	%ymm4,%ymm5,%ymm5
1198	vpclmulqdq	$0x01,%ymm3,%ymm13,%ymm4
1199	vpxor	%ymm4,%ymm6,%ymm6
1200	vpclmulqdq	$0x10,%ymm3,%ymm13,%ymm4
1201	vpxor	%ymm4,%ymm6,%ymm6
1202	vpclmulqdq	$0x11,%ymm3,%ymm13,%ymm4
1203	vpxor	%ymm4,%ymm7,%ymm7
1204
1205	addq	$64,%r8
1206	addq	$64,%rdi
1207	addq	$64,%rsi
1208	subq	$64,%rdx
1209	jz	.Lreduce__func2
1210
1211	vpxor	%xmm1,%xmm1,%xmm1
1212
1213
1214.Llessthan64bytes__func2:
1215	vpshufb	%ymm0,%ymm11,%ymm12
1216	vpaddd	.Linc_2blocks(%rip),%ymm11,%ymm11
1217	vpshufb	%ymm0,%ymm11,%ymm13
1218	vpxor	%ymm9,%ymm12,%ymm12
1219	vpxor	%ymm9,%ymm13,%ymm13
1220	leaq	16(%rcx),%rax
1221.Lvaesenc_loop_tail_2__func2:
1222	vbroadcasti128	(%rax),%ymm2
1223	vaesenc	%ymm2,%ymm12,%ymm12
1224	vaesenc	%ymm2,%ymm13,%ymm13
1225	addq	$16,%rax
1226	cmpq	%rax,%r11
1227	jne	.Lvaesenc_loop_tail_2__func2
1228	vaesenclast	%ymm10,%ymm12,%ymm12
1229	vaesenclast	%ymm10,%ymm13,%ymm13
1230
1231
1232
1233
1234	cmpq	$32,%rdx
1235	jb	.Lxor_one_block__func2
1236	je	.Lxor_two_blocks__func2
1237
1238.Lxor_three_blocks__func2:
1239	vmovdqu	0(%rdi),%ymm2
1240	vmovdqu	32(%rdi),%xmm3
1241	vpxor	%ymm2,%ymm12,%ymm12
1242	vpxor	%xmm3,%xmm13,%xmm13
1243	vmovdqu	%ymm12,0(%rsi)
1244	vmovdqu	%xmm13,32(%rsi)
1245
1246	vpshufb	%ymm0,%ymm2,%ymm12
1247	vpshufb	%xmm0,%xmm3,%xmm13
1248	vpxor	%ymm1,%ymm12,%ymm12
1249	vmovdqu	(%r8),%ymm2
1250	vmovdqu	32(%r8),%xmm3
1251	vpclmulqdq	$0x00,%xmm3,%xmm13,%xmm4
1252	vpxor	%ymm4,%ymm5,%ymm5
1253	vpclmulqdq	$0x01,%xmm3,%xmm13,%xmm4
1254	vpxor	%ymm4,%ymm6,%ymm6
1255	vpclmulqdq	$0x10,%xmm3,%xmm13,%xmm4
1256	vpxor	%ymm4,%ymm6,%ymm6
1257	vpclmulqdq	$0x11,%xmm3,%xmm13,%xmm4
1258	vpxor	%ymm4,%ymm7,%ymm7
1259	jmp	.Lghash_mul_one_vec_unreduced__func2
1260
1261.Lxor_two_blocks__func2:
1262	vmovdqu	(%rdi),%ymm2
1263	vpxor	%ymm2,%ymm12,%ymm12
1264	vmovdqu	%ymm12,(%rsi)
1265	vpshufb	%ymm0,%ymm2,%ymm12
1266	vpxor	%ymm1,%ymm12,%ymm12
1267	vmovdqu	(%r8),%ymm2
1268	jmp	.Lghash_mul_one_vec_unreduced__func2
1269
1270.Lxor_one_block__func2:
1271	vmovdqu	(%rdi),%xmm2
1272	vpxor	%xmm2,%xmm12,%xmm12
1273	vmovdqu	%xmm12,(%rsi)
1274	vpshufb	%xmm0,%xmm2,%xmm12
1275	vpxor	%xmm1,%xmm12,%xmm12
1276	vmovdqu	(%r8),%xmm2
1277
1278.Lghash_mul_one_vec_unreduced__func2:
1279	vpclmulqdq	$0x00,%ymm2,%ymm12,%ymm4
1280	vpxor	%ymm4,%ymm5,%ymm5
1281	vpclmulqdq	$0x01,%ymm2,%ymm12,%ymm4
1282	vpxor	%ymm4,%ymm6,%ymm6
1283	vpclmulqdq	$0x10,%ymm2,%ymm12,%ymm4
1284	vpxor	%ymm4,%ymm6,%ymm6
1285	vpclmulqdq	$0x11,%ymm2,%ymm12,%ymm4
1286	vpxor	%ymm4,%ymm7,%ymm7
1287
1288.Lreduce__func2:
1289
1290	vbroadcasti128	.Lgfpoly(%rip),%ymm2
1291	vpclmulqdq	$0x01,%ymm5,%ymm2,%ymm3
1292	vpshufd	$0x4e,%ymm5,%ymm5
1293	vpxor	%ymm5,%ymm6,%ymm6
1294	vpxor	%ymm3,%ymm6,%ymm6
1295	vpclmulqdq	$0x01,%ymm6,%ymm2,%ymm3
1296	vpshufd	$0x4e,%ymm6,%ymm6
1297	vpxor	%ymm6,%ymm7,%ymm7
1298	vpxor	%ymm3,%ymm7,%ymm7
1299	vextracti128	$1,%ymm7,%xmm1
1300	vpxor	%xmm7,%xmm1,%xmm1
1301
1302.Ldone__func2:
1303
1304	vpshufb	%xmm0,%xmm1,%xmm1
1305	vmovdqu	%xmm1,(%r12)
1306
1307	vzeroupper
1308	popq	%r12
1309.cfi_adjust_cfa_offset	-8
1310.cfi_restore	%r12
1311	RET
1312
1313.cfi_endproc
1314SET_SIZE(aes_gcm_dec_update_vaes_avx2)
1315
1316#endif /* !_WIN32 || _KERNEL */
1317
1318/* Mark the stack non-executable. */
1319#if defined(__linux__) && defined(__ELF__)
1320.section .note.GNU-stack,"",%progbits
1321#endif
1322
1323#endif /* defined(__x86_64__) && defined(HAVE_AVX) && defined(HAVE_AES) ... */
1324