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