From owner-p4-projects@FreeBSD.ORG Sat Sep 2 16:11:01 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C72B616A4E0; Sat, 2 Sep 2006 16:11:01 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 79F3C16A4DE for ; Sat, 2 Sep 2006 16:11:01 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 3840343D72 for ; Sat, 2 Sep 2006 16:10:56 +0000 (GMT) (envelope-from gonzo@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k82GAtwt032536 for ; Sat, 2 Sep 2006 16:10:55 GMT (envelope-from gonzo@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k82GAtcb032532 for perforce@freebsd.org; Sat, 2 Sep 2006 16:10:55 GMT (envelope-from gonzo@FreeBSD.org) Date: Sat, 2 Sep 2006 16:10:55 GMT Message-Id: <200609021610.k82GAtcb032532@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gonzo@FreeBSD.org using -f From: Oleksandr Tymoshenko To: Perforce Change Reviews Cc: Subject: PERFORCE change 105541 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 02 Sep 2006 16:11:02 -0000 http://perforce.freebsd.org/chv.cgi?CH=105541 Change 105541 by gonzo@gonzo_hideout on 2006/09/02 16:10:19 o Threw away amd64 floating point legacy. Affected files ... .. //depot/projects/mips2/src/sys/mips/include/ieeefp.h#2 edit Differences ... ==== //depot/projects/mips2/src/sys/mips/include/ieeefp.h#2 (text+ko) ==== @@ -46,235 +46,20 @@ #error this file needs sys/cdefs.h as a prerequisite #endif -/* - * FP rounding modes - */ +typedef int fp_except; +#define FP_X_IMP 0x01 /* imprecise (loss of precision) */ +#define FP_X_UFL 0x02 /* underflow exception */ +#define FP_X_OFL 0x04 /* overflow exception */ +#define FP_X_DZ 0x08 /* divide-by-zero exception */ +#define FP_X_INV 0x10 /* invalid operation exception */ + typedef enum { - FP_RN=0, /* round to nearest */ - FP_RM, /* round down to minus infinity */ - FP_RP, /* round up to plus infinity */ - FP_RZ /* truncate */ + FP_RN=0, /* round to nearest representable number */ + FP_RZ=1, /* round to zero (truncate) */ + FP_RP=2, /* round toward positive infinity */ + FP_RM=3 /* round toward negative infinity */ } fp_rnd_t; -/* - * FP 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 -/* - * FP exception 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 */ - -/* - * FP registers - */ -#define FP_MSKS_REG 0 /* exception masks */ -#define FP_PRC_REG 0 /* precision */ -#define FP_RND_REG 0 /* direction */ -#define FP_STKY_REG 1 /* sticky flags */ - -/* - * FP register bit field masks - */ -#define FP_MSKS_FLD 0x3f /* exception masks field */ -#define FP_PRC_FLD 0x300 /* precision control field */ -#define FP_RND_FLD 0xc00 /* round control field */ -#define FP_STKY_FLD 0x3f /* sticky flags field */ - -/* - * SSE mxcsr register bit field masks - */ -#define SSE_STKY_FLD 0x3f /* exception flags */ -#define SSE_DAZ_FLD 0x40 /* Denormals are zero */ -#define SSE_MSKS_FLD 0x1f80 /* exception masks field */ -#define SSE_RND_FLD 0x6000 /* rounding control */ -#define SSE_FZ_FLD 0x8000 /* flush to zero on underflow */ - -/* - * FP register bit field offsets - */ -#define FP_MSKS_OFF 0 /* exception masks offset */ -#define FP_PRC_OFF 8 /* precision control offset */ -#define FP_RND_OFF 10 /* round control offset */ -#define FP_STKY_OFF 0 /* sticky flags offset */ - -/* - * SSE mxcsr register bit field offsets - */ -#define SSE_STKY_OFF 0 /* exception flags offset */ -#define SSE_DAZ_OFF 6 /* DAZ exception mask offset */ -#define SSE_MSKS_OFF 7 /* other exception masks offset */ -#define SSE_RND_OFF 13 /* rounding control offset */ -#define SSE_FZ_OFF 15 /* flush to zero offset */ - -#if defined(__GNUCLIKE_ASM) && defined(__CC_SUPPORTS___INLINE__) \ - && !defined(__cplusplus) - -#define __fldenv(addr) __asm __volatile("fldenv %0" : : "m" (*(addr))) -#define __fnstenv(addr) __asm __volatile("fnstenv %0" : "=m" (*(addr))) -#define __fldcw(addr) __asm __volatile("fldcw %0" : : "m" (*(addr))) -#define __fnstcw(addr) __asm __volatile("fnstcw %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))) - -/* - * General notes about conflicting SSE vs FP status bits. - * This code assumes that software will not fiddle with the control - * bits of the SSE and x87 in such a way to get them out of sync and - * still expect this to work. Break this at your peril. - * Because I based this on the i386 port, the x87 state is used for - * the fpget*() functions, and is shadowed into the SSE state for - * the fpset*() functions. For dual source fpget*() functions, I - * merge the two together. I think. - */ - -/* Set rounding control */ -static __inline__ fp_rnd_t -__fpgetround(void) -{ - unsigned short _cw; - - __fnstcw(&_cw); - return ((_cw & FP_RND_FLD) >> FP_RND_OFF); -} - -static __inline__ fp_rnd_t -__fpsetround(fp_rnd_t _m) -{ - unsigned short _cw; - unsigned int _mxcsr; - fp_rnd_t _p; - - __fnstcw(&_cw); - _p = (_cw & FP_RND_FLD) >> FP_RND_OFF; - _cw &= ~FP_RND_FLD; - _cw |= (_m << FP_RND_OFF) & FP_RND_FLD; - __fldcw(&_cw); - __stmxcsr(&_mxcsr); - _mxcsr &= ~SSE_RND_FLD; - _mxcsr |= (_m << SSE_RND_OFF) & SSE_RND_FLD; - __ldmxcsr(&_mxcsr); - return (_p); -} - -/* - * Set precision for fadd/fsub/fsqrt etc x87 instructions - * There is no equivalent SSE mode or control. - */ -static __inline__ fp_prec_t -__fpgetprec(void) -{ - unsigned short _cw; - - __fnstcw(&_cw); - return ((_cw & FP_PRC_FLD) >> FP_PRC_OFF); -} - -static __inline__ fp_prec_t -__fpsetprec(fp_rnd_t _m) -{ - unsigned short _cw; - fp_prec_t _p; - - __fnstcw(&_cw); - _p = (_cw & FP_PRC_FLD) >> FP_PRC_OFF; - _cw &= ~FP_PRC_FLD; - _cw |= (_m << FP_PRC_OFF) & FP_PRC_FLD; - __fldcw(&_cw); - return (_p); -} - -/* - * Look at the exception masks - * Note that x87 masks are inverse of the fp*() functions - * API. ie: mask = 1 means disable for x87 and SSE, but - * for the fp*() api, mask = 1 means enabled. - */ -static __inline__ fp_except_t -__fpgetmask(void) -{ - unsigned short _cw; - - __fnstcw(&_cw); - return ((~_cw) & FP_MSKS_FLD); -} - -static __inline__ fp_except_t -__fpsetmask(fp_except_t _m) -{ - unsigned short _cw; - unsigned int _mxcsr; - fp_except_t _p; - - __fnstcw(&_cw); - _p = (~_cw) & FP_MSKS_FLD; - _cw &= ~FP_MSKS_FLD; - _cw |= (~_m) & FP_MSKS_FLD; - __fldcw(&_cw); - __stmxcsr(&_mxcsr); - /* XXX should we clear non-ieee SSE_DAZ_FLD and SSE_FZ_FLD ? */ - _mxcsr &= ~SSE_MSKS_FLD; - _mxcsr |= ((~_m) << SSE_MSKS_OFF) & SSE_MSKS_FLD; - __ldmxcsr(&_mxcsr); - return (_p); -} - -/* See which sticky exceptions are pending, and reset them */ -static __inline__ fp_except_t -__fpgetsticky(void) -{ - unsigned short _sw; - unsigned int _mxcsr; - fp_except_t _ex; - - __fnstsw(&_sw); - _ex = _sw & FP_STKY_FLD; - __stmxcsr(&_mxcsr); - _ex |= _mxcsr & SSE_STKY_FLD; - return (_ex); -} - -#endif /* __GNUCLIKE_ASM && __CC_SUPPORTS___INLINE__ && !__cplusplus */ - -#if !defined(__IEEEFP_NOINLINES__) && !defined(__cplusplus) \ - && defined(__GNUCLIKE_ASM) && defined(__CC_SUPPORTS___INLINE__) - -#define fpgetround() __fpgetround() -#define fpsetround(_m) __fpsetround(_m) -#define fpgetprec() __fpgetprec() -#define fpsetprec(_m) __fpsetprec(_m) -#define fpgetmask() __fpgetmask() -#define fpsetmask(_m) __fpsetmask(_m) -#define fpgetsticky() __fpgetsticky() - -/* Suppress prototypes in the MI header. */ -#define _IEEEFP_INLINED_ 1 - -#else /* !__IEEEFP_NOINLINES__ && !__cplusplus && __GNUCLIKE_ASM - && __CC_SUPPORTS___INLINE__ */ - -/* Augment the userland declarations */ -__BEGIN_DECLS -extern fp_prec_t fpgetprec(void); -extern fp_prec_t fpsetprec(fp_prec_t); -__END_DECLS - -#endif /* !__IEEEFP_NOINLINES__ && !__cplusplus && __GNUCLIKE_ASM - && __CC_SUPPORTS___INLINE__ */ - #endif /* !_MACHINE_IEEEFP_H_ */