1// This file is generated from a similarly-named Perl script in the BoringSSL 2// source tree. Do not edit by hand. 3 4#include <ring-core/asm_base.h> 5 6#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_AARCH64) && defined(_WIN32) 7// Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved. 8// 9// Licensed under the OpenSSL license (the "License"). You may not use 10// this file except in compliance with the License. You can obtain a copy 11// in the file LICENSE in the source distribution or at 12// https://www.openssl.org/source/license.html 13 14// ==================================================================== 15// Written by Andy Polyakov <[email protected]> for the OpenSSL 16// project. The module is, however, dual licensed under OpenSSL and 17// CRYPTOGAMS licenses depending on where you obtain it. For further 18// details see http://www.openssl.org/~appro/cryptogams/. 19// 20// Permission to use under GPLv2 terms is granted. 21// ==================================================================== 22// 23// SHA256/512 for ARMv8. 24// 25// Performance in cycles per processed byte and improvement coefficient 26// over code generated with "default" compiler: 27// 28// SHA256-hw SHA256(*) SHA512 29// Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) 30// Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) 31// Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) 32// Denver 2.01 10.5 (+26%) 6.70 (+8%) 33// X-Gene 20.0 (+100%) 12.8 (+300%(***)) 34// Mongoose 2.36 13.0 (+50%) 8.36 (+33%) 35// Kryo 1.92 17.4 (+30%) 11.2 (+8%) 36// 37// (*) Software SHA256 results are of lesser relevance, presented 38// mostly for informational purposes. 39// (**) The result is a trade-off: it's possible to improve it by 40// 10% (or by 1 cycle per round), but at the cost of 20% loss 41// on Cortex-A53 (or by 4 cycles per round). 42// (***) Super-impressive coefficients over gcc-generated code are 43// indication of some compiler "pathology", most notably code 44// generated with -mgeneral-regs-only is significantly faster 45// and the gap is only 40-90%. 46 47#ifndef __KERNEL__ 48# include <ring-core/arm_arch.h> 49#endif 50 51.text 52 53 54 55.globl sha256_block_data_order 56 57.def sha256_block_data_order 58 .type 32 59.endef 60.align 6 61sha256_block_data_order: 62 AARCH64_VALID_CALL_TARGET 63#ifndef __KERNEL__ 64#if defined(OPENSSL_HWASAN) && __clang_major__ >= 10 65 adrp x16,:pg_hi21_nc:OPENSSL_armcap_P 66#else 67 adrp x16,OPENSSL_armcap_P 68#endif 69 ldr w16,[x16,:lo12:OPENSSL_armcap_P] 70 tst w16,#ARMV8_SHA256 71 b.ne Lv8_entry 72#endif 73 AARCH64_SIGN_LINK_REGISTER 74 stp x29,x30,[sp,#-128]! 75 add x29,sp,#0 76 77 stp x19,x20,[sp,#16] 78 stp x21,x22,[sp,#32] 79 stp x23,x24,[sp,#48] 80 stp x25,x26,[sp,#64] 81 stp x27,x28,[sp,#80] 82 sub sp,sp,#4*4 83 84 ldp w20,w21,[x0] // load context 85 ldp w22,w23,[x0,#2*4] 86 ldp w24,w25,[x0,#4*4] 87 add x2,x1,x2,lsl#6 // end of input 88 ldp w26,w27,[x0,#6*4] 89 adrp x30,LK256 90 add x30,x30,:lo12:LK256 91 stp x0,x2,[x29,#96] 92 93Loop: 94 ldp w3,w4,[x1],#2*4 95 ldr w19,[x30],#4 // *K++ 96 eor w28,w21,w22 // magic seed 97 str x1,[x29,#112] 98#ifndef __AARCH64EB__ 99 rev w3,w3 // 0 100#endif 101 ror w16,w24,#6 102 add w27,w27,w19 // h+=K[i] 103 eor w6,w24,w24,ror#14 104 and w17,w25,w24 105 bic w19,w26,w24 106 add w27,w27,w3 // h+=X[i] 107 orr w17,w17,w19 // Ch(e,f,g) 108 eor w19,w20,w21 // a^b, b^c in next round 109 eor w16,w16,w6,ror#11 // Sigma1(e) 110 ror w6,w20,#2 111 add w27,w27,w17 // h+=Ch(e,f,g) 112 eor w17,w20,w20,ror#9 113 add w27,w27,w16 // h+=Sigma1(e) 114 and w28,w28,w19 // (b^c)&=(a^b) 115 add w23,w23,w27 // d+=h 116 eor w28,w28,w21 // Maj(a,b,c) 117 eor w17,w6,w17,ror#13 // Sigma0(a) 118 add w27,w27,w28 // h+=Maj(a,b,c) 119 ldr w28,[x30],#4 // *K++, w19 in next round 120 //add w27,w27,w17 // h+=Sigma0(a) 121#ifndef __AARCH64EB__ 122 rev w4,w4 // 1 123#endif 124 ldp w5,w6,[x1],#2*4 125 add w27,w27,w17 // h+=Sigma0(a) 126 ror w16,w23,#6 127 add w26,w26,w28 // h+=K[i] 128 eor w7,w23,w23,ror#14 129 and w17,w24,w23 130 bic w28,w25,w23 131 add w26,w26,w4 // h+=X[i] 132 orr w17,w17,w28 // Ch(e,f,g) 133 eor w28,w27,w20 // a^b, b^c in next round 134 eor w16,w16,w7,ror#11 // Sigma1(e) 135 ror w7,w27,#2 136 add w26,w26,w17 // h+=Ch(e,f,g) 137 eor w17,w27,w27,ror#9 138 add w26,w26,w16 // h+=Sigma1(e) 139 and w19,w19,w28 // (b^c)&=(a^b) 140 add w22,w22,w26 // d+=h 141 eor w19,w19,w20 // Maj(a,b,c) 142 eor w17,w7,w17,ror#13 // Sigma0(a) 143 add w26,w26,w19 // h+=Maj(a,b,c) 144 ldr w19,[x30],#4 // *K++, w28 in next round 145 //add w26,w26,w17 // h+=Sigma0(a) 146#ifndef __AARCH64EB__ 147 rev w5,w5 // 2 148#endif 149 add w26,w26,w17 // h+=Sigma0(a) 150 ror w16,w22,#6 151 add w25,w25,w19 // h+=K[i] 152 eor w8,w22,w22,ror#14 153 and w17,w23,w22 154 bic w19,w24,w22 155 add w25,w25,w5 // h+=X[i] 156 orr w17,w17,w19 // Ch(e,f,g) 157 eor w19,w26,w27 // a^b, b^c in next round 158 eor w16,w16,w8,ror#11 // Sigma1(e) 159 ror w8,w26,#2 160 add w25,w25,w17 // h+=Ch(e,f,g) 161 eor w17,w26,w26,ror#9 162 add w25,w25,w16 // h+=Sigma1(e) 163 and w28,w28,w19 // (b^c)&=(a^b) 164 add w21,w21,w25 // d+=h 165 eor w28,w28,w27 // Maj(a,b,c) 166 eor w17,w8,w17,ror#13 // Sigma0(a) 167 add w25,w25,w28 // h+=Maj(a,b,c) 168 ldr w28,[x30],#4 // *K++, w19 in next round 169 //add w25,w25,w17 // h+=Sigma0(a) 170#ifndef __AARCH64EB__ 171 rev w6,w6 // 3 172#endif 173 ldp w7,w8,[x1],#2*4 174 add w25,w25,w17 // h+=Sigma0(a) 175 ror w16,w21,#6 176 add w24,w24,w28 // h+=K[i] 177 eor w9,w21,w21,ror#14 178 and w17,w22,w21 179 bic w28,w23,w21 180 add w24,w24,w6 // h+=X[i] 181 orr w17,w17,w28 // Ch(e,f,g) 182 eor w28,w25,w26 // a^b, b^c in next round 183 eor w16,w16,w9,ror#11 // Sigma1(e) 184 ror w9,w25,#2 185 add w24,w24,w17 // h+=Ch(e,f,g) 186 eor w17,w25,w25,ror#9 187 add w24,w24,w16 // h+=Sigma1(e) 188 and w19,w19,w28 // (b^c)&=(a^b) 189 add w20,w20,w24 // d+=h 190 eor w19,w19,w26 // Maj(a,b,c) 191 eor w17,w9,w17,ror#13 // Sigma0(a) 192 add w24,w24,w19 // h+=Maj(a,b,c) 193 ldr w19,[x30],#4 // *K++, w28 in next round 194 //add w24,w24,w17 // h+=Sigma0(a) 195#ifndef __AARCH64EB__ 196 rev w7,w7 // 4 197#endif 198 add w24,w24,w17 // h+=Sigma0(a) 199 ror w16,w20,#6 200 add w23,w23,w19 // h+=K[i] 201 eor w10,w20,w20,ror#14 202 and w17,w21,w20 203 bic w19,w22,w20 204 add w23,w23,w7 // h+=X[i] 205 orr w17,w17,w19 // Ch(e,f,g) 206 eor w19,w24,w25 // a^b, b^c in next round 207 eor w16,w16,w10,ror#11 // Sigma1(e) 208 ror w10,w24,#2 209 add w23,w23,w17 // h+=Ch(e,f,g) 210 eor w17,w24,w24,ror#9 211 add w23,w23,w16 // h+=Sigma1(e) 212 and w28,w28,w19 // (b^c)&=(a^b) 213 add w27,w27,w23 // d+=h 214 eor w28,w28,w25 // Maj(a,b,c) 215 eor w17,w10,w17,ror#13 // Sigma0(a) 216 add w23,w23,w28 // h+=Maj(a,b,c) 217 ldr w28,[x30],#4 // *K++, w19 in next round 218 //add w23,w23,w17 // h+=Sigma0(a) 219#ifndef __AARCH64EB__ 220 rev w8,w8 // 5 221#endif 222 ldp w9,w10,[x1],#2*4 223 add w23,w23,w17 // h+=Sigma0(a) 224 ror w16,w27,#6 225 add w22,w22,w28 // h+=K[i] 226 eor w11,w27,w27,ror#14 227 and w17,w20,w27 228 bic w28,w21,w27 229 add w22,w22,w8 // h+=X[i] 230 orr w17,w17,w28 // Ch(e,f,g) 231 eor w28,w23,w24 // a^b, b^c in next round 232 eor w16,w16,w11,ror#11 // Sigma1(e) 233 ror w11,w23,#2 234 add w22,w22,w17 // h+=Ch(e,f,g) 235 eor w17,w23,w23,ror#9 236 add w22,w22,w16 // h+=Sigma1(e) 237 and w19,w19,w28 // (b^c)&=(a^b) 238 add w26,w26,w22 // d+=h 239 eor w19,w19,w24 // Maj(a,b,c) 240 eor w17,w11,w17,ror#13 // Sigma0(a) 241 add w22,w22,w19 // h+=Maj(a,b,c) 242 ldr w19,[x30],#4 // *K++, w28 in next round 243 //add w22,w22,w17 // h+=Sigma0(a) 244#ifndef __AARCH64EB__ 245 rev w9,w9 // 6 246#endif 247 add w22,w22,w17 // h+=Sigma0(a) 248 ror w16,w26,#6 249 add w21,w21,w19 // h+=K[i] 250 eor w12,w26,w26,ror#14 251 and w17,w27,w26 252 bic w19,w20,w26 253 add w21,w21,w9 // h+=X[i] 254 orr w17,w17,w19 // Ch(e,f,g) 255 eor w19,w22,w23 // a^b, b^c in next round 256 eor w16,w16,w12,ror#11 // Sigma1(e) 257 ror w12,w22,#2 258 add w21,w21,w17 // h+=Ch(e,f,g) 259 eor w17,w22,w22,ror#9 260 add w21,w21,w16 // h+=Sigma1(e) 261 and w28,w28,w19 // (b^c)&=(a^b) 262 add w25,w25,w21 // d+=h 263 eor w28,w28,w23 // Maj(a,b,c) 264 eor w17,w12,w17,ror#13 // Sigma0(a) 265 add w21,w21,w28 // h+=Maj(a,b,c) 266 ldr w28,[x30],#4 // *K++, w19 in next round 267 //add w21,w21,w17 // h+=Sigma0(a) 268#ifndef __AARCH64EB__ 269 rev w10,w10 // 7 270#endif 271 ldp w11,w12,[x1],#2*4 272 add w21,w21,w17 // h+=Sigma0(a) 273 ror w16,w25,#6 274 add w20,w20,w28 // h+=K[i] 275 eor w13,w25,w25,ror#14 276 and w17,w26,w25 277 bic w28,w27,w25 278 add w20,w20,w10 // h+=X[i] 279 orr w17,w17,w28 // Ch(e,f,g) 280 eor w28,w21,w22 // a^b, b^c in next round 281 eor w16,w16,w13,ror#11 // Sigma1(e) 282 ror w13,w21,#2 283 add w20,w20,w17 // h+=Ch(e,f,g) 284 eor w17,w21,w21,ror#9 285 add w20,w20,w16 // h+=Sigma1(e) 286 and w19,w19,w28 // (b^c)&=(a^b) 287 add w24,w24,w20 // d+=h 288 eor w19,w19,w22 // Maj(a,b,c) 289 eor w17,w13,w17,ror#13 // Sigma0(a) 290 add w20,w20,w19 // h+=Maj(a,b,c) 291 ldr w19,[x30],#4 // *K++, w28 in next round 292 //add w20,w20,w17 // h+=Sigma0(a) 293#ifndef __AARCH64EB__ 294 rev w11,w11 // 8 295#endif 296 add w20,w20,w17 // h+=Sigma0(a) 297 ror w16,w24,#6 298 add w27,w27,w19 // h+=K[i] 299 eor w14,w24,w24,ror#14 300 and w17,w25,w24 301 bic w19,w26,w24 302 add w27,w27,w11 // h+=X[i] 303 orr w17,w17,w19 // Ch(e,f,g) 304 eor w19,w20,w21 // a^b, b^c in next round 305 eor w16,w16,w14,ror#11 // Sigma1(e) 306 ror w14,w20,#2 307 add w27,w27,w17 // h+=Ch(e,f,g) 308 eor w17,w20,w20,ror#9 309 add w27,w27,w16 // h+=Sigma1(e) 310 and w28,w28,w19 // (b^c)&=(a^b) 311 add w23,w23,w27 // d+=h 312 eor w28,w28,w21 // Maj(a,b,c) 313 eor w17,w14,w17,ror#13 // Sigma0(a) 314 add w27,w27,w28 // h+=Maj(a,b,c) 315 ldr w28,[x30],#4 // *K++, w19 in next round 316 //add w27,w27,w17 // h+=Sigma0(a) 317#ifndef __AARCH64EB__ 318 rev w12,w12 // 9 319#endif 320 ldp w13,w14,[x1],#2*4 321 add w27,w27,w17 // h+=Sigma0(a) 322 ror w16,w23,#6 323 add w26,w26,w28 // h+=K[i] 324 eor w15,w23,w23,ror#14 325 and w17,w24,w23 326 bic w28,w25,w23 327 add w26,w26,w12 // h+=X[i] 328 orr w17,w17,w28 // Ch(e,f,g) 329 eor w28,w27,w20 // a^b, b^c in next round 330 eor w16,w16,w15,ror#11 // Sigma1(e) 331 ror w15,w27,#2 332 add w26,w26,w17 // h+=Ch(e,f,g) 333 eor w17,w27,w27,ror#9 334 add w26,w26,w16 // h+=Sigma1(e) 335 and w19,w19,w28 // (b^c)&=(a^b) 336 add w22,w22,w26 // d+=h 337 eor w19,w19,w20 // Maj(a,b,c) 338 eor w17,w15,w17,ror#13 // Sigma0(a) 339 add w26,w26,w19 // h+=Maj(a,b,c) 340 ldr w19,[x30],#4 // *K++, w28 in next round 341 //add w26,w26,w17 // h+=Sigma0(a) 342#ifndef __AARCH64EB__ 343 rev w13,w13 // 10 344#endif 345 add w26,w26,w17 // h+=Sigma0(a) 346 ror w16,w22,#6 347 add w25,w25,w19 // h+=K[i] 348 eor w0,w22,w22,ror#14 349 and w17,w23,w22 350 bic w19,w24,w22 351 add w25,w25,w13 // h+=X[i] 352 orr w17,w17,w19 // Ch(e,f,g) 353 eor w19,w26,w27 // a^b, b^c in next round 354 eor w16,w16,w0,ror#11 // Sigma1(e) 355 ror w0,w26,#2 356 add w25,w25,w17 // h+=Ch(e,f,g) 357 eor w17,w26,w26,ror#9 358 add w25,w25,w16 // h+=Sigma1(e) 359 and w28,w28,w19 // (b^c)&=(a^b) 360 add w21,w21,w25 // d+=h 361 eor w28,w28,w27 // Maj(a,b,c) 362 eor w17,w0,w17,ror#13 // Sigma0(a) 363 add w25,w25,w28 // h+=Maj(a,b,c) 364 ldr w28,[x30],#4 // *K++, w19 in next round 365 //add w25,w25,w17 // h+=Sigma0(a) 366#ifndef __AARCH64EB__ 367 rev w14,w14 // 11 368#endif 369 ldp w15,w0,[x1],#2*4 370 add w25,w25,w17 // h+=Sigma0(a) 371 str w6,[sp,#12] 372 ror w16,w21,#6 373 add w24,w24,w28 // h+=K[i] 374 eor w6,w21,w21,ror#14 375 and w17,w22,w21 376 bic w28,w23,w21 377 add w24,w24,w14 // h+=X[i] 378 orr w17,w17,w28 // Ch(e,f,g) 379 eor w28,w25,w26 // a^b, b^c in next round 380 eor w16,w16,w6,ror#11 // Sigma1(e) 381 ror w6,w25,#2 382 add w24,w24,w17 // h+=Ch(e,f,g) 383 eor w17,w25,w25,ror#9 384 add w24,w24,w16 // h+=Sigma1(e) 385 and w19,w19,w28 // (b^c)&=(a^b) 386 add w20,w20,w24 // d+=h 387 eor w19,w19,w26 // Maj(a,b,c) 388 eor w17,w6,w17,ror#13 // Sigma0(a) 389 add w24,w24,w19 // h+=Maj(a,b,c) 390 ldr w19,[x30],#4 // *K++, w28 in next round 391 //add w24,w24,w17 // h+=Sigma0(a) 392#ifndef __AARCH64EB__ 393 rev w15,w15 // 12 394#endif 395 add w24,w24,w17 // h+=Sigma0(a) 396 str w7,[sp,#0] 397 ror w16,w20,#6 398 add w23,w23,w19 // h+=K[i] 399 eor w7,w20,w20,ror#14 400 and w17,w21,w20 401 bic w19,w22,w20 402 add w23,w23,w15 // h+=X[i] 403 orr w17,w17,w19 // Ch(e,f,g) 404 eor w19,w24,w25 // a^b, b^c in next round 405 eor w16,w16,w7,ror#11 // Sigma1(e) 406 ror w7,w24,#2 407 add w23,w23,w17 // h+=Ch(e,f,g) 408 eor w17,w24,w24,ror#9 409 add w23,w23,w16 // h+=Sigma1(e) 410 and w28,w28,w19 // (b^c)&=(a^b) 411 add w27,w27,w23 // d+=h 412 eor w28,w28,w25 // Maj(a,b,c) 413 eor w17,w7,w17,ror#13 // Sigma0(a) 414 add w23,w23,w28 // h+=Maj(a,b,c) 415 ldr w28,[x30],#4 // *K++, w19 in next round 416 //add w23,w23,w17 // h+=Sigma0(a) 417#ifndef __AARCH64EB__ 418 rev w0,w0 // 13 419#endif 420 ldp w1,w2,[x1] 421 add w23,w23,w17 // h+=Sigma0(a) 422 str w8,[sp,#4] 423 ror w16,w27,#6 424 add w22,w22,w28 // h+=K[i] 425 eor w8,w27,w27,ror#14 426 and w17,w20,w27 427 bic w28,w21,w27 428 add w22,w22,w0 // h+=X[i] 429 orr w17,w17,w28 // Ch(e,f,g) 430 eor w28,w23,w24 // a^b, b^c in next round 431 eor w16,w16,w8,ror#11 // Sigma1(e) 432 ror w8,w23,#2 433 add w22,w22,w17 // h+=Ch(e,f,g) 434 eor w17,w23,w23,ror#9 435 add w22,w22,w16 // h+=Sigma1(e) 436 and w19,w19,w28 // (b^c)&=(a^b) 437 add w26,w26,w22 // d+=h 438 eor w19,w19,w24 // Maj(a,b,c) 439 eor w17,w8,w17,ror#13 // Sigma0(a) 440 add w22,w22,w19 // h+=Maj(a,b,c) 441 ldr w19,[x30],#4 // *K++, w28 in next round 442 //add w22,w22,w17 // h+=Sigma0(a) 443#ifndef __AARCH64EB__ 444 rev w1,w1 // 14 445#endif 446 ldr w6,[sp,#12] 447 add w22,w22,w17 // h+=Sigma0(a) 448 str w9,[sp,#8] 449 ror w16,w26,#6 450 add w21,w21,w19 // h+=K[i] 451 eor w9,w26,w26,ror#14 452 and w17,w27,w26 453 bic w19,w20,w26 454 add w21,w21,w1 // h+=X[i] 455 orr w17,w17,w19 // Ch(e,f,g) 456 eor w19,w22,w23 // a^b, b^c in next round 457 eor w16,w16,w9,ror#11 // Sigma1(e) 458 ror w9,w22,#2 459 add w21,w21,w17 // h+=Ch(e,f,g) 460 eor w17,w22,w22,ror#9 461 add w21,w21,w16 // h+=Sigma1(e) 462 and w28,w28,w19 // (b^c)&=(a^b) 463 add w25,w25,w21 // d+=h 464 eor w28,w28,w23 // Maj(a,b,c) 465 eor w17,w9,w17,ror#13 // Sigma0(a) 466 add w21,w21,w28 // h+=Maj(a,b,c) 467 ldr w28,[x30],#4 // *K++, w19 in next round 468 //add w21,w21,w17 // h+=Sigma0(a) 469#ifndef __AARCH64EB__ 470 rev w2,w2 // 15 471#endif 472 ldr w7,[sp,#0] 473 add w21,w21,w17 // h+=Sigma0(a) 474 str w10,[sp,#12] 475 ror w16,w25,#6 476 add w20,w20,w28 // h+=K[i] 477 ror w9,w4,#7 478 and w17,w26,w25 479 ror w8,w1,#17 480 bic w28,w27,w25 481 ror w10,w21,#2 482 add w20,w20,w2 // h+=X[i] 483 eor w16,w16,w25,ror#11 484 eor w9,w9,w4,ror#18 485 orr w17,w17,w28 // Ch(e,f,g) 486 eor w28,w21,w22 // a^b, b^c in next round 487 eor w16,w16,w25,ror#25 // Sigma1(e) 488 eor w10,w10,w21,ror#13 489 add w20,w20,w17 // h+=Ch(e,f,g) 490 and w19,w19,w28 // (b^c)&=(a^b) 491 eor w8,w8,w1,ror#19 492 eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) 493 add w20,w20,w16 // h+=Sigma1(e) 494 eor w19,w19,w22 // Maj(a,b,c) 495 eor w17,w10,w21,ror#22 // Sigma0(a) 496 eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) 497 add w3,w3,w12 498 add w24,w24,w20 // d+=h 499 add w20,w20,w19 // h+=Maj(a,b,c) 500 ldr w19,[x30],#4 // *K++, w28 in next round 501 add w3,w3,w9 502 add w20,w20,w17 // h+=Sigma0(a) 503 add w3,w3,w8 504Loop_16_xx: 505 ldr w8,[sp,#4] 506 str w11,[sp,#0] 507 ror w16,w24,#6 508 add w27,w27,w19 // h+=K[i] 509 ror w10,w5,#7 510 and w17,w25,w24 511 ror w9,w2,#17 512 bic w19,w26,w24 513 ror w11,w20,#2 514 add w27,w27,w3 // h+=X[i] 515 eor w16,w16,w24,ror#11 516 eor w10,w10,w5,ror#18 517 orr w17,w17,w19 // Ch(e,f,g) 518 eor w19,w20,w21 // a^b, b^c in next round 519 eor w16,w16,w24,ror#25 // Sigma1(e) 520 eor w11,w11,w20,ror#13 521 add w27,w27,w17 // h+=Ch(e,f,g) 522 and w28,w28,w19 // (b^c)&=(a^b) 523 eor w9,w9,w2,ror#19 524 eor w10,w10,w5,lsr#3 // sigma0(X[i+1]) 525 add w27,w27,w16 // h+=Sigma1(e) 526 eor w28,w28,w21 // Maj(a,b,c) 527 eor w17,w11,w20,ror#22 // Sigma0(a) 528 eor w9,w9,w2,lsr#10 // sigma1(X[i+14]) 529 add w4,w4,w13 530 add w23,w23,w27 // d+=h 531 add w27,w27,w28 // h+=Maj(a,b,c) 532 ldr w28,[x30],#4 // *K++, w19 in next round 533 add w4,w4,w10 534 add w27,w27,w17 // h+=Sigma0(a) 535 add w4,w4,w9 536 ldr w9,[sp,#8] 537 str w12,[sp,#4] 538 ror w16,w23,#6 539 add w26,w26,w28 // h+=K[i] 540 ror w11,w6,#7 541 and w17,w24,w23 542 ror w10,w3,#17 543 bic w28,w25,w23 544 ror w12,w27,#2 545 add w26,w26,w4 // h+=X[i] 546 eor w16,w16,w23,ror#11 547 eor w11,w11,w6,ror#18 548 orr w17,w17,w28 // Ch(e,f,g) 549 eor w28,w27,w20 // a^b, b^c in next round 550 eor w16,w16,w23,ror#25 // Sigma1(e) 551 eor w12,w12,w27,ror#13 552 add w26,w26,w17 // h+=Ch(e,f,g) 553 and w19,w19,w28 // (b^c)&=(a^b) 554 eor w10,w10,w3,ror#19 555 eor w11,w11,w6,lsr#3 // sigma0(X[i+1]) 556 add w26,w26,w16 // h+=Sigma1(e) 557 eor w19,w19,w20 // Maj(a,b,c) 558 eor w17,w12,w27,ror#22 // Sigma0(a) 559 eor w10,w10,w3,lsr#10 // sigma1(X[i+14]) 560 add w5,w5,w14 561 add w22,w22,w26 // d+=h 562 add w26,w26,w19 // h+=Maj(a,b,c) 563 ldr w19,[x30],#4 // *K++, w28 in next round 564 add w5,w5,w11 565 add w26,w26,w17 // h+=Sigma0(a) 566 add w5,w5,w10 567 ldr w10,[sp,#12] 568 str w13,[sp,#8] 569 ror w16,w22,#6 570 add w25,w25,w19 // h+=K[i] 571 ror w12,w7,#7 572 and w17,w23,w22 573 ror w11,w4,#17 574 bic w19,w24,w22 575 ror w13,w26,#2 576 add w25,w25,w5 // h+=X[i] 577 eor w16,w16,w22,ror#11 578 eor w12,w12,w7,ror#18 579 orr w17,w17,w19 // Ch(e,f,g) 580 eor w19,w26,w27 // a^b, b^c in next round 581 eor w16,w16,w22,ror#25 // Sigma1(e) 582 eor w13,w13,w26,ror#13 583 add w25,w25,w17 // h+=Ch(e,f,g) 584 and w28,w28,w19 // (b^c)&=(a^b) 585 eor w11,w11,w4,ror#19 586 eor w12,w12,w7,lsr#3 // sigma0(X[i+1]) 587 add w25,w25,w16 // h+=Sigma1(e) 588 eor w28,w28,w27 // Maj(a,b,c) 589 eor w17,w13,w26,ror#22 // Sigma0(a) 590 eor w11,w11,w4,lsr#10 // sigma1(X[i+14]) 591 add w6,w6,w15 592 add w21,w21,w25 // d+=h 593 add w25,w25,w28 // h+=Maj(a,b,c) 594 ldr w28,[x30],#4 // *K++, w19 in next round 595 add w6,w6,w12 596 add w25,w25,w17 // h+=Sigma0(a) 597 add w6,w6,w11 598 ldr w11,[sp,#0] 599 str w14,[sp,#12] 600 ror w16,w21,#6 601 add w24,w24,w28 // h+=K[i] 602 ror w13,w8,#7 603 and w17,w22,w21 604 ror w12,w5,#17 605 bic w28,w23,w21 606 ror w14,w25,#2 607 add w24,w24,w6 // h+=X[i] 608 eor w16,w16,w21,ror#11 609 eor w13,w13,w8,ror#18 610 orr w17,w17,w28 // Ch(e,f,g) 611 eor w28,w25,w26 // a^b, b^c in next round 612 eor w16,w16,w21,ror#25 // Sigma1(e) 613 eor w14,w14,w25,ror#13 614 add w24,w24,w17 // h+=Ch(e,f,g) 615 and w19,w19,w28 // (b^c)&=(a^b) 616 eor w12,w12,w5,ror#19 617 eor w13,w13,w8,lsr#3 // sigma0(X[i+1]) 618 add w24,w24,w16 // h+=Sigma1(e) 619 eor w19,w19,w26 // Maj(a,b,c) 620 eor w17,w14,w25,ror#22 // Sigma0(a) 621 eor w12,w12,w5,lsr#10 // sigma1(X[i+14]) 622 add w7,w7,w0 623 add w20,w20,w24 // d+=h 624 add w24,w24,w19 // h+=Maj(a,b,c) 625 ldr w19,[x30],#4 // *K++, w28 in next round 626 add w7,w7,w13 627 add w24,w24,w17 // h+=Sigma0(a) 628 add w7,w7,w12 629 ldr w12,[sp,#4] 630 str w15,[sp,#0] 631 ror w16,w20,#6 632 add w23,w23,w19 // h+=K[i] 633 ror w14,w9,#7 634 and w17,w21,w20 635 ror w13,w6,#17 636 bic w19,w22,w20 637 ror w15,w24,#2 638 add w23,w23,w7 // h+=X[i] 639 eor w16,w16,w20,ror#11 640 eor w14,w14,w9,ror#18 641 orr w17,w17,w19 // Ch(e,f,g) 642 eor w19,w24,w25 // a^b, b^c in next round 643 eor w16,w16,w20,ror#25 // Sigma1(e) 644 eor w15,w15,w24,ror#13 645 add w23,w23,w17 // h+=Ch(e,f,g) 646 and w28,w28,w19 // (b^c)&=(a^b) 647 eor w13,w13,w6,ror#19 648 eor w14,w14,w9,lsr#3 // sigma0(X[i+1]) 649 add w23,w23,w16 // h+=Sigma1(e) 650 eor w28,w28,w25 // Maj(a,b,c) 651 eor w17,w15,w24,ror#22 // Sigma0(a) 652 eor w13,w13,w6,lsr#10 // sigma1(X[i+14]) 653 add w8,w8,w1 654 add w27,w27,w23 // d+=h 655 add w23,w23,w28 // h+=Maj(a,b,c) 656 ldr w28,[x30],#4 // *K++, w19 in next round 657 add w8,w8,w14 658 add w23,w23,w17 // h+=Sigma0(a) 659 add w8,w8,w13 660 ldr w13,[sp,#8] 661 str w0,[sp,#4] 662 ror w16,w27,#6 663 add w22,w22,w28 // h+=K[i] 664 ror w15,w10,#7 665 and w17,w20,w27 666 ror w14,w7,#17 667 bic w28,w21,w27 668 ror w0,w23,#2 669 add w22,w22,w8 // h+=X[i] 670 eor w16,w16,w27,ror#11 671 eor w15,w15,w10,ror#18 672 orr w17,w17,w28 // Ch(e,f,g) 673 eor w28,w23,w24 // a^b, b^c in next round 674 eor w16,w16,w27,ror#25 // Sigma1(e) 675 eor w0,w0,w23,ror#13 676 add w22,w22,w17 // h+=Ch(e,f,g) 677 and w19,w19,w28 // (b^c)&=(a^b) 678 eor w14,w14,w7,ror#19 679 eor w15,w15,w10,lsr#3 // sigma0(X[i+1]) 680 add w22,w22,w16 // h+=Sigma1(e) 681 eor w19,w19,w24 // Maj(a,b,c) 682 eor w17,w0,w23,ror#22 // Sigma0(a) 683 eor w14,w14,w7,lsr#10 // sigma1(X[i+14]) 684 add w9,w9,w2 685 add w26,w26,w22 // d+=h 686 add w22,w22,w19 // h+=Maj(a,b,c) 687 ldr w19,[x30],#4 // *K++, w28 in next round 688 add w9,w9,w15 689 add w22,w22,w17 // h+=Sigma0(a) 690 add w9,w9,w14 691 ldr w14,[sp,#12] 692 str w1,[sp,#8] 693 ror w16,w26,#6 694 add w21,w21,w19 // h+=K[i] 695 ror w0,w11,#7 696 and w17,w27,w26 697 ror w15,w8,#17 698 bic w19,w20,w26 699 ror w1,w22,#2 700 add w21,w21,w9 // h+=X[i] 701 eor w16,w16,w26,ror#11 702 eor w0,w0,w11,ror#18 703 orr w17,w17,w19 // Ch(e,f,g) 704 eor w19,w22,w23 // a^b, b^c in next round 705 eor w16,w16,w26,ror#25 // Sigma1(e) 706 eor w1,w1,w22,ror#13 707 add w21,w21,w17 // h+=Ch(e,f,g) 708 and w28,w28,w19 // (b^c)&=(a^b) 709 eor w15,w15,w8,ror#19 710 eor w0,w0,w11,lsr#3 // sigma0(X[i+1]) 711 add w21,w21,w16 // h+=Sigma1(e) 712 eor w28,w28,w23 // Maj(a,b,c) 713 eor w17,w1,w22,ror#22 // Sigma0(a) 714 eor w15,w15,w8,lsr#10 // sigma1(X[i+14]) 715 add w10,w10,w3 716 add w25,w25,w21 // d+=h 717 add w21,w21,w28 // h+=Maj(a,b,c) 718 ldr w28,[x30],#4 // *K++, w19 in next round 719 add w10,w10,w0 720 add w21,w21,w17 // h+=Sigma0(a) 721 add w10,w10,w15 722 ldr w15,[sp,#0] 723 str w2,[sp,#12] 724 ror w16,w25,#6 725 add w20,w20,w28 // h+=K[i] 726 ror w1,w12,#7 727 and w17,w26,w25 728 ror w0,w9,#17 729 bic w28,w27,w25 730 ror w2,w21,#2 731 add w20,w20,w10 // h+=X[i] 732 eor w16,w16,w25,ror#11 733 eor w1,w1,w12,ror#18 734 orr w17,w17,w28 // Ch(e,f,g) 735 eor w28,w21,w22 // a^b, b^c in next round 736 eor w16,w16,w25,ror#25 // Sigma1(e) 737 eor w2,w2,w21,ror#13 738 add w20,w20,w17 // h+=Ch(e,f,g) 739 and w19,w19,w28 // (b^c)&=(a^b) 740 eor w0,w0,w9,ror#19 741 eor w1,w1,w12,lsr#3 // sigma0(X[i+1]) 742 add w20,w20,w16 // h+=Sigma1(e) 743 eor w19,w19,w22 // Maj(a,b,c) 744 eor w17,w2,w21,ror#22 // Sigma0(a) 745 eor w0,w0,w9,lsr#10 // sigma1(X[i+14]) 746 add w11,w11,w4 747 add w24,w24,w20 // d+=h 748 add w20,w20,w19 // h+=Maj(a,b,c) 749 ldr w19,[x30],#4 // *K++, w28 in next round 750 add w11,w11,w1 751 add w20,w20,w17 // h+=Sigma0(a) 752 add w11,w11,w0 753 ldr w0,[sp,#4] 754 str w3,[sp,#0] 755 ror w16,w24,#6 756 add w27,w27,w19 // h+=K[i] 757 ror w2,w13,#7 758 and w17,w25,w24 759 ror w1,w10,#17 760 bic w19,w26,w24 761 ror w3,w20,#2 762 add w27,w27,w11 // h+=X[i] 763 eor w16,w16,w24,ror#11 764 eor w2,w2,w13,ror#18 765 orr w17,w17,w19 // Ch(e,f,g) 766 eor w19,w20,w21 // a^b, b^c in next round 767 eor w16,w16,w24,ror#25 // Sigma1(e) 768 eor w3,w3,w20,ror#13 769 add w27,w27,w17 // h+=Ch(e,f,g) 770 and w28,w28,w19 // (b^c)&=(a^b) 771 eor w1,w1,w10,ror#19 772 eor w2,w2,w13,lsr#3 // sigma0(X[i+1]) 773 add w27,w27,w16 // h+=Sigma1(e) 774 eor w28,w28,w21 // Maj(a,b,c) 775 eor w17,w3,w20,ror#22 // Sigma0(a) 776 eor w1,w1,w10,lsr#10 // sigma1(X[i+14]) 777 add w12,w12,w5 778 add w23,w23,w27 // d+=h 779 add w27,w27,w28 // h+=Maj(a,b,c) 780 ldr w28,[x30],#4 // *K++, w19 in next round 781 add w12,w12,w2 782 add w27,w27,w17 // h+=Sigma0(a) 783 add w12,w12,w1 784 ldr w1,[sp,#8] 785 str w4,[sp,#4] 786 ror w16,w23,#6 787 add w26,w26,w28 // h+=K[i] 788 ror w3,w14,#7 789 and w17,w24,w23 790 ror w2,w11,#17 791 bic w28,w25,w23 792 ror w4,w27,#2 793 add w26,w26,w12 // h+=X[i] 794 eor w16,w16,w23,ror#11 795 eor w3,w3,w14,ror#18 796 orr w17,w17,w28 // Ch(e,f,g) 797 eor w28,w27,w20 // a^b, b^c in next round 798 eor w16,w16,w23,ror#25 // Sigma1(e) 799 eor w4,w4,w27,ror#13 800 add w26,w26,w17 // h+=Ch(e,f,g) 801 and w19,w19,w28 // (b^c)&=(a^b) 802 eor w2,w2,w11,ror#19 803 eor w3,w3,w14,lsr#3 // sigma0(X[i+1]) 804 add w26,w26,w16 // h+=Sigma1(e) 805 eor w19,w19,w20 // Maj(a,b,c) 806 eor w17,w4,w27,ror#22 // Sigma0(a) 807 eor w2,w2,w11,lsr#10 // sigma1(X[i+14]) 808 add w13,w13,w6 809 add w22,w22,w26 // d+=h 810 add w26,w26,w19 // h+=Maj(a,b,c) 811 ldr w19,[x30],#4 // *K++, w28 in next round 812 add w13,w13,w3 813 add w26,w26,w17 // h+=Sigma0(a) 814 add w13,w13,w2 815 ldr w2,[sp,#12] 816 str w5,[sp,#8] 817 ror w16,w22,#6 818 add w25,w25,w19 // h+=K[i] 819 ror w4,w15,#7 820 and w17,w23,w22 821 ror w3,w12,#17 822 bic w19,w24,w22 823 ror w5,w26,#2 824 add w25,w25,w13 // h+=X[i] 825 eor w16,w16,w22,ror#11 826 eor w4,w4,w15,ror#18 827 orr w17,w17,w19 // Ch(e,f,g) 828 eor w19,w26,w27 // a^b, b^c in next round 829 eor w16,w16,w22,ror#25 // Sigma1(e) 830 eor w5,w5,w26,ror#13 831 add w25,w25,w17 // h+=Ch(e,f,g) 832 and w28,w28,w19 // (b^c)&=(a^b) 833 eor w3,w3,w12,ror#19 834 eor w4,w4,w15,lsr#3 // sigma0(X[i+1]) 835 add w25,w25,w16 // h+=Sigma1(e) 836 eor w28,w28,w27 // Maj(a,b,c) 837 eor w17,w5,w26,ror#22 // Sigma0(a) 838 eor w3,w3,w12,lsr#10 // sigma1(X[i+14]) 839 add w14,w14,w7 840 add w21,w21,w25 // d+=h 841 add w25,w25,w28 // h+=Maj(a,b,c) 842 ldr w28,[x30],#4 // *K++, w19 in next round 843 add w14,w14,w4 844 add w25,w25,w17 // h+=Sigma0(a) 845 add w14,w14,w3 846 ldr w3,[sp,#0] 847 str w6,[sp,#12] 848 ror w16,w21,#6 849 add w24,w24,w28 // h+=K[i] 850 ror w5,w0,#7 851 and w17,w22,w21 852 ror w4,w13,#17 853 bic w28,w23,w21 854 ror w6,w25,#2 855 add w24,w24,w14 // h+=X[i] 856 eor w16,w16,w21,ror#11 857 eor w5,w5,w0,ror#18 858 orr w17,w17,w28 // Ch(e,f,g) 859 eor w28,w25,w26 // a^b, b^c in next round 860 eor w16,w16,w21,ror#25 // Sigma1(e) 861 eor w6,w6,w25,ror#13 862 add w24,w24,w17 // h+=Ch(e,f,g) 863 and w19,w19,w28 // (b^c)&=(a^b) 864 eor w4,w4,w13,ror#19 865 eor w5,w5,w0,lsr#3 // sigma0(X[i+1]) 866 add w24,w24,w16 // h+=Sigma1(e) 867 eor w19,w19,w26 // Maj(a,b,c) 868 eor w17,w6,w25,ror#22 // Sigma0(a) 869 eor w4,w4,w13,lsr#10 // sigma1(X[i+14]) 870 add w15,w15,w8 871 add w20,w20,w24 // d+=h 872 add w24,w24,w19 // h+=Maj(a,b,c) 873 ldr w19,[x30],#4 // *K++, w28 in next round 874 add w15,w15,w5 875 add w24,w24,w17 // h+=Sigma0(a) 876 add w15,w15,w4 877 ldr w4,[sp,#4] 878 str w7,[sp,#0] 879 ror w16,w20,#6 880 add w23,w23,w19 // h+=K[i] 881 ror w6,w1,#7 882 and w17,w21,w20 883 ror w5,w14,#17 884 bic w19,w22,w20 885 ror w7,w24,#2 886 add w23,w23,w15 // h+=X[i] 887 eor w16,w16,w20,ror#11 888 eor w6,w6,w1,ror#18 889 orr w17,w17,w19 // Ch(e,f,g) 890 eor w19,w24,w25 // a^b, b^c in next round 891 eor w16,w16,w20,ror#25 // Sigma1(e) 892 eor w7,w7,w24,ror#13 893 add w23,w23,w17 // h+=Ch(e,f,g) 894 and w28,w28,w19 // (b^c)&=(a^b) 895 eor w5,w5,w14,ror#19 896 eor w6,w6,w1,lsr#3 // sigma0(X[i+1]) 897 add w23,w23,w16 // h+=Sigma1(e) 898 eor w28,w28,w25 // Maj(a,b,c) 899 eor w17,w7,w24,ror#22 // Sigma0(a) 900 eor w5,w5,w14,lsr#10 // sigma1(X[i+14]) 901 add w0,w0,w9 902 add w27,w27,w23 // d+=h 903 add w23,w23,w28 // h+=Maj(a,b,c) 904 ldr w28,[x30],#4 // *K++, w19 in next round 905 add w0,w0,w6 906 add w23,w23,w17 // h+=Sigma0(a) 907 add w0,w0,w5 908 ldr w5,[sp,#8] 909 str w8,[sp,#4] 910 ror w16,w27,#6 911 add w22,w22,w28 // h+=K[i] 912 ror w7,w2,#7 913 and w17,w20,w27 914 ror w6,w15,#17 915 bic w28,w21,w27 916 ror w8,w23,#2 917 add w22,w22,w0 // h+=X[i] 918 eor w16,w16,w27,ror#11 919 eor w7,w7,w2,ror#18 920 orr w17,w17,w28 // Ch(e,f,g) 921 eor w28,w23,w24 // a^b, b^c in next round 922 eor w16,w16,w27,ror#25 // Sigma1(e) 923 eor w8,w8,w23,ror#13 924 add w22,w22,w17 // h+=Ch(e,f,g) 925 and w19,w19,w28 // (b^c)&=(a^b) 926 eor w6,w6,w15,ror#19 927 eor w7,w7,w2,lsr#3 // sigma0(X[i+1]) 928 add w22,w22,w16 // h+=Sigma1(e) 929 eor w19,w19,w24 // Maj(a,b,c) 930 eor w17,w8,w23,ror#22 // Sigma0(a) 931 eor w6,w6,w15,lsr#10 // sigma1(X[i+14]) 932 add w1,w1,w10 933 add w26,w26,w22 // d+=h 934 add w22,w22,w19 // h+=Maj(a,b,c) 935 ldr w19,[x30],#4 // *K++, w28 in next round 936 add w1,w1,w7 937 add w22,w22,w17 // h+=Sigma0(a) 938 add w1,w1,w6 939 ldr w6,[sp,#12] 940 str w9,[sp,#8] 941 ror w16,w26,#6 942 add w21,w21,w19 // h+=K[i] 943 ror w8,w3,#7 944 and w17,w27,w26 945 ror w7,w0,#17 946 bic w19,w20,w26 947 ror w9,w22,#2 948 add w21,w21,w1 // h+=X[i] 949 eor w16,w16,w26,ror#11 950 eor w8,w8,w3,ror#18 951 orr w17,w17,w19 // Ch(e,f,g) 952 eor w19,w22,w23 // a^b, b^c in next round 953 eor w16,w16,w26,ror#25 // Sigma1(e) 954 eor w9,w9,w22,ror#13 955 add w21,w21,w17 // h+=Ch(e,f,g) 956 and w28,w28,w19 // (b^c)&=(a^b) 957 eor w7,w7,w0,ror#19 958 eor w8,w8,w3,lsr#3 // sigma0(X[i+1]) 959 add w21,w21,w16 // h+=Sigma1(e) 960 eor w28,w28,w23 // Maj(a,b,c) 961 eor w17,w9,w22,ror#22 // Sigma0(a) 962 eor w7,w7,w0,lsr#10 // sigma1(X[i+14]) 963 add w2,w2,w11 964 add w25,w25,w21 // d+=h 965 add w21,w21,w28 // h+=Maj(a,b,c) 966 ldr w28,[x30],#4 // *K++, w19 in next round 967 add w2,w2,w8 968 add w21,w21,w17 // h+=Sigma0(a) 969 add w2,w2,w7 970 ldr w7,[sp,#0] 971 str w10,[sp,#12] 972 ror w16,w25,#6 973 add w20,w20,w28 // h+=K[i] 974 ror w9,w4,#7 975 and w17,w26,w25 976 ror w8,w1,#17 977 bic w28,w27,w25 978 ror w10,w21,#2 979 add w20,w20,w2 // h+=X[i] 980 eor w16,w16,w25,ror#11 981 eor w9,w9,w4,ror#18 982 orr w17,w17,w28 // Ch(e,f,g) 983 eor w28,w21,w22 // a^b, b^c in next round 984 eor w16,w16,w25,ror#25 // Sigma1(e) 985 eor w10,w10,w21,ror#13 986 add w20,w20,w17 // h+=Ch(e,f,g) 987 and w19,w19,w28 // (b^c)&=(a^b) 988 eor w8,w8,w1,ror#19 989 eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) 990 add w20,w20,w16 // h+=Sigma1(e) 991 eor w19,w19,w22 // Maj(a,b,c) 992 eor w17,w10,w21,ror#22 // Sigma0(a) 993 eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) 994 add w3,w3,w12 995 add w24,w24,w20 // d+=h 996 add w20,w20,w19 // h+=Maj(a,b,c) 997 ldr w19,[x30],#4 // *K++, w28 in next round 998 add w3,w3,w9 999 add w20,w20,w17 // h+=Sigma0(a) 1000 add w3,w3,w8 1001 cbnz w19,Loop_16_xx 1002 1003 ldp x0,x2,[x29,#96] 1004 ldr x1,[x29,#112] 1005 sub x30,x30,#260 // rewind 1006 1007 ldp w3,w4,[x0] 1008 ldp w5,w6,[x0,#2*4] 1009 add x1,x1,#14*4 // advance input pointer 1010 ldp w7,w8,[x0,#4*4] 1011 add w20,w20,w3 1012 ldp w9,w10,[x0,#6*4] 1013 add w21,w21,w4 1014 add w22,w22,w5 1015 add w23,w23,w6 1016 stp w20,w21,[x0] 1017 add w24,w24,w7 1018 add w25,w25,w8 1019 stp w22,w23,[x0,#2*4] 1020 add w26,w26,w9 1021 add w27,w27,w10 1022 cmp x1,x2 1023 stp w24,w25,[x0,#4*4] 1024 stp w26,w27,[x0,#6*4] 1025 b.ne Loop 1026 1027 ldp x19,x20,[x29,#16] 1028 add sp,sp,#4*4 1029 ldp x21,x22,[x29,#32] 1030 ldp x23,x24,[x29,#48] 1031 ldp x25,x26,[x29,#64] 1032 ldp x27,x28,[x29,#80] 1033 ldp x29,x30,[sp],#128 1034 AARCH64_VALIDATE_LINK_REGISTER 1035 ret 1036 1037 1038.section .rodata 1039.align 6 1040 1041LK256: 1042.long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 1043.long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 1044.long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 1045.long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 1046.long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc 1047.long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da 1048.long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 1049.long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 1050.long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 1051.long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 1052.long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 1053.long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 1054.long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 1055.long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 1056.long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 1057.long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 1058.long 0 //terminator 1059 1060.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 1061.align 2 1062.align 2 1063.text 1064#ifndef __KERNEL__ 1065.def sha256_block_armv8 1066 .type 32 1067.endef 1068.align 6 1069sha256_block_armv8: 1070Lv8_entry: 1071 // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. 1072 stp x29,x30,[sp,#-16]! 1073 add x29,sp,#0 1074 1075 ld1 {v0.4s,v1.4s},[x0] 1076 adrp x3,LK256 1077 add x3,x3,:lo12:LK256 1078 1079Loop_hw: 1080 ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 1081 sub x2,x2,#1 1082 ld1 {v16.4s},[x3],#16 1083 rev32 v4.16b,v4.16b 1084 rev32 v5.16b,v5.16b 1085 rev32 v6.16b,v6.16b 1086 rev32 v7.16b,v7.16b 1087 orr v18.16b,v0.16b,v0.16b // offload 1088 orr v19.16b,v1.16b,v1.16b 1089 ld1 {v17.4s},[x3],#16 1090 add v16.4s,v16.4s,v4.4s 1091.long 0x5e2828a4 //sha256su0 v4.16b,v5.16b 1092 orr v2.16b,v0.16b,v0.16b 1093.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1094.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1095.long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b 1096 ld1 {v16.4s},[x3],#16 1097 add v17.4s,v17.4s,v5.4s 1098.long 0x5e2828c5 //sha256su0 v5.16b,v6.16b 1099 orr v2.16b,v0.16b,v0.16b 1100.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1101.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1102.long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b 1103 ld1 {v17.4s},[x3],#16 1104 add v16.4s,v16.4s,v6.4s 1105.long 0x5e2828e6 //sha256su0 v6.16b,v7.16b 1106 orr v2.16b,v0.16b,v0.16b 1107.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1108.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1109.long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b 1110 ld1 {v16.4s},[x3],#16 1111 add v17.4s,v17.4s,v7.4s 1112.long 0x5e282887 //sha256su0 v7.16b,v4.16b 1113 orr v2.16b,v0.16b,v0.16b 1114.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1115.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1116.long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b 1117 ld1 {v17.4s},[x3],#16 1118 add v16.4s,v16.4s,v4.4s 1119.long 0x5e2828a4 //sha256su0 v4.16b,v5.16b 1120 orr v2.16b,v0.16b,v0.16b 1121.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1122.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1123.long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b 1124 ld1 {v16.4s},[x3],#16 1125 add v17.4s,v17.4s,v5.4s 1126.long 0x5e2828c5 //sha256su0 v5.16b,v6.16b 1127 orr v2.16b,v0.16b,v0.16b 1128.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1129.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1130.long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b 1131 ld1 {v17.4s},[x3],#16 1132 add v16.4s,v16.4s,v6.4s 1133.long 0x5e2828e6 //sha256su0 v6.16b,v7.16b 1134 orr v2.16b,v0.16b,v0.16b 1135.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1136.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1137.long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b 1138 ld1 {v16.4s},[x3],#16 1139 add v17.4s,v17.4s,v7.4s 1140.long 0x5e282887 //sha256su0 v7.16b,v4.16b 1141 orr v2.16b,v0.16b,v0.16b 1142.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1143.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1144.long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b 1145 ld1 {v17.4s},[x3],#16 1146 add v16.4s,v16.4s,v4.4s 1147.long 0x5e2828a4 //sha256su0 v4.16b,v5.16b 1148 orr v2.16b,v0.16b,v0.16b 1149.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1150.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1151.long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b 1152 ld1 {v16.4s},[x3],#16 1153 add v17.4s,v17.4s,v5.4s 1154.long 0x5e2828c5 //sha256su0 v5.16b,v6.16b 1155 orr v2.16b,v0.16b,v0.16b 1156.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1157.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1158.long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b 1159 ld1 {v17.4s},[x3],#16 1160 add v16.4s,v16.4s,v6.4s 1161.long 0x5e2828e6 //sha256su0 v6.16b,v7.16b 1162 orr v2.16b,v0.16b,v0.16b 1163.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1164.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1165.long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b 1166 ld1 {v16.4s},[x3],#16 1167 add v17.4s,v17.4s,v7.4s 1168.long 0x5e282887 //sha256su0 v7.16b,v4.16b 1169 orr v2.16b,v0.16b,v0.16b 1170.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1171.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1172.long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b 1173 ld1 {v17.4s},[x3],#16 1174 add v16.4s,v16.4s,v4.4s 1175 orr v2.16b,v0.16b,v0.16b 1176.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1177.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1178 1179 ld1 {v16.4s},[x3],#16 1180 add v17.4s,v17.4s,v5.4s 1181 orr v2.16b,v0.16b,v0.16b 1182.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1183.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1184 1185 ld1 {v17.4s},[x3] 1186 add v16.4s,v16.4s,v6.4s 1187 sub x3,x3,#64*4-16 // rewind 1188 orr v2.16b,v0.16b,v0.16b 1189.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1190.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1191 1192 add v17.4s,v17.4s,v7.4s 1193 orr v2.16b,v0.16b,v0.16b 1194.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1195.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1196 1197 add v0.4s,v0.4s,v18.4s 1198 add v1.4s,v1.4s,v19.4s 1199 1200 cbnz x2,Loop_hw 1201 1202 st1 {v0.4s,v1.4s},[x0] 1203 1204 ldr x29,[sp],#16 1205 ret 1206 1207#endif 1208#endif // !OPENSSL_NO_ASM && defined(OPENSSL_AARCH64) && defined(_WIN32) 1209