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