1// This file is generated from a similarly-named Perl script in the BoringSSL 2// source tree. Do not edit by hand. 3 4#if !defined(__has_feature) 5#define __has_feature(x) 0 6#endif 7#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) 8#define OPENSSL_NO_ASM 9#endif 10 11#if !defined(OPENSSL_NO_ASM) 12#include <GFp/arm_arch.h> 13 14@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both 15@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. 16 17 18.text 19#if defined(__thumb2__) 20.syntax unified 21.thumb 22#else 23.code 32 24#endif 25 26#if __ARM_MAX_ARCH__>=7 27 28.private_extern _GFp_armcap_P 29.align 5 30LOPENSSL_armcap: 31.word _GFp_armcap_P-Lbn_mul_mont 32#endif 33 34.globl _GFp_bn_mul_mont 35.private_extern _GFp_bn_mul_mont 36#ifdef __thumb2__ 37.thumb_func _GFp_bn_mul_mont 38#endif 39 40.align 5 41_GFp_bn_mul_mont: 42Lbn_mul_mont: 43 ldr ip,[sp,#4] @ load num 44 stmdb sp!,{r0,r2} @ sp points at argument block 45#if __ARM_MAX_ARCH__>=7 46 tst ip,#7 47 bne Lialu 48 adr r0,Lbn_mul_mont 49 ldr r2,LOPENSSL_armcap 50 ldr r0,[r0,r2] 51#ifdef __APPLE__ 52 ldr r0,[r0] 53#endif 54 tst r0,#ARMV7_NEON @ NEON available? 55 ldmia sp, {r0,r2} 56 beq Lialu 57 add sp,sp,#8 58 b bn_mul8x_mont_neon 59.align 4 60Lialu: 61#endif 62 cmp ip,#2 63 mov r0,ip @ load num 64#ifdef __thumb2__ 65 ittt lt 66#endif 67 movlt r0,#0 68 addlt sp,sp,#2*4 69 blt Labrt 70 71 stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ save 10 registers 72 73 mov r0,r0,lsl#2 @ rescale r0 for byte count 74 sub sp,sp,r0 @ alloca(4*num) 75 sub sp,sp,#4 @ +extra dword 76 sub r0,r0,#4 @ "num=num-1" 77 add r4,r2,r0 @ &bp[num-1] 78 79 add r0,sp,r0 @ r0 to point at &tp[num-1] 80 ldr r8,[r0,#14*4] @ &n0 81 ldr r2,[r2] @ bp[0] 82 ldr r5,[r1],#4 @ ap[0],ap++ 83 ldr r6,[r3],#4 @ np[0],np++ 84 ldr r8,[r8] @ *n0 85 str r4,[r0,#15*4] @ save &bp[num] 86 87 umull r10,r11,r5,r2 @ ap[0]*bp[0] 88 str r8,[r0,#14*4] @ save n0 value 89 mul r8,r10,r8 @ "tp[0]"*n0 90 mov r12,#0 91 umlal r10,r12,r6,r8 @ np[0]*n0+"t[0]" 92 mov r4,sp 93 94L1st: 95 ldr r5,[r1],#4 @ ap[j],ap++ 96 mov r10,r11 97 ldr r6,[r3],#4 @ np[j],np++ 98 mov r11,#0 99 umlal r10,r11,r5,r2 @ ap[j]*bp[0] 100 mov r14,#0 101 umlal r12,r14,r6,r8 @ np[j]*n0 102 adds r12,r12,r10 103 str r12,[r4],#4 @ tp[j-1]=,tp++ 104 adc r12,r14,#0 105 cmp r4,r0 106 bne L1st 107 108 adds r12,r12,r11 109 ldr r4,[r0,#13*4] @ restore bp 110 mov r14,#0 111 ldr r8,[r0,#14*4] @ restore n0 112 adc r14,r14,#0 113 str r12,[r0] @ tp[num-1]= 114 mov r7,sp 115 str r14,[r0,#4] @ tp[num]= 116 117Louter: 118 sub r7,r0,r7 @ "original" r0-1 value 119 sub r1,r1,r7 @ "rewind" ap to &ap[1] 120 ldr r2,[r4,#4]! @ *(++bp) 121 sub r3,r3,r7 @ "rewind" np to &np[1] 122 ldr r5,[r1,#-4] @ ap[0] 123 ldr r10,[sp] @ tp[0] 124 ldr r6,[r3,#-4] @ np[0] 125 ldr r7,[sp,#4] @ tp[1] 126 127 mov r11,#0 128 umlal r10,r11,r5,r2 @ ap[0]*bp[i]+tp[0] 129 str r4,[r0,#13*4] @ save bp 130 mul r8,r10,r8 131 mov r12,#0 132 umlal r10,r12,r6,r8 @ np[0]*n0+"tp[0]" 133 mov r4,sp 134 135Linner: 136 ldr r5,[r1],#4 @ ap[j],ap++ 137 adds r10,r11,r7 @ +=tp[j] 138 ldr r6,[r3],#4 @ np[j],np++ 139 mov r11,#0 140 umlal r10,r11,r5,r2 @ ap[j]*bp[i] 141 mov r14,#0 142 umlal r12,r14,r6,r8 @ np[j]*n0 143 adc r11,r11,#0 144 ldr r7,[r4,#8] @ tp[j+1] 145 adds r12,r12,r10 146 str r12,[r4],#4 @ tp[j-1]=,tp++ 147 adc r12,r14,#0 148 cmp r4,r0 149 bne Linner 150 151 adds r12,r12,r11 152 mov r14,#0 153 ldr r4,[r0,#13*4] @ restore bp 154 adc r14,r14,#0 155 ldr r8,[r0,#14*4] @ restore n0 156 adds r12,r12,r7 157 ldr r7,[r0,#15*4] @ restore &bp[num] 158 adc r14,r14,#0 159 str r12,[r0] @ tp[num-1]= 160 str r14,[r0,#4] @ tp[num]= 161 162 cmp r4,r7 163#ifdef __thumb2__ 164 itt ne 165#endif 166 movne r7,sp 167 bne Louter 168 169 ldr r2,[r0,#12*4] @ pull rp 170 mov r5,sp 171 add r0,r0,#4 @ r0 to point at &tp[num] 172 sub r5,r0,r5 @ "original" num value 173 mov r4,sp @ "rewind" r4 174 mov r1,r4 @ "borrow" r1 175 sub r3,r3,r5 @ "rewind" r3 to &np[0] 176 177 subs r7,r7,r7 @ "clear" carry flag 178Lsub: ldr r7,[r4],#4 179 ldr r6,[r3],#4 180 sbcs r7,r7,r6 @ tp[j]-np[j] 181 str r7,[r2],#4 @ rp[j]= 182 teq r4,r0 @ preserve carry 183 bne Lsub 184 sbcs r14,r14,#0 @ upmost carry 185 mov r4,sp @ "rewind" r4 186 sub r2,r2,r5 @ "rewind" r2 187 188Lcopy: ldr r7,[r4] @ conditional copy 189 ldr r5,[r2] 190 str sp,[r4],#4 @ zap tp 191#ifdef __thumb2__ 192 it cc 193#endif 194 movcc r5,r7 195 str r5,[r2],#4 196 teq r4,r0 @ preserve carry 197 bne Lcopy 198 199 mov sp,r0 200 add sp,sp,#4 @ skip over tp[num+1] 201 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ restore registers 202 add sp,sp,#2*4 @ skip over {r0,r2} 203 mov r0,#1 204Labrt: 205#if __ARM_ARCH__>=5 206 bx lr @ bx lr 207#else 208 tst lr,#1 209 moveq pc,lr @ be binary compatible with V4, yet 210.word 0xe12fff1e @ interoperable with Thumb ISA:-) 211#endif 212 213#if __ARM_MAX_ARCH__>=7 214 215 216 217#ifdef __thumb2__ 218.thumb_func bn_mul8x_mont_neon 219#endif 220.align 5 221bn_mul8x_mont_neon: 222 mov ip,sp 223 stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} 224 vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so 225 ldmia ip,{r4,r5} @ load rest of parameter block 226 mov ip,sp 227 228 cmp r5,#8 229 bhi LNEON_8n 230 231 @ special case for r5==8, everything is in register bank... 232 233 vld1.32 {d28[0]}, [r2,:32]! 234 veor d8,d8,d8 235 sub r7,sp,r5,lsl#4 236 vld1.32 {d0,d1,d2,d3}, [r1]! @ can't specify :32 :-( 237 and r7,r7,#-64 238 vld1.32 {d30[0]}, [r4,:32] 239 mov sp,r7 @ alloca 240 vzip.16 d28,d8 241 242 vmull.u32 q6,d28,d0[0] 243 vmull.u32 q7,d28,d0[1] 244 vmull.u32 q8,d28,d1[0] 245 vshl.i64 d29,d13,#16 246 vmull.u32 q9,d28,d1[1] 247 248 vadd.u64 d29,d29,d12 249 veor d8,d8,d8 250 vmul.u32 d29,d29,d30 251 252 vmull.u32 q10,d28,d2[0] 253 vld1.32 {d4,d5,d6,d7}, [r3]! 254 vmull.u32 q11,d28,d2[1] 255 vmull.u32 q12,d28,d3[0] 256 vzip.16 d29,d8 257 vmull.u32 q13,d28,d3[1] 258 259 vmlal.u32 q6,d29,d4[0] 260 sub r9,r5,#1 261 vmlal.u32 q7,d29,d4[1] 262 vmlal.u32 q8,d29,d5[0] 263 vmlal.u32 q9,d29,d5[1] 264 265 vmlal.u32 q10,d29,d6[0] 266 vmov q5,q6 267 vmlal.u32 q11,d29,d6[1] 268 vmov q6,q7 269 vmlal.u32 q12,d29,d7[0] 270 vmov q7,q8 271 vmlal.u32 q13,d29,d7[1] 272 vmov q8,q9 273 vmov q9,q10 274 vshr.u64 d10,d10,#16 275 vmov q10,q11 276 vmov q11,q12 277 vadd.u64 d10,d10,d11 278 vmov q12,q13 279 veor q13,q13 280 vshr.u64 d10,d10,#16 281 282 b LNEON_outer8 283 284.align 4 285LNEON_outer8: 286 vld1.32 {d28[0]}, [r2,:32]! 287 veor d8,d8,d8 288 vzip.16 d28,d8 289 vadd.u64 d12,d12,d10 290 291 vmlal.u32 q6,d28,d0[0] 292 vmlal.u32 q7,d28,d0[1] 293 vmlal.u32 q8,d28,d1[0] 294 vshl.i64 d29,d13,#16 295 vmlal.u32 q9,d28,d1[1] 296 297 vadd.u64 d29,d29,d12 298 veor d8,d8,d8 299 subs r9,r9,#1 300 vmul.u32 d29,d29,d30 301 302 vmlal.u32 q10,d28,d2[0] 303 vmlal.u32 q11,d28,d2[1] 304 vmlal.u32 q12,d28,d3[0] 305 vzip.16 d29,d8 306 vmlal.u32 q13,d28,d3[1] 307 308 vmlal.u32 q6,d29,d4[0] 309 vmlal.u32 q7,d29,d4[1] 310 vmlal.u32 q8,d29,d5[0] 311 vmlal.u32 q9,d29,d5[1] 312 313 vmlal.u32 q10,d29,d6[0] 314 vmov q5,q6 315 vmlal.u32 q11,d29,d6[1] 316 vmov q6,q7 317 vmlal.u32 q12,d29,d7[0] 318 vmov q7,q8 319 vmlal.u32 q13,d29,d7[1] 320 vmov q8,q9 321 vmov q9,q10 322 vshr.u64 d10,d10,#16 323 vmov q10,q11 324 vmov q11,q12 325 vadd.u64 d10,d10,d11 326 vmov q12,q13 327 veor q13,q13 328 vshr.u64 d10,d10,#16 329 330 bne LNEON_outer8 331 332 vadd.u64 d12,d12,d10 333 mov r7,sp 334 vshr.u64 d10,d12,#16 335 mov r8,r5 336 vadd.u64 d13,d13,d10 337 add r6,sp,#96 338 vshr.u64 d10,d13,#16 339 vzip.16 d12,d13 340 341 b LNEON_tail_entry 342 343.align 4 344LNEON_8n: 345 veor q6,q6,q6 346 sub r7,sp,#128 347 veor q7,q7,q7 348 sub r7,r7,r5,lsl#4 349 veor q8,q8,q8 350 and r7,r7,#-64 351 veor q9,q9,q9 352 mov sp,r7 @ alloca 353 veor q10,q10,q10 354 add r7,r7,#256 355 veor q11,q11,q11 356 sub r8,r5,#8 357 veor q12,q12,q12 358 veor q13,q13,q13 359 360LNEON_8n_init: 361 vst1.64 {q6,q7},[r7,:256]! 362 subs r8,r8,#8 363 vst1.64 {q8,q9},[r7,:256]! 364 vst1.64 {q10,q11},[r7,:256]! 365 vst1.64 {q12,q13},[r7,:256]! 366 bne LNEON_8n_init 367 368 add r6,sp,#256 369 vld1.32 {d0,d1,d2,d3},[r1]! 370 add r10,sp,#8 371 vld1.32 {d30[0]},[r4,:32] 372 mov r9,r5 373 b LNEON_8n_outer 374 375.align 4 376LNEON_8n_outer: 377 vld1.32 {d28[0]},[r2,:32]! @ *b++ 378 veor d8,d8,d8 379 vzip.16 d28,d8 380 add r7,sp,#128 381 vld1.32 {d4,d5,d6,d7},[r3]! 382 383 vmlal.u32 q6,d28,d0[0] 384 vmlal.u32 q7,d28,d0[1] 385 veor d8,d8,d8 386 vmlal.u32 q8,d28,d1[0] 387 vshl.i64 d29,d13,#16 388 vmlal.u32 q9,d28,d1[1] 389 vadd.u64 d29,d29,d12 390 vmlal.u32 q10,d28,d2[0] 391 vmul.u32 d29,d29,d30 392 vmlal.u32 q11,d28,d2[1] 393 vst1.32 {d28},[sp,:64] @ put aside smashed b[8*i+0] 394 vmlal.u32 q12,d28,d3[0] 395 vzip.16 d29,d8 396 vmlal.u32 q13,d28,d3[1] 397 vld1.32 {d28[0]},[r2,:32]! @ *b++ 398 vmlal.u32 q6,d29,d4[0] 399 veor d10,d10,d10 400 vmlal.u32 q7,d29,d4[1] 401 vzip.16 d28,d10 402 vmlal.u32 q8,d29,d5[0] 403 vshr.u64 d12,d12,#16 404 vmlal.u32 q9,d29,d5[1] 405 vmlal.u32 q10,d29,d6[0] 406 vadd.u64 d12,d12,d13 407 vmlal.u32 q11,d29,d6[1] 408 vshr.u64 d12,d12,#16 409 vmlal.u32 q12,d29,d7[0] 410 vmlal.u32 q13,d29,d7[1] 411 vadd.u64 d14,d14,d12 412 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+0] 413 vmlal.u32 q7,d28,d0[0] 414 vld1.64 {q6},[r6,:128]! 415 vmlal.u32 q8,d28,d0[1] 416 veor d8,d8,d8 417 vmlal.u32 q9,d28,d1[0] 418 vshl.i64 d29,d15,#16 419 vmlal.u32 q10,d28,d1[1] 420 vadd.u64 d29,d29,d14 421 vmlal.u32 q11,d28,d2[0] 422 vmul.u32 d29,d29,d30 423 vmlal.u32 q12,d28,d2[1] 424 vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+1] 425 vmlal.u32 q13,d28,d3[0] 426 vzip.16 d29,d8 427 vmlal.u32 q6,d28,d3[1] 428 vld1.32 {d28[0]},[r2,:32]! @ *b++ 429 vmlal.u32 q7,d29,d4[0] 430 veor d10,d10,d10 431 vmlal.u32 q8,d29,d4[1] 432 vzip.16 d28,d10 433 vmlal.u32 q9,d29,d5[0] 434 vshr.u64 d14,d14,#16 435 vmlal.u32 q10,d29,d5[1] 436 vmlal.u32 q11,d29,d6[0] 437 vadd.u64 d14,d14,d15 438 vmlal.u32 q12,d29,d6[1] 439 vshr.u64 d14,d14,#16 440 vmlal.u32 q13,d29,d7[0] 441 vmlal.u32 q6,d29,d7[1] 442 vadd.u64 d16,d16,d14 443 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+1] 444 vmlal.u32 q8,d28,d0[0] 445 vld1.64 {q7},[r6,:128]! 446 vmlal.u32 q9,d28,d0[1] 447 veor d8,d8,d8 448 vmlal.u32 q10,d28,d1[0] 449 vshl.i64 d29,d17,#16 450 vmlal.u32 q11,d28,d1[1] 451 vadd.u64 d29,d29,d16 452 vmlal.u32 q12,d28,d2[0] 453 vmul.u32 d29,d29,d30 454 vmlal.u32 q13,d28,d2[1] 455 vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+2] 456 vmlal.u32 q6,d28,d3[0] 457 vzip.16 d29,d8 458 vmlal.u32 q7,d28,d3[1] 459 vld1.32 {d28[0]},[r2,:32]! @ *b++ 460 vmlal.u32 q8,d29,d4[0] 461 veor d10,d10,d10 462 vmlal.u32 q9,d29,d4[1] 463 vzip.16 d28,d10 464 vmlal.u32 q10,d29,d5[0] 465 vshr.u64 d16,d16,#16 466 vmlal.u32 q11,d29,d5[1] 467 vmlal.u32 q12,d29,d6[0] 468 vadd.u64 d16,d16,d17 469 vmlal.u32 q13,d29,d6[1] 470 vshr.u64 d16,d16,#16 471 vmlal.u32 q6,d29,d7[0] 472 vmlal.u32 q7,d29,d7[1] 473 vadd.u64 d18,d18,d16 474 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+2] 475 vmlal.u32 q9,d28,d0[0] 476 vld1.64 {q8},[r6,:128]! 477 vmlal.u32 q10,d28,d0[1] 478 veor d8,d8,d8 479 vmlal.u32 q11,d28,d1[0] 480 vshl.i64 d29,d19,#16 481 vmlal.u32 q12,d28,d1[1] 482 vadd.u64 d29,d29,d18 483 vmlal.u32 q13,d28,d2[0] 484 vmul.u32 d29,d29,d30 485 vmlal.u32 q6,d28,d2[1] 486 vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+3] 487 vmlal.u32 q7,d28,d3[0] 488 vzip.16 d29,d8 489 vmlal.u32 q8,d28,d3[1] 490 vld1.32 {d28[0]},[r2,:32]! @ *b++ 491 vmlal.u32 q9,d29,d4[0] 492 veor d10,d10,d10 493 vmlal.u32 q10,d29,d4[1] 494 vzip.16 d28,d10 495 vmlal.u32 q11,d29,d5[0] 496 vshr.u64 d18,d18,#16 497 vmlal.u32 q12,d29,d5[1] 498 vmlal.u32 q13,d29,d6[0] 499 vadd.u64 d18,d18,d19 500 vmlal.u32 q6,d29,d6[1] 501 vshr.u64 d18,d18,#16 502 vmlal.u32 q7,d29,d7[0] 503 vmlal.u32 q8,d29,d7[1] 504 vadd.u64 d20,d20,d18 505 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+3] 506 vmlal.u32 q10,d28,d0[0] 507 vld1.64 {q9},[r6,:128]! 508 vmlal.u32 q11,d28,d0[1] 509 veor d8,d8,d8 510 vmlal.u32 q12,d28,d1[0] 511 vshl.i64 d29,d21,#16 512 vmlal.u32 q13,d28,d1[1] 513 vadd.u64 d29,d29,d20 514 vmlal.u32 q6,d28,d2[0] 515 vmul.u32 d29,d29,d30 516 vmlal.u32 q7,d28,d2[1] 517 vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+4] 518 vmlal.u32 q8,d28,d3[0] 519 vzip.16 d29,d8 520 vmlal.u32 q9,d28,d3[1] 521 vld1.32 {d28[0]},[r2,:32]! @ *b++ 522 vmlal.u32 q10,d29,d4[0] 523 veor d10,d10,d10 524 vmlal.u32 q11,d29,d4[1] 525 vzip.16 d28,d10 526 vmlal.u32 q12,d29,d5[0] 527 vshr.u64 d20,d20,#16 528 vmlal.u32 q13,d29,d5[1] 529 vmlal.u32 q6,d29,d6[0] 530 vadd.u64 d20,d20,d21 531 vmlal.u32 q7,d29,d6[1] 532 vshr.u64 d20,d20,#16 533 vmlal.u32 q8,d29,d7[0] 534 vmlal.u32 q9,d29,d7[1] 535 vadd.u64 d22,d22,d20 536 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+4] 537 vmlal.u32 q11,d28,d0[0] 538 vld1.64 {q10},[r6,:128]! 539 vmlal.u32 q12,d28,d0[1] 540 veor d8,d8,d8 541 vmlal.u32 q13,d28,d1[0] 542 vshl.i64 d29,d23,#16 543 vmlal.u32 q6,d28,d1[1] 544 vadd.u64 d29,d29,d22 545 vmlal.u32 q7,d28,d2[0] 546 vmul.u32 d29,d29,d30 547 vmlal.u32 q8,d28,d2[1] 548 vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+5] 549 vmlal.u32 q9,d28,d3[0] 550 vzip.16 d29,d8 551 vmlal.u32 q10,d28,d3[1] 552 vld1.32 {d28[0]},[r2,:32]! @ *b++ 553 vmlal.u32 q11,d29,d4[0] 554 veor d10,d10,d10 555 vmlal.u32 q12,d29,d4[1] 556 vzip.16 d28,d10 557 vmlal.u32 q13,d29,d5[0] 558 vshr.u64 d22,d22,#16 559 vmlal.u32 q6,d29,d5[1] 560 vmlal.u32 q7,d29,d6[0] 561 vadd.u64 d22,d22,d23 562 vmlal.u32 q8,d29,d6[1] 563 vshr.u64 d22,d22,#16 564 vmlal.u32 q9,d29,d7[0] 565 vmlal.u32 q10,d29,d7[1] 566 vadd.u64 d24,d24,d22 567 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+5] 568 vmlal.u32 q12,d28,d0[0] 569 vld1.64 {q11},[r6,:128]! 570 vmlal.u32 q13,d28,d0[1] 571 veor d8,d8,d8 572 vmlal.u32 q6,d28,d1[0] 573 vshl.i64 d29,d25,#16 574 vmlal.u32 q7,d28,d1[1] 575 vadd.u64 d29,d29,d24 576 vmlal.u32 q8,d28,d2[0] 577 vmul.u32 d29,d29,d30 578 vmlal.u32 q9,d28,d2[1] 579 vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+6] 580 vmlal.u32 q10,d28,d3[0] 581 vzip.16 d29,d8 582 vmlal.u32 q11,d28,d3[1] 583 vld1.32 {d28[0]},[r2,:32]! @ *b++ 584 vmlal.u32 q12,d29,d4[0] 585 veor d10,d10,d10 586 vmlal.u32 q13,d29,d4[1] 587 vzip.16 d28,d10 588 vmlal.u32 q6,d29,d5[0] 589 vshr.u64 d24,d24,#16 590 vmlal.u32 q7,d29,d5[1] 591 vmlal.u32 q8,d29,d6[0] 592 vadd.u64 d24,d24,d25 593 vmlal.u32 q9,d29,d6[1] 594 vshr.u64 d24,d24,#16 595 vmlal.u32 q10,d29,d7[0] 596 vmlal.u32 q11,d29,d7[1] 597 vadd.u64 d26,d26,d24 598 vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+6] 599 vmlal.u32 q13,d28,d0[0] 600 vld1.64 {q12},[r6,:128]! 601 vmlal.u32 q6,d28,d0[1] 602 veor d8,d8,d8 603 vmlal.u32 q7,d28,d1[0] 604 vshl.i64 d29,d27,#16 605 vmlal.u32 q8,d28,d1[1] 606 vadd.u64 d29,d29,d26 607 vmlal.u32 q9,d28,d2[0] 608 vmul.u32 d29,d29,d30 609 vmlal.u32 q10,d28,d2[1] 610 vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+7] 611 vmlal.u32 q11,d28,d3[0] 612 vzip.16 d29,d8 613 vmlal.u32 q12,d28,d3[1] 614 vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0] 615 vmlal.u32 q13,d29,d4[0] 616 vld1.32 {d0,d1,d2,d3},[r1]! 617 vmlal.u32 q6,d29,d4[1] 618 vmlal.u32 q7,d29,d5[0] 619 vshr.u64 d26,d26,#16 620 vmlal.u32 q8,d29,d5[1] 621 vmlal.u32 q9,d29,d6[0] 622 vadd.u64 d26,d26,d27 623 vmlal.u32 q10,d29,d6[1] 624 vshr.u64 d26,d26,#16 625 vmlal.u32 q11,d29,d7[0] 626 vmlal.u32 q12,d29,d7[1] 627 vadd.u64 d12,d12,d26 628 vst1.32 {d29},[r10,:64] @ put aside smashed m[8*i+7] 629 add r10,sp,#8 @ rewind 630 sub r8,r5,#8 631 b LNEON_8n_inner 632 633.align 4 634LNEON_8n_inner: 635 subs r8,r8,#8 636 vmlal.u32 q6,d28,d0[0] 637 vld1.64 {q13},[r6,:128] 638 vmlal.u32 q7,d28,d0[1] 639 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+0] 640 vmlal.u32 q8,d28,d1[0] 641 vld1.32 {d4,d5,d6,d7},[r3]! 642 vmlal.u32 q9,d28,d1[1] 643 it ne 644 addne r6,r6,#16 @ don't advance in last iteration 645 vmlal.u32 q10,d28,d2[0] 646 vmlal.u32 q11,d28,d2[1] 647 vmlal.u32 q12,d28,d3[0] 648 vmlal.u32 q13,d28,d3[1] 649 vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+1] 650 vmlal.u32 q6,d29,d4[0] 651 vmlal.u32 q7,d29,d4[1] 652 vmlal.u32 q8,d29,d5[0] 653 vmlal.u32 q9,d29,d5[1] 654 vmlal.u32 q10,d29,d6[0] 655 vmlal.u32 q11,d29,d6[1] 656 vmlal.u32 q12,d29,d7[0] 657 vmlal.u32 q13,d29,d7[1] 658 vst1.64 {q6},[r7,:128]! 659 vmlal.u32 q7,d28,d0[0] 660 vld1.64 {q6},[r6,:128] 661 vmlal.u32 q8,d28,d0[1] 662 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+1] 663 vmlal.u32 q9,d28,d1[0] 664 it ne 665 addne r6,r6,#16 @ don't advance in last iteration 666 vmlal.u32 q10,d28,d1[1] 667 vmlal.u32 q11,d28,d2[0] 668 vmlal.u32 q12,d28,d2[1] 669 vmlal.u32 q13,d28,d3[0] 670 vmlal.u32 q6,d28,d3[1] 671 vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+2] 672 vmlal.u32 q7,d29,d4[0] 673 vmlal.u32 q8,d29,d4[1] 674 vmlal.u32 q9,d29,d5[0] 675 vmlal.u32 q10,d29,d5[1] 676 vmlal.u32 q11,d29,d6[0] 677 vmlal.u32 q12,d29,d6[1] 678 vmlal.u32 q13,d29,d7[0] 679 vmlal.u32 q6,d29,d7[1] 680 vst1.64 {q7},[r7,:128]! 681 vmlal.u32 q8,d28,d0[0] 682 vld1.64 {q7},[r6,:128] 683 vmlal.u32 q9,d28,d0[1] 684 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+2] 685 vmlal.u32 q10,d28,d1[0] 686 it ne 687 addne r6,r6,#16 @ don't advance in last iteration 688 vmlal.u32 q11,d28,d1[1] 689 vmlal.u32 q12,d28,d2[0] 690 vmlal.u32 q13,d28,d2[1] 691 vmlal.u32 q6,d28,d3[0] 692 vmlal.u32 q7,d28,d3[1] 693 vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+3] 694 vmlal.u32 q8,d29,d4[0] 695 vmlal.u32 q9,d29,d4[1] 696 vmlal.u32 q10,d29,d5[0] 697 vmlal.u32 q11,d29,d5[1] 698 vmlal.u32 q12,d29,d6[0] 699 vmlal.u32 q13,d29,d6[1] 700 vmlal.u32 q6,d29,d7[0] 701 vmlal.u32 q7,d29,d7[1] 702 vst1.64 {q8},[r7,:128]! 703 vmlal.u32 q9,d28,d0[0] 704 vld1.64 {q8},[r6,:128] 705 vmlal.u32 q10,d28,d0[1] 706 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+3] 707 vmlal.u32 q11,d28,d1[0] 708 it ne 709 addne r6,r6,#16 @ don't advance in last iteration 710 vmlal.u32 q12,d28,d1[1] 711 vmlal.u32 q13,d28,d2[0] 712 vmlal.u32 q6,d28,d2[1] 713 vmlal.u32 q7,d28,d3[0] 714 vmlal.u32 q8,d28,d3[1] 715 vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+4] 716 vmlal.u32 q9,d29,d4[0] 717 vmlal.u32 q10,d29,d4[1] 718 vmlal.u32 q11,d29,d5[0] 719 vmlal.u32 q12,d29,d5[1] 720 vmlal.u32 q13,d29,d6[0] 721 vmlal.u32 q6,d29,d6[1] 722 vmlal.u32 q7,d29,d7[0] 723 vmlal.u32 q8,d29,d7[1] 724 vst1.64 {q9},[r7,:128]! 725 vmlal.u32 q10,d28,d0[0] 726 vld1.64 {q9},[r6,:128] 727 vmlal.u32 q11,d28,d0[1] 728 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+4] 729 vmlal.u32 q12,d28,d1[0] 730 it ne 731 addne r6,r6,#16 @ don't advance in last iteration 732 vmlal.u32 q13,d28,d1[1] 733 vmlal.u32 q6,d28,d2[0] 734 vmlal.u32 q7,d28,d2[1] 735 vmlal.u32 q8,d28,d3[0] 736 vmlal.u32 q9,d28,d3[1] 737 vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+5] 738 vmlal.u32 q10,d29,d4[0] 739 vmlal.u32 q11,d29,d4[1] 740 vmlal.u32 q12,d29,d5[0] 741 vmlal.u32 q13,d29,d5[1] 742 vmlal.u32 q6,d29,d6[0] 743 vmlal.u32 q7,d29,d6[1] 744 vmlal.u32 q8,d29,d7[0] 745 vmlal.u32 q9,d29,d7[1] 746 vst1.64 {q10},[r7,:128]! 747 vmlal.u32 q11,d28,d0[0] 748 vld1.64 {q10},[r6,:128] 749 vmlal.u32 q12,d28,d0[1] 750 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+5] 751 vmlal.u32 q13,d28,d1[0] 752 it ne 753 addne r6,r6,#16 @ don't advance in last iteration 754 vmlal.u32 q6,d28,d1[1] 755 vmlal.u32 q7,d28,d2[0] 756 vmlal.u32 q8,d28,d2[1] 757 vmlal.u32 q9,d28,d3[0] 758 vmlal.u32 q10,d28,d3[1] 759 vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+6] 760 vmlal.u32 q11,d29,d4[0] 761 vmlal.u32 q12,d29,d4[1] 762 vmlal.u32 q13,d29,d5[0] 763 vmlal.u32 q6,d29,d5[1] 764 vmlal.u32 q7,d29,d6[0] 765 vmlal.u32 q8,d29,d6[1] 766 vmlal.u32 q9,d29,d7[0] 767 vmlal.u32 q10,d29,d7[1] 768 vst1.64 {q11},[r7,:128]! 769 vmlal.u32 q12,d28,d0[0] 770 vld1.64 {q11},[r6,:128] 771 vmlal.u32 q13,d28,d0[1] 772 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+6] 773 vmlal.u32 q6,d28,d1[0] 774 it ne 775 addne r6,r6,#16 @ don't advance in last iteration 776 vmlal.u32 q7,d28,d1[1] 777 vmlal.u32 q8,d28,d2[0] 778 vmlal.u32 q9,d28,d2[1] 779 vmlal.u32 q10,d28,d3[0] 780 vmlal.u32 q11,d28,d3[1] 781 vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+7] 782 vmlal.u32 q12,d29,d4[0] 783 vmlal.u32 q13,d29,d4[1] 784 vmlal.u32 q6,d29,d5[0] 785 vmlal.u32 q7,d29,d5[1] 786 vmlal.u32 q8,d29,d6[0] 787 vmlal.u32 q9,d29,d6[1] 788 vmlal.u32 q10,d29,d7[0] 789 vmlal.u32 q11,d29,d7[1] 790 vst1.64 {q12},[r7,:128]! 791 vmlal.u32 q13,d28,d0[0] 792 vld1.64 {q12},[r6,:128] 793 vmlal.u32 q6,d28,d0[1] 794 vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+7] 795 vmlal.u32 q7,d28,d1[0] 796 it ne 797 addne r6,r6,#16 @ don't advance in last iteration 798 vmlal.u32 q8,d28,d1[1] 799 vmlal.u32 q9,d28,d2[0] 800 vmlal.u32 q10,d28,d2[1] 801 vmlal.u32 q11,d28,d3[0] 802 vmlal.u32 q12,d28,d3[1] 803 it eq 804 subeq r1,r1,r5,lsl#2 @ rewind 805 vmlal.u32 q13,d29,d4[0] 806 vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0] 807 vmlal.u32 q6,d29,d4[1] 808 vld1.32 {d0,d1,d2,d3},[r1]! 809 vmlal.u32 q7,d29,d5[0] 810 add r10,sp,#8 @ rewind 811 vmlal.u32 q8,d29,d5[1] 812 vmlal.u32 q9,d29,d6[0] 813 vmlal.u32 q10,d29,d6[1] 814 vmlal.u32 q11,d29,d7[0] 815 vst1.64 {q13},[r7,:128]! 816 vmlal.u32 q12,d29,d7[1] 817 818 bne LNEON_8n_inner 819 add r6,sp,#128 820 vst1.64 {q6,q7},[r7,:256]! 821 veor q2,q2,q2 @ d4-d5 822 vst1.64 {q8,q9},[r7,:256]! 823 veor q3,q3,q3 @ d6-d7 824 vst1.64 {q10,q11},[r7,:256]! 825 vst1.64 {q12},[r7,:128] 826 827 subs r9,r9,#8 828 vld1.64 {q6,q7},[r6,:256]! 829 vld1.64 {q8,q9},[r6,:256]! 830 vld1.64 {q10,q11},[r6,:256]! 831 vld1.64 {q12,q13},[r6,:256]! 832 833 itt ne 834 subne r3,r3,r5,lsl#2 @ rewind 835 bne LNEON_8n_outer 836 837 add r7,sp,#128 838 vst1.64 {q2,q3}, [sp,:256]! @ start wiping stack frame 839 vshr.u64 d10,d12,#16 840 vst1.64 {q2,q3},[sp,:256]! 841 vadd.u64 d13,d13,d10 842 vst1.64 {q2,q3}, [sp,:256]! 843 vshr.u64 d10,d13,#16 844 vst1.64 {q2,q3}, [sp,:256]! 845 vzip.16 d12,d13 846 847 mov r8,r5 848 b LNEON_tail_entry 849 850.align 4 851LNEON_tail: 852 vadd.u64 d12,d12,d10 853 vshr.u64 d10,d12,#16 854 vld1.64 {q8,q9}, [r6, :256]! 855 vadd.u64 d13,d13,d10 856 vld1.64 {q10,q11}, [r6, :256]! 857 vshr.u64 d10,d13,#16 858 vld1.64 {q12,q13}, [r6, :256]! 859 vzip.16 d12,d13 860 861LNEON_tail_entry: 862 vadd.u64 d14,d14,d10 863 vst1.32 {d12[0]}, [r7, :32]! 864 vshr.u64 d10,d14,#16 865 vadd.u64 d15,d15,d10 866 vshr.u64 d10,d15,#16 867 vzip.16 d14,d15 868 vadd.u64 d16,d16,d10 869 vst1.32 {d14[0]}, [r7, :32]! 870 vshr.u64 d10,d16,#16 871 vadd.u64 d17,d17,d10 872 vshr.u64 d10,d17,#16 873 vzip.16 d16,d17 874 vadd.u64 d18,d18,d10 875 vst1.32 {d16[0]}, [r7, :32]! 876 vshr.u64 d10,d18,#16 877 vadd.u64 d19,d19,d10 878 vshr.u64 d10,d19,#16 879 vzip.16 d18,d19 880 vadd.u64 d20,d20,d10 881 vst1.32 {d18[0]}, [r7, :32]! 882 vshr.u64 d10,d20,#16 883 vadd.u64 d21,d21,d10 884 vshr.u64 d10,d21,#16 885 vzip.16 d20,d21 886 vadd.u64 d22,d22,d10 887 vst1.32 {d20[0]}, [r7, :32]! 888 vshr.u64 d10,d22,#16 889 vadd.u64 d23,d23,d10 890 vshr.u64 d10,d23,#16 891 vzip.16 d22,d23 892 vadd.u64 d24,d24,d10 893 vst1.32 {d22[0]}, [r7, :32]! 894 vshr.u64 d10,d24,#16 895 vadd.u64 d25,d25,d10 896 vshr.u64 d10,d25,#16 897 vzip.16 d24,d25 898 vadd.u64 d26,d26,d10 899 vst1.32 {d24[0]}, [r7, :32]! 900 vshr.u64 d10,d26,#16 901 vadd.u64 d27,d27,d10 902 vshr.u64 d10,d27,#16 903 vzip.16 d26,d27 904 vld1.64 {q6,q7}, [r6, :256]! 905 subs r8,r8,#8 906 vst1.32 {d26[0]}, [r7, :32]! 907 bne LNEON_tail 908 909 vst1.32 {d10[0]}, [r7, :32] @ top-most bit 910 sub r3,r3,r5,lsl#2 @ rewind r3 911 subs r1,sp,#0 @ clear carry flag 912 add r2,sp,r5,lsl#2 913 914LNEON_sub: 915 ldmia r1!, {r4,r5,r6,r7} 916 ldmia r3!, {r8,r9,r10,r11} 917 sbcs r8, r4,r8 918 sbcs r9, r5,r9 919 sbcs r10,r6,r10 920 sbcs r11,r7,r11 921 teq r1,r2 @ preserves carry 922 stmia r0!, {r8,r9,r10,r11} 923 bne LNEON_sub 924 925 ldr r10, [r1] @ load top-most bit 926 mov r11,sp 927 veor q0,q0,q0 928 sub r11,r2,r11 @ this is num*4 929 veor q1,q1,q1 930 mov r1,sp 931 sub r0,r0,r11 @ rewind r0 932 mov r3,r2 @ second 3/4th of frame 933 sbcs r10,r10,#0 @ result is carry flag 934 935LNEON_copy_n_zap: 936 ldmia r1!, {r4,r5,r6,r7} 937 ldmia r0, {r8,r9,r10,r11} 938 it cc 939 movcc r8, r4 940 vst1.64 {q0,q1}, [r3,:256]! @ wipe 941 itt cc 942 movcc r9, r5 943 movcc r10,r6 944 vst1.64 {q0,q1}, [r3,:256]! @ wipe 945 it cc 946 movcc r11,r7 947 ldmia r1, {r4,r5,r6,r7} 948 stmia r0!, {r8,r9,r10,r11} 949 sub r1,r1,#16 950 ldmia r0, {r8,r9,r10,r11} 951 it cc 952 movcc r8, r4 953 vst1.64 {q0,q1}, [r1,:256]! @ wipe 954 itt cc 955 movcc r9, r5 956 movcc r10,r6 957 vst1.64 {q0,q1}, [r3,:256]! @ wipe 958 it cc 959 movcc r11,r7 960 teq r1,r2 @ preserves carry 961 stmia r0!, {r8,r9,r10,r11} 962 bne LNEON_copy_n_zap 963 964 mov sp,ip 965 vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} 966 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11} 967 bx lr @ bx lr 968 969#endif 970.byte 77,111,110,116,103,111,109,101,114,121,32,109,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,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 971.align 2 972#endif // !OPENSSL_NO_ASM 973