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