1/*
2 * Copyright (c) 1992, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * This software was developed by the Computer Systems Engineering group
6 * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
7 * contributed to Berkeley.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 4. Neither the name of the University nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * from: Header: fixunsdfsi.s,v 1.3 91/10/08 00:03:15 torek Exp
34 */
35
36#include <machine/asm.h>
37
38#if defined(LIBC_SCCS) && !defined(lint)
39	.asciz "@(#)fixunsdfsi.s	8.1 (Berkeley) 6/4/93"
40#if 0
41	RCSID("$NetBSD: fixunsdfsi.S,v 1.3 2000/07/25 04:26:12 mycroft Exp $")
42#endif
43#endif /* LIBC_SCCS and not lint */
44__FBSDID("$FreeBSD$");
45
46/*
47 * Convert double to unsigned integer (for gcc).
48 *
49 * I have made the output for NaN agree with the Sun compiler, not
50 * that it really matters, by using `fbul,a'.
51 */
52
53
54	.align	8
55.Lbig:
56	.word	0x43e00000		! .double 2^63
57	.word	0			! (who me, not trust the assembler?)
58
59/*
60 * Same as above but to unsigned long
61 */
62ENTRY(__dtoul)
63	PIC_PROLOGUE(%o4, %o5)
64	sub	%sp, 16, %sp
65	std	%f2, [%sp + CCFSZ + SPOFF + 8]
66	SET(.Lbig, %o5, %o3)
67	ldd	[%o3], %f2
68	fcmped	%f0, %f2		! d < 2^63, or NaN, or -Inf?
69	fbul,a	1f			! if so, use fdtox to convert to long
70	 fdtox	%f0, %f0		!        (this includes negatives!)
71
72	! d does not fit in a long, so subtract 2^63, convert,
73	! and add 2^63 again (sigh).  Just hope the intermediate
74	! fits (if not, the result is undefined anyway).
75
76	fsubd	%f0, %f2, %f0		! d -= 2^63
77	fdtox	%f0, %f0		! convert to long
78	std	%f0, [%sp + CCFSZ + SPOFF]	! move into return reg
79	ldx	[%sp + CCFSZ + SPOFF], %o0
80	sethi	%hi(0x80000000), %o1
81	sllx	%o1, 32, %o1
82	add	%o0, %o1, %o0		! add 2^63
83	ldd	[%sp + CCFSZ + SPOFF + 8], %f2
84	retl
85	 add	%sp, 16, %sp
86
871:
88	std	%f0, [%sp + CCFSZ + SPOFF]	! return result
89	ldx	[%sp + CCFSZ + SPOFF], %o0
90	ldd	[%sp + CCFSZ + SPOFF + 8], %f2
91	retl
92	 add	%sp, 16, %sp
93END(__dtoul)
94