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