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