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