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