1/* $FreeBSD$ */
2/* Do not modify. This file is auto-generated from aesni-gcm-x86_64.pl. */
3.text
4
5.type	_aesni_ctr32_ghash_6x,@function
6.align	32
7_aesni_ctr32_ghash_6x:
8.cfi_startproc
9	vmovdqu	32(%r11),%xmm2
10	subq	$6,%rdx
11	vpxor	%xmm4,%xmm4,%xmm4
12	vmovdqu	0-128(%rcx),%xmm15
13	vpaddb	%xmm2,%xmm1,%xmm10
14	vpaddb	%xmm2,%xmm10,%xmm11
15	vpaddb	%xmm2,%xmm11,%xmm12
16	vpaddb	%xmm2,%xmm12,%xmm13
17	vpaddb	%xmm2,%xmm13,%xmm14
18	vpxor	%xmm15,%xmm1,%xmm9
19	vmovdqu	%xmm4,16+8(%rsp)
20	jmp	.Loop6x
21
22.align	32
23.Loop6x:
24	addl	$100663296,%ebx
25	jc	.Lhandle_ctr32
26	vmovdqu	0-32(%r9),%xmm3
27	vpaddb	%xmm2,%xmm14,%xmm1
28	vpxor	%xmm15,%xmm10,%xmm10
29	vpxor	%xmm15,%xmm11,%xmm11
30
31.Lresume_ctr32:
32	vmovdqu	%xmm1,(%r8)
33	vpclmulqdq	$0x10,%xmm3,%xmm7,%xmm5
34	vpxor	%xmm15,%xmm12,%xmm12
35	vmovups	16-128(%rcx),%xmm2
36	vpclmulqdq	$0x01,%xmm3,%xmm7,%xmm6
37	xorq	%r12,%r12
38	cmpq	%r14,%r15
39
40	vaesenc	%xmm2,%xmm9,%xmm9
41	vmovdqu	48+8(%rsp),%xmm0
42	vpxor	%xmm15,%xmm13,%xmm13
43	vpclmulqdq	$0x00,%xmm3,%xmm7,%xmm1
44	vaesenc	%xmm2,%xmm10,%xmm10
45	vpxor	%xmm15,%xmm14,%xmm14
46	setnc	%r12b
47	vpclmulqdq	$0x11,%xmm3,%xmm7,%xmm7
48	vaesenc	%xmm2,%xmm11,%xmm11
49	vmovdqu	16-32(%r9),%xmm3
50	negq	%r12
51	vaesenc	%xmm2,%xmm12,%xmm12
52	vpxor	%xmm5,%xmm6,%xmm6
53	vpclmulqdq	$0x00,%xmm3,%xmm0,%xmm5
54	vpxor	%xmm4,%xmm8,%xmm8
55	vaesenc	%xmm2,%xmm13,%xmm13
56	vpxor	%xmm5,%xmm1,%xmm4
57	andq	$0x60,%r12
58	vmovups	32-128(%rcx),%xmm15
59	vpclmulqdq	$0x10,%xmm3,%xmm0,%xmm1
60	vaesenc	%xmm2,%xmm14,%xmm14
61
62	vpclmulqdq	$0x01,%xmm3,%xmm0,%xmm2
63	leaq	(%r14,%r12,1),%r14
64	vaesenc	%xmm15,%xmm9,%xmm9
65	vpxor	16+8(%rsp),%xmm8,%xmm8
66	vpclmulqdq	$0x11,%xmm3,%xmm0,%xmm3
67	vmovdqu	64+8(%rsp),%xmm0
68	vaesenc	%xmm15,%xmm10,%xmm10
69	movbeq	88(%r14),%r13
70	vaesenc	%xmm15,%xmm11,%xmm11
71	movbeq	80(%r14),%r12
72	vaesenc	%xmm15,%xmm12,%xmm12
73	movq	%r13,32+8(%rsp)
74	vaesenc	%xmm15,%xmm13,%xmm13
75	movq	%r12,40+8(%rsp)
76	vmovdqu	48-32(%r9),%xmm5
77	vaesenc	%xmm15,%xmm14,%xmm14
78
79	vmovups	48-128(%rcx),%xmm15
80	vpxor	%xmm1,%xmm6,%xmm6
81	vpclmulqdq	$0x00,%xmm5,%xmm0,%xmm1
82	vaesenc	%xmm15,%xmm9,%xmm9
83	vpxor	%xmm2,%xmm6,%xmm6
84	vpclmulqdq	$0x10,%xmm5,%xmm0,%xmm2
85	vaesenc	%xmm15,%xmm10,%xmm10
86	vpxor	%xmm3,%xmm7,%xmm7
87	vpclmulqdq	$0x01,%xmm5,%xmm0,%xmm3
88	vaesenc	%xmm15,%xmm11,%xmm11
89	vpclmulqdq	$0x11,%xmm5,%xmm0,%xmm5
90	vmovdqu	80+8(%rsp),%xmm0
91	vaesenc	%xmm15,%xmm12,%xmm12
92	vaesenc	%xmm15,%xmm13,%xmm13
93	vpxor	%xmm1,%xmm4,%xmm4
94	vmovdqu	64-32(%r9),%xmm1
95	vaesenc	%xmm15,%xmm14,%xmm14
96
97	vmovups	64-128(%rcx),%xmm15
98	vpxor	%xmm2,%xmm6,%xmm6
99	vpclmulqdq	$0x00,%xmm1,%xmm0,%xmm2
100	vaesenc	%xmm15,%xmm9,%xmm9
101	vpxor	%xmm3,%xmm6,%xmm6
102	vpclmulqdq	$0x10,%xmm1,%xmm0,%xmm3
103	vaesenc	%xmm15,%xmm10,%xmm10
104	movbeq	72(%r14),%r13
105	vpxor	%xmm5,%xmm7,%xmm7
106	vpclmulqdq	$0x01,%xmm1,%xmm0,%xmm5
107	vaesenc	%xmm15,%xmm11,%xmm11
108	movbeq	64(%r14),%r12
109	vpclmulqdq	$0x11,%xmm1,%xmm0,%xmm1
110	vmovdqu	96+8(%rsp),%xmm0
111	vaesenc	%xmm15,%xmm12,%xmm12
112	movq	%r13,48+8(%rsp)
113	vaesenc	%xmm15,%xmm13,%xmm13
114	movq	%r12,56+8(%rsp)
115	vpxor	%xmm2,%xmm4,%xmm4
116	vmovdqu	96-32(%r9),%xmm2
117	vaesenc	%xmm15,%xmm14,%xmm14
118
119	vmovups	80-128(%rcx),%xmm15
120	vpxor	%xmm3,%xmm6,%xmm6
121	vpclmulqdq	$0x00,%xmm2,%xmm0,%xmm3
122	vaesenc	%xmm15,%xmm9,%xmm9
123	vpxor	%xmm5,%xmm6,%xmm6
124	vpclmulqdq	$0x10,%xmm2,%xmm0,%xmm5
125	vaesenc	%xmm15,%xmm10,%xmm10
126	movbeq	56(%r14),%r13
127	vpxor	%xmm1,%xmm7,%xmm7
128	vpclmulqdq	$0x01,%xmm2,%xmm0,%xmm1
129	vpxor	112+8(%rsp),%xmm8,%xmm8
130	vaesenc	%xmm15,%xmm11,%xmm11
131	movbeq	48(%r14),%r12
132	vpclmulqdq	$0x11,%xmm2,%xmm0,%xmm2
133	vaesenc	%xmm15,%xmm12,%xmm12
134	movq	%r13,64+8(%rsp)
135	vaesenc	%xmm15,%xmm13,%xmm13
136	movq	%r12,72+8(%rsp)
137	vpxor	%xmm3,%xmm4,%xmm4
138	vmovdqu	112-32(%r9),%xmm3
139	vaesenc	%xmm15,%xmm14,%xmm14
140
141	vmovups	96-128(%rcx),%xmm15
142	vpxor	%xmm5,%xmm6,%xmm6
143	vpclmulqdq	$0x10,%xmm3,%xmm8,%xmm5
144	vaesenc	%xmm15,%xmm9,%xmm9
145	vpxor	%xmm1,%xmm6,%xmm6
146	vpclmulqdq	$0x01,%xmm3,%xmm8,%xmm1
147	vaesenc	%xmm15,%xmm10,%xmm10
148	movbeq	40(%r14),%r13
149	vpxor	%xmm2,%xmm7,%xmm7
150	vpclmulqdq	$0x00,%xmm3,%xmm8,%xmm2
151	vaesenc	%xmm15,%xmm11,%xmm11
152	movbeq	32(%r14),%r12
153	vpclmulqdq	$0x11,%xmm3,%xmm8,%xmm8
154	vaesenc	%xmm15,%xmm12,%xmm12
155	movq	%r13,80+8(%rsp)
156	vaesenc	%xmm15,%xmm13,%xmm13
157	movq	%r12,88+8(%rsp)
158	vpxor	%xmm5,%xmm6,%xmm6
159	vaesenc	%xmm15,%xmm14,%xmm14
160	vpxor	%xmm1,%xmm6,%xmm6
161
162	vmovups	112-128(%rcx),%xmm15
163	vpslldq	$8,%xmm6,%xmm5
164	vpxor	%xmm2,%xmm4,%xmm4
165	vmovdqu	16(%r11),%xmm3
166
167	vaesenc	%xmm15,%xmm9,%xmm9
168	vpxor	%xmm8,%xmm7,%xmm7
169	vaesenc	%xmm15,%xmm10,%xmm10
170	vpxor	%xmm5,%xmm4,%xmm4
171	movbeq	24(%r14),%r13
172	vaesenc	%xmm15,%xmm11,%xmm11
173	movbeq	16(%r14),%r12
174	vpalignr	$8,%xmm4,%xmm4,%xmm0
175	vpclmulqdq	$0x10,%xmm3,%xmm4,%xmm4
176	movq	%r13,96+8(%rsp)
177	vaesenc	%xmm15,%xmm12,%xmm12
178	movq	%r12,104+8(%rsp)
179	vaesenc	%xmm15,%xmm13,%xmm13
180	vmovups	128-128(%rcx),%xmm1
181	vaesenc	%xmm15,%xmm14,%xmm14
182
183	vaesenc	%xmm1,%xmm9,%xmm9
184	vmovups	144-128(%rcx),%xmm15
185	vaesenc	%xmm1,%xmm10,%xmm10
186	vpsrldq	$8,%xmm6,%xmm6
187	vaesenc	%xmm1,%xmm11,%xmm11
188	vpxor	%xmm6,%xmm7,%xmm7
189	vaesenc	%xmm1,%xmm12,%xmm12
190	vpxor	%xmm0,%xmm4,%xmm4
191	movbeq	8(%r14),%r13
192	vaesenc	%xmm1,%xmm13,%xmm13
193	movbeq	0(%r14),%r12
194	vaesenc	%xmm1,%xmm14,%xmm14
195	vmovups	160-128(%rcx),%xmm1
196	cmpl	$11,%ebp
197	jb	.Lenc_tail
198
199	vaesenc	%xmm15,%xmm9,%xmm9
200	vaesenc	%xmm15,%xmm10,%xmm10
201	vaesenc	%xmm15,%xmm11,%xmm11
202	vaesenc	%xmm15,%xmm12,%xmm12
203	vaesenc	%xmm15,%xmm13,%xmm13
204	vaesenc	%xmm15,%xmm14,%xmm14
205
206	vaesenc	%xmm1,%xmm9,%xmm9
207	vaesenc	%xmm1,%xmm10,%xmm10
208	vaesenc	%xmm1,%xmm11,%xmm11
209	vaesenc	%xmm1,%xmm12,%xmm12
210	vaesenc	%xmm1,%xmm13,%xmm13
211	vmovups	176-128(%rcx),%xmm15
212	vaesenc	%xmm1,%xmm14,%xmm14
213	vmovups	192-128(%rcx),%xmm1
214	je	.Lenc_tail
215
216	vaesenc	%xmm15,%xmm9,%xmm9
217	vaesenc	%xmm15,%xmm10,%xmm10
218	vaesenc	%xmm15,%xmm11,%xmm11
219	vaesenc	%xmm15,%xmm12,%xmm12
220	vaesenc	%xmm15,%xmm13,%xmm13
221	vaesenc	%xmm15,%xmm14,%xmm14
222
223	vaesenc	%xmm1,%xmm9,%xmm9
224	vaesenc	%xmm1,%xmm10,%xmm10
225	vaesenc	%xmm1,%xmm11,%xmm11
226	vaesenc	%xmm1,%xmm12,%xmm12
227	vaesenc	%xmm1,%xmm13,%xmm13
228	vmovups	208-128(%rcx),%xmm15
229	vaesenc	%xmm1,%xmm14,%xmm14
230	vmovups	224-128(%rcx),%xmm1
231	jmp	.Lenc_tail
232
233.align	32
234.Lhandle_ctr32:
235	vmovdqu	(%r11),%xmm0
236	vpshufb	%xmm0,%xmm1,%xmm6
237	vmovdqu	48(%r11),%xmm5
238	vpaddd	64(%r11),%xmm6,%xmm10
239	vpaddd	%xmm5,%xmm6,%xmm11
240	vmovdqu	0-32(%r9),%xmm3
241	vpaddd	%xmm5,%xmm10,%xmm12
242	vpshufb	%xmm0,%xmm10,%xmm10
243	vpaddd	%xmm5,%xmm11,%xmm13
244	vpshufb	%xmm0,%xmm11,%xmm11
245	vpxor	%xmm15,%xmm10,%xmm10
246	vpaddd	%xmm5,%xmm12,%xmm14
247	vpshufb	%xmm0,%xmm12,%xmm12
248	vpxor	%xmm15,%xmm11,%xmm11
249	vpaddd	%xmm5,%xmm13,%xmm1
250	vpshufb	%xmm0,%xmm13,%xmm13
251	vpshufb	%xmm0,%xmm14,%xmm14
252	vpshufb	%xmm0,%xmm1,%xmm1
253	jmp	.Lresume_ctr32
254
255.align	32
256.Lenc_tail:
257	vaesenc	%xmm15,%xmm9,%xmm9
258	vmovdqu	%xmm7,16+8(%rsp)
259	vpalignr	$8,%xmm4,%xmm4,%xmm8
260	vaesenc	%xmm15,%xmm10,%xmm10
261	vpclmulqdq	$0x10,%xmm3,%xmm4,%xmm4
262	vpxor	0(%rdi),%xmm1,%xmm2
263	vaesenc	%xmm15,%xmm11,%xmm11
264	vpxor	16(%rdi),%xmm1,%xmm0
265	vaesenc	%xmm15,%xmm12,%xmm12
266	vpxor	32(%rdi),%xmm1,%xmm5
267	vaesenc	%xmm15,%xmm13,%xmm13
268	vpxor	48(%rdi),%xmm1,%xmm6
269	vaesenc	%xmm15,%xmm14,%xmm14
270	vpxor	64(%rdi),%xmm1,%xmm7
271	vpxor	80(%rdi),%xmm1,%xmm3
272	vmovdqu	(%r8),%xmm1
273
274	vaesenclast	%xmm2,%xmm9,%xmm9
275	vmovdqu	32(%r11),%xmm2
276	vaesenclast	%xmm0,%xmm10,%xmm10
277	vpaddb	%xmm2,%xmm1,%xmm0
278	movq	%r13,112+8(%rsp)
279	leaq	96(%rdi),%rdi
280	vaesenclast	%xmm5,%xmm11,%xmm11
281	vpaddb	%xmm2,%xmm0,%xmm5
282	movq	%r12,120+8(%rsp)
283	leaq	96(%rsi),%rsi
284	vmovdqu	0-128(%rcx),%xmm15
285	vaesenclast	%xmm6,%xmm12,%xmm12
286	vpaddb	%xmm2,%xmm5,%xmm6
287	vaesenclast	%xmm7,%xmm13,%xmm13
288	vpaddb	%xmm2,%xmm6,%xmm7
289	vaesenclast	%xmm3,%xmm14,%xmm14
290	vpaddb	%xmm2,%xmm7,%xmm3
291
292	addq	$0x60,%r10
293	subq	$0x6,%rdx
294	jc	.L6x_done
295
296	vmovups	%xmm9,-96(%rsi)
297	vpxor	%xmm15,%xmm1,%xmm9
298	vmovups	%xmm10,-80(%rsi)
299	vmovdqa	%xmm0,%xmm10
300	vmovups	%xmm11,-64(%rsi)
301	vmovdqa	%xmm5,%xmm11
302	vmovups	%xmm12,-48(%rsi)
303	vmovdqa	%xmm6,%xmm12
304	vmovups	%xmm13,-32(%rsi)
305	vmovdqa	%xmm7,%xmm13
306	vmovups	%xmm14,-16(%rsi)
307	vmovdqa	%xmm3,%xmm14
308	vmovdqu	32+8(%rsp),%xmm7
309	jmp	.Loop6x
310
311.L6x_done:
312	vpxor	16+8(%rsp),%xmm8,%xmm8
313	vpxor	%xmm4,%xmm8,%xmm8
314
315	.byte	0xf3,0xc3
316.cfi_endproc
317.size	_aesni_ctr32_ghash_6x,.-_aesni_ctr32_ghash_6x
318.globl	aesni_gcm_decrypt
319.type	aesni_gcm_decrypt,@function
320.align	32
321aesni_gcm_decrypt:
322.cfi_startproc
323	xorq	%r10,%r10
324	cmpq	$0x60,%rdx
325	jb	.Lgcm_dec_abort
326
327	leaq	(%rsp),%rax
328.cfi_def_cfa_register	%rax
329	pushq	%rbx
330.cfi_offset	%rbx,-16
331	pushq	%rbp
332.cfi_offset	%rbp,-24
333	pushq	%r12
334.cfi_offset	%r12,-32
335	pushq	%r13
336.cfi_offset	%r13,-40
337	pushq	%r14
338.cfi_offset	%r14,-48
339	pushq	%r15
340.cfi_offset	%r15,-56
341	vzeroupper
342
343	vmovdqu	(%r8),%xmm1
344	addq	$-128,%rsp
345	movl	12(%r8),%ebx
346	leaq	.Lbswap_mask(%rip),%r11
347	leaq	-128(%rcx),%r14
348	movq	$0xf80,%r15
349	vmovdqu	(%r9),%xmm8
350	andq	$-128,%rsp
351	vmovdqu	(%r11),%xmm0
352	leaq	128(%rcx),%rcx
353	leaq	32+32(%r9),%r9
354	movl	240-128(%rcx),%ebp
355	vpshufb	%xmm0,%xmm8,%xmm8
356
357	andq	%r15,%r14
358	andq	%rsp,%r15
359	subq	%r14,%r15
360	jc	.Ldec_no_key_aliasing
361	cmpq	$768,%r15
362	jnc	.Ldec_no_key_aliasing
363	subq	%r15,%rsp
364.Ldec_no_key_aliasing:
365
366	vmovdqu	80(%rdi),%xmm7
367	leaq	(%rdi),%r14
368	vmovdqu	64(%rdi),%xmm4
369	leaq	-192(%rdi,%rdx,1),%r15
370	vmovdqu	48(%rdi),%xmm5
371	shrq	$4,%rdx
372	xorq	%r10,%r10
373	vmovdqu	32(%rdi),%xmm6
374	vpshufb	%xmm0,%xmm7,%xmm7
375	vmovdqu	16(%rdi),%xmm2
376	vpshufb	%xmm0,%xmm4,%xmm4
377	vmovdqu	(%rdi),%xmm3
378	vpshufb	%xmm0,%xmm5,%xmm5
379	vmovdqu	%xmm4,48(%rsp)
380	vpshufb	%xmm0,%xmm6,%xmm6
381	vmovdqu	%xmm5,64(%rsp)
382	vpshufb	%xmm0,%xmm2,%xmm2
383	vmovdqu	%xmm6,80(%rsp)
384	vpshufb	%xmm0,%xmm3,%xmm3
385	vmovdqu	%xmm2,96(%rsp)
386	vmovdqu	%xmm3,112(%rsp)
387
388	call	_aesni_ctr32_ghash_6x
389
390	vmovups	%xmm9,-96(%rsi)
391	vmovups	%xmm10,-80(%rsi)
392	vmovups	%xmm11,-64(%rsi)
393	vmovups	%xmm12,-48(%rsi)
394	vmovups	%xmm13,-32(%rsi)
395	vmovups	%xmm14,-16(%rsi)
396
397	vpshufb	(%r11),%xmm8,%xmm8
398	vmovdqu	%xmm8,-64(%r9)
399
400	vzeroupper
401	movq	-48(%rax),%r15
402.cfi_restore	%r15
403	movq	-40(%rax),%r14
404.cfi_restore	%r14
405	movq	-32(%rax),%r13
406.cfi_restore	%r13
407	movq	-24(%rax),%r12
408.cfi_restore	%r12
409	movq	-16(%rax),%rbp
410.cfi_restore	%rbp
411	movq	-8(%rax),%rbx
412.cfi_restore	%rbx
413	leaq	(%rax),%rsp
414.cfi_def_cfa_register	%rsp
415.Lgcm_dec_abort:
416	movq	%r10,%rax
417	.byte	0xf3,0xc3
418.cfi_endproc
419.size	aesni_gcm_decrypt,.-aesni_gcm_decrypt
420.type	_aesni_ctr32_6x,@function
421.align	32
422_aesni_ctr32_6x:
423.cfi_startproc
424	vmovdqu	0-128(%rcx),%xmm4
425	vmovdqu	32(%r11),%xmm2
426	leaq	-1(%rbp),%r13
427	vmovups	16-128(%rcx),%xmm15
428	leaq	32-128(%rcx),%r12
429	vpxor	%xmm4,%xmm1,%xmm9
430	addl	$100663296,%ebx
431	jc	.Lhandle_ctr32_2
432	vpaddb	%xmm2,%xmm1,%xmm10
433	vpaddb	%xmm2,%xmm10,%xmm11
434	vpxor	%xmm4,%xmm10,%xmm10
435	vpaddb	%xmm2,%xmm11,%xmm12
436	vpxor	%xmm4,%xmm11,%xmm11
437	vpaddb	%xmm2,%xmm12,%xmm13
438	vpxor	%xmm4,%xmm12,%xmm12
439	vpaddb	%xmm2,%xmm13,%xmm14
440	vpxor	%xmm4,%xmm13,%xmm13
441	vpaddb	%xmm2,%xmm14,%xmm1
442	vpxor	%xmm4,%xmm14,%xmm14
443	jmp	.Loop_ctr32
444
445.align	16
446.Loop_ctr32:
447	vaesenc	%xmm15,%xmm9,%xmm9
448	vaesenc	%xmm15,%xmm10,%xmm10
449	vaesenc	%xmm15,%xmm11,%xmm11
450	vaesenc	%xmm15,%xmm12,%xmm12
451	vaesenc	%xmm15,%xmm13,%xmm13
452	vaesenc	%xmm15,%xmm14,%xmm14
453	vmovups	(%r12),%xmm15
454	leaq	16(%r12),%r12
455	decl	%r13d
456	jnz	.Loop_ctr32
457
458	vmovdqu	(%r12),%xmm3
459	vaesenc	%xmm15,%xmm9,%xmm9
460	vpxor	0(%rdi),%xmm3,%xmm4
461	vaesenc	%xmm15,%xmm10,%xmm10
462	vpxor	16(%rdi),%xmm3,%xmm5
463	vaesenc	%xmm15,%xmm11,%xmm11
464	vpxor	32(%rdi),%xmm3,%xmm6
465	vaesenc	%xmm15,%xmm12,%xmm12
466	vpxor	48(%rdi),%xmm3,%xmm8
467	vaesenc	%xmm15,%xmm13,%xmm13
468	vpxor	64(%rdi),%xmm3,%xmm2
469	vaesenc	%xmm15,%xmm14,%xmm14
470	vpxor	80(%rdi),%xmm3,%xmm3
471	leaq	96(%rdi),%rdi
472
473	vaesenclast	%xmm4,%xmm9,%xmm9
474	vaesenclast	%xmm5,%xmm10,%xmm10
475	vaesenclast	%xmm6,%xmm11,%xmm11
476	vaesenclast	%xmm8,%xmm12,%xmm12
477	vaesenclast	%xmm2,%xmm13,%xmm13
478	vaesenclast	%xmm3,%xmm14,%xmm14
479	vmovups	%xmm9,0(%rsi)
480	vmovups	%xmm10,16(%rsi)
481	vmovups	%xmm11,32(%rsi)
482	vmovups	%xmm12,48(%rsi)
483	vmovups	%xmm13,64(%rsi)
484	vmovups	%xmm14,80(%rsi)
485	leaq	96(%rsi),%rsi
486
487	.byte	0xf3,0xc3
488.align	32
489.Lhandle_ctr32_2:
490	vpshufb	%xmm0,%xmm1,%xmm6
491	vmovdqu	48(%r11),%xmm5
492	vpaddd	64(%r11),%xmm6,%xmm10
493	vpaddd	%xmm5,%xmm6,%xmm11
494	vpaddd	%xmm5,%xmm10,%xmm12
495	vpshufb	%xmm0,%xmm10,%xmm10
496	vpaddd	%xmm5,%xmm11,%xmm13
497	vpshufb	%xmm0,%xmm11,%xmm11
498	vpxor	%xmm4,%xmm10,%xmm10
499	vpaddd	%xmm5,%xmm12,%xmm14
500	vpshufb	%xmm0,%xmm12,%xmm12
501	vpxor	%xmm4,%xmm11,%xmm11
502	vpaddd	%xmm5,%xmm13,%xmm1
503	vpshufb	%xmm0,%xmm13,%xmm13
504	vpxor	%xmm4,%xmm12,%xmm12
505	vpshufb	%xmm0,%xmm14,%xmm14
506	vpxor	%xmm4,%xmm13,%xmm13
507	vpshufb	%xmm0,%xmm1,%xmm1
508	vpxor	%xmm4,%xmm14,%xmm14
509	jmp	.Loop_ctr32
510.cfi_endproc
511.size	_aesni_ctr32_6x,.-_aesni_ctr32_6x
512
513.globl	aesni_gcm_encrypt
514.type	aesni_gcm_encrypt,@function
515.align	32
516aesni_gcm_encrypt:
517.cfi_startproc
518	xorq	%r10,%r10
519	cmpq	$288,%rdx
520	jb	.Lgcm_enc_abort
521
522	leaq	(%rsp),%rax
523.cfi_def_cfa_register	%rax
524	pushq	%rbx
525.cfi_offset	%rbx,-16
526	pushq	%rbp
527.cfi_offset	%rbp,-24
528	pushq	%r12
529.cfi_offset	%r12,-32
530	pushq	%r13
531.cfi_offset	%r13,-40
532	pushq	%r14
533.cfi_offset	%r14,-48
534	pushq	%r15
535.cfi_offset	%r15,-56
536	vzeroupper
537
538	vmovdqu	(%r8),%xmm1
539	addq	$-128,%rsp
540	movl	12(%r8),%ebx
541	leaq	.Lbswap_mask(%rip),%r11
542	leaq	-128(%rcx),%r14
543	movq	$0xf80,%r15
544	leaq	128(%rcx),%rcx
545	vmovdqu	(%r11),%xmm0
546	andq	$-128,%rsp
547	movl	240-128(%rcx),%ebp
548
549	andq	%r15,%r14
550	andq	%rsp,%r15
551	subq	%r14,%r15
552	jc	.Lenc_no_key_aliasing
553	cmpq	$768,%r15
554	jnc	.Lenc_no_key_aliasing
555	subq	%r15,%rsp
556.Lenc_no_key_aliasing:
557
558	leaq	(%rsi),%r14
559	leaq	-192(%rsi,%rdx,1),%r15
560	shrq	$4,%rdx
561
562	call	_aesni_ctr32_6x
563	vpshufb	%xmm0,%xmm9,%xmm8
564	vpshufb	%xmm0,%xmm10,%xmm2
565	vmovdqu	%xmm8,112(%rsp)
566	vpshufb	%xmm0,%xmm11,%xmm4
567	vmovdqu	%xmm2,96(%rsp)
568	vpshufb	%xmm0,%xmm12,%xmm5
569	vmovdqu	%xmm4,80(%rsp)
570	vpshufb	%xmm0,%xmm13,%xmm6
571	vmovdqu	%xmm5,64(%rsp)
572	vpshufb	%xmm0,%xmm14,%xmm7
573	vmovdqu	%xmm6,48(%rsp)
574
575	call	_aesni_ctr32_6x
576
577	vmovdqu	(%r9),%xmm8
578	leaq	32+32(%r9),%r9
579	subq	$12,%rdx
580	movq	$192,%r10
581	vpshufb	%xmm0,%xmm8,%xmm8
582
583	call	_aesni_ctr32_ghash_6x
584	vmovdqu	32(%rsp),%xmm7
585	vmovdqu	(%r11),%xmm0
586	vmovdqu	0-32(%r9),%xmm3
587	vpunpckhqdq	%xmm7,%xmm7,%xmm1
588	vmovdqu	32-32(%r9),%xmm15
589	vmovups	%xmm9,-96(%rsi)
590	vpshufb	%xmm0,%xmm9,%xmm9
591	vpxor	%xmm7,%xmm1,%xmm1
592	vmovups	%xmm10,-80(%rsi)
593	vpshufb	%xmm0,%xmm10,%xmm10
594	vmovups	%xmm11,-64(%rsi)
595	vpshufb	%xmm0,%xmm11,%xmm11
596	vmovups	%xmm12,-48(%rsi)
597	vpshufb	%xmm0,%xmm12,%xmm12
598	vmovups	%xmm13,-32(%rsi)
599	vpshufb	%xmm0,%xmm13,%xmm13
600	vmovups	%xmm14,-16(%rsi)
601	vpshufb	%xmm0,%xmm14,%xmm14
602	vmovdqu	%xmm9,16(%rsp)
603	vmovdqu	48(%rsp),%xmm6
604	vmovdqu	16-32(%r9),%xmm0
605	vpunpckhqdq	%xmm6,%xmm6,%xmm2
606	vpclmulqdq	$0x00,%xmm3,%xmm7,%xmm5
607	vpxor	%xmm6,%xmm2,%xmm2
608	vpclmulqdq	$0x11,%xmm3,%xmm7,%xmm7
609	vpclmulqdq	$0x00,%xmm15,%xmm1,%xmm1
610
611	vmovdqu	64(%rsp),%xmm9
612	vpclmulqdq	$0x00,%xmm0,%xmm6,%xmm4
613	vmovdqu	48-32(%r9),%xmm3
614	vpxor	%xmm5,%xmm4,%xmm4
615	vpunpckhqdq	%xmm9,%xmm9,%xmm5
616	vpclmulqdq	$0x11,%xmm0,%xmm6,%xmm6
617	vpxor	%xmm9,%xmm5,%xmm5
618	vpxor	%xmm7,%xmm6,%xmm6
619	vpclmulqdq	$0x10,%xmm15,%xmm2,%xmm2
620	vmovdqu	80-32(%r9),%xmm15
621	vpxor	%xmm1,%xmm2,%xmm2
622
623	vmovdqu	80(%rsp),%xmm1
624	vpclmulqdq	$0x00,%xmm3,%xmm9,%xmm7
625	vmovdqu	64-32(%r9),%xmm0
626	vpxor	%xmm4,%xmm7,%xmm7
627	vpunpckhqdq	%xmm1,%xmm1,%xmm4
628	vpclmulqdq	$0x11,%xmm3,%xmm9,%xmm9
629	vpxor	%xmm1,%xmm4,%xmm4
630	vpxor	%xmm6,%xmm9,%xmm9
631	vpclmulqdq	$0x00,%xmm15,%xmm5,%xmm5
632	vpxor	%xmm2,%xmm5,%xmm5
633
634	vmovdqu	96(%rsp),%xmm2
635	vpclmulqdq	$0x00,%xmm0,%xmm1,%xmm6
636	vmovdqu	96-32(%r9),%xmm3
637	vpxor	%xmm7,%xmm6,%xmm6
638	vpunpckhqdq	%xmm2,%xmm2,%xmm7
639	vpclmulqdq	$0x11,%xmm0,%xmm1,%xmm1
640	vpxor	%xmm2,%xmm7,%xmm7
641	vpxor	%xmm9,%xmm1,%xmm1
642	vpclmulqdq	$0x10,%xmm15,%xmm4,%xmm4
643	vmovdqu	128-32(%r9),%xmm15
644	vpxor	%xmm5,%xmm4,%xmm4
645
646	vpxor	112(%rsp),%xmm8,%xmm8
647	vpclmulqdq	$0x00,%xmm3,%xmm2,%xmm5
648	vmovdqu	112-32(%r9),%xmm0
649	vpunpckhqdq	%xmm8,%xmm8,%xmm9
650	vpxor	%xmm6,%xmm5,%xmm5
651	vpclmulqdq	$0x11,%xmm3,%xmm2,%xmm2
652	vpxor	%xmm8,%xmm9,%xmm9
653	vpxor	%xmm1,%xmm2,%xmm2
654	vpclmulqdq	$0x00,%xmm15,%xmm7,%xmm7
655	vpxor	%xmm4,%xmm7,%xmm4
656
657	vpclmulqdq	$0x00,%xmm0,%xmm8,%xmm6
658	vmovdqu	0-32(%r9),%xmm3
659	vpunpckhqdq	%xmm14,%xmm14,%xmm1
660	vpclmulqdq	$0x11,%xmm0,%xmm8,%xmm8
661	vpxor	%xmm14,%xmm1,%xmm1
662	vpxor	%xmm5,%xmm6,%xmm5
663	vpclmulqdq	$0x10,%xmm15,%xmm9,%xmm9
664	vmovdqu	32-32(%r9),%xmm15
665	vpxor	%xmm2,%xmm8,%xmm7
666	vpxor	%xmm4,%xmm9,%xmm6
667
668	vmovdqu	16-32(%r9),%xmm0
669	vpxor	%xmm5,%xmm7,%xmm9
670	vpclmulqdq	$0x00,%xmm3,%xmm14,%xmm4
671	vpxor	%xmm9,%xmm6,%xmm6
672	vpunpckhqdq	%xmm13,%xmm13,%xmm2
673	vpclmulqdq	$0x11,%xmm3,%xmm14,%xmm14
674	vpxor	%xmm13,%xmm2,%xmm2
675	vpslldq	$8,%xmm6,%xmm9
676	vpclmulqdq	$0x00,%xmm15,%xmm1,%xmm1
677	vpxor	%xmm9,%xmm5,%xmm8
678	vpsrldq	$8,%xmm6,%xmm6
679	vpxor	%xmm6,%xmm7,%xmm7
680
681	vpclmulqdq	$0x00,%xmm0,%xmm13,%xmm5
682	vmovdqu	48-32(%r9),%xmm3
683	vpxor	%xmm4,%xmm5,%xmm5
684	vpunpckhqdq	%xmm12,%xmm12,%xmm9
685	vpclmulqdq	$0x11,%xmm0,%xmm13,%xmm13
686	vpxor	%xmm12,%xmm9,%xmm9
687	vpxor	%xmm14,%xmm13,%xmm13
688	vpalignr	$8,%xmm8,%xmm8,%xmm14
689	vpclmulqdq	$0x10,%xmm15,%xmm2,%xmm2
690	vmovdqu	80-32(%r9),%xmm15
691	vpxor	%xmm1,%xmm2,%xmm2
692
693	vpclmulqdq	$0x00,%xmm3,%xmm12,%xmm4
694	vmovdqu	64-32(%r9),%xmm0
695	vpxor	%xmm5,%xmm4,%xmm4
696	vpunpckhqdq	%xmm11,%xmm11,%xmm1
697	vpclmulqdq	$0x11,%xmm3,%xmm12,%xmm12
698	vpxor	%xmm11,%xmm1,%xmm1
699	vpxor	%xmm13,%xmm12,%xmm12
700	vxorps	16(%rsp),%xmm7,%xmm7
701	vpclmulqdq	$0x00,%xmm15,%xmm9,%xmm9
702	vpxor	%xmm2,%xmm9,%xmm9
703
704	vpclmulqdq	$0x10,16(%r11),%xmm8,%xmm8
705	vxorps	%xmm14,%xmm8,%xmm8
706
707	vpclmulqdq	$0x00,%xmm0,%xmm11,%xmm5
708	vmovdqu	96-32(%r9),%xmm3
709	vpxor	%xmm4,%xmm5,%xmm5
710	vpunpckhqdq	%xmm10,%xmm10,%xmm2
711	vpclmulqdq	$0x11,%xmm0,%xmm11,%xmm11
712	vpxor	%xmm10,%xmm2,%xmm2
713	vpalignr	$8,%xmm8,%xmm8,%xmm14
714	vpxor	%xmm12,%xmm11,%xmm11
715	vpclmulqdq	$0x10,%xmm15,%xmm1,%xmm1
716	vmovdqu	128-32(%r9),%xmm15
717	vpxor	%xmm9,%xmm1,%xmm1
718
719	vxorps	%xmm7,%xmm14,%xmm14
720	vpclmulqdq	$0x10,16(%r11),%xmm8,%xmm8
721	vxorps	%xmm14,%xmm8,%xmm8
722
723	vpclmulqdq	$0x00,%xmm3,%xmm10,%xmm4
724	vmovdqu	112-32(%r9),%xmm0
725	vpxor	%xmm5,%xmm4,%xmm4
726	vpunpckhqdq	%xmm8,%xmm8,%xmm9
727	vpclmulqdq	$0x11,%xmm3,%xmm10,%xmm10
728	vpxor	%xmm8,%xmm9,%xmm9
729	vpxor	%xmm11,%xmm10,%xmm10
730	vpclmulqdq	$0x00,%xmm15,%xmm2,%xmm2
731	vpxor	%xmm1,%xmm2,%xmm2
732
733	vpclmulqdq	$0x00,%xmm0,%xmm8,%xmm5
734	vpclmulqdq	$0x11,%xmm0,%xmm8,%xmm7
735	vpxor	%xmm4,%xmm5,%xmm5
736	vpclmulqdq	$0x10,%xmm15,%xmm9,%xmm6
737	vpxor	%xmm10,%xmm7,%xmm7
738	vpxor	%xmm2,%xmm6,%xmm6
739
740	vpxor	%xmm5,%xmm7,%xmm4
741	vpxor	%xmm4,%xmm6,%xmm6
742	vpslldq	$8,%xmm6,%xmm1
743	vmovdqu	16(%r11),%xmm3
744	vpsrldq	$8,%xmm6,%xmm6
745	vpxor	%xmm1,%xmm5,%xmm8
746	vpxor	%xmm6,%xmm7,%xmm7
747
748	vpalignr	$8,%xmm8,%xmm8,%xmm2
749	vpclmulqdq	$0x10,%xmm3,%xmm8,%xmm8
750	vpxor	%xmm2,%xmm8,%xmm8
751
752	vpalignr	$8,%xmm8,%xmm8,%xmm2
753	vpclmulqdq	$0x10,%xmm3,%xmm8,%xmm8
754	vpxor	%xmm7,%xmm2,%xmm2
755	vpxor	%xmm2,%xmm8,%xmm8
756	vpshufb	(%r11),%xmm8,%xmm8
757	vmovdqu	%xmm8,-64(%r9)
758
759	vzeroupper
760	movq	-48(%rax),%r15
761.cfi_restore	%r15
762	movq	-40(%rax),%r14
763.cfi_restore	%r14
764	movq	-32(%rax),%r13
765.cfi_restore	%r13
766	movq	-24(%rax),%r12
767.cfi_restore	%r12
768	movq	-16(%rax),%rbp
769.cfi_restore	%rbp
770	movq	-8(%rax),%rbx
771.cfi_restore	%rbx
772	leaq	(%rax),%rsp
773.cfi_def_cfa_register	%rsp
774.Lgcm_enc_abort:
775	movq	%r10,%rax
776	.byte	0xf3,0xc3
777.cfi_endproc
778.size	aesni_gcm_encrypt,.-aesni_gcm_encrypt
779.align	64
780.Lbswap_mask:
781.byte	15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
782.Lpoly:
783.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2
784.Lone_msb:
785.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
786.Ltwo_lsb:
787.byte	2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
788.Lone_lsb:
789.byte	1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
790.byte	65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108,101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
791.align	64
792