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