etc/services - sync with NetBSD-8
[minix.git] / crypto / external / bsd / openssl / lib / libcrypto / arch / arm / aesv8-armx.S
blobc504db52b941942ee86aeb0001d12d6845f9685b
1 #include "arm_arch.h"
2 #include "arm_asm.h"
4 #if __ARM_MAX_ARCH__>=7
5 .text
6 .arch   armv7-a
7 .fpu    neon
8 .code   32
9 .align  5
10 rcon:
11 .long   0x01,0x01,0x01,0x01
12 .long   0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d     @ rotate-n-splat
13 .long   0x1b,0x1b,0x1b,0x1b
15 .globl  aes_v8_set_encrypt_key
16 .type   aes_v8_set_encrypt_key,%function
17 .align  5
18 aes_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
33         adr     r3,rcon
34         cmp     r1,#192
36         veor    q0,q0,q0
37         vld1.8  {q3},[r0]!
38         mov     r1,#8           @ reuse r1
39         vld1.32 {q1,q2},[r3]!
41         blt     .Loop128
42         beq     .L192
43         b       .L256
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
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
64         vld1.32 {q1},[r3]
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
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
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
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
97         mov     r12,#10
98         b       .Ldone
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
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
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
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
132         mov     r12,#12
133         add     r2,r2,#0x20
134         b       .Ldone
136 .align  4
137 .L256:
138         vld1.8  {q8},[r0]
139         mov     r1,#7
140         mov     r12,#14
141         vst1.32 {q3},[r2]!
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
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
162         vdup.32 q10,d7[1]
163         vext.8  q9,q0,q8,#12
164         .inst   0xf3f04300      @ aese q10,q0
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
172         veor    q8,q8,q10
173         b       .Loop256
175 .Ldone:
176         str     r12,[r2]
177         mov     r3,#0
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
185 .globl  aes_v8_set_decrypt_key
186 .type   aes_v8_set_decrypt_key,%function
187 .align  5
188 aes_v8_set_decrypt_key:
189         stmdb   sp!,{r4,lr}
190         bl      .Lenc_key
192         cmp     r0,#0
193         bne     .Ldec_key_abort
195         sub     r2,r2,#240              @ restore original r2
196         mov     r4,#-16
197         add     r0,r2,r12,lsl#4 @ end of key schedule
199         vld1.32 {q0},[r2]
200         vld1.32 {q1},[r0]
201         vst1.32 {q0},[r0],r4
202         vst1.32 {q1},[r2]!
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
214         vld1.32 {q0},[r2]
215         .inst   0xf3b003c0      @ aesimc q0,q0
216         vst1.32 {q0},[r0]
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
225 aes_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]!
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
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
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
254 aes_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]!
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
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
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
283 aes_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
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
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]
308         add     r7,r3,#32
309         mov     r6,r5
310         beq     .Lcbc_dec
312         cmp     r5,#2
313         veor    q0,q0,q6
314         veor    q5,q8,q7
315         beq     .Lcbc_enc128
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
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
349          mov    r6,r5
350         veor    q6,q0,q7
351         vst1.8  {q6},[r1]!
352         bhs     .Loop_cbc_enc
354         b       .Lcbc_done
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
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
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
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
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
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
488         cmn     r2,#0x30
489         beq     .Lcbc_done
490         nop
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
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
539 .Lcbc_dec_one:
540         veor    q5,q5,q10
541          vorr   q6,q11,q11
542         vst1.8  {q5},[r1]!
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
553 aes_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]
560         ldr             r8, [r4, #12]
561         vld1.32         {q0},[r4]
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
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
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
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
675         adds            r2,r2,#3
676         beq             .Lctr32_done
677         cmp             r2,#1
678         mov             r12,#16
679         moveq   r12,#0
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
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
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]
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