1*404b540aSrobert/* This is an assembly language implementation of mulsi3, divsi3, and modsi3 2*404b540aSrobert for the sparclite processor. 3*404b540aSrobert 4*404b540aSrobert These routines are all from the SPARClite User's Guide, slightly edited 5*404b540aSrobert to match the desired calling convention, and also to optimize them. */ 6*404b540aSrobert 7*404b540aSrobert#ifdef L_udivsi3 8*404b540aSrobert.text 9*404b540aSrobert .align 4 10*404b540aSrobert .global .udiv 11*404b540aSrobert .proc 04 12*404b540aSrobert.udiv: 13*404b540aSrobert wr %g0,%g0,%y ! Not a delayed write for sparclite 14*404b540aSrobert tst %g0 15*404b540aSrobert divscc %o0,%o1,%g1 16*404b540aSrobert divscc %g1,%o1,%g1 17*404b540aSrobert divscc %g1,%o1,%g1 18*404b540aSrobert divscc %g1,%o1,%g1 19*404b540aSrobert divscc %g1,%o1,%g1 20*404b540aSrobert divscc %g1,%o1,%g1 21*404b540aSrobert divscc %g1,%o1,%g1 22*404b540aSrobert divscc %g1,%o1,%g1 23*404b540aSrobert divscc %g1,%o1,%g1 24*404b540aSrobert divscc %g1,%o1,%g1 25*404b540aSrobert divscc %g1,%o1,%g1 26*404b540aSrobert divscc %g1,%o1,%g1 27*404b540aSrobert divscc %g1,%o1,%g1 28*404b540aSrobert divscc %g1,%o1,%g1 29*404b540aSrobert divscc %g1,%o1,%g1 30*404b540aSrobert divscc %g1,%o1,%g1 31*404b540aSrobert divscc %g1,%o1,%g1 32*404b540aSrobert divscc %g1,%o1,%g1 33*404b540aSrobert divscc %g1,%o1,%g1 34*404b540aSrobert divscc %g1,%o1,%g1 35*404b540aSrobert divscc %g1,%o1,%g1 36*404b540aSrobert divscc %g1,%o1,%g1 37*404b540aSrobert divscc %g1,%o1,%g1 38*404b540aSrobert divscc %g1,%o1,%g1 39*404b540aSrobert divscc %g1,%o1,%g1 40*404b540aSrobert divscc %g1,%o1,%g1 41*404b540aSrobert divscc %g1,%o1,%g1 42*404b540aSrobert divscc %g1,%o1,%g1 43*404b540aSrobert divscc %g1,%o1,%g1 44*404b540aSrobert divscc %g1,%o1,%g1 45*404b540aSrobert divscc %g1,%o1,%g1 46*404b540aSrobert retl 47*404b540aSrobert divscc %g1,%o1,%o0 48*404b540aSrobert#endif 49*404b540aSrobert 50*404b540aSrobert#ifdef L_umodsi3 51*404b540aSrobert.text 52*404b540aSrobert .align 4 53*404b540aSrobert .global .urem 54*404b540aSrobert .proc 04 55*404b540aSrobert.urem: 56*404b540aSrobert wr %g0,%g0,%y ! Not a delayed write for sparclite 57*404b540aSrobert tst %g0 58*404b540aSrobert divscc %o0,%o1,%g1 59*404b540aSrobert divscc %g1,%o1,%g1 60*404b540aSrobert divscc %g1,%o1,%g1 61*404b540aSrobert divscc %g1,%o1,%g1 62*404b540aSrobert divscc %g1,%o1,%g1 63*404b540aSrobert divscc %g1,%o1,%g1 64*404b540aSrobert divscc %g1,%o1,%g1 65*404b540aSrobert divscc %g1,%o1,%g1 66*404b540aSrobert divscc %g1,%o1,%g1 67*404b540aSrobert divscc %g1,%o1,%g1 68*404b540aSrobert divscc %g1,%o1,%g1 69*404b540aSrobert divscc %g1,%o1,%g1 70*404b540aSrobert divscc %g1,%o1,%g1 71*404b540aSrobert divscc %g1,%o1,%g1 72*404b540aSrobert divscc %g1,%o1,%g1 73*404b540aSrobert divscc %g1,%o1,%g1 74*404b540aSrobert divscc %g1,%o1,%g1 75*404b540aSrobert divscc %g1,%o1,%g1 76*404b540aSrobert divscc %g1,%o1,%g1 77*404b540aSrobert divscc %g1,%o1,%g1 78*404b540aSrobert divscc %g1,%o1,%g1 79*404b540aSrobert divscc %g1,%o1,%g1 80*404b540aSrobert divscc %g1,%o1,%g1 81*404b540aSrobert divscc %g1,%o1,%g1 82*404b540aSrobert divscc %g1,%o1,%g1 83*404b540aSrobert divscc %g1,%o1,%g1 84*404b540aSrobert divscc %g1,%o1,%g1 85*404b540aSrobert divscc %g1,%o1,%g1 86*404b540aSrobert divscc %g1,%o1,%g1 87*404b540aSrobert divscc %g1,%o1,%g1 88*404b540aSrobert divscc %g1,%o1,%g1 89*404b540aSrobert divscc %g1,%o1,%g1 90*404b540aSrobert bl 1f 91*404b540aSrobert rd %y,%o0 92*404b540aSrobert retl 93*404b540aSrobert nop 94*404b540aSrobert1: retl 95*404b540aSrobert add %o0,%o1,%o0 96*404b540aSrobert#endif 97*404b540aSrobert 98*404b540aSrobert#ifdef L_divsi3 99*404b540aSrobert.text 100*404b540aSrobert .align 4 101*404b540aSrobert .global .div 102*404b540aSrobert .proc 04 103*404b540aSrobert! ??? This routine could be made faster if was optimized, and if it was 104*404b540aSrobert! rewritten to only calculate the quotient. 105*404b540aSrobert.div: 106*404b540aSrobert wr %g0,%g0,%y ! Not a delayed write for sparclite 107*404b540aSrobert mov %o1,%o4 108*404b540aSrobert tst %o1 109*404b540aSrobert bl,a 1f 110*404b540aSrobert sub %g0,%o4,%o4 111*404b540aSrobert1: tst %o0 112*404b540aSrobert bl,a 2f 113*404b540aSrobert mov -1,%y 114*404b540aSrobert2: divscc %o0,%o4,%g1 115*404b540aSrobert divscc %g1,%o4,%g1 116*404b540aSrobert divscc %g1,%o4,%g1 117*404b540aSrobert divscc %g1,%o4,%g1 118*404b540aSrobert divscc %g1,%o4,%g1 119*404b540aSrobert divscc %g1,%o4,%g1 120*404b540aSrobert divscc %g1,%o4,%g1 121*404b540aSrobert divscc %g1,%o4,%g1 122*404b540aSrobert divscc %g1,%o4,%g1 123*404b540aSrobert divscc %g1,%o4,%g1 124*404b540aSrobert divscc %g1,%o4,%g1 125*404b540aSrobert divscc %g1,%o4,%g1 126*404b540aSrobert divscc %g1,%o4,%g1 127*404b540aSrobert divscc %g1,%o4,%g1 128*404b540aSrobert divscc %g1,%o4,%g1 129*404b540aSrobert divscc %g1,%o4,%g1 130*404b540aSrobert divscc %g1,%o4,%g1 131*404b540aSrobert divscc %g1,%o4,%g1 132*404b540aSrobert divscc %g1,%o4,%g1 133*404b540aSrobert divscc %g1,%o4,%g1 134*404b540aSrobert divscc %g1,%o4,%g1 135*404b540aSrobert divscc %g1,%o4,%g1 136*404b540aSrobert divscc %g1,%o4,%g1 137*404b540aSrobert divscc %g1,%o4,%g1 138*404b540aSrobert divscc %g1,%o4,%g1 139*404b540aSrobert divscc %g1,%o4,%g1 140*404b540aSrobert divscc %g1,%o4,%g1 141*404b540aSrobert divscc %g1,%o4,%g1 142*404b540aSrobert divscc %g1,%o4,%g1 143*404b540aSrobert divscc %g1,%o4,%g1 144*404b540aSrobert divscc %g1,%o4,%g1 145*404b540aSrobert divscc %g1,%o4,%g1 146*404b540aSrobert be 6f 147*404b540aSrobert mov %y,%o3 148*404b540aSrobert bg 4f 149*404b540aSrobert addcc %o3,%o4,%g0 150*404b540aSrobert be,a 6f 151*404b540aSrobert mov %g0,%o3 152*404b540aSrobert tst %o0 153*404b540aSrobert bl 5f 154*404b540aSrobert tst %g1 155*404b540aSrobert ba 5f 156*404b540aSrobert add %o3,%o4,%o3 157*404b540aSrobert4: subcc %o3,%o4,%g0 158*404b540aSrobert be,a 6f 159*404b540aSrobert mov %g0,%o3 160*404b540aSrobert tst %o0 161*404b540aSrobert bge 5f 162*404b540aSrobert tst %g1 163*404b540aSrobert sub %o3,%o4,%o3 164*404b540aSrobert5: bl,a 6f 165*404b540aSrobert add %g1,1,%g1 166*404b540aSrobert6: tst %o1 167*404b540aSrobert bl,a 7f 168*404b540aSrobert sub %g0,%g1,%g1 169*404b540aSrobert7: retl 170*404b540aSrobert mov %g1,%o0 ! Quotient is in %g1. 171*404b540aSrobert#endif 172*404b540aSrobert 173*404b540aSrobert#ifdef L_modsi3 174*404b540aSrobert.text 175*404b540aSrobert .align 4 176*404b540aSrobert .global .rem 177*404b540aSrobert .proc 04 178*404b540aSrobert! ??? This routine could be made faster if was optimized, and if it was 179*404b540aSrobert! rewritten to only calculate the remainder. 180*404b540aSrobert.rem: 181*404b540aSrobert wr %g0,%g0,%y ! Not a delayed write for sparclite 182*404b540aSrobert mov %o1,%o4 183*404b540aSrobert tst %o1 184*404b540aSrobert bl,a 1f 185*404b540aSrobert sub %g0,%o4,%o4 186*404b540aSrobert1: tst %o0 187*404b540aSrobert bl,a 2f 188*404b540aSrobert mov -1,%y 189*404b540aSrobert2: divscc %o0,%o4,%g1 190*404b540aSrobert divscc %g1,%o4,%g1 191*404b540aSrobert divscc %g1,%o4,%g1 192*404b540aSrobert divscc %g1,%o4,%g1 193*404b540aSrobert divscc %g1,%o4,%g1 194*404b540aSrobert divscc %g1,%o4,%g1 195*404b540aSrobert divscc %g1,%o4,%g1 196*404b540aSrobert divscc %g1,%o4,%g1 197*404b540aSrobert divscc %g1,%o4,%g1 198*404b540aSrobert divscc %g1,%o4,%g1 199*404b540aSrobert divscc %g1,%o4,%g1 200*404b540aSrobert divscc %g1,%o4,%g1 201*404b540aSrobert divscc %g1,%o4,%g1 202*404b540aSrobert divscc %g1,%o4,%g1 203*404b540aSrobert divscc %g1,%o4,%g1 204*404b540aSrobert divscc %g1,%o4,%g1 205*404b540aSrobert divscc %g1,%o4,%g1 206*404b540aSrobert divscc %g1,%o4,%g1 207*404b540aSrobert divscc %g1,%o4,%g1 208*404b540aSrobert divscc %g1,%o4,%g1 209*404b540aSrobert divscc %g1,%o4,%g1 210*404b540aSrobert divscc %g1,%o4,%g1 211*404b540aSrobert divscc %g1,%o4,%g1 212*404b540aSrobert divscc %g1,%o4,%g1 213*404b540aSrobert divscc %g1,%o4,%g1 214*404b540aSrobert divscc %g1,%o4,%g1 215*404b540aSrobert divscc %g1,%o4,%g1 216*404b540aSrobert divscc %g1,%o4,%g1 217*404b540aSrobert divscc %g1,%o4,%g1 218*404b540aSrobert divscc %g1,%o4,%g1 219*404b540aSrobert divscc %g1,%o4,%g1 220*404b540aSrobert divscc %g1,%o4,%g1 221*404b540aSrobert be 6f 222*404b540aSrobert mov %y,%o3 223*404b540aSrobert bg 4f 224*404b540aSrobert addcc %o3,%o4,%g0 225*404b540aSrobert be,a 6f 226*404b540aSrobert mov %g0,%o3 227*404b540aSrobert tst %o0 228*404b540aSrobert bl 5f 229*404b540aSrobert tst %g1 230*404b540aSrobert ba 5f 231*404b540aSrobert add %o3,%o4,%o3 232*404b540aSrobert4: subcc %o3,%o4,%g0 233*404b540aSrobert be,a 6f 234*404b540aSrobert mov %g0,%o3 235*404b540aSrobert tst %o0 236*404b540aSrobert bge 5f 237*404b540aSrobert tst %g1 238*404b540aSrobert sub %o3,%o4,%o3 239*404b540aSrobert5: bl,a 6f 240*404b540aSrobert add %g1,1,%g1 241*404b540aSrobert6: tst %o1 242*404b540aSrobert bl,a 7f 243*404b540aSrobert sub %g0,%g1,%g1 244*404b540aSrobert7: retl 245*404b540aSrobert mov %o3,%o0 ! Remainder is in %o3. 246*404b540aSrobert#endif 247