• 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
17.p2align	5
18_aesni_ctr32_ghash_6x:
19
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	L$oop6x
32
33.p2align	5
34L$oop6x:
35	addl	$100663296,%ebx
36	jc	L$handle_ctr32
37	vmovdqu	0-32(%r9),%xmm3
38	vpaddb	%xmm2,%xmm14,%xmm1
39	vpxor	%xmm15,%xmm10,%xmm10
40	vpxor	%xmm15,%xmm11,%xmm11
41
42L$resume_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	L$enc_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	L$enc_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	L$enc_tail
260
261.p2align	5
262L$handle_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	L$resume_ctr32
282
283.p2align	5
284L$enc_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	L$6x_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	L$oop6x
338
339L$6x_done:
340	vpxor	16+8(%rsp),%xmm8,%xmm8
341	vpxor	%xmm4,%xmm8,%xmm8
342
343	.byte	0xf3,0xc3
344
345
346.globl	_aesni_gcm_decrypt
347.private_extern _aesni_gcm_decrypt
348
349.p2align	5
350_aesni_gcm_decrypt:
351
352	xorq	%r10,%r10
353
354
355
356	cmpq	$0x60,%rdx
357	jb	L$gcm_dec_abort
358
359	leaq	(%rsp),%rax
360
361	pushq	%rbx
362
363	pushq	%rbp
364
365	pushq	%r12
366
367	pushq	%r13
368
369	pushq	%r14
370
371	pushq	%r15
372
373	vzeroupper
374
375	vmovdqu	(%r8),%xmm1
376	addq	$-128,%rsp
377	movl	12(%r8),%ebx
378	leaq	L$bswap_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	L$dec_no_key_aliasing
393	cmpq	$768,%r15
394	jnc	L$dec_no_key_aliasing
395	subq	%r15,%rsp
396L$dec_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
443	movq	-40(%rax),%r14
444
445	movq	-32(%rax),%r13
446
447	movq	-24(%rax),%r12
448
449	movq	-16(%rax),%rbp
450
451	movq	-8(%rax),%rbx
452
453	leaq	(%rax),%rsp
454
455L$gcm_dec_abort:
456	movq	%r10,%rax
457	.byte	0xf3,0xc3
458
459
460
461.p2align	5
462_aesni_ctr32_6x:
463
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	L$handle_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	L$oop_ctr32
484
485.p2align	4
486L$oop_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	L$oop_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.p2align	5
529L$handle_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	L$oop_ctr32
550
551
552
553.globl	_aesni_gcm_encrypt
554.private_extern _aesni_gcm_encrypt
555
556.p2align	5
557_aesni_gcm_encrypt:
558
559#ifdef BORINGSSL_DISPATCH_TEST
560
561	movb	$1,_BORINGSSL_function_hit+2(%rip)
562#endif
563	xorq	%r10,%r10
564
565
566
567
568	cmpq	$288,%rdx
569	jb	L$gcm_enc_abort
570
571	leaq	(%rsp),%rax
572
573	pushq	%rbx
574
575	pushq	%rbp
576
577	pushq	%r12
578
579	pushq	%r13
580
581	pushq	%r14
582
583	pushq	%r15
584
585	vzeroupper
586
587	vmovdqu	(%r8),%xmm1
588	addq	$-128,%rsp
589	movl	12(%r8),%ebx
590	leaq	L$bswap_mask(%rip),%r11
591	leaq	-128(%rcx),%r14
592	movq	$0xf80,%r15
593	leaq	128(%rcx),%rcx
594	vmovdqu	(%r11),%xmm0
595	andq	$-128,%rsp
596	movl	240-128(%rcx),%ebp
597
598	andq	%r15,%r14
599	andq	%rsp,%r15
600	subq	%r14,%r15
601	jc	L$enc_no_key_aliasing
602	cmpq	$768,%r15
603	jnc	L$enc_no_key_aliasing
604	subq	%r15,%rsp
605L$enc_no_key_aliasing:
606
607	leaq	(%rsi),%r14
608
609
610
611
612
613
614
615
616	leaq	-192(%rsi,%rdx,1),%r15
617
618	shrq	$4,%rdx
619
620	call	_aesni_ctr32_6x
621	vpshufb	%xmm0,%xmm9,%xmm8
622	vpshufb	%xmm0,%xmm10,%xmm2
623	vmovdqu	%xmm8,112(%rsp)
624	vpshufb	%xmm0,%xmm11,%xmm4
625	vmovdqu	%xmm2,96(%rsp)
626	vpshufb	%xmm0,%xmm12,%xmm5
627	vmovdqu	%xmm4,80(%rsp)
628	vpshufb	%xmm0,%xmm13,%xmm6
629	vmovdqu	%xmm5,64(%rsp)
630	vpshufb	%xmm0,%xmm14,%xmm7
631	vmovdqu	%xmm6,48(%rsp)
632
633	call	_aesni_ctr32_6x
634
635	vmovdqu	(%r9),%xmm8
636	leaq	32+32(%r9),%r9
637	subq	$12,%rdx
638	movq	$192,%r10
639	vpshufb	%xmm0,%xmm8,%xmm8
640
641	call	_aesni_ctr32_ghash_6x
642	vmovdqu	32(%rsp),%xmm7
643	vmovdqu	(%r11),%xmm0
644	vmovdqu	0-32(%r9),%xmm3
645	vpunpckhqdq	%xmm7,%xmm7,%xmm1
646	vmovdqu	32-32(%r9),%xmm15
647	vmovups	%xmm9,-96(%rsi)
648	vpshufb	%xmm0,%xmm9,%xmm9
649	vpxor	%xmm7,%xmm1,%xmm1
650	vmovups	%xmm10,-80(%rsi)
651	vpshufb	%xmm0,%xmm10,%xmm10
652	vmovups	%xmm11,-64(%rsi)
653	vpshufb	%xmm0,%xmm11,%xmm11
654	vmovups	%xmm12,-48(%rsi)
655	vpshufb	%xmm0,%xmm12,%xmm12
656	vmovups	%xmm13,-32(%rsi)
657	vpshufb	%xmm0,%xmm13,%xmm13
658	vmovups	%xmm14,-16(%rsi)
659	vpshufb	%xmm0,%xmm14,%xmm14
660	vmovdqu	%xmm9,16(%rsp)
661	vmovdqu	48(%rsp),%xmm6
662	vmovdqu	16-32(%r9),%xmm0
663	vpunpckhqdq	%xmm6,%xmm6,%xmm2
664	vpclmulqdq	$0x00,%xmm3,%xmm7,%xmm5
665	vpxor	%xmm6,%xmm2,%xmm2
666	vpclmulqdq	$0x11,%xmm3,%xmm7,%xmm7
667	vpclmulqdq	$0x00,%xmm15,%xmm1,%xmm1
668
669	vmovdqu	64(%rsp),%xmm9
670	vpclmulqdq	$0x00,%xmm0,%xmm6,%xmm4
671	vmovdqu	48-32(%r9),%xmm3
672	vpxor	%xmm5,%xmm4,%xmm4
673	vpunpckhqdq	%xmm9,%xmm9,%xmm5
674	vpclmulqdq	$0x11,%xmm0,%xmm6,%xmm6
675	vpxor	%xmm9,%xmm5,%xmm5
676	vpxor	%xmm7,%xmm6,%xmm6
677	vpclmulqdq	$0x10,%xmm15,%xmm2,%xmm2
678	vmovdqu	80-32(%r9),%xmm15
679	vpxor	%xmm1,%xmm2,%xmm2
680
681	vmovdqu	80(%rsp),%xmm1
682	vpclmulqdq	$0x00,%xmm3,%xmm9,%xmm7
683	vmovdqu	64-32(%r9),%xmm0
684	vpxor	%xmm4,%xmm7,%xmm7
685	vpunpckhqdq	%xmm1,%xmm1,%xmm4
686	vpclmulqdq	$0x11,%xmm3,%xmm9,%xmm9
687	vpxor	%xmm1,%xmm4,%xmm4
688	vpxor	%xmm6,%xmm9,%xmm9
689	vpclmulqdq	$0x00,%xmm15,%xmm5,%xmm5
690	vpxor	%xmm2,%xmm5,%xmm5
691
692	vmovdqu	96(%rsp),%xmm2
693	vpclmulqdq	$0x00,%xmm0,%xmm1,%xmm6
694	vmovdqu	96-32(%r9),%xmm3
695	vpxor	%xmm7,%xmm6,%xmm6
696	vpunpckhqdq	%xmm2,%xmm2,%xmm7
697	vpclmulqdq	$0x11,%xmm0,%xmm1,%xmm1
698	vpxor	%xmm2,%xmm7,%xmm7
699	vpxor	%xmm9,%xmm1,%xmm1
700	vpclmulqdq	$0x10,%xmm15,%xmm4,%xmm4
701	vmovdqu	128-32(%r9),%xmm15
702	vpxor	%xmm5,%xmm4,%xmm4
703
704	vpxor	112(%rsp),%xmm8,%xmm8
705	vpclmulqdq	$0x00,%xmm3,%xmm2,%xmm5
706	vmovdqu	112-32(%r9),%xmm0
707	vpunpckhqdq	%xmm8,%xmm8,%xmm9
708	vpxor	%xmm6,%xmm5,%xmm5
709	vpclmulqdq	$0x11,%xmm3,%xmm2,%xmm2
710	vpxor	%xmm8,%xmm9,%xmm9
711	vpxor	%xmm1,%xmm2,%xmm2
712	vpclmulqdq	$0x00,%xmm15,%xmm7,%xmm7
713	vpxor	%xmm4,%xmm7,%xmm4
714
715	vpclmulqdq	$0x00,%xmm0,%xmm8,%xmm6
716	vmovdqu	0-32(%r9),%xmm3
717	vpunpckhqdq	%xmm14,%xmm14,%xmm1
718	vpclmulqdq	$0x11,%xmm0,%xmm8,%xmm8
719	vpxor	%xmm14,%xmm1,%xmm1
720	vpxor	%xmm5,%xmm6,%xmm5
721	vpclmulqdq	$0x10,%xmm15,%xmm9,%xmm9
722	vmovdqu	32-32(%r9),%xmm15
723	vpxor	%xmm2,%xmm8,%xmm7
724	vpxor	%xmm4,%xmm9,%xmm6
725
726	vmovdqu	16-32(%r9),%xmm0
727	vpxor	%xmm5,%xmm7,%xmm9
728	vpclmulqdq	$0x00,%xmm3,%xmm14,%xmm4
729	vpxor	%xmm9,%xmm6,%xmm6
730	vpunpckhqdq	%xmm13,%xmm13,%xmm2
731	vpclmulqdq	$0x11,%xmm3,%xmm14,%xmm14
732	vpxor	%xmm13,%xmm2,%xmm2
733	vpslldq	$8,%xmm6,%xmm9
734	vpclmulqdq	$0x00,%xmm15,%xmm1,%xmm1
735	vpxor	%xmm9,%xmm5,%xmm8
736	vpsrldq	$8,%xmm6,%xmm6
737	vpxor	%xmm6,%xmm7,%xmm7
738
739	vpclmulqdq	$0x00,%xmm0,%xmm13,%xmm5
740	vmovdqu	48-32(%r9),%xmm3
741	vpxor	%xmm4,%xmm5,%xmm5
742	vpunpckhqdq	%xmm12,%xmm12,%xmm9
743	vpclmulqdq	$0x11,%xmm0,%xmm13,%xmm13
744	vpxor	%xmm12,%xmm9,%xmm9
745	vpxor	%xmm14,%xmm13,%xmm13
746	vpalignr	$8,%xmm8,%xmm8,%xmm14
747	vpclmulqdq	$0x10,%xmm15,%xmm2,%xmm2
748	vmovdqu	80-32(%r9),%xmm15
749	vpxor	%xmm1,%xmm2,%xmm2
750
751	vpclmulqdq	$0x00,%xmm3,%xmm12,%xmm4
752	vmovdqu	64-32(%r9),%xmm0
753	vpxor	%xmm5,%xmm4,%xmm4
754	vpunpckhqdq	%xmm11,%xmm11,%xmm1
755	vpclmulqdq	$0x11,%xmm3,%xmm12,%xmm12
756	vpxor	%xmm11,%xmm1,%xmm1
757	vpxor	%xmm13,%xmm12,%xmm12
758	vxorps	16(%rsp),%xmm7,%xmm7
759	vpclmulqdq	$0x00,%xmm15,%xmm9,%xmm9
760	vpxor	%xmm2,%xmm9,%xmm9
761
762	vpclmulqdq	$0x10,16(%r11),%xmm8,%xmm8
763	vxorps	%xmm14,%xmm8,%xmm8
764
765	vpclmulqdq	$0x00,%xmm0,%xmm11,%xmm5
766	vmovdqu	96-32(%r9),%xmm3
767	vpxor	%xmm4,%xmm5,%xmm5
768	vpunpckhqdq	%xmm10,%xmm10,%xmm2
769	vpclmulqdq	$0x11,%xmm0,%xmm11,%xmm11
770	vpxor	%xmm10,%xmm2,%xmm2
771	vpalignr	$8,%xmm8,%xmm8,%xmm14
772	vpxor	%xmm12,%xmm11,%xmm11
773	vpclmulqdq	$0x10,%xmm15,%xmm1,%xmm1
774	vmovdqu	128-32(%r9),%xmm15
775	vpxor	%xmm9,%xmm1,%xmm1
776
777	vxorps	%xmm7,%xmm14,%xmm14
778	vpclmulqdq	$0x10,16(%r11),%xmm8,%xmm8
779	vxorps	%xmm14,%xmm8,%xmm8
780
781	vpclmulqdq	$0x00,%xmm3,%xmm10,%xmm4
782	vmovdqu	112-32(%r9),%xmm0
783	vpxor	%xmm5,%xmm4,%xmm4
784	vpunpckhqdq	%xmm8,%xmm8,%xmm9
785	vpclmulqdq	$0x11,%xmm3,%xmm10,%xmm10
786	vpxor	%xmm8,%xmm9,%xmm9
787	vpxor	%xmm11,%xmm10,%xmm10
788	vpclmulqdq	$0x00,%xmm15,%xmm2,%xmm2
789	vpxor	%xmm1,%xmm2,%xmm2
790
791	vpclmulqdq	$0x00,%xmm0,%xmm8,%xmm5
792	vpclmulqdq	$0x11,%xmm0,%xmm8,%xmm7
793	vpxor	%xmm4,%xmm5,%xmm5
794	vpclmulqdq	$0x10,%xmm15,%xmm9,%xmm6
795	vpxor	%xmm10,%xmm7,%xmm7
796	vpxor	%xmm2,%xmm6,%xmm6
797
798	vpxor	%xmm5,%xmm7,%xmm4
799	vpxor	%xmm4,%xmm6,%xmm6
800	vpslldq	$8,%xmm6,%xmm1
801	vmovdqu	16(%r11),%xmm3
802	vpsrldq	$8,%xmm6,%xmm6
803	vpxor	%xmm1,%xmm5,%xmm8
804	vpxor	%xmm6,%xmm7,%xmm7
805
806	vpalignr	$8,%xmm8,%xmm8,%xmm2
807	vpclmulqdq	$0x10,%xmm3,%xmm8,%xmm8
808	vpxor	%xmm2,%xmm8,%xmm8
809
810	vpalignr	$8,%xmm8,%xmm8,%xmm2
811	vpclmulqdq	$0x10,%xmm3,%xmm8,%xmm8
812	vpxor	%xmm7,%xmm2,%xmm2
813	vpxor	%xmm2,%xmm8,%xmm8
814	vpshufb	(%r11),%xmm8,%xmm8
815	vmovdqu	%xmm8,-64(%r9)
816
817	vzeroupper
818	movq	-48(%rax),%r15
819
820	movq	-40(%rax),%r14
821
822	movq	-32(%rax),%r13
823
824	movq	-24(%rax),%r12
825
826	movq	-16(%rax),%rbp
827
828	movq	-8(%rax),%rbx
829
830	leaq	(%rax),%rsp
831
832L$gcm_enc_abort:
833	movq	%r10,%rax
834	.byte	0xf3,0xc3
835
836
837.p2align	6
838L$bswap_mask:
839.byte	15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
840L$poly:
841.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2
842L$one_msb:
843.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
844L$two_lsb:
845.byte	2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
846L$one_lsb:
847.byte	1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
848.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
849.p2align	6
850#endif
851