summaryrefslogtreecommitdiff
path: root/newlib/libc/sys/sysvi386/fpx.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/sys/sysvi386/fpx.c')
-rw-r--r--newlib/libc/sys/sysvi386/fpx.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/newlib/libc/sys/sysvi386/fpx.c b/newlib/libc/sys/sysvi386/fpx.c
new file mode 100644
index 00000000000..d55a1e30ff4
--- /dev/null
+++ b/newlib/libc/sys/sysvi386/fpx.c
@@ -0,0 +1,73 @@
+#include <ieeefp.h>
+#include <machine/registers.h>
+
+
+fp_except _DEFUN(fpsetmask,(newmask),
+ fp_except newmask)
+
+{
+ fp_except oldmask;
+ v60_tkcw_type tkcw;
+
+ sysv60(0, 8, &tkcw);
+ oldmask = tkcw.fp_trap;
+ tkcw.fp_trap = newmask;
+ sysv60(0, 8, &tkcw);
+ return oldmask;
+
+}
+
+fp_except _DEFUN_VOID(fpgetmask)
+{
+ v60_tkcw_type tkcw;
+ sysv60(0, 8, &tkcw);
+ return tkcw.fp_trap;
+}
+
+
+fp_rnd _DEFUN_VOID(fpgetround)
+{
+ v60_tkcw_type tkcw;
+ sysv60(0, 8, &tkcw);
+ return tkcw.fp_rounding;
+}
+
+fp_rnd _DEFUN(fpsetround,(rnd),
+ fp_rnd rnd)
+{
+ fp_rnd oldrnd;
+ v60_tkcw_type tkcw;
+
+ sysv60(0, 8, &tkcw);
+ oldrnd = tkcw.fp_rounding;
+ tkcw.fp_rounding = rnd;
+ sysv60(0, 8, &tkcw);
+ return oldrnd;
+}
+
+
+
+
+
+fp_rdi _DEFUN_VOID(fpgetroundtoi)
+{
+ v60_tkcw_type tkcw;
+ sysv60(0, 8, &tkcw);
+ return tkcw.integer_rounding;
+}
+
+fp_rdi _DEFUN(fpsetroundtoi,(rnd),
+ fp_rdi rnd)
+{
+ fp_rdi oldrnd;
+ v60_tkcw_type tkcw;
+
+ sysv60(0, 8, &tkcw);
+ oldrnd = tkcw.integer_rounding;
+ tkcw.integer_rounding = rnd;
+ sysv60(0, 8, &tkcw);
+ return oldrnd;
+}
+
+
+