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