1238405Sjkim	# $FreeBSD$
2238405Sjkim.text
3238405Sjkim
4238405Sjkim
5238405Sjkim
6238405Sjkim
7238405Sjkim
8238405Sjkim
9238405Sjkim
10238405Sjkim
11238405Sjkim
12238405Sjkim
13238405Sjkim
14238405Sjkim
15238405Sjkim
16238405Sjkim
17238405Sjkim
18238405Sjkim
19238405Sjkim.type	_vpaes_encrypt_core,@function
20238405Sjkim.align	16
21238405Sjkim_vpaes_encrypt_core:
22238405Sjkim	movq	%rdx,%r9
23238405Sjkim	movq	$16,%r11
24238405Sjkim	movl	240(%rdx),%eax
25238405Sjkim	movdqa	%xmm9,%xmm1
26238405Sjkim	movdqa	.Lk_ipt(%rip),%xmm2
27238405Sjkim	pandn	%xmm0,%xmm1
28238405Sjkim	movdqu	(%r9),%xmm5
29238405Sjkim	psrld	$4,%xmm1
30238405Sjkim	pand	%xmm9,%xmm0
31238405Sjkim.byte	102,15,56,0,208
32238405Sjkim	movdqa	.Lk_ipt+16(%rip),%xmm0
33238405Sjkim.byte	102,15,56,0,193
34238405Sjkim	pxor	%xmm5,%xmm2
35238405Sjkim	pxor	%xmm2,%xmm0
36238405Sjkim	addq	$16,%r9
37238405Sjkim	leaq	.Lk_mc_backward(%rip),%r10
38238405Sjkim	jmp	.Lenc_entry
39238405Sjkim
40238405Sjkim.align	16
41238405Sjkim.Lenc_loop:
42238405Sjkim
43238405Sjkim	movdqa	%xmm13,%xmm4
44238405Sjkim.byte	102,15,56,0,226
45238405Sjkim	pxor	%xmm5,%xmm4
46238405Sjkim	movdqa	%xmm12,%xmm0
47238405Sjkim.byte	102,15,56,0,195
48238405Sjkim	pxor	%xmm4,%xmm0
49238405Sjkim	movdqa	%xmm15,%xmm5
50238405Sjkim.byte	102,15,56,0,234
51238405Sjkim	movdqa	-64(%r11,%r10,1),%xmm1
52238405Sjkim	movdqa	%xmm14,%xmm2
53238405Sjkim.byte	102,15,56,0,211
54238405Sjkim	pxor	%xmm5,%xmm2
55238405Sjkim	movdqa	(%r11,%r10,1),%xmm4
56238405Sjkim	movdqa	%xmm0,%xmm3
57238405Sjkim.byte	102,15,56,0,193
58238405Sjkim	addq	$16,%r9
59238405Sjkim	pxor	%xmm2,%xmm0
60238405Sjkim.byte	102,15,56,0,220
61238405Sjkim	addq	$16,%r11
62238405Sjkim	pxor	%xmm0,%xmm3
63238405Sjkim.byte	102,15,56,0,193
64238405Sjkim	andq	$48,%r11
65238405Sjkim	pxor	%xmm3,%xmm0
66238405Sjkim	subq	$1,%rax
67238405Sjkim
68238405Sjkim.Lenc_entry:
69238405Sjkim
70238405Sjkim	movdqa	%xmm9,%xmm1
71238405Sjkim	pandn	%xmm0,%xmm1
72238405Sjkim	psrld	$4,%xmm1
73238405Sjkim	pand	%xmm9,%xmm0
74238405Sjkim	movdqa	%xmm11,%xmm5
75238405Sjkim.byte	102,15,56,0,232
76238405Sjkim	pxor	%xmm1,%xmm0
77238405Sjkim	movdqa	%xmm10,%xmm3
78238405Sjkim.byte	102,15,56,0,217
79238405Sjkim	pxor	%xmm5,%xmm3
80238405Sjkim	movdqa	%xmm10,%xmm4
81238405Sjkim.byte	102,15,56,0,224
82238405Sjkim	pxor	%xmm5,%xmm4
83238405Sjkim	movdqa	%xmm10,%xmm2
84238405Sjkim.byte	102,15,56,0,211
85238405Sjkim	pxor	%xmm0,%xmm2
86238405Sjkim	movdqa	%xmm10,%xmm3
87238405Sjkim	movdqu	(%r9),%xmm5
88238405Sjkim.byte	102,15,56,0,220
89238405Sjkim	pxor	%xmm1,%xmm3
90238405Sjkim	jnz	.Lenc_loop
91238405Sjkim
92238405Sjkim
93238405Sjkim	movdqa	-96(%r10),%xmm4
94238405Sjkim	movdqa	-80(%r10),%xmm0
95238405Sjkim.byte	102,15,56,0,226
96238405Sjkim	pxor	%xmm5,%xmm4
97238405Sjkim.byte	102,15,56,0,195
98238405Sjkim	movdqa	64(%r11,%r10,1),%xmm1
99238405Sjkim	pxor	%xmm4,%xmm0
100238405Sjkim.byte	102,15,56,0,193
101238405Sjkim	.byte	0xf3,0xc3
102238405Sjkim.size	_vpaes_encrypt_core,.-_vpaes_encrypt_core
103238405Sjkim
104238405Sjkim
105238405Sjkim
106238405Sjkim
107238405Sjkim
108238405Sjkim
109238405Sjkim.type	_vpaes_decrypt_core,@function
110238405Sjkim.align	16
111238405Sjkim_vpaes_decrypt_core:
112238405Sjkim	movq	%rdx,%r9
113238405Sjkim	movl	240(%rdx),%eax
114238405Sjkim	movdqa	%xmm9,%xmm1
115238405Sjkim	movdqa	.Lk_dipt(%rip),%xmm2
116238405Sjkim	pandn	%xmm0,%xmm1
117238405Sjkim	movq	%rax,%r11
118238405Sjkim	psrld	$4,%xmm1
119238405Sjkim	movdqu	(%r9),%xmm5
120238405Sjkim	shlq	$4,%r11
121238405Sjkim	pand	%xmm9,%xmm0
122238405Sjkim.byte	102,15,56,0,208
123238405Sjkim	movdqa	.Lk_dipt+16(%rip),%xmm0
124238405Sjkim	xorq	$48,%r11
125238405Sjkim	leaq	.Lk_dsbd(%rip),%r10
126238405Sjkim.byte	102,15,56,0,193
127238405Sjkim	andq	$48,%r11
128238405Sjkim	pxor	%xmm5,%xmm2
129238405Sjkim	movdqa	.Lk_mc_forward+48(%rip),%xmm5
130238405Sjkim	pxor	%xmm2,%xmm0
131238405Sjkim	addq	$16,%r9
132238405Sjkim	addq	%r10,%r11
133238405Sjkim	jmp	.Ldec_entry
134238405Sjkim
135238405Sjkim.align	16
136238405Sjkim.Ldec_loop:
137238405Sjkim
138238405Sjkim
139238405Sjkim
140238405Sjkim	movdqa	-32(%r10),%xmm4
141238405Sjkim.byte	102,15,56,0,226
142238405Sjkim	pxor	%xmm0,%xmm4
143238405Sjkim	movdqa	-16(%r10),%xmm0
144238405Sjkim.byte	102,15,56,0,195
145238405Sjkim	pxor	%xmm4,%xmm0
146238405Sjkim	addq	$16,%r9
147238405Sjkim
148238405Sjkim.byte	102,15,56,0,197
149238405Sjkim	movdqa	0(%r10),%xmm4
150238405Sjkim.byte	102,15,56,0,226
151238405Sjkim	pxor	%xmm0,%xmm4
152238405Sjkim	movdqa	16(%r10),%xmm0
153238405Sjkim.byte	102,15,56,0,195
154238405Sjkim	pxor	%xmm4,%xmm0
155238405Sjkim	subq	$1,%rax
156238405Sjkim
157238405Sjkim.byte	102,15,56,0,197
158238405Sjkim	movdqa	32(%r10),%xmm4
159238405Sjkim.byte	102,15,56,0,226
160238405Sjkim	pxor	%xmm0,%xmm4
161238405Sjkim	movdqa	48(%r10),%xmm0
162238405Sjkim.byte	102,15,56,0,195
163238405Sjkim	pxor	%xmm4,%xmm0
164238405Sjkim
165238405Sjkim.byte	102,15,56,0,197
166238405Sjkim	movdqa	64(%r10),%xmm4
167238405Sjkim.byte	102,15,56,0,226
168238405Sjkim	pxor	%xmm0,%xmm4
169238405Sjkim	movdqa	80(%r10),%xmm0
170238405Sjkim.byte	102,15,56,0,195
171238405Sjkim	pxor	%xmm4,%xmm0
172238405Sjkim
173238405Sjkim.byte	102,15,58,15,237,12
174238405Sjkim
175238405Sjkim.Ldec_entry:
176238405Sjkim
177238405Sjkim	movdqa	%xmm9,%xmm1
178238405Sjkim	pandn	%xmm0,%xmm1
179238405Sjkim	psrld	$4,%xmm1
180238405Sjkim	pand	%xmm9,%xmm0
181238405Sjkim	movdqa	%xmm11,%xmm2
182238405Sjkim.byte	102,15,56,0,208
183238405Sjkim	pxor	%xmm1,%xmm0
184238405Sjkim	movdqa	%xmm10,%xmm3
185238405Sjkim.byte	102,15,56,0,217
186238405Sjkim	pxor	%xmm2,%xmm3
187238405Sjkim	movdqa	%xmm10,%xmm4
188238405Sjkim.byte	102,15,56,0,224
189238405Sjkim	pxor	%xmm2,%xmm4
190238405Sjkim	movdqa	%xmm10,%xmm2
191238405Sjkim.byte	102,15,56,0,211
192238405Sjkim	pxor	%xmm0,%xmm2
193238405Sjkim	movdqa	%xmm10,%xmm3
194238405Sjkim.byte	102,15,56,0,220
195238405Sjkim	pxor	%xmm1,%xmm3
196238405Sjkim	movdqu	(%r9),%xmm0
197238405Sjkim	jnz	.Ldec_loop
198238405Sjkim
199238405Sjkim
200238405Sjkim	movdqa	96(%r10),%xmm4
201238405Sjkim.byte	102,15,56,0,226
202238405Sjkim	pxor	%xmm0,%xmm4
203238405Sjkim	movdqa	112(%r10),%xmm0
204238405Sjkim	movdqa	-352(%r11),%xmm2
205238405Sjkim.byte	102,15,56,0,195
206238405Sjkim	pxor	%xmm4,%xmm0
207238405Sjkim.byte	102,15,56,0,194
208238405Sjkim	.byte	0xf3,0xc3
209238405Sjkim.size	_vpaes_decrypt_core,.-_vpaes_decrypt_core
210238405Sjkim
211238405Sjkim
212238405Sjkim
213238405Sjkim
214238405Sjkim
215238405Sjkim
216238405Sjkim.type	_vpaes_schedule_core,@function
217238405Sjkim.align	16
218238405Sjkim_vpaes_schedule_core:
219238405Sjkim
220238405Sjkim
221238405Sjkim
222238405Sjkim
223238405Sjkim
224238405Sjkim	call	_vpaes_preheat
225238405Sjkim	movdqa	.Lk_rcon(%rip),%xmm8
226238405Sjkim	movdqu	(%rdi),%xmm0
227238405Sjkim
228238405Sjkim
229238405Sjkim	movdqa	%xmm0,%xmm3
230238405Sjkim	leaq	.Lk_ipt(%rip),%r11
231238405Sjkim	call	_vpaes_schedule_transform
232238405Sjkim	movdqa	%xmm0,%xmm7
233238405Sjkim
234238405Sjkim	leaq	.Lk_sr(%rip),%r10
235238405Sjkim	testq	%rcx,%rcx
236238405Sjkim	jnz	.Lschedule_am_decrypting
237238405Sjkim
238238405Sjkim
239238405Sjkim	movdqu	%xmm0,(%rdx)
240238405Sjkim	jmp	.Lschedule_go
241238405Sjkim
242238405Sjkim.Lschedule_am_decrypting:
243238405Sjkim
244238405Sjkim	movdqa	(%r8,%r10,1),%xmm1
245238405Sjkim.byte	102,15,56,0,217
246238405Sjkim	movdqu	%xmm3,(%rdx)
247238405Sjkim	xorq	$48,%r8
248238405Sjkim
249238405Sjkim.Lschedule_go:
250238405Sjkim	cmpl	$192,%esi
251238405Sjkim	ja	.Lschedule_256
252238405Sjkim	je	.Lschedule_192
253238405Sjkim
254238405Sjkim
255238405Sjkim
256238405Sjkim
257238405Sjkim
258238405Sjkim
259238405Sjkim
260238405Sjkim
261238405Sjkim
262238405Sjkim
263238405Sjkim.Lschedule_128:
264238405Sjkim	movl	$10,%esi
265238405Sjkim
266238405Sjkim.Loop_schedule_128:
267238405Sjkim	call	_vpaes_schedule_round
268238405Sjkim	decq	%rsi
269238405Sjkim	jz	.Lschedule_mangle_last
270238405Sjkim	call	_vpaes_schedule_mangle
271238405Sjkim	jmp	.Loop_schedule_128
272238405Sjkim
273238405Sjkim
274238405Sjkim
275238405Sjkim
276238405Sjkim
277238405Sjkim
278238405Sjkim
279238405Sjkim
280238405Sjkim
281238405Sjkim
282238405Sjkim
283238405Sjkim
284238405Sjkim
285238405Sjkim
286238405Sjkim
287238405Sjkim
288238405Sjkim.align	16
289238405Sjkim.Lschedule_192:
290238405Sjkim	movdqu	8(%rdi),%xmm0
291238405Sjkim	call	_vpaes_schedule_transform
292238405Sjkim	movdqa	%xmm0,%xmm6
293238405Sjkim	pxor	%xmm4,%xmm4
294238405Sjkim	movhlps	%xmm4,%xmm6
295238405Sjkim	movl	$4,%esi
296238405Sjkim
297238405Sjkim.Loop_schedule_192:
298238405Sjkim	call	_vpaes_schedule_round
299238405Sjkim.byte	102,15,58,15,198,8
300238405Sjkim	call	_vpaes_schedule_mangle
301238405Sjkim	call	_vpaes_schedule_192_smear
302238405Sjkim	call	_vpaes_schedule_mangle
303238405Sjkim	call	_vpaes_schedule_round
304238405Sjkim	decq	%rsi
305238405Sjkim	jz	.Lschedule_mangle_last
306238405Sjkim	call	_vpaes_schedule_mangle
307238405Sjkim	call	_vpaes_schedule_192_smear
308238405Sjkim	jmp	.Loop_schedule_192
309238405Sjkim
310238405Sjkim
311238405Sjkim
312238405Sjkim
313238405Sjkim
314238405Sjkim
315238405Sjkim
316238405Sjkim
317238405Sjkim
318238405Sjkim
319238405Sjkim
320238405Sjkim.align	16
321238405Sjkim.Lschedule_256:
322238405Sjkim	movdqu	16(%rdi),%xmm0
323238405Sjkim	call	_vpaes_schedule_transform
324238405Sjkim	movl	$7,%esi
325238405Sjkim
326238405Sjkim.Loop_schedule_256:
327238405Sjkim	call	_vpaes_schedule_mangle
328238405Sjkim	movdqa	%xmm0,%xmm6
329238405Sjkim
330238405Sjkim
331238405Sjkim	call	_vpaes_schedule_round
332238405Sjkim	decq	%rsi
333238405Sjkim	jz	.Lschedule_mangle_last
334238405Sjkim	call	_vpaes_schedule_mangle
335238405Sjkim
336238405Sjkim
337238405Sjkim	pshufd	$255,%xmm0,%xmm0
338238405Sjkim	movdqa	%xmm7,%xmm5
339238405Sjkim	movdqa	%xmm6,%xmm7
340238405Sjkim	call	_vpaes_schedule_low_round
341238405Sjkim	movdqa	%xmm5,%xmm7
342238405Sjkim
343238405Sjkim	jmp	.Loop_schedule_256
344238405Sjkim
345238405Sjkim
346238405Sjkim
347238405Sjkim
348238405Sjkim
349238405Sjkim
350238405Sjkim
351238405Sjkim
352238405Sjkim
353238405Sjkim
354238405Sjkim
355238405Sjkim
356238405Sjkim.align	16
357238405Sjkim.Lschedule_mangle_last:
358238405Sjkim
359238405Sjkim	leaq	.Lk_deskew(%rip),%r11
360238405Sjkim	testq	%rcx,%rcx
361238405Sjkim	jnz	.Lschedule_mangle_last_dec
362238405Sjkim
363238405Sjkim
364238405Sjkim	movdqa	(%r8,%r10,1),%xmm1
365238405Sjkim.byte	102,15,56,0,193
366238405Sjkim	leaq	.Lk_opt(%rip),%r11
367238405Sjkim	addq	$32,%rdx
368238405Sjkim
369238405Sjkim.Lschedule_mangle_last_dec:
370238405Sjkim	addq	$-16,%rdx
371238405Sjkim	pxor	.Lk_s63(%rip),%xmm0
372238405Sjkim	call	_vpaes_schedule_transform
373238405Sjkim	movdqu	%xmm0,(%rdx)
374238405Sjkim
375238405Sjkim
376238405Sjkim	pxor	%xmm0,%xmm0
377238405Sjkim	pxor	%xmm1,%xmm1
378238405Sjkim	pxor	%xmm2,%xmm2
379238405Sjkim	pxor	%xmm3,%xmm3
380238405Sjkim	pxor	%xmm4,%xmm4
381238405Sjkim	pxor	%xmm5,%xmm5
382238405Sjkim	pxor	%xmm6,%xmm6
383238405Sjkim	pxor	%xmm7,%xmm7
384238405Sjkim	.byte	0xf3,0xc3
385238405Sjkim.size	_vpaes_schedule_core,.-_vpaes_schedule_core
386238405Sjkim
387238405Sjkim
388238405Sjkim
389238405Sjkim
390238405Sjkim
391238405Sjkim
392238405Sjkim
393238405Sjkim
394238405Sjkim
395238405Sjkim
396238405Sjkim
397238405Sjkim
398238405Sjkim
399238405Sjkim
400238405Sjkim
401238405Sjkim.type	_vpaes_schedule_192_smear,@function
402238405Sjkim.align	16
403238405Sjkim_vpaes_schedule_192_smear:
404238405Sjkim	pshufd	$128,%xmm6,%xmm0
405238405Sjkim	pxor	%xmm0,%xmm6
406238405Sjkim	pshufd	$254,%xmm7,%xmm0
407238405Sjkim	pxor	%xmm0,%xmm6
408238405Sjkim	movdqa	%xmm6,%xmm0
409238405Sjkim	pxor	%xmm1,%xmm1
410238405Sjkim	movhlps	%xmm1,%xmm6
411238405Sjkim	.byte	0xf3,0xc3
412238405Sjkim.size	_vpaes_schedule_192_smear,.-_vpaes_schedule_192_smear
413238405Sjkim
414238405Sjkim
415238405Sjkim
416238405Sjkim
417238405Sjkim
418238405Sjkim
419238405Sjkim
420238405Sjkim
421238405Sjkim
422238405Sjkim
423238405Sjkim
424238405Sjkim
425238405Sjkim
426238405Sjkim
427238405Sjkim
428238405Sjkim
429238405Sjkim
430238405Sjkim
431238405Sjkim
432238405Sjkim.type	_vpaes_schedule_round,@function
433238405Sjkim.align	16
434238405Sjkim_vpaes_schedule_round:
435238405Sjkim
436238405Sjkim	pxor	%xmm1,%xmm1
437238405Sjkim.byte	102,65,15,58,15,200,15
438238405Sjkim.byte	102,69,15,58,15,192,15
439238405Sjkim	pxor	%xmm1,%xmm7
440238405Sjkim
441238405Sjkim
442238405Sjkim	pshufd	$255,%xmm0,%xmm0
443238405Sjkim.byte	102,15,58,15,192,1
444238405Sjkim
445238405Sjkim
446238405Sjkim
447238405Sjkim
448238405Sjkim_vpaes_schedule_low_round:
449238405Sjkim
450238405Sjkim	movdqa	%xmm7,%xmm1
451238405Sjkim	pslldq	$4,%xmm7
452238405Sjkim	pxor	%xmm1,%xmm7
453238405Sjkim	movdqa	%xmm7,%xmm1
454238405Sjkim	pslldq	$8,%xmm7
455238405Sjkim	pxor	%xmm1,%xmm7
456238405Sjkim	pxor	.Lk_s63(%rip),%xmm7
457238405Sjkim
458238405Sjkim
459238405Sjkim	movdqa	%xmm9,%xmm1
460238405Sjkim	pandn	%xmm0,%xmm1
461238405Sjkim	psrld	$4,%xmm1
462238405Sjkim	pand	%xmm9,%xmm0
463238405Sjkim	movdqa	%xmm11,%xmm2
464238405Sjkim.byte	102,15,56,0,208
465238405Sjkim	pxor	%xmm1,%xmm0
466238405Sjkim	movdqa	%xmm10,%xmm3
467238405Sjkim.byte	102,15,56,0,217
468238405Sjkim	pxor	%xmm2,%xmm3
469238405Sjkim	movdqa	%xmm10,%xmm4
470238405Sjkim.byte	102,15,56,0,224
471238405Sjkim	pxor	%xmm2,%xmm4
472238405Sjkim	movdqa	%xmm10,%xmm2
473238405Sjkim.byte	102,15,56,0,211
474238405Sjkim	pxor	%xmm0,%xmm2
475238405Sjkim	movdqa	%xmm10,%xmm3
476238405Sjkim.byte	102,15,56,0,220
477238405Sjkim	pxor	%xmm1,%xmm3
478238405Sjkim	movdqa	%xmm13,%xmm4
479238405Sjkim.byte	102,15,56,0,226
480238405Sjkim	movdqa	%xmm12,%xmm0
481238405Sjkim.byte	102,15,56,0,195
482238405Sjkim	pxor	%xmm4,%xmm0
483238405Sjkim
484238405Sjkim
485238405Sjkim	pxor	%xmm7,%xmm0
486238405Sjkim	movdqa	%xmm0,%xmm7
487238405Sjkim	.byte	0xf3,0xc3
488238405Sjkim.size	_vpaes_schedule_round,.-_vpaes_schedule_round
489238405Sjkim
490238405Sjkim
491238405Sjkim
492238405Sjkim
493238405Sjkim
494238405Sjkim
495238405Sjkim
496238405Sjkim
497238405Sjkim
498238405Sjkim
499238405Sjkim.type	_vpaes_schedule_transform,@function
500238405Sjkim.align	16
501238405Sjkim_vpaes_schedule_transform:
502238405Sjkim	movdqa	%xmm9,%xmm1
503238405Sjkim	pandn	%xmm0,%xmm1
504238405Sjkim	psrld	$4,%xmm1
505238405Sjkim	pand	%xmm9,%xmm0
506238405Sjkim	movdqa	(%r11),%xmm2
507238405Sjkim.byte	102,15,56,0,208
508238405Sjkim	movdqa	16(%r11),%xmm0
509238405Sjkim.byte	102,15,56,0,193
510238405Sjkim	pxor	%xmm2,%xmm0
511238405Sjkim	.byte	0xf3,0xc3
512238405Sjkim.size	_vpaes_schedule_transform,.-_vpaes_schedule_transform
513238405Sjkim
514238405Sjkim
515238405Sjkim
516238405Sjkim
517238405Sjkim
518238405Sjkim
519238405Sjkim
520238405Sjkim
521238405Sjkim
522238405Sjkim
523238405Sjkim
524238405Sjkim
525238405Sjkim
526238405Sjkim
527238405Sjkim
528238405Sjkim
529238405Sjkim
530238405Sjkim
531238405Sjkim
532238405Sjkim
533238405Sjkim
534238405Sjkim
535238405Sjkim
536238405Sjkim
537238405Sjkim.type	_vpaes_schedule_mangle,@function
538238405Sjkim.align	16
539238405Sjkim_vpaes_schedule_mangle:
540238405Sjkim	movdqa	%xmm0,%xmm4
541238405Sjkim	movdqa	.Lk_mc_forward(%rip),%xmm5
542238405Sjkim	testq	%rcx,%rcx
543238405Sjkim	jnz	.Lschedule_mangle_dec
544238405Sjkim
545238405Sjkim
546238405Sjkim	addq	$16,%rdx
547238405Sjkim	pxor	.Lk_s63(%rip),%xmm4
548238405Sjkim.byte	102,15,56,0,229
549238405Sjkim	movdqa	%xmm4,%xmm3
550238405Sjkim.byte	102,15,56,0,229
551238405Sjkim	pxor	%xmm4,%xmm3
552238405Sjkim.byte	102,15,56,0,229
553238405Sjkim	pxor	%xmm4,%xmm3
554238405Sjkim
555238405Sjkim	jmp	.Lschedule_mangle_both
556238405Sjkim.align	16
557238405Sjkim.Lschedule_mangle_dec:
558238405Sjkim
559238405Sjkim	leaq	.Lk_dksd(%rip),%r11
560238405Sjkim	movdqa	%xmm9,%xmm1
561238405Sjkim	pandn	%xmm4,%xmm1
562238405Sjkim	psrld	$4,%xmm1
563238405Sjkim	pand	%xmm9,%xmm4
564238405Sjkim
565238405Sjkim	movdqa	0(%r11),%xmm2
566238405Sjkim.byte	102,15,56,0,212
567238405Sjkim	movdqa	16(%r11),%xmm3
568238405Sjkim.byte	102,15,56,0,217
569238405Sjkim	pxor	%xmm2,%xmm3
570238405Sjkim.byte	102,15,56,0,221
571238405Sjkim
572238405Sjkim	movdqa	32(%r11),%xmm2
573238405Sjkim.byte	102,15,56,0,212
574238405Sjkim	pxor	%xmm3,%xmm2
575238405Sjkim	movdqa	48(%r11),%xmm3
576238405Sjkim.byte	102,15,56,0,217
577238405Sjkim	pxor	%xmm2,%xmm3
578238405Sjkim.byte	102,15,56,0,221
579238405Sjkim
580238405Sjkim	movdqa	64(%r11),%xmm2
581238405Sjkim.byte	102,15,56,0,212
582238405Sjkim	pxor	%xmm3,%xmm2
583238405Sjkim	movdqa	80(%r11),%xmm3
584238405Sjkim.byte	102,15,56,0,217
585238405Sjkim	pxor	%xmm2,%xmm3
586238405Sjkim.byte	102,15,56,0,221
587238405Sjkim
588238405Sjkim	movdqa	96(%r11),%xmm2
589238405Sjkim.byte	102,15,56,0,212
590238405Sjkim	pxor	%xmm3,%xmm2
591238405Sjkim	movdqa	112(%r11),%xmm3
592238405Sjkim.byte	102,15,56,0,217
593238405Sjkim	pxor	%xmm2,%xmm3
594238405Sjkim
595238405Sjkim	addq	$-16,%rdx
596238405Sjkim
597238405Sjkim.Lschedule_mangle_both:
598238405Sjkim	movdqa	(%r8,%r10,1),%xmm1
599238405Sjkim.byte	102,15,56,0,217
600238405Sjkim	addq	$-16,%r8
601238405Sjkim	andq	$48,%r8
602238405Sjkim	movdqu	%xmm3,(%rdx)
603238405Sjkim	.byte	0xf3,0xc3
604238405Sjkim.size	_vpaes_schedule_mangle,.-_vpaes_schedule_mangle
605238405Sjkim
606238405Sjkim
607238405Sjkim
608238405Sjkim
609238405Sjkim.globl	vpaes_set_encrypt_key
610238405Sjkim.type	vpaes_set_encrypt_key,@function
611238405Sjkim.align	16
612238405Sjkimvpaes_set_encrypt_key:
613238405Sjkim	movl	%esi,%eax
614238405Sjkim	shrl	$5,%eax
615238405Sjkim	addl	$5,%eax
616238405Sjkim	movl	%eax,240(%rdx)
617238405Sjkim
618238405Sjkim	movl	$0,%ecx
619238405Sjkim	movl	$48,%r8d
620238405Sjkim	call	_vpaes_schedule_core
621238405Sjkim	xorl	%eax,%eax
622238405Sjkim	.byte	0xf3,0xc3
623238405Sjkim.size	vpaes_set_encrypt_key,.-vpaes_set_encrypt_key
624238405Sjkim
625238405Sjkim.globl	vpaes_set_decrypt_key
626238405Sjkim.type	vpaes_set_decrypt_key,@function
627238405Sjkim.align	16
628238405Sjkimvpaes_set_decrypt_key:
629238405Sjkim	movl	%esi,%eax
630238405Sjkim	shrl	$5,%eax
631238405Sjkim	addl	$5,%eax
632238405Sjkim	movl	%eax,240(%rdx)
633238405Sjkim	shll	$4,%eax
634238405Sjkim	leaq	16(%rdx,%rax,1),%rdx
635238405Sjkim
636238405Sjkim	movl	$1,%ecx
637238405Sjkim	movl	%esi,%r8d
638238405Sjkim	shrl	$1,%r8d
639238405Sjkim	andl	$32,%r8d
640238405Sjkim	xorl	$32,%r8d
641238405Sjkim	call	_vpaes_schedule_core
642238405Sjkim	xorl	%eax,%eax
643238405Sjkim	.byte	0xf3,0xc3
644238405Sjkim.size	vpaes_set_decrypt_key,.-vpaes_set_decrypt_key
645238405Sjkim
646238405Sjkim.globl	vpaes_encrypt
647238405Sjkim.type	vpaes_encrypt,@function
648238405Sjkim.align	16
649238405Sjkimvpaes_encrypt:
650238405Sjkim	movdqu	(%rdi),%xmm0
651238405Sjkim	call	_vpaes_preheat
652238405Sjkim	call	_vpaes_encrypt_core
653238405Sjkim	movdqu	%xmm0,(%rsi)
654238405Sjkim	.byte	0xf3,0xc3
655238405Sjkim.size	vpaes_encrypt,.-vpaes_encrypt
656238405Sjkim
657238405Sjkim.globl	vpaes_decrypt
658238405Sjkim.type	vpaes_decrypt,@function
659238405Sjkim.align	16
660238405Sjkimvpaes_decrypt:
661238405Sjkim	movdqu	(%rdi),%xmm0
662238405Sjkim	call	_vpaes_preheat
663238405Sjkim	call	_vpaes_decrypt_core
664238405Sjkim	movdqu	%xmm0,(%rsi)
665238405Sjkim	.byte	0xf3,0xc3
666238405Sjkim.size	vpaes_decrypt,.-vpaes_decrypt
667238405Sjkim.globl	vpaes_cbc_encrypt
668238405Sjkim.type	vpaes_cbc_encrypt,@function
669238405Sjkim.align	16
670238405Sjkimvpaes_cbc_encrypt:
671238405Sjkim	xchgq	%rcx,%rdx
672238405Sjkim	subq	$16,%rcx
673238405Sjkim	jc	.Lcbc_abort
674238405Sjkim	movdqu	(%r8),%xmm6
675238405Sjkim	subq	%rdi,%rsi
676238405Sjkim	call	_vpaes_preheat
677238405Sjkim	cmpl	$0,%r9d
678238405Sjkim	je	.Lcbc_dec_loop
679238405Sjkim	jmp	.Lcbc_enc_loop
680238405Sjkim.align	16
681238405Sjkim.Lcbc_enc_loop:
682238405Sjkim	movdqu	(%rdi),%xmm0
683238405Sjkim	pxor	%xmm6,%xmm0
684238405Sjkim	call	_vpaes_encrypt_core
685238405Sjkim	movdqa	%xmm0,%xmm6
686238405Sjkim	movdqu	%xmm0,(%rsi,%rdi,1)
687238405Sjkim	leaq	16(%rdi),%rdi
688238405Sjkim	subq	$16,%rcx
689238405Sjkim	jnc	.Lcbc_enc_loop
690238405Sjkim	jmp	.Lcbc_done
691238405Sjkim.align	16
692238405Sjkim.Lcbc_dec_loop:
693238405Sjkim	movdqu	(%rdi),%xmm0
694238405Sjkim	movdqa	%xmm0,%xmm7
695238405Sjkim	call	_vpaes_decrypt_core
696238405Sjkim	pxor	%xmm6,%xmm0
697238405Sjkim	movdqa	%xmm7,%xmm6
698238405Sjkim	movdqu	%xmm0,(%rsi,%rdi,1)
699238405Sjkim	leaq	16(%rdi),%rdi
700238405Sjkim	subq	$16,%rcx
701238405Sjkim	jnc	.Lcbc_dec_loop
702238405Sjkim.Lcbc_done:
703238405Sjkim	movdqu	%xmm6,(%r8)
704238405Sjkim.Lcbc_abort:
705238405Sjkim	.byte	0xf3,0xc3
706238405Sjkim.size	vpaes_cbc_encrypt,.-vpaes_cbc_encrypt
707238405Sjkim
708238405Sjkim
709238405Sjkim
710238405Sjkim
711238405Sjkim
712238405Sjkim
713238405Sjkim.type	_vpaes_preheat,@function
714238405Sjkim.align	16
715238405Sjkim_vpaes_preheat:
716238405Sjkim	leaq	.Lk_s0F(%rip),%r10
717238405Sjkim	movdqa	-32(%r10),%xmm10
718238405Sjkim	movdqa	-16(%r10),%xmm11
719238405Sjkim	movdqa	0(%r10),%xmm9
720238405Sjkim	movdqa	48(%r10),%xmm13
721238405Sjkim	movdqa	64(%r10),%xmm12
722238405Sjkim	movdqa	80(%r10),%xmm15
723238405Sjkim	movdqa	96(%r10),%xmm14
724238405Sjkim	.byte	0xf3,0xc3
725238405Sjkim.size	_vpaes_preheat,.-_vpaes_preheat
726238405Sjkim
727238405Sjkim
728238405Sjkim
729238405Sjkim
730238405Sjkim
731238405Sjkim.type	_vpaes_consts,@object
732238405Sjkim.align	64
733238405Sjkim_vpaes_consts:
734238405Sjkim.Lk_inv:
735238405Sjkim.quad	0x0E05060F0D080180, 0x040703090A0B0C02
736238405Sjkim.quad	0x01040A060F0B0780, 0x030D0E0C02050809
737238405Sjkim
738238405Sjkim.Lk_s0F:
739238405Sjkim.quad	0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F
740238405Sjkim
741238405Sjkim.Lk_ipt:
742238405Sjkim.quad	0xC2B2E8985A2A7000, 0xCABAE09052227808
743238405Sjkim.quad	0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81
744238405Sjkim
745238405Sjkim.Lk_sb1:
746238405Sjkim.quad	0xB19BE18FCB503E00, 0xA5DF7A6E142AF544
747238405Sjkim.quad	0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF
748238405Sjkim.Lk_sb2:
749238405Sjkim.quad	0xE27A93C60B712400, 0x5EB7E955BC982FCD
750238405Sjkim.quad	0x69EB88400AE12900, 0xC2A163C8AB82234A
751238405Sjkim.Lk_sbo:
752238405Sjkim.quad	0xD0D26D176FBDC700, 0x15AABF7AC502A878
753238405Sjkim.quad	0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA
754238405Sjkim
755238405Sjkim.Lk_mc_forward:
756238405Sjkim.quad	0x0407060500030201, 0x0C0F0E0D080B0A09
757238405Sjkim.quad	0x080B0A0904070605, 0x000302010C0F0E0D
758238405Sjkim.quad	0x0C0F0E0D080B0A09, 0x0407060500030201
759238405Sjkim.quad	0x000302010C0F0E0D, 0x080B0A0904070605
760238405Sjkim
761238405Sjkim.Lk_mc_backward:
762238405Sjkim.quad	0x0605040702010003, 0x0E0D0C0F0A09080B
763238405Sjkim.quad	0x020100030E0D0C0F, 0x0A09080B06050407
764238405Sjkim.quad	0x0E0D0C0F0A09080B, 0x0605040702010003
765238405Sjkim.quad	0x0A09080B06050407, 0x020100030E0D0C0F
766238405Sjkim
767238405Sjkim.Lk_sr:
768238405Sjkim.quad	0x0706050403020100, 0x0F0E0D0C0B0A0908
769238405Sjkim.quad	0x030E09040F0A0500, 0x0B06010C07020D08
770238405Sjkim.quad	0x0F060D040B020900, 0x070E050C030A0108
771238405Sjkim.quad	0x0B0E0104070A0D00, 0x0306090C0F020508
772238405Sjkim
773238405Sjkim.Lk_rcon:
774238405Sjkim.quad	0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81
775238405Sjkim
776238405Sjkim.Lk_s63:
777238405Sjkim.quad	0x5B5B5B5B5B5B5B5B, 0x5B5B5B5B5B5B5B5B
778238405Sjkim
779238405Sjkim.Lk_opt:
780238405Sjkim.quad	0xFF9F4929D6B66000, 0xF7974121DEBE6808
781238405Sjkim.quad	0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0
782238405Sjkim
783238405Sjkim.Lk_deskew:
784238405Sjkim.quad	0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A
785238405Sjkim.quad	0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77
786238405Sjkim
787238405Sjkim
788238405Sjkim
789238405Sjkim
790238405Sjkim
791238405Sjkim.Lk_dksd:
792238405Sjkim.quad	0xFEB91A5DA3E44700, 0x0740E3A45A1DBEF9
793238405Sjkim.quad	0x41C277F4B5368300, 0x5FDC69EAAB289D1E
794238405Sjkim.Lk_dksb:
795238405Sjkim.quad	0x9A4FCA1F8550D500, 0x03D653861CC94C99
796238405Sjkim.quad	0x115BEDA7B6FC4A00, 0xD993256F7E3482C8
797238405Sjkim.Lk_dkse:
798238405Sjkim.quad	0xD5031CCA1FC9D600, 0x53859A4C994F5086
799238405Sjkim.quad	0xA23196054FDC7BE8, 0xCD5EF96A20B31487
800238405Sjkim.Lk_dks9:
801238405Sjkim.quad	0xB6116FC87ED9A700, 0x4AED933482255BFC
802238405Sjkim.quad	0x4576516227143300, 0x8BB89FACE9DAFDCE
803238405Sjkim
804238405Sjkim
805238405Sjkim
806238405Sjkim
807238405Sjkim
808238405Sjkim.Lk_dipt:
809238405Sjkim.quad	0x0F505B040B545F00, 0x154A411E114E451A
810238405Sjkim.quad	0x86E383E660056500, 0x12771772F491F194
811238405Sjkim
812238405Sjkim.Lk_dsb9:
813238405Sjkim.quad	0x851C03539A86D600, 0xCAD51F504F994CC9
814238405Sjkim.quad	0xC03B1789ECD74900, 0x725E2C9EB2FBA565
815238405Sjkim.Lk_dsbd:
816238405Sjkim.quad	0x7D57CCDFE6B1A200, 0xF56E9B13882A4439
817238405Sjkim.quad	0x3CE2FAF724C6CB00, 0x2931180D15DEEFD3
818238405Sjkim.Lk_dsbb:
819238405Sjkim.quad	0xD022649296B44200, 0x602646F6B0F2D404
820238405Sjkim.quad	0xC19498A6CD596700, 0xF3FF0C3E3255AA6B
821238405Sjkim.Lk_dsbe:
822238405Sjkim.quad	0x46F2929626D4D000, 0x2242600464B4F6B0
823238405Sjkim.quad	0x0C55A6CDFFAAC100, 0x9467F36B98593E32
824238405Sjkim.Lk_dsbo:
825238405Sjkim.quad	0x1387EA537EF94000, 0xC7AA6DB9D4943E2D
826238405Sjkim.quad	0x12D7560F93441D00, 0xCA4B8159D8C58E9C
827279264Sdelphij.byte	86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105,111,110,32,65,69,83,32,102,111,114,32,120,56,54,95,54,52,47,83,83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,41,0
828238405Sjkim.align	64
829238405Sjkim.size	_vpaes_consts,.-_vpaes_consts
830