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