~ubuntu-branches/ubuntu/vivid/emscripten/vivid

« back to all changes in this revision

Viewing changes to system/include/libc/ieeefp.h

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2013-05-02 13:11:51 UTC
  • Revision ID: package-import@ubuntu.com-20130502131151-q8dvteqr1ef2x7xz
Tags: upstream-1.4.1~20130504~adb56cb
ImportĀ upstreamĀ versionĀ 1.4.1~20130504~adb56cb

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef _IEEE_FP_H_
 
2
#define _IEEE_FP_H_
 
3
 
 
4
#include "_ansi.h"
 
5
 
 
6
#include <machine/ieeefp.h>
 
7
 
 
8
_BEGIN_STD_C
 
9
 
 
10
/* FIXME FIXME FIXME:
 
11
   Neither of __ieee_{float,double}_shape_tape seem to be used anywhere
 
12
   except in libm/test.  If that is the case, please delete these from here.
 
13
   If that is not the case, please insert documentation here describing why
 
14
   they're needed.  */
 
15
 
 
16
#ifdef __IEEE_BIG_ENDIAN
 
17
 
 
18
typedef union 
 
19
{
 
20
  double value;
 
21
  struct 
 
22
  {
 
23
    unsigned int sign : 1;
 
24
    unsigned int exponent: 11;
 
25
    unsigned int fraction0:4;
 
26
    unsigned int fraction1:16;
 
27
    unsigned int fraction2:16;
 
28
    unsigned int fraction3:16;
 
29
    
 
30
  } number;
 
31
  struct 
 
32
  {
 
33
    unsigned int sign : 1;
 
34
    unsigned int exponent: 11;
 
35
    unsigned int quiet:1;
 
36
    unsigned int function0:3;
 
37
    unsigned int function1:16;
 
38
    unsigned int function2:16;
 
39
    unsigned int function3:16;
 
40
  } nan;
 
41
  struct 
 
42
  {
 
43
    unsigned long msw;
 
44
    unsigned long lsw;
 
45
  } parts;
 
46
    long aslong[2];
 
47
} __ieee_double_shape_type;
 
48
 
 
49
#endif
 
50
 
 
51
#ifdef __IEEE_LITTLE_ENDIAN
 
52
 
 
53
typedef union 
 
54
{
 
55
  double value;
 
56
  struct 
 
57
  {
 
58
#ifdef __SMALL_BITFIELDS
 
59
    unsigned int fraction3:16;
 
60
    unsigned int fraction2:16;
 
61
    unsigned int fraction1:16;
 
62
    unsigned int fraction0: 4;
 
63
#else
 
64
    unsigned int fraction1:32;
 
65
    unsigned int fraction0:20;
 
66
#endif
 
67
    unsigned int exponent :11;
 
68
    unsigned int sign     : 1;
 
69
  } number;
 
70
  struct 
 
71
  {
 
72
#ifdef __SMALL_BITFIELDS
 
73
    unsigned int function3:16;
 
74
    unsigned int function2:16;
 
75
    unsigned int function1:16;
 
76
    unsigned int function0:3;
 
77
#else
 
78
    unsigned int function1:32;
 
79
    unsigned int function0:19;
 
80
#endif
 
81
    unsigned int quiet:1;
 
82
    unsigned int exponent: 11;
 
83
    unsigned int sign : 1;
 
84
  } nan;
 
85
  struct 
 
86
  {
 
87
    unsigned long lsw;
 
88
    unsigned long msw;
 
89
  } parts;
 
90
 
 
91
  long aslong[2];
 
92
 
 
93
} __ieee_double_shape_type;
 
94
 
 
95
#endif
 
96
 
 
97
#ifdef __IEEE_BIG_ENDIAN
 
98
 
 
99
typedef union
 
100
{
 
101
  float value;
 
102
  struct 
 
103
  {
 
104
    unsigned int sign : 1;
 
105
    unsigned int exponent: 8;
 
106
    unsigned int fraction0: 7;
 
107
    unsigned int fraction1: 16;
 
108
  } number;
 
109
  struct 
 
110
  {
 
111
    unsigned int sign:1;
 
112
    unsigned int exponent:8;
 
113
    unsigned int quiet:1;
 
114
    unsigned int function0:6;
 
115
    unsigned int function1:16;
 
116
  } nan;
 
117
  long p1;
 
118
  
 
119
} __ieee_float_shape_type;
 
120
 
 
121
#endif
 
122
 
 
123
#ifdef __IEEE_LITTLE_ENDIAN
 
124
 
 
125
typedef union
 
126
{
 
127
  float value;
 
128
  struct 
 
129
  {
 
130
    unsigned int fraction0: 7;
 
131
    unsigned int fraction1: 16;
 
132
    unsigned int exponent: 8;
 
133
    unsigned int sign : 1;
 
134
  } number;
 
135
  struct 
 
136
  {
 
137
    unsigned int function1:16;
 
138
    unsigned int function0:6;
 
139
    unsigned int quiet:1;
 
140
    unsigned int exponent:8;
 
141
    unsigned int sign:1;
 
142
  } nan;
 
143
  long p1;
 
144
  
 
145
} __ieee_float_shape_type;
 
146
 
 
147
#endif
 
148
 
 
149
 
 
150
 
 
151
 
 
152
 
 
153
/* FLOATING ROUNDING */
 
154
 
 
155
typedef int fp_rnd;
 
156
#define FP_RN 0         /* Round to nearest             */
 
157
#define FP_RM 1         /* Round down                   */
 
158
#define FP_RP 2         /* Round up                     */
 
159
#define FP_RZ 3         /* Round to zero (trunate)      */
 
160
 
 
161
fp_rnd _EXFUN(fpgetround,(void));
 
162
fp_rnd _EXFUN(fpsetround, (fp_rnd));
 
163
 
 
164
/* EXCEPTIONS */
 
165
 
 
166
typedef int fp_except;
 
167
#define FP_X_INV 0x10   /* Invalid operation            */
 
168
#define FP_X_DX  0x80   /* Divide by zero               */
 
169
#define FP_X_OFL 0x04   /* Overflow exception           */
 
170
#define FP_X_UFL 0x02   /* Underflow exception          */
 
171
#define FP_X_IMP 0x01   /* imprecise exception          */
 
172
 
 
173
fp_except _EXFUN(fpgetmask,(void));
 
174
fp_except _EXFUN(fpsetmask,(fp_except));
 
175
fp_except _EXFUN(fpgetsticky,(void));
 
176
fp_except _EXFUN(fpsetsticky, (fp_except));
 
177
 
 
178
/* INTEGER ROUNDING */
 
179
 
 
180
typedef int fp_rdi;
 
181
#define FP_RDI_TOZ 0    /* Round to Zero                */
 
182
#define FP_RDI_RD  1    /* Follow float mode            */
 
183
 
 
184
fp_rdi _EXFUN(fpgetroundtoi,(void));
 
185
fp_rdi _EXFUN(fpsetroundtoi,(fp_rdi));
 
186
 
 
187
#undef isnan
 
188
#undef isinf
 
189
 
 
190
int _EXFUN(isnan, (double));
 
191
int _EXFUN(isinf, (double));
 
192
int _EXFUN(finite, (double));
 
193
 
 
194
 
 
195
 
 
196
int _EXFUN(isnanf, (float));
 
197
int _EXFUN(isinff, (float));
 
198
int _EXFUN(finitef, (float));
 
199
 
 
200
#define __IEEE_DBL_EXPBIAS 1023
 
201
#define __IEEE_FLT_EXPBIAS 127
 
202
 
 
203
#define __IEEE_DBL_EXPLEN 11
 
204
#define __IEEE_FLT_EXPLEN 8
 
205
 
 
206
 
 
207
#define __IEEE_DBL_FRACLEN (64 - (__IEEE_DBL_EXPLEN + 1))
 
208
#define __IEEE_FLT_FRACLEN (32 - (__IEEE_FLT_EXPLEN + 1))
 
209
 
 
210
#define __IEEE_DBL_MAXPOWTWO    ((double)(1L << 32 - 2) * (1L << (32-11) - 32 + 1))
 
211
#define __IEEE_FLT_MAXPOWTWO    ((float)(1L << (32-8) - 1))
 
212
 
 
213
#define __IEEE_DBL_NAN_EXP 0x7ff
 
214
#define __IEEE_FLT_NAN_EXP 0xff
 
215
 
 
216
#ifndef __ieeefp_isnanf
 
217
#define __ieeefp_isnanf(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \
 
218
                            ((*(long *)&(x) & 0x007fffffL)!=0000000000L))
 
219
#endif
 
220
#define isnanf(x)       __ieeefp_isnanf(x)
 
221
 
 
222
#ifndef __ieeefp_isinff
 
223
#define __ieeefp_isinff(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \
 
224
                            ((*(long *)&(x) & 0x007fffffL)==0000000000L))
 
225
#endif
 
226
#define isinff(x)       __ieeefp_isinff(x)
 
227
 
 
228
#ifndef __ieeefp_finitef
 
229
#define __ieeefp_finitef(x) (((*(long *)&(x) & 0x7f800000L)!=0x7f800000L))
 
230
#endif
 
231
#define finitef(x)      __ieeefp_finitef(x)
 
232
 
 
233
#ifdef _DOUBLE_IS_32BITS
 
234
#undef __IEEE_DBL_EXPBIAS
 
235
#define __IEEE_DBL_EXPBIAS __IEEE_FLT_EXPBIAS
 
236
 
 
237
#undef __IEEE_DBL_EXPLEN
 
238
#define __IEEE_DBL_EXPLEN __IEEE_FLT_EXPLEN
 
239
 
 
240
#undef __IEEE_DBL_FRACLEN
 
241
#define __IEEE_DBL_FRACLEN __IEEE_FLT_FRACLEN
 
242
 
 
243
#undef __IEEE_DBL_MAXPOWTWO
 
244
#define __IEEE_DBL_MAXPOWTWO __IEEE_FLT_MAXPOWTWO
 
245
 
 
246
#undef __IEEE_DBL_NAN_EXP
 
247
#define __IEEE_DBL_NAN_EXP __IEEE_FLT_NAN_EXP
 
248
 
 
249
#undef __ieee_double_shape_type
 
250
#define __ieee_double_shape_type __ieee_float_shape_type
 
251
 
 
252
#endif /* _DOUBLE_IS_32BITS */
 
253
 
 
254
_END_STD_C
 
255
 
 
256
#endif /* _IEEE_FP_H_ */