diff options
Diffstat (limited to 'gcc/config/rs6000/rs6000-linux.cc')
-rw-r--r-- | gcc/config/rs6000/rs6000-linux.cc | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/gcc/config/rs6000/rs6000-linux.cc b/gcc/config/rs6000/rs6000-linux.cc index 35dc109..0f89cb4 100644 --- a/gcc/config/rs6000/rs6000-linux.cc +++ b/gcc/config/rs6000/rs6000-linux.cc @@ -23,6 +23,10 @@ along with GCC; see the file COPYING3. If not see #include "system.h" #include "coretypes.h" #include "tm.h" +#include "target.h" +#include "targhooks.h" +#include "tree.h" +#include "case-cfn-macros.h" /* Implement TARGET_FLOAT_EXCEPTIONS_ROUNDING_SUPPORTED_P. */ @@ -36,3 +40,39 @@ rs6000_linux_float_exceptions_rounding_supported_p (void) else return TARGET_HARD_FLOAT; } + +/* Implement TARGET_LIBM_FUNCTION_MAX_ERROR. */ + +unsigned +rs6000_linux_libm_function_max_error (unsigned cfn, machine_mode mode, + bool boundary_p) +{ + if (OPTION_GLIBC) + { + int rnd = flag_rounding_math ? 4 : 0; + switch (cfn) + { + CASE_CFN_SQRT: + CASE_CFN_SQRT_FN: + if (!boundary_p && MODE_COMPOSITE_P (mode)) + return 1 + rnd; + break; + CASE_CFN_COS: + CASE_CFN_COS_FN: + if (!boundary_p && mode == SFmode) + return 3 + rnd; + if (!boundary_p && MODE_COMPOSITE_P (mode)) + return 4 + rnd; + break; + CASE_CFN_SIN: + CASE_CFN_SIN_FN: + if (!boundary_p && MODE_COMPOSITE_P (mode)) + return 1 + rnd; + break; + default: + break; + } + return glibc_linux_libm_function_max_error (cfn, mode, boundary_p); + } + return default_libm_function_max_error (cfn, mode, boundary_p); +} |