11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*-
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG>
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved.
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met:
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    documentation and/or other materials provided with the distribution.
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE.
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * $FreeBSD: src/lib/msun/sparc64/fenv.h,v 1.3 2005/03/16 19:03:46 das Exp $
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef	_FENV_H_
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_FENV_H_
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/_types.h>
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef	__uint64_t	fenv_t;
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef	__uint64_t	fexcept_t;
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Exception flags */
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FE_INVALID	0x00000200
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FE_DIVBYZERO	0x00000040
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FE_OVERFLOW	0x00000100
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FE_UNDERFLOW	0x00000080
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FE_INEXACT	0x00000020
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FE_ALL_EXCEPT	(FE_DIVBYZERO | FE_INEXACT | \
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Rounding modes
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * We can't just use the hardware bit values here, because that would
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * make FE_UPWARD and FE_DOWNWARD negative, which is not allowed.
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FE_TONEAREST	0x0
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FE_TOWARDZERO	0x1
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FE_UPWARD	0x2
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FE_DOWNWARD	0x3
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_ROUND_MASK	(FE_TONEAREST | FE_DOWNWARD | \
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 FE_UPWARD | FE_TOWARDZERO)
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_ROUND_SHIFT	30
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Default floating-point environment */
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern const fenv_t	__fe_dfl_env;
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FE_DFL_ENV	(&__fe_dfl_env)
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* We need to be able to map status flag positions to mask flag positions */
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _FPUSW_SHIFT	18
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_ENABLE_MASK	(FE_ALL_EXCEPT << _FPUSW_SHIFT)
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__ldxfsr(__r)	__asm __volatile("ldx %0, %%fsr" : : "m" (__r))
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__stxfsr(__r)	__asm __volatile("stx %%fsr, %0" : "=m" (*(__r)))
721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfeclearexcept(int __excepts)
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fexcept_t __r;
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__stxfsr(&__r);
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__r &= ~__excepts;
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__ldxfsr(__r);
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int
851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfegetexceptflag(fexcept_t *__flagp, int __excepts)
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fexcept_t __r;
881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__stxfsr(&__r);
901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	*__flagp = __r & __excepts;
911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfesetexceptflag(const fexcept_t *__flagp, int __excepts)
961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fexcept_t __r;
981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__stxfsr(&__r);
1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__r &= ~__excepts;
1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__r |= *__flagp & __excepts;
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__ldxfsr(__r);
1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * In contrast with the ia64 platform, it seems to be worthwhile to
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * inline this function on sparc64 even when the arguments are not
1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * compile-time constants.  Perhaps this depends on the register window.
1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int
1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectferaiseexcept(int __excepts)
1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	volatile double d;
1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * With a compiler that supports the FENV_ACCESS pragma
1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * properly, simple expressions like '0.0 / 0.0' should
1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * be sufficient to generate traps.  Unfortunately, we
1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * need to bring a volatile variable into the equation
1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * to prevent incorrect optimizations.
1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (__excepts & FE_INVALID) {
1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		d = 0.0;
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		d = 0.0 / d;
1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (__excepts & FE_DIVBYZERO) {
1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		d = 0.0;
1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		d = 1.0 / d;
1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (__excepts & FE_OVERFLOW) {
1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		d = 0x1.ffp1023;
1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		d *= 2.0;
1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (__excepts & FE_UNDERFLOW) {
1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		d = 0x1p-1022;
1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		d /= 0x1p1023;
1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (__excepts & FE_INEXACT) {
1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		d = 0x1p-1022;
1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		d += 1.0;
1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int
1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfetestexcept(int __excepts)
1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fexcept_t __r;
1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__stxfsr(&__r);
1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (__r & __excepts);
1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int
1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfegetround(void)
1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fenv_t __r;
1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__stxfsr(&__r);
1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return ((__r >> _ROUND_SHIFT) & _ROUND_MASK);
1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int
1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfesetround(int __round)
1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fenv_t __r;
1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (__round & ~_ROUND_MASK)
1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (-1);
1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__stxfsr(&__r);
1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__r &= ~(_ROUND_MASK << _ROUND_SHIFT);
1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__r |= __round << _ROUND_SHIFT;
1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__ldxfsr(__r);
1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int
1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfegetenv(fenv_t *__envp)
1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__stxfsr(__envp);
1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int
1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfeholdexcept(fenv_t *__envp)
1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fenv_t __r;
1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__stxfsr(&__r);
1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	*__envp = __r;
1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__r &= ~(FE_ALL_EXCEPT | _ENABLE_MASK);
1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__ldxfsr(__r);
1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int
1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfesetenv(const fenv_t *__envp)
2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__ldxfsr(*__envp);
2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int
2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfeupdateenv(const fenv_t *__envp)
2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fexcept_t __r;
2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__stxfsr(&__r);
2121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__ldxfsr(*__envp);
2131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	feraiseexcept(__r & FE_ALL_EXCEPT);
2141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
2151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
2161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE
2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int
2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfeenableexcept(int __mask)
2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fenv_t __old_r, __new_r;
2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__stxfsr(&__old_r);
2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__new_r = __old_r | ((__mask & FE_ALL_EXCEPT) << _FPUSW_SHIFT);
2261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__ldxfsr(__new_r);
2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return ((__old_r >> _FPUSW_SHIFT) & FE_ALL_EXCEPT);
2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int
2311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfedisableexcept(int __mask)
2321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fenv_t __old_r, __new_r;
2341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__stxfsr(&__old_r);
2361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__new_r = __old_r & ~((__mask & FE_ALL_EXCEPT) << _FPUSW_SHIFT);
2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__ldxfsr(__new_r);
2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return ((__old_r >> _FPUSW_SHIFT) & FE_ALL_EXCEPT);
2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic __inline int
2421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfegetexcept(void)
2431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
2441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fenv_t __r;
2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	__stxfsr(&__r);
2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return ((__r & _ENABLE_MASK) >> _FPUSW_SHIFT);
2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __BSD_VISIBLE */
2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif	/* !_FENV_H_ */
255