| Index: fusl/src/fenv/sh/fenv.s
|
| diff --git a/fusl/src/fenv/sh/fenv.s b/fusl/src/fenv/sh/fenv.s
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7f5c62778e3f7f82cfdd6c1790cd3e6291fc2aeb
|
| --- /dev/null
|
| +++ b/fusl/src/fenv/sh/fenv.s
|
| @@ -0,0 +1,74 @@
|
| +.global fegetround
|
| +.type fegetround, @function
|
| +fegetround:
|
| + sts fpscr, r0
|
| + rts
|
| + and #3, r0
|
| +
|
| +.global __fesetround
|
| +.type __fesetround, @function
|
| +__fesetround:
|
| + sts fpscr, r0
|
| + or r4, r0
|
| + lds r0, fpscr
|
| + rts
|
| + mov #0, r0
|
| +
|
| +.global fetestexcept
|
| +.type fetestexcept, @function
|
| +fetestexcept:
|
| + sts fpscr, r0
|
| + and r4, r0
|
| + rts
|
| + and #0x7c, r0
|
| +
|
| +.global feclearexcept
|
| +.type feclearexcept, @function
|
| +feclearexcept:
|
| + mov r4, r0
|
| + and #0x7c, r0
|
| + not r0, r4
|
| + sts fpscr, r0
|
| + and r4, r0
|
| + lds r0, fpscr
|
| + rts
|
| + mov #0, r0
|
| +
|
| +.global feraiseexcept
|
| +.type feraiseexcept, @function
|
| +feraiseexcept:
|
| + mov r4, r0
|
| + and #0x7c, r0
|
| + sts fpscr, r4
|
| + or r4, r0
|
| + lds r0, fpscr
|
| + rts
|
| + mov #0, r0
|
| +
|
| +.global fegetenv
|
| +.type fegetenv, @function
|
| +fegetenv:
|
| + sts fpscr, r0
|
| + mov.l r0, @r4
|
| + rts
|
| + mov #0, r0
|
| +
|
| +.global fesetenv
|
| +.type fesetenv, @function
|
| +fesetenv:
|
| + mov r4, r0
|
| + cmp/eq #-1, r0
|
| + bf 1f
|
| +
|
| + ! the default environment is complicated by the fact that we need to
|
| + ! preserve the current precision bit, which we do not know a priori
|
| + sts fpscr, r0
|
| + mov #8, r1
|
| + swap.w r1, r1
|
| + bra 2f
|
| + and r1, r0
|
| +
|
| +1: mov.l @r4, r0 ! non-default environment
|
| +2: lds r0, fpscr
|
| + rts
|
| + mov #0, r0
|
|
|