1/* $FreeBSD$ */ 2/* Do not modify. This file is auto-generated from sha512-armv8.pl. */ 3// Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved. 4// 5// Licensed under the OpenSSL license (the "License"). You may not use 6// this file except in compliance with the License. You can obtain a copy 7// in the file LICENSE in the source distribution or at 8// https://www.openssl.org/source/license.html 9 10// ==================================================================== 11// Written by Andy Polyakov <appro@openssl.org> for the OpenSSL 12// project. The module is, however, dual licensed under OpenSSL and 13// CRYPTOGAMS licenses depending on where you obtain it. For further 14// details see http://www.openssl.org/~appro/cryptogams/. 15// 16// Permission to use under GPLv2 terms is granted. 17// ==================================================================== 18// 19// SHA256/512 for ARMv8. 20// 21// Performance in cycles per processed byte and improvement coefficient 22// over code generated with "default" compiler: 23// 24// SHA256-hw SHA256(*) SHA512 25// Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) 26// Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) 27// Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) 28// Denver 2.01 10.5 (+26%) 6.70 (+8%) 29// X-Gene 20.0 (+100%) 12.8 (+300%(***)) 30// Mongoose 2.36 13.0 (+50%) 8.36 (+33%) 31// Kryo 1.92 17.4 (+30%) 11.2 (+8%) 32// 33// (*) Software SHA256 results are of lesser relevance, presented 34// mostly for informational purposes. 35// (**) The result is a trade-off: it's possible to improve it by 36// 10% (or by 1 cycle per round), but at the cost of 20% loss 37// on Cortex-A53 (or by 4 cycles per round). 38// (***) Super-impressive coefficients over gcc-generated code are 39// indication of some compiler "pathology", most notably code 40// generated with -mgeneral-regs-only is significantly faster 41// and the gap is only 40-90%. 42// 43// October 2016. 44// 45// Originally it was reckoned that it makes no sense to implement NEON 46// version of SHA256 for 64-bit processors. This is because performance 47// improvement on most wide-spread Cortex-A5x processors was observed 48// to be marginal, same on Cortex-A53 and ~10% on A57. But then it was 49// observed that 32-bit NEON SHA256 performs significantly better than 50// 64-bit scalar version on *some* of the more recent processors. As 51// result 64-bit NEON version of SHA256 was added to provide best 52// all-round performance. For example it executes ~30% faster on X-Gene 53// and Mongoose. [For reference, NEON version of SHA512 is bound to 54// deliver much less improvement, likely *negative* on Cortex-A5x. 55// Which is why NEON support is limited to SHA256.] 56 57#ifndef __KERNEL__ 58# include "arm_arch.h" 59#endif 60 61.text 62 63 64.hidden OPENSSL_armcap_P 65.globl sha256_block_data_order 66.type sha256_block_data_order,%function 67.align 6 68sha256_block_data_order: 69#ifndef __KERNEL__ 70# ifdef __ILP32__ 71 ldrsw x16,.LOPENSSL_armcap_P 72# else 73 ldr x16,.LOPENSSL_armcap_P 74# endif 75 adr x17,.LOPENSSL_armcap_P 76 add x16,x16,x17 77 ldr w16,[x16] 78 tst w16,#ARMV8_SHA256 79 b.ne .Lv8_entry 80 tst w16,#ARMV7_NEON 81 b.ne .Lneon_entry 82#endif 83.inst 0xd503233f // paciasp 84 stp x29,x30,[sp,#-128]! 85 add x29,sp,#0 86 87 stp x19,x20,[sp,#16] 88 stp x21,x22,[sp,#32] 89 stp x23,x24,[sp,#48] 90 stp x25,x26,[sp,#64] 91 stp x27,x28,[sp,#80] 92 sub sp,sp,#4*4 93 94 ldp w20,w21,[x0] // load context 95 ldp w22,w23,[x0,#2*4] 96 ldp w24,w25,[x0,#4*4] 97 add x2,x1,x2,lsl#6 // end of input 98 ldp w26,w27,[x0,#6*4] 99 adr x30,.LK256 100 stp x0,x2,[x29,#96] 101 102.Loop: 103 ldp w3,w4,[x1],#2*4 104 ldr w19,[x30],#4 // *K++ 105 eor w28,w21,w22 // magic seed 106 str x1,[x29,#112] 107#ifndef __AARCH64EB__ 108 rev w3,w3 // 0 109#endif 110 ror w16,w24,#6 111 add w27,w27,w19 // h+=K[i] 112 eor w6,w24,w24,ror#14 113 and w17,w25,w24 114 bic w19,w26,w24 115 add w27,w27,w3 // h+=X[i] 116 orr w17,w17,w19 // Ch(e,f,g) 117 eor w19,w20,w21 // a^b, b^c in next round 118 eor w16,w16,w6,ror#11 // Sigma1(e) 119 ror w6,w20,#2 120 add w27,w27,w17 // h+=Ch(e,f,g) 121 eor w17,w20,w20,ror#9 122 add w27,w27,w16 // h+=Sigma1(e) 123 and w28,w28,w19 // (b^c)&=(a^b) 124 add w23,w23,w27 // d+=h 125 eor w28,w28,w21 // Maj(a,b,c) 126 eor w17,w6,w17,ror#13 // Sigma0(a) 127 add w27,w27,w28 // h+=Maj(a,b,c) 128 ldr w28,[x30],#4 // *K++, w19 in next round 129 //add w27,w27,w17 // h+=Sigma0(a) 130#ifndef __AARCH64EB__ 131 rev w4,w4 // 1 132#endif 133 ldp w5,w6,[x1],#2*4 134 add w27,w27,w17 // h+=Sigma0(a) 135 ror w16,w23,#6 136 add w26,w26,w28 // h+=K[i] 137 eor w7,w23,w23,ror#14 138 and w17,w24,w23 139 bic w28,w25,w23 140 add w26,w26,w4 // h+=X[i] 141 orr w17,w17,w28 // Ch(e,f,g) 142 eor w28,w27,w20 // a^b, b^c in next round 143 eor w16,w16,w7,ror#11 // Sigma1(e) 144 ror w7,w27,#2 145 add w26,w26,w17 // h+=Ch(e,f,g) 146 eor w17,w27,w27,ror#9 147 add w26,w26,w16 // h+=Sigma1(e) 148 and w19,w19,w28 // (b^c)&=(a^b) 149 add w22,w22,w26 // d+=h 150 eor w19,w19,w20 // Maj(a,b,c) 151 eor w17,w7,w17,ror#13 // Sigma0(a) 152 add w26,w26,w19 // h+=Maj(a,b,c) 153 ldr w19,[x30],#4 // *K++, w28 in next round 154 //add w26,w26,w17 // h+=Sigma0(a) 155#ifndef __AARCH64EB__ 156 rev w5,w5 // 2 157#endif 158 add w26,w26,w17 // h+=Sigma0(a) 159 ror w16,w22,#6 160 add w25,w25,w19 // h+=K[i] 161 eor w8,w22,w22,ror#14 162 and w17,w23,w22 163 bic w19,w24,w22 164 add w25,w25,w5 // h+=X[i] 165 orr w17,w17,w19 // Ch(e,f,g) 166 eor w19,w26,w27 // a^b, b^c in next round 167 eor w16,w16,w8,ror#11 // Sigma1(e) 168 ror w8,w26,#2 169 add w25,w25,w17 // h+=Ch(e,f,g) 170 eor w17,w26,w26,ror#9 171 add w25,w25,w16 // h+=Sigma1(e) 172 and w28,w28,w19 // (b^c)&=(a^b) 173 add w21,w21,w25 // d+=h 174 eor w28,w28,w27 // Maj(a,b,c) 175 eor w17,w8,w17,ror#13 // Sigma0(a) 176 add w25,w25,w28 // h+=Maj(a,b,c) 177 ldr w28,[x30],#4 // *K++, w19 in next round 178 //add w25,w25,w17 // h+=Sigma0(a) 179#ifndef __AARCH64EB__ 180 rev w6,w6 // 3 181#endif 182 ldp w7,w8,[x1],#2*4 183 add w25,w25,w17 // h+=Sigma0(a) 184 ror w16,w21,#6 185 add w24,w24,w28 // h+=K[i] 186 eor w9,w21,w21,ror#14 187 and w17,w22,w21 188 bic w28,w23,w21 189 add w24,w24,w6 // h+=X[i] 190 orr w17,w17,w28 // Ch(e,f,g) 191 eor w28,w25,w26 // a^b, b^c in next round 192 eor w16,w16,w9,ror#11 // Sigma1(e) 193 ror w9,w25,#2 194 add w24,w24,w17 // h+=Ch(e,f,g) 195 eor w17,w25,w25,ror#9 196 add w24,w24,w16 // h+=Sigma1(e) 197 and w19,w19,w28 // (b^c)&=(a^b) 198 add w20,w20,w24 // d+=h 199 eor w19,w19,w26 // Maj(a,b,c) 200 eor w17,w9,w17,ror#13 // Sigma0(a) 201 add w24,w24,w19 // h+=Maj(a,b,c) 202 ldr w19,[x30],#4 // *K++, w28 in next round 203 //add w24,w24,w17 // h+=Sigma0(a) 204#ifndef __AARCH64EB__ 205 rev w7,w7 // 4 206#endif 207 add w24,w24,w17 // h+=Sigma0(a) 208 ror w16,w20,#6 209 add w23,w23,w19 // h+=K[i] 210 eor w10,w20,w20,ror#14 211 and w17,w21,w20 212 bic w19,w22,w20 213 add w23,w23,w7 // h+=X[i] 214 orr w17,w17,w19 // Ch(e,f,g) 215 eor w19,w24,w25 // a^b, b^c in next round 216 eor w16,w16,w10,ror#11 // Sigma1(e) 217 ror w10,w24,#2 218 add w23,w23,w17 // h+=Ch(e,f,g) 219 eor w17,w24,w24,ror#9 220 add w23,w23,w16 // h+=Sigma1(e) 221 and w28,w28,w19 // (b^c)&=(a^b) 222 add w27,w27,w23 // d+=h 223 eor w28,w28,w25 // Maj(a,b,c) 224 eor w17,w10,w17,ror#13 // Sigma0(a) 225 add w23,w23,w28 // h+=Maj(a,b,c) 226 ldr w28,[x30],#4 // *K++, w19 in next round 227 //add w23,w23,w17 // h+=Sigma0(a) 228#ifndef __AARCH64EB__ 229 rev w8,w8 // 5 230#endif 231 ldp w9,w10,[x1],#2*4 232 add w23,w23,w17 // h+=Sigma0(a) 233 ror w16,w27,#6 234 add w22,w22,w28 // h+=K[i] 235 eor w11,w27,w27,ror#14 236 and w17,w20,w27 237 bic w28,w21,w27 238 add w22,w22,w8 // h+=X[i] 239 orr w17,w17,w28 // Ch(e,f,g) 240 eor w28,w23,w24 // a^b, b^c in next round 241 eor w16,w16,w11,ror#11 // Sigma1(e) 242 ror w11,w23,#2 243 add w22,w22,w17 // h+=Ch(e,f,g) 244 eor w17,w23,w23,ror#9 245 add w22,w22,w16 // h+=Sigma1(e) 246 and w19,w19,w28 // (b^c)&=(a^b) 247 add w26,w26,w22 // d+=h 248 eor w19,w19,w24 // Maj(a,b,c) 249 eor w17,w11,w17,ror#13 // Sigma0(a) 250 add w22,w22,w19 // h+=Maj(a,b,c) 251 ldr w19,[x30],#4 // *K++, w28 in next round 252 //add w22,w22,w17 // h+=Sigma0(a) 253#ifndef __AARCH64EB__ 254 rev w9,w9 // 6 255#endif 256 add w22,w22,w17 // h+=Sigma0(a) 257 ror w16,w26,#6 258 add w21,w21,w19 // h+=K[i] 259 eor w12,w26,w26,ror#14 260 and w17,w27,w26 261 bic w19,w20,w26 262 add w21,w21,w9 // h+=X[i] 263 orr w17,w17,w19 // Ch(e,f,g) 264 eor w19,w22,w23 // a^b, b^c in next round 265 eor w16,w16,w12,ror#11 // Sigma1(e) 266 ror w12,w22,#2 267 add w21,w21,w17 // h+=Ch(e,f,g) 268 eor w17,w22,w22,ror#9 269 add w21,w21,w16 // h+=Sigma1(e) 270 and w28,w28,w19 // (b^c)&=(a^b) 271 add w25,w25,w21 // d+=h 272 eor w28,w28,w23 // Maj(a,b,c) 273 eor w17,w12,w17,ror#13 // Sigma0(a) 274 add w21,w21,w28 // h+=Maj(a,b,c) 275 ldr w28,[x30],#4 // *K++, w19 in next round 276 //add w21,w21,w17 // h+=Sigma0(a) 277#ifndef __AARCH64EB__ 278 rev w10,w10 // 7 279#endif 280 ldp w11,w12,[x1],#2*4 281 add w21,w21,w17 // h+=Sigma0(a) 282 ror w16,w25,#6 283 add w20,w20,w28 // h+=K[i] 284 eor w13,w25,w25,ror#14 285 and w17,w26,w25 286 bic w28,w27,w25 287 add w20,w20,w10 // h+=X[i] 288 orr w17,w17,w28 // Ch(e,f,g) 289 eor w28,w21,w22 // a^b, b^c in next round 290 eor w16,w16,w13,ror#11 // Sigma1(e) 291 ror w13,w21,#2 292 add w20,w20,w17 // h+=Ch(e,f,g) 293 eor w17,w21,w21,ror#9 294 add w20,w20,w16 // h+=Sigma1(e) 295 and w19,w19,w28 // (b^c)&=(a^b) 296 add w24,w24,w20 // d+=h 297 eor w19,w19,w22 // Maj(a,b,c) 298 eor w17,w13,w17,ror#13 // Sigma0(a) 299 add w20,w20,w19 // h+=Maj(a,b,c) 300 ldr w19,[x30],#4 // *K++, w28 in next round 301 //add w20,w20,w17 // h+=Sigma0(a) 302#ifndef __AARCH64EB__ 303 rev w11,w11 // 8 304#endif 305 add w20,w20,w17 // h+=Sigma0(a) 306 ror w16,w24,#6 307 add w27,w27,w19 // h+=K[i] 308 eor w14,w24,w24,ror#14 309 and w17,w25,w24 310 bic w19,w26,w24 311 add w27,w27,w11 // h+=X[i] 312 orr w17,w17,w19 // Ch(e,f,g) 313 eor w19,w20,w21 // a^b, b^c in next round 314 eor w16,w16,w14,ror#11 // Sigma1(e) 315 ror w14,w20,#2 316 add w27,w27,w17 // h+=Ch(e,f,g) 317 eor w17,w20,w20,ror#9 318 add w27,w27,w16 // h+=Sigma1(e) 319 and w28,w28,w19 // (b^c)&=(a^b) 320 add w23,w23,w27 // d+=h 321 eor w28,w28,w21 // Maj(a,b,c) 322 eor w17,w14,w17,ror#13 // Sigma0(a) 323 add w27,w27,w28 // h+=Maj(a,b,c) 324 ldr w28,[x30],#4 // *K++, w19 in next round 325 //add w27,w27,w17 // h+=Sigma0(a) 326#ifndef __AARCH64EB__ 327 rev w12,w12 // 9 328#endif 329 ldp w13,w14,[x1],#2*4 330 add w27,w27,w17 // h+=Sigma0(a) 331 ror w16,w23,#6 332 add w26,w26,w28 // h+=K[i] 333 eor w15,w23,w23,ror#14 334 and w17,w24,w23 335 bic w28,w25,w23 336 add w26,w26,w12 // h+=X[i] 337 orr w17,w17,w28 // Ch(e,f,g) 338 eor w28,w27,w20 // a^b, b^c in next round 339 eor w16,w16,w15,ror#11 // Sigma1(e) 340 ror w15,w27,#2 341 add w26,w26,w17 // h+=Ch(e,f,g) 342 eor w17,w27,w27,ror#9 343 add w26,w26,w16 // h+=Sigma1(e) 344 and w19,w19,w28 // (b^c)&=(a^b) 345 add w22,w22,w26 // d+=h 346 eor w19,w19,w20 // Maj(a,b,c) 347 eor w17,w15,w17,ror#13 // Sigma0(a) 348 add w26,w26,w19 // h+=Maj(a,b,c) 349 ldr w19,[x30],#4 // *K++, w28 in next round 350 //add w26,w26,w17 // h+=Sigma0(a) 351#ifndef __AARCH64EB__ 352 rev w13,w13 // 10 353#endif 354 add w26,w26,w17 // h+=Sigma0(a) 355 ror w16,w22,#6 356 add w25,w25,w19 // h+=K[i] 357 eor w0,w22,w22,ror#14 358 and w17,w23,w22 359 bic w19,w24,w22 360 add w25,w25,w13 // h+=X[i] 361 orr w17,w17,w19 // Ch(e,f,g) 362 eor w19,w26,w27 // a^b, b^c in next round 363 eor w16,w16,w0,ror#11 // Sigma1(e) 364 ror w0,w26,#2 365 add w25,w25,w17 // h+=Ch(e,f,g) 366 eor w17,w26,w26,ror#9 367 add w25,w25,w16 // h+=Sigma1(e) 368 and w28,w28,w19 // (b^c)&=(a^b) 369 add w21,w21,w25 // d+=h 370 eor w28,w28,w27 // Maj(a,b,c) 371 eor w17,w0,w17,ror#13 // Sigma0(a) 372 add w25,w25,w28 // h+=Maj(a,b,c) 373 ldr w28,[x30],#4 // *K++, w19 in next round 374 //add w25,w25,w17 // h+=Sigma0(a) 375#ifndef __AARCH64EB__ 376 rev w14,w14 // 11 377#endif 378 ldp w15,w0,[x1],#2*4 379 add w25,w25,w17 // h+=Sigma0(a) 380 str w6,[sp,#12] 381 ror w16,w21,#6 382 add w24,w24,w28 // h+=K[i] 383 eor w6,w21,w21,ror#14 384 and w17,w22,w21 385 bic w28,w23,w21 386 add w24,w24,w14 // h+=X[i] 387 orr w17,w17,w28 // Ch(e,f,g) 388 eor w28,w25,w26 // a^b, b^c in next round 389 eor w16,w16,w6,ror#11 // Sigma1(e) 390 ror w6,w25,#2 391 add w24,w24,w17 // h+=Ch(e,f,g) 392 eor w17,w25,w25,ror#9 393 add w24,w24,w16 // h+=Sigma1(e) 394 and w19,w19,w28 // (b^c)&=(a^b) 395 add w20,w20,w24 // d+=h 396 eor w19,w19,w26 // Maj(a,b,c) 397 eor w17,w6,w17,ror#13 // Sigma0(a) 398 add w24,w24,w19 // h+=Maj(a,b,c) 399 ldr w19,[x30],#4 // *K++, w28 in next round 400 //add w24,w24,w17 // h+=Sigma0(a) 401#ifndef __AARCH64EB__ 402 rev w15,w15 // 12 403#endif 404 add w24,w24,w17 // h+=Sigma0(a) 405 str w7,[sp,#0] 406 ror w16,w20,#6 407 add w23,w23,w19 // h+=K[i] 408 eor w7,w20,w20,ror#14 409 and w17,w21,w20 410 bic w19,w22,w20 411 add w23,w23,w15 // h+=X[i] 412 orr w17,w17,w19 // Ch(e,f,g) 413 eor w19,w24,w25 // a^b, b^c in next round 414 eor w16,w16,w7,ror#11 // Sigma1(e) 415 ror w7,w24,#2 416 add w23,w23,w17 // h+=Ch(e,f,g) 417 eor w17,w24,w24,ror#9 418 add w23,w23,w16 // h+=Sigma1(e) 419 and w28,w28,w19 // (b^c)&=(a^b) 420 add w27,w27,w23 // d+=h 421 eor w28,w28,w25 // Maj(a,b,c) 422 eor w17,w7,w17,ror#13 // Sigma0(a) 423 add w23,w23,w28 // h+=Maj(a,b,c) 424 ldr w28,[x30],#4 // *K++, w19 in next round 425 //add w23,w23,w17 // h+=Sigma0(a) 426#ifndef __AARCH64EB__ 427 rev w0,w0 // 13 428#endif 429 ldp w1,w2,[x1] 430 add w23,w23,w17 // h+=Sigma0(a) 431 str w8,[sp,#4] 432 ror w16,w27,#6 433 add w22,w22,w28 // h+=K[i] 434 eor w8,w27,w27,ror#14 435 and w17,w20,w27 436 bic w28,w21,w27 437 add w22,w22,w0 // h+=X[i] 438 orr w17,w17,w28 // Ch(e,f,g) 439 eor w28,w23,w24 // a^b, b^c in next round 440 eor w16,w16,w8,ror#11 // Sigma1(e) 441 ror w8,w23,#2 442 add w22,w22,w17 // h+=Ch(e,f,g) 443 eor w17,w23,w23,ror#9 444 add w22,w22,w16 // h+=Sigma1(e) 445 and w19,w19,w28 // (b^c)&=(a^b) 446 add w26,w26,w22 // d+=h 447 eor w19,w19,w24 // Maj(a,b,c) 448 eor w17,w8,w17,ror#13 // Sigma0(a) 449 add w22,w22,w19 // h+=Maj(a,b,c) 450 ldr w19,[x30],#4 // *K++, w28 in next round 451 //add w22,w22,w17 // h+=Sigma0(a) 452#ifndef __AARCH64EB__ 453 rev w1,w1 // 14 454#endif 455 ldr w6,[sp,#12] 456 add w22,w22,w17 // h+=Sigma0(a) 457 str w9,[sp,#8] 458 ror w16,w26,#6 459 add w21,w21,w19 // h+=K[i] 460 eor w9,w26,w26,ror#14 461 and w17,w27,w26 462 bic w19,w20,w26 463 add w21,w21,w1 // h+=X[i] 464 orr w17,w17,w19 // Ch(e,f,g) 465 eor w19,w22,w23 // a^b, b^c in next round 466 eor w16,w16,w9,ror#11 // Sigma1(e) 467 ror w9,w22,#2 468 add w21,w21,w17 // h+=Ch(e,f,g) 469 eor w17,w22,w22,ror#9 470 add w21,w21,w16 // h+=Sigma1(e) 471 and w28,w28,w19 // (b^c)&=(a^b) 472 add w25,w25,w21 // d+=h 473 eor w28,w28,w23 // Maj(a,b,c) 474 eor w17,w9,w17,ror#13 // Sigma0(a) 475 add w21,w21,w28 // h+=Maj(a,b,c) 476 ldr w28,[x30],#4 // *K++, w19 in next round 477 //add w21,w21,w17 // h+=Sigma0(a) 478#ifndef __AARCH64EB__ 479 rev w2,w2 // 15 480#endif 481 ldr w7,[sp,#0] 482 add w21,w21,w17 // h+=Sigma0(a) 483 str w10,[sp,#12] 484 ror w16,w25,#6 485 add w20,w20,w28 // h+=K[i] 486 ror w9,w4,#7 487 and w17,w26,w25 488 ror w8,w1,#17 489 bic w28,w27,w25 490 ror w10,w21,#2 491 add w20,w20,w2 // h+=X[i] 492 eor w16,w16,w25,ror#11 493 eor w9,w9,w4,ror#18 494 orr w17,w17,w28 // Ch(e,f,g) 495 eor w28,w21,w22 // a^b, b^c in next round 496 eor w16,w16,w25,ror#25 // Sigma1(e) 497 eor w10,w10,w21,ror#13 498 add w20,w20,w17 // h+=Ch(e,f,g) 499 and w19,w19,w28 // (b^c)&=(a^b) 500 eor w8,w8,w1,ror#19 501 eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) 502 add w20,w20,w16 // h+=Sigma1(e) 503 eor w19,w19,w22 // Maj(a,b,c) 504 eor w17,w10,w21,ror#22 // Sigma0(a) 505 eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) 506 add w3,w3,w12 507 add w24,w24,w20 // d+=h 508 add w20,w20,w19 // h+=Maj(a,b,c) 509 ldr w19,[x30],#4 // *K++, w28 in next round 510 add w3,w3,w9 511 add w20,w20,w17 // h+=Sigma0(a) 512 add w3,w3,w8 513.Loop_16_xx: 514 ldr w8,[sp,#4] 515 str w11,[sp,#0] 516 ror w16,w24,#6 517 add w27,w27,w19 // h+=K[i] 518 ror w10,w5,#7 519 and w17,w25,w24 520 ror w9,w2,#17 521 bic w19,w26,w24 522 ror w11,w20,#2 523 add w27,w27,w3 // h+=X[i] 524 eor w16,w16,w24,ror#11 525 eor w10,w10,w5,ror#18 526 orr w17,w17,w19 // Ch(e,f,g) 527 eor w19,w20,w21 // a^b, b^c in next round 528 eor w16,w16,w24,ror#25 // Sigma1(e) 529 eor w11,w11,w20,ror#13 530 add w27,w27,w17 // h+=Ch(e,f,g) 531 and w28,w28,w19 // (b^c)&=(a^b) 532 eor w9,w9,w2,ror#19 533 eor w10,w10,w5,lsr#3 // sigma0(X[i+1]) 534 add w27,w27,w16 // h+=Sigma1(e) 535 eor w28,w28,w21 // Maj(a,b,c) 536 eor w17,w11,w20,ror#22 // Sigma0(a) 537 eor w9,w9,w2,lsr#10 // sigma1(X[i+14]) 538 add w4,w4,w13 539 add w23,w23,w27 // d+=h 540 add w27,w27,w28 // h+=Maj(a,b,c) 541 ldr w28,[x30],#4 // *K++, w19 in next round 542 add w4,w4,w10 543 add w27,w27,w17 // h+=Sigma0(a) 544 add w4,w4,w9 545 ldr w9,[sp,#8] 546 str w12,[sp,#4] 547 ror w16,w23,#6 548 add w26,w26,w28 // h+=K[i] 549 ror w11,w6,#7 550 and w17,w24,w23 551 ror w10,w3,#17 552 bic w28,w25,w23 553 ror w12,w27,#2 554 add w26,w26,w4 // h+=X[i] 555 eor w16,w16,w23,ror#11 556 eor w11,w11,w6,ror#18 557 orr w17,w17,w28 // Ch(e,f,g) 558 eor w28,w27,w20 // a^b, b^c in next round 559 eor w16,w16,w23,ror#25 // Sigma1(e) 560 eor w12,w12,w27,ror#13 561 add w26,w26,w17 // h+=Ch(e,f,g) 562 and w19,w19,w28 // (b^c)&=(a^b) 563 eor w10,w10,w3,ror#19 564 eor w11,w11,w6,lsr#3 // sigma0(X[i+1]) 565 add w26,w26,w16 // h+=Sigma1(e) 566 eor w19,w19,w20 // Maj(a,b,c) 567 eor w17,w12,w27,ror#22 // Sigma0(a) 568 eor w10,w10,w3,lsr#10 // sigma1(X[i+14]) 569 add w5,w5,w14 570 add w22,w22,w26 // d+=h 571 add w26,w26,w19 // h+=Maj(a,b,c) 572 ldr w19,[x30],#4 // *K++, w28 in next round 573 add w5,w5,w11 574 add w26,w26,w17 // h+=Sigma0(a) 575 add w5,w5,w10 576 ldr w10,[sp,#12] 577 str w13,[sp,#8] 578 ror w16,w22,#6 579 add w25,w25,w19 // h+=K[i] 580 ror w12,w7,#7 581 and w17,w23,w22 582 ror w11,w4,#17 583 bic w19,w24,w22 584 ror w13,w26,#2 585 add w25,w25,w5 // h+=X[i] 586 eor w16,w16,w22,ror#11 587 eor w12,w12,w7,ror#18 588 orr w17,w17,w19 // Ch(e,f,g) 589 eor w19,w26,w27 // a^b, b^c in next round 590 eor w16,w16,w22,ror#25 // Sigma1(e) 591 eor w13,w13,w26,ror#13 592 add w25,w25,w17 // h+=Ch(e,f,g) 593 and w28,w28,w19 // (b^c)&=(a^b) 594 eor w11,w11,w4,ror#19 595 eor w12,w12,w7,lsr#3 // sigma0(X[i+1]) 596 add w25,w25,w16 // h+=Sigma1(e) 597 eor w28,w28,w27 // Maj(a,b,c) 598 eor w17,w13,w26,ror#22 // Sigma0(a) 599 eor w11,w11,w4,lsr#10 // sigma1(X[i+14]) 600 add w6,w6,w15 601 add w21,w21,w25 // d+=h 602 add w25,w25,w28 // h+=Maj(a,b,c) 603 ldr w28,[x30],#4 // *K++, w19 in next round 604 add w6,w6,w12 605 add w25,w25,w17 // h+=Sigma0(a) 606 add w6,w6,w11 607 ldr w11,[sp,#0] 608 str w14,[sp,#12] 609 ror w16,w21,#6 610 add w24,w24,w28 // h+=K[i] 611 ror w13,w8,#7 612 and w17,w22,w21 613 ror w12,w5,#17 614 bic w28,w23,w21 615 ror w14,w25,#2 616 add w24,w24,w6 // h+=X[i] 617 eor w16,w16,w21,ror#11 618 eor w13,w13,w8,ror#18 619 orr w17,w17,w28 // Ch(e,f,g) 620 eor w28,w25,w26 // a^b, b^c in next round 621 eor w16,w16,w21,ror#25 // Sigma1(e) 622 eor w14,w14,w25,ror#13 623 add w24,w24,w17 // h+=Ch(e,f,g) 624 and w19,w19,w28 // (b^c)&=(a^b) 625 eor w12,w12,w5,ror#19 626 eor w13,w13,w8,lsr#3 // sigma0(X[i+1]) 627 add w24,w24,w16 // h+=Sigma1(e) 628 eor w19,w19,w26 // Maj(a,b,c) 629 eor w17,w14,w25,ror#22 // Sigma0(a) 630 eor w12,w12,w5,lsr#10 // sigma1(X[i+14]) 631 add w7,w7,w0 632 add w20,w20,w24 // d+=h 633 add w24,w24,w19 // h+=Maj(a,b,c) 634 ldr w19,[x30],#4 // *K++, w28 in next round 635 add w7,w7,w13 636 add w24,w24,w17 // h+=Sigma0(a) 637 add w7,w7,w12 638 ldr w12,[sp,#4] 639 str w15,[sp,#0] 640 ror w16,w20,#6 641 add w23,w23,w19 // h+=K[i] 642 ror w14,w9,#7 643 and w17,w21,w20 644 ror w13,w6,#17 645 bic w19,w22,w20 646 ror w15,w24,#2 647 add w23,w23,w7 // h+=X[i] 648 eor w16,w16,w20,ror#11 649 eor w14,w14,w9,ror#18 650 orr w17,w17,w19 // Ch(e,f,g) 651 eor w19,w24,w25 // a^b, b^c in next round 652 eor w16,w16,w20,ror#25 // Sigma1(e) 653 eor w15,w15,w24,ror#13 654 add w23,w23,w17 // h+=Ch(e,f,g) 655 and w28,w28,w19 // (b^c)&=(a^b) 656 eor w13,w13,w6,ror#19 657 eor w14,w14,w9,lsr#3 // sigma0(X[i+1]) 658 add w23,w23,w16 // h+=Sigma1(e) 659 eor w28,w28,w25 // Maj(a,b,c) 660 eor w17,w15,w24,ror#22 // Sigma0(a) 661 eor w13,w13,w6,lsr#10 // sigma1(X[i+14]) 662 add w8,w8,w1 663 add w27,w27,w23 // d+=h 664 add w23,w23,w28 // h+=Maj(a,b,c) 665 ldr w28,[x30],#4 // *K++, w19 in next round 666 add w8,w8,w14 667 add w23,w23,w17 // h+=Sigma0(a) 668 add w8,w8,w13 669 ldr w13,[sp,#8] 670 str w0,[sp,#4] 671 ror w16,w27,#6 672 add w22,w22,w28 // h+=K[i] 673 ror w15,w10,#7 674 and w17,w20,w27 675 ror w14,w7,#17 676 bic w28,w21,w27 677 ror w0,w23,#2 678 add w22,w22,w8 // h+=X[i] 679 eor w16,w16,w27,ror#11 680 eor w15,w15,w10,ror#18 681 orr w17,w17,w28 // Ch(e,f,g) 682 eor w28,w23,w24 // a^b, b^c in next round 683 eor w16,w16,w27,ror#25 // Sigma1(e) 684 eor w0,w0,w23,ror#13 685 add w22,w22,w17 // h+=Ch(e,f,g) 686 and w19,w19,w28 // (b^c)&=(a^b) 687 eor w14,w14,w7,ror#19 688 eor w15,w15,w10,lsr#3 // sigma0(X[i+1]) 689 add w22,w22,w16 // h+=Sigma1(e) 690 eor w19,w19,w24 // Maj(a,b,c) 691 eor w17,w0,w23,ror#22 // Sigma0(a) 692 eor w14,w14,w7,lsr#10 // sigma1(X[i+14]) 693 add w9,w9,w2 694 add w26,w26,w22 // d+=h 695 add w22,w22,w19 // h+=Maj(a,b,c) 696 ldr w19,[x30],#4 // *K++, w28 in next round 697 add w9,w9,w15 698 add w22,w22,w17 // h+=Sigma0(a) 699 add w9,w9,w14 700 ldr w14,[sp,#12] 701 str w1,[sp,#8] 702 ror w16,w26,#6 703 add w21,w21,w19 // h+=K[i] 704 ror w0,w11,#7 705 and w17,w27,w26 706 ror w15,w8,#17 707 bic w19,w20,w26 708 ror w1,w22,#2 709 add w21,w21,w9 // h+=X[i] 710 eor w16,w16,w26,ror#11 711 eor w0,w0,w11,ror#18 712 orr w17,w17,w19 // Ch(e,f,g) 713 eor w19,w22,w23 // a^b, b^c in next round 714 eor w16,w16,w26,ror#25 // Sigma1(e) 715 eor w1,w1,w22,ror#13 716 add w21,w21,w17 // h+=Ch(e,f,g) 717 and w28,w28,w19 // (b^c)&=(a^b) 718 eor w15,w15,w8,ror#19 719 eor w0,w0,w11,lsr#3 // sigma0(X[i+1]) 720 add w21,w21,w16 // h+=Sigma1(e) 721 eor w28,w28,w23 // Maj(a,b,c) 722 eor w17,w1,w22,ror#22 // Sigma0(a) 723 eor w15,w15,w8,lsr#10 // sigma1(X[i+14]) 724 add w10,w10,w3 725 add w25,w25,w21 // d+=h 726 add w21,w21,w28 // h+=Maj(a,b,c) 727 ldr w28,[x30],#4 // *K++, w19 in next round 728 add w10,w10,w0 729 add w21,w21,w17 // h+=Sigma0(a) 730 add w10,w10,w15 731 ldr w15,[sp,#0] 732 str w2,[sp,#12] 733 ror w16,w25,#6 734 add w20,w20,w28 // h+=K[i] 735 ror w1,w12,#7 736 and w17,w26,w25 737 ror w0,w9,#17 738 bic w28,w27,w25 739 ror w2,w21,#2 740 add w20,w20,w10 // h+=X[i] 741 eor w16,w16,w25,ror#11 742 eor w1,w1,w12,ror#18 743 orr w17,w17,w28 // Ch(e,f,g) 744 eor w28,w21,w22 // a^b, b^c in next round 745 eor w16,w16,w25,ror#25 // Sigma1(e) 746 eor w2,w2,w21,ror#13 747 add w20,w20,w17 // h+=Ch(e,f,g) 748 and w19,w19,w28 // (b^c)&=(a^b) 749 eor w0,w0,w9,ror#19 750 eor w1,w1,w12,lsr#3 // sigma0(X[i+1]) 751 add w20,w20,w16 // h+=Sigma1(e) 752 eor w19,w19,w22 // Maj(a,b,c) 753 eor w17,w2,w21,ror#22 // Sigma0(a) 754 eor w0,w0,w9,lsr#10 // sigma1(X[i+14]) 755 add w11,w11,w4 756 add w24,w24,w20 // d+=h 757 add w20,w20,w19 // h+=Maj(a,b,c) 758 ldr w19,[x30],#4 // *K++, w28 in next round 759 add w11,w11,w1 760 add w20,w20,w17 // h+=Sigma0(a) 761 add w11,w11,w0 762 ldr w0,[sp,#4] 763 str w3,[sp,#0] 764 ror w16,w24,#6 765 add w27,w27,w19 // h+=K[i] 766 ror w2,w13,#7 767 and w17,w25,w24 768 ror w1,w10,#17 769 bic w19,w26,w24 770 ror w3,w20,#2 771 add w27,w27,w11 // h+=X[i] 772 eor w16,w16,w24,ror#11 773 eor w2,w2,w13,ror#18 774 orr w17,w17,w19 // Ch(e,f,g) 775 eor w19,w20,w21 // a^b, b^c in next round 776 eor w16,w16,w24,ror#25 // Sigma1(e) 777 eor w3,w3,w20,ror#13 778 add w27,w27,w17 // h+=Ch(e,f,g) 779 and w28,w28,w19 // (b^c)&=(a^b) 780 eor w1,w1,w10,ror#19 781 eor w2,w2,w13,lsr#3 // sigma0(X[i+1]) 782 add w27,w27,w16 // h+=Sigma1(e) 783 eor w28,w28,w21 // Maj(a,b,c) 784 eor w17,w3,w20,ror#22 // Sigma0(a) 785 eor w1,w1,w10,lsr#10 // sigma1(X[i+14]) 786 add w12,w12,w5 787 add w23,w23,w27 // d+=h 788 add w27,w27,w28 // h+=Maj(a,b,c) 789 ldr w28,[x30],#4 // *K++, w19 in next round 790 add w12,w12,w2 791 add w27,w27,w17 // h+=Sigma0(a) 792 add w12,w12,w1 793 ldr w1,[sp,#8] 794 str w4,[sp,#4] 795 ror w16,w23,#6 796 add w26,w26,w28 // h+=K[i] 797 ror w3,w14,#7 798 and w17,w24,w23 799 ror w2,w11,#17 800 bic w28,w25,w23 801 ror w4,w27,#2 802 add w26,w26,w12 // h+=X[i] 803 eor w16,w16,w23,ror#11 804 eor w3,w3,w14,ror#18 805 orr w17,w17,w28 // Ch(e,f,g) 806 eor w28,w27,w20 // a^b, b^c in next round 807 eor w16,w16,w23,ror#25 // Sigma1(e) 808 eor w4,w4,w27,ror#13 809 add w26,w26,w17 // h+=Ch(e,f,g) 810 and w19,w19,w28 // (b^c)&=(a^b) 811 eor w2,w2,w11,ror#19 812 eor w3,w3,w14,lsr#3 // sigma0(X[i+1]) 813 add w26,w26,w16 // h+=Sigma1(e) 814 eor w19,w19,w20 // Maj(a,b,c) 815 eor w17,w4,w27,ror#22 // Sigma0(a) 816 eor w2,w2,w11,lsr#10 // sigma1(X[i+14]) 817 add w13,w13,w6 818 add w22,w22,w26 // d+=h 819 add w26,w26,w19 // h+=Maj(a,b,c) 820 ldr w19,[x30],#4 // *K++, w28 in next round 821 add w13,w13,w3 822 add w26,w26,w17 // h+=Sigma0(a) 823 add w13,w13,w2 824 ldr w2,[sp,#12] 825 str w5,[sp,#8] 826 ror w16,w22,#6 827 add w25,w25,w19 // h+=K[i] 828 ror w4,w15,#7 829 and w17,w23,w22 830 ror w3,w12,#17 831 bic w19,w24,w22 832 ror w5,w26,#2 833 add w25,w25,w13 // h+=X[i] 834 eor w16,w16,w22,ror#11 835 eor w4,w4,w15,ror#18 836 orr w17,w17,w19 // Ch(e,f,g) 837 eor w19,w26,w27 // a^b, b^c in next round 838 eor w16,w16,w22,ror#25 // Sigma1(e) 839 eor w5,w5,w26,ror#13 840 add w25,w25,w17 // h+=Ch(e,f,g) 841 and w28,w28,w19 // (b^c)&=(a^b) 842 eor w3,w3,w12,ror#19 843 eor w4,w4,w15,lsr#3 // sigma0(X[i+1]) 844 add w25,w25,w16 // h+=Sigma1(e) 845 eor w28,w28,w27 // Maj(a,b,c) 846 eor w17,w5,w26,ror#22 // Sigma0(a) 847 eor w3,w3,w12,lsr#10 // sigma1(X[i+14]) 848 add w14,w14,w7 849 add w21,w21,w25 // d+=h 850 add w25,w25,w28 // h+=Maj(a,b,c) 851 ldr w28,[x30],#4 // *K++, w19 in next round 852 add w14,w14,w4 853 add w25,w25,w17 // h+=Sigma0(a) 854 add w14,w14,w3 855 ldr w3,[sp,#0] 856 str w6,[sp,#12] 857 ror w16,w21,#6 858 add w24,w24,w28 // h+=K[i] 859 ror w5,w0,#7 860 and w17,w22,w21 861 ror w4,w13,#17 862 bic w28,w23,w21 863 ror w6,w25,#2 864 add w24,w24,w14 // h+=X[i] 865 eor w16,w16,w21,ror#11 866 eor w5,w5,w0,ror#18 867 orr w17,w17,w28 // Ch(e,f,g) 868 eor w28,w25,w26 // a^b, b^c in next round 869 eor w16,w16,w21,ror#25 // Sigma1(e) 870 eor w6,w6,w25,ror#13 871 add w24,w24,w17 // h+=Ch(e,f,g) 872 and w19,w19,w28 // (b^c)&=(a^b) 873 eor w4,w4,w13,ror#19 874 eor w5,w5,w0,lsr#3 // sigma0(X[i+1]) 875 add w24,w24,w16 // h+=Sigma1(e) 876 eor w19,w19,w26 // Maj(a,b,c) 877 eor w17,w6,w25,ror#22 // Sigma0(a) 878 eor w4,w4,w13,lsr#10 // sigma1(X[i+14]) 879 add w15,w15,w8 880 add w20,w20,w24 // d+=h 881 add w24,w24,w19 // h+=Maj(a,b,c) 882 ldr w19,[x30],#4 // *K++, w28 in next round 883 add w15,w15,w5 884 add w24,w24,w17 // h+=Sigma0(a) 885 add w15,w15,w4 886 ldr w4,[sp,#4] 887 str w7,[sp,#0] 888 ror w16,w20,#6 889 add w23,w23,w19 // h+=K[i] 890 ror w6,w1,#7 891 and w17,w21,w20 892 ror w5,w14,#17 893 bic w19,w22,w20 894 ror w7,w24,#2 895 add w23,w23,w15 // h+=X[i] 896 eor w16,w16,w20,ror#11 897 eor w6,w6,w1,ror#18 898 orr w17,w17,w19 // Ch(e,f,g) 899 eor w19,w24,w25 // a^b, b^c in next round 900 eor w16,w16,w20,ror#25 // Sigma1(e) 901 eor w7,w7,w24,ror#13 902 add w23,w23,w17 // h+=Ch(e,f,g) 903 and w28,w28,w19 // (b^c)&=(a^b) 904 eor w5,w5,w14,ror#19 905 eor w6,w6,w1,lsr#3 // sigma0(X[i+1]) 906 add w23,w23,w16 // h+=Sigma1(e) 907 eor w28,w28,w25 // Maj(a,b,c) 908 eor w17,w7,w24,ror#22 // Sigma0(a) 909 eor w5,w5,w14,lsr#10 // sigma1(X[i+14]) 910 add w0,w0,w9 911 add w27,w27,w23 // d+=h 912 add w23,w23,w28 // h+=Maj(a,b,c) 913 ldr w28,[x30],#4 // *K++, w19 in next round 914 add w0,w0,w6 915 add w23,w23,w17 // h+=Sigma0(a) 916 add w0,w0,w5 917 ldr w5,[sp,#8] 918 str w8,[sp,#4] 919 ror w16,w27,#6 920 add w22,w22,w28 // h+=K[i] 921 ror w7,w2,#7 922 and w17,w20,w27 923 ror w6,w15,#17 924 bic w28,w21,w27 925 ror w8,w23,#2 926 add w22,w22,w0 // h+=X[i] 927 eor w16,w16,w27,ror#11 928 eor w7,w7,w2,ror#18 929 orr w17,w17,w28 // Ch(e,f,g) 930 eor w28,w23,w24 // a^b, b^c in next round 931 eor w16,w16,w27,ror#25 // Sigma1(e) 932 eor w8,w8,w23,ror#13 933 add w22,w22,w17 // h+=Ch(e,f,g) 934 and w19,w19,w28 // (b^c)&=(a^b) 935 eor w6,w6,w15,ror#19 936 eor w7,w7,w2,lsr#3 // sigma0(X[i+1]) 937 add w22,w22,w16 // h+=Sigma1(e) 938 eor w19,w19,w24 // Maj(a,b,c) 939 eor w17,w8,w23,ror#22 // Sigma0(a) 940 eor w6,w6,w15,lsr#10 // sigma1(X[i+14]) 941 add w1,w1,w10 942 add w26,w26,w22 // d+=h 943 add w22,w22,w19 // h+=Maj(a,b,c) 944 ldr w19,[x30],#4 // *K++, w28 in next round 945 add w1,w1,w7 946 add w22,w22,w17 // h+=Sigma0(a) 947 add w1,w1,w6 948 ldr w6,[sp,#12] 949 str w9,[sp,#8] 950 ror w16,w26,#6 951 add w21,w21,w19 // h+=K[i] 952 ror w8,w3,#7 953 and w17,w27,w26 954 ror w7,w0,#17 955 bic w19,w20,w26 956 ror w9,w22,#2 957 add w21,w21,w1 // h+=X[i] 958 eor w16,w16,w26,ror#11 959 eor w8,w8,w3,ror#18 960 orr w17,w17,w19 // Ch(e,f,g) 961 eor w19,w22,w23 // a^b, b^c in next round 962 eor w16,w16,w26,ror#25 // Sigma1(e) 963 eor w9,w9,w22,ror#13 964 add w21,w21,w17 // h+=Ch(e,f,g) 965 and w28,w28,w19 // (b^c)&=(a^b) 966 eor w7,w7,w0,ror#19 967 eor w8,w8,w3,lsr#3 // sigma0(X[i+1]) 968 add w21,w21,w16 // h+=Sigma1(e) 969 eor w28,w28,w23 // Maj(a,b,c) 970 eor w17,w9,w22,ror#22 // Sigma0(a) 971 eor w7,w7,w0,lsr#10 // sigma1(X[i+14]) 972 add w2,w2,w11 973 add w25,w25,w21 // d+=h 974 add w21,w21,w28 // h+=Maj(a,b,c) 975 ldr w28,[x30],#4 // *K++, w19 in next round 976 add w2,w2,w8 977 add w21,w21,w17 // h+=Sigma0(a) 978 add w2,w2,w7 979 ldr w7,[sp,#0] 980 str w10,[sp,#12] 981 ror w16,w25,#6 982 add w20,w20,w28 // h+=K[i] 983 ror w9,w4,#7 984 and w17,w26,w25 985 ror w8,w1,#17 986 bic w28,w27,w25 987 ror w10,w21,#2 988 add w20,w20,w2 // h+=X[i] 989 eor w16,w16,w25,ror#11 990 eor w9,w9,w4,ror#18 991 orr w17,w17,w28 // Ch(e,f,g) 992 eor w28,w21,w22 // a^b, b^c in next round 993 eor w16,w16,w25,ror#25 // Sigma1(e) 994 eor w10,w10,w21,ror#13 995 add w20,w20,w17 // h+=Ch(e,f,g) 996 and w19,w19,w28 // (b^c)&=(a^b) 997 eor w8,w8,w1,ror#19 998 eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) 999 add w20,w20,w16 // h+=Sigma1(e) 1000 eor w19,w19,w22 // Maj(a,b,c) 1001 eor w17,w10,w21,ror#22 // Sigma0(a) 1002 eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) 1003 add w3,w3,w12 1004 add w24,w24,w20 // d+=h 1005 add w20,w20,w19 // h+=Maj(a,b,c) 1006 ldr w19,[x30],#4 // *K++, w28 in next round 1007 add w3,w3,w9 1008 add w20,w20,w17 // h+=Sigma0(a) 1009 add w3,w3,w8 1010 cbnz w19,.Loop_16_xx 1011 1012 ldp x0,x2,[x29,#96] 1013 ldr x1,[x29,#112] 1014 sub x30,x30,#260 // rewind 1015 1016 ldp w3,w4,[x0] 1017 ldp w5,w6,[x0,#2*4] 1018 add x1,x1,#14*4 // advance input pointer 1019 ldp w7,w8,[x0,#4*4] 1020 add w20,w20,w3 1021 ldp w9,w10,[x0,#6*4] 1022 add w21,w21,w4 1023 add w22,w22,w5 1024 add w23,w23,w6 1025 stp w20,w21,[x0] 1026 add w24,w24,w7 1027 add w25,w25,w8 1028 stp w22,w23,[x0,#2*4] 1029 add w26,w26,w9 1030 add w27,w27,w10 1031 cmp x1,x2 1032 stp w24,w25,[x0,#4*4] 1033 stp w26,w27,[x0,#6*4] 1034 b.ne .Loop 1035 1036 ldp x19,x20,[x29,#16] 1037 add sp,sp,#4*4 1038 ldp x21,x22,[x29,#32] 1039 ldp x23,x24,[x29,#48] 1040 ldp x25,x26,[x29,#64] 1041 ldp x27,x28,[x29,#80] 1042 ldp x29,x30,[sp],#128 1043.inst 0xd50323bf // autiasp 1044 ret 1045.size sha256_block_data_order,.-sha256_block_data_order 1046 1047.align 6 1048.type .LK256,%object 1049.LK256: 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.size .LK256,.-.LK256 1068#ifndef __KERNEL__ 1069.align 3 1070.LOPENSSL_armcap_P: 1071# ifdef __ILP32__ 1072.long OPENSSL_armcap_P-. 1073# else 1074.quad OPENSSL_armcap_P-. 1075# endif 1076#endif 1077.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 1078.align 2 1079.align 2 1080#ifndef __KERNEL__ 1081.type sha256_block_armv8,%function 1082.align 6 1083sha256_block_armv8: 1084.Lv8_entry: 1085 stp x29,x30,[sp,#-16]! 1086 add x29,sp,#0 1087 1088 ld1 {v0.4s,v1.4s},[x0] 1089 adr x3,.LK256 1090 1091.Loop_hw: 1092 ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 1093 sub x2,x2,#1 1094 ld1 {v16.4s},[x3],#16 1095 rev32 v4.16b,v4.16b 1096 rev32 v5.16b,v5.16b 1097 rev32 v6.16b,v6.16b 1098 rev32 v7.16b,v7.16b 1099 orr v18.16b,v0.16b,v0.16b // offload 1100 orr v19.16b,v1.16b,v1.16b 1101 ld1 {v17.4s},[x3],#16 1102 add v16.4s,v16.4s,v4.4s 1103.inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b 1104 orr v2.16b,v0.16b,v0.16b 1105.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1106.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1107.inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b 1108 ld1 {v16.4s},[x3],#16 1109 add v17.4s,v17.4s,v5.4s 1110.inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b 1111 orr v2.16b,v0.16b,v0.16b 1112.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1113.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1114.inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b 1115 ld1 {v17.4s},[x3],#16 1116 add v16.4s,v16.4s,v6.4s 1117.inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b 1118 orr v2.16b,v0.16b,v0.16b 1119.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1120.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1121.inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b 1122 ld1 {v16.4s},[x3],#16 1123 add v17.4s,v17.4s,v7.4s 1124.inst 0x5e282887 //sha256su0 v7.16b,v4.16b 1125 orr v2.16b,v0.16b,v0.16b 1126.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1127.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1128.inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b 1129 ld1 {v17.4s},[x3],#16 1130 add v16.4s,v16.4s,v4.4s 1131.inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b 1132 orr v2.16b,v0.16b,v0.16b 1133.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1134.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1135.inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b 1136 ld1 {v16.4s},[x3],#16 1137 add v17.4s,v17.4s,v5.4s 1138.inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b 1139 orr v2.16b,v0.16b,v0.16b 1140.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1141.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1142.inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b 1143 ld1 {v17.4s},[x3],#16 1144 add v16.4s,v16.4s,v6.4s 1145.inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b 1146 orr v2.16b,v0.16b,v0.16b 1147.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1148.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1149.inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b 1150 ld1 {v16.4s},[x3],#16 1151 add v17.4s,v17.4s,v7.4s 1152.inst 0x5e282887 //sha256su0 v7.16b,v4.16b 1153 orr v2.16b,v0.16b,v0.16b 1154.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1155.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1156.inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b 1157 ld1 {v17.4s},[x3],#16 1158 add v16.4s,v16.4s,v4.4s 1159.inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b 1160 orr v2.16b,v0.16b,v0.16b 1161.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1162.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1163.inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b 1164 ld1 {v16.4s},[x3],#16 1165 add v17.4s,v17.4s,v5.4s 1166.inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b 1167 orr v2.16b,v0.16b,v0.16b 1168.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1169.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1170.inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b 1171 ld1 {v17.4s},[x3],#16 1172 add v16.4s,v16.4s,v6.4s 1173.inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b 1174 orr v2.16b,v0.16b,v0.16b 1175.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1176.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1177.inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b 1178 ld1 {v16.4s},[x3],#16 1179 add v17.4s,v17.4s,v7.4s 1180.inst 0x5e282887 //sha256su0 v7.16b,v4.16b 1181 orr v2.16b,v0.16b,v0.16b 1182.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1183.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1184.inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b 1185 ld1 {v17.4s},[x3],#16 1186 add v16.4s,v16.4s,v4.4s 1187 orr v2.16b,v0.16b,v0.16b 1188.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1189.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1190 1191 ld1 {v16.4s},[x3],#16 1192 add v17.4s,v17.4s,v5.4s 1193 orr v2.16b,v0.16b,v0.16b 1194.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1195.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1196 1197 ld1 {v17.4s},[x3] 1198 add v16.4s,v16.4s,v6.4s 1199 sub x3,x3,#64*4-16 // rewind 1200 orr v2.16b,v0.16b,v0.16b 1201.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1202.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1203 1204 add v17.4s,v17.4s,v7.4s 1205 orr v2.16b,v0.16b,v0.16b 1206.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1207.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1208 1209 add v0.4s,v0.4s,v18.4s 1210 add v1.4s,v1.4s,v19.4s 1211 1212 cbnz x2,.Loop_hw 1213 1214 st1 {v0.4s,v1.4s},[x0] 1215 1216 ldr x29,[sp],#16 1217 ret 1218.size sha256_block_armv8,.-sha256_block_armv8 1219#endif 1220#ifdef __KERNEL__ 1221.globl sha256_block_neon 1222#endif 1223.type sha256_block_neon,%function 1224.align 4 1225sha256_block_neon: 1226.Lneon_entry: 1227 stp x29, x30, [sp, #-16]! 1228 mov x29, sp 1229 sub sp,sp,#16*4 1230 1231 adr x16,.LK256 1232 add x2,x1,x2,lsl#6 // len to point at the end of inp 1233 1234 ld1 {v0.16b},[x1], #16 1235 ld1 {v1.16b},[x1], #16 1236 ld1 {v2.16b},[x1], #16 1237 ld1 {v3.16b},[x1], #16 1238 ld1 {v4.4s},[x16], #16 1239 ld1 {v5.4s},[x16], #16 1240 ld1 {v6.4s},[x16], #16 1241 ld1 {v7.4s},[x16], #16 1242 rev32 v0.16b,v0.16b // yes, even on 1243 rev32 v1.16b,v1.16b // big-endian 1244 rev32 v2.16b,v2.16b 1245 rev32 v3.16b,v3.16b 1246 mov x17,sp 1247 add v4.4s,v4.4s,v0.4s 1248 add v5.4s,v5.4s,v1.4s 1249 add v6.4s,v6.4s,v2.4s 1250 st1 {v4.4s,v5.4s},[x17], #32 1251 add v7.4s,v7.4s,v3.4s 1252 st1 {v6.4s,v7.4s},[x17] 1253 sub x17,x17,#32 1254 1255 ldp w3,w4,[x0] 1256 ldp w5,w6,[x0,#8] 1257 ldp w7,w8,[x0,#16] 1258 ldp w9,w10,[x0,#24] 1259 ldr w12,[sp,#0] 1260 mov w13,wzr 1261 eor w14,w4,w5 1262 mov w15,wzr 1263 b .L_00_48 1264 1265.align 4 1266.L_00_48: 1267 ext v4.16b,v0.16b,v1.16b,#4 1268 add w10,w10,w12 1269 add w3,w3,w15 1270 and w12,w8,w7 1271 bic w15,w9,w7 1272 ext v7.16b,v2.16b,v3.16b,#4 1273 eor w11,w7,w7,ror#5 1274 add w3,w3,w13 1275 mov d19,v3.d[1] 1276 orr w12,w12,w15 1277 eor w11,w11,w7,ror#19 1278 ushr v6.4s,v4.4s,#7 1279 eor w15,w3,w3,ror#11 1280 ushr v5.4s,v4.4s,#3 1281 add w10,w10,w12 1282 add v0.4s,v0.4s,v7.4s 1283 ror w11,w11,#6 1284 sli v6.4s,v4.4s,#25 1285 eor w13,w3,w4 1286 eor w15,w15,w3,ror#20 1287 ushr v7.4s,v4.4s,#18 1288 add w10,w10,w11 1289 ldr w12,[sp,#4] 1290 and w14,w14,w13 1291 eor v5.16b,v5.16b,v6.16b 1292 ror w15,w15,#2 1293 add w6,w6,w10 1294 sli v7.4s,v4.4s,#14 1295 eor w14,w14,w4 1296 ushr v16.4s,v19.4s,#17 1297 add w9,w9,w12 1298 add w10,w10,w15 1299 and w12,w7,w6 1300 eor v5.16b,v5.16b,v7.16b 1301 bic w15,w8,w6 1302 eor w11,w6,w6,ror#5 1303 sli v16.4s,v19.4s,#15 1304 add w10,w10,w14 1305 orr w12,w12,w15 1306 ushr v17.4s,v19.4s,#10 1307 eor w11,w11,w6,ror#19 1308 eor w15,w10,w10,ror#11 1309 ushr v7.4s,v19.4s,#19 1310 add w9,w9,w12 1311 ror w11,w11,#6 1312 add v0.4s,v0.4s,v5.4s 1313 eor w14,w10,w3 1314 eor w15,w15,w10,ror#20 1315 sli v7.4s,v19.4s,#13 1316 add w9,w9,w11 1317 ldr w12,[sp,#8] 1318 and w13,w13,w14 1319 eor v17.16b,v17.16b,v16.16b 1320 ror w15,w15,#2 1321 add w5,w5,w9 1322 eor w13,w13,w3 1323 eor v17.16b,v17.16b,v7.16b 1324 add w8,w8,w12 1325 add w9,w9,w15 1326 and w12,w6,w5 1327 add v0.4s,v0.4s,v17.4s 1328 bic w15,w7,w5 1329 eor w11,w5,w5,ror#5 1330 add w9,w9,w13 1331 ushr v18.4s,v0.4s,#17 1332 orr w12,w12,w15 1333 ushr v19.4s,v0.4s,#10 1334 eor w11,w11,w5,ror#19 1335 eor w15,w9,w9,ror#11 1336 sli v18.4s,v0.4s,#15 1337 add w8,w8,w12 1338 ushr v17.4s,v0.4s,#19 1339 ror w11,w11,#6 1340 eor w13,w9,w10 1341 eor v19.16b,v19.16b,v18.16b 1342 eor w15,w15,w9,ror#20 1343 add w8,w8,w11 1344 sli v17.4s,v0.4s,#13 1345 ldr w12,[sp,#12] 1346 and w14,w14,w13 1347 ror w15,w15,#2 1348 ld1 {v4.4s},[x16], #16 1349 add w4,w4,w8 1350 eor v19.16b,v19.16b,v17.16b 1351 eor w14,w14,w10 1352 eor v17.16b,v17.16b,v17.16b 1353 add w7,w7,w12 1354 add w8,w8,w15 1355 and w12,w5,w4 1356 mov v17.d[1],v19.d[0] 1357 bic w15,w6,w4 1358 eor w11,w4,w4,ror#5 1359 add w8,w8,w14 1360 add v0.4s,v0.4s,v17.4s 1361 orr w12,w12,w15 1362 eor w11,w11,w4,ror#19 1363 eor w15,w8,w8,ror#11 1364 add v4.4s,v4.4s,v0.4s 1365 add w7,w7,w12 1366 ror w11,w11,#6 1367 eor w14,w8,w9 1368 eor w15,w15,w8,ror#20 1369 add w7,w7,w11 1370 ldr w12,[sp,#16] 1371 and w13,w13,w14 1372 ror w15,w15,#2 1373 add w3,w3,w7 1374 eor w13,w13,w9 1375 st1 {v4.4s},[x17], #16 1376 ext v4.16b,v1.16b,v2.16b,#4 1377 add w6,w6,w12 1378 add w7,w7,w15 1379 and w12,w4,w3 1380 bic w15,w5,w3 1381 ext v7.16b,v3.16b,v0.16b,#4 1382 eor w11,w3,w3,ror#5 1383 add w7,w7,w13 1384 mov d19,v0.d[1] 1385 orr w12,w12,w15 1386 eor w11,w11,w3,ror#19 1387 ushr v6.4s,v4.4s,#7 1388 eor w15,w7,w7,ror#11 1389 ushr v5.4s,v4.4s,#3 1390 add w6,w6,w12 1391 add v1.4s,v1.4s,v7.4s 1392 ror w11,w11,#6 1393 sli v6.4s,v4.4s,#25 1394 eor w13,w7,w8 1395 eor w15,w15,w7,ror#20 1396 ushr v7.4s,v4.4s,#18 1397 add w6,w6,w11 1398 ldr w12,[sp,#20] 1399 and w14,w14,w13 1400 eor v5.16b,v5.16b,v6.16b 1401 ror w15,w15,#2 1402 add w10,w10,w6 1403 sli v7.4s,v4.4s,#14 1404 eor w14,w14,w8 1405 ushr v16.4s,v19.4s,#17 1406 add w5,w5,w12 1407 add w6,w6,w15 1408 and w12,w3,w10 1409 eor v5.16b,v5.16b,v7.16b 1410 bic w15,w4,w10 1411 eor w11,w10,w10,ror#5 1412 sli v16.4s,v19.4s,#15 1413 add w6,w6,w14 1414 orr w12,w12,w15 1415 ushr v17.4s,v19.4s,#10 1416 eor w11,w11,w10,ror#19 1417 eor w15,w6,w6,ror#11 1418 ushr v7.4s,v19.4s,#19 1419 add w5,w5,w12 1420 ror w11,w11,#6 1421 add v1.4s,v1.4s,v5.4s 1422 eor w14,w6,w7 1423 eor w15,w15,w6,ror#20 1424 sli v7.4s,v19.4s,#13 1425 add w5,w5,w11 1426 ldr w12,[sp,#24] 1427 and w13,w13,w14 1428 eor v17.16b,v17.16b,v16.16b 1429 ror w15,w15,#2 1430 add w9,w9,w5 1431 eor w13,w13,w7 1432 eor v17.16b,v17.16b,v7.16b 1433 add w4,w4,w12 1434 add w5,w5,w15 1435 and w12,w10,w9 1436 add v1.4s,v1.4s,v17.4s 1437 bic w15,w3,w9 1438 eor w11,w9,w9,ror#5 1439 add w5,w5,w13 1440 ushr v18.4s,v1.4s,#17 1441 orr w12,w12,w15 1442 ushr v19.4s,v1.4s,#10 1443 eor w11,w11,w9,ror#19 1444 eor w15,w5,w5,ror#11 1445 sli v18.4s,v1.4s,#15 1446 add w4,w4,w12 1447 ushr v17.4s,v1.4s,#19 1448 ror w11,w11,#6 1449 eor w13,w5,w6 1450 eor v19.16b,v19.16b,v18.16b 1451 eor w15,w15,w5,ror#20 1452 add w4,w4,w11 1453 sli v17.4s,v1.4s,#13 1454 ldr w12,[sp,#28] 1455 and w14,w14,w13 1456 ror w15,w15,#2 1457 ld1 {v4.4s},[x16], #16 1458 add w8,w8,w4 1459 eor v19.16b,v19.16b,v17.16b 1460 eor w14,w14,w6 1461 eor v17.16b,v17.16b,v17.16b 1462 add w3,w3,w12 1463 add w4,w4,w15 1464 and w12,w9,w8 1465 mov v17.d[1],v19.d[0] 1466 bic w15,w10,w8 1467 eor w11,w8,w8,ror#5 1468 add w4,w4,w14 1469 add v1.4s,v1.4s,v17.4s 1470 orr w12,w12,w15 1471 eor w11,w11,w8,ror#19 1472 eor w15,w4,w4,ror#11 1473 add v4.4s,v4.4s,v1.4s 1474 add w3,w3,w12 1475 ror w11,w11,#6 1476 eor w14,w4,w5 1477 eor w15,w15,w4,ror#20 1478 add w3,w3,w11 1479 ldr w12,[sp,#32] 1480 and w13,w13,w14 1481 ror w15,w15,#2 1482 add w7,w7,w3 1483 eor w13,w13,w5 1484 st1 {v4.4s},[x17], #16 1485 ext v4.16b,v2.16b,v3.16b,#4 1486 add w10,w10,w12 1487 add w3,w3,w15 1488 and w12,w8,w7 1489 bic w15,w9,w7 1490 ext v7.16b,v0.16b,v1.16b,#4 1491 eor w11,w7,w7,ror#5 1492 add w3,w3,w13 1493 mov d19,v1.d[1] 1494 orr w12,w12,w15 1495 eor w11,w11,w7,ror#19 1496 ushr v6.4s,v4.4s,#7 1497 eor w15,w3,w3,ror#11 1498 ushr v5.4s,v4.4s,#3 1499 add w10,w10,w12 1500 add v2.4s,v2.4s,v7.4s 1501 ror w11,w11,#6 1502 sli v6.4s,v4.4s,#25 1503 eor w13,w3,w4 1504 eor w15,w15,w3,ror#20 1505 ushr v7.4s,v4.4s,#18 1506 add w10,w10,w11 1507 ldr w12,[sp,#36] 1508 and w14,w14,w13 1509 eor v5.16b,v5.16b,v6.16b 1510 ror w15,w15,#2 1511 add w6,w6,w10 1512 sli v7.4s,v4.4s,#14 1513 eor w14,w14,w4 1514 ushr v16.4s,v19.4s,#17 1515 add w9,w9,w12 1516 add w10,w10,w15 1517 and w12,w7,w6 1518 eor v5.16b,v5.16b,v7.16b 1519 bic w15,w8,w6 1520 eor w11,w6,w6,ror#5 1521 sli v16.4s,v19.4s,#15 1522 add w10,w10,w14 1523 orr w12,w12,w15 1524 ushr v17.4s,v19.4s,#10 1525 eor w11,w11,w6,ror#19 1526 eor w15,w10,w10,ror#11 1527 ushr v7.4s,v19.4s,#19 1528 add w9,w9,w12 1529 ror w11,w11,#6 1530 add v2.4s,v2.4s,v5.4s 1531 eor w14,w10,w3 1532 eor w15,w15,w10,ror#20 1533 sli v7.4s,v19.4s,#13 1534 add w9,w9,w11 1535 ldr w12,[sp,#40] 1536 and w13,w13,w14 1537 eor v17.16b,v17.16b,v16.16b 1538 ror w15,w15,#2 1539 add w5,w5,w9 1540 eor w13,w13,w3 1541 eor v17.16b,v17.16b,v7.16b 1542 add w8,w8,w12 1543 add w9,w9,w15 1544 and w12,w6,w5 1545 add v2.4s,v2.4s,v17.4s 1546 bic w15,w7,w5 1547 eor w11,w5,w5,ror#5 1548 add w9,w9,w13 1549 ushr v18.4s,v2.4s,#17 1550 orr w12,w12,w15 1551 ushr v19.4s,v2.4s,#10 1552 eor w11,w11,w5,ror#19 1553 eor w15,w9,w9,ror#11 1554 sli v18.4s,v2.4s,#15 1555 add w8,w8,w12 1556 ushr v17.4s,v2.4s,#19 1557 ror w11,w11,#6 1558 eor w13,w9,w10 1559 eor v19.16b,v19.16b,v18.16b 1560 eor w15,w15,w9,ror#20 1561 add w8,w8,w11 1562 sli v17.4s,v2.4s,#13 1563 ldr w12,[sp,#44] 1564 and w14,w14,w13 1565 ror w15,w15,#2 1566 ld1 {v4.4s},[x16], #16 1567 add w4,w4,w8 1568 eor v19.16b,v19.16b,v17.16b 1569 eor w14,w14,w10 1570 eor v17.16b,v17.16b,v17.16b 1571 add w7,w7,w12 1572 add w8,w8,w15 1573 and w12,w5,w4 1574 mov v17.d[1],v19.d[0] 1575 bic w15,w6,w4 1576 eor w11,w4,w4,ror#5 1577 add w8,w8,w14 1578 add v2.4s,v2.4s,v17.4s 1579 orr w12,w12,w15 1580 eor w11,w11,w4,ror#19 1581 eor w15,w8,w8,ror#11 1582 add v4.4s,v4.4s,v2.4s 1583 add w7,w7,w12 1584 ror w11,w11,#6 1585 eor w14,w8,w9 1586 eor w15,w15,w8,ror#20 1587 add w7,w7,w11 1588 ldr w12,[sp,#48] 1589 and w13,w13,w14 1590 ror w15,w15,#2 1591 add w3,w3,w7 1592 eor w13,w13,w9 1593 st1 {v4.4s},[x17], #16 1594 ext v4.16b,v3.16b,v0.16b,#4 1595 add w6,w6,w12 1596 add w7,w7,w15 1597 and w12,w4,w3 1598 bic w15,w5,w3 1599 ext v7.16b,v1.16b,v2.16b,#4 1600 eor w11,w3,w3,ror#5 1601 add w7,w7,w13 1602 mov d19,v2.d[1] 1603 orr w12,w12,w15 1604 eor w11,w11,w3,ror#19 1605 ushr v6.4s,v4.4s,#7 1606 eor w15,w7,w7,ror#11 1607 ushr v5.4s,v4.4s,#3 1608 add w6,w6,w12 1609 add v3.4s,v3.4s,v7.4s 1610 ror w11,w11,#6 1611 sli v6.4s,v4.4s,#25 1612 eor w13,w7,w8 1613 eor w15,w15,w7,ror#20 1614 ushr v7.4s,v4.4s,#18 1615 add w6,w6,w11 1616 ldr w12,[sp,#52] 1617 and w14,w14,w13 1618 eor v5.16b,v5.16b,v6.16b 1619 ror w15,w15,#2 1620 add w10,w10,w6 1621 sli v7.4s,v4.4s,#14 1622 eor w14,w14,w8 1623 ushr v16.4s,v19.4s,#17 1624 add w5,w5,w12 1625 add w6,w6,w15 1626 and w12,w3,w10 1627 eor v5.16b,v5.16b,v7.16b 1628 bic w15,w4,w10 1629 eor w11,w10,w10,ror#5 1630 sli v16.4s,v19.4s,#15 1631 add w6,w6,w14 1632 orr w12,w12,w15 1633 ushr v17.4s,v19.4s,#10 1634 eor w11,w11,w10,ror#19 1635 eor w15,w6,w6,ror#11 1636 ushr v7.4s,v19.4s,#19 1637 add w5,w5,w12 1638 ror w11,w11,#6 1639 add v3.4s,v3.4s,v5.4s 1640 eor w14,w6,w7 1641 eor w15,w15,w6,ror#20 1642 sli v7.4s,v19.4s,#13 1643 add w5,w5,w11 1644 ldr w12,[sp,#56] 1645 and w13,w13,w14 1646 eor v17.16b,v17.16b,v16.16b 1647 ror w15,w15,#2 1648 add w9,w9,w5 1649 eor w13,w13,w7 1650 eor v17.16b,v17.16b,v7.16b 1651 add w4,w4,w12 1652 add w5,w5,w15 1653 and w12,w10,w9 1654 add v3.4s,v3.4s,v17.4s 1655 bic w15,w3,w9 1656 eor w11,w9,w9,ror#5 1657 add w5,w5,w13 1658 ushr v18.4s,v3.4s,#17 1659 orr w12,w12,w15 1660 ushr v19.4s,v3.4s,#10 1661 eor w11,w11,w9,ror#19 1662 eor w15,w5,w5,ror#11 1663 sli v18.4s,v3.4s,#15 1664 add w4,w4,w12 1665 ushr v17.4s,v3.4s,#19 1666 ror w11,w11,#6 1667 eor w13,w5,w6 1668 eor v19.16b,v19.16b,v18.16b 1669 eor w15,w15,w5,ror#20 1670 add w4,w4,w11 1671 sli v17.4s,v3.4s,#13 1672 ldr w12,[sp,#60] 1673 and w14,w14,w13 1674 ror w15,w15,#2 1675 ld1 {v4.4s},[x16], #16 1676 add w8,w8,w4 1677 eor v19.16b,v19.16b,v17.16b 1678 eor w14,w14,w6 1679 eor v17.16b,v17.16b,v17.16b 1680 add w3,w3,w12 1681 add w4,w4,w15 1682 and w12,w9,w8 1683 mov v17.d[1],v19.d[0] 1684 bic w15,w10,w8 1685 eor w11,w8,w8,ror#5 1686 add w4,w4,w14 1687 add v3.4s,v3.4s,v17.4s 1688 orr w12,w12,w15 1689 eor w11,w11,w8,ror#19 1690 eor w15,w4,w4,ror#11 1691 add v4.4s,v4.4s,v3.4s 1692 add w3,w3,w12 1693 ror w11,w11,#6 1694 eor w14,w4,w5 1695 eor w15,w15,w4,ror#20 1696 add w3,w3,w11 1697 ldr w12,[x16] 1698 and w13,w13,w14 1699 ror w15,w15,#2 1700 add w7,w7,w3 1701 eor w13,w13,w5 1702 st1 {v4.4s},[x17], #16 1703 cmp w12,#0 // check for K256 terminator 1704 ldr w12,[sp,#0] 1705 sub x17,x17,#64 1706 bne .L_00_48 1707 1708 sub x16,x16,#256 // rewind x16 1709 cmp x1,x2 1710 mov x17, #64 1711 csel x17, x17, xzr, eq 1712 sub x1,x1,x17 // avoid SEGV 1713 mov x17,sp 1714 add w10,w10,w12 1715 add w3,w3,w15 1716 and w12,w8,w7 1717 ld1 {v0.16b},[x1],#16 1718 bic w15,w9,w7 1719 eor w11,w7,w7,ror#5 1720 ld1 {v4.4s},[x16],#16 1721 add w3,w3,w13 1722 orr w12,w12,w15 1723 eor w11,w11,w7,ror#19 1724 eor w15,w3,w3,ror#11 1725 rev32 v0.16b,v0.16b 1726 add w10,w10,w12 1727 ror w11,w11,#6 1728 eor w13,w3,w4 1729 eor w15,w15,w3,ror#20 1730 add v4.4s,v4.4s,v0.4s 1731 add w10,w10,w11 1732 ldr w12,[sp,#4] 1733 and w14,w14,w13 1734 ror w15,w15,#2 1735 add w6,w6,w10 1736 eor w14,w14,w4 1737 add w9,w9,w12 1738 add w10,w10,w15 1739 and w12,w7,w6 1740 bic w15,w8,w6 1741 eor w11,w6,w6,ror#5 1742 add w10,w10,w14 1743 orr w12,w12,w15 1744 eor w11,w11,w6,ror#19 1745 eor w15,w10,w10,ror#11 1746 add w9,w9,w12 1747 ror w11,w11,#6 1748 eor w14,w10,w3 1749 eor w15,w15,w10,ror#20 1750 add w9,w9,w11 1751 ldr w12,[sp,#8] 1752 and w13,w13,w14 1753 ror w15,w15,#2 1754 add w5,w5,w9 1755 eor w13,w13,w3 1756 add w8,w8,w12 1757 add w9,w9,w15 1758 and w12,w6,w5 1759 bic w15,w7,w5 1760 eor w11,w5,w5,ror#5 1761 add w9,w9,w13 1762 orr w12,w12,w15 1763 eor w11,w11,w5,ror#19 1764 eor w15,w9,w9,ror#11 1765 add w8,w8,w12 1766 ror w11,w11,#6 1767 eor w13,w9,w10 1768 eor w15,w15,w9,ror#20 1769 add w8,w8,w11 1770 ldr w12,[sp,#12] 1771 and w14,w14,w13 1772 ror w15,w15,#2 1773 add w4,w4,w8 1774 eor w14,w14,w10 1775 add w7,w7,w12 1776 add w8,w8,w15 1777 and w12,w5,w4 1778 bic w15,w6,w4 1779 eor w11,w4,w4,ror#5 1780 add w8,w8,w14 1781 orr w12,w12,w15 1782 eor w11,w11,w4,ror#19 1783 eor w15,w8,w8,ror#11 1784 add w7,w7,w12 1785 ror w11,w11,#6 1786 eor w14,w8,w9 1787 eor w15,w15,w8,ror#20 1788 add w7,w7,w11 1789 ldr w12,[sp,#16] 1790 and w13,w13,w14 1791 ror w15,w15,#2 1792 add w3,w3,w7 1793 eor w13,w13,w9 1794 st1 {v4.4s},[x17], #16 1795 add w6,w6,w12 1796 add w7,w7,w15 1797 and w12,w4,w3 1798 ld1 {v1.16b},[x1],#16 1799 bic w15,w5,w3 1800 eor w11,w3,w3,ror#5 1801 ld1 {v4.4s},[x16],#16 1802 add w7,w7,w13 1803 orr w12,w12,w15 1804 eor w11,w11,w3,ror#19 1805 eor w15,w7,w7,ror#11 1806 rev32 v1.16b,v1.16b 1807 add w6,w6,w12 1808 ror w11,w11,#6 1809 eor w13,w7,w8 1810 eor w15,w15,w7,ror#20 1811 add v4.4s,v4.4s,v1.4s 1812 add w6,w6,w11 1813 ldr w12,[sp,#20] 1814 and w14,w14,w13 1815 ror w15,w15,#2 1816 add w10,w10,w6 1817 eor w14,w14,w8 1818 add w5,w5,w12 1819 add w6,w6,w15 1820 and w12,w3,w10 1821 bic w15,w4,w10 1822 eor w11,w10,w10,ror#5 1823 add w6,w6,w14 1824 orr w12,w12,w15 1825 eor w11,w11,w10,ror#19 1826 eor w15,w6,w6,ror#11 1827 add w5,w5,w12 1828 ror w11,w11,#6 1829 eor w14,w6,w7 1830 eor w15,w15,w6,ror#20 1831 add w5,w5,w11 1832 ldr w12,[sp,#24] 1833 and w13,w13,w14 1834 ror w15,w15,#2 1835 add w9,w9,w5 1836 eor w13,w13,w7 1837 add w4,w4,w12 1838 add w5,w5,w15 1839 and w12,w10,w9 1840 bic w15,w3,w9 1841 eor w11,w9,w9,ror#5 1842 add w5,w5,w13 1843 orr w12,w12,w15 1844 eor w11,w11,w9,ror#19 1845 eor w15,w5,w5,ror#11 1846 add w4,w4,w12 1847 ror w11,w11,#6 1848 eor w13,w5,w6 1849 eor w15,w15,w5,ror#20 1850 add w4,w4,w11 1851 ldr w12,[sp,#28] 1852 and w14,w14,w13 1853 ror w15,w15,#2 1854 add w8,w8,w4 1855 eor w14,w14,w6 1856 add w3,w3,w12 1857 add w4,w4,w15 1858 and w12,w9,w8 1859 bic w15,w10,w8 1860 eor w11,w8,w8,ror#5 1861 add w4,w4,w14 1862 orr w12,w12,w15 1863 eor w11,w11,w8,ror#19 1864 eor w15,w4,w4,ror#11 1865 add w3,w3,w12 1866 ror w11,w11,#6 1867 eor w14,w4,w5 1868 eor w15,w15,w4,ror#20 1869 add w3,w3,w11 1870 ldr w12,[sp,#32] 1871 and w13,w13,w14 1872 ror w15,w15,#2 1873 add w7,w7,w3 1874 eor w13,w13,w5 1875 st1 {v4.4s},[x17], #16 1876 add w10,w10,w12 1877 add w3,w3,w15 1878 and w12,w8,w7 1879 ld1 {v2.16b},[x1],#16 1880 bic w15,w9,w7 1881 eor w11,w7,w7,ror#5 1882 ld1 {v4.4s},[x16],#16 1883 add w3,w3,w13 1884 orr w12,w12,w15 1885 eor w11,w11,w7,ror#19 1886 eor w15,w3,w3,ror#11 1887 rev32 v2.16b,v2.16b 1888 add w10,w10,w12 1889 ror w11,w11,#6 1890 eor w13,w3,w4 1891 eor w15,w15,w3,ror#20 1892 add v4.4s,v4.4s,v2.4s 1893 add w10,w10,w11 1894 ldr w12,[sp,#36] 1895 and w14,w14,w13 1896 ror w15,w15,#2 1897 add w6,w6,w10 1898 eor w14,w14,w4 1899 add w9,w9,w12 1900 add w10,w10,w15 1901 and w12,w7,w6 1902 bic w15,w8,w6 1903 eor w11,w6,w6,ror#5 1904 add w10,w10,w14 1905 orr w12,w12,w15 1906 eor w11,w11,w6,ror#19 1907 eor w15,w10,w10,ror#11 1908 add w9,w9,w12 1909 ror w11,w11,#6 1910 eor w14,w10,w3 1911 eor w15,w15,w10,ror#20 1912 add w9,w9,w11 1913 ldr w12,[sp,#40] 1914 and w13,w13,w14 1915 ror w15,w15,#2 1916 add w5,w5,w9 1917 eor w13,w13,w3 1918 add w8,w8,w12 1919 add w9,w9,w15 1920 and w12,w6,w5 1921 bic w15,w7,w5 1922 eor w11,w5,w5,ror#5 1923 add w9,w9,w13 1924 orr w12,w12,w15 1925 eor w11,w11,w5,ror#19 1926 eor w15,w9,w9,ror#11 1927 add w8,w8,w12 1928 ror w11,w11,#6 1929 eor w13,w9,w10 1930 eor w15,w15,w9,ror#20 1931 add w8,w8,w11 1932 ldr w12,[sp,#44] 1933 and w14,w14,w13 1934 ror w15,w15,#2 1935 add w4,w4,w8 1936 eor w14,w14,w10 1937 add w7,w7,w12 1938 add w8,w8,w15 1939 and w12,w5,w4 1940 bic w15,w6,w4 1941 eor w11,w4,w4,ror#5 1942 add w8,w8,w14 1943 orr w12,w12,w15 1944 eor w11,w11,w4,ror#19 1945 eor w15,w8,w8,ror#11 1946 add w7,w7,w12 1947 ror w11,w11,#6 1948 eor w14,w8,w9 1949 eor w15,w15,w8,ror#20 1950 add w7,w7,w11 1951 ldr w12,[sp,#48] 1952 and w13,w13,w14 1953 ror w15,w15,#2 1954 add w3,w3,w7 1955 eor w13,w13,w9 1956 st1 {v4.4s},[x17], #16 1957 add w6,w6,w12 1958 add w7,w7,w15 1959 and w12,w4,w3 1960 ld1 {v3.16b},[x1],#16 1961 bic w15,w5,w3 1962 eor w11,w3,w3,ror#5 1963 ld1 {v4.4s},[x16],#16 1964 add w7,w7,w13 1965 orr w12,w12,w15 1966 eor w11,w11,w3,ror#19 1967 eor w15,w7,w7,ror#11 1968 rev32 v3.16b,v3.16b 1969 add w6,w6,w12 1970 ror w11,w11,#6 1971 eor w13,w7,w8 1972 eor w15,w15,w7,ror#20 1973 add v4.4s,v4.4s,v3.4s 1974 add w6,w6,w11 1975 ldr w12,[sp,#52] 1976 and w14,w14,w13 1977 ror w15,w15,#2 1978 add w10,w10,w6 1979 eor w14,w14,w8 1980 add w5,w5,w12 1981 add w6,w6,w15 1982 and w12,w3,w10 1983 bic w15,w4,w10 1984 eor w11,w10,w10,ror#5 1985 add w6,w6,w14 1986 orr w12,w12,w15 1987 eor w11,w11,w10,ror#19 1988 eor w15,w6,w6,ror#11 1989 add w5,w5,w12 1990 ror w11,w11,#6 1991 eor w14,w6,w7 1992 eor w15,w15,w6,ror#20 1993 add w5,w5,w11 1994 ldr w12,[sp,#56] 1995 and w13,w13,w14 1996 ror w15,w15,#2 1997 add w9,w9,w5 1998 eor w13,w13,w7 1999 add w4,w4,w12 2000 add w5,w5,w15 2001 and w12,w10,w9 2002 bic w15,w3,w9 2003 eor w11,w9,w9,ror#5 2004 add w5,w5,w13 2005 orr w12,w12,w15 2006 eor w11,w11,w9,ror#19 2007 eor w15,w5,w5,ror#11 2008 add w4,w4,w12 2009 ror w11,w11,#6 2010 eor w13,w5,w6 2011 eor w15,w15,w5,ror#20 2012 add w4,w4,w11 2013 ldr w12,[sp,#60] 2014 and w14,w14,w13 2015 ror w15,w15,#2 2016 add w8,w8,w4 2017 eor w14,w14,w6 2018 add w3,w3,w12 2019 add w4,w4,w15 2020 and w12,w9,w8 2021 bic w15,w10,w8 2022 eor w11,w8,w8,ror#5 2023 add w4,w4,w14 2024 orr w12,w12,w15 2025 eor w11,w11,w8,ror#19 2026 eor w15,w4,w4,ror#11 2027 add w3,w3,w12 2028 ror w11,w11,#6 2029 eor w14,w4,w5 2030 eor w15,w15,w4,ror#20 2031 add w3,w3,w11 2032 and w13,w13,w14 2033 ror w15,w15,#2 2034 add w7,w7,w3 2035 eor w13,w13,w5 2036 st1 {v4.4s},[x17], #16 2037 add w3,w3,w15 // h+=Sigma0(a) from the past 2038 ldp w11,w12,[x0,#0] 2039 add w3,w3,w13 // h+=Maj(a,b,c) from the past 2040 ldp w13,w14,[x0,#8] 2041 add w3,w3,w11 // accumulate 2042 add w4,w4,w12 2043 ldp w11,w12,[x0,#16] 2044 add w5,w5,w13 2045 add w6,w6,w14 2046 ldp w13,w14,[x0,#24] 2047 add w7,w7,w11 2048 add w8,w8,w12 2049 ldr w12,[sp,#0] 2050 stp w3,w4,[x0,#0] 2051 add w9,w9,w13 2052 mov w13,wzr 2053 stp w5,w6,[x0,#8] 2054 add w10,w10,w14 2055 stp w7,w8,[x0,#16] 2056 eor w14,w4,w5 2057 stp w9,w10,[x0,#24] 2058 mov w15,wzr 2059 mov x17,sp 2060 b.ne .L_00_48 2061 2062 ldr x29,[x29] 2063 add sp,sp,#16*4+16 2064 ret 2065.size sha256_block_neon,.-sha256_block_neon 2066