# Copyright (C) 2002-2004, 2006-2018 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. frexp_test = ''' #define HAVE_DECL_ALARM 0 #include #include #include #if HAVE_DECL_ALARM # include # include #endif /* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0. ICC 10.0 has a bug when optimizing the expression -zero. The expression -DBL_MIN * DBL_MIN does not work when cross-compiling to PowerPC on Mac OS X 10.5. */ #if defined __hpux || defined __sgi || defined __ICC static double compute_minus_zero (void) { return -DBL_MIN * DBL_MIN; } # define minus_zero compute_minus_zero () #else double minus_zero = -0.0; #endif int main() { int result = 0; int i; volatile double x; double zero = 0.0; #if HAVE_DECL_ALARM /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite number. Let the test fail in this case. */ signal (SIGALRM, SIG_DFL); alarm (5); #endif /* Test on denormalized numbers. */ for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5) ; if (x > 0.0) { int exp; double y = frexp (x, &exp); /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022. On NetBSD: y = 0.75. Correct: y = 0.5. */ if (y != 0.5) result |= 1; } /* Test on infinite numbers. */ x = 1.0 / zero; { int exp; double y = frexp (x, &exp); if (y != x) result |= 2; } /* Test on negative zero. */ x = minus_zero; { int exp; double y = frexp (x, &exp); if (memcmp (&y, &x, sizeof x)) result |= 4; } x = 0.0; { int exp; double y = frexp (x, &exp); if (memcmp (&y, &x, sizeof x)) result |= 8; } return result; }''' if not meson.is_cross_build() or meson.has_exe_wrapper() run_result = cc.run(frexp_test, name : 'frexp works', dependencies : [libm]) rc = run_result.returncode() gl_cv_func_frexp_works = run_result.compiled() and rc == 0 gl_cv_func_frexp_broken_beyond_repair = not gl_cv_func_frexp_works # bit 1 is not set if (rc == 1 or rc == 3 or rc == 5 or rc == 9 or rc == 7 or rc == 11 or rc == 13) gl_cv_func_frexp_broken_beyond_repair = true else gl_cv_func_frexp_broken_beyond_repair = false endif else if (host_system.startswith ('netbsd') or host_system.startswith ('irix')) gl_cv_func_frexp_works = false gl_cv_func_frexp_broken_beyond_repair = true elif host_system == 'windows' if cc.get_id () == 'msvc' or cc.get_id() == 'clang-cl' gl_cv_func_frexp_works = true gl_cv_func_frexp_broken_beyond_repair = false else gl_cv_func_frexp_works = false gl_cv_func_frexp_broken_beyond_repair = false endif else gl_cv_func_frexp_works = true gl_cv_func_frexp_broken_beyond_repair = false endif endif