1 // Copyright 2014-2025 The OpenSSL Project Authors. All Rights Reserved. 2 // 3 // Licensed under the Apache License 2.0 (the "License"). You may not use 4 // this file except in compliance with the License. You can obtain a copy 5 // in the file LICENSE in the source distribution or at 6 // https://www.openssl.org/source/license.html 7 8 // ==================================================================== 9 // Written by Andy Polyakov <appro (at) openssl.org> for the OpenSSL 10 // project. The module is, however, dual licensed under OpenSSL and 11 // CRYPTOGAMS licenses depending on where you obtain it. For further 12 // details see http://www.openssl.org/~appro/cryptogams/. 13 // 14 // Permission to use under GPLv2 terms is granted. 15 // ==================================================================== 16 // 17 // SHA256/512 for ARMv8. 18 // 19 // Performance in cycles per processed byte and improvement coefficient 20 // over code generated with "default" compiler: 21 // 22 // SHA256-hw SHA256(*) SHA512 23 // Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) 24 // Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) 25 // Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) 26 // Denver 2.01 10.5 (+26%) 6.70 (+8%) 27 // X-Gene 20.0 (+100%) 12.8 (+300%(***)) 28 // Mongoose 2.36 13.0 (+50%) 8.36 (+33%) 29 // Kryo 1.92 17.4 (+30%) 11.2 (+8%) 30 // ThunderX2 2.54 13.2 (+40%) 8.40 (+18%) 31 // 32 // (*) Software SHA256 results are of lesser relevance, presented 33 // mostly for informational purposes. 34 // (**) The result is a trade-off: it's possible to improve it by 35 // 10% (or by 1 cycle per round), but at the cost of 20% loss 36 // on Cortex-A53 (or by 4 cycles per round). 37 // (***) Super-impressive coefficients over gcc-generated code are 38 // indication of some compiler "pathology", most notably code 39 // generated with -mgeneral-regs-only is significantly faster 40 // and the gap is only 40-90%. 41 // 42 // October 2016. 43 // 44 // Originally it was reckoned that it makes no sense to implement NEON 45 // version of SHA256 for 64-bit processors. This is because performance 46 // improvement on most wide-spread Cortex-A5x processors was observed 47 // to be marginal, same on Cortex-A53 and ~10% on A57. But then it was 48 // observed that 32-bit NEON SHA256 performs significantly better than 49 // 64-bit scalar version on *some* of the more recent processors. As 50 // result 64-bit NEON version of SHA256 was added to provide best 51 // all-round performance. For example it executes ~30% faster on X-Gene 52 // and Mongoose. [For reference, NEON version of SHA512 is bound to 53 // deliver much less improvement, likely *negative* on Cortex-A5x. 54 // Which is why NEON support is limited to SHA256.] 55 56 // $output is the last argument if it looks like a file (it has an extension) 57 // $flavour is the first argument if it doesn't look like a file 58 #include "arm_arch.h" 59 #ifndef __KERNEL__ 60 61 .hidden OPENSSL_armcap_P 62 #endif 63 64 .text 65 66 .globl sha256_block_data_order 67 .type sha256_block_data_order,%function 68 .align 6 69 sha256_block_data_order: 70 AARCH64_VALID_CALL_TARGET 71 #ifndef __KERNEL__ 72 adrp x16,OPENSSL_armcap_P 73 ldr w16,[x16,#:lo12:OPENSSL_armcap_P] 74 tst w16,#ARMV8_SHA256 75 b.ne .Lv8_entry 76 tst w16,#ARMV7_NEON 77 b.ne .Lneon_entry 78 #endif 79 AARCH64_SIGN_LINK_REGISTER 80 stp x29,x30,[sp,#-128]! 81 add x29,sp,#0 82 83 stp x19,x20,[sp,#16] 84 stp x21,x22,[sp,#32] 85 stp x23,x24,[sp,#48] 86 stp x25,x26,[sp,#64] 87 stp x27,x28,[sp,#80] 88 sub sp,sp,#4*4 89 90 ldp w20,w21,[x0] // load context 91 ldp w22,w23,[x0,#2*4] 92 ldp w24,w25,[x0,#4*4] 93 add x2,x1,x2,lsl#6 // end of input 94 ldp w26,w27,[x0,#6*4] 95 adrp x30,.LK256 96 add x30,x30,#:lo12:.LK256 97 stp x0,x2,[x29,#96] 98 99 .Loop: 100 ldp w3,w4,[x1],#2*4 101 ldr w19,[x30],#4 // *K++ 102 eor w28,w21,w22 // magic seed 103 str x1,[x29,#112] 104 #ifndef __AARCH64EB__ 105 rev w3,w3 // 0 106 #endif 107 ror w16,w24,#6 108 add w27,w27,w19 // h+=K[i] 109 eor w6,w24,w24,ror#14 110 and w17,w25,w24 111 bic w19,w26,w24 112 add w27,w27,w3 // h+=X[i] 113 orr w17,w17,w19 // Ch(e,f,g) 114 eor w19,w20,w21 // a^b, b^c in next round 115 eor w16,w16,w6,ror#11 // Sigma1(e) 116 ror w6,w20,#2 117 add w27,w27,w17 // h+=Ch(e,f,g) 118 eor w17,w20,w20,ror#9 119 add w27,w27,w16 // h+=Sigma1(e) 120 and w28,w28,w19 // (b^c)&=(a^b) 121 add w23,w23,w27 // d+=h 122 eor w28,w28,w21 // Maj(a,b,c) 123 eor w17,w6,w17,ror#13 // Sigma0(a) 124 add w27,w27,w28 // h+=Maj(a,b,c) 125 ldr w28,[x30],#4 // *K++, w19 in next round 126 //add w27,w27,w17 // h+=Sigma0(a) 127 #ifndef __AARCH64EB__ 128 rev w4,w4 // 1 129 #endif 130 ldp w5,w6,[x1],#2*4 131 add w27,w27,w17 // h+=Sigma0(a) 132 ror w16,w23,#6 133 add w26,w26,w28 // h+=K[i] 134 eor w7,w23,w23,ror#14 135 and w17,w24,w23 136 bic w28,w25,w23 137 add w26,w26,w4 // h+=X[i] 138 orr w17,w17,w28 // Ch(e,f,g) 139 eor w28,w27,w20 // a^b, b^c in next round 140 eor w16,w16,w7,ror#11 // Sigma1(e) 141 ror w7,w27,#2 142 add w26,w26,w17 // h+=Ch(e,f,g) 143 eor w17,w27,w27,ror#9 144 add w26,w26,w16 // h+=Sigma1(e) 145 and w19,w19,w28 // (b^c)&=(a^b) 146 add w22,w22,w26 // d+=h 147 eor w19,w19,w20 // Maj(a,b,c) 148 eor w17,w7,w17,ror#13 // Sigma0(a) 149 add w26,w26,w19 // h+=Maj(a,b,c) 150 ldr w19,[x30],#4 // *K++, w28 in next round 151 //add w26,w26,w17 // h+=Sigma0(a) 152 #ifndef __AARCH64EB__ 153 rev w5,w5 // 2 154 #endif 155 add w26,w26,w17 // h+=Sigma0(a) 156 ror w16,w22,#6 157 add w25,w25,w19 // h+=K[i] 158 eor w8,w22,w22,ror#14 159 and w17,w23,w22 160 bic w19,w24,w22 161 add w25,w25,w5 // h+=X[i] 162 orr w17,w17,w19 // Ch(e,f,g) 163 eor w19,w26,w27 // a^b, b^c in next round 164 eor w16,w16,w8,ror#11 // Sigma1(e) 165 ror w8,w26,#2 166 add w25,w25,w17 // h+=Ch(e,f,g) 167 eor w17,w26,w26,ror#9 168 add w25,w25,w16 // h+=Sigma1(e) 169 and w28,w28,w19 // (b^c)&=(a^b) 170 add w21,w21,w25 // d+=h 171 eor w28,w28,w27 // Maj(a,b,c) 172 eor w17,w8,w17,ror#13 // Sigma0(a) 173 add w25,w25,w28 // h+=Maj(a,b,c) 174 ldr w28,[x30],#4 // *K++, w19 in next round 175 //add w25,w25,w17 // h+=Sigma0(a) 176 #ifndef __AARCH64EB__ 177 rev w6,w6 // 3 178 #endif 179 ldp w7,w8,[x1],#2*4 180 add w25,w25,w17 // h+=Sigma0(a) 181 ror w16,w21,#6 182 add w24,w24,w28 // h+=K[i] 183 eor w9,w21,w21,ror#14 184 and w17,w22,w21 185 bic w28,w23,w21 186 add w24,w24,w6 // h+=X[i] 187 orr w17,w17,w28 // Ch(e,f,g) 188 eor w28,w25,w26 // a^b, b^c in next round 189 eor w16,w16,w9,ror#11 // Sigma1(e) 190 ror w9,w25,#2 191 add w24,w24,w17 // h+=Ch(e,f,g) 192 eor w17,w25,w25,ror#9 193 add w24,w24,w16 // h+=Sigma1(e) 194 and w19,w19,w28 // (b^c)&=(a^b) 195 add w20,w20,w24 // d+=h 196 eor w19,w19,w26 // Maj(a,b,c) 197 eor w17,w9,w17,ror#13 // Sigma0(a) 198 add w24,w24,w19 // h+=Maj(a,b,c) 199 ldr w19,[x30],#4 // *K++, w28 in next round 200 //add w24,w24,w17 // h+=Sigma0(a) 201 #ifndef __AARCH64EB__ 202 rev w7,w7 // 4 203 #endif 204 add w24,w24,w17 // h+=Sigma0(a) 205 ror w16,w20,#6 206 add w23,w23,w19 // h+=K[i] 207 eor w10,w20,w20,ror#14 208 and w17,w21,w20 209 bic w19,w22,w20 210 add w23,w23,w7 // h+=X[i] 211 orr w17,w17,w19 // Ch(e,f,g) 212 eor w19,w24,w25 // a^b, b^c in next round 213 eor w16,w16,w10,ror#11 // Sigma1(e) 214 ror w10,w24,#2 215 add w23,w23,w17 // h+=Ch(e,f,g) 216 eor w17,w24,w24,ror#9 217 add w23,w23,w16 // h+=Sigma1(e) 218 and w28,w28,w19 // (b^c)&=(a^b) 219 add w27,w27,w23 // d+=h 220 eor w28,w28,w25 // Maj(a,b,c) 221 eor w17,w10,w17,ror#13 // Sigma0(a) 222 add w23,w23,w28 // h+=Maj(a,b,c) 223 ldr w28,[x30],#4 // *K++, w19 in next round 224 //add w23,w23,w17 // h+=Sigma0(a) 225 #ifndef __AARCH64EB__ 226 rev w8,w8 // 5 227 #endif 228 ldp w9,w10,[x1],#2*4 229 add w23,w23,w17 // h+=Sigma0(a) 230 ror w16,w27,#6 231 add w22,w22,w28 // h+=K[i] 232 eor w11,w27,w27,ror#14 233 and w17,w20,w27 234 bic w28,w21,w27 235 add w22,w22,w8 // h+=X[i] 236 orr w17,w17,w28 // Ch(e,f,g) 237 eor w28,w23,w24 // a^b, b^c in next round 238 eor w16,w16,w11,ror#11 // Sigma1(e) 239 ror w11,w23,#2 240 add w22,w22,w17 // h+=Ch(e,f,g) 241 eor w17,w23,w23,ror#9 242 add w22,w22,w16 // h+=Sigma1(e) 243 and w19,w19,w28 // (b^c)&=(a^b) 244 add w26,w26,w22 // d+=h 245 eor w19,w19,w24 // Maj(a,b,c) 246 eor w17,w11,w17,ror#13 // Sigma0(a) 247 add w22,w22,w19 // h+=Maj(a,b,c) 248 ldr w19,[x30],#4 // *K++, w28 in next round 249 //add w22,w22,w17 // h+=Sigma0(a) 250 #ifndef __AARCH64EB__ 251 rev w9,w9 // 6 252 #endif 253 add w22,w22,w17 // h+=Sigma0(a) 254 ror w16,w26,#6 255 add w21,w21,w19 // h+=K[i] 256 eor w12,w26,w26,ror#14 257 and w17,w27,w26 258 bic w19,w20,w26 259 add w21,w21,w9 // h+=X[i] 260 orr w17,w17,w19 // Ch(e,f,g) 261 eor w19,w22,w23 // a^b, b^c in next round 262 eor w16,w16,w12,ror#11 // Sigma1(e) 263 ror w12,w22,#2 264 add w21,w21,w17 // h+=Ch(e,f,g) 265 eor w17,w22,w22,ror#9 266 add w21,w21,w16 // h+=Sigma1(e) 267 and w28,w28,w19 // (b^c)&=(a^b) 268 add w25,w25,w21 // d+=h 269 eor w28,w28,w23 // Maj(a,b,c) 270 eor w17,w12,w17,ror#13 // Sigma0(a) 271 add w21,w21,w28 // h+=Maj(a,b,c) 272 ldr w28,[x30],#4 // *K++, w19 in next round 273 //add w21,w21,w17 // h+=Sigma0(a) 274 #ifndef __AARCH64EB__ 275 rev w10,w10 // 7 276 #endif 277 ldp w11,w12,[x1],#2*4 278 add w21,w21,w17 // h+=Sigma0(a) 279 ror w16,w25,#6 280 add w20,w20,w28 // h+=K[i] 281 eor w13,w25,w25,ror#14 282 and w17,w26,w25 283 bic w28,w27,w25 284 add w20,w20,w10 // h+=X[i] 285 orr w17,w17,w28 // Ch(e,f,g) 286 eor w28,w21,w22 // a^b, b^c in next round 287 eor w16,w16,w13,ror#11 // Sigma1(e) 288 ror w13,w21,#2 289 add w20,w20,w17 // h+=Ch(e,f,g) 290 eor w17,w21,w21,ror#9 291 add w20,w20,w16 // h+=Sigma1(e) 292 and w19,w19,w28 // (b^c)&=(a^b) 293 add w24,w24,w20 // d+=h 294 eor w19,w19,w22 // Maj(a,b,c) 295 eor w17,w13,w17,ror#13 // Sigma0(a) 296 add w20,w20,w19 // h+=Maj(a,b,c) 297 ldr w19,[x30],#4 // *K++, w28 in next round 298 //add w20,w20,w17 // h+=Sigma0(a) 299 #ifndef __AARCH64EB__ 300 rev w11,w11 // 8 301 #endif 302 add w20,w20,w17 // h+=Sigma0(a) 303 ror w16,w24,#6 304 add w27,w27,w19 // h+=K[i] 305 eor w14,w24,w24,ror#14 306 and w17,w25,w24 307 bic w19,w26,w24 308 add w27,w27,w11 // h+=X[i] 309 orr w17,w17,w19 // Ch(e,f,g) 310 eor w19,w20,w21 // a^b, b^c in next round 311 eor w16,w16,w14,ror#11 // Sigma1(e) 312 ror w14,w20,#2 313 add w27,w27,w17 // h+=Ch(e,f,g) 314 eor w17,w20,w20,ror#9 315 add w27,w27,w16 // h+=Sigma1(e) 316 and w28,w28,w19 // (b^c)&=(a^b) 317 add w23,w23,w27 // d+=h 318 eor w28,w28,w21 // Maj(a,b,c) 319 eor w17,w14,w17,ror#13 // Sigma0(a) 320 add w27,w27,w28 // h+=Maj(a,b,c) 321 ldr w28,[x30],#4 // *K++, w19 in next round 322 //add w27,w27,w17 // h+=Sigma0(a) 323 #ifndef __AARCH64EB__ 324 rev w12,w12 // 9 325 #endif 326 ldp w13,w14,[x1],#2*4 327 add w27,w27,w17 // h+=Sigma0(a) 328 ror w16,w23,#6 329 add w26,w26,w28 // h+=K[i] 330 eor w15,w23,w23,ror#14 331 and w17,w24,w23 332 bic w28,w25,w23 333 add w26,w26,w12 // h+=X[i] 334 orr w17,w17,w28 // Ch(e,f,g) 335 eor w28,w27,w20 // a^b, b^c in next round 336 eor w16,w16,w15,ror#11 // Sigma1(e) 337 ror w15,w27,#2 338 add w26,w26,w17 // h+=Ch(e,f,g) 339 eor w17,w27,w27,ror#9 340 add w26,w26,w16 // h+=Sigma1(e) 341 and w19,w19,w28 // (b^c)&=(a^b) 342 add w22,w22,w26 // d+=h 343 eor w19,w19,w20 // Maj(a,b,c) 344 eor w17,w15,w17,ror#13 // Sigma0(a) 345 add w26,w26,w19 // h+=Maj(a,b,c) 346 ldr w19,[x30],#4 // *K++, w28 in next round 347 //add w26,w26,w17 // h+=Sigma0(a) 348 #ifndef __AARCH64EB__ 349 rev w13,w13 // 10 350 #endif 351 add w26,w26,w17 // h+=Sigma0(a) 352 ror w16,w22,#6 353 add w25,w25,w19 // h+=K[i] 354 eor w0,w22,w22,ror#14 355 and w17,w23,w22 356 bic w19,w24,w22 357 add w25,w25,w13 // h+=X[i] 358 orr w17,w17,w19 // Ch(e,f,g) 359 eor w19,w26,w27 // a^b, b^c in next round 360 eor w16,w16,w0,ror#11 // Sigma1(e) 361 ror w0,w26,#2 362 add w25,w25,w17 // h+=Ch(e,f,g) 363 eor w17,w26,w26,ror#9 364 add w25,w25,w16 // h+=Sigma1(e) 365 and w28,w28,w19 // (b^c)&=(a^b) 366 add w21,w21,w25 // d+=h 367 eor w28,w28,w27 // Maj(a,b,c) 368 eor w17,w0,w17,ror#13 // Sigma0(a) 369 add w25,w25,w28 // h+=Maj(a,b,c) 370 ldr w28,[x30],#4 // *K++, w19 in next round 371 //add w25,w25,w17 // h+=Sigma0(a) 372 #ifndef __AARCH64EB__ 373 rev w14,w14 // 11 374 #endif 375 ldp w15,w0,[x1],#2*4 376 add w25,w25,w17 // h+=Sigma0(a) 377 str w6,[sp,#12] 378 ror w16,w21,#6 379 add w24,w24,w28 // h+=K[i] 380 eor w6,w21,w21,ror#14 381 and w17,w22,w21 382 bic w28,w23,w21 383 add w24,w24,w14 // h+=X[i] 384 orr w17,w17,w28 // Ch(e,f,g) 385 eor w28,w25,w26 // a^b, b^c in next round 386 eor w16,w16,w6,ror#11 // Sigma1(e) 387 ror w6,w25,#2 388 add w24,w24,w17 // h+=Ch(e,f,g) 389 eor w17,w25,w25,ror#9 390 add w24,w24,w16 // h+=Sigma1(e) 391 and w19,w19,w28 // (b^c)&=(a^b) 392 add w20,w20,w24 // d+=h 393 eor w19,w19,w26 // Maj(a,b,c) 394 eor w17,w6,w17,ror#13 // Sigma0(a) 395 add w24,w24,w19 // h+=Maj(a,b,c) 396 ldr w19,[x30],#4 // *K++, w28 in next round 397 //add w24,w24,w17 // h+=Sigma0(a) 398 #ifndef __AARCH64EB__ 399 rev w15,w15 // 12 400 #endif 401 add w24,w24,w17 // h+=Sigma0(a) 402 str w7,[sp,#0] 403 ror w16,w20,#6 404 add w23,w23,w19 // h+=K[i] 405 eor w7,w20,w20,ror#14 406 and w17,w21,w20 407 bic w19,w22,w20 408 add w23,w23,w15 // h+=X[i] 409 orr w17,w17,w19 // Ch(e,f,g) 410 eor w19,w24,w25 // a^b, b^c in next round 411 eor w16,w16,w7,ror#11 // Sigma1(e) 412 ror w7,w24,#2 413 add w23,w23,w17 // h+=Ch(e,f,g) 414 eor w17,w24,w24,ror#9 415 add w23,w23,w16 // h+=Sigma1(e) 416 and w28,w28,w19 // (b^c)&=(a^b) 417 add w27,w27,w23 // d+=h 418 eor w28,w28,w25 // Maj(a,b,c) 419 eor w17,w7,w17,ror#13 // Sigma0(a) 420 add w23,w23,w28 // h+=Maj(a,b,c) 421 ldr w28,[x30],#4 // *K++, w19 in next round 422 //add w23,w23,w17 // h+=Sigma0(a) 423 #ifndef __AARCH64EB__ 424 rev w0,w0 // 13 425 #endif 426 ldp w1,w2,[x1] 427 add w23,w23,w17 // h+=Sigma0(a) 428 str w8,[sp,#4] 429 ror w16,w27,#6 430 add w22,w22,w28 // h+=K[i] 431 eor w8,w27,w27,ror#14 432 and w17,w20,w27 433 bic w28,w21,w27 434 add w22,w22,w0 // h+=X[i] 435 orr w17,w17,w28 // Ch(e,f,g) 436 eor w28,w23,w24 // a^b, b^c in next round 437 eor w16,w16,w8,ror#11 // Sigma1(e) 438 ror w8,w23,#2 439 add w22,w22,w17 // h+=Ch(e,f,g) 440 eor w17,w23,w23,ror#9 441 add w22,w22,w16 // h+=Sigma1(e) 442 and w19,w19,w28 // (b^c)&=(a^b) 443 add w26,w26,w22 // d+=h 444 eor w19,w19,w24 // Maj(a,b,c) 445 eor w17,w8,w17,ror#13 // Sigma0(a) 446 add w22,w22,w19 // h+=Maj(a,b,c) 447 ldr w19,[x30],#4 // *K++, w28 in next round 448 //add w22,w22,w17 // h+=Sigma0(a) 449 #ifndef __AARCH64EB__ 450 rev w1,w1 // 14 451 #endif 452 ldr w6,[sp,#12] 453 add w22,w22,w17 // h+=Sigma0(a) 454 str w9,[sp,#8] 455 ror w16,w26,#6 456 add w21,w21,w19 // h+=K[i] 457 eor w9,w26,w26,ror#14 458 and w17,w27,w26 459 bic w19,w20,w26 460 add w21,w21,w1 // h+=X[i] 461 orr w17,w17,w19 // Ch(e,f,g) 462 eor w19,w22,w23 // a^b, b^c in next round 463 eor w16,w16,w9,ror#11 // Sigma1(e) 464 ror w9,w22,#2 465 add w21,w21,w17 // h+=Ch(e,f,g) 466 eor w17,w22,w22,ror#9 467 add w21,w21,w16 // h+=Sigma1(e) 468 and w28,w28,w19 // (b^c)&=(a^b) 469 add w25,w25,w21 // d+=h 470 eor w28,w28,w23 // Maj(a,b,c) 471 eor w17,w9,w17,ror#13 // Sigma0(a) 472 add w21,w21,w28 // h+=Maj(a,b,c) 473 ldr w28,[x30],#4 // *K++, w19 in next round 474 //add w21,w21,w17 // h+=Sigma0(a) 475 #ifndef __AARCH64EB__ 476 rev w2,w2 // 15 477 #endif 478 ldr w7,[sp,#0] 479 add w21,w21,w17 // h+=Sigma0(a) 480 str w10,[sp,#12] 481 ror w16,w25,#6 482 add w20,w20,w28 // h+=K[i] 483 ror w9,w4,#7 484 and w17,w26,w25 485 ror w8,w1,#17 486 bic w28,w27,w25 487 ror w10,w21,#2 488 add w20,w20,w2 // h+=X[i] 489 eor w16,w16,w25,ror#11 490 eor w9,w9,w4,ror#18 491 orr w17,w17,w28 // Ch(e,f,g) 492 eor w28,w21,w22 // a^b, b^c in next round 493 eor w16,w16,w25,ror#25 // Sigma1(e) 494 eor w10,w10,w21,ror#13 495 add w20,w20,w17 // h+=Ch(e,f,g) 496 and w19,w19,w28 // (b^c)&=(a^b) 497 eor w8,w8,w1,ror#19 498 eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) 499 add w20,w20,w16 // h+=Sigma1(e) 500 eor w19,w19,w22 // Maj(a,b,c) 501 eor w17,w10,w21,ror#22 // Sigma0(a) 502 eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) 503 add w3,w3,w12 504 add w24,w24,w20 // d+=h 505 add w20,w20,w19 // h+=Maj(a,b,c) 506 ldr w19,[x30],#4 // *K++, w28 in next round 507 add w3,w3,w9 508 add w20,w20,w17 // h+=Sigma0(a) 509 add w3,w3,w8 510 .Loop_16_xx: 511 ldr w8,[sp,#4] 512 str w11,[sp,#0] 513 ror w16,w24,#6 514 add w27,w27,w19 // h+=K[i] 515 ror w10,w5,#7 516 and w17,w25,w24 517 ror w9,w2,#17 518 bic w19,w26,w24 519 ror w11,w20,#2 520 add w27,w27,w3 // h+=X[i] 521 eor w16,w16,w24,ror#11 522 eor w10,w10,w5,ror#18 523 orr w17,w17,w19 // Ch(e,f,g) 524 eor w19,w20,w21 // a^b, b^c in next round 525 eor w16,w16,w24,ror#25 // Sigma1(e) 526 eor w11,w11,w20,ror#13 527 add w27,w27,w17 // h+=Ch(e,f,g) 528 and w28,w28,w19 // (b^c)&=(a^b) 529 eor w9,w9,w2,ror#19 530 eor w10,w10,w5,lsr#3 // sigma0(X[i+1]) 531 add w27,w27,w16 // h+=Sigma1(e) 532 eor w28,w28,w21 // Maj(a,b,c) 533 eor w17,w11,w20,ror#22 // Sigma0(a) 534 eor w9,w9,w2,lsr#10 // sigma1(X[i+14]) 535 add w4,w4,w13 536 add w23,w23,w27 // d+=h 537 add w27,w27,w28 // h+=Maj(a,b,c) 538 ldr w28,[x30],#4 // *K++, w19 in next round 539 add w4,w4,w10 540 add w27,w27,w17 // h+=Sigma0(a) 541 add w4,w4,w9 542 ldr w9,[sp,#8] 543 str w12,[sp,#4] 544 ror w16,w23,#6 545 add w26,w26,w28 // h+=K[i] 546 ror w11,w6,#7 547 and w17,w24,w23 548 ror w10,w3,#17 549 bic w28,w25,w23 550 ror w12,w27,#2 551 add w26,w26,w4 // h+=X[i] 552 eor w16,w16,w23,ror#11 553 eor w11,w11,w6,ror#18 554 orr w17,w17,w28 // Ch(e,f,g) 555 eor w28,w27,w20 // a^b, b^c in next round 556 eor w16,w16,w23,ror#25 // Sigma1(e) 557 eor w12,w12,w27,ror#13 558 add w26,w26,w17 // h+=Ch(e,f,g) 559 and w19,w19,w28 // (b^c)&=(a^b) 560 eor w10,w10,w3,ror#19 561 eor w11,w11,w6,lsr#3 // sigma0(X[i+1]) 562 add w26,w26,w16 // h+=Sigma1(e) 563 eor w19,w19,w20 // Maj(a,b,c) 564 eor w17,w12,w27,ror#22 // Sigma0(a) 565 eor w10,w10,w3,lsr#10 // sigma1(X[i+14]) 566 add w5,w5,w14 567 add w22,w22,w26 // d+=h 568 add w26,w26,w19 // h+=Maj(a,b,c) 569 ldr w19,[x30],#4 // *K++, w28 in next round 570 add w5,w5,w11 571 add w26,w26,w17 // h+=Sigma0(a) 572 add w5,w5,w10 573 ldr w10,[sp,#12] 574 str w13,[sp,#8] 575 ror w16,w22,#6 576 add w25,w25,w19 // h+=K[i] 577 ror w12,w7,#7 578 and w17,w23,w22 579 ror w11,w4,#17 580 bic w19,w24,w22 581 ror w13,w26,#2 582 add w25,w25,w5 // h+=X[i] 583 eor w16,w16,w22,ror#11 584 eor w12,w12,w7,ror#18 585 orr w17,w17,w19 // Ch(e,f,g) 586 eor w19,w26,w27 // a^b, b^c in next round 587 eor w16,w16,w22,ror#25 // Sigma1(e) 588 eor w13,w13,w26,ror#13 589 add w25,w25,w17 // h+=Ch(e,f,g) 590 and w28,w28,w19 // (b^c)&=(a^b) 591 eor w11,w11,w4,ror#19 592 eor w12,w12,w7,lsr#3 // sigma0(X[i+1]) 593 add w25,w25,w16 // h+=Sigma1(e) 594 eor w28,w28,w27 // Maj(a,b,c) 595 eor w17,w13,w26,ror#22 // Sigma0(a) 596 eor w11,w11,w4,lsr#10 // sigma1(X[i+14]) 597 add w6,w6,w15 598 add w21,w21,w25 // d+=h 599 add w25,w25,w28 // h+=Maj(a,b,c) 600 ldr w28,[x30],#4 // *K++, w19 in next round 601 add w6,w6,w12 602 add w25,w25,w17 // h+=Sigma0(a) 603 add w6,w6,w11 604 ldr w11,[sp,#0] 605 str w14,[sp,#12] 606 ror w16,w21,#6 607 add w24,w24,w28 // h+=K[i] 608 ror w13,w8,#7 609 and w17,w22,w21 610 ror w12,w5,#17 611 bic w28,w23,w21 612 ror w14,w25,#2 613 add w24,w24,w6 // h+=X[i] 614 eor w16,w16,w21,ror#11 615 eor w13,w13,w8,ror#18 616 orr w17,w17,w28 // Ch(e,f,g) 617 eor w28,w25,w26 // a^b, b^c in next round 618 eor w16,w16,w21,ror#25 // Sigma1(e) 619 eor w14,w14,w25,ror#13 620 add w24,w24,w17 // h+=Ch(e,f,g) 621 and w19,w19,w28 // (b^c)&=(a^b) 622 eor w12,w12,w5,ror#19 623 eor w13,w13,w8,lsr#3 // sigma0(X[i+1]) 624 add w24,w24,w16 // h+=Sigma1(e) 625 eor w19,w19,w26 // Maj(a,b,c) 626 eor w17,w14,w25,ror#22 // Sigma0(a) 627 eor w12,w12,w5,lsr#10 // sigma1(X[i+14]) 628 add w7,w7,w0 629 add w20,w20,w24 // d+=h 630 add w24,w24,w19 // h+=Maj(a,b,c) 631 ldr w19,[x30],#4 // *K++, w28 in next round 632 add w7,w7,w13 633 add w24,w24,w17 // h+=Sigma0(a) 634 add w7,w7,w12 635 ldr w12,[sp,#4] 636 str w15,[sp,#0] 637 ror w16,w20,#6 638 add w23,w23,w19 // h+=K[i] 639 ror w14,w9,#7 640 and w17,w21,w20 641 ror w13,w6,#17 642 bic w19,w22,w20 643 ror w15,w24,#2 644 add w23,w23,w7 // h+=X[i] 645 eor w16,w16,w20,ror#11 646 eor w14,w14,w9,ror#18 647 orr w17,w17,w19 // Ch(e,f,g) 648 eor w19,w24,w25 // a^b, b^c in next round 649 eor w16,w16,w20,ror#25 // Sigma1(e) 650 eor w15,w15,w24,ror#13 651 add w23,w23,w17 // h+=Ch(e,f,g) 652 and w28,w28,w19 // (b^c)&=(a^b) 653 eor w13,w13,w6,ror#19 654 eor w14,w14,w9,lsr#3 // sigma0(X[i+1]) 655 add w23,w23,w16 // h+=Sigma1(e) 656 eor w28,w28,w25 // Maj(a,b,c) 657 eor w17,w15,w24,ror#22 // Sigma0(a) 658 eor w13,w13,w6,lsr#10 // sigma1(X[i+14]) 659 add w8,w8,w1 660 add w27,w27,w23 // d+=h 661 add w23,w23,w28 // h+=Maj(a,b,c) 662 ldr w28,[x30],#4 // *K++, w19 in next round 663 add w8,w8,w14 664 add w23,w23,w17 // h+=Sigma0(a) 665 add w8,w8,w13 666 ldr w13,[sp,#8] 667 str w0,[sp,#4] 668 ror w16,w27,#6 669 add w22,w22,w28 // h+=K[i] 670 ror w15,w10,#7 671 and w17,w20,w27 672 ror w14,w7,#17 673 bic w28,w21,w27 674 ror w0,w23,#2 675 add w22,w22,w8 // h+=X[i] 676 eor w16,w16,w27,ror#11 677 eor w15,w15,w10,ror#18 678 orr w17,w17,w28 // Ch(e,f,g) 679 eor w28,w23,w24 // a^b, b^c in next round 680 eor w16,w16,w27,ror#25 // Sigma1(e) 681 eor w0,w0,w23,ror#13 682 add w22,w22,w17 // h+=Ch(e,f,g) 683 and w19,w19,w28 // (b^c)&=(a^b) 684 eor w14,w14,w7,ror#19 685 eor w15,w15,w10,lsr#3 // sigma0(X[i+1]) 686 add w22,w22,w16 // h+=Sigma1(e) 687 eor w19,w19,w24 // Maj(a,b,c) 688 eor w17,w0,w23,ror#22 // Sigma0(a) 689 eor w14,w14,w7,lsr#10 // sigma1(X[i+14]) 690 add w9,w9,w2 691 add w26,w26,w22 // d+=h 692 add w22,w22,w19 // h+=Maj(a,b,c) 693 ldr w19,[x30],#4 // *K++, w28 in next round 694 add w9,w9,w15 695 add w22,w22,w17 // h+=Sigma0(a) 696 add w9,w9,w14 697 ldr w14,[sp,#12] 698 str w1,[sp,#8] 699 ror w16,w26,#6 700 add w21,w21,w19 // h+=K[i] 701 ror w0,w11,#7 702 and w17,w27,w26 703 ror w15,w8,#17 704 bic w19,w20,w26 705 ror w1,w22,#2 706 add w21,w21,w9 // h+=X[i] 707 eor w16,w16,w26,ror#11 708 eor w0,w0,w11,ror#18 709 orr w17,w17,w19 // Ch(e,f,g) 710 eor w19,w22,w23 // a^b, b^c in next round 711 eor w16,w16,w26,ror#25 // Sigma1(e) 712 eor w1,w1,w22,ror#13 713 add w21,w21,w17 // h+=Ch(e,f,g) 714 and w28,w28,w19 // (b^c)&=(a^b) 715 eor w15,w15,w8,ror#19 716 eor w0,w0,w11,lsr#3 // sigma0(X[i+1]) 717 add w21,w21,w16 // h+=Sigma1(e) 718 eor w28,w28,w23 // Maj(a,b,c) 719 eor w17,w1,w22,ror#22 // Sigma0(a) 720 eor w15,w15,w8,lsr#10 // sigma1(X[i+14]) 721 add w10,w10,w3 722 add w25,w25,w21 // d+=h 723 add w21,w21,w28 // h+=Maj(a,b,c) 724 ldr w28,[x30],#4 // *K++, w19 in next round 725 add w10,w10,w0 726 add w21,w21,w17 // h+=Sigma0(a) 727 add w10,w10,w15 728 ldr w15,[sp,#0] 729 str w2,[sp,#12] 730 ror w16,w25,#6 731 add w20,w20,w28 // h+=K[i] 732 ror w1,w12,#7 733 and w17,w26,w25 734 ror w0,w9,#17 735 bic w28,w27,w25 736 ror w2,w21,#2 737 add w20,w20,w10 // h+=X[i] 738 eor w16,w16,w25,ror#11 739 eor w1,w1,w12,ror#18 740 orr w17,w17,w28 // Ch(e,f,g) 741 eor w28,w21,w22 // a^b, b^c in next round 742 eor w16,w16,w25,ror#25 // Sigma1(e) 743 eor w2,w2,w21,ror#13 744 add w20,w20,w17 // h+=Ch(e,f,g) 745 and w19,w19,w28 // (b^c)&=(a^b) 746 eor w0,w0,w9,ror#19 747 eor w1,w1,w12,lsr#3 // sigma0(X[i+1]) 748 add w20,w20,w16 // h+=Sigma1(e) 749 eor w19,w19,w22 // Maj(a,b,c) 750 eor w17,w2,w21,ror#22 // Sigma0(a) 751 eor w0,w0,w9,lsr#10 // sigma1(X[i+14]) 752 add w11,w11,w4 753 add w24,w24,w20 // d+=h 754 add w20,w20,w19 // h+=Maj(a,b,c) 755 ldr w19,[x30],#4 // *K++, w28 in next round 756 add w11,w11,w1 757 add w20,w20,w17 // h+=Sigma0(a) 758 add w11,w11,w0 759 ldr w0,[sp,#4] 760 str w3,[sp,#0] 761 ror w16,w24,#6 762 add w27,w27,w19 // h+=K[i] 763 ror w2,w13,#7 764 and w17,w25,w24 765 ror w1,w10,#17 766 bic w19,w26,w24 767 ror w3,w20,#2 768 add w27,w27,w11 // h+=X[i] 769 eor w16,w16,w24,ror#11 770 eor w2,w2,w13,ror#18 771 orr w17,w17,w19 // Ch(e,f,g) 772 eor w19,w20,w21 // a^b, b^c in next round 773 eor w16,w16,w24,ror#25 // Sigma1(e) 774 eor w3,w3,w20,ror#13 775 add w27,w27,w17 // h+=Ch(e,f,g) 776 and w28,w28,w19 // (b^c)&=(a^b) 777 eor w1,w1,w10,ror#19 778 eor w2,w2,w13,lsr#3 // sigma0(X[i+1]) 779 add w27,w27,w16 // h+=Sigma1(e) 780 eor w28,w28,w21 // Maj(a,b,c) 781 eor w17,w3,w20,ror#22 // Sigma0(a) 782 eor w1,w1,w10,lsr#10 // sigma1(X[i+14]) 783 add w12,w12,w5 784 add w23,w23,w27 // d+=h 785 add w27,w27,w28 // h+=Maj(a,b,c) 786 ldr w28,[x30],#4 // *K++, w19 in next round 787 add w12,w12,w2 788 add w27,w27,w17 // h+=Sigma0(a) 789 add w12,w12,w1 790 ldr w1,[sp,#8] 791 str w4,[sp,#4] 792 ror w16,w23,#6 793 add w26,w26,w28 // h+=K[i] 794 ror w3,w14,#7 795 and w17,w24,w23 796 ror w2,w11,#17 797 bic w28,w25,w23 798 ror w4,w27,#2 799 add w26,w26,w12 // h+=X[i] 800 eor w16,w16,w23,ror#11 801 eor w3,w3,w14,ror#18 802 orr w17,w17,w28 // Ch(e,f,g) 803 eor w28,w27,w20 // a^b, b^c in next round 804 eor w16,w16,w23,ror#25 // Sigma1(e) 805 eor w4,w4,w27,ror#13 806 add w26,w26,w17 // h+=Ch(e,f,g) 807 and w19,w19,w28 // (b^c)&=(a^b) 808 eor w2,w2,w11,ror#19 809 eor w3,w3,w14,lsr#3 // sigma0(X[i+1]) 810 add w26,w26,w16 // h+=Sigma1(e) 811 eor w19,w19,w20 // Maj(a,b,c) 812 eor w17,w4,w27,ror#22 // Sigma0(a) 813 eor w2,w2,w11,lsr#10 // sigma1(X[i+14]) 814 add w13,w13,w6 815 add w22,w22,w26 // d+=h 816 add w26,w26,w19 // h+=Maj(a,b,c) 817 ldr w19,[x30],#4 // *K++, w28 in next round 818 add w13,w13,w3 819 add w26,w26,w17 // h+=Sigma0(a) 820 add w13,w13,w2 821 ldr w2,[sp,#12] 822 str w5,[sp,#8] 823 ror w16,w22,#6 824 add w25,w25,w19 // h+=K[i] 825 ror w4,w15,#7 826 and w17,w23,w22 827 ror w3,w12,#17 828 bic w19,w24,w22 829 ror w5,w26,#2 830 add w25,w25,w13 // h+=X[i] 831 eor w16,w16,w22,ror#11 832 eor w4,w4,w15,ror#18 833 orr w17,w17,w19 // Ch(e,f,g) 834 eor w19,w26,w27 // a^b, b^c in next round 835 eor w16,w16,w22,ror#25 // Sigma1(e) 836 eor w5,w5,w26,ror#13 837 add w25,w25,w17 // h+=Ch(e,f,g) 838 and w28,w28,w19 // (b^c)&=(a^b) 839 eor w3,w3,w12,ror#19 840 eor w4,w4,w15,lsr#3 // sigma0(X[i+1]) 841 add w25,w25,w16 // h+=Sigma1(e) 842 eor w28,w28,w27 // Maj(a,b,c) 843 eor w17,w5,w26,ror#22 // Sigma0(a) 844 eor w3,w3,w12,lsr#10 // sigma1(X[i+14]) 845 add w14,w14,w7 846 add w21,w21,w25 // d+=h 847 add w25,w25,w28 // h+=Maj(a,b,c) 848 ldr w28,[x30],#4 // *K++, w19 in next round 849 add w14,w14,w4 850 add w25,w25,w17 // h+=Sigma0(a) 851 add w14,w14,w3 852 ldr w3,[sp,#0] 853 str w6,[sp,#12] 854 ror w16,w21,#6 855 add w24,w24,w28 // h+=K[i] 856 ror w5,w0,#7 857 and w17,w22,w21 858 ror w4,w13,#17 859 bic w28,w23,w21 860 ror w6,w25,#2 861 add w24,w24,w14 // h+=X[i] 862 eor w16,w16,w21,ror#11 863 eor w5,w5,w0,ror#18 864 orr w17,w17,w28 // Ch(e,f,g) 865 eor w28,w25,w26 // a^b, b^c in next round 866 eor w16,w16,w21,ror#25 // Sigma1(e) 867 eor w6,w6,w25,ror#13 868 add w24,w24,w17 // h+=Ch(e,f,g) 869 and w19,w19,w28 // (b^c)&=(a^b) 870 eor w4,w4,w13,ror#19 871 eor w5,w5,w0,lsr#3 // sigma0(X[i+1]) 872 add w24,w24,w16 // h+=Sigma1(e) 873 eor w19,w19,w26 // Maj(a,b,c) 874 eor w17,w6,w25,ror#22 // Sigma0(a) 875 eor w4,w4,w13,lsr#10 // sigma1(X[i+14]) 876 add w15,w15,w8 877 add w20,w20,w24 // d+=h 878 add w24,w24,w19 // h+=Maj(a,b,c) 879 ldr w19,[x30],#4 // *K++, w28 in next round 880 add w15,w15,w5 881 add w24,w24,w17 // h+=Sigma0(a) 882 add w15,w15,w4 883 ldr w4,[sp,#4] 884 str w7,[sp,#0] 885 ror w16,w20,#6 886 add w23,w23,w19 // h+=K[i] 887 ror w6,w1,#7 888 and w17,w21,w20 889 ror w5,w14,#17 890 bic w19,w22,w20 891 ror w7,w24,#2 892 add w23,w23,w15 // h+=X[i] 893 eor w16,w16,w20,ror#11 894 eor w6,w6,w1,ror#18 895 orr w17,w17,w19 // Ch(e,f,g) 896 eor w19,w24,w25 // a^b, b^c in next round 897 eor w16,w16,w20,ror#25 // Sigma1(e) 898 eor w7,w7,w24,ror#13 899 add w23,w23,w17 // h+=Ch(e,f,g) 900 and w28,w28,w19 // (b^c)&=(a^b) 901 eor w5,w5,w14,ror#19 902 eor w6,w6,w1,lsr#3 // sigma0(X[i+1]) 903 add w23,w23,w16 // h+=Sigma1(e) 904 eor w28,w28,w25 // Maj(a,b,c) 905 eor w17,w7,w24,ror#22 // Sigma0(a) 906 eor w5,w5,w14,lsr#10 // sigma1(X[i+14]) 907 add w0,w0,w9 908 add w27,w27,w23 // d+=h 909 add w23,w23,w28 // h+=Maj(a,b,c) 910 ldr w28,[x30],#4 // *K++, w19 in next round 911 add w0,w0,w6 912 add w23,w23,w17 // h+=Sigma0(a) 913 add w0,w0,w5 914 ldr w5,[sp,#8] 915 str w8,[sp,#4] 916 ror w16,w27,#6 917 add w22,w22,w28 // h+=K[i] 918 ror w7,w2,#7 919 and w17,w20,w27 920 ror w6,w15,#17 921 bic w28,w21,w27 922 ror w8,w23,#2 923 add w22,w22,w0 // h+=X[i] 924 eor w16,w16,w27,ror#11 925 eor w7,w7,w2,ror#18 926 orr w17,w17,w28 // Ch(e,f,g) 927 eor w28,w23,w24 // a^b, b^c in next round 928 eor w16,w16,w27,ror#25 // Sigma1(e) 929 eor w8,w8,w23,ror#13 930 add w22,w22,w17 // h+=Ch(e,f,g) 931 and w19,w19,w28 // (b^c)&=(a^b) 932 eor w6,w6,w15,ror#19 933 eor w7,w7,w2,lsr#3 // sigma0(X[i+1]) 934 add w22,w22,w16 // h+=Sigma1(e) 935 eor w19,w19,w24 // Maj(a,b,c) 936 eor w17,w8,w23,ror#22 // Sigma0(a) 937 eor w6,w6,w15,lsr#10 // sigma1(X[i+14]) 938 add w1,w1,w10 939 add w26,w26,w22 // d+=h 940 add w22,w22,w19 // h+=Maj(a,b,c) 941 ldr w19,[x30],#4 // *K++, w28 in next round 942 add w1,w1,w7 943 add w22,w22,w17 // h+=Sigma0(a) 944 add w1,w1,w6 945 ldr w6,[sp,#12] 946 str w9,[sp,#8] 947 ror w16,w26,#6 948 add w21,w21,w19 // h+=K[i] 949 ror w8,w3,#7 950 and w17,w27,w26 951 ror w7,w0,#17 952 bic w19,w20,w26 953 ror w9,w22,#2 954 add w21,w21,w1 // h+=X[i] 955 eor w16,w16,w26,ror#11 956 eor w8,w8,w3,ror#18 957 orr w17,w17,w19 // Ch(e,f,g) 958 eor w19,w22,w23 // a^b, b^c in next round 959 eor w16,w16,w26,ror#25 // Sigma1(e) 960 eor w9,w9,w22,ror#13 961 add w21,w21,w17 // h+=Ch(e,f,g) 962 and w28,w28,w19 // (b^c)&=(a^b) 963 eor w7,w7,w0,ror#19 964 eor w8,w8,w3,lsr#3 // sigma0(X[i+1]) 965 add w21,w21,w16 // h+=Sigma1(e) 966 eor w28,w28,w23 // Maj(a,b,c) 967 eor w17,w9,w22,ror#22 // Sigma0(a) 968 eor w7,w7,w0,lsr#10 // sigma1(X[i+14]) 969 add w2,w2,w11 970 add w25,w25,w21 // d+=h 971 add w21,w21,w28 // h+=Maj(a,b,c) 972 ldr w28,[x30],#4 // *K++, w19 in next round 973 add w2,w2,w8 974 add w21,w21,w17 // h+=Sigma0(a) 975 add w2,w2,w7 976 ldr w7,[sp,#0] 977 str w10,[sp,#12] 978 ror w16,w25,#6 979 add w20,w20,w28 // h+=K[i] 980 ror w9,w4,#7 981 and w17,w26,w25 982 ror w8,w1,#17 983 bic w28,w27,w25 984 ror w10,w21,#2 985 add w20,w20,w2 // h+=X[i] 986 eor w16,w16,w25,ror#11 987 eor w9,w9,w4,ror#18 988 orr w17,w17,w28 // Ch(e,f,g) 989 eor w28,w21,w22 // a^b, b^c in next round 990 eor w16,w16,w25,ror#25 // Sigma1(e) 991 eor w10,w10,w21,ror#13 992 add w20,w20,w17 // h+=Ch(e,f,g) 993 and w19,w19,w28 // (b^c)&=(a^b) 994 eor w8,w8,w1,ror#19 995 eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) 996 add w20,w20,w16 // h+=Sigma1(e) 997 eor w19,w19,w22 // Maj(a,b,c) 998 eor w17,w10,w21,ror#22 // Sigma0(a) 999 eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) 1000 add w3,w3,w12 1001 add w24,w24,w20 // d+=h 1002 add w20,w20,w19 // h+=Maj(a,b,c) 1003 ldr w19,[x30],#4 // *K++, w28 in next round 1004 add w3,w3,w9 1005 add w20,w20,w17 // h+=Sigma0(a) 1006 add w3,w3,w8 1007 cbnz w19,.Loop_16_xx 1008 1009 ldp x0,x2,[x29,#96] 1010 ldr x1,[x29,#112] 1011 sub x30,x30,#260 // rewind 1012 1013 ldp w3,w4,[x0] 1014 ldp w5,w6,[x0,#2*4] 1015 add x1,x1,#14*4 // advance input pointer 1016 ldp w7,w8,[x0,#4*4] 1017 add w20,w20,w3 1018 ldp w9,w10,[x0,#6*4] 1019 add w21,w21,w4 1020 add w22,w22,w5 1021 add w23,w23,w6 1022 stp w20,w21,[x0] 1023 add w24,w24,w7 1024 add w25,w25,w8 1025 stp w22,w23,[x0,#2*4] 1026 add w26,w26,w9 1027 add w27,w27,w10 1028 cmp x1,x2 1029 stp w24,w25,[x0,#4*4] 1030 stp w26,w27,[x0,#6*4] 1031 b.ne .Loop 1032 1033 ldp x19,x20,[x29,#16] 1034 add sp,sp,#4*4 1035 ldp x21,x22,[x29,#32] 1036 ldp x23,x24,[x29,#48] 1037 ldp x25,x26,[x29,#64] 1038 ldp x27,x28,[x29,#80] 1039 ldp x29,x30,[sp],#128 1040 AARCH64_VALIDATE_LINK_REGISTER 1041 ret 1042 .size sha256_block_data_order,.-sha256_block_data_order 1043 1044 .section .rodata 1045 1046 .align 6 1047 .type .LK256,%object 1048 .LK256: 1049 .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 1050 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 1051 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 1052 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 1053 .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc 1054 .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da 1055 .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 1056 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 1057 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 1058 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 1059 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 1060 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 1061 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 1062 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 1063 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 1064 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 1065 .long 0 //terminator 1066 .size .LK256,.-.LK256 1067 .byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 1068 .align 2 1069 .align 2 1070 1071 .text 1072 #ifndef __KERNEL__ 1073 .type sha256_block_armv8,%function 1074 .align 6 1075 sha256_block_armv8: 1076 .Lv8_entry: 1077 // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. 1078 stp x29,x30,[sp,#-16]! 1079 add x29,sp,#0 1080 1081 ld1 {v0.4s,v1.4s},[x0] 1082 adrp x3,.LK256 1083 add x3,x3,#:lo12:.LK256 1084 1085 .Loop_hw: 1086 ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 1087 sub x2,x2,#1 1088 ld1 {v16.4s},[x3],#16 1089 rev32 v4.16b,v4.16b 1090 rev32 v5.16b,v5.16b 1091 rev32 v6.16b,v6.16b 1092 rev32 v7.16b,v7.16b 1093 orr v18.16b,v0.16b,v0.16b // offload 1094 orr v19.16b,v1.16b,v1.16b 1095 ld1 {v17.4s},[x3],#16 1096 add v16.4s,v16.4s,v4.4s 1097 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b 1098 orr v2.16b,v0.16b,v0.16b 1099 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1100 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1101 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b 1102 ld1 {v16.4s},[x3],#16 1103 add v17.4s,v17.4s,v5.4s 1104 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b 1105 orr v2.16b,v0.16b,v0.16b 1106 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1107 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1108 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b 1109 ld1 {v17.4s},[x3],#16 1110 add v16.4s,v16.4s,v6.4s 1111 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b 1112 orr v2.16b,v0.16b,v0.16b 1113 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1114 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1115 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b 1116 ld1 {v16.4s},[x3],#16 1117 add v17.4s,v17.4s,v7.4s 1118 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b 1119 orr v2.16b,v0.16b,v0.16b 1120 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1121 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1122 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b 1123 ld1 {v17.4s},[x3],#16 1124 add v16.4s,v16.4s,v4.4s 1125 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b 1126 orr v2.16b,v0.16b,v0.16b 1127 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1128 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1129 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b 1130 ld1 {v16.4s},[x3],#16 1131 add v17.4s,v17.4s,v5.4s 1132 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b 1133 orr v2.16b,v0.16b,v0.16b 1134 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1135 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1136 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b 1137 ld1 {v17.4s},[x3],#16 1138 add v16.4s,v16.4s,v6.4s 1139 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b 1140 orr v2.16b,v0.16b,v0.16b 1141 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1142 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1143 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b 1144 ld1 {v16.4s},[x3],#16 1145 add v17.4s,v17.4s,v7.4s 1146 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b 1147 orr v2.16b,v0.16b,v0.16b 1148 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1149 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1150 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b 1151 ld1 {v17.4s},[x3],#16 1152 add v16.4s,v16.4s,v4.4s 1153 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b 1154 orr v2.16b,v0.16b,v0.16b 1155 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1156 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1157 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b 1158 ld1 {v16.4s},[x3],#16 1159 add v17.4s,v17.4s,v5.4s 1160 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b 1161 orr v2.16b,v0.16b,v0.16b 1162 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1163 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1164 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b 1165 ld1 {v17.4s},[x3],#16 1166 add v16.4s,v16.4s,v6.4s 1167 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b 1168 orr v2.16b,v0.16b,v0.16b 1169 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1170 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1171 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b 1172 ld1 {v16.4s},[x3],#16 1173 add v17.4s,v17.4s,v7.4s 1174 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b 1175 orr v2.16b,v0.16b,v0.16b 1176 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1177 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1178 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b 1179 ld1 {v17.4s},[x3],#16 1180 add v16.4s,v16.4s,v4.4s 1181 orr v2.16b,v0.16b,v0.16b 1182 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1183 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1184 1185 ld1 {v16.4s},[x3],#16 1186 add v17.4s,v17.4s,v5.4s 1187 orr v2.16b,v0.16b,v0.16b 1188 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1189 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1190 1191 ld1 {v17.4s},[x3] 1192 add v16.4s,v16.4s,v6.4s 1193 sub x3,x3,#64*4-16 // rewind 1194 orr v2.16b,v0.16b,v0.16b 1195 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1196 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1197 1198 add v17.4s,v17.4s,v7.4s 1199 orr v2.16b,v0.16b,v0.16b 1200 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1201 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1202 1203 add v0.4s,v0.4s,v18.4s 1204 add v1.4s,v1.4s,v19.4s 1205 1206 cbnz x2,.Loop_hw 1207 1208 st1 {v0.4s,v1.4s},[x0] 1209 1210 ldr x29,[sp],#16 1211 ret 1212 .size sha256_block_armv8,.-sha256_block_armv8 1213 #endif 1214 #ifdef __KERNEL__ 1215 .globl sha256_block_neon 1216 #endif 1217 .type sha256_block_neon,%function 1218 .align 4 1219 sha256_block_neon: 1220 AARCH64_VALID_CALL_TARGET 1221 .Lneon_entry: 1222 // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later 1223 stp x29, x30, [sp, #-16]! 1224 mov x29, sp 1225 sub sp,sp,#16*4 1226 1227 adrp x16,.LK256 1228 add x16,x16,#:lo12:.LK256 1229 add x2,x1,x2,lsl#6 // len to point at the end of inp 1230 1231 ld1 {v0.16b},[x1], #16 1232 ld1 {v1.16b},[x1], #16 1233 ld1 {v2.16b},[x1], #16 1234 ld1 {v3.16b},[x1], #16 1235 ld1 {v4.4s},[x16], #16 1236 ld1 {v5.4s},[x16], #16 1237 ld1 {v6.4s},[x16], #16 1238 ld1 {v7.4s},[x16], #16 1239 rev32 v0.16b,v0.16b // yes, even on 1240 rev32 v1.16b,v1.16b // big-endian 1241 rev32 v2.16b,v2.16b 1242 rev32 v3.16b,v3.16b 1243 mov x17,sp 1244 add v4.4s,v4.4s,v0.4s 1245 add v5.4s,v5.4s,v1.4s 1246 add v6.4s,v6.4s,v2.4s 1247 st1 {v4.4s,v5.4s},[x17], #32 1248 add v7.4s,v7.4s,v3.4s 1249 st1 {v6.4s,v7.4s},[x17] 1250 sub x17,x17,#32 1251 1252 ldp w3,w4,[x0] 1253 ldp w5,w6,[x0,#8] 1254 ldp w7,w8,[x0,#16] 1255 ldp w9,w10,[x0,#24] 1256 ldr w12,[sp,#0] 1257 mov w13,wzr 1258 eor w14,w4,w5 1259 mov w15,wzr 1260 b .L_00_48 1261 1262 .align 4 1263 .L_00_48: 1264 ext v4.16b,v0.16b,v1.16b,#4 1265 add w10,w10,w12 1266 add w3,w3,w15 1267 and w12,w8,w7 1268 bic w15,w9,w7 1269 ext v7.16b,v2.16b,v3.16b,#4 1270 eor w11,w7,w7,ror#5 1271 add w3,w3,w13 1272 mov d19,v3.d[1] 1273 orr w12,w12,w15 1274 eor w11,w11,w7,ror#19 1275 ushr v6.4s,v4.4s,#7 1276 eor w15,w3,w3,ror#11 1277 ushr v5.4s,v4.4s,#3 1278 add w10,w10,w12 1279 add v0.4s,v0.4s,v7.4s 1280 ror w11,w11,#6 1281 sli v6.4s,v4.4s,#25 1282 eor w13,w3,w4 1283 eor w15,w15,w3,ror#20 1284 ushr v7.4s,v4.4s,#18 1285 add w10,w10,w11 1286 ldr w12,[sp,#4] 1287 and w14,w14,w13 1288 eor v5.16b,v5.16b,v6.16b 1289 ror w15,w15,#2 1290 add w6,w6,w10 1291 sli v7.4s,v4.4s,#14 1292 eor w14,w14,w4 1293 ushr v16.4s,v19.4s,#17 1294 add w9,w9,w12 1295 add w10,w10,w15 1296 and w12,w7,w6 1297 eor v5.16b,v5.16b,v7.16b 1298 bic w15,w8,w6 1299 eor w11,w6,w6,ror#5 1300 sli v16.4s,v19.4s,#15 1301 add w10,w10,w14 1302 orr w12,w12,w15 1303 ushr v17.4s,v19.4s,#10 1304 eor w11,w11,w6,ror#19 1305 eor w15,w10,w10,ror#11 1306 ushr v7.4s,v19.4s,#19 1307 add w9,w9,w12 1308 ror w11,w11,#6 1309 add v0.4s,v0.4s,v5.4s 1310 eor w14,w10,w3 1311 eor w15,w15,w10,ror#20 1312 sli v7.4s,v19.4s,#13 1313 add w9,w9,w11 1314 ldr w12,[sp,#8] 1315 and w13,w13,w14 1316 eor v17.16b,v17.16b,v16.16b 1317 ror w15,w15,#2 1318 add w5,w5,w9 1319 eor w13,w13,w3 1320 eor v17.16b,v17.16b,v7.16b 1321 add w8,w8,w12 1322 add w9,w9,w15 1323 and w12,w6,w5 1324 add v0.4s,v0.4s,v17.4s 1325 bic w15,w7,w5 1326 eor w11,w5,w5,ror#5 1327 add w9,w9,w13 1328 ushr v18.4s,v0.4s,#17 1329 orr w12,w12,w15 1330 ushr v19.4s,v0.4s,#10 1331 eor w11,w11,w5,ror#19 1332 eor w15,w9,w9,ror#11 1333 sli v18.4s,v0.4s,#15 1334 add w8,w8,w12 1335 ushr v17.4s,v0.4s,#19 1336 ror w11,w11,#6 1337 eor w13,w9,w10 1338 eor v19.16b,v19.16b,v18.16b 1339 eor w15,w15,w9,ror#20 1340 add w8,w8,w11 1341 sli v17.4s,v0.4s,#13 1342 ldr w12,[sp,#12] 1343 and w14,w14,w13 1344 ror w15,w15,#2 1345 ld1 {v4.4s},[x16], #16 1346 add w4,w4,w8 1347 eor v19.16b,v19.16b,v17.16b 1348 eor w14,w14,w10 1349 eor v17.16b,v17.16b,v17.16b 1350 add w7,w7,w12 1351 add w8,w8,w15 1352 and w12,w5,w4 1353 mov v17.d[1],v19.d[0] 1354 bic w15,w6,w4 1355 eor w11,w4,w4,ror#5 1356 add w8,w8,w14 1357 add v0.4s,v0.4s,v17.4s 1358 orr w12,w12,w15 1359 eor w11,w11,w4,ror#19 1360 eor w15,w8,w8,ror#11 1361 add v4.4s,v4.4s,v0.4s 1362 add w7,w7,w12 1363 ror w11,w11,#6 1364 eor w14,w8,w9 1365 eor w15,w15,w8,ror#20 1366 add w7,w7,w11 1367 ldr w12,[sp,#16] 1368 and w13,w13,w14 1369 ror w15,w15,#2 1370 add w3,w3,w7 1371 eor w13,w13,w9 1372 st1 {v4.4s},[x17], #16 1373 ext v4.16b,v1.16b,v2.16b,#4 1374 add w6,w6,w12 1375 add w7,w7,w15 1376 and w12,w4,w3 1377 bic w15,w5,w3 1378 ext v7.16b,v3.16b,v0.16b,#4 1379 eor w11,w3,w3,ror#5 1380 add w7,w7,w13 1381 mov d19,v0.d[1] 1382 orr w12,w12,w15 1383 eor w11,w11,w3,ror#19 1384 ushr v6.4s,v4.4s,#7 1385 eor w15,w7,w7,ror#11 1386 ushr v5.4s,v4.4s,#3 1387 add w6,w6,w12 1388 add v1.4s,v1.4s,v7.4s 1389 ror w11,w11,#6 1390 sli v6.4s,v4.4s,#25 1391 eor w13,w7,w8 1392 eor w15,w15,w7,ror#20 1393 ushr v7.4s,v4.4s,#18 1394 add w6,w6,w11 1395 ldr w12,[sp,#20] 1396 and w14,w14,w13 1397 eor v5.16b,v5.16b,v6.16b 1398 ror w15,w15,#2 1399 add w10,w10,w6 1400 sli v7.4s,v4.4s,#14 1401 eor w14,w14,w8 1402 ushr v16.4s,v19.4s,#17 1403 add w5,w5,w12 1404 add w6,w6,w15 1405 and w12,w3,w10 1406 eor v5.16b,v5.16b,v7.16b 1407 bic w15,w4,w10 1408 eor w11,w10,w10,ror#5 1409 sli v16.4s,v19.4s,#15 1410 add w6,w6,w14 1411 orr w12,w12,w15 1412 ushr v17.4s,v19.4s,#10 1413 eor w11,w11,w10,ror#19 1414 eor w15,w6,w6,ror#11 1415 ushr v7.4s,v19.4s,#19 1416 add w5,w5,w12 1417 ror w11,w11,#6 1418 add v1.4s,v1.4s,v5.4s 1419 eor w14,w6,w7 1420 eor w15,w15,w6,ror#20 1421 sli v7.4s,v19.4s,#13 1422 add w5,w5,w11 1423 ldr w12,[sp,#24] 1424 and w13,w13,w14 1425 eor v17.16b,v17.16b,v16.16b 1426 ror w15,w15,#2 1427 add w9,w9,w5 1428 eor w13,w13,w7 1429 eor v17.16b,v17.16b,v7.16b 1430 add w4,w4,w12 1431 add w5,w5,w15 1432 and w12,w10,w9 1433 add v1.4s,v1.4s,v17.4s 1434 bic w15,w3,w9 1435 eor w11,w9,w9,ror#5 1436 add w5,w5,w13 1437 ushr v18.4s,v1.4s,#17 1438 orr w12,w12,w15 1439 ushr v19.4s,v1.4s,#10 1440 eor w11,w11,w9,ror#19 1441 eor w15,w5,w5,ror#11 1442 sli v18.4s,v1.4s,#15 1443 add w4,w4,w12 1444 ushr v17.4s,v1.4s,#19 1445 ror w11,w11,#6 1446 eor w13,w5,w6 1447 eor v19.16b,v19.16b,v18.16b 1448 eor w15,w15,w5,ror#20 1449 add w4,w4,w11 1450 sli v17.4s,v1.4s,#13 1451 ldr w12,[sp,#28] 1452 and w14,w14,w13 1453 ror w15,w15,#2 1454 ld1 {v4.4s},[x16], #16 1455 add w8,w8,w4 1456 eor v19.16b,v19.16b,v17.16b 1457 eor w14,w14,w6 1458 eor v17.16b,v17.16b,v17.16b 1459 add w3,w3,w12 1460 add w4,w4,w15 1461 and w12,w9,w8 1462 mov v17.d[1],v19.d[0] 1463 bic w15,w10,w8 1464 eor w11,w8,w8,ror#5 1465 add w4,w4,w14 1466 add v1.4s,v1.4s,v17.4s 1467 orr w12,w12,w15 1468 eor w11,w11,w8,ror#19 1469 eor w15,w4,w4,ror#11 1470 add v4.4s,v4.4s,v1.4s 1471 add w3,w3,w12 1472 ror w11,w11,#6 1473 eor w14,w4,w5 1474 eor w15,w15,w4,ror#20 1475 add w3,w3,w11 1476 ldr w12,[sp,#32] 1477 and w13,w13,w14 1478 ror w15,w15,#2 1479 add w7,w7,w3 1480 eor w13,w13,w5 1481 st1 {v4.4s},[x17], #16 1482 ext v4.16b,v2.16b,v3.16b,#4 1483 add w10,w10,w12 1484 add w3,w3,w15 1485 and w12,w8,w7 1486 bic w15,w9,w7 1487 ext v7.16b,v0.16b,v1.16b,#4 1488 eor w11,w7,w7,ror#5 1489 add w3,w3,w13 1490 mov d19,v1.d[1] 1491 orr w12,w12,w15 1492 eor w11,w11,w7,ror#19 1493 ushr v6.4s,v4.4s,#7 1494 eor w15,w3,w3,ror#11 1495 ushr v5.4s,v4.4s,#3 1496 add w10,w10,w12 1497 add v2.4s,v2.4s,v7.4s 1498 ror w11,w11,#6 1499 sli v6.4s,v4.4s,#25 1500 eor w13,w3,w4 1501 eor w15,w15,w3,ror#20 1502 ushr v7.4s,v4.4s,#18 1503 add w10,w10,w11 1504 ldr w12,[sp,#36] 1505 and w14,w14,w13 1506 eor v5.16b,v5.16b,v6.16b 1507 ror w15,w15,#2 1508 add w6,w6,w10 1509 sli v7.4s,v4.4s,#14 1510 eor w14,w14,w4 1511 ushr v16.4s,v19.4s,#17 1512 add w9,w9,w12 1513 add w10,w10,w15 1514 and w12,w7,w6 1515 eor v5.16b,v5.16b,v7.16b 1516 bic w15,w8,w6 1517 eor w11,w6,w6,ror#5 1518 sli v16.4s,v19.4s,#15 1519 add w10,w10,w14 1520 orr w12,w12,w15 1521 ushr v17.4s,v19.4s,#10 1522 eor w11,w11,w6,ror#19 1523 eor w15,w10,w10,ror#11 1524 ushr v7.4s,v19.4s,#19 1525 add w9,w9,w12 1526 ror w11,w11,#6 1527 add v2.4s,v2.4s,v5.4s 1528 eor w14,w10,w3 1529 eor w15,w15,w10,ror#20 1530 sli v7.4s,v19.4s,#13 1531 add w9,w9,w11 1532 ldr w12,[sp,#40] 1533 and w13,w13,w14 1534 eor v17.16b,v17.16b,v16.16b 1535 ror w15,w15,#2 1536 add w5,w5,w9 1537 eor w13,w13,w3 1538 eor v17.16b,v17.16b,v7.16b 1539 add w8,w8,w12 1540 add w9,w9,w15 1541 and w12,w6,w5 1542 add v2.4s,v2.4s,v17.4s 1543 bic w15,w7,w5 1544 eor w11,w5,w5,ror#5 1545 add w9,w9,w13 1546 ushr v18.4s,v2.4s,#17 1547 orr w12,w12,w15 1548 ushr v19.4s,v2.4s,#10 1549 eor w11,w11,w5,ror#19 1550 eor w15,w9,w9,ror#11 1551 sli v18.4s,v2.4s,#15 1552 add w8,w8,w12 1553 ushr v17.4s,v2.4s,#19 1554 ror w11,w11,#6 1555 eor w13,w9,w10 1556 eor v19.16b,v19.16b,v18.16b 1557 eor w15,w15,w9,ror#20 1558 add w8,w8,w11 1559 sli v17.4s,v2.4s,#13 1560 ldr w12,[sp,#44] 1561 and w14,w14,w13 1562 ror w15,w15,#2 1563 ld1 {v4.4s},[x16], #16 1564 add w4,w4,w8 1565 eor v19.16b,v19.16b,v17.16b 1566 eor w14,w14,w10 1567 eor v17.16b,v17.16b,v17.16b 1568 add w7,w7,w12 1569 add w8,w8,w15 1570 and w12,w5,w4 1571 mov v17.d[1],v19.d[0] 1572 bic w15,w6,w4 1573 eor w11,w4,w4,ror#5 1574 add w8,w8,w14 1575 add v2.4s,v2.4s,v17.4s 1576 orr w12,w12,w15 1577 eor w11,w11,w4,ror#19 1578 eor w15,w8,w8,ror#11 1579 add v4.4s,v4.4s,v2.4s 1580 add w7,w7,w12 1581 ror w11,w11,#6 1582 eor w14,w8,w9 1583 eor w15,w15,w8,ror#20 1584 add w7,w7,w11 1585 ldr w12,[sp,#48] 1586 and w13,w13,w14 1587 ror w15,w15,#2 1588 add w3,w3,w7 1589 eor w13,w13,w9 1590 st1 {v4.4s},[x17], #16 1591 ext v4.16b,v3.16b,v0.16b,#4 1592 add w6,w6,w12 1593 add w7,w7,w15 1594 and w12,w4,w3 1595 bic w15,w5,w3 1596 ext v7.16b,v1.16b,v2.16b,#4 1597 eor w11,w3,w3,ror#5 1598 add w7,w7,w13 1599 mov d19,v2.d[1] 1600 orr w12,w12,w15 1601 eor w11,w11,w3,ror#19 1602 ushr v6.4s,v4.4s,#7 1603 eor w15,w7,w7,ror#11 1604 ushr v5.4s,v4.4s,#3 1605 add w6,w6,w12 1606 add v3.4s,v3.4s,v7.4s 1607 ror w11,w11,#6 1608 sli v6.4s,v4.4s,#25 1609 eor w13,w7,w8 1610 eor w15,w15,w7,ror#20 1611 ushr v7.4s,v4.4s,#18 1612 add w6,w6,w11 1613 ldr w12,[sp,#52] 1614 and w14,w14,w13 1615 eor v5.16b,v5.16b,v6.16b 1616 ror w15,w15,#2 1617 add w10,w10,w6 1618 sli v7.4s,v4.4s,#14 1619 eor w14,w14,w8 1620 ushr v16.4s,v19.4s,#17 1621 add w5,w5,w12 1622 add w6,w6,w15 1623 and w12,w3,w10 1624 eor v5.16b,v5.16b,v7.16b 1625 bic w15,w4,w10 1626 eor w11,w10,w10,ror#5 1627 sli v16.4s,v19.4s,#15 1628 add w6,w6,w14 1629 orr w12,w12,w15 1630 ushr v17.4s,v19.4s,#10 1631 eor w11,w11,w10,ror#19 1632 eor w15,w6,w6,ror#11 1633 ushr v7.4s,v19.4s,#19 1634 add w5,w5,w12 1635 ror w11,w11,#6 1636 add v3.4s,v3.4s,v5.4s 1637 eor w14,w6,w7 1638 eor w15,w15,w6,ror#20 1639 sli v7.4s,v19.4s,#13 1640 add w5,w5,w11 1641 ldr w12,[sp,#56] 1642 and w13,w13,w14 1643 eor v17.16b,v17.16b,v16.16b 1644 ror w15,w15,#2 1645 add w9,w9,w5 1646 eor w13,w13,w7 1647 eor v17.16b,v17.16b,v7.16b 1648 add w4,w4,w12 1649 add w5,w5,w15 1650 and w12,w10,w9 1651 add v3.4s,v3.4s,v17.4s 1652 bic w15,w3,w9 1653 eor w11,w9,w9,ror#5 1654 add w5,w5,w13 1655 ushr v18.4s,v3.4s,#17 1656 orr w12,w12,w15 1657 ushr v19.4s,v3.4s,#10 1658 eor w11,w11,w9,ror#19 1659 eor w15,w5,w5,ror#11 1660 sli v18.4s,v3.4s,#15 1661 add w4,w4,w12 1662 ushr v17.4s,v3.4s,#19 1663 ror w11,w11,#6 1664 eor w13,w5,w6 1665 eor v19.16b,v19.16b,v18.16b 1666 eor w15,w15,w5,ror#20 1667 add w4,w4,w11 1668 sli v17.4s,v3.4s,#13 1669 ldr w12,[sp,#60] 1670 and w14,w14,w13 1671 ror w15,w15,#2 1672 ld1 {v4.4s},[x16], #16 1673 add w8,w8,w4 1674 eor v19.16b,v19.16b,v17.16b 1675 eor w14,w14,w6 1676 eor v17.16b,v17.16b,v17.16b 1677 add w3,w3,w12 1678 add w4,w4,w15 1679 and w12,w9,w8 1680 mov v17.d[1],v19.d[0] 1681 bic w15,w10,w8 1682 eor w11,w8,w8,ror#5 1683 add w4,w4,w14 1684 add v3.4s,v3.4s,v17.4s 1685 orr w12,w12,w15 1686 eor w11,w11,w8,ror#19 1687 eor w15,w4,w4,ror#11 1688 add v4.4s,v4.4s,v3.4s 1689 add w3,w3,w12 1690 ror w11,w11,#6 1691 eor w14,w4,w5 1692 eor w15,w15,w4,ror#20 1693 add w3,w3,w11 1694 ldr w12,[x16] 1695 and w13,w13,w14 1696 ror w15,w15,#2 1697 add w7,w7,w3 1698 eor w13,w13,w5 1699 st1 {v4.4s},[x17], #16 1700 cmp w12,#0 // check for K256 terminator 1701 ldr w12,[sp,#0] 1702 sub x17,x17,#64 1703 bne .L_00_48 1704 1705 sub x16,x16,#256 // rewind x16 1706 cmp x1,x2 1707 mov x17, #64 1708 csel x17, x17, xzr, eq 1709 sub x1,x1,x17 // avoid SEGV 1710 mov x17,sp 1711 add w10,w10,w12 1712 add w3,w3,w15 1713 and w12,w8,w7 1714 ld1 {v0.16b},[x1],#16 1715 bic w15,w9,w7 1716 eor w11,w7,w7,ror#5 1717 ld1 {v4.4s},[x16],#16 1718 add w3,w3,w13 1719 orr w12,w12,w15 1720 eor w11,w11,w7,ror#19 1721 eor w15,w3,w3,ror#11 1722 rev32 v0.16b,v0.16b 1723 add w10,w10,w12 1724 ror w11,w11,#6 1725 eor w13,w3,w4 1726 eor w15,w15,w3,ror#20 1727 add v4.4s,v4.4s,v0.4s 1728 add w10,w10,w11 1729 ldr w12,[sp,#4] 1730 and w14,w14,w13 1731 ror w15,w15,#2 1732 add w6,w6,w10 1733 eor w14,w14,w4 1734 add w9,w9,w12 1735 add w10,w10,w15 1736 and w12,w7,w6 1737 bic w15,w8,w6 1738 eor w11,w6,w6,ror#5 1739 add w10,w10,w14 1740 orr w12,w12,w15 1741 eor w11,w11,w6,ror#19 1742 eor w15,w10,w10,ror#11 1743 add w9,w9,w12 1744 ror w11,w11,#6 1745 eor w14,w10,w3 1746 eor w15,w15,w10,ror#20 1747 add w9,w9,w11 1748 ldr w12,[sp,#8] 1749 and w13,w13,w14 1750 ror w15,w15,#2 1751 add w5,w5,w9 1752 eor w13,w13,w3 1753 add w8,w8,w12 1754 add w9,w9,w15 1755 and w12,w6,w5 1756 bic w15,w7,w5 1757 eor w11,w5,w5,ror#5 1758 add w9,w9,w13 1759 orr w12,w12,w15 1760 eor w11,w11,w5,ror#19 1761 eor w15,w9,w9,ror#11 1762 add w8,w8,w12 1763 ror w11,w11,#6 1764 eor w13,w9,w10 1765 eor w15,w15,w9,ror#20 1766 add w8,w8,w11 1767 ldr w12,[sp,#12] 1768 and w14,w14,w13 1769 ror w15,w15,#2 1770 add w4,w4,w8 1771 eor w14,w14,w10 1772 add w7,w7,w12 1773 add w8,w8,w15 1774 and w12,w5,w4 1775 bic w15,w6,w4 1776 eor w11,w4,w4,ror#5 1777 add w8,w8,w14 1778 orr w12,w12,w15 1779 eor w11,w11,w4,ror#19 1780 eor w15,w8,w8,ror#11 1781 add w7,w7,w12 1782 ror w11,w11,#6 1783 eor w14,w8,w9 1784 eor w15,w15,w8,ror#20 1785 add w7,w7,w11 1786 ldr w12,[sp,#16] 1787 and w13,w13,w14 1788 ror w15,w15,#2 1789 add w3,w3,w7 1790 eor w13,w13,w9 1791 st1 {v4.4s},[x17], #16 1792 add w6,w6,w12 1793 add w7,w7,w15 1794 and w12,w4,w3 1795 ld1 {v1.16b},[x1],#16 1796 bic w15,w5,w3 1797 eor w11,w3,w3,ror#5 1798 ld1 {v4.4s},[x16],#16 1799 add w7,w7,w13 1800 orr w12,w12,w15 1801 eor w11,w11,w3,ror#19 1802 eor w15,w7,w7,ror#11 1803 rev32 v1.16b,v1.16b 1804 add w6,w6,w12 1805 ror w11,w11,#6 1806 eor w13,w7,w8 1807 eor w15,w15,w7,ror#20 1808 add v4.4s,v4.4s,v1.4s 1809 add w6,w6,w11 1810 ldr w12,[sp,#20] 1811 and w14,w14,w13 1812 ror w15,w15,#2 1813 add w10,w10,w6 1814 eor w14,w14,w8 1815 add w5,w5,w12 1816 add w6,w6,w15 1817 and w12,w3,w10 1818 bic w15,w4,w10 1819 eor w11,w10,w10,ror#5 1820 add w6,w6,w14 1821 orr w12,w12,w15 1822 eor w11,w11,w10,ror#19 1823 eor w15,w6,w6,ror#11 1824 add w5,w5,w12 1825 ror w11,w11,#6 1826 eor w14,w6,w7 1827 eor w15,w15,w6,ror#20 1828 add w5,w5,w11 1829 ldr w12,[sp,#24] 1830 and w13,w13,w14 1831 ror w15,w15,#2 1832 add w9,w9,w5 1833 eor w13,w13,w7 1834 add w4,w4,w12 1835 add w5,w5,w15 1836 and w12,w10,w9 1837 bic w15,w3,w9 1838 eor w11,w9,w9,ror#5 1839 add w5,w5,w13 1840 orr w12,w12,w15 1841 eor w11,w11,w9,ror#19 1842 eor w15,w5,w5,ror#11 1843 add w4,w4,w12 1844 ror w11,w11,#6 1845 eor w13,w5,w6 1846 eor w15,w15,w5,ror#20 1847 add w4,w4,w11 1848 ldr w12,[sp,#28] 1849 and w14,w14,w13 1850 ror w15,w15,#2 1851 add w8,w8,w4 1852 eor w14,w14,w6 1853 add w3,w3,w12 1854 add w4,w4,w15 1855 and w12,w9,w8 1856 bic w15,w10,w8 1857 eor w11,w8,w8,ror#5 1858 add w4,w4,w14 1859 orr w12,w12,w15 1860 eor w11,w11,w8,ror#19 1861 eor w15,w4,w4,ror#11 1862 add w3,w3,w12 1863 ror w11,w11,#6 1864 eor w14,w4,w5 1865 eor w15,w15,w4,ror#20 1866 add w3,w3,w11 1867 ldr w12,[sp,#32] 1868 and w13,w13,w14 1869 ror w15,w15,#2 1870 add w7,w7,w3 1871 eor w13,w13,w5 1872 st1 {v4.4s},[x17], #16 1873 add w10,w10,w12 1874 add w3,w3,w15 1875 and w12,w8,w7 1876 ld1 {v2.16b},[x1],#16 1877 bic w15,w9,w7 1878 eor w11,w7,w7,ror#5 1879 ld1 {v4.4s},[x16],#16 1880 add w3,w3,w13 1881 orr w12,w12,w15 1882 eor w11,w11,w7,ror#19 1883 eor w15,w3,w3,ror#11 1884 rev32 v2.16b,v2.16b 1885 add w10,w10,w12 1886 ror w11,w11,#6 1887 eor w13,w3,w4 1888 eor w15,w15,w3,ror#20 1889 add v4.4s,v4.4s,v2.4s 1890 add w10,w10,w11 1891 ldr w12,[sp,#36] 1892 and w14,w14,w13 1893 ror w15,w15,#2 1894 add w6,w6,w10 1895 eor w14,w14,w4 1896 add w9,w9,w12 1897 add w10,w10,w15 1898 and w12,w7,w6 1899 bic w15,w8,w6 1900 eor w11,w6,w6,ror#5 1901 add w10,w10,w14 1902 orr w12,w12,w15 1903 eor w11,w11,w6,ror#19 1904 eor w15,w10,w10,ror#11 1905 add w9,w9,w12 1906 ror w11,w11,#6 1907 eor w14,w10,w3 1908 eor w15,w15,w10,ror#20 1909 add w9,w9,w11 1910 ldr w12,[sp,#40] 1911 and w13,w13,w14 1912 ror w15,w15,#2 1913 add w5,w5,w9 1914 eor w13,w13,w3 1915 add w8,w8,w12 1916 add w9,w9,w15 1917 and w12,w6,w5 1918 bic w15,w7,w5 1919 eor w11,w5,w5,ror#5 1920 add w9,w9,w13 1921 orr w12,w12,w15 1922 eor w11,w11,w5,ror#19 1923 eor w15,w9,w9,ror#11 1924 add w8,w8,w12 1925 ror w11,w11,#6 1926 eor w13,w9,w10 1927 eor w15,w15,w9,ror#20 1928 add w8,w8,w11 1929 ldr w12,[sp,#44] 1930 and w14,w14,w13 1931 ror w15,w15,#2 1932 add w4,w4,w8 1933 eor w14,w14,w10 1934 add w7,w7,w12 1935 add w8,w8,w15 1936 and w12,w5,w4 1937 bic w15,w6,w4 1938 eor w11,w4,w4,ror#5 1939 add w8,w8,w14 1940 orr w12,w12,w15 1941 eor w11,w11,w4,ror#19 1942 eor w15,w8,w8,ror#11 1943 add w7,w7,w12 1944 ror w11,w11,#6 1945 eor w14,w8,w9 1946 eor w15,w15,w8,ror#20 1947 add w7,w7,w11 1948 ldr w12,[sp,#48] 1949 and w13,w13,w14 1950 ror w15,w15,#2 1951 add w3,w3,w7 1952 eor w13,w13,w9 1953 st1 {v4.4s},[x17], #16 1954 add w6,w6,w12 1955 add w7,w7,w15 1956 and w12,w4,w3 1957 ld1 {v3.16b},[x1],#16 1958 bic w15,w5,w3 1959 eor w11,w3,w3,ror#5 1960 ld1 {v4.4s},[x16],#16 1961 add w7,w7,w13 1962 orr w12,w12,w15 1963 eor w11,w11,w3,ror#19 1964 eor w15,w7,w7,ror#11 1965 rev32 v3.16b,v3.16b 1966 add w6,w6,w12 1967 ror w11,w11,#6 1968 eor w13,w7,w8 1969 eor w15,w15,w7,ror#20 1970 add v4.4s,v4.4s,v3.4s 1971 add w6,w6,w11 1972 ldr w12,[sp,#52] 1973 and w14,w14,w13 1974 ror w15,w15,#2 1975 add w10,w10,w6 1976 eor w14,w14,w8 1977 add w5,w5,w12 1978 add w6,w6,w15 1979 and w12,w3,w10 1980 bic w15,w4,w10 1981 eor w11,w10,w10,ror#5 1982 add w6,w6,w14 1983 orr w12,w12,w15 1984 eor w11,w11,w10,ror#19 1985 eor w15,w6,w6,ror#11 1986 add w5,w5,w12 1987 ror w11,w11,#6 1988 eor w14,w6,w7 1989 eor w15,w15,w6,ror#20 1990 add w5,w5,w11 1991 ldr w12,[sp,#56] 1992 and w13,w13,w14 1993 ror w15,w15,#2 1994 add w9,w9,w5 1995 eor w13,w13,w7 1996 add w4,w4,w12 1997 add w5,w5,w15 1998 and w12,w10,w9 1999 bic w15,w3,w9 2000 eor w11,w9,w9,ror#5 2001 add w5,w5,w13 2002 orr w12,w12,w15 2003 eor w11,w11,w9,ror#19 2004 eor w15,w5,w5,ror#11 2005 add w4,w4,w12 2006 ror w11,w11,#6 2007 eor w13,w5,w6 2008 eor w15,w15,w5,ror#20 2009 add w4,w4,w11 2010 ldr w12,[sp,#60] 2011 and w14,w14,w13 2012 ror w15,w15,#2 2013 add w8,w8,w4 2014 eor w14,w14,w6 2015 add w3,w3,w12 2016 add w4,w4,w15 2017 and w12,w9,w8 2018 bic w15,w10,w8 2019 eor w11,w8,w8,ror#5 2020 add w4,w4,w14 2021 orr w12,w12,w15 2022 eor w11,w11,w8,ror#19 2023 eor w15,w4,w4,ror#11 2024 add w3,w3,w12 2025 ror w11,w11,#6 2026 eor w14,w4,w5 2027 eor w15,w15,w4,ror#20 2028 add w3,w3,w11 2029 and w13,w13,w14 2030 ror w15,w15,#2 2031 add w7,w7,w3 2032 eor w13,w13,w5 2033 st1 {v4.4s},[x17], #16 2034 add w3,w3,w15 // h+=Sigma0(a) from the past 2035 ldp w11,w12,[x0,#0] 2036 add w3,w3,w13 // h+=Maj(a,b,c) from the past 2037 ldp w13,w14,[x0,#8] 2038 add w3,w3,w11 // accumulate 2039 add w4,w4,w12 2040 ldp w11,w12,[x0,#16] 2041 add w5,w5,w13 2042 add w6,w6,w14 2043 ldp w13,w14,[x0,#24] 2044 add w7,w7,w11 2045 add w8,w8,w12 2046 ldr w12,[sp,#0] 2047 stp w3,w4,[x0,#0] 2048 add w9,w9,w13 2049 mov w13,wzr 2050 stp w5,w6,[x0,#8] 2051 add w10,w10,w14 2052 stp w7,w8,[x0,#16] 2053 eor w14,w4,w5 2054 stp w9,w10,[x0,#24] 2055 mov w15,wzr 2056 mov x17,sp 2057 b.ne .L_00_48 2058 2059 ldr x29,[x29] 2060 add sp,sp,#16*4+16 2061 ret 2062 .size sha256_block_neon,.-sha256_block_neon 2063