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 +}