1#if defined(__aarch64__) 2// Copyright 2014-2016 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// 31// (*) Software SHA256 results are of lesser relevance, presented 32// mostly for informational purposes. 33// (**) The result is a trade-off: it's possible to improve it by 34// 10% (or by 1 cycle per round), but at the cost of 20% loss 35// on Cortex-A53 (or by 4 cycles per round). 36// (***) Super-impressive coefficients over gcc-generated code are 37// indication of some compiler "pathology", most notably code 38// generated with -mgeneral-regs-only is significanty faster 39// and the gap is only 40-90%. 40 41#ifndef __KERNEL__ 42# include <openssl/arm_arch.h> 43#endif 44 45.text 46 47 48.globl sha256_block_data_order 49.hidden sha256_block_data_order 50.type sha256_block_data_order,%function 51.align 6 52sha256_block_data_order: 53#ifndef __KERNEL__ 54# ifdef __ILP32__ 55 ldrsw x16,.LOPENSSL_armcap_P 56# else 57 ldr x16,.LOPENSSL_armcap_P 58# endif 59 adr x17,.LOPENSSL_armcap_P 60 add x16,x16,x17 61 ldr w16,[x16] 62 tst w16,#ARMV8_SHA256 63 b.ne .Lv8_entry 64#endif 65 stp x29,x30,[sp,#-128]! 66 add x29,sp,#0 67 68 stp x19,x20,[sp,#16] 69 stp x21,x22,[sp,#32] 70 stp x23,x24,[sp,#48] 71 stp x25,x26,[sp,#64] 72 stp x27,x28,[sp,#80] 73 sub sp,sp,#4*4 74 75 ldp w20,w21,[x0] // load context 76 ldp w22,w23,[x0,#2*4] 77 ldp w24,w25,[x0,#4*4] 78 add x2,x1,x2,lsl#6 // end of input 79 ldp w26,w27,[x0,#6*4] 80 adr x30,.LK256 81 stp x0,x2,[x29,#96] 82 83.Loop: 84 ldp w3,w4,[x1],#2*4 85 ldr w19,[x30],#4 // *K++ 86 eor w28,w21,w22 // magic seed 87 str x1,[x29,#112] 88#ifndef __ARMEB__ 89 rev w3,w3 // 0 90#endif 91 ror w16,w24,#6 92 add w27,w27,w19 // h+=K[i] 93 eor w6,w24,w24,ror#14 94 and w17,w25,w24 95 bic w19,w26,w24 96 add w27,w27,w3 // h+=X[i] 97 orr w17,w17,w19 // Ch(e,f,g) 98 eor w19,w20,w21 // a^b, b^c in next round 99 eor w16,w16,w6,ror#11 // Sigma1(e) 100 ror w6,w20,#2 101 add w27,w27,w17 // h+=Ch(e,f,g) 102 eor w17,w20,w20,ror#9 103 add w27,w27,w16 // h+=Sigma1(e) 104 and w28,w28,w19 // (b^c)&=(a^b) 105 add w23,w23,w27 // d+=h 106 eor w28,w28,w21 // Maj(a,b,c) 107 eor w17,w6,w17,ror#13 // Sigma0(a) 108 add w27,w27,w28 // h+=Maj(a,b,c) 109 ldr w28,[x30],#4 // *K++, w19 in next round 110 //add w27,w27,w17 // h+=Sigma0(a) 111#ifndef __ARMEB__ 112 rev w4,w4 // 1 113#endif 114 ldp w5,w6,[x1],#2*4 115 add w27,w27,w17 // h+=Sigma0(a) 116 ror w16,w23,#6 117 add w26,w26,w28 // h+=K[i] 118 eor w7,w23,w23,ror#14 119 and w17,w24,w23 120 bic w28,w25,w23 121 add w26,w26,w4 // h+=X[i] 122 orr w17,w17,w28 // Ch(e,f,g) 123 eor w28,w27,w20 // a^b, b^c in next round 124 eor w16,w16,w7,ror#11 // Sigma1(e) 125 ror w7,w27,#2 126 add w26,w26,w17 // h+=Ch(e,f,g) 127 eor w17,w27,w27,ror#9 128 add w26,w26,w16 // h+=Sigma1(e) 129 and w19,w19,w28 // (b^c)&=(a^b) 130 add w22,w22,w26 // d+=h 131 eor w19,w19,w20 // Maj(a,b,c) 132 eor w17,w7,w17,ror#13 // Sigma0(a) 133 add w26,w26,w19 // h+=Maj(a,b,c) 134 ldr w19,[x30],#4 // *K++, w28 in next round 135 //add w26,w26,w17 // h+=Sigma0(a) 136#ifndef __ARMEB__ 137 rev w5,w5 // 2 138#endif 139 add w26,w26,w17 // h+=Sigma0(a) 140 ror w16,w22,#6 141 add w25,w25,w19 // h+=K[i] 142 eor w8,w22,w22,ror#14 143 and w17,w23,w22 144 bic w19,w24,w22 145 add w25,w25,w5 // h+=X[i] 146 orr w17,w17,w19 // Ch(e,f,g) 147 eor w19,w26,w27 // a^b, b^c in next round 148 eor w16,w16,w8,ror#11 // Sigma1(e) 149 ror w8,w26,#2 150 add w25,w25,w17 // h+=Ch(e,f,g) 151 eor w17,w26,w26,ror#9 152 add w25,w25,w16 // h+=Sigma1(e) 153 and w28,w28,w19 // (b^c)&=(a^b) 154 add w21,w21,w25 // d+=h 155 eor w28,w28,w27 // Maj(a,b,c) 156 eor w17,w8,w17,ror#13 // Sigma0(a) 157 add w25,w25,w28 // h+=Maj(a,b,c) 158 ldr w28,[x30],#4 // *K++, w19 in next round 159 //add w25,w25,w17 // h+=Sigma0(a) 160#ifndef __ARMEB__ 161 rev w6,w6 // 3 162#endif 163 ldp w7,w8,[x1],#2*4 164 add w25,w25,w17 // h+=Sigma0(a) 165 ror w16,w21,#6 166 add w24,w24,w28 // h+=K[i] 167 eor w9,w21,w21,ror#14 168 and w17,w22,w21 169 bic w28,w23,w21 170 add w24,w24,w6 // h+=X[i] 171 orr w17,w17,w28 // Ch(e,f,g) 172 eor w28,w25,w26 // a^b, b^c in next round 173 eor w16,w16,w9,ror#11 // Sigma1(e) 174 ror w9,w25,#2 175 add w24,w24,w17 // h+=Ch(e,f,g) 176 eor w17,w25,w25,ror#9 177 add w24,w24,w16 // h+=Sigma1(e) 178 and w19,w19,w28 // (b^c)&=(a^b) 179 add w20,w20,w24 // d+=h 180 eor w19,w19,w26 // Maj(a,b,c) 181 eor w17,w9,w17,ror#13 // Sigma0(a) 182 add w24,w24,w19 // h+=Maj(a,b,c) 183 ldr w19,[x30],#4 // *K++, w28 in next round 184 //add w24,w24,w17 // h+=Sigma0(a) 185#ifndef __ARMEB__ 186 rev w7,w7 // 4 187#endif 188 add w24,w24,w17 // h+=Sigma0(a) 189 ror w16,w20,#6 190 add w23,w23,w19 // h+=K[i] 191 eor w10,w20,w20,ror#14 192 and w17,w21,w20 193 bic w19,w22,w20 194 add w23,w23,w7 // h+=X[i] 195 orr w17,w17,w19 // Ch(e,f,g) 196 eor w19,w24,w25 // a^b, b^c in next round 197 eor w16,w16,w10,ror#11 // Sigma1(e) 198 ror w10,w24,#2 199 add w23,w23,w17 // h+=Ch(e,f,g) 200 eor w17,w24,w24,ror#9 201 add w23,w23,w16 // h+=Sigma1(e) 202 and w28,w28,w19 // (b^c)&=(a^b) 203 add w27,w27,w23 // d+=h 204 eor w28,w28,w25 // Maj(a,b,c) 205 eor w17,w10,w17,ror#13 // Sigma0(a) 206 add w23,w23,w28 // h+=Maj(a,b,c) 207 ldr w28,[x30],#4 // *K++, w19 in next round 208 //add w23,w23,w17 // h+=Sigma0(a) 209#ifndef __ARMEB__ 210 rev w8,w8 // 5 211#endif 212 ldp w9,w10,[x1],#2*4 213 add w23,w23,w17 // h+=Sigma0(a) 214 ror w16,w27,#6 215 add w22,w22,w28 // h+=K[i] 216 eor w11,w27,w27,ror#14 217 and w17,w20,w27 218 bic w28,w21,w27 219 add w22,w22,w8 // h+=X[i] 220 orr w17,w17,w28 // Ch(e,f,g) 221 eor w28,w23,w24 // a^b, b^c in next round 222 eor w16,w16,w11,ror#11 // Sigma1(e) 223 ror w11,w23,#2 224 add w22,w22,w17 // h+=Ch(e,f,g) 225 eor w17,w23,w23,ror#9 226 add w22,w22,w16 // h+=Sigma1(e) 227 and w19,w19,w28 // (b^c)&=(a^b) 228 add w26,w26,w22 // d+=h 229 eor w19,w19,w24 // Maj(a,b,c) 230 eor w17,w11,w17,ror#13 // Sigma0(a) 231 add w22,w22,w19 // h+=Maj(a,b,c) 232 ldr w19,[x30],#4 // *K++, w28 in next round 233 //add w22,w22,w17 // h+=Sigma0(a) 234#ifndef __ARMEB__ 235 rev w9,w9 // 6 236#endif 237 add w22,w22,w17 // h+=Sigma0(a) 238 ror w16,w26,#6 239 add w21,w21,w19 // h+=K[i] 240 eor w12,w26,w26,ror#14 241 and w17,w27,w26 242 bic w19,w20,w26 243 add w21,w21,w9 // h+=X[i] 244 orr w17,w17,w19 // Ch(e,f,g) 245 eor w19,w22,w23 // a^b, b^c in next round 246 eor w16,w16,w12,ror#11 // Sigma1(e) 247 ror w12,w22,#2 248 add w21,w21,w17 // h+=Ch(e,f,g) 249 eor w17,w22,w22,ror#9 250 add w21,w21,w16 // h+=Sigma1(e) 251 and w28,w28,w19 // (b^c)&=(a^b) 252 add w25,w25,w21 // d+=h 253 eor w28,w28,w23 // Maj(a,b,c) 254 eor w17,w12,w17,ror#13 // Sigma0(a) 255 add w21,w21,w28 // h+=Maj(a,b,c) 256 ldr w28,[x30],#4 // *K++, w19 in next round 257 //add w21,w21,w17 // h+=Sigma0(a) 258#ifndef __ARMEB__ 259 rev w10,w10 // 7 260#endif 261 ldp w11,w12,[x1],#2*4 262 add w21,w21,w17 // h+=Sigma0(a) 263 ror w16,w25,#6 264 add w20,w20,w28 // h+=K[i] 265 eor w13,w25,w25,ror#14 266 and w17,w26,w25 267 bic w28,w27,w25 268 add w20,w20,w10 // h+=X[i] 269 orr w17,w17,w28 // Ch(e,f,g) 270 eor w28,w21,w22 // a^b, b^c in next round 271 eor w16,w16,w13,ror#11 // Sigma1(e) 272 ror w13,w21,#2 273 add w20,w20,w17 // h+=Ch(e,f,g) 274 eor w17,w21,w21,ror#9 275 add w20,w20,w16 // h+=Sigma1(e) 276 and w19,w19,w28 // (b^c)&=(a^b) 277 add w24,w24,w20 // d+=h 278 eor w19,w19,w22 // Maj(a,b,c) 279 eor w17,w13,w17,ror#13 // Sigma0(a) 280 add w20,w20,w19 // h+=Maj(a,b,c) 281 ldr w19,[x30],#4 // *K++, w28 in next round 282 //add w20,w20,w17 // h+=Sigma0(a) 283#ifndef __ARMEB__ 284 rev w11,w11 // 8 285#endif 286 add w20,w20,w17 // h+=Sigma0(a) 287 ror w16,w24,#6 288 add w27,w27,w19 // h+=K[i] 289 eor w14,w24,w24,ror#14 290 and w17,w25,w24 291 bic w19,w26,w24 292 add w27,w27,w11 // h+=X[i] 293 orr w17,w17,w19 // Ch(e,f,g) 294 eor w19,w20,w21 // a^b, b^c in next round 295 eor w16,w16,w14,ror#11 // Sigma1(e) 296 ror w14,w20,#2 297 add w27,w27,w17 // h+=Ch(e,f,g) 298 eor w17,w20,w20,ror#9 299 add w27,w27,w16 // h+=Sigma1(e) 300 and w28,w28,w19 // (b^c)&=(a^b) 301 add w23,w23,w27 // d+=h 302 eor w28,w28,w21 // Maj(a,b,c) 303 eor w17,w14,w17,ror#13 // Sigma0(a) 304 add w27,w27,w28 // h+=Maj(a,b,c) 305 ldr w28,[x30],#4 // *K++, w19 in next round 306 //add w27,w27,w17 // h+=Sigma0(a) 307#ifndef __ARMEB__ 308 rev w12,w12 // 9 309#endif 310 ldp w13,w14,[x1],#2*4 311 add w27,w27,w17 // h+=Sigma0(a) 312 ror w16,w23,#6 313 add w26,w26,w28 // h+=K[i] 314 eor w15,w23,w23,ror#14 315 and w17,w24,w23 316 bic w28,w25,w23 317 add w26,w26,w12 // h+=X[i] 318 orr w17,w17,w28 // Ch(e,f,g) 319 eor w28,w27,w20 // a^b, b^c in next round 320 eor w16,w16,w15,ror#11 // Sigma1(e) 321 ror w15,w27,#2 322 add w26,w26,w17 // h+=Ch(e,f,g) 323 eor w17,w27,w27,ror#9 324 add w26,w26,w16 // h+=Sigma1(e) 325 and w19,w19,w28 // (b^c)&=(a^b) 326 add w22,w22,w26 // d+=h 327 eor w19,w19,w20 // Maj(a,b,c) 328 eor w17,w15,w17,ror#13 // Sigma0(a) 329 add w26,w26,w19 // h+=Maj(a,b,c) 330 ldr w19,[x30],#4 // *K++, w28 in next round 331 //add w26,w26,w17 // h+=Sigma0(a) 332#ifndef __ARMEB__ 333 rev w13,w13 // 10 334#endif 335 add w26,w26,w17 // h+=Sigma0(a) 336 ror w16,w22,#6 337 add w25,w25,w19 // h+=K[i] 338 eor w0,w22,w22,ror#14 339 and w17,w23,w22 340 bic w19,w24,w22 341 add w25,w25,w13 // h+=X[i] 342 orr w17,w17,w19 // Ch(e,f,g) 343 eor w19,w26,w27 // a^b, b^c in next round 344 eor w16,w16,w0,ror#11 // Sigma1(e) 345 ror w0,w26,#2 346 add w25,w25,w17 // h+=Ch(e,f,g) 347 eor w17,w26,w26,ror#9 348 add w25,w25,w16 // h+=Sigma1(e) 349 and w28,w28,w19 // (b^c)&=(a^b) 350 add w21,w21,w25 // d+=h 351 eor w28,w28,w27 // Maj(a,b,c) 352 eor w17,w0,w17,ror#13 // Sigma0(a) 353 add w25,w25,w28 // h+=Maj(a,b,c) 354 ldr w28,[x30],#4 // *K++, w19 in next round 355 //add w25,w25,w17 // h+=Sigma0(a) 356#ifndef __ARMEB__ 357 rev w14,w14 // 11 358#endif 359 ldp w15,w0,[x1],#2*4 360 add w25,w25,w17 // h+=Sigma0(a) 361 str w6,[sp,#12] 362 ror w16,w21,#6 363 add w24,w24,w28 // h+=K[i] 364 eor w6,w21,w21,ror#14 365 and w17,w22,w21 366 bic w28,w23,w21 367 add w24,w24,w14 // h+=X[i] 368 orr w17,w17,w28 // Ch(e,f,g) 369 eor w28,w25,w26 // a^b, b^c in next round 370 eor w16,w16,w6,ror#11 // Sigma1(e) 371 ror w6,w25,#2 372 add w24,w24,w17 // h+=Ch(e,f,g) 373 eor w17,w25,w25,ror#9 374 add w24,w24,w16 // h+=Sigma1(e) 375 and w19,w19,w28 // (b^c)&=(a^b) 376 add w20,w20,w24 // d+=h 377 eor w19,w19,w26 // Maj(a,b,c) 378 eor w17,w6,w17,ror#13 // Sigma0(a) 379 add w24,w24,w19 // h+=Maj(a,b,c) 380 ldr w19,[x30],#4 // *K++, w28 in next round 381 //add w24,w24,w17 // h+=Sigma0(a) 382#ifndef __ARMEB__ 383 rev w15,w15 // 12 384#endif 385 add w24,w24,w17 // h+=Sigma0(a) 386 str w7,[sp,#0] 387 ror w16,w20,#6 388 add w23,w23,w19 // h+=K[i] 389 eor w7,w20,w20,ror#14 390 and w17,w21,w20 391 bic w19,w22,w20 392 add w23,w23,w15 // h+=X[i] 393 orr w17,w17,w19 // Ch(e,f,g) 394 eor w19,w24,w25 // a^b, b^c in next round 395 eor w16,w16,w7,ror#11 // Sigma1(e) 396 ror w7,w24,#2 397 add w23,w23,w17 // h+=Ch(e,f,g) 398 eor w17,w24,w24,ror#9 399 add w23,w23,w16 // h+=Sigma1(e) 400 and w28,w28,w19 // (b^c)&=(a^b) 401 add w27,w27,w23 // d+=h 402 eor w28,w28,w25 // Maj(a,b,c) 403 eor w17,w7,w17,ror#13 // Sigma0(a) 404 add w23,w23,w28 // h+=Maj(a,b,c) 405 ldr w28,[x30],#4 // *K++, w19 in next round 406 //add w23,w23,w17 // h+=Sigma0(a) 407#ifndef __ARMEB__ 408 rev w0,w0 // 13 409#endif 410 ldp w1,w2,[x1] 411 add w23,w23,w17 // h+=Sigma0(a) 412 str w8,[sp,#4] 413 ror w16,w27,#6 414 add w22,w22,w28 // h+=K[i] 415 eor w8,w27,w27,ror#14 416 and w17,w20,w27 417 bic w28,w21,w27 418 add w22,w22,w0 // h+=X[i] 419 orr w17,w17,w28 // Ch(e,f,g) 420 eor w28,w23,w24 // a^b, b^c in next round 421 eor w16,w16,w8,ror#11 // Sigma1(e) 422 ror w8,w23,#2 423 add w22,w22,w17 // h+=Ch(e,f,g) 424 eor w17,w23,w23,ror#9 425 add w22,w22,w16 // h+=Sigma1(e) 426 and w19,w19,w28 // (b^c)&=(a^b) 427 add w26,w26,w22 // d+=h 428 eor w19,w19,w24 // Maj(a,b,c) 429 eor w17,w8,w17,ror#13 // Sigma0(a) 430 add w22,w22,w19 // h+=Maj(a,b,c) 431 ldr w19,[x30],#4 // *K++, w28 in next round 432 //add w22,w22,w17 // h+=Sigma0(a) 433#ifndef __ARMEB__ 434 rev w1,w1 // 14 435#endif 436 ldr w6,[sp,#12] 437 add w22,w22,w17 // h+=Sigma0(a) 438 str w9,[sp,#8] 439 ror w16,w26,#6 440 add w21,w21,w19 // h+=K[i] 441 eor w9,w26,w26,ror#14 442 and w17,w27,w26 443 bic w19,w20,w26 444 add w21,w21,w1 // h+=X[i] 445 orr w17,w17,w19 // Ch(e,f,g) 446 eor w19,w22,w23 // a^b, b^c in next round 447 eor w16,w16,w9,ror#11 // Sigma1(e) 448 ror w9,w22,#2 449 add w21,w21,w17 // h+=Ch(e,f,g) 450 eor w17,w22,w22,ror#9 451 add w21,w21,w16 // h+=Sigma1(e) 452 and w28,w28,w19 // (b^c)&=(a^b) 453 add w25,w25,w21 // d+=h 454 eor w28,w28,w23 // Maj(a,b,c) 455 eor w17,w9,w17,ror#13 // Sigma0(a) 456 add w21,w21,w28 // h+=Maj(a,b,c) 457 ldr w28,[x30],#4 // *K++, w19 in next round 458 //add w21,w21,w17 // h+=Sigma0(a) 459#ifndef __ARMEB__ 460 rev w2,w2 // 15 461#endif 462 ldr w7,[sp,#0] 463 add w21,w21,w17 // h+=Sigma0(a) 464 str w10,[sp,#12] 465 ror w16,w25,#6 466 add w20,w20,w28 // h+=K[i] 467 ror w9,w4,#7 468 and w17,w26,w25 469 ror w8,w1,#17 470 bic w28,w27,w25 471 ror w10,w21,#2 472 add w20,w20,w2 // h+=X[i] 473 eor w16,w16,w25,ror#11 474 eor w9,w9,w4,ror#18 475 orr w17,w17,w28 // Ch(e,f,g) 476 eor w28,w21,w22 // a^b, b^c in next round 477 eor w16,w16,w25,ror#25 // Sigma1(e) 478 eor w10,w10,w21,ror#13 479 add w20,w20,w17 // h+=Ch(e,f,g) 480 and w19,w19,w28 // (b^c)&=(a^b) 481 eor w8,w8,w1,ror#19 482 eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) 483 add w20,w20,w16 // h+=Sigma1(e) 484 eor w19,w19,w22 // Maj(a,b,c) 485 eor w17,w10,w21,ror#22 // Sigma0(a) 486 eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) 487 add w3,w3,w12 488 add w24,w24,w20 // d+=h 489 add w20,w20,w19 // h+=Maj(a,b,c) 490 ldr w19,[x30],#4 // *K++, w28 in next round 491 add w3,w3,w9 492 add w20,w20,w17 // h+=Sigma0(a) 493 add w3,w3,w8 494.Loop_16_xx: 495 ldr w8,[sp,#4] 496 str w11,[sp,#0] 497 ror w16,w24,#6 498 add w27,w27,w19 // h+=K[i] 499 ror w10,w5,#7 500 and w17,w25,w24 501 ror w9,w2,#17 502 bic w19,w26,w24 503 ror w11,w20,#2 504 add w27,w27,w3 // h+=X[i] 505 eor w16,w16,w24,ror#11 506 eor w10,w10,w5,ror#18 507 orr w17,w17,w19 // Ch(e,f,g) 508 eor w19,w20,w21 // a^b, b^c in next round 509 eor w16,w16,w24,ror#25 // Sigma1(e) 510 eor w11,w11,w20,ror#13 511 add w27,w27,w17 // h+=Ch(e,f,g) 512 and w28,w28,w19 // (b^c)&=(a^b) 513 eor w9,w9,w2,ror#19 514 eor w10,w10,w5,lsr#3 // sigma0(X[i+1]) 515 add w27,w27,w16 // h+=Sigma1(e) 516 eor w28,w28,w21 // Maj(a,b,c) 517 eor w17,w11,w20,ror#22 // Sigma0(a) 518 eor w9,w9,w2,lsr#10 // sigma1(X[i+14]) 519 add w4,w4,w13 520 add w23,w23,w27 // d+=h 521 add w27,w27,w28 // h+=Maj(a,b,c) 522 ldr w28,[x30],#4 // *K++, w19 in next round 523 add w4,w4,w10 524 add w27,w27,w17 // h+=Sigma0(a) 525 add w4,w4,w9 526 ldr w9,[sp,#8] 527 str w12,[sp,#4] 528 ror w16,w23,#6 529 add w26,w26,w28 // h+=K[i] 530 ror w11,w6,#7 531 and w17,w24,w23 532 ror w10,w3,#17 533 bic w28,w25,w23 534 ror w12,w27,#2 535 add w26,w26,w4 // h+=X[i] 536 eor w16,w16,w23,ror#11 537 eor w11,w11,w6,ror#18 538 orr w17,w17,w28 // Ch(e,f,g) 539 eor w28,w27,w20 // a^b, b^c in next round 540 eor w16,w16,w23,ror#25 // Sigma1(e) 541 eor w12,w12,w27,ror#13 542 add w26,w26,w17 // h+=Ch(e,f,g) 543 and w19,w19,w28 // (b^c)&=(a^b) 544 eor w10,w10,w3,ror#19 545 eor w11,w11,w6,lsr#3 // sigma0(X[i+1]) 546 add w26,w26,w16 // h+=Sigma1(e) 547 eor w19,w19,w20 // Maj(a,b,c) 548 eor w17,w12,w27,ror#22 // Sigma0(a) 549 eor w10,w10,w3,lsr#10 // sigma1(X[i+14]) 550 add w5,w5,w14 551 add w22,w22,w26 // d+=h 552 add w26,w26,w19 // h+=Maj(a,b,c) 553 ldr w19,[x30],#4 // *K++, w28 in next round 554 add w5,w5,w11 555 add w26,w26,w17 // h+=Sigma0(a) 556 add w5,w5,w10 557 ldr w10,[sp,#12] 558 str w13,[sp,#8] 559 ror w16,w22,#6 560 add w25,w25,w19 // h+=K[i] 561 ror w12,w7,#7 562 and w17,w23,w22 563 ror w11,w4,#17 564 bic w19,w24,w22 565 ror w13,w26,#2 566 add w25,w25,w5 // h+=X[i] 567 eor w16,w16,w22,ror#11 568 eor w12,w12,w7,ror#18 569 orr w17,w17,w19 // Ch(e,f,g) 570 eor w19,w26,w27 // a^b, b^c in next round 571 eor w16,w16,w22,ror#25 // Sigma1(e) 572 eor w13,w13,w26,ror#13 573 add w25,w25,w17 // h+=Ch(e,f,g) 574 and w28,w28,w19 // (b^c)&=(a^b) 575 eor w11,w11,w4,ror#19 576 eor w12,w12,w7,lsr#3 // sigma0(X[i+1]) 577 add w25,w25,w16 // h+=Sigma1(e) 578 eor w28,w28,w27 // Maj(a,b,c) 579 eor w17,w13,w26,ror#22 // Sigma0(a) 580 eor w11,w11,w4,lsr#10 // sigma1(X[i+14]) 581 add w6,w6,w15 582 add w21,w21,w25 // d+=h 583 add w25,w25,w28 // h+=Maj(a,b,c) 584 ldr w28,[x30],#4 // *K++, w19 in next round 585 add w6,w6,w12 586 add w25,w25,w17 // h+=Sigma0(a) 587 add w6,w6,w11 588 ldr w11,[sp,#0] 589 str w14,[sp,#12] 590 ror w16,w21,#6 591 add w24,w24,w28 // h+=K[i] 592 ror w13,w8,#7 593 and w17,w22,w21 594 ror w12,w5,#17 595 bic w28,w23,w21 596 ror w14,w25,#2 597 add w24,w24,w6 // h+=X[i] 598 eor w16,w16,w21,ror#11 599 eor w13,w13,w8,ror#18 600 orr w17,w17,w28 // Ch(e,f,g) 601 eor w28,w25,w26 // a^b, b^c in next round 602 eor w16,w16,w21,ror#25 // Sigma1(e) 603 eor w14,w14,w25,ror#13 604 add w24,w24,w17 // h+=Ch(e,f,g) 605 and w19,w19,w28 // (b^c)&=(a^b) 606 eor w12,w12,w5,ror#19 607 eor w13,w13,w8,lsr#3 // sigma0(X[i+1]) 608 add w24,w24,w16 // h+=Sigma1(e) 609 eor w19,w19,w26 // Maj(a,b,c) 610 eor w17,w14,w25,ror#22 // Sigma0(a) 611 eor w12,w12,w5,lsr#10 // sigma1(X[i+14]) 612 add w7,w7,w0 613 add w20,w20,w24 // d+=h 614 add w24,w24,w19 // h+=Maj(a,b,c) 615 ldr w19,[x30],#4 // *K++, w28 in next round 616 add w7,w7,w13 617 add w24,w24,w17 // h+=Sigma0(a) 618 add w7,w7,w12 619 ldr w12,[sp,#4] 620 str w15,[sp,#0] 621 ror w16,w20,#6 622 add w23,w23,w19 // h+=K[i] 623 ror w14,w9,#7 624 and w17,w21,w20 625 ror w13,w6,#17 626 bic w19,w22,w20 627 ror w15,w24,#2 628 add w23,w23,w7 // h+=X[i] 629 eor w16,w16,w20,ror#11 630 eor w14,w14,w9,ror#18 631 orr w17,w17,w19 // Ch(e,f,g) 632 eor w19,w24,w25 // a^b, b^c in next round 633 eor w16,w16,w20,ror#25 // Sigma1(e) 634 eor w15,w15,w24,ror#13 635 add w23,w23,w17 // h+=Ch(e,f,g) 636 and w28,w28,w19 // (b^c)&=(a^b) 637 eor w13,w13,w6,ror#19 638 eor w14,w14,w9,lsr#3 // sigma0(X[i+1]) 639 add w23,w23,w16 // h+=Sigma1(e) 640 eor w28,w28,w25 // Maj(a,b,c) 641 eor w17,w15,w24,ror#22 // Sigma0(a) 642 eor w13,w13,w6,lsr#10 // sigma1(X[i+14]) 643 add w8,w8,w1 644 add w27,w27,w23 // d+=h 645 add w23,w23,w28 // h+=Maj(a,b,c) 646 ldr w28,[x30],#4 // *K++, w19 in next round 647 add w8,w8,w14 648 add w23,w23,w17 // h+=Sigma0(a) 649 add w8,w8,w13 650 ldr w13,[sp,#8] 651 str w0,[sp,#4] 652 ror w16,w27,#6 653 add w22,w22,w28 // h+=K[i] 654 ror w15,w10,#7 655 and w17,w20,w27 656 ror w14,w7,#17 657 bic w28,w21,w27 658 ror w0,w23,#2 659 add w22,w22,w8 // h+=X[i] 660 eor w16,w16,w27,ror#11 661 eor w15,w15,w10,ror#18 662 orr w17,w17,w28 // Ch(e,f,g) 663 eor w28,w23,w24 // a^b, b^c in next round 664 eor w16,w16,w27,ror#25 // Sigma1(e) 665 eor w0,w0,w23,ror#13 666 add w22,w22,w17 // h+=Ch(e,f,g) 667 and w19,w19,w28 // (b^c)&=(a^b) 668 eor w14,w14,w7,ror#19 669 eor w15,w15,w10,lsr#3 // sigma0(X[i+1]) 670 add w22,w22,w16 // h+=Sigma1(e) 671 eor w19,w19,w24 // Maj(a,b,c) 672 eor w17,w0,w23,ror#22 // Sigma0(a) 673 eor w14,w14,w7,lsr#10 // sigma1(X[i+14]) 674 add w9,w9,w2 675 add w26,w26,w22 // d+=h 676 add w22,w22,w19 // h+=Maj(a,b,c) 677 ldr w19,[x30],#4 // *K++, w28 in next round 678 add w9,w9,w15 679 add w22,w22,w17 // h+=Sigma0(a) 680 add w9,w9,w14 681 ldr w14,[sp,#12] 682 str w1,[sp,#8] 683 ror w16,w26,#6 684 add w21,w21,w19 // h+=K[i] 685 ror w0,w11,#7 686 and w17,w27,w26 687 ror w15,w8,#17 688 bic w19,w20,w26 689 ror w1,w22,#2 690 add w21,w21,w9 // h+=X[i] 691 eor w16,w16,w26,ror#11 692 eor w0,w0,w11,ror#18 693 orr w17,w17,w19 // Ch(e,f,g) 694 eor w19,w22,w23 // a^b, b^c in next round 695 eor w16,w16,w26,ror#25 // Sigma1(e) 696 eor w1,w1,w22,ror#13 697 add w21,w21,w17 // h+=Ch(e,f,g) 698 and w28,w28,w19 // (b^c)&=(a^b) 699 eor w15,w15,w8,ror#19 700 eor w0,w0,w11,lsr#3 // sigma0(X[i+1]) 701 add w21,w21,w16 // h+=Sigma1(e) 702 eor w28,w28,w23 // Maj(a,b,c) 703 eor w17,w1,w22,ror#22 // Sigma0(a) 704 eor w15,w15,w8,lsr#10 // sigma1(X[i+14]) 705 add w10,w10,w3 706 add w25,w25,w21 // d+=h 707 add w21,w21,w28 // h+=Maj(a,b,c) 708 ldr w28,[x30],#4 // *K++, w19 in next round 709 add w10,w10,w0 710 add w21,w21,w17 // h+=Sigma0(a) 711 add w10,w10,w15 712 ldr w15,[sp,#0] 713 str w2,[sp,#12] 714 ror w16,w25,#6 715 add w20,w20,w28 // h+=K[i] 716 ror w1,w12,#7 717 and w17,w26,w25 718 ror w0,w9,#17 719 bic w28,w27,w25 720 ror w2,w21,#2 721 add w20,w20,w10 // h+=X[i] 722 eor w16,w16,w25,ror#11 723 eor w1,w1,w12,ror#18 724 orr w17,w17,w28 // Ch(e,f,g) 725 eor w28,w21,w22 // a^b, b^c in next round 726 eor w16,w16,w25,ror#25 // Sigma1(e) 727 eor w2,w2,w21,ror#13 728 add w20,w20,w17 // h+=Ch(e,f,g) 729 and w19,w19,w28 // (b^c)&=(a^b) 730 eor w0,w0,w9,ror#19 731 eor w1,w1,w12,lsr#3 // sigma0(X[i+1]) 732 add w20,w20,w16 // h+=Sigma1(e) 733 eor w19,w19,w22 // Maj(a,b,c) 734 eor w17,w2,w21,ror#22 // Sigma0(a) 735 eor w0,w0,w9,lsr#10 // sigma1(X[i+14]) 736 add w11,w11,w4 737 add w24,w24,w20 // d+=h 738 add w20,w20,w19 // h+=Maj(a,b,c) 739 ldr w19,[x30],#4 // *K++, w28 in next round 740 add w11,w11,w1 741 add w20,w20,w17 // h+=Sigma0(a) 742 add w11,w11,w0 743 ldr w0,[sp,#4] 744 str w3,[sp,#0] 745 ror w16,w24,#6 746 add w27,w27,w19 // h+=K[i] 747 ror w2,w13,#7 748 and w17,w25,w24 749 ror w1,w10,#17 750 bic w19,w26,w24 751 ror w3,w20,#2 752 add w27,w27,w11 // h+=X[i] 753 eor w16,w16,w24,ror#11 754 eor w2,w2,w13,ror#18 755 orr w17,w17,w19 // Ch(e,f,g) 756 eor w19,w20,w21 // a^b, b^c in next round 757 eor w16,w16,w24,ror#25 // Sigma1(e) 758 eor w3,w3,w20,ror#13 759 add w27,w27,w17 // h+=Ch(e,f,g) 760 and w28,w28,w19 // (b^c)&=(a^b) 761 eor w1,w1,w10,ror#19 762 eor w2,w2,w13,lsr#3 // sigma0(X[i+1]) 763 add w27,w27,w16 // h+=Sigma1(e) 764 eor w28,w28,w21 // Maj(a,b,c) 765 eor w17,w3,w20,ror#22 // Sigma0(a) 766 eor w1,w1,w10,lsr#10 // sigma1(X[i+14]) 767 add w12,w12,w5 768 add w23,w23,w27 // d+=h 769 add w27,w27,w28 // h+=Maj(a,b,c) 770 ldr w28,[x30],#4 // *K++, w19 in next round 771 add w12,w12,w2 772 add w27,w27,w17 // h+=Sigma0(a) 773 add w12,w12,w1 774 ldr w1,[sp,#8] 775 str w4,[sp,#4] 776 ror w16,w23,#6 777 add w26,w26,w28 // h+=K[i] 778 ror w3,w14,#7 779 and w17,w24,w23 780 ror w2,w11,#17 781 bic w28,w25,w23 782 ror w4,w27,#2 783 add w26,w26,w12 // h+=X[i] 784 eor w16,w16,w23,ror#11 785 eor w3,w3,w14,ror#18 786 orr w17,w17,w28 // Ch(e,f,g) 787 eor w28,w27,w20 // a^b, b^c in next round 788 eor w16,w16,w23,ror#25 // Sigma1(e) 789 eor w4,w4,w27,ror#13 790 add w26,w26,w17 // h+=Ch(e,f,g) 791 and w19,w19,w28 // (b^c)&=(a^b) 792 eor w2,w2,w11,ror#19 793 eor w3,w3,w14,lsr#3 // sigma0(X[i+1]) 794 add w26,w26,w16 // h+=Sigma1(e) 795 eor w19,w19,w20 // Maj(a,b,c) 796 eor w17,w4,w27,ror#22 // Sigma0(a) 797 eor w2,w2,w11,lsr#10 // sigma1(X[i+14]) 798 add w13,w13,w6 799 add w22,w22,w26 // d+=h 800 add w26,w26,w19 // h+=Maj(a,b,c) 801 ldr w19,[x30],#4 // *K++, w28 in next round 802 add w13,w13,w3 803 add w26,w26,w17 // h+=Sigma0(a) 804 add w13,w13,w2 805 ldr w2,[sp,#12] 806 str w5,[sp,#8] 807 ror w16,w22,#6 808 add w25,w25,w19 // h+=K[i] 809 ror w4,w15,#7 810 and w17,w23,w22 811 ror w3,w12,#17 812 bic w19,w24,w22 813 ror w5,w26,#2 814 add w25,w25,w13 // h+=X[i] 815 eor w16,w16,w22,ror#11 816 eor w4,w4,w15,ror#18 817 orr w17,w17,w19 // Ch(e,f,g) 818 eor w19,w26,w27 // a^b, b^c in next round 819 eor w16,w16,w22,ror#25 // Sigma1(e) 820 eor w5,w5,w26,ror#13 821 add w25,w25,w17 // h+=Ch(e,f,g) 822 and w28,w28,w19 // (b^c)&=(a^b) 823 eor w3,w3,w12,ror#19 824 eor w4,w4,w15,lsr#3 // sigma0(X[i+1]) 825 add w25,w25,w16 // h+=Sigma1(e) 826 eor w28,w28,w27 // Maj(a,b,c) 827 eor w17,w5,w26,ror#22 // Sigma0(a) 828 eor w3,w3,w12,lsr#10 // sigma1(X[i+14]) 829 add w14,w14,w7 830 add w21,w21,w25 // d+=h 831 add w25,w25,w28 // h+=Maj(a,b,c) 832 ldr w28,[x30],#4 // *K++, w19 in next round 833 add w14,w14,w4 834 add w25,w25,w17 // h+=Sigma0(a) 835 add w14,w14,w3 836 ldr w3,[sp,#0] 837 str w6,[sp,#12] 838 ror w16,w21,#6 839 add w24,w24,w28 // h+=K[i] 840 ror w5,w0,#7 841 and w17,w22,w21 842 ror w4,w13,#17 843 bic w28,w23,w21 844 ror w6,w25,#2 845 add w24,w24,w14 // h+=X[i] 846 eor w16,w16,w21,ror#11 847 eor w5,w5,w0,ror#18 848 orr w17,w17,w28 // Ch(e,f,g) 849 eor w28,w25,w26 // a^b, b^c in next round 850 eor w16,w16,w21,ror#25 // Sigma1(e) 851 eor w6,w6,w25,ror#13 852 add w24,w24,w17 // h+=Ch(e,f,g) 853 and w19,w19,w28 // (b^c)&=(a^b) 854 eor w4,w4,w13,ror#19 855 eor w5,w5,w0,lsr#3 // sigma0(X[i+1]) 856 add w24,w24,w16 // h+=Sigma1(e) 857 eor w19,w19,w26 // Maj(a,b,c) 858 eor w17,w6,w25,ror#22 // Sigma0(a) 859 eor w4,w4,w13,lsr#10 // sigma1(X[i+14]) 860 add w15,w15,w8 861 add w20,w20,w24 // d+=h 862 add w24,w24,w19 // h+=Maj(a,b,c) 863 ldr w19,[x30],#4 // *K++, w28 in next round 864 add w15,w15,w5 865 add w24,w24,w17 // h+=Sigma0(a) 866 add w15,w15,w4 867 ldr w4,[sp,#4] 868 str w7,[sp,#0] 869 ror w16,w20,#6 870 add w23,w23,w19 // h+=K[i] 871 ror w6,w1,#7 872 and w17,w21,w20 873 ror w5,w14,#17 874 bic w19,w22,w20 875 ror w7,w24,#2 876 add w23,w23,w15 // h+=X[i] 877 eor w16,w16,w20,ror#11 878 eor w6,w6,w1,ror#18 879 orr w17,w17,w19 // Ch(e,f,g) 880 eor w19,w24,w25 // a^b, b^c in next round 881 eor w16,w16,w20,ror#25 // Sigma1(e) 882 eor w7,w7,w24,ror#13 883 add w23,w23,w17 // h+=Ch(e,f,g) 884 and w28,w28,w19 // (b^c)&=(a^b) 885 eor w5,w5,w14,ror#19 886 eor w6,w6,w1,lsr#3 // sigma0(X[i+1]) 887 add w23,w23,w16 // h+=Sigma1(e) 888 eor w28,w28,w25 // Maj(a,b,c) 889 eor w17,w7,w24,ror#22 // Sigma0(a) 890 eor w5,w5,w14,lsr#10 // sigma1(X[i+14]) 891 add w0,w0,w9 892 add w27,w27,w23 // d+=h 893 add w23,w23,w28 // h+=Maj(a,b,c) 894 ldr w28,[x30],#4 // *K++, w19 in next round 895 add w0,w0,w6 896 add w23,w23,w17 // h+=Sigma0(a) 897 add w0,w0,w5 898 ldr w5,[sp,#8] 899 str w8,[sp,#4] 900 ror w16,w27,#6 901 add w22,w22,w28 // h+=K[i] 902 ror w7,w2,#7 903 and w17,w20,w27 904 ror w6,w15,#17 905 bic w28,w21,w27 906 ror w8,w23,#2 907 add w22,w22,w0 // h+=X[i] 908 eor w16,w16,w27,ror#11 909 eor w7,w7,w2,ror#18 910 orr w17,w17,w28 // Ch(e,f,g) 911 eor w28,w23,w24 // a^b, b^c in next round 912 eor w16,w16,w27,ror#25 // Sigma1(e) 913 eor w8,w8,w23,ror#13 914 add w22,w22,w17 // h+=Ch(e,f,g) 915 and w19,w19,w28 // (b^c)&=(a^b) 916 eor w6,w6,w15,ror#19 917 eor w7,w7,w2,lsr#3 // sigma0(X[i+1]) 918 add w22,w22,w16 // h+=Sigma1(e) 919 eor w19,w19,w24 // Maj(a,b,c) 920 eor w17,w8,w23,ror#22 // Sigma0(a) 921 eor w6,w6,w15,lsr#10 // sigma1(X[i+14]) 922 add w1,w1,w10 923 add w26,w26,w22 // d+=h 924 add w22,w22,w19 // h+=Maj(a,b,c) 925 ldr w19,[x30],#4 // *K++, w28 in next round 926 add w1,w1,w7 927 add w22,w22,w17 // h+=Sigma0(a) 928 add w1,w1,w6 929 ldr w6,[sp,#12] 930 str w9,[sp,#8] 931 ror w16,w26,#6 932 add w21,w21,w19 // h+=K[i] 933 ror w8,w3,#7 934 and w17,w27,w26 935 ror w7,w0,#17 936 bic w19,w20,w26 937 ror w9,w22,#2 938 add w21,w21,w1 // h+=X[i] 939 eor w16,w16,w26,ror#11 940 eor w8,w8,w3,ror#18 941 orr w17,w17,w19 // Ch(e,f,g) 942 eor w19,w22,w23 // a^b, b^c in next round 943 eor w16,w16,w26,ror#25 // Sigma1(e) 944 eor w9,w9,w22,ror#13 945 add w21,w21,w17 // h+=Ch(e,f,g) 946 and w28,w28,w19 // (b^c)&=(a^b) 947 eor w7,w7,w0,ror#19 948 eor w8,w8,w3,lsr#3 // sigma0(X[i+1]) 949 add w21,w21,w16 // h+=Sigma1(e) 950 eor w28,w28,w23 // Maj(a,b,c) 951 eor w17,w9,w22,ror#22 // Sigma0(a) 952 eor w7,w7,w0,lsr#10 // sigma1(X[i+14]) 953 add w2,w2,w11 954 add w25,w25,w21 // d+=h 955 add w21,w21,w28 // h+=Maj(a,b,c) 956 ldr w28,[x30],#4 // *K++, w19 in next round 957 add w2,w2,w8 958 add w21,w21,w17 // h+=Sigma0(a) 959 add w2,w2,w7 960 ldr w7,[sp,#0] 961 str w10,[sp,#12] 962 ror w16,w25,#6 963 add w20,w20,w28 // h+=K[i] 964 ror w9,w4,#7 965 and w17,w26,w25 966 ror w8,w1,#17 967 bic w28,w27,w25 968 ror w10,w21,#2 969 add w20,w20,w2 // h+=X[i] 970 eor w16,w16,w25,ror#11 971 eor w9,w9,w4,ror#18 972 orr w17,w17,w28 // Ch(e,f,g) 973 eor w28,w21,w22 // a^b, b^c in next round 974 eor w16,w16,w25,ror#25 // Sigma1(e) 975 eor w10,w10,w21,ror#13 976 add w20,w20,w17 // h+=Ch(e,f,g) 977 and w19,w19,w28 // (b^c)&=(a^b) 978 eor w8,w8,w1,ror#19 979 eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) 980 add w20,w20,w16 // h+=Sigma1(e) 981 eor w19,w19,w22 // Maj(a,b,c) 982 eor w17,w10,w21,ror#22 // Sigma0(a) 983 eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) 984 add w3,w3,w12 985 add w24,w24,w20 // d+=h 986 add w20,w20,w19 // h+=Maj(a,b,c) 987 ldr w19,[x30],#4 // *K++, w28 in next round 988 add w3,w3,w9 989 add w20,w20,w17 // h+=Sigma0(a) 990 add w3,w3,w8 991 cbnz w19,.Loop_16_xx 992 993 ldp x0,x2,[x29,#96] 994 ldr x1,[x29,#112] 995 sub x30,x30,#260 // rewind 996 997 ldp w3,w4,[x0] 998 ldp w5,w6,[x0,#2*4] 999 add x1,x1,#14*4 // advance input pointer 1000 ldp w7,w8,[x0,#4*4] 1001 add w20,w20,w3 1002 ldp w9,w10,[x0,#6*4] 1003 add w21,w21,w4 1004 add w22,w22,w5 1005 add w23,w23,w6 1006 stp w20,w21,[x0] 1007 add w24,w24,w7 1008 add w25,w25,w8 1009 stp w22,w23,[x0,#2*4] 1010 add w26,w26,w9 1011 add w27,w27,w10 1012 cmp x1,x2 1013 stp w24,w25,[x0,#4*4] 1014 stp w26,w27,[x0,#6*4] 1015 b.ne .Loop 1016 1017 ldp x19,x20,[x29,#16] 1018 add sp,sp,#4*4 1019 ldp x21,x22,[x29,#32] 1020 ldp x23,x24,[x29,#48] 1021 ldp x25,x26,[x29,#64] 1022 ldp x27,x28,[x29,#80] 1023 ldp x29,x30,[sp],#128 1024 ret 1025.size sha256_block_data_order,.-sha256_block_data_order 1026 1027.align 6 1028.type .LK256,%object 1029.LK256: 1030.long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 1031.long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 1032.long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 1033.long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 1034.long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc 1035.long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da 1036.long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 1037.long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 1038.long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 1039.long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 1040.long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 1041.long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 1042.long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 1043.long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 1044.long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 1045.long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 1046.long 0 //terminator 1047.size .LK256,.-.LK256 1048#ifndef __KERNEL__ 1049.align 3 1050.LOPENSSL_armcap_P: 1051# ifdef __ILP32__ 1052.long OPENSSL_armcap_P-. 1053# else 1054.quad OPENSSL_armcap_P-. 1055# endif 1056#endif 1057.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 1058.align 2 1059.align 2 1060#ifndef __KERNEL__ 1061.type sha256_block_armv8,%function 1062.align 6 1063sha256_block_armv8: 1064.Lv8_entry: 1065 stp x29,x30,[sp,#-16]! 1066 add x29,sp,#0 1067 1068 ld1 {v0.4s,v1.4s},[x0] 1069 adr x3,.LK256 1070 1071.Loop_hw: 1072 ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 1073 sub x2,x2,#1 1074 ld1 {v16.4s},[x3],#16 1075 rev32 v4.16b,v4.16b 1076 rev32 v5.16b,v5.16b 1077 rev32 v6.16b,v6.16b 1078 rev32 v7.16b,v7.16b 1079 orr v18.16b,v0.16b,v0.16b // offload 1080 orr v19.16b,v1.16b,v1.16b 1081 ld1 {v17.4s},[x3],#16 1082 add v16.4s,v16.4s,v4.4s 1083.inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b 1084 orr v2.16b,v0.16b,v0.16b 1085.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1086.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1087.inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b 1088 ld1 {v16.4s},[x3],#16 1089 add v17.4s,v17.4s,v5.4s 1090.inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b 1091 orr v2.16b,v0.16b,v0.16b 1092.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1093.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1094.inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b 1095 ld1 {v17.4s},[x3],#16 1096 add v16.4s,v16.4s,v6.4s 1097.inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b 1098 orr v2.16b,v0.16b,v0.16b 1099.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1100.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1101.inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b 1102 ld1 {v16.4s},[x3],#16 1103 add v17.4s,v17.4s,v7.4s 1104.inst 0x5e282887 //sha256su0 v7.16b,v4.16b 1105 orr v2.16b,v0.16b,v0.16b 1106.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1107.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1108.inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b 1109 ld1 {v17.4s},[x3],#16 1110 add v16.4s,v16.4s,v4.4s 1111.inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b 1112 orr v2.16b,v0.16b,v0.16b 1113.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1114.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1115.inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b 1116 ld1 {v16.4s},[x3],#16 1117 add v17.4s,v17.4s,v5.4s 1118.inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b 1119 orr v2.16b,v0.16b,v0.16b 1120.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1121.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1122.inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b 1123 ld1 {v17.4s},[x3],#16 1124 add v16.4s,v16.4s,v6.4s 1125.inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b 1126 orr v2.16b,v0.16b,v0.16b 1127.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1128.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1129.inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b 1130 ld1 {v16.4s},[x3],#16 1131 add v17.4s,v17.4s,v7.4s 1132.inst 0x5e282887 //sha256su0 v7.16b,v4.16b 1133 orr v2.16b,v0.16b,v0.16b 1134.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1135.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1136.inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b 1137 ld1 {v17.4s},[x3],#16 1138 add v16.4s,v16.4s,v4.4s 1139.inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b 1140 orr v2.16b,v0.16b,v0.16b 1141.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1142.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1143.inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b 1144 ld1 {v16.4s},[x3],#16 1145 add v17.4s,v17.4s,v5.4s 1146.inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b 1147 orr v2.16b,v0.16b,v0.16b 1148.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1149.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1150.inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b 1151 ld1 {v17.4s},[x3],#16 1152 add v16.4s,v16.4s,v6.4s 1153.inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b 1154 orr v2.16b,v0.16b,v0.16b 1155.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1156.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1157.inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b 1158 ld1 {v16.4s},[x3],#16 1159 add v17.4s,v17.4s,v7.4s 1160.inst 0x5e282887 //sha256su0 v7.16b,v4.16b 1161 orr v2.16b,v0.16b,v0.16b 1162.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1163.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1164.inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b 1165 ld1 {v17.4s},[x3],#16 1166 add v16.4s,v16.4s,v4.4s 1167 orr v2.16b,v0.16b,v0.16b 1168.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1169.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1170 1171 ld1 {v16.4s},[x3],#16 1172 add v17.4s,v17.4s,v5.4s 1173 orr v2.16b,v0.16b,v0.16b 1174.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1175.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1176 1177 ld1 {v17.4s},[x3] 1178 add v16.4s,v16.4s,v6.4s 1179 sub x3,x3,#64*4-16 // rewind 1180 orr v2.16b,v0.16b,v0.16b 1181.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s 1182.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s 1183 1184 add v17.4s,v17.4s,v7.4s 1185 orr v2.16b,v0.16b,v0.16b 1186.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s 1187.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s 1188 1189 add v0.4s,v0.4s,v18.4s 1190 add v1.4s,v1.4s,v19.4s 1191 1192 cbnz x2,.Loop_hw 1193 1194 st1 {v0.4s,v1.4s},[x0] 1195 1196 ldr x29,[sp],#16 1197 ret 1198.size sha256_block_armv8,.-sha256_block_armv8 1199#endif 1200#ifndef __KERNEL__ 1201.comm OPENSSL_armcap_P,4,4 1202#endif 1203#endif 1204