[project @ 2000-09-07 11:23:59 by rrt]
[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.6 $)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     os_64bit=yes
199     gmp_cflags64_gcc="$gmp_cflags64_gcc -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9"
200     gmp_cflags_gcc="$gmp_cflags_gcc -m32"
201     gmp_xoptflags_gcc="-mcpu=ultrasparc -mvis"
202     ;;
203   ultrasparc*-*-* | sparcv9-*-*)
204     gmp_cflags_gcc="$gmp_cflags_gcc -Wa,-xarch=v8plus"
205     gmp_xoptcflags_gcc="-mcpu=v9 -mcpu=v8 -mv8"
206     gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4"
207     ;;
208   sparcv8*-*-solaris2.* | microsparc*-*-solaris2.*)
209     gmp_cflags_gcc="$gmp_cflags_gcc"
210     gmp_xoptcflags_gcc="-mcpu=v8 -mv8"
211     gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4"
212     ;;
213   sparcv8*-*-* | microsparc*-*-*)               # SunOS, Linux, *BSD
214     cclist="gcc acc cc"
215     gmp_cflags_gcc="$gmp_cflags_gcc"
216     gmp_xoptcflags_gcc="-mcpu=v8 -mv8"
217     gmp_cflags_acc="-g -O2 -cg92"
218     gmp_cflags_cc="-O2"         # FIXME: Flag for v8?
219     ;;
220   supersparc*-*-solaris2.*)
221     gmp_cflags_gcc="$gmp_cflags_gcc -DSUPERSPARC"
222     gmp_xoptcflags_gcc="-mcpu=v8 -mv8"
223     gmp_cflags_cc="-xtarget=native -xarch=v8 -xO4 -DSUPERSPARC"
224     ;;
225   supersparc*-*-*)              # SunOS, Linux, *BSD
226     cclist="gcc acc cc"
227     gmp_cflags_gcc="$gmp_cflags_gcc -DSUPERSPARC"
228     gmp_xoptcflags_gcc="-mcpu=v8 -mv8"
229     gmp_cflags_acc="-g -O2 -cg92 -DSUPERSPARC"
230     gmp_cflags_cc="-O2 -DSUPERSPARC"    # FIXME: Flag for v8?
231     ;;
232   *sparc*-*-*)
233     cclist="gcc acc cc"
234     gmp_cflags_acc="-g -O2"
235     gmp_cflags_cc="-g -O2"
236     ;;
237
238   # POWER/PowerPC
239   powerpc64-*-aix*)
240     cclist="gcc xlc"
241     gmp_cflags_gcc="$gmp_cflags_gcc -maix64 -mpowerpc64"
242     gmp_cflags_xlc="-g -O2 -q64 -qtune=pwr3"
243     ;;
244   powerpc*-*-aix*)
245     cclist="gcc xlc"
246     gmp_cflags_gcc="$gmp_cflags_gcc -mpowerpc"
247     gmp_cflags_xlc="$gmp_cflags_cc -qarch=ppc -O2"
248     ;;
249   power-*-aix*)
250     cclist="gcc xlc"
251     gmp_cflags_gcc="$gmp_cflags_gcc -mpower"
252     gmp_cflags_xlc="$gmp_cflags_cc -qarch=pwr -O2"
253     ;;
254   powerpc64*-*-*)
255     gmp_cflags_gcc="$gmp_cflags_gcc -mpowerpc64"
256     AC_DEFINE(_LONG_LONG_LIMB)  dnl FIXME: Remove.
257     ;;
258   powerpc*-*-*)
259     gmp_cflags_gcc="$gmp_cflags_gcc -mpowerpc"
260     ;;
261
262   # MIPS
263   mips-sgi-irix6.*)
264     os_64bit=yes
265     gmp_cflags64_gcc="-g -O2 -mabi=n32"
266     gmp_cflags64_cc="$gmp_cflags64_cc -O2 -n32"
267     ;;
268
269   # Motorola 68k family
270   m88110*-*-*)
271     gmp_cflags_gcc="-g -O -m88110"      dnl  FIXME: Use `-O2'?
272     ;;
273   m68*-*-*)
274     gmp_cflags_gcc="$gmp_cflags_gcc -fomit-frame-pointer"
275     ;;
276
277   # HP
278   hppa1.0*-*-*)
279     cclist="gcc c89 cc"
280     gmp_cflags_c89="$gmp_cflags_cc +O2"
281     gmp_cflags_cc="$gmp_cflags_cc +O2"
282     ;;
283   hppa2.0w*-*-*)
284     cclist="c89 cc"
285     gmp_cflags_c89="+DD64 +O3"
286     gmp_cflags_cc="+DD64 +O3"
287     ;;
288   hppa2.0*-*-*)
289     os_64bit=yes
290     cclist="gcc c89 cc"
291     gmp_cflags64_gcc="$gmp_cflags64_gcc -mWHAT -D_LONG_LONG_LIMB"
292     # +O2 to cc triggers bug in mpz/powm.c (1.4)
293     gmp_cflags64_c89="+DA2.0 +e +O3 -D_LONG_LONG_LIMB"
294     gmp_cflags64_cc="+DA2.0 +e +O3 -D_LONG_LONG_LIMB"
295     gmp_cflags_c89="$gmp_cflags_cc +O2"
296     gmp_cflags_cc="$gmp_cflags_cc +O2"
297     ;;
298
299   # VAX
300   vax*-*-*)
301     gmp_cflags_gcc="$gmp_cflags_gcc -fomit-frame-pointer"
302     ;;
303
304   # Fujitsu
305   [f30[01]-fujitsu-sysv*])
306     cclist="gcc vcc"
307     gmp_cflags_vcc="-g"         # FIXME: flags for vcc?
308     ;;
309 esac
310
311 case "${target}" in
312   *-*-mingw32) gmp_cflags_gcc="$gmp_cflags_gcc -mno-cygwin";;
313 esac
314
315 dnl  Check for programs needed by macros for finding compiler.
316 dnl  More programs are checked for below, when a compiler is found.
317 AC_PROG_NM      dnl  Macro from Libtool.
318 # nm on 64-bit AIX needs to know the object file format 
319 case "$target" in
320   powerpc64*-*-aix*)
321     NM="$NM -X 64"
322     ;;
323 esac   
324
325 # Save CFLAGS given on command line.
326 gmp_user_CFLAGS="$CFLAGS"
327
328 if test -z "$CC"; then
329   # Find compiler.
330   GMP_PROG_CC_FIND($cclist, $os_64bit)
331
332   # If 64-bit OS and we have a 64-bit compiler, use it.
333   if test -n "$os_64bit" && test -n "$CC64"; then
334     CC=$CC64
335     CFLAGS=$CFLAGS64
336   else
337     eval CFLAGS=\$gmp_cflags_$CC  
338   fi
339
340   # Try compiler flags that may work with only some compiler versions.
341   # gmp_optcflags: All or nothing.
342   eval optcflags=\$gmp_optcflags_$CC
343   if test -n "$optcflags"; then
344     CFLAGS_save="$CFLAGS"
345     CFLAGS="$CFLAGS $optcflags"
346     AC_MSG_CHECKING([whether $CC accepts $optcflags])
347     AC_LANG_C
348     AC_TRY_COMPILER([int main(){return(0);}], optok, cross)
349     if test "$optok" = "yes"; then
350       AC_MSG_RESULT([yes])
351     else
352       AC_MSG_RESULT([no])
353       CFLAGS="$CFLAGS_save"
354     fi
355   fi
356   # gmp_xoptcflags: First is best, one has to work.
357   eval xoptcflags=\$gmp_xoptcflags_$CC
358   if test -n "$xoptcflags"; then
359     gmp_found="no"
360     for xopt in $xoptcflags; do
361       CFLAGS_save="$CFLAGS"
362       CFLAGS="$CFLAGS $xopt"
363       AC_MSG_CHECKING([whether $CC accepts $xopt])
364       AC_LANG_C
365       AC_TRY_COMPILER([int main(){return(0);}], optok, cross)
366       if test "$optok" = "yes"; then
367         AC_MSG_RESULT([yes])
368         gmp_found="yes"
369         break
370       else
371         AC_MSG_RESULT([no])
372         CFLAGS="$CFLAGS_save"
373       fi
374     done
375     if test "$gmp_found" = "no"; then
376       echo ["$0: fatal: need a compiler that understands one of $xoptcflags"]
377       exit 1
378     fi
379   fi
380 fi
381
382 # Restore CFLAGS given on command line.
383 # FIXME: We've run through quite some unnecessary code looking for a
384 # nice compiler and working flags for it, just to spoil that with user
385 # supplied flags.
386 test -n "$gmp_user_CFLAGS" && CFLAGS="$gmp_user_CFLAGS"
387
388 # Select chosen compiler.
389 GMP_PROG_CC_SELECT
390
391 # How to assemble.
392 CCAS="$CC -c"
393 AC_SUBST(CCAS)
394
395 dnl Checks for programs.
396 dnl --------------------
397 AC_PROG_CPP
398 AC_PROG_INSTALL
399 AC_PROG_LN_S
400 GMP_PROG_M4
401 AC_CHECK_PROG(AR, ar, ar)
402 # ar on AIX needs to know the object file format 
403 case "$target" in
404   powerpc64*-*-aix*)
405     AR="$AR -X 64"
406     ;;
407 esac   
408 dnl  FIXME: Find good ld?  /usr/ucb/ld on Solaris won't work.
409
410 dnl Checks for assembly syntax.
411 if test "$gmp_no_asm_syntax_testing" != "yes"; then
412   GMP_CHECK_ASM_TEXT
413   GMP_CHECK_ASM_DATA
414   GMP_CHECK_ASM_GLOBL
415   GMP_CHECK_ASM_LABEL_SUFFIX
416   GMP_CHECK_ASM_TYPE
417   GMP_CHECK_ASM_SIZE
418   GMP_CHECK_ASM_LSYM_PREFIX
419   GMP_CHECK_ASM_W32
420   GMP_CHECK_ASM_UNDERSCORE(underscore=yes, underscore=no)
421   GMP_CHECK_ASM_ALIGN_LOG(asm_align=log, asm_align=nolog)
422 fi
423
424 dnl  FIXME: Check for FPU and set `floating_point' appropriately.
425
426 dnl  ========================================
427 dnl  Configuring mpn.
428 dnl  ----------------------------------------
429 dnl  Set the following target specific variables:
430 dnl  path               where to search for source files
431 dnl  family             processor family (Needed for building 
432 dnl                     asm-syntax.h for now.  FIXME: Remove.)
433 dnl  extra_functions    extra functions
434
435 family=generic
436
437 case ${target} in
438   arm*-*-*)
439     path="arm"
440     ;;
441   [sparcv9*-*-solaris2.[789]* | sparc64*-*-solaris2.[789]* | ultrasparc*-*-solaris2.[789]*])
442     if test -n "$CC64"; then
443       path="sparc64"
444     else
445       path="sparc32/v9 sparc32/v8 sparc32"
446     fi
447     ;;
448   sparc64-*-linux*)
449     path="sparc64"
450     ;;
451   sparcv8*-*-* | microsparc*-*-*)
452         path="sparc32/v8 sparc32"
453         if test x${floating_point} = xno
454           then extra_functions="udiv_nfp"
455           else extra_functions="udiv_fp"
456         fi
457         ;;
458   sparcv9*-*-* | ultrasparc*-*-*)
459         path="sparc32/v9 sparc32/v8 sparc32"
460         extra_functions="udiv_fp"
461         ;;
462   supersparc*-*-*)
463         path="sparc32/v8/supersparc sparc32/v8 sparc32"
464         extra_functions="udiv"
465         ;;
466   sparc*-*-*) path="sparc32"
467         if test x${floating_point} = xno
468           then extra_functions="udiv_nfp"
469           else extra_functions="udiv_fp"
470         fi
471         ;;
472   hppa7000*-*-*)
473     path="hppa/hppa1_1 hppa"
474     extra_functions="udiv_qrnnd"
475     ;;
476   hppa1.0*-*-*)
477     path="hppa"
478     extra_functions="udiv_qrnnd"
479     ;;
480   hppa2.0w-*-*)
481     path="pa64w"
482     extra_functions="umul_ppmm udiv_qrnnd"
483     ;;
484   hppa2.0*-*-*)
485     if test -n "$CC64"; then
486       path="pa64"
487       extra_functions="umul_ppmm udiv_qrnnd"
488       # We need to use the system compiler, or actually the system assembler,
489       # since GAS has not been ported to understand the 2.0 instructions.
490       CCAS="$CC64 -c"
491     else
492       # FIXME: path should be "hppa/hppa2_0 hppa/hppa1_1 hppa"
493       path="hppa/hppa1_1 hppa"
494       extra_functions="udiv_qrnnd"
495     fi
496     ;;
497   hppa*-*-*)                                    #assume pa7100
498     path="hppa/hppa1_1/pa7100 hppa/hppa1_1 hppa"
499     extra_functions="udiv_qrnnd";;
500   [f30[01]-fujitsu-sysv*])
501     path=fujitsu;;
502   alphaev6*-*-*) path="alpha/ev6 alpha"; extra_functions="invert_limb cntlz";;
503   alphaev5*-*-*) path="alpha/ev5 alpha"; extra_functions="invert_limb cntlz";;
504   alpha*-*-*) path="alpha"; extra_functions="invert_limb cntlz";;
505   # Cray vector machines.  This must come after alpha* so that we can
506   # recognize present and future vector processors with a wildcard.
507   *-cray-unicos*)
508     path="cray"
509     extra_functions="mulww";;
510   am29000*-*-*) path="a29k";;
511   a29k*-*-*) path="a29k";;
512
513   # AMD and Intel x86 configurations
514
515   [i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-*])
516     gmp_m4postinc="x86/x86-defs.m4"
517     extra_functions="udiv umul"
518     CALLING_CONVENTIONS_OBJS="x86call.o x86check.o"
519
520     GMP_CHECK_ASM_SHLDL_CL(
521       [GMP_DEFINE(WANT_SHLDL_CL,1)],
522       [GMP_DEFINE(WANT_SHLDL_CL,0)])
523     GMP_CHECK_ASM_ALIGN_FILL_0x90
524
525     # the CPUs below wanting to know about mmx
526     case ${target} in
527       [pentiummmx-*-* | pentium[23]-*-* | k6*-*-* | athlon-*-*])
528         GMP_CHECK_ASM_MMX(tmp_mmx=yes, tmp_mmx=no)
529         ;;
530     esac
531
532     # default for anything not otherwise mentioned
533     path="x86"
534  
535     case ${target} in
536       [i[34]86*-*-*])
537         path="x86"
538         ;;
539       k5*-*-*)
540         # don't know what best suits k5
541         path="x86"
542         ;;
543       i586*-*-* | pentium-*-*)
544         path="x86/pentium x86"
545         ;;
546       pentiummmx-*-*)
547         path="x86/pentium x86"
548         if test "$tmp_mmx" = yes; then
549           path="x86/pentium/mmx $path"
550         fi
551         ;;
552       i686*-*-* | pentiumpro-*-*)
553         path="x86/p6 x86"
554         ;;
555       pentium2-*-*)
556         path="x86/p6 x86"
557         # The pentium/mmx lshift and rshift are good on p6 and can be used
558         # until there's something specific for p6.
559         if test "$tmp_mmx" = yes; then
560           path="x86/p6/mmx x86/pentium/mmx $path"
561         fi
562         ;;
563       pentium3-*-*)
564         path="x86/p6 x86"
565         # The pentium/mmx lshift and rshift are good on p6 and can be used
566         # until there's something specific for p6.
567         if test "$tmp_mmx" = yes; then
568           path="x86/p6/p3mmx x86/p6/mmx x86/pentium/mmx $path"
569         fi
570         ;;
571       [k6[23]*-*-*])
572         path="x86/k6 x86"
573         if test "$tmp_mmx" = yes; then
574           path="x86/k6/k62mmx x86/k6/mmx $path"
575         fi
576         ;;
577       k6*-*-*)
578         path="x86/k6 x86"
579         if test "$tmp_mmx" = yes; then
580           path="x86/k6/mmx $path"
581         fi
582         ;;
583       athlon-*-*)
584         path="x86/k7 x86"
585         if test "$tmp_mmx" = yes; then
586           path="x86/k7/mmx $path"
587         fi
588         ;;
589     esac
590     ;;
591
592
593   i960*-*-*) path="i960";;
594
595   ia64*-*-*) path="ia64";;
596
597 # Motorola 68k configurations.  Let m68k mean 68020-68040.
598   [m680[234]0*-*-* | m68k*-*-* | \
599   m68*-next-nextstep*])         # Nexts are at least '020
600     path="m68k/mc68020 m68k"
601     family=m68k
602     ;;
603   m68000*-*-*)
604     path="m68k"
605     family=m68k
606     ;;
607
608   m88k*-*-* | m88k*-*-*) path="m88k";;
609   m88110*-*-*) path="m88k/mc88110 m88k";;
610   ns32k*-*-*) path="ns32k";;
611
612   pyramid-*-*) path="pyr";;
613
614   ppc601-*-*) path="power powerpc32";;
615   powerpc64*-*-*) path="powerpc64";;
616   powerpc*-*-*) path="powerpc32";;
617   rs6000-*-* | power-*-* | power2-*-*)
618     path="power"
619     extra_functions="udiv_w_sdiv"
620     ;;
621
622   sh-*-*) path="sh";;
623   sh2-*-*) path="sh/sh2 sh";;
624
625   [mips[34]*-*-*]) path="mips3";;
626   mips*-*-irix6*) path="mips3";;
627   mips*-*-*) path="mips2";;
628
629   vax*-*-*) path="vax"; extra_functions="udiv_w_sdiv";;
630
631   z8000x*-*-*) path="z8000x"; extra_functions="udiv_w_sdiv";;
632   z8000*-*-*) path="z8000"; extra_functions="udiv_w_sdiv";;
633
634   clipper*-*-*) path="clipper";;
635 esac
636
637 AC_SUBST(CALLING_CONVENTIONS_OBJS)
638 if test -n "$CALLING_CONVENTIONS_OBJS"; then
639   AC_DEFINE(HAVE_CALLING_CONVENTIONS,1,
640   [Define if mpn/tests has calling conventions checking for the CPU])
641 fi
642
643
644 case ${target} in
645   [i[5-8]86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-*])
646     # rdtsc is in pentium and up, not in i386 and i486
647     SPEED_CYCLECOUNTER_OBJS=pentium.lo
648     ;;
649   alpha*-*-*)
650     SPEED_CYCLECOUNTER_OBJS=alpha.lo
651     ;;
652   sparcv9*-*-* | ultrasparc*-*-* | sparc64*-*-*)
653     SPEED_CYCLECOUNTER_OBJS=sparcv9.lo
654     ;;
655   hppa2*-*-*)
656     SPEED_CYCLECOUNTER_OBJS=hppa2.lo
657     ;;
658   hppa*-*-*)
659     SPEED_CYCLECOUNTER_OBJS=hppa.lo
660     ;;
661 esac
662
663 AC_SUBST(SPEED_CYCLECOUNTER_OBJS)
664
665 if test -n "$SPEED_CYCLECOUNTER_OBJS"
666 then
667   AC_DEFINE(HAVE_SPEED_CYCLECOUNTER, 1,
668   [Define if a speed_cyclecounter exists (for the tune programs)])
669 fi
670
671
672 dnl Extensions for executable and object files.
673 dnl -------------------------------------------
674 AC_EXEEXT
675 AC_OBJEXT
676
677 dnl Use Libtool.
678 dnl ------------
679 dnl  FIXME: Shared libs seem to fail on aix4.3.
680 dnl  FIXME: Should invoke [AC_DISABLE_SHARED], but m4 recurses to death.
681 case "$target" in
682   [*-*-aix4.[3-9]*]) enable_shared=no ;;
683 esac
684 AC_PROG_LIBTOOL
685
686 dnl Checks for libraries.
687 dnl ---------------------
688 AC_CHECK_DECLS((optarg))
689
690 dnl Checks for header files.
691 dnl ------------------------
692 AC_HEADER_STDC
693 AC_CHECK_HEADERS(getopt.h unistd.h sys/sysctl.h sys/time.h)
694
695 dnl Checks for typedefs, structures, and compiler characteristics.
696 dnl --------------------------------------------------------------
697 AC_CHECK_TYPES((void))
698 AC_C_STRINGIZE
699
700 dnl Checks for library functions.
701 dnl -----------------------------
702 dnl Most of these are only for the benefit of supplementary programs.  The
703 dnl library itself doesn't use anything weird.
704 dnl AC_FUNC_MEMCMP
705 dnl AC_TYPE_SIGNAL
706 dnl AC_CHECK_FUNCS(strtol)
707 AC_CHECK_FUNCS(getopt_long getpagesize popen processor_info strtoul sysconf sysctlbyname)
708
709 dnl Trick automake into thinking we've run AM_C_PROTOTYPES which it wants
710 dnl for ansi2knr, and instead use our own test.  (It's only a warning
711 dnl automake prints, but it's good to suppress it.)
712 ifelse(0,1,[
713 AM_C_PROTOTYPES
714 ])
715 GMP_C_ANSI2KNR
716
717
718 dnl  Set `syntax' to one of <blank>, "mit", "elf", "aix", "macho".
719 syntax=
720 # For now, we use the old switch for setting syntax.  
721 # FIXME: Remove when conversion to .asm is completed.
722 changequote(,)dnl
723 case "${target}" in
724   m680[234]0*-*-linuxaout* | m68k*-*-linuxaout* | \
725   m68k-next-nextstep* | \
726   m68000*-*-*)
727     syntax=mit
728     ;;
729   m680[234]0*-*-linux* | m68k*-*-linux*)
730     syntax=elf
731     ;;
732   m680[234]0*-*-* | m68k*-*-*)
733     syntax=mit
734     ;;
735 esac
736 changequote([,])dnl
737
738 dnl  ----------------------------------------
739 # Now build an asm-syntax.h file for targets that include that from the
740 # assembly files.
741 # FIXME: Remove when conversion to .asm is completed.
742 case "${family}-${underscore}-${asm_align}-${syntax}" in
743   m68k-yes-log-mit)
744     echo '#define MIT_SYNTAX' >asm-syntax.h
745     cat $srcdir/mpn/underscore.h >>asm-syntax.h
746     echo '#include "'$srcdir'/mpn/m68k/syntax.h"' >>asm-syntax.h;;
747   m68k-no-nolog-elf)
748     echo '#define ELF_SYNTAX' >asm-syntax.h
749     echo '#define C_SYMBOL_NAME(name) name' >>asm-syntax.h
750     echo '#include "'$srcdir'/mpn/m68k/syntax.h"' >>asm-syntax.h;;
751 esac
752
753
754 # The pattern here tests for an absolute path the same way as
755 # _AC_OUTPUT_FILES in autoconf acgeneral.m4.
756 GMP_DEFINE_RAW(["dnl  CONFIG_TOP_SRCDIR is a path from the mpn builddir to the top srcdir"])
757 case "$srcdir" in
758 [[\\/]]* | ?:[[\\/]]* )
759      GMP_DEFINE_RAW(["define(<CONFIG_TOP_SRCDIR>,<\`$srcdir'>)"])    ;;
760 *)   GMP_DEFINE_RAW(["define(<CONFIG_TOP_SRCDIR>,<\`../$srcdir'>)"]) ;;
761 esac
762  
763 GMP_DEFINE_RAW(["include(CONFIG_TOP_SRCDIR\`/mpn/asm-defs.m4')"], POST)
764
765 # Must be after asm-defs.m4
766 GMP_DEFINE_RAW("define_not_for_expansion(\`HAVE_TARGET_CPU_$target_cpu')", POST)
767
768
769 dnl  config.m4 post-includes
770 dnl  -----------------------
771 dnl  (Note x86 post include set with $path above.)
772 changequote(,)dnl
773 case "$target" in
774   alpha*-cray-unicos*)
775     gmp_m4postinc="alpha/unicos.m4"
776     ;;
777   alpha*-*-*)
778     gmp_m4postinc="alpha/default.m4"
779     ;;
780   power*-*-*)
781     case "$target" in
782       *-*-mach* | *-*-rhapsody* | *-*-nextstep*)
783         ;;      # these use non-conventional assembly syntax.
784       powerpc64-*-aix*)
785         gmp_m4postinc="powerpc32/regmap.m4 powerpc64/aix.m4"
786         ;;
787       *-*-aix*)
788         gmp_m4postinc="powerpc32/regmap.m4 powerpc32/aix.m4"
789         ;;
790       *)
791         gmp_m4postinc="powerpc32/regmap.m4"
792         ;;
793     esac
794     ;;
795 esac
796 changequote([, ])dnl
797
798 for tmp_f in $gmp_m4postinc; do
799   GMP_DEFINE_RAW(["include_mpn(\`$tmp_f')"], POST)
800 done
801
802
803 # Set up `gmp_links'.  It's a list of link:file pairs that configure will
804 # process to create link -> file.
805 gmp_links=
806
807 # If the user specified `MPN_PATH', use that instead of the path we've
808 # come up with.
809 if test -z "$MPN_PATH"; then
810   path="$path generic"
811 else
812   path="$MPN_PATH"
813 fi
814
815 # Pick the correct source files in $path and link them to mpn/.
816 # $gmp_mpn_functions lists all functions we need.
817 #
818 # The rule is to find a file with the function name and a .asm, .S,
819 # .s, or .c extension.  Certain multi-function files with special names
820 # can provide some functions too.  (mpn/Makefile.am passes
821 # -DOPERATION_<func> to get them to generate the right code.)
822
823 # FIXME: udiv and umul aren't in $gmp_mpn_functions_optional yet since
824 # there's some versions of those files which should be checked for bit
825 # rot first.  Put them in $extra_functions for each target for now,
826 # change to standard optionals when all are ready.
827
828 # Note: The following lines defining $gmp_mpn_functions_optional
829 #       and $gmp_mpn_functions are parsed by the "macos/configure"
830 #       Perl script. So if you change the lines in a major way
831 #       make sure to run and examine the output from
832 #       
833 #           % (cd macos; perl configure)
834
835 gmp_mpn_functions_optional="copyi copyd com_n           \
836   and_n andn_n nand_n ior_n iorn_n nior_n xor_n xnor_n"
837
838 gmp_mpn_functions="${extra_functions} inlines add_n sub_n mul_1 addmul_1   \
839   submul_1 lshift rshift diveby3 divrem divrem_1 divrem_2                  \
840   mod_1 mod_1_rs pre_mod_1 dump                                            \
841   mul mul_fft mul_n mul_basecase sqr_basecase random                       \
842   random2 sqrtrem get_str set_str scan0 scan1 popcount hamdist cmp perfsqr \
843   bdivmod gcd_1 gcd gcdext tdiv_qr bz_divrem_n sb_divrem_mn jacbase        \
844   $gmp_mpn_functions_optional"
845
846 # the list of all object files used by mpn/Makefile.in and the
847 # top-level Makefile.in, respectively
848 mpn_objects=
849 mpn_objs_in_libgmp="mpn/mp_bases.lo"
850
851 for tmp_fn in ${gmp_mpn_functions} ; do
852   [rm -f mpn/${tmp_fn}.[Ssc] mpn/${tmp_fn}.asm]
853
854   # functions that can be provided by multi-function files
855   tmp_mulfunc=
856   case $tmp_fn in
857   add_n|sub_n)       tmp_mulfunc="aors_n"    ;;
858   addmul_1|submul_1) tmp_mulfunc="aorsmul_1" ;;
859   popcount|hamdist)  tmp_mulfunc="popham"    ;;
860   and_n|andn_n|nand_n | ior_n|iorn_n|nior_n | xor_n|xnor_n)
861                      tmp_mulfunc="logops_n"  ;;
862   esac
863
864   found=no
865   for tmp_dir in $path; do
866     for tmp_base in $tmp_fn $tmp_mulfunc; do
867       for tmp_ext in asm S s c; do
868         tmp_file=$srcdir/mpn/$tmp_dir/$tmp_base.$tmp_ext
869         if test -f $tmp_file; then
870           found=yes
871
872           mpn_objects="$mpn_objects ${tmp_fn}.lo"
873           mpn_objs_in_libgmp="$mpn_objs_in_libgmp mpn/${tmp_fn}.lo"
874           gmp_links="$gmp_links mpn/$tmp_fn.$tmp_ext:mpn/$tmp_dir/$tmp_base.$tmp_ext"
875
876           # duplicate AC_DEFINEs are harmless, so it doesn't matter
877           # that multi-function files get grepped here repeatedly
878           gmp_ep=["`
879             sed -n 's/^[        ]*MULFUNC_PROLOGUE(\(.*\))/\1/p' $tmp_file ;
880             sed -n 's/^[        ]*PROLOGUE(\(.*\))/\1/p' $tmp_file
881           `"]
882           for gmp_tmp in $gmp_ep; do
883             AC_DEFINE_UNQUOTED(HAVE_NATIVE_${gmp_tmp})
884           done
885
886           break
887         fi
888       done
889       if test $found = yes; then break ; fi
890     done
891     if test $found = yes; then break ; fi
892   done
893
894   if test $found = no; then
895     for tmp_optional in $gmp_mpn_functions_optional; do
896       if test $tmp_optional = $tmp_fn; then
897         found=yes
898       fi
899     done
900     if test $found = no; then
901       AC_MSG_ERROR([no version of $tmp_fn found in path: $path])
902     fi
903   fi
904 done
905
906 # Create link for gmp-mparam.h.
907 for tmp_dir in $path ; do
908   rm -f gmp-mparam.h
909   if test -f $srcdir/mpn/${tmp_dir}/gmp-mparam.h ; then
910     gmp_links="$gmp_links gmp-mparam.h:mpn/${tmp_dir}/gmp-mparam.h"
911
912     # Copy any KARATSUBA_SQR_THRESHOLD in gmp-mparam.h to config.m4.
913     # Some versions of sqr_basecase.asm use this.
914     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`"
915     if test -n "$tmp_gmp_karatsuba_sqr_threshold"; then
916       GMP_DEFINE_RAW(["define(<KARATSUBA_SQR_THRESHOLD>,<$tmp_gmp_karatsuba_sqr_threshold>)"])
917     fi
918
919     break
920   fi
921 done
922
923 # Dig out the links from `gmp_links' for inclusion in DISTCLEANFILES.
924 gmp_srclinks=
925 for f in $gmp_links; do
926   gmp_srclinks="$gmp_srclinks `echo $f | sed 's/\(.*\):.*/\1/'`"
927 done
928
929 AC_SUBST(mpn_objects)
930 AC_SUBST(mpn_objs_in_libgmp)
931 AC_SUBST(gmp_srclinks)
932
933 dnl  ----------------------------------------
934 dnl  Make links.
935 AC_CONFIG_LINKS($gmp_links)
936
937 dnl  Create config.m4.
938 GMP_FINISH
939
940 dnl  Create Makefiles
941 dnl  FIXME: Upcoming version of autoconf/automake may not like broken lines.
942 AC_OUTPUT(Makefile mpz/Makefile mpn/Makefile)