1 dnl GMP specific autoconf macros
4 dnl Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, 2011 Free
5 dnl Software Foundation, Inc.
7 dnl This file is part of the GNU MP Library.
9 dnl The GNU MP Library is free software; you can redistribute it and/or modify
10 dnl it under the terms of the GNU Lesser General Public License as published
11 dnl by the Free Software Foundation; either version 3 of the License, or (at
12 dnl your option) any later version.
14 dnl The GNU MP Library is distributed in the hope that it will be useful, but
15 dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17 dnl License for more details.
19 dnl You should have received a copy of the GNU Lesser General Public License
20 dnl along with the GNU MP Library. If not, see http://www.gnu.org/licenses/.
23 dnl Some tests use, or must delete, the default compiler output. The
24 dnl possible filenames are based on what autoconf looks for, namely
26 dnl a.out - normal unix style
27 dnl b.out - i960 systems, including gcc there
29 dnl a_out.exe - OpenVMS DEC C called via GNV wrapper (gnv.sourceforge.net)
30 dnl conftest.exe - various DOS compilers
34 [[ia64*-*-* | itanium-*-* | itanium2-*-*]])
36 dnl Need to be careful not to match m6811, m6812, m68hc11 and m68hc12, all
37 dnl of which config.sub accepts. (Though none of which are likely to work
41 [[m68k-*-* | m68[0-9][0-9][0-9]-*-*]])
43 define(POWERPC64_PATTERN,
44 [[powerpc64-*-* | powerpc64le-*-* | powerpc620-*-* | powerpc630-*-* | powerpc970-*-* | power[3-9]-*-*]])
47 [[s390-*-* | z900esa-*-* | z990esa-*-* | z9esa-*-* | z10esa-*-* | z196esa-*-*]])
50 [[s390x-*-* | z900-*-* | z990-*-* | z9-*-* | z10-*-* | z196-*-*]])
53 [[i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-*]])
55 define(X86_64_PATTERN,
56 [[athlon64-*-* | k8-*-* | k10-*-* | bobcat-*-* | bulldozer-*-* | pentium4-*-* | atom-*-* | core2-*-* | corei*-*-* | x86_64-*-* | nano-*-*]])
58 dnl GMP_FAT_SUFFIX(DSTVAR, DIRECTORY)
59 dnl ---------------------------------
60 dnl Emit code to set shell variable DSTVAR to the suffix for a fat binary
61 dnl routine from DIRECTORY. DIRECTORY can be a shell expression like $foo
64 dnl The suffix is directory separators / or \ changed to underscores, and
65 dnl if there's more than one directory part, then the first is dropped.
71 dnl x86/k6/mmx -> k6_mmx
73 define(GMP_FAT_SUFFIX,
74 [[$1=`echo $2 | sed -e '/\//s:^[^/]*/::' -e 's:[\\/]:_:g'`]])
77 dnl GMP_REMOVE_FROM_LIST(listvar,item)
78 dnl ----------------------------------
79 dnl Emit code to remove any occurrence of ITEM from $LISTVAR. ITEM can be a
80 dnl shell expression like $foo if desired.
82 define(GMP_REMOVE_FROM_LIST,
83 [remove_from_list_tmp=
84 for remove_from_list_i in $[][$1]; do
85 if test $remove_from_list_i = [$2]; then :;
87 remove_from_list_tmp="$remove_from_list_tmp $remove_from_list_i"
90 [$1]=$remove_from_list_tmp
94 dnl GMP_STRIP_PATH(subdir)
95 dnl ----------------------
96 dnl Strip entries */subdir from $path and $fat_path.
98 define(GMP_STRIP_PATH,
99 [GMP_STRIP_PATH_VAR(path, [$1])
100 GMP_STRIP_PATH_VAR(fat_path, [$1])
103 define(GMP_STRIP_PATH_VAR,
108 *) tmp_path="$tmp_path $i" ;;
115 dnl GMP_INCLUDE_GMP_H
116 dnl -----------------
117 dnl Expand to the right way to #include gmp-h.in. This must be used
118 dnl instead of gmp.h, since that file isn't generated until the end of the
121 dnl Dummy value for GMP_LIMB_BITS is enough
122 dnl for all current configure-time uses of gmp.h.
124 define(GMP_INCLUDE_GMP_H,
125 [[#define __GMP_WITHIN_CONFIGURE 1 /* ignore template stuff */
126 #define GMP_NAIL_BITS $GMP_NAIL_BITS
127 #define GMP_LIMB_BITS 123
129 #include "$srcdir/gmp-h.in"]
133 dnl GMP_HEADER_GETVAL(NAME,FILE)
134 dnl ----------------------------
135 dnl Expand at autoconf time to the value of a "#define NAME" from the given
136 dnl FILE. The regexps here aren't very rugged, but are enough for gmp.
137 dnl /dev/null as a parameter prevents a hang if $2 is accidentally omitted.
139 define(GMP_HEADER_GETVAL,
141 esyscmd([grep "^#define $1 " $2 /dev/null 2>/dev/null]),
149 dnl The gmp version number, extracted from the #defines in gmp-h.in at
150 dnl autoconf time. Two digits like 3.0 if patchlevel <= 0, or three digits
151 dnl like 3.0.1 if patchlevel > 0.
154 [GMP_HEADER_GETVAL(__GNU_MP_VERSION,gmp-h.in)[]dnl
155 .GMP_HEADER_GETVAL(__GNU_MP_VERSION_MINOR,gmp-h.in)[]dnl
156 .GMP_HEADER_GETVAL(__GNU_MP_VERSION_PATCHLEVEL,gmp-h.in)])
159 dnl GMP_SUBST_CHECK_FUNCS(func,...)
160 dnl ------------------------------
161 dnl Setup an AC_SUBST of HAVE_FUNC_01 for each argument.
163 AC_DEFUN([GMP_SUBST_CHECK_FUNCS],
165 [_GMP_SUBST_CHECK_FUNCS(ac_cv_func_[$1],HAVE_[]m4_translit([$1],[a-z],[A-Z])_01)
166 GMP_SUBST_CHECK_FUNCS(m4_shift($@))])])
168 dnl Called: _GMP_SUBST_CHECK_FUNCS(cachevar,substvar)
169 AC_DEFUN([_GMP_SUBST_CHECK_FUNCS],
171 yes) AC_SUBST([$2],1) ;;
177 dnl GMP_SUBST_CHECK_HEADERS(foo.h,...)
178 dnl ----------------------------------
179 dnl Setup an AC_SUBST of HAVE_FOO_H_01 for each argument.
181 AC_DEFUN([GMP_SUBST_CHECK_HEADERS],
183 [_GMP_SUBST_CHECK_HEADERS(ac_cv_header_[]m4_translit([$1],[./],[__]),
184 HAVE_[]m4_translit([$1],[a-z./],[A-Z__])_01)
185 GMP_SUBST_CHECK_HEADERS(m4_shift($@))])])
187 dnl Called: _GMP_SUBST_CHECK_HEADERS(cachevar,substvar)
188 AC_DEFUN([_GMP_SUBST_CHECK_HEADERS],
190 yes) AC_SUBST([$2],1) ;;
196 dnl GMP_COMPARE_GE(A1,B1, A2,B2, ...)
197 dnl ---------------------------------
198 dnl Compare two version numbers A1.A2.etc and B1.B2.etc. Set
199 dnl $gmp_compare_ge to yes or no according to the result. The A parts
200 dnl should be variables, the B parts fixed numbers. As many parts as
201 dnl desired can be included. An empty string in an A part is taken to be
202 dnl zero, the B parts should be non-empty and non-zero.
206 dnl GMP_COMPARE($major,10, $minor,3, $subminor,1)
208 dnl would test whether $major.$minor.$subminor is greater than or equal to
211 AC_DEFUN([GMP_COMPARE_GE],
213 GMP_COMPARE_GE_INTERNAL($@)
216 AC_DEFUN([GMP_COMPARE_GE_INTERNAL],
218 [if test -n "$1" && test "$1" -ge $2; then
221 [if test -n "$1"; then
222 if test "$1" -gt $2; then
225 if test "$1" -eq $2; then
226 GMP_COMPARE_GE_INTERNAL(m4_shift(m4_shift($@)))
235 dnl GMP additions to $AR.
237 dnl A cross-"ar" may be necessary when cross-compiling since the build
238 dnl system "ar" might try to interpret the object files to build a symbol
239 dnl table index, hence the use of AC_CHECK_TOOL.
241 dnl A user-selected $AR is always left unchanged. AC_CHECK_TOOL is still
242 dnl run to get the "checking" message printed though.
244 dnl If extra flags are added to AR, then ac_cv_prog_AR and
245 dnl ac_cv_prog_ac_ct_AR are set too, since libtool (cvs 2003-03-31 at
246 dnl least) will do an AC_CHECK_TOOL and that will AR from one of those two
247 dnl cached variables. (ac_cv_prog_AR is used if there's an ac_tool_prefix,
248 dnl or ac_cv_prog_ac_ct_AR is used otherwise.) FIXME: This is highly
249 dnl dependent on autoconf internals, perhaps it'd work to put our extra
250 dnl flags into AR_FLAGS instead.
252 dnl $AR_FLAGS is set to "cq" rather than leaving it to libtool "cru". The
253 dnl latter fails when libtool goes into piecewise mode and is unlucky
254 dnl enough to have two same-named objects in separate pieces, as happens
255 dnl for instance to random.o (and others) on vax-dec-ultrix4.5. Naturally
256 dnl a user-selected $AR_FLAGS is left unchanged.
258 dnl For reference, $ARFLAGS is used by automake (1.8) for its ".a" archive
259 dnl file rules. This doesn't get used by the piecewise linking, so we
260 dnl leave it at the default "cru".
262 dnl FIXME: Libtool 1.5.2 has its own arrangements for "cq", but that version
263 dnl is broken in other ways. When we can upgrade, remove the forcible
266 AC_DEFUN([GMP_PROG_AR],
267 [dnl Want to establish $AR before libtool initialization.
268 AC_BEFORE([$0],[AC_PROG_LIBTOOL])
270 AC_CHECK_TOOL(AR, ar, ar)
271 if test -z "$gmp_user_AR"; then
272 eval arflags=\"\$ar${abi1}_flags\"
273 test -n "$arflags" || eval arflags=\"\$ar${abi2}_flags\"
274 if test -n "$arflags"; then
275 AC_MSG_CHECKING([for extra ar flags])
277 ac_cv_prog_AR="$AR $arflags"
278 ac_cv_prog_ac_ct_AR="$AR $arflags"
279 AC_MSG_RESULT([$arflags])
282 if test -z "$AR_FLAGS"; then
290 dnl Find a working m4, either in $PATH or likely locations, and setup $M4
291 dnl and an AC_SUBST accordingly. If $M4 is already set then it's a user
292 dnl choice and is accepted with no checks. GMP_PROG_M4 is like
293 dnl AC_PATH_PROG or AC_CHECK_PROG, but tests each m4 found to see if it's
296 dnl See mpn/asm-defs.m4 for details on the known bad m4s.
298 AC_DEFUN([GMP_PROG_M4],
299 [AC_ARG_VAR(M4,[m4 macro processor])
300 AC_CACHE_CHECK([for suitable m4],
302 [if test -n "$M4"; then
305 cat >conftest.m4 <<\EOF
306 dnl Must protect this against being expanded during autoconf m4!
307 dnl Dont put "dnl"s in this as autoconf will flag an error for unexpanded
309 [define(dollarhash,``$][#'')ifelse(dollarhash(x),1,`define(t1,Y)',
310 ``bad: $][# not supported (SunOS /usr/bin/m4)
311 '')ifelse(eval(89),89,`define(t2,Y)',
312 `bad: eval() doesnt support 8 or 9 in a constant (OpenBSD 2.6 m4)
313 ')ifelse(t1`'t2,YY,`good
316 dnl ' <- balance the quotes for emacs sh-mode
317 echo "trying m4" >&AC_FD_CC
318 gmp_tmp_val=`(m4 conftest.m4) 2>&AC_FD_CC`
319 echo "$gmp_tmp_val" >&AC_FD_CC
320 if test "$gmp_tmp_val" = good; then
323 IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
324 dnl $ac_dummy forces splitting on constant user-supplied paths.
325 dnl POSIX.2 word splitting is done only on the output of word expansions,
326 dnl not every word. This closes a longstanding sh security hole.
327 ac_dummy="$PATH:/usr/5bin"
328 for ac_dir in $ac_dummy; do
329 test -z "$ac_dir" && ac_dir=.
330 echo "trying $ac_dir/m4" >&AC_FD_CC
331 gmp_tmp_val=`($ac_dir/m4 conftest.m4) 2>&AC_FD_CC`
332 echo "$gmp_tmp_val" >&AC_FD_CC
333 if test "$gmp_tmp_val" = good; then
334 gmp_cv_prog_m4="$ac_dir/m4"
339 if test -z "$gmp_cv_prog_m4"; then
340 AC_MSG_ERROR([No usable m4 in \$PATH or /usr/5bin (see config.log for reasons).])
350 dnl GMP_M4_M4WRAP_SPURIOUS
351 dnl ----------------------
352 dnl Check for spurious output from m4wrap(), as described in mpn/asm-defs.m4.
354 dnl The following systems have been seen with the problem.
356 dnl - Unicos alpha, but its assembler doesn't seem to mind.
357 dnl - MacOS X Darwin, its assembler fails.
358 dnl - NetBSD 1.4.1 m68k, and gas 1.92.3 there gives a warning and ignores
359 dnl the bad last line since it doesn't have a newline.
360 dnl - NetBSD 1.4.2 alpha, but its assembler doesn't seem to mind.
363 dnl Enhancement: Maybe this could be in GMP_PROG_M4, and attempt to prefer
364 dnl an m4 with a working m4wrap, if it can be found.
366 AC_DEFUN([GMP_M4_M4WRAP_SPURIOUS],
367 [AC_REQUIRE([GMP_PROG_M4])
368 AC_CACHE_CHECK([if m4wrap produces spurious output],
369 gmp_cv_m4_m4wrap_spurious,
370 [# hide the d-n-l from autoconf's error checking
372 cat >conftest.m4 <<EOF
373 [changequote({,})define(x,)m4wrap({x})$tmp_d_n_l]
375 echo test input is >&AC_FD_CC
376 cat conftest.m4 >&AC_FD_CC
377 tmp_chars=`$M4 conftest.m4 | wc -c`
378 echo produces $tmp_chars chars output >&AC_FD_CC
380 if test $tmp_chars = 0; then
381 gmp_cv_m4_m4wrap_spurious=no
383 gmp_cv_m4_m4wrap_spurious=yes
386 GMP_DEFINE_RAW(["define(<M4WRAP_SPURIOUS>,<$gmp_cv_m4_m4wrap_spurious>)"])
392 dnl GMP additions to libtool AC_PROG_NM.
394 dnl Note that if AC_PROG_NM can't find a working nm it still leaves
395 dnl $NM set to "nm", so $NM can't be assumed to actually work.
397 dnl A user-selected $NM is always left unchanged. AC_PROG_NM is still run
398 dnl to get the "checking" message printed though.
400 dnl Perhaps it'd be worthwhile checking that nm works, by running it on an
401 dnl actual object file. For instance on sparcv9 solaris old versions of
402 dnl GNU nm don't recognise 64-bit objects. Checking would give a better
403 dnl error message than just a failure in later tests like GMP_ASM_W32 etc.
405 dnl On the other hand it's not really normal autoconf practice to take too
406 dnl much trouble over detecting a broken set of tools. And libtool doesn't
407 dnl do anything at all for say ranlib or strip. So for now we're inclined
408 dnl to just demand that the user provides a coherent environment.
410 AC_DEFUN([GMP_PROG_NM],
411 [dnl Make sure we're the first to call AC_PROG_NM, so our extra flags are
412 dnl used by everyone.
413 AC_BEFORE([$0],[AC_PROG_NM])
417 # FIXME: When cross compiling (ie. $ac_tool_prefix not empty), libtool
418 # defaults to plain "nm" if a "${ac_tool_prefix}nm" is not found. In this
419 # case run it again to try the native "nm", firstly so that likely locations
420 # are searched, secondly so that -B or -p are added if necessary for BSD
421 # format. This is necessary for instance on OSF with "./configure
422 # --build=alphaev5-dec-osf --host=alphaev6-dec-osf".
424 if test -z "$gmp_user_NM" && test -n "$ac_tool_prefix" && test "$NM" = nm; then
425 $as_unset lt_cv_path_NM
426 gmp_save_ac_tool_prefix=$ac_tool_prefix
430 ac_tool_prefix=$gmp_save_ac_tool_prefix
433 if test -z "$gmp_user_NM"; then
434 eval nmflags=\"\$nm${abi1}_flags\"
435 test -n "$nmflags" || eval nmflags=\"\$nm${abi2}_flags\"
436 if test -n "$nmflags"; then
437 AC_MSG_CHECKING([for extra nm flags])
439 AC_MSG_RESULT([$nmflags])
445 dnl GMP_PROG_CC_WORKS(cc+cflags,[ACTION-IF-WORKS][,ACTION-IF-NOT-WORKS])
446 dnl --------------------------------------------------------------------
447 dnl Check if cc+cflags can compile and link.
449 dnl This test is designed to be run repeatedly with different cc+cflags
450 dnl selections, so the result is not cached.
452 dnl For a native build, meaning $cross_compiling == no, we require that the
453 dnl generated program will run. This is the same as AC_PROG_CC does in
454 dnl _AC_COMPILER_EXEEXT_WORKS, and checking here will ensure we don't pass
455 dnl a CC/CFLAGS combination that it rejects.
457 dnl sparc-*-solaris2.7 can compile ABI=64 but won't run it if the kernel
458 dnl was booted in 32-bit mode. The effect of requiring the compiler output
459 dnl will run is that a plain native "./configure" falls back on ABI=32, but
460 dnl ABI=64 is still available as a cross-compile.
462 dnl The various specific problems we try to detect are done in separate
463 dnl compiles. Although this is probably a bit slower than one test
464 dnl program, it makes it easy to indicate the problem in AC_MSG_RESULT,
465 dnl hence giving the user a clue about why we rejected the compiler.
467 AC_DEFUN([GMP_PROG_CC_WORKS],
468 [AC_MSG_CHECKING([compiler $1])
469 gmp_prog_cc_works=yes
471 # first see a simple "main()" works, then go on to other checks
472 GMP_PROG_CC_WORKS_PART([$1], [])
474 GMP_PROG_CC_WORKS_PART([$1], [function pointer return],
475 [/* The following provokes an internal error from gcc 2.95.2 -mpowerpc64
476 (without -maix64), hence detecting an unusable compiler */
477 void *g() { return (void *) 0; }
478 void *f() { return g(); }
481 GMP_PROG_CC_WORKS_PART([$1], [cmov instruction],
482 [/* The following provokes an invalid instruction syntax from i386 gcc
483 -march=pentiumpro on Solaris 2.8. The native sun assembler
484 requires a non-standard syntax for cmov which gcc (as of 2.95.2 at
485 least) doesn't know. */
487 int cmov () { return (n >= 0 ? n : 0); }
490 GMP_PROG_CC_WORKS_PART([$1], [double -> ulong conversion],
491 [/* The following provokes a linker invocation problem with gcc 3.0.3
492 on AIX 4.3 under "-maix64 -mpowerpc64 -mcpu=630". The -mcpu=630
493 option causes gcc to incorrectly select the 32-bit libgcc.a, not
494 the 64-bit one, and consequently it misses out on the __fixunsdfdi
495 helper (double -> uint64 conversion). */
497 unsigned long gcc303 () { return (unsigned long) d; }
500 GMP_PROG_CC_WORKS_PART([$1], [double negation],
501 [/* The following provokes an error from hppa gcc 2.95 under -mpa-risc-2-0 if
502 the assembler doesn't know hppa 2.0 instructions. fneg is a 2.0
503 instruction, and a negation like this comes out using it. */
505 unsigned long fneg () { return -fneg_data; }
508 GMP_PROG_CC_WORKS_PART([$1], [double -> float conversion],
509 [/* The following makes gcc 3.3 -march=pentium4 generate an SSE2 xmm insn
510 (cvtsd2ss) which will provoke an error if the assembler doesn't recognise
511 those instructions. Not sure how much of the gmp code will come out
512 wanting sse2, but it's easiest to reject an option we know is bad. */
514 float ftod () { return (float) ftod_data; }
517 GMP_PROG_CC_WORKS_PART([$1], [gnupro alpha ev6 char spilling],
518 [/* The following provokes an internal compiler error from gcc version
519 "2.9-gnupro-99r1" under "-O2 -mcpu=ev6", apparently relating to char
520 values being spilled into floating point registers. The problem doesn't
521 show up all the time, but has occurred enough in GMP for us to reject
522 this compiler+flags. */
523 #include <string.h> /* for memcpy */
528 long d0, d1, d2, d3, d4, d5, d6;
531 struct try_t param[6];
536 memcpy (p, ¶m[ 2 ], sizeof (*p));
537 memcpy (p, ¶m[ 2 ], sizeof (*p));
539 memcpy (p, ¶m[ 1 ], sizeof (*p));
542 memcpy (p, ¶m[ 3 ], sizeof (*p));
545 memcpy (p, ¶m[ 4 ], sizeof (*p));
546 memcpy (p, ¶m[ 4 ], sizeof (*p));
548 memcpy (p, ¶m[ 5 ], sizeof (*p));
549 memcpy (p, ¶m[ 5 ], sizeof (*p));
550 memcpy (p, ¶m[ 5 ], sizeof (*p));
555 # __builtin_alloca is not available everywhere, check it exists before
556 # seeing that it works
557 GMP_PROG_CC_WORKS_PART_TEST([$1],[__builtin_alloca availability],
558 [int k; int foo () { __builtin_alloca (k); }],
559 [GMP_PROG_CC_WORKS_PART([$1], [alloca array],
560 [/* The following provokes an internal compiler error from Itanium HP-UX cc
561 under +O2 or higher. We use this sort of code in mpn/generic/mul_fft.c. */
566 a = __builtin_alloca (k);
567 for (i = 0; i <= k; i++)
568 a[i] = __builtin_alloca (1 << i);
572 GMP_PROG_CC_WORKS_PART([$1], [abs int -> double conversion],
573 [/* The following provokes an internal error from the assembler on
574 power2-ibm-aix4.3.1.0. gcc -mrios2 compiles to nabs+fcirz, and this
575 results in "Internal error related to the source program domain".
577 For reference it seems to be the combination of nabs+fcirz which is bad,
578 not either alone. This sort of thing occurs in mpz/get_str.c with the
579 way double chars_per_bit_exactly is applied in MPN_SIZEINBASE. Perhaps
580 if that code changes to a scaled-integer style then we won't need this
588 a = (x >= 0 ? x : -x);
593 GMP_PROG_CC_WORKS_PART([$1], [long long reliability test 1],
594 [/* The following provokes a segfault in the compiler on powerpc-apple-darwin.
595 Extracted from tests/mpn/t-iord_u.c. Causes Apple's gcc 3.3 build 1640 and
596 1666 to segfault with e.g., -O2 -mpowerpc64. */
598 #if defined (__GNUC__) && ! defined (__cplusplus)
599 typedef unsigned long long t1;typedef t1*t2;
600 static __inline__ t1 e(t2 rp,t2 up,int n,t1 v0)
601 {t1 c,x,r;int i;if(v0){c=1;for(i=1;i<n;i++){x=up[i];r=x+1;rp[i]=r;}}return c;}
602 f(){static const struct{t1 n;t1 src[9];t1 want[9];}d[]={{1,{0},{1}},};t1 got[9];int i;
603 for(i=0;i<1;i++){if(e(got,got,9,d[i].n)==0)h();g(i,d[i].src,d[i].n,got,d[i].want,9);if(d[i].n)h();}}
610 GMP_PROG_CC_WORKS_PART([$1], [long long reliability test 2],
611 [/* The following provokes an internal compiler error on powerpc-apple-darwin.
612 Extracted from mpz/cfdiv_q_2exp.c. Causes Apple's gcc 3.3 build 1640 and
613 1666 to get an ICE with -O1 -mpowerpc64. */
615 #if defined (__GNUC__) && ! defined (__cplusplus)
616 f(int u){int i;long long x;x=u?~0:0;if(x)for(i=0;i<9;i++);x&=g();if(x)g();}
623 GMP_PROG_CC_WORKS_PART_MAIN([$1], [mpn_lshift_com optimization],
624 [/* The following is mis-compiled by HP ia-64 cc version
625 cc: HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]
626 under "cc +O3", both in +DD32 and +DD64 modes. The mpn_lshift_com gets
627 inlined and its return value somehow botched to be 0 instead of 1. This
628 arises in the real mpn_lshift_com in mul_fft.c. A lower optimization
629 level, like +O2 seems ok. This code needs to be run to show the problem,
630 but that's fine, the offending cc is a native-only compiler so we don't
631 have to worry about cross compiling. */
633 #if ! defined (__cplusplus)
635 lshift_com (rp, up, n, cnt)
641 unsigned long retval, high_limb, low_limb;
644 tnc = 8 * sizeof (unsigned long) - cnt;
646 retval = low_limb >> tnc;
647 high_limb = low_limb << cnt;
648 for (i = n - 1; i != 0; i--)
651 *rp++ = ~(high_limb | (low_limb >> tnc));
652 high_limb = low_limb << cnt;
659 unsigned long cy, rp[2], up[2];
662 cy = lshift_com (rp, up, 2L, 1);
676 GMP_PROG_CC_WORKS_PART_MAIN([$1], [mpn_lshift_com optimization 2],
677 [/* The following is mis-compiled by Intel ia-64 icc version 1.8 under
678 "icc -O3", After several calls, the function writes parial garbage to
679 the result vector. Perhaps relates to the chk.a.nc insn. This code needs
680 to be run to show the problem, but that's fine, the offending cc is a
681 native-only compiler so we don't have to worry about cross compiling. */
683 #if ! defined (__cplusplus)
686 lshift_com (rp, up, n, cnt)
692 unsigned long high_limb, low_limb;
697 tnc = 8 * sizeof (unsigned long) - cnt;
699 high_limb = low_limb << cnt;
700 for (i = n - 1; i != 0; i--)
703 *--rp = ~(high_limb | (low_limb >> tnc));
704 high_limb = low_limb << cnt;
711 unsigned long *r, *r2;
712 unsigned long a[88 + 1];
714 for (i = 0; i < 88 + 1; i++)
716 r = malloc (10000 * sizeof (unsigned long));
718 for (i = 0; i < 528; i += 22)
721 i / (8 * sizeof (unsigned long)) + 1,
722 i % (8 * sizeof (unsigned long)));
725 if (r[2048] != 0 || r[2049] != 0 || r[2050] != 0 || r[2051] != 0 ||
726 r[2052] != 0 || r[2053] != 0 || r[2054] != 0)
740 # A certain _GLOBAL_OFFSET_TABLE_ problem in past versions of gas, tickled
741 # by recent versions of gcc.
743 if test "$gmp_prog_cc_works" = yes; then
746 # this problem only arises in PIC code, so don't need to test when
747 # --disable-shared. We don't necessarily have $enable_shared set to
748 # yes at this point, it will still be unset for the default (which is
749 # yes); hence the use of "!= no".
750 if test "$enable_shared" != no; then
751 GMP_PROG_CC_X86_GOT_EAX_EMITTED([$1],
752 [GMP_ASM_X86_GOT_EAX_OK([$1],,
753 [gmp_prog_cc_works="no, bad gas GOT with eax"])])
759 AC_MSG_RESULT($gmp_prog_cc_works)
760 case $gmp_prog_cc_works in
770 dnl Called: GMP_PROG_CC_WORKS_PART(CC+CFLAGS,FAIL-MESSAGE [,CODE])
771 dnl A dummy main() is appended to the CODE given.
773 AC_DEFUN([GMP_PROG_CC_WORKS_PART],
774 [GMP_PROG_CC_WORKS_PART_MAIN([$1],[$2],
776 [int main () { return 0; }])
779 dnl Called: GMP_PROG_CC_WORKS_PART_MAIN(CC+CFLAGS,FAIL-MESSAGE,CODE)
780 dnl CODE must include a main().
782 AC_DEFUN([GMP_PROG_CC_WORKS_PART_MAIN],
783 [GMP_PROG_CC_WORKS_PART_TEST([$1],[$2],[$3],
785 gmp_prog_cc_works="no[]m4_if([$2],,,[[, ]])[$2]",
786 gmp_prog_cc_works="no[]m4_if([$2],,,[[, ]])[$2][[, program does not run]]")
789 dnl Called: GMP_PROG_CC_WORKS_PART_TEST(CC+CFLAGS,TITLE,[CODE],
790 dnl [ACTION-GOOD],[ACTION-BAD][ACTION-NORUN])
792 AC_DEFUN([GMP_PROG_CC_WORKS_PART_TEST],
793 [if test "$gmp_prog_cc_works" = yes; then
794 # remove anything that might look like compiler output to our "||" expression
795 rm -f conftest* a.out b.out a.exe a_out.exe
796 cat >conftest.c <<EOF
799 echo "Test compile: [$2]" >&AC_FD_CC
800 gmp_compile="$1 conftest.c >&AC_FD_CC"
801 if AC_TRY_EVAL(gmp_compile); then
803 if test "$cross_compiling" = no; then
804 if AC_TRY_COMMAND([./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest]); then :;
812 if test "$cc_works_part" != yes; then
813 echo "failed program was:" >&AC_FD_CC
814 cat conftest.c >&AC_FD_CC
816 rm -f conftest* a.out b.out a.exe a_out.exe
817 case $cc_works_part in
832 dnl GMP_PROG_CC_WORKS_LONGLONG(cc+cflags,[ACTION-YES][,ACTION-NO])
833 dnl --------------------------------------------------------------
834 dnl Check that cc+cflags accepts "long long".
836 dnl This test is designed to be run repeatedly with different cc+cflags
837 dnl selections, so the result is not cached.
839 AC_DEFUN([GMP_PROG_CC_WORKS_LONGLONG],
840 [AC_MSG_CHECKING([compiler $1 has long long])
841 cat >conftest.c <<EOF
843 long long bar () { return foo; }
844 int main () { return 0; }
847 gmp_compile="$1 -c conftest.c >&AC_FD_CC"
848 if AC_TRY_EVAL(gmp_compile); then
849 gmp_prog_cc_works=yes
851 echo "failed program was:" >&AC_FD_CC
852 cat conftest.c >&AC_FD_CC
854 rm -f conftest* a.out b.out a.exe a_out.exe
855 AC_MSG_RESULT($gmp_prog_cc_works)
856 if test $gmp_prog_cc_works = yes; then
864 dnl GMP_C_TEST_SIZEOF(cc/cflags,test,[ACTION-GOOD][,ACTION-BAD])
865 dnl ------------------------------------------------------------
866 dnl The given cc/cflags compiler is run to check the size of a type
867 dnl specified by the "test" argument. "test" can either be a string, or a
868 dnl variable like $foo. The value should be for instance "sizeof-long-4",
869 dnl to test that sizeof(long)==4.
871 dnl This test is designed to be run for different compiler and/or flags
872 dnl combinations, so the result is not cached.
874 dnl The idea for making an array that has a negative size if the desired
875 dnl condition test is false comes from autoconf AC_CHECK_SIZEOF. The cast
876 dnl to "long" in the array dimension also follows autoconf, apparently it's
877 dnl a workaround for a HP compiler bug.
879 AC_DEFUN([GMP_C_TEST_SIZEOF],
880 [echo "configure: testlist $2" >&AC_FD_CC
881 [gmp_sizeof_type=`echo "$2" | sed 's/sizeof-\([a-z]*\).*/\1/'`]
882 [gmp_sizeof_want=`echo "$2" | sed 's/sizeof-[a-z]*-\([0-9]*\).*/\1/'`]
883 AC_MSG_CHECKING([compiler $1 has sizeof($gmp_sizeof_type)==$gmp_sizeof_want])
884 cat >conftest.c <<EOF
888 static int test_array [1 - 2 * (long) (sizeof ($gmp_sizeof_type) != $gmp_sizeof_want)];
893 gmp_c_testlist_sizeof=no
894 gmp_compile="$1 -c conftest.c >&AC_FD_CC"
895 if AC_TRY_EVAL(gmp_compile); then
896 gmp_c_testlist_sizeof=yes
899 AC_MSG_RESULT($gmp_c_testlist_sizeof)
900 if test $gmp_c_testlist_sizeof = yes; then
908 dnl GMP_PROG_CC_IS_GNU(CC,[ACTIONS-IF-YES][,ACTIONS-IF-NO])
909 dnl -------------------------------------------------------
910 dnl Determine whether the given compiler is GNU C.
912 dnl This test is the same as autoconf _AC_LANG_COMPILER_GNU, but doesn't
913 dnl cache the result. The same "ifndef" style test is used, to avoid
914 dnl problems with syntax checking cpp's used on NeXT and Apple systems.
916 AC_DEFUN([GMP_PROG_CC_IS_GNU],
917 [cat >conftest.c <<EOF
918 #if ! defined (__GNUC__) || defined (__INTEL_COMPILER)
922 gmp_compile="$1 -c conftest.c >&AC_FD_CC"
923 if AC_TRY_EVAL(gmp_compile); then
925 AC_MSG_CHECKING([whether $1 is gcc])
935 dnl GMP_PROG_CC_IS_XLC(CC,[ACTIONS-IF-YES][,ACTIONS-IF-NO])
936 dnl -------------------------------------------------------
937 dnl Determine whether the given compiler is IBM xlc (on AIX).
939 dnl There doesn't seem to be a preprocessor symbol to test for this, or if
940 dnl there is one then it's well hidden in xlc 3.1 on AIX 4.3, so just grep
941 dnl the man page printed when xlc is invoked with no arguments.
943 AC_DEFUN([GMP_PROG_CC_IS_XLC],
944 [gmp_command="$1 2>&1 | grep xlc >/dev/null"
945 if AC_TRY_EVAL(gmp_command); then
946 AC_MSG_CHECKING([whether $1 is xlc])
955 dnl GMP_PROG_CC_X86_GOT_EAX_EMITTED(CC+CFLAGS, [ACTION-YES] [, ACTION-NO])
956 dnl ----------------------------------------------------------------------
957 dnl Determine whether CC+CFLAGS emits instructions using %eax with
958 dnl _GLOBAL_OFFSET_TABLE_. This test is for use on x86 systems.
960 dnl Recent versions of gcc will use %eax for the GOT in leaf functions, for
961 dnl instance gcc 3.3.3 with -O3. This avoids having to save and restore
962 dnl %ebx which otherwise usually holds the GOT, and is what gcc used in the
965 dnl %ecx and %edx are also candidates for this sort of optimization, and
966 dnl are used under lesser optimization levels, like -O2 in 3.3.3. FIXME:
967 dnl It's not quite clear what the conditions for using %eax are, we might
968 dnl need more test code to provoke it.
970 dnl The motivation for this test is that past versions of gas have bugs
971 dnl affecting this usage, see GMP_ASM_X86_GOT_EAX_OK.
973 dnl This test is not specific to gcc, other compilers might emit %eax GOT
974 dnl insns like this, though we've not investigated that.
976 dnl This is for use by compiler probing in GMP_PROG_CC_WORKS, so we doesn't
977 dnl cache the result.
979 dnl -fPIC is hard coded here, because this test is for use before libtool
980 dnl has established the pic options. It's right for gcc, but perhaps not
983 AC_DEFUN([GMP_PROG_CC_X86_GOT_EAX_EMITTED],
984 [echo "Testing gcc GOT with eax emitted" >&AC_FD_CC
985 cat >conftest.c <<\EOF
987 int bar () { return foo; }
990 gmp_compile="$1 -fPIC -S conftest.c >&AC_FD_CC 2>&1"
991 if AC_TRY_EVAL(gmp_compile); then
992 if grep "addl.*_GLOBAL_OFFSET_TABLE_.*eax" conftest.s >/dev/null; then
997 echo "Result: $tmp_got_emitted" >&AC_FD_CC
998 if test "$tmp_got_emitted" = yes; then
1001 ifelse([$3],,:,[$3])
1006 dnl GMP_HPC_HPPA_2_0(cc,[ACTION-IF-GOOD][,ACTION-IF-BAD])
1007 dnl ---------------------------------------------------------
1008 dnl Find out whether a HP compiler is good enough to generate hppa 2.0.
1010 dnl This test might be repeated for different compilers, so the result is
1013 AC_DEFUN([GMP_HPC_HPPA_2_0],
1014 [AC_MSG_CHECKING([whether HP compiler $1 is good for 64-bits])
1015 # Bad compiler output:
1016 # ccom: HP92453-01 G.10.32.05 HP C Compiler
1017 # Good compiler output:
1018 # ccom: HP92453-01 A.10.32.30 HP C Compiler
1019 # Let A.10.32.30 or higher be ok.
1021 gmp_tmp_vs=`$1 $2 -V -c -o conftest.$OBJEXT conftest.c 2>&1 | grep "^ccom:"`
1022 echo "Version string: $gmp_tmp_vs" >&AC_FD_CC
1024 gmp_tmp_v1=`echo $gmp_tmp_vs | sed 's/.* .\.\([[0-9]]*\).*/\1/'`
1025 gmp_tmp_v2=`echo $gmp_tmp_vs | sed 's/.* .\..*\.\(.*\)\..* HP C.*/\1/'`
1026 gmp_tmp_v3=`echo $gmp_tmp_vs | sed 's/.* .\..*\..*\.\(.*\) HP C.*/\1/'`
1027 echo "Version number: $gmp_tmp_v1.$gmp_tmp_v2.$gmp_tmp_v3" >&AC_FD_CC
1028 if test -z "$gmp_tmp_v1"; then
1029 gmp_hpc_64bit=not-applicable
1031 GMP_COMPARE_GE($gmp_tmp_v1, 10, $gmp_tmp_v2, 32, $gmp_tmp_v3, 30)
1032 gmp_hpc_64bit=$gmp_compare_ge
1034 AC_MSG_RESULT($gmp_hpc_64bit)
1035 if test $gmp_hpc_64bit = yes; then
1036 ifelse([$2],,:,[$2])
1038 ifelse([$3],,:,[$3])
1043 dnl GMP_GCC_ARM_UMODSI(CC,[ACTIONS-IF-GOOD][,ACTIONS-IF-BAD])
1044 dnl ---------------------------------------------------------
1045 dnl gcc 2.95.3 and earlier on arm has a bug in the libgcc __umodsi routine
1046 dnl making "%" give wrong results for some operands, eg. "0x90000000 % 3".
1047 dnl We're hoping it'll be fixed in 2.95.4, and we know it'll be fixed in
1050 dnl There's only a couple of places gmp cares about this, one is the
1051 dnl size==1 case in mpn/generic/mode1o.c, and this shows up in
1052 dnl tests/mpz/t-jac.c as a wrong result from mpz_kronecker_ui.
1054 AC_DEFUN([GMP_GCC_ARM_UMODSI],
1055 [AC_MSG_CHECKING([whether ARM gcc unsigned division works])
1056 tmp_version=`$1 --version`
1057 echo "$tmp_version" >&AC_FD_CC
1058 case $tmp_version in
1059 [2.95 | 2.95.[123]])
1060 ifelse([$3],,:,[$3])
1061 gmp_gcc_arm_umodsi_result=["no, gcc 2.95.[0123]"] ;;
1063 ifelse([$2],,:,[$2])
1064 gmp_gcc_arm_umodsi_result=yes ;;
1066 AC_MSG_RESULT([$gmp_gcc_arm_umodsi_result])
1070 dnl GMP_GCC_MIPS_O32(gcc,[actions-yes][,[actions-no]])
1071 dnl -------------------------------------------------
1072 dnl Test whether gcc supports o32.
1074 dnl gcc 2.7.2.2 only does o32, and doesn't accept -mabi=32.
1076 dnl gcc 2.95 accepts -mabi=32 but it only works on irix5, on irix6 it gives
1077 dnl "cc1: The -mabi=32 support does not work yet".
1079 AC_DEFUN([GMP_GCC_MIPS_O32],
1080 [AC_MSG_CHECKING([whether gcc supports o32])
1081 echo 'int x;' >conftest.c
1082 echo "$1 -mabi=32 -c conftest.c" >&AC_FD_CC
1083 if $1 -mabi=32 -c conftest.c >conftest.out 2>&1; then
1086 cat conftest.out >&AC_FD_CC
1087 if grep "cc1: Invalid option \`abi=32'" conftest.out >/dev/null; then
1094 AC_MSG_RESULT($result)
1095 if test $result = yes; then
1096 ifelse([$2],,:,[$2])
1098 ifelse([$3],,:,[$3])
1103 dnl GMP_GCC_NO_CPP_PRECOMP(CCBASE,CC,CFLAGS,[ACTIONS-YES][,ACTIONS-NO])
1104 dnl -------------------------------------------------------------------
1105 dnl Check whether -no-cpp-precomp should be used on this compiler, and
1106 dnl execute the corresponding ACTIONS-YES or ACTIONS-NO.
1108 dnl -no-cpp-precomp is only meant for Apple's hacked version of gcc found
1109 dnl on powerpc*-*-darwin*, but we can give it a try on any gcc. Normal gcc
1110 dnl (as of 3.0 at least) only gives a warning, not an actual error, and we
1111 dnl watch for that and decide against the option in that case, to avoid
1112 dnl confusing the user.
1114 AC_DEFUN([GMP_GCC_NO_CPP_PRECOMP],
1115 [if test "$ccbase" = gcc; then
1116 AC_MSG_CHECKING([compiler $2 $3 -no-cpp-precomp])
1118 cat >conftest.c <<EOF
1119 int main () { return 0; }
1121 gmp_compile="$2 $3 -no-cpp-precomp conftest.c >conftest.out 2>&1"
1122 if AC_TRY_EVAL(gmp_compile); then
1123 if grep "unrecognized option.*-no-cpp-precomp" conftest.out >/dev/null; then : ;
1128 cat conftest.out >&AC_FD_CC
1129 rm -f conftest* a.out b.out a.exe a_out.exe
1130 AC_MSG_RESULT($result)
1131 if test "$result" = yes; then
1132 ifelse([$4],,:,[$4])
1134 ifelse([$5],,:,[$5])
1140 dnl GMP_GCC_PENTIUM4_SSE2(CC+CFLAGS,[ACTION-IF-YES][,ACTION-IF-NO])
1141 dnl ---------------------------------------------------------------
1142 dnl Determine whether gcc CC+CFLAGS is a good enough version for
1143 dnl -march=pentium4 with sse2.
1145 dnl Gcc 3.2.1 was seen generating incorrect code for raw double -> int
1146 dnl conversions through a union. We believe the problem is in all 3.1 and
1147 dnl 3.2 versions, but that it's fixed in 3.3.
1149 AC_DEFUN([GMP_GCC_PENTIUM4_SSE2],
1150 [AC_MSG_CHECKING([whether gcc is good for sse2])
1151 case `$1 -dumpversion` in
1152 [3.[012] | 3.[012].*]) result=no ;;
1155 AC_MSG_RESULT($result)
1156 if test "$result" = yes; then
1157 ifelse([$2],,:,[$2])
1159 ifelse([$3],,:,[$3])
1164 dnl GMP_GCC_WA_MCPU(CC+CFLAGS, NEWFLAG [,ACTION-YES [,ACTION-NO]])
1165 dnl --------------------------------------------------------------
1166 dnl Check whether gcc (or gas rather) accepts a flag like "-Wa,-mev67".
1168 dnl Gas doesn't give an error for an unknown cpu, it only prints a warning
1169 dnl like "Warning: Unknown CPU identifier `ev78'".
1171 dnl This is intended for use on alpha, since only recent versions of gas
1172 dnl accept -mev67, but there's nothing here that's alpha specific.
1174 AC_DEFUN([GMP_GCC_WA_MCPU],
1175 [AC_MSG_CHECKING([assembler $1 $2])
1177 cat >conftest.c <<EOF
1180 gmp_compile="$1 $2 -c conftest.c >conftest.out 2>&1"
1181 if AC_TRY_EVAL(gmp_compile); then
1182 if grep "Unknown CPU identifier" conftest.out >/dev/null; then : ;
1187 cat conftest.out >&AC_FD_CC
1189 AC_MSG_RESULT($result)
1190 if test "$result" = yes; then
1191 ifelse([$3],,:,[$3])
1193 ifelse([$4],,:,[$4])
1198 dnl GMP_GCC_WA_OLDAS(CC+CFLAGS [,ACTION-YES [,ACTION-NO]])
1199 dnl ------------------------------------------------------
1200 dnl Check whether gcc should be run with "-Wa,-oldas".
1202 dnl On systems alpha*-*-osf* (or maybe just osf5), apparently there's a
1203 dnl newish Compaq "as" which doesn't work with the gcc mips-tfile.
1204 dnl Compiling an empty file with "gcc -c foo.c" produces for instance
1206 dnl mips-tfile, /tmp/ccaqUNnF.s:7 Segmentation fault
1208 dnl The fix is to pass "-oldas" to that assembler, as noted by
1210 dnl http://gcc.gnu.org/install/specific.html#alpha*-dec-osf*
1212 dnl The test here tries to compile an empty file, and if that fails but
1213 dnl adding -Wa,-oldas makes it succeed, then that flag is considered
1216 dnl We look for the failing case specifically, since it may not be a good
1217 dnl idea to use -Wa,-oldas in other circumstances. For instance gas takes
1218 dnl "-oldas" to mean the "-o" option and will write a file called "ldas" as
1219 dnl its output. Normally gcc puts its own "-o" after any -Wa options, so
1220 dnl -oldas ends up being harmless, but clearly that's only through good
1223 dnl This macro is designed for use while probing for a good compiler, and
1224 dnl so doesn't cache it's result.
1226 AC_DEFUN([GMP_GCC_WA_OLDAS],
1227 [AC_MSG_CHECKING([for $1 -Wa,-oldas])
1229 cat >conftest.c <<EOF
1231 echo "with empty conftest.c" >&AC_FD_CC
1232 gmp_compile="$1 -c conftest.c >&AC_FD_CC 2>&1"
1233 if AC_TRY_EVAL(gmp_compile); then : ;
1236 gmp_compile="$1 -Wa,-oldas -c conftest.c >&AC_FD_CC 2>&1"
1237 if AC_TRY_EVAL(gmp_compile); then
1238 # but with -Wa,-oldas it works
1243 AC_MSG_RESULT($result)
1244 if test "$result" = yes; then
1245 ifelse([$2],,:,[$2])
1247 ifelse([$3],,:,[$3])
1252 dnl GMP_OS_X86_XMM(CC+CFLAGS,[ACTION-IF-YES][,ACTION-IF-NO])
1253 dnl --------------------------------------------------------
1254 dnl Determine whether the operating system supports XMM registers.
1256 dnl If build==host then a test program is run, executing an SSE2
1257 dnl instruction using an XMM register. This will give a SIGILL if the
1258 dnl system hasn't set the OSFXSR bit in CR4 to say it knows it must use
1259 dnl fxsave/fxrestor in a context switch (to save xmm registers).
1261 dnl If build!=host, we can fallback on:
1263 dnl - FreeBSD version 4 is the first supporting xmm.
1265 dnl - Linux kernel 2.4 might be the first stable series supporting xmm
1266 dnl (not sure). But there's no version number in the GNU/Linux
1267 dnl config tuple to test anyway.
1269 dnl The default is to allow xmm. This might seem rash, but it's likely
1270 dnl most systems know xmm by now, so this will normally be what's wanted.
1271 dnl And cross compiling is a bit hairy anyway, so hopefully anyone doing it
1272 dnl will be smart enough to know what to do.
1274 dnl In the test program, .text and .globl are hard coded because this macro
1275 dnl is wanted before GMP_ASM_TEXT and GMP_ASM_GLOBL are run. A .byte
1276 dnl sequence is used (for xorps %xmm0, %xmm0) to make us independent of
1277 dnl tests for whether the assembler supports sse2/xmm. Obviously we need
1278 dnl both assembler and OS support, but this means we don't force the order
1279 dnl in which we test.
1281 dnl FIXME: Maybe we should use $CCAS to assemble, if it's set. (Would
1282 dnl still want $CC/$CFLAGS for the link.) But this test is used before
1283 dnl AC_PROG_CC sets $OBJEXT, so we'd need to check for various object file
1284 dnl suffixes ourselves.
1286 AC_DEFUN([GMP_OS_X86_XMM],
1287 [AC_CACHE_CHECK([whether the operating system supports XMM registers],
1289 [if test "$build" = "$host"; then
1290 # remove anything that might look like compiler output to our "||" expression
1291 rm -f conftest* a.out b.out a.exe a_out.exe
1292 cat >conftest.s <<EOF
1298 .byte 0x0f, 0x57, 0xc0
1302 gmp_compile="$1 conftest.s -o conftest >&AC_FD_CC"
1303 if AC_TRY_EVAL(gmp_compile); then
1304 if AC_TRY_COMMAND([./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest]); then
1305 gmp_cv_os_x86_xmm=yes
1307 gmp_cv_os_x86_xmm=no
1310 AC_MSG_WARN([Oops, cannot compile test program])
1315 if test -z "$gmp_cv_os_x86_xmm"; then
1317 [freebsd[123] | freebsd[123].*])
1318 gmp_cv_os_x86_xmm=no ;;
1320 gmp_cv_os_x86_xmm=yes ;;
1322 gmp_cv_os_x86_xmm=probably ;;
1327 if test "$gmp_cv_os_x86_xmm" = probably; then
1328 AC_MSG_WARN([Not certain of OS support for xmm when cross compiling.])
1329 AC_MSG_WARN([Will assume it's ok, expect a SIGILL if this is wrong.])
1332 case $gmp_cv_os_x86_xmm in
1343 dnl GMP_CRAY_HOST_TYPES(C90/T90-IEEE, C90/T90-CFP, J90/SV1)
1344 dnl -------------------------------------------------------
1345 dnl Execute the actions in the arguments on the respective Cray vector
1346 dnl systems. For other hosts, do nothing.
1348 dnl This macro should be used after the C compiler has been chosen, since
1349 dnl on c90 and t90 we ask the compiler whether we're in IEEE or CFP float
1352 dnl This code is in a macro so that any AC_REQUIRE pre-requisites of
1353 dnl AC_EGREP_CPP will be expanded at the top-level, ie. for all hosts not
1354 dnl merely c90 and t90. In autoconf 2.57 for instance this means
1355 dnl AC_PROG_EGREP, which is needed by various other macros.
1357 AC_DEFUN([GMP_CRAY_OPTIONS],
1374 dnl GMP_HPPA_LEVEL_20(cc/cflags [, ACTION-GOOD [,ACTION-BAD]])
1375 dnl ----------------------------------------------------------
1376 dnl Check that the given cc/cflags accepts HPPA 2.0n assembler code.
1378 dnl Old versions of gas don't know 2.0 instructions. It rejects ".level
1379 dnl 2.0" for a start, so just test that.
1381 dnl This test is designed to be run for various different compiler and
1382 dnl flags combinations, and hence doesn't cache its result.
1384 AC_DEFUN([GMP_HPPA_LEVEL_20],
1385 [AC_MSG_CHECKING([$1 assembler knows hppa 2.0])
1387 cat >conftest.s <<EOF
1390 gmp_compile="$1 -c conftest.s >&AC_FD_CC 2>&1"
1391 if AC_TRY_EVAL(gmp_compile); then
1394 echo "failed program was" >&AC_FD_CC
1395 cat conftest.s >&AC_FD_CC
1398 AC_MSG_RESULT($result)
1399 if test "$result" = yes; then
1400 ifelse([$2],,:,[$2])
1402 ifelse([$3],,:,[$3])
1407 dnl GMP_PROG_CXX_WORKS(cxx/cxxflags [, ACTION-YES [,ACTION-NO]])
1408 dnl ------------------------------------------------------------
1409 dnl Check whether cxx/cxxflags can compile and link.
1411 dnl This test is designed to be run repeatedly with different cxx/cxxflags
1412 dnl selections, so the result is not cached.
1414 dnl For a native build, we insist on being able to run the program, so as
1415 dnl to detect any problems with the standard C++ library. During
1416 dnl development various systems with broken or incomplete C++ installations
1419 dnl The various features and problems we try to detect are done in separate
1420 dnl compiles. Although this is probably a bit slower than one test
1421 dnl program, it makes it easy to indicate the problem in AC_MSG_RESULT,
1422 dnl hence giving the user a clue about why we rejected the compiler.
1424 AC_DEFUN([GMP_PROG_CXX_WORKS],
1425 [AC_MSG_CHECKING([C++ compiler $1])
1426 gmp_prog_cxx_works=yes
1428 # start with a plain "main()", then go on to further checks
1429 GMP_PROG_CXX_WORKS_PART([$1], [])
1431 GMP_PROG_CXX_WORKS_PART([$1], [namespace],
1433 using namespace foo;
1436 # GMP requires the standard C++ iostream classes
1437 GMP_PROG_CXX_WORKS_PART([$1], [std iostream],
1438 [/* This test rejects g++ 2.7.2 which doesn't have <iostream>, only a
1439 pre-standard iostream.h. */
1442 /* This test rejects OSF 5.1 Compaq C++ in its default pre-standard iostream
1443 mode, since that mode puts cout in the global namespace, not "std". */
1444 void someoutput (void) { std::cout << 123; }
1447 AC_MSG_RESULT($gmp_prog_cxx_works)
1448 case $gmp_prog_cxx_works in
1458 dnl Called: GMP_PROG_CXX_WORKS_PART(CXX+CXXFLAGS, FAIL-MESSAGE [,CODE])
1460 AC_DEFUN([GMP_PROG_CXX_WORKS_PART],
1461 [if test "$gmp_prog_cxx_works" = yes; then
1462 # remove anything that might look like compiler output to our "||" expression
1463 rm -f conftest* a.out b.out a.exe a_out.exe
1464 cat >conftest.cc <<EOF
1466 int main (void) { return 0; }
1468 echo "Test compile: [$2]" >&AC_FD_CC
1469 gmp_cxxcompile="$1 conftest.cc >&AC_FD_CC"
1470 if AC_TRY_EVAL(gmp_cxxcompile); then
1471 if test "$cross_compiling" = no; then
1472 if AC_TRY_COMMAND([./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest]); then :;
1474 gmp_prog_cxx_works="no[]m4_if([$2],,,[, ])[$2], program does not run"
1478 gmp_prog_cxx_works="no[]m4_if([$2],,,[, ])[$2]"
1480 case $gmp_prog_cxx_works in
1482 echo "failed program was:" >&AC_FD_CC
1483 cat conftest.cc >&AC_FD_CC
1486 rm -f conftest* a.out b.out a.exe a_out.exe
1491 dnl GMP_INIT([M4-DEF-FILE])
1492 dnl -----------------------
1493 dnl Initializations for GMP config.m4 generation.
1495 dnl FIXME: The generated config.m4 doesn't get recreated by config.status.
1496 dnl Maybe the relevant "echo"s should go through AC_CONFIG_COMMANDS.
1498 AC_DEFUN([GMP_INIT],
1499 [ifelse([$1], , gmp_configm4=config.m4, gmp_configm4="[$1]")
1500 gmp_tmpconfigm4=cnfm4.tmp
1501 gmp_tmpconfigm4i=cnfm4i.tmp
1502 gmp_tmpconfigm4p=cnfm4p.tmp
1503 rm -f $gmp_tmpconfigm4 $gmp_tmpconfigm4i $gmp_tmpconfigm4p
1505 # CONFIG_TOP_SRCDIR is a path from the mpn builddir to the top srcdir.
1506 # The pattern here tests for an absolute path the same way as
1507 # _AC_OUTPUT_FILES in autoconf acgeneral.m4.
1509 [[\\/]]* | ?:[[\\/]]* ) tmp="$srcdir" ;;
1510 *) tmp="../$srcdir" ;;
1512 echo ["define(<CONFIG_TOP_SRCDIR>,<\`$tmp'>)"] >>$gmp_tmpconfigm4
1514 # All CPUs use asm-defs.m4
1515 echo ["include][(CONFIG_TOP_SRCDIR\`/mpn/asm-defs.m4')"] >>$gmp_tmpconfigm4i
1521 dnl Create config.m4 from its accumulated parts.
1523 dnl __CONFIG_M4_INCLUDED__ is used so that a second or subsequent include
1524 dnl of config.m4 is harmless.
1526 dnl A separate ifdef on the angle bracket quoted part ensures the quoting
1527 dnl style there is respected. The basic defines from gmp_tmpconfigm4 are
1528 dnl fully quoted but are still put under an ifdef in case any have been
1529 dnl redefined by one of the m4 include files.
1531 dnl Doing a big ifdef within asm-defs.m4 and/or other macro files wouldn't
1532 dnl work, since it'd interpret parentheses and quotes in dnl comments, and
1533 dnl having a whole file as a macro argument would overflow the string space
1536 AC_DEFUN([GMP_FINISH],
1537 [AC_REQUIRE([GMP_INIT])
1538 echo "creating $gmp_configm4"
1539 echo ["d""nl $gmp_configm4. Generated automatically by configure."] > $gmp_configm4
1540 if test -f $gmp_tmpconfigm4; then
1541 echo ["changequote(<,>)"] >> $gmp_configm4
1542 echo ["ifdef(<__CONFIG_M4_INCLUDED__>,,<"] >> $gmp_configm4
1543 cat $gmp_tmpconfigm4 >> $gmp_configm4
1544 echo [">)"] >> $gmp_configm4
1545 echo ["changequote(\`,')"] >> $gmp_configm4
1548 echo ["ifdef(\`__CONFIG_M4_INCLUDED__',,\`"] >> $gmp_configm4
1549 if test -f $gmp_tmpconfigm4i; then
1550 cat $gmp_tmpconfigm4i >> $gmp_configm4
1551 rm $gmp_tmpconfigm4i
1553 if test -f $gmp_tmpconfigm4p; then
1554 cat $gmp_tmpconfigm4p >> $gmp_configm4
1555 rm $gmp_tmpconfigm4p
1557 echo ["')"] >> $gmp_configm4
1558 echo ["define(\`__CONFIG_M4_INCLUDED__')"] >> $gmp_configm4
1562 dnl GMP_INCLUDE_MPN(FILE)
1563 dnl ---------------------
1564 dnl Add an include_mpn(`FILE') to config.m4. FILE should be a path
1565 dnl relative to the mpn source directory, for example
1567 dnl GMP_INCLUDE_MPN(`x86/x86-defs.m4')
1570 AC_DEFUN([GMP_INCLUDE_MPN],
1571 [AC_REQUIRE([GMP_INIT])
1572 echo ["include_mpn(\`$1')"] >> $gmp_tmpconfigm4i
1576 dnl GMP_DEFINE(MACRO, DEFINITION [, LOCATION])
1577 dnl ------------------------------------------
1578 dnl Define M4 macro MACRO as DEFINITION in temporary file.
1580 dnl If LOCATION is `POST', the definition will appear after any include()
1581 dnl directives inserted by GMP_INCLUDE. Mind the quoting! No shell
1582 dnl variables will get expanded. Don't forget to invoke GMP_FINISH to
1583 dnl create file config.m4. config.m4 uses `<' and '>' as quote characters
1584 dnl for all defines.
1586 AC_DEFUN([GMP_DEFINE],
1587 [AC_REQUIRE([GMP_INIT])
1588 echo ['define(<$1>, <$2>)'] >>ifelse([$3], [POST],
1589 $gmp_tmpconfigm4p, $gmp_tmpconfigm4)
1593 dnl GMP_DEFINE_RAW(STRING [, LOCATION])
1594 dnl ------------------------------------
1595 dnl Put STRING into config.m4 file.
1597 dnl If LOCATION is `POST', the definition will appear after any include()
1598 dnl directives inserted by GMP_INCLUDE. Don't forget to invoke GMP_FINISH
1599 dnl to create file config.m4.
1601 AC_DEFUN([GMP_DEFINE_RAW],
1602 [AC_REQUIRE([GMP_INIT])
1603 echo [$1] >> ifelse([$2], [POST], $gmp_tmpconfigm4p, $gmp_tmpconfigm4)
1607 dnl GMP_TRY_ASSEMBLE(asm-code,[action-success][,action-fail])
1608 dnl ----------------------------------------------------------
1609 dnl Attempt to assemble the given code.
1610 dnl Do "action-success" if this succeeds, "action-fail" if not.
1612 dnl conftest.o and conftest.out are available for inspection in
1613 dnl "action-success". If either action does a "break" out of a loop then
1614 dnl an explicit "rm -f conftest*" will be necessary.
1616 dnl This is not unlike AC_TRY_COMPILE, but there's no default includes or
1617 dnl anything in "asm-code", everything wanted must be given explicitly.
1619 AC_DEFUN([GMP_TRY_ASSEMBLE],
1620 [cat >conftest.s <<EOF
1623 gmp_assemble="$CCAS $CFLAGS $CPPFLAGS conftest.s >conftest.out 2>&1"
1624 if AC_TRY_EVAL(gmp_assemble); then
1625 cat conftest.out >&AC_FD_CC
1626 ifelse([$2],,:,[$2])
1628 cat conftest.out >&AC_FD_CC
1629 echo "configure: failed program was:" >&AC_FD_CC
1630 cat conftest.s >&AC_FD_CC
1631 ifelse([$3],,:,[$3])
1637 dnl Checks whether the stack can be marked nonexecutable by passing an option
1638 dnl to the C-compiler when acting on .s files. Appends that option to ASFLAGS.
1639 dnl This macro is adapted from one found in GLIBC-2.3.5.
1640 AC_DEFUN([CL_AS_NOEXECSTACK],[
1641 dnl AC_REQUIRE([AC_PROG_CC]) GMP uses something else
1642 AC_CACHE_CHECK([whether assembler supports --noexecstack option],
1643 cl_cv_as_noexecstack, [dnl
1644 cat > conftest.c <<EOF
1647 if AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS
1648 -S -o conftest.s conftest.c >/dev/null]) \
1649 && grep .note.GNU-stack conftest.s >/dev/null \
1650 && AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS -Wa,--noexecstack
1651 -c -o conftest.o conftest.s >/dev/null])
1653 cl_cv_as_noexecstack=yes
1655 cl_cv_as_noexecstack=no
1658 if test "$cl_cv_as_noexecstack" = yes; then
1659 ASMFLAGS="$ASMFLAGS -Wa,--noexecstack"
1665 dnl GMP_ASM_LABEL_SUFFIX
1666 dnl --------------------
1668 dnl empty - hppa on HP-UX doesn't use a :, just the label name
1670 dnl Note that it's necessary to test the empty case first, since HP "as"
1671 dnl will accept "somelabel:", and take it to mean a label with a name that
1672 dnl happens to end in a colon.
1674 AC_DEFUN([GMP_ASM_LABEL_SUFFIX],
1675 [AC_REQUIRE([GMP_ASM_TEXT])
1676 AC_CACHE_CHECK([for assembler label suffix],
1677 gmp_cv_asm_label_suffix,
1678 [gmp_cv_asm_label_suffix=unknown
1680 echo "trying $i" >&AC_FD_CC
1684 [gmp_cv_asm_label_suffix=$i
1687 [cat conftest.out >&AC_FD_CC])
1689 if test "$gmp_cv_asm_label_suffix" = "unknown"; then
1690 AC_MSG_ERROR([Cannot determine label suffix])
1693 echo ["define(<LABEL_SUFFIX>, <$gmp_cv_asm_label_suffix>)"] >> $gmp_tmpconfigm4
1697 dnl GMP_ASM_UNDERSCORE
1698 dnl ------------------
1699 dnl Determine whether global symbols need to be prefixed with an underscore.
1700 dnl The output from "nm" is grepped to see what a typical symbol looks like.
1702 dnl This test used to grep the .o file directly, but that failed with greps
1703 dnl that don't like binary files (eg. SunOS 4).
1705 dnl This test also used to construct an assembler file with and without an
1706 dnl underscore and try to link that to a C file, to see which worked.
1707 dnl Although that's what will happen in the real build we don't really want
1708 dnl to depend on creating asm files within configure for every possible CPU
1709 dnl (or at least we don't want to do that more than we have to).
1711 dnl The fallback on no underscore is based on the assumption that the world
1712 dnl is moving towards non-underscore systems. There should actually be no
1713 dnl good reason for nm to fail though.
1715 AC_DEFUN([GMP_ASM_UNDERSCORE],
1716 [AC_REQUIRE([GMP_PROG_NM])
1717 AC_CACHE_CHECK([if globals are prefixed by underscore],
1718 gmp_cv_asm_underscore,
1719 [gmp_cv_asm_underscore="unknown"
1720 cat >conftest.c <<EOF
1723 gmp_compile="$CC $CFLAGS $CPPFLAGS -c conftest.c >&AC_FD_CC"
1724 if AC_TRY_EVAL(gmp_compile); then
1725 $NM conftest.$OBJEXT >conftest.out
1726 if grep _gurkmacka conftest.out >/dev/null; then
1727 gmp_cv_asm_underscore=yes
1728 elif grep gurkmacka conftest.out >/dev/null; then
1729 gmp_cv_asm_underscore=no
1731 echo "configure: $NM doesn't have gurkmacka:" >&AC_FD_CC
1732 cat conftest.out >&AC_FD_CC
1735 echo "configure: failed program was:" >&AC_FD_CC
1736 cat conftest.c >&AC_FD_CC
1740 case $gmp_cv_asm_underscore in
1742 GMP_DEFINE(GSYM_PREFIX, [_]) ;;
1744 GMP_DEFINE(GSYM_PREFIX, []) ;;
1746 AC_MSG_WARN([+----------------------------------------------------------])
1747 AC_MSG_WARN([| Cannot determine global symbol prefix.])
1748 AC_MSG_WARN([| $NM output doesn't contain a global data symbol.])
1749 AC_MSG_WARN([| Will proceed with no underscore.])
1750 AC_MSG_WARN([| If this is wrong then you'll get link errors referring])
1751 AC_MSG_WARN([| to ___gmpn_add_n (note three underscores).])
1752 AC_MSG_WARN([| In this case do a fresh build with an override,])
1753 AC_MSG_WARN([| ./configure gmp_cv_asm_underscore=yes])
1754 AC_MSG_WARN([+----------------------------------------------------------])
1755 GMP_DEFINE(GSYM_PREFIX, [])
1761 dnl GMP_ASM_ALIGN_LOG
1762 dnl -----------------
1763 dnl Is parameter to `.align' logarithmic?
1765 AC_DEFUN([GMP_ASM_ALIGN_LOG],
1766 [AC_REQUIRE([GMP_ASM_GLOBL])
1767 AC_REQUIRE([GMP_ASM_BYTE])
1768 AC_REQUIRE([GMP_ASM_DATA])
1769 AC_REQUIRE([GMP_ASM_LABEL_SUFFIX])
1770 AC_REQUIRE([GMP_PROG_NM])
1771 AC_CACHE_CHECK([if .align assembly directive is logarithmic],
1772 gmp_cv_asm_align_log,
1776 $gmp_cv_asm_globl foo
1779 foo$gmp_cv_asm_label_suffix
1780 $gmp_cv_asm_byte 2],
1781 [gmp_tmp_val=[`$NM conftest.$OBJEXT | grep foo | \
1782 sed -e 's;[[][0-9][]]\(.*\);\1;' -e 's;[^1-9]*\([0-9]*\).*;\1;'`]
1783 if test "$gmp_tmp_val" = "10" || test "$gmp_tmp_val" = "16"; then
1784 gmp_cv_asm_align_log=yes
1786 gmp_cv_asm_align_log=no
1788 [AC_MSG_ERROR([cannot assemble alignment test])])])
1790 GMP_DEFINE_RAW(["define(<ALIGN_LOGARITHMIC>,<$gmp_cv_asm_align_log>)"])
1794 dnl GMP_ASM_ALIGN_FILL_0x90
1795 dnl -----------------------
1796 dnl Determine whether a ",0x90" suffix works on a .align directive.
1797 dnl This is only meant for use on x86, 0x90 being a "nop".
1799 dnl Old gas, eg. 1.92.3
1800 dnl Needs ",0x90" or else the fill is 0x00, which can't be executed
1803 dnl New gas, eg. 2.91
1804 dnl Generates multi-byte nop fills even when ",0x90" is given.
1807 dnl ",0x90" is not allowed, causes a fatal error.
1810 dnl ",0x90" does nothing, generates a warning that it's being ignored.
1812 dnl SCO OpenServer 5 as
1813 dnl Second parameter is max bytes to fill, not a fill pattern.
1814 dnl ",0x90" is an error due to being bigger than the first parameter.
1815 dnl Multi-byte nop fills are generated in text segments.
1817 dnl Note that both solaris "as"s only care about ",0x90" if they actually
1818 dnl have to use it to fill something, hence the .byte in the test. It's
1819 dnl the second .align which provokes the error or warning.
1821 dnl The warning from solaris 2.8 is suppressed to stop anyone worrying that
1822 dnl something might be wrong.
1824 AC_DEFUN([GMP_ASM_ALIGN_FILL_0x90],
1825 [AC_REQUIRE([GMP_ASM_TEXT])
1826 AC_CACHE_CHECK([if the .align directive accepts an 0x90 fill in .text],
1827 gmp_cv_asm_align_fill_0x90,
1833 [if grep "Warning: Fill parameter ignored for executable section" conftest.out >/dev/null; then
1834 echo "Supressing this warning by omitting 0x90" 1>&AC_FD_CC
1835 gmp_cv_asm_align_fill_0x90=no
1837 gmp_cv_asm_align_fill_0x90=yes
1839 [gmp_cv_asm_align_fill_0x90=no])])
1841 GMP_DEFINE_RAW(["define(<ALIGN_FILL_0x90>,<$gmp_cv_asm_align_fill_0x90>)"])
1847 dnl .byte - is usual.
1848 dnl data1 - required by ia64 (on hpux at least).
1850 dnl This macro is just to support other configure tests, not any actual asm
1853 AC_DEFUN([GMP_ASM_BYTE],
1854 [AC_REQUIRE([GMP_ASM_TEXT])
1855 AC_REQUIRE([GMP_ASM_LABEL_SUFFIX])
1856 AC_CACHE_CHECK([for assembler byte directive],
1858 [for i in .byte data1; do
1859 echo "trying $i" >&AC_FD_CC
1867 [cat conftest.out >&AC_FD_CC])
1869 if test -z "$gmp_cv_asm_byte"; then
1870 AC_MSG_ERROR([Cannot determine how to emit a data byte])
1878 dnl .text - is usual.
1879 dnl .code - is needed by the hppa on HP-UX (but ia64 HP-UX uses .text)
1880 dnl .csect .text[PR] - is for AIX.
1882 AC_DEFUN([GMP_ASM_TEXT],
1883 [AC_CACHE_CHECK([how to switch to text section],
1885 [for i in ".text" ".code" [".csect .text[PR]"]; do
1886 echo "trying $i" >&AC_FD_CC
1887 GMP_TRY_ASSEMBLE([ $i],
1892 if test -z "$gmp_cv_asm_text"; then
1893 AC_MSG_ERROR([Cannot determine text section directive])
1896 echo ["define(<TEXT>, <$gmp_cv_asm_text>)"] >> $gmp_tmpconfigm4
1902 dnl Can we say `.data'?
1904 AC_DEFUN([GMP_ASM_DATA],
1905 [AC_CACHE_CHECK([how to switch to data section],
1908 *-*-aix*) gmp_cv_asm_data=[".csect .data[RW]"] ;;
1909 *) gmp_cv_asm_data=".data" ;;
1912 echo ["define(<DATA>, <$gmp_cv_asm_data>)"] >> $gmp_tmpconfigm4
1918 dnl Find out how to switch to the read-only data section.
1920 dnl The compiler output is grepped for the right directive. It's not
1921 dnl considered wise to just probe for ".section .rodata" or whatever works,
1922 dnl since arbitrary section names might be accepted, but not necessarily do
1923 dnl the right thing when they get to the linker.
1925 dnl Only a few asm files use RODATA, so this code is perhaps a bit
1926 dnl excessive right now, but should find more uses in the future.
1928 dnl FIXME: gcc on aix generates something like ".csect _foo.ro_c[RO],3"
1929 dnl where foo is the object file. Might need to check for that if we use
1932 AC_DEFUN([GMP_ASM_RODATA],
1933 [AC_REQUIRE([GMP_ASM_TEXT])
1934 AC_REQUIRE([GMP_ASM_DATA])
1935 AC_REQUIRE([GMP_ASM_LABEL_SUFFIX])
1936 AC_REQUIRE([GMP_ASM_UNDERSCORE])
1937 AC_CACHE_CHECK([how to switch to read-only data section],
1940 dnl Default to DATA on CPUs with split code/data caching, and TEXT
1941 dnl elsewhere. i386 means generic x86, so use DATA on it.
1943 X86_PATTERN | x86_64-*-*)
1944 gmp_cv_asm_rodata="$gmp_cv_asm_data" ;;
1946 gmp_cv_asm_rodata="$gmp_cv_asm_text" ;;
1949 cat >conftest.c <<EOF
1950 extern const int foo[[]]; /* Suppresses C++'s suppression of foo */
1951 const int foo[[]] = {1,2,3};
1953 echo "Test program:" >&AC_FD_CC
1954 cat conftest.c >&AC_FD_CC
1955 gmp_compile="$CC $CFLAGS $CPPFLAGS -S conftest.c >&AC_FD_CC"
1956 if AC_TRY_EVAL(gmp_compile); then
1957 echo "Compiler output:" >&AC_FD_CC
1958 cat conftest.s >&AC_FD_CC
1959 if test $gmp_cv_asm_underscore = yes; then
1964 # must see our label
1965 if grep "^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix" conftest.s >/dev/null 2>&AC_FD_CC; then
1966 # take the last directive before our label (hence skipping segments
1967 # getting debugging info etc)
1968 tmp_match=`sed -n ["/^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix/q
1974 /^[. ]*CSECT/p"] conftest.s | sed -n '$p'`
1975 echo "Match: $tmp_match" >&AC_FD_CC
1976 if test -n "$tmp_match"; then
1977 gmp_cv_asm_rodata=$tmp_match
1980 echo "Couldn't find label: ^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix" >&AC_FD_CC
1985 echo ["define(<RODATA>, <$gmp_cv_asm_rodata>)"] >> $gmp_tmpconfigm4
1991 dnl The assembler directive to mark a label as a global symbol.
1993 dnl ia64 - .global is standard, according to the Intel documentation.
1995 dnl hppa - ".export foo,entry" is demanded by HP hppa "as". ".global" is a
1998 dnl other - .globl is usual.
2000 dnl "gas" tends to accept .globl everywhere, in addition to .export or
2001 dnl .global or whatever the system assembler demands.
2003 AC_DEFUN([GMP_ASM_GLOBL],
2004 [AC_REQUIRE([GMP_ASM_TEXT])
2005 AC_CACHE_CHECK([for assembler global directive],
2008 hppa*-*-*) gmp_cv_asm_globl=.export ;;
2009 IA64_PATTERN) gmp_cv_asm_globl=.global ;;
2010 *) gmp_cv_asm_globl=.globl ;;
2013 echo ["define(<GLOBL>, <$gmp_cv_asm_globl>)"] >> $gmp_tmpconfigm4
2017 dnl GMP_ASM_GLOBL_ATTR
2018 dnl ------------------
2019 dnl Do we need something after `GLOBL symbol'?
2021 AC_DEFUN([GMP_ASM_GLOBL_ATTR],
2022 [AC_REQUIRE([GMP_ASM_GLOBL])
2023 AC_CACHE_CHECK([for assembler global directive attribute],
2024 gmp_cv_asm_globl_attr,
2025 [case $gmp_cv_asm_globl in
2026 .export) gmp_cv_asm_globl_attr=",entry" ;;
2027 *) gmp_cv_asm_globl_attr="" ;;
2030 echo ["define(<GLOBL_ATTR>, <$gmp_cv_asm_globl_attr>)"] >> $gmp_tmpconfigm4
2036 dnl Can we say ".type", and how?
2038 dnl For i386 GNU/Linux ELF systems, and very likely other ELF systems,
2039 dnl .type and .size are important on functions in shared libraries. If
2040 dnl .type is omitted and the mainline program references that function then
2041 dnl the code will be copied down to the mainline at load time like a piece
2042 dnl of data. If .size is wrong or missing (it defaults to 4 bytes or some
2043 dnl such) then incorrect bytes will be copied and a segv is the most likely
2044 dnl result. In any case such copying is not what's wanted, a .type
2045 dnl directive will ensure a PLT entry is used.
2047 dnl In GMP the assembler functions are normally only used from within the
2048 dnl library (since most programs are not interested in the low level
2049 dnl routines), and in those circumstances a missing .type isn't fatal,
2050 dnl letting the problem go unnoticed. tests/mpn/t-asmtype.c aims to check
2053 AC_DEFUN([GMP_ASM_TYPE],
2054 [AC_CACHE_CHECK([for assembler .type directive],
2057 for gmp_tmp_prefix in @ \# %; do
2058 GMP_TRY_ASSEMBLE([ .type sym,${gmp_tmp_prefix}function],
2059 [if grep "\.type pseudo-op used outside of \.def/\.endef ignored" conftest.out >/dev/null; then : ;
2061 gmp_cv_asm_type=".type \$][1,${gmp_tmp_prefix}\$][2"
2067 echo ["define(<TYPE>, <$gmp_cv_asm_type>)"] >> $gmp_tmpconfigm4
2073 dnl Can we say `.size'?
2075 AC_DEFUN([GMP_ASM_SIZE],
2076 [AC_CACHE_CHECK([for assembler .size directive],
2079 GMP_TRY_ASSEMBLE([ .size sym,1],
2080 [if grep "\.size pseudo-op used outside of \.def/\.endef ignored" conftest.out >/dev/null; then : ;
2082 gmp_cv_asm_size=".size \$][1,\$][2"
2085 echo ["define(<SIZE>, <$gmp_cv_asm_size>)"] >> $gmp_tmpconfigm4
2089 dnl GMP_ASM_COFF_TYPE
2090 dnl -----------------
2091 dnl Determine whether the assembler supports COFF type information.
2093 dnl Currently this is only needed for mingw (and cygwin perhaps) and so is
2094 dnl run only on the x86s, but it ought to work anywhere.
2096 dnl On MINGW, recent versions of the linker have an automatic import scheme
2097 dnl for data in a DLL which is referenced by a mainline but without
2098 dnl __declspec (__dllimport__) on the prototype. It seems functions
2099 dnl without type information are treated as data, or something, and calls
2100 dnl to them from the mainline will crash. gcc puts type information on the
2101 dnl C functions it generates, we need to do the same for assembler
2104 dnl This applies only to functions without __declspec(__dllimport__),
2105 dnl ie. without __GMP_DECLSPEC in the case of libgmp, so it also works just
2106 dnl to ensure all assembler functions used from outside libgmp have
2107 dnl __GMP_DECLSPEC on their prototypes. But this isn't an ideal situation,
2108 dnl since we don't want perfectly valid calls going wrong just because
2109 dnl there wasn't a prototype in scope.
2111 dnl When an auto-import takes place, the following warning is given by the
2112 dnl linker. This shouldn't be seen for any functions.
2114 dnl Info: resolving _foo by linking to __imp__foo (auto-import)
2117 dnl COFF type directives look like the following
2124 dnl _foo is the symbol with GSYM_PREFIX (_). .scl is the storage class, 2
2125 dnl for external, 3 for static. .type is the object type, 32 for a
2128 dnl On an ELF system, this is (correctly) rejected due to .def, .endef and
2129 dnl .scl being invalid, and .type not having enough arguments.
2131 AC_DEFUN([GMP_ASM_COFF_TYPE],
2132 [AC_REQUIRE([GMP_ASM_TEXT])
2133 AC_REQUIRE([GMP_ASM_GLOBL])
2134 AC_REQUIRE([GMP_ASM_GLOBL_ATTR])
2135 AC_REQUIRE([GMP_ASM_LABEL_SUFFIX])
2136 AC_REQUIRE([GMP_ASM_UNDERSCORE])
2137 AC_CACHE_CHECK([for assembler COFF type directives],
2138 gmp_cv_asm_x86_coff_type,
2141 $gmp_cv_asm_globl ${tmp_gsym_prefix}foo$gmp_cv_asm_globl_attr
2142 .def ${tmp_gsym_prefix}foo
2146 ${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix
2148 [gmp_cv_asm_x86_coff_type=yes],
2149 [gmp_cv_asm_x86_coff_type=no])
2151 echo ["define(<HAVE_COFF_TYPE>, <$gmp_cv_asm_x86_coff_type>)"] >> $gmp_tmpconfigm4
2155 dnl GMP_ASM_LSYM_PREFIX
2156 dnl -------------------
2157 dnl What is the prefix for a local label?
2159 dnl The prefixes tested are,
2161 dnl L - usual for underscore systems
2162 dnl .L - usual for non-underscore systems
2163 dnl $ - alpha (gas and OSF system assembler)
2164 dnl L$ - hppa (gas and HP-UX system assembler)
2166 dnl The default is "L" if the tests fail for any reason. There's a good
2167 dnl chance this will be adequate, since on most systems labels are local
2168 dnl anyway unless given a ".globl", and an "L" will avoid clashes with
2169 dnl other identifers.
2171 dnl For gas, ".L" is normally purely local to the assembler, it doesn't get
2172 dnl put into the object file at all. This style is preferred, to keep the
2173 dnl object files nice and clean.
2175 dnl BSD format nm produces a line like
2177 dnl 00000000 t Lgurkmacka
2179 dnl The symbol code is normally "t" for text, but any lower case letter
2180 dnl indicates a local definition.
2182 dnl Code "n" is for a debugging symbol, OSF "nm -B" gives that as an upper
2183 dnl case "N" for a local.
2185 dnl HP-UX nm prints an error message (though seems to give a 0 exit) if
2186 dnl there's no symbols at all in an object file, hence the use of "dummy".
2188 AC_DEFUN([GMP_ASM_LSYM_PREFIX],
2189 [AC_REQUIRE([GMP_ASM_LABEL_SUFFIX])
2190 AC_REQUIRE([GMP_ASM_TEXT])
2191 AC_REQUIRE([GMP_PROG_NM])
2192 AC_CACHE_CHECK([for assembler local label prefix],
2193 gmp_cv_asm_lsym_prefix,
2194 [gmp_tmp_pre_appears=yes
2195 for gmp_tmp_pre in L .L $L $ L$; do
2196 echo "Trying $gmp_tmp_pre" >&AC_FD_CC
2199 dummy${gmp_cv_asm_label_suffix}
2200 ${gmp_tmp_pre}gurkmacka${gmp_cv_asm_label_suffix}],
2201 [if $NM conftest.$OBJEXT >conftest.nm 2>&AC_FD_CC; then : ; else
2202 cat conftest.nm >&AC_FD_CC
2203 AC_MSG_WARN(["$NM" failure])
2206 cat conftest.nm >&AC_FD_CC
2207 if grep gurkmacka conftest.nm >/dev/null; then : ; else
2208 # no mention of the symbol, this is good
2209 echo "$gmp_tmp_pre label doesn't appear in object file at all (good)" >&AC_FD_CC
2210 gmp_cv_asm_lsym_prefix="$gmp_tmp_pre"
2211 gmp_tmp_pre_appears=no
2214 if grep [' [a-zN] .*gurkmacka'] conftest.nm >/dev/null; then
2215 # symbol mentioned as a local, use this if nothing better
2216 echo "$gmp_tmp_pre label is local but still in object file" >&AC_FD_CC
2217 if test -z "$gmp_cv_asm_lsym_prefix"; then
2218 gmp_cv_asm_lsym_prefix="$gmp_tmp_pre"
2221 echo "$gmp_tmp_pre label is something unknown" >&AC_FD_CC
2226 if test -z "$gmp_cv_asm_lsym_prefix"; then
2227 gmp_cv_asm_lsym_prefix=L
2228 AC_MSG_WARN([cannot determine local label, using default $gmp_cv_asm_lsym_prefix])
2230 # for development purposes, note whether we got a purely temporary local label
2231 echo "Local label appears in object files: $gmp_tmp_pre_appears" >&AC_FD_CC
2233 echo ["define(<LSYM_PREFIX>, <${gmp_cv_asm_lsym_prefix}>)"] >> $gmp_tmpconfigm4
2234 AC_DEFINE_UNQUOTED(LSYM_PREFIX, "$gmp_cv_asm_lsym_prefix",
2235 [Assembler local label prefix])
2241 dnl How to define a 32-bit word.
2243 dnl FIXME: This test is not right for ia64-*-hpux*. The directive should
2244 dnl be "data4", but the W32 macro is not currently used by the mpn/ia64 asm
2247 AC_DEFUN([GMP_ASM_W32],
2248 [AC_REQUIRE([GMP_ASM_DATA])
2249 AC_REQUIRE([GMP_ASM_BYTE])
2250 AC_REQUIRE([GMP_ASM_GLOBL])
2251 AC_REQUIRE([GMP_ASM_LABEL_SUFFIX])
2252 AC_REQUIRE([GMP_PROG_NM])
2253 AC_CACHE_CHECK([how to define a 32-bit word],
2257 # FIXME: HPUX puts first symbol at 0x40000000, breaking our assumption
2258 # that it's at 0x0. We'll have to declare another symbol before the
2259 # .long/.word and look at the distance between the two symbols. The
2260 # only problem is that the sed expression(s) barfs (on Solaris, for
2261 # example) for the symbol with value 0. For now, HPUX uses .word.
2262 gmp_cv_asm_w32=".word"
2266 for gmp_tmp_op in .long .word data4; do
2269 $gmp_cv_asm_globl foo
2271 foo$gmp_cv_asm_label_suffix
2272 $gmp_cv_asm_byte 0],
2273 [gmp_tmp_val=[`$NM conftest.$OBJEXT | grep foo | \
2274 sed -e 's;[[][0-9][]]\(.*\);\1;' -e 's;[^1-9]*\([0-9]*\).*;\1;'`]
2275 if test "$gmp_tmp_val" = 4; then
2276 gmp_cv_asm_w32="$gmp_tmp_op"
2283 if test -z "$gmp_cv_asm_w32"; then
2284 AC_MSG_ERROR([cannot determine how to define a 32-bit word])
2287 echo ["define(<W32>, <$gmp_cv_asm_w32>)"] >> $gmp_tmpconfigm4
2291 dnl GMP_X86_ASM_GOT_UNDERSCORE
2292 dnl --------------------------
2293 dnl Determine whether i386 _GLOBAL_OFFSET_TABLE_ needs an additional
2294 dnl underscore prefix.
2296 dnl SVR4 - the standard is _GLOBAL_OFFSET_TABLE_
2297 dnl GNU/Linux - follows SVR4
2298 dnl OpenBSD - an a.out underscore system, uses __GLOBAL_OFFSET_TABLE_
2299 dnl NetBSD - also an a.out underscore system, but _GLOBAL_OFFSET_TABLE_
2301 dnl The test attempts to link a program using _GLOBAL_OFFSET_TABLE_ or
2302 dnl __GLOBAL_OFFSET_TABLE_ to see which works.
2304 dnl $lt_prog_compiler_pic is included in the compile because old versions
2305 dnl of gas wouldn't accept PIC idioms without the right option (-K). This
2306 dnl is the same as what libtool and mpn/Makeasm.am will do.
2308 dnl $lt_prog_compiler_pic is also included in the link because OpenBSD ld
2309 dnl won't accept an R_386_GOTPC relocation without the right options. This
2310 dnl is not what's done by the Makefiles when building executables, but
2311 dnl let's hope it's ok (it works fine with gcc).
2313 dnl The fallback is no additional underscore, on the basis that this will
2314 dnl suit SVR4/ELF style systems, which should be much more common than
2315 dnl a.out systems with shared libraries.
2317 dnl Note that it's not an error for the tests to fail, since for instance
2318 dnl cygwin, mingw and djgpp don't have a _GLOBAL_OFFSET_TABLE_ scheme at
2321 dnl Perhaps $CCAS could be asked to do the linking as well as the
2322 dnl assembling, but in the Makefiles it's only used for assembling, so lets
2323 dnl keep it that way.
2325 dnl The test here is run even under --disable-shared, so that PIC objects
2326 dnl can be built and tested by the tune/many.pl development scheme. The
2327 dnl tests will be reasonably quick and won't give a fatal error, so this
2328 dnl arrangement is ok. AC_LIBTOOL_PROG_COMPILER_PIC does its
2329 dnl $lt_prog_compiler_pic setups even for --disable-shared too.
2331 AC_DEFUN([GMP_ASM_X86_GOT_UNDERSCORE],
2332 [AC_REQUIRE([GMP_ASM_TEXT])
2333 AC_REQUIRE([GMP_ASM_GLOBL])
2334 AC_REQUIRE([GMP_ASM_GLOBL_ATTR])
2335 AC_REQUIRE([GMP_ASM_LABEL_SUFFIX])
2336 AC_REQUIRE([GMP_ASM_UNDERSCORE])
2337 AC_REQUIRE([AC_LIBTOOL_PROG_COMPILER_PIC])
2338 AC_CACHE_CHECK([if _GLOBAL_OFFSET_TABLE_ is prefixed by underscore],
2339 gmp_cv_asm_x86_got_underscore,
2340 [gmp_cv_asm_x86_got_underscore="not applicable"
2341 if test $gmp_cv_asm_underscore = yes; then
2346 for tmp_underscore in "" "_"; do
2347 cat >conftest.s <<EOF
2349 $gmp_cv_asm_globl ${tmp_gsym_prefix}main$gmp_cv_asm_globl_attr
2350 ${tmp_gsym_prefix}main$gmp_cv_asm_label_suffix
2351 addl $ ${tmp_underscore}_GLOBAL_OFFSET_TABLE_, %ebx
2353 gmp_compile="$CCAS $CFLAGS $CPPFLAGS $lt_prog_compiler_pic conftest.s >&AC_FD_CC && $CC $CFLAGS $CPPFLAGS $lt_prog_compiler_pic conftest.$OBJEXT >&AC_FD_CC"
2354 if AC_TRY_EVAL(gmp_compile); then
2355 if test "$tmp_underscore" = "_"; then
2356 gmp_cv_asm_x86_got_underscore=yes
2358 gmp_cv_asm_x86_got_underscore=no
2363 rm -f conftest* a.out b.out a.exe a_out.exe
2365 if test "$gmp_cv_asm_x86_got_underscore" = "yes"; then
2366 GMP_DEFINE(GOT_GSYM_PREFIX, [_])
2368 GMP_DEFINE(GOT_GSYM_PREFIX, [])
2373 dnl GMP_ASM_X86_GOT_EAX_OK(CC+CFLAGS, [ACTION-YES] [, ACTION-NO])
2374 dnl -------------------------------------------------------------
2375 dnl Determine whether _GLOBAL_OFFSET_TABLE_ used with %eax is ok.
2379 dnl addl $_GLOBAL_OFFSET_TABLE_, %eax
2381 dnl is incorrectly assembled by gas 2.12 (or thereabouts) and earlier. It
2382 dnl puts an addend 2 into the R_386_GOTPC relocation, but it should be 1
2383 dnl for this %eax form being a 1 byte opcode (with other registers it's 2
2384 dnl opcode bytes). See note about this in mpn/x86/README too.
2386 dnl We assemble this, surrounded by some unlikely byte sequences as
2387 dnl delimiters, and check for the bad output.
2389 dnl This is for use by compiler probing in GMP_PROG_CC_WORKS, so the result
2392 dnl This test is not specific to gas, but old gas is the only assembler we
2393 dnl know of with this problem. The Solaris has been seen coming out ok.
2395 dnl ".text" is hard coded because this macro is wanted before GMP_ASM_TEXT.
2396 dnl This should be fine, ".text" is normal on x86 systems, and certainly
2397 dnl will be fine with the offending gas.
2399 dnl If an error occurs when assembling, we consider the assembler ok, since
2400 dnl the bad output does not occur. This happens for instance on mingw,
2401 dnl where _GLOBAL_OFFSET_TABLE_ results in a bfd error, since there's no
2402 dnl GOT etc in PE object files.
2404 dnl This test is used before the object file extension has been determined,
2405 dnl so we force output to conftest.o. Using -o with -c is not portable,
2406 dnl but we think all x86 compilers will accept -o with -c, certainly gcc
2409 dnl -fPIC is hard coded here, because this test is for use before libtool
2410 dnl has established the pic options. It's right for gcc, but perhaps not
2411 dnl other compilers.
2413 AC_DEFUN([GMP_ASM_X86_GOT_EAX_OK],
2414 [echo "Testing gas GOT with eax good" >&AC_FD_CC
2415 cat >conftest.awk <<\EOF
2444 for (f = 2; f <= NF; f++)
2446 for (i = 0; i < 20; i++)
2451 for (i = 0; i < 21; i++)
2452 if (got[i] != want[i])
2468 cat >conftest.s <<\EOF
2470 .byte 1, 35, 69, 103, 137, 171, 205, 239
2471 addl $_GLOBAL_OFFSET_TABLE_, %eax
2472 .byte 254, 220, 186, 152, 118, 84, 50, 16
2475 gmp_compile="$1 -fPIC -o conftest.o -c conftest.s >&AC_FD_CC 2>&1"
2476 if AC_TRY_EVAL(gmp_compile); then
2477 tmp_got_good=`od -b conftest.o | $AWK -f conftest.awk`
2480 echo "Result: $tmp_got_good" >&AC_FD_CC
2481 if test "$tmp_got_good" = no; then
2482 ifelse([$3],,:,[$3])
2484 ifelse([$2],,:,[$2])
2489 dnl GMP_ASM_X86_MMX([ACTION-IF-YES][,ACTION-IF-NO])
2490 dnl -----------------------------------------------
2491 dnl Determine whether the assembler supports MMX instructions.
2493 dnl This macro is wanted before GMP_ASM_TEXT, so ".text" is hard coded
2494 dnl here. ".text" is believed to be correct on all x86 systems. Actually
2495 dnl ".text" probably isn't needed at all, at least for just checking
2496 dnl instruction syntax.
2498 dnl "movq %mm0, %mm1" should assemble to "0f 6f c8", but Solaris 2.6 and
2499 dnl 2.7 wrongly assemble it to "0f 6f c1" (that being the reverse "movq
2500 dnl %mm1, %mm0"). It seems more trouble than it's worth to work around
2501 dnl this in the code, so just detect and reject.
2503 AC_DEFUN([GMP_ASM_X86_MMX],
2504 [AC_CACHE_CHECK([if the assembler knows about MMX instructions],
2509 [gmp_cv_asm_x86_mmx=yes
2512 if (dis conftest.$OBJEXT >conftest.out) 2>/dev/null; then
2513 if grep "0f 6f c1" conftest.out >/dev/null; then
2514 gmp_cv_asm_x86_mmx=movq-bug
2517 AC_MSG_WARN(["dis" not available to check for "as" movq bug])
2520 [gmp_cv_asm_x86_mmx=no])])
2522 case $gmp_cv_asm_x86_mmx in
2524 AC_MSG_WARN([+----------------------------------------------------------])
2525 AC_MSG_WARN([| WARNING WARNING WARNING])
2526 AC_MSG_WARN([| Host CPU has MMX code, but the assembler])
2527 AC_MSG_WARN([| $CCAS $CFLAGS $CPPFLAGS])
2528 AC_MSG_WARN([| has the Solaris 2.6 and 2.7 bug where register to register])
2529 AC_MSG_WARN([| movq operands are reversed.])
2530 AC_MSG_WARN([| Non-MMX replacements will be used.])
2531 AC_MSG_WARN([| This will be an inferior build.])
2532 AC_MSG_WARN([+----------------------------------------------------------])
2535 AC_MSG_WARN([+----------------------------------------------------------])
2536 AC_MSG_WARN([| WARNING WARNING WARNING])
2537 AC_MSG_WARN([| Host CPU has MMX code, but it can't be assembled by])
2538 AC_MSG_WARN([| $CCAS $CFLAGS $CPPFLAGS])
2539 AC_MSG_WARN([| Non-MMX replacements will be used.])
2540 AC_MSG_WARN([| This will be an inferior build.])
2541 AC_MSG_WARN([+----------------------------------------------------------])
2544 if test "$gmp_cv_asm_x86_mmx" = yes; then
2545 ifelse([$1],,:,[$1])
2547 ifelse([$2],,:,[$2])
2552 dnl GMP_ASM_X86_SHLDL_CL
2553 dnl --------------------
2555 AC_DEFUN([GMP_ASM_X86_SHLDL_CL],
2556 [AC_REQUIRE([GMP_ASM_TEXT])
2557 AC_CACHE_CHECK([if the assembler takes cl with shldl],
2558 gmp_cv_asm_x86_shldl_cl,
2561 shldl %cl, %eax, %ebx],
2562 gmp_cv_asm_x86_shldl_cl=yes,
2563 gmp_cv_asm_x86_shldl_cl=no)
2565 if test "$gmp_cv_asm_x86_shldl_cl" = "yes"; then
2566 GMP_DEFINE(WANT_SHLDL_CL,1)
2568 GMP_DEFINE(WANT_SHLDL_CL,0)
2573 dnl GMP_ASM_X86_SSE2([ACTION-IF-YES][,ACTION-IF-NO])
2574 dnl ------------------------------------------------
2575 dnl Determine whether the assembler supports SSE2 instructions.
2577 dnl This macro is wanted before GMP_ASM_TEXT, so ".text" is hard coded
2578 dnl here. ".text" is believed to be correct on all x86 systems, certainly
2579 dnl it's all GMP_ASM_TEXT gives currently. Actually ".text" probably isn't
2580 dnl needed at all, at least for just checking instruction syntax.
2582 AC_DEFUN([GMP_ASM_X86_SSE2],
2583 [AC_CACHE_CHECK([if the assembler knows about SSE2 instructions],
2584 gmp_cv_asm_x86_sse2,
2588 [gmp_cv_asm_x86_sse2=yes],
2589 [gmp_cv_asm_x86_sse2=no])
2591 case $gmp_cv_asm_x86_sse2 in
2593 ifelse([$1],,:,[$1])
2596 AC_MSG_WARN([+----------------------------------------------------------])
2597 AC_MSG_WARN([| WARNING WARNING WARNING])
2598 AC_MSG_WARN([| Host CPU has SSE2 code, but it can't be assembled by])
2599 AC_MSG_WARN([| $CCAS $CFLAGS $CPPFLAGS])
2600 AC_MSG_WARN([| Non-SSE2 replacements will be used.])
2601 AC_MSG_WARN([| This will be an inferior build.])
2602 AC_MSG_WARN([+----------------------------------------------------------])
2603 ifelse([$2],,:,[$2])
2609 dnl GMP_ASM_X86_MCOUNT
2610 dnl ------------------
2611 dnl Find out how to call mcount for profiling on an x86 system.
2613 dnl A dummy function is compiled and the ".s" output examined. The pattern
2614 dnl matching might be a bit fragile, but should work at least with gcc on
2615 dnl sensible systems. Certainly it's better than hard coding a table of
2618 dnl For non-PIC, any ".data" is taken to mean a counter might be passed.
2619 dnl It's assumed a movl will set it up, and the right register is taken
2620 dnl from that movl. Any movl involving %esp is ignored (a frame pointer
2621 dnl setup normally).
2623 dnl For PIC, any ".data" is similarly interpreted, but a GOTOFF identifies
2624 dnl the line setting up the right register.
2626 dnl In both cases a line with "mcount" identifies the call and that line is
2629 dnl On some systems (eg. FreeBSD 3.5) gcc emits ".data" but doesn't use it,
2630 dnl so it's not an error to have .data but then not find a register.
2632 dnl Variations in mcount conventions on different x86 systems can be found
2633 dnl in gcc config/i386. mcount can have a "_" prefix or be .mcount or
2634 dnl _mcount_ptr, and for PIC it can be called through a GOT entry, or via
2635 dnl the PLT. If a pointer to a counter is required it's passed in %eax or
2638 dnl Flags to specify PIC are taken from $lt_prog_compiler_pic set by
2639 dnl AC_PROG_LIBTOOL.
2641 dnl Enhancement: Cache the values determined here. But what's the right way
2642 dnl to get two variables (mcount_nonpic_reg and mcount_nonpic_call say) set
2643 dnl from one block of commands?
2645 AC_DEFUN([GMP_ASM_X86_MCOUNT],
2646 [AC_REQUIRE([AC_ENABLE_SHARED])
2647 AC_REQUIRE([AC_PROG_LIBTOOL])
2648 AC_MSG_CHECKING([how to call x86 mcount])
2649 cat >conftest.c <<EOF
2653 if test "$enable_static" = yes; then
2654 gmp_asmout_compile="$CC $CFLAGS $CPPFLAGS -S conftest.c 1>&AC_FD_CC"
2655 if AC_TRY_EVAL(gmp_asmout_compile); then
2656 if grep '\.data' conftest.s >/dev/null; then
2657 mcount_nonpic_reg=`sed -n ['/esp/!s/.*movl.*,\(%[a-z]*\).*$/\1/p'] conftest.s`
2661 mcount_nonpic_call=`grep 'call.*mcount' conftest.s`
2662 if test -z "$mcount_nonpic_call"; then
2663 AC_MSG_ERROR([Cannot find mcount call for non-PIC])
2666 AC_MSG_ERROR([Cannot compile test program for non-PIC])
2670 if test "$enable_shared" = yes; then
2671 gmp_asmout_compile="$CC $CFLAGS $CPPFLAGS $lt_prog_compiler_pic -S conftest.c 1>&AC_FD_CC"
2672 if AC_TRY_EVAL(gmp_asmout_compile); then
2673 if grep '\.data' conftest.s >/dev/null; then
2674 case $lt_prog_compiler_pic in
2676 # Windows DLLs have non-PIC style mcount
2677 mcount_pic_reg=`sed -n ['/esp/!s/.*movl.*,\(%[a-z]*\).*$/\1/p'] conftest.s`
2680 mcount_pic_reg=`sed -n ['s/.*GOTOFF.*,\(%[a-z]*\).*$/\1/p'] conftest.s`
2686 mcount_pic_call=`grep 'call.*mcount' conftest.s`
2687 if test -z "$mcount_pic_call"; then
2688 AC_MSG_ERROR([Cannot find mcount call for PIC])
2691 AC_MSG_ERROR([Cannot compile test program for PIC])
2695 GMP_DEFINE_RAW(["define(<MCOUNT_NONPIC_REG>, <\`$mcount_nonpic_reg'>)"])
2696 GMP_DEFINE_RAW(["define(<MCOUNT_NONPIC_CALL>,<\`$mcount_nonpic_call'>)"])
2697 GMP_DEFINE_RAW(["define(<MCOUNT_PIC_REG>, <\`$mcount_pic_reg'>)"])
2698 GMP_DEFINE_RAW(["define(<MCOUNT_PIC_CALL>, <\`$mcount_pic_call'>)"])
2701 AC_MSG_RESULT([determined])
2705 dnl GMP_ASM_IA64_ALIGN_OK
2706 dnl ---------------------
2707 dnl Determine whether .align correctly pads with nop instructions in a text
2710 dnl gas 2.14 and earlier byte swaps its padding bundle on big endian
2711 dnl systems, which is incorrect (endianness only changes data). What
2712 dnl should be "nop.m / nop.f / nop.i" comes out as "break" instructions.
2714 dnl The test here detects the bad case, and assumes anything else is ok
2715 dnl (there are many sensible nop bundles, so it'd be impractical to try to
2716 dnl match everything good).
2718 AC_DEFUN([GMP_ASM_IA64_ALIGN_OK],
2719 [AC_CACHE_CHECK([whether assembler .align padding is good],
2720 gmp_cv_asm_ia64_align_ok,
2721 [cat >conftest.awk <<\EOF
2777 for (f = 2; f <= NF; f++)
2779 for (i = 0; i < 47; i++)
2784 for (i = 0; i < 48; i++)
2785 if (got[i] != want[i])
2804 { .mmi; add r14 = r15, r16
2806 add r20 = r21, r22 ;; }
2808 { .mmi; add r23 = r24, r25
2810 add r29 = r30, r31 ;; }
2812 [gmp_cv_asm_ia64_align_ok=`od -b conftest.$OBJEXT | $AWK -f conftest.awk`],
2813 [AC_MSG_WARN([oops, cannot compile test program])
2814 gmp_cv_asm_ia64_align_ok=yes])
2816 GMP_DEFINE_RAW(["define(<IA64_ALIGN_OK>, <\`$gmp_cv_asm_ia64_align_ok'>)"])
2822 dnl GMP_ASM_M68K_INSTRUCTION
2823 dnl ------------------------
2824 dnl Not sure if ".l" and "%" are independent settings, but it doesn't hurt
2825 dnl to try all four possibilities. Note that the % ones must be first, so
2826 dnl "d0" won't be interpreted as a label.
2828 dnl gas 1.92.3 on NetBSD 1.4 needs to be tested with a two operand
2829 dnl instruction. It takes registers without "%", but a single operand
2830 dnl "clrl %d0" only gives a warning, not an error.
2832 AC_DEFUN([GMP_ASM_M68K_INSTRUCTION],
2833 [AC_REQUIRE([GMP_ASM_TEXT])
2834 AC_CACHE_CHECK([assembler instruction and register style],
2835 gmp_cv_asm_m68k_instruction,
2836 [for i in "addl %d0,%d1" "add.l %d0,%d1" "addl d0,d1" "add.l d0,d1"; do
2840 [gmp_cv_asm_m68k_instruction=$i
2844 if test -z "$gmp_cv_asm_m68k_instruction"; then
2845 AC_MSG_ERROR([cannot determine assembler instruction and register style])
2848 case $gmp_cv_asm_m68k_instruction in
2849 "addl d0,d1") want_dot_size=no; want_register_percent=no ;;
2850 "addl %d0,%d1") want_dot_size=no; want_register_percent=yes ;;
2851 "add.l d0,d1") want_dot_size=yes; want_register_percent=no ;;
2852 "add.l %d0,%d1") want_dot_size=yes; want_register_percent=yes ;;
2853 *) AC_MSG_ERROR([oops, unrecognised instruction and register style]) ;;
2855 GMP_DEFINE_RAW(["define(<WANT_REGISTER_PERCENT>, <\`$want_register_percent'>)"])
2856 GMP_DEFINE_RAW(["define(<WANT_DOT_SIZE>, <\`$want_dot_size'>)"])
2860 dnl GMP_ASM_M68K_ADDRESSING
2861 dnl -----------------------
2863 AC_DEFUN([GMP_ASM_M68K_ADDRESSING],
2864 [AC_REQUIRE([GMP_ASM_TEXT])
2865 AC_REQUIRE([GMP_ASM_M68K_INSTRUCTION])
2866 AC_CACHE_CHECK([assembler addressing style],
2867 gmp_cv_asm_m68k_addressing,
2868 [case $gmp_cv_asm_m68k_instruction in
2869 addl*) movel=movel ;;
2870 add.l*) movel=move.l ;;
2871 *) AC_MSG_ERROR([oops, unrecognised gmp_cv_asm_m68k_instruction]) ;;
2873 case $gmp_cv_asm_m68k_instruction in
2874 *"%d0,%d1") dreg=%d0; areg=%a0 ;;
2875 *"d0,d1") dreg=d0; areg=a0 ;;
2876 *) AC_MSG_ERROR([oops, unrecognised gmp_cv_asm_m68k_instruction]) ;;
2880 $movel $dreg, $areg@-],
2881 [gmp_cv_asm_m68k_addressing=mit],
2884 $movel $dreg, -($areg)],
2885 [gmp_cv_asm_m68k_addressing=motorola],
2886 [AC_MSG_ERROR([cannot determine assembler addressing style])])])
2888 GMP_DEFINE_RAW(["define(<WANT_ADDRESSING>, <\`$gmp_cv_asm_m68k_addressing'>)"])
2892 dnl GMP_ASM_M68K_BRANCHES
2893 dnl ---------------------
2894 dnl "bra" is the standard branch instruction. "jra" or "jbra" are
2895 dnl preferred where available, since on gas for instance they give a
2896 dnl displacement only as big as it needs to be, whereas "bra" is always
2897 dnl 16-bits. This applies to the conditional branches "bcc" etc too.
2898 dnl However "dbcc" etc on gas are already only as big as they need to be.
2900 AC_DEFUN([GMP_ASM_M68K_BRANCHES],
2901 [AC_REQUIRE([GMP_ASM_TEXT])
2902 AC_CACHE_CHECK([assembler shortest branches],
2903 gmp_cv_asm_m68k_branches,
2904 [for i in jra jbra bra; do
2907 foo$gmp_cv_asm_label_suffix
2909 [gmp_cv_asm_m68k_branches=$i
2913 if test -z "$gmp_cv_asm_m68k_branches"; then
2914 AC_MSG_ERROR([cannot determine assembler branching style])
2917 GMP_DEFINE_RAW(["define(<WANT_BRANCHES>, <\`$gmp_cv_asm_m68k_branches'>)"])
2921 dnl GMP_ASM_POWERPC_PIC_ALWAYS
2922 dnl --------------------------
2923 dnl Determine whether PIC is the default compiler output.
2925 dnl SVR4 style "foo@ha" addressing is interpreted as non-PIC, and anything
2926 dnl else is assumed to require PIC always (Darwin or AIX). SVR4 is the
2927 dnl only non-PIC addressing syntax the asm files have at the moment anyway.
2929 dnl Libtool does this by taking "*-*-aix* | *-*-darwin* | *-*-rhapsody*" to
2930 dnl mean PIC always, but it seems more reliable to grep the compiler
2933 dnl The next paragraph is untrue for Tiger. Was it ever true? For tiger,
2934 dnl "cc -fast" makes non-PIC the default (and the binaries do run).
2935 dnl On Darwin "cc -static" is non-PIC with syntax "ha16(_foo)", but that's
2936 dnl apparently only for use in the kernel, which we're not attempting to
2937 dnl target at the moment, so don't look for that.
2939 AC_DEFUN([GMP_ASM_POWERPC_PIC_ALWAYS],
2940 [AC_REQUIRE([AC_PROG_CC])
2941 AC_CACHE_CHECK([whether compiler output is PIC by default],
2942 gmp_cv_asm_powerpc_pic,
2943 [gmp_cv_asm_powerpc_pic=yes
2944 cat >conftest.c <<EOF
2946 int *bar() { return &foo; }
2948 echo "Test program:" >&AC_FD_CC
2949 cat conftest.c >&AC_FD_CC
2950 gmp_compile="$CC $CFLAGS $CPPFLAGS -S conftest.c >&AC_FD_CC"
2951 if AC_TRY_EVAL(gmp_compile); then
2952 echo "Compiler output:" >&AC_FD_CC
2953 cat conftest.s >&AC_FD_CC
2954 if grep 'foo@ha' conftest.s >/dev/null 2>&AC_FD_CC; then
2955 gmp_cv_asm_powerpc_pic=no
2957 if grep 'ha16(_foo)' conftest.s >/dev/null 2>&AC_FD_CC; then
2958 gmp_cv_asm_powerpc_pic=no
2963 GMP_DEFINE_RAW(["define(<PIC_ALWAYS>,<$gmp_cv_asm_powerpc_pic>)"])
2967 dnl GMP_ASM_POWERPC_R_REGISTERS
2968 dnl ---------------------------
2969 dnl Determine whether the assembler takes powerpc registers with an "r" as
2970 dnl in "r6", or as plain "6". The latter is standard, but NeXT, Rhapsody,
2971 dnl and MacOS-X require the "r" forms.
2973 dnl See also mpn/powerpc32/powerpc-defs.m4 which uses the result of this
2976 AC_DEFUN([GMP_ASM_POWERPC_R_REGISTERS],
2977 [AC_REQUIRE([GMP_ASM_TEXT])
2978 AC_CACHE_CHECK([if the assembler needs r on registers],
2979 gmp_cv_asm_powerpc_r_registers,
2983 [gmp_cv_asm_powerpc_r_registers=no],
2987 [gmp_cv_asm_powerpc_r_registers=yes],
2988 [AC_MSG_ERROR([neither "mtctr 6" nor "mtctr r6" works])])])])
2990 GMP_DEFINE_RAW(["define(<WANT_R_REGISTERS>,<$gmp_cv_asm_powerpc_r_registers>)"])
2994 dnl GMP_ASM_SPARC_REGISTER
2995 dnl ----------------------
2996 dnl Determine whether the assembler accepts the ".register" directive.
2997 dnl Old versions of solaris "as" don't.
2999 dnl See also mpn/sparc32/sparc-defs.m4 which uses the result of this test.
3001 AC_DEFUN([GMP_ASM_SPARC_REGISTER],
3002 [AC_REQUIRE([GMP_ASM_TEXT])
3003 AC_CACHE_CHECK([if the assembler accepts ".register"],
3004 gmp_cv_asm_sparc_register,
3007 .register %g2,#scratch
3009 [gmp_cv_asm_sparc_register=yes],
3010 [gmp_cv_asm_sparc_register=no])])
3012 GMP_DEFINE_RAW(["define(<HAVE_REGISTER>,<$gmp_cv_asm_sparc_register>)"])
3016 dnl GMP_C_ATTRIBUTE_CONST
3017 dnl ---------------------
3019 AC_DEFUN([GMP_C_ATTRIBUTE_CONST],
3020 [AC_CACHE_CHECK([whether gcc __attribute__ ((const)) works],
3021 gmp_cv_c_attribute_const,
3022 [AC_TRY_COMPILE([int foo (int x) __attribute__ ((const));], ,
3023 gmp_cv_c_attribute_const=yes, gmp_cv_c_attribute_const=no)
3025 if test $gmp_cv_c_attribute_const = yes; then
3026 AC_DEFINE(HAVE_ATTRIBUTE_CONST, 1,
3027 [Define to 1 if the compiler accepts gcc style __attribute__ ((const))])
3032 dnl GMP_C_ATTRIBUTE_MALLOC
3033 dnl ----------------------
3034 dnl gcc 2.95.x accepts __attribute__ ((malloc)) but with a warning that
3035 dnl it's ignored. Pretend it doesn't exist in this case, to avoid that
3038 AC_DEFUN([GMP_C_ATTRIBUTE_MALLOC],
3039 [AC_CACHE_CHECK([whether gcc __attribute__ ((malloc)) works],
3040 gmp_cv_c_attribute_malloc,
3041 [cat >conftest.c <<EOF
3042 void *foo (int x) __attribute__ ((malloc));
3044 gmp_compile="$CC $CFLAGS $CPPFLAGS -c conftest.c >conftest.out 2>&1"
3045 if AC_TRY_EVAL(gmp_compile); then
3046 if grep "attribute directive ignored" conftest.out >/dev/null; then
3047 gmp_cv_c_attribute_malloc=no
3049 gmp_cv_c_attribute_malloc=yes
3052 gmp_cv_c_attribute_malloc=no
3054 cat conftest.out >&AC_FD_CC
3057 if test $gmp_cv_c_attribute_malloc = yes; then
3058 AC_DEFINE(HAVE_ATTRIBUTE_MALLOC, 1,
3059 [Define to 1 if the compiler accepts gcc style __attribute__ ((malloc))])
3064 dnl GMP_C_ATTRIBUTE_MODE
3065 dnl --------------------
3066 dnl Introduced in gcc 2.2, but perhaps not in all Apple derived versions.
3068 AC_DEFUN([GMP_C_ATTRIBUTE_MODE],
3069 [AC_CACHE_CHECK([whether gcc __attribute__ ((mode (XX))) works],
3070 gmp_cv_c_attribute_mode,
3071 [AC_TRY_COMPILE([typedef int SItype __attribute__ ((mode (SI)));], ,
3072 gmp_cv_c_attribute_mode=yes, gmp_cv_c_attribute_mode=no)
3074 if test $gmp_cv_c_attribute_mode = yes; then
3075 AC_DEFINE(HAVE_ATTRIBUTE_MODE, 1,
3076 [Define to 1 if the compiler accepts gcc style __attribute__ ((mode (XX)))])
3081 dnl GMP_C_ATTRIBUTE_NORETURN
3082 dnl ------------------------
3084 AC_DEFUN([GMP_C_ATTRIBUTE_NORETURN],
3085 [AC_CACHE_CHECK([whether gcc __attribute__ ((noreturn)) works],
3086 gmp_cv_c_attribute_noreturn,
3087 [AC_TRY_COMPILE([void foo (int x) __attribute__ ((noreturn));], ,
3088 gmp_cv_c_attribute_noreturn=yes, gmp_cv_c_attribute_noreturn=no)
3090 if test $gmp_cv_c_attribute_noreturn = yes; then
3091 AC_DEFINE(HAVE_ATTRIBUTE_NORETURN, 1,
3092 [Define to 1 if the compiler accepts gcc style __attribute__ ((noreturn))])
3097 dnl GMP_C_DOUBLE_FORMAT
3098 dnl -------------------
3099 dnl Determine the floating point format.
3101 dnl The object file is grepped, in order to work when cross compiling. A
3102 dnl start and end sequence is included to avoid false matches, and allowance
3103 dnl is made for the desired data crossing an "od -b" line boundary. The test
3104 dnl number is a small integer so it should appear exactly, no rounding or
3107 dnl "od -b", incidentally, is supported even by Unix V7, and the awk script
3108 dnl used doesn't have functions or anything, so even an "old" awk should
3111 dnl The C code here declares the variable foo as extern; without that, some
3112 dnl C++ compilers will not put foo in the object file.
3114 AC_DEFUN([GMP_C_DOUBLE_FORMAT],
3115 [AC_REQUIRE([AC_PROG_CC])
3116 AC_REQUIRE([AC_PROG_AWK])
3117 AC_CACHE_CHECK([format of `double' floating point],
3118 gmp_cv_c_double_format,
3119 [gmp_cv_c_double_format=unknown
3120 cat >conftest.c <<\EOF
3126 extern struct foo foo;
3128 { '\001', '\043', '\105', '\147', '\211', '\253', '\315', '\357' },
3130 { '\376', '\334', '\272', '\230', '\166', '\124', '\062', '\020' },
3133 gmp_compile="$CC $CFLAGS $CPPFLAGS -c conftest.c >&AC_FD_CC 2>&1"
3134 if AC_TRY_EVAL(gmp_compile); then
3135 cat >conftest.awk <<\EOF
3142 for (f = 2; f <= NF; f++)
3144 for (i = 0; i < 23; i++)
3148 # match the special begin and end sequences
3149 if (got[0] != "001") continue
3150 if (got[1] != "043") continue
3151 if (got[2] != "105") continue
3152 if (got[3] != "147") continue
3153 if (got[4] != "211") continue
3154 if (got[5] != "253") continue
3155 if (got[6] != "315") continue
3156 if (got[7] != "357") continue
3157 if (got[16] != "376") continue
3158 if (got[17] != "334") continue
3159 if (got[18] != "272") continue
3160 if (got[19] != "230") continue
3161 if (got[20] != "166") continue
3162 if (got[21] != "124") continue
3163 if (got[22] != "062") continue
3164 if (got[23] != "020") continue
3166 saw = " (" got[8] " " got[9] " " got[10] " " got[11] " " got[12] " " got[13] " " got[14] " " got[15] ")"
3168 if (got[8] == "000" && \
3169 got[9] == "000" && \
3170 got[10] == "000" && \
3171 got[11] == "124" && \
3172 got[12] == "064" && \
3173 got[13] == "157" && \
3174 got[14] == "235" && \
3177 print "IEEE little endian"
3182 # Little endian with the two 4-byte halves swapped, as used by ARM
3183 # when the chip is in little endian mode.
3185 if (got[8] == "064" && \
3186 got[9] == "157" && \
3187 got[10] == "235" && \
3188 got[11] == "301" && \
3189 got[12] == "000" && \
3190 got[13] == "000" && \
3191 got[14] == "000" && \
3194 print "IEEE little endian, swapped halves"
3199 # gcc 2.95.4 on one GNU/Linux ARM system was seen generating 000 in
3200 # the last byte, whereas 124 is correct. Not sure where the bug
3201 # actually lies, but a running program didn't seem to get a full
3202 # mantissa worth of working bits.
3204 # We match this case explicitly so we can give a nice result message,
3205 # but we deliberately exclude it from the normal IEEE double setups
3206 # since it's too broken.
3208 if (got[8] == "064" && \
3209 got[9] == "157" && \
3210 got[10] == "235" && \
3211 got[11] == "301" && \
3212 got[12] == "000" && \
3213 got[13] == "000" && \
3214 got[14] == "000" && \
3217 print "bad ARM software floats"
3222 if (got[8] == "301" && \
3223 got[9] == "235" && \
3224 got[10] == "157" && \
3225 got[11] == "064" && \
3226 got[12] == "124" && \
3227 got[13] == "000" && \
3228 got[14] == "000" && \
3231 print "IEEE big endian"
3236 if (got[8] == "353" && \
3237 got[9] == "315" && \
3238 got[10] == "242" && \
3239 got[11] == "171" && \
3240 got[12] == "000" && \
3241 got[13] == "240" && \
3242 got[14] == "000" && \
3250 if (got[8] == "275" && \
3251 got[9] == "301" && \
3252 got[10] == "064" && \
3253 got[11] == "157" && \
3254 got[12] == "000" && \
3255 got[13] == "124" && \
3256 got[14] == "000" && \
3264 if (got[8] == "300" && \
3265 got[9] == "033" && \
3266 got[10] == "353" && \
3267 got[11] == "171" && \
3268 got[12] == "242" && \
3269 got[13] == "240" && \
3270 got[14] == "000" && \
3282 print "unknown", saw
3286 gmp_cv_c_double_format=`od -b conftest.$OBJEXT | $AWK -f conftest.awk`
3287 case $gmp_cv_c_double_format in
3289 echo "cannot match anything, conftest.$OBJEXT contains" >&AC_FD_CC
3290 od -b conftest.$OBJEXT >&AC_FD_CC
3294 AC_MSG_WARN([oops, cannot compile test program])
3299 AH_VERBATIM([HAVE_DOUBLE],
3300 [/* Define one of the following to 1 for the format of a `double'.
3301 If your format is not among these choices, or you don't know what it is,
3302 then leave all undefined.
3303 IEEE_LITTLE_SWAPPED means little endian, but with the two 4-byte halves
3304 swapped, as used by ARM CPUs in little endian mode. */
3305 #undef HAVE_DOUBLE_IEEE_BIG_ENDIAN
3306 #undef HAVE_DOUBLE_IEEE_LITTLE_ENDIAN
3307 #undef HAVE_DOUBLE_IEEE_LITTLE_SWAPPED
3308 #undef HAVE_DOUBLE_VAX_D
3309 #undef HAVE_DOUBLE_VAX_G
3310 #undef HAVE_DOUBLE_CRAY_CFP])
3312 case $gmp_cv_c_double_format in
3314 AC_DEFINE(HAVE_DOUBLE_IEEE_BIG_ENDIAN, 1)
3315 GMP_DEFINE_RAW("define_not_for_expansion(\`HAVE_DOUBLE_IEEE_BIG_ENDIAN')", POST)
3317 "IEEE little endian")
3318 AC_DEFINE(HAVE_DOUBLE_IEEE_LITTLE_ENDIAN, 1)
3319 GMP_DEFINE_RAW("define_not_for_expansion(\`HAVE_DOUBLE_IEEE_LITTLE_ENDIAN')", POST)
3321 "IEEE little endian, swapped halves")
3322 AC_DEFINE(HAVE_DOUBLE_IEEE_LITTLE_SWAPPED, 1) ;;
3324 AC_DEFINE(HAVE_DOUBLE_VAX_D, 1) ;;
3326 AC_DEFINE(HAVE_DOUBLE_VAX_G, 1) ;;
3328 AC_DEFINE(HAVE_DOUBLE_CRAY_CFP, 1) ;;
3329 "bad ARM software floats")
3332 AC_MSG_WARN([Could not determine float format.])
3333 AC_MSG_WARN([Conversions to and from "double" may be slow.])
3336 AC_MSG_WARN([oops, unrecognised float format: $gmp_cv_c_double_format])
3344 dnl Test whether to use <stdarg.h> or <varargs.h>.
3346 dnl Notice the AC_DEFINE here is HAVE_STDARG to avoid clashing with
3347 dnl HAVE_STDARG_H which could arise from AC_CHECK_HEADERS.
3349 dnl This test might be slight overkill, after all there's really only going
3350 dnl to be ANSI or K&R and the two can be differentiated by AC_PROG_CC_STDC
3351 dnl or very likely by the setups for _PROTO in gmp.h. On the other hand
3352 dnl this test is nice and direct, being what we're going to actually use.
3354 AC_DEFUN([GMP_C_STDARG],
3355 [AC_CACHE_CHECK([whether <stdarg.h> exists and works],
3358 [#include <stdarg.h>
3359 int foo (int x, ...)
3364 y = va_arg (ap, int);
3368 gmp_cv_c_stdarg=yes, gmp_cv_c_stdarg=no)
3370 if test $gmp_cv_c_stdarg = yes; then
3371 AC_DEFINE(HAVE_STDARG, 1, [Define to 1 if <stdarg.h> exists and works])
3378 dnl Determine whether "alloca" is available. This is AC_FUNC_ALLOCA from
3379 dnl autoconf, but changed so it doesn't use alloca.c if alloca() isn't
3380 dnl available, and also to use gmp-impl.h for the conditionals detecting
3381 dnl compiler builtin alloca's.
3383 AC_DEFUN([GMP_FUNC_ALLOCA],
3384 [AC_REQUIRE([GMP_HEADER_ALLOCA])
3385 AC_CACHE_CHECK([for alloca (via gmp-impl.h)],
3389 [#include "$srcdir/gmp-impl.h"
3391 [char *p = (char *) alloca (1);],
3392 gmp_cv_func_alloca=yes,
3393 gmp_cv_func_alloca=no)])
3394 if test $gmp_cv_func_alloca = yes; then
3395 AC_DEFINE(HAVE_ALLOCA, 1, [Define to 1 if alloca() works (via gmp-impl.h).])
3399 AC_DEFUN([GMP_HEADER_ALLOCA],
3400 [# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
3401 # for constant arguments. Useless!
3402 AC_CACHE_CHECK([for working alloca.h],
3403 gmp_cv_header_alloca,
3404 [AC_TRY_LINK([#include <alloca.h>],
3405 [char *p = (char *) alloca (2 * sizeof (int));],
3406 gmp_cv_header_alloca=yes,
3407 gmp_cv_header_alloca=no)])
3408 if test $gmp_cv_header_alloca = yes; then
3409 AC_DEFINE(HAVE_ALLOCA_H, 1,
3410 [Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).])
3415 dnl GMP_OPTION_ALLOCA
3416 dnl -----------------
3417 dnl Decide what to do about --enable-alloca from the user.
3418 dnl This is a macro so it can require GMP_FUNC_ALLOCA.
3420 AC_DEFUN([GMP_OPTION_ALLOCA],
3421 [AC_REQUIRE([GMP_FUNC_ALLOCA])
3422 AC_CACHE_CHECK([how to allocate temporary memory],
3423 gmp_cv_option_alloca,
3424 [case $enable_alloca in
3426 gmp_cv_option_alloca=alloca
3429 gmp_cv_option_alloca=malloc-reentrant
3431 reentrant | notreentrant)
3432 case $gmp_cv_func_alloca in
3433 yes) gmp_cv_option_alloca=alloca ;;
3434 *) gmp_cv_option_alloca=malloc-$enable_alloca ;;
3438 gmp_cv_option_alloca=$enable_alloca
3443 AH_VERBATIM([WANT_TMP],
3444 [/* Define one of these to 1 for the desired temporary memory allocation
3445 method, per --enable-alloca. */
3446 #undef WANT_TMP_ALLOCA
3447 #undef WANT_TMP_REENTRANT
3448 #undef WANT_TMP_NOTREENTRANT
3449 #undef WANT_TMP_DEBUG])
3451 case $gmp_cv_option_alloca in
3453 if test $gmp_cv_func_alloca = no; then
3454 AC_MSG_ERROR([--enable-alloca=alloca specified, but alloca not available])
3456 AC_DEFINE(WANT_TMP_ALLOCA)
3457 TAL_OBJECT=tal-reent$U.lo
3460 AC_DEFINE(WANT_TMP_REENTRANT)
3461 TAL_OBJECT=tal-reent$U.lo
3463 malloc-notreentrant)
3464 AC_DEFINE(WANT_TMP_NOTREENTRANT)
3465 TAL_OBJECT=tal-notreent$U.lo
3468 AC_DEFINE(WANT_TMP_DEBUG)
3469 TAL_OBJECT=tal-debug$U.lo
3472 # checks at the start of configure.in should protect us
3473 AC_MSG_ERROR([unrecognised --enable-alloca=$gmp_cv_option_alloca])
3476 AC_SUBST(TAL_OBJECT)
3480 dnl GMP_FUNC_SSCANF_WRITABLE_INPUT
3481 dnl ------------------------------
3482 dnl Determine whether sscanf requires a writable input string.
3484 dnl It might be nicer to run a program to determine this when doing a
3485 dnl native build, but the systems afflicted are few and far between these
3486 dnl days, so it seems good enough just to list them.
3488 AC_DEFUN([GMP_FUNC_SSCANF_WRITABLE_INPUT],
3489 [AC_CACHE_CHECK([whether sscanf needs writable input],
3490 gmp_cv_func_sscanf_writable_input,
3492 *-*-hpux9 | *-*-hpux9.*)
3493 gmp_cv_func_sscanf_writable_input=yes ;;
3494 *) gmp_cv_func_sscanf_writable_input=no ;;
3497 case $gmp_cv_func_sscanf_writable_input in
3498 yes) AC_DEFINE(SSCANF_WRITABLE_INPUT, 1,
3499 [Define to 1 if sscanf requires writable inputs]) ;;
3501 *) AC_MSG_ERROR([unrecognised \$gmp_cv_func_sscanf_writable_input]) ;;
3506 dnl GMP_FUNC_VSNPRINTF
3507 dnl ------------------
3508 dnl Check whether vsnprintf exists, and works properly.
3510 dnl Systems without vsnprintf include mingw32, OSF 4.
3512 dnl Sparc Solaris 2.7 in 64-bit mode doesn't always truncate, making
3513 dnl vsnprintf like vsprintf, and hence completely useless. On one system a
3514 dnl literal string is enough to provoke the problem, on another a "%n" was
3515 dnl needed. There seems to be something weird going on with the optimizer
3516 dnl or something, since on the first system adding a second check with
3517 dnl "%n", or even just an initialized local variable, makes it work. In
3518 dnl any case, without bothering to get to the bottom of this, the two
3519 dnl program runs in the code below end up successfully detecting the
3522 dnl glibc 2.0.x returns either -1 or bufsize-1 for an overflow (both seen,
3523 dnl not sure which 2.0.x does which), but still puts the correct null
3524 dnl terminated result into the buffer.
3526 AC_DEFUN([GMP_FUNC_VSNPRINTF],
3527 [AC_REQUIRE([GMP_C_STDARG])
3528 AC_CHECK_FUNC(vsnprintf,
3529 [gmp_vsnprintf_exists=yes],
3530 [gmp_vsnprintf_exists=no])
3531 if test "$gmp_vsnprintf_exists" = no; then
3532 gmp_cv_func_vsnprintf=no
3534 AC_CACHE_CHECK([whether vsnprintf works],
3535 gmp_cv_func_vsnprintf,
3536 [gmp_cv_func_vsnprintf=yes
3537 for i in 'return check ("hello world");' 'int n; return check ("%nhello world", &n);'; do
3539 #include <string.h> /* for strcmp */
3540 #include <stdio.h> /* for vsnprintf */
3545 #include <varargs.h>
3550 check (const char *fmt, ...)
3556 static char buf[128];
3565 fmt = va_arg (ap, char *);
3568 ret = vsnprintf (buf, 4, fmt, ap);
3570 if (strcmp (buf, "hel") != 0)
3573 /* allowed return values */
3574 if (ret != -1 && ret != 3 && ret != 11)
3587 [gmp_cv_func_vsnprintf=no; break],
3588 [gmp_cv_func_vsnprintf=probably; break])
3591 if test "$gmp_cv_func_vsnprintf" = probably; then
3592 AC_MSG_WARN([cannot check for properly working vsnprintf when cross compiling, will assume it's ok])
3594 if test "$gmp_cv_func_vsnprintf" != no; then
3595 AC_DEFINE(HAVE_VSNPRINTF,1,
3596 [Define to 1 if you have the `vsnprintf' function and it works properly.])
3602 dnl GMP_H_EXTERN_INLINE
3603 dnl -------------------
3604 dnl If the compiler has an "inline" of some sort, check whether the
3605 dnl #ifdef's in gmp.h recognise it.
3607 AC_DEFUN([GMP_H_EXTERN_INLINE],
3608 [AC_REQUIRE([AC_C_INLINE])
3609 case $ac_cv_c_inline in
3613 [#define __GMP_WITHIN_CONFIGURE_INLINE 1
3615 #ifndef __GMP_EXTERN_INLINE
3619 [case $ac_cv_c_inline in
3620 yes) tmp_inline=inline ;;
3621 *) tmp_inline=$ac_cv_c_inline ;;
3623 AC_MSG_WARN([gmp.h doesnt recognise compiler "$tmp_inline", inlines will be unavailable])])
3631 dnl Check whether the #ifdef's in gmp.h recognise when stdio.h has been
3632 dnl included to get FILE.
3634 AC_DEFUN([GMP_H_HAVE_FILE],
3636 [#include <stdio.h>]
3638 [#if ! _GMP_H_HAVE_FILE
3642 [AC_MSG_WARN([gmp.h doesnt recognise <stdio.h>, FILE prototypes will be unavailable])])
3646 dnl GMP_PROG_CC_FOR_BUILD
3647 dnl ---------------------
3648 dnl Establish CC_FOR_BUILD, a C compiler for the build system.
3650 dnl If CC_FOR_BUILD is set then it's expected to work, likewise the old
3651 dnl style HOST_CC, otherwise some likely candidates are tried, the same as
3652 dnl configfsf.guess.
3654 AC_DEFUN([GMP_PROG_CC_FOR_BUILD],
3655 [AC_REQUIRE([AC_PROG_CC])
3656 if test -n "$CC_FOR_BUILD"; then
3657 GMP_PROG_CC_FOR_BUILD_WORKS($CC_FOR_BUILD,,
3658 [AC_MSG_ERROR([Specified CC_FOR_BUILD doesn't seem to work])])
3659 elif test -n "$HOST_CC"; then
3660 GMP_PROG_CC_FOR_BUILD_WORKS($HOST_CC,
3661 [CC_FOR_BUILD=$HOST_CC],
3662 [AC_MSG_ERROR([Specified HOST_CC doesn't seem to work])])
3664 for i in "$CC" "$CC $CFLAGS $CPPFLAGS" cc gcc c89 c99; do
3665 GMP_PROG_CC_FOR_BUILD_WORKS($i,
3669 if test -z "$CC_FOR_BUILD"; then
3670 AC_MSG_ERROR([Cannot find a build system compiler])
3674 AC_ARG_VAR(CC_FOR_BUILD,[build system C compiler])
3675 AC_SUBST(CC_FOR_BUILD)
3679 dnl GMP_PROG_CC_FOR_BUILD_WORKS(cc/cflags[,[action-if-good][,action-if-bad]])
3680 dnl -------------------------------------------------------------------------
3681 dnl See if the given cc/cflags works on the build system.
3683 dnl It seems easiest to just use the default compiler output, rather than
3684 dnl figuring out the .exe or whatever at this stage.
3686 AC_DEFUN([GMP_PROG_CC_FOR_BUILD_WORKS],
3687 [AC_MSG_CHECKING([build system compiler $1])
3688 # remove anything that might look like compiler output to our "||" expression
3689 rm -f conftest* a.out b.out a.exe a_out.exe
3690 cat >conftest.c <<EOF
3697 gmp_compile="$1 conftest.c"
3698 cc_for_build_works=no
3699 if AC_TRY_EVAL(gmp_compile); then
3700 if (./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest) >&AC_FD_CC 2>&1; then
3701 cc_for_build_works=yes
3704 rm -f conftest* a.out b.out a.exe a_out.exe
3705 AC_MSG_RESULT($cc_for_build_works)
3706 if test "$cc_for_build_works" = yes; then
3707 ifelse([$2],,:,[$2])
3709 ifelse([$3],,:,[$3])
3714 dnl GMP_PROG_CPP_FOR_BUILD
3715 dnl ---------------------
3716 dnl Establish CPP_FOR_BUILD, the build system C preprocessor.
3717 dnl The choices tried here are the same as AC_PROG_CPP, but with
3720 AC_DEFUN([GMP_PROG_CPP_FOR_BUILD],
3721 [AC_REQUIRE([GMP_PROG_CC_FOR_BUILD])
3722 AC_MSG_CHECKING([for build system preprocessor])
3723 if test -z "$CPP_FOR_BUILD"; then
3724 AC_CACHE_VAL(gmp_cv_prog_cpp_for_build,
3725 [cat >conftest.c <<EOF
3728 for i in "$CC_FOR_BUILD -E" "$CC_FOR_BUILD -E -traditional-cpp" "/lib/cpp"; do
3729 gmp_compile="$i conftest.c"
3730 if AC_TRY_EVAL(gmp_compile) >&AC_FD_CC 2>&1; then
3731 gmp_cv_prog_cpp_for_build=$i
3735 rm -f conftest* a.out b.out a.exe a_out.exe
3736 if test -z "$gmp_cv_prog_cpp_for_build"; then
3737 AC_MSG_ERROR([Cannot find build system C preprocessor.])
3740 CPP_FOR_BUILD=$gmp_cv_prog_cpp_for_build
3742 AC_MSG_RESULT([$CPP_FOR_BUILD])
3744 AC_ARG_VAR(CPP_FOR_BUILD,[build system C preprocessor])
3745 AC_SUBST(CPP_FOR_BUILD)
3749 dnl GMP_PROG_EXEEXT_FOR_BUILD
3750 dnl -------------------------
3751 dnl Determine EXEEXT_FOR_BUILD, the build system executable suffix.
3753 dnl The idea is to find what "-o conftest$foo" will make it possible to run
3754 dnl the program with ./conftest. On Unix-like systems this is of course
3755 dnl nothing, for DOS it's ".exe", or for a strange RISC OS foreign file
3756 dnl system cross compile it can be ",ff8" apparently. Not sure if the
3757 dnl latter actually applies to a build-system executable, maybe it doesn't,
3758 dnl but it won't hurt to try.
3760 AC_DEFUN([GMP_PROG_EXEEXT_FOR_BUILD],
3761 [AC_REQUIRE([GMP_PROG_CC_FOR_BUILD])
3762 AC_CACHE_CHECK([for build system executable suffix],
3763 gmp_cv_prog_exeext_for_build,
3764 [cat >conftest.c <<EOF
3771 for i in .exe ,ff8 ""; do
3772 gmp_compile="$CC_FOR_BUILD conftest.c -o conftest$i"
3773 if AC_TRY_EVAL(gmp_compile); then
3774 if (./conftest) 2>&AC_FD_CC; then
3775 gmp_cv_prog_exeext_for_build=$i
3781 if test "${gmp_cv_prog_exeext_for_build+set}" != set; then
3782 AC_MSG_ERROR([Cannot determine executable suffix])
3785 AC_SUBST(EXEEXT_FOR_BUILD,$gmp_cv_prog_exeext_for_build)
3789 dnl GMP_C_FOR_BUILD_ANSI
3790 dnl --------------------
3791 dnl Determine whether CC_FOR_BUILD is ANSI, and establish U_FOR_BUILD
3794 dnl FIXME: Use AC_PROG_CC sets ac_cv_prog_cc_c89 which could be used instead
3796 AC_DEFUN([GMP_C_FOR_BUILD_ANSI],
3797 [AC_REQUIRE([GMP_PROG_CC_FOR_BUILD])
3798 AC_CACHE_CHECK([whether build system compiler is ANSI],
3799 gmp_cv_c_for_build_ansi,
3800 [cat >conftest.c <<EOF
3802 main (int argc, char **argv)
3807 gmp_compile="$CC_FOR_BUILD conftest.c"
3808 if AC_TRY_EVAL(gmp_compile); then
3809 gmp_cv_c_for_build_ansi=yes
3811 gmp_cv_c_for_build_ansi=no
3813 rm -f conftest* a.out b.out a.exe a_out.exe
3815 if test "$gmp_cv_c_for_build_ansi" = yes; then
3818 AC_SUBST(U_FOR_BUILD,_)
3823 dnl GMP_CHECK_LIBM_FOR_BUILD
3824 dnl ------------------------
3825 dnl Establish LIBM_FOR_BUILD as -lm, if that seems to work.
3827 dnl Libtool AC_CHECK_LIBM also uses -lmw on *-ncr-sysv4.3*, if it works.
3828 dnl Don't know what that does, lets assume it's not needed just for log().
3830 AC_DEFUN([GMP_CHECK_LIBM_FOR_BUILD],
3831 [AC_REQUIRE([GMP_PROG_CC_FOR_BUILD])
3832 AC_CACHE_CHECK([for build system compiler math library],
3833 gmp_cv_check_libm_for_build,
3834 [cat >conftest.c <<EOF
3847 gmp_compile="$CC_FOR_BUILD conftest.c -lm"
3848 if AC_TRY_EVAL(gmp_compile); then
3849 gmp_cv_check_libm_for_build=-lm
3851 gmp_cv_check_libm_for_build=no
3853 rm -f conftest* a.out b.out a.exe a_out.exe
3855 case $gmp_cv_check_libm_for_build in
3856 yes) AC_SUBST(LIBM_FOR_BUILD,-lm) ;;
3857 no) LIBM_FOR_BUILD= ;;
3858 *) LIBM_FOR_BUILD=$gmp_cv_check_libm_for_build ;;