diff options
author | Ted Unangst <tedu@cvs.openbsd.org> | 2016-09-01 09:26:05 +0000 |
---|---|---|
committer | Ted Unangst <tedu@cvs.openbsd.org> | 2016-09-01 09:26:05 +0000 |
commit | 47c3ea12101ab1306e597c896c06013ece57e0bf (patch) | |
tree | b1df87ddfc7f816a9ebe43be5229e6b9774a7d66 /lib/libm/arch | |
parent | 67f99d43e21f7960ccdf554cf741c39f60102e23 (diff) |
retire the sparc library code
Diffstat (limited to 'lib/libm/arch')
-rw-r--r-- | lib/libm/arch/sparc/fenv.c | 336 |
1 files changed, 0 insertions, 336 deletions
diff --git a/lib/libm/arch/sparc/fenv.c b/lib/libm/arch/sparc/fenv.c deleted file mode 100644 index c226db4ee48..00000000000 --- a/lib/libm/arch/sparc/fenv.c +++ /dev/null @@ -1,336 +0,0 @@ -/* $OpenBSD: fenv.c,v 1.4 2014/04/18 15:09:52 guenther Exp $ */ -/* $NetBSD: fenv.c,v 1.1 2011/01/31 00:19:33 christos Exp $ */ - -/*- - * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - */ - -#include <fenv.h> - -/* - * The following constant represents the default floating-point environment - * (that is, the one installed at program startup) and has type pointer to - * const-qualified fenv_t. - * - * It can be used as an argument to the functions within the <fenv.h> header - * that manage the floating-point environment, namely fesetenv() and - * feupdateenv(). - */ -fenv_t __fe_dfl_env = 0; - -/* - * The feclearexcept() function clears the supported floating-point exceptions - * represented by `excepts'. - */ -int -feclearexcept(int excepts) -{ - fexcept_t r; - - excepts &= FE_ALL_EXCEPT; - - /* Save floating-point state register */ - __asm__ volatile ("st %%fsr, %0" : "=m" (r)); - - r &= ~excepts; - - /* Load floating-point state register */ - __asm__ volatile ("ld %0, %%fsr" : : "m" (r)); - - return 0; -} - -/* - * The fegetexceptflag() function stores an implementation-defined - * representation of the states of the floating-point status flags indicated - * by the argument excepts in the object pointed to by the argument flagp. - */ -int -fegetexceptflag(fexcept_t *flagp, int excepts) -{ - fexcept_t r; - - excepts &= FE_ALL_EXCEPT; - - /* Save floating-point state register */ - __asm__ volatile ("st %%fsr, %0" : "=m" (r)); - - *flagp = r & excepts; - - return 0; -} - - -/* - * This function sets the floating-point status flags indicated by the argument - * `excepts' to the states stored in the object pointed to by `flagp'. It does - * NOT raise any floating-point exceptions, but only sets the state of the flags. - */ -int -fesetexceptflag(const fexcept_t *flagp, int excepts) -{ - fexcept_t r; - - excepts &= FE_ALL_EXCEPT; - - /* Save floating-point state register */ - __asm__ volatile ("st %%fsr, %0" : "=m" (r)); - - r &= ~excepts; - r |= *flagp & excepts; - - /* Load floating-point state register */ - __asm__ volatile ("ld %0, %%fsr" : : "m" (r)); - - return 0; -} - -/* - * The feraiseexcept() function raises the supported floating-point exceptions - * represented by the argument `excepts'. - * - * The order in which these floating-point exceptions are raised is unspecified - * (by the standard). - */ -int -feraiseexcept(int excepts) -{ - volatile double d; - - excepts &= FE_ALL_EXCEPT; - - /* - * With a compiler that supports the FENV_ACCESS pragma properly, simple - * expressions like '0.0 / 0.0' should be sufficient to generate traps. - * Unfortunately, we need to bring a volatile variable into the equation - * to prevent incorrect optimizations. - */ - if (excepts & FE_INVALID) { - d = 0.0; - d = 0.0 / d; - } - if (excepts & FE_DIVBYZERO) { - d = 0.0; - d = 1.0 / d; - } - if (excepts & FE_OVERFLOW) { - d = 0x1.ffp1023; - d *= 2.0; - } - if (excepts & FE_UNDERFLOW) { - d = 0x1p-1022; - d /= 0x1p1023; - } - if (excepts & FE_INEXACT) { - d = 0x1p-1022; - d += 1.0; - } - - return 0; -} - -/* - * The fetestexcept() function determines which of a specified subset of the - * floating-point exception flags are currently set. The `excepts' argument - * specifies the floating-point status flags to be queried. - */ -int -fetestexcept(int excepts) -{ - fexcept_t r; - - excepts &= FE_ALL_EXCEPT; - - /* Save floating-point state register */ - __asm__ volatile ("st %%fsr, %0" : "=m" (r)); - - return r & excepts; -} - -/* - * The fegetround() function gets the current rounding direction. - */ -int -fegetround(void) -{ - fenv_t r; - - /* Save floating-point state register */ - __asm__ volatile ("st %%fsr, %0" : "=m" (r)); - - return (r >> _ROUND_SHIFT) & _ROUND_MASK; -} - -/* - * The fesetround() function establishes the rounding direction represented by - * its argument `round'. If the argument is not equal to the value of a rounding - * direction macro, the rounding direction is not changed. - */ -int -fesetround(int round) -{ - fenv_t r; - - if (round & ~_ROUND_MASK) - return -1; - - /* Save floating-point state register */ - __asm__ volatile ("st %%fsr, %0" : "=m" (r)); - - r &= ~(_ROUND_MASK << _ROUND_SHIFT); - r |= round << _ROUND_SHIFT; - - /* Load floating-point state register */ - __asm__ volatile ("ld %0, %%fsr" : : "m" (r)); - - return 0; -} - -/* - * The fegetenv() function attempts to store the current floating-point - * environment in the object pointed to by envp. - */ -int -fegetenv(fenv_t *envp) -{ - /* Save floating-point state register */ - __asm__ volatile ("st %%fsr, %0" : "=m" (*envp)); - - return 0; -} - - -/* - * The feholdexcept() function saves the current floating-point environment - * in the object pointed to by envp, clears the floating-point status flags, and - * then installs a non-stop (continue on floating-point exceptions) mode, if - * available, for all floating-point exceptions. - */ -int -feholdexcept(fenv_t *envp) -{ - fenv_t r; - - /* Save floating-point state register */ - __asm__ volatile ("st %%fsr, %0" : "=m" (r)); - - *envp = r; - r &= ~(FE_ALL_EXCEPT | (FE_ALL_EXCEPT << _MASK_SHIFT)); - - /* Load floating-point state register */ - __asm__ volatile ("ld %0, %%fsr" : : "m" (r)); - - return 0; -} - -/* - * The fesetenv() function attempts to establish the floating-point environment - * represented by the object pointed to by envp. The argument `envp' points - * to an object set by a call to fegetenv() or feholdexcept(), or equal a - * floating-point environment macro. The fesetenv() function does not raise - * floating-point exceptions, but only installs the state of the floating-point - * status flags represented through its argument. - */ -int -fesetenv(const fenv_t *envp) -{ - /* Load floating-point state register */ - __asm__ volatile ("ld %0, %%fsr" : : "m" (*envp)); - - return 0; -} - - -/* - * The feupdateenv() function saves the currently raised floating-point - * exceptions in its automatic storage, installs the floating-point environment - * represented by the object pointed to by `envp', and then raises the saved - * floating-point exceptions. The argument `envp' shall point to an object set - * by a call to feholdexcept() or fegetenv(), or equal a floating-point - * environment macro. - */ -int -feupdateenv(const fenv_t *envp) -{ - fexcept_t r; - - /* Save floating-point state register */ - __asm__ volatile ("st %%fsr, %0" : "=m" (r)); - - /* Load floating-point state register */ - __asm__ volatile ("ld %0, %%fsr" : : "m" (*envp)); - - feraiseexcept(r & FE_ALL_EXCEPT); - - return 0; -} - -/* - * The following functions are extentions to the standard - */ -int -feenableexcept(int mask) -{ - fenv_t old_r, new_r; - - mask &= FE_ALL_EXCEPT; - - /* Save floating-point state register */ - __asm__ volatile ("st %%fsr, %0" : "=m" (old_r)); - - new_r = old_r | (mask << _MASK_SHIFT); - - /* Load floating-point state register */ - __asm__ volatile ("ld %0, %%fsr" : : "m" (new_r)); - - return (old_r >> _MASK_SHIFT) & FE_ALL_EXCEPT; -} - -int -fedisableexcept(int mask) -{ - fenv_t old_r, new_r; - - mask &= FE_ALL_EXCEPT; - - /* Save floating-point state register */ - __asm__ volatile ("st %%fsr, %0" : "=m" (old_r)); - - new_r = old_r & ~(mask << _MASK_SHIFT); - - /* Load floating-point state register */ - __asm__ volatile ("ld %0, %%fsr" : : "m" (new_r)); - - return (old_r >> _MASK_SHIFT) & FE_ALL_EXCEPT; -} - -int -fegetexcept(void) -{ - fenv_t r; - - /* Save floating-point state register */ - __asm__ volatile ("st %%fsr, %0" : "=m" (r)); - - return (r & (FE_ALL_EXCEPT << _MASK_SHIFT)) >> _MASK_SHIFT; -} |