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