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