Marcel Moolenaar wrote: > On Sun, Jan 12, 2003 at 06:27:00PM -0800, Terry Lambert wrote: > > Therefore, it seems to me, that the correct place to put them is in > > the <machine/floatingpoint.h> header (the other alternative was the > > <machine/ieeefp.h> header; this seemed wrong to me, but I'm willing > > to reroll the patch, if there's a lot of disagreement over this point). > > I would like to see it in <machine/ieeefp.h>:
Here is the patch, made this way instead. It's about 4 times larger. Pick which one you like, and commit it to make Kris happy. -- Terry
Index: include/ieeefp.h =================================================================== RCS file: /cvs/src/include/ieeefp.h,v retrieving revision 1.6 diff -c -r1.6 ieeefp.h *** include/ieeefp.h 23 Mar 2002 17:24:53 -0000 1.6 --- include/ieeefp.h 13 Jan 2003 00:59:42 -0000 *************** *** 9,28 **** #ifndef _IEEEFP_H_ #define _IEEEFP_H_ - #include <sys/cdefs.h> #include <machine/ieeefp.h> - - #ifdef __i386__ - #include <machine/floatingpoint.h> - #else /* !__i386__ */ - __BEGIN_DECLS - extern fp_rnd_t fpgetround(void); - extern fp_rnd_t fpsetround(fp_rnd_t); - extern fp_except_t fpgetmask(void); - extern fp_except_t fpsetmask(fp_except_t); - extern fp_except_t fpgetsticky(void); - extern fp_except_t fpsetsticky(fp_except_t); - __END_DECLS - #endif /* __i386__ */ #endif /* _IEEEFP_H_ */ --- 9,14 ---- Index: sys/alpha/include/ieeefp.h =================================================================== RCS file: /cvs/src/sys/alpha/include/ieeefp.h,v retrieving revision 1.5 diff -c -r1.5 ieeefp.h *** sys/alpha/include/ieeefp.h 10 May 2000 19:41:40 -0000 1.5 --- sys/alpha/include/ieeefp.h 13 Jan 2003 01:02:21 -0000 *************** *** 9,14 **** --- 9,16 ---- #ifndef _ALPHA_IEEEFP_H_ #define _ALPHA_IEEEFP_H_ + #include <sys/cdefs.h> + typedef int fp_except_t; #define FP_X_INV (1LL << 1) /* invalid operation exception */ #define FP_X_DZ (1LL << 2) /* divide-by-zero exception */ *************** *** 25,29 **** --- 27,43 ---- FP_RN=2, /* round to nearest representable number */ FP_RP=3 /* round toward positive infinity */ } fp_rnd_t; + + /* + * SysV/386 FP control interface for platforms with library implementations + */ + __BEGIN_DECLS + extern fp_rnd_t fpgetround(void); + extern fp_rnd_t fpsetround(fp_rnd_t); + extern fp_except_t fpgetmask(void); + extern fp_except_t fpsetmask(fp_except_t); + extern fp_except_t fpgetsticky(void); + extern fp_except_t fpsetsticky(fp_except_t); + __END_DECLS #endif /* _ALPHA_IEEEFP_H_ */ Index: sys/alpha/include/floatingpoint.h =================================================================== RCS file: /cvs/src/sys/alpha/include/floatingpoint.h,v retrieving revision 1.3 diff -c -r1.3 floatingpoint.h *** sys/alpha/include/floatingpoint.h 1 May 2000 20:17:49 -0000 1.3 --- sys/alpha/include/floatingpoint.h 13 Jan 2003 01:10:07 -0000 *************** *** 32,35 **** --- 32,40 ---- * $FreeBSD: src/sys/alpha/include/floatingpoint.h,v 1.3 2000/05/01 20:17:49 peter Exp $ */ + #ifndef _FLOATINGPOINT_H_ + #define _FLOATINGPOINT_H_ + #include <machine/ieeefp.h> + + #endif /* !_FLOATINGPOINT_H_ */ Index: sys/i386/include/ieeefp.h =================================================================== RCS file: /cvs/src/sys/i386/include/ieeefp.h,v retrieving revision 1.7 diff -c -r1.7 ieeefp.h *** sys/i386/include/ieeefp.h 28 Aug 1999 00:44:15 -0000 1.7 --- sys/i386/include/ieeefp.h 13 Jan 2003 01:06:06 -0000 *************** *** 41,46 **** --- 41,48 ---- #ifndef _MACHINE_IEEEFP_H_ #define _MACHINE_IEEEFP_H_ + #include <sys/cdefs.h> + /* * FP rounding modes */ *************** *** 97,101 **** --- 99,186 ---- #define FP_PRC_OFF 8 /* precision control offset */ #define FP_RND_OFF 10 /* round control offset */ #define FP_STKY_OFF 0 /* sticky flags offset */ + + /*- + * XXX the following undocumented pollution is exported: + * fpsetsticky(). + * FP*FLD, FP*OFF and FP*REG from <machine/ieeefp.h> + */ + + #ifdef __GNUC__ + + #define __fldenv(addr) __asm __volatile("fldenv %0" : : "m" (*(addr))) + #define __fnstenv(addr) __asm __volatile("fnstenv %0" : "=m" (*(addr))) + #define __fnstcw(addr) __asm __volatile("fnstcw %0" : "=m" (*(addr))) + #define __fnstsw(addr) __asm __volatile("fnstsw %0" : "=m" (*(addr))) + + /* + * return the contents of a FP register + */ + static __inline__ int + __fpgetreg(int _reg) + { + unsigned short _mem; + + /*- + * This is more efficient than it looks. The switch gets optimized + * away if _reg is constant. + * + * The default case only supports _reg == 0. We could handle more + * registers (e.g., tags) using fnstenv, but the interface doesn't + * support more. + */ + switch(_reg) { + default: + __fnstcw(&_mem); + break; + case FP_STKY_REG: + __fnstsw(&_mem); + break; + } + return _mem; + } + + /* + * set a FP mode; return previous mode + */ + static __inline__ int + __fpsetreg(int _m, int _reg, int _fld, int _off) + { + unsigned _env[7]; + unsigned _p; + + /* + * _reg == 0 could be handled better using fnstcw/fldcw. + */ + __fnstenv(_env); + _p = (_env[_reg] & _fld) >> _off; + _env[_reg] = (_env[_reg] & ~_fld) | (_m << _off & _fld); + __fldenv(_env); + return _p; + } + + #endif /* __GNUC__ */ + + /* + * SysV/386 FP control interface + */ + #define fpgetround() ((fp_rnd_t) \ + ((__fpgetreg(FP_RND_REG) & FP_RND_FLD) >> FP_RND_OFF)) + #define fpsetround(m) ((fp_rnd_t) \ + __fpsetreg((m), FP_RND_REG, FP_RND_FLD, FP_RND_OFF)) + #define fpgetprec() ((fp_prec_t) \ + ((__fpgetreg(FP_PRC_REG) & FP_PRC_FLD) >> FP_PRC_OFF)) + #define fpsetprec(m) ((fp_prec_t) \ + __fpsetreg((m), FP_PRC_REG, FP_PRC_FLD, FP_PRC_OFF)) + #define fpgetmask() ((fp_except_t) \ + ((~__fpgetreg(FP_MSKS_REG) & FP_MSKS_FLD) >> FP_MSKS_OFF)) + #define fpsetmask(m) ((fp_except_t) \ + (~__fpsetreg(~(m), FP_MSKS_REG, FP_MSKS_FLD, FP_MSKS_OFF)) & \ + (FP_MSKS_FLD >> FP_MSKS_OFF)) + #define fpgetsticky() ((fp_except_t) \ + ((__fpgetreg(FP_STKY_REG) & FP_STKY_FLD) >> FP_STKY_OFF)) + #define fpresetsticky(m) ((fp_except_t) \ + __fpsetreg(0, FP_STKY_REG, (m), FP_STKY_OFF)) + #define fpsetsticky(m) fpresetsticky(m) #endif /* !_MACHINE_IEEEFP_H_ */ Index: sys/i386/include/floatingpoint.h =================================================================== RCS file: /cvs/src/sys/i386/include/floatingpoint.h,v retrieving revision 1.12 diff -c -r1.12 floatingpoint.h *** sys/i386/include/floatingpoint.h 1 Jun 2002 17:39:46 -0000 1.12 --- sys/i386/include/floatingpoint.h 13 Jan 2003 01:10:33 -0000 *************** *** 37,130 **** #ifndef _FLOATINGPOINT_H_ #define _FLOATINGPOINT_H_ - /* - * IEEE floating point structure and function definitions - */ - - /*- - * XXX the following undocumented pollution is exported: - * fpsetsticky(). - * FP*FLD, FP*OFF and FP*REG from <machine/ieeefp.h> - */ - - #include <sys/cdefs.h> #include <machine/ieeefp.h> - - #ifdef __GNUC__ - - #define __fldenv(addr) __asm __volatile("fldenv %0" : : "m" (*(addr))) - #define __fnstenv(addr) __asm __volatile("fnstenv %0" : "=m" (*(addr))) - #define __fnstcw(addr) __asm __volatile("fnstcw %0" : "=m" (*(addr))) - #define __fnstsw(addr) __asm __volatile("fnstsw %0" : "=m" (*(addr))) - - /* - * return the contents of a FP register - */ - static __inline__ int - __fpgetreg(int _reg) - { - unsigned short _mem; - - /*- - * This is more efficient than it looks. The switch gets optimized - * away if _reg is constant. - * - * The default case only supports _reg == 0. We could handle more - * registers (e.g., tags) using fnstenv, but the interface doesn't - * support more. - */ - switch(_reg) { - default: - __fnstcw(&_mem); - break; - case FP_STKY_REG: - __fnstsw(&_mem); - break; - } - return _mem; - } - - /* - * set a FP mode; return previous mode - */ - static __inline__ int - __fpsetreg(int _m, int _reg, int _fld, int _off) - { - unsigned _env[7]; - unsigned _p; - - /* - * _reg == 0 could be handled better using fnstcw/fldcw. - */ - __fnstenv(_env); - _p = (_env[_reg] & _fld) >> _off; - _env[_reg] = (_env[_reg] & ~_fld) | (_m << _off & _fld); - __fldenv(_env); - return _p; - } - - #endif /* __GNUC__ */ - - /* - * SysV/386 FP control interface - */ - #define fpgetround() ((fp_rnd_t) \ - ((__fpgetreg(FP_RND_REG) & FP_RND_FLD) >> FP_RND_OFF)) - #define fpsetround(m) ((fp_rnd_t) \ - __fpsetreg((m), FP_RND_REG, FP_RND_FLD, FP_RND_OFF)) - #define fpgetprec() ((fp_prec_t) \ - ((__fpgetreg(FP_PRC_REG) & FP_PRC_FLD) >> FP_PRC_OFF)) - #define fpsetprec(m) ((fp_prec_t) \ - __fpsetreg((m), FP_PRC_REG, FP_PRC_FLD, FP_PRC_OFF)) - #define fpgetmask() ((fp_except_t) \ - ((~__fpgetreg(FP_MSKS_REG) & FP_MSKS_FLD) >> FP_MSKS_OFF)) - #define fpsetmask(m) ((fp_except_t) \ - (~__fpsetreg(~(m), FP_MSKS_REG, FP_MSKS_FLD, FP_MSKS_OFF)) & \ - (FP_MSKS_FLD >> FP_MSKS_OFF)) - #define fpgetsticky() ((fp_except_t) \ - ((__fpgetreg(FP_STKY_REG) & FP_STKY_FLD) >> FP_STKY_OFF)) - #define fpresetsticky(m) ((fp_except_t) \ - __fpsetreg(0, FP_STKY_REG, (m), FP_STKY_OFF)) - #define fpsetsticky(m) fpresetsticky(m) #endif /* !_FLOATINGPOINT_H_ */ --- 37,42 ---- Index: sys/ia64/include/ieeefp.h =================================================================== RCS file: /cvs/src/sys/ia64/include/ieeefp.h,v retrieving revision 1.3 diff -c -r1.3 ieeefp.h *** sys/ia64/include/ieeefp.h 13 May 2002 05:01:05 -0000 1.3 --- sys/ia64/include/ieeefp.h 13 Jan 2003 01:03:01 -0000 *************** *** 29,34 **** --- 29,35 ---- #ifndef _MACHINE_IEEEFP_H_ #define _MACHINE_IEEEFP_H_ + #include <sys/cdefs.h> #include <machine/fpu.h> typedef int fp_except_t; *************** *** 47,51 **** --- 48,64 ---- FP_RN=2, /* round to nearest representable number */ FP_RP=3 /* round toward positive infinity */ } fp_rnd_t; + + /* + * SysV/386 FP control interface for platforms with library implementations + */ + __BEGIN_DECLS + extern fp_rnd_t fpgetround(void); + extern fp_rnd_t fpsetround(fp_rnd_t); + extern fp_except_t fpgetmask(void); + extern fp_except_t fpsetmask(fp_except_t); + extern fp_except_t fpgetsticky(void); + extern fp_except_t fpsetsticky(fp_except_t); + __END_DECLS #endif /* _MACHINE_IEEEFP_H_ */ Index: sys/ia64/include/floatingpoint.h =================================================================== RCS file: /cvs/src/sys/ia64/include/floatingpoint.h,v retrieving revision 1.1 diff -c -r1.1 floatingpoint.h *** sys/ia64/include/floatingpoint.h 29 Sep 2000 13:46:05 -0000 1.1 --- sys/ia64/include/floatingpoint.h 13 Jan 2003 01:10:53 -0000 *************** *** 32,35 **** --- 32,40 ---- * $FreeBSD: src/sys/ia64/include/floatingpoint.h,v 1.1 2000/09/29 13:46:05 dfr Exp $ */ + #ifndef _FLOATINGPOINT_H_ + #define _FLOATINGPOINT_H_ + #include <machine/ieeefp.h> + + #endif /* !_FLOATINGPOINT_H_ */ Index: sys/powerpc/include/ieeefp.h =================================================================== RCS file: /cvs/src/sys/powerpc/include/ieeefp.h,v retrieving revision 1.1 diff -c -r1.1 ieeefp.h *** sys/powerpc/include/ieeefp.h 13 May 2002 07:44:42 -0000 1.1 --- sys/powerpc/include/ieeefp.h 13 Jan 2003 01:03:26 -0000 *************** *** 8,13 **** --- 8,15 ---- #ifndef _MACHINE_IEEEFP_H_ #define _MACHINE_IEEEFP_H_ + #include <sys/cdefs.h> + typedef int fp_except_t; #define FP_X_IMP 0x01 /* imprecise (loss of precision) */ #define FP_X_DZ 0x02 /* divide-by-zero exception */ *************** *** 21,25 **** --- 23,39 ---- FP_RP=2, /* round toward positive infinity */ FP_RM=3 /* round toward negative infinity */ } fp_rnd_t; + + /* + * SysV/386 FP control interface for platforms with library implementations + */ + __BEGIN_DECLS + extern fp_rnd_t fpgetround(void); + extern fp_rnd_t fpsetround(fp_rnd_t); + extern fp_except_t fpgetmask(void); + extern fp_except_t fpsetmask(fp_except_t); + extern fp_except_t fpgetsticky(void); + extern fp_except_t fpsetsticky(fp_except_t); + __END_DECLS #endif /* _MACHINE_IEEEFP_H_ */ Index: sys/sparc64/include/ieeefp.h =================================================================== RCS file: /cvs/src/sys/sparc64/include/ieeefp.h,v retrieving revision 1.3 diff -c -r1.3 ieeefp.h *** sys/sparc64/include/ieeefp.h 14 Sep 2002 18:00:44 -0000 1.3 --- sys/sparc64/include/ieeefp.h 13 Jan 2003 01:03:41 -0000 *************** *** 7,12 **** --- 7,13 ---- #ifndef _MACHINE_IEEEFP_H_ #define _MACHINE_IEEEFP_H_ + #include <sys/cdefs.h> #include <machine/fsr.h> typedef int fp_except_t; *************** *** 22,26 **** --- 23,39 ---- FP_RP = FSR_RD_PINF, /* round toward positive infinity */ FP_RM = FSR_RD_NINF /* round toward negative infinity */ } fp_rnd_t; + + /* + * SysV/386 FP control interface for platforms with library implementations + */ + __BEGIN_DECLS + extern fp_rnd_t fpgetround(void); + extern fp_rnd_t fpsetround(fp_rnd_t); + extern fp_except_t fpgetmask(void); + extern fp_except_t fpsetmask(fp_except_t); + extern fp_except_t fpgetsticky(void); + extern fp_except_t fpsetsticky(fp_except_t); + __END_DECLS #endif /* _MACHINE_IEEEFP_H_ */