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