os/ossrv/genericopenlibs/cstdlib/LINC/IEEEFP.H
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /*
     2 * Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    11 *
    12 * Contributors:
    13 *
    14 * Description:
    15 *
    16 */
    17 
    18 
    19 
    20 /**
    21  @file
    22  @publishedAll
    23  @released
    24 */
    25 
    26 #ifndef _IEEE_FP_H_
    27 #define _IEEE_FP_H_
    28 
    29 #include "_ansi.h"
    30 
    31 #include <libc/machine/ieeefp.h>
    32 
    33 /* FIX THIS FIX THIS FIX THIS:
    34    Neither of __ieee_{float,double}_shape_tape seem to be used anywhere
    35    except in libm/test.  If that is the case, please delete these from here.
    36    If that is not the case, please insert documentation here describing why
    37    they're needed.  */
    38 
    39 #ifdef __IEEE_BIG_ENDIAN
    40 
    41 typedef union 
    42 {
    43   double value;
    44   struct 
    45   {
    46     unsigned int sign : 1;
    47     unsigned int exponent: 11;
    48     unsigned int fraction0:4;
    49     unsigned int fraction1:16;
    50     unsigned int fraction2:16;
    51     unsigned int fraction3:16;
    52     
    53   } number;
    54   struct 
    55   {
    56     unsigned int sign : 1;
    57     unsigned int exponent: 11;
    58     unsigned int quiet:1;
    59     unsigned int function0:3;
    60     unsigned int function1:16;
    61     unsigned int function2:16;
    62     unsigned int function3:16;
    63   } nan;
    64   struct 
    65   {
    66     unsigned long msw;
    67     unsigned long lsw;
    68   } parts;
    69     long aslong[2];
    70 } __ieee_double_shape_type;
    71 
    72 #endif
    73 
    74 #ifdef __IEEE_LITTLE_ENDIAN
    75 
    76 typedef union 
    77 {
    78   double value;
    79   struct 
    80   {
    81 #ifdef __SMALL_BITFIELDS
    82     unsigned int fraction3:16;
    83     unsigned int fraction2:16;
    84     unsigned int fraction1:16;
    85     unsigned int fraction0: 4;
    86 #else
    87     unsigned int fraction1:32;
    88     unsigned int fraction0:20;
    89 #endif
    90     unsigned int exponent :11;
    91     unsigned int sign     : 1;
    92   } number;
    93   struct 
    94   {
    95 #ifdef __SMALL_BITFIELDS
    96     unsigned int function3:16;
    97     unsigned int function2:16;
    98     unsigned int function1:16;
    99     unsigned int function0:3;
   100 #else
   101     unsigned int function1:32;
   102     unsigned int function0:19;
   103 #endif
   104     unsigned int quiet:1;
   105     unsigned int exponent: 11;
   106     unsigned int sign : 1;
   107   } nan;
   108   struct 
   109   {
   110     unsigned long lsw;
   111     unsigned long msw;
   112   } parts;
   113 
   114   long aslong[2];
   115 
   116 } __ieee_double_shape_type;
   117 
   118 #endif
   119 
   120 #ifdef __IEEE_BIG_ENDIAN
   121 
   122 typedef union
   123 {
   124   float value;
   125   struct 
   126   {
   127     unsigned int sign : 1;
   128     unsigned int exponent: 8;
   129     unsigned int fraction0: 7;
   130     unsigned int fraction1: 16;
   131   } number;
   132   struct 
   133   {
   134     unsigned int sign:1;
   135     unsigned int exponent:8;
   136     unsigned int quiet:1;
   137     unsigned int function0:6;
   138     unsigned int function1:16;
   139   } nan;
   140   long p1;
   141   
   142 } __ieee_float_shape_type;
   143 
   144 #endif
   145 
   146 #ifdef __IEEE_LITTLE_ENDIAN
   147 
   148 typedef union
   149 {
   150   float value;
   151   struct 
   152   {
   153     unsigned int fraction0: 7;
   154     unsigned int fraction1: 16;
   155     unsigned int exponent: 8;
   156     unsigned int sign : 1;
   157   } number;
   158   struct 
   159   {
   160     unsigned int function1:16;
   161     unsigned int function0:6;
   162     unsigned int quiet:1;
   163     unsigned int exponent:8;
   164     unsigned int sign:1;
   165   } nan;
   166   long p1;
   167   
   168 } __ieee_float_shape_type;
   169 
   170 #endif
   171 
   172 
   173 /**
   174 FLOATING ROUNDING
   175 */
   176 typedef int fp_rnd;
   177 
   178 #define FP_RN 0 	/* Round to nearest 		*/
   179 #define FP_RM 1		/* Round down 			*/
   180 #define FP_RP 2		/* Round up 			*/
   181 #define FP_RZ 3		/* Round to zero (trunate) 	*/
   182 
   183 fp_rnd fpgetround(void);
   184 fp_rnd fpsetround(fp_rnd);
   185 
   186 /**
   187 EXCEPTIONS 
   188 */
   189 typedef int fp_except;
   190 
   191 #define FP_X_INV 0x10	/* Invalid operation 		*/
   192 #define FP_X_DX  0x80	/* Divide by zero		*/
   193 #define FP_X_OFL 0x04	/* Overflow exception		*/
   194 #define FP_X_UFL 0x02	/* Underflow exception		*/
   195 #define FP_X_IMP 0x01	/* imprecise exception		*/
   196 
   197 fp_except fpgetmask(void);
   198 fp_except fpsetmask(fp_except);
   199 fp_except fpgetsticky(void);
   200 fp_except fpsetsticky(fp_except);
   201 
   202 /**
   203 INTEGER ROUNDING 
   204 */
   205 typedef int fp_rdi;
   206 #define FP_RDI_TOZ 0	/* Round to Zero 		*/
   207 #define FP_RDI_RD  1	/* Follow float mode		*/
   208 
   209 fp_rdi fpgetroundtoi(void);
   210 fp_rdi fpsetroundtoi(fp_rdi);
   211 
   212 int isnan(double);
   213 int isinf(double);
   214 int finite(double);
   215 
   216 int isnanf(float);
   217 int isinff(float);
   218 int finitef(float);
   219 
   220 #define __IEEE_DBL_EXPBIAS 1023
   221 #define __IEEE_FLT_EXPBIAS 127
   222 #define __IEEE_DBL_EXPLEN 11
   223 #define __IEEE_FLT_EXPLEN 8
   224 #define __IEEE_DBL_FRACLEN (64 - (__IEEE_DBL_EXPLEN + 1))
   225 #define __IEEE_FLT_FRACLEN (32 - (__IEEE_FLT_EXPLEN + 1))
   226 #define __IEEE_DBL_MAXPOWTWO	((double)(1L << 32 - 2) * (1L << (32-11) - 32 + 1))
   227 #define __IEEE_FLT_MAXPOWTWO	((float)(1L << (32-8) - 1))
   228 #define __IEEE_DBL_NAN_EXP 0x7ff
   229 #define __IEEE_FLT_NAN_EXP 0xff
   230 
   231 #define isnanf(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \
   232 		   ((*(long *)&(x) & 0x007fffffL)!=0000000000L))
   233 #define isinff(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \
   234 		   ((*(long *)&(x) & 0x007fffffL)==0000000000L))
   235 #define finitef(x) (((*(long *)&(x) & 0x7f800000L)!=0x7f800000L))
   236 
   237 #endif /* _IEEE_FP_H_ */