xref: /freebsd/sys/crypto/openssl/amd64/aesni-gcm-x86_64.S (revision aa1a8ff2d6dbc51ef058f46f3db5a8bb77967145)
1/* Do not modify. This file is auto-generated from aesni-gcm-x86_64.pl. */
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	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.cfi_endproc
316.size	_aesni_ctr32_ghash_6x,.-_aesni_ctr32_ghash_6x
317.globl	aesni_gcm_decrypt
318.type	aesni_gcm_decrypt,@function
319.align	32
320aesni_gcm_decrypt:
321.cfi_startproc
322	xorq	%r10,%r10
323	cmpq	$0x60,%rdx
324	jb	.Lgcm_dec_abort
325
326	leaq	(%rsp),%rax
327.cfi_def_cfa_register	%rax
328	pushq	%rbx
329.cfi_offset	%rbx,-16
330	pushq	%rbp
331.cfi_offset	%rbp,-24
332	pushq	%r12
333.cfi_offset	%r12,-32
334	pushq	%r13
335.cfi_offset	%r13,-40
336	pushq	%r14
337.cfi_offset	%r14,-48
338	pushq	%r15
339.cfi_offset	%r15,-56
340	vzeroupper
341
342	vmovdqu	(%r8),%xmm1
343	addq	$-128,%rsp
344	movl	12(%r8),%ebx
345	leaq	.Lbswap_mask(%rip),%r11
346	leaq	-128(%rcx),%r14
347	movq	$0xf80,%r15
348	vmovdqu	(%r9),%xmm8
349	andq	$-128,%rsp
350	vmovdqu	(%r11),%xmm0
351	leaq	128(%rcx),%rcx
352	leaq	32+32(%r9),%r9
353	movl	240-128(%rcx),%ebp
354	vpshufb	%xmm0,%xmm8,%xmm8
355
356	andq	%r15,%r14
357	andq	%rsp,%r15
358	subq	%r14,%r15
359	jc	.Ldec_no_key_aliasing
360	cmpq	$768,%r15
361	jnc	.Ldec_no_key_aliasing
362	subq	%r15,%rsp
363.Ldec_no_key_aliasing:
364
365	vmovdqu	80(%rdi),%xmm7
366	leaq	(%rdi),%r14
367	vmovdqu	64(%rdi),%xmm4
368	leaq	-192(%rdi,%rdx,1),%r15
369	vmovdqu	48(%rdi),%xmm5
370	shrq	$4,%rdx
371	xorq	%r10,%r10
372	vmovdqu	32(%rdi),%xmm6
373	vpshufb	%xmm0,%xmm7,%xmm7
374	vmovdqu	16(%rdi),%xmm2
375	vpshufb	%xmm0,%xmm4,%xmm4
376	vmovdqu	(%rdi),%xmm3
377	vpshufb	%xmm0,%xmm5,%xmm5
378	vmovdqu	%xmm4,48(%rsp)
379	vpshufb	%xmm0,%xmm6,%xmm6
380	vmovdqu	%xmm5,64(%rsp)
381	vpshufb	%xmm0,%xmm2,%xmm2
382	vmovdqu	%xmm6,80(%rsp)
383	vpshufb	%xmm0,%xmm3,%xmm3
384	vmovdqu	%xmm2,96(%rsp)
385	vmovdqu	%xmm3,112(%rsp)
386
387	call	_aesni_ctr32_ghash_6x
388
389	vmovups	%xmm9,-96(%rsi)
390	vmovups	%xmm10,-80(%rsi)
391	vmovups	%xmm11,-64(%rsi)
392	vmovups	%xmm12,-48(%rsi)
393	vmovups	%xmm13,-32(%rsi)
394	vmovups	%xmm14,-16(%rsi)
395
396	vpshufb	(%r11),%xmm8,%xmm8
397	vmovdqu	%xmm8,-64(%r9)
398
399	vzeroupper
400	movq	-48(%rax),%r15
401.cfi_restore	%r15
402	movq	-40(%rax),%r14
403.cfi_restore	%r14
404	movq	-32(%rax),%r13
405.cfi_restore	%r13
406	movq	-24(%rax),%r12
407.cfi_restore	%r12
408	movq	-16(%rax),%rbp
409.cfi_restore	%rbp
410	movq	-8(%rax),%rbx
411.cfi_restore	%rbx
412	leaq	(%rax),%rsp
413.cfi_def_cfa_register	%rsp
414.Lgcm_dec_abort:
415	movq	%r10,%rax
416	.byte	0xf3,0xc3
417.cfi_endproc
418.size	aesni_gcm_decrypt,.-aesni_gcm_decrypt
419.type	_aesni_ctr32_6x,@function
420.align	32
421_aesni_ctr32_6x:
422.cfi_startproc
423	vmovdqu	0-128(%rcx),%xmm4
424	vmovdqu	32(%r11),%xmm2
425	leaq	-1(%rbp),%r13
426	vmovups	16-128(%rcx),%xmm15
427	leaq	32-128(%rcx),%r12
428	vpxor	%xmm4,%xmm1,%xmm9
429	addl	$100663296,%ebx
430	jc	.Lhandle_ctr32_2
431	vpaddb	%xmm2,%xmm1,%xmm10
432	vpaddb	%xmm2,%xmm10,%xmm11
433	vpxor	%xmm4,%xmm10,%xmm10
434	vpaddb	%xmm2,%xmm11,%xmm12
435	vpxor	%xmm4,%xmm11,%xmm11
436	vpaddb	%xmm2,%xmm12,%xmm13
437	vpxor	%xmm4,%xmm12,%xmm12
438	vpaddb	%xmm2,%xmm13,%xmm14
439	vpxor	%xmm4,%xmm13,%xmm13
440	vpaddb	%xmm2,%xmm14,%xmm1
441	vpxor	%xmm4,%xmm14,%xmm14
442	jmp	.Loop_ctr32
443
444.align	16
445.Loop_ctr32:
446	vaesenc	%xmm15,%xmm9,%xmm9
447	vaesenc	%xmm15,%xmm10,%xmm10
448	vaesenc	%xmm15,%xmm11,%xmm11
449	vaesenc	%xmm15,%xmm12,%xmm12
450	vaesenc	%xmm15,%xmm13,%xmm13
451	vaesenc	%xmm15,%xmm14,%xmm14
452	vmovups	(%r12),%xmm15
453	leaq	16(%r12),%r12
454	decl	%r13d
455	jnz	.Loop_ctr32
456
457	vmovdqu	(%r12),%xmm3
458	vaesenc	%xmm15,%xmm9,%xmm9
459	vpxor	0(%rdi),%xmm3,%xmm4
460	vaesenc	%xmm15,%xmm10,%xmm10
461	vpxor	16(%rdi),%xmm3,%xmm5
462	vaesenc	%xmm15,%xmm11,%xmm11
463	vpxor	32(%rdi),%xmm3,%xmm6
464	vaesenc	%xmm15,%xmm12,%xmm12
465	vpxor	48(%rdi),%xmm3,%xmm8
466	vaesenc	%xmm15,%xmm13,%xmm13
467	vpxor	64(%rdi),%xmm3,%xmm2
468	vaesenc	%xmm15,%xmm14,%xmm14
469	vpxor	80(%rdi),%xmm3,%xmm3
470	leaq	96(%rdi),%rdi
471
472	vaesenclast	%xmm4,%xmm9,%xmm9
473	vaesenclast	%xmm5,%xmm10,%xmm10
474	vaesenclast	%xmm6,%xmm11,%xmm11
475	vaesenclast	%xmm8,%xmm12,%xmm12
476	vaesenclast	%xmm2,%xmm13,%xmm13
477	vaesenclast	%xmm3,%xmm14,%xmm14
478	vmovups	%xmm9,0(%rsi)
479	vmovups	%xmm10,16(%rsi)
480	vmovups	%xmm11,32(%rsi)
481	vmovups	%xmm12,48(%rsi)
482	vmovups	%xmm13,64(%rsi)
483	vmovups	%xmm14,80(%rsi)
484	leaq	96(%rsi),%rsi
485
486	.byte	0xf3,0xc3
487.align	32
488.Lhandle_ctr32_2:
489	vpshufb	%xmm0,%xmm1,%xmm6
490	vmovdqu	48(%r11),%xmm5
491	vpaddd	64(%r11),%xmm6,%xmm10
492	vpaddd	%xmm5,%xmm6,%xmm11
493	vpaddd	%xmm5,%xmm10,%xmm12
494	vpshufb	%xmm0,%xmm10,%xmm10
495	vpaddd	%xmm5,%xmm11,%xmm13
496	vpshufb	%xmm0,%xmm11,%xmm11
497	vpxor	%xmm4,%xmm10,%xmm10
498	vpaddd	%xmm5,%xmm12,%xmm14
499	vpshufb	%xmm0,%xmm12,%xmm12
500	vpxor	%xmm4,%xmm11,%xmm11
501	vpaddd	%xmm5,%xmm13,%xmm1
502	vpshufb	%xmm0,%xmm13,%xmm13
503	vpxor	%xmm4,%xmm12,%xmm12
504	vpshufb	%xmm0,%xmm14,%xmm14
505	vpxor	%xmm4,%xmm13,%xmm13
506	vpshufb	%xmm0,%xmm1,%xmm1
507	vpxor	%xmm4,%xmm14,%xmm14
508	jmp	.Loop_ctr32
509.cfi_endproc
510.size	_aesni_ctr32_6x,.-_aesni_ctr32_6x
511
512.globl	aesni_gcm_encrypt
513.type	aesni_gcm_encrypt,@function
514.align	32
515aesni_gcm_encrypt:
516.cfi_startproc
517	xorq	%r10,%r10
518	cmpq	$288,%rdx
519	jb	.Lgcm_enc_abort
520
521	leaq	(%rsp),%rax
522.cfi_def_cfa_register	%rax
523	pushq	%rbx
524.cfi_offset	%rbx,-16
525	pushq	%rbp
526.cfi_offset	%rbp,-24
527	pushq	%r12
528.cfi_offset	%r12,-32
529	pushq	%r13
530.cfi_offset	%r13,-40
531	pushq	%r14
532.cfi_offset	%r14,-48
533	pushq	%r15
534.cfi_offset	%r15,-56
535	vzeroupper
536
537	vmovdqu	(%r8),%xmm1
538	addq	$-128,%rsp
539	movl	12(%r8),%ebx
540	leaq	.Lbswap_mask(%rip),%r11
541	leaq	-128(%rcx),%r14
542	movq	$0xf80,%r15
543	leaq	128(%rcx),%rcx
544	vmovdqu	(%r11),%xmm0
545	andq	$-128,%rsp
546	movl	240-128(%rcx),%ebp
547
548	andq	%r15,%r14
549	andq	%rsp,%r15
550	subq	%r14,%r15
551	jc	.Lenc_no_key_aliasing
552	cmpq	$768,%r15
553	jnc	.Lenc_no_key_aliasing
554	subq	%r15,%rsp
555.Lenc_no_key_aliasing:
556
557	leaq	(%rsi),%r14
558	leaq	-192(%rsi,%rdx,1),%r15
559	shrq	$4,%rdx
560
561	call	_aesni_ctr32_6x
562	vpshufb	%xmm0,%xmm9,%xmm8
563	vpshufb	%xmm0,%xmm10,%xmm2
564	vmovdqu	%xmm8,112(%rsp)
565	vpshufb	%xmm0,%xmm11,%xmm4
566	vmovdqu	%xmm2,96(%rsp)
567	vpshufb	%xmm0,%xmm12,%xmm5
568	vmovdqu	%xmm4,80(%rsp)
569	vpshufb	%xmm0,%xmm13,%xmm6
570	vmovdqu	%xmm5,64(%rsp)
571	vpshufb	%xmm0,%xmm14,%xmm7
572	vmovdqu	%xmm6,48(%rsp)
573
574	call	_aesni_ctr32_6x
575
576	vmovdqu	(%r9),%xmm8
577	leaq	32+32(%r9),%r9
578	subq	$12,%rdx
579	movq	$192,%r10
580	vpshufb	%xmm0,%xmm8,%xmm8
581
582	call	_aesni_ctr32_ghash_6x
583	vmovdqu	32(%rsp),%xmm7
584	vmovdqu	(%r11),%xmm0
585	vmovdqu	0-32(%r9),%xmm3
586	vpunpckhqdq	%xmm7,%xmm7,%xmm1
587	vmovdqu	32-32(%r9),%xmm15
588	vmovups	%xmm9,-96(%rsi)
589	vpshufb	%xmm0,%xmm9,%xmm9
590	vpxor	%xmm7,%xmm1,%xmm1
591	vmovups	%xmm10,-80(%rsi)
592	vpshufb	%xmm0,%xmm10,%xmm10
593	vmovups	%xmm11,-64(%rsi)
594	vpshufb	%xmm0,%xmm11,%xmm11
595	vmovups	%xmm12,-48(%rsi)
596	vpshufb	%xmm0,%xmm12,%xmm12
597	vmovups	%xmm13,-32(%rsi)
598	vpshufb	%xmm0,%xmm13,%xmm13
599	vmovups	%xmm14,-16(%rsi)
600	vpshufb	%xmm0,%xmm14,%xmm14
601	vmovdqu	%xmm9,16(%rsp)
602	vmovdqu	48(%rsp),%xmm6
603	vmovdqu	16-32(%r9),%xmm0
604	vpunpckhqdq	%xmm6,%xmm6,%xmm2
605	vpclmulqdq	$0x00,%xmm3,%xmm7,%xmm5
606	vpxor	%xmm6,%xmm2,%xmm2
607	vpclmulqdq	$0x11,%xmm3,%xmm7,%xmm7
608	vpclmulqdq	$0x00,%xmm15,%xmm1,%xmm1
609
610	vmovdqu	64(%rsp),%xmm9
611	vpclmulqdq	$0x00,%xmm0,%xmm6,%xmm4
612	vmovdqu	48-32(%r9),%xmm3
613	vpxor	%xmm5,%xmm4,%xmm4
614	vpunpckhqdq	%xmm9,%xmm9,%xmm5
615	vpclmulqdq	$0x11,%xmm0,%xmm6,%xmm6
616	vpxor	%xmm9,%xmm5,%xmm5
617	vpxor	%xmm7,%xmm6,%xmm6
618	vpclmulqdq	$0x10,%xmm15,%xmm2,%xmm2
619	vmovdqu	80-32(%r9),%xmm15
620	vpxor	%xmm1,%xmm2,%xmm2
621
622	vmovdqu	80(%rsp),%xmm1
623	vpclmulqdq	$0x00,%xmm3,%xmm9,%xmm7
624	vmovdqu	64-32(%r9),%xmm0
625	vpxor	%xmm4,%xmm7,%xmm7
626	vpunpckhqdq	%xmm1,%xmm1,%xmm4
627	vpclmulqdq	$0x11,%xmm3,%xmm9,%xmm9
628	vpxor	%xmm1,%xmm4,%xmm4
629	vpxor	%xmm6,%xmm9,%xmm9
630	vpclmulqdq	$0x00,%xmm15,%xmm5,%xmm5
631	vpxor	%xmm2,%xmm5,%xmm5
632
633	vmovdqu	96(%rsp),%xmm2
634	vpclmulqdq	$0x00,%xmm0,%xmm1,%xmm6
635	vmovdqu	96-32(%r9),%xmm3
636	vpxor	%xmm7,%xmm6,%xmm6
637	vpunpckhqdq	%xmm2,%xmm2,%xmm7
638	vpclmulqdq	$0x11,%xmm0,%xmm1,%xmm1
639	vpxor	%xmm2,%xmm7,%xmm7
640	vpxor	%xmm9,%xmm1,%xmm1
641	vpclmulqdq	$0x10,%xmm15,%xmm4,%xmm4
642	vmovdqu	128-32(%r9),%xmm15
643	vpxor	%xmm5,%xmm4,%xmm4
644
645	vpxor	112(%rsp),%xmm8,%xmm8
646	vpclmulqdq	$0x00,%xmm3,%xmm2,%xmm5
647	vmovdqu	112-32(%r9),%xmm0
648	vpunpckhqdq	%xmm8,%xmm8,%xmm9
649	vpxor	%xmm6,%xmm5,%xmm5
650	vpclmulqdq	$0x11,%xmm3,%xmm2,%xmm2
651	vpxor	%xmm8,%xmm9,%xmm9
652	vpxor	%xmm1,%xmm2,%xmm2
653	vpclmulqdq	$0x00,%xmm15,%xmm7,%xmm7
654	vpxor	%xmm4,%xmm7,%xmm4
655
656	vpclmulqdq	$0x00,%xmm0,%xmm8,%xmm6
657	vmovdqu	0-32(%r9),%xmm3
658	vpunpckhqdq	%xmm14,%xmm14,%xmm1
659	vpclmulqdq	$0x11,%xmm0,%xmm8,%xmm8
660	vpxor	%xmm14,%xmm1,%xmm1
661	vpxor	%xmm5,%xmm6,%xmm5
662	vpclmulqdq	$0x10,%xmm15,%xmm9,%xmm9
663	vmovdqu	32-32(%r9),%xmm15
664	vpxor	%xmm2,%xmm8,%xmm7
665	vpxor	%xmm4,%xmm9,%xmm6
666
667	vmovdqu	16-32(%r9),%xmm0
668	vpxor	%xmm5,%xmm7,%xmm9
669	vpclmulqdq	$0x00,%xmm3,%xmm14,%xmm4
670	vpxor	%xmm9,%xmm6,%xmm6
671	vpunpckhqdq	%xmm13,%xmm13,%xmm2
672	vpclmulqdq	$0x11,%xmm3,%xmm14,%xmm14
673	vpxor	%xmm13,%xmm2,%xmm2
674	vpslldq	$8,%xmm6,%xmm9
675	vpclmulqdq	$0x00,%xmm15,%xmm1,%xmm1
676	vpxor	%xmm9,%xmm5,%xmm8
677	vpsrldq	$8,%xmm6,%xmm6
678	vpxor	%xmm6,%xmm7,%xmm7
679
680	vpclmulqdq	$0x00,%xmm0,%xmm13,%xmm5
681	vmovdqu	48-32(%r9),%xmm3
682	vpxor	%xmm4,%xmm5,%xmm5
683	vpunpckhqdq	%xmm12,%xmm12,%xmm9
684	vpclmulqdq	$0x11,%xmm0,%xmm13,%xmm13
685	vpxor	%xmm12,%xmm9,%xmm9
686	vpxor	%xmm14,%xmm13,%xmm13
687	vpalignr	$8,%xmm8,%xmm8,%xmm14
688	vpclmulqdq	$0x10,%xmm15,%xmm2,%xmm2
689	vmovdqu	80-32(%r9),%xmm15
690	vpxor	%xmm1,%xmm2,%xmm2
691
692	vpclmulqdq	$0x00,%xmm3,%xmm12,%xmm4
693	vmovdqu	64-32(%r9),%xmm0
694	vpxor	%xmm5,%xmm4,%xmm4
695	vpunpckhqdq	%xmm11,%xmm11,%xmm1
696	vpclmulqdq	$0x11,%xmm3,%xmm12,%xmm12
697	vpxor	%xmm11,%xmm1,%xmm1
698	vpxor	%xmm13,%xmm12,%xmm12
699	vxorps	16(%rsp),%xmm7,%xmm7
700	vpclmulqdq	$0x00,%xmm15,%xmm9,%xmm9
701	vpxor	%xmm2,%xmm9,%xmm9
702
703	vpclmulqdq	$0x10,16(%r11),%xmm8,%xmm8
704	vxorps	%xmm14,%xmm8,%xmm8
705
706	vpclmulqdq	$0x00,%xmm0,%xmm11,%xmm5
707	vmovdqu	96-32(%r9),%xmm3
708	vpxor	%xmm4,%xmm5,%xmm5
709	vpunpckhqdq	%xmm10,%xmm10,%xmm2
710	vpclmulqdq	$0x11,%xmm0,%xmm11,%xmm11
711	vpxor	%xmm10,%xmm2,%xmm2
712	vpalignr	$8,%xmm8,%xmm8,%xmm14
713	vpxor	%xmm12,%xmm11,%xmm11
714	vpclmulqdq	$0x10,%xmm15,%xmm1,%xmm1
715	vmovdqu	128-32(%r9),%xmm15
716	vpxor	%xmm9,%xmm1,%xmm1
717
718	vxorps	%xmm7,%xmm14,%xmm14
719	vpclmulqdq	$0x10,16(%r11),%xmm8,%xmm8
720	vxorps	%xmm14,%xmm8,%xmm8
721
722	vpclmulqdq	$0x00,%xmm3,%xmm10,%xmm4
723	vmovdqu	112-32(%r9),%xmm0
724	vpxor	%xmm5,%xmm4,%xmm4
725	vpunpckhqdq	%xmm8,%xmm8,%xmm9
726	vpclmulqdq	$0x11,%xmm3,%xmm10,%xmm10
727	vpxor	%xmm8,%xmm9,%xmm9
728	vpxor	%xmm11,%xmm10,%xmm10
729	vpclmulqdq	$0x00,%xmm15,%xmm2,%xmm2
730	vpxor	%xmm1,%xmm2,%xmm2
731
732	vpclmulqdq	$0x00,%xmm0,%xmm8,%xmm5
733	vpclmulqdq	$0x11,%xmm0,%xmm8,%xmm7
734	vpxor	%xmm4,%xmm5,%xmm5
735	vpclmulqdq	$0x10,%xmm15,%xmm9,%xmm6
736	vpxor	%xmm10,%xmm7,%xmm7
737	vpxor	%xmm2,%xmm6,%xmm6
738
739	vpxor	%xmm5,%xmm7,%xmm4
740	vpxor	%xmm4,%xmm6,%xmm6
741	vpslldq	$8,%xmm6,%xmm1
742	vmovdqu	16(%r11),%xmm3
743	vpsrldq	$8,%xmm6,%xmm6
744	vpxor	%xmm1,%xmm5,%xmm8
745	vpxor	%xmm6,%xmm7,%xmm7
746
747	vpalignr	$8,%xmm8,%xmm8,%xmm2
748	vpclmulqdq	$0x10,%xmm3,%xmm8,%xmm8
749	vpxor	%xmm2,%xmm8,%xmm8
750
751	vpalignr	$8,%xmm8,%xmm8,%xmm2
752	vpclmulqdq	$0x10,%xmm3,%xmm8,%xmm8
753	vpxor	%xmm7,%xmm2,%xmm2
754	vpxor	%xmm2,%xmm8,%xmm8
755	vpshufb	(%r11),%xmm8,%xmm8
756	vmovdqu	%xmm8,-64(%r9)
757
758	vzeroupper
759	movq	-48(%rax),%r15
760.cfi_restore	%r15
761	movq	-40(%rax),%r14
762.cfi_restore	%r14
763	movq	-32(%rax),%r13
764.cfi_restore	%r13
765	movq	-24(%rax),%r12
766.cfi_restore	%r12
767	movq	-16(%rax),%rbp
768.cfi_restore	%rbp
769	movq	-8(%rax),%rbx
770.cfi_restore	%rbx
771	leaq	(%rax),%rsp
772.cfi_def_cfa_register	%rsp
773.Lgcm_enc_abort:
774	movq	%r10,%rax
775	.byte	0xf3,0xc3
776.cfi_endproc
777.size	aesni_gcm_encrypt,.-aesni_gcm_encrypt
778.align	64
779.Lbswap_mask:
780.byte	15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
781.Lpoly:
782.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2
783.Lone_msb:
784.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
785.Ltwo_lsb:
786.byte	2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
787.Lone_lsb:
788.byte	1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
789.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
790.align	64
791	.section ".note.gnu.property", "a"
792	.p2align 3
793	.long 1f - 0f
794	.long 4f - 1f
795	.long 5
7960:
797	# "GNU" encoded with .byte, since .asciz isn't supported
798	# on Solaris.
799	.byte 0x47
800	.byte 0x4e
801	.byte 0x55
802	.byte 0
8031:
804	.p2align 3
805	.long 0xc0000002
806	.long 3f - 2f
8072:
808	.long 3
8093:
810	.p2align 3
8114:
812