1 /*--------------------------------------------------------------------
2 *© Portions copyright (c) 2006 Nokia Corporation. All rights reserved.
3 *--------------------------------------------------------------------
6 * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG>
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * $FreeBSD: src/lib/msun/arm/fenv.h,v 1.5 2005/03/16 19:03:45 das Exp $
36 #include <sys/_types.h>
39 /*to supress warnings 'arguments not used in function'
40 This warnings crop up wherever fevn.h is included. So
41 it is desirable to supress it here. The warning arises as a
42 fact that these arguments are used within macros which get
43 get replaced at the time of pre-processing and thus the
44 compiler(s)warning 'argument/variable is not used in function*/
45 #pragma warn_unusedarg off
48 typedef __uint32_t fenv_t;
49 typedef __uint32_t fexcept_t;
52 #define FE_INVALID 0x0001
53 #define FE_DIVBYZERO 0x0002
54 #define FE_OVERFLOW 0x0004
55 #define FE_UNDERFLOW 0x0008
56 #define FE_INEXACT 0x0010
57 #define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | \
58 FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)
61 #define FE_TONEAREST 0x0000
62 #define FE_TOWARDZERO 0x0001
63 #define FE_UPWARD 0x0002
64 #define FE_DOWNWARD 0x0003
65 #define _ROUND_MASK (FE_TONEAREST | FE_DOWNWARD | \
66 FE_UPWARD | FE_TOWARDZERO)
69 /* Default floating-point environment */
70 extern const fenv_t __fe_dfl_env;
71 #define FE_DFL_ENV (&__fe_dfl_env)
73 /* We need to be able to map status flag positions to mask flag positions */
74 #define _FPUSW_SHIFT 16
75 #define _ENABLE_MASK (FE_ALL_EXCEPT << _FPUSW_SHIFT)
78 #define __rfs(__fpsr) __asm __volatile("rfs %0" : "=r" (*(__fpsr)))
79 #define __wfs(__fpsr) __asm __volatile("wfs %0" : : "r" (__fpsr))
86 feclearexcept(int __excepts)
92 #endif //__SYMBIAN32__
101 fegetexceptflag(fexcept_t *__flagp, int __excepts)
104 fexcept_t __fpsr = 0;
107 #endif //__SYMBIAN32__
110 *__flagp = __fpsr & __excepts;
115 fesetexceptflag(const fexcept_t *__flagp, int __excepts)
118 fexcept_t __fpsr = 0;
121 #endif //__SYMBIAN32__
124 __fpsr &= ~__excepts;
125 __fpsr |= *__flagp & __excepts;
131 feraiseexcept(int __excepts)
133 fexcept_t __ex = __excepts;
135 fesetexceptflag(&__ex, __excepts); /* XXX */
140 fetestexcept(int __excepts)
143 fexcept_t __fpsr = 0;
146 #endif //__SYMBIAN32__
149 return (__fpsr & __excepts);
157 * Apparently, the rounding mode is specified as part of the
158 * instruction format on ARM, so the dynamic rounding mode is
159 * indeterminate. Some FPUs may differ.
165 fesetround(int __round)
172 fegetenv(fenv_t *__envp)
180 feholdexcept(fenv_t *__envp)
186 #endif //__SYMBIAN32__
190 __env &= ~(FE_ALL_EXCEPT | _ENABLE_MASK);
196 fesetenv(const fenv_t *__envp)
204 feupdateenv(const fenv_t *__envp)
207 fexcept_t __fpsr = 0;
210 #endif //__SYMBIAN32__
214 feraiseexcept(__fpsr & FE_ALL_EXCEPT);
221 feenableexcept(int __mask)
224 fenv_t __old_fpsr = 0, __new_fpsr= 0;
226 fenv_t __old_fpsr, __new_fpsr;
227 #endif //__SYMBIAN32__
230 __new_fpsr = __old_fpsr | (__mask & FE_ALL_EXCEPT) << _FPUSW_SHIFT;
232 return ((__old_fpsr >> _FPUSW_SHIFT) & FE_ALL_EXCEPT);
236 fedisableexcept(int __mask)
240 fenv_t __old_fpsr =0, __new_fpsr =0;
242 fenv_t __old_fpsr, __new_fpsr;
243 #endif //__SYMBIAN32__
246 __new_fpsr = __old_fpsr & ~((__mask & FE_ALL_EXCEPT) << _FPUSW_SHIFT);
248 return ((__old_fpsr >> _FPUSW_SHIFT) & FE_ALL_EXCEPT);
255 fexcept_t __fpsr = 0;
258 #endif //__SYMBIAN32__
261 return ((__fpsr & _ENABLE_MASK) >> _FPUSW_SHIFT);
264 #endif /* __BSD_VISIBLE */
268 #endif /* !_FENV_H_ */