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