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