diff options
author | Martynas Venckus <martynas@cvs.openbsd.org> | 2011-04-24 00:35:23 +0000 |
---|---|---|
committer | Martynas Venckus <martynas@cvs.openbsd.org> | 2011-04-24 00:35:23 +0000 |
commit | 98e27640fe464f692761edadb6e0485d8e6b7f07 (patch) | |
tree | 1c798bcd8940e628accbbc605098ccffa2ec85ed /sys | |
parent | 32c0a8b92b0c186624c33da84a88dc72f02a52c0 (diff) |
fenv for i386, and sparc64; from matthew@
not reviewed yet, but it's better to track changes in cvs
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/i386/include/fenv.h | 117 | ||||
-rw-r--r-- | sys/arch/sparc64/include/fenv.h | 81 |
2 files changed, 198 insertions, 0 deletions
diff --git a/sys/arch/i386/include/fenv.h b/sys/arch/i386/include/fenv.h new file mode 100644 index 00000000000..a756899525d --- /dev/null +++ b/sys/arch/i386/include/fenv.h @@ -0,0 +1,117 @@ +/* $OpenBSD: fenv.h,v 1.1 2011/04/24 00:35:22 martynas Exp $ */ +/* $NetBSD: fenv.h,v 1.1.6.2 2010/10/24 22:48:02 jym Exp $ */ +/*- + * Copyright (c) 2004-2005 David Schultz <das (at) 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 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _X86_FENV_H_ +#define _X86_FENV_H_ + +#include <sys/stdint.h> +#include <i386/npx.h> + +/* + * Each symbol representing a floating point exception expands to an integer + * constant expression with values, such that bitwise-inclusive ORs of _all + * combinations_ of the constants result in distinct values. + * + * We use such values that allow direct bitwise operations on FPU/SSE registers. + */ +#define FE_INVALID 0x01 /* 000000000001 */ +#define FE_DENORMAL 0x02 /* 000000000010 */ +#define FE_DIVBYZERO 0x04 /* 000000000100 */ +#define FE_OVERFLOW 0x08 /* 000000001000 */ +#define FE_UNDERFLOW 0x10 /* 000000010000 */ +#define FE_INEXACT 0x20 /* 000000100000 */ + +/* + * The following symbol is simply the bitwise-inclusive OR of all floating-point + * exception constants defined above. + */ +#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_DENORMAL | FE_INEXACT | \ + FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW) + +/* + * Each symbol representing the rounding direction, expands to an integer + * constant expression whose value is distinct non-negative value. + * + * We use such values that allow direct bitwise operations on FPU/SSE registers. + */ +#define FE_TONEAREST 0x000 /* 000000000000 */ +#define FE_DOWNWARD 0x400 /* 010000000000 */ +#define FE_UPWARD 0x800 /* 100000000000 */ +#define FE_TOWARDZERO 0xC00 /* 110000000000 */ + +/* + * As compared to the x87 control word, the SSE unit's control has the rounding + * control bits offset by 3 and the exception mask bits offset by 7 + */ +#define __X87_ROUND_MASK 0xC00 /* 110000000000 */ +#define __SSE_ROUND_SHIFT 3 +#define __SSE_EMASK_SHIFT 7 + +/* + * fenv_t represents the entire floating-point environment + */ +typedef struct { + struct { + uint16_t control; /* Control word register */ + uint16_t unused1; + uint16_t status; /* Status word register */ + uint16_t unused2; + uint16_t tag; /* Tag word register */ + uint16_t unused3; + uint32_t others[4]; /* EIP, Pointer Selector, etc */ + } x87; + + uint32_t mxcsr; /* Control and status register */ +} fenv_t; + +/* + * 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. + */ +extern fenv_t __fe_dfl_env; +#define FE_DFL_ENV ((const fenv_t *) &__fe_dfl_env) + +/* + * fexcept_t represents the floating-point status flags collectively, including + * any status the implementation associates with the flags. + * + * A floating-point status flag is a system variable whose value is set (but + * never cleared) when a floating-point exception is raised, which occurs as a + * side effect of exceptional floating-point arithmetic to provide auxiliary + * information. + * + * A floating-point control mode is a system variable whose value may be set by + * the user to affect the subsequent behavior of floating-point arithmetic. + */ +typedef uint32_t fexcept_t; + +#endif /* ! _X86_FENV_H_ */ diff --git a/sys/arch/sparc64/include/fenv.h b/sys/arch/sparc64/include/fenv.h new file mode 100644 index 00000000000..0734b5cd8b8 --- /dev/null +++ b/sys/arch/sparc64/include/fenv.h @@ -0,0 +1,81 @@ +/* $OpenBSD: fenv.h,v 1.1 2011/04/24 00:35:22 martynas Exp $ */ +/* $NetBSD: fenv.h,v 1.1.2.2 2011/02/08 16:19:41 bouyer 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 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _SPARC64_FENV_H_ +#define _SPARC64_FENV_H_ + +#include <sys/stdint.h> + +typedef uint64_t fenv_t; +typedef uint64_t fexcept_t; + +/* + * Exception flags + * + * Symbols are defined in such a way, to correspond to the accrued + * exception bits (aexc) fields of FSR. + */ +#define FE_INEXACT 0x00000020 /* 0000100000 */ +#define FE_DIVBYZERO 0x00000040 /* 0001000000 */ +#define FE_UNDERFLOW 0x00000080 /* 0010000000 */ +#define FE_OVERFLOW 0x00000100 /* 0100000000 */ +#define FE_INVALID 0x00000200 /* 1000000000 */ + +#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | \ + FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW) + +/* + * Rounding modes + * + * We can't just use the hardware bit values here, because that would + * make FE_UPWARD and FE_DOWNWARD negative, which is not allowed. + */ +#define FE_TONEAREST 0x0 +#define FE_TOWARDZERO 0x1 +#define FE_UPWARD 0x2 +#define FE_DOWNWARD 0x3 +#define _ROUND_MASK (FE_TONEAREST | FE_DOWNWARD | \ + FE_UPWARD | FE_TOWARDZERO) +#define _ROUND_SHIFT 30 + +__BEGIN_DECLS + +/* Default floating-point environment */ +extern const fenv_t __fe_dfl_env; +#define FE_DFL_ENV (&__fe_dfl_env) + +/* We need to be able to map status flag positions to mask flag positions */ +#define _FPUSW_SHIFT 18 +#define _ENABLE_MASK (FE_ALL_EXCEPT << _FPUSW_SHIFT) + +__END_DECLS + +#endif /* !_SPARC64_FENV_H_ */ |