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 |