aboutsummaryrefslogtreecommitdiffstats
path: root/test/regression/builtins-powerpc.c
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>2015-07-08 12:01:30 +0200
committerXavier Leroy <xavier.leroy@inria.fr>2015-07-08 12:01:30 +0200
commitab1ddcd0d579d7e5760c6cfa84adbd55212c47e7 (patch)
tree207e3b1e59da7247d95d28d6ffdd6f4e93bdfc4c /test/regression/builtins-powerpc.c
parent4148ee08387bf953bdbe69f7668597ec0bcccc29 (diff)
downloadcompcert-kvx-ab1ddcd0d579d7e5760c6cfa84adbd55212c47e7.tar.gz
compcert-kvx-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.c13
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));