sparcv9-mont.S revision 1.4
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 mov %l4,%i1 183 sub %g0,%i5,%o7 ! k=-num 184 ba .Lsub 185 subcc %g0,%g0,%g0 ! clear %icc.c 186.align 16 187.Lsub: 188 ld [%l4+%o7],%o0 189 ld [%i3+%o7],%o1 190 subccc %o0,%o1,%o1 ! tp[j]-np[j] 191 add %i0,%o7,%l0 192 add %o7,4,%o7 193 brnz %o7,.Lsub 194 st %o1,[%l0] 195 subc %o2,0,%o2 ! handle upmost overflow bit 196 and %l4,%o2,%i1 197 andn %i0,%o2,%i3 198 or %i1,%i3,%i1 199 sub %g0,%i5,%o7 200 201.Lcopy: 202 ld [%i1+%o7],%o0 ! copy or in-place refresh 203 st %g0,[%l4+%o7] ! zap tp 204 st %o0,[%i0+%o7] 205 add %o7,4,%o7 206 brnz %o7,.Lcopy 207 nop 208 mov 1,%i0 209 ret 210 restore 211.align 32 212.Lbn_sqr_mont: 213 mulx %l2,%l2,%o0 ! ap[0]*ap[0] 214 mulx %l5,%l2,%g4 !prologue! 215 and %o0,%g1,%o3 216 add %sp,STACK_BIAS+STACK_FRAME,%l4 217 ld [%i1+8],%l5 !prologue! 218 219 mulx %i4,%o3,%l3 ! "t[0]"*n0 220 srlx %o0,32,%o0 221 and %l3,%g1,%l3 222 223 mulx %o1,%l3,%o1 ! np[0]*"t[0]"*n0 224 mulx %l6,%l3,%o4 !prologue! 225 and %o0,1,%o5 226 ld [%i3+8],%l6 !prologue! 227 srlx %o0,1,%o0 228 add %o3,%o1,%o1 229 srlx %o1,32,%o1 230 mov %g4,%o3 !prologue! 231 232.Lsqr_1st: 233 mulx %l5,%l2,%g4 234 mulx %l6,%l3,%g5 235 add %o3,%o0,%o0 ! ap[j]*a0+c0 236 add %o4,%o1,%o1 237 ld [%i1+%l1],%l5 ! ap[j] 238 and %o0,%g1,%o3 239 ld [%i3+%l1],%l6 ! np[j] 240 srlx %o0,32,%o0 241 add %o3,%o3,%o3 242 or %o5,%o3,%o3 243 mov %g5,%o4 244 srlx %o3,32,%o5 245 add %l1,4,%l1 ! j++ 246 and %o3,%g1,%o3 247 cmp %l1,%i5 248 add %o3,%o1,%o1 249 st %o1,[%l4] 250 mov %g4,%o3 251 srlx %o1,32,%o1 252 bl %icc,.Lsqr_1st 253 add %l4,4,%l4 ! tp++ 254!.Lsqr_1st 255 256 mulx %l5,%l2,%g4 ! epilogue 257 mulx %l6,%l3,%g5 258 add %o3,%o0,%o0 ! ap[j]*a0+c0 259 add %o4,%o1,%o1 260 and %o0,%g1,%o3 261 srlx %o0,32,%o0 262 add %o3,%o3,%o3 263 or %o5,%o3,%o3 264 srlx %o3,32,%o5 265 and %o3,%g1,%o3 266 add %o3,%o1,%o1 267 st %o1,[%l4] 268 srlx %o1,32,%o1 269 270 add %g4,%o0,%o0 ! ap[j]*a0+c0 271 add %g5,%o1,%o1 272 and %o0,%g1,%o3 273 srlx %o0,32,%o0 274 add %o3,%o3,%o3 275 or %o5,%o3,%o3 276 srlx %o3,32,%o5 277 and %o3,%g1,%o3 278 add %o3,%o1,%o1 279 st %o1,[%l4+4] 280 srlx %o1,32,%o1 281 282 add %o0,%o0,%o0 283 or %o5,%o0,%o0 284 add %o0,%o1,%o1 285 st %o1,[%l4+8] 286 srlx %o1,32,%o2 287 288 ld [%sp+STACK_BIAS+STACK_FRAME],%g4 ! tp[0] 289 ld [%sp+STACK_BIAS+STACK_FRAME+4],%g5 ! tp[1] 290 ld [%sp+STACK_BIAS+STACK_FRAME+8],%l7 ! tp[2] 291 ld [%i1+4],%l2 ! ap[1] 292 ld [%i1+8],%l5 ! ap[2] 293 ld [%i3],%o1 ! np[0] 294 ld [%i3+4],%l6 ! np[1] 295 mulx %i4,%g4,%l3 296 297 mulx %l2,%l2,%o0 298 and %l3,%g1,%l3 299 300 mulx %o1,%l3,%o1 301 mulx %l6,%l3,%o4 302 add %g4,%o1,%o1 303 and %o0,%g1,%o3 304 ld [%i3+8],%l6 ! np[2] 305 srlx %o1,32,%o1 306 add %g5,%o1,%o1 307 srlx %o0,32,%o0 308 add %o3,%o1,%o1 309 and %o0,1,%o5 310 add %o4,%o1,%o1 311 srlx %o0,1,%o0 312 mov 12,%l1 313 st %o1,[%sp+STACK_BIAS+STACK_FRAME] ! tp[0]= 314 srlx %o1,32,%o1 315 add %sp,STACK_BIAS+STACK_FRAME+4,%l4 316 317.Lsqr_2nd: 318 mulx %l5,%l2,%o3 319 mulx %l6,%l3,%o4 320 add %o3,%o0,%o0 321 add %l7,%o5,%o5 322 ld [%i1+%l1],%l5 ! ap[j] 323 and %o0,%g1,%o3 324 ld [%i3+%l1],%l6 ! np[j] 325 srlx %o0,32,%o0 326 add %o4,%o1,%o1 327 ld [%l4+8],%l7 ! tp[j] 328 add %o3,%o3,%o3 329 add %l1,4,%l1 ! j++ 330 add %o5,%o3,%o3 331 srlx %o3,32,%o5 332 and %o3,%g1,%o3 333 cmp %l1,%i5 334 add %o3,%o1,%o1 335 st %o1,[%l4] ! tp[j-1] 336 srlx %o1,32,%o1 337 bl %icc,.Lsqr_2nd 338 add %l4,4,%l4 ! tp++ 339!.Lsqr_2nd 340 341 mulx %l5,%l2,%o3 342 mulx %l6,%l3,%o4 343 add %o3,%o0,%o0 344 add %l7,%o5,%o5 345 and %o0,%g1,%o3 346 srlx %o0,32,%o0 347 add %o4,%o1,%o1 348 add %o3,%o3,%o3 349 add %o5,%o3,%o3 350 srlx %o3,32,%o5 351 and %o3,%g1,%o3 352 add %o3,%o1,%o1 353 st %o1,[%l4] ! tp[j-1] 354 srlx %o1,32,%o1 355 356 add %o0,%o0,%o0 357 add %o5,%o0,%o0 358 add %o0,%o1,%o1 359 add %o2,%o1,%o1 360 st %o1,[%l4+4] 361 srlx %o1,32,%o2 362 363 ld [%sp+STACK_BIAS+STACK_FRAME],%g5 ! tp[0] 364 ld [%sp+STACK_BIAS+STACK_FRAME+4],%l7 ! tp[1] 365 ld [%i1+8],%l2 ! ap[2] 366 ld [%i3],%o1 ! np[0] 367 ld [%i3+4],%l6 ! np[1] 368 mulx %i4,%g5,%l3 369 and %l3,%g1,%l3 370 mov 8,%l0 371 372 mulx %l2,%l2,%o0 373 mulx %o1,%l3,%o1 374 and %o0,%g1,%o3 375 add %g5,%o1,%o1 376 srlx %o0,32,%o0 377 add %sp,STACK_BIAS+STACK_FRAME,%l4 378 srlx %o1,32,%o1 379 and %o0,1,%o5 380 srlx %o0,1,%o0 381 mov 4,%l1 382 383.Lsqr_outer: 384.Lsqr_inner1: 385 mulx %l6,%l3,%o4 386 add %l7,%o1,%o1 387 add %l1,4,%l1 388 ld [%l4+8],%l7 389 cmp %l1,%l0 390 add %o4,%o1,%o1 391 ld [%i3+%l1],%l6 392 st %o1,[%l4] 393 srlx %o1,32,%o1 394 bl %icc,.Lsqr_inner1 395 add %l4,4,%l4 396!.Lsqr_inner1 397 398 add %l1,4,%l1 399 ld [%i1+%l1],%l5 ! ap[j] 400 mulx %l6,%l3,%o4 401 add %l7,%o1,%o1 402 ld [%i3+%l1],%l6 ! np[j] 403 add %o3,%o1,%o1 404 ld [%l4+8],%l7 ! tp[j] 405 add %o4,%o1,%o1 406 st %o1,[%l4] 407 srlx %o1,32,%o1 408 409 add %l1,4,%l1 410 cmp %l1,%i5 411 be,pn %icc,.Lsqr_no_inner2 412 add %l4,4,%l4 413 414.Lsqr_inner2: 415 mulx %l5,%l2,%o3 416 mulx %l6,%l3,%o4 417 add %l7,%o5,%o5 418 add %o3,%o0,%o0 419 ld [%i1+%l1],%l5 ! ap[j] 420 and %o0,%g1,%o3 421 ld [%i3+%l1],%l6 ! np[j] 422 srlx %o0,32,%o0 423 add %o3,%o3,%o3 424 ld [%l4+8],%l7 ! tp[j] 425 add %o5,%o3,%o3 426 add %l1,4,%l1 ! j++ 427 srlx %o3,32,%o5 428 and %o3,%g1,%o3 429 cmp %l1,%i5 430 add %o3,%o1,%o1 431 add %o4,%o1,%o1 432 st %o1,[%l4] ! tp[j-1] 433 srlx %o1,32,%o1 434 bl %icc,.Lsqr_inner2 435 add %l4,4,%l4 ! tp++ 436 437.Lsqr_no_inner2: 438 mulx %l5,%l2,%o3 439 mulx %l6,%l3,%o4 440 add %l7,%o5,%o5 441 add %o3,%o0,%o0 442 and %o0,%g1,%o3 443 srlx %o0,32,%o0 444 add %o3,%o3,%o3 445 add %o5,%o3,%o3 446 srlx %o3,32,%o5 447 and %o3,%g1,%o3 448 add %o3,%o1,%o1 449 add %o4,%o1,%o1 450 st %o1,[%l4] ! tp[j-1] 451 srlx %o1,32,%o1 452 453 add %o0,%o0,%o0 454 add %o5,%o0,%o0 455 add %o0,%o1,%o1 456 add %o2,%o1,%o1 457 st %o1,[%l4+4] 458 srlx %o1,32,%o2 459 460 add %l0,4,%l0 ! i++ 461 ld [%sp+STACK_BIAS+STACK_FRAME],%g5 ! tp[0] 462 ld [%sp+STACK_BIAS+STACK_FRAME+4],%l7 ! tp[1] 463 ld [%i1+%l0],%l2 ! ap[j] 464 ld [%i3],%o1 ! np[0] 465 ld [%i3+4],%l6 ! np[1] 466 mulx %i4,%g5,%l3 467 and %l3,%g1,%l3 468 add %l0,4,%g4 469 470 mulx %l2,%l2,%o0 471 mulx %o1,%l3,%o1 472 and %o0,%g1,%o3 473 add %g5,%o1,%o1 474 srlx %o0,32,%o0 475 add %sp,STACK_BIAS+STACK_FRAME,%l4 476 srlx %o1,32,%o1 477 and %o0,1,%o5 478 srlx %o0,1,%o0 479 480 cmp %g4,%i5 ! i<num-1 481 bl %icc,.Lsqr_outer 482 mov 4,%l1 483 484.Lsqr_last: 485 mulx %l6,%l3,%o4 486 add %l7,%o1,%o1 487 add %l1,4,%l1 488 ld [%l4+8],%l7 489 cmp %l1,%l0 490 add %o4,%o1,%o1 491 ld [%i3+%l1],%l6 492 st %o1,[%l4] 493 srlx %o1,32,%o1 494 bl %icc,.Lsqr_last 495 add %l4,4,%l4 496!.Lsqr_last 497 498 mulx %l6,%l3,%o4 499 add %l7,%o3,%o3 500 srlx %o3,32,%g4 501 and %o3,%g1,%o3 502 add %g4,%o5,%o5 503 add %o3,%o1,%o1 504 add %o4,%o1,%o1 505 st %o1,[%l4] 506 srlx %o1,32,%o1 507 508 add %o0,%o0,%o0 ! recover %o0 509 add %o5,%o0,%o0 510 add %o0,%o1,%o1 511 add %o2,%o1,%o1 512 st %o1,[%l4+4] 513 srlx %o1,32,%o2 514 515 ba .Ltail 516 add %l4,8,%l4 517.type bn_mul_mont_int,#function 518.size bn_mul_mont_int,(.-bn_mul_mont_int) 519.asciz "Montgomery Multipltication for SPARCv9, CRYPTOGAMS by <appro@openssl.org>" 520.align 32 521