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