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