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