Date: Mon, 21 Jul 2003 20:04:38 -0700 (PDT) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 34809 for review Message-ID: <200307220304.h6M34cZf031637@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=34809 Change 34809 by peter@peter_hammer on 2003/07/21 20:03:40 flip-flop again. Dont give into the C++ evilness. Instead, instantiate the fp*() functions in libc and have C++ call it there. This also makes it more easily available to non-gcc apps. Affected files ... .. //depot/projects/hammer/lib/libc/amd64/gen/Makefile.inc#11 edit .. //depot/projects/hammer/lib/libc/amd64/gen/fpgetmask.c#1 add .. //depot/projects/hammer/lib/libc/amd64/gen/fpgetprec.c#1 add .. //depot/projects/hammer/lib/libc/amd64/gen/fpgetround.c#1 add .. //depot/projects/hammer/lib/libc/amd64/gen/fpgetsticky.c#1 add .. //depot/projects/hammer/lib/libc/amd64/gen/fpsetmask.c#1 add .. //depot/projects/hammer/lib/libc/amd64/gen/fpsetprec.c#1 add .. //depot/projects/hammer/lib/libc/amd64/gen/fpsetround.c#1 add .. //depot/projects/hammer/lib/libc/amd64/gen/fpsetsticky.c#1 add .. //depot/projects/hammer/sys/amd64/include/ieeefp.h#6 edit Differences ... ==== //depot/projects/hammer/lib/libc/amd64/gen/Makefile.inc#11 (text+ko) ==== @@ -4,4 +4,7 @@ SRCS+= _setjmp.S setjmp.S sigsetjmp.S \ fabs.S modf.S \ frexp.c infinity.c isinf.c ldexp.c \ - makecontext.c signalcontext.c + makecontext.c signalcontext.c \ + fpgetmask.c fpsetmask.c fpgetprec.c fpsetprec.c \ + fpgetround.c fpsetround.c fpgetsticky.c fpsetsticky.c + ==== //depot/projects/hammer/sys/amd64/include/ieeefp.h#6 (text+ko) ==== @@ -111,7 +111,7 @@ #define SSE_RND_OFF 13 /* rounding control offset */ #define SSE_FZ_OFF 15 /* flush to zero offset */ -#ifdef __GNUC__ +#if defined(__GNUC__) && !defined(__cplusplus) #define __fldenv(addr) __asm __volatile("fldenv %0" : : "m" (*(addr))) #define __fnstenv(addr) __asm __volatile("fnstenv %0" : "=m" (*(addr))) @@ -134,53 +134,23 @@ /* Set rounding control */ static __inline__ fp_rnd_t -fpgetround(void) +__fpgetround(void) { unsigned short _cw; __fnstcw(&_cw); -#ifndef __cplusplus return ((_cw & FP_RND_FLD) >> FP_RND_OFF); -#else - switch ((_cw & FP_RND_FLD) >> FP_RND_OFF) { - case FP_RN: - return FP_RN; - case FP_RM: - return FP_RM; - case FP_RP: - return FP_RP; - case FP_RZ: - return FP_RZ; - } -#endif } static __inline__ fp_rnd_t -fpsetround(fp_rnd_t _m) +__fpsetround(fp_rnd_t _m) { unsigned short _cw; unsigned int _mxcsr; fp_rnd_t _p; __fnstcw(&_cw); -#ifndef __cplusplus _p = (_cw & FP_RND_FLD) >> FP_RND_OFF; -#else - switch ((_cw & FP_RND_FLD) >> FP_RND_OFF) { - case FP_RN: - _p = FP_RN; - break; - case FP_RM: - _p = FP_RM; - break; - case FP_RP: - _p = FP_RP; - break; - case FP_RZ: - _p = FP_RZ; - break; - } -#endif _cw &= ~FP_RND_FLD; _cw |= (_m << FP_RND_OFF) & FP_RND_FLD; __fldcw(&_cw); @@ -197,52 +167,22 @@ * in 64 bit precision mode for SSE2 calculations. */ static __inline__ fp_prec_t -fpgetprec(void) +__fpgetprec(void) { unsigned short _cw; __fnstcw(&_cw); -#ifndef __cplusplus return ((_cw & FP_PRC_FLD) >> FP_PRC_OFF); -#else - switch ((_cw & FP_PRC_FLD) >> FP_PRC_OFF) { - case FP_PS: - return FP_PS; - case FP_PRS: - return FP_PRS; - case FP_PD: - return FP_PD; - case FP_PE: - return FP_PE; - } -#endif } static __inline__ fp_prec_t -fpsetprec(fp_rnd_t _m) +__fpsetprec(fp_rnd_t _m) { unsigned short _cw; fp_prec_t _p; __fnstcw(&_cw); -#ifndef __cplusplus _p = (_cw & FP_PRC_FLD) >> FP_PRC_OFF; -#else - switch ((_cw & FP_PRC_FLD) >> FP_PRC_OFF) { - case FP_PS: - _p = FP_PS; - break; - case FP_PRS: - _p = FP_PRS; - break; - case FP_PD: - _p = FP_PD; - break; - case FP_PE: - _p = FP_PE; - break; - } -#endif _cw &= ~FP_PRC_FLD; _cw |= (_m << FP_PRC_OFF) & FP_PRC_FLD; __fldcw(&_cw); @@ -256,7 +196,7 @@ * for the fp*() api, mask = 1 means enabled. */ static __inline__ fp_except_t -fpgetmask(void) +__fpgetmask(void) { unsigned short _cw; @@ -265,7 +205,7 @@ } static __inline__ fp_except_t -fpsetmask(fp_except_t _m) +__fpsetmask(fp_except_t _m) { unsigned short _cw; unsigned int _mxcsr; @@ -286,7 +226,7 @@ /* See which sticky exceptions are pending, and reset them */ static __inline__ fp_except_t -fpgetsticky(void) +__fpgetsticky(void) { unsigned short _sw; unsigned int _mxcsr; @@ -299,8 +239,9 @@ return (_ex); } +/* Note that this should really be called fpresetsticky() */ static __inline__ fp_except_t -fpresetsticky(fp_except_t _m) +__fpsetsticky(fp_except_t _m) { unsigned _env[7]; unsigned int _mxcsr; @@ -317,13 +258,23 @@ return (_p); } -/* It is called fpsetsticky(), but is really a reset function */ -#define fpsetsticky(m) fpresetsticky(m) +#endif /* __GNUC__ && !__cplusplus */ + +#if !defined(__IEEEFP_NOINLINES__) && !defined(__cplusplus) + +#define fpsetround() __fpsetround() +#define fpgetround(_m) __fpgetround(_m) +#define fpgetprec() __fpgetprec() +#define fpsetprec(_m) __fpsetprec(_m) +#define fpgetmask() __fpgetmask() +#define fpsetmask(_m) __fpsetmask(_m) +#define fpgetsticky() __fpgetsticky() +#define fpsetsticky(_m) __fpsetsticky(_m) /* Suppress prototypes in the MI header. */ #define _IEEEFP_INLINED_ 1 -#else /* __GNUC__ */ +#else /* !__IEEEFP_NOINLINES__ && !__cplusplus */ /* Augment the userland declarations */ __BEGIN_DECLS @@ -331,6 +282,6 @@ extern fp_prec_t fpsetprec(fp_prec_t); __END_DECLS -#endif /* __GNUC__ */ +#endif /* !__IEEEFP_NOINLINES__ && !__cplusplus */ #endif /* !_MACHINE_IEEEFP_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200307220304.h6M34cZf031637>