Module Name:    src
Committed By:   matt
Date:           Sat Jul  9 02:30:27 UTC 2011

Modified Files:
        src/lib/libc/arch/mips: Makefile.inc
Added Files:
        src/lib/libc/gen: fixunsdfsi_ieee754.c fixunsgen64_ieee754.c
            fixunsgen_ieee754.c fixunssfsi_ieee754.c fixunstfdi_ieee754.c
            fixunstfsi_ieee754.c
        src/lib/libc/quad: floatunditf_ieee754.c

Log Message:
Add ieee754 versions of the compiler runtime functions
        __fixuns{sf,df,tf}{si,di}.
Add an ieee754 version of the compiler runtime function __floatuntfdi


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/lib/libc/arch/mips/Makefile.inc
cvs rdiff -u -r0 -r1.1 src/lib/libc/gen/fixunsdfsi_ieee754.c \
    src/lib/libc/gen/fixunsgen64_ieee754.c \
    src/lib/libc/gen/fixunsgen_ieee754.c \
    src/lib/libc/gen/fixunssfsi_ieee754.c \
    src/lib/libc/gen/fixunstfdi_ieee754.c \
    src/lib/libc/gen/fixunstfsi_ieee754.c
cvs rdiff -u -r0 -r1.1 src/lib/libc/quad/floatunditf_ieee754.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/arch/mips/Makefile.inc
diff -u src/lib/libc/arch/mips/Makefile.inc:1.10 src/lib/libc/arch/mips/Makefile.inc:1.11
--- src/lib/libc/arch/mips/Makefile.inc:1.10	Wed Jan 26 01:18:48 2011
+++ src/lib/libc/arch/mips/Makefile.inc	Sat Jul  9 02:30:27 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.inc,v 1.10 2011/01/26 01:18:48 pooka Exp $
+#	$NetBSD: Makefile.inc,v 1.11 2011/07/09 02:30:27 matt Exp $
 
 .include <bsd.own.mk>
 
@@ -9,6 +9,15 @@
 
 .if ${MKSOFTFLOAT} != "no"
 .include <softfloat/Makefile.inc>
-CPPFLAGS+= -DSOFTFLOAT_NEED_FIXUNS
 CPPFLAGS+= -DSOFTFLOAT
+
+SRCS+=	fixunsgen_ieee754.c fixunssfsi_ieee754.c fixunsdfsi_ieee754.c
+SRCS+=	fixunsgen64_ieee754.c #fixunssfdi.c fixunsdfdi.c
+.if ${MACHINE_ARCH} == "mips64eb" || ${MACHINE_ARCH} == "mips64el"
+SRCS+=	fixunstfsi_ieee754.c fixunstfdi_ieee754.c
+.endif
+.endif
+
+.if ${MACHINE_ARCH} == "mips64eb" || ${MACHINE_ARCH} == "mips64el"
+SRCS+=	floatunditf_ieee754.c
 .endif

Added files:

Index: src/lib/libc/gen/fixunsdfsi_ieee754.c
diff -u /dev/null src/lib/libc/gen/fixunsdfsi_ieee754.c:1.1
--- /dev/null	Sat Jul  9 02:30:28 2011
+++ src/lib/libc/gen/fixunsdfsi_ieee754.c	Sat Jul  9 02:30:27 2011
@@ -0,0 +1,65 @@
+/*	$NetBSD: fixunsdfsi_ieee754.c,v 1.1 2011/07/09 02:30:27 matt Exp $	*/
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Matt Thomas of 3am Software Foundry.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+
+#if defined(LIBC_SCCS) && !defined(lint)
+__RCSID("$NetBSD: fixunsdfsi_ieee754.c,v 1.1 2011/07/09 02:30:27 matt Exp $");
+#endif /* LIBC_SCCS and not lint */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <float.h>
+#include <machine/ieee.h>
+
+uint32_t __fixunsgen32(int, bool, size_t, size_t, const uint32_t *);
+
+uint32_t __fixunsdfsi(double);
+
+/*
+ * Convert double to (unsigned) int.  All operations are done module 2^32.
+ */
+uint32_t
+__fixunsdfsi(double x)
+{
+	const union ieee_double_u dblu = { .dblu_d = x };
+	const uint32_t frac[(DBL_FRACBITS + 31)/32 + 1] = {
+		[0] = 0,
+		[1] = dblu.dblu_dbl.dbl_fracl,
+		[2] = dblu.dblu_dbl.dbl_frach,
+	};
+
+	return __fixunsgen32(
+		dblu.dblu_dbl.dbl_exp - DBL_EXP_BIAS,
+		dblu.dblu_dbl.dbl_sign != 0,
+		DBL_MANT_DIG,
+		DBL_FRACHBITS,
+		&frac[__arraycount(frac)-1]);
+}
Index: src/lib/libc/gen/fixunsgen64_ieee754.c
diff -u /dev/null src/lib/libc/gen/fixunsgen64_ieee754.c:1.1
--- /dev/null	Sat Jul  9 02:30:28 2011
+++ src/lib/libc/gen/fixunsgen64_ieee754.c	Sat Jul  9 02:30:27 2011
@@ -0,0 +1,45 @@
+/*	$NetBSD: fixunsgen64_ieee754.c,v 1.1 2011/07/09 02:30:27 matt Exp $	*/
+
+/*-
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+
+#if defined(LIBC_SCCS) && !defined(lint)
+__RCSID("$NetBSD: fixunsgen64_ieee754.c,v 1.1 2011/07/09 02:30:27 matt Exp $");
+#endif /* LIBC_SCCS and not lint */
+
+#define	FIXUNSNAME(n)	n##64
+#define	UINTXX_T	uint64_t
+
+#include "fixunsgen_ieee754.c"
Index: src/lib/libc/gen/fixunsgen_ieee754.c
diff -u /dev/null src/lib/libc/gen/fixunsgen_ieee754.c:1.1
--- /dev/null	Sat Jul  9 02:30:28 2011
+++ src/lib/libc/gen/fixunsgen_ieee754.c	Sat Jul  9 02:30:27 2011
@@ -0,0 +1,110 @@
+/*	$NetBSD: fixunsgen_ieee754.c,v 1.1 2011/07/09 02:30:27 matt Exp $	*/
+
+/*-
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+
+#if !defined(FIXUNSNAME) && defined(LIBC_SCCS) && !defined(lint)
+__RCSID("$NetBSD: fixunsgen_ieee754.c,v 1.1 2011/07/09 02:30:27 matt Exp $");
+#endif /* LIBC_SCCS and not lint */
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <float.h>
+
+#ifndef FIXUNSNAME
+#define	FIXUNSNAME(n)	n##32
+#define	UINTXX_T	uint32_t
+#endif
+
+__dso_hidden UINTXX_T
+	FIXUNSNAME(__fixunsgen)(int, bool, size_t, size_t, const uint32_t *);
+
+/*
+ * Convert double to (unsigned) int.  All operations are done module 2^32.
+ */
+UINTXX_T
+FIXUNSNAME(__fixunsgen)(int exp, bool sign, size_t mant_dig, size_t fracbits,
+	const uint32_t *frac)
+{
+	UINTXX_T tmp;
+
+	/*
+	 * If it's less than 1 (negative exponent), it's going to round
+	 * to zero.  If the exponent is so large that it is a multiple of
+	 * 2^N, then x module 2^N will be 0.
+	 */
+	if (__predict_false(exp < 0 || exp - mant_dig > sizeof(UINTXX_T)*8-1))
+		return 0;
+
+	/*
+	 * This is simplier than it seems.  Basically we are constructing
+	 * fixed binary representation of the floating point number tossing
+	 * away bits that wont be in the modulis we return.
+	 */
+	tmp = 1;
+	for (size_t ebits = exp;;) {
+		if (ebits <= fracbits) {
+			/*
+			 * The current fraction has more bits than we need.
+			 * Shift the current value over and insert the bits
+			 * we want.  We're done.
+			 */
+			tmp <<= ebits;
+			tmp |= *frac >> (fracbits - ebits);
+			break;
+		}
+		if (fracbits == sizeof(tmp)*4) {
+			/*
+			 * Shifts must be < sizeof(type).  If it's going to be
+			 * sizeof(type), just replace the value.
+			 */
+			tmp = *frac--;
+		} else {
+			tmp <<= fracbits;
+			tmp |= *frac--;
+		}
+		ebits -= fracbits;
+		fracbits = sizeof(frac[0]) * 4;
+	}
+
+	/*
+	 * If the input was negative, make tmp negative module 2^32.
+	 */
+	if (sign)
+		tmp = -tmp;
+
+	return tmp;
+}
Index: src/lib/libc/gen/fixunssfsi_ieee754.c
diff -u /dev/null src/lib/libc/gen/fixunssfsi_ieee754.c:1.1
--- /dev/null	Sat Jul  9 02:30:28 2011
+++ src/lib/libc/gen/fixunssfsi_ieee754.c	Sat Jul  9 02:30:27 2011
@@ -0,0 +1,64 @@
+/*	$NetBSD: fixunssfsi_ieee754.c,v 1.1 2011/07/09 02:30:27 matt Exp $	*/
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Matt Thomas of 3am Software Foundry.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+
+#if defined(LIBC_SCCS) && !defined(lint)
+__RCSID("$NetBSD: fixunssfsi_ieee754.c,v 1.1 2011/07/09 02:30:27 matt Exp $");
+#endif /* LIBC_SCCS and not lint */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <float.h>
+#include <machine/ieee.h>
+
+uint32_t __fixunsgen32(int, bool, size_t, size_t, const uint32_t *);
+
+uint32_t __fixunssfsi(float);
+
+/*
+ * Convert float to (unsigned) int.  All operations are done module 2^32.
+ */
+uint32_t
+__fixunssfsi(float x)
+{
+	const union ieee_single_u sngu = { .sngu_f = x };
+	const uint32_t frac[(SNG_FRACBITS + 31)/32 + 1] = {
+		[0] = 0,
+		[1] = sngu.sngu_sng.sng_frac,
+	};
+
+	return __fixunsgen32(
+		sngu.sngu_sng.sng_exp - SNG_EXP_BIAS,
+		sngu.sngu_sng.sng_sign != 0,
+		FLT_MANT_DIG,
+		SNG_FRACBITS,
+		&frac[__arraycount(frac)-1]);
+}
Index: src/lib/libc/gen/fixunstfdi_ieee754.c
diff -u /dev/null src/lib/libc/gen/fixunstfdi_ieee754.c:1.1
--- /dev/null	Sat Jul  9 02:30:28 2011
+++ src/lib/libc/gen/fixunstfdi_ieee754.c	Sat Jul  9 02:30:27 2011
@@ -0,0 +1,72 @@
+/*	$NetBSD: fixunstfdi_ieee754.c,v 1.1 2011/07/09 02:30:27 matt Exp $	*/
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Matt Thomas of 3am Software Foundry.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+
+#if defined(LIBC_SCCS) && !defined(lint)
+__RCSID("$NetBSD: fixunstfdi_ieee754.c,v 1.1 2011/07/09 02:30:27 matt Exp $");
+#endif /* LIBC_SCCS and not lint */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <float.h>
+#include <machine/ieee.h>
+
+#if defined(__x86_64__) || defined(__i486__)
+#define	FIXUNS	__fixunsxfdi
+#else
+#define	FIXUNS	__fixunstfdi
+#endif
+
+uint64_t __fixunsgen64(int, bool, size_t, size_t, const uint32_t *);
+
+uint64_t FIXUNS(long double);
+
+/*
+ * Convert long double to uint64_t.  All operations are done module 2^64.
+ */
+uint64_t
+FIXUNS(long double x)
+{
+	const union ieee_ext_u extu = { .extu_ld = x };
+	uint32_t frac[(EXT_FRACBITS + 31)/32 + 2];
+
+	frac[0] = 0;
+	frac[1] = 0;
+
+	EXT_TO_ARRAY32(extu, &frac[2]);
+
+	return __fixunsgen64(
+		extu.extu_ext.ext_exp - EXT_EXP_BIAS,
+		extu.extu_ext.ext_sign != 0,
+		LDBL_MANT_DIG,
+		EXT_FRACHBITS,
+		&frac[__arraycount(frac)-1]);
+}
Index: src/lib/libc/gen/fixunstfsi_ieee754.c
diff -u /dev/null src/lib/libc/gen/fixunstfsi_ieee754.c:1.1
--- /dev/null	Sat Jul  9 02:30:28 2011
+++ src/lib/libc/gen/fixunstfsi_ieee754.c	Sat Jul  9 02:30:27 2011
@@ -0,0 +1,71 @@
+/*	$NetBSD: fixunstfsi_ieee754.c,v 1.1 2011/07/09 02:30:27 matt Exp $	*/
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Matt Thomas of 3am Software Foundry.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+
+#if defined(LIBC_SCCS) && !defined(lint)
+__RCSID("$NetBSD: fixunstfsi_ieee754.c,v 1.1 2011/07/09 02:30:27 matt Exp $");
+#endif /* LIBC_SCCS and not lint */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <float.h>
+#include <machine/ieee.h>
+
+#if defined(__x86_64__) || defined(__i486__)
+#define	FIXUNS	__fixunsxfsi
+#else
+#define	FIXUNS	__fixunstfsi
+#endif
+
+uint32_t __fixunsgen32(int, bool, size_t, size_t, const uint32_t *);
+
+uint32_t FIXUNS(long double);
+
+/*
+ * Convert long double to (unsigned) int.  All operations are done module 2^32.
+ */
+uint32_t
+FIXUNS(long double x)
+{
+	const union ieee_ext_u extu = { .extu_ld = x };
+	uint32_t frac[(EXT_FRACBITS + 31)/32 + 1];
+
+	frac[0] = 0;
+
+	EXT_TO_ARRAY32(extu, &frac[1]);
+
+	return __fixunsgen32(
+		extu.extu_ext.ext_exp - EXT_EXP_BIAS,
+		extu.extu_ext.ext_sign != 0,
+		LDBL_MANT_DIG,
+		EXT_FRACHBITS,
+		&frac[__arraycount(frac)-1]);
+}

Index: src/lib/libc/quad/floatunditf_ieee754.c
diff -u /dev/null src/lib/libc/quad/floatunditf_ieee754.c:1.1
--- /dev/null	Sat Jul  9 02:30:28 2011
+++ src/lib/libc/quad/floatunditf_ieee754.c	Sat Jul  9 02:30:27 2011
@@ -0,0 +1,104 @@
+/*	$NetBSD: floatunditf_ieee754.c,v 1.1 2011/07/09 02:30:27 matt Exp $	*/
+
+/*-
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBC_SCCS) && !defined(lint)
+#if 0
+static char sccsid[] = "@(#)floatunsdidf.c	8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: floatunditf_ieee754.c,v 1.1 2011/07/09 02:30:27 matt Exp $");
+#endif
+#endif /* LIBC_SCCS and not lint */
+
+#include "quad.h"
+#ifdef __vax__
+#error vax does not support a distinct long double
+#endif
+#include <machine/ieee.h>
+
+/*
+ * Convert (unsigned) quad to long double.
+ * This is exactly like floatdidf.c except that negatives never occur.
+ */
+long double
+__floatunditf(u_quad_t x)
+{
+#if 0
+	long double ld;
+	union uu u;
+
+	u.uq = x;
+	ld = (long double)u.ul[H] * (((int)1 << (INT_BITS - 2)) * 4.0);
+	ld += u.ul[L];
+	return (ld);
+#else
+	union ieee_ext_u extu;
+
+	if (x == 0)
+		return 0.0L;
+	if (x == 1)
+		return 1.0L;
+
+	quad_t tmp = x;		/* must be signed */
+	size_t width = 64;
+	size_t bit = 0;
+	quad_t mask = ~(quad_t)0;
+	while (mask != 0 && (tmp >= 0)) {
+		width >>= 1;
+		mask <<= width;
+		if ((tmp & mask) == 0) {
+			tmp <<= width;
+			bit += width;
+		}
+	}
+
+	x <<= (bit + 1);
+	extu.extu_sign = 0;
+	extu.extu_exp = EXT_EXP_BIAS + (64 - (bit + 1));
+	extu.extu_frach = x >> (64 - EXT_FRACHBITS);
+	x <<= EXT_FRACHBITS;
+#ifdef EXT_FRACHMBITS
+	extu.extu_frachm = x >> (64 - EXT_FRACHMBITS);
+	x <<= EXT_FRACHMBITS;
+#endif
+#ifdef EXT_FRACLMBITS
+	extu.extu_fraclm = x >> (64 - EXT_FRACLMBITS);
+	x <<= EXT_FRACLMBITS;
+#endif
+	extu.extu_fracl = x >> (64 - EXT_FRACLBITS);
+
+	return extu.extu_ld;
+#endif
+}

Reply via email to