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