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