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