Home | History | Annotate | Download | only in fipsmodule
      1 // This file is generated from a similarly-named Perl script in the BoringSSL
      2 // source tree. Do not edit by hand.
      3 
      4 #if defined(__has_feature)
      5 #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
      6 #define OPENSSL_NO_ASM
      7 #endif
      8 #endif
      9 
     10 #if !defined(OPENSSL_NO_ASM)
     11 #if defined(BORINGSSL_PREFIX)
     12 #include <boringssl_prefix_symbols_asm.h>
     13 #endif
     14 // Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
     15 //
     16 // Licensed under the OpenSSL license (the "License").  You may not use
     17 // this file except in compliance with the License.  You can obtain a copy
     18 // in the file LICENSE in the source distribution or at
     19 // https://www.openssl.org/source/license.html
     20 
     21 // ====================================================================
     22 // Written by Andy Polyakov <appro (at) openssl.org> for the OpenSSL
     23 // project. The module is, however, dual licensed under OpenSSL and
     24 // CRYPTOGAMS licenses depending on where you obtain it. For further
     25 // details see http://www.openssl.org/~appro/cryptogams/.
     26 //
     27 // Permission to use under GPLv2 terms is granted.
     28 // ====================================================================
     29 //
     30 // SHA256/512 for ARMv8.
     31 //
     32 // Performance in cycles per processed byte and improvement coefficient
     33 // over code generated with "default" compiler:
     34 //
     35 //		SHA256-hw	SHA256(*)	SHA512
     36 // Apple A7	1.97		10.5 (+33%)	6.73 (-1%(**))
     37 // Cortex-A53	2.38		15.5 (+115%)	10.0 (+150%(***))
     38 // Cortex-A57	2.31		11.6 (+86%)	7.51 (+260%(***))
     39 // Denver	2.01		10.5 (+26%)	6.70 (+8%)
     40 // X-Gene			20.0 (+100%)	12.8 (+300%(***))
     41 // Mongoose	2.36		13.0 (+50%)	8.36 (+33%)
     42 //
     43 // (*)	Software SHA256 results are of lesser relevance, presented
     44 //	mostly for informational purposes.
     45 // (**)	The result is a trade-off: it's possible to improve it by
     46 //	10% (or by 1 cycle per round), but at the cost of 20% loss
     47 //	on Cortex-A53 (or by 4 cycles per round).
     48 // (***)	Super-impressive coefficients over gcc-generated code are
     49 //	indication of some compiler "pathology", most notably code
     50 //	generated with -mgeneral-regs-only is significanty faster
     51 //	and the gap is only 40-90%.
     52 
     53 #ifndef	__KERNEL__
     54 # include <openssl/arm_arch.h>
     55 #endif
     56 
     57 .text
     58 
     59 
     60 .globl	_sha256_block_data_order
     61 .private_extern	_sha256_block_data_order
     62 
     63 .align	6
     64 _sha256_block_data_order:
     65 #ifndef	__KERNEL__
     66 	adrp	x16,_OPENSSL_armcap_P@PAGE
     67 	add	x16,x16,_OPENSSL_armcap_P@PAGEOFF
     68 	ldr	w16,[x16]
     69 	tst	w16,#ARMV8_SHA256
     70 	b.ne	Lv8_entry
     71 #endif
     72 	stp	x29,x30,[sp,#-128]!
     73 	add	x29,sp,#0
     74 
     75 	stp	x19,x20,[sp,#16]
     76 	stp	x21,x22,[sp,#32]
     77 	stp	x23,x24,[sp,#48]
     78 	stp	x25,x26,[sp,#64]
     79 	stp	x27,x28,[sp,#80]
     80 	sub	sp,sp,#4*4
     81 
     82 	ldp	w20,w21,[x0]				// load context
     83 	ldp	w22,w23,[x0,#2*4]
     84 	ldp	w24,w25,[x0,#4*4]
     85 	add	x2,x1,x2,lsl#6	// end of input
     86 	ldp	w26,w27,[x0,#6*4]
     87 	adrp	x30,LK256@PAGE
     88 	add	x30,x30,LK256@PAGEOFF
     89 	stp	x0,x2,[x29,#96]
     90 
     91 Loop:
     92 	ldp	w3,w4,[x1],#2*4
     93 	ldr	w19,[x30],#4			// *K++
     94 	eor	w28,w21,w22				// magic seed
     95 	str	x1,[x29,#112]
     96 #ifndef	__ARMEB__
     97 	rev	w3,w3			// 0
     98 #endif
     99 	ror	w16,w24,#6
    100 	add	w27,w27,w19			// h+=K[i]
    101 	eor	w6,w24,w24,ror#14
    102 	and	w17,w25,w24
    103 	bic	w19,w26,w24
    104 	add	w27,w27,w3			// h+=X[i]
    105 	orr	w17,w17,w19			// Ch(e,f,g)
    106 	eor	w19,w20,w21			// a^b, b^c in next round
    107 	eor	w16,w16,w6,ror#11	// Sigma1(e)
    108 	ror	w6,w20,#2
    109 	add	w27,w27,w17			// h+=Ch(e,f,g)
    110 	eor	w17,w20,w20,ror#9
    111 	add	w27,w27,w16			// h+=Sigma1(e)
    112 	and	w28,w28,w19			// (b^c)&=(a^b)
    113 	add	w23,w23,w27			// d+=h
    114 	eor	w28,w28,w21			// Maj(a,b,c)
    115 	eor	w17,w6,w17,ror#13	// Sigma0(a)
    116 	add	w27,w27,w28			// h+=Maj(a,b,c)
    117 	ldr	w28,[x30],#4		// *K++, w19 in next round
    118 	//add	w27,w27,w17			// h+=Sigma0(a)
    119 #ifndef	__ARMEB__
    120 	rev	w4,w4			// 1
    121 #endif
    122 	ldp	w5,w6,[x1],#2*4
    123 	add	w27,w27,w17			// h+=Sigma0(a)
    124 	ror	w16,w23,#6
    125 	add	w26,w26,w28			// h+=K[i]
    126 	eor	w7,w23,w23,ror#14
    127 	and	w17,w24,w23
    128 	bic	w28,w25,w23
    129 	add	w26,w26,w4			// h+=X[i]
    130 	orr	w17,w17,w28			// Ch(e,f,g)
    131 	eor	w28,w27,w20			// a^b, b^c in next round
    132 	eor	w16,w16,w7,ror#11	// Sigma1(e)
    133 	ror	w7,w27,#2
    134 	add	w26,w26,w17			// h+=Ch(e,f,g)
    135 	eor	w17,w27,w27,ror#9
    136 	add	w26,w26,w16			// h+=Sigma1(e)
    137 	and	w19,w19,w28			// (b^c)&=(a^b)
    138 	add	w22,w22,w26			// d+=h
    139 	eor	w19,w19,w20			// Maj(a,b,c)
    140 	eor	w17,w7,w17,ror#13	// Sigma0(a)
    141 	add	w26,w26,w19			// h+=Maj(a,b,c)
    142 	ldr	w19,[x30],#4		// *K++, w28 in next round
    143 	//add	w26,w26,w17			// h+=Sigma0(a)
    144 #ifndef	__ARMEB__
    145 	rev	w5,w5			// 2
    146 #endif
    147 	add	w26,w26,w17			// h+=Sigma0(a)
    148 	ror	w16,w22,#6
    149 	add	w25,w25,w19			// h+=K[i]
    150 	eor	w8,w22,w22,ror#14
    151 	and	w17,w23,w22
    152 	bic	w19,w24,w22
    153 	add	w25,w25,w5			// h+=X[i]
    154 	orr	w17,w17,w19			// Ch(e,f,g)
    155 	eor	w19,w26,w27			// a^b, b^c in next round
    156 	eor	w16,w16,w8,ror#11	// Sigma1(e)
    157 	ror	w8,w26,#2
    158 	add	w25,w25,w17			// h+=Ch(e,f,g)
    159 	eor	w17,w26,w26,ror#9
    160 	add	w25,w25,w16			// h+=Sigma1(e)
    161 	and	w28,w28,w19			// (b^c)&=(a^b)
    162 	add	w21,w21,w25			// d+=h
    163 	eor	w28,w28,w27			// Maj(a,b,c)
    164 	eor	w17,w8,w17,ror#13	// Sigma0(a)
    165 	add	w25,w25,w28			// h+=Maj(a,b,c)
    166 	ldr	w28,[x30],#4		// *K++, w19 in next round
    167 	//add	w25,w25,w17			// h+=Sigma0(a)
    168 #ifndef	__ARMEB__
    169 	rev	w6,w6			// 3
    170 #endif
    171 	ldp	w7,w8,[x1],#2*4
    172 	add	w25,w25,w17			// h+=Sigma0(a)
    173 	ror	w16,w21,#6
    174 	add	w24,w24,w28			// h+=K[i]
    175 	eor	w9,w21,w21,ror#14
    176 	and	w17,w22,w21
    177 	bic	w28,w23,w21
    178 	add	w24,w24,w6			// h+=X[i]
    179 	orr	w17,w17,w28			// Ch(e,f,g)
    180 	eor	w28,w25,w26			// a^b, b^c in next round
    181 	eor	w16,w16,w9,ror#11	// Sigma1(e)
    182 	ror	w9,w25,#2
    183 	add	w24,w24,w17			// h+=Ch(e,f,g)
    184 	eor	w17,w25,w25,ror#9
    185 	add	w24,w24,w16			// h+=Sigma1(e)
    186 	and	w19,w19,w28			// (b^c)&=(a^b)
    187 	add	w20,w20,w24			// d+=h
    188 	eor	w19,w19,w26			// Maj(a,b,c)
    189 	eor	w17,w9,w17,ror#13	// Sigma0(a)
    190 	add	w24,w24,w19			// h+=Maj(a,b,c)
    191 	ldr	w19,[x30],#4		// *K++, w28 in next round
    192 	//add	w24,w24,w17			// h+=Sigma0(a)
    193 #ifndef	__ARMEB__
    194 	rev	w7,w7			// 4
    195 #endif
    196 	add	w24,w24,w17			// h+=Sigma0(a)
    197 	ror	w16,w20,#6
    198 	add	w23,w23,w19			// h+=K[i]
    199 	eor	w10,w20,w20,ror#14
    200 	and	w17,w21,w20
    201 	bic	w19,w22,w20
    202 	add	w23,w23,w7			// h+=X[i]
    203 	orr	w17,w17,w19			// Ch(e,f,g)
    204 	eor	w19,w24,w25			// a^b, b^c in next round
    205 	eor	w16,w16,w10,ror#11	// Sigma1(e)
    206 	ror	w10,w24,#2
    207 	add	w23,w23,w17			// h+=Ch(e,f,g)
    208 	eor	w17,w24,w24,ror#9
    209 	add	w23,w23,w16			// h+=Sigma1(e)
    210 	and	w28,w28,w19			// (b^c)&=(a^b)
    211 	add	w27,w27,w23			// d+=h
    212 	eor	w28,w28,w25			// Maj(a,b,c)
    213 	eor	w17,w10,w17,ror#13	// Sigma0(a)
    214 	add	w23,w23,w28			// h+=Maj(a,b,c)
    215 	ldr	w28,[x30],#4		// *K++, w19 in next round
    216 	//add	w23,w23,w17			// h+=Sigma0(a)
    217 #ifndef	__ARMEB__
    218 	rev	w8,w8			// 5
    219 #endif
    220 	ldp	w9,w10,[x1],#2*4
    221 	add	w23,w23,w17			// h+=Sigma0(a)
    222 	ror	w16,w27,#6
    223 	add	w22,w22,w28			// h+=K[i]
    224 	eor	w11,w27,w27,ror#14
    225 	and	w17,w20,w27
    226 	bic	w28,w21,w27
    227 	add	w22,w22,w8			// h+=X[i]
    228 	orr	w17,w17,w28			// Ch(e,f,g)
    229 	eor	w28,w23,w24			// a^b, b^c in next round
    230 	eor	w16,w16,w11,ror#11	// Sigma1(e)
    231 	ror	w11,w23,#2
    232 	add	w22,w22,w17			// h+=Ch(e,f,g)
    233 	eor	w17,w23,w23,ror#9
    234 	add	w22,w22,w16			// h+=Sigma1(e)
    235 	and	w19,w19,w28			// (b^c)&=(a^b)
    236 	add	w26,w26,w22			// d+=h
    237 	eor	w19,w19,w24			// Maj(a,b,c)
    238 	eor	w17,w11,w17,ror#13	// Sigma0(a)
    239 	add	w22,w22,w19			// h+=Maj(a,b,c)
    240 	ldr	w19,[x30],#4		// *K++, w28 in next round
    241 	//add	w22,w22,w17			// h+=Sigma0(a)
    242 #ifndef	__ARMEB__
    243 	rev	w9,w9			// 6
    244 #endif
    245 	add	w22,w22,w17			// h+=Sigma0(a)
    246 	ror	w16,w26,#6
    247 	add	w21,w21,w19			// h+=K[i]
    248 	eor	w12,w26,w26,ror#14
    249 	and	w17,w27,w26
    250 	bic	w19,w20,w26
    251 	add	w21,w21,w9			// h+=X[i]
    252 	orr	w17,w17,w19			// Ch(e,f,g)
    253 	eor	w19,w22,w23			// a^b, b^c in next round
    254 	eor	w16,w16,w12,ror#11	// Sigma1(e)
    255 	ror	w12,w22,#2
    256 	add	w21,w21,w17			// h+=Ch(e,f,g)
    257 	eor	w17,w22,w22,ror#9
    258 	add	w21,w21,w16			// h+=Sigma1(e)
    259 	and	w28,w28,w19			// (b^c)&=(a^b)
    260 	add	w25,w25,w21			// d+=h
    261 	eor	w28,w28,w23			// Maj(a,b,c)
    262 	eor	w17,w12,w17,ror#13	// Sigma0(a)
    263 	add	w21,w21,w28			// h+=Maj(a,b,c)
    264 	ldr	w28,[x30],#4		// *K++, w19 in next round
    265 	//add	w21,w21,w17			// h+=Sigma0(a)
    266 #ifndef	__ARMEB__
    267 	rev	w10,w10			// 7
    268 #endif
    269 	ldp	w11,w12,[x1],#2*4
    270 	add	w21,w21,w17			// h+=Sigma0(a)
    271 	ror	w16,w25,#6
    272 	add	w20,w20,w28			// h+=K[i]
    273 	eor	w13,w25,w25,ror#14
    274 	and	w17,w26,w25
    275 	bic	w28,w27,w25
    276 	add	w20,w20,w10			// h+=X[i]
    277 	orr	w17,w17,w28			// Ch(e,f,g)
    278 	eor	w28,w21,w22			// a^b, b^c in next round
    279 	eor	w16,w16,w13,ror#11	// Sigma1(e)
    280 	ror	w13,w21,#2
    281 	add	w20,w20,w17			// h+=Ch(e,f,g)
    282 	eor	w17,w21,w21,ror#9
    283 	add	w20,w20,w16			// h+=Sigma1(e)
    284 	and	w19,w19,w28			// (b^c)&=(a^b)
    285 	add	w24,w24,w20			// d+=h
    286 	eor	w19,w19,w22			// Maj(a,b,c)
    287 	eor	w17,w13,w17,ror#13	// Sigma0(a)
    288 	add	w20,w20,w19			// h+=Maj(a,b,c)
    289 	ldr	w19,[x30],#4		// *K++, w28 in next round
    290 	//add	w20,w20,w17			// h+=Sigma0(a)
    291 #ifndef	__ARMEB__
    292 	rev	w11,w11			// 8
    293 #endif
    294 	add	w20,w20,w17			// h+=Sigma0(a)
    295 	ror	w16,w24,#6
    296 	add	w27,w27,w19			// h+=K[i]
    297 	eor	w14,w24,w24,ror#14
    298 	and	w17,w25,w24
    299 	bic	w19,w26,w24
    300 	add	w27,w27,w11			// h+=X[i]
    301 	orr	w17,w17,w19			// Ch(e,f,g)
    302 	eor	w19,w20,w21			// a^b, b^c in next round
    303 	eor	w16,w16,w14,ror#11	// Sigma1(e)
    304 	ror	w14,w20,#2
    305 	add	w27,w27,w17			// h+=Ch(e,f,g)
    306 	eor	w17,w20,w20,ror#9
    307 	add	w27,w27,w16			// h+=Sigma1(e)
    308 	and	w28,w28,w19			// (b^c)&=(a^b)
    309 	add	w23,w23,w27			// d+=h
    310 	eor	w28,w28,w21			// Maj(a,b,c)
    311 	eor	w17,w14,w17,ror#13	// Sigma0(a)
    312 	add	w27,w27,w28			// h+=Maj(a,b,c)
    313 	ldr	w28,[x30],#4		// *K++, w19 in next round
    314 	//add	w27,w27,w17			// h+=Sigma0(a)
    315 #ifndef	__ARMEB__
    316 	rev	w12,w12			// 9
    317 #endif
    318 	ldp	w13,w14,[x1],#2*4
    319 	add	w27,w27,w17			// h+=Sigma0(a)
    320 	ror	w16,w23,#6
    321 	add	w26,w26,w28			// h+=K[i]
    322 	eor	w15,w23,w23,ror#14
    323 	and	w17,w24,w23
    324 	bic	w28,w25,w23
    325 	add	w26,w26,w12			// h+=X[i]
    326 	orr	w17,w17,w28			// Ch(e,f,g)
    327 	eor	w28,w27,w20			// a^b, b^c in next round
    328 	eor	w16,w16,w15,ror#11	// Sigma1(e)
    329 	ror	w15,w27,#2
    330 	add	w26,w26,w17			// h+=Ch(e,f,g)
    331 	eor	w17,w27,w27,ror#9
    332 	add	w26,w26,w16			// h+=Sigma1(e)
    333 	and	w19,w19,w28			// (b^c)&=(a^b)
    334 	add	w22,w22,w26			// d+=h
    335 	eor	w19,w19,w20			// Maj(a,b,c)
    336 	eor	w17,w15,w17,ror#13	// Sigma0(a)
    337 	add	w26,w26,w19			// h+=Maj(a,b,c)
    338 	ldr	w19,[x30],#4		// *K++, w28 in next round
    339 	//add	w26,w26,w17			// h+=Sigma0(a)
    340 #ifndef	__ARMEB__
    341 	rev	w13,w13			// 10
    342 #endif
    343 	add	w26,w26,w17			// h+=Sigma0(a)
    344 	ror	w16,w22,#6
    345 	add	w25,w25,w19			// h+=K[i]
    346 	eor	w0,w22,w22,ror#14
    347 	and	w17,w23,w22
    348 	bic	w19,w24,w22
    349 	add	w25,w25,w13			// h+=X[i]
    350 	orr	w17,w17,w19			// Ch(e,f,g)
    351 	eor	w19,w26,w27			// a^b, b^c in next round
    352 	eor	w16,w16,w0,ror#11	// Sigma1(e)
    353 	ror	w0,w26,#2
    354 	add	w25,w25,w17			// h+=Ch(e,f,g)
    355 	eor	w17,w26,w26,ror#9
    356 	add	w25,w25,w16			// h+=Sigma1(e)
    357 	and	w28,w28,w19			// (b^c)&=(a^b)
    358 	add	w21,w21,w25			// d+=h
    359 	eor	w28,w28,w27			// Maj(a,b,c)
    360 	eor	w17,w0,w17,ror#13	// Sigma0(a)
    361 	add	w25,w25,w28			// h+=Maj(a,b,c)
    362 	ldr	w28,[x30],#4		// *K++, w19 in next round
    363 	//add	w25,w25,w17			// h+=Sigma0(a)
    364 #ifndef	__ARMEB__
    365 	rev	w14,w14			// 11
    366 #endif
    367 	ldp	w15,w0,[x1],#2*4
    368 	add	w25,w25,w17			// h+=Sigma0(a)
    369 	str	w6,[sp,#12]
    370 	ror	w16,w21,#6
    371 	add	w24,w24,w28			// h+=K[i]
    372 	eor	w6,w21,w21,ror#14
    373 	and	w17,w22,w21
    374 	bic	w28,w23,w21
    375 	add	w24,w24,w14			// h+=X[i]
    376 	orr	w17,w17,w28			// Ch(e,f,g)
    377 	eor	w28,w25,w26			// a^b, b^c in next round
    378 	eor	w16,w16,w6,ror#11	// Sigma1(e)
    379 	ror	w6,w25,#2
    380 	add	w24,w24,w17			// h+=Ch(e,f,g)
    381 	eor	w17,w25,w25,ror#9
    382 	add	w24,w24,w16			// h+=Sigma1(e)
    383 	and	w19,w19,w28			// (b^c)&=(a^b)
    384 	add	w20,w20,w24			// d+=h
    385 	eor	w19,w19,w26			// Maj(a,b,c)
    386 	eor	w17,w6,w17,ror#13	// Sigma0(a)
    387 	add	w24,w24,w19			// h+=Maj(a,b,c)
    388 	ldr	w19,[x30],#4		// *K++, w28 in next round
    389 	//add	w24,w24,w17			// h+=Sigma0(a)
    390 #ifndef	__ARMEB__
    391 	rev	w15,w15			// 12
    392 #endif
    393 	add	w24,w24,w17			// h+=Sigma0(a)
    394 	str	w7,[sp,#0]
    395 	ror	w16,w20,#6
    396 	add	w23,w23,w19			// h+=K[i]
    397 	eor	w7,w20,w20,ror#14
    398 	and	w17,w21,w20
    399 	bic	w19,w22,w20
    400 	add	w23,w23,w15			// h+=X[i]
    401 	orr	w17,w17,w19			// Ch(e,f,g)
    402 	eor	w19,w24,w25			// a^b, b^c in next round
    403 	eor	w16,w16,w7,ror#11	// Sigma1(e)
    404 	ror	w7,w24,#2
    405 	add	w23,w23,w17			// h+=Ch(e,f,g)
    406 	eor	w17,w24,w24,ror#9
    407 	add	w23,w23,w16			// h+=Sigma1(e)
    408 	and	w28,w28,w19			// (b^c)&=(a^b)
    409 	add	w27,w27,w23			// d+=h
    410 	eor	w28,w28,w25			// Maj(a,b,c)
    411 	eor	w17,w7,w17,ror#13	// Sigma0(a)
    412 	add	w23,w23,w28			// h+=Maj(a,b,c)
    413 	ldr	w28,[x30],#4		// *K++, w19 in next round
    414 	//add	w23,w23,w17			// h+=Sigma0(a)
    415 #ifndef	__ARMEB__
    416 	rev	w0,w0			// 13
    417 #endif
    418 	ldp	w1,w2,[x1]
    419 	add	w23,w23,w17			// h+=Sigma0(a)
    420 	str	w8,[sp,#4]
    421 	ror	w16,w27,#6
    422 	add	w22,w22,w28			// h+=K[i]
    423 	eor	w8,w27,w27,ror#14
    424 	and	w17,w20,w27
    425 	bic	w28,w21,w27
    426 	add	w22,w22,w0			// h+=X[i]
    427 	orr	w17,w17,w28			// Ch(e,f,g)
    428 	eor	w28,w23,w24			// a^b, b^c in next round
    429 	eor	w16,w16,w8,ror#11	// Sigma1(e)
    430 	ror	w8,w23,#2
    431 	add	w22,w22,w17			// h+=Ch(e,f,g)
    432 	eor	w17,w23,w23,ror#9
    433 	add	w22,w22,w16			// h+=Sigma1(e)
    434 	and	w19,w19,w28			// (b^c)&=(a^b)
    435 	add	w26,w26,w22			// d+=h
    436 	eor	w19,w19,w24			// Maj(a,b,c)
    437 	eor	w17,w8,w17,ror#13	// Sigma0(a)
    438 	add	w22,w22,w19			// h+=Maj(a,b,c)
    439 	ldr	w19,[x30],#4		// *K++, w28 in next round
    440 	//add	w22,w22,w17			// h+=Sigma0(a)
    441 #ifndef	__ARMEB__
    442 	rev	w1,w1			// 14
    443 #endif
    444 	ldr	w6,[sp,#12]
    445 	add	w22,w22,w17			// h+=Sigma0(a)
    446 	str	w9,[sp,#8]
    447 	ror	w16,w26,#6
    448 	add	w21,w21,w19			// h+=K[i]
    449 	eor	w9,w26,w26,ror#14
    450 	and	w17,w27,w26
    451 	bic	w19,w20,w26
    452 	add	w21,w21,w1			// h+=X[i]
    453 	orr	w17,w17,w19			// Ch(e,f,g)
    454 	eor	w19,w22,w23			// a^b, b^c in next round
    455 	eor	w16,w16,w9,ror#11	// Sigma1(e)
    456 	ror	w9,w22,#2
    457 	add	w21,w21,w17			// h+=Ch(e,f,g)
    458 	eor	w17,w22,w22,ror#9
    459 	add	w21,w21,w16			// h+=Sigma1(e)
    460 	and	w28,w28,w19			// (b^c)&=(a^b)
    461 	add	w25,w25,w21			// d+=h
    462 	eor	w28,w28,w23			// Maj(a,b,c)
    463 	eor	w17,w9,w17,ror#13	// Sigma0(a)
    464 	add	w21,w21,w28			// h+=Maj(a,b,c)
    465 	ldr	w28,[x30],#4		// *K++, w19 in next round
    466 	//add	w21,w21,w17			// h+=Sigma0(a)
    467 #ifndef	__ARMEB__
    468 	rev	w2,w2			// 15
    469 #endif
    470 	ldr	w7,[sp,#0]
    471 	add	w21,w21,w17			// h+=Sigma0(a)
    472 	str	w10,[sp,#12]
    473 	ror	w16,w25,#6
    474 	add	w20,w20,w28			// h+=K[i]
    475 	ror	w9,w4,#7
    476 	and	w17,w26,w25
    477 	ror	w8,w1,#17
    478 	bic	w28,w27,w25
    479 	ror	w10,w21,#2
    480 	add	w20,w20,w2			// h+=X[i]
    481 	eor	w16,w16,w25,ror#11
    482 	eor	w9,w9,w4,ror#18
    483 	orr	w17,w17,w28			// Ch(e,f,g)
    484 	eor	w28,w21,w22			// a^b, b^c in next round
    485 	eor	w16,w16,w25,ror#25	// Sigma1(e)
    486 	eor	w10,w10,w21,ror#13
    487 	add	w20,w20,w17			// h+=Ch(e,f,g)
    488 	and	w19,w19,w28			// (b^c)&=(a^b)
    489 	eor	w8,w8,w1,ror#19
    490 	eor	w9,w9,w4,lsr#3	// sigma0(X[i+1])
    491 	add	w20,w20,w16			// h+=Sigma1(e)
    492 	eor	w19,w19,w22			// Maj(a,b,c)
    493 	eor	w17,w10,w21,ror#22	// Sigma0(a)
    494 	eor	w8,w8,w1,lsr#10	// sigma1(X[i+14])
    495 	add	w3,w3,w12
    496 	add	w24,w24,w20			// d+=h
    497 	add	w20,w20,w19			// h+=Maj(a,b,c)
    498 	ldr	w19,[x30],#4		// *K++, w28 in next round
    499 	add	w3,w3,w9
    500 	add	w20,w20,w17			// h+=Sigma0(a)
    501 	add	w3,w3,w8
    502 Loop_16_xx:
    503 	ldr	w8,[sp,#4]
    504 	str	w11,[sp,#0]
    505 	ror	w16,w24,#6
    506 	add	w27,w27,w19			// h+=K[i]
    507 	ror	w10,w5,#7
    508 	and	w17,w25,w24
    509 	ror	w9,w2,#17
    510 	bic	w19,w26,w24
    511 	ror	w11,w20,#2
    512 	add	w27,w27,w3			// h+=X[i]
    513 	eor	w16,w16,w24,ror#11
    514 	eor	w10,w10,w5,ror#18
    515 	orr	w17,w17,w19			// Ch(e,f,g)
    516 	eor	w19,w20,w21			// a^b, b^c in next round
    517 	eor	w16,w16,w24,ror#25	// Sigma1(e)
    518 	eor	w11,w11,w20,ror#13
    519 	add	w27,w27,w17			// h+=Ch(e,f,g)
    520 	and	w28,w28,w19			// (b^c)&=(a^b)
    521 	eor	w9,w9,w2,ror#19
    522 	eor	w10,w10,w5,lsr#3	// sigma0(X[i+1])
    523 	add	w27,w27,w16			// h+=Sigma1(e)
    524 	eor	w28,w28,w21			// Maj(a,b,c)
    525 	eor	w17,w11,w20,ror#22	// Sigma0(a)
    526 	eor	w9,w9,w2,lsr#10	// sigma1(X[i+14])
    527 	add	w4,w4,w13
    528 	add	w23,w23,w27			// d+=h
    529 	add	w27,w27,w28			// h+=Maj(a,b,c)
    530 	ldr	w28,[x30],#4		// *K++, w19 in next round
    531 	add	w4,w4,w10
    532 	add	w27,w27,w17			// h+=Sigma0(a)
    533 	add	w4,w4,w9
    534 	ldr	w9,[sp,#8]
    535 	str	w12,[sp,#4]
    536 	ror	w16,w23,#6
    537 	add	w26,w26,w28			// h+=K[i]
    538 	ror	w11,w6,#7
    539 	and	w17,w24,w23
    540 	ror	w10,w3,#17
    541 	bic	w28,w25,w23
    542 	ror	w12,w27,#2
    543 	add	w26,w26,w4			// h+=X[i]
    544 	eor	w16,w16,w23,ror#11
    545 	eor	w11,w11,w6,ror#18
    546 	orr	w17,w17,w28			// Ch(e,f,g)
    547 	eor	w28,w27,w20			// a^b, b^c in next round
    548 	eor	w16,w16,w23,ror#25	// Sigma1(e)
    549 	eor	w12,w12,w27,ror#13
    550 	add	w26,w26,w17			// h+=Ch(e,f,g)
    551 	and	w19,w19,w28			// (b^c)&=(a^b)
    552 	eor	w10,w10,w3,ror#19
    553 	eor	w11,w11,w6,lsr#3	// sigma0(X[i+1])
    554 	add	w26,w26,w16			// h+=Sigma1(e)
    555 	eor	w19,w19,w20			// Maj(a,b,c)
    556 	eor	w17,w12,w27,ror#22	// Sigma0(a)
    557 	eor	w10,w10,w3,lsr#10	// sigma1(X[i+14])
    558 	add	w5,w5,w14
    559 	add	w22,w22,w26			// d+=h
    560 	add	w26,w26,w19			// h+=Maj(a,b,c)
    561 	ldr	w19,[x30],#4		// *K++, w28 in next round
    562 	add	w5,w5,w11
    563 	add	w26,w26,w17			// h+=Sigma0(a)
    564 	add	w5,w5,w10
    565 	ldr	w10,[sp,#12]
    566 	str	w13,[sp,#8]
    567 	ror	w16,w22,#6
    568 	add	w25,w25,w19			// h+=K[i]
    569 	ror	w12,w7,#7
    570 	and	w17,w23,w22
    571 	ror	w11,w4,#17
    572 	bic	w19,w24,w22
    573 	ror	w13,w26,#2
    574 	add	w25,w25,w5			// h+=X[i]
    575 	eor	w16,w16,w22,ror#11
    576 	eor	w12,w12,w7,ror#18
    577 	orr	w17,w17,w19			// Ch(e,f,g)
    578 	eor	w19,w26,w27			// a^b, b^c in next round
    579 	eor	w16,w16,w22,ror#25	// Sigma1(e)
    580 	eor	w13,w13,w26,ror#13
    581 	add	w25,w25,w17			// h+=Ch(e,f,g)
    582 	and	w28,w28,w19			// (b^c)&=(a^b)
    583 	eor	w11,w11,w4,ror#19
    584 	eor	w12,w12,w7,lsr#3	// sigma0(X[i+1])
    585 	add	w25,w25,w16			// h+=Sigma1(e)
    586 	eor	w28,w28,w27			// Maj(a,b,c)
    587 	eor	w17,w13,w26,ror#22	// Sigma0(a)
    588 	eor	w11,w11,w4,lsr#10	// sigma1(X[i+14])
    589 	add	w6,w6,w15
    590 	add	w21,w21,w25			// d+=h
    591 	add	w25,w25,w28			// h+=Maj(a,b,c)
    592 	ldr	w28,[x30],#4		// *K++, w19 in next round
    593 	add	w6,w6,w12
    594 	add	w25,w25,w17			// h+=Sigma0(a)
    595 	add	w6,w6,w11
    596 	ldr	w11,[sp,#0]
    597 	str	w14,[sp,#12]
    598 	ror	w16,w21,#6
    599 	add	w24,w24,w28			// h+=K[i]
    600 	ror	w13,w8,#7
    601 	and	w17,w22,w21
    602 	ror	w12,w5,#17
    603 	bic	w28,w23,w21
    604 	ror	w14,w25,#2
    605 	add	w24,w24,w6			// h+=X[i]
    606 	eor	w16,w16,w21,ror#11
    607 	eor	w13,w13,w8,ror#18
    608 	orr	w17,w17,w28			// Ch(e,f,g)
    609 	eor	w28,w25,w26			// a^b, b^c in next round
    610 	eor	w16,w16,w21,ror#25	// Sigma1(e)
    611 	eor	w14,w14,w25,ror#13
    612 	add	w24,w24,w17			// h+=Ch(e,f,g)
    613 	and	w19,w19,w28			// (b^c)&=(a^b)
    614 	eor	w12,w12,w5,ror#19
    615 	eor	w13,w13,w8,lsr#3	// sigma0(X[i+1])
    616 	add	w24,w24,w16			// h+=Sigma1(e)
    617 	eor	w19,w19,w26			// Maj(a,b,c)
    618 	eor	w17,w14,w25,ror#22	// Sigma0(a)
    619 	eor	w12,w12,w5,lsr#10	// sigma1(X[i+14])
    620 	add	w7,w7,w0
    621 	add	w20,w20,w24			// d+=h
    622 	add	w24,w24,w19			// h+=Maj(a,b,c)
    623 	ldr	w19,[x30],#4		// *K++, w28 in next round
    624 	add	w7,w7,w13
    625 	add	w24,w24,w17			// h+=Sigma0(a)
    626 	add	w7,w7,w12
    627 	ldr	w12,[sp,#4]
    628 	str	w15,[sp,#0]
    629 	ror	w16,w20,#6
    630 	add	w23,w23,w19			// h+=K[i]
    631 	ror	w14,w9,#7
    632 	and	w17,w21,w20
    633 	ror	w13,w6,#17
    634 	bic	w19,w22,w20
    635 	ror	w15,w24,#2
    636 	add	w23,w23,w7			// h+=X[i]
    637 	eor	w16,w16,w20,ror#11
    638 	eor	w14,w14,w9,ror#18
    639 	orr	w17,w17,w19			// Ch(e,f,g)
    640 	eor	w19,w24,w25			// a^b, b^c in next round
    641 	eor	w16,w16,w20,ror#25	// Sigma1(e)
    642 	eor	w15,w15,w24,ror#13
    643 	add	w23,w23,w17			// h+=Ch(e,f,g)
    644 	and	w28,w28,w19			// (b^c)&=(a^b)
    645 	eor	w13,w13,w6,ror#19
    646 	eor	w14,w14,w9,lsr#3	// sigma0(X[i+1])
    647 	add	w23,w23,w16			// h+=Sigma1(e)
    648 	eor	w28,w28,w25			// Maj(a,b,c)
    649 	eor	w17,w15,w24,ror#22	// Sigma0(a)
    650 	eor	w13,w13,w6,lsr#10	// sigma1(X[i+14])
    651 	add	w8,w8,w1
    652 	add	w27,w27,w23			// d+=h
    653 	add	w23,w23,w28			// h+=Maj(a,b,c)
    654 	ldr	w28,[x30],#4		// *K++, w19 in next round
    655 	add	w8,w8,w14
    656 	add	w23,w23,w17			// h+=Sigma0(a)
    657 	add	w8,w8,w13
    658 	ldr	w13,[sp,#8]
    659 	str	w0,[sp,#4]
    660 	ror	w16,w27,#6
    661 	add	w22,w22,w28			// h+=K[i]
    662 	ror	w15,w10,#7
    663 	and	w17,w20,w27
    664 	ror	w14,w7,#17
    665 	bic	w28,w21,w27
    666 	ror	w0,w23,#2
    667 	add	w22,w22,w8			// h+=X[i]
    668 	eor	w16,w16,w27,ror#11
    669 	eor	w15,w15,w10,ror#18
    670 	orr	w17,w17,w28			// Ch(e,f,g)
    671 	eor	w28,w23,w24			// a^b, b^c in next round
    672 	eor	w16,w16,w27,ror#25	// Sigma1(e)
    673 	eor	w0,w0,w23,ror#13
    674 	add	w22,w22,w17			// h+=Ch(e,f,g)
    675 	and	w19,w19,w28			// (b^c)&=(a^b)
    676 	eor	w14,w14,w7,ror#19
    677 	eor	w15,w15,w10,lsr#3	// sigma0(X[i+1])
    678 	add	w22,w22,w16			// h+=Sigma1(e)
    679 	eor	w19,w19,w24			// Maj(a,b,c)
    680 	eor	w17,w0,w23,ror#22	// Sigma0(a)
    681 	eor	w14,w14,w7,lsr#10	// sigma1(X[i+14])
    682 	add	w9,w9,w2
    683 	add	w26,w26,w22			// d+=h
    684 	add	w22,w22,w19			// h+=Maj(a,b,c)
    685 	ldr	w19,[x30],#4		// *K++, w28 in next round
    686 	add	w9,w9,w15
    687 	add	w22,w22,w17			// h+=Sigma0(a)
    688 	add	w9,w9,w14
    689 	ldr	w14,[sp,#12]
    690 	str	w1,[sp,#8]
    691 	ror	w16,w26,#6
    692 	add	w21,w21,w19			// h+=K[i]
    693 	ror	w0,w11,#7
    694 	and	w17,w27,w26
    695 	ror	w15,w8,#17
    696 	bic	w19,w20,w26
    697 	ror	w1,w22,#2
    698 	add	w21,w21,w9			// h+=X[i]
    699 	eor	w16,w16,w26,ror#11
    700 	eor	w0,w0,w11,ror#18
    701 	orr	w17,w17,w19			// Ch(e,f,g)
    702 	eor	w19,w22,w23			// a^b, b^c in next round
    703 	eor	w16,w16,w26,ror#25	// Sigma1(e)
    704 	eor	w1,w1,w22,ror#13
    705 	add	w21,w21,w17			// h+=Ch(e,f,g)
    706 	and	w28,w28,w19			// (b^c)&=(a^b)
    707 	eor	w15,w15,w8,ror#19
    708 	eor	w0,w0,w11,lsr#3	// sigma0(X[i+1])
    709 	add	w21,w21,w16			// h+=Sigma1(e)
    710 	eor	w28,w28,w23			// Maj(a,b,c)
    711 	eor	w17,w1,w22,ror#22	// Sigma0(a)
    712 	eor	w15,w15,w8,lsr#10	// sigma1(X[i+14])
    713 	add	w10,w10,w3
    714 	add	w25,w25,w21			// d+=h
    715 	add	w21,w21,w28			// h+=Maj(a,b,c)
    716 	ldr	w28,[x30],#4		// *K++, w19 in next round
    717 	add	w10,w10,w0
    718 	add	w21,w21,w17			// h+=Sigma0(a)
    719 	add	w10,w10,w15
    720 	ldr	w15,[sp,#0]
    721 	str	w2,[sp,#12]
    722 	ror	w16,w25,#6
    723 	add	w20,w20,w28			// h+=K[i]
    724 	ror	w1,w12,#7
    725 	and	w17,w26,w25
    726 	ror	w0,w9,#17
    727 	bic	w28,w27,w25
    728 	ror	w2,w21,#2
    729 	add	w20,w20,w10			// h+=X[i]
    730 	eor	w16,w16,w25,ror#11
    731 	eor	w1,w1,w12,ror#18
    732 	orr	w17,w17,w28			// Ch(e,f,g)
    733 	eor	w28,w21,w22			// a^b, b^c in next round
    734 	eor	w16,w16,w25,ror#25	// Sigma1(e)
    735 	eor	w2,w2,w21,ror#13
    736 	add	w20,w20,w17			// h+=Ch(e,f,g)
    737 	and	w19,w19,w28			// (b^c)&=(a^b)
    738 	eor	w0,w0,w9,ror#19
    739 	eor	w1,w1,w12,lsr#3	// sigma0(X[i+1])
    740 	add	w20,w20,w16			// h+=Sigma1(e)
    741 	eor	w19,w19,w22			// Maj(a,b,c)
    742 	eor	w17,w2,w21,ror#22	// Sigma0(a)
    743 	eor	w0,w0,w9,lsr#10	// sigma1(X[i+14])
    744 	add	w11,w11,w4
    745 	add	w24,w24,w20			// d+=h
    746 	add	w20,w20,w19			// h+=Maj(a,b,c)
    747 	ldr	w19,[x30],#4		// *K++, w28 in next round
    748 	add	w11,w11,w1
    749 	add	w20,w20,w17			// h+=Sigma0(a)
    750 	add	w11,w11,w0
    751 	ldr	w0,[sp,#4]
    752 	str	w3,[sp,#0]
    753 	ror	w16,w24,#6
    754 	add	w27,w27,w19			// h+=K[i]
    755 	ror	w2,w13,#7
    756 	and	w17,w25,w24
    757 	ror	w1,w10,#17
    758 	bic	w19,w26,w24
    759 	ror	w3,w20,#2
    760 	add	w27,w27,w11			// h+=X[i]
    761 	eor	w16,w16,w24,ror#11
    762 	eor	w2,w2,w13,ror#18
    763 	orr	w17,w17,w19			// Ch(e,f,g)
    764 	eor	w19,w20,w21			// a^b, b^c in next round
    765 	eor	w16,w16,w24,ror#25	// Sigma1(e)
    766 	eor	w3,w3,w20,ror#13
    767 	add	w27,w27,w17			// h+=Ch(e,f,g)
    768 	and	w28,w28,w19			// (b^c)&=(a^b)
    769 	eor	w1,w1,w10,ror#19
    770 	eor	w2,w2,w13,lsr#3	// sigma0(X[i+1])
    771 	add	w27,w27,w16			// h+=Sigma1(e)
    772 	eor	w28,w28,w21			// Maj(a,b,c)
    773 	eor	w17,w3,w20,ror#22	// Sigma0(a)
    774 	eor	w1,w1,w10,lsr#10	// sigma1(X[i+14])
    775 	add	w12,w12,w5
    776 	add	w23,w23,w27			// d+=h
    777 	add	w27,w27,w28			// h+=Maj(a,b,c)
    778 	ldr	w28,[x30],#4		// *K++, w19 in next round
    779 	add	w12,w12,w2
    780 	add	w27,w27,w17			// h+=Sigma0(a)
    781 	add	w12,w12,w1
    782 	ldr	w1,[sp,#8]
    783 	str	w4,[sp,#4]
    784 	ror	w16,w23,#6
    785 	add	w26,w26,w28			// h+=K[i]
    786 	ror	w3,w14,#7
    787 	and	w17,w24,w23
    788 	ror	w2,w11,#17
    789 	bic	w28,w25,w23
    790 	ror	w4,w27,#2
    791 	add	w26,w26,w12			// h+=X[i]
    792 	eor	w16,w16,w23,ror#11
    793 	eor	w3,w3,w14,ror#18
    794 	orr	w17,w17,w28			// Ch(e,f,g)
    795 	eor	w28,w27,w20			// a^b, b^c in next round
    796 	eor	w16,w16,w23,ror#25	// Sigma1(e)
    797 	eor	w4,w4,w27,ror#13
    798 	add	w26,w26,w17			// h+=Ch(e,f,g)
    799 	and	w19,w19,w28			// (b^c)&=(a^b)
    800 	eor	w2,w2,w11,ror#19
    801 	eor	w3,w3,w14,lsr#3	// sigma0(X[i+1])
    802 	add	w26,w26,w16			// h+=Sigma1(e)
    803 	eor	w19,w19,w20			// Maj(a,b,c)
    804 	eor	w17,w4,w27,ror#22	// Sigma0(a)
    805 	eor	w2,w2,w11,lsr#10	// sigma1(X[i+14])
    806 	add	w13,w13,w6
    807 	add	w22,w22,w26			// d+=h
    808 	add	w26,w26,w19			// h+=Maj(a,b,c)
    809 	ldr	w19,[x30],#4		// *K++, w28 in next round
    810 	add	w13,w13,w3
    811 	add	w26,w26,w17			// h+=Sigma0(a)
    812 	add	w13,w13,w2
    813 	ldr	w2,[sp,#12]
    814 	str	w5,[sp,#8]
    815 	ror	w16,w22,#6
    816 	add	w25,w25,w19			// h+=K[i]
    817 	ror	w4,w15,#7
    818 	and	w17,w23,w22
    819 	ror	w3,w12,#17
    820 	bic	w19,w24,w22
    821 	ror	w5,w26,#2
    822 	add	w25,w25,w13			// h+=X[i]
    823 	eor	w16,w16,w22,ror#11
    824 	eor	w4,w4,w15,ror#18
    825 	orr	w17,w17,w19			// Ch(e,f,g)
    826 	eor	w19,w26,w27			// a^b, b^c in next round
    827 	eor	w16,w16,w22,ror#25	// Sigma1(e)
    828 	eor	w5,w5,w26,ror#13
    829 	add	w25,w25,w17			// h+=Ch(e,f,g)
    830 	and	w28,w28,w19			// (b^c)&=(a^b)
    831 	eor	w3,w3,w12,ror#19
    832 	eor	w4,w4,w15,lsr#3	// sigma0(X[i+1])
    833 	add	w25,w25,w16			// h+=Sigma1(e)
    834 	eor	w28,w28,w27			// Maj(a,b,c)
    835 	eor	w17,w5,w26,ror#22	// Sigma0(a)
    836 	eor	w3,w3,w12,lsr#10	// sigma1(X[i+14])
    837 	add	w14,w14,w7
    838 	add	w21,w21,w25			// d+=h
    839 	add	w25,w25,w28			// h+=Maj(a,b,c)
    840 	ldr	w28,[x30],#4		// *K++, w19 in next round
    841 	add	w14,w14,w4
    842 	add	w25,w25,w17			// h+=Sigma0(a)
    843 	add	w14,w14,w3
    844 	ldr	w3,[sp,#0]
    845 	str	w6,[sp,#12]
    846 	ror	w16,w21,#6
    847 	add	w24,w24,w28			// h+=K[i]
    848 	ror	w5,w0,#7
    849 	and	w17,w22,w21
    850 	ror	w4,w13,#17
    851 	bic	w28,w23,w21
    852 	ror	w6,w25,#2
    853 	add	w24,w24,w14			// h+=X[i]
    854 	eor	w16,w16,w21,ror#11
    855 	eor	w5,w5,w0,ror#18
    856 	orr	w17,w17,w28			// Ch(e,f,g)
    857 	eor	w28,w25,w26			// a^b, b^c in next round
    858 	eor	w16,w16,w21,ror#25	// Sigma1(e)
    859 	eor	w6,w6,w25,ror#13
    860 	add	w24,w24,w17			// h+=Ch(e,f,g)
    861 	and	w19,w19,w28			// (b^c)&=(a^b)
    862 	eor	w4,w4,w13,ror#19
    863 	eor	w5,w5,w0,lsr#3	// sigma0(X[i+1])
    864 	add	w24,w24,w16			// h+=Sigma1(e)
    865 	eor	w19,w19,w26			// Maj(a,b,c)
    866 	eor	w17,w6,w25,ror#22	// Sigma0(a)
    867 	eor	w4,w4,w13,lsr#10	// sigma1(X[i+14])
    868 	add	w15,w15,w8
    869 	add	w20,w20,w24			// d+=h
    870 	add	w24,w24,w19			// h+=Maj(a,b,c)
    871 	ldr	w19,[x30],#4		// *K++, w28 in next round
    872 	add	w15,w15,w5
    873 	add	w24,w24,w17			// h+=Sigma0(a)
    874 	add	w15,w15,w4
    875 	ldr	w4,[sp,#4]
    876 	str	w7,[sp,#0]
    877 	ror	w16,w20,#6
    878 	add	w23,w23,w19			// h+=K[i]
    879 	ror	w6,w1,#7
    880 	and	w17,w21,w20
    881 	ror	w5,w14,#17
    882 	bic	w19,w22,w20
    883 	ror	w7,w24,#2
    884 	add	w23,w23,w15			// h+=X[i]
    885 	eor	w16,w16,w20,ror#11
    886 	eor	w6,w6,w1,ror#18
    887 	orr	w17,w17,w19			// Ch(e,f,g)
    888 	eor	w19,w24,w25			// a^b, b^c in next round
    889 	eor	w16,w16,w20,ror#25	// Sigma1(e)
    890 	eor	w7,w7,w24,ror#13
    891 	add	w23,w23,w17			// h+=Ch(e,f,g)
    892 	and	w28,w28,w19			// (b^c)&=(a^b)
    893 	eor	w5,w5,w14,ror#19
    894 	eor	w6,w6,w1,lsr#3	// sigma0(X[i+1])
    895 	add	w23,w23,w16			// h+=Sigma1(e)
    896 	eor	w28,w28,w25			// Maj(a,b,c)
    897 	eor	w17,w7,w24,ror#22	// Sigma0(a)
    898 	eor	w5,w5,w14,lsr#10	// sigma1(X[i+14])
    899 	add	w0,w0,w9
    900 	add	w27,w27,w23			// d+=h
    901 	add	w23,w23,w28			// h+=Maj(a,b,c)
    902 	ldr	w28,[x30],#4		// *K++, w19 in next round
    903 	add	w0,w0,w6
    904 	add	w23,w23,w17			// h+=Sigma0(a)
    905 	add	w0,w0,w5
    906 	ldr	w5,[sp,#8]
    907 	str	w8,[sp,#4]
    908 	ror	w16,w27,#6
    909 	add	w22,w22,w28			// h+=K[i]
    910 	ror	w7,w2,#7
    911 	and	w17,w20,w27
    912 	ror	w6,w15,#17
    913 	bic	w28,w21,w27
    914 	ror	w8,w23,#2
    915 	add	w22,w22,w0			// h+=X[i]
    916 	eor	w16,w16,w27,ror#11
    917 	eor	w7,w7,w2,ror#18
    918 	orr	w17,w17,w28			// Ch(e,f,g)
    919 	eor	w28,w23,w24			// a^b, b^c in next round
    920 	eor	w16,w16,w27,ror#25	// Sigma1(e)
    921 	eor	w8,w8,w23,ror#13
    922 	add	w22,w22,w17			// h+=Ch(e,f,g)
    923 	and	w19,w19,w28			// (b^c)&=(a^b)
    924 	eor	w6,w6,w15,ror#19
    925 	eor	w7,w7,w2,lsr#3	// sigma0(X[i+1])
    926 	add	w22,w22,w16			// h+=Sigma1(e)
    927 	eor	w19,w19,w24			// Maj(a,b,c)
    928 	eor	w17,w8,w23,ror#22	// Sigma0(a)
    929 	eor	w6,w6,w15,lsr#10	// sigma1(X[i+14])
    930 	add	w1,w1,w10
    931 	add	w26,w26,w22			// d+=h
    932 	add	w22,w22,w19			// h+=Maj(a,b,c)
    933 	ldr	w19,[x30],#4		// *K++, w28 in next round
    934 	add	w1,w1,w7
    935 	add	w22,w22,w17			// h+=Sigma0(a)
    936 	add	w1,w1,w6
    937 	ldr	w6,[sp,#12]
    938 	str	w9,[sp,#8]
    939 	ror	w16,w26,#6
    940 	add	w21,w21,w19			// h+=K[i]
    941 	ror	w8,w3,#7
    942 	and	w17,w27,w26
    943 	ror	w7,w0,#17
    944 	bic	w19,w20,w26
    945 	ror	w9,w22,#2
    946 	add	w21,w21,w1			// h+=X[i]
    947 	eor	w16,w16,w26,ror#11
    948 	eor	w8,w8,w3,ror#18
    949 	orr	w17,w17,w19			// Ch(e,f,g)
    950 	eor	w19,w22,w23			// a^b, b^c in next round
    951 	eor	w16,w16,w26,ror#25	// Sigma1(e)
    952 	eor	w9,w9,w22,ror#13
    953 	add	w21,w21,w17			// h+=Ch(e,f,g)
    954 	and	w28,w28,w19			// (b^c)&=(a^b)
    955 	eor	w7,w7,w0,ror#19
    956 	eor	w8,w8,w3,lsr#3	// sigma0(X[i+1])
    957 	add	w21,w21,w16			// h+=Sigma1(e)
    958 	eor	w28,w28,w23			// Maj(a,b,c)
    959 	eor	w17,w9,w22,ror#22	// Sigma0(a)
    960 	eor	w7,w7,w0,lsr#10	// sigma1(X[i+14])
    961 	add	w2,w2,w11
    962 	add	w25,w25,w21			// d+=h
    963 	add	w21,w21,w28			// h+=Maj(a,b,c)
    964 	ldr	w28,[x30],#4		// *K++, w19 in next round
    965 	add	w2,w2,w8
    966 	add	w21,w21,w17			// h+=Sigma0(a)
    967 	add	w2,w2,w7
    968 	ldr	w7,[sp,#0]
    969 	str	w10,[sp,#12]
    970 	ror	w16,w25,#6
    971 	add	w20,w20,w28			// h+=K[i]
    972 	ror	w9,w4,#7
    973 	and	w17,w26,w25
    974 	ror	w8,w1,#17
    975 	bic	w28,w27,w25
    976 	ror	w10,w21,#2
    977 	add	w20,w20,w2			// h+=X[i]
    978 	eor	w16,w16,w25,ror#11
    979 	eor	w9,w9,w4,ror#18
    980 	orr	w17,w17,w28			// Ch(e,f,g)
    981 	eor	w28,w21,w22			// a^b, b^c in next round
    982 	eor	w16,w16,w25,ror#25	// Sigma1(e)
    983 	eor	w10,w10,w21,ror#13
    984 	add	w20,w20,w17			// h+=Ch(e,f,g)
    985 	and	w19,w19,w28			// (b^c)&=(a^b)
    986 	eor	w8,w8,w1,ror#19
    987 	eor	w9,w9,w4,lsr#3	// sigma0(X[i+1])
    988 	add	w20,w20,w16			// h+=Sigma1(e)
    989 	eor	w19,w19,w22			// Maj(a,b,c)
    990 	eor	w17,w10,w21,ror#22	// Sigma0(a)
    991 	eor	w8,w8,w1,lsr#10	// sigma1(X[i+14])
    992 	add	w3,w3,w12
    993 	add	w24,w24,w20			// d+=h
    994 	add	w20,w20,w19			// h+=Maj(a,b,c)
    995 	ldr	w19,[x30],#4		// *K++, w28 in next round
    996 	add	w3,w3,w9
    997 	add	w20,w20,w17			// h+=Sigma0(a)
    998 	add	w3,w3,w8
    999 	cbnz	w19,Loop_16_xx
   1000 
   1001 	ldp	x0,x2,[x29,#96]
   1002 	ldr	x1,[x29,#112]
   1003 	sub	x30,x30,#260		// rewind
   1004 
   1005 	ldp	w3,w4,[x0]
   1006 	ldp	w5,w6,[x0,#2*4]
   1007 	add	x1,x1,#14*4			// advance input pointer
   1008 	ldp	w7,w8,[x0,#4*4]
   1009 	add	w20,w20,w3
   1010 	ldp	w9,w10,[x0,#6*4]
   1011 	add	w21,w21,w4
   1012 	add	w22,w22,w5
   1013 	add	w23,w23,w6
   1014 	stp	w20,w21,[x0]
   1015 	add	w24,w24,w7
   1016 	add	w25,w25,w8
   1017 	stp	w22,w23,[x0,#2*4]
   1018 	add	w26,w26,w9
   1019 	add	w27,w27,w10
   1020 	cmp	x1,x2
   1021 	stp	w24,w25,[x0,#4*4]
   1022 	stp	w26,w27,[x0,#6*4]
   1023 	b.ne	Loop
   1024 
   1025 	ldp	x19,x20,[x29,#16]
   1026 	add	sp,sp,#4*4
   1027 	ldp	x21,x22,[x29,#32]
   1028 	ldp	x23,x24,[x29,#48]
   1029 	ldp	x25,x26,[x29,#64]
   1030 	ldp	x27,x28,[x29,#80]
   1031 	ldp	x29,x30,[sp],#128
   1032 	ret
   1033 
   1034 
   1035 .section	__TEXT,__const
   1036 .align	6
   1037 
   1038 LK256:
   1039 .long	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
   1040 .long	0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
   1041 .long	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
   1042 .long	0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
   1043 .long	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
   1044 .long	0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
   1045 .long	0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
   1046 .long	0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
   1047 .long	0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
   1048 .long	0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
   1049 .long	0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
   1050 .long	0xd192e819,0xd6990624,0xf40e3585,0x106aa070
   1051 .long	0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
   1052 .long	0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
   1053 .long	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
   1054 .long	0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
   1055 .long	0	//terminator
   1056 
   1057 .byte	83,72,65,50,53,54,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,56,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
   1058 .align	2
   1059 .align	2
   1060 .text
   1061 #ifndef	__KERNEL__
   1062 
   1063 .align	6
   1064 sha256_block_armv8:
   1065 Lv8_entry:
   1066 	stp	x29,x30,[sp,#-16]!
   1067 	add	x29,sp,#0
   1068 
   1069 	ld1	{v0.4s,v1.4s},[x0]
   1070 	adrp	x3,LK256@PAGE
   1071 	add	x3,x3,LK256@PAGEOFF
   1072 
   1073 Loop_hw:
   1074 	ld1	{v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
   1075 	sub	x2,x2,#1
   1076 	ld1	{v16.4s},[x3],#16
   1077 	rev32	v4.16b,v4.16b
   1078 	rev32	v5.16b,v5.16b
   1079 	rev32	v6.16b,v6.16b
   1080 	rev32	v7.16b,v7.16b
   1081 	orr	v18.16b,v0.16b,v0.16b		// offload
   1082 	orr	v19.16b,v1.16b,v1.16b
   1083 	ld1	{v17.4s},[x3],#16
   1084 	add	v16.4s,v16.4s,v4.4s
   1085 .long	0x5e2828a4	//sha256su0 v4.16b,v5.16b
   1086 	orr	v2.16b,v0.16b,v0.16b
   1087 .long	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
   1088 .long	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
   1089 .long	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
   1090 	ld1	{v16.4s},[x3],#16
   1091 	add	v17.4s,v17.4s,v5.4s
   1092 .long	0x5e2828c5	//sha256su0 v5.16b,v6.16b
   1093 	orr	v2.16b,v0.16b,v0.16b
   1094 .long	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
   1095 .long	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
   1096 .long	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
   1097 	ld1	{v17.4s},[x3],#16
   1098 	add	v16.4s,v16.4s,v6.4s
   1099 .long	0x5e2828e6	//sha256su0 v6.16b,v7.16b
   1100 	orr	v2.16b,v0.16b,v0.16b
   1101 .long	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
   1102 .long	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
   1103 .long	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
   1104 	ld1	{v16.4s},[x3],#16
   1105 	add	v17.4s,v17.4s,v7.4s
   1106 .long	0x5e282887	//sha256su0 v7.16b,v4.16b
   1107 	orr	v2.16b,v0.16b,v0.16b
   1108 .long	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
   1109 .long	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
   1110 .long	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
   1111 	ld1	{v17.4s},[x3],#16
   1112 	add	v16.4s,v16.4s,v4.4s
   1113 .long	0x5e2828a4	//sha256su0 v4.16b,v5.16b
   1114 	orr	v2.16b,v0.16b,v0.16b
   1115 .long	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
   1116 .long	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
   1117 .long	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
   1118 	ld1	{v16.4s},[x3],#16
   1119 	add	v17.4s,v17.4s,v5.4s
   1120 .long	0x5e2828c5	//sha256su0 v5.16b,v6.16b
   1121 	orr	v2.16b,v0.16b,v0.16b
   1122 .long	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
   1123 .long	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
   1124 .long	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
   1125 	ld1	{v17.4s},[x3],#16
   1126 	add	v16.4s,v16.4s,v6.4s
   1127 .long	0x5e2828e6	//sha256su0 v6.16b,v7.16b
   1128 	orr	v2.16b,v0.16b,v0.16b
   1129 .long	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
   1130 .long	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
   1131 .long	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
   1132 	ld1	{v16.4s},[x3],#16
   1133 	add	v17.4s,v17.4s,v7.4s
   1134 .long	0x5e282887	//sha256su0 v7.16b,v4.16b
   1135 	orr	v2.16b,v0.16b,v0.16b
   1136 .long	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
   1137 .long	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
   1138 .long	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
   1139 	ld1	{v17.4s},[x3],#16
   1140 	add	v16.4s,v16.4s,v4.4s
   1141 .long	0x5e2828a4	//sha256su0 v4.16b,v5.16b
   1142 	orr	v2.16b,v0.16b,v0.16b
   1143 .long	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
   1144 .long	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
   1145 .long	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
   1146 	ld1	{v16.4s},[x3],#16
   1147 	add	v17.4s,v17.4s,v5.4s
   1148 .long	0x5e2828c5	//sha256su0 v5.16b,v6.16b
   1149 	orr	v2.16b,v0.16b,v0.16b
   1150 .long	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
   1151 .long	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
   1152 .long	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
   1153 	ld1	{v17.4s},[x3],#16
   1154 	add	v16.4s,v16.4s,v6.4s
   1155 .long	0x5e2828e6	//sha256su0 v6.16b,v7.16b
   1156 	orr	v2.16b,v0.16b,v0.16b
   1157 .long	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
   1158 .long	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
   1159 .long	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
   1160 	ld1	{v16.4s},[x3],#16
   1161 	add	v17.4s,v17.4s,v7.4s
   1162 .long	0x5e282887	//sha256su0 v7.16b,v4.16b
   1163 	orr	v2.16b,v0.16b,v0.16b
   1164 .long	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
   1165 .long	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
   1166 .long	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
   1167 	ld1	{v17.4s},[x3],#16
   1168 	add	v16.4s,v16.4s,v4.4s
   1169 	orr	v2.16b,v0.16b,v0.16b
   1170 .long	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
   1171 .long	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
   1172 
   1173 	ld1	{v16.4s},[x3],#16
   1174 	add	v17.4s,v17.4s,v5.4s
   1175 	orr	v2.16b,v0.16b,v0.16b
   1176 .long	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
   1177 .long	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
   1178 
   1179 	ld1	{v17.4s},[x3]
   1180 	add	v16.4s,v16.4s,v6.4s
   1181 	sub	x3,x3,#64*4-16	// rewind
   1182 	orr	v2.16b,v0.16b,v0.16b
   1183 .long	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
   1184 .long	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
   1185 
   1186 	add	v17.4s,v17.4s,v7.4s
   1187 	orr	v2.16b,v0.16b,v0.16b
   1188 .long	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
   1189 .long	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
   1190 
   1191 	add	v0.4s,v0.4s,v18.4s
   1192 	add	v1.4s,v1.4s,v19.4s
   1193 
   1194 	cbnz	x2,Loop_hw
   1195 
   1196 	st1	{v0.4s,v1.4s},[x0]
   1197 
   1198 	ldr	x29,[sp],#16
   1199 	ret
   1200 
   1201 #endif
   1202 #ifndef	__KERNEL__
   1203 .comm	_OPENSSL_armcap_P,4,4
   1204 .private_extern	_OPENSSL_armcap_P
   1205 #endif
   1206 #endif  // !OPENSSL_NO_ASM
   1207