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