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