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