1*8d67ca89SAndroid Build Coastguard Worker /* $OpenBSD: fenv.h,v 1.2 2011/05/25 21:46:49 martynas Exp $ */ 2*8d67ca89SAndroid Build Coastguard Worker /* $NetBSD: fenv.h,v 1.2.4.1 2011/02/08 16:18:55 bouyer Exp $ */ 3*8d67ca89SAndroid Build Coastguard Worker 4*8d67ca89SAndroid Build Coastguard Worker /* 5*8d67ca89SAndroid Build Coastguard Worker * Copyright (c) 2010 The NetBSD Foundation, Inc. 6*8d67ca89SAndroid Build Coastguard Worker * All rights reserved. 7*8d67ca89SAndroid Build Coastguard Worker * 8*8d67ca89SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 9*8d67ca89SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 10*8d67ca89SAndroid Build Coastguard Worker * are met: 11*8d67ca89SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 12*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 13*8d67ca89SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 14*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 15*8d67ca89SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 16*8d67ca89SAndroid Build Coastguard Worker * 17*8d67ca89SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 18*8d67ca89SAndroid Build Coastguard Worker * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 19*8d67ca89SAndroid Build Coastguard Worker * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 20*8d67ca89SAndroid Build Coastguard Worker * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 21*8d67ca89SAndroid Build Coastguard Worker * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22*8d67ca89SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23*8d67ca89SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*8d67ca89SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25*8d67ca89SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26*8d67ca89SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27*8d67ca89SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE. 28*8d67ca89SAndroid Build Coastguard Worker */ 29*8d67ca89SAndroid Build Coastguard Worker 30*8d67ca89SAndroid Build Coastguard Worker #pragma once 31*8d67ca89SAndroid Build Coastguard Worker 32*8d67ca89SAndroid Build Coastguard Worker /** 33*8d67ca89SAndroid Build Coastguard Worker * @file fenv.h 34*8d67ca89SAndroid Build Coastguard Worker * @brief Floating-point environment. 35*8d67ca89SAndroid Build Coastguard Worker */ 36*8d67ca89SAndroid Build Coastguard Worker 37*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h> 38*8d67ca89SAndroid Build Coastguard Worker 39*8d67ca89SAndroid Build Coastguard Worker #if defined(__aarch64__) || defined(__arm__) 40*8d67ca89SAndroid Build Coastguard Worker #include <bits/fenv_arm.h> 41*8d67ca89SAndroid Build Coastguard Worker #elif defined(__i386__) 42*8d67ca89SAndroid Build Coastguard Worker #include <bits/fenv_x86.h> 43*8d67ca89SAndroid Build Coastguard Worker #elif defined(__riscv) 44*8d67ca89SAndroid Build Coastguard Worker #include <bits/fenv_riscv64.h> 45*8d67ca89SAndroid Build Coastguard Worker #elif defined(__x86_64__) 46*8d67ca89SAndroid Build Coastguard Worker #include <bits/fenv_x86_64.h> 47*8d67ca89SAndroid Build Coastguard Worker #endif 48*8d67ca89SAndroid Build Coastguard Worker 49*8d67ca89SAndroid Build Coastguard Worker __BEGIN_DECLS 50*8d67ca89SAndroid Build Coastguard Worker 51*8d67ca89SAndroid Build Coastguard Worker /** 52*8d67ca89SAndroid Build Coastguard Worker * [feclearexcept(3)](https://man7.org/linux/man-pages/man3/feclearexcept.3.html) 53*8d67ca89SAndroid Build Coastguard Worker * clears the given `exceptions` in hardware. 54*8d67ca89SAndroid Build Coastguard Worker * 55*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns non-zero on failure. 56*8d67ca89SAndroid Build Coastguard Worker */ 57*8d67ca89SAndroid Build Coastguard Worker int feclearexcept(int __exceptions); 58*8d67ca89SAndroid Build Coastguard Worker 59*8d67ca89SAndroid Build Coastguard Worker /** 60*8d67ca89SAndroid Build Coastguard Worker * [fegetexceptflag(3)](https://man7.org/linux/man-pages/man3/fegetexceptflag.3.html) 61*8d67ca89SAndroid Build Coastguard Worker * copies the state of the given `exceptions` from hardware into `*flag_ptr`. 62*8d67ca89SAndroid Build Coastguard Worker * See fesetexceptflag(). 63*8d67ca89SAndroid Build Coastguard Worker * 64*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns non-zero on failure. 65*8d67ca89SAndroid Build Coastguard Worker */ 66*8d67ca89SAndroid Build Coastguard Worker int fegetexceptflag(fexcept_t* _Nonnull __flag_ptr, int __exceptions); 67*8d67ca89SAndroid Build Coastguard Worker 68*8d67ca89SAndroid Build Coastguard Worker /** 69*8d67ca89SAndroid Build Coastguard Worker * [feraiseexcept(3)](https://man7.org/linux/man-pages/man3/feraiseexcept.3.html) 70*8d67ca89SAndroid Build Coastguard Worker * raises the given `exceptions` in hardware. 71*8d67ca89SAndroid Build Coastguard Worker * 72*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns non-zero on failure. 73*8d67ca89SAndroid Build Coastguard Worker */ 74*8d67ca89SAndroid Build Coastguard Worker int feraiseexcept(int __exceptions); 75*8d67ca89SAndroid Build Coastguard Worker 76*8d67ca89SAndroid Build Coastguard Worker /** 77*8d67ca89SAndroid Build Coastguard Worker * [fesetexceptflag(3)](https://man7.org/linux/man-pages/man3/fesetexceptflag.3.html) 78*8d67ca89SAndroid Build Coastguard Worker * copies the state of the given `exceptions` from `*flag_ptr` into hardware. 79*8d67ca89SAndroid Build Coastguard Worker * See fesetexceptflag(). 80*8d67ca89SAndroid Build Coastguard Worker * 81*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns non-zero on failure. 82*8d67ca89SAndroid Build Coastguard Worker */ 83*8d67ca89SAndroid Build Coastguard Worker int fesetexceptflag(const fexcept_t* _Nonnull __flag_ptr, int __exceptions); 84*8d67ca89SAndroid Build Coastguard Worker 85*8d67ca89SAndroid Build Coastguard Worker /** 86*8d67ca89SAndroid Build Coastguard Worker * [fetestexcept(3)](https://man7.org/linux/man-pages/man3/fetestexcept.3.html) 87*8d67ca89SAndroid Build Coastguard Worker * tests whether the given `exceptions` are set in hardware. 88*8d67ca89SAndroid Build Coastguard Worker * 89*8d67ca89SAndroid Build Coastguard Worker * Returns the currently-set subset of `exceptions`. 90*8d67ca89SAndroid Build Coastguard Worker */ 91*8d67ca89SAndroid Build Coastguard Worker int fetestexcept(int __exceptions); 92*8d67ca89SAndroid Build Coastguard Worker 93*8d67ca89SAndroid Build Coastguard Worker /** 94*8d67ca89SAndroid Build Coastguard Worker * [fegetround(3)](https://man7.org/linux/man-pages/man3/fegetround.3.html) 95*8d67ca89SAndroid Build Coastguard Worker * returns the current rounding mode. 96*8d67ca89SAndroid Build Coastguard Worker * 97*8d67ca89SAndroid Build Coastguard Worker * Returns the rounding mode on success, and returns a negative value on failure. 98*8d67ca89SAndroid Build Coastguard Worker */ 99*8d67ca89SAndroid Build Coastguard Worker int fegetround(void); 100*8d67ca89SAndroid Build Coastguard Worker 101*8d67ca89SAndroid Build Coastguard Worker /** 102*8d67ca89SAndroid Build Coastguard Worker * [fesetround(3)](https://man7.org/linux/man-pages/man3/fesetround.3.html) 103*8d67ca89SAndroid Build Coastguard Worker * sets the current rounding mode. 104*8d67ca89SAndroid Build Coastguard Worker * 105*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns non-zero on failure. 106*8d67ca89SAndroid Build Coastguard Worker */ 107*8d67ca89SAndroid Build Coastguard Worker int fesetround(int __rounding_mode); 108*8d67ca89SAndroid Build Coastguard Worker 109*8d67ca89SAndroid Build Coastguard Worker /** 110*8d67ca89SAndroid Build Coastguard Worker * [fegetenv(3)](https://man7.org/linux/man-pages/man3/fegetenv.3.html) 111*8d67ca89SAndroid Build Coastguard Worker * gets the current floating-point environment. See fesetenv(). 112*8d67ca89SAndroid Build Coastguard Worker * 113*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns non-zero on failure. 114*8d67ca89SAndroid Build Coastguard Worker */ 115*8d67ca89SAndroid Build Coastguard Worker int fegetenv(fenv_t* _Nonnull __env); 116*8d67ca89SAndroid Build Coastguard Worker 117*8d67ca89SAndroid Build Coastguard Worker /** 118*8d67ca89SAndroid Build Coastguard Worker * [feholdexcept(3)](https://man7.org/linux/man-pages/man3/feholdexcept.3.html) 119*8d67ca89SAndroid Build Coastguard Worker * gets the current floating-point environment, clears the status flags, and 120*8d67ca89SAndroid Build Coastguard Worker * ignores floating point exceptions. See fesetenv()/feupdateenv(). 121*8d67ca89SAndroid Build Coastguard Worker * 122*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns non-zero on failure. 123*8d67ca89SAndroid Build Coastguard Worker */ 124*8d67ca89SAndroid Build Coastguard Worker int feholdexcept(fenv_t* _Nonnull __env); 125*8d67ca89SAndroid Build Coastguard Worker 126*8d67ca89SAndroid Build Coastguard Worker /** 127*8d67ca89SAndroid Build Coastguard Worker * [fesetenv(3)](https://man7.org/linux/man-pages/man3/fesetenv.3.html) 128*8d67ca89SAndroid Build Coastguard Worker * sets the current floating-point environment. See fegetenv(). 129*8d67ca89SAndroid Build Coastguard Worker * 130*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns non-zero on failure. 131*8d67ca89SAndroid Build Coastguard Worker */ 132*8d67ca89SAndroid Build Coastguard Worker int fesetenv(const fenv_t* _Nonnull __env); 133*8d67ca89SAndroid Build Coastguard Worker 134*8d67ca89SAndroid Build Coastguard Worker /** 135*8d67ca89SAndroid Build Coastguard Worker * [feupdateenv(3)](https://man7.org/linux/man-pages/man3/feupdateenv.3.html) 136*8d67ca89SAndroid Build Coastguard Worker * sets the current floating-point environment to `*env` but with currently-raised 137*8d67ca89SAndroid Build Coastguard Worker * exceptions still raised. See fesetenv(). 138*8d67ca89SAndroid Build Coastguard Worker * 139*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns non-zero on failure. 140*8d67ca89SAndroid Build Coastguard Worker */ 141*8d67ca89SAndroid Build Coastguard Worker int feupdateenv(const fenv_t* _Nonnull __env); 142*8d67ca89SAndroid Build Coastguard Worker 143*8d67ca89SAndroid Build Coastguard Worker /** 144*8d67ca89SAndroid Build Coastguard Worker * [feenableexcept(3)](https://man7.org/linux/man-pages/man3/feenableexcept.3.html) 145*8d67ca89SAndroid Build Coastguard Worker * sets the given `exceptions` to trap, if the hardware supports it. This is not 146*8d67ca89SAndroid Build Coastguard Worker * generally useful on Android, because only x86/x86-64 can trap. 147*8d67ca89SAndroid Build Coastguard Worker * 148*8d67ca89SAndroid Build Coastguard Worker * Returns the previous set of enabled exceptions on success, and returns -1 on failure. 149*8d67ca89SAndroid Build Coastguard Worker */ 150*8d67ca89SAndroid Build Coastguard Worker int feenableexcept(int __exceptions); 151*8d67ca89SAndroid Build Coastguard Worker 152*8d67ca89SAndroid Build Coastguard Worker /** 153*8d67ca89SAndroid Build Coastguard Worker * [fedisableexcept(3)](https://man7.org/linux/man-pages/man3/fedisableexcept.3.html) 154*8d67ca89SAndroid Build Coastguard Worker * sets the given `exceptions` to not trap, if the hardware supports it. This is not 155*8d67ca89SAndroid Build Coastguard Worker * generally useful on Android, because only x86/x86-64 can trap. 156*8d67ca89SAndroid Build Coastguard Worker * 157*8d67ca89SAndroid Build Coastguard Worker * Returns the previous set of enabled exceptions on success, and returns -1 on failure. 158*8d67ca89SAndroid Build Coastguard Worker */ 159*8d67ca89SAndroid Build Coastguard Worker int fedisableexcept(int __exceptions); 160*8d67ca89SAndroid Build Coastguard Worker 161*8d67ca89SAndroid Build Coastguard Worker /** 162*8d67ca89SAndroid Build Coastguard Worker * [fegetexcept(3)](https://man7.org/linux/man-pages/man3/fegetexcept.3.html) 163*8d67ca89SAndroid Build Coastguard Worker * returns the exceptions that currently trap. This is not generally useful on 164*8d67ca89SAndroid Build Coastguard Worker * Android, because only x86/x86-64 can trap. 165*8d67ca89SAndroid Build Coastguard Worker * 166*8d67ca89SAndroid Build Coastguard Worker * Returns the exceptions that currently trap. 167*8d67ca89SAndroid Build Coastguard Worker */ 168*8d67ca89SAndroid Build Coastguard Worker int fegetexcept(void); 169*8d67ca89SAndroid Build Coastguard Worker 170*8d67ca89SAndroid Build Coastguard Worker /** See FE_DFL_ENV. */ 171*8d67ca89SAndroid Build Coastguard Worker extern const fenv_t __fe_dfl_env; 172*8d67ca89SAndroid Build Coastguard Worker 173*8d67ca89SAndroid Build Coastguard Worker /** 174*8d67ca89SAndroid Build Coastguard Worker * Constant representing the default floating-point environment 175*8d67ca89SAndroid Build Coastguard Worker * (that is, the one installed at program startup). 176*8d67ca89SAndroid Build Coastguard Worker * 177*8d67ca89SAndroid Build Coastguard Worker * It can be used as an argument to the functions that manage the floating-point 178*8d67ca89SAndroid Build Coastguard Worker * environment, namely fesetenv() and feupdateenv(). 179*8d67ca89SAndroid Build Coastguard Worker */ 180*8d67ca89SAndroid Build Coastguard Worker #define FE_DFL_ENV (&__fe_dfl_env) 181*8d67ca89SAndroid Build Coastguard Worker 182*8d67ca89SAndroid Build Coastguard Worker __END_DECLS 183