summaryrefslogtreecommitdiffstats
path: root/sys/i386/include/npx.h
diff options
context:
space:
mode:
authortijl <tijl@FreeBSD.org>2012-03-16 20:24:30 +0000
committertijl <tijl@FreeBSD.org>2012-03-16 20:24:30 +0000
commit9c671fcacaa05105013becd8a9a70514228bb3fd (patch)
treefd1d230ecbf75adf9d32622c24cc4e97a58dd02c /sys/i386/include/npx.h
parent9d9a56e6efa88f739b0da929f728b3510a1b9ea6 (diff)
downloadFreeBSD-src-9c671fcacaa05105013becd8a9a70514228bb3fd.zip
FreeBSD-src-9c671fcacaa05105013becd8a9a70514228bb3fd.tar.gz
Move userland bits of i386 npx.h and amd64 fpu.h to x86 fpu.h.
Remove FPU types from compat/ia32/ia32_reg.h that are no longer needed. Create machine/npx.h on amd64 to allow compiling i386 code that uses this header. The original npx.h and fpu.h define struct envxmm differently. Both definitions have been included in the new x86 header as struct __envxmm32 and struct __envxmm64. During compilation either __envxmm32 or __envxmm64 is defined as envxmm depending on machine architecture. On amd64 the i386 struct is also available as struct envxmm32. Reviewed by: kib
Diffstat (limited to 'sys/i386/include/npx.h')
-rw-r--r--sys/i386/include/npx.h122
1 files changed, 1 insertions, 121 deletions
diff --git a/sys/i386/include/npx.h b/sys/i386/include/npx.h
index bfecd56..86ac477 100644
--- a/sys/i386/include/npx.h
+++ b/sys/i386/include/npx.h
@@ -41,127 +41,7 @@
#ifndef _MACHINE_NPX_H_
#define _MACHINE_NPX_H_
-/* Environment information of floating point unit */
-struct env87 {
- int32_t en_cw; /* control word (16bits) */
- int32_t en_sw; /* status word (16bits) */
- int32_t en_tw; /* tag word (16bits) */
- int32_t en_fip; /* fp instruction pointer */
- uint16_t en_fcs; /* fp code segment selector */
- uint16_t en_opcode; /* opcode last executed (11 bits ) */
- int32_t en_foo; /* fp operand offset */
- int32_t en_fos; /* fp operand segment selector */
-};
-
-/* Contents of each floating point accumulator */
-struct fpacc87 {
-#ifdef dontdef /* too unportable */
- u_long fp_mantlo; /* mantissa low (31:0) */
- u_long fp_manthi; /* mantissa high (63:32) */
- int fp_exp:15; /* exponent */
- int fp_sgn:1; /* mantissa sign */
-#else
- u_char fp_bytes[10];
-#endif
-};
-
-/* Floating point context */
-struct save87 {
- struct env87 sv_env; /* floating point control/status */
- struct fpacc87 sv_ac[8]; /* accumulator contents, 0-7 */
- u_char sv_pad0[4]; /* padding for (now unused) saved status word */
- /*
- * Bogus padding for emulators. Emulators should use their own
- * struct and arrange to store into this struct (ending here)
- * before it is inspected for ptracing or for core dumps. Some
- * emulators overwrite the whole struct. We have no good way of
- * knowing how much padding to leave. Leave just enough for the
- * GPL emulator's i387_union (176 bytes total).
- */
- u_char sv_pad[64]; /* padding; used by emulators */
-};
-
-struct envxmm {
- u_int16_t en_cw; /* control word (16bits) */
- u_int16_t en_sw; /* status word (16bits) */
- u_int16_t en_tw; /* tag word (16bits) */
- u_int16_t en_opcode; /* opcode last executed (11 bits ) */
- u_int32_t en_fip; /* floating point instruction pointer */
- u_int16_t en_fcs; /* floating code segment selector */
- u_int16_t en_pad0; /* padding */
- u_int32_t en_foo; /* floating operand offset */
- u_int16_t en_fos; /* floating operand segment selector */
- u_int16_t en_pad1; /* padding */
- u_int32_t en_mxcsr; /* SSE control/status register */
- u_int32_t en_mxcsr_mask; /* valid bits in mxcsr */
-};
-
-/* Contents of each SSE extended accumulator */
-struct xmmacc {
- u_char xmm_bytes[16];
-};
-
-/* Contents of the upper 16 bytes of each AVX extended accumulator */
-struct ymmacc {
- uint8_t ymm_bytes[16];
-};
-
-struct savexmm {
- struct envxmm sv_env;
- struct {
- struct fpacc87 fp_acc;
- u_char fp_pad[6]; /* padding */
- } sv_fp[8];
- struct xmmacc sv_xmm[8];
- u_char sv_pad[224];
-} __aligned(16);
-
-union savefpu {
- struct save87 sv_87;
- struct savexmm sv_xmm;
-};
-
-struct xstate_hdr {
- uint64_t xstate_bv;
- uint8_t xstate_rsrv0[16];
- uint8_t xstate_rsrv[40];
-};
-
-struct savexmm_xstate {
- struct xstate_hdr sx_hd;
- struct ymmacc sx_ymm[16];
-};
-
-struct savexmm_ymm {
- struct envxmm sv_env;
- struct {
- struct fpacc87 fp_acc;
- int8_t fp_pad[6]; /* padding */
- } sv_fp[8];
- struct xmmacc sv_xmm[16];
- uint8_t sv_pad[96];
- struct savexmm_xstate sv_xstate;
-} __aligned(64);
-
-/*
- * The hardware default control word for i387's and later coprocessors is
- * 0x37F, giving:
- *
- * round to nearest
- * 64-bit precision
- * all exceptions masked.
- *
- * We modify the affine mode bit and precision bits in this to give:
- *
- * affine mode for 287's (if they work at all) (1 in bitfield 1<<12)
- * 53-bit precision (2 in bitfield 3<<8)
- *
- * 64-bit precision often gives bad results with high level languages
- * because it makes the results of calculations depend on whether
- * intermediate values are stored in memory or in FPU registers.
- */
-#define __INITIAL_NPXCW__ 0x127F
-#define __INITIAL_MXCSR__ 0x1F80
+#include <x86/fpu.h>
#ifdef _KERNEL
OpenPOWER on IntegriCloud