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