Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / boringssl / linux-arm / crypto / aes / bsaes-armv7.S
1
2 @ ====================================================================
3 @ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
4 @ project. The module is, however, dual licensed under OpenSSL and
5 @ CRYPTOGAMS licenses depending on where you obtain it. For further
6 @ details see http://www.openssl.org/~appro/cryptogams/.
7 @
8 @ Specific modes and adaptation for Linux kernel by Ard Biesheuvel
9 @ <ard.biesheuvel@linaro.org>. Permission to use under GPL terms is
10 @ granted.
11 @ ====================================================================
12
13 @ Bit-sliced AES for ARM NEON
14 @
15 @ February 2012.
16 @
17 @ This implementation is direct adaptation of bsaes-x86_64 module for
18 @ ARM NEON. Except that this module is endian-neutral [in sense that
19 @ it can be compiled for either endianness] by courtesy of vld1.8's
20 @ neutrality. Initial version doesn't implement interface to OpenSSL,
21 @ only low-level primitives and unsupported entry points, just enough
22 @ to collect performance results, which for Cortex-A8 core are:
23 @
24 @ encrypt       19.5 cycles per byte processed with 128-bit key
25 @ decrypt       22.1 cycles per byte processed with 128-bit key
26 @ key conv.     440  cycles per 128-bit key/0.18 of 8x block
27 @
28 @ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7,
29 @ which is [much] worse than anticipated (for further details see
30 @ http://www.openssl.org/~appro/Snapdragon-S4.html).
31 @
32 @ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code
33 @ manages in 20.0 cycles].
34 @
35 @ When comparing to x86_64 results keep in mind that NEON unit is
36 @ [mostly] single-issue and thus can't [fully] benefit from
37 @ instruction-level parallelism. And when comparing to aes-armv4
38 @ results keep in mind key schedule conversion overhead (see
39 @ bsaes-x86_64.pl for further details)...
40 @
41 @                                               <appro@openssl.org>
42
43 @ April-August 2013
44 @
45 @ Add CBC, CTR and XTS subroutines, adapt for kernel use.
46 @
47 @                                       <ard.biesheuvel@linaro.org>
48
49 #if defined(__arm__)
50 #ifndef __KERNEL__
51 # include "arm_arch.h"
52
53 # define VFP_ABI_PUSH   vstmdb  sp!,{d8-d15}
54 # define VFP_ABI_POP    vldmia  sp!,{d8-d15}
55 # define VFP_ABI_FRAME  0x40
56 #else
57 # define VFP_ABI_PUSH
58 # define VFP_ABI_POP
59 # define VFP_ABI_FRAME  0
60 # define BSAES_ASM_EXTENDED_KEY
61 # define XTS_CHAIN_TWEAK
62 # define __ARM_ARCH__ __LINUX_ARM_ARCH__
63 #endif
64
65 #ifdef __thumb__
66 # define adrl adr
67 #endif
68
69 #if __ARM_ARCH__>=7
70 .text
71 .syntax unified         @ ARMv7-capable assembler is expected to handle this
72 #ifdef __thumb2__
73 .thumb
74 #else
75 .code   32
76 #endif
77
78 .fpu    neon
79
80 .type   _bsaes_decrypt8,%function
81 .align  4
82 _bsaes_decrypt8:
83         adr     r6,_bsaes_decrypt8
84         vldmia  r4!, {q9}               @ round 0 key
85         add     r6,r6,#.LM0ISR-_bsaes_decrypt8
86
87         vldmia  r6!, {q8}               @ .LM0ISR
88         veor    q10, q0, q9     @ xor with round0 key
89         veor    q11, q1, q9
90          vtbl.8 d0, {q10}, d16
91          vtbl.8 d1, {q10}, d17
92         veor    q12, q2, q9
93          vtbl.8 d2, {q11}, d16
94          vtbl.8 d3, {q11}, d17
95         veor    q13, q3, q9
96          vtbl.8 d4, {q12}, d16
97          vtbl.8 d5, {q12}, d17
98         veor    q14, q4, q9
99          vtbl.8 d6, {q13}, d16
100          vtbl.8 d7, {q13}, d17
101         veor    q15, q5, q9
102          vtbl.8 d8, {q14}, d16
103          vtbl.8 d9, {q14}, d17
104         veor    q10, q6, q9
105          vtbl.8 d10, {q15}, d16
106          vtbl.8 d11, {q15}, d17
107         veor    q11, q7, q9
108          vtbl.8 d12, {q10}, d16
109          vtbl.8 d13, {q10}, d17
110          vtbl.8 d14, {q11}, d16
111          vtbl.8 d15, {q11}, d17
112         vmov.i8 q8,#0x55                        @ compose .LBS0
113         vmov.i8 q9,#0x33                        @ compose .LBS1
114         vshr.u64        q10, q6, #1
115          vshr.u64       q11, q4, #1
116         veor            q10, q10, q7
117          veor           q11, q11, q5
118         vand            q10, q10, q8
119          vand           q11, q11, q8
120         veor            q7, q7, q10
121         vshl.u64        q10, q10, #1
122          veor           q5, q5, q11
123          vshl.u64       q11, q11, #1
124         veor            q6, q6, q10
125          veor           q4, q4, q11
126         vshr.u64        q10, q2, #1
127          vshr.u64       q11, q0, #1
128         veor            q10, q10, q3
129          veor           q11, q11, q1
130         vand            q10, q10, q8
131          vand           q11, q11, q8
132         veor            q3, q3, q10
133         vshl.u64        q10, q10, #1
134          veor           q1, q1, q11
135          vshl.u64       q11, q11, #1
136         veor            q2, q2, q10
137          veor           q0, q0, q11
138         vmov.i8 q8,#0x0f                        @ compose .LBS2
139         vshr.u64        q10, q5, #2
140          vshr.u64       q11, q4, #2
141         veor            q10, q10, q7
142          veor           q11, q11, q6
143         vand            q10, q10, q9
144          vand           q11, q11, q9
145         veor            q7, q7, q10
146         vshl.u64        q10, q10, #2
147          veor           q6, q6, q11
148          vshl.u64       q11, q11, #2
149         veor            q5, q5, q10
150          veor           q4, q4, q11
151         vshr.u64        q10, q1, #2
152          vshr.u64       q11, q0, #2
153         veor            q10, q10, q3
154          veor           q11, q11, q2
155         vand            q10, q10, q9
156          vand           q11, q11, q9
157         veor            q3, q3, q10
158         vshl.u64        q10, q10, #2
159          veor           q2, q2, q11
160          vshl.u64       q11, q11, #2
161         veor            q1, q1, q10
162          veor           q0, q0, q11
163         vshr.u64        q10, q3, #4
164          vshr.u64       q11, q2, #4
165         veor            q10, q10, q7
166          veor           q11, q11, q6
167         vand            q10, q10, q8
168          vand           q11, q11, q8
169         veor            q7, q7, q10
170         vshl.u64        q10, q10, #4
171          veor           q6, q6, q11
172          vshl.u64       q11, q11, #4
173         veor            q3, q3, q10
174          veor           q2, q2, q11
175         vshr.u64        q10, q1, #4
176          vshr.u64       q11, q0, #4
177         veor            q10, q10, q5
178          veor           q11, q11, q4
179         vand            q10, q10, q8
180          vand           q11, q11, q8
181         veor            q5, q5, q10
182         vshl.u64        q10, q10, #4
183          veor           q4, q4, q11
184          vshl.u64       q11, q11, #4
185         veor            q1, q1, q10
186          veor           q0, q0, q11
187         sub     r5,r5,#1
188         b       .Ldec_sbox
189 .align  4
190 .Ldec_loop:
191         vldmia  r4!, {q8-q11}
192         veor    q8, q8, q0
193         veor    q9, q9, q1
194         vtbl.8  d0, {q8}, d24
195         vtbl.8  d1, {q8}, d25
196         vldmia  r4!, {q8}
197         veor    q10, q10, q2
198         vtbl.8  d2, {q9}, d24
199         vtbl.8  d3, {q9}, d25
200         vldmia  r4!, {q9}
201         veor    q11, q11, q3
202         vtbl.8  d4, {q10}, d24
203         vtbl.8  d5, {q10}, d25
204         vldmia  r4!, {q10}
205         vtbl.8  d6, {q11}, d24
206         vtbl.8  d7, {q11}, d25
207         vldmia  r4!, {q11}
208         veor    q8, q8, q4
209         veor    q9, q9, q5
210         vtbl.8  d8, {q8}, d24
211         vtbl.8  d9, {q8}, d25
212         veor    q10, q10, q6
213         vtbl.8  d10, {q9}, d24
214         vtbl.8  d11, {q9}, d25
215         veor    q11, q11, q7
216         vtbl.8  d12, {q10}, d24
217         vtbl.8  d13, {q10}, d25
218         vtbl.8  d14, {q11}, d24
219         vtbl.8  d15, {q11}, d25
220 .Ldec_sbox:
221          veor   q1, q1, q4
222         veor    q3, q3, q4
223
224         veor    q4, q4, q7
225          veor   q1, q1, q6
226         veor    q2, q2, q7
227         veor    q6, q6, q4
228
229         veor    q0, q0, q1
230         veor    q2, q2, q5
231          veor   q7, q7, q6
232         veor    q3, q3, q0
233         veor    q5, q5, q0
234         veor    q1, q1, q3
235         veor    q11, q3, q0
236         veor    q10, q7, q4
237         veor    q9, q1, q6
238         veor    q13, q4, q0
239          vmov   q8, q10
240         veor    q12, q5, q2
241
242         vorr    q10, q10, q9
243         veor    q15, q11, q8
244         vand    q14, q11, q12
245         vorr    q11, q11, q12
246         veor    q12, q12, q9
247         vand    q8, q8, q9
248         veor    q9, q6, q2
249         vand    q15, q15, q12
250         vand    q13, q13, q9
251         veor    q9, q3, q7
252         veor    q12, q1, q5
253         veor    q11, q11, q13
254         veor    q10, q10, q13
255         vand    q13, q9, q12
256         vorr    q9, q9, q12
257         veor    q11, q11, q15
258         veor    q8, q8, q13
259         veor    q10, q10, q14
260         veor    q9, q9, q15
261         veor    q8, q8, q14
262         vand    q12, q4, q6
263         veor    q9, q9, q14
264         vand    q13, q0, q2
265         vand    q14, q7, q1
266         vorr    q15, q3, q5
267         veor    q11, q11, q12
268         veor    q9, q9, q14
269         veor    q8, q8, q15
270         veor    q10, q10, q13
271
272         @ Inv_GF16      0,      1,      2,      3, s0, s1, s2, s3
273
274         @ new smaller inversion
275
276         vand    q14, q11, q9
277         vmov    q12, q8
278
279         veor    q13, q10, q14
280         veor    q15, q8, q14
281         veor    q14, q8, q14    @ q14=q15
282
283         vbsl    q13, q9, q8
284         vbsl    q15, q11, q10
285         veor    q11, q11, q10
286
287         vbsl    q12, q13, q14
288         vbsl    q8, q14, q13
289
290         vand    q14, q12, q15
291         veor    q9, q9, q8
292
293         veor    q14, q14, q11
294         veor    q12, q5, q2
295         veor    q8, q1, q6
296         veor    q10, q15, q14
297         vand    q10, q10, q5
298         veor    q5, q5, q1
299         vand    q11, q1, q15
300         vand    q5, q5, q14
301         veor    q1, q11, q10
302         veor    q5, q5, q11
303         veor    q15, q15, q13
304         veor    q14, q14, q9
305         veor    q11, q15, q14
306          veor   q10, q13, q9
307         vand    q11, q11, q12
308          vand   q10, q10, q2
309         veor    q12, q12, q8
310          veor   q2, q2, q6
311         vand    q8, q8, q15
312          vand   q6, q6, q13
313         vand    q12, q12, q14
314          vand   q2, q2, q9
315         veor    q8, q8, q12
316          veor   q2, q2, q6
317         veor    q12, q12, q11
318          veor   q6, q6, q10
319         veor    q5, q5, q12
320         veor    q2, q2, q12
321         veor    q1, q1, q8
322         veor    q6, q6, q8
323
324         veor    q12, q3, q0
325         veor    q8, q7, q4
326         veor    q11, q15, q14
327          veor   q10, q13, q9
328         vand    q11, q11, q12
329          vand   q10, q10, q0
330         veor    q12, q12, q8
331          veor   q0, q0, q4
332         vand    q8, q8, q15
333          vand   q4, q4, q13
334         vand    q12, q12, q14
335          vand   q0, q0, q9
336         veor    q8, q8, q12
337          veor   q0, q0, q4
338         veor    q12, q12, q11
339          veor   q4, q4, q10
340         veor    q15, q15, q13
341         veor    q14, q14, q9
342         veor    q10, q15, q14
343         vand    q10, q10, q3
344         veor    q3, q3, q7
345         vand    q11, q7, q15
346         vand    q3, q3, q14
347         veor    q7, q11, q10
348         veor    q3, q3, q11
349         veor    q3, q3, q12
350         veor    q0, q0, q12
351         veor    q7, q7, q8
352         veor    q4, q4, q8
353         veor    q1, q1, q7
354         veor    q6, q6, q5
355
356         veor    q4, q4, q1
357         veor    q2, q2, q7
358         veor    q5, q5, q7
359         veor    q4, q4, q2
360          veor   q7, q7, q0
361         veor    q4, q4, q5
362          veor   q3, q3, q6
363          veor   q6, q6, q1
364         veor    q3, q3, q4
365
366         veor    q4, q4, q0
367         veor    q7, q7, q3
368         subs    r5,r5,#1
369         bcc     .Ldec_done
370         @ multiplication by 0x05-0x00-0x04-0x00
371         vext.8  q8, q0, q0, #8
372         vext.8  q14, q3, q3, #8
373         vext.8  q15, q5, q5, #8
374         veor    q8, q8, q0
375         vext.8  q9, q1, q1, #8
376         veor    q14, q14, q3
377         vext.8  q10, q6, q6, #8
378         veor    q15, q15, q5
379         vext.8  q11, q4, q4, #8
380         veor    q9, q9, q1
381         vext.8  q12, q2, q2, #8
382         veor    q10, q10, q6
383         vext.8  q13, q7, q7, #8
384         veor    q11, q11, q4
385         veor    q12, q12, q2
386         veor    q13, q13, q7
387
388          veor   q0, q0, q14
389          veor   q1, q1, q14
390          veor   q6, q6, q8
391          veor   q2, q2, q10
392          veor   q4, q4, q9
393          veor   q1, q1, q15
394          veor   q6, q6, q15
395          veor   q2, q2, q14
396          veor   q7, q7, q11
397          veor   q4, q4, q14
398          veor   q3, q3, q12
399          veor   q2, q2, q15
400          veor   q7, q7, q15
401          veor   q5, q5, q13
402         vext.8  q8, q0, q0, #12 @ x0 <<< 32
403         vext.8  q9, q1, q1, #12
404          veor   q0, q0, q8              @ x0 ^ (x0 <<< 32)
405         vext.8  q10, q6, q6, #12
406          veor   q1, q1, q9
407         vext.8  q11, q4, q4, #12
408          veor   q6, q6, q10
409         vext.8  q12, q2, q2, #12
410          veor   q4, q4, q11
411         vext.8  q13, q7, q7, #12
412          veor   q2, q2, q12
413         vext.8  q14, q3, q3, #12
414          veor   q7, q7, q13
415         vext.8  q15, q5, q5, #12
416          veor   q3, q3, q14
417
418         veor    q9, q9, q0
419          veor   q5, q5, q15
420          vext.8 q0, q0, q0, #8          @ (x0 ^ (x0 <<< 32)) <<< 64)
421         veor    q10, q10, q1
422         veor    q8, q8, q5
423         veor    q9, q9, q5
424          vext.8 q1, q1, q1, #8
425         veor    q13, q13, q2
426          veor   q0, q0, q8
427         veor    q14, q14, q7
428          veor   q1, q1, q9
429          vext.8 q8, q2, q2, #8
430         veor    q12, q12, q4
431          vext.8 q9, q7, q7, #8
432         veor    q15, q15, q3
433          vext.8 q2, q4, q4, #8
434         veor    q11, q11, q6
435          vext.8 q7, q5, q5, #8
436         veor    q12, q12, q5
437          vext.8 q4, q3, q3, #8
438         veor    q11, q11, q5
439          vext.8 q3, q6, q6, #8
440         veor    q5, q9, q13
441         veor    q11, q11, q2
442         veor    q7, q7, q15
443         veor    q6, q4, q14
444         veor    q4, q8, q12
445         veor    q2, q3, q10
446         vmov    q3, q11
447          @ vmov q5, q9
448         vldmia  r6, {q12}               @ .LISR
449         ite     eq                              @ Thumb2 thing, sanity check in ARM
450         addeq   r6,r6,#0x10
451         bne     .Ldec_loop
452         vldmia  r6, {q12}               @ .LISRM0
453         b       .Ldec_loop
454 .align  4
455 .Ldec_done:
456         vmov.i8 q8,#0x55                        @ compose .LBS0
457         vmov.i8 q9,#0x33                        @ compose .LBS1
458         vshr.u64        q10, q3, #1
459          vshr.u64       q11, q2, #1
460         veor            q10, q10, q5
461          veor           q11, q11, q7
462         vand            q10, q10, q8
463          vand           q11, q11, q8
464         veor            q5, q5, q10
465         vshl.u64        q10, q10, #1
466          veor           q7, q7, q11
467          vshl.u64       q11, q11, #1
468         veor            q3, q3, q10
469          veor           q2, q2, q11
470         vshr.u64        q10, q6, #1
471          vshr.u64       q11, q0, #1
472         veor            q10, q10, q4
473          veor           q11, q11, q1
474         vand            q10, q10, q8
475          vand           q11, q11, q8
476         veor            q4, q4, q10
477         vshl.u64        q10, q10, #1
478          veor           q1, q1, q11
479          vshl.u64       q11, q11, #1
480         veor            q6, q6, q10
481          veor           q0, q0, q11
482         vmov.i8 q8,#0x0f                        @ compose .LBS2
483         vshr.u64        q10, q7, #2
484          vshr.u64       q11, q2, #2
485         veor            q10, q10, q5
486          veor           q11, q11, q3
487         vand            q10, q10, q9
488          vand           q11, q11, q9
489         veor            q5, q5, q10
490         vshl.u64        q10, q10, #2
491          veor           q3, q3, q11
492          vshl.u64       q11, q11, #2
493         veor            q7, q7, q10
494          veor           q2, q2, q11
495         vshr.u64        q10, q1, #2
496          vshr.u64       q11, q0, #2
497         veor            q10, q10, q4
498          veor           q11, q11, q6
499         vand            q10, q10, q9
500          vand           q11, q11, q9
501         veor            q4, q4, q10
502         vshl.u64        q10, q10, #2
503          veor           q6, q6, q11
504          vshl.u64       q11, q11, #2
505         veor            q1, q1, q10
506          veor           q0, q0, q11
507         vshr.u64        q10, q4, #4
508          vshr.u64       q11, q6, #4
509         veor            q10, q10, q5
510          veor           q11, q11, q3
511         vand            q10, q10, q8
512          vand           q11, q11, q8
513         veor            q5, q5, q10
514         vshl.u64        q10, q10, #4
515          veor           q3, q3, q11
516          vshl.u64       q11, q11, #4
517         veor            q4, q4, q10
518          veor           q6, q6, q11
519         vshr.u64        q10, q1, #4
520          vshr.u64       q11, q0, #4
521         veor            q10, q10, q7
522          veor           q11, q11, q2
523         vand            q10, q10, q8
524          vand           q11, q11, q8
525         veor            q7, q7, q10
526         vshl.u64        q10, q10, #4
527          veor           q2, q2, q11
528          vshl.u64       q11, q11, #4
529         veor            q1, q1, q10
530          veor           q0, q0, q11
531         vldmia  r4, {q8}                        @ last round key
532         veor    q6, q6, q8
533         veor    q4, q4, q8
534         veor    q2, q2, q8
535         veor    q7, q7, q8
536         veor    q3, q3, q8
537         veor    q5, q5, q8
538         veor    q0, q0, q8
539         veor    q1, q1, q8
540         bx      lr
541 .size   _bsaes_decrypt8,.-_bsaes_decrypt8
542
543 .type   _bsaes_const,%object
544 .align  6
545 _bsaes_const:
546 .LM0ISR:        @ InvShiftRows constants
547         .quad   0x0a0e0206070b0f03, 0x0004080c0d010509
548 .LISR:
549         .quad   0x0504070602010003, 0x0f0e0d0c080b0a09
550 .LISRM0:
551         .quad   0x01040b0e0205080f, 0x0306090c00070a0d
552 .LM0SR:         @ ShiftRows constants
553         .quad   0x0a0e02060f03070b, 0x0004080c05090d01
554 .LSR:
555         .quad   0x0504070600030201, 0x0f0e0d0c0a09080b
556 .LSRM0:
557         .quad   0x0304090e00050a0f, 0x01060b0c0207080d
558 .LM0:
559         .quad   0x02060a0e03070b0f, 0x0004080c0105090d
560 .LREVM0SR:
561         .quad   0x090d01050c000408, 0x03070b0f060a0e02
562 .asciz  "Bit-sliced AES for NEON, CRYPTOGAMS by <appro@openssl.org>"
563 .align  6
564 .size   _bsaes_const,.-_bsaes_const
565
566 .type   _bsaes_encrypt8,%function
567 .align  4
568 _bsaes_encrypt8:
569         adr     r6,_bsaes_encrypt8
570         vldmia  r4!, {q9}               @ round 0 key
571         sub     r6,r6,#_bsaes_encrypt8-.LM0SR
572
573         vldmia  r6!, {q8}               @ .LM0SR
574 _bsaes_encrypt8_alt:
575         veor    q10, q0, q9     @ xor with round0 key
576         veor    q11, q1, q9
577          vtbl.8 d0, {q10}, d16
578          vtbl.8 d1, {q10}, d17
579         veor    q12, q2, q9
580          vtbl.8 d2, {q11}, d16
581          vtbl.8 d3, {q11}, d17
582         veor    q13, q3, q9
583          vtbl.8 d4, {q12}, d16
584          vtbl.8 d5, {q12}, d17
585         veor    q14, q4, q9
586          vtbl.8 d6, {q13}, d16
587          vtbl.8 d7, {q13}, d17
588         veor    q15, q5, q9
589          vtbl.8 d8, {q14}, d16
590          vtbl.8 d9, {q14}, d17
591         veor    q10, q6, q9
592          vtbl.8 d10, {q15}, d16
593          vtbl.8 d11, {q15}, d17
594         veor    q11, q7, q9
595          vtbl.8 d12, {q10}, d16
596          vtbl.8 d13, {q10}, d17
597          vtbl.8 d14, {q11}, d16
598          vtbl.8 d15, {q11}, d17
599 _bsaes_encrypt8_bitslice:
600         vmov.i8 q8,#0x55                        @ compose .LBS0
601         vmov.i8 q9,#0x33                        @ compose .LBS1
602         vshr.u64        q10, q6, #1
603          vshr.u64       q11, q4, #1
604         veor            q10, q10, q7
605          veor           q11, q11, q5
606         vand            q10, q10, q8
607          vand           q11, q11, q8
608         veor            q7, q7, q10
609         vshl.u64        q10, q10, #1
610          veor           q5, q5, q11
611          vshl.u64       q11, q11, #1
612         veor            q6, q6, q10
613          veor           q4, q4, q11
614         vshr.u64        q10, q2, #1
615          vshr.u64       q11, q0, #1
616         veor            q10, q10, q3
617          veor           q11, q11, q1
618         vand            q10, q10, q8
619          vand           q11, q11, q8
620         veor            q3, q3, q10
621         vshl.u64        q10, q10, #1
622          veor           q1, q1, q11
623          vshl.u64       q11, q11, #1
624         veor            q2, q2, q10
625          veor           q0, q0, q11
626         vmov.i8 q8,#0x0f                        @ compose .LBS2
627         vshr.u64        q10, q5, #2
628          vshr.u64       q11, q4, #2
629         veor            q10, q10, q7
630          veor           q11, q11, q6
631         vand            q10, q10, q9
632          vand           q11, q11, q9
633         veor            q7, q7, q10
634         vshl.u64        q10, q10, #2
635          veor           q6, q6, q11
636          vshl.u64       q11, q11, #2
637         veor            q5, q5, q10
638          veor           q4, q4, q11
639         vshr.u64        q10, q1, #2
640          vshr.u64       q11, q0, #2
641         veor            q10, q10, q3
642          veor           q11, q11, q2
643         vand            q10, q10, q9
644          vand           q11, q11, q9
645         veor            q3, q3, q10
646         vshl.u64        q10, q10, #2
647          veor           q2, q2, q11
648          vshl.u64       q11, q11, #2
649         veor            q1, q1, q10
650          veor           q0, q0, q11
651         vshr.u64        q10, q3, #4
652          vshr.u64       q11, q2, #4
653         veor            q10, q10, q7
654          veor           q11, q11, q6
655         vand            q10, q10, q8
656          vand           q11, q11, q8
657         veor            q7, q7, q10
658         vshl.u64        q10, q10, #4
659          veor           q6, q6, q11
660          vshl.u64       q11, q11, #4
661         veor            q3, q3, q10
662          veor           q2, q2, q11
663         vshr.u64        q10, q1, #4
664          vshr.u64       q11, q0, #4
665         veor            q10, q10, q5
666          veor           q11, q11, q4
667         vand            q10, q10, q8
668          vand           q11, q11, q8
669         veor            q5, q5, q10
670         vshl.u64        q10, q10, #4
671          veor           q4, q4, q11
672          vshl.u64       q11, q11, #4
673         veor            q1, q1, q10
674          veor           q0, q0, q11
675         sub     r5,r5,#1
676         b       .Lenc_sbox
677 .align  4
678 .Lenc_loop:
679         vldmia  r4!, {q8-q11}
680         veor    q8, q8, q0
681         veor    q9, q9, q1
682         vtbl.8  d0, {q8}, d24
683         vtbl.8  d1, {q8}, d25
684         vldmia  r4!, {q8}
685         veor    q10, q10, q2
686         vtbl.8  d2, {q9}, d24
687         vtbl.8  d3, {q9}, d25
688         vldmia  r4!, {q9}
689         veor    q11, q11, q3
690         vtbl.8  d4, {q10}, d24
691         vtbl.8  d5, {q10}, d25
692         vldmia  r4!, {q10}
693         vtbl.8  d6, {q11}, d24
694         vtbl.8  d7, {q11}, d25
695         vldmia  r4!, {q11}
696         veor    q8, q8, q4
697         veor    q9, q9, q5
698         vtbl.8  d8, {q8}, d24
699         vtbl.8  d9, {q8}, d25
700         veor    q10, q10, q6
701         vtbl.8  d10, {q9}, d24
702         vtbl.8  d11, {q9}, d25
703         veor    q11, q11, q7
704         vtbl.8  d12, {q10}, d24
705         vtbl.8  d13, {q10}, d25
706         vtbl.8  d14, {q11}, d24
707         vtbl.8  d15, {q11}, d25
708 .Lenc_sbox:
709         veor    q2, q2, q1
710         veor    q5, q5, q6
711         veor    q3, q3, q0
712         veor    q6, q6, q2
713         veor    q5, q5, q0
714
715         veor    q6, q6, q3
716         veor    q3, q3, q7
717         veor    q7, q7, q5
718         veor    q3, q3, q4
719         veor    q4, q4, q5
720
721         veor    q2, q2, q7
722         veor    q3, q3, q1
723         veor    q1, q1, q5
724         veor    q11, q7, q4
725         veor    q10, q1, q2
726         veor    q9, q5, q3
727         veor    q13, q2, q4
728          vmov   q8, q10
729         veor    q12, q6, q0
730
731         vorr    q10, q10, q9
732         veor    q15, q11, q8
733         vand    q14, q11, q12
734         vorr    q11, q11, q12
735         veor    q12, q12, q9
736         vand    q8, q8, q9
737         veor    q9, q3, q0
738         vand    q15, q15, q12
739         vand    q13, q13, q9
740         veor    q9, q7, q1
741         veor    q12, q5, q6
742         veor    q11, q11, q13
743         veor    q10, q10, q13
744         vand    q13, q9, q12
745         vorr    q9, q9, q12
746         veor    q11, q11, q15
747         veor    q8, q8, q13
748         veor    q10, q10, q14
749         veor    q9, q9, q15
750         veor    q8, q8, q14
751         vand    q12, q2, q3
752         veor    q9, q9, q14
753         vand    q13, q4, q0
754         vand    q14, q1, q5
755         vorr    q15, q7, q6
756         veor    q11, q11, q12
757         veor    q9, q9, q14
758         veor    q8, q8, q15
759         veor    q10, q10, q13
760
761         @ Inv_GF16      0,      1,      2,      3, s0, s1, s2, s3
762
763         @ new smaller inversion
764
765         vand    q14, q11, q9
766         vmov    q12, q8
767
768         veor    q13, q10, q14
769         veor    q15, q8, q14
770         veor    q14, q8, q14    @ q14=q15
771
772         vbsl    q13, q9, q8
773         vbsl    q15, q11, q10
774         veor    q11, q11, q10
775
776         vbsl    q12, q13, q14
777         vbsl    q8, q14, q13
778
779         vand    q14, q12, q15
780         veor    q9, q9, q8
781
782         veor    q14, q14, q11
783         veor    q12, q6, q0
784         veor    q8, q5, q3
785         veor    q10, q15, q14
786         vand    q10, q10, q6
787         veor    q6, q6, q5
788         vand    q11, q5, q15
789         vand    q6, q6, q14
790         veor    q5, q11, q10
791         veor    q6, q6, q11
792         veor    q15, q15, q13
793         veor    q14, q14, q9
794         veor    q11, q15, q14
795          veor   q10, q13, q9
796         vand    q11, q11, q12
797          vand   q10, q10, q0
798         veor    q12, q12, q8
799          veor   q0, q0, q3
800         vand    q8, q8, q15
801          vand   q3, q3, q13
802         vand    q12, q12, q14
803          vand   q0, q0, q9
804         veor    q8, q8, q12
805          veor   q0, q0, q3
806         veor    q12, q12, q11
807          veor   q3, q3, q10
808         veor    q6, q6, q12
809         veor    q0, q0, q12
810         veor    q5, q5, q8
811         veor    q3, q3, q8
812
813         veor    q12, q7, q4
814         veor    q8, q1, q2
815         veor    q11, q15, q14
816          veor   q10, q13, q9
817         vand    q11, q11, q12
818          vand   q10, q10, q4
819         veor    q12, q12, q8
820          veor   q4, q4, q2
821         vand    q8, q8, q15
822          vand   q2, q2, q13
823         vand    q12, q12, q14
824          vand   q4, q4, q9
825         veor    q8, q8, q12
826          veor   q4, q4, q2
827         veor    q12, q12, q11
828          veor   q2, q2, q10
829         veor    q15, q15, q13
830         veor    q14, q14, q9
831         veor    q10, q15, q14
832         vand    q10, q10, q7
833         veor    q7, q7, q1
834         vand    q11, q1, q15
835         vand    q7, q7, q14
836         veor    q1, q11, q10
837         veor    q7, q7, q11
838         veor    q7, q7, q12
839         veor    q4, q4, q12
840         veor    q1, q1, q8
841         veor    q2, q2, q8
842         veor    q7, q7, q0
843         veor    q1, q1, q6
844         veor    q6, q6, q0
845         veor    q4, q4, q7
846         veor    q0, q0, q1
847
848         veor    q1, q1, q5
849         veor    q5, q5, q2
850         veor    q2, q2, q3
851         veor    q3, q3, q5
852         veor    q4, q4, q5
853
854         veor    q6, q6, q3
855         subs    r5,r5,#1
856         bcc     .Lenc_done
857         vext.8  q8, q0, q0, #12 @ x0 <<< 32
858         vext.8  q9, q1, q1, #12
859          veor   q0, q0, q8              @ x0 ^ (x0 <<< 32)
860         vext.8  q10, q4, q4, #12
861          veor   q1, q1, q9
862         vext.8  q11, q6, q6, #12
863          veor   q4, q4, q10
864         vext.8  q12, q3, q3, #12
865          veor   q6, q6, q11
866         vext.8  q13, q7, q7, #12
867          veor   q3, q3, q12
868         vext.8  q14, q2, q2, #12
869          veor   q7, q7, q13
870         vext.8  q15, q5, q5, #12
871          veor   q2, q2, q14
872
873         veor    q9, q9, q0
874          veor   q5, q5, q15
875          vext.8 q0, q0, q0, #8          @ (x0 ^ (x0 <<< 32)) <<< 64)
876         veor    q10, q10, q1
877         veor    q8, q8, q5
878         veor    q9, q9, q5
879          vext.8 q1, q1, q1, #8
880         veor    q13, q13, q3
881          veor   q0, q0, q8
882         veor    q14, q14, q7
883          veor   q1, q1, q9
884          vext.8 q8, q3, q3, #8
885         veor    q12, q12, q6
886          vext.8 q9, q7, q7, #8
887         veor    q15, q15, q2
888          vext.8 q3, q6, q6, #8
889         veor    q11, q11, q4
890          vext.8 q7, q5, q5, #8
891         veor    q12, q12, q5
892          vext.8 q6, q2, q2, #8
893         veor    q11, q11, q5
894          vext.8 q2, q4, q4, #8
895         veor    q5, q9, q13
896         veor    q4, q8, q12
897         veor    q3, q3, q11
898         veor    q7, q7, q15
899         veor    q6, q6, q14
900          @ vmov q4, q8
901         veor    q2, q2, q10
902          @ vmov q5, q9
903         vldmia  r6, {q12}               @ .LSR
904         ite     eq                              @ Thumb2 thing, samity check in ARM
905         addeq   r6,r6,#0x10
906         bne     .Lenc_loop
907         vldmia  r6, {q12}               @ .LSRM0
908         b       .Lenc_loop
909 .align  4
910 .Lenc_done:
911         vmov.i8 q8,#0x55                        @ compose .LBS0
912         vmov.i8 q9,#0x33                        @ compose .LBS1
913         vshr.u64        q10, q2, #1
914          vshr.u64       q11, q3, #1
915         veor            q10, q10, q5
916          veor           q11, q11, q7
917         vand            q10, q10, q8
918          vand           q11, q11, q8
919         veor            q5, q5, q10
920         vshl.u64        q10, q10, #1
921          veor           q7, q7, q11
922          vshl.u64       q11, q11, #1
923         veor            q2, q2, q10
924          veor           q3, q3, q11
925         vshr.u64        q10, q4, #1
926          vshr.u64       q11, q0, #1
927         veor            q10, q10, q6
928          veor           q11, q11, q1
929         vand            q10, q10, q8
930          vand           q11, q11, q8
931         veor            q6, q6, q10
932         vshl.u64        q10, q10, #1
933          veor           q1, q1, q11
934          vshl.u64       q11, q11, #1
935         veor            q4, q4, q10
936          veor           q0, q0, q11
937         vmov.i8 q8,#0x0f                        @ compose .LBS2
938         vshr.u64        q10, q7, #2
939          vshr.u64       q11, q3, #2
940         veor            q10, q10, q5
941          veor           q11, q11, q2
942         vand            q10, q10, q9
943          vand           q11, q11, q9
944         veor            q5, q5, q10
945         vshl.u64        q10, q10, #2
946          veor           q2, q2, q11
947          vshl.u64       q11, q11, #2
948         veor            q7, q7, q10
949          veor           q3, q3, q11
950         vshr.u64        q10, q1, #2
951          vshr.u64       q11, q0, #2
952         veor            q10, q10, q6
953          veor           q11, q11, q4
954         vand            q10, q10, q9
955          vand           q11, q11, q9
956         veor            q6, q6, q10
957         vshl.u64        q10, q10, #2
958          veor           q4, q4, q11
959          vshl.u64       q11, q11, #2
960         veor            q1, q1, q10
961          veor           q0, q0, q11
962         vshr.u64        q10, q6, #4
963          vshr.u64       q11, q4, #4
964         veor            q10, q10, q5
965          veor           q11, q11, q2
966         vand            q10, q10, q8
967          vand           q11, q11, q8
968         veor            q5, q5, q10
969         vshl.u64        q10, q10, #4
970          veor           q2, q2, q11
971          vshl.u64       q11, q11, #4
972         veor            q6, q6, q10
973          veor           q4, q4, q11
974         vshr.u64        q10, q1, #4
975          vshr.u64       q11, q0, #4
976         veor            q10, q10, q7
977          veor           q11, q11, q3
978         vand            q10, q10, q8
979          vand           q11, q11, q8
980         veor            q7, q7, q10
981         vshl.u64        q10, q10, #4
982          veor           q3, q3, q11
983          vshl.u64       q11, q11, #4
984         veor            q1, q1, q10
985          veor           q0, q0, q11
986         vldmia  r4, {q8}                        @ last round key
987         veor    q4, q4, q8
988         veor    q6, q6, q8
989         veor    q3, q3, q8
990         veor    q7, q7, q8
991         veor    q2, q2, q8
992         veor    q5, q5, q8
993         veor    q0, q0, q8
994         veor    q1, q1, q8
995         bx      lr
996 .size   _bsaes_encrypt8,.-_bsaes_encrypt8
997 .type   _bsaes_key_convert,%function
998 .align  4
999 _bsaes_key_convert:
1000         adr     r6,_bsaes_key_convert
1001         vld1.8  {q7},  [r4]!            @ load round 0 key
1002         sub     r6,r6,#_bsaes_key_convert-.LM0
1003         vld1.8  {q15}, [r4]!            @ load round 1 key
1004
1005         vmov.i8 q8,  #0x01                      @ bit masks
1006         vmov.i8 q9,  #0x02
1007         vmov.i8 q10, #0x04
1008         vmov.i8 q11, #0x08
1009         vmov.i8 q12, #0x10
1010         vmov.i8 q13, #0x20
1011         vldmia  r6, {q14}               @ .LM0
1012
1013 #ifdef __ARMEL__
1014         vrev32.8        q7,  q7
1015         vrev32.8        q15, q15
1016 #endif
1017         sub     r5,r5,#1
1018         vstmia  r12!, {q7}              @ save round 0 key
1019         b       .Lkey_loop
1020
1021 .align  4
1022 .Lkey_loop:
1023         vtbl.8  d14,{q15},d28
1024         vtbl.8  d15,{q15},d29
1025         vmov.i8 q6,  #0x40
1026         vmov.i8 q15, #0x80
1027
1028         vtst.8  q0, q7, q8
1029         vtst.8  q1, q7, q9
1030         vtst.8  q2, q7, q10
1031         vtst.8  q3, q7, q11
1032         vtst.8  q4, q7, q12
1033         vtst.8  q5, q7, q13
1034         vtst.8  q6, q7, q6
1035         vtst.8  q7, q7, q15
1036         vld1.8  {q15}, [r4]!            @ load next round key
1037         vmvn    q0, q0          @ "pnot"
1038         vmvn    q1, q1
1039         vmvn    q5, q5
1040         vmvn    q6, q6
1041 #ifdef __ARMEL__
1042         vrev32.8        q15, q15
1043 #endif
1044         subs    r5,r5,#1
1045         vstmia  r12!,{q0-q7}            @ write bit-sliced round key
1046         bne     .Lkey_loop
1047
1048         vmov.i8 q7,#0x63                        @ compose .L63
1049         @ don't save last round key
1050         bx      lr
1051 .size   _bsaes_key_convert,.-_bsaes_key_convert
1052 .extern AES_cbc_encrypt
1053 .extern AES_decrypt
1054
1055 .global bsaes_cbc_encrypt
1056 .hidden bsaes_cbc_encrypt
1057 .type   bsaes_cbc_encrypt,%function
1058 .align  5
1059 bsaes_cbc_encrypt:
1060 #ifndef __KERNEL__
1061         cmp     r2, #128
1062 #ifndef __thumb__
1063         blo     AES_cbc_encrypt
1064 #else
1065         bhs     1f
1066         b       AES_cbc_encrypt
1067 1:
1068 #endif
1069 #endif
1070
1071         @ it is up to the caller to make sure we are called with enc == 0
1072
1073         mov     ip, sp
1074         stmdb   sp!, {r4-r10, lr}
1075         VFP_ABI_PUSH
1076         ldr     r8, [ip]                        @ IV is 1st arg on the stack
1077         mov     r2, r2, lsr#4           @ len in 16 byte blocks
1078         sub     sp, #0x10                       @ scratch space to carry over the IV
1079         mov     r9, sp                          @ save sp
1080
1081         ldr     r10, [r3, #240]         @ get # of rounds
1082 #ifndef BSAES_ASM_EXTENDED_KEY
1083         @ allocate the key schedule on the stack
1084         sub     r12, sp, r10, lsl#7             @ 128 bytes per inner round key
1085         add     r12, #96                        @ sifze of bit-slices key schedule
1086
1087         @ populate the key schedule
1088         mov     r4, r3                  @ pass key
1089         mov     r5, r10                 @ pass # of rounds
1090         mov     sp, r12                         @ sp is sp
1091         bl      _bsaes_key_convert
1092         vldmia  sp, {q6}
1093         vstmia  r12,  {q15}             @ save last round key
1094         veor    q7, q7, q6      @ fix up round 0 key
1095         vstmia  sp, {q7}
1096 #else
1097         ldr     r12, [r3, #244]
1098         eors    r12, #1
1099         beq     0f
1100
1101         @ populate the key schedule
1102         str     r12, [r3, #244]
1103         mov     r4, r3                  @ pass key
1104         mov     r5, r10                 @ pass # of rounds
1105         add     r12, r3, #248                   @ pass key schedule
1106         bl      _bsaes_key_convert
1107         add     r4, r3, #248
1108         vldmia  r4, {q6}
1109         vstmia  r12, {q15}                      @ save last round key
1110         veor    q7, q7, q6      @ fix up round 0 key
1111         vstmia  r4, {q7}
1112
1113 .align  2
1114 0:
1115 #endif
1116
1117         vld1.8  {q15}, [r8]             @ load IV
1118         b       .Lcbc_dec_loop
1119
1120 .align  4
1121 .Lcbc_dec_loop:
1122         subs    r2, r2, #0x8
1123         bmi     .Lcbc_dec_loop_finish
1124
1125         vld1.8  {q0-q1}, [r0]!  @ load input
1126         vld1.8  {q2-q3}, [r0]!
1127 #ifndef BSAES_ASM_EXTENDED_KEY
1128         mov     r4, sp                  @ pass the key
1129 #else
1130         add     r4, r3, #248
1131 #endif
1132         vld1.8  {q4-q5}, [r0]!
1133         mov     r5, r10
1134         vld1.8  {q6-q7}, [r0]
1135         sub     r0, r0, #0x60
1136         vstmia  r9, {q15}                       @ put aside IV
1137
1138         bl      _bsaes_decrypt8
1139
1140         vldmia  r9, {q14}                       @ reload IV
1141         vld1.8  {q8-q9}, [r0]!  @ reload input
1142         veor    q0, q0, q14     @ ^= IV
1143         vld1.8  {q10-q11}, [r0]!
1144         veor    q1, q1, q8
1145         veor    q6, q6, q9
1146         vld1.8  {q12-q13}, [r0]!
1147         veor    q4, q4, q10
1148         veor    q2, q2, q11
1149         vld1.8  {q14-q15}, [r0]!
1150         veor    q7, q7, q12
1151         vst1.8  {q0-q1}, [r1]!  @ write output
1152         veor    q3, q3, q13
1153         vst1.8  {q6}, [r1]!
1154         veor    q5, q5, q14
1155         vst1.8  {q4}, [r1]!
1156         vst1.8  {q2}, [r1]!
1157         vst1.8  {q7}, [r1]!
1158         vst1.8  {q3}, [r1]!
1159         vst1.8  {q5}, [r1]!
1160
1161         b       .Lcbc_dec_loop
1162
1163 .Lcbc_dec_loop_finish:
1164         adds    r2, r2, #8
1165         beq     .Lcbc_dec_done
1166
1167         vld1.8  {q0}, [r0]!             @ load input
1168         cmp     r2, #2
1169         blo     .Lcbc_dec_one
1170         vld1.8  {q1}, [r0]!
1171 #ifndef BSAES_ASM_EXTENDED_KEY
1172         mov     r4, sp                  @ pass the key
1173 #else
1174         add     r4, r3, #248
1175 #endif
1176         mov     r5, r10
1177         vstmia  r9, {q15}                       @ put aside IV
1178         beq     .Lcbc_dec_two
1179         vld1.8  {q2}, [r0]!
1180         cmp     r2, #4
1181         blo     .Lcbc_dec_three
1182         vld1.8  {q3}, [r0]!
1183         beq     .Lcbc_dec_four
1184         vld1.8  {q4}, [r0]!
1185         cmp     r2, #6
1186         blo     .Lcbc_dec_five
1187         vld1.8  {q5}, [r0]!
1188         beq     .Lcbc_dec_six
1189         vld1.8  {q6}, [r0]!
1190         sub     r0, r0, #0x70
1191
1192         bl      _bsaes_decrypt8
1193
1194         vldmia  r9, {q14}                       @ reload IV
1195         vld1.8  {q8-q9}, [r0]!  @ reload input
1196         veor    q0, q0, q14     @ ^= IV
1197         vld1.8  {q10-q11}, [r0]!
1198         veor    q1, q1, q8
1199         veor    q6, q6, q9
1200         vld1.8  {q12-q13}, [r0]!
1201         veor    q4, q4, q10
1202         veor    q2, q2, q11
1203         vld1.8  {q15}, [r0]!
1204         veor    q7, q7, q12
1205         vst1.8  {q0-q1}, [r1]!  @ write output
1206         veor    q3, q3, q13
1207         vst1.8  {q6}, [r1]!
1208         vst1.8  {q4}, [r1]!
1209         vst1.8  {q2}, [r1]!
1210         vst1.8  {q7}, [r1]!
1211         vst1.8  {q3}, [r1]!
1212         b       .Lcbc_dec_done
1213 .align  4
1214 .Lcbc_dec_six:
1215         sub     r0, r0, #0x60
1216         bl      _bsaes_decrypt8
1217         vldmia  r9,{q14}                        @ reload IV
1218         vld1.8  {q8-q9}, [r0]!  @ reload input
1219         veor    q0, q0, q14     @ ^= IV
1220         vld1.8  {q10-q11}, [r0]!
1221         veor    q1, q1, q8
1222         veor    q6, q6, q9
1223         vld1.8  {q12}, [r0]!
1224         veor    q4, q4, q10
1225         veor    q2, q2, q11
1226         vld1.8  {q15}, [r0]!
1227         veor    q7, q7, q12
1228         vst1.8  {q0-q1}, [r1]!  @ write output
1229         vst1.8  {q6}, [r1]!
1230         vst1.8  {q4}, [r1]!
1231         vst1.8  {q2}, [r1]!
1232         vst1.8  {q7}, [r1]!
1233         b       .Lcbc_dec_done
1234 .align  4
1235 .Lcbc_dec_five:
1236         sub     r0, r0, #0x50
1237         bl      _bsaes_decrypt8
1238         vldmia  r9, {q14}                       @ reload IV
1239         vld1.8  {q8-q9}, [r0]!  @ reload input
1240         veor    q0, q0, q14     @ ^= IV
1241         vld1.8  {q10-q11}, [r0]!
1242         veor    q1, q1, q8
1243         veor    q6, q6, q9
1244         vld1.8  {q15}, [r0]!
1245         veor    q4, q4, q10
1246         vst1.8  {q0-q1}, [r1]!  @ write output
1247         veor    q2, q2, q11
1248         vst1.8  {q6}, [r1]!
1249         vst1.8  {q4}, [r1]!
1250         vst1.8  {q2}, [r1]!
1251         b       .Lcbc_dec_done
1252 .align  4
1253 .Lcbc_dec_four:
1254         sub     r0, r0, #0x40
1255         bl      _bsaes_decrypt8
1256         vldmia  r9, {q14}                       @ reload IV
1257         vld1.8  {q8-q9}, [r0]!  @ reload input
1258         veor    q0, q0, q14     @ ^= IV
1259         vld1.8  {q10}, [r0]!
1260         veor    q1, q1, q8
1261         veor    q6, q6, q9
1262         vld1.8  {q15}, [r0]!
1263         veor    q4, q4, q10
1264         vst1.8  {q0-q1}, [r1]!  @ write output
1265         vst1.8  {q6}, [r1]!
1266         vst1.8  {q4}, [r1]!
1267         b       .Lcbc_dec_done
1268 .align  4
1269 .Lcbc_dec_three:
1270         sub     r0, r0, #0x30
1271         bl      _bsaes_decrypt8
1272         vldmia  r9, {q14}                       @ reload IV
1273         vld1.8  {q8-q9}, [r0]!  @ reload input
1274         veor    q0, q0, q14     @ ^= IV
1275         vld1.8  {q15}, [r0]!
1276         veor    q1, q1, q8
1277         veor    q6, q6, q9
1278         vst1.8  {q0-q1}, [r1]!  @ write output
1279         vst1.8  {q6}, [r1]!
1280         b       .Lcbc_dec_done
1281 .align  4
1282 .Lcbc_dec_two:
1283         sub     r0, r0, #0x20
1284         bl      _bsaes_decrypt8
1285         vldmia  r9, {q14}                       @ reload IV
1286         vld1.8  {q8}, [r0]!             @ reload input
1287         veor    q0, q0, q14     @ ^= IV
1288         vld1.8  {q15}, [r0]!            @ reload input
1289         veor    q1, q1, q8
1290         vst1.8  {q0-q1}, [r1]!  @ write output
1291         b       .Lcbc_dec_done
1292 .align  4
1293 .Lcbc_dec_one:
1294         sub     r0, r0, #0x10
1295         mov     r10, r1                 @ save original out pointer
1296         mov     r1, r9                  @ use the iv scratch space as out buffer
1297         mov     r2, r3
1298         vmov    q4,q15          @ just in case ensure that IV
1299         vmov    q5,q0                   @ and input are preserved
1300         bl      AES_decrypt
1301         vld1.8  {q0}, [r9,:64]          @ load result
1302         veor    q0, q0, q4      @ ^= IV
1303         vmov    q15, q5         @ q5 holds input
1304         vst1.8  {q0}, [r10]             @ write output
1305
1306 .Lcbc_dec_done:
1307 #ifndef BSAES_ASM_EXTENDED_KEY
1308         vmov.i32        q0, #0
1309         vmov.i32        q1, #0
1310 .Lcbc_dec_bzero:                                @ wipe key schedule [if any]
1311         vstmia          sp!, {q0-q1}
1312         cmp             sp, r9
1313         bne             .Lcbc_dec_bzero
1314 #endif
1315
1316         mov     sp, r9
1317         add     sp, #0x10                       @ add sp,r9,#0x10 is no good for thumb
1318         vst1.8  {q15}, [r8]             @ return IV
1319         VFP_ABI_POP
1320         ldmia   sp!, {r4-r10, pc}
1321 .size   bsaes_cbc_encrypt,.-bsaes_cbc_encrypt
1322 .extern AES_encrypt
1323 .global bsaes_ctr32_encrypt_blocks
1324 .hidden bsaes_ctr32_encrypt_blocks
1325 .type   bsaes_ctr32_encrypt_blocks,%function
1326 .align  5
1327 bsaes_ctr32_encrypt_blocks:
1328         cmp     r2, #8                  @ use plain AES for
1329         blo     .Lctr_enc_short                 @ small sizes
1330
1331         mov     ip, sp
1332         stmdb   sp!, {r4-r10, lr}
1333         VFP_ABI_PUSH
1334         ldr     r8, [ip]                        @ ctr is 1st arg on the stack
1335         sub     sp, sp, #0x10                   @ scratch space to carry over the ctr
1336         mov     r9, sp                          @ save sp
1337
1338         ldr     r10, [r3, #240]         @ get # of rounds
1339 #ifndef BSAES_ASM_EXTENDED_KEY
1340         @ allocate the key schedule on the stack
1341         sub     r12, sp, r10, lsl#7             @ 128 bytes per inner round key
1342         add     r12, #96                        @ size of bit-sliced key schedule
1343
1344         @ populate the key schedule
1345         mov     r4, r3                  @ pass key
1346         mov     r5, r10                 @ pass # of rounds
1347         mov     sp, r12                         @ sp is sp
1348         bl      _bsaes_key_convert
1349         veor    q7,q7,q15       @ fix up last round key
1350         vstmia  r12, {q7}                       @ save last round key
1351
1352         vld1.8  {q0}, [r8]              @ load counter
1353         add     r8, r6, #.LREVM0SR-.LM0 @ borrow r8
1354         vldmia  sp, {q4}                @ load round0 key
1355 #else
1356         ldr     r12, [r3, #244]
1357         eors    r12, #1
1358         beq     0f
1359
1360         @ populate the key schedule
1361         str     r12, [r3, #244]
1362         mov     r4, r3                  @ pass key
1363         mov     r5, r10                 @ pass # of rounds
1364         add     r12, r3, #248                   @ pass key schedule
1365         bl      _bsaes_key_convert
1366         veor    q7,q7,q15       @ fix up last round key
1367         vstmia  r12, {q7}                       @ save last round key
1368
1369 .align  2
1370 0:      add     r12, r3, #248
1371         vld1.8  {q0}, [r8]              @ load counter
1372         adrl    r8, .LREVM0SR                   @ borrow r8
1373         vldmia  r12, {q4}                       @ load round0 key
1374         sub     sp, #0x10                       @ place for adjusted round0 key
1375 #endif
1376
1377         vmov.i32        q8,#1           @ compose 1<<96
1378         veor            q9,q9,q9
1379         vrev32.8        q0,q0
1380         vext.8          q8,q9,q8,#4
1381         vrev32.8        q4,q4
1382         vadd.u32        q9,q8,q8        @ compose 2<<96
1383         vstmia  sp, {q4}                @ save adjusted round0 key
1384         b       .Lctr_enc_loop
1385
1386 .align  4
1387 .Lctr_enc_loop:
1388         vadd.u32        q10, q8, q9     @ compose 3<<96
1389         vadd.u32        q1, q0, q8      @ +1
1390         vadd.u32        q2, q0, q9      @ +2
1391         vadd.u32        q3, q0, q10     @ +3
1392         vadd.u32        q4, q1, q10
1393         vadd.u32        q5, q2, q10
1394         vadd.u32        q6, q3, q10
1395         vadd.u32        q7, q4, q10
1396         vadd.u32        q10, q5, q10    @ next counter
1397
1398         @ Borrow prologue from _bsaes_encrypt8 to use the opportunity
1399         @ to flip byte order in 32-bit counter
1400
1401         vldmia          sp, {q9}                @ load round0 key
1402 #ifndef BSAES_ASM_EXTENDED_KEY
1403         add             r4, sp, #0x10           @ pass next round key
1404 #else
1405         add             r4, r3, #264
1406 #endif
1407         vldmia          r8, {q8}                        @ .LREVM0SR
1408         mov             r5, r10                 @ pass rounds
1409         vstmia          r9, {q10}                       @ save next counter
1410         sub             r6, r8, #.LREVM0SR-.LSR @ pass constants
1411
1412         bl              _bsaes_encrypt8_alt
1413
1414         subs            r2, r2, #8
1415         blo             .Lctr_enc_loop_done
1416
1417         vld1.8          {q8-q9}, [r0]!  @ load input
1418         vld1.8          {q10-q11}, [r0]!
1419         veor            q0, q8
1420         veor            q1, q9
1421         vld1.8          {q12-q13}, [r0]!
1422         veor            q4, q10
1423         veor            q6, q11
1424         vld1.8          {q14-q15}, [r0]!
1425         veor            q3, q12
1426         vst1.8          {q0-q1}, [r1]!  @ write output
1427         veor            q7, q13
1428         veor            q2, q14
1429         vst1.8          {q4}, [r1]!
1430         veor            q5, q15
1431         vst1.8          {q6}, [r1]!
1432         vmov.i32        q8, #1                  @ compose 1<<96
1433         vst1.8          {q3}, [r1]!
1434         veor            q9, q9, q9
1435         vst1.8          {q7}, [r1]!
1436         vext.8          q8, q9, q8, #4
1437         vst1.8          {q2}, [r1]!
1438         vadd.u32        q9,q8,q8                @ compose 2<<96
1439         vst1.8          {q5}, [r1]!
1440         vldmia          r9, {q0}                        @ load counter
1441
1442         bne             .Lctr_enc_loop
1443         b               .Lctr_enc_done
1444
1445 .align  4
1446 .Lctr_enc_loop_done:
1447         add             r2, r2, #8
1448         vld1.8          {q8}, [r0]!     @ load input
1449         veor            q0, q8
1450         vst1.8          {q0}, [r1]!     @ write output
1451         cmp             r2, #2
1452         blo             .Lctr_enc_done
1453         vld1.8          {q9}, [r0]!
1454         veor            q1, q9
1455         vst1.8          {q1}, [r1]!
1456         beq             .Lctr_enc_done
1457         vld1.8          {q10}, [r0]!
1458         veor            q4, q10
1459         vst1.8          {q4}, [r1]!
1460         cmp             r2, #4
1461         blo             .Lctr_enc_done
1462         vld1.8          {q11}, [r0]!
1463         veor            q6, q11
1464         vst1.8          {q6}, [r1]!
1465         beq             .Lctr_enc_done
1466         vld1.8          {q12}, [r0]!
1467         veor            q3, q12
1468         vst1.8          {q3}, [r1]!
1469         cmp             r2, #6
1470         blo             .Lctr_enc_done
1471         vld1.8          {q13}, [r0]!
1472         veor            q7, q13
1473         vst1.8          {q7}, [r1]!
1474         beq             .Lctr_enc_done
1475         vld1.8          {q14}, [r0]
1476         veor            q2, q14
1477         vst1.8          {q2}, [r1]!
1478
1479 .Lctr_enc_done:
1480         vmov.i32        q0, #0
1481         vmov.i32        q1, #0
1482 #ifndef BSAES_ASM_EXTENDED_KEY
1483 .Lctr_enc_bzero:                        @ wipe key schedule [if any]
1484         vstmia          sp!, {q0-q1}
1485         cmp             sp, r9
1486         bne             .Lctr_enc_bzero
1487 #else
1488         vstmia          sp, {q0-q1}
1489 #endif
1490
1491         mov     sp, r9
1492         add     sp, #0x10               @ add sp,r9,#0x10 is no good for thumb
1493         VFP_ABI_POP
1494         ldmia   sp!, {r4-r10, pc}       @ return
1495
1496 .align  4
1497 .Lctr_enc_short:
1498         ldr     ip, [sp]                @ ctr pointer is passed on stack
1499         stmdb   sp!, {r4-r8, lr}
1500
1501         mov     r4, r0          @ copy arguments
1502         mov     r5, r1
1503         mov     r6, r2
1504         mov     r7, r3
1505         ldr     r8, [ip, #12]           @ load counter LSW
1506         vld1.8  {q1}, [ip]              @ load whole counter value
1507 #ifdef __ARMEL__
1508         rev     r8, r8
1509 #endif
1510         sub     sp, sp, #0x10
1511         vst1.8  {q1}, [sp,:64]  @ copy counter value
1512         sub     sp, sp, #0x10
1513
1514 .Lctr_enc_short_loop:
1515         add     r0, sp, #0x10           @ input counter value
1516         mov     r1, sp                  @ output on the stack
1517         mov     r2, r7                  @ key
1518
1519         bl      AES_encrypt
1520
1521         vld1.8  {q0}, [r4]!     @ load input
1522         vld1.8  {q1}, [sp,:64]  @ load encrypted counter
1523         add     r8, r8, #1
1524 #ifdef __ARMEL__
1525         rev     r0, r8
1526         str     r0, [sp, #0x1c]         @ next counter value
1527 #else
1528         str     r8, [sp, #0x1c]         @ next counter value
1529 #endif
1530         veor    q0,q0,q1
1531         vst1.8  {q0}, [r5]!     @ store output
1532         subs    r6, r6, #1
1533         bne     .Lctr_enc_short_loop
1534
1535         vmov.i32        q0, #0
1536         vmov.i32        q1, #0
1537         vstmia          sp!, {q0-q1}
1538
1539         ldmia   sp!, {r4-r8, pc}
1540 .size   bsaes_ctr32_encrypt_blocks,.-bsaes_ctr32_encrypt_blocks
1541 .globl  bsaes_xts_encrypt
1542 .hidden bsaes_xts_encrypt
1543 .type   bsaes_xts_encrypt,%function
1544 .align  4
1545 bsaes_xts_encrypt:
1546         mov     ip, sp
1547         stmdb   sp!, {r4-r10, lr}               @ 0x20
1548         VFP_ABI_PUSH
1549         mov     r6, sp                          @ future r3
1550
1551         mov     r7, r0
1552         mov     r8, r1
1553         mov     r9, r2
1554         mov     r10, r3
1555
1556         sub     r0, sp, #0x10                   @ 0x10
1557         bic     r0, #0xf                        @ align at 16 bytes
1558         mov     sp, r0
1559
1560 #ifdef  XTS_CHAIN_TWEAK
1561         ldr     r0, [ip]                        @ pointer to input tweak
1562 #else
1563         @ generate initial tweak
1564         ldr     r0, [ip, #4]                    @ iv[]
1565         mov     r1, sp
1566         ldr     r2, [ip, #0]                    @ key2
1567         bl      AES_encrypt
1568         mov     r0,sp                           @ pointer to initial tweak
1569 #endif
1570
1571         ldr     r1, [r10, #240]         @ get # of rounds
1572         mov     r3, r6
1573 #ifndef BSAES_ASM_EXTENDED_KEY
1574         @ allocate the key schedule on the stack
1575         sub     r12, sp, r1, lsl#7              @ 128 bytes per inner round key
1576         @ add   r12, #96                        @ size of bit-sliced key schedule
1577         sub     r12, #48                        @ place for tweak[9]
1578
1579         @ populate the key schedule
1580         mov     r4, r10                 @ pass key
1581         mov     r5, r1                  @ pass # of rounds
1582         mov     sp, r12
1583         add     r12, #0x90                      @ pass key schedule
1584         bl      _bsaes_key_convert
1585         veor    q7, q7, q15     @ fix up last round key
1586         vstmia  r12, {q7}                       @ save last round key
1587 #else
1588         ldr     r12, [r10, #244]
1589         eors    r12, #1
1590         beq     0f
1591
1592         str     r12, [r10, #244]
1593         mov     r4, r10                 @ pass key
1594         mov     r5, r1                  @ pass # of rounds
1595         add     r12, r10, #248                  @ pass key schedule
1596         bl      _bsaes_key_convert
1597         veor    q7, q7, q15     @ fix up last round key
1598         vstmia  r12, {q7}
1599
1600 .align  2
1601 0:      sub     sp, #0x90                       @ place for tweak[9]
1602 #endif
1603
1604         vld1.8  {q8}, [r0]                      @ initial tweak
1605         adr     r2, .Lxts_magic
1606
1607         subs    r9, #0x80
1608         blo     .Lxts_enc_short
1609         b       .Lxts_enc_loop
1610
1611 .align  4
1612 .Lxts_enc_loop:
1613         vldmia          r2, {q5}        @ load XTS magic
1614         vshr.s64        q6, q8, #63
1615         mov             r0, sp
1616         vand            q6, q6, q5
1617         vadd.u64        q9, q8, q8
1618         vst1.64         {q8}, [r0,:128]!
1619         vswp            d13,d12
1620         vshr.s64        q7, q9, #63
1621         veor            q9, q9, q6
1622         vand            q7, q7, q5
1623         vadd.u64        q10, q9, q9
1624         vst1.64         {q9}, [r0,:128]!
1625         vswp            d15,d14
1626         vshr.s64        q6, q10, #63
1627         veor            q10, q10, q7
1628         vand            q6, q6, q5
1629         vld1.8          {q0}, [r7]!
1630         vadd.u64        q11, q10, q10
1631         vst1.64         {q10}, [r0,:128]!
1632         vswp            d13,d12
1633         vshr.s64        q7, q11, #63
1634         veor            q11, q11, q6
1635         vand            q7, q7, q5
1636         vld1.8          {q1}, [r7]!
1637         veor            q0, q0, q8
1638         vadd.u64        q12, q11, q11
1639         vst1.64         {q11}, [r0,:128]!
1640         vswp            d15,d14
1641         vshr.s64        q6, q12, #63
1642         veor            q12, q12, q7
1643         vand            q6, q6, q5
1644         vld1.8          {q2}, [r7]!
1645         veor            q1, q1, q9
1646         vadd.u64        q13, q12, q12
1647         vst1.64         {q12}, [r0,:128]!
1648         vswp            d13,d12
1649         vshr.s64        q7, q13, #63
1650         veor            q13, q13, q6
1651         vand            q7, q7, q5
1652         vld1.8          {q3}, [r7]!
1653         veor            q2, q2, q10
1654         vadd.u64        q14, q13, q13
1655         vst1.64         {q13}, [r0,:128]!
1656         vswp            d15,d14
1657         vshr.s64        q6, q14, #63
1658         veor            q14, q14, q7
1659         vand            q6, q6, q5
1660         vld1.8          {q4}, [r7]!
1661         veor            q3, q3, q11
1662         vadd.u64        q15, q14, q14
1663         vst1.64         {q14}, [r0,:128]!
1664         vswp            d13,d12
1665         vshr.s64        q7, q15, #63
1666         veor            q15, q15, q6
1667         vand            q7, q7, q5
1668         vld1.8          {q5}, [r7]!
1669         veor            q4, q4, q12
1670         vadd.u64        q8, q15, q15
1671         vst1.64         {q15}, [r0,:128]!
1672         vswp            d15,d14
1673         veor            q8, q8, q7
1674         vst1.64         {q8}, [r0,:128]         @ next round tweak
1675
1676         vld1.8          {q6-q7}, [r7]!
1677         veor            q5, q5, q13
1678 #ifndef BSAES_ASM_EXTENDED_KEY
1679         add             r4, sp, #0x90                   @ pass key schedule
1680 #else
1681         add             r4, r10, #248                   @ pass key schedule
1682 #endif
1683         veor            q6, q6, q14
1684         mov             r5, r1                  @ pass rounds
1685         veor            q7, q7, q15
1686         mov             r0, sp
1687
1688         bl              _bsaes_encrypt8
1689
1690         vld1.64         {q8-q9}, [r0,:128]!
1691         vld1.64         {q10-q11}, [r0,:128]!
1692         veor            q0, q0, q8
1693         vld1.64         {q12-q13}, [r0,:128]!
1694         veor            q1, q1, q9
1695         veor            q8, q4, q10
1696         vst1.8          {q0-q1}, [r8]!
1697         veor            q9, q6, q11
1698         vld1.64         {q14-q15}, [r0,:128]!
1699         veor            q10, q3, q12
1700         vst1.8          {q8-q9}, [r8]!
1701         veor            q11, q7, q13
1702         veor            q12, q2, q14
1703         vst1.8          {q10-q11}, [r8]!
1704         veor            q13, q5, q15
1705         vst1.8          {q12-q13}, [r8]!
1706
1707         vld1.64         {q8}, [r0,:128]         @ next round tweak
1708
1709         subs            r9, #0x80
1710         bpl             .Lxts_enc_loop
1711
1712 .Lxts_enc_short:
1713         adds            r9, #0x70
1714         bmi             .Lxts_enc_done
1715
1716         vldmia          r2, {q5}        @ load XTS magic
1717         vshr.s64        q7, q8, #63
1718         mov             r0, sp
1719         vand            q7, q7, q5
1720         vadd.u64        q9, q8, q8
1721         vst1.64         {q8}, [r0,:128]!
1722         vswp            d15,d14
1723         vshr.s64        q6, q9, #63
1724         veor            q9, q9, q7
1725         vand            q6, q6, q5
1726         vadd.u64        q10, q9, q9
1727         vst1.64         {q9}, [r0,:128]!
1728         vswp            d13,d12
1729         vshr.s64        q7, q10, #63
1730         veor            q10, q10, q6
1731         vand            q7, q7, q5
1732         vld1.8          {q0}, [r7]!
1733         subs            r9, #0x10
1734         bmi             .Lxts_enc_1
1735         vadd.u64        q11, q10, q10
1736         vst1.64         {q10}, [r0,:128]!
1737         vswp            d15,d14
1738         vshr.s64        q6, q11, #63
1739         veor            q11, q11, q7
1740         vand            q6, q6, q5
1741         vld1.8          {q1}, [r7]!
1742         subs            r9, #0x10
1743         bmi             .Lxts_enc_2
1744         veor            q0, q0, q8
1745         vadd.u64        q12, q11, q11
1746         vst1.64         {q11}, [r0,:128]!
1747         vswp            d13,d12
1748         vshr.s64        q7, q12, #63
1749         veor            q12, q12, q6
1750         vand            q7, q7, q5
1751         vld1.8          {q2}, [r7]!
1752         subs            r9, #0x10
1753         bmi             .Lxts_enc_3
1754         veor            q1, q1, q9
1755         vadd.u64        q13, q12, q12
1756         vst1.64         {q12}, [r0,:128]!
1757         vswp            d15,d14
1758         vshr.s64        q6, q13, #63
1759         veor            q13, q13, q7
1760         vand            q6, q6, q5
1761         vld1.8          {q3}, [r7]!
1762         subs            r9, #0x10
1763         bmi             .Lxts_enc_4
1764         veor            q2, q2, q10
1765         vadd.u64        q14, q13, q13
1766         vst1.64         {q13}, [r0,:128]!
1767         vswp            d13,d12
1768         vshr.s64        q7, q14, #63
1769         veor            q14, q14, q6
1770         vand            q7, q7, q5
1771         vld1.8          {q4}, [r7]!
1772         subs            r9, #0x10
1773         bmi             .Lxts_enc_5
1774         veor            q3, q3, q11
1775         vadd.u64        q15, q14, q14
1776         vst1.64         {q14}, [r0,:128]!
1777         vswp            d15,d14
1778         vshr.s64        q6, q15, #63
1779         veor            q15, q15, q7
1780         vand            q6, q6, q5
1781         vld1.8          {q5}, [r7]!
1782         subs            r9, #0x10
1783         bmi             .Lxts_enc_6
1784         veor            q4, q4, q12
1785         sub             r9, #0x10
1786         vst1.64         {q15}, [r0,:128]                @ next round tweak
1787
1788         vld1.8          {q6}, [r7]!
1789         veor            q5, q5, q13
1790 #ifndef BSAES_ASM_EXTENDED_KEY
1791         add             r4, sp, #0x90                   @ pass key schedule
1792 #else
1793         add             r4, r10, #248                   @ pass key schedule
1794 #endif
1795         veor            q6, q6, q14
1796         mov             r5, r1                  @ pass rounds
1797         mov             r0, sp
1798
1799         bl              _bsaes_encrypt8
1800
1801         vld1.64         {q8-q9}, [r0,:128]!
1802         vld1.64         {q10-q11}, [r0,:128]!
1803         veor            q0, q0, q8
1804         vld1.64         {q12-q13}, [r0,:128]!
1805         veor            q1, q1, q9
1806         veor            q8, q4, q10
1807         vst1.8          {q0-q1}, [r8]!
1808         veor            q9, q6, q11
1809         vld1.64         {q14}, [r0,:128]!
1810         veor            q10, q3, q12
1811         vst1.8          {q8-q9}, [r8]!
1812         veor            q11, q7, q13
1813         veor            q12, q2, q14
1814         vst1.8          {q10-q11}, [r8]!
1815         vst1.8          {q12}, [r8]!
1816
1817         vld1.64         {q8}, [r0,:128]         @ next round tweak
1818         b               .Lxts_enc_done
1819 .align  4
1820 .Lxts_enc_6:
1821         vst1.64         {q14}, [r0,:128]                @ next round tweak
1822
1823         veor            q4, q4, q12
1824 #ifndef BSAES_ASM_EXTENDED_KEY
1825         add             r4, sp, #0x90                   @ pass key schedule
1826 #else
1827         add             r4, r10, #248                   @ pass key schedule
1828 #endif
1829         veor            q5, q5, q13
1830         mov             r5, r1                  @ pass rounds
1831         mov             r0, sp
1832
1833         bl              _bsaes_encrypt8
1834
1835         vld1.64         {q8-q9}, [r0,:128]!
1836         vld1.64         {q10-q11}, [r0,:128]!
1837         veor            q0, q0, q8
1838         vld1.64         {q12-q13}, [r0,:128]!
1839         veor            q1, q1, q9
1840         veor            q8, q4, q10
1841         vst1.8          {q0-q1}, [r8]!
1842         veor            q9, q6, q11
1843         veor            q10, q3, q12
1844         vst1.8          {q8-q9}, [r8]!
1845         veor            q11, q7, q13
1846         vst1.8          {q10-q11}, [r8]!
1847
1848         vld1.64         {q8}, [r0,:128]         @ next round tweak
1849         b               .Lxts_enc_done
1850
1851 @ put this in range for both ARM and Thumb mode adr instructions
1852 .align  5
1853 .Lxts_magic:
1854         .quad   1, 0x87
1855
1856 .align  5
1857 .Lxts_enc_5:
1858         vst1.64         {q13}, [r0,:128]                @ next round tweak
1859
1860         veor            q3, q3, q11
1861 #ifndef BSAES_ASM_EXTENDED_KEY
1862         add             r4, sp, #0x90                   @ pass key schedule
1863 #else
1864         add             r4, r10, #248                   @ pass key schedule
1865 #endif
1866         veor            q4, q4, q12
1867         mov             r5, r1                  @ pass rounds
1868         mov             r0, sp
1869
1870         bl              _bsaes_encrypt8
1871
1872         vld1.64         {q8-q9}, [r0,:128]!
1873         vld1.64         {q10-q11}, [r0,:128]!
1874         veor            q0, q0, q8
1875         vld1.64         {q12}, [r0,:128]!
1876         veor            q1, q1, q9
1877         veor            q8, q4, q10
1878         vst1.8          {q0-q1}, [r8]!
1879         veor            q9, q6, q11
1880         veor            q10, q3, q12
1881         vst1.8          {q8-q9}, [r8]!
1882         vst1.8          {q10}, [r8]!
1883
1884         vld1.64         {q8}, [r0,:128]         @ next round tweak
1885         b               .Lxts_enc_done
1886 .align  4
1887 .Lxts_enc_4:
1888         vst1.64         {q12}, [r0,:128]                @ next round tweak
1889
1890         veor            q2, q2, q10
1891 #ifndef BSAES_ASM_EXTENDED_KEY
1892         add             r4, sp, #0x90                   @ pass key schedule
1893 #else
1894         add             r4, r10, #248                   @ pass key schedule
1895 #endif
1896         veor            q3, q3, q11
1897         mov             r5, r1                  @ pass rounds
1898         mov             r0, sp
1899
1900         bl              _bsaes_encrypt8
1901
1902         vld1.64         {q8-q9}, [r0,:128]!
1903         vld1.64         {q10-q11}, [r0,:128]!
1904         veor            q0, q0, q8
1905         veor            q1, q1, q9
1906         veor            q8, q4, q10
1907         vst1.8          {q0-q1}, [r8]!
1908         veor            q9, q6, q11
1909         vst1.8          {q8-q9}, [r8]!
1910
1911         vld1.64         {q8}, [r0,:128]         @ next round tweak
1912         b               .Lxts_enc_done
1913 .align  4
1914 .Lxts_enc_3:
1915         vst1.64         {q11}, [r0,:128]                @ next round tweak
1916
1917         veor            q1, q1, q9
1918 #ifndef BSAES_ASM_EXTENDED_KEY
1919         add             r4, sp, #0x90                   @ pass key schedule
1920 #else
1921         add             r4, r10, #248                   @ pass key schedule
1922 #endif
1923         veor            q2, q2, q10
1924         mov             r5, r1                  @ pass rounds
1925         mov             r0, sp
1926
1927         bl              _bsaes_encrypt8
1928
1929         vld1.64         {q8-q9}, [r0,:128]!
1930         vld1.64         {q10}, [r0,:128]!
1931         veor            q0, q0, q8
1932         veor            q1, q1, q9
1933         veor            q8, q4, q10
1934         vst1.8          {q0-q1}, [r8]!
1935         vst1.8          {q8}, [r8]!
1936
1937         vld1.64         {q8}, [r0,:128]         @ next round tweak
1938         b               .Lxts_enc_done
1939 .align  4
1940 .Lxts_enc_2:
1941         vst1.64         {q10}, [r0,:128]                @ next round tweak
1942
1943         veor            q0, q0, q8
1944 #ifndef BSAES_ASM_EXTENDED_KEY
1945         add             r4, sp, #0x90                   @ pass key schedule
1946 #else
1947         add             r4, r10, #248                   @ pass key schedule
1948 #endif
1949         veor            q1, q1, q9
1950         mov             r5, r1                  @ pass rounds
1951         mov             r0, sp
1952
1953         bl              _bsaes_encrypt8
1954
1955         vld1.64         {q8-q9}, [r0,:128]!
1956         veor            q0, q0, q8
1957         veor            q1, q1, q9
1958         vst1.8          {q0-q1}, [r8]!
1959
1960         vld1.64         {q8}, [r0,:128]         @ next round tweak
1961         b               .Lxts_enc_done
1962 .align  4
1963 .Lxts_enc_1:
1964         mov             r0, sp
1965         veor            q0, q8
1966         mov             r1, sp
1967         vst1.8          {q0}, [sp,:128]
1968         mov             r2, r10
1969         mov             r4, r3                          @ preserve fp
1970
1971         bl              AES_encrypt
1972
1973         vld1.8          {q0}, [sp,:128]
1974         veor            q0, q0, q8
1975         vst1.8          {q0}, [r8]!
1976         mov             r3, r4
1977
1978         vmov            q8, q9          @ next round tweak
1979
1980 .Lxts_enc_done:
1981 #ifndef XTS_CHAIN_TWEAK
1982         adds            r9, #0x10
1983         beq             .Lxts_enc_ret
1984         sub             r6, r8, #0x10
1985
1986 .Lxts_enc_steal:
1987         ldrb            r0, [r7], #1
1988         ldrb            r1, [r8, #-0x10]
1989         strb            r0, [r8, #-0x10]
1990         strb            r1, [r8], #1
1991
1992         subs            r9, #1
1993         bhi             .Lxts_enc_steal
1994
1995         vld1.8          {q0}, [r6]
1996         mov             r0, sp
1997         veor            q0, q0, q8
1998         mov             r1, sp
1999         vst1.8          {q0}, [sp,:128]
2000         mov             r2, r10
2001         mov             r4, r3                  @ preserve fp
2002
2003         bl              AES_encrypt
2004
2005         vld1.8          {q0}, [sp,:128]
2006         veor            q0, q0, q8
2007         vst1.8          {q0}, [r6]
2008         mov             r3, r4
2009 #endif
2010
2011 .Lxts_enc_ret:
2012         bic             r0, r3, #0xf
2013         vmov.i32        q0, #0
2014         vmov.i32        q1, #0
2015 #ifdef  XTS_CHAIN_TWEAK
2016         ldr             r1, [r3, #0x20+VFP_ABI_FRAME]   @ chain tweak
2017 #endif
2018 .Lxts_enc_bzero:                                @ wipe key schedule [if any]
2019         vstmia          sp!, {q0-q1}
2020         cmp             sp, r0
2021         bne             .Lxts_enc_bzero
2022
2023         mov             sp, r3
2024 #ifdef  XTS_CHAIN_TWEAK
2025         vst1.8          {q8}, [r1]
2026 #endif
2027         VFP_ABI_POP
2028         ldmia           sp!, {r4-r10, pc}       @ return
2029
2030 .size   bsaes_xts_encrypt,.-bsaes_xts_encrypt
2031
2032 .globl  bsaes_xts_decrypt
2033 .hidden bsaes_xts_decrypt
2034 .type   bsaes_xts_decrypt,%function
2035 .align  4
2036 bsaes_xts_decrypt:
2037         mov     ip, sp
2038         stmdb   sp!, {r4-r10, lr}               @ 0x20
2039         VFP_ABI_PUSH
2040         mov     r6, sp                          @ future r3
2041
2042         mov     r7, r0
2043         mov     r8, r1
2044         mov     r9, r2
2045         mov     r10, r3
2046
2047         sub     r0, sp, #0x10                   @ 0x10
2048         bic     r0, #0xf                        @ align at 16 bytes
2049         mov     sp, r0
2050
2051 #ifdef  XTS_CHAIN_TWEAK
2052         ldr     r0, [ip]                        @ pointer to input tweak
2053 #else
2054         @ generate initial tweak
2055         ldr     r0, [ip, #4]                    @ iv[]
2056         mov     r1, sp
2057         ldr     r2, [ip, #0]                    @ key2
2058         bl      AES_encrypt
2059         mov     r0, sp                          @ pointer to initial tweak
2060 #endif
2061
2062         ldr     r1, [r10, #240]         @ get # of rounds
2063         mov     r3, r6
2064 #ifndef BSAES_ASM_EXTENDED_KEY
2065         @ allocate the key schedule on the stack
2066         sub     r12, sp, r1, lsl#7              @ 128 bytes per inner round key
2067         @ add   r12, #96                        @ size of bit-sliced key schedule
2068         sub     r12, #48                        @ place for tweak[9]
2069
2070         @ populate the key schedule
2071         mov     r4, r10                 @ pass key
2072         mov     r5, r1                  @ pass # of rounds
2073         mov     sp, r12
2074         add     r12, #0x90                      @ pass key schedule
2075         bl      _bsaes_key_convert
2076         add     r4, sp, #0x90
2077         vldmia  r4, {q6}
2078         vstmia  r12,  {q15}             @ save last round key
2079         veor    q7, q7, q6      @ fix up round 0 key
2080         vstmia  r4, {q7}
2081 #else
2082         ldr     r12, [r10, #244]
2083         eors    r12, #1
2084         beq     0f
2085
2086         str     r12, [r10, #244]
2087         mov     r4, r10                 @ pass key
2088         mov     r5, r1                  @ pass # of rounds
2089         add     r12, r10, #248                  @ pass key schedule
2090         bl      _bsaes_key_convert
2091         add     r4, r10, #248
2092         vldmia  r4, {q6}
2093         vstmia  r12,  {q15}             @ save last round key
2094         veor    q7, q7, q6      @ fix up round 0 key
2095         vstmia  r4, {q7}
2096
2097 .align  2
2098 0:      sub     sp, #0x90                       @ place for tweak[9]
2099 #endif
2100         vld1.8  {q8}, [r0]                      @ initial tweak
2101         adr     r2, .Lxts_magic
2102
2103         tst     r9, #0xf                        @ if not multiple of 16
2104         it      ne                              @ Thumb2 thing, sanity check in ARM
2105         subne   r9, #0x10                       @ subtract another 16 bytes
2106         subs    r9, #0x80
2107
2108         blo     .Lxts_dec_short
2109         b       .Lxts_dec_loop
2110
2111 .align  4
2112 .Lxts_dec_loop:
2113         vldmia          r2, {q5}        @ load XTS magic
2114         vshr.s64        q6, q8, #63
2115         mov             r0, sp
2116         vand            q6, q6, q5
2117         vadd.u64        q9, q8, q8
2118         vst1.64         {q8}, [r0,:128]!
2119         vswp            d13,d12
2120         vshr.s64        q7, q9, #63
2121         veor            q9, q9, q6
2122         vand            q7, q7, q5
2123         vadd.u64        q10, q9, q9
2124         vst1.64         {q9}, [r0,:128]!
2125         vswp            d15,d14
2126         vshr.s64        q6, q10, #63
2127         veor            q10, q10, q7
2128         vand            q6, q6, q5
2129         vld1.8          {q0}, [r7]!
2130         vadd.u64        q11, q10, q10
2131         vst1.64         {q10}, [r0,:128]!
2132         vswp            d13,d12
2133         vshr.s64        q7, q11, #63
2134         veor            q11, q11, q6
2135         vand            q7, q7, q5
2136         vld1.8          {q1}, [r7]!
2137         veor            q0, q0, q8
2138         vadd.u64        q12, q11, q11
2139         vst1.64         {q11}, [r0,:128]!
2140         vswp            d15,d14
2141         vshr.s64        q6, q12, #63
2142         veor            q12, q12, q7
2143         vand            q6, q6, q5
2144         vld1.8          {q2}, [r7]!
2145         veor            q1, q1, q9
2146         vadd.u64        q13, q12, q12
2147         vst1.64         {q12}, [r0,:128]!
2148         vswp            d13,d12
2149         vshr.s64        q7, q13, #63
2150         veor            q13, q13, q6
2151         vand            q7, q7, q5
2152         vld1.8          {q3}, [r7]!
2153         veor            q2, q2, q10
2154         vadd.u64        q14, q13, q13
2155         vst1.64         {q13}, [r0,:128]!
2156         vswp            d15,d14
2157         vshr.s64        q6, q14, #63
2158         veor            q14, q14, q7
2159         vand            q6, q6, q5
2160         vld1.8          {q4}, [r7]!
2161         veor            q3, q3, q11
2162         vadd.u64        q15, q14, q14
2163         vst1.64         {q14}, [r0,:128]!
2164         vswp            d13,d12
2165         vshr.s64        q7, q15, #63
2166         veor            q15, q15, q6
2167         vand            q7, q7, q5
2168         vld1.8          {q5}, [r7]!
2169         veor            q4, q4, q12
2170         vadd.u64        q8, q15, q15
2171         vst1.64         {q15}, [r0,:128]!
2172         vswp            d15,d14
2173         veor            q8, q8, q7
2174         vst1.64         {q8}, [r0,:128]         @ next round tweak
2175
2176         vld1.8          {q6-q7}, [r7]!
2177         veor            q5, q5, q13
2178 #ifndef BSAES_ASM_EXTENDED_KEY
2179         add             r4, sp, #0x90                   @ pass key schedule
2180 #else
2181         add             r4, r10, #248                   @ pass key schedule
2182 #endif
2183         veor            q6, q6, q14
2184         mov             r5, r1                  @ pass rounds
2185         veor            q7, q7, q15
2186         mov             r0, sp
2187
2188         bl              _bsaes_decrypt8
2189
2190         vld1.64         {q8-q9}, [r0,:128]!
2191         vld1.64         {q10-q11}, [r0,:128]!
2192         veor            q0, q0, q8
2193         vld1.64         {q12-q13}, [r0,:128]!
2194         veor            q1, q1, q9
2195         veor            q8, q6, q10
2196         vst1.8          {q0-q1}, [r8]!
2197         veor            q9, q4, q11
2198         vld1.64         {q14-q15}, [r0,:128]!
2199         veor            q10, q2, q12
2200         vst1.8          {q8-q9}, [r8]!
2201         veor            q11, q7, q13
2202         veor            q12, q3, q14
2203         vst1.8          {q10-q11}, [r8]!
2204         veor            q13, q5, q15
2205         vst1.8          {q12-q13}, [r8]!
2206
2207         vld1.64         {q8}, [r0,:128]         @ next round tweak
2208
2209         subs            r9, #0x80
2210         bpl             .Lxts_dec_loop
2211
2212 .Lxts_dec_short:
2213         adds            r9, #0x70
2214         bmi             .Lxts_dec_done
2215
2216         vldmia          r2, {q5}        @ load XTS magic
2217         vshr.s64        q7, q8, #63
2218         mov             r0, sp
2219         vand            q7, q7, q5
2220         vadd.u64        q9, q8, q8
2221         vst1.64         {q8}, [r0,:128]!
2222         vswp            d15,d14
2223         vshr.s64        q6, q9, #63
2224         veor            q9, q9, q7
2225         vand            q6, q6, q5
2226         vadd.u64        q10, q9, q9
2227         vst1.64         {q9}, [r0,:128]!
2228         vswp            d13,d12
2229         vshr.s64        q7, q10, #63
2230         veor            q10, q10, q6
2231         vand            q7, q7, q5
2232         vld1.8          {q0}, [r7]!
2233         subs            r9, #0x10
2234         bmi             .Lxts_dec_1
2235         vadd.u64        q11, q10, q10
2236         vst1.64         {q10}, [r0,:128]!
2237         vswp            d15,d14
2238         vshr.s64        q6, q11, #63
2239         veor            q11, q11, q7
2240         vand            q6, q6, q5
2241         vld1.8          {q1}, [r7]!
2242         subs            r9, #0x10
2243         bmi             .Lxts_dec_2
2244         veor            q0, q0, q8
2245         vadd.u64        q12, q11, q11
2246         vst1.64         {q11}, [r0,:128]!
2247         vswp            d13,d12
2248         vshr.s64        q7, q12, #63
2249         veor            q12, q12, q6
2250         vand            q7, q7, q5
2251         vld1.8          {q2}, [r7]!
2252         subs            r9, #0x10
2253         bmi             .Lxts_dec_3
2254         veor            q1, q1, q9
2255         vadd.u64        q13, q12, q12
2256         vst1.64         {q12}, [r0,:128]!
2257         vswp            d15,d14
2258         vshr.s64        q6, q13, #63
2259         veor            q13, q13, q7
2260         vand            q6, q6, q5
2261         vld1.8          {q3}, [r7]!
2262         subs            r9, #0x10
2263         bmi             .Lxts_dec_4
2264         veor            q2, q2, q10
2265         vadd.u64        q14, q13, q13
2266         vst1.64         {q13}, [r0,:128]!
2267         vswp            d13,d12
2268         vshr.s64        q7, q14, #63
2269         veor            q14, q14, q6
2270         vand            q7, q7, q5
2271         vld1.8          {q4}, [r7]!
2272         subs            r9, #0x10
2273         bmi             .Lxts_dec_5
2274         veor            q3, q3, q11
2275         vadd.u64        q15, q14, q14
2276         vst1.64         {q14}, [r0,:128]!
2277         vswp            d15,d14
2278         vshr.s64        q6, q15, #63
2279         veor            q15, q15, q7
2280         vand            q6, q6, q5
2281         vld1.8          {q5}, [r7]!
2282         subs            r9, #0x10
2283         bmi             .Lxts_dec_6
2284         veor            q4, q4, q12
2285         sub             r9, #0x10
2286         vst1.64         {q15}, [r0,:128]                @ next round tweak
2287
2288         vld1.8          {q6}, [r7]!
2289         veor            q5, q5, q13
2290 #ifndef BSAES_ASM_EXTENDED_KEY
2291         add             r4, sp, #0x90                   @ pass key schedule
2292 #else
2293         add             r4, r10, #248                   @ pass key schedule
2294 #endif
2295         veor            q6, q6, q14
2296         mov             r5, r1                  @ pass rounds
2297         mov             r0, sp
2298
2299         bl              _bsaes_decrypt8
2300
2301         vld1.64         {q8-q9}, [r0,:128]!
2302         vld1.64         {q10-q11}, [r0,:128]!
2303         veor            q0, q0, q8
2304         vld1.64         {q12-q13}, [r0,:128]!
2305         veor            q1, q1, q9
2306         veor            q8, q6, q10
2307         vst1.8          {q0-q1}, [r8]!
2308         veor            q9, q4, q11
2309         vld1.64         {q14}, [r0,:128]!
2310         veor            q10, q2, q12
2311         vst1.8          {q8-q9}, [r8]!
2312         veor            q11, q7, q13
2313         veor            q12, q3, q14
2314         vst1.8          {q10-q11}, [r8]!
2315         vst1.8          {q12}, [r8]!
2316
2317         vld1.64         {q8}, [r0,:128]         @ next round tweak
2318         b               .Lxts_dec_done
2319 .align  4
2320 .Lxts_dec_6:
2321         vst1.64         {q14}, [r0,:128]                @ next round tweak
2322
2323         veor            q4, q4, q12
2324 #ifndef BSAES_ASM_EXTENDED_KEY
2325         add             r4, sp, #0x90                   @ pass key schedule
2326 #else
2327         add             r4, r10, #248                   @ pass key schedule
2328 #endif
2329         veor            q5, q5, q13
2330         mov             r5, r1                  @ pass rounds
2331         mov             r0, sp
2332
2333         bl              _bsaes_decrypt8
2334
2335         vld1.64         {q8-q9}, [r0,:128]!
2336         vld1.64         {q10-q11}, [r0,:128]!
2337         veor            q0, q0, q8
2338         vld1.64         {q12-q13}, [r0,:128]!
2339         veor            q1, q1, q9
2340         veor            q8, q6, q10
2341         vst1.8          {q0-q1}, [r8]!
2342         veor            q9, q4, q11
2343         veor            q10, q2, q12
2344         vst1.8          {q8-q9}, [r8]!
2345         veor            q11, q7, q13
2346         vst1.8          {q10-q11}, [r8]!
2347
2348         vld1.64         {q8}, [r0,:128]         @ next round tweak
2349         b               .Lxts_dec_done
2350 .align  4
2351 .Lxts_dec_5:
2352         vst1.64         {q13}, [r0,:128]                @ next round tweak
2353
2354         veor            q3, q3, q11
2355 #ifndef BSAES_ASM_EXTENDED_KEY
2356         add             r4, sp, #0x90                   @ pass key schedule
2357 #else
2358         add             r4, r10, #248                   @ pass key schedule
2359 #endif
2360         veor            q4, q4, q12
2361         mov             r5, r1                  @ pass rounds
2362         mov             r0, sp
2363
2364         bl              _bsaes_decrypt8
2365
2366         vld1.64         {q8-q9}, [r0,:128]!
2367         vld1.64         {q10-q11}, [r0,:128]!
2368         veor            q0, q0, q8
2369         vld1.64         {q12}, [r0,:128]!
2370         veor            q1, q1, q9
2371         veor            q8, q6, q10
2372         vst1.8          {q0-q1}, [r8]!
2373         veor            q9, q4, q11
2374         veor            q10, q2, q12
2375         vst1.8          {q8-q9}, [r8]!
2376         vst1.8          {q10}, [r8]!
2377
2378         vld1.64         {q8}, [r0,:128]         @ next round tweak
2379         b               .Lxts_dec_done
2380 .align  4
2381 .Lxts_dec_4:
2382         vst1.64         {q12}, [r0,:128]                @ next round tweak
2383
2384         veor            q2, q2, q10
2385 #ifndef BSAES_ASM_EXTENDED_KEY
2386         add             r4, sp, #0x90                   @ pass key schedule
2387 #else
2388         add             r4, r10, #248                   @ pass key schedule
2389 #endif
2390         veor            q3, q3, q11
2391         mov             r5, r1                  @ pass rounds
2392         mov             r0, sp
2393
2394         bl              _bsaes_decrypt8
2395
2396         vld1.64         {q8-q9}, [r0,:128]!
2397         vld1.64         {q10-q11}, [r0,:128]!
2398         veor            q0, q0, q8
2399         veor            q1, q1, q9
2400         veor            q8, q6, q10
2401         vst1.8          {q0-q1}, [r8]!
2402         veor            q9, q4, q11
2403         vst1.8          {q8-q9}, [r8]!
2404
2405         vld1.64         {q8}, [r0,:128]         @ next round tweak
2406         b               .Lxts_dec_done
2407 .align  4
2408 .Lxts_dec_3:
2409         vst1.64         {q11}, [r0,:128]                @ next round tweak
2410
2411         veor            q1, q1, q9
2412 #ifndef BSAES_ASM_EXTENDED_KEY
2413         add             r4, sp, #0x90                   @ pass key schedule
2414 #else
2415         add             r4, r10, #248                   @ pass key schedule
2416 #endif
2417         veor            q2, q2, q10
2418         mov             r5, r1                  @ pass rounds
2419         mov             r0, sp
2420
2421         bl              _bsaes_decrypt8
2422
2423         vld1.64         {q8-q9}, [r0,:128]!
2424         vld1.64         {q10}, [r0,:128]!
2425         veor            q0, q0, q8
2426         veor            q1, q1, q9
2427         veor            q8, q6, q10
2428         vst1.8          {q0-q1}, [r8]!
2429         vst1.8          {q8}, [r8]!
2430
2431         vld1.64         {q8}, [r0,:128]         @ next round tweak
2432         b               .Lxts_dec_done
2433 .align  4
2434 .Lxts_dec_2:
2435         vst1.64         {q10}, [r0,:128]                @ next round tweak
2436
2437         veor            q0, q0, q8
2438 #ifndef BSAES_ASM_EXTENDED_KEY
2439         add             r4, sp, #0x90                   @ pass key schedule
2440 #else
2441         add             r4, r10, #248                   @ pass key schedule
2442 #endif
2443         veor            q1, q1, q9
2444         mov             r5, r1                  @ pass rounds
2445         mov             r0, sp
2446
2447         bl              _bsaes_decrypt8
2448
2449         vld1.64         {q8-q9}, [r0,:128]!
2450         veor            q0, q0, q8
2451         veor            q1, q1, q9
2452         vst1.8          {q0-q1}, [r8]!
2453
2454         vld1.64         {q8}, [r0,:128]         @ next round tweak
2455         b               .Lxts_dec_done
2456 .align  4
2457 .Lxts_dec_1:
2458         mov             r0, sp
2459         veor            q0, q8
2460         mov             r1, sp
2461         vst1.8          {q0}, [sp,:128]
2462         mov             r2, r10
2463         mov             r4, r3                          @ preserve fp
2464         mov             r5, r2                  @ preserve magic
2465
2466         bl              AES_decrypt
2467
2468         vld1.8          {q0}, [sp,:128]
2469         veor            q0, q0, q8
2470         vst1.8          {q0}, [r8]!
2471         mov             r3, r4
2472         mov             r2, r5
2473
2474         vmov            q8, q9          @ next round tweak
2475
2476 .Lxts_dec_done:
2477 #ifndef XTS_CHAIN_TWEAK
2478         adds            r9, #0x10
2479         beq             .Lxts_dec_ret
2480
2481         @ calculate one round of extra tweak for the stolen ciphertext
2482         vldmia          r2, {q5}
2483         vshr.s64        q6, q8, #63
2484         vand            q6, q6, q5
2485         vadd.u64        q9, q8, q8
2486         vswp            d13,d12
2487         veor            q9, q9, q6
2488
2489         @ perform the final decryption with the last tweak value
2490         vld1.8          {q0}, [r7]!
2491         mov             r0, sp
2492         veor            q0, q0, q9
2493         mov             r1, sp
2494         vst1.8          {q0}, [sp,:128]
2495         mov             r2, r10
2496         mov             r4, r3                  @ preserve fp
2497
2498         bl              AES_decrypt
2499
2500         vld1.8          {q0}, [sp,:128]
2501         veor            q0, q0, q9
2502         vst1.8          {q0}, [r8]
2503
2504         mov             r6, r8
2505 .Lxts_dec_steal:
2506         ldrb            r1, [r8]
2507         ldrb            r0, [r7], #1
2508         strb            r1, [r8, #0x10]
2509         strb            r0, [r8], #1
2510
2511         subs            r9, #1
2512         bhi             .Lxts_dec_steal
2513
2514         vld1.8          {q0}, [r6]
2515         mov             r0, sp
2516         veor            q0, q8
2517         mov             r1, sp
2518         vst1.8          {q0}, [sp,:128]
2519         mov             r2, r10
2520
2521         bl              AES_decrypt
2522
2523         vld1.8          {q0}, [sp,:128]
2524         veor            q0, q0, q8
2525         vst1.8          {q0}, [r6]
2526         mov             r3, r4
2527 #endif
2528
2529 .Lxts_dec_ret:
2530         bic             r0, r3, #0xf
2531         vmov.i32        q0, #0
2532         vmov.i32        q1, #0
2533 #ifdef  XTS_CHAIN_TWEAK
2534         ldr             r1, [r3, #0x20+VFP_ABI_FRAME]   @ chain tweak
2535 #endif
2536 .Lxts_dec_bzero:                                @ wipe key schedule [if any]
2537         vstmia          sp!, {q0-q1}
2538         cmp             sp, r0
2539         bne             .Lxts_dec_bzero
2540
2541         mov             sp, r3
2542 #ifdef  XTS_CHAIN_TWEAK
2543         vst1.8          {q8}, [r1]
2544 #endif
2545         VFP_ABI_POP
2546         ldmia           sp!, {r4-r10, pc}       @ return
2547
2548 .size   bsaes_xts_decrypt,.-bsaes_xts_decrypt
2549 #endif
2550 #endif