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