190075Sobrien/* This is an assembly language implementation of mulsi3, divsi3, and modsi3 290075Sobrien for the sparclite processor. 350397Sobrien 4117395Skan These routines are all from the SPARClite User's Guide, slightly edited 550397Sobrien to match the desired calling convention, and also to optimize them. */ 650397Sobrien 750397Sobrien#ifdef L_udivsi3 850397Sobrien.text 950397Sobrien .align 4 1050397Sobrien .global .udiv 1150397Sobrien .proc 04 1250397Sobrien.udiv: 1350397Sobrien wr %g0,%g0,%y ! Not a delayed write for sparclite 1450397Sobrien tst %g0 1550397Sobrien divscc %o0,%o1,%g1 1650397Sobrien divscc %g1,%o1,%g1 1750397Sobrien divscc %g1,%o1,%g1 1850397Sobrien divscc %g1,%o1,%g1 1950397Sobrien divscc %g1,%o1,%g1 2050397Sobrien divscc %g1,%o1,%g1 2150397Sobrien divscc %g1,%o1,%g1 2250397Sobrien divscc %g1,%o1,%g1 2350397Sobrien divscc %g1,%o1,%g1 2450397Sobrien divscc %g1,%o1,%g1 2550397Sobrien divscc %g1,%o1,%g1 2650397Sobrien divscc %g1,%o1,%g1 2750397Sobrien divscc %g1,%o1,%g1 2850397Sobrien divscc %g1,%o1,%g1 2950397Sobrien divscc %g1,%o1,%g1 3050397Sobrien divscc %g1,%o1,%g1 3150397Sobrien divscc %g1,%o1,%g1 3250397Sobrien divscc %g1,%o1,%g1 3350397Sobrien divscc %g1,%o1,%g1 3450397Sobrien divscc %g1,%o1,%g1 3550397Sobrien divscc %g1,%o1,%g1 3650397Sobrien divscc %g1,%o1,%g1 3750397Sobrien divscc %g1,%o1,%g1 3850397Sobrien divscc %g1,%o1,%g1 3950397Sobrien divscc %g1,%o1,%g1 4050397Sobrien divscc %g1,%o1,%g1 4150397Sobrien divscc %g1,%o1,%g1 4250397Sobrien divscc %g1,%o1,%g1 4350397Sobrien divscc %g1,%o1,%g1 4450397Sobrien divscc %g1,%o1,%g1 4550397Sobrien divscc %g1,%o1,%g1 4650397Sobrien retl 4750397Sobrien divscc %g1,%o1,%o0 4850397Sobrien#endif 4950397Sobrien 5050397Sobrien#ifdef L_umodsi3 5150397Sobrien.text 5250397Sobrien .align 4 5350397Sobrien .global .urem 5450397Sobrien .proc 04 5550397Sobrien.urem: 5650397Sobrien wr %g0,%g0,%y ! Not a delayed write for sparclite 5750397Sobrien tst %g0 5850397Sobrien divscc %o0,%o1,%g1 5950397Sobrien divscc %g1,%o1,%g1 6050397Sobrien divscc %g1,%o1,%g1 6150397Sobrien divscc %g1,%o1,%g1 6250397Sobrien divscc %g1,%o1,%g1 6350397Sobrien divscc %g1,%o1,%g1 6450397Sobrien divscc %g1,%o1,%g1 6550397Sobrien divscc %g1,%o1,%g1 6650397Sobrien divscc %g1,%o1,%g1 6750397Sobrien divscc %g1,%o1,%g1 6850397Sobrien divscc %g1,%o1,%g1 6950397Sobrien divscc %g1,%o1,%g1 7050397Sobrien divscc %g1,%o1,%g1 7150397Sobrien divscc %g1,%o1,%g1 7250397Sobrien divscc %g1,%o1,%g1 7350397Sobrien divscc %g1,%o1,%g1 7450397Sobrien divscc %g1,%o1,%g1 7550397Sobrien divscc %g1,%o1,%g1 7650397Sobrien divscc %g1,%o1,%g1 7750397Sobrien divscc %g1,%o1,%g1 7850397Sobrien divscc %g1,%o1,%g1 7950397Sobrien divscc %g1,%o1,%g1 8050397Sobrien divscc %g1,%o1,%g1 8150397Sobrien divscc %g1,%o1,%g1 8250397Sobrien divscc %g1,%o1,%g1 8350397Sobrien divscc %g1,%o1,%g1 8450397Sobrien divscc %g1,%o1,%g1 8550397Sobrien divscc %g1,%o1,%g1 8650397Sobrien divscc %g1,%o1,%g1 8750397Sobrien divscc %g1,%o1,%g1 8850397Sobrien divscc %g1,%o1,%g1 8950397Sobrien divscc %g1,%o1,%g1 9050397Sobrien bl 1f 9150397Sobrien rd %y,%o0 9250397Sobrien retl 9350397Sobrien nop 9450397Sobrien1: retl 9550397Sobrien add %o0,%o1,%o0 9650397Sobrien#endif 9750397Sobrien 9850397Sobrien#ifdef L_divsi3 9950397Sobrien.text 10050397Sobrien .align 4 10150397Sobrien .global .div 10250397Sobrien .proc 04 10350397Sobrien! ??? This routine could be made faster if was optimized, and if it was 10450397Sobrien! rewritten to only calculate the quotient. 10550397Sobrien.div: 10650397Sobrien wr %g0,%g0,%y ! Not a delayed write for sparclite 10750397Sobrien mov %o1,%o4 10850397Sobrien tst %o1 10950397Sobrien bl,a 1f 11050397Sobrien sub %g0,%o4,%o4 11150397Sobrien1: tst %o0 11250397Sobrien bl,a 2f 11350397Sobrien mov -1,%y 11450397Sobrien2: divscc %o0,%o4,%g1 11550397Sobrien divscc %g1,%o4,%g1 11650397Sobrien divscc %g1,%o4,%g1 11750397Sobrien divscc %g1,%o4,%g1 11850397Sobrien divscc %g1,%o4,%g1 11950397Sobrien divscc %g1,%o4,%g1 12050397Sobrien divscc %g1,%o4,%g1 12150397Sobrien divscc %g1,%o4,%g1 12250397Sobrien divscc %g1,%o4,%g1 12350397Sobrien divscc %g1,%o4,%g1 12450397Sobrien divscc %g1,%o4,%g1 12550397Sobrien divscc %g1,%o4,%g1 12650397Sobrien divscc %g1,%o4,%g1 12750397Sobrien divscc %g1,%o4,%g1 12850397Sobrien divscc %g1,%o4,%g1 12950397Sobrien divscc %g1,%o4,%g1 13050397Sobrien divscc %g1,%o4,%g1 13150397Sobrien divscc %g1,%o4,%g1 13250397Sobrien divscc %g1,%o4,%g1 13350397Sobrien divscc %g1,%o4,%g1 13450397Sobrien divscc %g1,%o4,%g1 13550397Sobrien divscc %g1,%o4,%g1 13650397Sobrien divscc %g1,%o4,%g1 13750397Sobrien divscc %g1,%o4,%g1 13850397Sobrien divscc %g1,%o4,%g1 13950397Sobrien divscc %g1,%o4,%g1 14050397Sobrien divscc %g1,%o4,%g1 14150397Sobrien divscc %g1,%o4,%g1 14250397Sobrien divscc %g1,%o4,%g1 14350397Sobrien divscc %g1,%o4,%g1 14450397Sobrien divscc %g1,%o4,%g1 14550397Sobrien divscc %g1,%o4,%g1 14650397Sobrien be 6f 14750397Sobrien mov %y,%o3 14850397Sobrien bg 4f 14950397Sobrien addcc %o3,%o4,%g0 15050397Sobrien be,a 6f 15150397Sobrien mov %g0,%o3 15250397Sobrien tst %o0 15350397Sobrien bl 5f 15450397Sobrien tst %g1 15550397Sobrien ba 5f 15650397Sobrien add %o3,%o4,%o3 15750397Sobrien4: subcc %o3,%o4,%g0 15850397Sobrien be,a 6f 15950397Sobrien mov %g0,%o3 16050397Sobrien tst %o0 16150397Sobrien bge 5f 16250397Sobrien tst %g1 16350397Sobrien sub %o3,%o4,%o3 16450397Sobrien5: bl,a 6f 16550397Sobrien add %g1,1,%g1 16650397Sobrien6: tst %o1 16750397Sobrien bl,a 7f 16850397Sobrien sub %g0,%g1,%g1 16950397Sobrien7: retl 17050397Sobrien mov %g1,%o0 ! Quotient is in %g1. 17150397Sobrien#endif 17250397Sobrien 17350397Sobrien#ifdef L_modsi3 17450397Sobrien.text 17550397Sobrien .align 4 17650397Sobrien .global .rem 17750397Sobrien .proc 04 17850397Sobrien! ??? This routine could be made faster if was optimized, and if it was 17950397Sobrien! rewritten to only calculate the remainder. 18050397Sobrien.rem: 18150397Sobrien wr %g0,%g0,%y ! Not a delayed write for sparclite 18250397Sobrien mov %o1,%o4 18350397Sobrien tst %o1 18450397Sobrien bl,a 1f 18550397Sobrien sub %g0,%o4,%o4 18650397Sobrien1: tst %o0 18750397Sobrien bl,a 2f 18850397Sobrien mov -1,%y 18950397Sobrien2: divscc %o0,%o4,%g1 19050397Sobrien divscc %g1,%o4,%g1 19150397Sobrien divscc %g1,%o4,%g1 19250397Sobrien divscc %g1,%o4,%g1 19350397Sobrien divscc %g1,%o4,%g1 19450397Sobrien divscc %g1,%o4,%g1 19550397Sobrien divscc %g1,%o4,%g1 19650397Sobrien divscc %g1,%o4,%g1 19750397Sobrien divscc %g1,%o4,%g1 19850397Sobrien divscc %g1,%o4,%g1 19950397Sobrien divscc %g1,%o4,%g1 20050397Sobrien divscc %g1,%o4,%g1 20150397Sobrien divscc %g1,%o4,%g1 20250397Sobrien divscc %g1,%o4,%g1 20350397Sobrien divscc %g1,%o4,%g1 20450397Sobrien divscc %g1,%o4,%g1 20550397Sobrien divscc %g1,%o4,%g1 20650397Sobrien divscc %g1,%o4,%g1 20750397Sobrien divscc %g1,%o4,%g1 20850397Sobrien divscc %g1,%o4,%g1 20950397Sobrien divscc %g1,%o4,%g1 21050397Sobrien divscc %g1,%o4,%g1 21150397Sobrien divscc %g1,%o4,%g1 21250397Sobrien divscc %g1,%o4,%g1 21350397Sobrien divscc %g1,%o4,%g1 21450397Sobrien divscc %g1,%o4,%g1 21550397Sobrien divscc %g1,%o4,%g1 21650397Sobrien divscc %g1,%o4,%g1 21750397Sobrien divscc %g1,%o4,%g1 21850397Sobrien divscc %g1,%o4,%g1 21950397Sobrien divscc %g1,%o4,%g1 22050397Sobrien divscc %g1,%o4,%g1 22150397Sobrien be 6f 22250397Sobrien mov %y,%o3 22350397Sobrien bg 4f 22450397Sobrien addcc %o3,%o4,%g0 22550397Sobrien be,a 6f 22650397Sobrien mov %g0,%o3 22750397Sobrien tst %o0 22850397Sobrien bl 5f 22950397Sobrien tst %g1 23050397Sobrien ba 5f 23150397Sobrien add %o3,%o4,%o3 23250397Sobrien4: subcc %o3,%o4,%g0 23350397Sobrien be,a 6f 23450397Sobrien mov %g0,%o3 23550397Sobrien tst %o0 23650397Sobrien bge 5f 23750397Sobrien tst %g1 23850397Sobrien sub %o3,%o4,%o3 23950397Sobrien5: bl,a 6f 24050397Sobrien add %g1,1,%g1 24150397Sobrien6: tst %o1 24250397Sobrien bl,a 7f 24350397Sobrien sub %g0,%g1,%g1 24450397Sobrien7: retl 24550397Sobrien mov %o3,%o0 ! Remainder is in %o3. 24650397Sobrien#endif 247