diff --git a/sys/amd64/include/ieeefp.h b/sys/amd64/include/ieeefp.h --- a/sys/amd64/include/ieeefp.h +++ b/sys/amd64/include/ieeefp.h @@ -40,61 +40,14 @@ #ifndef _MACHINE_IEEEFP_H_ #define _MACHINE_IEEEFP_H_ -/* - * Deprecated historical FPU control interface - * - * IEEE floating point type, constant and function definitions. - * XXX: {FP,SSE}*FLD and {FP,SSE}*OFF are undocumented pollution. - */ - -#ifndef _SYS_CDEFS_H_ -#error this file needs sys/cdefs.h as a prerequisite -#endif - -/* - * Rounding modes. - */ -typedef enum { - FP_RN=0, /* round to nearest */ - FP_RM, /* round down towards minus infinity */ - FP_RP, /* round up towards plus infinity */ - FP_RZ /* truncate */ -} fp_rnd_t; +/* Deprecated historical FPU control interface */ -/* - * Precision (i.e., rounding precision) modes. - */ -typedef enum { - FP_PS=0, /* 24 bit (single-precision) */ - FP_PRS, /* reserved */ - FP_PD, /* 53 bit (double-precision) */ - FP_PE /* 64 bit (extended-precision) */ -} fp_prec_t; - -#define fp_except_t int - -/* - * Exception bit masks. - */ -#define FP_X_INV 0x01 /* invalid operation */ -#define FP_X_DNML 0x02 /* denormal */ -#define FP_X_DZ 0x04 /* zero divide */ -#define FP_X_OFL 0x08 /* overflow */ -#define FP_X_UFL 0x10 /* underflow */ -#define FP_X_IMP 0x20 /* (im)precision */ -#define FP_X_STK 0x40 /* stack fault */ - -/* - * FPU control word bit-field masks. - */ -#define FP_MSKS_FLD 0x3f /* exception masks field */ -#define FP_PRC_FLD 0x300 /* precision control field */ -#define FP_RND_FLD 0xc00 /* rounding control field */ +#include /* - * FPU status word bit-field masks. + * IEEE floating point type, constant and function definitions. + * XXX: {FP,SSE}*FLD and {FP,SSE}*OFF are undocumented pollution. */ -#define FP_STKY_FLD 0x3f /* sticky flags field */ /* * SSE mxcsr register bit-field masks. @@ -105,18 +58,6 @@ #define SSE_RND_FLD 0x6000 /* rounding control */ #define SSE_FZ_FLD 0x8000 /* flush to zero on underflow */ -/* - * FPU control word bit-field offsets (shift counts). - */ -#define FP_MSKS_OFF 0 /* exception masks offset */ -#define FP_PRC_OFF 8 /* precision control offset */ -#define FP_RND_OFF 10 /* rounding control offset */ - -/* - * FPU status word bit-field offsets (shift counts). - */ -#define FP_STKY_OFF 0 /* sticky flags offset */ - /* * SSE mxcsr register bit-field offsets (shift counts). */ @@ -128,43 +69,6 @@ #ifdef __GNUCLIKE_ASM -#define __fldcw(addr) __asm __volatile("fldcw %0" : : "m" (*(addr))) -#define __fldenv(addr) __asm __volatile("fldenv %0" : : "m" (*(addr))) -#define __fnclex() __asm __volatile("fnclex") -#define __fnstcw(addr) __asm __volatile("fnstcw %0" : "=m" (*(addr))) -#define __fnstenv(addr) __asm __volatile("fnstenv %0" : "=m" (*(addr))) -#define __fnstsw(addr) __asm __volatile("fnstsw %0" : "=m" (*(addr))) -#define __ldmxcsr(addr) __asm __volatile("ldmxcsr %0" : : "m" (*(addr))) -#define __stmxcsr(addr) __asm __volatile("stmxcsr %0" : "=m" (*(addr))) - -/* - * Load the control word. Be careful not to trap if there is a currently - * unmasked exception (ones that will become freshly unmasked are not a - * problem). This case must be handled by a save/restore of the - * environment or even of the full x87 state. Accessing the environment - * is very inefficient, so only do it when necessary. - */ -static __inline void -__fnldcw(unsigned short _cw, unsigned short _newcw) -{ - struct { - unsigned _cw; - unsigned _other[6]; - } _env; - unsigned short _sw; - - if ((_cw & FP_MSKS_FLD) != FP_MSKS_FLD) { - __fnstsw(&_sw); - if (((_sw & ~_cw) & FP_STKY_FLD) != 0) { - __fnstenv(&_env); - _env._cw = _newcw; - __fldenv(&_env); - return; - } - } - __fldcw(&_newcw); -} - /* * General notes about conflicting SSE vs FP status bits. * This code assumes that software will not fiddle with the control diff --git a/sys/i386/include/ieeefp.h b/sys/i386/include/ieeefp.h --- a/sys/i386/include/ieeefp.h +++ b/sys/i386/include/ieeefp.h @@ -40,113 +40,12 @@ #ifndef _MACHINE_IEEEFP_H_ #define _MACHINE_IEEEFP_H_ -/* - * Deprecated historical FPU control interface - * - * IEEE floating point type, constant and function definitions. - * XXX: FP*FLD and FP*OFF are undocumented pollution. - */ - -#ifndef _SYS_CDEFS_H_ -#error this file needs sys/cdefs.h as a prerequisite -#endif - -/* - * Rounding modes. - */ -typedef enum { - FP_RN=0, /* round to nearest */ - FP_RM, /* round down towards minus infinity */ - FP_RP, /* round up towards plus infinity */ - FP_RZ /* truncate */ -} fp_rnd_t; - -/* - * Precision (i.e., rounding precision) modes. - */ -typedef enum { - FP_PS=0, /* 24 bit (single-precision) */ - FP_PRS, /* reserved */ - FP_PD, /* 53 bit (double-precision) */ - FP_PE /* 64 bit (extended-precision) */ -} fp_prec_t; +/* Deprecated historical FPU control interface */ -#define fp_except_t int - -/* - * Exception bit masks. - */ -#define FP_X_INV 0x01 /* invalid operation */ -#define FP_X_DNML 0x02 /* denormal */ -#define FP_X_DZ 0x04 /* zero divide */ -#define FP_X_OFL 0x08 /* overflow */ -#define FP_X_UFL 0x10 /* underflow */ -#define FP_X_IMP 0x20 /* (im)precision */ -#define FP_X_STK 0x40 /* stack fault */ - -/* - * FPU control word bit-field masks. - */ -#define FP_MSKS_FLD 0x3f /* exception masks field */ -#define FP_PRC_FLD 0x300 /* precision control field */ -#define FP_RND_FLD 0xc00 /* rounding control field */ - -/* - * FPU status word bit-field masks. - */ -#define FP_STKY_FLD 0x3f /* sticky flags field */ - -/* - * FPU control word bit-field offsets (shift counts). - */ -#define FP_MSKS_OFF 0 /* exception masks offset */ -#define FP_PRC_OFF 8 /* precision control offset */ -#define FP_RND_OFF 10 /* rounding control offset */ - -/* - * FPU status word bit-field offsets (shift counts). - */ -#define FP_STKY_OFF 0 /* sticky flags offset */ +#include #ifdef __GNUCLIKE_ASM -#define __fldcw(addr) __asm __volatile("fldcw %0" : : "m" (*(addr))) -#define __fldenv(addr) __asm __volatile("fldenv %0" : : "m" (*(addr))) -#define __fnclex() __asm __volatile("fnclex") -#define __fnstcw(addr) __asm __volatile("fnstcw %0" : "=m" (*(addr))) -#define __fnstenv(addr) __asm __volatile("fnstenv %0" : "=m" (*(addr))) -#define __fnstsw(addr) __asm __volatile("fnstsw %0" : "=m" (*(addr))) -#define __ldmxcsr(addr) __asm __volatile("ldmxcsr %0" : : "m" (*(addr))) -#define __stmxcsr(addr) __asm __volatile("stmxcsr %0" : "=m" (*(addr))) - -/* - * Load the control word. Be careful not to trap if there is a currently - * unmasked exception (ones that will become freshly unmasked are not a - * problem). This case must be handled by a save/restore of the - * environment or even of the full x87 state. Accessing the environment - * is very inefficient, so only do it when necessary. - */ -static __inline void -__fnldcw(unsigned short _cw, unsigned short _newcw) -{ - struct { - unsigned _cw; - unsigned _other[6]; - } _env; - unsigned short _sw; - - if ((_cw & FP_MSKS_FLD) != FP_MSKS_FLD) { - __fnstsw(&_sw); - if (((_sw & ~_cw) & FP_STKY_FLD) != 0) { - __fnstenv(&_env); - _env._cw = _newcw; - __fldenv(&_env); - return; - } - } - __fldcw(&_newcw); -} - static __inline fp_rnd_t fpgetround(void) { diff --git a/sys/i386/include/ieeefp.h b/sys/x86/include/x86_ieeefp.h copy from sys/i386/include/ieeefp.h copy to sys/x86/include/x86_ieeefp.h --- a/sys/i386/include/ieeefp.h +++ b/sys/x86/include/x86_ieeefp.h @@ -37,14 +37,14 @@ * $FreeBSD$ */ -#ifndef _MACHINE_IEEEFP_H_ -#define _MACHINE_IEEEFP_H_ +#ifndef _X86_X86_IEEEFP_H_ +#define _X86_X86_IEEEFP_H_ + +/* Deprecated historical FPU control interface */ /* - * Deprecated historical FPU control interface - * * IEEE floating point type, constant and function definitions. - * XXX: FP*FLD and FP*OFF are undocumented pollution. + * XXX: {FP,SSE}*FLD and {FP,SSE}*OFF are undocumented pollution. */ #ifndef _SYS_CDEFS_H_ @@ -147,116 +147,6 @@ __fldcw(&_newcw); } -static __inline fp_rnd_t -fpgetround(void) -{ - unsigned short _cw; - - __fnstcw(&_cw); - return ((fp_rnd_t)((_cw & FP_RND_FLD) >> FP_RND_OFF)); -} - -static __inline fp_rnd_t -fpsetround(fp_rnd_t _m) -{ - fp_rnd_t _p; - unsigned short _cw, _newcw; - - __fnstcw(&_cw); - _p = (fp_rnd_t)((_cw & FP_RND_FLD) >> FP_RND_OFF); - _newcw = _cw & ~FP_RND_FLD; - _newcw |= (_m << FP_RND_OFF) & FP_RND_FLD; - __fnldcw(_cw, _newcw); - return (_p); -} - -static __inline fp_prec_t -fpgetprec(void) -{ - unsigned short _cw; - - __fnstcw(&_cw); - return ((fp_prec_t)((_cw & FP_PRC_FLD) >> FP_PRC_OFF)); -} - -static __inline fp_prec_t -fpsetprec(fp_prec_t _m) -{ - fp_prec_t _p; - unsigned short _cw, _newcw; - - __fnstcw(&_cw); - _p = (fp_prec_t)((_cw & FP_PRC_FLD) >> FP_PRC_OFF); - _newcw = _cw & ~FP_PRC_FLD; - _newcw |= (_m << FP_PRC_OFF) & FP_PRC_FLD; - __fnldcw(_cw, _newcw); - return (_p); -} - -/* - * Get or set the exception mask. - * Note that the x87 mask bits are inverted by the API -- a mask bit of 1 - * means disable for x87 and SSE, but for fp*mask() it means enable. - */ - -static __inline fp_except_t -fpgetmask(void) -{ - unsigned short _cw; - - __fnstcw(&_cw); - return ((~_cw & FP_MSKS_FLD) >> FP_MSKS_OFF); -} - -static __inline fp_except_t -fpsetmask(fp_except_t _m) -{ - fp_except_t _p; - unsigned short _cw, _newcw; - - __fnstcw(&_cw); - _p = (~_cw & FP_MSKS_FLD) >> FP_MSKS_OFF; - _newcw = _cw & ~FP_MSKS_FLD; - _newcw |= (~_m << FP_MSKS_OFF) & FP_MSKS_FLD; - __fnldcw(_cw, _newcw); - return (_p); -} - -static __inline fp_except_t -fpgetsticky(void) -{ - unsigned _ex; - unsigned short _sw; - - __fnstsw(&_sw); - _ex = (_sw & FP_STKY_FLD) >> FP_STKY_OFF; - return ((fp_except_t)_ex); -} - -static __inline fp_except_t -fpresetsticky(fp_except_t _m) -{ - struct { - unsigned _cw; - unsigned _sw; - unsigned _other[5]; - } _env; - fp_except_t _p; - - _m &= FP_STKY_FLD >> FP_STKY_OFF; - _p = fpgetsticky(); - if ((_p & ~_m) == _p) - return (_p); - if ((_p & ~_m) == 0) { - __fnclex(); - return (_p); - } - __fnstenv(&_env); - _env._sw &= ~_m; - __fldenv(&_env); - return (_p); -} - #endif /* __GNUCLIKE_ASM */ -#endif /* !_MACHINE_IEEEFP_H_ */ +#endif/* _X86_X86_IEEEFP_H_ */