dnl Process this file with autoconf to produce a configure script. # Copyright 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. # # This file is part of the GNU MP Library. # # The GNU MP Library is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published # by the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # The GNU MP Library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public # License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with the GNU MP Library; see the file COPYING.LIB. If not, write to # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, # MA 02111-1307, USA. AC_REVISION($Revision$) AC_PREREQ(2.49) AC_INIT(gmp-impl.h) # If --target is not used then $target_alias is empty, but if say # "./configure athlon-pc-freebsd3.5" is used, then all three of # $build_alias, $host_alias and $target_alias are set to # "athlon-pc-freebsd3.5". # if test -n "$target_alias" && test "$target_alias" != "$host_alias"; then AC_MSG_ERROR([--target is not appropriate for GMP Use --build=CPU-VENDOR-OS if you need to specify your CPU and/or system explicitly. Use --host if cross-compiling (see "Installing GMP" in the manual for more on this).]) fi GMP_INIT(config.m4) AC_CANONICAL_HOST tmp_host=`echo $host_cpu | sed 's/\./_/'` AC_DEFINE_UNQUOTED(HAVE_HOST_CPU_$tmp_host) GMP_DEFINE_RAW("define_not_for_expansion(\`HAVE_HOST_CPU_$tmp_host')", POST) AM_INIT_AUTOMAKE(gmp, GMP_VERSION) AM_CONFIG_HEADER(config.h:config.in) AM_MAINTAINER_MODE AC_ARG_ENABLE(assert, AC_HELP_STRING([--enable-assert],[enable ASSERT checking [default=no]]), [case $enableval in yes|no) ;; *) AC_MSG_ERROR([bad value $enableval for --enable-assert, need yes or no]) ;; esac], [enable_assert=no]) if test "$enable_assert" = "yes"; then AC_DEFINE(WANT_ASSERT,1, [./configure --enable-assert option, to enable some ASSERT()s]) fi AC_ARG_ENABLE(alloca, AC_HELP_STRING([--enable-alloca],[use alloca for temp space [default=yes]]), [case $enableval in yes|no|detect) ;; *) AC_MSG_ERROR([bad value $enableval for --enable-alloca, need yes/no/detect]) ;; esac], [enable_alloca=detect]) if test "$enable_alloca" = "no"; then AC_DEFINE(USE_STACK_ALLOC,1, [./configure --disable-alloca option, to use stack-alloc.c, not alloca]) fi AC_ARG_ENABLE(fft, AC_HELP_STRING([--enable-fft],[enable FFTs for multiplication [default=no]]), [case $enableval in yes|no) ;; *) AC_MSG_ERROR([bad value $enableval for --enable-fft, need yes or no]) ;; esac], [enable_fft=no]) if test "$enable_fft" = "yes"; then AC_DEFINE(WANT_FFT,1, [./configure --enable-fft option, to enable FFTs for multiplication]) fi AC_ARG_ENABLE(mpbsd, AC_HELP_STRING([--enable-mpbsd], [build Berkley MP compatibility library [default=no]]), [case $enableval in yes|no) ;; *) AC_MSG_ERROR([bad value $enableval for --enable-mpbsd, need yes or no]) ;; esac], [enable_mpbsd=no]) AM_CONDITIONAL(WANT_MPBSD, test "$enable_mpbsd" = "yes") AC_ARG_ENABLE(mpfr, AC_HELP_STRING([--enable-mpfr],[build MPFR [default=no]]), [case $enableval in yes|no) ;; *) AC_MSG_ERROR([bad value $enableval for --enable-mpfr, need yes or no]) ;; esac], [enable_mpfr=no]) AM_CONDITIONAL(WANT_MPFR, test "$enable_mpfr" = "yes") AC_ARG_ENABLE(profiling, AC_HELP_STRING([--enable-profiling], [build with profiler support [default=no]]), [case $enableval in no|prof|gprof) ;; *) AC_MSG_ERROR([bad value $enableval for --enable-profiling, need no/prof/gprof]) ;; esac], [enable_profiling=no]) GMP_DEFINE_RAW(["define(,<\`$enable_profiling'>)"]) # -fomit-frame-pointer is incompatible with -pg, on x86s at least if test "$enable_profiling" = gprof; then fomit_frame_pointer= else fomit_frame_pointer="-fomit-frame-pointer" fi # Table of compilers, options, and mpn paths. This code has a couple of # related purposes # # - better default CC/CFLAGS selections than autoconf otherwise gives # - default CC/CFLAGS selections for extra CPU types specific to GMP # - a few tests for known bad compilers # - choice of ABIs on suitable systems # - selection of corresponding mpn search path # # After GMP specific searches and tests, the standard autoconf AC_PROG_CC is # called. User selections of CC etc are respected. # # Care is taken not to use macros like AC_TRY_COMPILE during the GMP # pre-testing, since they of course depend on AC_PROG_CC, and also some of # them cache their results, which is not wanted. # # The ABI selection mechanism is unique to GMP. All that reaches autoconf # is a different selection of CC/CFLAGS according to the best ABI the system # supports, and/or what the user selects. Naturally the mpn assembler code # selected is very dependent on the ABI. # # The closest the standard tools come to a notion of ABI is something like # "sparc64" which encodes a CPU and an ABI together. This doesn't seem to # scale well for GMP, where exact CPU types like "ultrasparc2" are wanted, # separate from the ABI used on them. # # # The variables set here are # # cclist the compiler choices # xx_cflags flags for compiler xx # xx_cppflags cpp flags for compiler xx # xx_cflags_optlist list of sets of optional flags # xx_cflags_yyy set yyy of optional flags for compiler xx # xx_ldflags -Wc,-foo flags for libtool linking with compiler xx # ar_flags extra flags for $AR # nm_flags extra flags for $NM # limb limb size, can be "longlong" # path mpn search path # extra_functions extra mpn functions # # Suppose xx_cflags_optlist="arch", then flags from $xx_cflags_arch are # tried, and the first flag that works will be used. An optlist like "arch # cpu optimize" can be used to get multiple independent sets of flags tried. # The first that works from each will be used. If no flag in a set works # then nothing from that set is added. # # For multiple ABIs, the scheme extends as follows. # # abilist set of ABI choices # cclist_aa compiler choices in ABI aa # xx_aa_cflags flags for xx in ABI aa # xx_aa_cppflags cpp flags for xx in ABI aa # xx_aa_cflags_optlist list of sets of optional flags in ABI aa # xx_aa_cflags_yyy set yyy of optional flags for compiler xx in ABI aa # xx_aa_ldflags -Wc,-foo flags for libtool linking # ar_aa_flags extra flags for $AR in ABI aa # nm_aa_flags extra flags for $NM in ABI aa # limb_aa limb size in ABI aa, can be "longlong" # path_aa mpn search path in ABI aa # extra_functions_aa extra mpn functions in ABI aa # # As a convenience, the unadorned xx_cflags (etc) are used for the last ABI # in ablist, if an xx_aa_cflags for that ABI isn't given. For example if # abilist="64 32" then $cc_64_cflags will be used for the 64-bit ABI, but # for the 32-bit either $cc_32_cflags or $cc_cflags is used, whichever is # defined. This makes it easy to add some 64-bit compilers and flags to an # unadorned 32-bit set. # # limb=longlong (or limb_aa=longlong) applies to all compilers within that # ABI. It won't work to have some needing long long and some not, since a # single instantiated gmp.h will be used by both. # # SPEED_CYCLECOUNTER, cyclecounter_size and CALLING_CONVENTIONS_OBJS are # also set here, with an ABI suffix. # # # "family" is a remant of past configuration schemes, now used only for # setting up asm-syntax.h for m68k. # abilist needs to be non-empty, "standard" is just a generic name here abilist="standard" family=generic # FIXME: Prefer c89 to cc. cclist="gcc cc" gcc_cflags="-g -O2" gcc_64_cflags="-g -O2" cc_cflags="-O" cc_64_cflags="-O" SPEED_CYCLECOUNTER_OBJ= cyclecounter_size=2 case $host in a29k*-*-*) path="a29k" ;; alpha*-*-*) path="alpha" extra_functions="cntlz" case $host in alphaev5*-*-* | alphapca56*-*-*) path="alpha/ev5 alpha" ;; alphaev6*-*-*) path="alpha/ev6 alpha/ev5 alpha" ;; esac SPEED_CYCLECOUNTER_OBJ=alpha.lo cyclecounter_size=1 flavour=`echo $host_cpu | sed 's/^alpha//g'` case "$flavour" in # compilers don't seem to understand `ev67' and such. ev6? | ev7*) flavour=ev6 ;; ev* | pca*) ;; *) flavour=ev4 ;; esac # FIXME: Maybe a feature test should find out whether -Wa,arch is # necessary. if test -n "$flavour"; then gcc_cflags_optlist="cpu arch" gcc_cflags_cpu="-mcpu=$flavour" gcc_cflags_arch="-Wa,-arch,$flavour -Wa,-m$flavour" fi case $host in *-cray-unicos*) # FIXME: Is GCC available for these systems? Hopefully it doesn't # hurt to check for it anyway. cc_cflags="-O" # no -g, it silently disables all optimizations GMP_INCLUDE_MPN(alpha/unicos.m4) # Don't perform any assembly syntax tests on this beast. gmp_asm_syntax_testing=no # tune/alpha.asm assumes int==4bytes but unicos uses int=8bytes SPEED_CYCLECOUNTER_OBJ= ;; *-*-osf*) cc_cflags_optlist="cpu" cc_cflags="-arch $flavour -tune $flavour" GMP_INCLUDE_MPN(alpha/default.m4) ;; *) GMP_INCLUDE_MPN(alpha/default.m4) ;; esac ;; # Cray vector machines. # This must come after alpha* so that we can recognize present and future # vector processors with a wildcard. *-cray-unicos*) gmp_asm_syntax_testing=no cclist="cc" cc_cflags="-O3 -htask0 -Wa,-B" path="cray" ;; arm*-*-*) path="arm" ;; clipper*-*-*) path="clipper" ;; # Fujitsu [f30[01]-fujitsu-sysv*]) cclist="gcc vcc" # FIXME: flags for vcc? vcc_cflags="-g" path="fujitsu" ;; hppa*-*-*) # HP cc is K&R by default, but AM_C_PROTOTYPES will add "-Ae", or "-Aa # -D_HPUX_SOURCE", to put it into ansi mode, if possible. # default to pa7100 gcc_cflags="-g -O2" gcc_cflags_optlist="arch" gcc_cflags_arch="-mpa-risc-1-1" cc_cflags="+DA1.1 +O2" path="hppa/hppa1_1/pa7100 hppa/hppa1_1 hppa" extra_functions="udiv_qrnnd" SPEED_CYCLECOUNTER_OBJ=hppa.lo cyclecounter_size=1 case $host in hppa1.0*-*-*) # override back to plain 1.0 gcc_cflags_optlist= cc_cflags="+O2" path="hppa" ;; hppa7000*-*-*) path="hppa/hppa1_1 hppa" ;; hppa2.0*-*-*) abilist="2.0n 1.0" # FIXME: It's suspected that an assembler feature test might be # necessary before -mpa-risc-2-0 can be enabled, since it's not # clear (as of gcc 2.95.2) whether that option always gives an # explicit ".level 2.0" or whatever to the assembler. In any case, # under gcc 2.95.2 it only enables a few extra floating point insns, # so it's not very important. # # gmp_cflags_arch="-mpa-risc-2-0 -mpa-risc-1-1" # FIXME: path should be "hppa/hppa2_0 hppa/hppa1_1 hppa" path="hppa/hppa2_0 hppa/hppa1_1/pa7100 hppa/hppa1_1 hppa" # no gcc support for long long in 2.0n cclist_20n="cc" # +O2 to cc triggers bug in mpz/powm.c (cvs version 1.4) cc_20n_cflags="+DA2.0 +e +O3" cc_20n_testlist="hpc-hppa-2-0" path_20n="pa64" limb_20n=longlong extra_functions_20n="umul_ppmm udiv_qrnnd" SPEED_CYCLECOUNTER_OBJ_20n=hppa2.lo cyclecounter_size_20n=2 # ABI=2.0w is available for hppa2.0w and hppa2.0, but not for hppa2.0n. case $host in hppa2.0n-*-*) ;; *) # HPUX 11 or up is required to run 2.0w. Not sure about other # systems (GNU/Linux for instance), but lets assume they're ok. case $host in [*-*-hpux1[1-9]*]) abilist="2.0w $abilist" ;; *-*-hpux*) ;; *) abilist="2.0w $abilist" ;; esac # gcc support for 2.0w is in progress cclist_20w="cc" cc_20w_cflags="+DD64 +O3" cc_20w_testlist="hpc-hppa-2-0" path_20w="pa64w" extra_functions_20w="umul_ppmm udiv_qrnnd" SPEED_CYCLECOUNTER_OBJ_20w=hppa2w.lo cyclecounter_size_20w=2 ;; esac ;; esac ;; i960*-*-*) path="i960" ;; ia64*-*-*) path="ia64" GMP_INCLUDE_MPN(ia64/default.m4) SPEED_CYCLECOUNTER_OBJ=ia64.lo ;; # Motorola 68k m68*-*-*) family=m68k path="m68k" gcc_cflags="$gcc_cflags $fomit_frame_pointer" case $host in # Nexts are at least '020, and let m68k mean 68020-68040. [m680[234]0*-*-* | m68k*-*-* | m68*-next-nextstep*]) path="m68k/mc68020 m68k" ;; esac ;; # Motorola 88k m88k*-*-*) path="m88k" ;; m88110*-*-*) # FIXME: Use `-O2'? gcc_cflags="-g -O -m88110" path="m88k/mc88110 m88k" ;; # National Semiconductor 32k ns32k*-*-*) path="ns32k" ;; # IRIX 5 and earlier can only run 32-bit o32. # # IRIX 6 and up can run n32 or 64, and GMP uses a 64-bit limb on both. It # could run the mips2 code in n32 with a 32-bit limb, which we could # perhaps call 32, but since that would just create a slower library, we # don't give that option. # # Linux kernel 2.2.13 arch/mips/kernel/irixelf.c has a comment about not # supporting n32 or 64. # # We here use ldflags for passing options with libtool to the compiler # when generating the shared library. [mips*-*-irix[6789]*]) abilist="64 n32" # let the $found_compiler test below know that the cpu is recognised path=dummy cclist_n32="gcc cc" gcc_n32_cflags="-g -O2 -mabi=n32" gcc_n32_ldflags="-Wc,-mabi=n32" cc_n32_cflags="-O2 -n32" # no -g, it disables all optimizations cc_n32_ldflags="-Wc,-n32" limb_n32=longlong path_n32="mips3" cclist_64="gcc cc" gcc_64_cflags="-g -O2 -mabi=64" gcc_64_ldflags="-Wc,-mabi=64" cc_64_cflags="-O2 -64" # no -g, it disables all optimizations cc_64_ldflags="-Wc,-64" path_64="mips3" ;; mips*-*-*) path="mips2" ;; powerpc*-*-*) cclist="gcc" gcc_cflags="-g -O2 -mpowerpc -Wa,-mppc" path="powerpc32" case $host in *-*-aix*) cclist="gcc xlc" xlc_cflags="-g -O2 -qarch=ppc -qmaxmem=20000" ;; esac case $host in powerpc64*-*-*) # CPU type powerpc64 forces to a 64-bit limb case $host in powerpc64-*-*) abilist="32L" ;; *) abilist="32L 32" ;; esac cclist_32L="gcc" gcc_32L_cflags="-g -O2 -mpowerpc64" limb_32L=longlong path_32L="powerpc64" # On AIX a true 64-bit ABI is available. case $host in *-*-aix*) # Need -Wc to pass object type flags through to the linker. abilist="aix64 $abilist" cclist_aix64="gcc xlc" gcc_aix64_cflags="-g -O2 -maix64 -mpowerpc64" gcc_aix64_ldflags="-Wc,-maix64" xlc_aix64_cflags="-g -O2 -q64 -qtune=pwr3 -qmaxmem=20000" xlc_aix64_ldflags="-Wc,-q64" # Must indicate object type to ar and nm ar_aix64_flags="-X64" nm_aix64_flags="-X64" path_aix64="powerpc64" ;; esac ;; esac ;; # POWER [power-*-* | power[12]-*-* | power2sc-*-*]) cclist="gcc" extra_functions="udiv_w_sdiv" path="power" gcc_cflags_optlist="cpu" case $host in power-*-*) gcc_cflags_cpu="-mcpu=power -mpower" ;; power1-*-*) gcc_cflags_cpu="-mcpu=rios1 -mpower" ;; power2-*-*) gcc_cflags_cpu="-mcpu=rios2 -mpower" ;; power2sc-*-*) gcc_cflags_cpu="-mcpu=rsc -mpower" ;; esac case $host in *-*-aix*) cclist="gcc xlc" xlc_cflags="-g -O2 -qarch=pwr -qmaxmem=20000" ;; esac ;; # FIXME: ppc601 isn't accepted by config.sub. ppc601-*-*) path="power powerpc32" ;; pyramid-*-*) path="pyr" ;; sh-*-*) path="sh" ;; sh2-*-*) path="sh/sh2 sh" ;; *sparc*-*-*) # For cc and acc, -g disables -O, so it's not used cclist="gcc acc cc" path="sparc32" gcc_cflags="-g -O2" gcc_cflags_optlist="cpu" gcc_cflags_cpu= acc_cflags="-O2" cc_cflags="-O2" # FIXME: This should be selected according to the CPU if test x${floating_point} = xno then extra_functions="udiv_nfp" else extra_functions="udiv_fp" fi case $host in sparcv8*-*-* | supersparc*-*-* | microsparc*-*-*) gcc_cflags_cpu="-mcpu=v8 -mv8" acc_cflags="-O2 -cg92" path="sparc32/v8 sparc32" case $host in *-*-solaris2.*) cc_cflags="-xtarget=native -xarch=v8 -xO4" ;; esac case $host in supersparc*-*-*) path="sparc32/v8/supersparc sparc32/v8 sparc32" extra_functions="udiv" ;; esac ;; # sparc64-*-linux* is a misnomer, since there's no support for any # 64-bit operations in user mode. We assume that a future release # will have some 64-bit support and that the gcc options will be the # same as on solaris. # # cc -xarch actually controls the ABI, hence it must be v8 for 32-bit, # even though the chip is v9. # sparcv9*-*-* | ultrasparc*-*-* | sparc64-*-linux*) path="sparc32/v9 sparc32/v8 sparc32" extra_functions="udiv_fp" SPEED_CYCLECOUNTER_OBJ=sparcv9.lo gcc_cflags="-g -O2 -Wa,-xarch=v8plus" gcc_cflags_cpu="-mcpu=ultrasparc -mcpu=v9 -mcpu=v8 -mv8" cc_cflags="-xtarget=native -xarch=v8 -xO4" case $host in [*-*-solaris2.[7-9]]) # solaris prior to 2.6 doesn't save registers properly, so the # 64-bit ABI is only available for 2.7 up abilist="64 32" path_64="sparc64" cclist_64="gcc cc" gcc_64_cflags="-g -O2 -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9" cc_64_cflags="-xtarget=native -xarch=v9 -xO4" ;; esac ;; esac ;; # VAX vax*-*-*) # Believe that vax gcc always accepts -fomit-frame-pointer, though it # might not do anything. Cf. gcc/config/vax/vax.h which has # FRAME_POINTER_REQUIRED=1 always. # gcc_cflags="-g -O2 $fomit_frame_pointer" path="vax" extra_functions="udiv_w_sdiv" ;; # AMD and Intel x86 configurations X86_PATTERN) # Rumour has it gcc -O2 used to give worse register allocation than just # -O, but lets assume that's no longer true. gcc_cflags="-g -O2 $fomit_frame_pointer" GMP_INCLUDE_MPN(x86/x86-defs.m4) extra_functions="udiv umul" CALLING_CONVENTIONS_OBJS='x86call.lo x86check$U.lo' # Availability of rdtsc is checked at run-time. SPEED_CYCLECOUNTER_OBJ=pentium.lo # gcc 2.7.2 only knows i386 and i486, using -m386 or -m486. These # represent -mcpu= since -m486 doesn't generate 486 specific insns. The # -mcpu= and -march= options will fail, leaving just -m486. # # gcc 2.95.2 adds k6, pentium and pentiumpro, and allows -march= and # -mcpu=. # # gcc 2.96 (pre-release gcc 3) adds athlon. # Defaults for anything not otherwise mentioned. path="x86" gcc_cflags_optlist="cpu arch" gcc_cflags_cpu="-mcpu=i486 -m486" gcc_cflags_arch="-march=i486" case $host in i386*-*-*) # Because i386 means generic x86, -mcpu=i486 is used since that # should better suit newer processors. # FIXME: How would a user ask for an actual 80386? Currently only by # using CFLAGS="-mcpu=386" or whatever. gcc_cflags_cpu="-mcpu=i486 -m486" gcc_cflags_arch="-march=i386" ;; i586*-*-* | pentium-*-* | pentiummmx-*-*) gcc_cflags_cpu="-mcpu=pentium -m486" gcc_cflags_arch="-march=pentium" ;; [i686*-*-* | pentiumpro-*-* | pentium[23]-*-*]) gcc_cflags_cpu="-mcpu=pentiumpro -mcpu=i486 -m486" gcc_cflags_arch="-march=pentiumpro -march=i486" ;; k6*-*-*) gcc_cflags_cpu="-mcpu=k6 -mcpu=i486 -m486" gcc_cflags_arch="-march=k6 -march=i486" ;; athlon-*-*) # Athlon instruction costs are close to P6 (3 cycle load latency, # 4-6 cycle mul, 40 cycle div, pairable adc, etc) so if gcc doesn't # know athlon (eg. 2.95.2 doesn't) then fall back on pentiumpro. gcc_cflags_cpu="-mcpu=athlon -mcpu=pentiumpro -mcpu=i486 -m486" gcc_cflags_arch="-march=athlon -march=pentiumpro -march=i486" ;; esac case $host in i586*-*-* | pentium-*-*) path="x86/pentium x86" ;; pentiummmx-*-*) path="x86/pentium/mmx x86/pentium x86" ;; i686*-*-* | pentiumpro-*-*) path="x86/p6 x86" ;; pentium2-*-*) path="x86/p6/mmx x86/p6 x86" ;; pentium3-*-*) path="x86/p6/p3mmx x86/p6/mmx x86/p6 x86";; [k6[23]*-*-*]) path="x86/k6/k62mmx x86/k6/mmx x86/k6 x86" ;; k6*-*-*) path="x86/k6/mmx x86/k6 x86" ;; athlon-*-*) path="x86/k7/mmx x86/k7 x86" ;; esac ;; # FIXME: z8kx won't get through config.sub. z8kx*-*-*) path="z8000x" extra_functions="udiv_w_sdiv" ;; z8k*-*-*) path="z8000" extra_functions="udiv_w_sdiv" ;; # Special CPU "none" selects generic C. -DNO_ASM is used to disable gcc # asm blocks in longlong.h (since they're driven by cpp pre-defined # symbols like __alpha rather than the configured $host_cpu). # none-*-*) gcc_cppflags="-DNO_ASM" ;; esac CFLAGS_or_unset=${CFLAGS-'(unset)'} CPPFLAGS_or_unset=${CPPFLAGS-'(unset)'} cat >&AC_FD_CC <gmp.h echo "" >>gmp.h sed "s:@define_LONG_LONG_LIMB@:$tmp:" $srcdir/gmp-h.in >>gmp.h if test "$enable_mpbsd" = yes; then echo "/* Generated by configure from mp-h.in - DO NOT EDIT */" >mp.h echo "" >>mp.h sed "s:@define_LONG_LONG_LIMB@:$tmp:" $srcdir/mp-h.in >>mp.h fi cat >&AC_FD_CC <, "mit", "elf", "aix", "macho". syntax= # For now, we use the old switch for setting syntax. # FIXME: Remove when conversion to .asm is completed. changequote(,) case $host in m680[234]0*-*-linuxaout* | m68k*-*-linuxaout* | \ m68k-next-nextstep* | \ m68000*-*-*) syntax=mit ;; m680[234]0*-*-linux* | m68k*-*-linux*) syntax=elf ;; m680[234]0*-*-* | m68k*-*-*) syntax=mit ;; esac changequote([,]) # Pick the correct source files in $path and link them to mpn/. # $gmp_mpn_functions lists all functions we need. # # The rule is to find a file with the function name and a .asm, .S, # .s, or .c extension. Certain multi-function files with special names # can provide some functions too. (mpn/Makefile.am passes # -DOPERATION_ to get them to generate the right code.) # FIXME: udiv and umul aren't in $gmp_mpn_functions_optional yet since # there's some versions of those files which should be checked for bit # rot first. Put them in $extra_functions for each host for now, # change to standard optionals when all are ready. # Note: The following lines defining $gmp_mpn_functions_optional # and $gmp_mpn_functions are parsed by the "macos/configure" # Perl script. So if you change the lines in a major way # make sure to run and examine the output from # # % (cd macos; perl configure) # # Note: $gmp_mpn_functions must have mod_1 before pre_mod_1 so the former # can optionally have the latter as an extra entrypoint. gmp_mpn_functions_optional="copyi copyd com_n \ and_n andn_n nand_n ior_n iorn_n nior_n xor_n xnor_n \ gcd_finda invert_limb" gmp_mpn_functions="$extra_functions inlines add_n sub_n mul_1 addmul_1 \ submul_1 lshift rshift diveby3 divrem divrem_1 divrem_2 \ mod_1 mode1o pre_mod_1 dump \ mul mul_fft mul_n mul_basecase sqr_basecase random \ random2 sqrtrem get_str set_str scan0 scan1 popcount hamdist cmp perfsqr \ bdivmod gcd_1 gcd gcdext tdiv_qr dc_divrem_n sb_divrem_mn jacbase \ $gmp_mpn_functions_optional" # the list of all object files used by mpn/Makefile.in and the # top-level Makefile.in, respectively mpn_objects= mpn_objs_in_libgmp="mpn/mp_bases.lo" # links from the sources, to be removed by "make distclean" gmp_srclinks= define(MPN_SUFFIXES,[asm S s c]) for tmp_ext in MPN_SUFFIXES; do eval found_$tmp_ext=no done for tmp_fn in $gmp_mpn_functions; do for tmp_ext in MPN_SUFFIXES; do test "$no_create" = yes || rm -f mpn/$tmp_fn.$tmp_ext done # Don't need pre_mod_1 if it's already been provided (by an asm mod_1). case $tmp_fn in pre_mod_1) if test "$HAVE_NATIVE_mpn_preinv_mod_1" = yes; then continue; fi ;; esac # functions that can be provided by multi-function files tmp_mulfunc= case $tmp_fn in add_n|sub_n) tmp_mulfunc="aors_n" ;; addmul_1|submul_1) tmp_mulfunc="aorsmul_1" ;; popcount|hamdist) tmp_mulfunc="popham" ;; and_n|andn_n|nand_n | ior_n|iorn_n|nior_n | xor_n|xnor_n) tmp_mulfunc="logops_n" ;; lshift|rshift) tmp_mulfunc="lorrshift";; esac found=no for tmp_dir in $path; do for tmp_base in $tmp_fn $tmp_mulfunc; do for tmp_ext in MPN_SUFFIXES; do tmp_file=$srcdir/mpn/$tmp_dir/$tmp_base.$tmp_ext if test -f $tmp_file; then found=yes eval found_$tmp_ext=yes if test $tmp_ext = c; then tmp_u='$U' else tmp_u= fi mpn_objects="$mpn_objects $tmp_fn$tmp_u.lo" mpn_objs_in_libgmp="$mpn_objs_in_libgmp mpn/$tmp_fn$tmp_u.lo" AC_CONFIG_LINKS(mpn/$tmp_fn.$tmp_ext:mpn/$tmp_dir/$tmp_base.$tmp_ext) gmp_srclinks="$gmp_srclinks mpn/$tmp_fn.$tmp_ext" # Duplicate AC_DEFINEs are harmless, so it doesn't matter # that multi-function files get grepped here repeatedly. # The PROLOGUE pattern has ".*" so that alpha PROLOGUE_GP matches. gmp_ep=[` sed -n 's/^[ ]*MULFUNC_PROLOGUE(\(.*\))/\1/p' $tmp_file ; sed -n 's/^[ ]*PROLOGUE.*(\(.*\))/\1/p' $tmp_file `] for gmp_tmp in $gmp_ep; do AC_DEFINE_UNQUOTED(HAVE_NATIVE_$gmp_tmp) eval HAVE_NATIVE_$gmp_tmp=yes done case $tmp_fn in sqr_basecase) sqr_basecase_source=$tmp_file ;; esac break fi done if test $found = yes; then break ; fi done if test $found = yes; then break ; fi done if test $found = no; then for tmp_optional in $gmp_mpn_functions_optional; do if test $tmp_optional = $tmp_fn; then found=yes fi done if test $found = no; then AC_MSG_ERROR([no version of $tmp_fn found in path: $path]) fi fi done # All cycle counters are .asm files currently if test -n "$SPEED_CYCLECOUNTER_OBJ"; then found_asm=yes fi # Don't demand an m4 unless it's actually needed. if test $found_asm = yes; then GMP_PROG_M4 else M4=m4-not-needed fi # Only do the GMP_ASM checks if there's a .S or .asm wanting them. if test $found_asm = no && test $found_S = no; then gmp_asm_syntax_testing=no fi if test "$gmp_asm_syntax_testing" != no; then GMP_ASM_TEXT GMP_ASM_DATA GMP_ASM_RODATA GMP_ASM_GLOBL GMP_ASM_LABEL_SUFFIX GMP_ASM_TYPE GMP_ASM_SIZE GMP_ASM_LSYM_PREFIX GMP_ASM_W32 GMP_ASM_UNDERSCORE(underscore=yes, underscore=no) GMP_ASM_ALIGN_LOG(asm_align=log, asm_align=nolog) case $host in powerpc*-*-*) GMP_ASM_POWERPC_R_REGISTERS GMP_INCLUDE_MPN(powerpc32/powerpc-defs.m4) case $host in powerpc64*-*-aix*) GMP_INCLUDE_MPN(powerpc64/aix.m4) ;; *-*-aix*) GMP_INCLUDE_MPN(powerpc32/aix.m4) ;; esac ;; X86_PATTERN) GMP_ASM_ALIGN_FILL_0x90 GMP_ASM_X86_SHLDL_CL if test "$enable_profiling" != no; then GMP_ASM_X86_MCOUNT fi ;; esac # Build an asm-syntax.h file for hosts that include that from the # assembly files. # FIXME: Remove when conversion to .asm is completed. # case "${family}-${underscore}-${asm_align}-${syntax}" in m68k-yes-log-mit) echo '#define MIT_SYNTAX' >asm-syntax.h cat $srcdir/mpn/underscore.h >>asm-syntax.h echo '#include "'$srcdir'/mpn/m68k/syntax.h"' >>asm-syntax.h;; m68k-no-nolog-elf) echo '#define ELF_SYNTAX' >asm-syntax.h echo '#define C_SYMBOL_NAME(name) name' >>asm-syntax.h echo '#include "'$srcdir'/mpn/m68k/syntax.h"' >>asm-syntax.h;; esac fi # Create link for gmp-mparam.h. gmp_mparam_source= for tmp_dir in $path; do test "$no_create" = yes || rm -f gmp-mparam.h tmp_file=$srcdir/mpn/$tmp_dir/gmp-mparam.h if test -f $tmp_file; then AC_CONFIG_LINKS(gmp-mparam.h:mpn/$tmp_dir/gmp-mparam.h) gmp_srclinks="$gmp_srclinks gmp-mparam.h" gmp_mparam_source=$tmp_file break fi done if test -z "$gmp_mparam_source"; then AC_MSG_ERROR([no version of gmp-mparam.h found in path: $path]) fi # Copy any KARATSUBA_SQR_THRESHOLD from gmp-mparam.h to config.m4. # Some versions of sqr_basecase.asm use this. tmp_gmp_karatsuba_sqr_threshold=`sed -n 's/^#define KARATSUBA_SQR_THRESHOLD[ ]*\([0-9][0-9]*\).*$/\1/p' $gmp_mparam_source` if test -n "$tmp_gmp_karatsuba_sqr_threshold"; then GMP_DEFINE_RAW(["define(,<$tmp_gmp_karatsuba_sqr_threshold>)"]) fi GMP_C_SIZES GMP_C_ATTRIBUTE_NORETURN GMP_C_ATTRIBUTE_CONST AC_SUBST(mpn_objects) AC_SUBST(mpn_objs_in_libgmp) AC_SUBST(gmp_srclinks) # A recompiled sqr_basecase for use in the tune program, if necessary. TUNE_SQR_OBJ= test -d tune || mkdir tune case $sqr_basecase_source in *.asm) sqr_max=[`sed -n 's/^def...(KARATSUBA_SQR_THRESHOLD_MAX, *\([0-9]*\))/\1/p' $sqr_basecase_source`] if test -n "$sqr_max"; then TUNE_SQR_OBJ=sqr_asm.o AC_DEFINE_UNQUOTED(TUNE_KARATSUBA_SQR_MAX,$sqr_max, [Maximum size the tune program can test for KARATSUBA_SQR_THRESHOLD]) fi cat >tune/sqr_basecase.c <tune/sqr_basecase.c <