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