floatingpoint.h (3df129097bfa8c102c3118fe880388b144519f4a) | floatingpoint.h (24a82630a20b64577bcc7454bec7288b1dbdb37a) |
---|---|
1/*- 2 * Copyright (c) 1993 Andrew Moore, Talke Studio 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 16 unchanged lines hidden (view full) --- 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * | 1/*- 2 * Copyright (c) 1993 Andrew Moore, Talke Studio 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 16 unchanged lines hidden (view full) --- 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * |
33 * from: @(#) floatingpoint.h 1.0 (Berkeley) 9/23/93 34 * $FreeBSD$ | 33 * @(#) floatingpoint.h 1.0 (Berkeley) 9/23/93 |
35 */ 36 | 34 */ 35 |
36/* 37 * IEEE floating point structure and function definitions 38 */ 39 |
|
37#ifndef _FLOATINGPOINT_H_ 38#define _FLOATINGPOINT_H_ 39 40#include <sys/cdefs.h> | 40#ifndef _FLOATINGPOINT_H_ 41#define _FLOATINGPOINT_H_ 42 43#include <sys/cdefs.h> |
41#include <machine/ieeefp.h> | 44#include <sys/ieeefp.h> |
42 | 45 |
46#ifdef __GNUC__ 47 48#define fnstcw(addr) __asm("fnstcw %0" : "=m" (*addr) : "0" (*addr)) 49#define fnstsw(addr) __asm("fnstsw %0" : "=m" (*addr) : "0" (*addr)) 50#define fnstenv(addr) __asm("fnstenv %0" : "=m" (*addr) : "0" (*addr)) 51#define fldenv(addr) __asm("fldenv %0" : : "m" (*addr)) 52 53#ifdef __i386__ 54 55/* 56 * return the contents of a FP register 57 */ 58static __inline__ 59__fpgetreg(reg) 60{ 61 unsigned short mem; 62 63 switch(reg) { 64 default: 65 fnstcw(&mem); 66 break; 67 case FP_STKY_REG: 68 fnstsw(&mem); 69 break; 70 } 71 return mem; 72} 73 74/* 75 * set a FP mode; return previous mode 76 */ 77static __inline__ 78__fpsetreg(m, reg, fld, off) 79{ 80 unsigned env[7]; 81 unsigned p; 82 83 fnstenv(env); 84 p = (env[reg] & fld) >> off; 85 env[reg] = (env[reg] & ~fld) | (m << off & fld); 86 fldenv(env); 87 return p; 88} 89 90#endif /* __i386__ */ 91 92#endif /* __GNUC__ */ 93 94/* 95 * SysV/386 FP control interface 96 */ 97#define fpgetround() ((__fpgetreg(FP_RND_REG) & FP_RND_FLD) >> FP_RND_OFF) 98#define fpsetround(m) __fpsetreg((m), FP_RND_REG, FP_RND_FLD, FP_RND_OFF) 99#define fpgetprec() ((__fpgetreg(FP_PRC_REG) & FP_PRC_FLD) >> FP_PRC_OFF) 100#define fpsetprec(m) __fpsetreg((m), FP_PRC_REG, FP_PRC_FLD, FP_PRC_OFF) 101#define fpgetmask() ((~__fpgetreg(FP_MSKS_REG) & FP_MSKS_FLD) >> FP_MSKS_OFF) 102#define fpsetmask(m) __fpsetreg(~(m), FP_MSKS_REG, FP_MSKS_FLD, FP_MSKS_OFF) 103#define fpgetsticky() ((__fpgetreg(FP_STKY_REG) & FP_STKY_FLD) >> FP_STKY_OFF) 104#define fpresetsticky(m) __fpsetreg(0, FP_STKY_REG, (m), FP_STKY_OFF) 105#define fpsetsticky(m) fpresetsticky(m) 106 |
|
43#endif /* !_FLOATINGPOINT_H_ */ | 107#endif /* !_FLOATINGPOINT_H_ */ |