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