diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 2015-07-08 12:01:30 +0200 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 2015-07-08 12:01:30 +0200 |
commit | ab1ddcd0d579d7e5760c6cfa84adbd55212c47e7 (patch) | |
tree | 207e3b1e59da7247d95d28d6ffdd6f4e93bdfc4c /test/regression/builtins-powerpc.c | |
parent | 4148ee08387bf953bdbe69f7668597ec0bcccc29 (diff) | |
download | compcert-ab1ddcd0d579d7e5760c6cfa84adbd55212c47e7.tar.gz compcert-ab1ddcd0d579d7e5760c6cfa84adbd55212c47e7.zip |
More portable test for fres and fsqrte.
These instructions are approximate and produce different results on different processors. Just check the error bounds specified in the PPC ISA.
Diffstat (limited to 'test/regression/builtins-powerpc.c')
-rw-r--r-- | test/regression/builtins-powerpc.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/test/regression/builtins-powerpc.c b/test/regression/builtins-powerpc.c index 17d4d3c5..acffa435 100644 --- a/test/regression/builtins-powerpc.c +++ b/test/regression/builtins-powerpc.c @@ -1,6 +1,13 @@ /* Fun with builtins */ #include <stdio.h> +#include <math.h> + +char * check_relative_error(double exact, double actual, double precision) +{ + double relative_error = (actual - exact) / exact; + return fabs(relative_error) <= precision ? "OK" : "ERROR"; +} int main(int argc, char ** argv) { @@ -22,8 +29,10 @@ int main(int argc, char ** argv) printf("fabs(%f) = %f\n", a, __builtin_fabs(a)); printf("fabs(%f) = %f\n", -a, __builtin_fabs(-a)); printf("fsqrt(%f) = %f\n", a, __builtin_fsqrt(a)); - printf("frsqrte(%f) = %f\n", a, __builtin_frsqrte(a)); - printf("fres(%f) = %f\n", a, __builtin_fres(a)); + printf("frsqrte(%f) = %s\n", + a, check_relative_error(1.0 / sqrt(a), __builtin_frsqrte(a), 1./32.)); + printf("fres(%f) = %s\n", + a, check_relative_error(1.0 / a, __builtin_fres(a), 1./256.)); printf("fsel(%f, %f, %f) = %f\n", a, b, c, __builtin_fsel(a, b, c)); printf("fsel(%f, %f, %f) = %f\n", -a, b, c, __builtin_fsel(-a, b, c)); printf("fcti(%f) = %d\n", a, __builtin_fcti(a)); |