summaryrefslogtreecommitdiff
path: root/newlib/libm/test/test_ieee.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libm/test/test_ieee.c')
-rw-r--r--newlib/libm/test/test_ieee.c180
1 files changed, 180 insertions, 0 deletions
diff --git a/newlib/libm/test/test_ieee.c b/newlib/libm/test/test_ieee.c
new file mode 100644
index 00000000000..a126d01e6fc
--- /dev/null
+++ b/newlib/libm/test/test_ieee.c
@@ -0,0 +1,180 @@
+
+#include "test.h"
+#include <ieeefp.h>
+
+
+/* Test fp getround and fp setround */
+
+void
+_DEFUN_VOID(test_getround)
+{
+
+ newfunc("fpgetround/fpsetround");
+ line(1);
+ fpsetround(FP_RN);
+ test_iok(fpgetround(), FP_RN);
+ line(2);
+ fpsetround(FP_RM);
+ test_iok(fpgetround(), FP_RM);
+ line(3);
+ fpsetround(FP_RP);
+ test_iok(fpgetround(), FP_RP);
+ line(4);
+ fpsetround(FP_RZ);
+ test_iok(fpgetround(), FP_RZ);
+}
+
+/* And fpset/fpgetmask */
+void
+_DEFUN_VOID(test_getmask)
+{
+ newfunc("fpsetmask/fpgetmask");
+ line(1);
+ fpsetmask(FP_X_INV);
+ test_iok(fpgetmask(),FP_X_INV);
+ line(2);
+ fpsetmask(FP_X_DX);
+ test_iok(fpgetmask(),FP_X_DX);
+ line(3);
+ fpsetmask(FP_X_OFL );
+ test_iok(fpgetmask(),FP_X_OFL);
+ line(4);
+ fpsetmask(FP_X_UFL);
+ test_iok(fpgetmask(),FP_X_UFL);
+ line(5);
+ fpsetmask(FP_X_IMP);
+ test_iok(fpgetmask(),FP_X_IMP);
+}
+
+void
+_DEFUN_VOID(test_getsticky)
+{
+ newfunc("fpsetsticky/fpgetsticky");
+ line(1);
+ fpsetsticky(FP_X_INV);
+ test_iok(fpgetsticky(),FP_X_INV);
+ line(2);
+ fpsetsticky(FP_X_DX);
+ test_iok(fpgetsticky(),FP_X_DX);
+ line(3);
+ fpsetsticky(FP_X_OFL );
+ test_iok(fpgetsticky(),FP_X_OFL);
+ line(4);
+ fpsetsticky(FP_X_UFL);
+ test_iok(fpgetsticky(),FP_X_UFL);
+ line(5);
+ fpsetsticky(FP_X_IMP);
+ test_iok(fpgetsticky(),FP_X_IMP);
+}
+
+void
+_DEFUN_VOID(test_getroundtoi)
+{
+ newfunc("fpsetroundtoi/fpgetroundtoi");
+ line(1);
+ fpsetroundtoi(FP_RDI_TOZ);
+ test_iok(fpgetroundtoi(),FP_RDI_TOZ);
+
+ line(2);
+ fpsetroundtoi(FP_RDI_RD);
+ test_iok(fpgetroundtoi(),FP_RDI_RD);
+
+}
+
+double
+ _DEFUN(dnumber,(msw, lsw),
+ int msw _AND
+ int lsw)
+{
+
+ __ieee_double_shape_type v;
+ v.parts.lsw = lsw;
+ v.parts.msw = msw;
+ return v.value;
+}
+
+ /* Lets see if changing the rounding alters the arithmetic.
+ Test by creating numbers which will have to be rounded when
+ added, and seeing what happens to them */
+ /* Keep them out here to stop the compiler from folding the results */
+double n;
+double m;
+double add_rounded_up;
+double add_rounded_down;
+double sub_rounded_down ;
+double sub_rounded_up ;
+ double r1,r2,r3,r4;
+void
+_DEFUN_VOID(test_round)
+{
+ n = dnumber(0x40000000, 0x00000008); /* near 2 */
+ m = dnumber(0x40400000, 0x00000003); /* near 3.4 */
+
+ add_rounded_up = dnumber(0x40410000, 0x00000004); /* For RN, RP */
+ add_rounded_down = dnumber(0x40410000, 0x00000003); /* For RM, RZ */
+ sub_rounded_down = dnumber(0xc0410000, 0x00000004); /* for RN, RM */
+ sub_rounded_up = dnumber(0xc0410000, 0x00000003); /* for RP, RZ */
+
+ newfunc("fpsetround");
+
+ line(1);
+
+ fpsetround(FP_RN);
+ r1 = n + m;
+ test_mok(r1, add_rounded_up, 64);
+
+ line(2);
+ fpsetround(FP_RM);
+ r2 = n + m;
+ test_mok(r2, add_rounded_down, 64);
+
+ fpsetround(FP_RP);
+ line(3);
+ r3 = n + m;
+ test_mok(r3,add_rounded_up, 64);
+
+ fpsetround(FP_RZ);
+ line(4);
+ r4 = n + m;
+ test_mok(r4,add_rounded_down,64);
+
+
+ fpsetround(FP_RN);
+ r1 = - n - m;
+ line(5);
+ test_mok(r1,sub_rounded_down,64);
+
+ fpsetround(FP_RM);
+ r2 = - n - m;
+ line(6);
+ test_mok(r2,sub_rounded_down,64);
+
+
+ fpsetround(FP_RP);
+ r3 = - n - m;
+ line(7);
+ test_mok(r3,sub_rounded_up,64);
+
+ fpsetround(FP_RZ);
+ r4 = - n - m;
+ line(8);
+ test_mok(r4,sub_rounded_up,64);
+}
+
+
+void
+_DEFUN_VOID(test_ieee)
+{
+ fp_rnd old = fpgetround();
+ test_getround();
+ test_getmask();
+ test_getsticky();
+ test_getroundtoi();
+
+ test_round();
+ fpsetround(old);
+
+
+}
+
+