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