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