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