| OLD | NEW |
| (Empty) |
| 1 dnl MPFR specific autoconf macros | |
| 2 | |
| 3 dnl Copyright 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Softwar
e Foundation, Inc. | |
| 4 dnl Contributed by the Arenaire and Cacao projects, INRIA. | |
| 5 dnl | |
| 6 dnl This file is part of the GNU MPFR Library. | |
| 7 dnl | |
| 8 dnl The GNU MPFR Library is free software; you can redistribute it and/or modif
y | |
| 9 dnl it under the terms of the GNU Lesser General Public License as published | |
| 10 dnl by the Free Software Foundation; either version 2.1 of the License, or (at | |
| 11 dnl your option) any later version. | |
| 12 dnl | |
| 13 dnl The GNU MPFR Library is distributed in the hope that it will be useful, but | |
| 14 dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | |
| 15 dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public | |
| 16 dnl License for more details. | |
| 17 dnl | |
| 18 dnl You should have received a copy of the GNU Lesser General Public License | |
| 19 dnl along with the GNU MPFR Library; see the file COPYING.LIB. If not, write t
o | |
| 20 dnl the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, | |
| 21 dnl MA 02110-1301, USA. | |
| 22 | |
| 23 dnl autoconf 2.60 is necessary because of the use of AC_PROG_SED. | |
| 24 dnl The following line allows the autoconf wrapper (when installed) | |
| 25 dnl to work as expected. | |
| 26 AC_PREREQ(2.60) | |
| 27 | |
| 28 dnl ------------------------------------------------------------ | |
| 29 dnl You must put in MPFR_CONFIGS everything which configure MPFR | |
| 30 dnl except: | |
| 31 dnl -everything dealing with CC and CFLAGS in particular the ABI | |
| 32 dnl but the IEEE-754 specific flags must be set here. | |
| 33 dnl -GMP's linkage. | |
| 34 dnl -Libtool stuff. | |
| 35 dnl -Handling of special arguments of MPFR's configure. | |
| 36 AC_DEFUN([MPFR_CONFIGS], | |
| 37 [ | |
| 38 AC_REQUIRE([AC_OBJEXT]) | |
| 39 AC_REQUIRE([MPFR_CHECK_LIBM]) | |
| 40 AC_REQUIRE([AC_HEADER_TIME]) | |
| 41 AC_REQUIRE([AC_CANONICAL_HOST]) | |
| 42 | |
| 43 AC_CHECK_HEADER([limits.h],, AC_MSG_ERROR([limits.h not found])) | |
| 44 AC_CHECK_HEADER([float.h],, AC_MSG_ERROR([float.h not found])) | |
| 45 AC_CHECK_HEADER([string.h],, AC_MSG_ERROR([string.h not found])) | |
| 46 | |
| 47 dnl Check for locales | |
| 48 AC_CHECK_HEADERS([locale.h]) | |
| 49 | |
| 50 dnl Check for wide characters (wchar_t and wint_t) | |
| 51 AC_CHECK_HEADERS([wchar.h]) | |
| 52 | |
| 53 dnl Check for stdargs | |
| 54 AC_CHECK_HEADER([stdarg.h],[AC_DEFINE([HAVE_STDARG],1,[Define if stdarg])], | |
| 55 [AC_CHECK_HEADER([varargs.h],, | |
| 56 AC_MSG_ERROR([stdarg.h or varargs.h not found]))]) | |
| 57 | |
| 58 dnl sys/fpu.h - MIPS specific | |
| 59 AC_CHECK_HEADERS([sys/time.h sys/fpu.h]) | |
| 60 | |
| 61 dnl SIZE_MAX macro | |
| 62 gl_SIZE_MAX | |
| 63 | |
| 64 dnl va_copy macro | |
| 65 AC_MSG_CHECKING([how to copy va_list]) | |
| 66 AC_LINK_IFELSE([AC_LANG_PROGRAM([[ | |
| 67 #include <stdarg.h> | |
| 68 ]], [[ | |
| 69 va_list ap1, ap2; | |
| 70 va_copy(ap1, ap2); | |
| 71 ]])], AC_MSG_RESULT([va_copy]), | |
| 72 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ | |
| 73 #include <stdarg.h> | |
| 74 ]], [[ | |
| 75 va_list ap1, ap2; | |
| 76 __va_copy(ap1, ap2); | |
| 77 ]])], [AC_DEFINE([va_copy], [__va_copy]) AC_MSG_RESULT([__va_copy])], | |
| 78 [AC_DEFINE([va_copy(dest,src)], [memcpy(&dest,&src,sizeof(va_list))]) | |
| 79 AC_MSG_RESULT([memcpy])]) | |
| 80 ]) | |
| 81 | |
| 82 dnl FIXME: The functions memmove, memset and strtol are really needed by | |
| 83 dnl MPFR, but if they are implemented as macros, this is also OK (in our | |
| 84 dnl case). So, we do not return an error, but their tests are currently | |
| 85 dnl useless. | |
| 86 dnl gettimeofday is not defined for MinGW | |
| 87 AC_CHECK_FUNCS([memmove memset setlocale strtol gettimeofday]) | |
| 88 | |
| 89 dnl Check for IEEE-754 switches on Alpha | |
| 90 case $host in | |
| 91 alpha*-*-*) | |
| 92 saved_CFLAGS="$CFLAGS" | |
| 93 AC_CACHE_CHECK([for IEEE-754 switches], mpfr_cv_ieee_switches, [ | |
| 94 if test -n "$GCC"; then | |
| 95 mpfr_cv_ieee_switches="-mfp-rounding-mode=d -mieee-with-inexact" | |
| 96 else | |
| 97 mpfr_cv_ieee_switches="-fprm d -ieee_with_inexact" | |
| 98 fi | |
| 99 CFLAGS="$CFLAGS $mpfr_cv_ieee_switches" | |
| 100 AC_TRY_COMPILE(,,, mpfr_cv_ieee_switches="none") | |
| 101 ]) | |
| 102 if test "$mpfr_cv_ieee_switches" = "none"; then | |
| 103 CFLAGS="$saved_CFLAGS" | |
| 104 else | |
| 105 CFLAGS="$saved_CFLAGS $mpfr_cv_ieee_switches" | |
| 106 fi | |
| 107 esac | |
| 108 | |
| 109 dnl Check for Core2 processor | |
| 110 case $host in | |
| 111 x86_64-*linux*) | |
| 112 case `sed -n '/^vendor_id/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in | |
| 113 *Intel*) AC_DEFINE(HAVE_HOST_CORE2,1,[Define if processor is Core 2]) ;; | |
| 114 esac | |
| 115 esac | |
| 116 | |
| 117 dnl check for long long | |
| 118 AC_CHECK_TYPE([long long int], | |
| 119 AC_DEFINE(HAVE_LONG_LONG, 1, [Define if compiler supports long long]),,) | |
| 120 | |
| 121 dnl intmax_t is C99 | |
| 122 AC_CHECK_TYPES([intmax_t]) | |
| 123 | |
| 124 AC_CHECK_TYPE( [union fpc_csr], | |
| 125 AC_DEFINE(HAVE_FPC_CSR,1,[Define if union fpc_csr is available]), , | |
| 126 [ | |
| 127 #if HAVE_SYS_FPU_H | |
| 128 # include <sys/fpu.h> | |
| 129 #endif | |
| 130 ]) | |
| 131 | |
| 132 dnl Check for fesetround | |
| 133 AC_CACHE_CHECK([for fesetround], mpfr_cv_have_fesetround, [ | |
| 134 saved_LIBS="$LIBS" | |
| 135 LIBS="$LIBS $MPFR_LIBM" | |
| 136 AC_TRY_LINK([#include <fenv.h>], [fesetround(FE_TONEAREST);], | |
| 137 mpfr_cv_have_fesetround=yes, mpfr_cv_have_fesetround=no) | |
| 138 LIBS="$saved_LIBS" | |
| 139 ]) | |
| 140 if test "$mpfr_cv_have_fesetround" = "yes"; then | |
| 141 AC_DEFINE(MPFR_HAVE_FESETROUND,1,[Define if you have the `fesetround' function
via the <fenv.h> header file.]) | |
| 142 fi | |
| 143 | |
| 144 dnl Check for gcc float-conversion bug; if need be, -ffloat-store is used to | |
| 145 dnl force the conversion to the destination type when a value is stored to | |
| 146 dnl a variable (see ISO C99 standard 5.1.2.3#13, 6.3.1.5#2, 6.3.1.8#2). This | |
| 147 dnl is important concerning the exponent range. Note that this doesn't solve | |
| 148 dnl the double-rounding problem. | |
| 149 if test -n "$GCC"; then | |
| 150 AC_CACHE_CHECK([for gcc float-conversion bug], mpfr_cv_gcc_floatconv_bug, [ | |
| 151 saved_LIBS="$LIBS" | |
| 152 LIBS="$LIBS $MPFR_LIBM" | |
| 153 AC_TRY_RUN([ | |
| 154 #include <float.h> | |
| 155 #ifdef MPFR_HAVE_FESETROUND | |
| 156 #include <fenv.h> | |
| 157 #endif | |
| 158 static double get_max (void); | |
| 159 int main() { | |
| 160 double x = 0.5; | |
| 161 int i; | |
| 162 for (i = 1; i <= 11; i++) | |
| 163 x *= x; | |
| 164 if (x != 0) | |
| 165 return 1; | |
| 166 #ifdef MPFR_HAVE_FESETROUND | |
| 167 /* Useful test for the G4 PowerPC */ | |
| 168 fesetround(FE_TOWARDZERO); | |
| 169 x = get_max (); | |
| 170 x *= 2.0; | |
| 171 if (x != get_max ()) | |
| 172 return 1; | |
| 173 #endif | |
| 174 return 0; | |
| 175 } | |
| 176 static double get_max (void) { return DBL_MAX; } | |
| 177 ], [mpfr_cv_gcc_floatconv_bug="no"], | |
| 178 [mpfr_cv_gcc_floatconv_bug="yes, use -ffloat-store"], | |
| 179 [mpfr_cv_gcc_floatconv_bug="cannot test, use -ffloat-store"]) | |
| 180 LIBS="$saved_LIBS" | |
| 181 ]) | |
| 182 if test "$mpfr_cv_gcc_floatconv_bug" != "no"; then | |
| 183 CFLAGS="$CFLAGS -ffloat-store" | |
| 184 fi | |
| 185 fi | |
| 186 | |
| 187 dnl Check if denormalized numbers are supported | |
| 188 AC_CACHE_CHECK([for denormalized numbers], mpfr_cv_have_denorms, [ | |
| 189 AC_TRY_RUN([ | |
| 190 #include <math.h> | |
| 191 #include <stdio.h> | |
| 192 int main() { | |
| 193 double x = 2.22507385850720138309e-308; | |
| 194 fprintf (stderr, "%e\n", x / 2.0); | |
| 195 return 2.0 * (x / 2.0) != x; | |
| 196 } | |
| 197 ], mpfr_cv_have_denorms=yes, mpfr_cv_have_denorms=no, mpfr_cv_have_denorms=no) | |
| 198 ]) | |
| 199 if test "$mpfr_cv_have_denorms" = "yes"; then | |
| 200 AC_DEFINE(HAVE_DENORMS,1,[Define if denormalized floats work.]) | |
| 201 fi | |
| 202 | |
| 203 dnl Check whether NAN != NAN (as required by the IEEE-754 standard, | |
| 204 dnl but not by the ISO C standard). For instance, this is false with | |
| 205 dnl MIPSpro 7.3.1.3m under IRIX64. By default, assume this is true. | |
| 206 AC_CACHE_CHECK([if NAN == NAN], mpfr_cv_nanisnan, [ | |
| 207 AC_TRY_RUN([ | |
| 208 #include <stdio.h> | |
| 209 #include <math.h> | |
| 210 #ifndef NAN | |
| 211 # define NAN (0.0/0.0) | |
| 212 #endif | |
| 213 int main() { | |
| 214 double d; | |
| 215 d = NAN; | |
| 216 return d != d; | |
| 217 } | |
| 218 ], [mpfr_cv_nanisnan="yes"], | |
| 219 [mpfr_cv_nanisnan="no"], | |
| 220 [mpfr_cv_nanisnan="cannot test, assume no"]) | |
| 221 ]) | |
| 222 if test "$mpfr_cv_nanisnan" = "yes"; then | |
| 223 AC_DEFINE(MPFR_NANISNAN,1,[Define if NAN == NAN.]) | |
| 224 AC_MSG_WARN([The test NAN != NAN is false. The probable reason is that]) | |
| 225 AC_MSG_WARN([your compiler optimizes floating-point expressions in an]) | |
| 226 AC_MSG_WARN([unsafe way because some option, such as -ffast-math or]) | |
| 227 AC_MSG_WARN([-fast (depending on the compiler), has been used. You]) | |
| 228 AC_MSG_WARN([should NOT use such an option, otherwise MPFR functions]) | |
| 229 AC_MSG_WARN([such as mpfr_get_d and mpfr_set_d may return incorrect]) | |
| 230 AC_MSG_WARN([results on special FP numbers (e.g. NaN or signed zeros).]) | |
| 231 AC_MSG_WARN([If you did not use such an option, please send us a bug]) | |
| 232 AC_MSG_WARN([report so that we can try to find a workaround for your]) | |
| 233 AC_MSG_WARN([platform and/or document the behavior.]) | |
| 234 fi | |
| 235 | |
| 236 dnl Check if the chars '0' to '9' are consecutive values | |
| 237 AC_MSG_CHECKING([if charset has consecutive values]) | |
| 238 AC_RUN_IFELSE(AC_LANG_PROGRAM([[ | |
| 239 char *number = "0123456789"; | |
| 240 char *lower = "abcdefghijklmnopqrstuvwxyz"; | |
| 241 char *upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | |
| 242 ]],[[ | |
| 243 int i; | |
| 244 unsigned char *p; | |
| 245 for (p = (unsigned char*) number, i = 0; i < 9; i++) | |
| 246 if ( (*p)+1 != *(p+1) ) return 1; | |
| 247 for (p = (unsigned char*) lower, i = 0; i < 25; i++) | |
| 248 if ( (*p)+1 != *(p+1) ) return 1; | |
| 249 for (p = (unsigned char*) upper, i = 0; i < 25; i++) | |
| 250 if ( (*p)+1 != *(p+1) ) return 1; | |
| 251 ]]), [AC_MSG_RESULT(yes)],[ | |
| 252 AC_MSG_RESULT(no) | |
| 253 AC_DEFINE(MPFR_NO_CONSECUTIVE_CHARSET,1,[Charset is not consecutive]) | |
| 254 ], [AC_MSG_RESULT(can not test)]) | |
| 255 | |
| 256 dnl Must be checked with the LIBM | |
| 257 dnl but we don't want to add the LIBM to MPFR dependency. | |
| 258 dnl Can't use AC_CHECK_FUNCS since the function may be in LIBM but | |
| 259 dnl not exported in math.h | |
| 260 saved_LIBS="$LIBS" | |
| 261 LIBS="$LIBS $MPFR_LIBM" | |
| 262 dnl AC_CHECK_FUNCS([round trunc floor ceil nearbyint]) | |
| 263 AC_MSG_CHECKING(for math/round) | |
| 264 AC_LINK_IFELSE([AC_LANG_PROGRAM([[ | |
| 265 #include <math.h> | |
| 266 int f (double (*func)(double)) { return 0;} | |
| 267 ]], [[ | |
| 268 double a = 17.42; | |
| 269 a = f (round); | |
| 270 return 0; | |
| 271 ]])], [ | |
| 272 AC_MSG_RESULT(yes) | |
| 273 AC_DEFINE(HAVE_ROUND, 1,[Have ISO-C99 round function]) | |
| 274 ],[AC_MSG_RESULT(no)]) | |
| 275 | |
| 276 AC_MSG_CHECKING(for math/trunc) | |
| 277 AC_LINK_IFELSE([AC_LANG_PROGRAM([[ | |
| 278 #include <math.h> | |
| 279 int f (double (*func)(double)) { return 0;} | |
| 280 ]], [[ | |
| 281 double a = 17.42; | |
| 282 a = f(trunc); | |
| 283 return 0; | |
| 284 ]])], [ | |
| 285 AC_MSG_RESULT(yes) | |
| 286 AC_DEFINE(HAVE_TRUNC, 1,[Have ISO-C99 trunc function]) | |
| 287 ],[AC_MSG_RESULT(no)]) | |
| 288 | |
| 289 AC_MSG_CHECKING(for math/floor) | |
| 290 AC_LINK_IFELSE([AC_LANG_PROGRAM([[ | |
| 291 #include <math.h> | |
| 292 int f (double (*func)(double)) { return 0;} | |
| 293 ]], [[ | |
| 294 double a = 17.42; | |
| 295 a = f(floor); | |
| 296 return 0; | |
| 297 ]])], [ | |
| 298 AC_MSG_RESULT(yes) | |
| 299 AC_DEFINE(HAVE_FLOOR, 1,[Have ISO-C99 floor function]) | |
| 300 ],[AC_MSG_RESULT(no)]) | |
| 301 | |
| 302 AC_MSG_CHECKING(for math/ceil) | |
| 303 AC_LINK_IFELSE([AC_LANG_PROGRAM([[ | |
| 304 #include <math.h> | |
| 305 int f (double (*func)(double)) { return 0;} | |
| 306 ]], [[ | |
| 307 double a = 17.42; | |
| 308 a = f(ceil); | |
| 309 return 0; | |
| 310 ]])], [ | |
| 311 AC_MSG_RESULT(yes) | |
| 312 AC_DEFINE(HAVE_CEIL, 1,[Have ISO-C99 ceil function]) | |
| 313 ],[AC_MSG_RESULT(no)]) | |
| 314 | |
| 315 AC_MSG_CHECKING(for math/rint) | |
| 316 AC_LINK_IFELSE([AC_LANG_PROGRAM([[ | |
| 317 #include <math.h> | |
| 318 int f (double (*func)(double)) { return 0;} | |
| 319 ]], [[ | |
| 320 double a = 17.42; | |
| 321 a = f(nearbyint); | |
| 322 return 0; | |
| 323 ]])], [ | |
| 324 AC_MSG_RESULT(yes) | |
| 325 AC_DEFINE(HAVE_NEARBYINT, 1,[Have ISO-C99 rint function]) | |
| 326 ],[AC_MSG_RESULT(no)]) | |
| 327 | |
| 328 LIBS="$saved_LIBS" | |
| 329 | |
| 330 dnl Now try to check the long double format | |
| 331 MPFR_C_LONG_DOUBLE_FORMAT | |
| 332 | |
| 333 dnl Check if thread-local variables are supported. | |
| 334 dnl At least two problems can occur in practice: | |
| 335 dnl 1. The compilation fails, e.g. because the compiler doesn't know | |
| 336 dnl about the __thread keyword. | |
| 337 dnl 2. The compilation succeeds, but the system doesn't support TLS or | |
| 338 dnl there is some ld configuration problem. One of the effects can | |
| 339 dnl be that thread-local variables always evaluate to 0. So, it is | |
| 340 dnl important to run the test below. | |
| 341 if test "$enable_thread_safe" = yes; then | |
| 342 AC_CACHE_CHECK([for TLS support], mpfr_cv_working_tls, [ | |
| 343 saved_CPPFLAGS="$CPPFLAGS" | |
| 344 # The -I$srcdir is necessary when objdir is different from srcdir. | |
| 345 CPPFLAGS="$CPPFLAGS -I$srcdir" | |
| 346 AC_RUN_IFELSE([ | |
| 347 #define MPFR_USE_THREAD_SAFE 1 | |
| 348 #include "mpfr-thread.h" | |
| 349 MPFR_THREAD_ATTR int x = 17; | |
| 350 int main() { | |
| 351 return x != 17; | |
| 352 } | |
| 353 ], [mpfr_cv_working_tls="yes"], | |
| 354 [AC_MSG_RESULT(no) | |
| 355 AC_MSG_ERROR([please configure with --disable-thread-safe])], | |
| 356 [mpfr_cv_working_tls="cannot test, assume yes"]) | |
| 357 CPPFLAGS="$saved_CPPFLAGS" | |
| 358 ]) | |
| 359 fi | |
| 360 ]) | |
| 361 | |
| 362 | |
| 363 dnl MPFR_C_LONG_DOUBLE_FORMAT | |
| 364 dnl ------------------------- | |
| 365 dnl Determine the format of a long double. | |
| 366 dnl | |
| 367 dnl The object file is grepped, so as to work when cross compiling. A | |
| 368 dnl start and end sequence is included to avoid false matches, and | |
| 369 dnl allowance is made for the desired data crossing an "od -b" line | |
| 370 dnl boundary. The test number is a small integer so it should appear | |
| 371 dnl exactly, no rounding or truncation etc. | |
| 372 dnl | |
| 373 dnl "od -b" is supported even by Unix V7, and the awk script used doesn't | |
| 374 dnl have functions or anything, so even an "old" awk should suffice. | |
| 375 dnl | |
| 376 dnl The 10-byte IEEE extended format is generally padded to either 12 or 16 | |
| 377 dnl bytes for alignment purposes. The SVR4 i386 ABI is 12 bytes, or i386 | |
| 378 dnl gcc -m128bit-long-double selects 16 bytes. IA-64 is 16 bytes in LP64 | |
| 379 dnl mode, or 12 bytes in ILP32 mode. The first 10 bytes is the relevant | |
| 380 dnl part in all cases (big and little endian). | |
| 381 dnl | |
| 382 dnl Enhancements: | |
| 383 dnl | |
| 384 dnl Could match more formats, but no need to worry until there's code | |
| 385 dnl wanting to use them. | |
| 386 dnl | |
| 387 dnl Don't want to duplicate the double matching from GMP_C_DOUBLE_FORMAT, | |
| 388 dnl perhaps we should merge with that macro, to match data formats | |
| 389 dnl irrespective of the C type in question. Or perhaps just let the code | |
| 390 dnl use DOUBLE macros when sizeof(double)==sizeof(long double). | |
| 391 | |
| 392 AC_DEFUN([MPFR_C_LONG_DOUBLE_FORMAT], | |
| 393 [AC_REQUIRE([AC_PROG_CC]) | |
| 394 AC_REQUIRE([AC_PROG_AWK]) | |
| 395 AC_REQUIRE([AC_OBJEXT]) | |
| 396 AC_CHECK_TYPES([long double]) | |
| 397 AC_CACHE_CHECK([format of `long double' floating point], | |
| 398 mpfr_cv_c_long_double_format, | |
| 399 [mpfr_cv_c_long_double_format=unknown | |
| 400 if test "$ac_cv_type_long_double" != yes; then | |
| 401 mpfr_cv_c_long_double_format="not available" | |
| 402 else | |
| 403 cat >conftest.c <<\EOF | |
| 404 [ | |
| 405 /* "before" is 16 bytes to ensure there's no padding between it and "x". | |
| 406 We're not expecting any "long double" bigger than 16 bytes or with | |
| 407 alignment requirements stricter than 16 bytes. */ | |
| 408 struct { | |
| 409 char before[16]; | |
| 410 long double x; | |
| 411 char after[8]; | |
| 412 } foo = { | |
| 413 { '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', | |
| 414 '\001', '\043', '\105', '\147', '\211', '\253', '\315', '\357' }, | |
| 415 -123456789.0, | |
| 416 { '\376', '\334', '\272', '\230', '\166', '\124', '\062', '\020' } | |
| 417 }; | |
| 418 ] | |
| 419 EOF | |
| 420 mpfr_compile="$CC $CFLAGS $CPPFLAGS -c conftest.c >&AC_FD_CC 2>&1" | |
| 421 if AC_TRY_EVAL(mpfr_compile); then | |
| 422 cat >conftest.awk <<\EOF | |
| 423 [ | |
| 424 BEGIN { | |
| 425 found = 0 | |
| 426 } | |
| 427 | |
| 428 # got[] holds a sliding window of bytes read the input. got[0] is the most | |
| 429 # recent byte read, and got[31] the oldest byte read, so when looking to | |
| 430 # match some data the indices are "reversed". | |
| 431 # | |
| 432 { | |
| 433 for (f = 2; f <= NF; f++) | |
| 434 { | |
| 435 # new byte, shift others up | |
| 436 for (i = 31; i >= 0; i--) | |
| 437 got[i+1] = got[i]; | |
| 438 got[0] = $f; | |
| 439 | |
| 440 # end sequence | |
| 441 if (got[7] != "376") continue | |
| 442 if (got[6] != "334") continue | |
| 443 if (got[5] != "272") continue | |
| 444 if (got[4] != "230") continue | |
| 445 if (got[3] != "166") continue | |
| 446 if (got[2] != "124") continue | |
| 447 if (got[1] != "062") continue | |
| 448 if (got[0] != "020") continue | |
| 449 | |
| 450 # start sequence, with 12-byte body | |
| 451 if (got[27] == "001" && \ | |
| 452 got[26] == "043" && \ | |
| 453 got[25] == "105" && \ | |
| 454 got[24] == "147" && \ | |
| 455 got[23] == "211" && \ | |
| 456 got[22] == "253" && \ | |
| 457 got[21] == "315" && \ | |
| 458 got[20] == "357") | |
| 459 { | |
| 460 saw = " (" got[19] \ | |
| 461 " " got[18] \ | |
| 462 " " got[17] \ | |
| 463 " " got[16] \ | |
| 464 " " got[15] \ | |
| 465 " " got[14] \ | |
| 466 " " got[13] \ | |
| 467 " " got[12] \ | |
| 468 " " got[11] \ | |
| 469 " " got[10] \ | |
| 470 " " got[9] \ | |
| 471 " " got[8] ")" | |
| 472 | |
| 473 if (got[19] == "000" && \ | |
| 474 got[18] == "000" && \ | |
| 475 got[17] == "000" && \ | |
| 476 got[16] == "000" && \ | |
| 477 got[15] == "240" && \ | |
| 478 got[14] == "242" && \ | |
| 479 got[13] == "171" && \ | |
| 480 got[12] == "353" && \ | |
| 481 got[11] == "031" && \ | |
| 482 got[10] == "300") | |
| 483 { | |
| 484 print "IEEE extended, little endian" | |
| 485 found = 1 | |
| 486 exit | |
| 487 } | |
| 488 } | |
| 489 | |
| 490 # start sequence, with 16-byte body | |
| 491 if (got[31] == "001" && \ | |
| 492 got[30] == "043" && \ | |
| 493 got[29] == "105" && \ | |
| 494 got[28] == "147" && \ | |
| 495 got[27] == "211" && \ | |
| 496 got[26] == "253" && \ | |
| 497 got[25] == "315" && \ | |
| 498 got[24] == "357") | |
| 499 { | |
| 500 saw = " (" got[23] \ | |
| 501 " " got[22] \ | |
| 502 " " got[21] \ | |
| 503 " " got[20] \ | |
| 504 " " got[19] \ | |
| 505 " " got[18] \ | |
| 506 " " got[17] \ | |
| 507 " " got[16] \ | |
| 508 " " got[15] \ | |
| 509 " " got[14] \ | |
| 510 " " got[13] \ | |
| 511 " " got[12] \ | |
| 512 " " got[11] \ | |
| 513 " " got[10] \ | |
| 514 " " got[9] \ | |
| 515 " " got[8] ")" | |
| 516 | |
| 517 if (got[23] == "000" && \ | |
| 518 got[22] == "000" && \ | |
| 519 got[21] == "000" && \ | |
| 520 got[20] == "000" && \ | |
| 521 got[19] == "240" && \ | |
| 522 got[18] == "242" && \ | |
| 523 got[17] == "171" && \ | |
| 524 got[16] == "353" && \ | |
| 525 got[15] == "031" && \ | |
| 526 got[14] == "300") | |
| 527 { | |
| 528 print "IEEE extended, little endian" | |
| 529 found = 1 | |
| 530 exit | |
| 531 } | |
| 532 | |
| 533 if (got[23] == "300" && \ | |
| 534 got[22] == "031" && \ | |
| 535 got[21] == "326" && \ | |
| 536 got[20] == "363" && \ | |
| 537 got[19] == "105" && \ | |
| 538 got[18] == "100" && \ | |
| 539 got[17] == "000" && \ | |
| 540 got[16] == "000" && \ | |
| 541 got[15] == "000" && \ | |
| 542 got[14] == "000" && \ | |
| 543 got[13] == "000" && \ | |
| 544 got[12] == "000" && \ | |
| 545 got[11] == "000" && \ | |
| 546 got[10] == "000" && \ | |
| 547 got[9] == "000" && \ | |
| 548 got[8] == "000") | |
| 549 { | |
| 550 print "IEEE quad, big endian" | |
| 551 found = 1 | |
| 552 exit | |
| 553 } | |
| 554 } | |
| 555 } | |
| 556 } | |
| 557 | |
| 558 END { | |
| 559 if (! found) | |
| 560 print "unknown", saw | |
| 561 } | |
| 562 ] | |
| 563 EOF | |
| 564 mpfr_cv_c_long_double_format=`od -b conftest.$OBJEXT | $AWK -f conftest.awk` | |
| 565 case $mpfr_cv_c_long_double_format in | |
| 566 unknown*) | |
| 567 echo "cannot match anything, conftest.$OBJEXT contains" >&AC_FD_CC | |
| 568 od -b conftest.$OBJEXT >&AC_FD_CC | |
| 569 ;; | |
| 570 esac | |
| 571 else | |
| 572 AC_MSG_WARN([oops, cannot compile test program]) | |
| 573 fi | |
| 574 fi | |
| 575 rm -f conftest* | |
| 576 ]) | |
| 577 | |
| 578 AH_VERBATIM([HAVE_LDOUBLE], | |
| 579 [/* Define one of the following to 1 for the format of a `long double'. | |
| 580 If your format is not among these choices, or you don't know what it is, | |
| 581 then leave all undefined. | |
| 582 IEEE_EXT is the 10-byte IEEE extended precision format. | |
| 583 IEEE_QUAD is the 16-byte IEEE quadruple precision format. | |
| 584 LITTLE or BIG is the endianness. */ | |
| 585 #undef HAVE_LDOUBLE_IEEE_EXT_LITTLE | |
| 586 #undef HAVE_LDOUBLE_IEEE_QUAD_BIG]) | |
| 587 | |
| 588 case $mpfr_cv_c_long_double_format in | |
| 589 "IEEE extended, little endian") | |
| 590 AC_DEFINE(HAVE_LDOUBLE_IEEE_EXT_LITTLE, 1) | |
| 591 ;; | |
| 592 "IEEE quad, big endian") | |
| 593 AC_DEFINE(HAVE_LDOUBLE_IEEE_QUAD_BIG, 1) | |
| 594 ;; | |
| 595 unknown* | "not available") | |
| 596 ;; | |
| 597 *) | |
| 598 AC_MSG_WARN([oops, unrecognised float format: $mpfr_cv_c_long_double_format]
) | |
| 599 ;; | |
| 600 esac | |
| 601 ]) | |
| 602 | |
| 603 | |
| 604 dnl MPFR_CHECK_LIBM | |
| 605 dnl --------------- | |
| 606 dnl Determine a math library -lm to use. | |
| 607 | |
| 608 AC_DEFUN([MPFR_CHECK_LIBM], | |
| 609 [AC_REQUIRE([AC_CANONICAL_HOST]) | |
| 610 AC_SUBST(MPFR_LIBM,'') | |
| 611 case $host in | |
| 612 *-*-beos* | *-*-cygwin* | *-*-pw32*) | |
| 613 # According to libtool AC CHECK LIBM, these systems don't have libm | |
| 614 ;; | |
| 615 *-*-hpux*) | |
| 616 # -lM means something subtly different to -lm, SVID style error handling | |
| 617 # or something. FIXME: Why exactly do we want this? | |
| 618 AC_CHECK_LIB(M, main, MPFR_LIBM="-lM") | |
| 619 ;; | |
| 620 *-*-solaris*) | |
| 621 # On Solaris the math functions new in C99 are in -lm9x. | |
| 622 # FIXME: Do we need -lm9x as well as -lm, or just instead of? | |
| 623 AC_CHECK_LIB(m9x, main, MPFR_LIBM="-lm9x") | |
| 624 AC_CHECK_LIB(m, main, MPFR_LIBM="$MPFR_LIBM -lm") | |
| 625 ;; | |
| 626 *-ncr-sysv4.3*) | |
| 627 # FIXME: What does -lmw mean? Libtool AC CHECK LIBM does it this way. | |
| 628 AC_CHECK_LIB(mw, _mwvalidcheckl, MPFR_LIBM="-lmw") | |
| 629 AC_CHECK_LIB(m, main, MPFR_LIBM="$MPFR_LIBM -lm") | |
| 630 ;; | |
| 631 *) | |
| 632 AC_CHECK_LIB(m, main, MPFR_LIBM="-lm") | |
| 633 ;; | |
| 634 esac | |
| 635 ]) | |
| 636 | |
| 637 | |
| 638 dnl MPFR_LD_SEARCH_PATHS_FIRST | |
| 639 dnl -------------------------- | |
| 640 | |
| 641 AC_DEFUN([MPFR_LD_SEARCH_PATHS_FIRST], | |
| 642 [case "$LD $LDFLAGS" in | |
| 643 *-Wl,-search_paths_first*) ;; | |
| 644 *) AC_MSG_CHECKING([if the compiler understands -Wl,-search_paths_first]) | |
| 645 saved_LDFLAGS="$LDFLAGS" | |
| 646 LDFLAGS="-Wl,-search_paths_first $LDFLAGS" | |
| 647 AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], | |
| 648 [AC_MSG_RESULT(yes)], | |
| 649 [AC_MSG_RESULT(no)] | |
| 650 LDFLAGS="$saved_LDFLAGS") | |
| 651 ;; | |
| 652 esac | |
| 653 ]) | |
| 654 | |
| 655 | |
| 656 dnl GMP_C_ATTRIBUTE_MODE | |
| 657 dnl -------------------- | |
| 658 dnl Introduced in gcc 2.2, but perhaps not in all Apple derived versions. | |
| 659 dnl Needed for mpfr-longlong.h; this is currently necessary for s390. | |
| 660 dnl | |
| 661 dnl TODO: Replace this with a cleaner type size detection, as this | |
| 662 dnl solution only works with gcc and assumes CHAR_BIT == 8. Probably use | |
| 663 dnl <stdint.h>, and <http://gcc.gnu.org/viewcvs/trunk/config/stdint.m4> | |
| 664 dnl as a fallback. | |
| 665 | |
| 666 AC_DEFUN([GMP_C_ATTRIBUTE_MODE], | |
| 667 [AC_CACHE_CHECK([whether gcc __attribute__ ((mode (XX))) works], | |
| 668 gmp_cv_c_attribute_mode, | |
| 669 [AC_TRY_COMPILE([typedef int SItype __attribute__ ((mode (SI)));], , | |
| 670 gmp_cv_c_attribute_mode=yes, gmp_cv_c_attribute_mode=no) | |
| 671 ]) | |
| 672 if test $gmp_cv_c_attribute_mode = yes; then | |
| 673 AC_DEFINE(HAVE_ATTRIBUTE_MODE, 1, | |
| 674 [Define to 1 if the compiler accepts gcc style __attribute__ ((mode (XX)))]) | |
| 675 fi | |
| 676 ]) | |
| 677 | |
| 678 | |
| 679 dnl MPFR_FUNC_PRINTF_SPEC | |
| 680 dnl ------------------------------------ | |
| 681 dnl MPFR_FUNC_PRINTF_SPEC(spec, type, [includes], [lib-prefix], [if-true], [if-
false]) | |
| 682 dnl Check if printf supports the conversion specification 'spec' | |
| 683 dnl with type 'type'. | |
| 684 dnl Expand 'if-true' if printf supports 'spec', 'if-false' otherwise. | |
| 685 | |
| 686 AC_DEFUN([MPFR_FUNC_PRINTF_SPEC],[ | |
| 687 AC_MSG_CHECKING(if $4printf supports "$1") | |
| 688 AC_RUN_IFELSE([AC_LANG_PROGRAM([[ | |
| 689 #include <stdio.h> | |
| 690 $3 | |
| 691 ]], [[ | |
| 692 char s[256]; | |
| 693 $2 a = 0; | |
| 694 return ($4sprintf (s, "$1", a) != 1) ? 1 : 0; | |
| 695 ]])], | |
| 696 [AC_MSG_RESULT(yes) | |
| 697 $5], | |
| 698 [AC_MSG_RESULT(no) | |
| 699 $6]) | |
| 700 ]) | |
| 701 | |
| 702 | |
| 703 dnl MPFR_CHECK_PRINTF_SPEC | |
| 704 dnl ---------------------- | |
| 705 dnl Check if libc printf and gmp_printf support some optional length | |
| 706 dnl modifiers. | |
| 707 dnl Defined symbols are negative to shorten the gcc command line. | |
| 708 | |
| 709 AC_DEFUN([MPFR_CHECK_PRINTF_SPEC], [ | |
| 710 AC_REQUIRE([MPFR_CONFIGS])dnl | |
| 711 if test "$ac_cv_type_intmax_t" == yes; then | |
| 712 MPFR_FUNC_PRINTF_SPEC([%jd], [intmax_t], [ | |
| 713 #ifdef HAVE_STDINT_H | |
| 714 # include <stdint.h> | |
| 715 #endif | |
| 716 #ifdef HAVE_INTTYPES_H | |
| 717 # include <inttypes.h> | |
| 718 #endif | |
| 719 | |
| 720 #include <gmp.h> | |
| 721 ], [gmp_],, | |
| 722 [AC_DEFINE([NPRINTF_J], 1, [gmp_printf cannot read intmax_t])]) | |
| 723 fi | |
| 724 | |
| 725 MPFR_FUNC_PRINTF_SPEC([%hhd], [char], [ | |
| 726 #include <gmp.h> | |
| 727 ], [gmp_],, | |
| 728 [AC_DEFINE([NPRINTF_HH], 1, [gmp_printf cannot use 'hh' length modifier
])]) | |
| 729 | |
| 730 MPFR_FUNC_PRINTF_SPEC([%lld], [long long int], [ | |
| 731 #include <gmp.h> | |
| 732 ], [gmp_],, | |
| 733 [AC_DEFINE([NPRINTF_LL], 1, [gmp_printf cannot read long long int])]) | |
| 734 | |
| 735 MPFR_FUNC_PRINTF_SPEC([%.0Lf], [long double], [ | |
| 736 #include <gmp.h> | |
| 737 ], [gmp_],, | |
| 738 [AC_DEFINE([NPRINTF_L], 1, [gmp_printf cannot read long double])]) | |
| 739 | |
| 740 MPFR_FUNC_PRINTF_SPEC([%td], [ptrdiff_t], [ | |
| 741 #if defined (__cplusplus) | |
| 742 #include <cstddef> | |
| 743 #else | |
| 744 #include <stddef.h> | |
| 745 #endif | |
| 746 #include "gmp.h" | |
| 747 ], [gmp_],, | |
| 748 [AC_DEFINE([NPRINTF_T], 1, [gmp_printf cannot read ptrdiff_t])]) | |
| 749 ]) | |
| OLD | NEW |