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