xref: /freebsd/sys/crypto/openssl/arm/aesv8-armx.S (revision b077aed33b7b6aefca7b17ddb250cf521f938613)
1/* $FreeBSD$ */
2/* Do not modify. This file is auto-generated from aesv8-armx.pl. */
3#include "arm_arch.h"
4
5#if __ARM_MAX_ARCH__>=7
6.text
7.arch	armv7-a	@ don't confuse not-so-latest binutils with argv8 :-)
8.fpu	neon
9.code	32
10#undef	__thumb2__
11.align	5
12.Lrcon:
13.long	0x01,0x01,0x01,0x01
14.long	0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d	@ rotate-n-splat
15.long	0x1b,0x1b,0x1b,0x1b
16
17.globl	aes_v8_set_encrypt_key
18.type	aes_v8_set_encrypt_key,%function
19.align	5
20aes_v8_set_encrypt_key:
21.Lenc_key:
22	mov	r3,#-1
23	cmp	r0,#0
24	beq	.Lenc_key_abort
25	cmp	r2,#0
26	beq	.Lenc_key_abort
27	mov	r3,#-2
28	cmp	r1,#128
29	blt	.Lenc_key_abort
30	cmp	r1,#256
31	bgt	.Lenc_key_abort
32	tst	r1,#0x3f
33	bne	.Lenc_key_abort
34
35	adr	r3,.Lrcon
36	cmp	r1,#192
37
38	veor	q0,q0,q0
39	vld1.8	{q3},[r0]!
40	mov	r1,#8		@ reuse r1
41	vld1.32	{q1,q2},[r3]!
42
43	blt	.Loop128
44	beq	.L192
45	b	.L256
46
47.align	4
48.Loop128:
49	vtbl.8	d20,{q3},d4
50	vtbl.8	d21,{q3},d5
51	vext.8	q9,q0,q3,#12
52	vst1.32	{q3},[r2]!
53.byte	0x00,0x43,0xf0,0xf3	@ aese q10,q0
54	subs	r1,r1,#1
55
56	veor	q3,q3,q9
57	vext.8	q9,q0,q9,#12
58	veor	q3,q3,q9
59	vext.8	q9,q0,q9,#12
60	veor	q10,q10,q1
61	veor	q3,q3,q9
62	vshl.u8	q1,q1,#1
63	veor	q3,q3,q10
64	bne	.Loop128
65
66	vld1.32	{q1},[r3]
67
68	vtbl.8	d20,{q3},d4
69	vtbl.8	d21,{q3},d5
70	vext.8	q9,q0,q3,#12
71	vst1.32	{q3},[r2]!
72.byte	0x00,0x43,0xf0,0xf3	@ aese q10,q0
73
74	veor	q3,q3,q9
75	vext.8	q9,q0,q9,#12
76	veor	q3,q3,q9
77	vext.8	q9,q0,q9,#12
78	veor	q10,q10,q1
79	veor	q3,q3,q9
80	vshl.u8	q1,q1,#1
81	veor	q3,q3,q10
82
83	vtbl.8	d20,{q3},d4
84	vtbl.8	d21,{q3},d5
85	vext.8	q9,q0,q3,#12
86	vst1.32	{q3},[r2]!
87.byte	0x00,0x43,0xf0,0xf3	@ aese q10,q0
88
89	veor	q3,q3,q9
90	vext.8	q9,q0,q9,#12
91	veor	q3,q3,q9
92	vext.8	q9,q0,q9,#12
93	veor	q10,q10,q1
94	veor	q3,q3,q9
95	veor	q3,q3,q10
96	vst1.32	{q3},[r2]
97	add	r2,r2,#0x50
98
99	mov	r12,#10
100	b	.Ldone
101
102.align	4
103.L192:
104	vld1.8	{d16},[r0]!
105	vmov.i8	q10,#8			@ borrow q10
106	vst1.32	{q3},[r2]!
107	vsub.i8	q2,q2,q10	@ adjust the mask
108
109.Loop192:
110	vtbl.8	d20,{q8},d4
111	vtbl.8	d21,{q8},d5
112	vext.8	q9,q0,q3,#12
113#ifdef __ARMEB__
114	vst1.32	{q8},[r2]!
115	sub	r2,r2,#8
116#else
117	vst1.32	{d16},[r2]!
118#endif
119.byte	0x00,0x43,0xf0,0xf3	@ aese q10,q0
120	subs	r1,r1,#1
121
122	veor	q3,q3,q9
123	vext.8	q9,q0,q9,#12
124	veor	q3,q3,q9
125	vext.8	q9,q0,q9,#12
126	veor	q3,q3,q9
127
128	vdup.32	q9,d7[1]
129	veor	q9,q9,q8
130	veor	q10,q10,q1
131	vext.8	q8,q0,q8,#12
132	vshl.u8	q1,q1,#1
133	veor	q8,q8,q9
134	veor	q3,q3,q10
135	veor	q8,q8,q10
136	vst1.32	{q3},[r2]!
137	bne	.Loop192
138
139	mov	r12,#12
140	add	r2,r2,#0x20
141	b	.Ldone
142
143.align	4
144.L256:
145	vld1.8	{q8},[r0]
146	mov	r1,#7
147	mov	r12,#14
148	vst1.32	{q3},[r2]!
149
150.Loop256:
151	vtbl.8	d20,{q8},d4
152	vtbl.8	d21,{q8},d5
153	vext.8	q9,q0,q3,#12
154	vst1.32	{q8},[r2]!
155.byte	0x00,0x43,0xf0,0xf3	@ aese q10,q0
156	subs	r1,r1,#1
157
158	veor	q3,q3,q9
159	vext.8	q9,q0,q9,#12
160	veor	q3,q3,q9
161	vext.8	q9,q0,q9,#12
162	veor	q10,q10,q1
163	veor	q3,q3,q9
164	vshl.u8	q1,q1,#1
165	veor	q3,q3,q10
166	vst1.32	{q3},[r2]!
167	beq	.Ldone
168
169	vdup.32	q10,d7[1]
170	vext.8	q9,q0,q8,#12
171.byte	0x00,0x43,0xf0,0xf3	@ aese q10,q0
172
173	veor	q8,q8,q9
174	vext.8	q9,q0,q9,#12
175	veor	q8,q8,q9
176	vext.8	q9,q0,q9,#12
177	veor	q8,q8,q9
178
179	veor	q8,q8,q10
180	b	.Loop256
181
182.Ldone:
183	str	r12,[r2]
184	mov	r3,#0
185
186.Lenc_key_abort:
187	mov	r0,r3			@ return value
188
189	bx	lr
190.size	aes_v8_set_encrypt_key,.-aes_v8_set_encrypt_key
191
192.globl	aes_v8_set_decrypt_key
193.type	aes_v8_set_decrypt_key,%function
194.align	5
195aes_v8_set_decrypt_key:
196	stmdb	sp!,{r4,lr}
197	bl	.Lenc_key
198
199	cmp	r0,#0
200	bne	.Ldec_key_abort
201
202	sub	r2,r2,#240		@ restore original r2
203	mov	r4,#-16
204	add	r0,r2,r12,lsl#4	@ end of key schedule
205
206	vld1.32	{q0},[r2]
207	vld1.32	{q1},[r0]
208	vst1.32	{q0},[r0],r4
209	vst1.32	{q1},[r2]!
210
211.Loop_imc:
212	vld1.32	{q0},[r2]
213	vld1.32	{q1},[r0]
214.byte	0xc0,0x03,0xb0,0xf3	@ aesimc q0,q0
215.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
216	vst1.32	{q0},[r0],r4
217	vst1.32	{q1},[r2]!
218	cmp	r0,r2
219	bhi	.Loop_imc
220
221	vld1.32	{q0},[r2]
222.byte	0xc0,0x03,0xb0,0xf3	@ aesimc q0,q0
223	vst1.32	{q0},[r0]
224
225	eor	r0,r0,r0		@ return value
226.Ldec_key_abort:
227	ldmia	sp!,{r4,pc}
228.size	aes_v8_set_decrypt_key,.-aes_v8_set_decrypt_key
229.globl	aes_v8_encrypt
230.type	aes_v8_encrypt,%function
231.align	5
232aes_v8_encrypt:
233	ldr	r3,[r2,#240]
234	vld1.32	{q0},[r2]!
235	vld1.8	{q2},[r0]
236	sub	r3,r3,#2
237	vld1.32	{q1},[r2]!
238
239.Loop_enc:
240.byte	0x00,0x43,0xb0,0xf3	@ aese q2,q0
241.byte	0x84,0x43,0xb0,0xf3	@ aesmc q2,q2
242	vld1.32	{q0},[r2]!
243	subs	r3,r3,#2
244.byte	0x02,0x43,0xb0,0xf3	@ aese q2,q1
245.byte	0x84,0x43,0xb0,0xf3	@ aesmc q2,q2
246	vld1.32	{q1},[r2]!
247	bgt	.Loop_enc
248
249.byte	0x00,0x43,0xb0,0xf3	@ aese q2,q0
250.byte	0x84,0x43,0xb0,0xf3	@ aesmc q2,q2
251	vld1.32	{q0},[r2]
252.byte	0x02,0x43,0xb0,0xf3	@ aese q2,q1
253	veor	q2,q2,q0
254
255	vst1.8	{q2},[r1]
256	bx	lr
257.size	aes_v8_encrypt,.-aes_v8_encrypt
258.globl	aes_v8_decrypt
259.type	aes_v8_decrypt,%function
260.align	5
261aes_v8_decrypt:
262	ldr	r3,[r2,#240]
263	vld1.32	{q0},[r2]!
264	vld1.8	{q2},[r0]
265	sub	r3,r3,#2
266	vld1.32	{q1},[r2]!
267
268.Loop_dec:
269.byte	0x40,0x43,0xb0,0xf3	@ aesd q2,q0
270.byte	0xc4,0x43,0xb0,0xf3	@ aesimc q2,q2
271	vld1.32	{q0},[r2]!
272	subs	r3,r3,#2
273.byte	0x42,0x43,0xb0,0xf3	@ aesd q2,q1
274.byte	0xc4,0x43,0xb0,0xf3	@ aesimc q2,q2
275	vld1.32	{q1},[r2]!
276	bgt	.Loop_dec
277
278.byte	0x40,0x43,0xb0,0xf3	@ aesd q2,q0
279.byte	0xc4,0x43,0xb0,0xf3	@ aesimc q2,q2
280	vld1.32	{q0},[r2]
281.byte	0x42,0x43,0xb0,0xf3	@ aesd q2,q1
282	veor	q2,q2,q0
283
284	vst1.8	{q2},[r1]
285	bx	lr
286.size	aes_v8_decrypt,.-aes_v8_decrypt
287.globl	aes_v8_cbc_encrypt
288.type	aes_v8_cbc_encrypt,%function
289.align	5
290aes_v8_cbc_encrypt:
291	mov	ip,sp
292	stmdb	sp!,{r4,r5,r6,r7,r8,lr}
293	vstmdb	sp!,{d8,d9,d10,d11,d12,d13,d14,d15}            @ ABI specification says so
294	ldmia	ip,{r4,r5}		@ load remaining args
295	subs	r2,r2,#16
296	mov	r8,#16
297	blo	.Lcbc_abort
298	moveq	r8,#0
299
300	cmp	r5,#0			@ en- or decrypting?
301	ldr	r5,[r3,#240]
302	and	r2,r2,#-16
303	vld1.8	{q6},[r4]
304	vld1.8	{q0},[r0],r8
305
306	vld1.32	{q8,q9},[r3]		@ load key schedule...
307	sub	r5,r5,#6
308	add	r7,r3,r5,lsl#4	@ pointer to last 7 round keys
309	sub	r5,r5,#2
310	vld1.32	{q10,q11},[r7]!
311	vld1.32	{q12,q13},[r7]!
312	vld1.32	{q14,q15},[r7]!
313	vld1.32	{q7},[r7]
314
315	add	r7,r3,#32
316	mov	r6,r5
317	beq	.Lcbc_dec
318
319	cmp	r5,#2
320	veor	q0,q0,q6
321	veor	q5,q8,q7
322	beq	.Lcbc_enc128
323
324	vld1.32	{q2,q3},[r7]
325	add	r7,r3,#16
326	add	r6,r3,#16*4
327	add	r12,r3,#16*5
328.byte	0x20,0x03,0xb0,0xf3	@ aese q0,q8
329.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
330	add	r14,r3,#16*6
331	add	r3,r3,#16*7
332	b	.Lenter_cbc_enc
333
334.align	4
335.Loop_cbc_enc:
336.byte	0x20,0x03,0xb0,0xf3	@ aese q0,q8
337.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
338	vst1.8	{q6},[r1]!
339.Lenter_cbc_enc:
340.byte	0x22,0x03,0xb0,0xf3	@ aese q0,q9
341.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
342.byte	0x04,0x03,0xb0,0xf3	@ aese q0,q2
343.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
344	vld1.32	{q8},[r6]
345	cmp	r5,#4
346.byte	0x06,0x03,0xb0,0xf3	@ aese q0,q3
347.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
348	vld1.32	{q9},[r12]
349	beq	.Lcbc_enc192
350
351.byte	0x20,0x03,0xb0,0xf3	@ aese q0,q8
352.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
353	vld1.32	{q8},[r14]
354.byte	0x22,0x03,0xb0,0xf3	@ aese q0,q9
355.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
356	vld1.32	{q9},[r3]
357	nop
358
359.Lcbc_enc192:
360.byte	0x20,0x03,0xb0,0xf3	@ aese q0,q8
361.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
362	subs	r2,r2,#16
363.byte	0x22,0x03,0xb0,0xf3	@ aese q0,q9
364.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
365	moveq	r8,#0
366.byte	0x24,0x03,0xb0,0xf3	@ aese q0,q10
367.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
368.byte	0x26,0x03,0xb0,0xf3	@ aese q0,q11
369.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
370	vld1.8	{q8},[r0],r8
371.byte	0x28,0x03,0xb0,0xf3	@ aese q0,q12
372.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
373	veor	q8,q8,q5
374.byte	0x2a,0x03,0xb0,0xf3	@ aese q0,q13
375.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
376	vld1.32	{q9},[r7]		@ re-pre-load rndkey[1]
377.byte	0x2c,0x03,0xb0,0xf3	@ aese q0,q14
378.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
379.byte	0x2e,0x03,0xb0,0xf3	@ aese q0,q15
380	veor	q6,q0,q7
381	bhs	.Loop_cbc_enc
382
383	vst1.8	{q6},[r1]!
384	b	.Lcbc_done
385
386.align	5
387.Lcbc_enc128:
388	vld1.32	{q2,q3},[r7]
389.byte	0x20,0x03,0xb0,0xf3	@ aese q0,q8
390.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
391	b	.Lenter_cbc_enc128
392.Loop_cbc_enc128:
393.byte	0x20,0x03,0xb0,0xf3	@ aese q0,q8
394.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
395	vst1.8	{q6},[r1]!
396.Lenter_cbc_enc128:
397.byte	0x22,0x03,0xb0,0xf3	@ aese q0,q9
398.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
399	subs	r2,r2,#16
400.byte	0x04,0x03,0xb0,0xf3	@ aese q0,q2
401.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
402	moveq	r8,#0
403.byte	0x06,0x03,0xb0,0xf3	@ aese q0,q3
404.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
405.byte	0x24,0x03,0xb0,0xf3	@ aese q0,q10
406.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
407.byte	0x26,0x03,0xb0,0xf3	@ aese q0,q11
408.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
409	vld1.8	{q8},[r0],r8
410.byte	0x28,0x03,0xb0,0xf3	@ aese q0,q12
411.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
412.byte	0x2a,0x03,0xb0,0xf3	@ aese q0,q13
413.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
414.byte	0x2c,0x03,0xb0,0xf3	@ aese q0,q14
415.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
416	veor	q8,q8,q5
417.byte	0x2e,0x03,0xb0,0xf3	@ aese q0,q15
418	veor	q6,q0,q7
419	bhs	.Loop_cbc_enc128
420
421	vst1.8	{q6},[r1]!
422	b	.Lcbc_done
423.align	5
424.Lcbc_dec:
425	vld1.8	{q10},[r0]!
426	subs	r2,r2,#32		@ bias
427	add	r6,r5,#2
428	vorr	q3,q0,q0
429	vorr	q1,q0,q0
430	vorr	q11,q10,q10
431	blo	.Lcbc_dec_tail
432
433	vorr	q1,q10,q10
434	vld1.8	{q10},[r0]!
435	vorr	q2,q0,q0
436	vorr	q3,q1,q1
437	vorr	q11,q10,q10
438
439.Loop3x_cbc_dec:
440.byte	0x60,0x03,0xb0,0xf3	@ aesd q0,q8
441.byte	0xc0,0x03,0xb0,0xf3	@ aesimc q0,q0
442.byte	0x60,0x23,0xb0,0xf3	@ aesd q1,q8
443.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
444.byte	0x60,0x43,0xf0,0xf3	@ aesd q10,q8
445.byte	0xe4,0x43,0xf0,0xf3	@ aesimc q10,q10
446	vld1.32	{q8},[r7]!
447	subs	r6,r6,#2
448.byte	0x62,0x03,0xb0,0xf3	@ aesd q0,q9
449.byte	0xc0,0x03,0xb0,0xf3	@ aesimc q0,q0
450.byte	0x62,0x23,0xb0,0xf3	@ aesd q1,q9
451.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
452.byte	0x62,0x43,0xf0,0xf3	@ aesd q10,q9
453.byte	0xe4,0x43,0xf0,0xf3	@ aesimc q10,q10
454	vld1.32	{q9},[r7]!
455	bgt	.Loop3x_cbc_dec
456
457.byte	0x60,0x03,0xb0,0xf3	@ aesd q0,q8
458.byte	0xc0,0x03,0xb0,0xf3	@ aesimc q0,q0
459.byte	0x60,0x23,0xb0,0xf3	@ aesd q1,q8
460.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
461.byte	0x60,0x43,0xf0,0xf3	@ aesd q10,q8
462.byte	0xe4,0x43,0xf0,0xf3	@ aesimc q10,q10
463	veor	q4,q6,q7
464	subs	r2,r2,#0x30
465	veor	q5,q2,q7
466	movlo	r6,r2			@ r6, r6, is zero at this point
467.byte	0x62,0x03,0xb0,0xf3	@ aesd q0,q9
468.byte	0xc0,0x03,0xb0,0xf3	@ aesimc q0,q0
469.byte	0x62,0x23,0xb0,0xf3	@ aesd q1,q9
470.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
471.byte	0x62,0x43,0xf0,0xf3	@ aesd q10,q9
472.byte	0xe4,0x43,0xf0,0xf3	@ aesimc q10,q10
473	veor	q9,q3,q7
474	add	r0,r0,r6		@ r0 is adjusted in such way that
475					@ at exit from the loop q1-q10
476					@ are loaded with last "words"
477	vorr	q6,q11,q11
478	mov	r7,r3
479.byte	0x68,0x03,0xb0,0xf3	@ aesd q0,q12
480.byte	0xc0,0x03,0xb0,0xf3	@ aesimc q0,q0
481.byte	0x68,0x23,0xb0,0xf3	@ aesd q1,q12
482.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
483.byte	0x68,0x43,0xf0,0xf3	@ aesd q10,q12
484.byte	0xe4,0x43,0xf0,0xf3	@ aesimc q10,q10
485	vld1.8	{q2},[r0]!
486.byte	0x6a,0x03,0xb0,0xf3	@ aesd q0,q13
487.byte	0xc0,0x03,0xb0,0xf3	@ aesimc q0,q0
488.byte	0x6a,0x23,0xb0,0xf3	@ aesd q1,q13
489.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
490.byte	0x6a,0x43,0xf0,0xf3	@ aesd q10,q13
491.byte	0xe4,0x43,0xf0,0xf3	@ aesimc q10,q10
492	vld1.8	{q3},[r0]!
493.byte	0x6c,0x03,0xb0,0xf3	@ aesd q0,q14
494.byte	0xc0,0x03,0xb0,0xf3	@ aesimc q0,q0
495.byte	0x6c,0x23,0xb0,0xf3	@ aesd q1,q14
496.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
497.byte	0x6c,0x43,0xf0,0xf3	@ aesd q10,q14
498.byte	0xe4,0x43,0xf0,0xf3	@ aesimc q10,q10
499	vld1.8	{q11},[r0]!
500.byte	0x6e,0x03,0xb0,0xf3	@ aesd q0,q15
501.byte	0x6e,0x23,0xb0,0xf3	@ aesd q1,q15
502.byte	0x6e,0x43,0xf0,0xf3	@ aesd q10,q15
503	vld1.32	{q8},[r7]!	@ re-pre-load rndkey[0]
504	add	r6,r5,#2
505	veor	q4,q4,q0
506	veor	q5,q5,q1
507	veor	q10,q10,q9
508	vld1.32	{q9},[r7]!	@ re-pre-load rndkey[1]
509	vst1.8	{q4},[r1]!
510	vorr	q0,q2,q2
511	vst1.8	{q5},[r1]!
512	vorr	q1,q3,q3
513	vst1.8	{q10},[r1]!
514	vorr	q10,q11,q11
515	bhs	.Loop3x_cbc_dec
516
517	cmn	r2,#0x30
518	beq	.Lcbc_done
519	nop
520
521.Lcbc_dec_tail:
522.byte	0x60,0x23,0xb0,0xf3	@ aesd q1,q8
523.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
524.byte	0x60,0x43,0xf0,0xf3	@ aesd q10,q8
525.byte	0xe4,0x43,0xf0,0xf3	@ aesimc q10,q10
526	vld1.32	{q8},[r7]!
527	subs	r6,r6,#2
528.byte	0x62,0x23,0xb0,0xf3	@ aesd q1,q9
529.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
530.byte	0x62,0x43,0xf0,0xf3	@ aesd q10,q9
531.byte	0xe4,0x43,0xf0,0xf3	@ aesimc q10,q10
532	vld1.32	{q9},[r7]!
533	bgt	.Lcbc_dec_tail
534
535.byte	0x60,0x23,0xb0,0xf3	@ aesd q1,q8
536.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
537.byte	0x60,0x43,0xf0,0xf3	@ aesd q10,q8
538.byte	0xe4,0x43,0xf0,0xf3	@ aesimc q10,q10
539.byte	0x62,0x23,0xb0,0xf3	@ aesd q1,q9
540.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
541.byte	0x62,0x43,0xf0,0xf3	@ aesd q10,q9
542.byte	0xe4,0x43,0xf0,0xf3	@ aesimc q10,q10
543.byte	0x68,0x23,0xb0,0xf3	@ aesd q1,q12
544.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
545.byte	0x68,0x43,0xf0,0xf3	@ aesd q10,q12
546.byte	0xe4,0x43,0xf0,0xf3	@ aesimc q10,q10
547	cmn	r2,#0x20
548.byte	0x6a,0x23,0xb0,0xf3	@ aesd q1,q13
549.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
550.byte	0x6a,0x43,0xf0,0xf3	@ aesd q10,q13
551.byte	0xe4,0x43,0xf0,0xf3	@ aesimc q10,q10
552	veor	q5,q6,q7
553.byte	0x6c,0x23,0xb0,0xf3	@ aesd q1,q14
554.byte	0xc2,0x23,0xb0,0xf3	@ aesimc q1,q1
555.byte	0x6c,0x43,0xf0,0xf3	@ aesd q10,q14
556.byte	0xe4,0x43,0xf0,0xf3	@ aesimc q10,q10
557	veor	q9,q3,q7
558.byte	0x6e,0x23,0xb0,0xf3	@ aesd q1,q15
559.byte	0x6e,0x43,0xf0,0xf3	@ aesd q10,q15
560	beq	.Lcbc_dec_one
561	veor	q5,q5,q1
562	veor	q9,q9,q10
563	vorr	q6,q11,q11
564	vst1.8	{q5},[r1]!
565	vst1.8	{q9},[r1]!
566	b	.Lcbc_done
567
568.Lcbc_dec_one:
569	veor	q5,q5,q10
570	vorr	q6,q11,q11
571	vst1.8	{q5},[r1]!
572
573.Lcbc_done:
574	vst1.8	{q6},[r4]
575.Lcbc_abort:
576	vldmia	sp!,{d8,d9,d10,d11,d12,d13,d14,d15}
577	ldmia	sp!,{r4,r5,r6,r7,r8,pc}
578.size	aes_v8_cbc_encrypt,.-aes_v8_cbc_encrypt
579.globl	aes_v8_ctr32_encrypt_blocks
580.type	aes_v8_ctr32_encrypt_blocks,%function
581.align	5
582aes_v8_ctr32_encrypt_blocks:
583	mov	ip,sp
584	stmdb	sp!,{r4,r5,r6,r7,r8,r9,r10,lr}
585	vstmdb	sp!,{d8,d9,d10,d11,d12,d13,d14,d15}            @ ABI specification says so
586	ldr	r4, [ip]		@ load remaining arg
587	ldr	r5,[r3,#240]
588
589	ldr	r8, [r4, #12]
590#ifdef __ARMEB__
591	vld1.8	{q0},[r4]
592#else
593	vld1.32	{q0},[r4]
594#endif
595	vld1.32	{q8,q9},[r3]		@ load key schedule...
596	sub	r5,r5,#4
597	mov	r12,#16
598	cmp	r2,#2
599	add	r7,r3,r5,lsl#4	@ pointer to last 5 round keys
600	sub	r5,r5,#2
601	vld1.32	{q12,q13},[r7]!
602	vld1.32	{q14,q15},[r7]!
603	vld1.32	{q7},[r7]
604	add	r7,r3,#32
605	mov	r6,r5
606	movlo	r12,#0
607#ifndef __ARMEB__
608	rev	r8, r8
609#endif
610	add	r10, r8, #1
611	vorr	q6,q0,q0
612	rev	r10, r10
613	vmov.32	d13[1],r10
614	add	r8, r8, #2
615	vorr	q1,q6,q6
616	bls	.Lctr32_tail
617	rev	r12, r8
618	vmov.32	d13[1],r12
619	sub	r2,r2,#3		@ bias
620	vorr	q10,q6,q6
621	b	.Loop3x_ctr32
622
623.align	4
624.Loop3x_ctr32:
625.byte	0x20,0x03,0xb0,0xf3	@ aese q0,q8
626.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
627.byte	0x20,0x23,0xb0,0xf3	@ aese q1,q8
628.byte	0x82,0x23,0xb0,0xf3	@ aesmc q1,q1
629.byte	0x20,0x43,0xf0,0xf3	@ aese q10,q8
630.byte	0xa4,0x43,0xf0,0xf3	@ aesmc q10,q10
631	vld1.32	{q8},[r7]!
632	subs	r6,r6,#2
633.byte	0x22,0x03,0xb0,0xf3	@ aese q0,q9
634.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
635.byte	0x22,0x23,0xb0,0xf3	@ aese q1,q9
636.byte	0x82,0x23,0xb0,0xf3	@ aesmc q1,q1
637.byte	0x22,0x43,0xf0,0xf3	@ aese q10,q9
638.byte	0xa4,0x43,0xf0,0xf3	@ aesmc q10,q10
639	vld1.32	{q9},[r7]!
640	bgt	.Loop3x_ctr32
641
642.byte	0x20,0x03,0xb0,0xf3	@ aese q0,q8
643.byte	0x80,0x83,0xb0,0xf3	@ aesmc q4,q0
644.byte	0x20,0x23,0xb0,0xf3	@ aese q1,q8
645.byte	0x82,0xa3,0xb0,0xf3	@ aesmc q5,q1
646	vld1.8	{q2},[r0]!
647	add	r9,r8,#1
648.byte	0x20,0x43,0xf0,0xf3	@ aese q10,q8
649.byte	0xa4,0x43,0xf0,0xf3	@ aesmc q10,q10
650	vld1.8	{q3},[r0]!
651	rev	r9,r9
652.byte	0x22,0x83,0xb0,0xf3	@ aese q4,q9
653.byte	0x88,0x83,0xb0,0xf3	@ aesmc q4,q4
654.byte	0x22,0xa3,0xb0,0xf3	@ aese q5,q9
655.byte	0x8a,0xa3,0xb0,0xf3	@ aesmc q5,q5
656	vld1.8	{q11},[r0]!
657	mov	r7,r3
658.byte	0x22,0x43,0xf0,0xf3	@ aese q10,q9
659.byte	0xa4,0x23,0xf0,0xf3	@ aesmc q9,q10
660.byte	0x28,0x83,0xb0,0xf3	@ aese q4,q12
661.byte	0x88,0x83,0xb0,0xf3	@ aesmc q4,q4
662.byte	0x28,0xa3,0xb0,0xf3	@ aese q5,q12
663.byte	0x8a,0xa3,0xb0,0xf3	@ aesmc q5,q5
664	veor	q2,q2,q7
665	add	r10,r8,#2
666.byte	0x28,0x23,0xf0,0xf3	@ aese q9,q12
667.byte	0xa2,0x23,0xf0,0xf3	@ aesmc q9,q9
668	veor	q3,q3,q7
669	add	r8,r8,#3
670.byte	0x2a,0x83,0xb0,0xf3	@ aese q4,q13
671.byte	0x88,0x83,0xb0,0xf3	@ aesmc q4,q4
672.byte	0x2a,0xa3,0xb0,0xf3	@ aese q5,q13
673.byte	0x8a,0xa3,0xb0,0xf3	@ aesmc q5,q5
674	veor	q11,q11,q7
675	vmov.32	d13[1], r9
676.byte	0x2a,0x23,0xf0,0xf3	@ aese q9,q13
677.byte	0xa2,0x23,0xf0,0xf3	@ aesmc q9,q9
678	vorr	q0,q6,q6
679	rev	r10,r10
680.byte	0x2c,0x83,0xb0,0xf3	@ aese q4,q14
681.byte	0x88,0x83,0xb0,0xf3	@ aesmc q4,q4
682	vmov.32	d13[1], r10
683	rev	r12,r8
684.byte	0x2c,0xa3,0xb0,0xf3	@ aese q5,q14
685.byte	0x8a,0xa3,0xb0,0xf3	@ aesmc q5,q5
686	vorr	q1,q6,q6
687	vmov.32	d13[1], r12
688.byte	0x2c,0x23,0xf0,0xf3	@ aese q9,q14
689.byte	0xa2,0x23,0xf0,0xf3	@ aesmc q9,q9
690	vorr	q10,q6,q6
691	subs	r2,r2,#3
692.byte	0x2e,0x83,0xb0,0xf3	@ aese q4,q15
693.byte	0x2e,0xa3,0xb0,0xf3	@ aese q5,q15
694.byte	0x2e,0x23,0xf0,0xf3	@ aese q9,q15
695
696	veor	q2,q2,q4
697	vld1.32	{q8},[r7]!	@ re-pre-load rndkey[0]
698	vst1.8	{q2},[r1]!
699	veor	q3,q3,q5
700	mov	r6,r5
701	vst1.8	{q3},[r1]!
702	veor	q11,q11,q9
703	vld1.32	{q9},[r7]!	@ re-pre-load rndkey[1]
704	vst1.8	{q11},[r1]!
705	bhs	.Loop3x_ctr32
706
707	adds	r2,r2,#3
708	beq	.Lctr32_done
709	cmp	r2,#1
710	mov	r12,#16
711	moveq	r12,#0
712
713.Lctr32_tail:
714.byte	0x20,0x03,0xb0,0xf3	@ aese q0,q8
715.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
716.byte	0x20,0x23,0xb0,0xf3	@ aese q1,q8
717.byte	0x82,0x23,0xb0,0xf3	@ aesmc q1,q1
718	vld1.32	{q8},[r7]!
719	subs	r6,r6,#2
720.byte	0x22,0x03,0xb0,0xf3	@ aese q0,q9
721.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
722.byte	0x22,0x23,0xb0,0xf3	@ aese q1,q9
723.byte	0x82,0x23,0xb0,0xf3	@ aesmc q1,q1
724	vld1.32	{q9},[r7]!
725	bgt	.Lctr32_tail
726
727.byte	0x20,0x03,0xb0,0xf3	@ aese q0,q8
728.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
729.byte	0x20,0x23,0xb0,0xf3	@ aese q1,q8
730.byte	0x82,0x23,0xb0,0xf3	@ aesmc q1,q1
731.byte	0x22,0x03,0xb0,0xf3	@ aese q0,q9
732.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
733.byte	0x22,0x23,0xb0,0xf3	@ aese q1,q9
734.byte	0x82,0x23,0xb0,0xf3	@ aesmc q1,q1
735	vld1.8	{q2},[r0],r12
736.byte	0x28,0x03,0xb0,0xf3	@ aese q0,q12
737.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
738.byte	0x28,0x23,0xb0,0xf3	@ aese q1,q12
739.byte	0x82,0x23,0xb0,0xf3	@ aesmc q1,q1
740	vld1.8	{q3},[r0]
741.byte	0x2a,0x03,0xb0,0xf3	@ aese q0,q13
742.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
743.byte	0x2a,0x23,0xb0,0xf3	@ aese q1,q13
744.byte	0x82,0x23,0xb0,0xf3	@ aesmc q1,q1
745	veor	q2,q2,q7
746.byte	0x2c,0x03,0xb0,0xf3	@ aese q0,q14
747.byte	0x80,0x03,0xb0,0xf3	@ aesmc q0,q0
748.byte	0x2c,0x23,0xb0,0xf3	@ aese q1,q14
749.byte	0x82,0x23,0xb0,0xf3	@ aesmc q1,q1
750	veor	q3,q3,q7
751.byte	0x2e,0x03,0xb0,0xf3	@ aese q0,q15
752.byte	0x2e,0x23,0xb0,0xf3	@ aese q1,q15
753
754	cmp	r2,#1
755	veor	q2,q2,q0
756	veor	q3,q3,q1
757	vst1.8	{q2},[r1]!
758	beq	.Lctr32_done
759	vst1.8	{q3},[r1]
760
761.Lctr32_done:
762	vldmia	sp!,{d8,d9,d10,d11,d12,d13,d14,d15}
763	ldmia	sp!,{r4,r5,r6,r7,r8,r9,r10,pc}
764.size	aes_v8_ctr32_encrypt_blocks,.-aes_v8_ctr32_encrypt_blocks
765#endif
766