diff options
-rw-r--r-- | arch/mips/bits/fenv.h | 16 | ||||
-rw-r--r-- | src/fenv/mips/fenv.s | 60 |
2 files changed, 73 insertions, 3 deletions
diff --git a/arch/mips/bits/fenv.h b/arch/mips/bits/fenv.h index edbdea2a..b2a6db9a 100644 --- a/arch/mips/bits/fenv.h +++ b/arch/mips/bits/fenv.h @@ -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 index 00000000..49ff36c0 --- /dev/null +++ b/src/fenv/mips/fenv.s @@ -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 |