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