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