1!
2! CDDL HEADER START
3!
4! The contents of this file are subject to the terms of the
5! Common Development and Distribution License (the "License").
6! You may not use this file except in compliance with the License.
7!
8! You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9! or http://www.opensolaris.org/os/licensing.
10! See the License for the specific language governing permissions
11! and limitations under the License.
12!
13! When distributing Covered Code,  this CDDL HEADER in each
14! file and  the License file at usr/src/OPENSOLARIS.LICENSE.
15! If applicable, add the following below this CDDL HEADER, with the
16! fields enclosed by brackets "[]" replaced with your own identifying
17! information: Portions Copyright [yyyy] [name of copyright owner]
18!
19! CDDL HEADER END
20!
21! Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
22!
23! Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24! Use is subject to license terms.
25!
26
27! Portions of this file are duplicated as GCC inline assembly in
28! libm_inlines.h.  Keep them in sync.
29
30 	.inline	__r_hypot_,2
31	ld	[%o0],%o4
32	sethi	0x1fffff,%o5
33	or	%o5,1023,%o5
34	and	%o4,%o5,%o4
35	sethi	0x1fe000,%o3
36	cmp	%o4,%o3
37	ld	[%o0],%f0	! load result with first argument
38	bne	2f
39	nop
40	fabss	%f0,%f0
41	ld	[%o1],%f1
42	.volatile
43	fcmps	%f0,%f1		! generate invalid for Snan
44	.nonvolatile
45	nop
46	fba	5f
47	nop
482:
49	ld	[%o1],%o4
50	sethi	0x1fffff,%o5
51	or	%o5,1023,%o5
52	and	%o4,%o5,%o4
53	sethi	0x1fe000,%o3
54	cmp	%o4,%o3
55	bne	4f
56	nop
57	ld	[%o1],%f0	! second argument inf
58	fabss	%f0,%f0
59	ld	[%o0],%f1
60	.volatile
61	fcmps	%f0,%f1		! generate invalid for Snan
62	.nonvolatile
63	nop
64	fba	5f
65	nop
664:
67	ld	[%o1],%f3
68	fsmuld	%f0,%f0,%f0
69	fsmuld	%f3,%f3,%f2
70	faddd	%f2,%f0,%f0
71	fsqrtd	%f0,%f0
72	fdtos	%f0,%f0
735:
74	.end
75
76	.inline	__c_abs,1
77	ld	[%o0],%o4
78	sethi	0x1fffff,%o5
79	or	%o5,1023,%o5
80	and	%o4,%o5,%o4
81	sethi	0x1fe000,%o3
82	cmp	%o4,%o3
83	ld	[%o0],%f0
84	bne	2f
85	nop
86	fabss	%f0,%f0
87	ld	[%o0+4],%f1
88	.volatile
89	fcmps	%f0,%f1		! generate invalid for Snan
90	.nonvolatile
91	nop
92	fba	5f
93	nop
942:
95	ld	[%o0+4],%o4
96	sethi	0x1fffff,%o5
97	or	%o5,1023,%o5
98	and	%o4,%o5,%o4
99	sethi	0x1fe000,%o3
100	cmp	%o4,%o3
101	bne	4f
102	nop
103	ld	[%o0+4],%f0
104	fabss	%f0,%f0
105	ld	[%o0],%f1
106	.volatile
107	fcmps	%f0,%f1		! generate invalid for Snan
108	.nonvolatile
109	nop
110	fba	5f
111	nop
112! store to 8-aligned address
1134:
114	ld	[%o0+4],%f3
115	fsmuld	%f0,%f0,%f0
116	fsmuld	%f3,%f3,%f2
117	faddd	%f2,%f0,%f0
118	fsqrtd	%f0,%f0
119	fdtos	%f0,%f0
1205:
121	.end
122!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
123! void
124! __Fc_mult(c, a, b)
125! complex *c, *a, *b;
126! {
127
128	.inline	__Fc_mult,3
129!    21		c->real = (a->real *  b->real) - (a->imag *  b->imag)
130	ld	[%o1+4],%f0	! f0 = a->imag
131	ld	[%o2+4],%f1	! f1 = b->imag
132	ld	[%o1],%f2	! f2 = a->real
133	fsmuld	 %f0,%f1,%f4	 ! f4 = (a->imag *  b->imag)
134	ld	[%o2],%f3	! f3 = b->real
135	fsmuld	 %f2,%f1,%f6	! f6 = a->real * b->imag
136	fsmuld	 %f2,%f3,%f8	! f8 =	a->real * b->real
137	fsmuld	 %f0,%f3,%f10	! f10 = a->imag * b->real
138	fsubd	%f8,%f4,%f0	! f0 =	ar*br - ai*bi
139	faddd	%f6,%f10,%f2	! f2 = ai*br + ar*bi
140	fdtos	%f0,%f4
141	fdtos	%f2,%f6
142	st	%f4,[%o0]
143	st	%f6,[%o0+4]
144	.end
145! }
146!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
147! void
148! __Fc_div(c, a, b)
149! complex *c, *a, *b;
150! {
151	.inline	__Fc_div,3
152	ld	[%o2+4],%o3
153	sethi	%hi(0x7fffffff),%o4
154	or	%o4,%lo(0x7fffffff),%o4 ! [internal]
155	andcc	%o3,%o4,%g0
156	ld	[%o2],%f6		! f6 gets reb
157	bne	1f
158	nop
159	ld	[%o1],%f0
160	ld	[%o2],%f1
161	fdivs	%f0,%f1,%f0
162	st	%f0,[%o0]
163	ld	[%o1+4],%f3
164	fdivs	%f3,%f1,%f3
165	st	%f3,[%o0+4]
166	ba	2f
167	nop
1681:					! [internal]
169	sethi	%hi(0x3ff00000),%o4
170	or	%g0,0,%o5
171	std	%o4,[%sp+0x48]
172	ldd	[%sp+0x48],%f8
173	ld	[%o2+4],%f10		! f10 gets imb
174	fsmuld	%f6,%f6,%f16		! f16/17 gets reb**2
175	ld	[%o1+4],%f4		! f4 gets ima
176	fsmuld	%f10,%f10,%f12		! f12/13 gets imb**2
177	ld	[%o1],%f19		! f19 gets rea
178	fsmuld	%f4,%f10,%f0		! f0/f1 gets ima*imb
179	fsmuld	%f19,%f6,%f2		! f2/3 gets rea*reb
180	faddd	%f12,%f16,%f12		! f12/13 gets reb**2+imb**2
181	fdivd	%f8,%f12,%f12		! f12/13 gets 1/(reb**2+imb**2)
182	faddd	%f2,%f0,%f2		! f2/3 gets rea*reb+ima*imb
183	fsmuld	%f4,%f6,%f24		! f24/5 gets ima*reb
184	fmuld	%f2,%f12,%f2		! f2/3 gets rec
185	fsmuld	%f19,%f10,%f10		! f10/11 gets rea*imb
186	fsubd	%f24,%f10,%f10		! f10/11 gets ima*reb-rea*imb
187	fmuld	%f10,%f12,%f12		! f12 gets imc
188	fdtos	%f2,%f7			! f7 gets rec
189	fdtos	%f12,%f15		! f15 gets imc
190	st	%f7,[%o0]
191	st	%f15,[%o0+4]
1922:
193	.end
194! }
195
196	.inline	.mul,2
197	.volatile
198	smul	%o0,%o1,%o0
199	rd	%y,%o1
200	sra	%o0,31,%o2
201	cmp	%o1,%o2
202	.nonvolatile
203	.end
204
205	.inline	.umul,2
206	.volatile
207	umul	%o0,%o1,%o0
208	rd	%y,%o1
209	tst	%o1
210	.nonvolatile
211	.end
212
213	.inline	.div,2
214	sra	%o0,31,%o4	! extend sign
215	.volatile
216	wr	%o4,%g0,%y
217	cmp	%o1,0xffffffff	! is divisor -1?
218	be,a	1f		! if yes
219	.volatile
220	subcc	%g0,%o0,%o0	! simply negate dividend
221	nop			! RT620 FABs A.0/A.1
222	sdiv	%o0,%o1,%o0	! o0 contains quotient a/b
223	.nonvolatile
2241:
225	.end
226
227	.inline	.udiv,2
228	.volatile
229	wr	%g0,%g0,%y
230	nop
231	nop
232	nop
233	udiv	%o0,%o1,%o0	! o0 contains quotient a/b
234	.nonvolatile
235	.end
236
237	.inline	.rem,2
238	sra	%o0,31,%o4	! extend sign
239	.volatile
240	wr	%o4,%g0,%y
241	cmp	%o1,0xffffffff	! is divisor -1?
242	be,a	1f		! if yes
243	.volatile
244	or	%g0,%g0,%o0	! simply return 0
245	nop			! RT620 FABs A.0/A.1
246	sdiv	%o0,%o1,%o2	! o2 contains quotient a/b
247	.nonvolatile
248	smul	%o2,%o1,%o4	! o4 contains q*b
249	sub	%o0,%o4,%o0	! o0 gets a-q*b
2501:
251	.end
252
253	.inline	.urem,2
254	.volatile
255	wr	%g0,%g0,%y
256	nop
257	nop
258	nop
259	udiv	%o0,%o1,%o2	! o2 contains quotient a/b
260	.nonvolatile
261	umul	%o2,%o1,%o4	! o4 contains q*b
262	sub	%o0,%o4,%o0	! o0 gets a-q*b
263	.end
264
265	.inline	.div_o3,2
266	sra	%o0,31,%o4	! extend sign
267	.volatile
268	wr	%o4,%g0,%y
269	cmp	%o1,0xffffffff	! is divisor -1?
270	be,a	1f		! if yes
271	.volatile
272	subcc	%g0,%o0,%o0	! simply negate dividend
273	mov	%o0,%o3		! o3 gets __remainder
274	sdiv	%o0,%o1,%o0	! o0 contains quotient a/b
275	.nonvolatile
276	smul	%o0,%o1,%o4	! o4 contains q*b
277	ba	2f
278	sub	%o3,%o4,%o3	! o3 gets a-q*b
2791:
280	mov	%g0,%o3		! __remainder is 0
2812:
282	.end
283
284	.inline	.udiv_o3,2
285	.volatile
286	wr	%g0,%g0,%y
287	mov	%o0,%o3		! o3 gets __remainder
288	nop
289	nop
290	udiv	%o0,%o1,%o0	! o0 contains quotient a/b
291	.nonvolatile
292	umul	%o0,%o1,%o4	! o4 contains q*b
293	sub	%o3,%o4,%o3	! o3 gets a-q*b
294	.end
295
296	.inline	__ieee754_sqrt,2
297	std	%o0,[%sp+0x48]		! store to 8-aligned address
298	ldd	[%sp+0x48],%f0
299	fsqrtd	%f0,%f0
300	.end
301
302	.inline	__inline_sqrtf,1
303	st	%o0,[%sp+0x44]
304	ld	[%sp+0x44],%f0
305	fsqrts	%f0,%f0
306	.end
307
308	.inline	__inline_sqrt,2
309	std	%o0,[%sp+0x48]		! store to 8-aligned address
310	ldd	[%sp+0x48],%f0
311	fsqrtd	%f0,%f0
312	.end
313
314	.inline	sqrtf,1
315	st	%o0,[%sp+0x44]
316	ld	[%sp+0x44],%f0
317	fsqrts	%f0,%f0
318	.end
319
320	.inline	sqrt,2
321	std	%o0,[%sp+0x48]		! store to 8-aligned address
322	ldd	[%sp+0x48],%f0
323	fsqrtd	%f0,%f0
324	.end
325
326	.inline	__r_sqrt_,1
327	ld	[%o0],%f0
328	fsqrts	%f0,%f0
329	.end
330
331	.inline	__d_sqrt_,1
332	ld	[%o0],%f0
333	ld	[%o0+4],%f1
334	fsqrtd	%f0,%f0
335	.end
336
337	.inline	__ceil,2
338	std	%o0,[%sp+0x48]
339	sethi	%hi(0x80000000),%o5
340	andn	%o0,%o5,%o2
341	sethi	%hi(0x43300000),%o3
342	st	%g0,[%sp+0x54]
343	subcc	%o2,%o3,%g0
344	bl	1f
345	nop
346	sethi	%hi(0x3ff00000),%o2
347	st	%o2,[%sp+0x50]
348	ldd	[%sp+0x48],%f0
349	ldd	[%sp+0x50],%f2
350	fmuld	%f0,%f2,%f0
351	ba	4f
352	nop
3531:
354	tst	%o0
355	st	%o3,[%sp+0x50]
356	ldd	[%sp+0x50],%f2
357	bge	2f
358	nop
359	fnegs	%f2,%f2
3602:
361	ldd	[%sp+0x48],%f4
362	faddd	%f4,%f2,%f0
363	fsubd	%f0,%f2,%f0
364	fcmpd	%f0,%f4
365	sethi	%hi(0x3ff00000),%o2
366	st	%o2,[%sp+0x50]
367	and	%o0,%o5,%o4
368	fbge	3f
369	nop
370	ldd	[%sp+0x50],%f4
371	faddd	%f0,%f4,%f0
3723:
373	st	%f0,[%sp+0x48]
374	ld	[%sp+0x48],%o3
375	andn	%o3,%o5,%o3
376	or	%o4,%o3,%o3
377	st	%o3,[%sp+0x48]
378	ld	[%sp+0x48],%f0
3794:
380	.end
381
382	.inline	__floor,2
383	std	%o0,[%sp+0x48]
384	sethi	%hi(0x80000000),%o5
385	andn	%o0,%o5,%o2
386	sethi	%hi(0x43300000),%o3
387	st	%g0,[%sp+0x54]
388	subcc	%o2,%o3,%g0
389	bl	1f
390	nop
391	sethi	%hi(0x3ff00000),%o2
392	st	%o2,[%sp+0x50]
393	ldd	[%sp+0x48],%f0
394	ldd	[%sp+0x50],%f2
395	fmuld	%f0,%f2,%f0
396	ba	4f
397	nop
3981:
399	tst	%o0
400	st	%o3,[%sp+0x50]
401	ldd	[%sp+0x50],%f2
402	bge	2f
403	nop
404	fnegs	%f2,%f2
4052:
406	ldd	[%sp+0x48],%f4
407	faddd	%f4,%f2,%f0
408	fsubd	%f0,%f2,%f0
409	fcmpd	%f0,%f4
410	sethi	%hi(0x3ff00000),%o2
411	st	%o2,[%sp+0x50]
412	ldd	[%sp+0x50],%f4
413	and	%o0,%o5,%o4
414	fble	3f
415	nop
416	fsubd	%f0,%f4,%f0
4173:
418	st	%f0,[%sp+0x48]
419	ld	[%sp+0x48],%o3
420	andn	%o3,%o5,%o3
421	or	%o4,%o3,%o3
422	st	%o3,[%sp+0x48]
423	ld	[%sp+0x48],%f0
4244:
425	.end
426
427	.inline	__ilogb,2
428	sethi	%hi(0x7ff00000),%o4
429	andcc	%o4,%o0,%o2
430	bne	1f
431	nop
432	sethi	%hi(0x43500000),%o3
433	std	%o0,[%sp+0x48]
434	st	%o3,[%sp+0x50]
435	st	%g0,[%sp+0x54]
436	ldd	[%sp+0x48],%f0
437	ldd	[%sp+0x50],%f2
438	fmuld	%f0,%f2,%f0
439	sethi	%hi(0x80000001),%o0
440	or	%o0,%lo(0x80000001),%o0
441	st	%f0,[%sp+0x48]
442	ld	[%sp+0x48],%o2
443	andcc	%o2,%o4,%o2
444	srl	%o2,20,%o2
445	be	2f
446	nop
447	sub	%o2,0x435,%o0
448	ba	2f
449	nop
4501:
451	subcc	%o4,%o2,%g0
452	srl	%o2,20,%o3
453	bne	0f
454	nop
455	sethi	%hi(0x7fffffff),%o0
456	or	%o0,%lo(0x7fffffff),%o0
457	ba	2f
458	nop
4590:
460	sub	%o3,0x3ff,%o0
4612:
462	.end
463
464	.inline	__rint,2
465	std	%o0,[%sp+0x48]
466	sethi	%hi(0x80000000),%o2
467	andn	%o0,%o2,%o2
468	ldd	[%sp+0x48],%f0
469	sethi	%hi(0x43300000),%o3
470	st	%g0,[%sp+0x50]
471	st	%g0,[%sp+0x54]
472	subcc	%o2,%o3,%g0
473	bl	1f
474	nop
475	sethi	%hi(0x3ff00000),%o2
476	st	%o2,[%sp+0x50]
477	ldd	[%sp+0x50],%f2
478	fmuld	%f0,%f2,%f0
479	ba	3f
480	nop
4811:
482	tst	%o0
483	st	%o3,[%sp+0x48]
484	st	%g0,[%sp+0x4c]
485	ldd	[%sp+0x48],%f2
486	bge	2f
487	nop
488	fnegs	%f2,%f2
4892:
490	faddd	%f0,%f2,%f0
491	fcmpd	%f0,%f2
492	fbne	0f
493	nop
494	ldd	[%sp+0x50],%f0
495	bge	3f
496	nop
497	fnegs	%f0,%f0
498	ba	3f
499	nop
5000:
501	fsubd	%f0,%f2,%f0
5023:
503	.end
504
505	.inline	__rintf,1
506	st	%o0,[%sp+0x48]
507	sethi	%hi(0x80000000),%o2
508	andn	%o0,%o2,%o2
509	ld	[%sp+0x48],%f0
510	sethi	%hi(0x4b000000),%o3
511	st	%g0,[%sp+0x50]
512	subcc	%o2,%o3,%g0
513	bl	1f
514	nop
515	sethi	%hi(0x3f800000),%o2
516	st	%o2,[%sp+0x50]
517	ld	[%sp+0x50],%f2
518	fmuls	%f0,%f2,%f0
519	ba	3f
520	nop
5211:
522	tst	%o0
523	st	%o3,[%sp+0x48]
524	ld	[%sp+0x48],%f2
525	bge	2f
526	nop
527	fnegs	%f2,%f2
5282:
529	fadds	%f0,%f2,%f0
530	fcmps	%f0,%f2
531	fbne	0f
532	nop
533	ld	[%sp+0x50],%f0
534	bge	3f
535	nop
536	fnegs	%f0,%f0
537	ba	3f
538	nop
5390:
540	fsubs	%f0,%f2,%f0
5413:
542	.end
543
544	.inline	__min_subnormal,0
545	set	0x0,%o0
546	st	%o0,[%sp+0x44]
547	ld	[%sp+0x44],%f0
548	set	0x1,%o0
549	st	%o0,[%sp+0x44]
550	ld	[%sp+0x44],%f1
551	.end
552
553	.inline	__d_min_subnormal_,0
554	set	0x0,%o0
555	st	%o0,[%sp+0x44]
556	ld	[%sp+0x44],%f0
557	set	0x1,%o0
558	st	%o0,[%sp+0x44]
559	ld	[%sp+0x44],%f1
560	.end
561
562	.inline	__min_subnormalf,0
563	set	0x1,%o0
564	st	%o0,[%sp+0x44]
565	ld	[%sp+0x44],%f0
566	.end
567
568	.inline	__r_min_subnormal_,0
569	set	0x1,%o0
570	st	%o0,[%sp+0x44]
571	ld	[%sp+0x44],%f0
572	.end
573
574	.inline	__max_subnormal,0
575	set	0x000fffff,%o0
576	st	%o0,[%sp+0x44]
577	ld	[%sp+0x44],%f0
578	set	0xffffffff,%o0
579	st	%o0,[%sp+0x44]
580	ld	[%sp+0x44],%f1
581	.end
582
583	.inline	__d_max_subnormal_,0
584	set	0x000fffff,%o0
585	st	%o0,[%sp+0x44]
586	ld	[%sp+0x44],%f0
587	set	0xffffffff,%o0
588	st	%o0,[%sp+0x44]
589	ld	[%sp+0x44],%f1
590	.end
591
592	.inline	__max_subnormalf,0
593	set	0x007fffff,%o0
594	st	%o0,[%sp+0x44]
595	ld	[%sp+0x44],%f0
596	.end
597
598	.inline	__r_max_subnormal_,0
599	set	0x007fffff,%o0
600	st	%o0,[%sp+0x44]
601	ld	[%sp+0x44],%f0
602	.end
603
604	.inline	__min_normal,0
605        set     0x00100000,%o0
606        set     0x0,%o1
607        std     %o0,[%sp+0x48]
608        ldd     [%sp+0x48],%f0
609	.end
610
611	.inline	__d_min_normal_,0
612	set	0x00100000,%o0
613	st	%o0,[%sp+0x44]
614	ld	[%sp+0x44],%f0
615	set	0x0,%o0
616	st	%o0,[%sp+0x44]
617	ld	[%sp+0x44],%f1
618	.end
619
620	.inline	__min_normalf,0
621	set	0x00800000,%o0
622	st	%o0,[%sp+0x44]
623	ld	[%sp+0x44],%f0
624	.end
625
626	.inline	__r_min_normal_,0
627	set	0x00800000,%o0
628	st	%o0,[%sp+0x44]
629	ld	[%sp+0x44],%f0
630	.end
631
632	.inline	__max_normal,0
633        set     0x7fefffff,%o0
634        set     0xffffffff,%o1
635        std     %o0,[%sp+0x48]
636        ldd     [%sp+0x48],%f0
637	.end
638
639	.inline	__d_max_normal_,0
640	set	0x7fefffff,%o0
641	st	%o0,[%sp+0x44]
642	ld	[%sp+0x44],%f0
643	set	0xffffffff,%o0
644	st	%o0,[%sp+0x44]
645	ld	[%sp+0x44],%f1
646	.end
647
648	.inline	__max_normalf,0
649	set	0x7f7fffff,%o0
650	st	%o0,[%sp+0x44]
651	ld	[%sp+0x44],%f0
652	.end
653
654	.inline	__r_max_normal_,0
655	set	0x7f7fffff,%o0
656	st	%o0,[%sp+0x44]
657	ld	[%sp+0x44],%f0
658	.end
659
660	.inline	__infinity,0
661        set      0x7ff00000,%o0
662        set      0x0,%o1
663        std      %o0,[%sp+0x48]
664        ldd      [%sp+0x48],%f0
665        .end
666
667	.inline	__infinity,0
668        set      0x7ff00000,%o0
669        set      0x0,%o1
670        std      %o0,[%sp+0x48]
671        ldd      [%sp+0x48],%f0
672        .end
673
674	.inline	__d_infinity_,0
675	set	0x7ff00000,%o0
676	st	%o0,[%sp+0x44]
677	ld	[%sp+0x44],%f0
678	set	0x0,%o0
679	st	%o0,[%sp+0x44]
680	ld	[%sp+0x44],%f1
681	.end
682
683	.inline	__infinityf,0
684	set	0x7f800000,%o0
685	st	%o0,[%sp+0x44]
686	ld	[%sp+0x44],%f0
687	.end
688
689	.inline	__r_infinity_,0
690	set	0x7f800000,%o0
691	st	%o0,[%sp+0x44]
692	ld	[%sp+0x44],%f0
693	.end
694
695	.inline	__signaling_nan,0
696        set     0x7ff00000,%o0
697        set     0x1,%o1
698        std     %o0,[%sp+0x48]
699        ldd     [%sp+0x48],%f0
700	.end
701
702	.inline	__d_signaling_nan_,0
703	set	0x7ff00000,%o0
704	st	%o0,[%sp+0x44]
705	ld	[%sp+0x44],%f0
706	set	0x1,%o0
707	st	%o0,[%sp+0x44]
708	ld	[%sp+0x44],%f1
709	.end
710
711	.inline	__signaling_nanf,0
712	set	0x7f800001,%o0
713	st	%o0,[%sp+0x44]
714	ld	[%sp+0x44],%f0
715	.end
716
717	.inline	__r_signaling_nan_,0
718	set	0x7f800001,%o0
719	st	%o0,[%sp+0x44]
720	ld	[%sp+0x44],%f0
721	.end
722
723	.inline	__quiet_nan,0
724	set	0x7fffffff,%o0
725	st	%o0,[%sp+0x44]
726	ld	[%sp+0x44],%f0
727	set	0xffffffff,%o0
728	st	%o0,[%sp+0x44]
729	ld	[%sp+0x44],%f1
730	.end
731
732	.inline	__d_quiet_nan_,0
733	set	0x7fffffff,%o0
734	st	%o0,[%sp+0x44]
735	ld	[%sp+0x44],%f0
736	set	0xffffffff,%o0
737	st	%o0,[%sp+0x44]
738	ld	[%sp+0x44],%f1
739	.end
740
741	.inline	__quiet_nanf,0
742	set	0x7fffffff,%o0
743	st	%o0,[%sp+0x44]
744	ld	[%sp+0x44],%f0
745	.end
746
747	.inline	__r_quiet_nan_,0
748	set	0x7fffffff,%o0
749	st	%o0,[%sp+0x44]
750	ld	[%sp+0x44],%f0
751	.end
752
753	.inline	__swapEX,1
754	and     %o0,0x1f,%o1
755	sll     %o1,5,%o1               ! shift input to aexc bit location
756	.volatile
757	st      %fsr,[%sp+0x44]
758	ld      [%sp+0x44],%o0          ! o0 = fsr
759	andn    %o0,0x3e0,%o2
760	or      %o1,%o2,%o1             ! o1 = new fsr
761	st      %o1,[%sp+0x44]
762	ld      [%sp+0x44],%fsr
763	srl     %o0,5,%o0
764	and     %o0,0x1f,%o0
765	.nonvolatile
766	.end
767
768	.inline	_QgetRD,0
769	st	%fsr,[%sp+0x44]
770	ld	[%sp+0x44],%o0		! o0 = fsr
771	srl	%o0,30,%o0		! return __round control value
772	.end
773
774	.inline	_QgetRP,0
775	or	%g0,%g0,%o0
776	.end
777
778	.inline	__swapRD,1
779	and	%o0,0x3,%o0
780	sll     %o0,30,%o1              ! shift input to RD bit location
781	.volatile
782	st      %fsr,[%sp+0x44]
783	ld      [%sp+0x44],%o0          ! o0 = fsr
784	set     0xc0000000,%o4          ! mask of rounding direction bits
785	andn    %o0,%o4,%o2
786	or      %o1,%o2,%o1             ! o1 = new fsr
787	st      %o1,[%sp+0x44]
788	ld      [%sp+0x44],%fsr
789	srl     %o0,30,%o0
790	and     %o0,0x3,%o0
791	.nonvolatile
792	.end
793!
794! On the SPARC, __swapRP is a no-op; always return 0 for backward compatibility
795!
796
797	.inline	__swapRP,1
798	or	%g0,%g0,%o0
799	.end
800
801	.inline	__swapTE,1
802	and	%o0,0x1f,%o0
803	sll     %o0,23,%o1              ! shift input to TEM bit location
804	.volatile
805	st      %fsr,[%sp+0x44]
806	ld      [%sp+0x44],%o0            ! o0 = fsr
807	set     0x0f800000,%o4          ! mask of TEM (Trap Enable Mode bits)
808	andn    %o0,%o4,%o2
809	or      %o1,%o2,%o1             ! o1 = new fsr
810	st      %o1,[%sp+0x48]
811	ld      [%sp+0x48],%fsr
812	srl     %o0,23,%o0
813	and     %o0,0x1f,%o0
814	.nonvolatile
815	.end
816
817	.inline	fp_class,2
818	sethi	%hi(0x80000000),%o2	! o2 gets 80000000
819	andn	%o0,%o2,%o0		! o0-o1 gets abs(x)
820	orcc	%o0,%o1,%g0		! set cc as x is zero/nonzero
821	bne	1f			! branch if x is nonzero
822	nop
823	mov	0,%o0
824	ba	2f			! x is 0
825	nop
8261:
827	sethi	%hi(0x7ff00000),%o2	! o2 gets 7ff00000
828	andcc	%o0,%o2,%g0		! cc set by __exp field of x
829	bne	1f			! branch if normal or max __exp
830	nop
831	mov	1,%o0
832	ba	2f			! x is subnormal
833	nop
8341:
835	cmp	%o0,%o2
836	bge	1f			! branch if x is max __exp
837	nop
838	mov	2,%o0
839	ba	2f			! x is normal
840	nop
8411:
842	andn	%o0,%o2,%o0		! o0 gets msw __significand field
843	orcc	%o0,%o1,%g0		! set cc by OR __significand
844	bne	1f			! Branch if __nan
845	nop
846	mov	3,%o0
847	ba	2f			! x is __infinity
848	nop
8491:
850	sethi	%hi(0x00080000),%o2
851	andcc	%o0,%o2,%g0		! set cc by quiet/sig bit
852	be	1f			! Branch if signaling
853	nop
854	mov	4,%o0			! x is quiet NaN
855	ba	2f
856	nop
8571:
858	mov	5,%o0			! x is signaling NaN
8592:
860	.end
861
862	.inline	fp_classf,1
863	sethi	%hi(0x80000000),%o2
864	andncc	%o0,%o2,%o0
865	bne	1f
866	nop
867	mov	0,%o0
868	ba	2f			! x is 0
869	nop
8701:
871	sethi	%hi(0x7f800000),%o2
872	andcc	%o0,%o2,%g0
873	bne	1f
874	nop
875	mov	1,%o0
876	ba	2f			! x is subnormal
877	nop
8781:
879	cmp	%o0,%o2
880	bge	1f
881	nop
882	mov	2,%o0
883	ba	2f			! x is normal
884	nop
8851:
886	bg	1f
887	nop
888	mov	3,%o0
889	ba	2f			! x is __infinity
890	nop
8911:
892	sethi	%hi(0x00400000),%o2
893	andcc	%o0,%o2,%g0
894	mov	4,%o0			! x is quiet NaN
895	bne	2f
896	nop
897	mov	5,%o0			! x is signaling NaN
8982:
899	.end
900
901	.inline	__ir_fp_class_,1
902	ld	[%o0],%o0
903	sethi	%hi(0x80000000),%o2
904	andncc	%o0,%o2,%o0
905	bne	1f
906	nop
907	mov	0,%o0
908	ba	2f			! x is 0
909	nop
9101:
911	sethi	%hi(0x7f800000),%o2
912	andcc	%o0,%o2,%g0
913	bne	1f
914	nop
915	mov	1,%o0
916	ba	2f			! x is subnormal
917	nop
9181:
919	cmp	%o0,%o2
920	bge	1f
921	nop
922	mov	2,%o0
923	ba	2f			! x is normal
924	nop
9251:
926	bg	1f
927	nop
928	mov	3,%o0
929	ba	2f			! x is __infinity
930	nop
9311:
932	sethi	%hi(0x00400000),%o2
933	andcc	%o0,%o2,%g0
934	mov	4,%o0			! x is quiet NaN
935	bne	2f
936	nop
937	mov	5,%o0			! x is signaling NaN
9382:
939	.end
940
941	.inline	__copysign,4
942        set     0x80000000,%o3
943        and     %o2,%o3,%o2
944        andn    %o0,%o3,%o0
945        or      %o0,%o2,%o0
946        std      %o0,[%sp+0x48]
947        ldd     [%sp+0x48],%f0
948        .end
949
950	.inline	__copysignf,2
951	set	0x80000000,%o2
952	andn	%o0,%o2,%o0
953	and	%o1,%o2,%o1
954	or	%o0,%o1,%o0
955	st	%o0,[%sp+0x44]
956	ld	[%sp+0x44],%f0
957	.end
958
959	.inline	__r_copysign_,2
960	ld	[%o0],%o0
961	ld	[%o1],%o1
962	set	0x80000000,%o2
963	andn	%o0,%o2,%o0
964	and	%o1,%o2,%o1
965	or	%o0,%o1,%o0
966	st	%o0,[%sp+0x44]
967	ld	[%sp+0x44],%f0
968	.end
969
970	.inline	_finite,2
971	set	0x7ff00000,%o1
972	and	%o0,%o1,%o0
973	cmp	%o0,%o1
974	mov	1,%o0
975	bne	1f
976	nop
977	mov	0,%o0
9781:
979	.end
980
981	.inline	__finitef,2
982	set	0x7f800000,%o1
983	and	%o0,%o1,%o0
984	cmp	%o0,%o1
985	mov	1,%o0
986	bne	1f
987	nop
988	mov	0,%o0
9891:
990	.end
991
992	.inline	__ir_finite_,1
993	ld	[%o0],%o0
994	set	0x7f800000,%o1
995	and	%o0,%o1,%o0
996	cmp	%o0,%o1
997	mov	1,%o0
998	bne	1f
999	nop
1000	mov	0,%o0
10011:
1002	.end
1003
1004	.inline	__signbit,1
1005	srl	%o0,31,%o0
1006	.end
1007
1008	.inline	__signbitf,1
1009	srl	%o0,31,%o0
1010	.end
1011
1012	.inline	__ir_signbit_,1
1013	ld	[%o0],%o0
1014	srl	%o0,31,%o0
1015	.end
1016
1017	.inline	__isinf,2
1018	tst	%o1
1019	sethi	%hi(0x80000000),%o2
1020	bne	1f
1021	nop
1022	andn	%o0,%o2,%o0
1023	sethi	%hi(0x7ff00000),%o2
1024	cmp	%o0,%o2
1025	mov	1,%o0
1026	be	2f
1027	nop
10281:
1029	mov	0,%o0
10302:
1031	.end
1032
1033	.inline	__isinff,1
1034	sethi	%hi(0x80000000),%o2
1035	andn	%o0,%o2,%o0		! o0 gets abs(x)
1036	sethi	%hi(0x7f800000),%o2
1037	cmp	%o0,%o2
1038	mov	0,%o0
1039	bne	1f			! Branch if not inf.
1040	nop
1041	mov	1,%o0
10421:
1043	.end
1044
1045	.inline	__ir_isinf_,1
1046	ld	[%o0],%o0
1047	sethi	%hi(0x80000000),%o2
1048	andn	%o0,%o2,%o0		! o0 gets abs(x)
1049	sethi	%hi(0x7f800000),%o2
1050	cmp	%o0,%o2
1051	mov	0,%o0
1052	bne	1f			! Branch if not inf.
1053	nop
1054	mov	1,%o0
10551:
1056	.end
1057
1058	.inline	__isnan,2
1059	sethi	%hi(0x80000000),%o2
1060	andn	%o0,%o2,%o0
1061	sub	%g0,%o1,%o3
1062	or	%o1,%o3,%o1
1063	srl	%o1,31,%o1
1064	or	%o0,%o1,%o0
1065	sethi	%hi(0x7ff00000),%o4
1066	sub	%o4,%o0,%o0
1067	srl	%o0,31,%o0
1068	.end
1069
1070	.inline	__isnanf,1
1071	sethi	%hi(0x80000000),%o2
1072	andn	%o0,%o2,%o0
1073	sethi	%hi(0x7f800000),%o1
1074	sub	%o1,%o0,%o0
1075	srl	%o0,31,%o0
1076	.end
1077
1078	.inline	__ir_isnan_,1
1079	ld	[%o0],%o0
1080	sethi	%hi(0x80000000),%o2
1081	andn	%o0,%o2,%o0
1082	sethi	%hi(0x7f800000),%o1
1083	sub	%o1,%o0,%o0
1084	srl	%o0,31,%o0
1085	.end
1086
1087	.inline	__isnormal,2
1088	sethi	%hi(0x80000000),%o2
1089	andn	%o0,%o2,%o0
1090	sethi	%hi(0x7ff00000),%o2
1091	cmp	%o0,%o2
1092	sethi	%hi(0x00100000),%o2
1093	bge	1f
1094	nop
1095	cmp	%o0,%o2
1096	mov	1,%o0
1097	bge	2f
1098	nop
10991:
1100	mov	0,%o0
11012:
1102	.end
1103
1104	.inline	__isnormalf,1
1105	sethi	%hi(0x80000000),%o2
1106	andn	%o0,%o2,%o0
1107	sethi	%hi(0x7f800000),%o2
1108	cmp	%o0,%o2
1109	sethi	%hi(0x00800000),%o2
1110	bge	1f
1111	nop
1112	cmp	%o0,%o2
1113	mov	1,%o0
1114	bge	2f
1115	nop
11161:
1117	mov	0,%o0
11182:
1119	.end
1120
1121	.inline	__ir_isnormal_,1
1122	ld	[%o0],%o0
1123	sethi	%hi(0x80000000),%o2
1124	andn	%o0,%o2,%o0
1125	sethi	%hi(0x7f800000),%o2
1126	cmp	%o0,%o2
1127	sethi	%hi(0x00800000),%o2
1128	bge	1f
1129	nop
1130	cmp	%o0,%o2
1131	mov	1,%o0
1132	bge	2f
1133	nop
11341:
1135	mov	0,%o0
11362:
1137	.end
1138
1139	.inline	__issubnormal,2
1140	sethi	%hi(0x80000000),%o2	! o2 gets 80000000
1141	andn	%o0,%o2,%o0		! o0/o1 gets abs(x)
1142	sethi	%hi(0x00100000),%o2	! o2 gets 00100000
1143	cmp	%o0,%o2
1144	bge	1f			! branch if x norm or max __exp
1145	nop
1146	orcc	%o0,%o1,%g0
1147	be	1f			! Branch if x zero
1148	nop
1149	mov	1,%o0			! x is subnormal
1150	ba	2f
1151	nop
11521:
1153	mov	0,%o0
11542:
1155	.end
1156
1157	.inline	__issubnormalf,1
1158	sethi	%hi(0x80000000),%o2	! o2 gets 80000000
1159	andn	%o0,%o2,%o0		! o0 gets abs(x)
1160	sethi	%hi(0x00800000),%o2	! o2 gets 00800000
1161	cmp	%o0,%o2
1162	bge	1f			! branch if x norm or max __exp
1163	nop
1164	orcc	%o0,%g0,%g0
1165	be	1f			! Branch if x zero
1166	nop
1167	mov	1,%o0			! x is subnormal
1168	ba	2f
1169	nop
11701:
1171	mov	0,%o0
11722:
1173	.end
1174
1175	.inline	__ir_issubnormal_,1
1176	ld	[%o0],%o0
1177	sethi	%hi(0x80000000),%o2	! o2 gets 80000000
1178	andn	%o0,%o2,%o0		! o0 gets abs(x)
1179	sethi	%hi(0x00800000),%o2	! o2 gets 00800000
1180	cmp	%o0,%o2
1181	bge	1f			! branch if x norm or max __exp
1182	nop
1183	orcc	%o0,%g0,%g0
1184	be	1f			! Branch if x zero
1185	nop
1186	mov	1,%o0			! x is subnormal
1187	ba	2f
1188	nop
11891:
1190	mov	0,%o0
11912:
1192	.end
1193
1194	.inline	__iszero,2
1195	sethi	%hi(0x80000000),%o2
1196	andn	%o0,%o2,%o0
1197	orcc	%o0,%o1,%g0
1198	mov	1,%o0
1199	be	1f
1200	nop
1201	mov	0,%o0
12021:
1203	.end
1204
1205	.inline	__iszerof,1
1206	sethi	%hi(0x80000000),%o2
1207	andncc	%o0,%o2,%o0
1208	mov	1,%o0
1209	be	1f
1210	nop
1211	mov	0,%o0
12121:
1213	.end
1214
1215	.inline	__ir_iszero_,1
1216	ld	[%o0],%o0
1217	sethi	%hi(0x80000000),%o2
1218	andncc	%o0,%o2,%o0
1219	mov	1,%o0
1220	be	1f
1221	nop
1222	mov	0,%o0
12231:
1224	.end
1225
1226	.inline	abs,1
1227	sra	%o0,31,%o1
1228	xor	%o0,%o1,%o0
1229        sub	%o0,%o1,%o0
1230        .end
1231
1232	.inline	fabs,2
1233	st	%o0,[%sp+0x48]
1234	st	%o1,[%sp+0x4c]
1235	ldd	[%sp+0x48],%f0
1236	fabsd	%f0,%f0
1237	.end
1238
1239	.inline	fabsf,1
1240	st	%o0,[%sp+0x44]
1241	ld	[%sp+0x44],%f0
1242	fabss	%f0,%f0
1243	.end
1244
1245	.inline	__r_fabs_,1
1246	ld	[%o0],%f0
1247	fabss	%f0,%f0
1248	.end
1249!
1250!	__nintf - f77 NINT(REAL*4)
1251!
1252
1253	.inline	__nintf,1
1254	srl	%o0,30-7,%g1
1255	sethi	%hi(0x7fffff),%o2
1256	st	%o0,[%sp+0x44]
1257	and	%g1,0xff,%g1
1258	or	%o2,%lo(0x7fffff),%o2
1259	sethi	%hi(1<<22),%o4
1260	subcc	%g1,127+31,%g0
1261	and	%o0,%o2,%o3
1262	bl	0f
1263	nop
1264	sethi	%hi(0xcf000000),%o2
1265	sethi	%hi(0x80000000),%g1
1266	subcc	%o0,%o2,%g0
1267	or	%g1,%g0,%o0
1268	be	9f
1269	nop
1270	ld	[%sp+0x44],%f0
1271	fstoi	%f0,%f0
1272	st	%f0,[%sp+0x44]
1273	ld	[%sp+0x44],%o0
1274	ba	9f
1275	nop
12760:
1277	add	%o4,%o4,%o5
1278	or	%o3,%o5,%o3
1279	sra	%o0,31-0,%o2
1280	subcc	%g1,127,%g1
1281	srl	%o4,%g1,%o4
1282	bge	1f
1283	nop
1284	subcc	%g1,-1,%g0
1285	or	%g0,0,%o0
1286	bne	2f
1287	nop
1288	or	%g0,1,%o0
1289	ba	2f
1290	nop
12911:
1292	add	%o3,%o4,%o3
1293	or	%g0,23,%o0
1294	subcc	%o0,%g1,%o0
1295	bl	1f
1296	nop
1297	srl	%o3,%o0,%o0
1298	ba	2f
1299	nop
13001:
1301	sub	%g0,%o0,%o0
1302	sll	%o3,%o0,%o0
13032:
1304	xor	%o0,%o2,%o0
1305	and	%o2,1,%o2
1306	add	%o0,%o2,%o0
13079:
1308	.end
1309
1310	.inline	__il_nint,1
1311	ld	[%o0],%o0
1312	sra	%o0,0,%o0
1313	srlx	%o0,31-8,%g1
1314	or	%g0,1,%o2
1315	sllx	%o2,23-1,%o4
1316	and	%g1,0xff,%g1
1317	sllx	%o2,63-0,%o2
1318	subcc	%g1,127+63,%g0
1319	bl	0f
1320	nop
1321	st	%o0,[%sp+0x48]
1322	ld	[%sp+0x48],%f0
1323	fstox	%f0,%f0
1324	std	%f0,[%sp+0x48]
1325	ldx	[%sp+0x48],%o1
1326	ba	9f
1327	nop
13280:
1329	add	%o4,%o4,%o5
1330	srax	%o2,63-23,%o2
1331	sub	%g1,127+23,%o1
1332	xnor	%o2,%g0,%o2
1333	and	%o0,%o2,%o3
1334	or	%o3,%o5,%o3
1335	srax	%o0,63-0,%o2
1336	subcc	%g1,127,%g1
1337	bge	1f
1338	nop
1339	subcc	%g1,-1,%g0
1340	or	%g0,0,%o0
1341	bne	2f
1342	nop
1343	or	%g0,1,%o0
1344	ba	2f
1345	nop
13461:
1347	brlz,pt	%o1,3f
1348	nop
1349	sub	%g1,23,%o0
1350	sllx	%o3,%o0,%o0
1351	ba	2f
1352	nop
13533:
1354	srlx	%o4,%g1,%o4
1355	add	%o3,%o4,%o3
1356	or	%g0,23,%o0
1357	sub	%o0,%g1,%o0
1358	srlx	%o3,%o0,%o0
13592:
1360	xor	%o0,%o2,%o0
1361	sub	%o0,%o2,%o1
13629:
1363	srlx	%o1,32,%o0
1364	.end
1365!
1366!	__i_dnnt - f77 NINT(REAL*8)
1367!
1368
1369	.inline	__i_dnnt,1
1370	ld	[%o0],%o1
1371	sllx	%o1,32,%o1
1372	ld	[%o0+4],%o0
1373	or	%o0,%o1,%o0
1374	srlx	%o0,63-11,%g1
1375	or	%g0,1,%o2
1376	stx	%o0,[%sp+0x48]
1377	sllx	%o2,52-1,%o4
1378	and	%g1,0x7ff,%g1
1379	sllx	%o2,63-0,%o2
1380	subcc	%g1,1023+32,%g0
1381	bl	0f
1382	nop
1383	ldd	[%sp+0x48],%f0
1384	ba	8f
1385	nop
13860:
1387	add	%o4,%o4,%o5
1388	srax	%o2,63-52,%o2
1389	sub	%g1,1023+30,%o1
1390	xnor	%o2,%g0,%o2
1391	and	%o0,%o2,%o3
1392	or	%o3,%o5,%o3
1393	srax	%o0,63-0,%o2
1394	subcc	%g1,1023,%g1
1395	bge	1f
1396	nop
1397	subcc	%g1,-1,%g0
1398	or	%g0,0,%o0
1399	bne	2f
1400	nop
1401	or	%g0,1,%o0
1402	ba	2f
1403	nop
14041:
1405	srlx	%o4,%g1,%o4
1406	add	%o3,%o4,%o3
1407	or	%g0,52,%o0
1408	sub	%o0,%g1,%o0
1409	srlx	%o3,%o0,%o0
14102:
1411	xor	%o0,%o2,%o0
1412	sub	%o0,%o2,%o0
1413	brlz,pt	%o1,9f
1414	nop
1415	stx	%o0,[%sp+0x48]
1416	ldd	[%sp+0x48],%f0
1417	fxtod	%f0,%f0
14188:
1419	fdtoi	%f0,%f0
1420	st	%f0,[%sp+0x44]
1421	ld	[%sp+0x44],%o0
14229:
1423	.end
1424
1425	.inline	__il_dnnt,1
1426	ld	[%o0],%o1
1427	sllx	%o1,32,%o1
1428	ld	[%o0+4],%o0
1429	or	%o0,%o1,%o0
1430	srlx	%o0,63-11,%g1
1431	or	%g0,1,%o2
1432	sllx	%o2,52-1,%o4
1433	and	%g1,0x7ff,%g1
1434	sllx	%o2,63-0,%o2
1435	subcc	%g1,1023+63,%g0
1436	bl	0f
1437	nop
1438	stx	%o0,[%sp+0x48]
1439	ldd	[%sp+0x48],%f0
1440	fdtox	%f0,%f0
1441	std	%f0,[%sp+0x48]
1442	ldx	[%sp+0x48],%o1
1443	ba	9f
1444	nop
14450:
1446	add	%o4,%o4,%o5
1447	srax	%o2,63-52,%o2
1448	sub	%g1,1023+52,%o1
1449	xnor	%o2,%g0,%o2
1450	and	%o0,%o2,%o3
1451	or	%o3,%o5,%o3
1452	srax	%o0,63-0,%o2
1453	subcc	%g1,1023,%g1
1454	bge	1f
1455	nop
1456	subcc	%g1,-1,%g0
1457	or	%g0,0,%o0
1458	bne	2f
1459	nop
1460	or	%g0,1,%o0
1461	ba	2f
1462	nop
14631:
1464	brlz,pt	%o1,3f
1465	nop
1466	sub	%g1,52,%o0
1467	sllx	%o3,%o0,%o0
1468	ba	2f
1469	nop
14703:
1471	srlx	%o4,%g1,%o4
1472	add	%o3,%o4,%o3
1473	or	%g0,52,%o0
1474	sub	%o0,%g1,%o0
1475	srlx	%o3,%o0,%o0
14762:
1477	xor	%o0,%o2,%o0
1478	sub	%o0,%o2,%o1
14799:
1480	srlx	%o1,32,%o0
1481	.end
1482
1483	.inline	__anintf,1
1484	or	%g0,1,%o1
1485	srl	%o0,23,%g1
1486	and	%g1,0xff,%g1
1487	sub	%g0,%g1,%g1
1488	add	%g1,0x95,%g1
1489	subcc	%g1,23,%g0
1490	sll	%o1,%g1,%o1
1491	sub	%o1,1,%o2
1492	bcs	1f
1493	nop
1494	be	2f
1495	nop
1496	bl	3f
1497	nop
1498	sethi	%hi(0x80000000),%o1
1499	and	%o0,%o1,%o0
1500	ba	3f
1501	nop
15021:
1503	and	%o0,%o1,%o1
15042:
1505	add	%o0,%o1,%o0
1506	andn	%o0,%o2,%o0
15073:
1508	st	%o0,[%sp+0x48]
1509	ld	[%sp+0x48],%f0
1510	.end
1511
1512	.inline	__anint,2
1513	sllx	%o0,32,%o0
1514	or	%o0,%o1,%o0
1515	or	%g0,1,%o1
1516	srlx	%o0,52,%g1
1517	and	%g1,0x7ff,%g1
1518	sub	%g0,%g1,%g1
1519	add	%g1,0x432,%g1
1520	subcc	%g1,52,%g0
1521	sllx	%o1,%g1,%o1
1522	sub	%o1,1,%o2
1523	bcs,pt	%icc,1f
1524	nop
1525	be,pt	%icc,2f
1526	nop
1527	bl,pt	%icc,3f
1528	nop
1529	srlx	%o0,63,%o0
1530	sllx	%o0,63,%o0
1531	ba	3f
1532	nop
15331:
1534	and	%o0,%o1,%o1
15352:
1536	add	%o0,%o1,%o0
1537	andn	%o0,%o2,%o0
15383:
1539	stx	%o0,[%sp+0x48]
1540	ldd	[%sp+0x48],%f0
1541	.end
1542
1543	.inline	__Fz_minus,3
1544	ld	[%o1],%f0
1545	ld	[%o1+0x4],%f1
1546	ld	[%o2],%f4
1547	ld	[%o2+0x4],%f5
1548	fsubd	%f0,%f4,%f0
1549	ld	[%o1+8],%f2
1550	ld	[%o1+0xc],%f3
1551	ld	[%o2+8],%f6
1552	ld	[%o2+0xc],%f7
1553	fsubd	%f2,%f6,%f2
1554	st	%f0,[%o0+0x0]
1555	st	%f1,[%o0+0x4]
1556	st	%f2,[%o0+0x8]
1557	st	%f3,[%o0+0xc]
1558	.end
1559
1560	.inline	__Fz_add,3
1561	ld	[%o1],%f0
1562	ld	[%o1+0x4],%f1
1563	ld	[%o2],%f4
1564	ld	[%o2+0x4],%f5
1565	faddd	%f0,%f4,%f0
1566	ld	[%o1+8],%f2
1567	ld	[%o1+0xc],%f3
1568	ld	[%o2+8],%f6
1569	ld	[%o2+0xc],%f7
1570	faddd	%f2,%f6,%f2
1571	st	%f0,[%o0+0x0]
1572	st	%f1,[%o0+0x4]
1573	st	%f2,[%o0+0x8]
1574	st	%f3,[%o0+0xc]
1575	.end
1576
1577	.inline	__Fz_neg,2
1578	ld	[%o1],%f0
1579	fnegs	%f0,%f0
1580	ld	[%o1+0x4],%f1
1581	st	%f1,[%o0+0x4]
1582	ld	[%o1+8],%f2
1583	fnegs	%f2,%f2
1584	ld	[%o1+0xc],%f3
1585	st	%f3,[%o0+0xc]
1586	st	%f0,[%o0]
1587	st	%f2,[%o0+0x8]
1588	.end
1589
1590	.inline	__Ff_conv_z,2
1591	st	%o1,[%sp+0x44]
1592	ld	[%sp+0x44],%f0
1593	fstod	%f0,%f0
1594	st	%g0,[%o0+0x8]
1595	st	%g0,[%o0+0xc]
1596	st	%f1,[%o0+0x4]
1597	st	%f0,[%o0]
1598	.end
1599
1600	.inline	__Fz_conv_f,1
1601	ld	[%o0],%f0
1602	ld	[%o0+4],%f1
1603	fdtos	%f0,%f0
1604	.end
1605
1606	.inline	__Fz_conv_i,1
1607	ld	[%o0],%f0
1608	ld	[%o0+4],%f1
1609	fdtoi	%f0,%f0
1610	st	%f0,[%sp+0x44]
1611	ld	[%sp+0x44],%o0
1612	.end
1613
1614	.inline	__Fi_conv_z,2
1615	st	%o1,[%sp+0x44]
1616	ld	[%sp+0x44],%f0
1617	fitod	%f0,%f0
1618	st	%g0,[%o0+0x8]
1619	st	%g0,[%o0+0xc]
1620	st	%f1,[%o0+0x4]
1621	st	%f0,[%o0]
1622	.end
1623
1624	.inline	__Fz_conv_d,1
1625	ld	[%o0],%f0
1626	ld	[%o0+4],%f1
1627	.end
1628
1629	.inline	__Fd_conv_z,3
1630	st	%o1,[%o0]
1631	st	%o2,[%o0+0x4]
1632	st	%g0,[%o0+0x8]
1633	st	%g0,[%o0+0xc]
1634	.end
1635
1636	.inline	__Fz_conv_c,2
1637	ldd     [%o1],%f0
1638        fdtos   %f0,%f0
1639        st      %f0,[%o0]
1640        ldd     [%o1+0x8],%f2
1641        fdtos   %f2,%f1
1642        st      %f1,[%o0+0x4]
1643	.end
1644
1645	.inline	__Fz_eq,2
1646	ld	[%o0],%f0
1647	ld	[%o0+4],%f1
1648	ld	[%o1],%f2
1649	ld	[%o1+4],%f3
1650	fcmpd	%f0,%f2
1651	mov	%o0,%o2
1652	mov	0,%o0
1653	fbne	1f
1654	nop
1655	ld	[%o2+8],%f0
1656	ld	[%o2+12],%f1
1657	ld	[%o1+8],%f2
1658	ld	[%o1+12],%f3
1659	fcmpd	%f0,%f2
1660	nop
1661	fbne	1f
1662	nop
1663	mov	1,%o0
16641:
1665	.end
1666
1667	.inline	__Fz_ne,2
1668	ld	[%o0],%f0
1669	ld	[%o0+4],%f1
1670	ld	[%o1],%f2
1671	ld	[%o1+4],%f3
1672	fcmpd	%f0,%f2
1673	mov	%o0,%o2
1674	mov	1,%o0
1675	fbne	1f
1676	nop
1677	ld	[%o2+8],%f0
1678	ld	[%o2+12],%f1
1679	ld	[%o1+8],%f2
1680	ld	[%o1+12],%f3
1681	fcmpd	%f0,%f2
1682	nop
1683	fbne	1f
1684	nop
1685	mov	0,%o0
16861:
1687	.end
1688
1689	.inline	__c_cmplx,3
1690	ld	[%o1],%o1
1691	st	%o1,[%o0]
1692	ld	[%o2],%o2
1693	st	%o2,[%o0+4]
1694	.end
1695
1696	.inline	__d_cmplx,3
1697	ld	[%o1],%f0
1698	st	%f0,[%o0]
1699	ld	[%o1+4],%f1
1700	st	%f1,[%o0+4]
1701	ld	[%o2],%f0
1702	st	%f0,[%o0+0x8]
1703	ld	[%o2+4],%f1
1704	st	%f1,[%o0+0xc]
1705	.end
1706
1707	.inline	__r_cnjg,2
1708	ld	[%o1+0x4],%f1
1709	fnegs	%f1,%f1
1710	ld	[%o1],%f0
1711	st	%f0,[%o0]
1712	st	%f1,[%o0+4]
1713	.end
1714
1715	.inline	__d_cnjg,2
1716	ld	[%o1+0x8],%f0
1717	fnegs	%f0,%f0
1718	ld	[%o1+0xc],%f1
1719	st	%f1,[%o0+0xc]
1720	ld	[%o1+0x0],%f1
1721	st	%f1,[%o0+0x0]
1722	ld	[%o1+0x4],%f1
1723	st	%f1,[%o0+0x4]
1724	st	%f0,[%o0+0x8]
1725	.end
1726
1727	.inline	__r_dim,2
1728	st	%g0,[%sp+0x48]
1729	ld	[%sp+0x48],%f4
1730	ld	[%o0],%f0
1731	ld	[%o1],%f2
1732	fcmps	%fcc0,%f0,%f2
1733	fmovsule %fcc0,%f4,%f2
1734	fsubs	%f0,%f2,%f0
1735	fmovsule %fcc0,%f4,%f0
1736	.end
1737
1738	.inline	__d_dim,2
1739	stx	%g0,[%sp+0x48]
1740	ldd	[%sp+0x48],%f4
1741	ld	[%o0],%f0
1742	ld	[%o0+4],%f1
1743	ld	[%o1],%f2
1744	ld	[%o1+4],%f3
1745	fcmpd	%fcc0,%f0,%f2
1746	fmovdule %fcc0,%f4,%f2
1747	fsubd	%f0,%f2,%f0
1748	fmovdule %fcc0,%f4,%f0
1749	.end
1750
1751	.inline	__r_imag,1
1752	ld	[%o0+4],%f0
1753	.end
1754
1755	.inline	__d_imag,1
1756	ld	[%o0+8],%f0
1757	ld	[%o0+0xc],%f1
1758	.end
1759
1760	.inline	__f95_signf,2
1761	ld	[%o0],%f0
1762	ld	[%o1],%o1
1763	fabss	%f0,%f0
1764	fnegs	%f0,%f1
1765	sra	%o1,0,%o1
1766	fmovrslz %o1,%f1,%f0
1767	.end
1768
1769	.inline	__f95_sign,2
1770	ld	[%o0],%f0
1771	ld	[%o0+4],%f1
1772	ld	[%o1],%o1
1773	fabsd	%f0,%f0
1774	fnegd	%f0,%f2
1775	sra	%o1,0,%o1
1776	fmovrdlz %o1,%f2,%f0
1777	.end
1778
1779	.inline	__r_sign,2
1780	ld	[%o0],%f0
1781	ld	[%o1],%o1
1782	fabss	%f0,%f0
1783	fnegs	%f0,%f1
1784	sub	%o1,1,%o0
1785	and	%o1,%o0,%o1
1786	sra	%o1,0,%o1
1787	fmovrslz %o1,%f1,%f0
1788	.end
1789
1790	.inline	__d_sign,2
1791	ld	[%o0],%f0
1792	ld	[%o0+4],%f1
1793	ld	[%o1],%o0
1794	sllx	%o0,32,%o0
1795	ld	[%o1+4],%o1
1796	or	%o1,%o0,%o1
1797	fabsd	%f0,%f0
1798	fnegd	%f0,%f2
1799	sub	%o1,1,%o0
1800	and	%o1,%o0,%o1
1801	fmovrdlz %o1,%f2,%f0
1802	.end
1803
1804	.inline	__Fz_mult,3
1805	ld	[%o1],%f0
1806	ld	[%o1+0x4],%f1
1807	ld	[%o2],%f4
1808	ld	[%o2+0x4],%f5
1809	fmuld	%f0,%f4,%f8	! f8 = r1*r2
1810	ld	[%o1+0x8],%f2
1811	ld	[%o1+0xc],%f3
1812	ld	[%o2+0x8],%f6
1813	ld	[%o2+0xc],%f7
1814	fmuld	%f2,%f6,%f10	! f10= i1*i2
1815	fsubd	%f8,%f10,%f12	! f12= r1*r2-i1*i2
1816	st	%f12,[%o0]
1817	st	%f13,[%o0+4]
1818	fmuld	%f0,%f6,%f14	! f14= r1*i2
1819	fmuld	%f2,%f4,%f16	! f16= r2*i1
1820	faddd	%f14,%f16,%f2	! f2 = r1*i2+r2*i1
1821	st	%f2,[%o0+8]
1822	st	%f3,[%o0+12]
1823	.end
1824!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1825! void
1826! __Fc_minus(c, a, b)
1827! complex *c, *a, *b;
1828! {
1829
1830	.inline	__Fc_minus,3
1831!    30	 	c->real = a->real - b->real
1832	ld	[%o1],%f0
1833	ld	[%o2],%f1
1834	fsubs	%f0,%f1,%f2
1835!    31	  	c->imag = a->imag - b->imag
1836	ld	[%o1+4],%f3
1837	ld	[%o2+4],%f4
1838	fsubs	%f3,%f4,%f5
1839	st	%f2,[%o0]
1840	st	%f5,[%o0+4]
1841	.end
1842 }
1843!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1844! void
1845! __Fc_add(c, a, b)
1846! complex *c, *a, *b;
1847! {
1848
1849	.inline	__Fc_add,3
1850!    39	 	c->real = a->real + b->real
1851	ld	[%o1],%f0
1852	ld	[%o2],%f1
1853	fadds	%f0,%f1,%f2
1854!    40	 	c->imag = a->imag + b->imag
1855	ld	[%o1+4],%f3
1856	ld	[%o2+4],%f4
1857	fadds	%f3,%f4,%f5
1858	st	%f2,[%o0]
1859	st	%f5,[%o0+4]
1860	.end
1861! }
1862!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1863! void
1864! __Fc_neg(c, a)
1865! complex *c, *a;
1866! {
1867
1868	.inline	__Fc_neg,2
1869!    48	  	c->real = - a->real
1870	ld	[%o1],%f0
1871	fnegs	%f0,%f1
1872!    49	  	c->imag = - a->imag
1873	ld	[%o1+4],%f2
1874	fnegs	%f2,%f3
1875	st	%f1,[%o0]
1876	st	%f3,[%o0+4]
1877	.end
1878! }
1879!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1880! void
1881! __Ff_conv_c(c, x)
1882! complex *c;
1883! FLOATPARAMETER x;
1884! {
1885
1886	.inline	__Ff_conv_c,2
1887!    59		c->real = x
1888	st	%o1,[%o0]
1889!    60		c->imag = 0.0
1890	st	%g0,[%o0+4]
1891	.end
1892! }
1893!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1894! FLOATFUNCTIONTYPE
1895! __Fc_conv_f(c)
1896! complex *c;
1897! {
1898
1899	.inline	__Fc_conv_f,1
1900!    69  	RETURNFLOAT(c->real)
1901	ld	[%o0],%f0
1902	.end
1903! }
1904!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1905! int
1906! __Fc_conv_i(c)
1907! complex *c;
1908! {
1909
1910	.inline	__Fc_conv_i,1
1911!    78		return (int)c->real
1912	ld	[%o0],%f0
1913	fstoi	%f0,%f1
1914	st	%f1,[%sp+68]
1915	ld	[%sp+68],%o0
1916	.end
1917! }
1918!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1919! void
1920! __Fi_conv_c(c, i)
1921! complex *c;
1922! int i;
1923! {
1924
1925	.inline	__Fi_conv_c,2
1926!    88		c->real = (float)i
1927	st	%o1,[%sp+68]
1928	ld	[%sp+68],%f0
1929	fitos	%f0,%f1
1930	st	%f1,[%o0]
1931!    89		c->imag = 0.0
1932	st	%g0,[%o0+4]
1933	.end
1934! }
1935!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1936! double
1937! __Fc_conv_d(c)
1938! complex *c;
1939! {
1940
1941	.inline	__Fc_conv_d,1
1942!    98		return (double)c->real
1943	ld	[%o0],%f2
1944	fstod	%f2,%f0
1945	.end
1946! }
1947!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1948! void
1949! __Fd_conv_c(c, x)
1950! complex *c;
1951! double x;
1952! {
1953
1954	.inline	__Fd_conv_c,2
1955	st	%o1,[%sp+72]
1956	st	%o2,[%sp+76]
1957!   109		c->real = (float)(x)
1958	ldd	[%sp+72],%f0
1959	fdtos	%f0,%f1
1960	st	%f1,[%o0]
1961!   110		c->imag = 0.0
1962	st	%g0,[%o0+4]
1963	.end
1964! }
1965!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1966! void
1967! __Fc_conv_z(result, c)
1968! dcomplex *result;
1969! complex *c;
1970! {
1971
1972	.inline	__Fc_conv_z,2
1973!   120		result->dreal = (double)c->real
1974	ld	[%o1],%f0
1975	fstod	%f0,%f2
1976	st	%f2,[%o0]
1977	st	%f3,[%o0+4]
1978!   121		result->dimag = (double)c->imag
1979	ld	[%o1+4],%f3
1980	fstod	%f3,%f4
1981	st	%f4,[%o0+8]
1982	st	%f5,[%o0+12]
1983	.end
1984! }
1985!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1986! int
1987! __Fc_eq(x, y)
1988! complex *x, *y;
1989! {
1990
1991	.inline	__Fc_eq,2
1992!	return  (x->real == y->real) && (x->imag == y->imag);
1993	ld	[%o0],%f0
1994	ld	[%o1],%f2
1995	mov	%o0,%o2
1996	fcmps	%f0,%f2
1997	mov	0,%o0
1998	fbne	1f
1999	nop
2000	ld	[%o2+4],%f0
2001	ld	[%o1+4],%f2
2002	fcmps	%f0,%f2
2003	nop
2004	fbne	1f
2005	nop
2006	mov	1,%o0
20071:
2008	.end
2009! }
2010!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2011! int
2012! __Fc_ne(x, y)
2013! complex *x, *y;
2014! {
2015
2016	.inline	__Fc_ne,2
2017!	return  (x->real != y->real) || (x->imag != y->imag);
2018	ld	[%o0],%f0
2019	ld	[%o1],%f2
2020	mov	%o0,%o2
2021	fcmps	%f0,%f2
2022	mov	1,%o0
2023	fbne	1f
2024	nop
2025	ld	[%o2+4],%f0
2026	ld	[%o1+4],%f2
2027	fcmps	%f0,%f2
2028	nop
2029	fbne	1f
2030	nop
2031	mov	0,%o0
20321:
2033	.end
2034! }
2035