0bc6afee31a3f0dcce0064e3e928149292679905
[deliverable/binutils-gdb.git] / gnulib / import / m4 / frexpl.m4
1 # frexpl.m4 serial 20
2 dnl Copyright (C) 2007-2016 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
6
7 AC_DEFUN([gl_FUNC_FREXPL],
8 [
9 AC_REQUIRE([gl_MATH_H_DEFAULTS])
10 AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
11
12 dnl Persuade glibc <math.h> to declare frexpl().
13 AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
14
15 dnl Check whether it's declared.
16 dnl Mac OS X 10.3 has frexpl() in libc but doesn't declare it in <math.h>.
17 AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [[#include <math.h>]])
18
19 FREXPL_LIBM=
20 if test $HAVE_DECL_FREXPL = 1; then
21 gl_CHECK_FREXPL_NO_LIBM
22 if test $gl_cv_func_frexpl_no_libm = no; then
23 AC_CACHE_CHECK([whether frexpl() can be used with libm],
24 [gl_cv_func_frexpl_in_libm],
25 [
26 save_LIBS="$LIBS"
27 LIBS="$LIBS -lm"
28 AC_LINK_IFELSE(
29 [AC_LANG_PROGRAM(
30 [[#include <math.h>
31 long double x;]],
32 [[int e; return frexpl (x, &e) > 0;]])],
33 [gl_cv_func_frexpl_in_libm=yes],
34 [gl_cv_func_frexpl_in_libm=no])
35 LIBS="$save_LIBS"
36 ])
37 if test $gl_cv_func_frexpl_in_libm = yes; then
38 FREXPL_LIBM=-lm
39 fi
40 fi
41 if test $gl_cv_func_frexpl_no_libm = yes \
42 || test $gl_cv_func_frexpl_in_libm = yes; then
43 save_LIBS="$LIBS"
44 LIBS="$LIBS $FREXPL_LIBM"
45 gl_FUNC_FREXPL_WORKS
46 LIBS="$save_LIBS"
47 case "$gl_cv_func_frexpl_works" in
48 *yes) gl_func_frexpl=yes ;;
49 *) gl_func_frexpl=no; REPLACE_FREXPL=1 ;;
50 esac
51 else
52 gl_func_frexpl=no
53 fi
54 if test $gl_func_frexpl = yes; then
55 AC_DEFINE([HAVE_FREXPL], [1],
56 [Define if the frexpl() function is available.])
57 fi
58 fi
59 if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl = no; then
60 dnl Find libraries needed to link lib/frexpl.c.
61 if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
62 AC_REQUIRE([gl_FUNC_FREXP])
63 FREXPL_LIBM="$FREXP_LIBM"
64 else
65 FREXPL_LIBM=
66 fi
67 fi
68 AC_SUBST([FREXPL_LIBM])
69 ])
70
71 AC_DEFUN([gl_FUNC_FREXPL_NO_LIBM],
72 [
73 AC_REQUIRE([gl_MATH_H_DEFAULTS])
74 AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
75 dnl Check whether it's declared.
76 dnl Mac OS X 10.3 has frexpl() in libc but doesn't declare it in <math.h>.
77 AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [[#include <math.h>]])
78 if test $HAVE_DECL_FREXPL = 1; then
79 gl_CHECK_FREXPL_NO_LIBM
80 if test $gl_cv_func_frexpl_no_libm = yes; then
81 gl_FUNC_FREXPL_WORKS
82 case "$gl_cv_func_frexpl_works" in
83 *yes) gl_func_frexpl_no_libm=yes ;;
84 *) gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
85 esac
86 else
87 gl_func_frexpl_no_libm=no
88 dnl Set REPLACE_FREXPL here because the system may have frexpl in libm.
89 REPLACE_FREXPL=1
90 fi
91 if test $gl_func_frexpl_no_libm = yes; then
92 AC_DEFINE([HAVE_FREXPL_IN_LIBC], [1],
93 [Define if the frexpl() function is available in libc.])
94 fi
95 fi
96 ])
97
98 dnl Test whether frexpl() can be used without linking with libm.
99 dnl Set gl_cv_func_frexpl_no_libm to 'yes' or 'no' accordingly.
100 AC_DEFUN([gl_CHECK_FREXPL_NO_LIBM],
101 [
102 AC_CACHE_CHECK([whether frexpl() can be used without linking with libm],
103 [gl_cv_func_frexpl_no_libm],
104 [
105 AC_LINK_IFELSE(
106 [AC_LANG_PROGRAM(
107 [[#include <math.h>
108 long double x;]],
109 [[int e; return frexpl (x, &e) > 0;]])],
110 [gl_cv_func_frexpl_no_libm=yes],
111 [gl_cv_func_frexpl_no_libm=no])
112 ])
113 ])
114
115 dnl Test whether frexpl() works on finite numbers (this fails on
116 dnl Mac OS X 10.4/PowerPC, on AIX 5.1, and on BeOS), on denormalized numbers
117 dnl (this fails on Mac OS X 10.5/i386), and also on infinite numbers (this
118 dnl fails e.g. on IRIX 6.5 and mingw).
119 AC_DEFUN([gl_FUNC_FREXPL_WORKS],
120 [
121 AC_REQUIRE([AC_PROG_CC])
122 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
123 AC_CACHE_CHECK([whether frexpl works], [gl_cv_func_frexpl_works],
124 [
125 AC_RUN_IFELSE(
126 [AC_LANG_SOURCE([[
127 #include <float.h>
128 #include <math.h>
129 /* Override the values of <float.h>, like done in float.in.h. */
130 #if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
131 # undef LDBL_MIN_EXP
132 # define LDBL_MIN_EXP (-16381)
133 #endif
134 #if defined __i386__ && defined __FreeBSD__
135 # undef LDBL_MIN_EXP
136 # define LDBL_MIN_EXP (-16381)
137 #endif
138 #if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
139 # undef LDBL_MIN_EXP
140 # define LDBL_MIN_EXP DBL_MIN_EXP
141 #endif
142 #if defined __sgi && (LDBL_MANT_DIG >= 106)
143 # if defined __GNUC__
144 # undef LDBL_MIN_EXP
145 # define LDBL_MIN_EXP DBL_MIN_EXP
146 # endif
147 #endif
148 extern
149 #ifdef __cplusplus
150 "C"
151 #endif
152 long double frexpl (long double, int *);
153 int main()
154 {
155 int result = 0;
156 volatile long double x;
157 /* Test on finite numbers that fails on AIX 5.1. */
158 x = 16.0L;
159 {
160 int exp = -9999;
161 frexpl (x, &exp);
162 if (exp != 5)
163 result |= 1;
164 }
165 /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
166 function returns an invalid (incorrectly normalized) value: it returns
167 y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
168 but the correct result is
169 0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 } */
170 x = 1.01L;
171 {
172 int exp = -9999;
173 long double y = frexpl (x, &exp);
174 if (!(exp == 1 && y == 0.505L))
175 result |= 2;
176 }
177 /* Test on large finite numbers. This fails on BeOS at i = 16322, while
178 LDBL_MAX_EXP = 16384.
179 In the loop end test, we test x against Infinity, rather than comparing
180 i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP. */
181 {
182 int i;
183 for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
184 {
185 int exp = -9999;
186 frexpl (x, &exp);
187 if (exp != i)
188 {
189 result |= 4;
190 break;
191 }
192 }
193 }
194 /* Test on denormalized numbers. */
195 {
196 int i;
197 for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
198 ;
199 if (x > 0.0L)
200 {
201 int exp;
202 long double y = frexpl (x, &exp);
203 /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
204 exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */
205 if (exp != LDBL_MIN_EXP - 1)
206 result |= 8;
207 }
208 }
209 /* Test on infinite numbers. */
210 x = 1.0L / 0.0L;
211 {
212 int exp;
213 long double y = frexpl (x, &exp);
214 if (y != x)
215 result |= 16;
216 }
217 return result;
218 }]])],
219 [gl_cv_func_frexpl_works=yes],
220 [gl_cv_func_frexpl_works=no],
221 [
222 changequote(,)dnl
223 case "$host_os" in
224 aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*)
225 gl_cv_func_frexpl_works="guessing no";;
226 *) gl_cv_func_frexpl_works="guessing yes";;
227 esac
228 changequote([,])dnl
229 ])
230 ])
231 ])
This page took 0.035334 seconds and 3 git commands to generate.