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