Home | History | Annotate | Download | only in fipsmodule
      1 #if defined(__arm__)
      2 @ Copyright 2007-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 @ Permission to use under GPL terms is granted.
     17 @ ====================================================================
     18 
     19 @ SHA512 block procedure for ARMv4. September 2007.
     20 
     21 @ This code is ~4.5 (four and a half) times faster than code generated
     22 @ by gcc 3.4 and it spends ~72 clock cycles per byte [on single-issue
     23 @ Xscale PXA250 core].
     24 @
     25 @ July 2010.
     26 @
     27 @ Rescheduling for dual-issue pipeline resulted in 6% improvement on
     28 @ Cortex A8 core and ~40 cycles per processed byte.
     29 
     30 @ February 2011.
     31 @
     32 @ Profiler-assisted and platform-specific optimization resulted in 7%
     33 @ improvement on Coxtex A8 core and ~38 cycles per byte.
     34 
     35 @ March 2011.
     36 @
     37 @ Add NEON implementation. On Cortex A8 it was measured to process
     38 @ one byte in 23.3 cycles or ~60% faster than integer-only code.
     39 
     40 @ August 2012.
     41 @
     42 @ Improve NEON performance by 12% on Snapdragon S4. In absolute
     43 @ terms it's 22.6 cycles per byte, which is disappointing result.
     44 @ Technical writers asserted that 3-way S4 pipeline can sustain
     45 @ multiple NEON instructions per cycle, but dual NEON issue could
     46 @ not be observed, see http://www.openssl.org/~appro/Snapdragon-S4.html
     47 @ for further details. On side note Cortex-A15 processes one byte in
     48 @ 16 cycles.
     49 
     50 @ Byte order [in]dependence. =========================================
     51 @
     52 @ Originally caller was expected to maintain specific *dword* order in
     53 @ h[0-7], namely with most significant dword at *lower* address, which
     54 @ was reflected in below two parameters as 0 and 4. Now caller is
     55 @ expected to maintain native byte order for whole 64-bit values.
     56 #ifndef __KERNEL__
     57 # include <openssl/arm_arch.h>
     58 # define VFP_ABI_PUSH	vstmdb	sp!,{d8-d15}
     59 # define VFP_ABI_POP	vldmia	sp!,{d8-d15}
     60 #else
     61 # define __ARM_ARCH__ __LINUX_ARM_ARCH__
     62 # define __ARM_MAX_ARCH__ 7
     63 # define VFP_ABI_PUSH
     64 # define VFP_ABI_POP
     65 #endif
     66 
     67 @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both
     68 @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions.
     69 .arch	armv7-a
     70 
     71 #ifdef __ARMEL__
     72 # define LO 0
     73 # define HI 4
     74 # define WORD64(hi0,lo0,hi1,lo1)	.word	lo0,hi0, lo1,hi1
     75 #else
     76 # define HI 0
     77 # define LO 4
     78 # define WORD64(hi0,lo0,hi1,lo1)	.word	hi0,lo0, hi1,lo1
     79 #endif
     80 
     81 .text
     82 #if defined(__thumb2__)
     83 .syntax	unified
     84 .thumb
     85 # define adrl adr
     86 #else
     87 .code	32
     88 #endif
     89 
     90 .type	K512,%object
     91 .align	5
     92 K512:
     93 	WORD64(0x428a2f98,0xd728ae22,	0x71374491,0x23ef65cd)
     94 	WORD64(0xb5c0fbcf,0xec4d3b2f,	0xe9b5dba5,0x8189dbbc)
     95 	WORD64(0x3956c25b,0xf348b538,	0x59f111f1,0xb605d019)
     96 	WORD64(0x923f82a4,0xaf194f9b,	0xab1c5ed5,0xda6d8118)
     97 	WORD64(0xd807aa98,0xa3030242,	0x12835b01,0x45706fbe)
     98 	WORD64(0x243185be,0x4ee4b28c,	0x550c7dc3,0xd5ffb4e2)
     99 	WORD64(0x72be5d74,0xf27b896f,	0x80deb1fe,0x3b1696b1)
    100 	WORD64(0x9bdc06a7,0x25c71235,	0xc19bf174,0xcf692694)
    101 	WORD64(0xe49b69c1,0x9ef14ad2,	0xefbe4786,0x384f25e3)
    102 	WORD64(0x0fc19dc6,0x8b8cd5b5,	0x240ca1cc,0x77ac9c65)
    103 	WORD64(0x2de92c6f,0x592b0275,	0x4a7484aa,0x6ea6e483)
    104 	WORD64(0x5cb0a9dc,0xbd41fbd4,	0x76f988da,0x831153b5)
    105 	WORD64(0x983e5152,0xee66dfab,	0xa831c66d,0x2db43210)
    106 	WORD64(0xb00327c8,0x98fb213f,	0xbf597fc7,0xbeef0ee4)
    107 	WORD64(0xc6e00bf3,0x3da88fc2,	0xd5a79147,0x930aa725)
    108 	WORD64(0x06ca6351,0xe003826f,	0x14292967,0x0a0e6e70)
    109 	WORD64(0x27b70a85,0x46d22ffc,	0x2e1b2138,0x5c26c926)
    110 	WORD64(0x4d2c6dfc,0x5ac42aed,	0x53380d13,0x9d95b3df)
    111 	WORD64(0x650a7354,0x8baf63de,	0x766a0abb,0x3c77b2a8)
    112 	WORD64(0x81c2c92e,0x47edaee6,	0x92722c85,0x1482353b)
    113 	WORD64(0xa2bfe8a1,0x4cf10364,	0xa81a664b,0xbc423001)
    114 	WORD64(0xc24b8b70,0xd0f89791,	0xc76c51a3,0x0654be30)
    115 	WORD64(0xd192e819,0xd6ef5218,	0xd6990624,0x5565a910)
    116 	WORD64(0xf40e3585,0x5771202a,	0x106aa070,0x32bbd1b8)
    117 	WORD64(0x19a4c116,0xb8d2d0c8,	0x1e376c08,0x5141ab53)
    118 	WORD64(0x2748774c,0xdf8eeb99,	0x34b0bcb5,0xe19b48a8)
    119 	WORD64(0x391c0cb3,0xc5c95a63,	0x4ed8aa4a,0xe3418acb)
    120 	WORD64(0x5b9cca4f,0x7763e373,	0x682e6ff3,0xd6b2b8a3)
    121 	WORD64(0x748f82ee,0x5defb2fc,	0x78a5636f,0x43172f60)
    122 	WORD64(0x84c87814,0xa1f0ab72,	0x8cc70208,0x1a6439ec)
    123 	WORD64(0x90befffa,0x23631e28,	0xa4506ceb,0xde82bde9)
    124 	WORD64(0xbef9a3f7,0xb2c67915,	0xc67178f2,0xe372532b)
    125 	WORD64(0xca273ece,0xea26619c,	0xd186b8c7,0x21c0c207)
    126 	WORD64(0xeada7dd6,0xcde0eb1e,	0xf57d4f7f,0xee6ed178)
    127 	WORD64(0x06f067aa,0x72176fba,	0x0a637dc5,0xa2c898a6)
    128 	WORD64(0x113f9804,0xbef90dae,	0x1b710b35,0x131c471b)
    129 	WORD64(0x28db77f5,0x23047d84,	0x32caab7b,0x40c72493)
    130 	WORD64(0x3c9ebe0a,0x15c9bebc,	0x431d67c4,0x9c100d4c)
    131 	WORD64(0x4cc5d4be,0xcb3e42b6,	0x597f299c,0xfc657e2a)
    132 	WORD64(0x5fcb6fab,0x3ad6faec,	0x6c44198c,0x4a475817)
    133 .size	K512,.-K512
    134 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
    135 .LOPENSSL_armcap:
    136 .word	OPENSSL_armcap_P-.Lsha512_block_data_order
    137 .skip	32-4
    138 #else
    139 .skip	32
    140 #endif
    141 
    142 .globl	sha512_block_data_order
    143 .hidden	sha512_block_data_order
    144 .type	sha512_block_data_order,%function
    145 sha512_block_data_order:
    146 .Lsha512_block_data_order:
    147 #if __ARM_ARCH__<7 && !defined(__thumb2__)
    148 	sub	r3,pc,#8		@ sha512_block_data_order
    149 #else
    150 	adr	r3,.Lsha512_block_data_order
    151 #endif
    152 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
    153 	ldr	r12,.LOPENSSL_armcap
    154 	ldr	r12,[r3,r12]		@ OPENSSL_armcap_P
    155 #ifdef	__APPLE__
    156 	ldr	r12,[r12]
    157 #endif
    158 	tst	r12,#ARMV7_NEON
    159 	bne	.LNEON
    160 #endif
    161 	add	r2,r1,r2,lsl#7	@ len to point at the end of inp
    162 	stmdb	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
    163 	sub	r14,r3,#672		@ K512
    164 	sub	sp,sp,#9*8
    165 
    166 	ldr	r7,[r0,#32+LO]
    167 	ldr	r8,[r0,#32+HI]
    168 	ldr	r9, [r0,#48+LO]
    169 	ldr	r10, [r0,#48+HI]
    170 	ldr	r11, [r0,#56+LO]
    171 	ldr	r12, [r0,#56+HI]
    172 .Loop:
    173 	str	r9, [sp,#48+0]
    174 	str	r10, [sp,#48+4]
    175 	str	r11, [sp,#56+0]
    176 	str	r12, [sp,#56+4]
    177 	ldr	r5,[r0,#0+LO]
    178 	ldr	r6,[r0,#0+HI]
    179 	ldr	r3,[r0,#8+LO]
    180 	ldr	r4,[r0,#8+HI]
    181 	ldr	r9, [r0,#16+LO]
    182 	ldr	r10, [r0,#16+HI]
    183 	ldr	r11, [r0,#24+LO]
    184 	ldr	r12, [r0,#24+HI]
    185 	str	r3,[sp,#8+0]
    186 	str	r4,[sp,#8+4]
    187 	str	r9, [sp,#16+0]
    188 	str	r10, [sp,#16+4]
    189 	str	r11, [sp,#24+0]
    190 	str	r12, [sp,#24+4]
    191 	ldr	r3,[r0,#40+LO]
    192 	ldr	r4,[r0,#40+HI]
    193 	str	r3,[sp,#40+0]
    194 	str	r4,[sp,#40+4]
    195 
    196 .L00_15:
    197 #if __ARM_ARCH__<7
    198 	ldrb	r3,[r1,#7]
    199 	ldrb	r9, [r1,#6]
    200 	ldrb	r10, [r1,#5]
    201 	ldrb	r11, [r1,#4]
    202 	ldrb	r4,[r1,#3]
    203 	ldrb	r12, [r1,#2]
    204 	orr	r3,r3,r9,lsl#8
    205 	ldrb	r9, [r1,#1]
    206 	orr	r3,r3,r10,lsl#16
    207 	ldrb	r10, [r1],#8
    208 	orr	r3,r3,r11,lsl#24
    209 	orr	r4,r4,r12,lsl#8
    210 	orr	r4,r4,r9,lsl#16
    211 	orr	r4,r4,r10,lsl#24
    212 #else
    213 	ldr	r3,[r1,#4]
    214 	ldr	r4,[r1],#8
    215 #ifdef __ARMEL__
    216 	rev	r3,r3
    217 	rev	r4,r4
    218 #endif
    219 #endif
    220 	@ Sigma1(x)	(ROTR((x),14) ^ ROTR((x),18)  ^ ROTR((x),41))
    221 	@ LO		lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23
    222 	@ HI		hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23
    223 	mov	r9,r7,lsr#14
    224 	str	r3,[sp,#64+0]
    225 	mov	r10,r8,lsr#14
    226 	str	r4,[sp,#64+4]
    227 	eor	r9,r9,r8,lsl#18
    228 	ldr	r11,[sp,#56+0]	@ h.lo
    229 	eor	r10,r10,r7,lsl#18
    230 	ldr	r12,[sp,#56+4]	@ h.hi
    231 	eor	r9,r9,r7,lsr#18
    232 	eor	r10,r10,r8,lsr#18
    233 	eor	r9,r9,r8,lsl#14
    234 	eor	r10,r10,r7,lsl#14
    235 	eor	r9,r9,r8,lsr#9
    236 	eor	r10,r10,r7,lsr#9
    237 	eor	r9,r9,r7,lsl#23
    238 	eor	r10,r10,r8,lsl#23	@ Sigma1(e)
    239 	adds	r3,r3,r9
    240 	ldr	r9,[sp,#40+0]	@ f.lo
    241 	adc	r4,r4,r10		@ T += Sigma1(e)
    242 	ldr	r10,[sp,#40+4]	@ f.hi
    243 	adds	r3,r3,r11
    244 	ldr	r11,[sp,#48+0]	@ g.lo
    245 	adc	r4,r4,r12		@ T += h
    246 	ldr	r12,[sp,#48+4]	@ g.hi
    247 
    248 	eor	r9,r9,r11
    249 	str	r7,[sp,#32+0]
    250 	eor	r10,r10,r12
    251 	str	r8,[sp,#32+4]
    252 	and	r9,r9,r7
    253 	str	r5,[sp,#0+0]
    254 	and	r10,r10,r8
    255 	str	r6,[sp,#0+4]
    256 	eor	r9,r9,r11
    257 	ldr	r11,[r14,#LO]	@ K[i].lo
    258 	eor	r10,r10,r12		@ Ch(e,f,g)
    259 	ldr	r12,[r14,#HI]	@ K[i].hi
    260 
    261 	adds	r3,r3,r9
    262 	ldr	r7,[sp,#24+0]	@ d.lo
    263 	adc	r4,r4,r10		@ T += Ch(e,f,g)
    264 	ldr	r8,[sp,#24+4]	@ d.hi
    265 	adds	r3,r3,r11
    266 	and	r9,r11,#0xff
    267 	adc	r4,r4,r12		@ T += K[i]
    268 	adds	r7,r7,r3
    269 	ldr	r11,[sp,#8+0]	@ b.lo
    270 	adc	r8,r8,r4		@ d += T
    271 	teq	r9,#148
    272 
    273 	ldr	r12,[sp,#16+0]	@ c.lo
    274 #if __ARM_ARCH__>=7
    275 	it	eq			@ Thumb2 thing, sanity check in ARM
    276 #endif
    277 	orreq	r14,r14,#1
    278 	@ Sigma0(x)	(ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
    279 	@ LO		lo>>28^hi<<4  ^ hi>>2^lo<<30 ^ hi>>7^lo<<25
    280 	@ HI		hi>>28^lo<<4  ^ lo>>2^hi<<30 ^ lo>>7^hi<<25
    281 	mov	r9,r5,lsr#28
    282 	mov	r10,r6,lsr#28
    283 	eor	r9,r9,r6,lsl#4
    284 	eor	r10,r10,r5,lsl#4
    285 	eor	r9,r9,r6,lsr#2
    286 	eor	r10,r10,r5,lsr#2
    287 	eor	r9,r9,r5,lsl#30
    288 	eor	r10,r10,r6,lsl#30
    289 	eor	r9,r9,r6,lsr#7
    290 	eor	r10,r10,r5,lsr#7
    291 	eor	r9,r9,r5,lsl#25
    292 	eor	r10,r10,r6,lsl#25	@ Sigma0(a)
    293 	adds	r3,r3,r9
    294 	and	r9,r5,r11
    295 	adc	r4,r4,r10		@ T += Sigma0(a)
    296 
    297 	ldr	r10,[sp,#8+4]	@ b.hi
    298 	orr	r5,r5,r11
    299 	ldr	r11,[sp,#16+4]	@ c.hi
    300 	and	r5,r5,r12
    301 	and	r12,r6,r10
    302 	orr	r6,r6,r10
    303 	orr	r5,r5,r9		@ Maj(a,b,c).lo
    304 	and	r6,r6,r11
    305 	adds	r5,r5,r3
    306 	orr	r6,r6,r12		@ Maj(a,b,c).hi
    307 	sub	sp,sp,#8
    308 	adc	r6,r6,r4		@ h += T
    309 	tst	r14,#1
    310 	add	r14,r14,#8
    311 	tst	r14,#1
    312 	beq	.L00_15
    313 	ldr	r9,[sp,#184+0]
    314 	ldr	r10,[sp,#184+4]
    315 	bic	r14,r14,#1
    316 .L16_79:
    317 	@ sigma0(x)	(ROTR((x),1)  ^ ROTR((x),8)  ^ ((x)>>7))
    318 	@ LO		lo>>1^hi<<31  ^ lo>>8^hi<<24 ^ lo>>7^hi<<25
    319 	@ HI		hi>>1^lo<<31  ^ hi>>8^lo<<24 ^ hi>>7
    320 	mov	r3,r9,lsr#1
    321 	ldr	r11,[sp,#80+0]
    322 	mov	r4,r10,lsr#1
    323 	ldr	r12,[sp,#80+4]
    324 	eor	r3,r3,r10,lsl#31
    325 	eor	r4,r4,r9,lsl#31
    326 	eor	r3,r3,r9,lsr#8
    327 	eor	r4,r4,r10,lsr#8
    328 	eor	r3,r3,r10,lsl#24
    329 	eor	r4,r4,r9,lsl#24
    330 	eor	r3,r3,r9,lsr#7
    331 	eor	r4,r4,r10,lsr#7
    332 	eor	r3,r3,r10,lsl#25
    333 
    334 	@ sigma1(x)	(ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6))
    335 	@ LO		lo>>19^hi<<13 ^ hi>>29^lo<<3 ^ lo>>6^hi<<26
    336 	@ HI		hi>>19^lo<<13 ^ lo>>29^hi<<3 ^ hi>>6
    337 	mov	r9,r11,lsr#19
    338 	mov	r10,r12,lsr#19
    339 	eor	r9,r9,r12,lsl#13
    340 	eor	r10,r10,r11,lsl#13
    341 	eor	r9,r9,r12,lsr#29
    342 	eor	r10,r10,r11,lsr#29
    343 	eor	r9,r9,r11,lsl#3
    344 	eor	r10,r10,r12,lsl#3
    345 	eor	r9,r9,r11,lsr#6
    346 	eor	r10,r10,r12,lsr#6
    347 	ldr	r11,[sp,#120+0]
    348 	eor	r9,r9,r12,lsl#26
    349 
    350 	ldr	r12,[sp,#120+4]
    351 	adds	r3,r3,r9
    352 	ldr	r9,[sp,#192+0]
    353 	adc	r4,r4,r10
    354 
    355 	ldr	r10,[sp,#192+4]
    356 	adds	r3,r3,r11
    357 	adc	r4,r4,r12
    358 	adds	r3,r3,r9
    359 	adc	r4,r4,r10
    360 	@ Sigma1(x)	(ROTR((x),14) ^ ROTR((x),18)  ^ ROTR((x),41))
    361 	@ LO		lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23
    362 	@ HI		hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23
    363 	mov	r9,r7,lsr#14
    364 	str	r3,[sp,#64+0]
    365 	mov	r10,r8,lsr#14
    366 	str	r4,[sp,#64+4]
    367 	eor	r9,r9,r8,lsl#18
    368 	ldr	r11,[sp,#56+0]	@ h.lo
    369 	eor	r10,r10,r7,lsl#18
    370 	ldr	r12,[sp,#56+4]	@ h.hi
    371 	eor	r9,r9,r7,lsr#18
    372 	eor	r10,r10,r8,lsr#18
    373 	eor	r9,r9,r8,lsl#14
    374 	eor	r10,r10,r7,lsl#14
    375 	eor	r9,r9,r8,lsr#9
    376 	eor	r10,r10,r7,lsr#9
    377 	eor	r9,r9,r7,lsl#23
    378 	eor	r10,r10,r8,lsl#23	@ Sigma1(e)
    379 	adds	r3,r3,r9
    380 	ldr	r9,[sp,#40+0]	@ f.lo
    381 	adc	r4,r4,r10		@ T += Sigma1(e)
    382 	ldr	r10,[sp,#40+4]	@ f.hi
    383 	adds	r3,r3,r11
    384 	ldr	r11,[sp,#48+0]	@ g.lo
    385 	adc	r4,r4,r12		@ T += h
    386 	ldr	r12,[sp,#48+4]	@ g.hi
    387 
    388 	eor	r9,r9,r11
    389 	str	r7,[sp,#32+0]
    390 	eor	r10,r10,r12
    391 	str	r8,[sp,#32+4]
    392 	and	r9,r9,r7
    393 	str	r5,[sp,#0+0]
    394 	and	r10,r10,r8
    395 	str	r6,[sp,#0+4]
    396 	eor	r9,r9,r11
    397 	ldr	r11,[r14,#LO]	@ K[i].lo
    398 	eor	r10,r10,r12		@ Ch(e,f,g)
    399 	ldr	r12,[r14,#HI]	@ K[i].hi
    400 
    401 	adds	r3,r3,r9
    402 	ldr	r7,[sp,#24+0]	@ d.lo
    403 	adc	r4,r4,r10		@ T += Ch(e,f,g)
    404 	ldr	r8,[sp,#24+4]	@ d.hi
    405 	adds	r3,r3,r11
    406 	and	r9,r11,#0xff
    407 	adc	r4,r4,r12		@ T += K[i]
    408 	adds	r7,r7,r3
    409 	ldr	r11,[sp,#8+0]	@ b.lo
    410 	adc	r8,r8,r4		@ d += T
    411 	teq	r9,#23
    412 
    413 	ldr	r12,[sp,#16+0]	@ c.lo
    414 #if __ARM_ARCH__>=7
    415 	it	eq			@ Thumb2 thing, sanity check in ARM
    416 #endif
    417 	orreq	r14,r14,#1
    418 	@ Sigma0(x)	(ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
    419 	@ LO		lo>>28^hi<<4  ^ hi>>2^lo<<30 ^ hi>>7^lo<<25
    420 	@ HI		hi>>28^lo<<4  ^ lo>>2^hi<<30 ^ lo>>7^hi<<25
    421 	mov	r9,r5,lsr#28
    422 	mov	r10,r6,lsr#28
    423 	eor	r9,r9,r6,lsl#4
    424 	eor	r10,r10,r5,lsl#4
    425 	eor	r9,r9,r6,lsr#2
    426 	eor	r10,r10,r5,lsr#2
    427 	eor	r9,r9,r5,lsl#30
    428 	eor	r10,r10,r6,lsl#30
    429 	eor	r9,r9,r6,lsr#7
    430 	eor	r10,r10,r5,lsr#7
    431 	eor	r9,r9,r5,lsl#25
    432 	eor	r10,r10,r6,lsl#25	@ Sigma0(a)
    433 	adds	r3,r3,r9
    434 	and	r9,r5,r11
    435 	adc	r4,r4,r10		@ T += Sigma0(a)
    436 
    437 	ldr	r10,[sp,#8+4]	@ b.hi
    438 	orr	r5,r5,r11
    439 	ldr	r11,[sp,#16+4]	@ c.hi
    440 	and	r5,r5,r12
    441 	and	r12,r6,r10
    442 	orr	r6,r6,r10
    443 	orr	r5,r5,r9		@ Maj(a,b,c).lo
    444 	and	r6,r6,r11
    445 	adds	r5,r5,r3
    446 	orr	r6,r6,r12		@ Maj(a,b,c).hi
    447 	sub	sp,sp,#8
    448 	adc	r6,r6,r4		@ h += T
    449 	tst	r14,#1
    450 	add	r14,r14,#8
    451 #if __ARM_ARCH__>=7
    452 	ittt	eq			@ Thumb2 thing, sanity check in ARM
    453 #endif
    454 	ldreq	r9,[sp,#184+0]
    455 	ldreq	r10,[sp,#184+4]
    456 	beq	.L16_79
    457 	bic	r14,r14,#1
    458 
    459 	ldr	r3,[sp,#8+0]
    460 	ldr	r4,[sp,#8+4]
    461 	ldr	r9, [r0,#0+LO]
    462 	ldr	r10, [r0,#0+HI]
    463 	ldr	r11, [r0,#8+LO]
    464 	ldr	r12, [r0,#8+HI]
    465 	adds	r9,r5,r9
    466 	str	r9, [r0,#0+LO]
    467 	adc	r10,r6,r10
    468 	str	r10, [r0,#0+HI]
    469 	adds	r11,r3,r11
    470 	str	r11, [r0,#8+LO]
    471 	adc	r12,r4,r12
    472 	str	r12, [r0,#8+HI]
    473 
    474 	ldr	r5,[sp,#16+0]
    475 	ldr	r6,[sp,#16+4]
    476 	ldr	r3,[sp,#24+0]
    477 	ldr	r4,[sp,#24+4]
    478 	ldr	r9, [r0,#16+LO]
    479 	ldr	r10, [r0,#16+HI]
    480 	ldr	r11, [r0,#24+LO]
    481 	ldr	r12, [r0,#24+HI]
    482 	adds	r9,r5,r9
    483 	str	r9, [r0,#16+LO]
    484 	adc	r10,r6,r10
    485 	str	r10, [r0,#16+HI]
    486 	adds	r11,r3,r11
    487 	str	r11, [r0,#24+LO]
    488 	adc	r12,r4,r12
    489 	str	r12, [r0,#24+HI]
    490 
    491 	ldr	r3,[sp,#40+0]
    492 	ldr	r4,[sp,#40+4]
    493 	ldr	r9, [r0,#32+LO]
    494 	ldr	r10, [r0,#32+HI]
    495 	ldr	r11, [r0,#40+LO]
    496 	ldr	r12, [r0,#40+HI]
    497 	adds	r7,r7,r9
    498 	str	r7,[r0,#32+LO]
    499 	adc	r8,r8,r10
    500 	str	r8,[r0,#32+HI]
    501 	adds	r11,r3,r11
    502 	str	r11, [r0,#40+LO]
    503 	adc	r12,r4,r12
    504 	str	r12, [r0,#40+HI]
    505 
    506 	ldr	r5,[sp,#48+0]
    507 	ldr	r6,[sp,#48+4]
    508 	ldr	r3,[sp,#56+0]
    509 	ldr	r4,[sp,#56+4]
    510 	ldr	r9, [r0,#48+LO]
    511 	ldr	r10, [r0,#48+HI]
    512 	ldr	r11, [r0,#56+LO]
    513 	ldr	r12, [r0,#56+HI]
    514 	adds	r9,r5,r9
    515 	str	r9, [r0,#48+LO]
    516 	adc	r10,r6,r10
    517 	str	r10, [r0,#48+HI]
    518 	adds	r11,r3,r11
    519 	str	r11, [r0,#56+LO]
    520 	adc	r12,r4,r12
    521 	str	r12, [r0,#56+HI]
    522 
    523 	add	sp,sp,#640
    524 	sub	r14,r14,#640
    525 
    526 	teq	r1,r2
    527 	bne	.Loop
    528 
    529 	add	sp,sp,#8*9		@ destroy frame
    530 #if __ARM_ARCH__>=5
    531 	ldmia	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc}
    532 #else
    533 	ldmia	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
    534 	tst	lr,#1
    535 	moveq	pc,lr			@ be binary compatible with V4, yet
    536 .word	0xe12fff1e			@ interoperable with Thumb ISA:-)
    537 #endif
    538 .size	sha512_block_data_order,.-sha512_block_data_order
    539 #if __ARM_MAX_ARCH__>=7
    540 .arch	armv7-a
    541 .fpu	neon
    542 
    543 .globl	sha512_block_data_order_neon
    544 .hidden	sha512_block_data_order_neon
    545 .type	sha512_block_data_order_neon,%function
    546 .align	4
    547 sha512_block_data_order_neon:
    548 .LNEON:
    549 	dmb	@ errata #451034 on early Cortex A8
    550 	add	r2,r1,r2,lsl#7	@ len to point at the end of inp
    551 	adr	r3,K512
    552 	VFP_ABI_PUSH
    553 	vldmia	r0,{d16,d17,d18,d19,d20,d21,d22,d23}		@ load context
    554 .Loop_neon:
    555 	vshr.u64	d24,d20,#14	@ 0
    556 #if 0<16
    557 	vld1.64	{d0},[r1]!	@ handles unaligned
    558 #endif
    559 	vshr.u64	d25,d20,#18
    560 #if 0>0
    561 	vadd.i64	d16,d30			@ h+=Maj from the past
    562 #endif
    563 	vshr.u64	d26,d20,#41
    564 	vld1.64	{d28},[r3,:64]!	@ K[i++]
    565 	vsli.64	d24,d20,#50
    566 	vsli.64	d25,d20,#46
    567 	vmov	d29,d20
    568 	vsli.64	d26,d20,#23
    569 #if 0<16 && defined(__ARMEL__)
    570 	vrev64.8	d0,d0
    571 #endif
    572 	veor	d25,d24
    573 	vbsl	d29,d21,d22		@ Ch(e,f,g)
    574 	vshr.u64	d24,d16,#28
    575 	veor	d26,d25			@ Sigma1(e)
    576 	vadd.i64	d27,d29,d23
    577 	vshr.u64	d25,d16,#34
    578 	vsli.64	d24,d16,#36
    579 	vadd.i64	d27,d26
    580 	vshr.u64	d26,d16,#39
    581 	vadd.i64	d28,d0
    582 	vsli.64	d25,d16,#30
    583 	veor	d30,d16,d17
    584 	vsli.64	d26,d16,#25
    585 	veor	d23,d24,d25
    586 	vadd.i64	d27,d28
    587 	vbsl	d30,d18,d17		@ Maj(a,b,c)
    588 	veor	d23,d26			@ Sigma0(a)
    589 	vadd.i64	d19,d27
    590 	vadd.i64	d30,d27
    591 	@ vadd.i64	d23,d30
    592 	vshr.u64	d24,d19,#14	@ 1
    593 #if 1<16
    594 	vld1.64	{d1},[r1]!	@ handles unaligned
    595 #endif
    596 	vshr.u64	d25,d19,#18
    597 #if 1>0
    598 	vadd.i64	d23,d30			@ h+=Maj from the past
    599 #endif
    600 	vshr.u64	d26,d19,#41
    601 	vld1.64	{d28},[r3,:64]!	@ K[i++]
    602 	vsli.64	d24,d19,#50
    603 	vsli.64	d25,d19,#46
    604 	vmov	d29,d19
    605 	vsli.64	d26,d19,#23
    606 #if 1<16 && defined(__ARMEL__)
    607 	vrev64.8	d1,d1
    608 #endif
    609 	veor	d25,d24
    610 	vbsl	d29,d20,d21		@ Ch(e,f,g)
    611 	vshr.u64	d24,d23,#28
    612 	veor	d26,d25			@ Sigma1(e)
    613 	vadd.i64	d27,d29,d22
    614 	vshr.u64	d25,d23,#34
    615 	vsli.64	d24,d23,#36
    616 	vadd.i64	d27,d26
    617 	vshr.u64	d26,d23,#39
    618 	vadd.i64	d28,d1
    619 	vsli.64	d25,d23,#30
    620 	veor	d30,d23,d16
    621 	vsli.64	d26,d23,#25
    622 	veor	d22,d24,d25
    623 	vadd.i64	d27,d28
    624 	vbsl	d30,d17,d16		@ Maj(a,b,c)
    625 	veor	d22,d26			@ Sigma0(a)
    626 	vadd.i64	d18,d27
    627 	vadd.i64	d30,d27
    628 	@ vadd.i64	d22,d30
    629 	vshr.u64	d24,d18,#14	@ 2
    630 #if 2<16
    631 	vld1.64	{d2},[r1]!	@ handles unaligned
    632 #endif
    633 	vshr.u64	d25,d18,#18
    634 #if 2>0
    635 	vadd.i64	d22,d30			@ h+=Maj from the past
    636 #endif
    637 	vshr.u64	d26,d18,#41
    638 	vld1.64	{d28},[r3,:64]!	@ K[i++]
    639 	vsli.64	d24,d18,#50
    640 	vsli.64	d25,d18,#46
    641 	vmov	d29,d18
    642 	vsli.64	d26,d18,#23
    643 #if 2<16 && defined(__ARMEL__)
    644 	vrev64.8	d2,d2
    645 #endif
    646 	veor	d25,d24
    647 	vbsl	d29,d19,d20		@ Ch(e,f,g)
    648 	vshr.u64	d24,d22,#28
    649 	veor	d26,d25			@ Sigma1(e)
    650 	vadd.i64	d27,d29,d21
    651 	vshr.u64	d25,d22,#34
    652 	vsli.64	d24,d22,#36
    653 	vadd.i64	d27,d26
    654 	vshr.u64	d26,d22,#39
    655 	vadd.i64	d28,d2
    656 	vsli.64	d25,d22,#30
    657 	veor	d30,d22,d23
    658 	vsli.64	d26,d22,#25
    659 	veor	d21,d24,d25
    660 	vadd.i64	d27,d28
    661 	vbsl	d30,d16,d23		@ Maj(a,b,c)
    662 	veor	d21,d26			@ Sigma0(a)
    663 	vadd.i64	d17,d27
    664 	vadd.i64	d30,d27
    665 	@ vadd.i64	d21,d30
    666 	vshr.u64	d24,d17,#14	@ 3
    667 #if 3<16
    668 	vld1.64	{d3},[r1]!	@ handles unaligned
    669 #endif
    670 	vshr.u64	d25,d17,#18
    671 #if 3>0
    672 	vadd.i64	d21,d30			@ h+=Maj from the past
    673 #endif
    674 	vshr.u64	d26,d17,#41
    675 	vld1.64	{d28},[r3,:64]!	@ K[i++]
    676 	vsli.64	d24,d17,#50
    677 	vsli.64	d25,d17,#46
    678 	vmov	d29,d17
    679 	vsli.64	d26,d17,#23
    680 #if 3<16 && defined(__ARMEL__)
    681 	vrev64.8	d3,d3
    682 #endif
    683 	veor	d25,d24
    684 	vbsl	d29,d18,d19		@ Ch(e,f,g)
    685 	vshr.u64	d24,d21,#28
    686 	veor	d26,d25			@ Sigma1(e)
    687 	vadd.i64	d27,d29,d20
    688 	vshr.u64	d25,d21,#34
    689 	vsli.64	d24,d21,#36
    690 	vadd.i64	d27,d26
    691 	vshr.u64	d26,d21,#39
    692 	vadd.i64	d28,d3
    693 	vsli.64	d25,d21,#30
    694 	veor	d30,d21,d22
    695 	vsli.64	d26,d21,#25
    696 	veor	d20,d24,d25
    697 	vadd.i64	d27,d28
    698 	vbsl	d30,d23,d22		@ Maj(a,b,c)
    699 	veor	d20,d26			@ Sigma0(a)
    700 	vadd.i64	d16,d27
    701 	vadd.i64	d30,d27
    702 	@ vadd.i64	d20,d30
    703 	vshr.u64	d24,d16,#14	@ 4
    704 #if 4<16
    705 	vld1.64	{d4},[r1]!	@ handles unaligned
    706 #endif
    707 	vshr.u64	d25,d16,#18
    708 #if 4>0
    709 	vadd.i64	d20,d30			@ h+=Maj from the past
    710 #endif
    711 	vshr.u64	d26,d16,#41
    712 	vld1.64	{d28},[r3,:64]!	@ K[i++]
    713 	vsli.64	d24,d16,#50
    714 	vsli.64	d25,d16,#46
    715 	vmov	d29,d16
    716 	vsli.64	d26,d16,#23
    717 #if 4<16 && defined(__ARMEL__)
    718 	vrev64.8	d4,d4
    719 #endif
    720 	veor	d25,d24
    721 	vbsl	d29,d17,d18		@ Ch(e,f,g)
    722 	vshr.u64	d24,d20,#28
    723 	veor	d26,d25			@ Sigma1(e)
    724 	vadd.i64	d27,d29,d19
    725 	vshr.u64	d25,d20,#34
    726 	vsli.64	d24,d20,#36
    727 	vadd.i64	d27,d26
    728 	vshr.u64	d26,d20,#39
    729 	vadd.i64	d28,d4
    730 	vsli.64	d25,d20,#30
    731 	veor	d30,d20,d21
    732 	vsli.64	d26,d20,#25
    733 	veor	d19,d24,d25
    734 	vadd.i64	d27,d28
    735 	vbsl	d30,d22,d21		@ Maj(a,b,c)
    736 	veor	d19,d26			@ Sigma0(a)
    737 	vadd.i64	d23,d27
    738 	vadd.i64	d30,d27
    739 	@ vadd.i64	d19,d30
    740 	vshr.u64	d24,d23,#14	@ 5
    741 #if 5<16
    742 	vld1.64	{d5},[r1]!	@ handles unaligned
    743 #endif
    744 	vshr.u64	d25,d23,#18
    745 #if 5>0
    746 	vadd.i64	d19,d30			@ h+=Maj from the past
    747 #endif
    748 	vshr.u64	d26,d23,#41
    749 	vld1.64	{d28},[r3,:64]!	@ K[i++]
    750 	vsli.64	d24,d23,#50
    751 	vsli.64	d25,d23,#46
    752 	vmov	d29,d23
    753 	vsli.64	d26,d23,#23
    754 #if 5<16 && defined(__ARMEL__)
    755 	vrev64.8	d5,d5
    756 #endif
    757 	veor	d25,d24
    758 	vbsl	d29,d16,d17		@ Ch(e,f,g)
    759 	vshr.u64	d24,d19,#28
    760 	veor	d26,d25			@ Sigma1(e)
    761 	vadd.i64	d27,d29,d18
    762 	vshr.u64	d25,d19,#34
    763 	vsli.64	d24,d19,#36
    764 	vadd.i64	d27,d26
    765 	vshr.u64	d26,d19,#39
    766 	vadd.i64	d28,d5
    767 	vsli.64	d25,d19,#30
    768 	veor	d30,d19,d20
    769 	vsli.64	d26,d19,#25
    770 	veor	d18,d24,d25
    771 	vadd.i64	d27,d28
    772 	vbsl	d30,d21,d20		@ Maj(a,b,c)
    773 	veor	d18,d26			@ Sigma0(a)
    774 	vadd.i64	d22,d27
    775 	vadd.i64	d30,d27
    776 	@ vadd.i64	d18,d30
    777 	vshr.u64	d24,d22,#14	@ 6
    778 #if 6<16
    779 	vld1.64	{d6},[r1]!	@ handles unaligned
    780 #endif
    781 	vshr.u64	d25,d22,#18
    782 #if 6>0
    783 	vadd.i64	d18,d30			@ h+=Maj from the past
    784 #endif
    785 	vshr.u64	d26,d22,#41
    786 	vld1.64	{d28},[r3,:64]!	@ K[i++]
    787 	vsli.64	d24,d22,#50
    788 	vsli.64	d25,d22,#46
    789 	vmov	d29,d22
    790 	vsli.64	d26,d22,#23
    791 #if 6<16 && defined(__ARMEL__)
    792 	vrev64.8	d6,d6
    793 #endif
    794 	veor	d25,d24
    795 	vbsl	d29,d23,d16		@ Ch(e,f,g)
    796 	vshr.u64	d24,d18,#28
    797 	veor	d26,d25			@ Sigma1(e)
    798 	vadd.i64	d27,d29,d17
    799 	vshr.u64	d25,d18,#34
    800 	vsli.64	d24,d18,#36
    801 	vadd.i64	d27,d26
    802 	vshr.u64	d26,d18,#39
    803 	vadd.i64	d28,d6
    804 	vsli.64	d25,d18,#30
    805 	veor	d30,d18,d19
    806 	vsli.64	d26,d18,#25
    807 	veor	d17,d24,d25
    808 	vadd.i64	d27,d28
    809 	vbsl	d30,d20,d19		@ Maj(a,b,c)
    810 	veor	d17,d26			@ Sigma0(a)
    811 	vadd.i64	d21,d27
    812 	vadd.i64	d30,d27
    813 	@ vadd.i64	d17,d30
    814 	vshr.u64	d24,d21,#14	@ 7
    815 #if 7<16
    816 	vld1.64	{d7},[r1]!	@ handles unaligned
    817 #endif
    818 	vshr.u64	d25,d21,#18
    819 #if 7>0
    820 	vadd.i64	d17,d30			@ h+=Maj from the past
    821 #endif
    822 	vshr.u64	d26,d21,#41
    823 	vld1.64	{d28},[r3,:64]!	@ K[i++]
    824 	vsli.64	d24,d21,#50
    825 	vsli.64	d25,d21,#46
    826 	vmov	d29,d21
    827 	vsli.64	d26,d21,#23
    828 #if 7<16 && defined(__ARMEL__)
    829 	vrev64.8	d7,d7
    830 #endif
    831 	veor	d25,d24
    832 	vbsl	d29,d22,d23		@ Ch(e,f,g)
    833 	vshr.u64	d24,d17,#28
    834 	veor	d26,d25			@ Sigma1(e)
    835 	vadd.i64	d27,d29,d16
    836 	vshr.u64	d25,d17,#34
    837 	vsli.64	d24,d17,#36
    838 	vadd.i64	d27,d26
    839 	vshr.u64	d26,d17,#39
    840 	vadd.i64	d28,d7
    841 	vsli.64	d25,d17,#30
    842 	veor	d30,d17,d18
    843 	vsli.64	d26,d17,#25
    844 	veor	d16,d24,d25
    845 	vadd.i64	d27,d28
    846 	vbsl	d30,d19,d18		@ Maj(a,b,c)
    847 	veor	d16,d26			@ Sigma0(a)
    848 	vadd.i64	d20,d27
    849 	vadd.i64	d30,d27
    850 	@ vadd.i64	d16,d30
    851 	vshr.u64	d24,d20,#14	@ 8
    852 #if 8<16
    853 	vld1.64	{d8},[r1]!	@ handles unaligned
    854 #endif
    855 	vshr.u64	d25,d20,#18
    856 #if 8>0
    857 	vadd.i64	d16,d30			@ h+=Maj from the past
    858 #endif
    859 	vshr.u64	d26,d20,#41
    860 	vld1.64	{d28},[r3,:64]!	@ K[i++]
    861 	vsli.64	d24,d20,#50
    862 	vsli.64	d25,d20,#46
    863 	vmov	d29,d20
    864 	vsli.64	d26,d20,#23
    865 #if 8<16 && defined(__ARMEL__)
    866 	vrev64.8	d8,d8
    867 #endif
    868 	veor	d25,d24
    869 	vbsl	d29,d21,d22		@ Ch(e,f,g)
    870 	vshr.u64	d24,d16,#28
    871 	veor	d26,d25			@ Sigma1(e)
    872 	vadd.i64	d27,d29,d23
    873 	vshr.u64	d25,d16,#34
    874 	vsli.64	d24,d16,#36
    875 	vadd.i64	d27,d26
    876 	vshr.u64	d26,d16,#39
    877 	vadd.i64	d28,d8
    878 	vsli.64	d25,d16,#30
    879 	veor	d30,d16,d17
    880 	vsli.64	d26,d16,#25
    881 	veor	d23,d24,d25
    882 	vadd.i64	d27,d28
    883 	vbsl	d30,d18,d17		@ Maj(a,b,c)
    884 	veor	d23,d26			@ Sigma0(a)
    885 	vadd.i64	d19,d27
    886 	vadd.i64	d30,d27
    887 	@ vadd.i64	d23,d30
    888 	vshr.u64	d24,d19,#14	@ 9
    889 #if 9<16
    890 	vld1.64	{d9},[r1]!	@ handles unaligned
    891 #endif
    892 	vshr.u64	d25,d19,#18
    893 #if 9>0
    894 	vadd.i64	d23,d30			@ h+=Maj from the past
    895 #endif
    896 	vshr.u64	d26,d19,#41
    897 	vld1.64	{d28},[r3,:64]!	@ K[i++]
    898 	vsli.64	d24,d19,#50
    899 	vsli.64	d25,d19,#46
    900 	vmov	d29,d19
    901 	vsli.64	d26,d19,#23
    902 #if 9<16 && defined(__ARMEL__)
    903 	vrev64.8	d9,d9
    904 #endif
    905 	veor	d25,d24
    906 	vbsl	d29,d20,d21		@ Ch(e,f,g)
    907 	vshr.u64	d24,d23,#28
    908 	veor	d26,d25			@ Sigma1(e)
    909 	vadd.i64	d27,d29,d22
    910 	vshr.u64	d25,d23,#34
    911 	vsli.64	d24,d23,#36
    912 	vadd.i64	d27,d26
    913 	vshr.u64	d26,d23,#39
    914 	vadd.i64	d28,d9
    915 	vsli.64	d25,d23,#30
    916 	veor	d30,d23,d16
    917 	vsli.64	d26,d23,#25
    918 	veor	d22,d24,d25
    919 	vadd.i64	d27,d28
    920 	vbsl	d30,d17,d16		@ Maj(a,b,c)
    921 	veor	d22,d26			@ Sigma0(a)
    922 	vadd.i64	d18,d27
    923 	vadd.i64	d30,d27
    924 	@ vadd.i64	d22,d30
    925 	vshr.u64	d24,d18,#14	@ 10
    926 #if 10<16
    927 	vld1.64	{d10},[r1]!	@ handles unaligned
    928 #endif
    929 	vshr.u64	d25,d18,#18
    930 #if 10>0
    931 	vadd.i64	d22,d30			@ h+=Maj from the past
    932 #endif
    933 	vshr.u64	d26,d18,#41
    934 	vld1.64	{d28},[r3,:64]!	@ K[i++]
    935 	vsli.64	d24,d18,#50
    936 	vsli.64	d25,d18,#46
    937 	vmov	d29,d18
    938 	vsli.64	d26,d18,#23
    939 #if 10<16 && defined(__ARMEL__)
    940 	vrev64.8	d10,d10
    941 #endif
    942 	veor	d25,d24
    943 	vbsl	d29,d19,d20		@ Ch(e,f,g)
    944 	vshr.u64	d24,d22,#28
    945 	veor	d26,d25			@ Sigma1(e)
    946 	vadd.i64	d27,d29,d21
    947 	vshr.u64	d25,d22,#34
    948 	vsli.64	d24,d22,#36
    949 	vadd.i64	d27,d26
    950 	vshr.u64	d26,d22,#39
    951 	vadd.i64	d28,d10
    952 	vsli.64	d25,d22,#30
    953 	veor	d30,d22,d23
    954 	vsli.64	d26,d22,#25
    955 	veor	d21,d24,d25
    956 	vadd.i64	d27,d28
    957 	vbsl	d30,d16,d23		@ Maj(a,b,c)
    958 	veor	d21,d26			@ Sigma0(a)
    959 	vadd.i64	d17,d27
    960 	vadd.i64	d30,d27
    961 	@ vadd.i64	d21,d30
    962 	vshr.u64	d24,d17,#14	@ 11
    963 #if 11<16
    964 	vld1.64	{d11},[r1]!	@ handles unaligned
    965 #endif
    966 	vshr.u64	d25,d17,#18
    967 #if 11>0
    968 	vadd.i64	d21,d30			@ h+=Maj from the past
    969 #endif
    970 	vshr.u64	d26,d17,#41
    971 	vld1.64	{d28},[r3,:64]!	@ K[i++]
    972 	vsli.64	d24,d17,#50
    973 	vsli.64	d25,d17,#46
    974 	vmov	d29,d17
    975 	vsli.64	d26,d17,#23
    976 #if 11<16 && defined(__ARMEL__)
    977 	vrev64.8	d11,d11
    978 #endif
    979 	veor	d25,d24
    980 	vbsl	d29,d18,d19		@ Ch(e,f,g)
    981 	vshr.u64	d24,d21,#28
    982 	veor	d26,d25			@ Sigma1(e)
    983 	vadd.i64	d27,d29,d20
    984 	vshr.u64	d25,d21,#34
    985 	vsli.64	d24,d21,#36
    986 	vadd.i64	d27,d26
    987 	vshr.u64	d26,d21,#39
    988 	vadd.i64	d28,d11
    989 	vsli.64	d25,d21,#30
    990 	veor	d30,d21,d22
    991 	vsli.64	d26,d21,#25
    992 	veor	d20,d24,d25
    993 	vadd.i64	d27,d28
    994 	vbsl	d30,d23,d22		@ Maj(a,b,c)
    995 	veor	d20,d26			@ Sigma0(a)
    996 	vadd.i64	d16,d27
    997 	vadd.i64	d30,d27
    998 	@ vadd.i64	d20,d30
    999 	vshr.u64	d24,d16,#14	@ 12
   1000 #if 12<16
   1001 	vld1.64	{d12},[r1]!	@ handles unaligned
   1002 #endif
   1003 	vshr.u64	d25,d16,#18
   1004 #if 12>0
   1005 	vadd.i64	d20,d30			@ h+=Maj from the past
   1006 #endif
   1007 	vshr.u64	d26,d16,#41
   1008 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1009 	vsli.64	d24,d16,#50
   1010 	vsli.64	d25,d16,#46
   1011 	vmov	d29,d16
   1012 	vsli.64	d26,d16,#23
   1013 #if 12<16 && defined(__ARMEL__)
   1014 	vrev64.8	d12,d12
   1015 #endif
   1016 	veor	d25,d24
   1017 	vbsl	d29,d17,d18		@ Ch(e,f,g)
   1018 	vshr.u64	d24,d20,#28
   1019 	veor	d26,d25			@ Sigma1(e)
   1020 	vadd.i64	d27,d29,d19
   1021 	vshr.u64	d25,d20,#34
   1022 	vsli.64	d24,d20,#36
   1023 	vadd.i64	d27,d26
   1024 	vshr.u64	d26,d20,#39
   1025 	vadd.i64	d28,d12
   1026 	vsli.64	d25,d20,#30
   1027 	veor	d30,d20,d21
   1028 	vsli.64	d26,d20,#25
   1029 	veor	d19,d24,d25
   1030 	vadd.i64	d27,d28
   1031 	vbsl	d30,d22,d21		@ Maj(a,b,c)
   1032 	veor	d19,d26			@ Sigma0(a)
   1033 	vadd.i64	d23,d27
   1034 	vadd.i64	d30,d27
   1035 	@ vadd.i64	d19,d30
   1036 	vshr.u64	d24,d23,#14	@ 13
   1037 #if 13<16
   1038 	vld1.64	{d13},[r1]!	@ handles unaligned
   1039 #endif
   1040 	vshr.u64	d25,d23,#18
   1041 #if 13>0
   1042 	vadd.i64	d19,d30			@ h+=Maj from the past
   1043 #endif
   1044 	vshr.u64	d26,d23,#41
   1045 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1046 	vsli.64	d24,d23,#50
   1047 	vsli.64	d25,d23,#46
   1048 	vmov	d29,d23
   1049 	vsli.64	d26,d23,#23
   1050 #if 13<16 && defined(__ARMEL__)
   1051 	vrev64.8	d13,d13
   1052 #endif
   1053 	veor	d25,d24
   1054 	vbsl	d29,d16,d17		@ Ch(e,f,g)
   1055 	vshr.u64	d24,d19,#28
   1056 	veor	d26,d25			@ Sigma1(e)
   1057 	vadd.i64	d27,d29,d18
   1058 	vshr.u64	d25,d19,#34
   1059 	vsli.64	d24,d19,#36
   1060 	vadd.i64	d27,d26
   1061 	vshr.u64	d26,d19,#39
   1062 	vadd.i64	d28,d13
   1063 	vsli.64	d25,d19,#30
   1064 	veor	d30,d19,d20
   1065 	vsli.64	d26,d19,#25
   1066 	veor	d18,d24,d25
   1067 	vadd.i64	d27,d28
   1068 	vbsl	d30,d21,d20		@ Maj(a,b,c)
   1069 	veor	d18,d26			@ Sigma0(a)
   1070 	vadd.i64	d22,d27
   1071 	vadd.i64	d30,d27
   1072 	@ vadd.i64	d18,d30
   1073 	vshr.u64	d24,d22,#14	@ 14
   1074 #if 14<16
   1075 	vld1.64	{d14},[r1]!	@ handles unaligned
   1076 #endif
   1077 	vshr.u64	d25,d22,#18
   1078 #if 14>0
   1079 	vadd.i64	d18,d30			@ h+=Maj from the past
   1080 #endif
   1081 	vshr.u64	d26,d22,#41
   1082 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1083 	vsli.64	d24,d22,#50
   1084 	vsli.64	d25,d22,#46
   1085 	vmov	d29,d22
   1086 	vsli.64	d26,d22,#23
   1087 #if 14<16 && defined(__ARMEL__)
   1088 	vrev64.8	d14,d14
   1089 #endif
   1090 	veor	d25,d24
   1091 	vbsl	d29,d23,d16		@ Ch(e,f,g)
   1092 	vshr.u64	d24,d18,#28
   1093 	veor	d26,d25			@ Sigma1(e)
   1094 	vadd.i64	d27,d29,d17
   1095 	vshr.u64	d25,d18,#34
   1096 	vsli.64	d24,d18,#36
   1097 	vadd.i64	d27,d26
   1098 	vshr.u64	d26,d18,#39
   1099 	vadd.i64	d28,d14
   1100 	vsli.64	d25,d18,#30
   1101 	veor	d30,d18,d19
   1102 	vsli.64	d26,d18,#25
   1103 	veor	d17,d24,d25
   1104 	vadd.i64	d27,d28
   1105 	vbsl	d30,d20,d19		@ Maj(a,b,c)
   1106 	veor	d17,d26			@ Sigma0(a)
   1107 	vadd.i64	d21,d27
   1108 	vadd.i64	d30,d27
   1109 	@ vadd.i64	d17,d30
   1110 	vshr.u64	d24,d21,#14	@ 15
   1111 #if 15<16
   1112 	vld1.64	{d15},[r1]!	@ handles unaligned
   1113 #endif
   1114 	vshr.u64	d25,d21,#18
   1115 #if 15>0
   1116 	vadd.i64	d17,d30			@ h+=Maj from the past
   1117 #endif
   1118 	vshr.u64	d26,d21,#41
   1119 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1120 	vsli.64	d24,d21,#50
   1121 	vsli.64	d25,d21,#46
   1122 	vmov	d29,d21
   1123 	vsli.64	d26,d21,#23
   1124 #if 15<16 && defined(__ARMEL__)
   1125 	vrev64.8	d15,d15
   1126 #endif
   1127 	veor	d25,d24
   1128 	vbsl	d29,d22,d23		@ Ch(e,f,g)
   1129 	vshr.u64	d24,d17,#28
   1130 	veor	d26,d25			@ Sigma1(e)
   1131 	vadd.i64	d27,d29,d16
   1132 	vshr.u64	d25,d17,#34
   1133 	vsli.64	d24,d17,#36
   1134 	vadd.i64	d27,d26
   1135 	vshr.u64	d26,d17,#39
   1136 	vadd.i64	d28,d15
   1137 	vsli.64	d25,d17,#30
   1138 	veor	d30,d17,d18
   1139 	vsli.64	d26,d17,#25
   1140 	veor	d16,d24,d25
   1141 	vadd.i64	d27,d28
   1142 	vbsl	d30,d19,d18		@ Maj(a,b,c)
   1143 	veor	d16,d26			@ Sigma0(a)
   1144 	vadd.i64	d20,d27
   1145 	vadd.i64	d30,d27
   1146 	@ vadd.i64	d16,d30
   1147 	mov	r12,#4
   1148 .L16_79_neon:
   1149 	subs	r12,#1
   1150 	vshr.u64	q12,q7,#19
   1151 	vshr.u64	q13,q7,#61
   1152 	vadd.i64	d16,d30			@ h+=Maj from the past
   1153 	vshr.u64	q15,q7,#6
   1154 	vsli.64	q12,q7,#45
   1155 	vext.8	q14,q0,q1,#8	@ X[i+1]
   1156 	vsli.64	q13,q7,#3
   1157 	veor	q15,q12
   1158 	vshr.u64	q12,q14,#1
   1159 	veor	q15,q13				@ sigma1(X[i+14])
   1160 	vshr.u64	q13,q14,#8
   1161 	vadd.i64	q0,q15
   1162 	vshr.u64	q15,q14,#7
   1163 	vsli.64	q12,q14,#63
   1164 	vsli.64	q13,q14,#56
   1165 	vext.8	q14,q4,q5,#8	@ X[i+9]
   1166 	veor	q15,q12
   1167 	vshr.u64	d24,d20,#14		@ from NEON_00_15
   1168 	vadd.i64	q0,q14
   1169 	vshr.u64	d25,d20,#18		@ from NEON_00_15
   1170 	veor	q15,q13				@ sigma0(X[i+1])
   1171 	vshr.u64	d26,d20,#41		@ from NEON_00_15
   1172 	vadd.i64	q0,q15
   1173 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1174 	vsli.64	d24,d20,#50
   1175 	vsli.64	d25,d20,#46
   1176 	vmov	d29,d20
   1177 	vsli.64	d26,d20,#23
   1178 #if 16<16 && defined(__ARMEL__)
   1179 	vrev64.8	,
   1180 #endif
   1181 	veor	d25,d24
   1182 	vbsl	d29,d21,d22		@ Ch(e,f,g)
   1183 	vshr.u64	d24,d16,#28
   1184 	veor	d26,d25			@ Sigma1(e)
   1185 	vadd.i64	d27,d29,d23
   1186 	vshr.u64	d25,d16,#34
   1187 	vsli.64	d24,d16,#36
   1188 	vadd.i64	d27,d26
   1189 	vshr.u64	d26,d16,#39
   1190 	vadd.i64	d28,d0
   1191 	vsli.64	d25,d16,#30
   1192 	veor	d30,d16,d17
   1193 	vsli.64	d26,d16,#25
   1194 	veor	d23,d24,d25
   1195 	vadd.i64	d27,d28
   1196 	vbsl	d30,d18,d17		@ Maj(a,b,c)
   1197 	veor	d23,d26			@ Sigma0(a)
   1198 	vadd.i64	d19,d27
   1199 	vadd.i64	d30,d27
   1200 	@ vadd.i64	d23,d30
   1201 	vshr.u64	d24,d19,#14	@ 17
   1202 #if 17<16
   1203 	vld1.64	{d1},[r1]!	@ handles unaligned
   1204 #endif
   1205 	vshr.u64	d25,d19,#18
   1206 #if 17>0
   1207 	vadd.i64	d23,d30			@ h+=Maj from the past
   1208 #endif
   1209 	vshr.u64	d26,d19,#41
   1210 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1211 	vsli.64	d24,d19,#50
   1212 	vsli.64	d25,d19,#46
   1213 	vmov	d29,d19
   1214 	vsli.64	d26,d19,#23
   1215 #if 17<16 && defined(__ARMEL__)
   1216 	vrev64.8	,
   1217 #endif
   1218 	veor	d25,d24
   1219 	vbsl	d29,d20,d21		@ Ch(e,f,g)
   1220 	vshr.u64	d24,d23,#28
   1221 	veor	d26,d25			@ Sigma1(e)
   1222 	vadd.i64	d27,d29,d22
   1223 	vshr.u64	d25,d23,#34
   1224 	vsli.64	d24,d23,#36
   1225 	vadd.i64	d27,d26
   1226 	vshr.u64	d26,d23,#39
   1227 	vadd.i64	d28,d1
   1228 	vsli.64	d25,d23,#30
   1229 	veor	d30,d23,d16
   1230 	vsli.64	d26,d23,#25
   1231 	veor	d22,d24,d25
   1232 	vadd.i64	d27,d28
   1233 	vbsl	d30,d17,d16		@ Maj(a,b,c)
   1234 	veor	d22,d26			@ Sigma0(a)
   1235 	vadd.i64	d18,d27
   1236 	vadd.i64	d30,d27
   1237 	@ vadd.i64	d22,d30
   1238 	vshr.u64	q12,q0,#19
   1239 	vshr.u64	q13,q0,#61
   1240 	vadd.i64	d22,d30			@ h+=Maj from the past
   1241 	vshr.u64	q15,q0,#6
   1242 	vsli.64	q12,q0,#45
   1243 	vext.8	q14,q1,q2,#8	@ X[i+1]
   1244 	vsli.64	q13,q0,#3
   1245 	veor	q15,q12
   1246 	vshr.u64	q12,q14,#1
   1247 	veor	q15,q13				@ sigma1(X[i+14])
   1248 	vshr.u64	q13,q14,#8
   1249 	vadd.i64	q1,q15
   1250 	vshr.u64	q15,q14,#7
   1251 	vsli.64	q12,q14,#63
   1252 	vsli.64	q13,q14,#56
   1253 	vext.8	q14,q5,q6,#8	@ X[i+9]
   1254 	veor	q15,q12
   1255 	vshr.u64	d24,d18,#14		@ from NEON_00_15
   1256 	vadd.i64	q1,q14
   1257 	vshr.u64	d25,d18,#18		@ from NEON_00_15
   1258 	veor	q15,q13				@ sigma0(X[i+1])
   1259 	vshr.u64	d26,d18,#41		@ from NEON_00_15
   1260 	vadd.i64	q1,q15
   1261 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1262 	vsli.64	d24,d18,#50
   1263 	vsli.64	d25,d18,#46
   1264 	vmov	d29,d18
   1265 	vsli.64	d26,d18,#23
   1266 #if 18<16 && defined(__ARMEL__)
   1267 	vrev64.8	,
   1268 #endif
   1269 	veor	d25,d24
   1270 	vbsl	d29,d19,d20		@ Ch(e,f,g)
   1271 	vshr.u64	d24,d22,#28
   1272 	veor	d26,d25			@ Sigma1(e)
   1273 	vadd.i64	d27,d29,d21
   1274 	vshr.u64	d25,d22,#34
   1275 	vsli.64	d24,d22,#36
   1276 	vadd.i64	d27,d26
   1277 	vshr.u64	d26,d22,#39
   1278 	vadd.i64	d28,d2
   1279 	vsli.64	d25,d22,#30
   1280 	veor	d30,d22,d23
   1281 	vsli.64	d26,d22,#25
   1282 	veor	d21,d24,d25
   1283 	vadd.i64	d27,d28
   1284 	vbsl	d30,d16,d23		@ Maj(a,b,c)
   1285 	veor	d21,d26			@ Sigma0(a)
   1286 	vadd.i64	d17,d27
   1287 	vadd.i64	d30,d27
   1288 	@ vadd.i64	d21,d30
   1289 	vshr.u64	d24,d17,#14	@ 19
   1290 #if 19<16
   1291 	vld1.64	{d3},[r1]!	@ handles unaligned
   1292 #endif
   1293 	vshr.u64	d25,d17,#18
   1294 #if 19>0
   1295 	vadd.i64	d21,d30			@ h+=Maj from the past
   1296 #endif
   1297 	vshr.u64	d26,d17,#41
   1298 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1299 	vsli.64	d24,d17,#50
   1300 	vsli.64	d25,d17,#46
   1301 	vmov	d29,d17
   1302 	vsli.64	d26,d17,#23
   1303 #if 19<16 && defined(__ARMEL__)
   1304 	vrev64.8	,
   1305 #endif
   1306 	veor	d25,d24
   1307 	vbsl	d29,d18,d19		@ Ch(e,f,g)
   1308 	vshr.u64	d24,d21,#28
   1309 	veor	d26,d25			@ Sigma1(e)
   1310 	vadd.i64	d27,d29,d20
   1311 	vshr.u64	d25,d21,#34
   1312 	vsli.64	d24,d21,#36
   1313 	vadd.i64	d27,d26
   1314 	vshr.u64	d26,d21,#39
   1315 	vadd.i64	d28,d3
   1316 	vsli.64	d25,d21,#30
   1317 	veor	d30,d21,d22
   1318 	vsli.64	d26,d21,#25
   1319 	veor	d20,d24,d25
   1320 	vadd.i64	d27,d28
   1321 	vbsl	d30,d23,d22		@ Maj(a,b,c)
   1322 	veor	d20,d26			@ Sigma0(a)
   1323 	vadd.i64	d16,d27
   1324 	vadd.i64	d30,d27
   1325 	@ vadd.i64	d20,d30
   1326 	vshr.u64	q12,q1,#19
   1327 	vshr.u64	q13,q1,#61
   1328 	vadd.i64	d20,d30			@ h+=Maj from the past
   1329 	vshr.u64	q15,q1,#6
   1330 	vsli.64	q12,q1,#45
   1331 	vext.8	q14,q2,q3,#8	@ X[i+1]
   1332 	vsli.64	q13,q1,#3
   1333 	veor	q15,q12
   1334 	vshr.u64	q12,q14,#1
   1335 	veor	q15,q13				@ sigma1(X[i+14])
   1336 	vshr.u64	q13,q14,#8
   1337 	vadd.i64	q2,q15
   1338 	vshr.u64	q15,q14,#7
   1339 	vsli.64	q12,q14,#63
   1340 	vsli.64	q13,q14,#56
   1341 	vext.8	q14,q6,q7,#8	@ X[i+9]
   1342 	veor	q15,q12
   1343 	vshr.u64	d24,d16,#14		@ from NEON_00_15
   1344 	vadd.i64	q2,q14
   1345 	vshr.u64	d25,d16,#18		@ from NEON_00_15
   1346 	veor	q15,q13				@ sigma0(X[i+1])
   1347 	vshr.u64	d26,d16,#41		@ from NEON_00_15
   1348 	vadd.i64	q2,q15
   1349 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1350 	vsli.64	d24,d16,#50
   1351 	vsli.64	d25,d16,#46
   1352 	vmov	d29,d16
   1353 	vsli.64	d26,d16,#23
   1354 #if 20<16 && defined(__ARMEL__)
   1355 	vrev64.8	,
   1356 #endif
   1357 	veor	d25,d24
   1358 	vbsl	d29,d17,d18		@ Ch(e,f,g)
   1359 	vshr.u64	d24,d20,#28
   1360 	veor	d26,d25			@ Sigma1(e)
   1361 	vadd.i64	d27,d29,d19
   1362 	vshr.u64	d25,d20,#34
   1363 	vsli.64	d24,d20,#36
   1364 	vadd.i64	d27,d26
   1365 	vshr.u64	d26,d20,#39
   1366 	vadd.i64	d28,d4
   1367 	vsli.64	d25,d20,#30
   1368 	veor	d30,d20,d21
   1369 	vsli.64	d26,d20,#25
   1370 	veor	d19,d24,d25
   1371 	vadd.i64	d27,d28
   1372 	vbsl	d30,d22,d21		@ Maj(a,b,c)
   1373 	veor	d19,d26			@ Sigma0(a)
   1374 	vadd.i64	d23,d27
   1375 	vadd.i64	d30,d27
   1376 	@ vadd.i64	d19,d30
   1377 	vshr.u64	d24,d23,#14	@ 21
   1378 #if 21<16
   1379 	vld1.64	{d5},[r1]!	@ handles unaligned
   1380 #endif
   1381 	vshr.u64	d25,d23,#18
   1382 #if 21>0
   1383 	vadd.i64	d19,d30			@ h+=Maj from the past
   1384 #endif
   1385 	vshr.u64	d26,d23,#41
   1386 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1387 	vsli.64	d24,d23,#50
   1388 	vsli.64	d25,d23,#46
   1389 	vmov	d29,d23
   1390 	vsli.64	d26,d23,#23
   1391 #if 21<16 && defined(__ARMEL__)
   1392 	vrev64.8	,
   1393 #endif
   1394 	veor	d25,d24
   1395 	vbsl	d29,d16,d17		@ Ch(e,f,g)
   1396 	vshr.u64	d24,d19,#28
   1397 	veor	d26,d25			@ Sigma1(e)
   1398 	vadd.i64	d27,d29,d18
   1399 	vshr.u64	d25,d19,#34
   1400 	vsli.64	d24,d19,#36
   1401 	vadd.i64	d27,d26
   1402 	vshr.u64	d26,d19,#39
   1403 	vadd.i64	d28,d5
   1404 	vsli.64	d25,d19,#30
   1405 	veor	d30,d19,d20
   1406 	vsli.64	d26,d19,#25
   1407 	veor	d18,d24,d25
   1408 	vadd.i64	d27,d28
   1409 	vbsl	d30,d21,d20		@ Maj(a,b,c)
   1410 	veor	d18,d26			@ Sigma0(a)
   1411 	vadd.i64	d22,d27
   1412 	vadd.i64	d30,d27
   1413 	@ vadd.i64	d18,d30
   1414 	vshr.u64	q12,q2,#19
   1415 	vshr.u64	q13,q2,#61
   1416 	vadd.i64	d18,d30			@ h+=Maj from the past
   1417 	vshr.u64	q15,q2,#6
   1418 	vsli.64	q12,q2,#45
   1419 	vext.8	q14,q3,q4,#8	@ X[i+1]
   1420 	vsli.64	q13,q2,#3
   1421 	veor	q15,q12
   1422 	vshr.u64	q12,q14,#1
   1423 	veor	q15,q13				@ sigma1(X[i+14])
   1424 	vshr.u64	q13,q14,#8
   1425 	vadd.i64	q3,q15
   1426 	vshr.u64	q15,q14,#7
   1427 	vsli.64	q12,q14,#63
   1428 	vsli.64	q13,q14,#56
   1429 	vext.8	q14,q7,q0,#8	@ X[i+9]
   1430 	veor	q15,q12
   1431 	vshr.u64	d24,d22,#14		@ from NEON_00_15
   1432 	vadd.i64	q3,q14
   1433 	vshr.u64	d25,d22,#18		@ from NEON_00_15
   1434 	veor	q15,q13				@ sigma0(X[i+1])
   1435 	vshr.u64	d26,d22,#41		@ from NEON_00_15
   1436 	vadd.i64	q3,q15
   1437 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1438 	vsli.64	d24,d22,#50
   1439 	vsli.64	d25,d22,#46
   1440 	vmov	d29,d22
   1441 	vsli.64	d26,d22,#23
   1442 #if 22<16 && defined(__ARMEL__)
   1443 	vrev64.8	,
   1444 #endif
   1445 	veor	d25,d24
   1446 	vbsl	d29,d23,d16		@ Ch(e,f,g)
   1447 	vshr.u64	d24,d18,#28
   1448 	veor	d26,d25			@ Sigma1(e)
   1449 	vadd.i64	d27,d29,d17
   1450 	vshr.u64	d25,d18,#34
   1451 	vsli.64	d24,d18,#36
   1452 	vadd.i64	d27,d26
   1453 	vshr.u64	d26,d18,#39
   1454 	vadd.i64	d28,d6
   1455 	vsli.64	d25,d18,#30
   1456 	veor	d30,d18,d19
   1457 	vsli.64	d26,d18,#25
   1458 	veor	d17,d24,d25
   1459 	vadd.i64	d27,d28
   1460 	vbsl	d30,d20,d19		@ Maj(a,b,c)
   1461 	veor	d17,d26			@ Sigma0(a)
   1462 	vadd.i64	d21,d27
   1463 	vadd.i64	d30,d27
   1464 	@ vadd.i64	d17,d30
   1465 	vshr.u64	d24,d21,#14	@ 23
   1466 #if 23<16
   1467 	vld1.64	{d7},[r1]!	@ handles unaligned
   1468 #endif
   1469 	vshr.u64	d25,d21,#18
   1470 #if 23>0
   1471 	vadd.i64	d17,d30			@ h+=Maj from the past
   1472 #endif
   1473 	vshr.u64	d26,d21,#41
   1474 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1475 	vsli.64	d24,d21,#50
   1476 	vsli.64	d25,d21,#46
   1477 	vmov	d29,d21
   1478 	vsli.64	d26,d21,#23
   1479 #if 23<16 && defined(__ARMEL__)
   1480 	vrev64.8	,
   1481 #endif
   1482 	veor	d25,d24
   1483 	vbsl	d29,d22,d23		@ Ch(e,f,g)
   1484 	vshr.u64	d24,d17,#28
   1485 	veor	d26,d25			@ Sigma1(e)
   1486 	vadd.i64	d27,d29,d16
   1487 	vshr.u64	d25,d17,#34
   1488 	vsli.64	d24,d17,#36
   1489 	vadd.i64	d27,d26
   1490 	vshr.u64	d26,d17,#39
   1491 	vadd.i64	d28,d7
   1492 	vsli.64	d25,d17,#30
   1493 	veor	d30,d17,d18
   1494 	vsli.64	d26,d17,#25
   1495 	veor	d16,d24,d25
   1496 	vadd.i64	d27,d28
   1497 	vbsl	d30,d19,d18		@ Maj(a,b,c)
   1498 	veor	d16,d26			@ Sigma0(a)
   1499 	vadd.i64	d20,d27
   1500 	vadd.i64	d30,d27
   1501 	@ vadd.i64	d16,d30
   1502 	vshr.u64	q12,q3,#19
   1503 	vshr.u64	q13,q3,#61
   1504 	vadd.i64	d16,d30			@ h+=Maj from the past
   1505 	vshr.u64	q15,q3,#6
   1506 	vsli.64	q12,q3,#45
   1507 	vext.8	q14,q4,q5,#8	@ X[i+1]
   1508 	vsli.64	q13,q3,#3
   1509 	veor	q15,q12
   1510 	vshr.u64	q12,q14,#1
   1511 	veor	q15,q13				@ sigma1(X[i+14])
   1512 	vshr.u64	q13,q14,#8
   1513 	vadd.i64	q4,q15
   1514 	vshr.u64	q15,q14,#7
   1515 	vsli.64	q12,q14,#63
   1516 	vsli.64	q13,q14,#56
   1517 	vext.8	q14,q0,q1,#8	@ X[i+9]
   1518 	veor	q15,q12
   1519 	vshr.u64	d24,d20,#14		@ from NEON_00_15
   1520 	vadd.i64	q4,q14
   1521 	vshr.u64	d25,d20,#18		@ from NEON_00_15
   1522 	veor	q15,q13				@ sigma0(X[i+1])
   1523 	vshr.u64	d26,d20,#41		@ from NEON_00_15
   1524 	vadd.i64	q4,q15
   1525 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1526 	vsli.64	d24,d20,#50
   1527 	vsli.64	d25,d20,#46
   1528 	vmov	d29,d20
   1529 	vsli.64	d26,d20,#23
   1530 #if 24<16 && defined(__ARMEL__)
   1531 	vrev64.8	,
   1532 #endif
   1533 	veor	d25,d24
   1534 	vbsl	d29,d21,d22		@ Ch(e,f,g)
   1535 	vshr.u64	d24,d16,#28
   1536 	veor	d26,d25			@ Sigma1(e)
   1537 	vadd.i64	d27,d29,d23
   1538 	vshr.u64	d25,d16,#34
   1539 	vsli.64	d24,d16,#36
   1540 	vadd.i64	d27,d26
   1541 	vshr.u64	d26,d16,#39
   1542 	vadd.i64	d28,d8
   1543 	vsli.64	d25,d16,#30
   1544 	veor	d30,d16,d17
   1545 	vsli.64	d26,d16,#25
   1546 	veor	d23,d24,d25
   1547 	vadd.i64	d27,d28
   1548 	vbsl	d30,d18,d17		@ Maj(a,b,c)
   1549 	veor	d23,d26			@ Sigma0(a)
   1550 	vadd.i64	d19,d27
   1551 	vadd.i64	d30,d27
   1552 	@ vadd.i64	d23,d30
   1553 	vshr.u64	d24,d19,#14	@ 25
   1554 #if 25<16
   1555 	vld1.64	{d9},[r1]!	@ handles unaligned
   1556 #endif
   1557 	vshr.u64	d25,d19,#18
   1558 #if 25>0
   1559 	vadd.i64	d23,d30			@ h+=Maj from the past
   1560 #endif
   1561 	vshr.u64	d26,d19,#41
   1562 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1563 	vsli.64	d24,d19,#50
   1564 	vsli.64	d25,d19,#46
   1565 	vmov	d29,d19
   1566 	vsli.64	d26,d19,#23
   1567 #if 25<16 && defined(__ARMEL__)
   1568 	vrev64.8	,
   1569 #endif
   1570 	veor	d25,d24
   1571 	vbsl	d29,d20,d21		@ Ch(e,f,g)
   1572 	vshr.u64	d24,d23,#28
   1573 	veor	d26,d25			@ Sigma1(e)
   1574 	vadd.i64	d27,d29,d22
   1575 	vshr.u64	d25,d23,#34
   1576 	vsli.64	d24,d23,#36
   1577 	vadd.i64	d27,d26
   1578 	vshr.u64	d26,d23,#39
   1579 	vadd.i64	d28,d9
   1580 	vsli.64	d25,d23,#30
   1581 	veor	d30,d23,d16
   1582 	vsli.64	d26,d23,#25
   1583 	veor	d22,d24,d25
   1584 	vadd.i64	d27,d28
   1585 	vbsl	d30,d17,d16		@ Maj(a,b,c)
   1586 	veor	d22,d26			@ Sigma0(a)
   1587 	vadd.i64	d18,d27
   1588 	vadd.i64	d30,d27
   1589 	@ vadd.i64	d22,d30
   1590 	vshr.u64	q12,q4,#19
   1591 	vshr.u64	q13,q4,#61
   1592 	vadd.i64	d22,d30			@ h+=Maj from the past
   1593 	vshr.u64	q15,q4,#6
   1594 	vsli.64	q12,q4,#45
   1595 	vext.8	q14,q5,q6,#8	@ X[i+1]
   1596 	vsli.64	q13,q4,#3
   1597 	veor	q15,q12
   1598 	vshr.u64	q12,q14,#1
   1599 	veor	q15,q13				@ sigma1(X[i+14])
   1600 	vshr.u64	q13,q14,#8
   1601 	vadd.i64	q5,q15
   1602 	vshr.u64	q15,q14,#7
   1603 	vsli.64	q12,q14,#63
   1604 	vsli.64	q13,q14,#56
   1605 	vext.8	q14,q1,q2,#8	@ X[i+9]
   1606 	veor	q15,q12
   1607 	vshr.u64	d24,d18,#14		@ from NEON_00_15
   1608 	vadd.i64	q5,q14
   1609 	vshr.u64	d25,d18,#18		@ from NEON_00_15
   1610 	veor	q15,q13				@ sigma0(X[i+1])
   1611 	vshr.u64	d26,d18,#41		@ from NEON_00_15
   1612 	vadd.i64	q5,q15
   1613 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1614 	vsli.64	d24,d18,#50
   1615 	vsli.64	d25,d18,#46
   1616 	vmov	d29,d18
   1617 	vsli.64	d26,d18,#23
   1618 #if 26<16 && defined(__ARMEL__)
   1619 	vrev64.8	,
   1620 #endif
   1621 	veor	d25,d24
   1622 	vbsl	d29,d19,d20		@ Ch(e,f,g)
   1623 	vshr.u64	d24,d22,#28
   1624 	veor	d26,d25			@ Sigma1(e)
   1625 	vadd.i64	d27,d29,d21
   1626 	vshr.u64	d25,d22,#34
   1627 	vsli.64	d24,d22,#36
   1628 	vadd.i64	d27,d26
   1629 	vshr.u64	d26,d22,#39
   1630 	vadd.i64	d28,d10
   1631 	vsli.64	d25,d22,#30
   1632 	veor	d30,d22,d23
   1633 	vsli.64	d26,d22,#25
   1634 	veor	d21,d24,d25
   1635 	vadd.i64	d27,d28
   1636 	vbsl	d30,d16,d23		@ Maj(a,b,c)
   1637 	veor	d21,d26			@ Sigma0(a)
   1638 	vadd.i64	d17,d27
   1639 	vadd.i64	d30,d27
   1640 	@ vadd.i64	d21,d30
   1641 	vshr.u64	d24,d17,#14	@ 27
   1642 #if 27<16
   1643 	vld1.64	{d11},[r1]!	@ handles unaligned
   1644 #endif
   1645 	vshr.u64	d25,d17,#18
   1646 #if 27>0
   1647 	vadd.i64	d21,d30			@ h+=Maj from the past
   1648 #endif
   1649 	vshr.u64	d26,d17,#41
   1650 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1651 	vsli.64	d24,d17,#50
   1652 	vsli.64	d25,d17,#46
   1653 	vmov	d29,d17
   1654 	vsli.64	d26,d17,#23
   1655 #if 27<16 && defined(__ARMEL__)
   1656 	vrev64.8	,
   1657 #endif
   1658 	veor	d25,d24
   1659 	vbsl	d29,d18,d19		@ Ch(e,f,g)
   1660 	vshr.u64	d24,d21,#28
   1661 	veor	d26,d25			@ Sigma1(e)
   1662 	vadd.i64	d27,d29,d20
   1663 	vshr.u64	d25,d21,#34
   1664 	vsli.64	d24,d21,#36
   1665 	vadd.i64	d27,d26
   1666 	vshr.u64	d26,d21,#39
   1667 	vadd.i64	d28,d11
   1668 	vsli.64	d25,d21,#30
   1669 	veor	d30,d21,d22
   1670 	vsli.64	d26,d21,#25
   1671 	veor	d20,d24,d25
   1672 	vadd.i64	d27,d28
   1673 	vbsl	d30,d23,d22		@ Maj(a,b,c)
   1674 	veor	d20,d26			@ Sigma0(a)
   1675 	vadd.i64	d16,d27
   1676 	vadd.i64	d30,d27
   1677 	@ vadd.i64	d20,d30
   1678 	vshr.u64	q12,q5,#19
   1679 	vshr.u64	q13,q5,#61
   1680 	vadd.i64	d20,d30			@ h+=Maj from the past
   1681 	vshr.u64	q15,q5,#6
   1682 	vsli.64	q12,q5,#45
   1683 	vext.8	q14,q6,q7,#8	@ X[i+1]
   1684 	vsli.64	q13,q5,#3
   1685 	veor	q15,q12
   1686 	vshr.u64	q12,q14,#1
   1687 	veor	q15,q13				@ sigma1(X[i+14])
   1688 	vshr.u64	q13,q14,#8
   1689 	vadd.i64	q6,q15
   1690 	vshr.u64	q15,q14,#7
   1691 	vsli.64	q12,q14,#63
   1692 	vsli.64	q13,q14,#56
   1693 	vext.8	q14,q2,q3,#8	@ X[i+9]
   1694 	veor	q15,q12
   1695 	vshr.u64	d24,d16,#14		@ from NEON_00_15
   1696 	vadd.i64	q6,q14
   1697 	vshr.u64	d25,d16,#18		@ from NEON_00_15
   1698 	veor	q15,q13				@ sigma0(X[i+1])
   1699 	vshr.u64	d26,d16,#41		@ from NEON_00_15
   1700 	vadd.i64	q6,q15
   1701 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1702 	vsli.64	d24,d16,#50
   1703 	vsli.64	d25,d16,#46
   1704 	vmov	d29,d16
   1705 	vsli.64	d26,d16,#23
   1706 #if 28<16 && defined(__ARMEL__)
   1707 	vrev64.8	,
   1708 #endif
   1709 	veor	d25,d24
   1710 	vbsl	d29,d17,d18		@ Ch(e,f,g)
   1711 	vshr.u64	d24,d20,#28
   1712 	veor	d26,d25			@ Sigma1(e)
   1713 	vadd.i64	d27,d29,d19
   1714 	vshr.u64	d25,d20,#34
   1715 	vsli.64	d24,d20,#36
   1716 	vadd.i64	d27,d26
   1717 	vshr.u64	d26,d20,#39
   1718 	vadd.i64	d28,d12
   1719 	vsli.64	d25,d20,#30
   1720 	veor	d30,d20,d21
   1721 	vsli.64	d26,d20,#25
   1722 	veor	d19,d24,d25
   1723 	vadd.i64	d27,d28
   1724 	vbsl	d30,d22,d21		@ Maj(a,b,c)
   1725 	veor	d19,d26			@ Sigma0(a)
   1726 	vadd.i64	d23,d27
   1727 	vadd.i64	d30,d27
   1728 	@ vadd.i64	d19,d30
   1729 	vshr.u64	d24,d23,#14	@ 29
   1730 #if 29<16
   1731 	vld1.64	{d13},[r1]!	@ handles unaligned
   1732 #endif
   1733 	vshr.u64	d25,d23,#18
   1734 #if 29>0
   1735 	vadd.i64	d19,d30			@ h+=Maj from the past
   1736 #endif
   1737 	vshr.u64	d26,d23,#41
   1738 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1739 	vsli.64	d24,d23,#50
   1740 	vsli.64	d25,d23,#46
   1741 	vmov	d29,d23
   1742 	vsli.64	d26,d23,#23
   1743 #if 29<16 && defined(__ARMEL__)
   1744 	vrev64.8	,
   1745 #endif
   1746 	veor	d25,d24
   1747 	vbsl	d29,d16,d17		@ Ch(e,f,g)
   1748 	vshr.u64	d24,d19,#28
   1749 	veor	d26,d25			@ Sigma1(e)
   1750 	vadd.i64	d27,d29,d18
   1751 	vshr.u64	d25,d19,#34
   1752 	vsli.64	d24,d19,#36
   1753 	vadd.i64	d27,d26
   1754 	vshr.u64	d26,d19,#39
   1755 	vadd.i64	d28,d13
   1756 	vsli.64	d25,d19,#30
   1757 	veor	d30,d19,d20
   1758 	vsli.64	d26,d19,#25
   1759 	veor	d18,d24,d25
   1760 	vadd.i64	d27,d28
   1761 	vbsl	d30,d21,d20		@ Maj(a,b,c)
   1762 	veor	d18,d26			@ Sigma0(a)
   1763 	vadd.i64	d22,d27
   1764 	vadd.i64	d30,d27
   1765 	@ vadd.i64	d18,d30
   1766 	vshr.u64	q12,q6,#19
   1767 	vshr.u64	q13,q6,#61
   1768 	vadd.i64	d18,d30			@ h+=Maj from the past
   1769 	vshr.u64	q15,q6,#6
   1770 	vsli.64	q12,q6,#45
   1771 	vext.8	q14,q7,q0,#8	@ X[i+1]
   1772 	vsli.64	q13,q6,#3
   1773 	veor	q15,q12
   1774 	vshr.u64	q12,q14,#1
   1775 	veor	q15,q13				@ sigma1(X[i+14])
   1776 	vshr.u64	q13,q14,#8
   1777 	vadd.i64	q7,q15
   1778 	vshr.u64	q15,q14,#7
   1779 	vsli.64	q12,q14,#63
   1780 	vsli.64	q13,q14,#56
   1781 	vext.8	q14,q3,q4,#8	@ X[i+9]
   1782 	veor	q15,q12
   1783 	vshr.u64	d24,d22,#14		@ from NEON_00_15
   1784 	vadd.i64	q7,q14
   1785 	vshr.u64	d25,d22,#18		@ from NEON_00_15
   1786 	veor	q15,q13				@ sigma0(X[i+1])
   1787 	vshr.u64	d26,d22,#41		@ from NEON_00_15
   1788 	vadd.i64	q7,q15
   1789 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1790 	vsli.64	d24,d22,#50
   1791 	vsli.64	d25,d22,#46
   1792 	vmov	d29,d22
   1793 	vsli.64	d26,d22,#23
   1794 #if 30<16 && defined(__ARMEL__)
   1795 	vrev64.8	,
   1796 #endif
   1797 	veor	d25,d24
   1798 	vbsl	d29,d23,d16		@ Ch(e,f,g)
   1799 	vshr.u64	d24,d18,#28
   1800 	veor	d26,d25			@ Sigma1(e)
   1801 	vadd.i64	d27,d29,d17
   1802 	vshr.u64	d25,d18,#34
   1803 	vsli.64	d24,d18,#36
   1804 	vadd.i64	d27,d26
   1805 	vshr.u64	d26,d18,#39
   1806 	vadd.i64	d28,d14
   1807 	vsli.64	d25,d18,#30
   1808 	veor	d30,d18,d19
   1809 	vsli.64	d26,d18,#25
   1810 	veor	d17,d24,d25
   1811 	vadd.i64	d27,d28
   1812 	vbsl	d30,d20,d19		@ Maj(a,b,c)
   1813 	veor	d17,d26			@ Sigma0(a)
   1814 	vadd.i64	d21,d27
   1815 	vadd.i64	d30,d27
   1816 	@ vadd.i64	d17,d30
   1817 	vshr.u64	d24,d21,#14	@ 31
   1818 #if 31<16
   1819 	vld1.64	{d15},[r1]!	@ handles unaligned
   1820 #endif
   1821 	vshr.u64	d25,d21,#18
   1822 #if 31>0
   1823 	vadd.i64	d17,d30			@ h+=Maj from the past
   1824 #endif
   1825 	vshr.u64	d26,d21,#41
   1826 	vld1.64	{d28},[r3,:64]!	@ K[i++]
   1827 	vsli.64	d24,d21,#50
   1828 	vsli.64	d25,d21,#46
   1829 	vmov	d29,d21
   1830 	vsli.64	d26,d21,#23
   1831 #if 31<16 && defined(__ARMEL__)
   1832 	vrev64.8	,
   1833 #endif
   1834 	veor	d25,d24
   1835 	vbsl	d29,d22,d23		@ Ch(e,f,g)
   1836 	vshr.u64	d24,d17,#28
   1837 	veor	d26,d25			@ Sigma1(e)
   1838 	vadd.i64	d27,d29,d16
   1839 	vshr.u64	d25,d17,#34
   1840 	vsli.64	d24,d17,#36
   1841 	vadd.i64	d27,d26
   1842 	vshr.u64	d26,d17,#39
   1843 	vadd.i64	d28,d15
   1844 	vsli.64	d25,d17,#30
   1845 	veor	d30,d17,d18
   1846 	vsli.64	d26,d17,#25
   1847 	veor	d16,d24,d25
   1848 	vadd.i64	d27,d28
   1849 	vbsl	d30,d19,d18		@ Maj(a,b,c)
   1850 	veor	d16,d26			@ Sigma0(a)
   1851 	vadd.i64	d20,d27
   1852 	vadd.i64	d30,d27
   1853 	@ vadd.i64	d16,d30
   1854 	bne	.L16_79_neon
   1855 
   1856 	vadd.i64	d16,d30		@ h+=Maj from the past
   1857 	vldmia	r0,{d24,d25,d26,d27,d28,d29,d30,d31}	@ load context to temp
   1858 	vadd.i64	q8,q12		@ vectorized accumulate
   1859 	vadd.i64	q9,q13
   1860 	vadd.i64	q10,q14
   1861 	vadd.i64	q11,q15
   1862 	vstmia	r0,{d16,d17,d18,d19,d20,d21,d22,d23}	@ save context
   1863 	teq	r1,r2
   1864 	sub	r3,#640	@ rewind K512
   1865 	bne	.Loop_neon
   1866 
   1867 	VFP_ABI_POP
   1868 	bx	lr				@ .word	0xe12fff1e
   1869 .size	sha512_block_data_order_neon,.-sha512_block_data_order_neon
   1870 #endif
   1871 .byte	83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,52,47,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
   1872 .align	2
   1873 .align	2
   1874 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
   1875 .comm	OPENSSL_armcap_P,4,4
   1876 .hidden	OPENSSL_armcap_P
   1877 #endif
   1878 #endif
   1879