diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2017-12-15 09:38:53 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2017-12-15 09:39:34 -0500 |
commit | f95a4a932476be2ba99e2fd081e8d2bc6ea12813 (patch) | |
tree | 75f67192cb2d7b7b575c94edda318e475239b63c /newlib/libm/test/test_ieee.c | |
parent | f60aca96985e68c7d8a52eb7bc955fb80e132f73 (diff) |
Import newlib and create makefile
Diffstat (limited to 'newlib/libm/test/test_ieee.c')
-rw-r--r-- | newlib/libm/test/test_ieee.c | 180 |
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 0000000..a126d01 --- /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); + + +} + + |