add tests: math, udiv, stdio/memstream
[libc-test] / src / math / fenv.c
diff --git a/src/math/fenv.c b/src/math/fenv.c
new file mode 100644 (file)
index 0000000..ae1f897
--- /dev/null
@@ -0,0 +1,60 @@
+#include "test.h"
+#include <math.h>
+#include <stdint.h>
+#include <fenv.h>
+#include <stdio.h>
+#include <float.h>
+
+
+void test_fenv()
+{
+       int r;
+
+       r = fesetround(FE_UPWARD);
+       if (r != 0)
+               error("fesetround %d\n", r);
+       r = fegetround();
+       if (r != FE_UPWARD)
+               error("fegetround %x wanted %x\n", r, FE_UPWARD);
+       r = fesetround(FE_TONEAREST);
+       if (r != 0)
+               error("fesetround %d\n", r);
+       r = fegetround();
+       if (r != FE_TONEAREST)
+               error("fegetround %x wanted %x\n", r, FE_TONEAREST);
+}
+
+void test_fenv_except()
+{
+       int i,r;
+
+       for (i = 0; i < 64; i++) {
+               feclearexcept(FE_ALL_EXCEPT);
+
+               r = feraiseexcept(i);
+               if (r)
+                       error("feraise %d returned %d\n", i, r);
+               r = fetestexcept(FE_ALL_EXCEPT);
+               if (r != i)
+                       error("feraise want %d got %d\n", i, r);
+       }
+}
+
+void bench_feraiseexcept(int N)
+{
+       int i;
+       for (i = 0; i < N; i++) {
+               feraiseexcept(i&63);
+       }
+}
+
+void bench_fesetround(int N)
+{
+       int i;
+       int r = 0;
+
+       for (i = 0; i < N; i++) {
+               r ^= 0x400;
+               fesetround(r);
+       }
+}