sparcv9-mont.S revision 1.1.1.2
1#include "sparc_arch.h" 2 3.section ".text",#alloc,#execinstr 4 5.global bn_mul_mont_int 6.align 32 7bn_mul_mont_int: 8 cmp %o5,4 ! 128 bits minimum 9 bge,pt %icc,.Lenter 10 sethi %hi(0xffffffff),%g1 11 retl 12 clr %o0 13.align 32 14.Lenter: 15 save %sp,-STACK_FRAME,%sp 16 sll %i5,2,%i5 ! num*=4 17 or %g1,%lo(0xffffffff),%g1 18 ld [%i4],%i4 19 cmp %i1,%i2 20 and %i5,%g1,%i5 21 ld [%i2],%l2 ! bp[0] 22 nop 23 24 add %sp,STACK_BIAS,%o7 ! real top of stack 25 ld [%i1],%o0 ! ap[0] ! redundant in squaring context 26 sub %o7,%i5,%o7 27 ld [%i1+4],%l5 ! ap[1] 28 and %o7,-1024,%o7 29 ld [%i3],%o1 ! np[0] 30 sub %o7,STACK_BIAS,%sp ! alloca 31 ld [%i3+4],%l6 ! np[1] 32 be,pt SIZE_T_CC,.Lbn_sqr_mont 33 mov 12,%l1 34 35 mulx %o0,%l2,%o0 ! ap[0]*bp[0] 36 mulx %l5,%l2,%g4 !prologue! ap[1]*bp[0] 37 and %o0,%g1,%o3 38 add %sp,STACK_BIAS+STACK_FRAME,%l4 39 ld [%i1+8],%l5 !prologue! 40 41 mulx %i4,%o3,%l3 ! "t[0]"*n0 42 and %l3,%g1,%l3 43 44 mulx %o1,%l3,%o1 ! np[0]*"t[0]"*n0 45 mulx %l6,%l3,%o4 !prologue! np[1]*"t[0]"*n0 46 srlx %o0,32,%o0 47 add %o3,%o1,%o1 48 ld [%i3+8],%l6 !prologue! 49 srlx %o1,32,%o1 50 mov %g4,%o3 !prologue! 51 52.L1st: 53 mulx %l5,%l2,%g4 54 mulx %l6,%l3,%g5 55 add %o3,%o0,%o0 56 ld [%i1+%l1],%l5 ! ap[j] 57 and %o0,%g1,%o3 58 add %o4,%o1,%o1 59 ld [%i3+%l1],%l6 ! np[j] 60 srlx %o0,32,%o0 61 add %o3,%o1,%o1 62 add %l1,4,%l1 ! j++ 63 mov %g4,%o3 64 st %o1,[%l4] 65 cmp %l1,%i5 66 mov %g5,%o4 67 srlx %o1,32,%o1 68 bl %icc,.L1st 69 add %l4,4,%l4 ! tp++ 70!.L1st 71 72 mulx %l5,%l2,%g4 !epilogue! 73 mulx %l6,%l3,%g5 74 add %o3,%o0,%o0 75 and %o0,%g1,%o3 76 add %o4,%o1,%o1 77 srlx %o0,32,%o0 78 add %o3,%o1,%o1 79 st %o1,[%l4] 80 srlx %o1,32,%o1 81 82 add %g4,%o0,%o0 83 and %o0,%g1,%o3 84 add %g5,%o1,%o1 85 srlx %o0,32,%o0 86 add %o3,%o1,%o1 87 st %o1,[%l4+4] 88 srlx %o1,32,%o1 89 90 add %o0,%o1,%o1 91 st %o1,[%l4+8] 92 srlx %o1,32,%o2 93 94 mov 4,%l0 ! i++ 95 ld [%i2+4],%l2 ! bp[1] 96.Louter: 97 add %sp,STACK_BIAS+STACK_FRAME,%l4 98 ld [%i1],%o0 ! ap[0] 99 ld [%i1+4],%l5 ! ap[1] 100 ld [%i3],%o1 ! np[0] 101 ld [%i3+4],%l6 ! np[1] 102 ld [%l4],%g5 ! tp[0] 103 ld [%l4+4],%l7 ! tp[1] 104 mov 12,%l1 105 106 mulx %o0,%l2,%o0 107 mulx %l5,%l2,%g4 !prologue! 108 add %g5,%o0,%o0 109 ld [%i1+8],%l5 !prologue! 110 and %o0,%g1,%o3 111 112 mulx %i4,%o3,%l3 113 and %l3,%g1,%l3 114 115 mulx %o1,%l3,%o1 116 mulx %l6,%l3,%o4 !prologue! 117 srlx %o0,32,%o0 118 add %o3,%o1,%o1 119 ld [%i3+8],%l6 !prologue! 120 srlx %o1,32,%o1 121 mov %g4,%o3 !prologue! 122 123.Linner: 124 mulx %l5,%l2,%g4 125 mulx %l6,%l3,%g5 126 add %l7,%o0,%o0 127 ld [%i1+%l1],%l5 ! ap[j] 128 add %o3,%o0,%o0 129 add %o4,%o1,%o1 130 ld [%i3+%l1],%l6 ! np[j] 131 and %o0,%g1,%o3 132 ld [%l4+8],%l7 ! tp[j] 133 srlx %o0,32,%o0 134 add %o3,%o1,%o1 135 add %l1,4,%l1 ! j++ 136 mov %g4,%o3 137 st %o1,[%l4] ! tp[j-1] 138 srlx %o1,32,%o1 139 mov %g5,%o4 140 cmp %l1,%i5 141 bl %icc,.Linner 142 add %l4,4,%l4 ! tp++ 143!.Linner 144 145 mulx %l5,%l2,%g4 !epilogue! 146 mulx %l6,%l3,%g5 147 add %l7,%o0,%o0 148 add %o3,%o0,%o0 149 ld [%l4+8],%l7 ! tp[j] 150 and %o0,%g1,%o3 151 add %o4,%o1,%o1 152 srlx %o0,32,%o0 153 add %o3,%o1,%o1 154 st %o1,[%l4] ! tp[j-1] 155 srlx %o1,32,%o1 156 157 add %l7,%o0,%o0 158 add %g4,%o0,%o0 159 and %o0,%g1,%o3 160 add %g5,%o1,%o1 161 add %o3,%o1,%o1 162 st %o1,[%l4+4] ! tp[j-1] 163 srlx %o0,32,%o0 164 add %l0,4,%l0 ! i++ 165 srlx %o1,32,%o1 166 167 add %o0,%o1,%o1 168 cmp %l0,%i5 169 add %o2,%o1,%o1 170 st %o1,[%l4+8] 171 172 srlx %o1,32,%o2 173 bl,a %icc,.Louter 174 ld [%i2+%l0],%l2 ! bp[i] 175!.Louter 176 177 add %l4,12,%l4 178 179.Ltail: 180 add %i3,%i5,%i3 181 add %i0,%i5,%i0 182 sub %g0,%i5,%o7 ! k=-num 183 ba .Lsub 184 subcc %g0,%g0,%g0 ! clear %icc.c 185.align 16 186.Lsub: 187 ld [%l4+%o7],%o0 188 ld [%i3+%o7],%o1 189 subccc %o0,%o1,%o1 ! tp[j]-np[j] 190 add %i0,%o7,%l0 191 add %o7,4,%o7 192 brnz %o7,.Lsub 193 st %o1,[%l0] 194 subccc %o2,0,%o2 ! handle upmost overflow bit 195 sub %g0,%i5,%o7 196 197.Lcopy: 198 ld [%l4+%o7],%o1 ! conditional copy 199 ld [%i0+%o7],%o0 200 st %g0,[%l4+%o7] ! zap tp 201 movcs %icc,%o1,%o0 202 st %o0,[%i0+%o7] 203 add %o7,4,%o7 204 brnz %o7,.Lcopy 205 nop 206 mov 1,%i0 207 ret 208 restore 209.align 32 210.Lbn_sqr_mont: 211 mulx %l2,%l2,%o0 ! ap[0]*ap[0] 212 mulx %l5,%l2,%g4 !prologue! 213 and %o0,%g1,%o3 214 add %sp,STACK_BIAS+STACK_FRAME,%l4 215 ld [%i1+8],%l5 !prologue! 216 217 mulx %i4,%o3,%l3 ! "t[0]"*n0 218 srlx %o0,32,%o0 219 and %l3,%g1,%l3 220 221 mulx %o1,%l3,%o1 ! np[0]*"t[0]"*n0 222 mulx %l6,%l3,%o4 !prologue! 223 and %o0,1,%o5 224 ld [%i3+8],%l6 !prologue! 225 srlx %o0,1,%o0 226 add %o3,%o1,%o1 227 srlx %o1,32,%o1 228 mov %g4,%o3 !prologue! 229 230.Lsqr_1st: 231 mulx %l5,%l2,%g4 232 mulx %l6,%l3,%g5 233 add %o3,%o0,%o0 ! ap[j]*a0+c0 234 add %o4,%o1,%o1 235 ld [%i1+%l1],%l5 ! ap[j] 236 and %o0,%g1,%o3 237 ld [%i3+%l1],%l6 ! np[j] 238 srlx %o0,32,%o0 239 add %o3,%o3,%o3 240 or %o5,%o3,%o3 241 mov %g5,%o4 242 srlx %o3,32,%o5 243 add %l1,4,%l1 ! j++ 244 and %o3,%g1,%o3 245 cmp %l1,%i5 246 add %o3,%o1,%o1 247 st %o1,[%l4] 248 mov %g4,%o3 249 srlx %o1,32,%o1 250 bl %icc,.Lsqr_1st 251 add %l4,4,%l4 ! tp++ 252!.Lsqr_1st 253 254 mulx %l5,%l2,%g4 ! epilogue 255 mulx %l6,%l3,%g5 256 add %o3,%o0,%o0 ! ap[j]*a0+c0 257 add %o4,%o1,%o1 258 and %o0,%g1,%o3 259 srlx %o0,32,%o0 260 add %o3,%o3,%o3 261 or %o5,%o3,%o3 262 srlx %o3,32,%o5 263 and %o3,%g1,%o3 264 add %o3,%o1,%o1 265 st %o1,[%l4] 266 srlx %o1,32,%o1 267 268 add %g4,%o0,%o0 ! ap[j]*a0+c0 269 add %g5,%o1,%o1 270 and %o0,%g1,%o3 271 srlx %o0,32,%o0 272 add %o3,%o3,%o3 273 or %o5,%o3,%o3 274 srlx %o3,32,%o5 275 and %o3,%g1,%o3 276 add %o3,%o1,%o1 277 st %o1,[%l4+4] 278 srlx %o1,32,%o1 279 280 add %o0,%o0,%o0 281 or %o5,%o0,%o0 282 add %o0,%o1,%o1 283 st %o1,[%l4+8] 284 srlx %o1,32,%o2 285 286 ld [%sp+STACK_BIAS+STACK_FRAME],%g4 ! tp[0] 287 ld [%sp+STACK_BIAS+STACK_FRAME+4],%g5 ! tp[1] 288 ld [%sp+STACK_BIAS+STACK_FRAME+8],%l7 ! tp[2] 289 ld [%i1+4],%l2 ! ap[1] 290 ld [%i1+8],%l5 ! ap[2] 291 ld [%i3],%o1 ! np[0] 292 ld [%i3+4],%l6 ! np[1] 293 mulx %i4,%g4,%l3 294 295 mulx %l2,%l2,%o0 296 and %l3,%g1,%l3 297 298 mulx %o1,%l3,%o1 299 mulx %l6,%l3,%o4 300 add %g4,%o1,%o1 301 and %o0,%g1,%o3 302 ld [%i3+8],%l6 ! np[2] 303 srlx %o1,32,%o1 304 add %g5,%o1,%o1 305 srlx %o0,32,%o0 306 add %o3,%o1,%o1 307 and %o0,1,%o5 308 add %o4,%o1,%o1 309 srlx %o0,1,%o0 310 mov 12,%l1 311 st %o1,[%sp+STACK_BIAS+STACK_FRAME] ! tp[0]= 312 srlx %o1,32,%o1 313 add %sp,STACK_BIAS+STACK_FRAME+4,%l4 314 315.Lsqr_2nd: 316 mulx %l5,%l2,%o3 317 mulx %l6,%l3,%o4 318 add %o3,%o0,%o0 319 add %l7,%o5,%o5 320 ld [%i1+%l1],%l5 ! ap[j] 321 and %o0,%g1,%o3 322 ld [%i3+%l1],%l6 ! np[j] 323 srlx %o0,32,%o0 324 add %o4,%o1,%o1 325 ld [%l4+8],%l7 ! tp[j] 326 add %o3,%o3,%o3 327 add %l1,4,%l1 ! j++ 328 add %o5,%o3,%o3 329 srlx %o3,32,%o5 330 and %o3,%g1,%o3 331 cmp %l1,%i5 332 add %o3,%o1,%o1 333 st %o1,[%l4] ! tp[j-1] 334 srlx %o1,32,%o1 335 bl %icc,.Lsqr_2nd 336 add %l4,4,%l4 ! tp++ 337!.Lsqr_2nd 338 339 mulx %l5,%l2,%o3 340 mulx %l6,%l3,%o4 341 add %o3,%o0,%o0 342 add %l7,%o5,%o5 343 and %o0,%g1,%o3 344 srlx %o0,32,%o0 345 add %o4,%o1,%o1 346 add %o3,%o3,%o3 347 add %o5,%o3,%o3 348 srlx %o3,32,%o5 349 and %o3,%g1,%o3 350 add %o3,%o1,%o1 351 st %o1,[%l4] ! tp[j-1] 352 srlx %o1,32,%o1 353 354 add %o0,%o0,%o0 355 add %o5,%o0,%o0 356 add %o0,%o1,%o1 357 add %o2,%o1,%o1 358 st %o1,[%l4+4] 359 srlx %o1,32,%o2 360 361 ld [%sp+STACK_BIAS+STACK_FRAME],%g5 ! tp[0] 362 ld [%sp+STACK_BIAS+STACK_FRAME+4],%l7 ! tp[1] 363 ld [%i1+8],%l2 ! ap[2] 364 ld [%i3],%o1 ! np[0] 365 ld [%i3+4],%l6 ! np[1] 366 mulx %i4,%g5,%l3 367 and %l3,%g1,%l3 368 mov 8,%l0 369 370 mulx %l2,%l2,%o0 371 mulx %o1,%l3,%o1 372 and %o0,%g1,%o3 373 add %g5,%o1,%o1 374 srlx %o0,32,%o0 375 add %sp,STACK_BIAS+STACK_FRAME,%l4 376 srlx %o1,32,%o1 377 and %o0,1,%o5 378 srlx %o0,1,%o0 379 mov 4,%l1 380 381.Lsqr_outer: 382.Lsqr_inner1: 383 mulx %l6,%l3,%o4 384 add %l7,%o1,%o1 385 add %l1,4,%l1 386 ld [%l4+8],%l7 387 cmp %l1,%l0 388 add %o4,%o1,%o1 389 ld [%i3+%l1],%l6 390 st %o1,[%l4] 391 srlx %o1,32,%o1 392 bl %icc,.Lsqr_inner1 393 add %l4,4,%l4 394!.Lsqr_inner1 395 396 add %l1,4,%l1 397 ld [%i1+%l1],%l5 ! ap[j] 398 mulx %l6,%l3,%o4 399 add %l7,%o1,%o1 400 ld [%i3+%l1],%l6 ! np[j] 401 srlx %o1,32,%g4 402 and %o1,%g1,%o1 403 add %g4,%o5,%o5 404 add %o3,%o1,%o1 405 ld [%l4+8],%l7 ! tp[j] 406 add %o4,%o1,%o1 407 st %o1,[%l4] 408 srlx %o1,32,%o1 409 410 add %l1,4,%l1 411 cmp %l1,%i5 412 be,pn %icc,.Lsqr_no_inner2 413 add %l4,4,%l4 414 415.Lsqr_inner2: 416 mulx %l5,%l2,%o3 417 mulx %l6,%l3,%o4 418 add %l7,%o5,%o5 419 add %o3,%o0,%o0 420 ld [%i1+%l1],%l5 ! ap[j] 421 and %o0,%g1,%o3 422 ld [%i3+%l1],%l6 ! np[j] 423 srlx %o0,32,%o0 424 add %o3,%o3,%o3 425 ld [%l4+8],%l7 ! tp[j] 426 add %o5,%o3,%o3 427 add %l1,4,%l1 ! j++ 428 srlx %o3,32,%o5 429 and %o3,%g1,%o3 430 cmp %l1,%i5 431 add %o3,%o1,%o1 432 add %o4,%o1,%o1 433 st %o1,[%l4] ! tp[j-1] 434 srlx %o1,32,%o1 435 bl %icc,.Lsqr_inner2 436 add %l4,4,%l4 ! tp++ 437 438.Lsqr_no_inner2: 439 mulx %l5,%l2,%o3 440 mulx %l6,%l3,%o4 441 add %l7,%o5,%o5 442 add %o3,%o0,%o0 443 and %o0,%g1,%o3 444 srlx %o0,32,%o0 445 add %o3,%o3,%o3 446 add %o5,%o3,%o3 447 srlx %o3,32,%o5 448 and %o3,%g1,%o3 449 add %o3,%o1,%o1 450 add %o4,%o1,%o1 451 st %o1,[%l4] ! tp[j-1] 452 srlx %o1,32,%o1 453 454 add %o0,%o0,%o0 455 add %o5,%o0,%o0 456 add %o0,%o1,%o1 457 add %o2,%o1,%o1 458 st %o1,[%l4+4] 459 srlx %o1,32,%o2 460 461 add %l0,4,%l0 ! i++ 462 ld [%sp+STACK_BIAS+STACK_FRAME],%g5 ! tp[0] 463 ld [%sp+STACK_BIAS+STACK_FRAME+4],%l7 ! tp[1] 464 ld [%i1+%l0],%l2 ! ap[j] 465 ld [%i3],%o1 ! np[0] 466 ld [%i3+4],%l6 ! np[1] 467 mulx %i4,%g5,%l3 468 and %l3,%g1,%l3 469 add %l0,4,%g4 470 471 mulx %l2,%l2,%o0 472 mulx %o1,%l3,%o1 473 and %o0,%g1,%o3 474 add %g5,%o1,%o1 475 srlx %o0,32,%o0 476 add %sp,STACK_BIAS+STACK_FRAME,%l4 477 srlx %o1,32,%o1 478 and %o0,1,%o5 479 srlx %o0,1,%o0 480 481 cmp %g4,%i5 ! i<num-1 482 bl %icc,.Lsqr_outer 483 mov 4,%l1 484 485.Lsqr_last: 486 mulx %l6,%l3,%o4 487 add %l7,%o1,%o1 488 add %l1,4,%l1 489 ld [%l4+8],%l7 490 cmp %l1,%l0 491 add %o4,%o1,%o1 492 ld [%i3+%l1],%l6 493 st %o1,[%l4] 494 srlx %o1,32,%o1 495 bl %icc,.Lsqr_last 496 add %l4,4,%l4 497!.Lsqr_last 498 499 mulx %l6,%l3,%o4 500 add %l7,%o3,%o3 501 srlx %o3,32,%g4 502 and %o3,%g1,%o3 503 add %g4,%o5,%o5 504 add %o3,%o1,%o1 505 add %o4,%o1,%o1 506 st %o1,[%l4] 507 srlx %o1,32,%o1 508 509 add %o0,%o0,%o0 ! recover %o0 510 add %o5,%o0,%o0 511 add %o0,%o1,%o1 512 add %o2,%o1,%o1 513 st %o1,[%l4+4] 514 srlx %o1,32,%o2 515 516 ba .Ltail 517 add %l4,8,%l4 518.type bn_mul_mont_int,#function 519.size bn_mul_mont_int,(.-bn_mul_mont_int) 520.asciz "Montgomery Multiplication for SPARCv9, CRYPTOGAMS by <appro@openssl.org>" 521.align 32 522