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