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