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