isinf.c - vx32 - Local 9vx git repository for patches.
(HTM) git clone git://r-36.net/vx32
(DIR) Log
(DIR) Files
(DIR) Refs
---
isinf.c (2982B)
---
1 /*-
2 * Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
3 * Copyright (c) 2002 David Schultz <dschultz@uclink.Berkeley.EDU>
4 * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $FreeBSD: src/lib/libc/gen/isinf.c,v 1.2 2004/07/10 15:52:26 marcel Exp $
29 */
30
31 #include <math.h>
32
33 union IEEEf2bits {
34 float f;
35 struct {
36 unsigned int man :23;
37 unsigned int exp :8;
38 unsigned int sign :1;
39 } bits;
40 };
41
42 #define DBL_MANH_SIZE 20
43 #define DBL_MANL_SIZE 32
44
45 union IEEEd2bits {
46 double d;
47 struct {
48 unsigned int manl :32;
49 unsigned int manh :20;
50 unsigned int exp :11;
51 unsigned int sign :1;
52 } bits;
53 };
54
55 union IEEEl2bits {
56 long double e;
57 struct {
58 unsigned int manl :32;
59 unsigned int manh :32;
60 unsigned int exp :15;
61 unsigned int sign :1;
62 unsigned int junk :16;
63 } bits;
64 };
65
66 #define mask_nbit_l(u) ((u).bits.manh &= 0x7fffffff)
67
68 #define LDBL_MANH_SIZE 32
69 #define LDBL_MANL_SIZE 32
70
71 #define LDBL_TO_ARRAY32(u, a) do { \
72 (a)[0] = (uint32_t)(u).bits.manl; \
73 (a)[1] = (uint32_t)(u).bits.manh; \
74 } while(0)
75
76 /*
77 * XXX These routines belong in libm, but they must remain in libc for
78 * binary compat until we can bump libm's major version number.
79 */
80
81 #undef isinf
82 int
83 isinf(double d)
84 {
85 union IEEEd2bits u;
86
87 u.d = d;
88 return (u.bits.exp == 2047 && u.bits.manl == 0 && u.bits.manh == 0);
89 }
90
91 int
92 __isinff(float f)
93 {
94 union IEEEf2bits u;
95
96 u.f = f;
97 return (u.bits.exp == 255 && u.bits.man == 0);
98 }
99
100 int
101 __isinfl(long double e)
102 {
103 union IEEEl2bits u;
104
105 u.e = e;
106 mask_nbit_l(u);
107 #ifndef __alpha__
108 return (u.bits.exp == 32767 && u.bits.manl == 0 && u.bits.manh == 0);
109 #else
110 return (u.bits.exp == 2047 && u.bits.manl == 0 && u.bits.manh == 0);
111 #endif
112 }