From ab1ddcd0d579d7e5760c6cfa84adbd55212c47e7 Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Wed, 8 Jul 2015 12:01:30 +0200 Subject: 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. --- test/regression/Results/builtins-powerpc | 4 ++-- test/regression/builtins-powerpc.c | 13 +++++++++++-- test/regression/sections.c | 6 +++--- 3 files changed, 16 insertions(+), 7 deletions(-) (limited to 'test') diff --git a/test/regression/Results/builtins-powerpc b/test/regression/Results/builtins-powerpc index ac4240a8..0fd07f69 100644 --- a/test/regression/Results/builtins-powerpc +++ b/test/regression/Results/builtins-powerpc @@ -8,8 +8,8 @@ fmsub(3.141590, 2.718000, 1.414000) = 7.124842 fabs(3.141590) = 3.141590 fabs(-3.141590) = 3.141590 fsqrt(3.141590) = 1.772453 -frsqrte(3.141590) = 0.564198 -fres(3.141590) = 0.318311 +frsqrte(3.141590) = OK +fres(3.141590) = OK fsel(3.141590, 2.718000, 1.414000) = 2.718000 fsel(-3.141590, 2.718000, 1.414000) = 1.414000 fcti(3.141590) = 3 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 +#include + +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)); diff --git a/test/regression/sections.c b/test/regression/sections.c index 2e0e4e75..adf94e83 100644 --- a/test/regression/sections.c +++ b/test/regression/sections.c @@ -13,14 +13,14 @@ struct s { long long ll; }; -struct s x; /* normal absolute addressing */ +struct s x = {0, }; /* normal absolute addressing */ #pragma use_section SDATA y -struct s y; /* small data area */ +struct s y = {0, }; /* small data area */ #pragma section MYDATA ".mydata" ".mydata" far-data RW #pragma use_section MYDATA z -struct s z; /* far data area, relative addressing */ +struct s z = {0, }; /* far data area, relative addressing */ #define TEST(msg,ty,x,v1,v2,v3) \ x = v1; \ -- cgit