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_ */

Reply via email to