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