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