1d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI/* 2d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * Copyright (C) 2009 Android Open Source Project, All rights reserved. 3d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * Derived from "bionic/libm/arm/fenv.h" 4d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG> 5d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * 6d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * Redistribution and use in source and binary forms, with or without 7d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * modification, are permitted provided that the following conditions 8d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * are met: 9d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * * Redistributions of source code must retain the above copyright 10d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * notice, this list of conditions and the following disclaimer. 11d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * * Redistributions in binary form must reproduce the above copyright 12d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * notice, this list of conditions and the following disclaimer in 13d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * the documentation and/or other materials provided with the 14d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * distribution. 15d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * 16d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 19d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 20d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 21d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 22d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 23d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 24d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 25d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 26d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI * SUCH DAMAGE. 28d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI */ 29d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 30d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#ifndef _FENV_H_ 31d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define _FENV_H_ 32d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 33d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#include <stdio.h> 34d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#include <sys/types.h> 35d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 36d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKItypedef uint32_t fenv_t; 37d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKItypedef uint32_t fexcept_t; 38d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 39d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI/* Exception flags */ 40d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define FE_INVALID 0x0010 41d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define FE_DIVBYZERO 0x0008 42d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define FE_OVERFLOW 0x0004 43d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define FE_UNDERFLOW 0x0002 44d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define FE_INEXACT 0x0001 45d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | \ 46d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW) 47d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 48d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI/* Rounding modes */ 49d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define FE_TONEAREST 0x0000 50d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define FE_TOWARDZERO 0x0001 51d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define FE_UPWARD 0x0002 /* not supporetd */ 52d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define FE_DOWNWARD 0x0003 /* not supporetd */ 53d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define _ROUND_MASK (FE_TONEAREST | FE_DOWNWARD | \ 54d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI FE_UPWARD | FE_TOWARDZERO) 55d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 56d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI/* bit shift for FPSCR mapping */ 57d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define _FPUE_CAUSE_SHIFT 12 58d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define _FPUE_ENABLE_SHIFT 17 59d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define _FPUE_FLAG_SHIFT 2 60d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 61d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI/* bit shifters */ 62d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define _FPUE_CAUSE(_EXCS) ((_EXCS) << _FPUE_CAUSE_SHIFT) 63d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define _FPUE_ENABLE(_EXCS) ((_EXCS) << _FPUE_ENABLE_SHIFT) 64d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define _FPUE_FLAG(_EXCS) ((_EXCS) << _FPUE_FLAG_SHIFT) 65d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 66d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define _GET_FPUE_CAUSE(_FPUE) (((_FPUE) >> _FPUE_CAUSE_SHIFT) & FE_ALL_EXCEPT) 67d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define _GET_FPUE_ENABLE(_FPUE) (((_FPUE) >> _FPUE_ENABLE_SHIFT)& FE_ALL_EXCEPT) 68d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define _GET_FPUE_FLAG(_FPUE) (((_FPUE) >> _FPUE_FLAG_SHIFT) & FE_ALL_EXCEPT) 69d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 70d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 71d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI/* FPSCR register accessors */ 72d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#ifdef __SH4_NOFPU__ 73d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define __read_fpscr(_ptr) 74d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define __write_fpscr(_val) 75d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#else 76d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define __read_fpscr(_ptr) __asm __volatile("sts fpscr, %0" : "=r" (*(_ptr))) 77d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#define __write_fpscr(_val) __asm __volatile("lds %0, fpscr" : : "r" (_val)) 78d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#endif 79d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 80d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 81d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI/* functions for libm */ 82d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIstatic __inline int 83d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIfeclearexcept(int __excepts) 84d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI{ 85d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI uint32_t __fpscr; 86d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 87d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __read_fpscr(&__fpscr); 88d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __fpscr &= ~_FPUE_FLAG(__excepts); 89d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __write_fpscr(__fpscr); 90d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return (0); 91d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI} 92d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 93d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIstatic __inline int 94d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIfegetexceptflag(fexcept_t *__flagp, int __excepts) 95d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI{ 96d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI uint32_t __fpscr; 97d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 98d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __read_fpscr(&__fpscr); 99d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI *__flagp = _GET_FPUE_FLAG(__fpscr) & __excepts; 100d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return (0); 101d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI} 102d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 103d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 104d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIstatic __inline int 105d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIfesetexceptflag(const fexcept_t *__flagp, int __excepts) 106d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI{ 107d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI uint32_t __fpscr; 108d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 109d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __read_fpscr(&__fpscr); 110d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __fpscr &= ~_FPUE_FLAG(__excepts); 111d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __fpscr |= ~_FPUE_FLAG(*__flagp & __excepts); 112d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __write_fpscr(__fpscr); 113d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return (0); 114d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI} 115d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 116d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 117d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIstatic __inline int 118d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIferaiseexcept(int __excepts) 119d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI{ 120d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI fexcept_t __ex = __excepts; 121d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 122d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI fesetexceptflag(&__ex, __excepts); /* XXX */ 123d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return (0); 124d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI} 125d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 126d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 127d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIstatic __inline int 128d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIfetestexcept(int __excepts) 129d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI{ 130d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI fexcept_t __ex; 131d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 132d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI fegetexceptflag(&__ex, __excepts); 133d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return (__ex); 134d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI} 135d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 136d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 137d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIstatic __inline int 138d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIfegetround(void) 139d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI{ 140d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI uint32_t __fpscr = 0; 141d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 142d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __read_fpscr(&__fpscr); 143d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return (__fpscr & _ROUND_MASK); 144d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI} 145d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 146d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIstatic __inline int 147d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIfesetround(int __round) 148d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI{ 149d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI uint32_t __fpscr = 0; 150d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 151d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI if (__round == FE_UPWARD || __round == FE_DOWNWARD) { 152d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI fprintf(stderr, "libm superh : " 153d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI "upward/downward rounding not supporetd.\n"); 154d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return -1; 155d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI } 156d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 157d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __read_fpscr(&__fpscr); 158d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __fpscr &= ~_ROUND_MASK; 159d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __fpscr |= (__round & _ROUND_MASK); 160d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __write_fpscr(__fpscr); 161d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return (0); 162d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI} 163d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 164d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIstatic __inline int 165d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIfegetenv(fenv_t *__envp) 166d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI{ 167d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __read_fpscr(__envp); 168d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return (0); 169d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI} 170d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 171d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIstatic __inline int 172d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIfeholdexcept(fenv_t *__envp) 173d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI{ 174d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI uint32_t __fpscr; 175d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 176d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __read_fpscr(&__fpscr); 177d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI *__envp = __fpscr; 178d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __fpscr &= ~_FPUE_FLAG(FE_ALL_EXCEPT); 179d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __write_fpscr(__fpscr); 180d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return (0); 181d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI} 182d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 183d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 184d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIstatic __inline int 185d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIfesetenv(const fenv_t *__envp) 186d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI{ 187d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __write_fpscr(*__envp); 188d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return (0); 189d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI} 190d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 191d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 192d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIstatic __inline int 193d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIfeupdateenv(const fenv_t *__envp) 194d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI{ 195d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI uint32_t __fpscr; 196d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 197d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __read_fpscr(&__fpscr); 198d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __write_fpscr(*__envp); 199d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI feraiseexcept(_GET_FPUE_FLAG(__fpscr)); 200d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return (0); 201d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI} 202d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 203d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#if __BSD_VISIBLE 204d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 205d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIstatic __inline int 206d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIfeenableexcept(int __mask) 207d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI{ 208d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI uint32_t __old_fpscr, __new_fpscr; 209d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 210d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __read_fpscr(&__old_fpscr); 211d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __new_fpscr = __old_fpscr | _FPUE_ENABLE(__mask & FE_ALL_EXCEPT); 212d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __write_fpscr(__new_fpscr); 213d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return (_GET_FPUE_ENABLE(__old_fpscr)); 214d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI} 215d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 216d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIstatic __inline int 217d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIfedisableexcept(int __mask) 218d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI{ 219d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI uint32_t __old_fpscr, __new_fpscr; 220d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 221d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __read_fpscr(&__old_fpscr); 222d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __new_fpscr = __old_fpscr & ~(_FPUE_ENABLE(__mask & FE_ALL_EXCEPT)); 223d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __write_fpscr(__new_fpscr); 224d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return (_GET_FPUE_ENABLE(__old_fpscr)); 225d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI} 226d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 227d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIstatic __inline int 228d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKIfegetexcept(void) 229d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI{ 230d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI uint32_t __fpscr; 231d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 232d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI __read_fpscr(&__fpscr); 233d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI return (_GET_FPUE_ENABLE(__fpscr)); 234d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI} 235d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 236d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#endif /* __BSD_VISIBLE */ 237d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 238d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 239d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI#endif /* _FENV_H_ */ 240d87945b4e706dbbacd71f6a3fd2e96162e970094Shin-ichiro KAWASAKI 241