[project @ 2001-01-17 12:14:30 by simonmar]
[ghc-hetmet.git] / ghc / rts / gmp / configure.in
1 dnl  Process this file with autoconf to produce a configure script.
2
3
4 dnl  Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
5 dnl
6 dnl  This file is part of the GNU MP Library.
7 dnl
8 dnl  The GNU MP Library is free software; you can redistribute it and/or modify
9 dnl  it under the terms of the GNU Lesser General Public License as published
10 dnl  by the Free Software Foundation; either version 2.1 of the License, or (at
11 dnl  your option) any later version.
12 dnl
13 dnl  The GNU MP Library is distributed in the hope that it will be useful, but
14 dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16 dnl  License for more details.
17 dnl
18 dnl  You should have received a copy of the GNU Lesser General Public License
19 dnl  along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
20 dnl  the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
21 dnl  MA 02111-1307, USA.
22
23
24 AC_REVISION($Revision: 1.7 $)dnl
25 AC_PREREQ(2.14)dnl
26 AC_INIT(gmp-impl.h)
27
28 dnl Check system.
29 AC_CANONICAL_SYSTEM
30
31 dnl  Automake
32 AM_INIT_AUTOMAKE(gmp, GMP_VERSION)
33 AM_CONFIG_HEADER(config.h:config.in)
34 AM_MAINTAINER_MODE
35
36 dnl  GMP specific
37 GMP_INIT(config.m4)
38
39
40 AC_ARG_ENABLE(assert,
41 AC_HELP_STRING([--enable-assert],[enable ASSERT checking [default=no]]),
42 [case "${enableval}" in
43 yes|no) ;;
44 *) AC_MSG_ERROR([bad value ${enableval} for --enable-assert, need yes or no]) ;;
45 esac],
46 [enable_assert=no])
47
48 if test "$enable_assert" = "yes"; then
49   AC_DEFINE(WANT_ASSERT,1,
50   [./configure --enable-assert option, to enable some ASSERT()s])
51 fi
52
53
54 AC_ARG_ENABLE(alloca,
55 AC_HELP_STRING([--enable-alloca],[use alloca for temp space [default=yes]]),
56 [case "${enableval}" in
57 yes|no) ;;
58 *) AC_MSG_ERROR([bad value ${enableval} for --enable-alloca, need yes or no]) ;;
59 esac],
60 [enable_alloca=yes])
61
62 if test "$enable_alloca" = "no"; then
63   AC_DEFINE(USE_STACK_ALLOC,1,
64   [./configure --disable-alloca option, to use stack-alloc.c, not alloca])
65 fi
66
67
68 AC_ARG_ENABLE(fft,
69 AC_HELP_STRING([--enable-fft],[enable FFTs for multiplication [default=no]]),
70 [case "${enableval}" in
71 yes|no) ;;
72 *) AC_MSG_ERROR([bad value ${enableval} for --enable-fft, need yes or no]) ;;
73 esac],
74 [enable_fft=no])
75
76 if test "$enable_fft" = "yes"; then
77   AC_DEFINE(WANT_FFT,1,
78   [./configure --enable-fft option, to enable FFTs for multiplication])
79 fi
80
81
82 AC_ARG_ENABLE(mpbsd,
83 AC_HELP_STRING([--enable-mpbsd],[build Berkley MP compatibility library [default=no]]),
84 [case "${enableval}" in
85 yes|no) ;;
86 *) AC_MSG_ERROR([bad value ${enableval} for --enable-mpbsd, need yes or no]) ;;
87 esac],
88 [enable_mpbsd=no])
89 AM_CONDITIONAL(WANT_MPBSD, test "$enable_mpbsd" = "yes")
90
91
92 AC_ARG_ENABLE(mpfr,
93 AC_HELP_STRING([--enable-mpfr],[build MPFR [default=no]]),
94 [case "${enableval}" in
95 yes|no) ;;
96 *) AC_MSG_ERROR([bad value ${enableval} for --enable-mpfr, need yes or no]) ;;
97 esac],
98 [enable_mpfr=no])
99 AM_CONDITIONAL(WANT_MPFR, test "$enable_mpfr" = "yes")
100
101
102 dnl Switch on OS and determine what compiler to use.
103 dnl
104 dnl  os_64bit              Set to "yes" if OS is 64-bit capable.
105 dnl                        FIXME: Rename to `check_64bit_compiler'!
106 dnl  cclist                List of compilers, best first.
107 dnl  gmp_cflags_{cc}       Flags for compiler named {cc}.
108 dnl  gmp_cflags64_{cc}     Flags for compiler named {cc} for 64-bit code.
109 dnl  gmp_optcflags_{cc}    Optional compiler flags.
110 dnl  gmp_xoptcflags_{cc}   Exclusive optional compiler flags.
111 dnl
112 os_64bit="no"
113 cclist="gcc cc"         # FIXME: Prefer c89 to cc.
114 gmp_cflags_gcc="-g -O2"
115 gmp_cflags64_gcc="-g -O2"
116 gmp_cflags_cc="-g"
117 gmp_cflags64_cc="-g"
118
119 case "$target" in
120   # Alpha
121   alpha*-cray-unicos*)
122     # Don't perform any assembly syntax tests on this beast.
123     gmp_no_asm_syntax_testing=yes
124     cclist=cc
125     gmp_cflags_cc="$gmp_cflags_cc -O"
126     ;;
127   alpha*-*-osf*)
128     flavour=`echo $target_cpu | sed 's/^alpha//g'`
129     if test -n "$flavour"; then
130       case $flavour in     # compilers don't seem to understand `ev67' and such.
131         ev6? | ev7*) flavour=ev6;;
132       esac
133       gmp_optcflags_gcc="-mcpu=$flavour"
134       # FIXME: We shouldn't fail fatally if none of these work, but that's
135       # how xoptcflags work and we don't have any other mechanism right now.
136       # Why do we need this here and not for alpha*-*-* below?
137       gmp_xoptcflags_gcc="-Wa,-arch,${flavour} -Wa,-m${flavour}"
138       gmp_optcflags_cc="-arch $flavour -tune $flavour"
139     fi
140     ;;
141   alpha*-*-*)
142     cclist="gcc"
143     flavour=`echo $target_cpu | sed 's/^alpha//g'`
144     if test -n "$flavour"; then
145       case $flavour in
146         ev6? | ev7*) flavour=ev6;;
147       esac
148       gmp_optcflags_gcc="-mcpu=$flavour"
149     fi
150     ;;
151   # Cray vector machines.  This must come after alpha* so that we can
152   # recognize present and future vector processors with a wildcard.
153   *-cray-unicos*)
154     # Don't perform any assembly syntax tests on this beast.
155     gmp_no_asm_syntax_testing=yes
156     cclist=cc
157     # Don't inherit default gmp_cflags_cc value; it comes with -g which
158     # disables all optimization on Cray vector systems
159     gmp_cflags_cc="-O"
160     ;;
161
162   # AMD and Intel x86 configurations
163   [i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-*])
164     # Rumour has it -O2 used to give worse register allocation than just -O.
165     gmp_cflags_gcc="-g -O -fomit-frame-pointer"
166
167     case "${target}" in
168       i386*-*-*)    gmp_optcflags_gcc="-mcpu=i386 -march=i386";;
169       i486*-*-*)    gmp_optcflags_gcc="-mcpu=i486 -march=i486";;
170       i586*-*-* | pentium-*-* | pentiummmx-*-*)
171                     gmp_optcflags_gcc="-mcpu=pentium -march=pentium";;
172
173       # -march=pentiumpro not used because mpz/powm.c (swox cvs rev 1.4)
174       # tickles a bug in gcc 2.95.2 (believed fixed in 2.96).
175       [i686*-*-* | pentiumpro-*-* | pentium[23]-*-*])
176                     gmp_optcflags_gcc="-mcpu=pentiumpro";;
177
178       k6*-*-*)      gmp_optcflags_gcc="-mcpu=k6 -march=k6";;
179
180       # Athlon instruction costs are close to p6: 3 cycle load latency, 4-6
181       # cycle mul, 40 cycle div, pairable adc, ...
182       # FIXME: Change this when gcc gets something specific for Athlon.
183       # -march=pentiumpro not used, per i686 above.
184       athlon-*-*)   gmp_optcflags_gcc="-mcpu=pentiumpro";;
185     esac
186     ;;
187
188   # Sparc
189   [ultrasparc*-*-solaris2.[7-9] | sparcv9-*-solaris2.[7-9]])
190     os_64bit=yes
191     gmp_cflags_gcc="$gmp_cflags_gcc -Wa,-xarch=v8plus"
192     gmp_xoptcflags_gcc="-mcpu=v9 -mcpu=v8 -mv8"
193     gmp_cflags64_gcc="$gmp_cflags64_gcc -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9"
194     gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4"
195     gmp_cflags64_cc="-xtarget=native -xarch=v9 -xO4"
196     ;;
197   sparc64-*-linux*)
198     # Need to think more about the options passed here.  This isn't good for
199     # some sparc64 linux distros, since we end up not optimizing when all the
200     # options below fail.
201     os_64bit=yes
202     gmp_cflags64_gcc="$gmp_cflags64_gcc -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9"
203     gmp_cflags_gcc="$gmp_cflags_gcc -m32"
204     gmp_xoptflags_gcc="-mcpu=ultrasparc -mvis"
205     ;;
206   ultrasparc*-*-* | sparcv9-*-*)
207     gmp_cflags_gcc="$gmp_cflags_gcc -Wa,-xarch=v8plus"
208     gmp_xoptcflags_gcc="-mcpu=v9 -mcpu=v8 -mv8"
209     gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4"
210     ;;
211   sparcv8*-*-solaris2.* | microsparc*-*-solaris2.*)
212     gmp_cflags_gcc="$gmp_cflags_gcc"
213     gmp_xoptcflags_gcc="-mcpu=v8 -mv8"
214     gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4"
215     ;;
216   sparcv8*-*-* | microsparc*-*-*)               # SunOS, Linux, *BSD
217     cclist="gcc acc cc"
218     gmp_cflags_gcc="$gmp_cflags_gcc"
219     gmp_xoptcflags_gcc="-mcpu=v8 -mv8"
220     gmp_cflags_acc="-g -O2 -cg92"
221     gmp_cflags_cc="-O2"         # FIXME: Flag for v8?
222     ;;
223   supersparc*-*-solaris2.*)
224     gmp_cflags_gcc="$gmp_cflags_gcc -DSUPERSPARC"
225     gmp_xoptcflags_gcc="-mcpu=v8 -mv8"
226     gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4 -DSUPERSPARC"
227     ;;
228   supersparc*-*-*)              # SunOS, Linux, *BSD
229     cclist="gcc acc cc"
230     gmp_cflags_gcc="$gmp_cflags_gcc -DSUPERSPARC"
231     gmp_xoptcflags_gcc="-mcpu=v8 -mv8"
232     gmp_cflags_acc="-g -O2 -cg92 -DSUPERSPARC"
233     gmp_cflags_cc="-O2 -DSUPERSPARC"    # FIXME: Flag for v8?
234     ;;
235   *sparc*-*-*)
236     cclist="gcc acc cc"
237     gmp_cflags_acc="-g -O2"
238     gmp_cflags_cc="-g -O2"
239     ;;
240
241   # POWER/PowerPC
242   powerpc64-*-aix*)
243     cclist="gcc xlc"
244     gmp_cflags_gcc="$gmp_cflags_gcc -maix64 -mpowerpc64"
245     gmp_cflags_xlc="-g -O2 -q64 -qtune=pwr3"
246     ;;
247   powerpc*-*-aix*)
248     cclist="gcc xlc"
249     gmp_cflags_gcc="$gmp_cflags_gcc -mpowerpc"
250     gmp_cflags_xlc="$gmp_cflags_cc -qarch=ppc -O2"
251     ;;
252   power-*-aix*)
253     cclist="gcc xlc"
254     gmp_cflags_gcc="$gmp_cflags_gcc -mpower"
255     gmp_cflags_xlc="$gmp_cflags_cc -qarch=pwr -O2"
256     ;;
257   powerpc64*-*-*)
258     gmp_cflags_gcc="$gmp_cflags_gcc -mpowerpc64"
259     AC_DEFINE(_LONG_LONG_LIMB)  dnl FIXME: Remove.
260     ;;
261   powerpc*-*-*)
262     gmp_cflags_gcc="$gmp_cflags_gcc -mpowerpc"
263     ;;
264
265   # MIPS
266   mips-sgi-irix6.*)
267     os_64bit=yes
268     gmp_cflags64_gcc="-g -O2 -mabi=n32"
269     gmp_cflags64_cc="$gmp_cflags64_cc -O2 -n32"
270     ;;
271
272   # Motorola 68k family
273   m88110*-*-*)
274     gmp_cflags_gcc="-g -O -m88110"      dnl  FIXME: Use `-O2'?
275     ;;
276   m68*-*-*)
277     gmp_cflags_gcc="$gmp_cflags_gcc -fomit-frame-pointer"
278     ;;
279
280   # HP
281   hppa1.0*-*-*)
282     cclist="gcc c89 cc"
283     gmp_cflags_c89="$gmp_cflags_cc +O2"
284     gmp_cflags_cc="$gmp_cflags_cc +O2"
285     ;;
286   hppa2.0w*-*-*)
287     cclist="c89 cc"
288     gmp_cflags_c89="+DD64 +O3"
289     gmp_cflags_cc="+DD64 +O3"
290     ;;
291   hppa2.0*-*-*)
292     os_64bit=yes
293     cclist="gcc c89 cc"
294     gmp_cflags64_gcc="$gmp_cflags64_gcc -mWHAT -D_LONG_LONG_LIMB"
295     # +O2 to cc triggers bug in mpz/powm.c (1.4)
296     gmp_cflags64_c89="+DA2.0 +e +O3 -D_LONG_LONG_LIMB"
297     gmp_cflags64_cc="+DA2.0 +e +O3 -D_LONG_LONG_LIMB"
298     gmp_cflags_c89="$gmp_cflags_cc +O2"
299     gmp_cflags_cc="$gmp_cflags_cc +O2"
300     ;;
301
302   # VAX
303   vax*-*-*)
304     gmp_cflags_gcc="$gmp_cflags_gcc -fomit-frame-pointer"
305     ;;
306
307   # Fujitsu
308   [f30[01]-fujitsu-sysv*])
309     cclist="gcc vcc"
310     gmp_cflags_vcc="-g"         # FIXME: flags for vcc?
311     ;;
312 esac
313
314 case "${target}" in
315   *-*-mingw32) gmp_cflags_gcc="$gmp_cflags_gcc -mno-cygwin";;
316 esac
317
318 dnl  Check for programs needed by macros for finding compiler.
319 dnl  More programs are checked for below, when a compiler is found.
320 AC_PROG_NM      dnl  Macro from Libtool.
321 # nm on 64-bit AIX needs to know the object file format 
322 case "$target" in
323   powerpc64*-*-aix*)
324     NM="$NM -X 64"
325     ;;
326 esac   
327
328 # Save CFLAGS given on command line.
329 gmp_user_CFLAGS="$CFLAGS"
330
331 if test -z "$CC"; then
332   # Find compiler.
333   GMP_PROG_CC_FIND($cclist, $os_64bit)
334
335   # If 64-bit OS and we have a 64-bit compiler, use it.
336   if test -n "$os_64bit" && test -n "$CC64"; then
337     CC=$CC64
338     CFLAGS=$CFLAGS64
339   else
340     eval CFLAGS=\$gmp_cflags_$CC  
341   fi
342
343   # Try compiler flags that may work with only some compiler versions.
344   # gmp_optcflags: All or nothing.
345   eval optcflags=\$gmp_optcflags_$CC
346   if test -n "$optcflags"; then
347     CFLAGS_save="$CFLAGS"
348     CFLAGS="$CFLAGS $optcflags"
349     AC_MSG_CHECKING([whether $CC accepts $optcflags])
350     AC_LANG_C
351     AC_TRY_COMPILER([int main(){return(0);}], optok, cross)
352     if test "$optok" = "yes"; then
353       AC_MSG_RESULT([yes])
354     else
355       AC_MSG_RESULT([no])
356       CFLAGS="$CFLAGS_save"
357     fi
358   fi
359   # gmp_xoptcflags: First is best, one has to work.
360   eval xoptcflags=\$gmp_xoptcflags_$CC
361   if test -n "$xoptcflags"; then
362     gmp_found="no"
363     for xopt in $xoptcflags; do
364       CFLAGS_save="$CFLAGS"
365       CFLAGS="$CFLAGS $xopt"
366       AC_MSG_CHECKING([whether $CC accepts $xopt])
367       AC_LANG_C
368       AC_TRY_COMPILER([int main(){return(0);}], optok, cross)
369       if test "$optok" = "yes"; then
370         AC_MSG_RESULT([yes])
371         gmp_found="yes"
372         break
373       else
374         AC_MSG_RESULT([no])
375         CFLAGS="$CFLAGS_save"
376       fi
377     done
378     if test "$gmp_found" = "no"; then
379       echo ["$0: fatal: need a compiler that understands one of $xoptcflags"]
380       exit 1
381     fi
382   fi
383 fi
384
385 # Restore CFLAGS given on command line.
386 # FIXME: We've run through quite some unnecessary code looking for a
387 # nice compiler and working flags for it, just to spoil that with user
388 # supplied flags.
389 test -n "$gmp_user_CFLAGS" && CFLAGS="$gmp_user_CFLAGS"
390
391 # Select chosen compiler.
392 GMP_PROG_CC_SELECT
393
394 # How to assemble.
395 CCAS="$CC -c"
396 AC_SUBST(CCAS)
397
398 dnl Checks for programs.
399 dnl --------------------
400 AC_PROG_CPP
401 AC_PROG_INSTALL
402 AC_PROG_LN_S
403 GMP_PROG_M4
404 AC_CHECK_PROG(AR, ar, ar)
405 # ar on AIX needs to know the object file format 
406 case "$target" in
407   powerpc64*-*-aix*)
408     AR="$AR -X 64"
409     ;;
410 esac   
411 dnl  FIXME: Find good ld?  /usr/ucb/ld on Solaris won't work.
412
413 dnl Checks for assembly syntax.
414 if test "$gmp_no_asm_syntax_testing" != "yes"; then
415   GMP_CHECK_ASM_TEXT
416   GMP_CHECK_ASM_DATA
417   GMP_CHECK_ASM_GLOBL
418   GMP_CHECK_ASM_LABEL_SUFFIX
419   GMP_CHECK_ASM_TYPE
420   GMP_CHECK_ASM_SIZE
421   GMP_CHECK_ASM_LSYM_PREFIX
422   GMP_CHECK_ASM_W32
423   GMP_CHECK_ASM_UNDERSCORE(underscore=yes, underscore=no)
424   GMP_CHECK_ASM_ALIGN_LOG(asm_align=log, asm_align=nolog)
425 fi
426
427 dnl  FIXME: Check for FPU and set `floating_point' appropriately.
428
429 dnl  ========================================
430 dnl  Configuring mpn.
431 dnl  ----------------------------------------
432 dnl  Set the following target specific variables:
433 dnl  path               where to search for source files
434 dnl  family             processor family (Needed for building 
435 dnl                     asm-syntax.h for now.  FIXME: Remove.)
436 dnl  extra_functions    extra functions
437
438 family=generic
439
440 case ${target} in
441   arm*-*-*)
442     path="arm"
443     ;;
444   [sparcv9*-*-solaris2.[789]* | sparc64*-*-solaris2.[789]* | ultrasparc*-*-solaris2.[789]*])
445     if test -n "$CC64"
446       then path="sparc64"
447       else path="sparc32/v9 sparc32/v8 sparc32"
448     fi
449     ;;
450   sparc64-*-linux*)
451     if test -n "$CC64"
452       then path="sparc64"
453       else path="sparc32/v9 sparc32/v8 sparc32"
454     fi
455     ;;
456   sparcv8*-*-* | microsparc*-*-*)
457         path="sparc32/v8 sparc32"
458         if test x${floating_point} = xno
459           then extra_functions="udiv_nfp"
460           else extra_functions="udiv_fp"
461         fi
462         ;;
463   sparcv9*-*-* | ultrasparc*-*-*)
464         path="sparc32/v9 sparc32/v8 sparc32"
465         extra_functions="udiv_fp"
466         ;;
467   supersparc*-*-*)
468         path="sparc32/v8/supersparc sparc32/v8 sparc32"
469         extra_functions="udiv"
470         ;;
471   sparc*-*-*) path="sparc32"
472         if test x${floating_point} = xno
473           then extra_functions="udiv_nfp"
474           else extra_functions="udiv_fp"
475         fi
476         ;;
477   hppa7000*-*-*)
478     path="hppa/hppa1_1 hppa"
479     extra_functions="udiv_qrnnd"
480     ;;
481   hppa1.0*-*-*)
482     path="hppa"
483     extra_functions="udiv_qrnnd"
484     ;;
485   hppa2.0w-*-*)
486     path="pa64w"
487     extra_functions="umul_ppmm udiv_qrnnd"
488     ;;
489   hppa2.0*-*-*)
490     if test -n "$CC64"; then
491       path="pa64"
492       extra_functions="umul_ppmm udiv_qrnnd"
493       # We need to use the system compiler, or actually the system assembler,
494       # since GAS has not been ported to understand the 2.0 instructions.
495       CCAS="$CC64 -c"
496     else
497       # FIXME: path should be "hppa/hppa2_0 hppa/hppa1_1 hppa"
498       path="hppa/hppa1_1 hppa"
499       extra_functions="udiv_qrnnd"
500     fi
501     ;;
502   hppa*-*-*)                                    #assume pa7100
503     path="hppa/hppa1_1/pa7100 hppa/hppa1_1 hppa"
504     extra_functions="udiv_qrnnd";;
505   [f30[01]-fujitsu-sysv*])
506     path=fujitsu;;
507   alphaev6*-*-*) path="alpha/ev6 alpha"; extra_functions="invert_limb cntlz";;
508   alphaev5*-*-*) path="alpha/ev5 alpha"; extra_functions="invert_limb cntlz";;
509   alpha*-*-*) path="alpha"; extra_functions="invert_limb cntlz";;
510   # Cray vector machines.  This must come after alpha* so that we can
511   # recognize present and future vector processors with a wildcard.
512   *-cray-unicos*)
513     path="cray"
514     extra_functions="mulww";;
515   am29000*-*-*) path="a29k";;
516   a29k*-*-*) path="a29k";;
517
518   # AMD and Intel x86 configurations
519
520   [i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-*])
521     gmp_m4postinc="x86/x86-defs.m4"
522     extra_functions="udiv umul"
523     CALLING_CONVENTIONS_OBJS="x86call.o x86check.o"
524
525     GMP_CHECK_ASM_SHLDL_CL(
526       [GMP_DEFINE(WANT_SHLDL_CL,1)],
527       [GMP_DEFINE(WANT_SHLDL_CL,0)])
528     GMP_CHECK_ASM_ALIGN_FILL_0x90
529
530     # the CPUs below wanting to know about mmx
531     case ${target} in
532       [pentiummmx-*-* | pentium[23]-*-* | k6*-*-* | athlon-*-*])
533         GMP_CHECK_ASM_MMX(tmp_mmx=yes, tmp_mmx=no)
534         ;;
535     esac
536
537     # default for anything not otherwise mentioned
538     path="x86"
539  
540     case ${target} in
541       [i[34]86*-*-*])
542         path="x86"
543         ;;
544       k5*-*-*)
545         # don't know what best suits k5
546         path="x86"
547         ;;
548       i586*-*-* | pentium-*-*)
549         path="x86/pentium x86"
550         ;;
551       pentiummmx-*-*)
552         path="x86/pentium x86"
553         if test "$tmp_mmx" = yes; then
554           path="x86/pentium/mmx $path"
555         fi
556         ;;
557       i686*-*-* | pentiumpro-*-*)
558         path="x86/p6 x86"
559         ;;
560       pentium2-*-*)
561         path="x86/p6 x86"
562         # The pentium/mmx lshift and rshift are good on p6 and can be used
563         # until there's something specific for p6.
564         if test "$tmp_mmx" = yes; then
565           path="x86/p6/mmx x86/pentium/mmx $path"
566         fi
567         ;;
568       pentium3-*-*)
569         path="x86/p6 x86"
570         # The pentium/mmx lshift and rshift are good on p6 and can be used
571         # until there's something specific for p6.
572         if test "$tmp_mmx" = yes; then
573           path="x86/p6/p3mmx x86/p6/mmx x86/pentium/mmx $path"
574         fi
575         ;;
576       [k6[23]*-*-*])
577         path="x86/k6 x86"
578         if test "$tmp_mmx" = yes; then
579           path="x86/k6/k62mmx x86/k6/mmx $path"
580         fi
581         ;;
582       k6*-*-*)
583         path="x86/k6 x86"
584         if test "$tmp_mmx" = yes; then
585           path="x86/k6/mmx $path"
586         fi
587         ;;
588       athlon-*-*)
589         path="x86/k7 x86"
590         if test "$tmp_mmx" = yes; then
591           path="x86/k7/mmx $path"
592         fi
593         ;;
594     esac
595     ;;
596
597
598   i960*-*-*) path="i960";;
599
600   ia64*-*-*) path="ia64";;
601
602 # Motorola 68k configurations.  Let m68k mean 68020-68040.
603   [m680[234]0*-*-* | m68k*-*-* | \
604   m68*-next-nextstep*])         # Nexts are at least '020
605     path="m68k/mc68020 m68k"
606     family=m68k
607     ;;
608   m68000*-*-*)
609     path="m68k"
610     family=m68k
611     ;;
612
613   m88k*-*-* | m88k*-*-*) path="m88k";;
614   m88110*-*-*) path="m88k/mc88110 m88k";;
615   ns32k*-*-*) path="ns32k";;
616
617   pyramid-*-*) path="pyr";;
618
619   ppc601-*-*) path="power powerpc32";;
620   powerpc64*-*-*) path="powerpc64";;
621   powerpc*-*-*) path="powerpc32";;
622   rs6000-*-* | power-*-* | power2-*-*)
623     path="power"
624     extra_functions="udiv_w_sdiv"
625     ;;
626
627   sh-*-*) path="sh";;
628   sh2-*-*) path="sh/sh2 sh";;
629
630   [mips[34]*-*-*]) path="mips3";;
631   mips*-*-irix6*) path="mips3";;
632   mips*-*-*) path="mips2";;
633
634   vax*-*-*) path="vax"; extra_functions="udiv_w_sdiv";;
635
636   z8000x*-*-*) path="z8000x"; extra_functions="udiv_w_sdiv";;
637   z8000*-*-*) path="z8000"; extra_functions="udiv_w_sdiv";;
638
639   clipper*-*-*) path="clipper";;
640 esac
641
642 AC_SUBST(CALLING_CONVENTIONS_OBJS)
643 if test -n "$CALLING_CONVENTIONS_OBJS"; then
644   AC_DEFINE(HAVE_CALLING_CONVENTIONS,1,
645   [Define if mpn/tests has calling conventions checking for the CPU])
646 fi
647
648
649 case ${target} in
650   [i[5-8]86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-*])
651     # rdtsc is in pentium and up, not in i386 and i486
652     SPEED_CYCLECOUNTER_OBJS=pentium.lo
653     ;;
654   alpha*-*-*)
655     SPEED_CYCLECOUNTER_OBJS=alpha.lo
656     ;;
657   sparcv9*-*-* | ultrasparc*-*-* | sparc64*-*-*)
658     SPEED_CYCLECOUNTER_OBJS=sparcv9.lo
659     ;;
660   hppa2*-*-*)
661     SPEED_CYCLECOUNTER_OBJS=hppa2.lo
662     ;;
663   hppa*-*-*)
664     SPEED_CYCLECOUNTER_OBJS=hppa.lo
665     ;;
666 esac
667
668 AC_SUBST(SPEED_CYCLECOUNTER_OBJS)
669
670 if test -n "$SPEED_CYCLECOUNTER_OBJS"
671 then
672   AC_DEFINE(HAVE_SPEED_CYCLECOUNTER, 1,
673   [Define if a speed_cyclecounter exists (for the tune programs)])
674 fi
675
676
677 dnl Extensions for executable and object files.
678 dnl -------------------------------------------
679 AC_EXEEXT
680 AC_OBJEXT
681
682 dnl Use Libtool.
683 dnl ------------
684 dnl  FIXME: Shared libs seem to fail on aix4.3.
685 dnl  FIXME: Should invoke [AC_DISABLE_SHARED], but m4 recurses to death.
686 case "$target" in
687   [*-*-aix4.[3-9]*]) enable_shared=no ;;
688 esac
689 AC_PROG_LIBTOOL
690
691 dnl Checks for libraries.
692 dnl ---------------------
693 AC_CHECK_DECLS((optarg))
694
695 dnl Checks for header files.
696 dnl ------------------------
697 AC_HEADER_STDC
698 AC_CHECK_HEADERS(getopt.h unistd.h sys/sysctl.h sys/time.h)
699
700 dnl Checks for typedefs, structures, and compiler characteristics.
701 dnl --------------------------------------------------------------
702 AC_CHECK_TYPES((void))
703 AC_C_STRINGIZE
704
705 dnl Checks for library functions.
706 dnl -----------------------------
707 dnl Most of these are only for the benefit of supplementary programs.  The
708 dnl library itself doesn't use anything weird.
709 dnl AC_FUNC_MEMCMP
710 dnl AC_TYPE_SIGNAL
711 dnl AC_CHECK_FUNCS(strtol)
712 AC_CHECK_FUNCS(getopt_long getpagesize popen processor_info strtoul sysconf sysctlbyname)
713
714 dnl Trick automake into thinking we've run AM_C_PROTOTYPES which it wants
715 dnl for ansi2knr, and instead use our own test.  (It's only a warning
716 dnl automake prints, but it's good to suppress it.)
717 ifelse(0,1,[
718 AM_C_PROTOTYPES
719 ])
720 GMP_C_ANSI2KNR
721
722
723 dnl  Set `syntax' to one of <blank>, "mit", "elf", "aix", "macho".
724 syntax=
725 # For now, we use the old switch for setting syntax.  
726 # FIXME: Remove when conversion to .asm is completed.
727 changequote(,)dnl
728 case "${target}" in
729   m680[234]0*-*-linuxaout* | m68k*-*-linuxaout* | \
730   m68k-next-nextstep* | \
731   m68000*-*-*)
732     syntax=mit
733     ;;
734   m680[234]0*-*-linux* | m68k*-*-linux*)
735     syntax=elf
736     ;;
737   m680[234]0*-*-* | m68k*-*-*)
738     syntax=mit
739     ;;
740 esac
741 changequote([,])dnl
742
743 dnl  ----------------------------------------
744 # Now build an asm-syntax.h file for targets that include that from the
745 # assembly files.
746 # FIXME: Remove when conversion to .asm is completed.
747 case "${family}-${underscore}-${asm_align}-${syntax}" in
748   m68k-yes-log-mit)
749     echo '#define MIT_SYNTAX' >asm-syntax.h
750     cat $srcdir/mpn/underscore.h >>asm-syntax.h
751     echo '#include "'$srcdir'/mpn/m68k/syntax.h"' >>asm-syntax.h;;
752   m68k-no-nolog-elf)
753     echo '#define ELF_SYNTAX' >asm-syntax.h
754     echo '#define C_SYMBOL_NAME(name) name' >>asm-syntax.h
755     echo '#include "'$srcdir'/mpn/m68k/syntax.h"' >>asm-syntax.h;;
756 esac
757
758
759 # The pattern here tests for an absolute path the same way as
760 # _AC_OUTPUT_FILES in autoconf acgeneral.m4.
761 GMP_DEFINE_RAW(["dnl  CONFIG_TOP_SRCDIR is a path from the mpn builddir to the top srcdir"])
762 case "$srcdir" in
763 [[\\/]]* | ?:[[\\/]]* )
764      GMP_DEFINE_RAW(["define(<CONFIG_TOP_SRCDIR>,<\`$srcdir'>)"])    ;;
765 *)   GMP_DEFINE_RAW(["define(<CONFIG_TOP_SRCDIR>,<\`../$srcdir'>)"]) ;;
766 esac
767  
768 GMP_DEFINE_RAW(["include(CONFIG_TOP_SRCDIR\`/mpn/asm-defs.m4')"], POST)
769
770 # Must be after asm-defs.m4
771 GMP_DEFINE_RAW("define_not_for_expansion(\`HAVE_TARGET_CPU_$target_cpu')", POST)
772
773
774 dnl  config.m4 post-includes
775 dnl  -----------------------
776 dnl  (Note x86 post include set with $path above.)
777 changequote(,)dnl
778 case "$target" in
779   alpha*-cray-unicos*)
780     gmp_m4postinc="alpha/unicos.m4"
781     ;;
782   alpha*-*-*)
783     gmp_m4postinc="alpha/default.m4"
784     ;;
785   power*-*-*)
786     case "$target" in
787       *-*-mach* | *-*-rhapsody* | *-*-nextstep*)
788         ;;      # these use non-conventional assembly syntax.
789       powerpc64-*-aix*)
790         gmp_m4postinc="powerpc32/regmap.m4 powerpc64/aix.m4"
791         ;;
792       *-*-aix*)
793         gmp_m4postinc="powerpc32/regmap.m4 powerpc32/aix.m4"
794         ;;
795       *)
796         gmp_m4postinc="powerpc32/regmap.m4"
797         ;;
798     esac
799     ;;
800 esac
801 changequote([, ])dnl
802
803 for tmp_f in $gmp_m4postinc; do
804   GMP_DEFINE_RAW(["include_mpn(\`$tmp_f')"], POST)
805 done
806
807
808 # Set up `gmp_links'.  It's a list of link:file pairs that configure will
809 # process to create link -> file.
810 gmp_links=
811
812 # If the user specified `MPN_PATH', use that instead of the path we've
813 # come up with.
814 if test -z "$MPN_PATH"; then
815   path="$path generic"
816 else
817   path="$MPN_PATH"
818 fi
819
820 # Pick the correct source files in $path and link them to mpn/.
821 # $gmp_mpn_functions lists all functions we need.
822 #
823 # The rule is to find a file with the function name and a .asm, .S,
824 # .s, or .c extension.  Certain multi-function files with special names
825 # can provide some functions too.  (mpn/Makefile.am passes
826 # -DOPERATION_<func> to get them to generate the right code.)
827
828 # FIXME: udiv and umul aren't in $gmp_mpn_functions_optional yet since
829 # there's some versions of those files which should be checked for bit
830 # rot first.  Put them in $extra_functions for each target for now,
831 # change to standard optionals when all are ready.
832
833 # Note: The following lines defining $gmp_mpn_functions_optional
834 #       and $gmp_mpn_functions are parsed by the "macos/configure"
835 #       Perl script. So if you change the lines in a major way
836 #       make sure to run and examine the output from
837 #       
838 #           % (cd macos; perl configure)
839
840 gmp_mpn_functions_optional="copyi copyd com_n           \
841   and_n andn_n nand_n ior_n iorn_n nior_n xor_n xnor_n"
842
843 gmp_mpn_functions="${extra_functions} inlines add_n sub_n mul_1 addmul_1   \
844   submul_1 lshift rshift diveby3 divrem divrem_1 divrem_2                  \
845   mod_1 mod_1_rs pre_mod_1 dump                                            \
846   mul mul_fft mul_n mul_basecase sqr_basecase random                       \
847   random2 sqrtrem get_str set_str scan0 scan1 popcount hamdist cmp perfsqr \
848   bdivmod gcd_1 gcd gcdext tdiv_qr bz_divrem_n sb_divrem_mn jacbase        \
849   $gmp_mpn_functions_optional"
850
851 # the list of all object files used by mpn/Makefile.in and the
852 # top-level Makefile.in, respectively
853 mpn_objects=
854 mpn_objs_in_libgmp="mpn/mp_bases.lo"
855
856 for tmp_fn in ${gmp_mpn_functions} ; do
857   [rm -f mpn/${tmp_fn}.[Ssc] mpn/${tmp_fn}.asm]
858
859   # functions that can be provided by multi-function files
860   tmp_mulfunc=
861   case $tmp_fn in
862   add_n|sub_n)       tmp_mulfunc="aors_n"    ;;
863   addmul_1|submul_1) tmp_mulfunc="aorsmul_1" ;;
864   popcount|hamdist)  tmp_mulfunc="popham"    ;;
865   and_n|andn_n|nand_n | ior_n|iorn_n|nior_n | xor_n|xnor_n)
866                      tmp_mulfunc="logops_n"  ;;
867   esac
868
869   found=no
870   for tmp_dir in $path; do
871     for tmp_base in $tmp_fn $tmp_mulfunc; do
872       for tmp_ext in asm S s c; do
873         tmp_file=$srcdir/mpn/$tmp_dir/$tmp_base.$tmp_ext
874         if test -f $tmp_file; then
875           found=yes
876
877           mpn_objects="$mpn_objects ${tmp_fn}.lo"
878           mpn_objs_in_libgmp="$mpn_objs_in_libgmp mpn/${tmp_fn}.lo"
879           gmp_links="$gmp_links mpn/$tmp_fn.$tmp_ext:mpn/$tmp_dir/$tmp_base.$tmp_ext"
880
881           # duplicate AC_DEFINEs are harmless, so it doesn't matter
882           # that multi-function files get grepped here repeatedly
883           gmp_ep=["`
884             sed -n 's/^[        ]*MULFUNC_PROLOGUE(\(.*\))/\1/p' $tmp_file ;
885             sed -n 's/^[        ]*PROLOGUE.*(\(.*\))/\1/p' $tmp_file
886           `"]
887           for gmp_tmp in $gmp_ep; do
888             AC_DEFINE_UNQUOTED(HAVE_NATIVE_${gmp_tmp})
889           done
890
891           break
892         fi
893       done
894       if test $found = yes; then break ; fi
895     done
896     if test $found = yes; then break ; fi
897   done
898
899   if test $found = no; then
900     for tmp_optional in $gmp_mpn_functions_optional; do
901       if test $tmp_optional = $tmp_fn; then
902         found=yes
903       fi
904     done
905     if test $found = no; then
906       AC_MSG_ERROR([no version of $tmp_fn found in path: $path])
907     fi
908   fi
909 done
910
911 # Create link for gmp-mparam.h.
912 for tmp_dir in $path ; do
913   rm -f gmp-mparam.h
914   if test -f $srcdir/mpn/${tmp_dir}/gmp-mparam.h ; then
915     gmp_links="$gmp_links gmp-mparam.h:mpn/${tmp_dir}/gmp-mparam.h"
916
917     # Copy any KARATSUBA_SQR_THRESHOLD in gmp-mparam.h to config.m4.
918     # Some versions of sqr_basecase.asm use this.
919     tmp_gmp_karatsuba_sqr_threshold="`sed -n 's/^#define KARATSUBA_SQR_THRESHOLD[       ]*\([0-9][0-9]*\).*$/\1/p' $srcdir/mpn/${tmp_dir}/gmp-mparam.h`"
920     if test -n "$tmp_gmp_karatsuba_sqr_threshold"; then
921       GMP_DEFINE_RAW(["define(<KARATSUBA_SQR_THRESHOLD>,<$tmp_gmp_karatsuba_sqr_threshold>)"])
922     fi
923
924     break
925   fi
926 done
927
928 # Dig out the links from `gmp_links' for inclusion in DISTCLEANFILES.
929 gmp_srclinks=
930 for f in $gmp_links; do
931   gmp_srclinks="$gmp_srclinks `echo $f | sed 's/\(.*\):.*/\1/'`"
932 done
933
934 AC_SUBST(mpn_objects)
935 AC_SUBST(mpn_objs_in_libgmp)
936 AC_SUBST(gmp_srclinks)
937
938 dnl  ----------------------------------------
939 dnl  Make links.
940 AC_CONFIG_LINKS($gmp_links)
941
942 dnl  Create config.m4.
943 GMP_FINISH
944
945 dnl  Create Makefiles
946 dnl  FIXME: Upcoming version of autoconf/automake may not like broken lines.
947 AC_OUTPUT(Makefile mpz/Makefile mpn/Makefile)