1dnl  SPARC v9 64-bit mpn_sqr_diagonal.
2
3dnl  Copyright 2001, 2002 Free Software Foundation, Inc.
4
5dnl  This file is part of the GNU MP Library.
6
7dnl  The GNU MP Library is free software; you can redistribute it and/or modify
8dnl  it under the terms of the GNU Lesser General Public License as published
9dnl  by the Free Software Foundation; either version 3 of the License, or (at
10dnl  your option) any later version.
11
12dnl  The GNU MP Library is distributed in the hope that it will be useful, but
13dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
15dnl  License for more details.
16
17dnl  You should have received a copy of the GNU Lesser General Public License
18dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
19
20include(`../config.m4')
21
22C		   cycles/limb
23C UltraSPARC 1&2:     22
24C UltraSPARC 3:	      36
25
26C This was generated by the Sun C compiler.  It runs at 22 cycles/limb on the
27C UltraSPARC-1/2, three cycles slower than theoretically possible for optimal
28C code using the same algorithm.  For 1-3 limbs, a special loop was generated,
29C which causes performance problems in particular for 2 and 3 limbs.
30C Ultimately, this should be replaced by hand-written code in the same software
31C pipeline style as e.g., addmul_1.asm.
32
33ASM_START()
34	REGISTER(%g2,#scratch)
35	REGISTER(%g3,#scratch)
36PROLOGUE(mpn_sqr_diagonal)
37	save	%sp, -240, %sp
38
39	sethi	%hi(0x1ffc00), %o0
40	sethi	%hi(0x3ffc00), %o1
41	add	%o0, 1023, %o7
42	cmp	%i2, 4
43	add	%o1, 1023, %o4
44	or	%g0, %i1, %g1
45	or	%g0, %i0, %o0
46	bl,pn	%xcc, .Lsmall
47	or	%g0, 0, %g2
48
49	ldx	[%i1], %o1
50	add	%i1, 24, %g1
51	or	%g0, 3, %g2
52	srlx	%o1, 42, %g3
53	stx	%g3, [%sp+2279]
54	and	%o1, %o7, %o2
55	stx	%o2, [%sp+2263]
56	srlx	%o1, 21, %o1
57	ldd	[%sp+2279], %f0
58	and	%o1, %o7, %o1
59	stx	%o1, [%sp+2271]
60	ldx	[%i1+8], %o2
61	fxtod	%f0, %f12
62	srlx	%o2, 21, %o1
63	and	%o2, %o7, %g3
64	ldd	[%sp+2263], %f2
65	fmuld	%f12, %f12, %f10
66	srlx	%o2, 42, %o2
67	ldd	[%sp+2271], %f0
68	and	%o1, %o7, %o1
69	fxtod	%f2, %f8
70	stx	%o2, [%sp+2279]
71	stx	%o1, [%sp+2271]
72	fxtod	%f0, %f0
73	stx	%g3, [%sp+2263]
74	fdtox	%f10, %f14
75	fmuld	%f12, %f8, %f6
76	ldx	[%i1+16], %o2
77	std	%f14, [%sp+2255]
78	fmuld	%f0, %f0, %f2
79	fmuld	%f8, %f8, %f10
80	srlx	%o2, 42, %o1
81	faddd	%f6, %f6, %f6
82	fmuld	%f12, %f0, %f12
83	fmuld	%f0, %f8, %f8
84	ldd	[%sp+2279], %f0
85	ldd	[%sp+2263], %f4
86	fdtox	%f10, %f10
87	std	%f10, [%sp+2239]
88	faddd	%f2, %f6, %f6
89	ldd	[%sp+2271], %f2
90	fdtox	%f12, %f12
91	std	%f12, [%sp+2247]
92	fdtox	%f8, %f8
93	std	%f8, [%sp+2231]
94	fdtox	%f6, %f6
95	std	%f6, [%sp+2223]
96
97.Loop:	srlx	%o2, 21, %g3
98	stx	%o1, [%sp+2279]
99	add	%g2, 1, %g2
100	and	%g3, %o7, %o1
101	ldx	[%sp+2255], %g4
102	cmp	%g2, %i2
103	stx	%o1, [%sp+2271]
104	add	%g1, 8, %g1
105	add	%o0, 16, %o0
106	ldx	[%sp+2239], %o1
107	fxtod	%f0, %f10
108	fxtod	%f4, %f14
109	ldx	[%sp+2231], %i0
110	ldx	[%sp+2223], %g5
111	ldx	[%sp+2247], %g3
112	and	%o2, %o7, %o2
113	fxtod	%f2, %f8
114	fmuld	%f10, %f10, %f0
115	stx	%o2, [%sp+2263]
116	fmuld	%f10, %f14, %f6
117	ldx	[%g1-8], %o2
118	fmuld	%f10, %f8, %f12
119	fdtox	%f0, %f2
120	ldd	[%sp+2279], %f0
121	fmuld	%f8, %f8, %f4
122	faddd	%f6, %f6, %f6
123	fmuld	%f14, %f14, %f10
124	std	%f2, [%sp+2255]
125	sllx	%g4, 20, %g4
126	ldd	[%sp+2271], %f2
127	fmuld	%f8, %f14, %f8
128	sllx	%i0, 22, %i1
129	fdtox	%f12, %f12
130	std	%f12, [%sp+2247]
131	sllx	%g5, 42, %i0
132	add	%o1, %i1, %o1
133	faddd	%f4, %f6, %f6
134	ldd	[%sp+2263], %f4
135	add	%o1, %i0, %o1
136	add	%g3, %g4, %g3
137	fdtox	%f10, %f10
138	std	%f10, [%sp+2239]
139	srlx	%o1, 42, %g4
140	and	%g5, %o4, %i0
141	fdtox	%f8, %f8
142	std	%f8, [%sp+2231]
143	srlx	%g5, 22, %g5
144	sub	%g4, %i0, %g4
145	fdtox	%f6, %f6
146	std	%f6, [%sp+2223]
147	srlx	%g4, 63, %g4
148	add	%g3, %g5, %g3
149	add	%g3, %g4, %g3
150	stx	%o1, [%o0-16]
151	srlx	%o2, 42, %o1
152	bl,pt	%xcc, .Loop
153	stx	%g3, [%o0-8]
154
155	stx	%o1, [%sp+2279]
156	srlx	%o2, 21, %o1
157	fxtod	%f0, %f16
158	ldx	[%sp+2223], %g3
159	fxtod	%f4, %f6
160	and	%o2, %o7, %o3
161	stx	%o3, [%sp+2263]
162	fxtod	%f2, %f4
163	and	%o1, %o7, %o1
164	ldx	[%sp+2231], %o2
165	sllx	%g3, 42, %g4
166	fmuld	%f16, %f16, %f14
167	stx	%o1, [%sp+2271]
168	fmuld	%f16, %f6, %f8
169	add	%o0, 48, %o0
170	ldx	[%sp+2239], %o1
171	sllx	%o2, 22, %o2
172	fmuld	%f4, %f4, %f10
173	ldx	[%sp+2255], %o3
174	fdtox	%f14, %f14
175	fmuld	%f4, %f6, %f2
176	std	%f14, [%sp+2255]
177	faddd	%f8, %f8, %f12
178	add	%o1, %o2, %o2
179	fmuld	%f16, %f4, %f4
180	ldd	[%sp+2279], %f0
181	sllx	%o3, 20, %g5
182	add	%o2, %g4, %o2
183	fmuld	%f6, %f6, %f6
184	srlx	%o2, 42, %o3
185	and	%g3, %o4, %g4
186	srlx	%g3, 22, %g3
187	faddd	%f10, %f12, %f16
188	ldd	[%sp+2271], %f12
189	ldd	[%sp+2263], %f8
190	fxtod	%f0, %f0
191	sub	%o3, %g4, %o3
192	ldx	[%sp+2247], %o1
193	srlx	%o3, 63, %o3
194	fdtox	%f2, %f10
195	fxtod	%f8, %f8
196	std	%f10, [%sp+2231]
197	fdtox	%f6, %f6
198	std	%f6, [%sp+2239]
199	add	%o1, %g5, %o1
200	fmuld	%f0, %f0, %f2
201	fdtox	%f16, %f16
202	std	%f16, [%sp+2223]
203	add	%o1, %g3, %o1
204	fdtox	%f4, %f4
205	std	%f4, [%sp+2247]
206	fmuld	%f0, %f8, %f10
207	fxtod	%f12, %f12
208	add	%o1, %o3, %o1
209	stx	%o2, [%o0-48]
210	fmuld	%f8, %f8, %f6
211	stx	%o1, [%o0-40]
212	fdtox	%f2, %f2
213	ldx	[%sp+2231], %o2
214	faddd	%f10, %f10, %f10
215	ldx	[%sp+2223], %g3
216	fmuld	%f12, %f12, %f4
217	fdtox	%f6, %f6
218	ldx	[%sp+2239], %o1
219	sllx	%o2, 22, %o2
220	fmuld	%f12, %f8, %f8
221	sllx	%g3, 42, %g5
222	ldx	[%sp+2255], %o3
223	fmuld	%f0, %f12, %f0
224	add	%o1, %o2, %o2
225	faddd	%f4, %f10, %f4
226	ldx	[%sp+2247], %o1
227	add	%o2, %g5, %o2
228	and	%g3, %o4, %g4
229	fdtox	%f8, %f8
230	sllx	%o3, 20, %g5
231	std	%f8, [%sp+2231]
232	fdtox	%f0, %f0
233	srlx	%o2, 42, %o3
234	add	%o1, %g5, %o1
235	fdtox	%f4, %f4
236	srlx	%g3, 22, %g3
237	sub	%o3, %g4, %o3
238	std	%f6, [%sp+2239]
239	std	%f4, [%sp+2223]
240	srlx	%o3, 63, %o3
241	add	%o1, %g3, %o1
242	std	%f2, [%sp+2255]
243	add	%o1, %o3, %o1
244	std	%f0, [%sp+2247]
245	stx	%o2, [%o0-32]
246	stx	%o1, [%o0-24]
247	ldx	[%sp+2231], %o2
248	ldx	[%sp+2223], %o3
249	ldx	[%sp+2239], %o1
250	sllx	%o2, 22, %o2
251	sllx	%o3, 42, %g5
252	ldx	[%sp+2255], %g4
253	and	%o3, %o4, %g3
254	add	%o1, %o2, %o2
255	ldx	[%sp+2247], %o1
256	add	%o2, %g5, %o2
257	stx	%o2, [%o0-16]
258	sllx	%g4, 20, %g4
259	srlx	%o2, 42, %o2
260	add	%o1, %g4, %o1
261	srlx	%o3, 22, %o3
262	sub	%o2, %g3, %o2
263	srlx	%o2, 63, %o2
264	add	%o1, %o3, %o1
265	add	%o1, %o2, %o1
266	stx	%o1, [%o0-8]
267	ret
268	restore	%g0, %g0, %g0
269.Lsmall:
270	ldx	[%g1], %o2
271.Loop0:
272	and	%o2, %o7, %o1
273	stx	%o1, [%sp+2263]
274	add	%g2, 1, %g2
275	srlx	%o2, 21, %o1
276	add	%g1, 8, %g1
277	srlx	%o2, 42, %o2
278	stx	%o2, [%sp+2279]
279	and	%o1, %o7, %o1
280	ldd	[%sp+2263], %f0
281	cmp	%g2, %i2
282	stx	%o1, [%sp+2271]
283	fxtod	%f0, %f6
284	ldd	[%sp+2279], %f0
285	ldd	[%sp+2271], %f4
286	fxtod	%f0, %f2
287	fmuld	%f6, %f6, %f0
288	fxtod	%f4, %f10
289	fmuld	%f2, %f6, %f4
290	fdtox	%f0, %f0
291	std	%f0, [%sp+2239]
292	fmuld	%f10, %f6, %f8
293	fmuld	%f10, %f10, %f0
294	faddd	%f4, %f4, %f6
295	fmuld	%f2, %f2, %f4
296	fdtox	%f8, %f8
297	std	%f8, [%sp+2231]
298	fmuld	%f2, %f10, %f2
299	faddd	%f0, %f6, %f0
300	fdtox	%f4, %f4
301	std	%f4, [%sp+2255]
302	fdtox	%f2, %f2
303	std	%f2, [%sp+2247]
304	fdtox	%f0, %f0
305	std	%f0, [%sp+2223]
306	ldx	[%sp+2239], %o1
307	ldx	[%sp+2255], %g4
308	ldx	[%sp+2231], %o2
309	sllx	%g4, 20, %g4
310	ldx	[%sp+2223], %o3
311	sllx	%o2, 22, %o2
312	sllx	%o3, 42, %g5
313	add	%o1, %o2, %o2
314	ldx	[%sp+2247], %o1
315	add	%o2, %g5, %o2
316	stx	%o2, [%o0]
317	and	%o3, %o4, %g3
318	srlx	%o2, 42, %o2
319	add	%o1, %g4, %o1
320	srlx	%o3, 22, %o3
321	sub	%o2, %g3, %o2
322	srlx	%o2, 63, %o2
323	add	%o1, %o3, %o1
324	add	%o1, %o2, %o1
325	stx	%o1, [%o0+8]
326	add	%o0, 16, %o0
327	bl,a,pt	%xcc, .Loop0
328	ldx	[%g1], %o2
329	ret
330	restore	%g0, %g0, %g0
331EPILOGUE(mpn_sqr_diagonal)
332