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