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