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