1 @ Copyright 2007-2020 The OpenSSL Project Authors. All Rights Reserved. 2 @ 3 @ Licensed under the Apache License 2.0 (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 "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 #ifdef __ARMEL__ 67 # define LO 0 68 # define HI 4 69 # define WORD64(hi0,lo0,hi1,lo1) .word lo0,hi0, lo1,hi1 70 #else 71 # define HI 0 72 # define LO 4 73 # define WORD64(hi0,lo0,hi1,lo1) .word hi0,lo0, hi1,lo1 74 #endif 75 76 #if defined(__thumb2__) 77 .syntax unified 78 .thumb 79 # define adrl adr 80 #else 81 .code 32 82 #endif 83 84 .text 85 86 .type K512,%object 87 .align 5 88 K512: 89 WORD64(0x428a2f98,0xd728ae22, 0x71374491,0x23ef65cd) 90 WORD64(0xb5c0fbcf,0xec4d3b2f, 0xe9b5dba5,0x8189dbbc) 91 WORD64(0x3956c25b,0xf348b538, 0x59f111f1,0xb605d019) 92 WORD64(0x923f82a4,0xaf194f9b, 0xab1c5ed5,0xda6d8118) 93 WORD64(0xd807aa98,0xa3030242, 0x12835b01,0x45706fbe) 94 WORD64(0x243185be,0x4ee4b28c, 0x550c7dc3,0xd5ffb4e2) 95 WORD64(0x72be5d74,0xf27b896f, 0x80deb1fe,0x3b1696b1) 96 WORD64(0x9bdc06a7,0x25c71235, 0xc19bf174,0xcf692694) 97 WORD64(0xe49b69c1,0x9ef14ad2, 0xefbe4786,0x384f25e3) 98 WORD64(0x0fc19dc6,0x8b8cd5b5, 0x240ca1cc,0x77ac9c65) 99 WORD64(0x2de92c6f,0x592b0275, 0x4a7484aa,0x6ea6e483) 100 WORD64(0x5cb0a9dc,0xbd41fbd4, 0x76f988da,0x831153b5) 101 WORD64(0x983e5152,0xee66dfab, 0xa831c66d,0x2db43210) 102 WORD64(0xb00327c8,0x98fb213f, 0xbf597fc7,0xbeef0ee4) 103 WORD64(0xc6e00bf3,0x3da88fc2, 0xd5a79147,0x930aa725) 104 WORD64(0x06ca6351,0xe003826f, 0x14292967,0x0a0e6e70) 105 WORD64(0x27b70a85,0x46d22ffc, 0x2e1b2138,0x5c26c926) 106 WORD64(0x4d2c6dfc,0x5ac42aed, 0x53380d13,0x9d95b3df) 107 WORD64(0x650a7354,0x8baf63de, 0x766a0abb,0x3c77b2a8) 108 WORD64(0x81c2c92e,0x47edaee6, 0x92722c85,0x1482353b) 109 WORD64(0xa2bfe8a1,0x4cf10364, 0xa81a664b,0xbc423001) 110 WORD64(0xc24b8b70,0xd0f89791, 0xc76c51a3,0x0654be30) 111 WORD64(0xd192e819,0xd6ef5218, 0xd6990624,0x5565a910) 112 WORD64(0xf40e3585,0x5771202a, 0x106aa070,0x32bbd1b8) 113 WORD64(0x19a4c116,0xb8d2d0c8, 0x1e376c08,0x5141ab53) 114 WORD64(0x2748774c,0xdf8eeb99, 0x34b0bcb5,0xe19b48a8) 115 WORD64(0x391c0cb3,0xc5c95a63, 0x4ed8aa4a,0xe3418acb) 116 WORD64(0x5b9cca4f,0x7763e373, 0x682e6ff3,0xd6b2b8a3) 117 WORD64(0x748f82ee,0x5defb2fc, 0x78a5636f,0x43172f60) 118 WORD64(0x84c87814,0xa1f0ab72, 0x8cc70208,0x1a6439ec) 119 WORD64(0x90befffa,0x23631e28, 0xa4506ceb,0xde82bde9) 120 WORD64(0xbef9a3f7,0xb2c67915, 0xc67178f2,0xe372532b) 121 WORD64(0xca273ece,0xea26619c, 0xd186b8c7,0x21c0c207) 122 WORD64(0xeada7dd6,0xcde0eb1e, 0xf57d4f7f,0xee6ed178) 123 WORD64(0x06f067aa,0x72176fba, 0x0a637dc5,0xa2c898a6) 124 WORD64(0x113f9804,0xbef90dae, 0x1b710b35,0x131c471b) 125 WORD64(0x28db77f5,0x23047d84, 0x32caab7b,0x40c72493) 126 WORD64(0x3c9ebe0a,0x15c9bebc, 0x431d67c4,0x9c100d4c) 127 WORD64(0x4cc5d4be,0xcb3e42b6, 0x597f299c,0xfc657e2a) 128 WORD64(0x5fcb6fab,0x3ad6faec, 0x6c44198c,0x4a475817) 129 .size K512,.-K512 130 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) 131 .LOPENSSL_armcap: 132 # ifdef _WIN32 133 .word OPENSSL_armcap_P 134 # else 135 .word OPENSSL_armcap_P-.Lsha512_block_data_order 136 # endif 137 .skip 32-4 138 #else 139 .skip 32 140 #endif 141 142 .globl sha512_block_data_order 143 .type sha512_block_data_order,%function 144 sha512_block_data_order: 145 .Lsha512_block_data_order: 146 #if __ARM_ARCH__<7 && !defined(__thumb2__) 147 sub r3,pc,#8 @ sha512_block_data_order 148 #else 149 adr r3,.Lsha512_block_data_order 150 #endif 151 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) 152 ldr r12,.LOPENSSL_armcap 153 # if !defined(_WIN32) 154 ldr r12,[r3,r12] @ OPENSSL_armcap_P 155 # endif 156 # if defined(__APPLE__) || defined(_WIN32) 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] 173 .Loop: 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 197 .L00_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 #ifdef __thumb2__ 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 317 .L16_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 #ifdef __thumb2__ 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 #ifdef __thumb2__ 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 .size sha512_block_data_order,.-sha512_block_data_order 540 #if __ARM_MAX_ARCH__>=7 541 .arch armv7-a 542 .fpu neon 543 544 .globl sha512_block_data_order_neon 545 .type sha512_block_data_order_neon,%function 546 .align 4 547 sha512_block_data_order_neon: 548 .LNEON: 549 dmb @ errata #451034 on early Cortex A8 550 add r2,r1,r2,lsl#7 @ len to point at the end of inp 551 adr r3,K512 552 VFP_ABI_PUSH 553 vldmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ load context 554 .Loop_neon: 555 vshr.u64 d24,d20,#14 @ 0 556 #if 0<16 557 vld1.64 {d0},[r1]! @ handles unaligned 558 #endif 559 vshr.u64 d25,d20,#18 560 #if 0>0 561 vadd.i64 d16,d30 @ h+=Maj from the past 562 #endif 563 vshr.u64 d26,d20,#41 564 vld1.64 {d28},[r3,:64]! @ K[i++] 565 vsli.64 d24,d20,#50 566 vsli.64 d25,d20,#46 567 vmov d29,d20 568 vsli.64 d26,d20,#23 569 #if 0<16 && defined(__ARMEL__) 570 vrev64.8 d0,d0 571 #endif 572 veor d25,d24 573 vbsl d29,d21,d22 @ Ch(e,f,g) 574 vshr.u64 d24,d16,#28 575 veor d26,d25 @ Sigma1(e) 576 vadd.i64 d27,d29,d23 577 vshr.u64 d25,d16,#34 578 vsli.64 d24,d16,#36 579 vadd.i64 d27,d26 580 vshr.u64 d26,d16,#39 581 vadd.i64 d28,d0 582 vsli.64 d25,d16,#30 583 veor d30,d16,d17 584 vsli.64 d26,d16,#25 585 veor d23,d24,d25 586 vadd.i64 d27,d28 587 vbsl d30,d18,d17 @ Maj(a,b,c) 588 veor d23,d26 @ Sigma0(a) 589 vadd.i64 d19,d27 590 vadd.i64 d30,d27 591 @ vadd.i64 d23,d30 592 vshr.u64 d24,d19,#14 @ 1 593 #if 1<16 594 vld1.64 {d1},[r1]! @ handles unaligned 595 #endif 596 vshr.u64 d25,d19,#18 597 #if 1>0 598 vadd.i64 d23,d30 @ h+=Maj from the past 599 #endif 600 vshr.u64 d26,d19,#41 601 vld1.64 {d28},[r3,:64]! @ K[i++] 602 vsli.64 d24,d19,#50 603 vsli.64 d25,d19,#46 604 vmov d29,d19 605 vsli.64 d26,d19,#23 606 #if 1<16 && defined(__ARMEL__) 607 vrev64.8 d1,d1 608 #endif 609 veor d25,d24 610 vbsl d29,d20,d21 @ Ch(e,f,g) 611 vshr.u64 d24,d23,#28 612 veor d26,d25 @ Sigma1(e) 613 vadd.i64 d27,d29,d22 614 vshr.u64 d25,d23,#34 615 vsli.64 d24,d23,#36 616 vadd.i64 d27,d26 617 vshr.u64 d26,d23,#39 618 vadd.i64 d28,d1 619 vsli.64 d25,d23,#30 620 veor d30,d23,d16 621 vsli.64 d26,d23,#25 622 veor d22,d24,d25 623 vadd.i64 d27,d28 624 vbsl d30,d17,d16 @ Maj(a,b,c) 625 veor d22,d26 @ Sigma0(a) 626 vadd.i64 d18,d27 627 vadd.i64 d30,d27 628 @ vadd.i64 d22,d30 629 vshr.u64 d24,d18,#14 @ 2 630 #if 2<16 631 vld1.64 {d2},[r1]! @ handles unaligned 632 #endif 633 vshr.u64 d25,d18,#18 634 #if 2>0 635 vadd.i64 d22,d30 @ h+=Maj from the past 636 #endif 637 vshr.u64 d26,d18,#41 638 vld1.64 {d28},[r3,:64]! @ K[i++] 639 vsli.64 d24,d18,#50 640 vsli.64 d25,d18,#46 641 vmov d29,d18 642 vsli.64 d26,d18,#23 643 #if 2<16 && defined(__ARMEL__) 644 vrev64.8 d2,d2 645 #endif 646 veor d25,d24 647 vbsl d29,d19,d20 @ Ch(e,f,g) 648 vshr.u64 d24,d22,#28 649 veor d26,d25 @ Sigma1(e) 650 vadd.i64 d27,d29,d21 651 vshr.u64 d25,d22,#34 652 vsli.64 d24,d22,#36 653 vadd.i64 d27,d26 654 vshr.u64 d26,d22,#39 655 vadd.i64 d28,d2 656 vsli.64 d25,d22,#30 657 veor d30,d22,d23 658 vsli.64 d26,d22,#25 659 veor d21,d24,d25 660 vadd.i64 d27,d28 661 vbsl d30,d16,d23 @ Maj(a,b,c) 662 veor d21,d26 @ Sigma0(a) 663 vadd.i64 d17,d27 664 vadd.i64 d30,d27 665 @ vadd.i64 d21,d30 666 vshr.u64 d24,d17,#14 @ 3 667 #if 3<16 668 vld1.64 {d3},[r1]! @ handles unaligned 669 #endif 670 vshr.u64 d25,d17,#18 671 #if 3>0 672 vadd.i64 d21,d30 @ h+=Maj from the past 673 #endif 674 vshr.u64 d26,d17,#41 675 vld1.64 {d28},[r3,:64]! @ K[i++] 676 vsli.64 d24,d17,#50 677 vsli.64 d25,d17,#46 678 vmov d29,d17 679 vsli.64 d26,d17,#23 680 #if 3<16 && defined(__ARMEL__) 681 vrev64.8 d3,d3 682 #endif 683 veor d25,d24 684 vbsl d29,d18,d19 @ Ch(e,f,g) 685 vshr.u64 d24,d21,#28 686 veor d26,d25 @ Sigma1(e) 687 vadd.i64 d27,d29,d20 688 vshr.u64 d25,d21,#34 689 vsli.64 d24,d21,#36 690 vadd.i64 d27,d26 691 vshr.u64 d26,d21,#39 692 vadd.i64 d28,d3 693 vsli.64 d25,d21,#30 694 veor d30,d21,d22 695 vsli.64 d26,d21,#25 696 veor d20,d24,d25 697 vadd.i64 d27,d28 698 vbsl d30,d23,d22 @ Maj(a,b,c) 699 veor d20,d26 @ Sigma0(a) 700 vadd.i64 d16,d27 701 vadd.i64 d30,d27 702 @ vadd.i64 d20,d30 703 vshr.u64 d24,d16,#14 @ 4 704 #if 4<16 705 vld1.64 {d4},[r1]! @ handles unaligned 706 #endif 707 vshr.u64 d25,d16,#18 708 #if 4>0 709 vadd.i64 d20,d30 @ h+=Maj from the past 710 #endif 711 vshr.u64 d26,d16,#41 712 vld1.64 {d28},[r3,:64]! @ K[i++] 713 vsli.64 d24,d16,#50 714 vsli.64 d25,d16,#46 715 vmov d29,d16 716 vsli.64 d26,d16,#23 717 #if 4<16 && defined(__ARMEL__) 718 vrev64.8 d4,d4 719 #endif 720 veor d25,d24 721 vbsl d29,d17,d18 @ Ch(e,f,g) 722 vshr.u64 d24,d20,#28 723 veor d26,d25 @ Sigma1(e) 724 vadd.i64 d27,d29,d19 725 vshr.u64 d25,d20,#34 726 vsli.64 d24,d20,#36 727 vadd.i64 d27,d26 728 vshr.u64 d26,d20,#39 729 vadd.i64 d28,d4 730 vsli.64 d25,d20,#30 731 veor d30,d20,d21 732 vsli.64 d26,d20,#25 733 veor d19,d24,d25 734 vadd.i64 d27,d28 735 vbsl d30,d22,d21 @ Maj(a,b,c) 736 veor d19,d26 @ Sigma0(a) 737 vadd.i64 d23,d27 738 vadd.i64 d30,d27 739 @ vadd.i64 d19,d30 740 vshr.u64 d24,d23,#14 @ 5 741 #if 5<16 742 vld1.64 {d5},[r1]! @ handles unaligned 743 #endif 744 vshr.u64 d25,d23,#18 745 #if 5>0 746 vadd.i64 d19,d30 @ h+=Maj from the past 747 #endif 748 vshr.u64 d26,d23,#41 749 vld1.64 {d28},[r3,:64]! @ K[i++] 750 vsli.64 d24,d23,#50 751 vsli.64 d25,d23,#46 752 vmov d29,d23 753 vsli.64 d26,d23,#23 754 #if 5<16 && defined(__ARMEL__) 755 vrev64.8 d5,d5 756 #endif 757 veor d25,d24 758 vbsl d29,d16,d17 @ Ch(e,f,g) 759 vshr.u64 d24,d19,#28 760 veor d26,d25 @ Sigma1(e) 761 vadd.i64 d27,d29,d18 762 vshr.u64 d25,d19,#34 763 vsli.64 d24,d19,#36 764 vadd.i64 d27,d26 765 vshr.u64 d26,d19,#39 766 vadd.i64 d28,d5 767 vsli.64 d25,d19,#30 768 veor d30,d19,d20 769 vsli.64 d26,d19,#25 770 veor d18,d24,d25 771 vadd.i64 d27,d28 772 vbsl d30,d21,d20 @ Maj(a,b,c) 773 veor d18,d26 @ Sigma0(a) 774 vadd.i64 d22,d27 775 vadd.i64 d30,d27 776 @ vadd.i64 d18,d30 777 vshr.u64 d24,d22,#14 @ 6 778 #if 6<16 779 vld1.64 {d6},[r1]! @ handles unaligned 780 #endif 781 vshr.u64 d25,d22,#18 782 #if 6>0 783 vadd.i64 d18,d30 @ h+=Maj from the past 784 #endif 785 vshr.u64 d26,d22,#41 786 vld1.64 {d28},[r3,:64]! @ K[i++] 787 vsli.64 d24,d22,#50 788 vsli.64 d25,d22,#46 789 vmov d29,d22 790 vsli.64 d26,d22,#23 791 #if 6<16 && defined(__ARMEL__) 792 vrev64.8 d6,d6 793 #endif 794 veor d25,d24 795 vbsl d29,d23,d16 @ Ch(e,f,g) 796 vshr.u64 d24,d18,#28 797 veor d26,d25 @ Sigma1(e) 798 vadd.i64 d27,d29,d17 799 vshr.u64 d25,d18,#34 800 vsli.64 d24,d18,#36 801 vadd.i64 d27,d26 802 vshr.u64 d26,d18,#39 803 vadd.i64 d28,d6 804 vsli.64 d25,d18,#30 805 veor d30,d18,d19 806 vsli.64 d26,d18,#25 807 veor d17,d24,d25 808 vadd.i64 d27,d28 809 vbsl d30,d20,d19 @ Maj(a,b,c) 810 veor d17,d26 @ Sigma0(a) 811 vadd.i64 d21,d27 812 vadd.i64 d30,d27 813 @ vadd.i64 d17,d30 814 vshr.u64 d24,d21,#14 @ 7 815 #if 7<16 816 vld1.64 {d7},[r1]! @ handles unaligned 817 #endif 818 vshr.u64 d25,d21,#18 819 #if 7>0 820 vadd.i64 d17,d30 @ h+=Maj from the past 821 #endif 822 vshr.u64 d26,d21,#41 823 vld1.64 {d28},[r3,:64]! @ K[i++] 824 vsli.64 d24,d21,#50 825 vsli.64 d25,d21,#46 826 vmov d29,d21 827 vsli.64 d26,d21,#23 828 #if 7<16 && defined(__ARMEL__) 829 vrev64.8 d7,d7 830 #endif 831 veor d25,d24 832 vbsl d29,d22,d23 @ Ch(e,f,g) 833 vshr.u64 d24,d17,#28 834 veor d26,d25 @ Sigma1(e) 835 vadd.i64 d27,d29,d16 836 vshr.u64 d25,d17,#34 837 vsli.64 d24,d17,#36 838 vadd.i64 d27,d26 839 vshr.u64 d26,d17,#39 840 vadd.i64 d28,d7 841 vsli.64 d25,d17,#30 842 veor d30,d17,d18 843 vsli.64 d26,d17,#25 844 veor d16,d24,d25 845 vadd.i64 d27,d28 846 vbsl d30,d19,d18 @ Maj(a,b,c) 847 veor d16,d26 @ Sigma0(a) 848 vadd.i64 d20,d27 849 vadd.i64 d30,d27 850 @ vadd.i64 d16,d30 851 vshr.u64 d24,d20,#14 @ 8 852 #if 8<16 853 vld1.64 {d8},[r1]! @ handles unaligned 854 #endif 855 vshr.u64 d25,d20,#18 856 #if 8>0 857 vadd.i64 d16,d30 @ h+=Maj from the past 858 #endif 859 vshr.u64 d26,d20,#41 860 vld1.64 {d28},[r3,:64]! @ K[i++] 861 vsli.64 d24,d20,#50 862 vsli.64 d25,d20,#46 863 vmov d29,d20 864 vsli.64 d26,d20,#23 865 #if 8<16 && defined(__ARMEL__) 866 vrev64.8 d8,d8 867 #endif 868 veor d25,d24 869 vbsl d29,d21,d22 @ Ch(e,f,g) 870 vshr.u64 d24,d16,#28 871 veor d26,d25 @ Sigma1(e) 872 vadd.i64 d27,d29,d23 873 vshr.u64 d25,d16,#34 874 vsli.64 d24,d16,#36 875 vadd.i64 d27,d26 876 vshr.u64 d26,d16,#39 877 vadd.i64 d28,d8 878 vsli.64 d25,d16,#30 879 veor d30,d16,d17 880 vsli.64 d26,d16,#25 881 veor d23,d24,d25 882 vadd.i64 d27,d28 883 vbsl d30,d18,d17 @ Maj(a,b,c) 884 veor d23,d26 @ Sigma0(a) 885 vadd.i64 d19,d27 886 vadd.i64 d30,d27 887 @ vadd.i64 d23,d30 888 vshr.u64 d24,d19,#14 @ 9 889 #if 9<16 890 vld1.64 {d9},[r1]! @ handles unaligned 891 #endif 892 vshr.u64 d25,d19,#18 893 #if 9>0 894 vadd.i64 d23,d30 @ h+=Maj from the past 895 #endif 896 vshr.u64 d26,d19,#41 897 vld1.64 {d28},[r3,:64]! @ K[i++] 898 vsli.64 d24,d19,#50 899 vsli.64 d25,d19,#46 900 vmov d29,d19 901 vsli.64 d26,d19,#23 902 #if 9<16 && defined(__ARMEL__) 903 vrev64.8 d9,d9 904 #endif 905 veor d25,d24 906 vbsl d29,d20,d21 @ Ch(e,f,g) 907 vshr.u64 d24,d23,#28 908 veor d26,d25 @ Sigma1(e) 909 vadd.i64 d27,d29,d22 910 vshr.u64 d25,d23,#34 911 vsli.64 d24,d23,#36 912 vadd.i64 d27,d26 913 vshr.u64 d26,d23,#39 914 vadd.i64 d28,d9 915 vsli.64 d25,d23,#30 916 veor d30,d23,d16 917 vsli.64 d26,d23,#25 918 veor d22,d24,d25 919 vadd.i64 d27,d28 920 vbsl d30,d17,d16 @ Maj(a,b,c) 921 veor d22,d26 @ Sigma0(a) 922 vadd.i64 d18,d27 923 vadd.i64 d30,d27 924 @ vadd.i64 d22,d30 925 vshr.u64 d24,d18,#14 @ 10 926 #if 10<16 927 vld1.64 {d10},[r1]! @ handles unaligned 928 #endif 929 vshr.u64 d25,d18,#18 930 #if 10>0 931 vadd.i64 d22,d30 @ h+=Maj from the past 932 #endif 933 vshr.u64 d26,d18,#41 934 vld1.64 {d28},[r3,:64]! @ K[i++] 935 vsli.64 d24,d18,#50 936 vsli.64 d25,d18,#46 937 vmov d29,d18 938 vsli.64 d26,d18,#23 939 #if 10<16 && defined(__ARMEL__) 940 vrev64.8 d10,d10 941 #endif 942 veor d25,d24 943 vbsl d29,d19,d20 @ Ch(e,f,g) 944 vshr.u64 d24,d22,#28 945 veor d26,d25 @ Sigma1(e) 946 vadd.i64 d27,d29,d21 947 vshr.u64 d25,d22,#34 948 vsli.64 d24,d22,#36 949 vadd.i64 d27,d26 950 vshr.u64 d26,d22,#39 951 vadd.i64 d28,d10 952 vsli.64 d25,d22,#30 953 veor d30,d22,d23 954 vsli.64 d26,d22,#25 955 veor d21,d24,d25 956 vadd.i64 d27,d28 957 vbsl d30,d16,d23 @ Maj(a,b,c) 958 veor d21,d26 @ Sigma0(a) 959 vadd.i64 d17,d27 960 vadd.i64 d30,d27 961 @ vadd.i64 d21,d30 962 vshr.u64 d24,d17,#14 @ 11 963 #if 11<16 964 vld1.64 {d11},[r1]! @ handles unaligned 965 #endif 966 vshr.u64 d25,d17,#18 967 #if 11>0 968 vadd.i64 d21,d30 @ h+=Maj from the past 969 #endif 970 vshr.u64 d26,d17,#41 971 vld1.64 {d28},[r3,:64]! @ K[i++] 972 vsli.64 d24,d17,#50 973 vsli.64 d25,d17,#46 974 vmov d29,d17 975 vsli.64 d26,d17,#23 976 #if 11<16 && defined(__ARMEL__) 977 vrev64.8 d11,d11 978 #endif 979 veor d25,d24 980 vbsl d29,d18,d19 @ Ch(e,f,g) 981 vshr.u64 d24,d21,#28 982 veor d26,d25 @ Sigma1(e) 983 vadd.i64 d27,d29,d20 984 vshr.u64 d25,d21,#34 985 vsli.64 d24,d21,#36 986 vadd.i64 d27,d26 987 vshr.u64 d26,d21,#39 988 vadd.i64 d28,d11 989 vsli.64 d25,d21,#30 990 veor d30,d21,d22 991 vsli.64 d26,d21,#25 992 veor d20,d24,d25 993 vadd.i64 d27,d28 994 vbsl d30,d23,d22 @ Maj(a,b,c) 995 veor d20,d26 @ Sigma0(a) 996 vadd.i64 d16,d27 997 vadd.i64 d30,d27 998 @ vadd.i64 d20,d30 999 vshr.u64 d24,d16,#14 @ 12 1000 #if 12<16 1001 vld1.64 {d12},[r1]! @ handles unaligned 1002 #endif 1003 vshr.u64 d25,d16,#18 1004 #if 12>0 1005 vadd.i64 d20,d30 @ h+=Maj from the past 1006 #endif 1007 vshr.u64 d26,d16,#41 1008 vld1.64 {d28},[r3,:64]! @ K[i++] 1009 vsli.64 d24,d16,#50 1010 vsli.64 d25,d16,#46 1011 vmov d29,d16 1012 vsli.64 d26,d16,#23 1013 #if 12<16 && defined(__ARMEL__) 1014 vrev64.8 d12,d12 1015 #endif 1016 veor d25,d24 1017 vbsl d29,d17,d18 @ Ch(e,f,g) 1018 vshr.u64 d24,d20,#28 1019 veor d26,d25 @ Sigma1(e) 1020 vadd.i64 d27,d29,d19 1021 vshr.u64 d25,d20,#34 1022 vsli.64 d24,d20,#36 1023 vadd.i64 d27,d26 1024 vshr.u64 d26,d20,#39 1025 vadd.i64 d28,d12 1026 vsli.64 d25,d20,#30 1027 veor d30,d20,d21 1028 vsli.64 d26,d20,#25 1029 veor d19,d24,d25 1030 vadd.i64 d27,d28 1031 vbsl d30,d22,d21 @ Maj(a,b,c) 1032 veor d19,d26 @ Sigma0(a) 1033 vadd.i64 d23,d27 1034 vadd.i64 d30,d27 1035 @ vadd.i64 d19,d30 1036 vshr.u64 d24,d23,#14 @ 13 1037 #if 13<16 1038 vld1.64 {d13},[r1]! @ handles unaligned 1039 #endif 1040 vshr.u64 d25,d23,#18 1041 #if 13>0 1042 vadd.i64 d19,d30 @ h+=Maj from the past 1043 #endif 1044 vshr.u64 d26,d23,#41 1045 vld1.64 {d28},[r3,:64]! @ K[i++] 1046 vsli.64 d24,d23,#50 1047 vsli.64 d25,d23,#46 1048 vmov d29,d23 1049 vsli.64 d26,d23,#23 1050 #if 13<16 && defined(__ARMEL__) 1051 vrev64.8 d13,d13 1052 #endif 1053 veor d25,d24 1054 vbsl d29,d16,d17 @ Ch(e,f,g) 1055 vshr.u64 d24,d19,#28 1056 veor d26,d25 @ Sigma1(e) 1057 vadd.i64 d27,d29,d18 1058 vshr.u64 d25,d19,#34 1059 vsli.64 d24,d19,#36 1060 vadd.i64 d27,d26 1061 vshr.u64 d26,d19,#39 1062 vadd.i64 d28,d13 1063 vsli.64 d25,d19,#30 1064 veor d30,d19,d20 1065 vsli.64 d26,d19,#25 1066 veor d18,d24,d25 1067 vadd.i64 d27,d28 1068 vbsl d30,d21,d20 @ Maj(a,b,c) 1069 veor d18,d26 @ Sigma0(a) 1070 vadd.i64 d22,d27 1071 vadd.i64 d30,d27 1072 @ vadd.i64 d18,d30 1073 vshr.u64 d24,d22,#14 @ 14 1074 #if 14<16 1075 vld1.64 {d14},[r1]! @ handles unaligned 1076 #endif 1077 vshr.u64 d25,d22,#18 1078 #if 14>0 1079 vadd.i64 d18,d30 @ h+=Maj from the past 1080 #endif 1081 vshr.u64 d26,d22,#41 1082 vld1.64 {d28},[r3,:64]! @ K[i++] 1083 vsli.64 d24,d22,#50 1084 vsli.64 d25,d22,#46 1085 vmov d29,d22 1086 vsli.64 d26,d22,#23 1087 #if 14<16 && defined(__ARMEL__) 1088 vrev64.8 d14,d14 1089 #endif 1090 veor d25,d24 1091 vbsl d29,d23,d16 @ Ch(e,f,g) 1092 vshr.u64 d24,d18,#28 1093 veor d26,d25 @ Sigma1(e) 1094 vadd.i64 d27,d29,d17 1095 vshr.u64 d25,d18,#34 1096 vsli.64 d24,d18,#36 1097 vadd.i64 d27,d26 1098 vshr.u64 d26,d18,#39 1099 vadd.i64 d28,d14 1100 vsli.64 d25,d18,#30 1101 veor d30,d18,d19 1102 vsli.64 d26,d18,#25 1103 veor d17,d24,d25 1104 vadd.i64 d27,d28 1105 vbsl d30,d20,d19 @ Maj(a,b,c) 1106 veor d17,d26 @ Sigma0(a) 1107 vadd.i64 d21,d27 1108 vadd.i64 d30,d27 1109 @ vadd.i64 d17,d30 1110 vshr.u64 d24,d21,#14 @ 15 1111 #if 15<16 1112 vld1.64 {d15},[r1]! @ handles unaligned 1113 #endif 1114 vshr.u64 d25,d21,#18 1115 #if 15>0 1116 vadd.i64 d17,d30 @ h+=Maj from the past 1117 #endif 1118 vshr.u64 d26,d21,#41 1119 vld1.64 {d28},[r3,:64]! @ K[i++] 1120 vsli.64 d24,d21,#50 1121 vsli.64 d25,d21,#46 1122 vmov d29,d21 1123 vsli.64 d26,d21,#23 1124 #if 15<16 && defined(__ARMEL__) 1125 vrev64.8 d15,d15 1126 #endif 1127 veor d25,d24 1128 vbsl d29,d22,d23 @ Ch(e,f,g) 1129 vshr.u64 d24,d17,#28 1130 veor d26,d25 @ Sigma1(e) 1131 vadd.i64 d27,d29,d16 1132 vshr.u64 d25,d17,#34 1133 vsli.64 d24,d17,#36 1134 vadd.i64 d27,d26 1135 vshr.u64 d26,d17,#39 1136 vadd.i64 d28,d15 1137 vsli.64 d25,d17,#30 1138 veor d30,d17,d18 1139 vsli.64 d26,d17,#25 1140 veor d16,d24,d25 1141 vadd.i64 d27,d28 1142 vbsl d30,d19,d18 @ Maj(a,b,c) 1143 veor d16,d26 @ Sigma0(a) 1144 vadd.i64 d20,d27 1145 vadd.i64 d30,d27 1146 @ vadd.i64 d16,d30 1147 mov r12,#4 1148 .L16_79_neon: 1149 subs r12,#1 1150 vshr.u64 q12,q7,#19 1151 vshr.u64 q13,q7,#61 1152 vadd.i64 d16,d30 @ h+=Maj from the past 1153 vshr.u64 q15,q7,#6 1154 vsli.64 q12,q7,#45 1155 vext.8 q14,q0,q1,#8 @ X[i+1] 1156 vsli.64 q13,q7,#3 1157 veor q15,q12 1158 vshr.u64 q12,q14,#1 1159 veor q15,q13 @ sigma1(X[i+14]) 1160 vshr.u64 q13,q14,#8 1161 vadd.i64 q0,q15 1162 vshr.u64 q15,q14,#7 1163 vsli.64 q12,q14,#63 1164 vsli.64 q13,q14,#56 1165 vext.8 q14,q4,q5,#8 @ X[i+9] 1166 veor q15,q12 1167 vshr.u64 d24,d20,#14 @ from NEON_00_15 1168 vadd.i64 q0,q14 1169 vshr.u64 d25,d20,#18 @ from NEON_00_15 1170 veor q15,q13 @ sigma0(X[i+1]) 1171 vshr.u64 d26,d20,#41 @ from NEON_00_15 1172 vadd.i64 q0,q15 1173 vld1.64 {d28},[r3,:64]! @ K[i++] 1174 vsli.64 d24,d20,#50 1175 vsli.64 d25,d20,#46 1176 vmov d29,d20 1177 vsli.64 d26,d20,#23 1178 #if 16<16 && defined(__ARMEL__) 1179 vrev64.8 , 1180 #endif 1181 veor d25,d24 1182 vbsl d29,d21,d22 @ Ch(e,f,g) 1183 vshr.u64 d24,d16,#28 1184 veor d26,d25 @ Sigma1(e) 1185 vadd.i64 d27,d29,d23 1186 vshr.u64 d25,d16,#34 1187 vsli.64 d24,d16,#36 1188 vadd.i64 d27,d26 1189 vshr.u64 d26,d16,#39 1190 vadd.i64 d28,d0 1191 vsli.64 d25,d16,#30 1192 veor d30,d16,d17 1193 vsli.64 d26,d16,#25 1194 veor d23,d24,d25 1195 vadd.i64 d27,d28 1196 vbsl d30,d18,d17 @ Maj(a,b,c) 1197 veor d23,d26 @ Sigma0(a) 1198 vadd.i64 d19,d27 1199 vadd.i64 d30,d27 1200 @ vadd.i64 d23,d30 1201 vshr.u64 d24,d19,#14 @ 17 1202 #if 17<16 1203 vld1.64 {d1},[r1]! @ handles unaligned 1204 #endif 1205 vshr.u64 d25,d19,#18 1206 #if 17>0 1207 vadd.i64 d23,d30 @ h+=Maj from the past 1208 #endif 1209 vshr.u64 d26,d19,#41 1210 vld1.64 {d28},[r3,:64]! @ K[i++] 1211 vsli.64 d24,d19,#50 1212 vsli.64 d25,d19,#46 1213 vmov d29,d19 1214 vsli.64 d26,d19,#23 1215 #if 17<16 && defined(__ARMEL__) 1216 vrev64.8 , 1217 #endif 1218 veor d25,d24 1219 vbsl d29,d20,d21 @ Ch(e,f,g) 1220 vshr.u64 d24,d23,#28 1221 veor d26,d25 @ Sigma1(e) 1222 vadd.i64 d27,d29,d22 1223 vshr.u64 d25,d23,#34 1224 vsli.64 d24,d23,#36 1225 vadd.i64 d27,d26 1226 vshr.u64 d26,d23,#39 1227 vadd.i64 d28,d1 1228 vsli.64 d25,d23,#30 1229 veor d30,d23,d16 1230 vsli.64 d26,d23,#25 1231 veor d22,d24,d25 1232 vadd.i64 d27,d28 1233 vbsl d30,d17,d16 @ Maj(a,b,c) 1234 veor d22,d26 @ Sigma0(a) 1235 vadd.i64 d18,d27 1236 vadd.i64 d30,d27 1237 @ vadd.i64 d22,d30 1238 vshr.u64 q12,q0,#19 1239 vshr.u64 q13,q0,#61 1240 vadd.i64 d22,d30 @ h+=Maj from the past 1241 vshr.u64 q15,q0,#6 1242 vsli.64 q12,q0,#45 1243 vext.8 q14,q1,q2,#8 @ X[i+1] 1244 vsli.64 q13,q0,#3 1245 veor q15,q12 1246 vshr.u64 q12,q14,#1 1247 veor q15,q13 @ sigma1(X[i+14]) 1248 vshr.u64 q13,q14,#8 1249 vadd.i64 q1,q15 1250 vshr.u64 q15,q14,#7 1251 vsli.64 q12,q14,#63 1252 vsli.64 q13,q14,#56 1253 vext.8 q14,q5,q6,#8 @ X[i+9] 1254 veor q15,q12 1255 vshr.u64 d24,d18,#14 @ from NEON_00_15 1256 vadd.i64 q1,q14 1257 vshr.u64 d25,d18,#18 @ from NEON_00_15 1258 veor q15,q13 @ sigma0(X[i+1]) 1259 vshr.u64 d26,d18,#41 @ from NEON_00_15 1260 vadd.i64 q1,q15 1261 vld1.64 {d28},[r3,:64]! @ K[i++] 1262 vsli.64 d24,d18,#50 1263 vsli.64 d25,d18,#46 1264 vmov d29,d18 1265 vsli.64 d26,d18,#23 1266 #if 18<16 && defined(__ARMEL__) 1267 vrev64.8 , 1268 #endif 1269 veor d25,d24 1270 vbsl d29,d19,d20 @ Ch(e,f,g) 1271 vshr.u64 d24,d22,#28 1272 veor d26,d25 @ Sigma1(e) 1273 vadd.i64 d27,d29,d21 1274 vshr.u64 d25,d22,#34 1275 vsli.64 d24,d22,#36 1276 vadd.i64 d27,d26 1277 vshr.u64 d26,d22,#39 1278 vadd.i64 d28,d2 1279 vsli.64 d25,d22,#30 1280 veor d30,d22,d23 1281 vsli.64 d26,d22,#25 1282 veor d21,d24,d25 1283 vadd.i64 d27,d28 1284 vbsl d30,d16,d23 @ Maj(a,b,c) 1285 veor d21,d26 @ Sigma0(a) 1286 vadd.i64 d17,d27 1287 vadd.i64 d30,d27 1288 @ vadd.i64 d21,d30 1289 vshr.u64 d24,d17,#14 @ 19 1290 #if 19<16 1291 vld1.64 {d3},[r1]! @ handles unaligned 1292 #endif 1293 vshr.u64 d25,d17,#18 1294 #if 19>0 1295 vadd.i64 d21,d30 @ h+=Maj from the past 1296 #endif 1297 vshr.u64 d26,d17,#41 1298 vld1.64 {d28},[r3,:64]! @ K[i++] 1299 vsli.64 d24,d17,#50 1300 vsli.64 d25,d17,#46 1301 vmov d29,d17 1302 vsli.64 d26,d17,#23 1303 #if 19<16 && defined(__ARMEL__) 1304 vrev64.8 , 1305 #endif 1306 veor d25,d24 1307 vbsl d29,d18,d19 @ Ch(e,f,g) 1308 vshr.u64 d24,d21,#28 1309 veor d26,d25 @ Sigma1(e) 1310 vadd.i64 d27,d29,d20 1311 vshr.u64 d25,d21,#34 1312 vsli.64 d24,d21,#36 1313 vadd.i64 d27,d26 1314 vshr.u64 d26,d21,#39 1315 vadd.i64 d28,d3 1316 vsli.64 d25,d21,#30 1317 veor d30,d21,d22 1318 vsli.64 d26,d21,#25 1319 veor d20,d24,d25 1320 vadd.i64 d27,d28 1321 vbsl d30,d23,d22 @ Maj(a,b,c) 1322 veor d20,d26 @ Sigma0(a) 1323 vadd.i64 d16,d27 1324 vadd.i64 d30,d27 1325 @ vadd.i64 d20,d30 1326 vshr.u64 q12,q1,#19 1327 vshr.u64 q13,q1,#61 1328 vadd.i64 d20,d30 @ h+=Maj from the past 1329 vshr.u64 q15,q1,#6 1330 vsli.64 q12,q1,#45 1331 vext.8 q14,q2,q3,#8 @ X[i+1] 1332 vsli.64 q13,q1,#3 1333 veor q15,q12 1334 vshr.u64 q12,q14,#1 1335 veor q15,q13 @ sigma1(X[i+14]) 1336 vshr.u64 q13,q14,#8 1337 vadd.i64 q2,q15 1338 vshr.u64 q15,q14,#7 1339 vsli.64 q12,q14,#63 1340 vsli.64 q13,q14,#56 1341 vext.8 q14,q6,q7,#8 @ X[i+9] 1342 veor q15,q12 1343 vshr.u64 d24,d16,#14 @ from NEON_00_15 1344 vadd.i64 q2,q14 1345 vshr.u64 d25,d16,#18 @ from NEON_00_15 1346 veor q15,q13 @ sigma0(X[i+1]) 1347 vshr.u64 d26,d16,#41 @ from NEON_00_15 1348 vadd.i64 q2,q15 1349 vld1.64 {d28},[r3,:64]! @ K[i++] 1350 vsli.64 d24,d16,#50 1351 vsli.64 d25,d16,#46 1352 vmov d29,d16 1353 vsli.64 d26,d16,#23 1354 #if 20<16 && defined(__ARMEL__) 1355 vrev64.8 , 1356 #endif 1357 veor d25,d24 1358 vbsl d29,d17,d18 @ Ch(e,f,g) 1359 vshr.u64 d24,d20,#28 1360 veor d26,d25 @ Sigma1(e) 1361 vadd.i64 d27,d29,d19 1362 vshr.u64 d25,d20,#34 1363 vsli.64 d24,d20,#36 1364 vadd.i64 d27,d26 1365 vshr.u64 d26,d20,#39 1366 vadd.i64 d28,d4 1367 vsli.64 d25,d20,#30 1368 veor d30,d20,d21 1369 vsli.64 d26,d20,#25 1370 veor d19,d24,d25 1371 vadd.i64 d27,d28 1372 vbsl d30,d22,d21 @ Maj(a,b,c) 1373 veor d19,d26 @ Sigma0(a) 1374 vadd.i64 d23,d27 1375 vadd.i64 d30,d27 1376 @ vadd.i64 d19,d30 1377 vshr.u64 d24,d23,#14 @ 21 1378 #if 21<16 1379 vld1.64 {d5},[r1]! @ handles unaligned 1380 #endif 1381 vshr.u64 d25,d23,#18 1382 #if 21>0 1383 vadd.i64 d19,d30 @ h+=Maj from the past 1384 #endif 1385 vshr.u64 d26,d23,#41 1386 vld1.64 {d28},[r3,:64]! @ K[i++] 1387 vsli.64 d24,d23,#50 1388 vsli.64 d25,d23,#46 1389 vmov d29,d23 1390 vsli.64 d26,d23,#23 1391 #if 21<16 && defined(__ARMEL__) 1392 vrev64.8 , 1393 #endif 1394 veor d25,d24 1395 vbsl d29,d16,d17 @ Ch(e,f,g) 1396 vshr.u64 d24,d19,#28 1397 veor d26,d25 @ Sigma1(e) 1398 vadd.i64 d27,d29,d18 1399 vshr.u64 d25,d19,#34 1400 vsli.64 d24,d19,#36 1401 vadd.i64 d27,d26 1402 vshr.u64 d26,d19,#39 1403 vadd.i64 d28,d5 1404 vsli.64 d25,d19,#30 1405 veor d30,d19,d20 1406 vsli.64 d26,d19,#25 1407 veor d18,d24,d25 1408 vadd.i64 d27,d28 1409 vbsl d30,d21,d20 @ Maj(a,b,c) 1410 veor d18,d26 @ Sigma0(a) 1411 vadd.i64 d22,d27 1412 vadd.i64 d30,d27 1413 @ vadd.i64 d18,d30 1414 vshr.u64 q12,q2,#19 1415 vshr.u64 q13,q2,#61 1416 vadd.i64 d18,d30 @ h+=Maj from the past 1417 vshr.u64 q15,q2,#6 1418 vsli.64 q12,q2,#45 1419 vext.8 q14,q3,q4,#8 @ X[i+1] 1420 vsli.64 q13,q2,#3 1421 veor q15,q12 1422 vshr.u64 q12,q14,#1 1423 veor q15,q13 @ sigma1(X[i+14]) 1424 vshr.u64 q13,q14,#8 1425 vadd.i64 q3,q15 1426 vshr.u64 q15,q14,#7 1427 vsli.64 q12,q14,#63 1428 vsli.64 q13,q14,#56 1429 vext.8 q14,q7,q0,#8 @ X[i+9] 1430 veor q15,q12 1431 vshr.u64 d24,d22,#14 @ from NEON_00_15 1432 vadd.i64 q3,q14 1433 vshr.u64 d25,d22,#18 @ from NEON_00_15 1434 veor q15,q13 @ sigma0(X[i+1]) 1435 vshr.u64 d26,d22,#41 @ from NEON_00_15 1436 vadd.i64 q3,q15 1437 vld1.64 {d28},[r3,:64]! @ K[i++] 1438 vsli.64 d24,d22,#50 1439 vsli.64 d25,d22,#46 1440 vmov d29,d22 1441 vsli.64 d26,d22,#23 1442 #if 22<16 && defined(__ARMEL__) 1443 vrev64.8 , 1444 #endif 1445 veor d25,d24 1446 vbsl d29,d23,d16 @ Ch(e,f,g) 1447 vshr.u64 d24,d18,#28 1448 veor d26,d25 @ Sigma1(e) 1449 vadd.i64 d27,d29,d17 1450 vshr.u64 d25,d18,#34 1451 vsli.64 d24,d18,#36 1452 vadd.i64 d27,d26 1453 vshr.u64 d26,d18,#39 1454 vadd.i64 d28,d6 1455 vsli.64 d25,d18,#30 1456 veor d30,d18,d19 1457 vsli.64 d26,d18,#25 1458 veor d17,d24,d25 1459 vadd.i64 d27,d28 1460 vbsl d30,d20,d19 @ Maj(a,b,c) 1461 veor d17,d26 @ Sigma0(a) 1462 vadd.i64 d21,d27 1463 vadd.i64 d30,d27 1464 @ vadd.i64 d17,d30 1465 vshr.u64 d24,d21,#14 @ 23 1466 #if 23<16 1467 vld1.64 {d7},[r1]! @ handles unaligned 1468 #endif 1469 vshr.u64 d25,d21,#18 1470 #if 23>0 1471 vadd.i64 d17,d30 @ h+=Maj from the past 1472 #endif 1473 vshr.u64 d26,d21,#41 1474 vld1.64 {d28},[r3,:64]! @ K[i++] 1475 vsli.64 d24,d21,#50 1476 vsli.64 d25,d21,#46 1477 vmov d29,d21 1478 vsli.64 d26,d21,#23 1479 #if 23<16 && defined(__ARMEL__) 1480 vrev64.8 , 1481 #endif 1482 veor d25,d24 1483 vbsl d29,d22,d23 @ Ch(e,f,g) 1484 vshr.u64 d24,d17,#28 1485 veor d26,d25 @ Sigma1(e) 1486 vadd.i64 d27,d29,d16 1487 vshr.u64 d25,d17,#34 1488 vsli.64 d24,d17,#36 1489 vadd.i64 d27,d26 1490 vshr.u64 d26,d17,#39 1491 vadd.i64 d28,d7 1492 vsli.64 d25,d17,#30 1493 veor d30,d17,d18 1494 vsli.64 d26,d17,#25 1495 veor d16,d24,d25 1496 vadd.i64 d27,d28 1497 vbsl d30,d19,d18 @ Maj(a,b,c) 1498 veor d16,d26 @ Sigma0(a) 1499 vadd.i64 d20,d27 1500 vadd.i64 d30,d27 1501 @ vadd.i64 d16,d30 1502 vshr.u64 q12,q3,#19 1503 vshr.u64 q13,q3,#61 1504 vadd.i64 d16,d30 @ h+=Maj from the past 1505 vshr.u64 q15,q3,#6 1506 vsli.64 q12,q3,#45 1507 vext.8 q14,q4,q5,#8 @ X[i+1] 1508 vsli.64 q13,q3,#3 1509 veor q15,q12 1510 vshr.u64 q12,q14,#1 1511 veor q15,q13 @ sigma1(X[i+14]) 1512 vshr.u64 q13,q14,#8 1513 vadd.i64 q4,q15 1514 vshr.u64 q15,q14,#7 1515 vsli.64 q12,q14,#63 1516 vsli.64 q13,q14,#56 1517 vext.8 q14,q0,q1,#8 @ X[i+9] 1518 veor q15,q12 1519 vshr.u64 d24,d20,#14 @ from NEON_00_15 1520 vadd.i64 q4,q14 1521 vshr.u64 d25,d20,#18 @ from NEON_00_15 1522 veor q15,q13 @ sigma0(X[i+1]) 1523 vshr.u64 d26,d20,#41 @ from NEON_00_15 1524 vadd.i64 q4,q15 1525 vld1.64 {d28},[r3,:64]! @ K[i++] 1526 vsli.64 d24,d20,#50 1527 vsli.64 d25,d20,#46 1528 vmov d29,d20 1529 vsli.64 d26,d20,#23 1530 #if 24<16 && defined(__ARMEL__) 1531 vrev64.8 , 1532 #endif 1533 veor d25,d24 1534 vbsl d29,d21,d22 @ Ch(e,f,g) 1535 vshr.u64 d24,d16,#28 1536 veor d26,d25 @ Sigma1(e) 1537 vadd.i64 d27,d29,d23 1538 vshr.u64 d25,d16,#34 1539 vsli.64 d24,d16,#36 1540 vadd.i64 d27,d26 1541 vshr.u64 d26,d16,#39 1542 vadd.i64 d28,d8 1543 vsli.64 d25,d16,#30 1544 veor d30,d16,d17 1545 vsli.64 d26,d16,#25 1546 veor d23,d24,d25 1547 vadd.i64 d27,d28 1548 vbsl d30,d18,d17 @ Maj(a,b,c) 1549 veor d23,d26 @ Sigma0(a) 1550 vadd.i64 d19,d27 1551 vadd.i64 d30,d27 1552 @ vadd.i64 d23,d30 1553 vshr.u64 d24,d19,#14 @ 25 1554 #if 25<16 1555 vld1.64 {d9},[r1]! @ handles unaligned 1556 #endif 1557 vshr.u64 d25,d19,#18 1558 #if 25>0 1559 vadd.i64 d23,d30 @ h+=Maj from the past 1560 #endif 1561 vshr.u64 d26,d19,#41 1562 vld1.64 {d28},[r3,:64]! @ K[i++] 1563 vsli.64 d24,d19,#50 1564 vsli.64 d25,d19,#46 1565 vmov d29,d19 1566 vsli.64 d26,d19,#23 1567 #if 25<16 && defined(__ARMEL__) 1568 vrev64.8 , 1569 #endif 1570 veor d25,d24 1571 vbsl d29,d20,d21 @ Ch(e,f,g) 1572 vshr.u64 d24,d23,#28 1573 veor d26,d25 @ Sigma1(e) 1574 vadd.i64 d27,d29,d22 1575 vshr.u64 d25,d23,#34 1576 vsli.64 d24,d23,#36 1577 vadd.i64 d27,d26 1578 vshr.u64 d26,d23,#39 1579 vadd.i64 d28,d9 1580 vsli.64 d25,d23,#30 1581 veor d30,d23,d16 1582 vsli.64 d26,d23,#25 1583 veor d22,d24,d25 1584 vadd.i64 d27,d28 1585 vbsl d30,d17,d16 @ Maj(a,b,c) 1586 veor d22,d26 @ Sigma0(a) 1587 vadd.i64 d18,d27 1588 vadd.i64 d30,d27 1589 @ vadd.i64 d22,d30 1590 vshr.u64 q12,q4,#19 1591 vshr.u64 q13,q4,#61 1592 vadd.i64 d22,d30 @ h+=Maj from the past 1593 vshr.u64 q15,q4,#6 1594 vsli.64 q12,q4,#45 1595 vext.8 q14,q5,q6,#8 @ X[i+1] 1596 vsli.64 q13,q4,#3 1597 veor q15,q12 1598 vshr.u64 q12,q14,#1 1599 veor q15,q13 @ sigma1(X[i+14]) 1600 vshr.u64 q13,q14,#8 1601 vadd.i64 q5,q15 1602 vshr.u64 q15,q14,#7 1603 vsli.64 q12,q14,#63 1604 vsli.64 q13,q14,#56 1605 vext.8 q14,q1,q2,#8 @ X[i+9] 1606 veor q15,q12 1607 vshr.u64 d24,d18,#14 @ from NEON_00_15 1608 vadd.i64 q5,q14 1609 vshr.u64 d25,d18,#18 @ from NEON_00_15 1610 veor q15,q13 @ sigma0(X[i+1]) 1611 vshr.u64 d26,d18,#41 @ from NEON_00_15 1612 vadd.i64 q5,q15 1613 vld1.64 {d28},[r3,:64]! @ K[i++] 1614 vsli.64 d24,d18,#50 1615 vsli.64 d25,d18,#46 1616 vmov d29,d18 1617 vsli.64 d26,d18,#23 1618 #if 26<16 && defined(__ARMEL__) 1619 vrev64.8 , 1620 #endif 1621 veor d25,d24 1622 vbsl d29,d19,d20 @ Ch(e,f,g) 1623 vshr.u64 d24,d22,#28 1624 veor d26,d25 @ Sigma1(e) 1625 vadd.i64 d27,d29,d21 1626 vshr.u64 d25,d22,#34 1627 vsli.64 d24,d22,#36 1628 vadd.i64 d27,d26 1629 vshr.u64 d26,d22,#39 1630 vadd.i64 d28,d10 1631 vsli.64 d25,d22,#30 1632 veor d30,d22,d23 1633 vsli.64 d26,d22,#25 1634 veor d21,d24,d25 1635 vadd.i64 d27,d28 1636 vbsl d30,d16,d23 @ Maj(a,b,c) 1637 veor d21,d26 @ Sigma0(a) 1638 vadd.i64 d17,d27 1639 vadd.i64 d30,d27 1640 @ vadd.i64 d21,d30 1641 vshr.u64 d24,d17,#14 @ 27 1642 #if 27<16 1643 vld1.64 {d11},[r1]! @ handles unaligned 1644 #endif 1645 vshr.u64 d25,d17,#18 1646 #if 27>0 1647 vadd.i64 d21,d30 @ h+=Maj from the past 1648 #endif 1649 vshr.u64 d26,d17,#41 1650 vld1.64 {d28},[r3,:64]! @ K[i++] 1651 vsli.64 d24,d17,#50 1652 vsli.64 d25,d17,#46 1653 vmov d29,d17 1654 vsli.64 d26,d17,#23 1655 #if 27<16 && defined(__ARMEL__) 1656 vrev64.8 , 1657 #endif 1658 veor d25,d24 1659 vbsl d29,d18,d19 @ Ch(e,f,g) 1660 vshr.u64 d24,d21,#28 1661 veor d26,d25 @ Sigma1(e) 1662 vadd.i64 d27,d29,d20 1663 vshr.u64 d25,d21,#34 1664 vsli.64 d24,d21,#36 1665 vadd.i64 d27,d26 1666 vshr.u64 d26,d21,#39 1667 vadd.i64 d28,d11 1668 vsli.64 d25,d21,#30 1669 veor d30,d21,d22 1670 vsli.64 d26,d21,#25 1671 veor d20,d24,d25 1672 vadd.i64 d27,d28 1673 vbsl d30,d23,d22 @ Maj(a,b,c) 1674 veor d20,d26 @ Sigma0(a) 1675 vadd.i64 d16,d27 1676 vadd.i64 d30,d27 1677 @ vadd.i64 d20,d30 1678 vshr.u64 q12,q5,#19 1679 vshr.u64 q13,q5,#61 1680 vadd.i64 d20,d30 @ h+=Maj from the past 1681 vshr.u64 q15,q5,#6 1682 vsli.64 q12,q5,#45 1683 vext.8 q14,q6,q7,#8 @ X[i+1] 1684 vsli.64 q13,q5,#3 1685 veor q15,q12 1686 vshr.u64 q12,q14,#1 1687 veor q15,q13 @ sigma1(X[i+14]) 1688 vshr.u64 q13,q14,#8 1689 vadd.i64 q6,q15 1690 vshr.u64 q15,q14,#7 1691 vsli.64 q12,q14,#63 1692 vsli.64 q13,q14,#56 1693 vext.8 q14,q2,q3,#8 @ X[i+9] 1694 veor q15,q12 1695 vshr.u64 d24,d16,#14 @ from NEON_00_15 1696 vadd.i64 q6,q14 1697 vshr.u64 d25,d16,#18 @ from NEON_00_15 1698 veor q15,q13 @ sigma0(X[i+1]) 1699 vshr.u64 d26,d16,#41 @ from NEON_00_15 1700 vadd.i64 q6,q15 1701 vld1.64 {d28},[r3,:64]! @ K[i++] 1702 vsli.64 d24,d16,#50 1703 vsli.64 d25,d16,#46 1704 vmov d29,d16 1705 vsli.64 d26,d16,#23 1706 #if 28<16 && defined(__ARMEL__) 1707 vrev64.8 , 1708 #endif 1709 veor d25,d24 1710 vbsl d29,d17,d18 @ Ch(e,f,g) 1711 vshr.u64 d24,d20,#28 1712 veor d26,d25 @ Sigma1(e) 1713 vadd.i64 d27,d29,d19 1714 vshr.u64 d25,d20,#34 1715 vsli.64 d24,d20,#36 1716 vadd.i64 d27,d26 1717 vshr.u64 d26,d20,#39 1718 vadd.i64 d28,d12 1719 vsli.64 d25,d20,#30 1720 veor d30,d20,d21 1721 vsli.64 d26,d20,#25 1722 veor d19,d24,d25 1723 vadd.i64 d27,d28 1724 vbsl d30,d22,d21 @ Maj(a,b,c) 1725 veor d19,d26 @ Sigma0(a) 1726 vadd.i64 d23,d27 1727 vadd.i64 d30,d27 1728 @ vadd.i64 d19,d30 1729 vshr.u64 d24,d23,#14 @ 29 1730 #if 29<16 1731 vld1.64 {d13},[r1]! @ handles unaligned 1732 #endif 1733 vshr.u64 d25,d23,#18 1734 #if 29>0 1735 vadd.i64 d19,d30 @ h+=Maj from the past 1736 #endif 1737 vshr.u64 d26,d23,#41 1738 vld1.64 {d28},[r3,:64]! @ K[i++] 1739 vsli.64 d24,d23,#50 1740 vsli.64 d25,d23,#46 1741 vmov d29,d23 1742 vsli.64 d26,d23,#23 1743 #if 29<16 && defined(__ARMEL__) 1744 vrev64.8 , 1745 #endif 1746 veor d25,d24 1747 vbsl d29,d16,d17 @ Ch(e,f,g) 1748 vshr.u64 d24,d19,#28 1749 veor d26,d25 @ Sigma1(e) 1750 vadd.i64 d27,d29,d18 1751 vshr.u64 d25,d19,#34 1752 vsli.64 d24,d19,#36 1753 vadd.i64 d27,d26 1754 vshr.u64 d26,d19,#39 1755 vadd.i64 d28,d13 1756 vsli.64 d25,d19,#30 1757 veor d30,d19,d20 1758 vsli.64 d26,d19,#25 1759 veor d18,d24,d25 1760 vadd.i64 d27,d28 1761 vbsl d30,d21,d20 @ Maj(a,b,c) 1762 veor d18,d26 @ Sigma0(a) 1763 vadd.i64 d22,d27 1764 vadd.i64 d30,d27 1765 @ vadd.i64 d18,d30 1766 vshr.u64 q12,q6,#19 1767 vshr.u64 q13,q6,#61 1768 vadd.i64 d18,d30 @ h+=Maj from the past 1769 vshr.u64 q15,q6,#6 1770 vsli.64 q12,q6,#45 1771 vext.8 q14,q7,q0,#8 @ X[i+1] 1772 vsli.64 q13,q6,#3 1773 veor q15,q12 1774 vshr.u64 q12,q14,#1 1775 veor q15,q13 @ sigma1(X[i+14]) 1776 vshr.u64 q13,q14,#8 1777 vadd.i64 q7,q15 1778 vshr.u64 q15,q14,#7 1779 vsli.64 q12,q14,#63 1780 vsli.64 q13,q14,#56 1781 vext.8 q14,q3,q4,#8 @ X[i+9] 1782 veor q15,q12 1783 vshr.u64 d24,d22,#14 @ from NEON_00_15 1784 vadd.i64 q7,q14 1785 vshr.u64 d25,d22,#18 @ from NEON_00_15 1786 veor q15,q13 @ sigma0(X[i+1]) 1787 vshr.u64 d26,d22,#41 @ from NEON_00_15 1788 vadd.i64 q7,q15 1789 vld1.64 {d28},[r3,:64]! @ K[i++] 1790 vsli.64 d24,d22,#50 1791 vsli.64 d25,d22,#46 1792 vmov d29,d22 1793 vsli.64 d26,d22,#23 1794 #if 30<16 && defined(__ARMEL__) 1795 vrev64.8 , 1796 #endif 1797 veor d25,d24 1798 vbsl d29,d23,d16 @ Ch(e,f,g) 1799 vshr.u64 d24,d18,#28 1800 veor d26,d25 @ Sigma1(e) 1801 vadd.i64 d27,d29,d17 1802 vshr.u64 d25,d18,#34 1803 vsli.64 d24,d18,#36 1804 vadd.i64 d27,d26 1805 vshr.u64 d26,d18,#39 1806 vadd.i64 d28,d14 1807 vsli.64 d25,d18,#30 1808 veor d30,d18,d19 1809 vsli.64 d26,d18,#25 1810 veor d17,d24,d25 1811 vadd.i64 d27,d28 1812 vbsl d30,d20,d19 @ Maj(a,b,c) 1813 veor d17,d26 @ Sigma0(a) 1814 vadd.i64 d21,d27 1815 vadd.i64 d30,d27 1816 @ vadd.i64 d17,d30 1817 vshr.u64 d24,d21,#14 @ 31 1818 #if 31<16 1819 vld1.64 {d15},[r1]! @ handles unaligned 1820 #endif 1821 vshr.u64 d25,d21,#18 1822 #if 31>0 1823 vadd.i64 d17,d30 @ h+=Maj from the past 1824 #endif 1825 vshr.u64 d26,d21,#41 1826 vld1.64 {d28},[r3,:64]! @ K[i++] 1827 vsli.64 d24,d21,#50 1828 vsli.64 d25,d21,#46 1829 vmov d29,d21 1830 vsli.64 d26,d21,#23 1831 #if 31<16 && defined(__ARMEL__) 1832 vrev64.8 , 1833 #endif 1834 veor d25,d24 1835 vbsl d29,d22,d23 @ Ch(e,f,g) 1836 vshr.u64 d24,d17,#28 1837 veor d26,d25 @ Sigma1(e) 1838 vadd.i64 d27,d29,d16 1839 vshr.u64 d25,d17,#34 1840 vsli.64 d24,d17,#36 1841 vadd.i64 d27,d26 1842 vshr.u64 d26,d17,#39 1843 vadd.i64 d28,d15 1844 vsli.64 d25,d17,#30 1845 veor d30,d17,d18 1846 vsli.64 d26,d17,#25 1847 veor d16,d24,d25 1848 vadd.i64 d27,d28 1849 vbsl d30,d19,d18 @ Maj(a,b,c) 1850 veor d16,d26 @ Sigma0(a) 1851 vadd.i64 d20,d27 1852 vadd.i64 d30,d27 1853 @ vadd.i64 d16,d30 1854 bne .L16_79_neon 1855 1856 vadd.i64 d16,d30 @ h+=Maj from the past 1857 vldmia r0,{d24,d25,d26,d27,d28,d29,d30,d31} @ load context to temp 1858 vadd.i64 q8,q12 @ vectorized accumulate 1859 vadd.i64 q9,q13 1860 vadd.i64 q10,q14 1861 vadd.i64 q11,q15 1862 vstmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ save context 1863 teq r1,r2 1864 sub r3,#640 @ rewind K512 1865 bne .Loop_neon 1866 1867 VFP_ABI_POP 1868 bx lr @ .word 0xe12fff1e 1869 .size sha512_block_data_order_neon,.-sha512_block_data_order_neon 1870 #endif 1871 .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 1872 .align 2 1873 .align 2 1874 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) 1875 .comm OPENSSL_armcap_P,4,4 1876 #endif 1877