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