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