mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-08 21:09:49 +00:00
mips32/64: Test case for VEX r2799.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13713
This commit is contained in:
115
none/tests/mips32/test_math.cpp
Normal file
115
none/tests/mips32/test_math.cpp
Normal file
@@ -0,0 +1,115 @@
|
||||
#include <fenv.h>
|
||||
#include <limits.h>
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
static void DivideByZero() {
|
||||
// volatile to prevent compiler optimizations.
|
||||
volatile float zero = 0.0f;
|
||||
volatile float result __attribute__((unused)) = 123.0f / zero;
|
||||
}
|
||||
|
||||
int main () {
|
||||
/* Testing lrint. */
|
||||
fesetround(FE_UPWARD); // lrint/lrintf/lrintl obey the rounding mode.
|
||||
printf("fesetround(FE_UPWARD)\n");
|
||||
printf("lrint(1234.01): %ld\n", lrint(1234.01));
|
||||
printf("lrintf(1234.01f): %ld\n", lrintf(1234.01f));
|
||||
printf("lrintl(1234.01): %ld\n", lrintl(1234.01));
|
||||
fesetround(FE_TOWARDZERO); // lrint/lrintf/lrintl obey the rounding mode.
|
||||
printf("fesetround(FE_TOWARDZERO)\n");
|
||||
printf("lrint(1234.01): %ld\n", lrint(1234.01));
|
||||
printf("lrintf(1234.01f): %ld\n", lrintf(1234.01f));
|
||||
printf("lrintl(1234.01): %ld\n", lrintl(1234.01));
|
||||
fesetround(FE_UPWARD); // llrint/llrintf/llrintl obey the rounding mode.
|
||||
printf("fesetround(FE_UPWARD)\n");
|
||||
printf("llrint(1234.01): %lld\n", llrint(1234.01));
|
||||
printf("llrintf(1234.01f): %lld\n", llrintf(1234.01f));
|
||||
printf("llrintf(1234.01f): %lld\n", llrintl(1234.01));
|
||||
fesetround(FE_TOWARDZERO); // llrint/llrintf/llrintl obey the rounding mode.
|
||||
printf("fesetround(FE_TOWARDZERO)\n");
|
||||
printf("llrint(1234.01): %lld\n", llrint(1234.01));
|
||||
printf("llrintf(1234.01f): %lld\n", llrintf(1234.01f));
|
||||
printf("llrintl(1234.01): %lld\n", llrintl(1234.01));
|
||||
|
||||
/* Tesing rint. */
|
||||
fesetround(FE_UPWARD); // rint/rintf/rintl obey the rounding mode.
|
||||
printf("fesetround(FE_UPWARD)\n");
|
||||
feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag.
|
||||
printf("feclearexcept(FE_ALL_EXCEPT)\n");
|
||||
printf("rint(1234.0): %f\n", rint(1234.0));
|
||||
printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
|
||||
(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
|
||||
printf("rint(1234.01): %f\n", rint(1234.01));
|
||||
printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
|
||||
(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
|
||||
|
||||
feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag.
|
||||
printf("feclearexcept(FE_ALL_EXCEPT)\n");
|
||||
printf("rintf(1234.0f): %f\n", rintf(1234.0f));
|
||||
printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
|
||||
(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
|
||||
printf("rintf(1234.01f): %f\n", rintf(1234.01f));
|
||||
printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
|
||||
(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
|
||||
|
||||
feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag.
|
||||
printf("feclearexcept(FE_ALL_EXCEPT)\n");
|
||||
printf("rintl(1234.0): %Lf\n", rintl(1234.0));
|
||||
printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
|
||||
(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
|
||||
printf("rintl(1234.01): %Lf\n", rintl(1234.01));
|
||||
printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
|
||||
(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
|
||||
|
||||
fesetround(FE_TOWARDZERO); // rint/rintf obey the rounding mode.
|
||||
printf("fesetround(FE_TOWARDZERO)\n");
|
||||
printf("rint(1234.01): %f\n", rint(1234.01));
|
||||
printf("rintf(1234.01f): %f\n", rintf(1234.01f));
|
||||
printf("rintl(1234.01): %Lf\n", rintl(1234.01));
|
||||
|
||||
/* Testing nearbyint. */
|
||||
fesetround(FE_UPWARD); // nearbyint/nearbyintf/nearbyintl obey the rounding mode.
|
||||
printf("fesetround(FE_UPWARD)\n");
|
||||
feclearexcept(FE_ALL_EXCEPT); // nearbyint/nearbyintf/nearbyintl don't set the FE_INEXACT flag.
|
||||
printf("feclearexcept(FE_ALL_EXCEPT)\n");
|
||||
printf("nearbyint(1234.0): %f\n", nearbyint(1234.0));
|
||||
printf("nearbyint(1234.01): %f\n", nearbyint(1234.01));
|
||||
|
||||
feclearexcept(FE_ALL_EXCEPT);
|
||||
printf("feclearexcept(FE_ALL_EXCEPT)\n");
|
||||
printf("nearbyintf(1234.0f): %f\n", nearbyintf(1234.0f));
|
||||
printf("nearbyintf(1234.01f): %f\n", nearbyintf(1234.01f));
|
||||
|
||||
feclearexcept(FE_ALL_EXCEPT); // nearbyint/nearbyintf/nearbyintl don't set the FE_INEXACT flag.
|
||||
printf("feclearexcept(FE_ALL_EXCEPT)\n");
|
||||
printf("nearbyintl(1234.0f): %Lf\n", nearbyintl(1234.0f));
|
||||
printf("nearbyintl(1234.01f): %Lf\n", nearbyintl(1234.01f));
|
||||
|
||||
fesetround(FE_TOWARDZERO); // nearbyint/nearbyintf/nearbyintl obey the rounding mode.
|
||||
printf("fesetround(FE_TOWARDZERO)\n");
|
||||
printf("nearbyint(1234.01): %f\n", nearbyint(1234.01));
|
||||
printf("nearbyintf(1234.01f): %f\n", nearbyintf(1234.01f));
|
||||
printf("nearbyintl(1234.01): %Lf\n", nearbyintl(1234.01));
|
||||
|
||||
/* Test log. */
|
||||
printf("log(M_E): %lf\n", log(M_E));
|
||||
|
||||
/* Test tgamma. */
|
||||
printf("tgamma(5.0): %lf\n", tgamma(5.0));
|
||||
|
||||
/* Test cbrt. */
|
||||
printf("cbrt(27.0): %lf\n", cbrt(27.0));
|
||||
|
||||
/* Test dividing by zero. */
|
||||
// Clearing clears.
|
||||
printf("feclearexcept(FE_ALL_EXCEPT): %d\n", feclearexcept(FE_ALL_EXCEPT));
|
||||
|
||||
// Dividing by zero sets FE_DIVBYZERO.
|
||||
DivideByZero();
|
||||
int raised = fetestexcept(FE_DIVBYZERO | FE_OVERFLOW);
|
||||
printf("raised: %d\n", raised);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user