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