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