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