Annotation of src/lib/libc/quad/floatunditf_ieee754.c, Revision 1.4
1.4 ! matt 1: /* $NetBSD: floatunditf_ieee754.c,v 1.3 2012/03/25 19:53:18 christos Exp $ */
1.1 matt 2:
3: /*-
4: * Copyright (c) 1992, 1993
5: * The Regents of the University of California. All rights reserved.
6: *
7: * This software was developed by the Computer Systems Engineering group
8: * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
9: * contributed to Berkeley.
10: *
11: * Redistribution and use in source and binary forms, with or without
12: * modification, are permitted provided that the following conditions
13: * are met:
14: * 1. Redistributions of source code must retain the above copyright
15: * notice, this list of conditions and the following disclaimer.
16: * 2. Redistributions in binary form must reproduce the above copyright
17: * notice, this list of conditions and the following disclaimer in the
18: * documentation and/or other materials provided with the distribution.
19: * 3. Neither the name of the University nor the names of its contributors
20: * may be used to endorse or promote products derived from this software
21: * without specific prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33: * SUCH DAMAGE.
34: */
35:
36: #include <sys/cdefs.h>
37: #if defined(LIBC_SCCS) && !defined(lint)
38: #if 0
39: static char sccsid[] = "@(#)floatunsdidf.c 8.1 (Berkeley) 6/4/93";
40: #else
1.4 ! matt 41: __RCSID("$NetBSD: floatunditf_ieee754.c,v 1.3 2012/03/25 19:53:18 christos Exp $");
1.1 matt 42: #endif
43: #endif /* LIBC_SCCS and not lint */
44:
1.4 ! matt 45: #ifdef SOFTFLOAT
! 46: #include "softfloat/softfloat-for-gcc.h"
! 47: #endif
! 48:
1.1 matt 49: #include "quad.h"
50: #ifdef __vax__
51: #error vax does not support a distinct long double
52: #endif
53: #include <machine/ieee.h>
54:
55: /*
56: * Convert (unsigned) quad to long double.
57: * This is exactly like floatdidf.c except that negatives never occur.
58: */
59: long double
60: __floatunditf(u_quad_t x)
61: {
62: #if 0
63: long double ld;
64: union uu u;
65:
66: u.uq = x;
67: ld = (long double)u.ul[H] * (((int)1 << (INT_BITS - 2)) * 4.0);
68: ld += u.ul[L];
69: return (ld);
70: #else
71: union ieee_ext_u extu;
1.2 matt 72: quad_t tmp = x; /* must be signed */
1.3 christos 73: unsigned int width = 64;
74: unsigned int bit = 0;
1.2 matt 75: quad_t mask = ~(quad_t)0;
1.1 matt 76:
77: if (x == 0)
78: return 0.0L;
79: if (x == 1)
80: return 1.0L;
81:
82: while (mask != 0 && (tmp >= 0)) {
83: width >>= 1;
84: mask <<= width;
85: if ((tmp & mask) == 0) {
86: tmp <<= width;
87: bit += width;
88: }
89: }
90:
91: x <<= (bit + 1);
92: extu.extu_sign = 0;
93: extu.extu_exp = EXT_EXP_BIAS + (64 - (bit + 1));
1.3 christos 94: extu.extu_frach = (unsigned int)(x >> (64 - EXT_FRACHBITS));
1.1 matt 95: x <<= EXT_FRACHBITS;
96: #ifdef EXT_FRACHMBITS
1.3 christos 97: extu.extu_frachm =(unsigned int)(x >> (64 - EXT_FRACHMBITS));
1.1 matt 98: x <<= EXT_FRACHMBITS;
99: #endif
100: #ifdef EXT_FRACLMBITS
1.3 christos 101: extu.extu_fraclm =(unsigned int)(x >> (64 - EXT_FRACLMBITS));
1.1 matt 102: x <<= EXT_FRACLMBITS;
103: #endif
1.3 christos 104: extu.extu_fracl =(unsigned int)(x >> (64 - EXT_FRACLBITS));
1.1 matt 105:
106: return extu.extu_ld;
107: #endif
108: }
CVSweb <webmaster@jp.NetBSD.org>