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