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