fenv.c revision 226218
1139749Simp/*- 2126177Srik * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG> 3126177Srik * All rights reserved. 4126177Srik * 5126177Srik * Redistribution and use in source and binary forms, with or without 6126177Srik * modification, are permitted provided that the following conditions 7126177Srik * are met: 8126177Srik * 1. Redistributions of source code must retain the above copyright 9126177Srik * notice, this list of conditions and the following disclaimer. 10126177Srik * 2. Redistributions in binary form must reproduce the above copyright 11126177Srik * notice, this list of conditions and the following disclaimer in the 12126177Srik * documentation and/or other materials provided with the distribution. 13126177Srik * 14126177Srik * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15126177Srik * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16126177Srik * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17126177Srik * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18126177Srik * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19126177Srik * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20126177Srik * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21126177Srik * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22126177Srik * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23126177Srik * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24126177Srik * SUCH DAMAGE. 25126177Srik * 26126177Srik * $FreeBSD: head/lib/msun/ia64/fenv.c 226218 2011-10-10 15:43:09Z das $ 27126177Srik */ 28126177Srik 29126177Srik#include <sys/types.h> 30126177Srik 31126177Srik#define __fenv_static 32#include <fenv.h> 33 34#ifdef __GNUC_GNU_INLINE__ 35#error "This file must be compiled with C99 'inline' semantics" 36#endif 37 38const fenv_t __fe_dfl_env = 0x0009804c8a70033fULL; 39 40extern inline int feclearexcept(int __excepts); 41extern inline int fegetexceptflag(fexcept_t *__flagp, int __excepts); 42extern inline int fesetexceptflag(const fexcept_t *__flagp, int __excepts); 43extern inline int feraiseexcept(int __excepts); 44extern inline int fetestexcept(int __excepts); 45extern inline int fegetround(void); 46extern inline int fesetround(int __round); 47extern inline int fegetenv(fenv_t *__envp); 48extern inline int feholdexcept(fenv_t *__envp); 49extern inline int fesetenv(const fenv_t *__envp); 50 51/* 52 * It doesn't pay to inline feupdateenv() because it includes one of 53 * the rare uses of feraiseexcept() where the argument is not a 54 * constant. Thus, no dead code elimination can occur, resulting in 55 * significant bloat. 56 */ 57int 58feupdateenv(const fenv_t *envp) 59{ 60 fenv_t fpsr; 61 62 __stfpsr(&fpsr); 63 __ldfpsr(*envp); 64 feraiseexcept((fpsr >> _FPUSW_SHIFT) & FE_ALL_EXCEPT); 65 return (0); 66} 67