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 }