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