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