summaryrefslogtreecommitdiffstats
path: root/sys/amd64/include/floatingpoint.h
diff options
context:
space:
mode:
authoralm <alm@FreeBSD.org>1993-08-25 09:01:44 +0000
committeralm <alm@FreeBSD.org>1993-08-25 09:01:44 +0000
commit19f81735f54b5e96ee67854c561dd24aba4bb00d (patch)
treecee0b29f6242ba86eb5a4bbebe1437e51873b900 /sys/amd64/include/floatingpoint.h
parent6b4c61478284288ff260cb714043fc9a0d22e868 (diff)
downloadFreeBSD-src-19f81735f54b5e96ee67854c561dd24aba4bb00d.zip
FreeBSD-src-19f81735f54b5e96ee67854c561dd24aba4bb00d.tar.gz
adding fpgetround(3) IEEE floating point environment support
Diffstat (limited to 'sys/amd64/include/floatingpoint.h')
-rw-r--r--sys/amd64/include/floatingpoint.h107
1 files changed, 107 insertions, 0 deletions
diff --git a/sys/amd64/include/floatingpoint.h b/sys/amd64/include/floatingpoint.h
new file mode 100644
index 0000000..bc69d2e
--- /dev/null
+++ b/sys/amd64/include/floatingpoint.h
@@ -0,0 +1,107 @@
+/*-
+ * Copyright (c) 1993 Andrew Moore, Talke Studio
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#) floatingpoint.h 1.0 (Berkeley) 9/23/93
+ */
+
+/*
+ * IEEE floating point structure and function definitions
+ */
+
+#ifndef _FLOATINGPOINT_H_
+#define _FLOATINGPOINT_H_
+
+#include <sys/cdefs.h>
+#include <sys/ieeefp.h>
+
+#ifdef __GNUC__
+
+#define fnstcw(addr) __asm("fnstcw %0" : "=m" (*addr) : "0" (*addr))
+#define fnstsw(addr) __asm("fnstsw %0" : "=m" (*addr) : "0" (*addr))
+#define fnstenv(addr) __asm("fnstenv %0" : "=m" (*addr) : "0" (*addr))
+#define fldenv(addr) __asm("fldenv %0" : : "m" (*addr))
+
+#ifdef __i386__
+
+/*
+ * return the contents of a FP register
+ */
+static __inline__
+__fpgetreg(reg)
+{
+ unsigned short mem;
+
+ switch(reg) {
+ default:
+ fnstcw(&mem);
+ break;
+ case FP_STKY_REG:
+ fnstsw(&mem);
+ break;
+ }
+ return mem;
+}
+
+/*
+ * set a FP mode; return previous mode
+ */
+static __inline__
+__fpsetreg(m, reg, fld, off)
+{
+ unsigned env[7];
+ unsigned p;
+
+ fnstenv(env);
+ p = (env[reg] & fld) >> off;
+ env[reg] = (env[reg] & ~fld) | (m << off & fld);
+ fldenv(env);
+ return p;
+}
+
+#endif /* __i386__ */
+
+#endif /* __GNUC__ */
+
+/*
+ * SysV/386 FP control interface
+ */
+#define fpgetround() ((__fpgetreg(FP_RND_REG) & FP_RND_FLD) >> FP_RND_OFF)
+#define fpsetround(m) __fpsetreg((m), FP_RND_REG, FP_RND_FLD, FP_RND_OFF)
+#define fpgetprec() ((__fpgetreg(FP_PRC_REG) & FP_PRC_FLD) >> FP_PRC_OFF)
+#define fpsetprec(m) __fpsetreg((m), FP_PRC_REG, FP_PRC_FLD, FP_PRC_OFF)
+#define fpgetmask() ((~__fpgetreg(FP_MSKS_REG) & FP_MSKS_FLD) >> FP_MSKS_OFF)
+#define fpsetmask(m) __fpsetreg(~(m), FP_MSKS_REG, FP_MSKS_FLD, FP_MSKS_OFF)
+#define fpgetsticky() ((__fpgetreg(FP_STKY_REG) & FP_STKY_FLD) >> FP_STKY_OFF)
+#define fpresetsticky(m) __fpsetreg(0, FP_STKY_REG, (m), FP_STKY_OFF)
+#define fpsetsticky(m) fpresetsticky(m)
+
+#endif /* !_FLOATINGPOINT_H_ */
OpenPOWER on IntegriCloud