floating point environment/exceptions support for mips
authorRich Felker <dalias@aerifal.cx>
Fri, 19 Oct 2012 00:19:53 +0000 (20:19 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 19 Oct 2012 00:19:53 +0000 (20:19 -0400)
arch/mips/bits/fenv.h
src/fenv/mips/fenv.s [new file with mode: 0644]

index edbdea2a5efcda22054568550ef555acdf14cd35..b2a6db9ac83c8e4de47d6bfa27a41e645eac651b 100644 (file)
@@ -1,10 +1,20 @@
-#define FE_ALL_EXCEPT 0
+#define FE_INEXACT    4
+#define FE_UNDERFLOW  8
+#define FE_OVERFLOW   16
+#define FE_DIVBYZERO  32
+#define FE_INVALID    64
+
+#define FE_ALL_EXCEPT 124
+
 #define FE_TONEAREST  0
+#define FE_TOWARDZERO 1
+#define FE_UPWARD     2
+#define FE_DOWNWARD   3
 
-typedef unsigned long fexcept_t;
+typedef unsigned short fexcept_t;
 
 typedef struct {
-       unsigned long __cw;
+       unsigned __cw;
 } fenv_t;
 
 #define FE_DFL_ENV      ((const fenv_t *) -1)
diff --git a/src/fenv/mips/fenv.s b/src/fenv/mips/fenv.s
new file mode 100644 (file)
index 0000000..49ff36c
--- /dev/null
@@ -0,0 +1,60 @@
+.set noreorder
+
+.global feclearexcept
+.type  feclearexcept,@function
+feclearexcept:
+       cfc1    $5, $31
+       or      $5, $5, $4
+       xor     $5, $5, $4
+       ctc1    $5, $31
+       jr      $ra
+       li      $2, 0
+
+.global feraiseexcept
+.type  feraiseexcept,@function
+feraiseexcept:
+       cfc1    $5, $31
+       or      $5, $5, $4
+       ctc1    $5, $31
+       jr      $ra
+       li      $2, 0
+
+.global fetestexcept
+.type  fetestexcept,@function
+fetestexcept:
+       cfc1    $2, $31
+       jr      $ra
+       and     $2, $2, $4
+
+.global fegetround
+.type  fegetround,@function
+fegetround:
+       cfc1    $2, $31
+       jr      $ra
+       andi    $2, $2, 3
+
+.global fesetround
+.type  fesetround,@function
+fesetround:
+       cfc1    $5, $31
+       li      $6, -4
+       and     $5, $5, $6
+       or      $5, $5, $4
+       jr      $ra
+       li      $2, 0
+
+.global fegetenv
+.type  fegetenv,@function
+fegetenv:
+       cfc1    $5, $31
+       sw      $5, 0($4)
+       jr      $ra
+       li      $2, 0
+
+.global fesetenv
+.type  fesetenv,@function
+fesetenv:
+       lw      $5, 0($4)
+       ctc1    $5, $31
+       jr      $ra
+       li      $2, 0