1*c9496f6bSchristos#include <sparc_arch.h> 2*c9496f6bSchristos 3*c9496f6bSchristos#ifdef __arch64__ 4*c9496f6bSchristos.register %g2,#scratch 5*c9496f6bSchristos.register %g3,#scratch 6*c9496f6bSchristos#endif 7*c9496f6bSchristos 8*c9496f6bSchristos#ifdef __PIC__ 9*c9496f6bSchristosSPARC_PIC_THUNK(%g1) 10*c9496f6bSchristos#endif 11*c9496f6bSchristos 12*c9496f6bSchristos.globl bn_GF2m_mul_2x2 13*c9496f6bSchristos.align 16 14*c9496f6bSchristosbn_GF2m_mul_2x2: 15*c9496f6bSchristos SPARC_LOAD_ADDRESS_LEAF(OPENSSL_sparcv9cap_P,%g1,%g5) 16*c9496f6bSchristos ld [%g1+0],%g1 ! OPENSSL_sparcv9cap_P[0] 17*c9496f6bSchristos 18*c9496f6bSchristos andcc %g1, SPARCV9_VIS3, %g0 19*c9496f6bSchristos bz,pn %icc,.Lsoftware 20*c9496f6bSchristos nop 21*c9496f6bSchristos 22*c9496f6bSchristos sllx %o1, 32, %o1 23*c9496f6bSchristos sllx %o3, 32, %o3 24*c9496f6bSchristos or %o2, %o1, %o1 25*c9496f6bSchristos or %o4, %o3, %o3 26*c9496f6bSchristos .word 0x95b262ab ! xmulx %o1, %o3, %o2 27*c9496f6bSchristos .word 0x99b262cb ! xmulxhi %o1, %o3, %o4 28*c9496f6bSchristos srlx %o2, 32, %o1 ! 13 cycles later 29*c9496f6bSchristos st %o2, [%o0+0] 30*c9496f6bSchristos st %o1, [%o0+4] 31*c9496f6bSchristos srlx %o4, 32, %o3 32*c9496f6bSchristos st %o4, [%o0+8] 33*c9496f6bSchristos retl 34*c9496f6bSchristos st %o3, [%o0+12] 35*c9496f6bSchristos 36*c9496f6bSchristos.align 16 37*c9496f6bSchristos.Lsoftware: 38*c9496f6bSchristos save %sp,-STACK_FRAME-128,%sp 39*c9496f6bSchristos 40*c9496f6bSchristos sllx %i1,32,%g1 41*c9496f6bSchristos mov -1,%o4 42*c9496f6bSchristos sllx %i3,32,%o7 43*c9496f6bSchristos or %i2,%g1,%g1 44*c9496f6bSchristos srlx %o4,1,%o5 ! 0x7fff... 45*c9496f6bSchristos or %i4,%o7,%o7 46*c9496f6bSchristos srlx %o4,2,%o4 ! 0x3fff... 47*c9496f6bSchristos add %sp,STACK_BIAS+STACK_FRAME,%l0 48*c9496f6bSchristos 49*c9496f6bSchristos sllx %g1,2,%o2 50*c9496f6bSchristos mov %g1,%o0 51*c9496f6bSchristos sllx %g1,1,%o1 52*c9496f6bSchristos 53*c9496f6bSchristos srax %o2,63,%g5 ! broadcast 61st bit 54*c9496f6bSchristos and %o5,%o2,%o2 ! (a<<2)&0x7fff... 55*c9496f6bSchristos srlx %o5,2,%o5 56*c9496f6bSchristos srax %o1,63,%g4 ! broadcast 62nd bit 57*c9496f6bSchristos and %o4,%o1,%o1 ! (a<<1)&0x3fff... 58*c9496f6bSchristos srax %o0,63,%g1 ! broadcast 63rd bit 59*c9496f6bSchristos and %o5,%o0,%o0 ! (a<<0)&0x1fff... 60*c9496f6bSchristos 61*c9496f6bSchristos sllx %o0,3,%o3 62*c9496f6bSchristos and %o7,%g1,%g1 63*c9496f6bSchristos and %o7,%g4,%g4 64*c9496f6bSchristos and %o7,%g5,%g5 65*c9496f6bSchristos 66*c9496f6bSchristos stx %g0,[%l0+0*8] ! tab[0]=0 67*c9496f6bSchristos xor %o0,%o1,%o4 68*c9496f6bSchristos stx %o0,[%l0+1*8] ! tab[1]=a1 69*c9496f6bSchristos stx %o1,[%l0+2*8] ! tab[2]=a2 70*c9496f6bSchristos xor %o2,%o3,%o5 71*c9496f6bSchristos stx %o4,[%l0+3*8] ! tab[3]=a1^a2 72*c9496f6bSchristos xor %o2,%o0,%o0 73*c9496f6bSchristos 74*c9496f6bSchristos stx %o2,[%l0+4*8] ! tab[4]=a4 75*c9496f6bSchristos xor %o2,%o1,%o1 76*c9496f6bSchristos stx %o0,[%l0+5*8] ! tab[5]=a1^a4 77*c9496f6bSchristos xor %o2,%o4,%o4 78*c9496f6bSchristos stx %o1,[%l0+6*8] ! tab[6]=a2^a4 79*c9496f6bSchristos xor %o5,%o0,%o0 80*c9496f6bSchristos stx %o4,[%l0+7*8] ! tab[7]=a1^a2^a4 81*c9496f6bSchristos xor %o5,%o1,%o1 82*c9496f6bSchristos 83*c9496f6bSchristos stx %o3,[%l0+8*8] ! tab[8]=a8 84*c9496f6bSchristos xor %o5,%o4,%o4 85*c9496f6bSchristos stx %o0,[%l0+9*8] ! tab[9]=a1^a8 86*c9496f6bSchristos xor %o2,%o0,%o0 87*c9496f6bSchristos stx %o1,[%l0+10*8] ! tab[10]=a2^a8 88*c9496f6bSchristos xor %o2,%o1,%o1 89*c9496f6bSchristos stx %o4,[%l0+11*8] ! tab[11]=a1^a2^a8 90*c9496f6bSchristos 91*c9496f6bSchristos xor %o2,%o4,%o4 92*c9496f6bSchristos stx %o5,[%l0+12*8] ! tab[12]=a4^a8 93*c9496f6bSchristos srlx %g1,1,%o3 94*c9496f6bSchristos stx %o0,[%l0+13*8] ! tab[13]=a1^a4^a8 95*c9496f6bSchristos sllx %g1,63,%g1 96*c9496f6bSchristos stx %o1,[%l0+14*8] ! tab[14]=a2^a4^a8 97*c9496f6bSchristos srlx %g4,2,%g2 98*c9496f6bSchristos stx %o4,[%l0+15*8] ! tab[15]=a1^a2^a4^a8 99*c9496f6bSchristos 100*c9496f6bSchristos sllx %g4,62,%o0 101*c9496f6bSchristos sllx %o7,3,%g4 102*c9496f6bSchristos srlx %g5,3,%g3 103*c9496f6bSchristos and %g4,120,%g4 104*c9496f6bSchristos sllx %g5,61,%o1 105*c9496f6bSchristos ldx [%l0+%g4],%g4 106*c9496f6bSchristos srlx %o7,4-3,%g5 107*c9496f6bSchristos xor %g2,%o3,%o3 108*c9496f6bSchristos and %g5,120,%g5 109*c9496f6bSchristos xor %o0,%g1,%g1 110*c9496f6bSchristos ldx [%l0+%g5],%g5 111*c9496f6bSchristos xor %g3,%o3,%o3 112*c9496f6bSchristos 113*c9496f6bSchristos xor %g4,%g1,%g1 114*c9496f6bSchristos srlx %o7,8-3,%g4 115*c9496f6bSchristos xor %o1,%g1,%g1 116*c9496f6bSchristos and %g4,120,%g4 117*c9496f6bSchristos sllx %g5,4,%g2 118*c9496f6bSchristos ldx [%l0+%g4],%g4 119*c9496f6bSchristos srlx %g5,60,%g3 120*c9496f6bSchristos xor %g2,%g1,%g1 121*c9496f6bSchristos srlx %o7,12-3,%g5 122*c9496f6bSchristos xor %g3,%o3,%o3 123*c9496f6bSchristos and %g5,120,%g5 124*c9496f6bSchristos sllx %g4,8,%g3 125*c9496f6bSchristos ldx [%l0+%g5],%g5 126*c9496f6bSchristos srlx %g4,56,%g2 127*c9496f6bSchristos xor %g3,%g1,%g1 128*c9496f6bSchristos srlx %o7,16-3,%g4 129*c9496f6bSchristos xor %g2,%o3,%o3 130*c9496f6bSchristos and %g4,120,%g4 131*c9496f6bSchristos sllx %g5,12,%g2 132*c9496f6bSchristos ldx [%l0+%g4],%g4 133*c9496f6bSchristos srlx %g5,52,%g3 134*c9496f6bSchristos xor %g2,%g1,%g1 135*c9496f6bSchristos srlx %o7,20-3,%g5 136*c9496f6bSchristos xor %g3,%o3,%o3 137*c9496f6bSchristos and %g5,120,%g5 138*c9496f6bSchristos sllx %g4,16,%g3 139*c9496f6bSchristos ldx [%l0+%g5],%g5 140*c9496f6bSchristos srlx %g4,48,%g2 141*c9496f6bSchristos xor %g3,%g1,%g1 142*c9496f6bSchristos srlx %o7,24-3,%g4 143*c9496f6bSchristos xor %g2,%o3,%o3 144*c9496f6bSchristos and %g4,120,%g4 145*c9496f6bSchristos sllx %g5,20,%g2 146*c9496f6bSchristos ldx [%l0+%g4],%g4 147*c9496f6bSchristos srlx %g5,44,%g3 148*c9496f6bSchristos xor %g2,%g1,%g1 149*c9496f6bSchristos srlx %o7,28-3,%g5 150*c9496f6bSchristos xor %g3,%o3,%o3 151*c9496f6bSchristos and %g5,120,%g5 152*c9496f6bSchristos sllx %g4,24,%g3 153*c9496f6bSchristos ldx [%l0+%g5],%g5 154*c9496f6bSchristos srlx %g4,40,%g2 155*c9496f6bSchristos xor %g3,%g1,%g1 156*c9496f6bSchristos srlx %o7,32-3,%g4 157*c9496f6bSchristos xor %g2,%o3,%o3 158*c9496f6bSchristos and %g4,120,%g4 159*c9496f6bSchristos sllx %g5,28,%g2 160*c9496f6bSchristos ldx [%l0+%g4],%g4 161*c9496f6bSchristos srlx %g5,36,%g3 162*c9496f6bSchristos xor %g2,%g1,%g1 163*c9496f6bSchristos srlx %o7,36-3,%g5 164*c9496f6bSchristos xor %g3,%o3,%o3 165*c9496f6bSchristos and %g5,120,%g5 166*c9496f6bSchristos sllx %g4,32,%g3 167*c9496f6bSchristos ldx [%l0+%g5],%g5 168*c9496f6bSchristos srlx %g4,32,%g2 169*c9496f6bSchristos xor %g3,%g1,%g1 170*c9496f6bSchristos srlx %o7,40-3,%g4 171*c9496f6bSchristos xor %g2,%o3,%o3 172*c9496f6bSchristos and %g4,120,%g4 173*c9496f6bSchristos sllx %g5,36,%g2 174*c9496f6bSchristos ldx [%l0+%g4],%g4 175*c9496f6bSchristos srlx %g5,28,%g3 176*c9496f6bSchristos xor %g2,%g1,%g1 177*c9496f6bSchristos srlx %o7,44-3,%g5 178*c9496f6bSchristos xor %g3,%o3,%o3 179*c9496f6bSchristos and %g5,120,%g5 180*c9496f6bSchristos sllx %g4,40,%g3 181*c9496f6bSchristos ldx [%l0+%g5],%g5 182*c9496f6bSchristos srlx %g4,24,%g2 183*c9496f6bSchristos xor %g3,%g1,%g1 184*c9496f6bSchristos srlx %o7,48-3,%g4 185*c9496f6bSchristos xor %g2,%o3,%o3 186*c9496f6bSchristos and %g4,120,%g4 187*c9496f6bSchristos sllx %g5,44,%g2 188*c9496f6bSchristos ldx [%l0+%g4],%g4 189*c9496f6bSchristos srlx %g5,20,%g3 190*c9496f6bSchristos xor %g2,%g1,%g1 191*c9496f6bSchristos srlx %o7,52-3,%g5 192*c9496f6bSchristos xor %g3,%o3,%o3 193*c9496f6bSchristos and %g5,120,%g5 194*c9496f6bSchristos sllx %g4,48,%g3 195*c9496f6bSchristos ldx [%l0+%g5],%g5 196*c9496f6bSchristos srlx %g4,16,%g2 197*c9496f6bSchristos xor %g3,%g1,%g1 198*c9496f6bSchristos srlx %o7,56-3,%g4 199*c9496f6bSchristos xor %g2,%o3,%o3 200*c9496f6bSchristos and %g4,120,%g4 201*c9496f6bSchristos sllx %g5,52,%g2 202*c9496f6bSchristos ldx [%l0+%g4],%g4 203*c9496f6bSchristos srlx %g5,12,%g3 204*c9496f6bSchristos xor %g2,%g1,%g1 205*c9496f6bSchristos srlx %o7,60-3,%g5 206*c9496f6bSchristos xor %g3,%o3,%o3 207*c9496f6bSchristos and %g5,120,%g5 208*c9496f6bSchristos sllx %g4,56,%g3 209*c9496f6bSchristos ldx [%l0+%g5],%g5 210*c9496f6bSchristos srlx %g4,8,%g2 211*c9496f6bSchristos xor %g3,%g1,%g1 212*c9496f6bSchristos 213*c9496f6bSchristos sllx %g5,60,%g3 214*c9496f6bSchristos xor %g2,%o3,%o3 215*c9496f6bSchristos srlx %g5,4,%g2 216*c9496f6bSchristos xor %g3,%g1,%g1 217*c9496f6bSchristos xor %g2,%o3,%o3 218*c9496f6bSchristos 219*c9496f6bSchristos srlx %g1,32,%i1 220*c9496f6bSchristos st %g1,[%i0+0] 221*c9496f6bSchristos st %i1,[%i0+4] 222*c9496f6bSchristos srlx %o3,32,%i2 223*c9496f6bSchristos st %o3,[%i0+8] 224*c9496f6bSchristos st %i2,[%i0+12] 225*c9496f6bSchristos 226*c9496f6bSchristos ret 227*c9496f6bSchristos restore 228*c9496f6bSchristos.type bn_GF2m_mul_2x2,#function 229*c9496f6bSchristos.size bn_GF2m_mul_2x2,.-bn_GF2m_mul_2x2 230*c9496f6bSchristos.asciz "GF(2^m) Multiplication for SPARCv9, CRYPTOGAMS by <appro@openssl.org>" 231*c9496f6bSchristos.align 4 232