Deleted Added
full compact
floatingpoint.h (1834) floatingpoint.h (2941)
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

--- 17 unchanged lines hidden (view full) ---

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
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

--- 17 unchanged lines hidden (view full) ---

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 * $Id: floatingpoint.h,v 1.4 1993/11/07 17:42:55 wollman Exp $
34 * $Id: floatingpoint.h,v 1.5 1994/08/04 19:16:36 wollman Exp $
35 */
36
35 */
36
37#ifndef _FLOATINGPOINT_H_
38#define _FLOATINGPOINT_H_
39
37/*
40/*
38 * IEEE floating point structure and function definitions
41 * IEEE floating point structure and function definitions
39 */
40
42 */
43
41#ifndef _FLOATINGPOINT_H_
42#define _FLOATINGPOINT_H_
44/*-
45 * XXX the following undocumented pollution is exported:
46 * fpsetsticky().
47 * FP*FLD, FP*OFF and FP*REG from <machine/ieeefp.h>
48 */
43
44#include <sys/cdefs.h>
45#include <machine/ieeefp.h>
46
47#ifdef __GNUC__
48
49
50#include <sys/cdefs.h>
51#include <machine/ieeefp.h>
52
53#ifdef __GNUC__
54
49#ifdef __i386__
55#define __fldenv(addr) __asm __volatile("fldenv %0" : : "m" (*(addr)))
56#define __fnstenv(addr) __asm __volatile("fnstenv %0" : "=m" (*(addr)))
57#define __fnstcw(addr) __asm __volatile("fnstcw %0" : "=m" (*(addr)))
58#define __fnstsw(addr) __asm __volatile("fnstsw %0" : "=m" (*(addr)))
50
59
51#define fnstcw(addr) __asm("fnstcw %0" : "=m" (*addr) : "0" (*addr))
52#define fnstsw(addr) __asm("fnstsw %0" : "=m" (*addr) : "0" (*addr))
53#define fnstenv(addr) __asm("fnstenv %0" : "=m" (*addr) : "0" (*addr))
54#define fldenv(addr) __asm("fldenv %0" : : "m" (*addr))
55
56
57/*
58 * return the contents of a FP register
59 */
60static __inline__ int
61__fpgetreg(int _reg)
62{
63 unsigned short _mem;
64
60/*
61 * return the contents of a FP register
62 */
63static __inline__ int
64__fpgetreg(int _reg)
65{
66 unsigned short _mem;
67
68 /*-
69 * This is more efficient than it looks. The switch gets optimized
70 * away if _reg is constant.
71 *
72 * The default case only supports _reg == 0. We could handle more
73 * registers (e.g., tags) using fnstenv, but the interface doesn't
74 * support more.
75 */
65 switch(_reg) {
66 default:
76 switch(_reg) {
77 default:
67 fnstcw(&_mem);
78 __fnstcw(&_mem);
68 break;
69 case FP_STKY_REG:
79 break;
80 case FP_STKY_REG:
70 fnstsw(&_mem);
81 __fnstsw(&_mem);
71 break;
72 }
73 return _mem;
74}
75
76/*
77 * set a FP mode; return previous mode
78 */
79static __inline__ int
80__fpsetreg(int _m, int _reg, int _fld, int _off)
81{
82 unsigned _env[7];
83 unsigned _p;
84
82 break;
83 }
84 return _mem;
85}
86
87/*
88 * set a FP mode; return previous mode
89 */
90static __inline__ int
91__fpsetreg(int _m, int _reg, int _fld, int _off)
92{
93 unsigned _env[7];
94 unsigned _p;
95
85 fnstenv(_env);
96 /*
97 * _reg == 0 could be handled better using fnstcw/fldcw.
98 */
99 __fnstenv(_env);
86 _p = (_env[_reg] & _fld) >> _off;
87 _env[_reg] = (_env[_reg] & ~_fld) | (_m << _off & _fld);
100 _p = (_env[_reg] & _fld) >> _off;
101 _env[_reg] = (_env[_reg] & ~_fld) | (_m << _off & _fld);
88 fldenv(_env);
102 __fldenv(_env);
89 return _p;
90}
91
103 return _p;
104}
105
92#endif /* __i386__ */
93
94#endif /* __GNUC__ */
95
96/*
97 * SysV/386 FP control interface
98 */
99#define fpgetround() ((__fpgetreg(FP_RND_REG) & FP_RND_FLD) >> FP_RND_OFF)
100#define fpsetround(m) __fpsetreg((m), FP_RND_REG, FP_RND_FLD, FP_RND_OFF)
101#define fpgetprec() ((__fpgetreg(FP_PRC_REG) & FP_PRC_FLD) >> FP_PRC_OFF)
102#define fpsetprec(m) __fpsetreg((m), FP_PRC_REG, FP_PRC_FLD, FP_PRC_OFF)
103#define fpgetmask() ((~__fpgetreg(FP_MSKS_REG) & FP_MSKS_FLD) >> FP_MSKS_OFF)
104#define fpsetmask(m) __fpsetreg(~(m), FP_MSKS_REG, FP_MSKS_FLD, FP_MSKS_OFF)
105#define fpgetsticky() ((__fpgetreg(FP_STKY_REG) & FP_STKY_FLD) >> FP_STKY_OFF)
106#define fpresetsticky(m) __fpsetreg(0, FP_STKY_REG, (m), FP_STKY_OFF)
107#define fpsetsticky(m) fpresetsticky(m)
108
109#endif /* !_FLOATINGPOINT_H_ */
106#endif /* __GNUC__ */
107
108/*
109 * SysV/386 FP control interface
110 */
111#define fpgetround() ((__fpgetreg(FP_RND_REG) & FP_RND_FLD) >> FP_RND_OFF)
112#define fpsetround(m) __fpsetreg((m), FP_RND_REG, FP_RND_FLD, FP_RND_OFF)
113#define fpgetprec() ((__fpgetreg(FP_PRC_REG) & FP_PRC_FLD) >> FP_PRC_OFF)
114#define fpsetprec(m) __fpsetreg((m), FP_PRC_REG, FP_PRC_FLD, FP_PRC_OFF)
115#define fpgetmask() ((~__fpgetreg(FP_MSKS_REG) & FP_MSKS_FLD) >> FP_MSKS_OFF)
116#define fpsetmask(m) __fpsetreg(~(m), FP_MSKS_REG, FP_MSKS_FLD, FP_MSKS_OFF)
117#define fpgetsticky() ((__fpgetreg(FP_STKY_REG) & FP_STKY_FLD) >> FP_STKY_OFF)
118#define fpresetsticky(m) __fpsetreg(0, FP_STKY_REG, (m), FP_STKY_OFF)
119#define fpsetsticky(m) fpresetsticky(m)
120
121#endif /* !_FLOATINGPOINT_H_ */