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