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