xref: /openbsd/gnu/gcc/gcc/config/sparc/lb1spl.asm (revision 404b540a)
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