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