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