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