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