170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin/*-
270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * Copyright (c) 2004-2005 David Schultz <das (at) FreeBSD.ORG>
370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * All rights reserved.
470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin *
570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * Redistribution and use in source and binary forms, with or without
670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * modification, are permitted provided that the following conditions
770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * are met:
870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * 1. Redistributions of source code must retain the above copyright
970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin *    notice, this list of conditions and the following disclaimer.
1070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * 2. Redistributions in binary form must reproduce the above copyright
1170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin *    notice, this list of conditions and the following disclaimer in the
1270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin *    documentation and/or other materials provided with the distribution.
1370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin *
1470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
223710db80d4b9e573d775790e4c9a2ab6e062201eIgor Murashkin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He * SUCH DAMAGE.
25b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He */
262f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvala
272f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvala#ifndef _AMD64_FENV_H_
2870c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala#define _AMD64_FENV_H_
29b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin
3070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala#include <sys/types.h>
31b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin
32b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin__BEGIN_DECLS
33b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin
34b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin/*
3570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * Each symbol representing a floating point exception expands to an integer
3670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * constant expression with values, such that bitwise-inclusive ORs of _all
3770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * combinations_ of the constants result in distinct values.
3870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin *
3970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * We use such values that allow direct bitwise operations on FPU/SSE registers.
4070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin */
4170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin#define FE_INVALID    0x01
4270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin#define FE_DENORMAL   0x02
4370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin#define FE_DIVBYZERO  0x04
4470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin#define FE_OVERFLOW   0x08
4570c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala#define FE_UNDERFLOW  0x10
4670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin#define FE_INEXACT    0x20
4770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
48b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin/*
49b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin * The following symbol is simply the bitwise-inclusive OR of all floating-point
50b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin * exception constants defined above.
51b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin */
52b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin#define FE_ALL_EXCEPT   (FE_INVALID | FE_DENORMAL | FE_DIVBYZERO | \
53b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin                         FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT)
54b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin
55b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin/*
56b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin * Each symbol representing the rounding direction, expands to an integer
57b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin * constant expression whose value is distinct non-negative value.
58b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin *
59b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He * We use such values that allow direct bitwise operations on FPU/SSE registers.
60b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin */
61b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin#define FE_TONEAREST  0x000
62b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin#define FE_DOWNWARD   0x400
63b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin#define FE_UPWARD     0x800
6470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin#define FE_TOWARDZERO 0xc00
6570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
6670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala/*
6770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * fenv_t represents the entire floating-point environment.
6870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin */
6970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkintypedef struct {
7070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin  struct {
7170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    __uint32_t __control;   /* Control word register */
7270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    __uint32_t __status;    /* Status word register */
7370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    __uint32_t __tag;       /* Tag word register */
7470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin    __uint32_t __others[4]; /* EIP, Pointer Selector, etc */
7570725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin  } __x87;
7670725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin  __uint32_t __mxcsr;       /* Control, status register */
7770725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin} fenv_t;
7870725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin
7970725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin/*
8070725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * fexcept_t represents the floating-point status flags collectively, including
8170725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * any status the implementation associates with the flags.
8270725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin *
8370725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * A floating-point status flag is a system variable whose value is set (but
8470725500dcf3b666b43d50563d64705aab58d2d3Igor Murashkin * never cleared) when a floating-point exception is raised, which occurs as a
85b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin * side effect of exceptional floating-point arithmetic to provide auxiliary
86b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin * information.
87b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin *
88b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin * A floating-point control mode is a system variable whose value may be set by
89b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin * the user to affect the subsequent behavior of floating-point arithmetic.
9070c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala */
91b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkintypedef __uint32_t fexcept_t;
9270c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
93b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin__END_DECLS
9470c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala
95b519cc52ecba8f44da31173c9fc90a7b66d52b79Igor Murashkin#endif /* !_AMD64_FENV_H_ */
9670c2207c34cf0e6b3b383b1b1500ff5385aa51a6Eino-Ville Talvala