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