configure.ac revision 1.1.1.2
1dnl  Process this file with autoconf to produce a configure script.
2
3
4define(GMP_COPYRIGHT,[[
5
6Copyright 1996-2016 Free Software Foundation, Inc.
7
8This file is part of the GNU MP Library.
9
10The GNU MP Library is free software; you can redistribute it and/or modify
11it under the terms of either:
12
13  * the GNU Lesser General Public License as published by the Free
14    Software Foundation; either version 3 of the License, or (at your
15    option) any later version.
16
17or
18
19  * the GNU General Public License as published by the Free Software
20    Foundation; either version 2 of the License, or (at your option) any
21    later version.
22
23or both in parallel, as here.
24
25The GNU MP Library is distributed in the hope that it will be useful, but
26WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
27or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
28for more details.
29
30You should have received copies of the GNU General Public License and the
31GNU Lesser General Public License along with the GNU MP Library.  If not,
32see https://www.gnu.org/licenses/.
33]])
34
35AC_COPYRIGHT(GMP_COPYRIGHT)
36AH_TOP(/*GMP_COPYRIGHT*/)
37
38AC_REVISION($Revision: 1.1.1.2 $)
39AC_PREREQ(2.59)
40AC_INIT(GNU MP, GMP_VERSION, [gmp-bugs@gmplib.org, see https://gmplib.org/manual/Reporting-Bugs.html], gmp)
41AC_CONFIG_SRCDIR(gmp-impl.h)
42m4_pattern_forbid([^[ \t]*GMP_])
43m4_pattern_allow(GMP_LDFLAGS)
44m4_pattern_allow(GMP_LIMB_BITS)
45m4_pattern_allow(GMP_MPARAM_H_SUGGEST)
46m4_pattern_allow(GMP_NAIL_BITS)
47m4_pattern_allow(GMP_NUMB_BITS)
48m4_pattern_allow(GMP_NONSTD_ABI)
49m4_pattern_allow(GMP_CPU_TYPE)
50
51# If --target is not used then $target_alias is empty, but if say
52# "./configure athlon-pc-freebsd3.5" is used, then all three of
53# $build_alias, $host_alias and $target_alias are set to
54# "athlon-pc-freebsd3.5".
55#
56if test -n "$target_alias" && test "$target_alias" != "$host_alias"; then
57  AC_MSG_ERROR([--target is not appropriate for GMP
58Use --build=CPU-VENDOR-OS if you need to specify your CPU and/or system
59explicitly.  Use --host if cross-compiling (see "Installing GMP" in the
60manual for more on this).])
61fi
62
63GMP_INIT(config.m4)
64
65AC_CANONICAL_HOST
66
67dnl  Automake "no-dependencies" is used because include file dependencies
68dnl  are not useful to us.  Pretty much everything depends just on gmp.h,
69dnl  gmp-impl.h and longlong.h, and yet only rarely does everything need to
70dnl  be rebuilt for changes to those files.
71dnl
72dnl  "no-dependencies" also helps with the way we're setup to run
73dnl  AC_PROG_CXX only conditionally.  If dependencies are used then recent
74dnl  automake (eg 1.7.2) appends an AM_CONDITIONAL to AC_PROG_CXX, and then
75dnl  gets upset if it's not actually executed.
76dnl
77dnl  Note that there's a copy of these options in the top-level Makefile.am,
78dnl  so update there too if changing anything.
79dnl
80AM_INIT_AUTOMAKE([1.8 gnu no-dependencies])
81AC_CONFIG_HEADERS(config.h:config.in)
82AM_MAINTAINER_MODE
83
84
85AC_ARG_ENABLE(assert,
86AC_HELP_STRING([--enable-assert],[enable ASSERT checking [default=no]]),
87[case $enableval in
88yes|no) ;;
89*) AC_MSG_ERROR([bad value $enableval for --enable-assert, need yes or no]) ;;
90esac],
91[enable_assert=no])
92
93if test "$enable_assert" = "yes"; then
94  AC_DEFINE(WANT_ASSERT,1,
95  [Define to 1 to enable ASSERT checking, per --enable-assert])
96  want_assert_01=1
97else
98  want_assert_01=0
99fi
100GMP_DEFINE_RAW(["define(<WANT_ASSERT>,$want_assert_01)"])
101
102
103AC_ARG_ENABLE(alloca,
104AC_HELP_STRING([--enable-alloca],[how to get temp memory [default=reentrant]]),
105[case $enableval in
106alloca|malloc-reentrant|malloc-notreentrant) ;;
107yes|no|reentrant|notreentrant) ;;
108debug) ;;
109*)
110  AC_MSG_ERROR([bad value $enableval for --enable-alloca, need one of:
111yes no reentrant notreentrant alloca malloc-reentrant malloc-notreentrant debug]) ;;
112esac],
113[enable_alloca=reentrant])
114
115
116# IMPROVE ME: The default for C++ is disabled.  The tests currently
117# performed below for a working C++ compiler are not particularly strong,
118# and in general can't be expected to get the right setup on their own.  The
119# most significant problem is getting the ABI the same.  Defaulting CXXFLAGS
120# to CFLAGS takes only a small step towards this.  It's also probably worth
121# worrying whether the C and C++ runtimes from say gcc and a vendor C++ can
122# work together.  Some rather broken C++ installations were encountered
123# during testing, and though such things clearly aren't GMP's problem, if
124# --enable-cxx=detect were to be the default then some careful checks of
125# which, if any, C++ compiler on the system is up to scratch would be
126# wanted.
127#
128AC_ARG_ENABLE(cxx,
129AC_HELP_STRING([--enable-cxx],[enable C++ support [default=no]]),
130[case $enableval in
131yes|no|detect) ;;
132*) AC_MSG_ERROR([bad value $enableval for --enable-cxx, need yes/no/detect]) ;;
133esac],
134[enable_cxx=no])
135
136
137AC_ARG_ENABLE(assembly,
138AC_HELP_STRING([--enable-assembly],[enable the use of assembly loops [default=yes]]),
139[case $enableval in
140yes|no) ;;
141*) AC_MSG_ERROR([bad value $enableval for --enable-assembly, need yes or no]) ;;
142esac],
143[enable_assembly=yes])
144
145
146AC_ARG_ENABLE(fft,
147AC_HELP_STRING([--enable-fft],[enable FFTs for multiplication [default=yes]]),
148[case $enableval in
149yes|no) ;;
150*) AC_MSG_ERROR([bad value $enableval for --enable-fft, need yes or no]) ;;
151esac],
152[enable_fft=yes])
153
154if test "$enable_fft" = "yes"; then
155  AC_DEFINE(WANT_FFT,1,
156  [Define to 1 to enable FFTs for multiplication, per --enable-fft])
157fi
158
159
160AC_ARG_ENABLE(old-fft-full,
161AC_HELP_STRING([--enable-old-fft-full],[enable old mpn_mul_fft_full for multiplication [default=no]]),
162[case $enableval in
163yes|no) ;;
164*) AC_MSG_ERROR([bad value $enableval for --enable-old-fft-full, need yes or no]) ;;
165esac],
166[enable_old_fft_full=no])
167
168if test "$enable_old_fft_full" = "yes"; then
169  AC_DEFINE(WANT_OLD_FFT_FULL,1,
170  [Define to 1 to enable old mpn_mul_fft_full for multiplication, per --enable-old-fft-full])
171fi
172
173
174AC_ARG_ENABLE(nails,
175AC_HELP_STRING([--enable-nails],[use nails on limbs [default=no]]),
176[case $enableval in
177[yes|no|[02468]|[0-9][02468]]) ;;
178[*[13579]])
179  AC_MSG_ERROR([bad value $enableval for --enable-nails, only even nail sizes supported]) ;;
180*)
181  AC_MSG_ERROR([bad value $enableval for --enable-nails, need yes/no/number]) ;;
182esac],
183[enable_nails=no])
184
185case $enable_nails in
186yes) GMP_NAIL_BITS=2 ;;
187no)  GMP_NAIL_BITS=0 ;;
188*)   GMP_NAIL_BITS=$enable_nails ;;
189esac
190AC_SUBST(GMP_NAIL_BITS)
191
192
193AC_ARG_ENABLE(profiling,
194AC_HELP_STRING([--enable-profiling],
195               [build with profiler support [default=no]]),
196[case $enableval in
197no|prof|gprof|instrument) ;;
198*) AC_MSG_ERROR([bad value $enableval for --enable-profiling, need no/prof/gprof/instrument]) ;;
199esac],
200[enable_profiling=no])
201
202case $enable_profiling in
203  prof)
204    AC_DEFINE(WANT_PROFILING_PROF, 1,
205              [Define to 1 if --enable-profiling=prof])
206    ;;
207  gprof)
208    AC_DEFINE(WANT_PROFILING_GPROF, 1,
209              [Define to 1 if --enable-profiling=gprof])
210    ;;
211  instrument)
212    AC_DEFINE(WANT_PROFILING_INSTRUMENT, 1,
213              [Define to 1 if --enable-profiling=instrument])
214    ;;
215esac
216
217GMP_DEFINE_RAW(["define(<WANT_PROFILING>,<\`$enable_profiling'>)"])
218
219# -fomit-frame-pointer is incompatible with -pg on some chips
220if test "$enable_profiling" = gprof; then
221  fomit_frame_pointer=
222else
223  fomit_frame_pointer="-fomit-frame-pointer"
224fi
225
226
227AC_ARG_WITH(readline,
228AC_HELP_STRING([--with-readline],
229               [readline support in demo programs [default=detect]]),
230[case $withval in
231yes|no|detect) ;;
232*) AC_MSG_ERROR([bad value $withval for --with-readline, need yes/no/detect]) ;;
233esac],
234[with_readline=detect])
235
236
237AC_ARG_ENABLE(fat,
238AC_HELP_STRING([--enable-fat],
239               [build fat libraries on systems that support it [default=no]]),
240[case $enableval in
241yes|no) ;;
242*) AC_MSG_ERROR([bad value $enableval for --enable-fat, need yes or no]) ;;
243esac],
244[enable_fat=no])
245
246
247AC_ARG_ENABLE(minithres,
248AC_HELP_STRING([--enable-minithres],
249               [choose minimal thresholds for testing [default=no]]),
250[case $enableval in
251yes|no) ;;
252*) AC_MSG_ERROR([bad value $enableval for --enable-minithres, need yes or no]) ;;
253esac],
254[enable_minithres=no])
255
256
257AC_ARG_ENABLE(fake-cpuid,
258AC_HELP_STRING([--enable-fake-cpuid],[enable GMP_CPU_TYPE faking cpuid [default=no]]),
259[case $enableval in
260yes|no) ;;
261*) AC_MSG_ERROR([bad value $enableval for --enable-fake-cpuid, need yes or no]) ;;
262esac],
263[enable_fake_cpuid=no])
264
265if test "$enable_fake_cpuid" = "yes"; then
266  AC_DEFINE(WANT_FAKE_CPUID,1,
267  [Define to 1 to enable GMP_CPU_TYPE faking cpuid, per --enable-fake-cpuid])
268fi
269
270
271if test $enable_fat = yes && test $enable_assembly = no ; then
272  AC_MSG_ERROR([when doing a fat build, disabling assembly will not work])
273fi
274
275if test $enable_fake_cpuid = yes && test $enable_fat = no ; then
276  AC_MSG_ERROR([--enable-fake-cpuid requires --enable-fat])
277fi
278
279
280tmp_host=`echo $host_cpu | sed 's/\./_/'`
281AC_DEFINE_UNQUOTED(HAVE_HOST_CPU_$tmp_host)
282GMP_DEFINE_RAW("define_not_for_expansion(\`HAVE_HOST_CPU_$tmp_host')", POST)
283
284dnl  The HAVE_HOST_CPU_ list here only needs to have entries for those which
285dnl  are going to be tested, not everything that can possibly be selected.
286dnl
287dnl  The HAVE_HOST_CPU_FAMILY_ list similarly, and note that the AC_DEFINEs
288dnl  for these are under the cpu specific setups below.
289
290AH_VERBATIM([HAVE_HOST_CPU_1],
291[/* Define one of these to 1 for the host CPU family.
292   If your CPU is not in any of these families, leave all undefined.
293   For an AMD64 chip, define "x86" in ABI=32, but not in ABI=64. */
294#undef HAVE_HOST_CPU_FAMILY_alpha
295#undef HAVE_HOST_CPU_FAMILY_m68k
296#undef HAVE_HOST_CPU_FAMILY_power
297#undef HAVE_HOST_CPU_FAMILY_powerpc
298#undef HAVE_HOST_CPU_FAMILY_x86
299#undef HAVE_HOST_CPU_FAMILY_x86_64
300
301/* Define one of the following to 1 for the host CPU, as per the output of
302   ./config.guess.  If your CPU is not listed here, leave all undefined.  */
303#undef HAVE_HOST_CPU_alphaev67
304#undef HAVE_HOST_CPU_alphaev68
305#undef HAVE_HOST_CPU_alphaev7
306#undef HAVE_HOST_CPU_m68020
307#undef HAVE_HOST_CPU_m68030
308#undef HAVE_HOST_CPU_m68040
309#undef HAVE_HOST_CPU_m68060
310#undef HAVE_HOST_CPU_m68360
311#undef HAVE_HOST_CPU_powerpc604
312#undef HAVE_HOST_CPU_powerpc604e
313#undef HAVE_HOST_CPU_powerpc750
314#undef HAVE_HOST_CPU_powerpc7400
315#undef HAVE_HOST_CPU_supersparc
316#undef HAVE_HOST_CPU_i386
317#undef HAVE_HOST_CPU_i586
318#undef HAVE_HOST_CPU_i686
319#undef HAVE_HOST_CPU_pentium
320#undef HAVE_HOST_CPU_pentiummmx
321#undef HAVE_HOST_CPU_pentiumpro
322#undef HAVE_HOST_CPU_pentium2
323#undef HAVE_HOST_CPU_pentium3
324#undef HAVE_HOST_CPU_s390_z900
325#undef HAVE_HOST_CPU_s390_z990
326#undef HAVE_HOST_CPU_s390_z9
327#undef HAVE_HOST_CPU_s390_z10
328#undef HAVE_HOST_CPU_s390_z196
329
330/* Define to 1 iff we have a s390 with 64-bit registers.  */
331#undef HAVE_HOST_CPU_s390_zarch])
332
333
334# Table of compilers, options, and mpn paths.  This code has various related
335# purposes
336#
337#   - better default CC/CFLAGS selections than autoconf otherwise gives
338#   - default CC/CFLAGS selections for extra CPU types specific to GMP
339#   - a few tests for known bad compilers
340#   - choice of ABIs on suitable systems
341#   - selection of corresponding mpn search path
342#
343# After GMP specific searches and tests, the standard autoconf AC_PROG_CC is
344# called.  User selections of CC etc are respected.
345#
346# Care is taken not to use macros like AC_TRY_COMPILE during the GMP
347# pre-testing, since they of course depend on AC_PROG_CC, and also some of
348# them cache their results, which is not wanted.
349#
350# The ABI selection mechanism is unique to GMP.  All that reaches autoconf
351# is a different selection of CC/CFLAGS according to the best ABI the system
352# supports, and/or what the user selects.  Naturally the mpn assembler code
353# selected is very dependent on the ABI.
354#
355# The closest the standard tools come to a notion of ABI is something like
356# "sparc64" which encodes a CPU and an ABI together.  This doesn't seem to
357# scale well for GMP, where exact CPU types like "ultrasparc2" are wanted,
358# separate from the ABI used on them.
359#
360#
361# The variables set here are
362#
363#   cclist              the compiler choices
364#   xx_cflags           flags for compiler xx
365#   xx_cflags_maybe     flags for compiler xx, if they work
366#   xx_cppflags         cpp flags for compiler xx
367#   xx_cflags_optlist   list of sets of optional flags
368#   xx_cflags_yyy       set yyy of optional flags for compiler xx
369#   xx_ldflags          -Wc,-foo flags for libtool linking with compiler xx
370#   ar_flags            extra flags for $AR
371#   nm_flags            extra flags for $NM
372#   limb                limb size, can be "longlong"
373#   path                mpn search path
374#   extra_functions     extra mpn functions
375#   fat_path            fat binary mpn search path [if fat binary desired]
376#   fat_functions       fat functions
377#   fat_thresholds      fat thresholds
378#
379# Suppose xx_cflags_optlist="arch", then flags from $xx_cflags_arch are
380# tried, and the first flag that works will be used.  An optlist like "arch
381# cpu optimize" can be used to get multiple independent sets of flags tried.
382# The first that works from each will be used.  If no flag in a set works
383# then nothing from that set is added.
384#
385# For multiple ABIs, the scheme extends as follows.
386#
387#   abilist               set of ABI choices
388#   cclist_aa             compiler choices in ABI aa
389#   xx_aa_cflags          flags for xx in ABI aa
390#   xx_aa_cflags_maybe    flags for xx in ABI aa, if they work
391#   xx_aa_cppflags        cpp flags for xx in ABI aa
392#   xx_aa_cflags_optlist  list of sets of optional flags in ABI aa
393#   xx_aa_cflags_yyy      set yyy of optional flags for compiler xx in ABI aa
394#   xx_aa_ldflags         -Wc,-foo flags for libtool linking
395#   ar_aa_flags           extra flags for $AR in ABI aa
396#   nm_aa_flags           extra flags for $NM in ABI aa
397#   limb_aa               limb size in ABI aa, can be "longlong"
398#   path_aa               mpn search path in ABI aa
399#   extra_functions_aa    extra mpn functions in ABI aa
400#
401# As a convenience, the unadorned xx_cflags (etc) are used for the last ABI
402# in ablist, if an xx_aa_cflags for that ABI isn't given.  For example if
403# abilist="64 32" then $cc_64_cflags will be used for the 64-bit ABI, but
404# for the 32-bit either $cc_32_cflags or $cc_cflags is used, whichever is
405# defined.  This makes it easy to add some 64-bit compilers and flags to an
406# unadorned 32-bit set.
407#
408# limb=longlong (or limb_aa=longlong) applies to all compilers within that
409# ABI.  It won't work to have some needing long long and some not, since a
410# single instantiated gmp.h will be used by both.
411#
412# SPEED_CYCLECOUNTER, cyclecounter_size and CALLING_CONVENTIONS_OBJS are
413# also set here, with an ABI suffix.
414#
415#
416#
417# A table-driven approach like this to mapping cpu type to good compiler
418# options is a bit of a maintenance burden, but there's not much uniformity
419# between options specifications on different compilers.  Some sort of
420# separately updatable tool might be cute.
421#
422# The use of lots of variables like this, direct and indirect, tends to
423# obscure when and how various things are done, but unfortunately it's
424# pretty much the only way.  If shell subroutines were portable then actual
425# code like "if this .. do that" could be written, but attempting the same
426# with full copies of GMP_PROG_CC_WORKS etc expanded at every point would
427# hugely bloat the output.
428
429
430AC_ARG_VAR(ABI, [desired ABI (for processors supporting more than one ABI)])
431
432# abilist needs to be non-empty, "standard" is just a generic name here
433abilist="standard"
434
435# FIXME: We'd like to prefer an ANSI compiler, perhaps by preferring
436# c89 over cc here.  But note that on HP-UX c89 provides a castrated
437# environment, and would want to be excluded somehow.  Maybe
438# AC_PROG_CC_STDC already does enough to stick cc into ANSI mode and
439# we don't need to worry.
440#
441cclist="gcc cc"
442
443gcc_cflags="-O2 -pedantic"
444gcc_64_cflags="-O2 -pedantic"
445cc_cflags="-O"
446cc_64_cflags="-O"
447
448SPEED_CYCLECOUNTER_OBJ=
449cyclecounter_size=2
450
451AC_SUBST(HAVE_HOST_CPU_FAMILY_power,  0)
452AC_SUBST(HAVE_HOST_CPU_FAMILY_powerpc,0)
453
454case $host in
455
456  alpha*-*-*)
457    AC_DEFINE(HAVE_HOST_CPU_FAMILY_alpha)
458    case $host_cpu in
459      alphaev5* | alphapca5*)
460	path="alpha/ev5 alpha" ;;
461      alphaev67 | alphaev68 | alphaev7*)
462        path="alpha/ev67 alpha/ev6 alpha" ;;
463      alphaev6)
464	path="alpha/ev6 alpha" ;;
465      *)
466        path="alpha" ;;
467    esac
468    if test "$enable_assembly" = "yes" ; then
469       extra_functions="cntlz"
470    fi
471    gcc_cflags_optlist="asm cpu oldas" # need asm ahead of cpu, see below
472    gcc_cflags_maybe="-mieee"
473    gcc_cflags_oldas="-Wa,-oldas"     # see GMP_GCC_WA_OLDAS.
474
475    # gcc 2.7.2.3 doesn't know any -mcpu= for alpha, apparently.
476    # gcc 2.95 knows -mcpu= ev4, ev5, ev56, pca56, ev6.
477    # gcc 3.0 adds nothing.
478    # gcc 3.1 adds ev45, ev67 (but ev45 is the same as ev4).
479    # gcc 3.2 adds nothing.
480    #
481    # gcc version "2.9-gnupro-99r1" under "-O2 -mcpu=ev6" strikes internal
482    # compiler errors too easily and is rejected by GMP_PROG_CC_WORKS.  Each
483    # -mcpu=ev6 below has a fallback to -mcpu=ev56 for this reason.
484    #
485    case $host_cpu in
486      alpha)        gcc_cflags_cpu="-mcpu=ev4" ;;
487      alphaev5)     gcc_cflags_cpu="-mcpu=ev5" ;;
488      alphaev56)    gcc_cflags_cpu="-mcpu=ev56" ;;
489      alphapca56 | alphapca57)
490                    gcc_cflags_cpu="-mcpu=pca56" ;;
491      alphaev6)     gcc_cflags_cpu="-mcpu=ev6 -mcpu=ev56" ;;
492      alphaev67 | alphaev68 | alphaev7*)
493                    gcc_cflags_cpu="-mcpu=ev67 -mcpu=ev6 -mcpu=ev56" ;;
494    esac
495
496    # gcc version "2.9-gnupro-99r1" on alphaev68-dec-osf5.1 has been seen
497    # accepting -mcpu=ev6, but not putting the assembler in the right mode
498    # for what it produces.  We need to do this for it, and need to do it
499    # before testing the -mcpu options.
500    #
501    # On old versions of gcc, which don't know -mcpu=, we believe an
502    # explicit -Wa,-mev5 etc will be necessary to put the assembler in
503    # the right mode for our .asm files and longlong.h asm blocks.
504    #
505    # On newer versions of gcc, when -mcpu= is known, we must give a -Wa
506    # which is at least as high as the code gcc will generate.  gcc
507    # establishes what it needs with a ".arch" directive, our command line
508    # option seems to override that.
509    #
510    # gas prior to 2.14 doesn't accept -mev67, but -mev6 seems enough for
511    # ctlz and cttz (in 2.10.0 at least).
512    #
513    # OSF `as' accepts ev68 but stupidly treats it as ev4.  -arch only seems
514    # to affect insns like ldbu which are expanded as macros when necessary.
515    # Insns like ctlz which were never available as macros are always
516    # accepted and always generate their plain code.
517    #
518    case $host_cpu in
519      alpha)        gcc_cflags_asm="-Wa,-arch,ev4 -Wa,-mev4" ;;
520      alphaev5)     gcc_cflags_asm="-Wa,-arch,ev5 -Wa,-mev5" ;;
521      alphaev56)    gcc_cflags_asm="-Wa,-arch,ev56 -Wa,-mev56" ;;
522      alphapca56 | alphapca57)
523                    gcc_cflags_asm="-Wa,-arch,pca56 -Wa,-mpca56" ;;
524      alphaev6)     gcc_cflags_asm="-Wa,-arch,ev6 -Wa,-mev6" ;;
525      alphaev67 | alphaev68 | alphaev7*)
526                    gcc_cflags_asm="-Wa,-arch,ev67 -Wa,-mev67 -Wa,-arch,ev6 -Wa,-mev6" ;;
527    esac
528
529    # It might be better to ask "cc" whether it's Cray C or DEC C,
530    # instead of relying on the OS part of $host.  But it's hard to
531    # imagine either of those compilers anywhere except their native
532    # systems.
533    #
534    GMP_INCLUDE_MPN(alpha/alpha-defs.m4)
535    case $host in
536      *-cray-unicos*)
537        cc_cflags="-O"		# no -g, it silently disables all optimizations
538        GMP_INCLUDE_MPN(alpha/unicos.m4)
539        # Don't perform any assembly syntax tests on this beast.
540        gmp_asm_syntax_testing=no
541        ;;
542      *-*-osf*)
543        GMP_INCLUDE_MPN(alpha/default.m4)
544        cc_cflags=""
545        cc_cflags_optlist="opt cpu"
546
547        # not sure if -fast works on old versions, so make it optional
548	cc_cflags_opt="-fast -O2"
549
550	# DEC C V5.9-005 knows ev4, ev5, ev56, pca56, ev6.
551	# Compaq C V6.3-029 adds ev67.
552	#
553	case $host_cpu in
554	  alpha)       cc_cflags_cpu="-arch~ev4~-tune~ev4" ;;
555	  alphaev5)    cc_cflags_cpu="-arch~ev5~-tune~ev5" ;;
556	  alphaev56)   cc_cflags_cpu="-arch~ev56~-tune~ev56" ;;
557	  alphapca56 | alphapca57)
558            cc_cflags_cpu="-arch~pca56~-tune~pca56" ;;
559	  alphaev6)    cc_cflags_cpu="-arch~ev6~-tune~ev6" ;;
560	  alphaev67 | alphaev68 | alphaev7*)
561            cc_cflags_cpu="-arch~ev67~-tune~ev67 -arch~ev6~-tune~ev6" ;;
562	esac
563        ;;
564      *)
565        GMP_INCLUDE_MPN(alpha/default.m4)
566        ;;
567    esac
568
569    case $host in
570      *-*-unicos*)
571        # tune/alpha.asm assumes int==4bytes but unicos uses int==8bytes
572        ;;
573      *)
574        SPEED_CYCLECOUNTER_OBJ=alpha.lo
575        cyclecounter_size=1 ;;
576    esac
577    ;;
578
579
580  # Cray vector machines.
581  # This must come after alpha* so that we can recognize present and future
582  # vector processors with a wildcard.
583  *-cray-unicos*)
584    gmp_asm_syntax_testing=no
585    cclist="cc"
586    # We used to have -hscalar0 here as a workaround for miscompilation of
587    # mpz/import.c, but let's hope Cray fixes their bugs instead, since
588    # -hscalar0 causes disastrously poor code to be generated.
589    cc_cflags="-O3 -hnofastmd -htask0 -Wa,-B"
590    path="cray"
591    ;;
592
593
594  arm*-*-* | aarch64*-*-*)
595    abilist="32"
596    gcc_cflags="$gcc_cflags $fomit_frame_pointer"
597    gcc_cflags_optlist="arch fpmode neon tune"
598    gcc_64_cflags_optlist="arch tune"
599    gcc_testlist="gcc-arm-umodsi"
600    gcc_64_testlist=""
601    CALLING_CONVENTIONS_OBJS='arm32call.lo arm32check.lo'
602    CALLING_CONVENTIONS_OBJS_64=""
603    cclist_64="gcc cc"
604    any_32_testlist="sizeof-long-4"
605    any_64_testlist="sizeof-long-8"
606
607    # This is needed for clang, which is not content with flags like -mfpu=neon
608    # alone.
609    case $host in
610      *-*-*eabi)
611        gcc_cflags_fpmode="-mfloat-abi=softfp" ;;
612      *-*-*eabihf)
613        gcc_cflags_fpmode="-mfloat-abi=hard" ;;
614    esac
615
616    # FIXME: We make mandatory compiler options optional here.  We should
617    # either enforce them, or organise to strip paths as the corresponding
618    # options fail.
619    case $host_cpu in
620      armxscale | arm7ej | arm9te | arm9e* | arm10* | armv5*)
621	path="arm/v5 arm"
622	gcc_cflags_arch="-march=armv5"
623	;;
624      armsa1 | arm7t* | arm9t* | armv4t*)
625	path="arm"
626	gcc_cflags_arch="-march=armv4"
627	;;
628      arm1156 | armv6t2*)
629	path="arm/v6t2 arm/v6 arm/v5 arm"
630	gcc_cflags_arch="-march=armv6t2"
631	;;
632      arm11* | armv6*)
633	path="arm/v6 arm/v5 arm"
634	gcc_cflags_arch="-march=armv6"
635	;;
636      armcortexa5 | armv7*)
637	path="arm/v6t2 arm/v6 arm/v5 arm"
638	gcc_cflags_arch="-march=armv7-a"
639	gcc_cflags_tune="-mtune=cortex-a5"
640	;;
641      armcortexa5neon)
642	path="arm/neon arm/v6t2 arm/v6 arm/v5 arm"
643	gcc_cflags_neon="-mfpu=neon"
644	gcc_cflags_arch="-march=armv7-a"
645	gcc_cflags_tune="-mtune=cortex-a5"
646	;;
647      armcortexa7)
648	path="arm/v7a/cora7 arm/v6t2 arm/v6 arm/v5 arm"
649	gcc_cflags_arch="-march=armv7-a"
650	gcc_cflags_tune="-mtune=cortex-a7"
651	;;
652      armcortexa7neon)
653	path="arm/neon arm/v7a/cora7 arm/v6t2 arm/v6 arm/v5 arm"
654	gcc_cflags_arch="-march=armv7-a"
655	gcc_cflags_neon="-mfpu=neon"
656	gcc_cflags_tune="-mtune=cortex-a7"
657	;;
658      armcortexa8)
659	path="arm/v7a/cora8 arm/v6t2 arm/v6 arm/v5 arm"
660	gcc_cflags_arch="-march=armv7-a"
661	gcc_cflags_tune="-mtune=cortex-a8"
662	;;
663      armcortexa8neon)
664	path="arm/neon arm/v7a/cora8 arm/v6t2 arm/v6 arm/v5 arm"
665	gcc_cflags_arch="-march=armv7-a"
666	gcc_cflags_neon="-mfpu=neon"
667	gcc_cflags_tune="-mtune=cortex-a8"
668	;;
669      armcortexa9)
670	path="arm/v7a/cora9 arm/v6t2 arm/v6 arm/v5 arm"
671	gcc_cflags_arch="-march=armv7-a"
672	gcc_cflags_tune="-mtune=cortex-a9"
673	;;
674      armcortexa9neon)
675	path="arm/neon arm/v7a/cora9 arm/v6t2 arm/v6 arm/v5 arm"
676	gcc_cflags_arch="-march=armv7-a"
677	gcc_cflags_neon="-mfpu=neon"
678	gcc_cflags_tune="-mtune=cortex-a9"
679	;;
680      armcortexa15)
681	path="arm/v7a/cora15 arm/v6t2 arm/v6 arm/v5 arm"
682	gcc_cflags_arch="-march=armv7-a"
683	gcc_cflags_tune="-mtune=cortex-a15 -mtune=cortex-a9"
684	;;
685      armcortexa15neon)
686	path="arm/v7a/cora15/neon arm/neon arm/v7a/cora15 arm/v6t2 arm/v6 arm/v5 arm"
687	gcc_cflags_arch="-march=armv7-a"
688	gcc_cflags_neon="-mfpu=neon"
689	gcc_cflags_tune="-mtune=cortex-a15 -mtune=cortex-a9"
690	;;
691      armcortexa53 | armcortexa53neon)
692        abilist="64 32"
693	path="arm/neon arm/v7a/cora9 arm/v6t2 arm/v6 arm/v5 arm"
694	path_64="arm64/cora53 arm64"
695	gcc_cflags_arch="-march=armv8-a"
696	gcc_cflags_neon="-mfpu=neon"
697	gcc_cflags_tune="-mtune=cortex-a53"
698	;;
699      armcortexa57 | armcortexa57neon)
700        abilist="64 32"
701	path="arm/v7a/cora15/neon arm/neon arm/v7a/cora15 arm/v6t2 arm/v6 arm/v5 arm"
702	path_64="arm64/cora57 arm64"
703	gcc_cflags_arch="-march=armv8-a"
704	gcc_cflags_neon="-mfpu=neon"
705	gcc_cflags_tune="-mtune=cortex-a57"
706	;;
707      armcortexa72 | armcortexa72neon)
708        abilist="64 32"
709	path="arm/v7a/cora15/neon arm/neon arm/v7a/cora15 arm/v6t2 arm/v6 arm/v5 arm"
710	path_64="arm64/cora72 arm64"
711	gcc_cflags_arch="-march=armv8-a"
712	gcc_cflags_neon="-mfpu=neon"
713	gcc_cflags_tune="-mtune=cortex-a72"
714	;;
715      armexynosm1)
716        abilist="64 32"
717	path="arm/v7a/cora15/neon arm/neon arm/v7a/cora15 arm/v6t2 arm/v6 arm/v5 arm"
718	path_64="arm64"
719	gcc_cflags_arch="-march=armv8-a"
720	gcc_cflags_neon="-mfpu=neon"
721	gcc_cflags_tune="-mtune=exynosm1"
722	;;
723      armthunderx)
724        abilist="64 32"
725	path="arm/v7a/cora15/neon arm/neon arm/v7a/cora15 arm/v6t2 arm/v6 arm/v5 arm"
726	path_64="arm64"
727	gcc_cflags_arch="-march=armv8-a"
728	gcc_cflags_neon="-mfpu=neon"
729	gcc_cflags_tune="-mtune=thunderx"
730	;;
731      armxgene1)
732        abilist="64 32"
733	path="arm/v7a/cora15/neon arm/neon arm/v7a/cora15 arm/v6t2 arm/v6 arm/v5 arm"
734	path_64="arm64/xgene1 arm64"
735	gcc_cflags_arch="-march=armv8-a"
736	gcc_cflags_neon="-mfpu=neon"
737	gcc_cflags_tune="-mtune=xgene1"
738	;;
739      aarch64*)
740        abilist="64 32"
741	path="arm/v7a/cora15/neon arm/neon arm/v7a/cora15 arm/v6t2 arm/v6 arm/v5 arm"
742	path_64="arm64"
743	gcc_cflags_arch="-march=armv8-a"
744	gcc_cflags_neon="-mfpu=neon"
745	gcc_cflags_tune=""
746	;;
747      *)
748	path="arm"
749	gcc_cflags_arch="-march=armv4"
750	GMP_DEFINE_RAW(["define(<NOTHUMB>,1)"])
751	;;
752    esac
753    ;;
754
755
756  # Fujitsu
757  [f30[01]-fujitsu-sysv*])
758    cclist="gcc vcc"
759    # FIXME: flags for vcc?
760    vcc_cflags="-g"
761    path="fujitsu"
762    ;;
763
764
765  hppa*-*-*)
766    # HP cc (the one sold separately) is K&R by default, but AM_C_PROTOTYPES
767    # will add "-Ae", or "-Aa -D_HPUX_SOURCE", to put it into ansi mode, if
768    # possible.
769    #
770    # gcc for hppa 2.0 can be built either for 2.0n (32-bit) or 2.0w
771    # (64-bit), but not both, so there's no option to choose the desired
772    # mode, we must instead detect which of the two it is.  This is done by
773    # checking sizeof(long), either 4 or 8 bytes respectively.  Do this in
774    # ABI=1.0 too, in case someone tries to build that with a 2.0w gcc.
775    #
776    gcc_cflags_optlist="arch"
777    gcc_testlist="sizeof-long-4"
778    SPEED_CYCLECOUNTER_OBJ=hppa.lo
779    cyclecounter_size=1
780
781    # FIXME: For hppa2.0*, path should be "pa32/hppa2_0 pa32/hppa1_1 pa32".
782    # (Can't remember why this isn't done already, have to check what .asm
783    # files are available in each and how they run on a typical 2.0 cpu.)
784    #
785    case $host_cpu in
786      hppa1.0*)    path="pa32" ;;
787      hppa7000*)   path="pa32/hppa1_1 pa32" ;;
788      hppa2.0* | hppa64)
789                   path="pa32/hppa2_0 pa32/hppa1_1/pa7100 pa32/hppa1_1 pa32" ;;
790      *)           # default to 7100
791                   path="pa32/hppa1_1/pa7100 pa32/hppa1_1 pa32" ;;
792    esac
793
794    # gcc 2.7.2.3 knows -mpa-risc-1-0 and -mpa-risc-1-1
795    # gcc 2.95 adds -mpa-risc-2-0, plus synonyms -march=1.0, 1.1 and 2.0
796    #
797    # We don't use -mpa-risc-2-0 in ABI=1.0 because 64-bit registers may not
798    # be saved by the kernel on an old system.  Actually gcc (as of 3.2)
799    # only adds a few float instructions with -mpa-risc-2-0, so it would
800    # probably be safe, but let's not take the chance.  In any case, a
801    # configuration like --host=hppa2.0 ABI=1.0 is far from optimal.
802    #
803    case $host_cpu in
804      hppa1.0*)           gcc_cflags_arch="-mpa-risc-1-0" ;;
805      *)                  # default to 7100
806                          gcc_cflags_arch="-mpa-risc-1-1" ;;
807    esac
808
809    case $host_cpu in
810      hppa1.0*)    cc_cflags="+O2" ;;
811      *)           # default to 7100
812                   cc_cflags="+DA1.1 +O2" ;;
813    esac
814
815    case $host in
816      hppa2.0*-*-* | hppa64-*-*)
817	cclist_20n="gcc cc"
818        abilist="2.0n 1.0"
819        path_20n="pa64"
820	limb_20n=longlong
821        any_20n_testlist="sizeof-long-4"
822        SPEED_CYCLECOUNTER_OBJ_20n=hppa2.lo
823        cyclecounter_size_20n=2
824
825        # -mpa-risc-2-0 is only an optional flag, in case an old gcc is
826        # used.  Assembler support for 2.0 is essential though, for our asm
827        # files.
828	gcc_20n_cflags="$gcc_cflags"
829	gcc_20n_cflags_optlist="arch"
830        gcc_20n_cflags_arch="-mpa-risc-2-0 -mpa-risc-1-1"
831        gcc_20n_testlist="sizeof-long-4 hppa-level-2.0"
832
833        cc_20n_cflags="+DA2.0 +e +O2 -Wl,+vnocompatwarnings"
834        cc_20n_testlist="hpc-hppa-2-0"
835
836	# ABI=2.0w is available for hppa2.0w and hppa2.0, but not for
837	# hppa2.0n, on the assumption that that the latter indicates a
838	# desire for ABI=2.0n.
839	case $host in
840        hppa2.0n-*-*) ;;
841        *)
842          # HPUX 10 and earlier cannot run 2.0w.  Not sure about other
843          # systems (GNU/Linux for instance), but lets assume they're ok.
844          case $host in
845            [*-*-hpux[1-9] | *-*-hpux[1-9].* | *-*-hpux10 | *-*-hpux10.*]) ;;
846	    [*-*-linux*])  abilist="1.0" ;; # due to linux permanent kernel bug
847            *)    abilist="2.0w $abilist" ;;
848          esac
849
850          cclist_20w="gcc cc"
851	  gcc_20w_cflags="$gcc_cflags -mpa-risc-2-0"
852          cc_20w_cflags="+DD64 +O2"
853          cc_20w_testlist="hpc-hppa-2-0"
854          path_20w="pa64"
855	  any_20w_testlist="sizeof-long-8"
856          SPEED_CYCLECOUNTER_OBJ_20w=hppa2w.lo
857          cyclecounter_size_20w=2
858	  ;;
859        esac
860        ;;
861    esac
862    ;;
863
864
865  IA64_PATTERN)
866    abilist="64"
867    GMP_INCLUDE_MPN(ia64/ia64-defs.m4)
868    SPEED_CYCLECOUNTER_OBJ=ia64.lo
869    any_32_testlist="sizeof-long-4"
870
871    case $host_cpu in
872      itanium)   path="ia64/itanium  ia64" ;;
873      itanium2)  path="ia64/itanium2 ia64" ;;
874      *)         path="ia64" ;;
875    esac
876
877    gcc_64_cflags_optlist="tune"
878    gcc_32_cflags_optlist=$gcc_64_cflags_optlist
879
880    # gcc pre-release 3.4 adds -mtune itanium and itanium2
881    case $host_cpu in
882      itanium)   gcc_cflags_tune="-mtune=itanium" ;;
883      itanium2)  gcc_cflags_tune="-mtune=itanium2" ;;
884    esac
885
886    case $host in
887      *-*-linux*)
888	cclist="gcc icc"
889	icc_cflags="-no-gcc"
890	icc_cflags_optlist="opt"
891	# Don't use -O3, it is for "large data sets" and also miscompiles GMP.
892	# But icc miscompiles GMP at any optimization level, at higher levels
893	# it miscompiles more files...
894	icc_cflags_opt="-O2 -O1"
895	icc_cflags_opt_maybe="-fp-model~precise"
896	;;
897
898      *-*-hpux*)
899        # HP cc sometimes gets internal errors if the optimization level is
900        # too high.  GMP_PROG_CC_WORKS detects this, the "_opt" fallbacks
901        # let us use whatever seems to work.
902        #
903        abilist="32 64"
904        any_64_testlist="sizeof-long-8"
905
906        cclist_32="gcc cc"
907        path_32="ia64"
908        cc_32_cflags=""
909        cc_32_cflags_optlist="opt"
910        cc_32_cflags_opt="+O2 +O1"
911        gcc_32_cflags="$gcc_cflags -milp32"
912        limb_32=longlong
913        SPEED_CYCLECOUNTER_OBJ_32=ia64.lo
914        cyclecounter_size_32=2
915
916        # Must have +DD64 in CPPFLAGS to get the right __LP64__ for headers,
917        # but also need it in CFLAGS for linking programs, since automake
918        # only uses CFLAGS when linking, not CPPFLAGS.
919        # FIXME: Maybe should use cc_64_ldflags for this, but that would
920        # need GMP_LDFLAGS used consistently by all the programs.
921        #
922        cc_64_cflags="+DD64"
923        cc_64_cppflags="+DD64"
924        cc_64_cflags_optlist="opt"
925        cc_64_cflags_opt="+O2 +O1"
926        gcc_64_cflags="$gcc_cflags -mlp64"
927        ;;
928    esac
929    ;;
930
931
932  # Motorola 68k
933  #
934  M68K_PATTERN)
935    AC_DEFINE(HAVE_HOST_CPU_FAMILY_m68k)
936    GMP_INCLUDE_MPN(m68k/m68k-defs.m4)
937    gcc_cflags="$gcc_cflags $fomit_frame_pointer"
938    gcc_cflags_optlist="arch"
939
940    # gcc 2.7.2 knows -m68000, -m68020, -m68030, -m68040.
941    # gcc 2.95 adds -mcpu32, -m68060.
942    # FIXME: Maybe "-m68020 -mnobitfield" would suit cpu32 on 2.7.2.
943    #
944    case $host_cpu in
945    m68020)  gcc_cflags_arch="-m68020" ;;
946    m68030)  gcc_cflags_arch="-m68030" ;;
947    m68040)  gcc_cflags_arch="-m68040" ;;
948    m68060)  gcc_cflags_arch="-m68060 -m68000" ;;
949    m68360)  gcc_cflags_arch="-mcpu32 -m68000" ;;
950    *)       gcc_cflags_arch="-m68000" ;;
951    esac
952
953    # FIXME: m68k/mc68020 looks like it's ok for cpu32, but this wants to be
954    # tested.  Will need to introduce an m68k/cpu32 if m68k/mc68020 ever uses
955    # the bitfield instructions.
956    case $host_cpu in
957    [m680[234]0 | m68360])  path="m68k/mc68020 m68k" ;;
958    *)                      path="m68k" ;;
959    esac
960    ;;
961
962
963  # Motorola 88k
964  m88k*-*-*)
965    path="m88k"
966    ;;
967  m88110*-*-*)
968    gcc_cflags="$gcc_cflags -m88110"
969    path="m88k/mc88110 m88k"
970    ;;
971
972
973  # IRIX 5 and earlier can only run 32-bit o32.
974  #
975  # IRIX 6 and up always has a 64-bit mips CPU can run n32 or 64.  n32 is
976  # preferred over 64, but only because that's been the default in past
977  # versions of GMP.  The two are equally efficient.
978  #
979  # Linux kernel 2.2.13 arch/mips/kernel/irixelf.c has a comment about not
980  # supporting n32 or 64.
981  #
982  # For reference, libtool (eg. 1.5.6) recognises the n32 ABI and knows the
983  # right options to use when linking (both cc and gcc), so no need for
984  # anything special from us.
985  #
986  mips*-*-*)
987    abilist="o32"
988    gcc_cflags_optlist="abi"
989    gcc_cflags_abi="-mabi=32 -m32"
990    gcc_testlist="gcc-mips-o32"
991    path="mips32"
992    cc_cflags="-O2 -o32"   # no -g, it disables all optimizations
993    # this suits both mips32 and mips64
994    GMP_INCLUDE_MPN(mips32/mips-defs.m4)
995
996    case $host in
997      [mips64*-*-* | mips*-*-irix[6789]*])
998        abilist="n32 64 o32"
999
1000        cclist_n32="gcc cc"
1001        gcc_n32_cflags_optlist="abi"
1002        gcc_n32_cflags="$gcc_cflags"
1003        gcc_n32_cflags_abi="-mabi=n32 -mn32"
1004        cc_n32_cflags="-O2 -n32"	# no -g, it disables all optimizations
1005        limb_n32=longlong
1006        path_n32="mips64"
1007
1008        cclist_64="gcc cc"
1009        gcc_64_cflags_optlist="abi"
1010        gcc_64_cflags="$gcc_cflags"
1011        gcc_64_cflags_abi="-mabi=64 -m64"
1012        gcc_64_ldflags="-Wc,-mabi=64"
1013        cc_64_cflags="-O2 -64"		# no -g, it disables all optimizations
1014        cc_64_ldflags="-Wc,-64"
1015        path_64="mips64"
1016        ;;
1017    esac
1018    ;;
1019
1020
1021  # Darwin (powerpc-apple-darwin1.3) has it's hacked gcc installed as cc.
1022  # Our usual "gcc in disguise" detection means gcc_cflags etc here gets
1023  # used.
1024  #
1025  # The darwin pre-compiling preprocessor is disabled with -no-cpp-precomp
1026  # since it doesn't like "__attribute__ ((mode (SI)))" etc in gmp-impl.h,
1027  # and so always ends up running the plain preprocessor anyway.  This could
1028  # be done in CPPFLAGS rather than CFLAGS, but there's not many places
1029  # preprocessing is done separately, and this is only a speedup, the normal
1030  # preprocessor gets run if there's any problems.
1031  #
1032  # We used to use -Wa,-mppc with gcc, but can't remember exactly why.
1033  # Presumably it was for old versions of gcc where -mpowerpc doesn't put
1034  # the assembler in the right mode.  In any case -Wa,-mppc is not good, for
1035  # instance -mcpu=604 makes recent gcc use -m604 to get access to the
1036  # "fsel" instruction, but a -Wa,-mppc overrides that, making code that
1037  # comes out with fsel fail.
1038  #
1039  # (Note also that the darwin assembler doesn't accept "-mppc", so any
1040  # -Wa,-mppc was used only if it worked.  The right flag on darwin would be
1041  # "-arch ppc" or some such, but that's already the default.)
1042  #
1043  [powerpc*-*-* | power[3-9]-*-*])
1044    AC_DEFINE(HAVE_HOST_CPU_FAMILY_powerpc)
1045    HAVE_HOST_CPU_FAMILY_powerpc=1
1046    abilist="32"
1047    cclist="gcc cc"
1048    cc_cflags="-O2"
1049    gcc_32_cflags_maybe="-m32"
1050    gcc_cflags_optlist="precomp subtype asm cpu"
1051    gcc_cflags_precomp="-no-cpp-precomp"
1052    gcc_cflags_subtype="-force_cpusubtype_ALL"	# for vmx on darwin
1053    gcc_cflags_asm=""
1054    gcc_cflags_cpu=""
1055    vmx_path=""
1056
1057    # grab this object, though it's not a true cycle counter routine
1058    SPEED_CYCLECOUNTER_OBJ=powerpc.lo
1059    cyclecounter_size=0
1060
1061    case $host_cpu in
1062      powerpc740 | powerpc750)
1063        path="powerpc32/750 powerpc32" ;;
1064      powerpc7400 | powerpc7410)
1065        path="powerpc32/vmx powerpc32/750 powerpc32" ;;
1066      [powerpc74[45]?])
1067        path="powerpc32/vmx powerpc32" ;;
1068      *)
1069        path="powerpc32" ;;
1070    esac
1071
1072    case $host_cpu in
1073      powerpc401)   gcc_cflags_cpu="-mcpu=401" ;;
1074      powerpc403)   gcc_cflags_cpu="-mcpu=403"
1075		    xlc_cflags_arch="-qarch=403 -qarch=ppc" ;;
1076      powerpc405)   gcc_cflags_cpu="-mcpu=405" ;;
1077      powerpc505)   gcc_cflags_cpu="-mcpu=505" ;;
1078      powerpc601)   gcc_cflags_cpu="-mcpu=601"
1079		    xlc_cflags_arch="-qarch=601 -qarch=ppc" ;;
1080      powerpc602)   gcc_cflags_cpu="-mcpu=602"
1081		    xlc_cflags_arch="-qarch=602 -qarch=ppc" ;;
1082      powerpc603)   gcc_cflags_cpu="-mcpu=603"
1083		    xlc_cflags_arch="-qarch=603 -qarch=ppc" ;;
1084      powerpc603e)  gcc_cflags_cpu="-mcpu=603e -mcpu=603"
1085		    xlc_cflags_arch="-qarch=603 -qarch=ppc" ;;
1086      powerpc604)   gcc_cflags_cpu="-mcpu=604"
1087		    xlc_cflags_arch="-qarch=604 -qarch=ppc" ;;
1088      powerpc604e)  gcc_cflags_cpu="-mcpu=604e -mcpu=604"
1089		    xlc_cflags_arch="-qarch=604 -qarch=ppc" ;;
1090      powerpc620)   gcc_cflags_cpu="-mcpu=620" ;;
1091      powerpc630)   gcc_cflags_cpu="-mcpu=630"
1092		    xlc_cflags_arch="-qarch=pwr3"
1093		    cpu_path="p3 p3-p7" ;;
1094      powerpc740)   gcc_cflags_cpu="-mcpu=740" ;;
1095      powerpc7400 | powerpc7410)
1096		    gcc_cflags_asm="-Wa,-maltivec"
1097		    gcc_cflags_cpu="-mcpu=7400 -mcpu=750" ;;
1098      [powerpc74[45]?])
1099		    gcc_cflags_asm="-Wa,-maltivec"
1100		    gcc_cflags_cpu="-mcpu=7450" ;;
1101      powerpc750)   gcc_cflags_cpu="-mcpu=750" ;;
1102      powerpc801)   gcc_cflags_cpu="-mcpu=801" ;;
1103      powerpc821)   gcc_cflags_cpu="-mcpu=821" ;;
1104      powerpc823)   gcc_cflags_cpu="-mcpu=823" ;;
1105      powerpc860)   gcc_cflags_cpu="-mcpu=860" ;;
1106      powerpc970)   gcc_cflags_cpu="-mtune=970"
1107		    xlc_cflags_arch="-qarch=970 -qarch=pwr3"
1108		    vmx_path="powerpc64/vmx"
1109		    cpu_path="p4 p3-p7" ;;
1110      power4)	    gcc_cflags_cpu="-mtune=power4"
1111		    xlc_cflags_arch="-qarch=pwr4"
1112		    cpu_path="p4 p3-p7" ;;
1113      power5)	    gcc_cflags_cpu="-mtune=power5 -mtune=power4"
1114		    xlc_cflags_arch="-qarch=pwr5"
1115		    cpu_path="p5 p4 p3-p7" ;;
1116      power6)	    gcc_cflags_cpu="-mtune=power6"
1117		    xlc_cflags_arch="-qarch=pwr6"
1118		    cpu_path="p6 p3-p7" ;;
1119      power7)	    gcc_cflags_cpu="-mtune=power7 -mtune=power5"
1120		    xlc_cflags_arch="-qarch=pwr7 -qarch=pwr5"
1121		    cpu_path="p7 p5 p4 p3-p7" ;;
1122      [power[89]])  gcc_cflags_cpu="-mtune=power8 -mtune=power7 -mtune=power5"
1123		    xlc_cflags_arch="-qarch=pwr8 -qarch=pwr7 -qarch=pwr5"
1124		    cpu_path="p8 p7 p5 p4 p3-p7" ;;
1125    esac
1126
1127    case $host in
1128      *-*-aix*)
1129	cclist="gcc xlc cc"
1130	gcc_32_cflags_maybe="-maix32"
1131	xlc_cflags="-O2 -qmaxmem=20000"
1132	xlc_cflags_optlist="arch"
1133	xlc_32_cflags_maybe="-q32"
1134	ar_32_flags="-X32"
1135	nm_32_flags="-X32"
1136    esac
1137
1138    case $host in
1139      POWERPC64_PATTERN)
1140	case $host in
1141	  *-*-aix*)
1142	    # On AIX a true 64-bit ABI is available.
1143	    # Need -Wc to pass object type flags through to the linker.
1144	    abilist="mode64 $abilist"
1145	    cclist_mode64="gcc xlc"
1146	    gcc_mode64_cflags="$gcc_cflags -maix64 -mpowerpc64"
1147	    gcc_mode64_cflags_optlist="cpu"
1148	    gcc_mode64_ldflags="-Wc,-maix64"
1149	    xlc_mode64_cflags="-O2 -q64 -qmaxmem=20000"
1150	    xlc_mode64_cflags_optlist="arch"
1151	    xlc_mode64_ldflags="-Wc,-q64"
1152	    # Must indicate object type to ar and nm
1153	    ar_mode64_flags="-X64"
1154	    nm_mode64_flags="-X64"
1155	    path_mode64=""
1156	    p=""
1157	    for i in $cpu_path
1158	      do path_mode64="${path_mode64}powerpc64/mode64/$i "
1159		 path_mode64="${path_mode64}powerpc64/$i "
1160		 p="${p} powerpc32/$i "
1161	      done
1162	    path_mode64="${path_mode64}powerpc64/mode64 $vmx_path powerpc64"
1163	    path="$p $path"
1164	    # grab this object, though it's not a true cycle counter routine
1165	    SPEED_CYCLECOUNTER_OBJ_mode64=powerpc64.lo
1166	    cyclecounter_size_mode64=0
1167	    ;;
1168	  *-*-darwin*)
1169	    # On Darwin we can use 64-bit instructions with a longlong limb,
1170	    # but the chip still in 32-bit mode.
1171	    # In theory this can be used on any OS which knows how to save
1172	    # 64-bit registers in a context switch.
1173	    #
1174	    # Note that we must use -mpowerpc64 with gcc, since the
1175	    # longlong.h macros expect limb operands in a single 64-bit
1176	    # register, not two 32-bit registers as would be given for a
1177	    # long long without -mpowerpc64.  In theory we could detect and
1178	    # accommodate both styles, but the proper 64-bit registers will
1179	    # be fastest and are what we really want to use.
1180	    #
1181	    # One would think -mpowerpc64 would set the assembler in the right
1182	    # mode to handle 64-bit instructions.  But for that, also
1183	    # -force_cpusubtype_ALL is needed.
1184	    #
1185	    # Do not use -fast for Darwin, it actually adds options
1186	    # incompatible with a shared library.
1187	    #
1188	    abilist="mode64 mode32 $abilist"
1189	    gcc_cflags_opt="-O3 -O2 -O1"	# will this become used?
1190	    cclist_mode32="gcc"
1191	    gcc_mode32_cflags_maybe="-m32"
1192	    gcc_mode32_cflags="-mpowerpc64"
1193	    gcc_mode32_cflags_optlist="subtype cpu opt"
1194	    gcc_mode32_cflags_subtype="-force_cpusubtype_ALL"
1195	    gcc_mode32_cflags_opt="-O3 -O2 -O1"
1196	    limb_mode32=longlong
1197	    cclist_mode64="gcc"
1198	    gcc_mode64_cflags="-m64"
1199	    gcc_mode64_cflags_optlist="cpu opt"
1200	    gcc_mode64_cflags_opt="-O3 -O2 -O1"
1201	    path_mode64=""
1202	    path_mode32=""
1203	    p=""
1204	    for i in $cpu_path
1205	      do path_mode64="${path_mode64}powerpc64/mode64/$i "
1206		 path_mode64="${path_mode64}powerpc64/$i "
1207		 path_mode32="${path_mode32}powerpc64/mode32/$i "
1208		 path_mode32="${path_mode32}powerpc64/$i "
1209		 p="${p} powerpc32/$i "
1210	      done
1211	    path_mode64="${path_mode64}powerpc64/mode64 $vmx_path powerpc64"
1212	    path_mode32="${path_mode32}powerpc64/mode32 $vmx_path powerpc64"
1213	    path="$p $path"
1214	    SPEED_CYCLECOUNTER_OBJ_mode64=powerpc64.lo
1215	    cyclecounter_size_mode64=0
1216	    any_mode64_testlist="sizeof-long-8"
1217	    ;;
1218	  *-*-linux* | *-*-*bsd*)
1219	    # On GNU/Linux, assume the processor is in 64-bit mode.  Some
1220	    # environments have a gcc that is always in 64-bit mode, while
1221	    # others require -m64, hence the use of cflags_maybe.  The
1222	    # sizeof-long-8 test checks the mode is right (for the no option
1223	    # case).
1224	    #
1225	    # -mpowerpc64 is not used, since it should be the default in
1226	    # 64-bit mode.  (We need its effect for the various longlong.h
1227	    # asm macros to be right of course.)
1228	    #
1229	    # gcc64 was an early port of gcc to 64-bit mode, but should be
1230	    # obsolete before too long.  We prefer plain gcc when it knows
1231	    # 64-bits.
1232	    #
1233	    abilist="mode64 mode32 $abilist"
1234	    cclist_mode32="gcc"
1235	    gcc_mode32_cflags_maybe="-m32"
1236	    gcc_mode32_cflags="-mpowerpc64"
1237	    gcc_mode32_cflags_optlist="cpu opt"
1238	    gcc_mode32_cflags_opt="-O3 -O2 -O1"
1239	    limb_mode32=longlong
1240	    cclist_mode64="gcc gcc64"
1241	    gcc_mode64_cflags_maybe="-m64"
1242	    gcc_mode64_cflags_optlist="cpu opt"
1243	    gcc_mode64_cflags_opt="-O3 -O2 -O1"
1244	    path_mode64=""
1245	    path_mode32=""
1246	    p=""
1247	    for i in $cpu_path
1248	      do path_mode64="${path_mode64}powerpc64/mode64/$i "
1249		 path_mode64="${path_mode64}powerpc64/$i "
1250		 path_mode32="${path_mode32}powerpc64/mode32/$i "
1251		 path_mode32="${path_mode32}powerpc64/$i "
1252		 p="${p} powerpc32/$i "
1253	      done
1254	    path_mode64="${path_mode64}powerpc64/mode64 $vmx_path powerpc64"
1255	    path_mode32="${path_mode32}powerpc64/mode32 $vmx_path powerpc64"
1256	    path="$p $path"
1257	    SPEED_CYCLECOUNTER_OBJ_mode64=powerpc64.lo
1258	    cyclecounter_size_mode64=0
1259	    any_mode64_testlist="sizeof-long-8"
1260	    ;;
1261	esac
1262	;;
1263    esac
1264    ;;
1265
1266
1267  # POWER 32-bit
1268  [power-*-* | power[12]-*-* | power2sc-*-*])
1269    AC_DEFINE(HAVE_HOST_CPU_FAMILY_power)
1270    HAVE_HOST_CPU_FAMILY_power=1
1271    cclist="gcc"
1272    if test "$enable_assembly" = "yes" ; then
1273      extra_functions="udiv_w_sdiv"
1274    fi
1275    path="power"
1276
1277    # gcc 2.7.2 knows rios1, rios2, rsc
1278    #
1279    # -mcpu=rios2 can tickle an AIX assembler bug (see GMP_PROG_CC_WORKS) so
1280    # there needs to be a fallback to just -mpower.
1281    #
1282    gcc_cflags_optlist="cpu"
1283    case $host in
1284      power-*-*)    gcc_cflags_cpu="-mcpu=power -mpower" ;;
1285      power1-*-*)   gcc_cflags_cpu="-mcpu=rios1 -mpower" ;;
1286      power2-*-*)   gcc_cflags_cpu="-mcpu=rios2 -mpower" ;;
1287      power2sc-*-*) gcc_cflags_cpu="-mcpu=rsc   -mpower" ;;
1288    esac
1289    case $host in
1290    *-*-aix*)
1291      cclist="gcc xlc"
1292      xlc_cflags="-O2 -qarch=pwr -qmaxmem=20000"
1293      ;;
1294    esac
1295    ;;
1296
1297
1298  # IBM System/390 and z/Architecture
1299  S390_PATTERN | S390X_PATTERN)
1300    abilist="32"
1301    gcc_cflags="$gcc_cflags $fomit_frame_pointer"
1302    gcc_cflags_optlist="arch"
1303    path="s390_32"
1304    if test "$enable_assembly" = "yes" ; then
1305       extra_functions="udiv_w_sdiv"
1306    fi
1307    gcc_32_cflags_maybe="-m31"
1308
1309    case $host_cpu in
1310      s390)
1311	;;
1312      z900 | z900esa)
1313        cpu="z900"
1314        gccarch="$cpu"
1315	path="s390_32/esame/$cpu s390_32/esame s390_32"
1316	gcc_cflags_arch="-march=$gccarch"
1317	AC_DEFINE_UNQUOTED(HAVE_HOST_CPU_s390_$cpu)
1318	AC_DEFINE(HAVE_HOST_CPU_s390_zarch)
1319	extra_functions=""
1320        ;;
1321      z990 | z990esa)
1322        cpu="z990"
1323        gccarch="$cpu"
1324	path="s390_32/esame/$cpu s390_32/esame s390_32"
1325	gcc_cflags_arch="-march=$gccarch"
1326	AC_DEFINE_UNQUOTED(HAVE_HOST_CPU_s390_$cpu)
1327	AC_DEFINE(HAVE_HOST_CPU_s390_zarch)
1328	extra_functions=""
1329        ;;
1330      z9 | z9esa)
1331        cpu="z9"
1332	gccarch="z9-109"
1333	path="s390_32/esame/$cpu s390_32/esame s390_32"
1334	gcc_cflags_arch="-march=$gccarch"
1335	AC_DEFINE_UNQUOTED(HAVE_HOST_CPU_s390_$cpu)
1336	AC_DEFINE(HAVE_HOST_CPU_s390_zarch)
1337	extra_functions=""
1338        ;;
1339      z10 | z10esa)
1340        cpu="z10"
1341	gccarch="z10"
1342	path="s390_32/esame/$cpu s390_32/esame s390_32"
1343	gcc_cflags_arch="-march=$gccarch"
1344	AC_DEFINE_UNQUOTED(HAVE_HOST_CPU_s390_$cpu)
1345	AC_DEFINE(HAVE_HOST_CPU_s390_zarch)
1346	extra_functions=""
1347        ;;
1348      z196 | z196esa)
1349        cpu="z196"
1350	gccarch="z196"
1351	path="s390_32/esame/$cpu s390_32/esame s390_32"
1352	gcc_cflags_arch="-march=$gccarch"
1353	AC_DEFINE_UNQUOTED(HAVE_HOST_CPU_s390_$cpu)
1354	AC_DEFINE(HAVE_HOST_CPU_s390_zarch)
1355	extra_functions=""
1356        ;;
1357      esac
1358
1359    case $host in
1360      S390X_PATTERN)
1361	abilist="64 32"
1362	cclist_64="gcc"
1363	gcc_64_cflags_optlist="arch"
1364	gcc_64_cflags="$gcc_cflags -m64"
1365	path_64="s390_64/$host_cpu s390_64"
1366	extra_functions=""
1367	;;
1368      esac
1369    ;;
1370
1371
1372  sh-*-*)   path="sh" ;;
1373  [sh[2-4]-*-*])  path="sh/sh2 sh" ;;
1374
1375
1376  *sparc*-*-*)
1377    # sizeof(long)==4 or 8 is tested, to ensure we get the right ABI.  We've
1378    # had various bug reports where users have set CFLAGS for their desired
1379    # mode, but not set our ABI.  For some reason it's sparc where this
1380    # keeps coming up, presumably users there are accustomed to driving the
1381    # compiler mode that way.  The effect of our testlist setting is to
1382    # reject ABI=64 in favour of ABI=32 if the user has forced the flags to
1383    # 32-bit mode.
1384    #
1385    abilist="32"
1386    cclist="gcc acc cc"
1387    any_testlist="sizeof-long-4"
1388    GMP_INCLUDE_MPN(sparc32/sparc-defs.m4)
1389
1390    case $host_cpu in
1391      sparcv8 | microsparc | turbosparc)
1392        path="sparc32/v8 sparc32" ;;
1393      supersparc)
1394        path="sparc32/v8/supersparc sparc32/v8 sparc32" ;;
1395      [sparc64 | sparcv9* | ultrasparc | ultrasparc[234]*])
1396        path="sparc32/v9 sparc32/v8 sparc32" ;;
1397      [ultrasparct[12345]])
1398        path="sparc32/ultrasparct1 sparc32/v8 sparc32" ;;
1399      *)
1400        path="sparc32" ;;
1401    esac
1402
1403    # gcc 2.7.2 doesn't know about v9 and doesn't pass -xarch=v8plus to the
1404    # assembler.  Add it explicitly since the solaris assembler won't accept
1405    # our sparc32/v9 asm code without it.  gas accepts -xarch=v8plus too, so
1406    # it can be in the cflags unconditionally (though gas doesn't need it).
1407    #
1408    # gcc -m32 is needed to force 32-bit mode on a dual-ABI system, but past
1409    # gcc doesn't know that flag, hence cflags_maybe.  Note that -m32 cannot
1410    # be done through the optlist since the plain cflags would be run first
1411    # and we don't want to require the default mode (whatever it is) works.
1412    #
1413    # Note it's gcc_32_cflags_maybe and not gcc_cflags_maybe because the
1414    # latter would be used in the 64-bit ABI on systems like "*bsd" where
1415    # abilist="64" only.
1416    #
1417    gcc_32_cflags_maybe="-m32"
1418    gcc_cflags_optlist="cpu asm"
1419
1420    # gcc 2.7.2 knows -mcypress, -msupersparc, -mv8, -msparclite.
1421    # gcc 2.95 knows -mcpu= v7, hypersparc, sparclite86x, f930, f934,
1422    #   sparclet, tsc701, v9, ultrasparc.  A warning is given that the
1423    #   plain -m forms will disappear.
1424    # gcc 3.3 adds ultrasparc3.
1425    #
1426    case $host_cpu in
1427      supersparc*)
1428			gcc_cflags_cpu="-mcpu=supersparc -msupersparc"
1429			gcc_cflags_asm="-Wa,-Av8 -Wa,-xarch=v8";;
1430      sparcv8 | microsparc* | turbosparc | hypersparc*)
1431			gcc_cflags_cpu="-mcpu=v8 -mv8"
1432			gcc_cflags_asm="-Wa,-Av8 -Wa,-xarch=v8";;
1433      sparc64 | sparcv9*)
1434			gcc_cflags_cpu="-mcpu=v9"
1435			gcc_32_cflags_asm="-Wa,-Av8 -Wa,-xarch=v8plus"
1436			gcc_64_cflags_asm="-Wa,-Av9 -Wa,-xarch=v9";;
1437      ultrasparc1 | ultrasparc2*)
1438			gcc_cflags_cpu="-mcpu=ultrasparc -mcpu=v9"
1439			gcc_32_cflags_asm="-Wa,-Av8plusa -Wa,-xarch=v8plusa"
1440			gcc_64_cflags_asm="-Wa,-Av9a -Wa,-xarch=v9a";;
1441      [ultrasparc[34]])
1442			gcc_cflags_cpu="-mcpu=ultrasparc3 -mcpu=ultrasparc -mcpu=v9"
1443			gcc_32_cflags_asm="-Wa,-Av8plusb -Wa,-xarch=v8plusb"
1444			gcc_64_cflags_asm="-Wa,-Av9b -Wa,-xarch=v9b";;
1445      [ultrasparct[12]])
1446			gcc_cflags_cpu="-mcpu=niagara -mcpu=v9"
1447			gcc_32_cflags_asm="-Wa,-Av8plusc -Wa,-xarch=v8plusc"
1448			gcc_64_cflags_asm="-Wa,-Av9c -Wa,-xarch=v9c";;
1449      ultrasparct3)
1450			gcc_cflags_cpu="-mcpu=niagara3 -mcpu=niagara -mcpu=v9"
1451			gcc_32_cflags_asm="-Wa,-Av8plusd -Wa,-xarch=v8plusd"
1452			gcc_64_cflags_asm="-Wa,-Av9d -Wa,-xarch=v9d";;
1453      [ultrasparct[45]])
1454			gcc_cflags_cpu="-mcpu=niagara4 -mcpu=niagara3 -mcpu=niagara -mcpu=v9"
1455			gcc_32_cflags_asm="-Wa,-Av8plusd -Wa,-xarch=v8plusd"
1456			gcc_64_cflags_asm="-Wa,-Av9d -Wa,-xarch=v9d";;
1457      *)
1458			gcc_cflags_cpu="-mcpu=v7 -mcypress"
1459			gcc_cflags_asm="";;
1460    esac
1461
1462    # SunPRO cc and acc, and SunOS bundled cc
1463    case $host in
1464      *-*-solaris* | *-*-sunos*)
1465	# Note no -g, it disables all optimizations.
1466	cc_cflags=
1467	cc_cflags_optlist="opt arch cpu"
1468
1469        # SunOS <= 4 cc doesn't know -xO3, fallback to -O2.
1470	cc_cflags_opt="-xO3 -O2"
1471
1472        # SunOS cc doesn't know -xarch, apparently always generating v7
1473        # code, so make this optional
1474	case $host_cpu in
1475	  sparcv8 | microsparc* | supersparc* | turbosparc | hypersparc*)
1476			cc_cflags_arch="-xarch=v8";;
1477          [ultrasparct[345]])
1478			cc_cflags_arch="-xarch=v8plusd" ;;
1479	  sparc64 | sparcv9* | ultrasparc*)
1480			cc_cflags_arch="-xarch=v8plus" ;;
1481	  *)
1482			cc_cflags_arch="-xarch=v7" ;;
1483	esac
1484
1485        # SunOS cc doesn't know -xchip and doesn't seem to have an equivalent.
1486	# SunPRO cc 5 recognises -xchip=generic, old, super, super2, micro,
1487	#   micro2, hyper, hyper2, powerup, ultra, ultra2, ultra2i.
1488	# SunPRO cc 6 adds -xchip=ultra2e, ultra3cu.
1489        #
1490	case $host_cpu in
1491	  supersparc*)  cc_cflags_cpu="-xchip=super" ;;
1492	  microsparc*)  cc_cflags_cpu="-xchip=micro" ;;
1493	  turbosparc)   cc_cflags_cpu="-xchip=micro2" ;;
1494	  hypersparc*)  cc_cflags_cpu="-xchip=hyper" ;;
1495	  ultrasparc)   cc_cflags_cpu="-xchip=ultra" ;;
1496	  ultrasparc2)  cc_cflags_cpu="-xchip=ultra2 -xchip=ultra" ;;
1497	  ultrasparc2i) cc_cflags_cpu="-xchip=ultra2i -xchip=ultra2 -xchip=ultra" ;;
1498	  ultrasparc3)  cc_cflags_cpu="-xchip=ultra3 -xchip=ultra" ;;
1499	  ultrasparc4)  cc_cflags_cpu="-xchip=ultra4 -xchip=ultra3 -xchip=ultra" ;;
1500	  ultrasparct1) cc_cflags_cpu="-xchip=ultraT1" ;;
1501	  ultrasparct2) cc_cflags_cpu="-xchip=ultraT2 -xchip=ultraT1" ;;
1502	  ultrasparct3) cc_cflags_cpu="-xchip=ultraT3 -xchip=ultraT2" ;;
1503	  ultrasparct4) cc_cflags_cpu="-xchip=T4" ;;
1504	  ultrasparct5) cc_cflags_cpu="-xchip=T5 -xchip=T4" ;;
1505	  *)            cc_cflags_cpu="-xchip=generic" ;;
1506	esac
1507    esac
1508
1509    case $host_cpu in
1510      sparc64 | sparcv9* | ultrasparc*)
1511        case $host in
1512          # Solaris 6 and earlier cannot run ABI=64 since it doesn't save
1513          # registers properly, so ABI=32 is left as the only choice.
1514          #
1515          [*-*-solaris2.[0-6] | *-*-solaris2.[0-6].*]) ;;
1516
1517          # BSD sparc64 ports are 64-bit-only systems, so ABI=64 is the only
1518          # choice.  In fact they need no special compiler flags, gcc -m64
1519          # is the default, but it doesn't hurt to add it.  v9 CPUs always
1520          # use the sparc64 port, since the plain 32-bit sparc ports don't
1521          # run on a v9.
1522          #
1523          *-*-*bsd*) abilist="64" ;;
1524
1525          # For all other systems, we try both 64 and 32.
1526          #
1527          # GNU/Linux sparc64 has only recently gained a 64-bit user mode.
1528          # In the past sparc64 meant a v9 cpu, but there were no 64-bit
1529          # operations in user mode.  We assume that if "gcc -m64" works
1530          # then the system is suitable.  Hopefully even if someone attempts
1531          # to put a new gcc and/or glibc on an old system it won't run.
1532          #
1533          *) abilist="64 32" ;;
1534        esac
1535
1536	case $host_cpu in
1537	  ultrasparc | ultrasparc2 | ultrasparc2i)
1538	    path_64="sparc64/ultrasparc1234 sparc64" ;;
1539	  [ultrasparc[34]])
1540	    path_64="sparc64/ultrasparc34 sparc64/ultrasparc1234 sparc64" ;;
1541	  [ultrasparct[12]])
1542	    path_64="sparc64/ultrasparct1 sparc64" ;;
1543	  [ultrasparct[345]])
1544	    path_64="sparc64/ultrasparct3 sparc64" ;;
1545	  *)
1546	    path_64="sparc64"
1547	esac
1548
1549        cclist_64="gcc"
1550        any_64_testlist="sizeof-long-8"
1551
1552        # gcc -mptr64 is probably implied by -m64, but we're not sure if
1553        # this was always so.  On Solaris in the past we always used both
1554        # "-m64 -mptr64".
1555        #
1556        # gcc -Wa,-xarch=v9 is thought to be necessary in some cases on
1557        # solaris, but it would seem likely that if gcc is going to generate
1558        # 64-bit code it will have to add that option itself where needed.
1559        # An extra copy of this option should be harmless though, but leave
1560        # it until we're sure.  (Might want -xarch=v9a or -xarch=v9b for the
1561        # higher cpu types instead.)
1562        #
1563        gcc_64_cflags="$gcc_cflags -m64 -mptr64"
1564        gcc_64_ldflags="-Wc,-m64"
1565        gcc_64_cflags_optlist="cpu asm"
1566
1567        case $host in
1568          *-*-solaris*)
1569            # Sun cc.
1570            #
1571            # We used to have -fast and some fixup options here, but it
1572            # recurrently caused problems with miscompilation.  Of course,
1573            # -fast is documented as miscompiling things for the sake of speed.
1574            #
1575            cclist_64="$cclist_64 cc"
1576            cc_64_cflags_optlist="cpu"
1577            case $host_cpu in
1578              [ultrasparct[345]])
1579                cc_64_cflags="$cc_64_cflags -xO3 -xarch=v9d" ;;
1580              *)
1581                cc_64_cflags="-xO3 -xarch=v9" ;;
1582            esac
1583            ;;
1584        esac
1585
1586        # using the v9 %tick register
1587        SPEED_CYCLECOUNTER_OBJ_32=sparcv9.lo
1588        SPEED_CYCLECOUNTER_OBJ_64=sparcv9.lo
1589        cyclecounter_size_32=2
1590        cyclecounter_size_64=2
1591        ;;
1592    esac
1593    ;;
1594
1595
1596  # VAX
1597  vax*-*-*elf*)
1598    # Use elf conventions (i.e., '%' register prefix, no global prefix)
1599    #
1600    GMP_INCLUDE_MPN(vax/elf.m4)
1601    gcc_cflags="$gcc_cflags $fomit_frame_pointer"
1602    path="vax"
1603    if test "$enable_assembly" = "yes" ; then
1604      extra_functions="udiv_w_sdiv"
1605    fi
1606    ;;
1607  vax*-*-*)
1608    # Default to aout conventions (i.e., no register prefix, '_' global prefix)
1609    #
1610    gcc_cflags="$gcc_cflags $fomit_frame_pointer"
1611    path="vax"
1612    if test "$enable_assembly" = "yes" ; then
1613      extra_functions="udiv_w_sdiv"
1614    fi
1615    ;;
1616
1617
1618  # AMD and Intel x86 configurations, including AMD64
1619  #
1620  # Rumour has it gcc -O2 used to give worse register allocation than just
1621  # -O, but lets assume that's no longer true.
1622  #
1623  # -m32 forces 32-bit mode on a bi-arch 32/64 amd64 build of gcc.  -m64 is
1624  # the default in such a build (we think), so -m32 is essential for ABI=32.
1625  # This is, of course, done for any $host_cpu, not just x86_64, so we can
1626  # get such a gcc into the right mode to cross-compile to say i486-*-*.
1627  #
1628  # -m32 is not available in gcc 2.95 and earlier, hence cflags_maybe to use
1629  # it when it works.  We check sizeof(long)==4 to ensure we get the right
1630  # mode, in case -m32 has failed not because it's an old gcc, but because
1631  # it's a dual 32/64-bit gcc without a 32-bit libc, or whatever.
1632  #
1633  X86_PATTERN | X86_64_PATTERN)
1634    abilist="32"
1635    cclist="gcc icc cc"
1636    gcc_cflags="$gcc_cflags $fomit_frame_pointer"
1637    gcc_32_cflags_maybe="-m32"
1638    icc_cflags="-no-gcc"
1639    icc_cflags_optlist="opt"
1640    icc_cflags_opt="-O3 -O2 -O1"
1641    icc_cflags_opt_maybe="-fp-model~precise"
1642    any_32_testlist="sizeof-long-4"
1643    gcc_cflags_optlist="cpu arch noavx"
1644    CALLING_CONVENTIONS_OBJS='x86call.lo x86check$U.lo'
1645
1646    # Availability of rdtsc is checked at run-time.
1647    SPEED_CYCLECOUNTER_OBJ=pentium.lo
1648
1649    # gcc 2.7.2 only knows i386 and i486, using -m386 or -m486.  These
1650    #     represent -mcpu= since -m486 doesn't generate 486 specific insns.
1651    # gcc 2.95 adds k6, pentium and pentiumpro, and takes -march= and -mcpu=.
1652    # gcc 3.0 adds athlon.
1653    # gcc 3.1 adds k6-2, k6-3, pentium-mmx, pentium2, pentium3, pentium4,
1654    #     athlon-tbird, athlon-4, athlon-xp, athlon-mp.
1655    # gcc 3.2 adds winchip2.
1656    # gcc 3.3 adds winchip-c6.
1657    # gcc 3.3.1 from mandrake adds k8 and knows -mtune.
1658    # gcc 3.4 adds c3, c3-2, k8, and deprecates -mcpu in favour of -mtune.
1659    #
1660    # In gcc 2.95.[0123], -march=pentiumpro provoked a stack slot bug in an
1661    # old version of mpz/powm.c.  Seems to be fine with the current code, so
1662    # no need for any restrictions on that option.
1663    #
1664    # -march=pentiumpro can fail if the assembler doesn't know "cmov"
1665    # (eg. solaris 2.8 native "as"), so always have -march=pentium after
1666    # that as a fallback.
1667    #
1668    # -march=pentium4 and -march=k8 enable SSE2 instructions, which may or
1669    # may not be supported by the assembler and/or the OS, and is bad in gcc
1670    # prior to 3.3.  The tests will reject these if no good, so fallbacks
1671    # like "-march=pentium4 -mno-sse2" are given to try also without SSE2.
1672    # Note the relevant -march types are listed in the optflags handling
1673    # below, be sure to update there if adding new types emitting SSE2.
1674    #
1675    # -mtune is used at the start of each cpu option list to give something
1676    # gcc 3.4 will use, thereby avoiding warnings from -mcpu.  -mcpu forms
1677    # are retained for use by prior gcc.  For example pentium has
1678    # "-mtune=pentium -mcpu=pentium ...", the -mtune is for 3.4 and the
1679    # -mcpu for prior.  If there's a brand new choice in 3.4 for a chip,
1680    # like k8 for x86_64, then it can be the -mtune at the start, no need to
1681    # duplicate anything.
1682    #
1683    case $host_cpu in
1684      i386*)
1685	gcc_cflags_cpu="-mtune=i386 -mcpu=i386 -m386"
1686	gcc_cflags_arch="-march=i386"
1687	path="x86"
1688	;;
1689      i486*)
1690	gcc_cflags_cpu="-mtune=i486 -mcpu=i486 -m486"
1691	gcc_cflags_arch="-march=i486"
1692	path="x86/i486 x86"
1693	;;
1694      i586 | pentium)
1695	gcc_cflags_cpu="-mtune=pentium -mcpu=pentium -m486"
1696	gcc_cflags_arch="-march=pentium"
1697	path="x86/pentium x86"
1698	;;
1699      pentiummmx)
1700	gcc_cflags_cpu="-mtune=pentium-mmx -mcpu=pentium-mmx -mcpu=pentium -m486"
1701	gcc_cflags_arch="-march=pentium-mmx -march=pentium"
1702	path="x86/pentium/mmx x86/pentium x86/mmx x86"
1703	;;
1704      i686 | pentiumpro)
1705	gcc_cflags_cpu="-mtune=pentiumpro -mcpu=pentiumpro -mcpu=i486 -m486"
1706	gcc_cflags_arch="-march=pentiumpro -march=pentium"
1707	path="x86/p6 x86"
1708	;;
1709      pentium2)
1710	gcc_cflags_cpu="-mtune=pentium2 -mcpu=pentium2 -mcpu=pentiumpro -mcpu=i486 -m486"
1711	gcc_cflags_arch="-march=pentium2 -march=pentiumpro -march=pentium"
1712	path="x86/p6/mmx x86/p6 x86/mmx x86"
1713	;;
1714      pentium3)
1715	gcc_cflags_cpu="-mtune=pentium3 -mcpu=pentium3 -mcpu=pentiumpro -mcpu=i486 -m486"
1716	gcc_cflags_arch="-march=pentium3 -march=pentiumpro -march=pentium"
1717	path="x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86"
1718	;;
1719      pentiumm)
1720	gcc_cflags_cpu="-mtune=pentium3 -mcpu=pentium3 -mcpu=pentiumpro -mcpu=i486 -m486"
1721	gcc_cflags_arch="-march=pentium3 -march=pentiumpro -march=pentium"
1722	path="x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86"
1723	;;
1724      k6)
1725	gcc_cflags_cpu="-mtune=k6 -mcpu=k6 -mcpu=i486 -m486"
1726	gcc_cflags_arch="-march=k6"
1727	path="x86/k6/mmx x86/k6 x86/mmx x86"
1728	;;
1729      k62)
1730	gcc_cflags_cpu="-mtune=k6-2 -mcpu=k6-2 -mcpu=k6 -mcpu=i486 -m486"
1731	gcc_cflags_arch="-march=k6-2 -march=k6"
1732	path="x86/k6/k62mmx x86/k6/mmx x86/k6 x86/mmx x86"
1733	;;
1734      k63)
1735	gcc_cflags_cpu="-mtune=k6-3 -mcpu=k6-3 -mcpu=k6 -mcpu=i486 -m486"
1736	gcc_cflags_arch="-march=k6-3 -march=k6"
1737	path="x86/k6/k62mmx x86/k6/mmx x86/k6 x86/mmx x86"
1738	;;
1739      geode)
1740	gcc_cflags_cpu="-mtune=k6-3 -mcpu=k6-3 -mcpu=k6 -mcpu=i486 -m486"
1741	gcc_cflags_arch="-march=k6-3 -march=k6"
1742	path="x86/geode x86/k6/k62mmx x86/k6/mmx x86/k6 x86/mmx x86"
1743	;;
1744      athlon)
1745	# Athlon instruction costs are close to P6 (3 cycle load latency,
1746	# 4-6 cycle mul, 40 cycle div, pairable adc, etc) so if gcc doesn't
1747	# know athlon (eg. 2.95.2 doesn't) then fall back on pentiumpro.
1748	gcc_cflags_cpu="-mtune=athlon -mcpu=athlon -mcpu=pentiumpro -mcpu=i486 -m486"
1749	gcc_cflags_arch="-march=athlon -march=pentiumpro -march=pentium"
1750	path="x86/k7/mmx x86/k7 x86/mmx x86"
1751	;;
1752      i786 | pentium4)
1753	# pentiumpro is the primary fallback when gcc doesn't know pentium4.
1754	# This gets us cmov to eliminate branches.  Maybe "athlon" would be
1755	# a possibility on gcc 3.0.
1756	#
1757	gcc_cflags_cpu="-mtune=pentium4 -mcpu=pentium4 -mcpu=pentiumpro -mcpu=i486 -m486"
1758	gcc_cflags_arch="-march=pentium4 -march=pentium4~-mno-sse2 -march=pentiumpro -march=pentium"
1759	gcc_64_cflags_cpu="-mtune=nocona"
1760	path="x86/pentium4/sse2 x86/pentium4/mmx x86/pentium4 x86/mmx x86"
1761	path_64="x86_64/pentium4 x86_64"
1762	;;
1763      viac32)
1764	# Not sure of the best fallbacks here for -mcpu.
1765	# c3-2 has sse and mmx, so pentium3 is good for -march.
1766	gcc_cflags_cpu="-mtune=c3-2 -mcpu=c3-2 -mcpu=i486 -m486"
1767	gcc_cflags_arch="-march=c3-2 -march=pentium3 -march=pentiumpro -march=pentium"
1768	path="x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86"
1769	;;
1770      viac3*)
1771	# Not sure of the best fallbacks here.
1772	gcc_cflags_cpu="-mtune=c3 -mcpu=c3 -mcpu=i486 -m486"
1773	gcc_cflags_arch="-march=c3 -march=pentium-mmx -march=pentium"
1774	path="x86/pentium/mmx x86/pentium x86/mmx x86"
1775	;;
1776      athlon64 | k8 | x86_64)
1777	gcc_cflags_cpu="-mtune=k8 -mcpu=athlon -mcpu=pentiumpro -mcpu=i486 -m486"
1778	gcc_cflags_arch="-march=k8 -march=k8~-mno-sse2 -march=athlon -march=pentiumpro -march=pentium"
1779	path="x86/k8 x86/k7/mmx x86/k7 x86/mmx x86"
1780	path_64="x86_64/k8 x86_64"
1781	;;
1782      k10)
1783	gcc_cflags_cpu="-mtune=amdfam10 -mtune=k8"
1784	gcc_cflags_arch="-march=amdfam10 -march=k8 -march=k8~-mno-sse2"
1785	path="x86/k10 x86/k8 x86/k7/mmx x86/k7 x86/mmx x86"
1786	path_64="x86_64/k10 x86_64/k8 x86_64"
1787	;;
1788      bobcat)
1789	gcc_cflags_cpu="-mtune=btver1 -mtune=amdfam10 -mtune=k8"
1790	gcc_cflags_arch="-march=btver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2"
1791	path="x86/bobcat x86/k7/mmx x86/k7 x86/mmx x86"
1792	path_64="x86_64/bobcat x86_64/k10 x86_64/k8 x86_64"
1793	;;
1794      jaguar | jaguarnoavx)
1795	gcc_cflags_cpu="-mtune=btver2 -mtune=btver1 -mtune=amdfam10 -mtune=k8"
1796	gcc_cflags_arch="-march=btver2 -march=btver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2"
1797	path="x86/jaguar x86/bobcat x86/k7/mmx x86/k7 x86/mmx x86"
1798	path_64="x86_64/jaguar x86_64/bobcat x86_64/k10 x86_64/k8 x86_64"
1799	;;
1800      bulldozer | bd1 | bulldozernoavx | bd1noavx)
1801	gcc_cflags_cpu="-mtune=bdver1 -mtune=amdfam10 -mtune=k8"
1802	gcc_cflags_arch="-march=bdver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2"
1803	path="x86/bd1 x86/k7/mmx x86/k7 x86/mmx x86"
1804	path_64="x86_64/bd1 x86_64/k10 x86_64/k8 x86_64"
1805	;;
1806      piledriver | bd2 | piledrivernoavx | bd2noavx)
1807	gcc_cflags_cpu="-mtune=bdver2 -mtune=bdver1 -mtune=amdfam10 -mtune=k8"
1808	gcc_cflags_arch="-march=bdver2 -march=bdver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2"
1809	path="x86/bd2 x86/bd1 x86/k7/mmx x86/k7 x86/mmx x86"
1810	path_64="x86_64/bd2 x86_64/bd1 x86_64/k10 x86_64/k8 x86_64"
1811	;;
1812      steamroller | bd3 | steamrollernoavx | bd3noavx)
1813	gcc_cflags_cpu="-mtune=bdver3 -mtune=bdver2 -mtune=bdver1 -mtune=amdfam10 -mtune=k8"
1814	gcc_cflags_arch="-march=bdver3 -march=bdver2 -march=bdver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2"
1815	path="x86/bd3 x86/bd2 x86/bd1 x86/k7/mmx x86/k7 x86/mmx x86"
1816	path_64="x86_64/bd3 x86_64/bd2 x86_64/bd1 x86_64/k10 x86_64/k8 x86_64"
1817	;;
1818      excavator | bd4 | excavatornoavx | bd4noavx)
1819	gcc_cflags_cpu="-mtune=bdver4 -mtune=bdver3 -mtune=bdver2 -mtune=bdver1 -mtune=amdfam10 -mtune=k8"
1820	gcc_cflags_arch="-march=bdver4 -march=bdver3 -march=bdver2 -march=bdver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2"
1821	path="x86/bd4 x86/bd3 x86/bd2 x86/bd1 x86/k7/mmx x86/k7 x86/mmx x86"
1822	path_64="x86_64/bd4 x86_64/bd3 x86_64/bd2 x86_64/bd1 x86_64/k10 x86_64/k8 x86_64"
1823	;;
1824      core2)
1825	gcc_cflags_cpu="-mtune=core2 -mtune=k8"
1826	gcc_cflags_arch="-march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2"
1827	path="x86/core2 x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86"
1828	path_64="x86_64/core2 x86_64"
1829	;;
1830      corei | coreinhm | coreiwsm | nehalem | westmere)
1831	gcc_cflags_cpu="-mtune=corei7 -mtune=core2 -mtune=k8"
1832	gcc_cflags_arch="-march=corei7 -march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2"
1833	path="x86/coreinhm x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86"
1834	path_64="x86_64/coreinhm x86_64/core2 x86_64"
1835	;;
1836      coreisbr | coreisbrnoavx | coreiibr | coreiibrnoavx | \
1837      sandybridge | sandybridgenoavx | ivybridge | ivybridgenoavx)
1838	gcc_cflags_cpu="-mtune=sandybridge -mtune=corei7 -mtune=core2 -mtune=k8"
1839	gcc_cflags_arch="-march=sandybridge -march=corei7 -march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2"
1840	path="x86/coreisbr x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86"
1841	path_64="x86_64/coreisbr x86_64/coreinhm x86_64/core2 x86_64"
1842	;;
1843      coreihwl | coreihwlnoavx | haswell | haswellnoavx)
1844	gcc_cflags_cpu="-mtune=haswell -mtune=corei7 -mtune=core2 -mtune=k8"
1845	gcc_cflags_arch="-march=haswell -march=corei7 -march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2"
1846	path="x86/coreisbr x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86"
1847	path_64="x86_64/coreihwl x86_64/coreisbr x86_64/coreinhm x86_64/core2 x86_64"
1848	;;
1849      coreibwl | coreibwlnoavx | broadwell | broadwellnoavx)
1850	gcc_cflags_cpu="-mtune=broadwell -mtune=corei7 -mtune=core2 -mtune=k8"
1851	gcc_cflags_arch="-march=broadwell -march=corei7 -march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2"
1852	path="x86/coreisbr x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86"
1853	path_64="x86_64/coreibwl x86_64/coreihwl x86_64/coreisbr x86_64/coreinhm x86_64/core2 x86_64"
1854	# extra_functions_64="missing"	 # enable for bmi2/adx simulation
1855	;;
1856      skylake | skylakenoavx | kabylake | kabylakenoavx)
1857	gcc_cflags_cpu="-mtune=skylake -mtune=broadwell -mtune=corei7 -mtune=core2 -mtune=k8"
1858	# Don't pass -march=skylake for now as then some compilers emit AVX512.
1859	gcc_cflags_arch="-march=broadwell -march=corei7 -march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2"
1860	path="x86/coreisbr x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86"
1861	path_64="x86_64/skylake x86_64/coreibwl x86_64/coreihwl x86_64/coreisbr x86_64/coreinhm x86_64/core2 x86_64"
1862	# extra_functions_64="missing"	 # enable for bmi2/adx simulation
1863	;;
1864      atom)			# in-order pipeline atom
1865	gcc_cflags_cpu="-mtune=atom -mtune=pentium3"
1866	gcc_cflags_arch="-march=atom -march=pentium3"
1867	path="x86/atom/sse2 x86/atom/mmx x86/atom x86/mmx x86"
1868	path_64="x86_64/atom x86_64"
1869	;;
1870      silvermont | goldmont)	# out-of-order pipeline atom
1871	gcc_cflags_cpu="-mtune=slm -mtune=atom -mtune=pentium3"
1872	gcc_cflags_arch="-march=slm -march=atom -march=pentium3"
1873	path="x86/atom/sse2 x86/atom/mmx x86/atom x86/mmx x86"
1874	path_64="x86_64/silvermont x86_64/atom x86_64"
1875	;;
1876      nano)
1877	gcc_cflags_cpu="-mtune=nano"
1878	gcc_cflags_arch="-march=nano"
1879	path="x86/nano x86/mmx x86"
1880	path_64="x86_64/nano x86_64"
1881	;;
1882      *)
1883	gcc_cflags_cpu="-mtune=i486 -mcpu=i486 -m486"
1884	gcc_cflags_arch="-march=i486"
1885	path="x86"
1886	path_64="x86_64"
1887	;;
1888    esac
1889
1890    case $host in
1891      # Disable AVX if the CPU part tells us AVX is unavailable, but also
1892      # unconditionally for NetBSD where they don't work but OSXSAVE is set
1893      # to claim the contrary.
1894      *noavx-*-* | *-*-netbsd*)
1895	gcc_cflags_noavx="-mno-avx";;
1896    esac
1897
1898    case $host in
1899      X86_64_PATTERN)
1900	cclist_64="gcc cc"
1901	gcc_64_cflags="$gcc_cflags -m64"
1902	gcc_64_cflags_optlist="cpu arch noavx"
1903	CALLING_CONVENTIONS_OBJS_64='amd64call.lo amd64check$U.lo'
1904	SPEED_CYCLECOUNTER_OBJ_64=x86_64.lo
1905	cyclecounter_size_64=2
1906
1907	cclist_x32="gcc cc"
1908	gcc_x32_cflags="$gcc_cflags -mx32"
1909	gcc_x32_cflags_optlist="$gcc_64_cflags_optlist"
1910	CALLING_CONVENTIONS_OBJS_x32="$CALLING_CONVENTIONS_OBJS_64"
1911	SPEED_CYCLECOUNTER_OBJ_x32="$SPEED_CYCLECOUNTER_OBJ_64"
1912	cyclecounter_size_x32="$cyclecounter_size_64"
1913	path_x32="$path_64"
1914	limb_x32=longlong
1915	any_x32_testlist="sizeof-long-4"
1916
1917	abilist="64 x32 32"
1918	if test "$enable_assembly" = "yes" ; then
1919	    extra_functions_64="$extra_functions_64 invert_limb_table"
1920	    extra_functions_x32=$extra_functions_64
1921	fi
1922
1923	case $host in
1924	  *-*-solaris*)
1925	    # Sun cc.
1926	    cc_64_cflags="-xO3 -m64"
1927	    ;;
1928	  *-*-mingw* | *-*-cygwin)
1929	    limb_64=longlong
1930	    CALLING_CONVENTIONS_OBJS_64=""
1931	    AC_DEFINE(HOST_DOS64,1,[Define to 1 for Windos/64])
1932	    GMP_NONSTD_ABI_64=DOS64
1933	    ;;
1934	esac
1935	;;
1936    esac
1937    ;;
1938
1939
1940  # Special CPU "none" used to select generic C, now this is obsolete.
1941  none-*-*)
1942    enable_assembly=no
1943    AC_MSG_WARN([the \"none\" host is obsolete, use --disable-assembly])
1944    ;;
1945
1946esac
1947
1948# mingw can be built by the cygwin gcc if -mno-cygwin is added.  For
1949# convenience add this automatically if it works.  Actual mingw gcc accepts
1950# -mno-cygwin too, but of course is the default.  mingw only runs on the
1951# x86s, but allow any CPU here so as to catch "none" too.
1952#
1953case $host in
1954  *-*-mingw*)
1955    gcc_cflags_optlist="$gcc_cflags_optlist nocygwin"
1956    gcc_cflags_nocygwin="-mno-cygwin"
1957    ;;
1958esac
1959
1960
1961CFLAGS_or_unset=${CFLAGS-'(unset)'}
1962CPPFLAGS_or_unset=${CPPFLAGS-'(unset)'}
1963
1964cat >&AC_FD_CC <<EOF
1965User:
1966ABI=$ABI
1967CC=$CC
1968CFLAGS=$CFLAGS_or_unset
1969CPPFLAGS=$CPPFLAGS_or_unset
1970MPN_PATH=$MPN_PATH
1971GMP:
1972abilist=$abilist
1973cclist=$cclist
1974EOF
1975
1976
1977test_CFLAGS=${CFLAGS+set}
1978test_CPPFLAGS=${CPPFLAGS+set}
1979
1980for abi in $abilist; do
1981  abi_last="$abi"
1982done
1983
1984# If the user specifies an ABI then it must be in $abilist, after that
1985# $abilist is restricted to just that choice.
1986#
1987if test -n "$ABI"; then
1988  found=no
1989  for abi in $abilist; do
1990    if test $abi = "$ABI"; then found=yes; break; fi
1991  done
1992  if test $found = no; then
1993    AC_MSG_ERROR([ABI=$ABI is not among the following valid choices: $abilist])
1994  fi
1995  abilist="$ABI"
1996fi
1997
1998found_compiler=no
1999
2000for abi in $abilist; do
2001
2002  echo "checking ABI=$abi"
2003
2004  # Suppose abilist="64 32", then for abi=64, will have abi1="_64" and
2005  # abi2="_64".  For abi=32, will have abi1="_32" and abi2="".  This is how
2006  # $gcc_cflags becomes a fallback for $gcc_32_cflags (the last in the
2007  # abilist), but there's no fallback for $gcc_64_cflags.
2008  #
2009  abi1=[`echo _$abi | sed 's/[.]//g'`]
2010  if test $abi = $abi_last; then abi2=; else abi2="$abi1"; fi
2011
2012  # Compiler choices under this ABI
2013                              eval cclist_chosen=\"\$cclist$abi1\"
2014  test -n "$cclist_chosen" || eval cclist_chosen=\"\$cclist$abi2\"
2015
2016  # If there's a user specified $CC then don't use a list for
2017  # $cclist_chosen, just a single value for $ccbase.
2018  #
2019  if test -n "$CC"; then
2020
2021    # The first word of $CC, stripped of any directory.  For instance
2022    # CC="/usr/local/bin/gcc -pipe" will give "gcc".
2023    #
2024    for ccbase in $CC; do break; done
2025    ccbase=`echo $ccbase | sed 's:.*/::'`
2026
2027    # If this $ccbase is in $cclist_chosen then it's a compiler we know and
2028    # we can do flags defaulting with it.  If not, then $cclist_chosen is
2029    # set to "unrecognised" so no default flags are used.
2030    #
2031    # "unrecognised" is used to avoid bad effects with eval if $ccbase has
2032    # non-symbol characters.  For instance ccbase=my+cc would end up with
2033    # something like cflags="$my+cc_cflags" which would give
2034    # cflags="+cc_cflags" rather than the intended empty string for an
2035    # unknown compiler.
2036    #
2037    found=unrecognised
2038    for i in $cclist_chosen; do
2039      if test "$ccbase" = $i; then
2040        found=$ccbase
2041        break
2042      fi
2043    done
2044    cclist_chosen=$found
2045  fi
2046
2047  for ccbase in $cclist_chosen; do
2048
2049    # When cross compiling, look for a compiler with the $host_alias as a
2050    # prefix, the same way that AC_CHECK_TOOL does.  But don't do this to a
2051    # user-selected $CC.
2052    #
2053    # $cross_compiling will be yes/no/maybe at this point.  Do the host
2054    # prefixing for "maybe" as well as "yes".
2055    #
2056    if test "$cross_compiling" != no && test -z "$CC"; then
2057      cross_compiling_prefix="${host_alias}-"
2058    fi
2059
2060    for ccprefix in $cross_compiling_prefix ""; do
2061
2062      cc="$CC"
2063      test -n "$cc" || cc="$ccprefix$ccbase"
2064
2065      # If the compiler is gcc but installed under another name, then change
2066      # $ccbase so as to use the flags we know for gcc.  This helps for
2067      # instance when specifying CC=gcc272 on Debian GNU/Linux, or the
2068      # native cc which is really gcc on NeXT or MacOS-X.
2069      #
2070      # FIXME: There's a slight misfeature here.  If cc is actually gcc but
2071      # gcc is not a known compiler under this $abi then we'll end up
2072      # testing it with no flags and it'll work, but chances are it won't be
2073      # in the right mode for the ABI we desire.  Let's quietly hope this
2074      # doesn't happen.
2075      #
2076      if test $ccbase != gcc; then
2077        GMP_PROG_CC_IS_GNU($cc,ccbase=gcc)
2078      fi
2079
2080      # Similarly if the compiler is IBM xlc but invoked as cc or whatever
2081      # then change $ccbase and make the default xlc flags available.
2082      if test $ccbase != xlc; then
2083        GMP_PROG_CC_IS_XLC($cc,ccbase=xlc)
2084      fi
2085
2086      # acc was Sun's first unbundled compiler back in the SunOS days, or
2087      # something like that, but today its man page says it's not meant to
2088      # be used directly (instead via /usr/ucb/cc).  The options are pretty
2089      # much the same as the main SunPRO cc, so share those configs.
2090      #
2091      case $host in
2092        *sparc*-*-solaris* | *sparc*-*-sunos*)
2093          if test "$ccbase" = acc; then ccbase=cc; fi ;;
2094      esac
2095
2096      for tmp_cflags_maybe in yes no; do
2097                             eval cflags=\"\$${ccbase}${abi1}_cflags\"
2098        test -n "$cflags" || eval cflags=\"\$${ccbase}${abi2}_cflags\"
2099
2100	if test "$tmp_cflags_maybe" = yes; then
2101          # don't try cflags_maybe when the user set CFLAGS
2102          if test "$test_CFLAGS" = set; then continue; fi
2103                                     eval cflags_maybe=\"\$${ccbase}${abi1}_cflags_maybe\"
2104          test -n "$cflags_maybe" || eval cflags_maybe=\"\$${ccbase}${abi2}_cflags_maybe\"
2105          # don't try cflags_maybe if there's nothing set
2106          if test -z "$cflags_maybe"; then continue; fi
2107          cflags="$cflags_maybe $cflags"
2108        fi
2109
2110        # Any user CFLAGS, even an empty string, takes precedence
2111        if test "$test_CFLAGS" = set; then cflags=$CFLAGS; fi
2112
2113        # Any user CPPFLAGS, even an empty string, takes precedence
2114                               eval cppflags=\"\$${ccbase}${abi1}_cppflags\"
2115        test -n "$cppflags" || eval cppflags=\"\$${ccbase}${abi2}_cppflags\"
2116        if test "$test_CPPFLAGS" = set; then cppflags=$CPPFLAGS; fi
2117
2118        # --enable-profiling adds -p/-pg even to user-specified CFLAGS.
2119        # This is convenient, but it's perhaps a bit naughty to modify user
2120        # CFLAGS.
2121        case "$enable_profiling" in
2122          prof)       cflags="$cflags -p" ;;
2123          gprof)      cflags="$cflags -pg" ;;
2124          instrument) cflags="$cflags -finstrument-functions" ;;
2125        esac
2126
2127        GMP_PROG_CC_WORKS($cc $cflags $cppflags,,continue)
2128
2129        # If we're supposed to be using a "long long" for a limb, check that
2130        # it works.
2131                                  eval limb_chosen=\"\$limb$abi1\"
2132        test -n "$limb_chosen" || eval limb_chosen=\"\$limb$abi2\"
2133        if test "$limb_chosen" = longlong; then
2134          GMP_PROG_CC_WORKS_LONGLONG($cc $cflags $cppflags,,continue)
2135        fi
2136
2137        # The tests to perform on this $cc, if any
2138                               eval testlist=\"\$${ccbase}${abi1}_testlist\"
2139        test -n "$testlist" || eval testlist=\"\$${ccbase}${abi2}_testlist\"
2140        test -n "$testlist" || eval testlist=\"\$any${abi1}_testlist\"
2141        test -n "$testlist" || eval testlist=\"\$any${abi2}_testlist\"
2142
2143        testlist_pass=yes
2144        for tst in $testlist; do
2145          case $tst in
2146          hpc-hppa-2-0)   GMP_HPC_HPPA_2_0($cc,,testlist_pass=no) ;;
2147          gcc-arm-umodsi) GMP_GCC_ARM_UMODSI($cc,,testlist_pass=no) ;;
2148          gcc-mips-o32)   GMP_GCC_MIPS_O32($cc,,testlist_pass=no) ;;
2149          hppa-level-2.0) GMP_HPPA_LEVEL_20($cc $cflags,,testlist_pass=no) ;;
2150          sizeof*)       GMP_C_TEST_SIZEOF($cc $cflags,$tst,,testlist_pass=no) ;;
2151          esac
2152          if test $testlist_pass = no; then break; fi
2153        done
2154
2155        if test $testlist_pass = yes; then
2156          found_compiler=yes
2157          break
2158        fi
2159      done
2160
2161      if test $found_compiler = yes; then break; fi
2162    done
2163
2164    if test $found_compiler = yes; then break; fi
2165  done
2166
2167  if test $found_compiler = yes; then break; fi
2168done
2169
2170
2171# If we recognised the CPU, as indicated by $path being set, then insist
2172# that we have a working compiler, either from our $cclist choices or from
2173# $CC.  We can't let AC_PROG_CC look around for a compiler because it might
2174# find one that we've rejected (for not supporting the modes our asm code
2175# demands, etc).
2176#
2177# If we didn't recognise the CPU (and this includes host_cpu=none), then
2178# fall through and let AC_PROG_CC look around for a compiler too.  This is
2179# mostly in the interests of following a standard autoconf setup, after all
2180# we've already tested cc and gcc adequately (hopefully).  As of autoconf
2181# 2.50 the only thing AC_PROG_CC really adds is a check for "cl" (Microsoft
2182# C on MS-DOS systems).
2183#
2184if test $found_compiler = no && test -n "$path"; then
2185  AC_MSG_ERROR([could not find a working compiler, see config.log for details])
2186fi
2187
2188case $host in
2189  X86_PATTERN | X86_64_PATTERN)
2190    # If the user asked for a fat build, override the path and flags set above
2191    if test $enable_fat = yes; then
2192      gcc_cflags_cpu=""
2193      gcc_cflags_arch=""
2194
2195      fat_functions="add_n addmul_1 bdiv_dbm1c com cnd_add_n cnd_sub_n
2196		     copyd copyi dive_1 divrem_1
2197		     gcd_1 lshift lshiftc mod_1 mod_1_1 mod_1_1_cps mod_1_2
2198		     mod_1_2_cps mod_1_4 mod_1_4_cps mod_34lsub1 mode1o mul_1
2199		     mul_basecase mullo_basecase pre_divrem_1 pre_mod_1 redc_1
2200		     redc_2 rshift sqr_basecase sub_n submul_1"
2201
2202      if test "$abi" = 32; then
2203	extra_functions="$extra_functions fat fat_entry"
2204	path="x86/fat x86"
2205	fat_path="x86 x86/fat x86/i486
2206		  x86/k6 x86/k6/mmx x86/k6/k62mmx
2207		  x86/k7 x86/k7/mmx
2208		  x86/k8 x86/k10 x86/bobcat
2209		  x86/pentium x86/pentium/mmx
2210		  x86/p6 x86/p6/mmx x86/p6/p3mmx x86/p6/sse2
2211		  x86/pentium4 x86/pentium4/mmx x86/pentium4/sse2
2212		  x86/core2 x86/coreinhm x86/coreisbr
2213		  x86/atom x86/atom/mmx x86/atom/sse2 x86/nano"
2214      fi
2215
2216      if test "$abi" = 64; then
2217	gcc_64_cflags=""
2218	extra_functions_64="$extra_functions_64 fat fat_entry"
2219	path_64="x86_64/fat x86_64"
2220	fat_path="x86_64 x86_64/fat
2221		  x86_64/k8 x86_64/k10 x86_64/bd1 x86_64/bobcat x86_64/pentium4
2222		  x86_64/core2 x86_64/coreinhm x86_64/coreisbr x86_64/coreihwl
2223		  x86_64/coreibwl x86_64/skylake x86_64/atom x86_64/silvermont
2224		  x86_64/nano"
2225	fat_functions="$fat_functions addmul_2 addlsh1_n addlsh2_n sublsh1_n"
2226      fi
2227
2228      fat_thresholds="MUL_TOOM22_THRESHOLD MUL_TOOM33_THRESHOLD
2229		      SQR_TOOM2_THRESHOLD SQR_TOOM3_THRESHOLD
2230		      BMOD_1_TO_MOD_1_THRESHOLD"
2231    fi
2232    ;;
2233esac
2234
2235
2236if test $found_compiler = yes; then
2237
2238  # If we're creating CFLAGS, then look for optional additions.  If the user
2239  # set CFLAGS then leave it alone.
2240  #
2241  if test "$test_CFLAGS" != set; then
2242                          eval optlist=\"\$${ccbase}${abi1}_cflags_optlist\"
2243    test -n "$optlist" || eval optlist=\"\$${ccbase}${abi2}_cflags_optlist\"
2244
2245    for opt in $optlist; do
2246                             eval optflags=\"\$${ccbase}${abi1}_cflags_${opt}\"
2247      test -n "$optflags" || eval optflags=\"\$${ccbase}${abi2}_cflags_${opt}\"
2248      test -n "$optflags" || eval optflags=\"\$${ccbase}_cflags_${opt}\"
2249
2250      for flag in $optflags; do
2251
2252	# ~ represents a space in an option spec
2253        flag=`echo "$flag" | tr '~' ' '`
2254
2255        case $flag in
2256          -march=pentium4 | -march=k8)
2257            # For -march settings which enable SSE2 we exclude certain bad
2258            # gcc versions and we need an OS knowing how to save xmm regs.
2259            #
2260            # This is only for ABI=32, any 64-bit gcc is good and any OS
2261            # knowing x86_64 will know xmm.
2262            #
2263            # -march=k8 was only introduced in gcc 3.3, so we shouldn't need
2264            # the GMP_GCC_PENTIUM4_SSE2 check (for gcc 3.2 and prior).  But
2265            # it doesn't hurt to run it anyway, sharing code with the
2266            # pentium4 case.
2267            #
2268            if test "$abi" = 32; then
2269              GMP_GCC_PENTIUM4_SSE2($cc $cflags $cppflags,, continue)
2270              GMP_OS_X86_XMM($cc $cflags $cppflags,, continue)
2271            fi
2272            ;;
2273          -no-cpp-precomp)
2274            # special check, avoiding a warning
2275            GMP_GCC_NO_CPP_PRECOMP($ccbase,$cc,$cflags,
2276                                   [cflags="$cflags $flag"
2277                                   break],
2278                                   [continue])
2279            ;;
2280          -Wa,-m*)
2281            case $host in
2282              alpha*-*-*)
2283                GMP_GCC_WA_MCPU($cc $cflags, $flag, , [continue])
2284              ;;
2285            esac
2286            ;;
2287          -Wa,-oldas)
2288            GMP_GCC_WA_OLDAS($cc $cflags $cppflags,
2289                             [cflags="$cflags $flag"
2290                             break],
2291                             [continue])
2292            ;;
2293        esac
2294
2295        GMP_PROG_CC_WORKS($cc $cflags $cppflags $flag,
2296          [cflags="$cflags $flag"
2297          break])
2298      done
2299    done
2300  fi
2301
2302  ABI="$abi"
2303  CC="$cc"
2304  CFLAGS="$cflags"
2305  CPPFLAGS="$cppflags"
2306  eval GMP_NONSTD_ABI=\"\$GMP_NONSTD_ABI_$ABI\"
2307
2308  # Could easily have this in config.h too, if desired.
2309  ABI_nodots=`echo $ABI | sed 's/\./_/'`
2310  GMP_DEFINE_RAW("define_not_for_expansion(\`HAVE_ABI_$ABI_nodots')", POST)
2311
2312
2313  # GMP_LDFLAGS substitution, selected according to ABI.
2314  # These are needed on libgmp.la and libmp.la, but currently not on
2315  # convenience libraries like tune/libspeed.la or mpz/libmpz.la.
2316  #
2317                            eval GMP_LDFLAGS=\"\$${ccbase}${abi1}_ldflags\"
2318  test -n "$GMP_LDFLAGS" || eval GMP_LDFLAGS=\"\$${ccbase}${abi1}_ldflags\"
2319  AC_SUBST(GMP_LDFLAGS)
2320  AC_SUBST(LIBGMP_LDFLAGS)
2321  AC_SUBST(LIBGMPXX_LDFLAGS)
2322
2323  # extra_functions, selected according to ABI
2324                    eval tmp=\"\$extra_functions$abi1\"
2325  test -n "$tmp" || eval tmp=\"\$extra_functions$abi2\"
2326  extra_functions="$tmp"
2327
2328
2329  # Cycle counter, selected according to ABI.
2330  #
2331                    eval tmp=\"\$SPEED_CYCLECOUNTER_OBJ$abi1\"
2332  test -n "$tmp" || eval tmp=\"\$SPEED_CYCLECOUNTER_OBJ$abi2\"
2333  SPEED_CYCLECOUNTER_OBJ="$tmp"
2334                    eval tmp=\"\$cyclecounter_size$abi1\"
2335  test -n "$tmp" || eval tmp=\"\$cyclecounter_size$abi2\"
2336  cyclecounter_size="$tmp"
2337
2338  if test -n "$SPEED_CYCLECOUNTER_OBJ"; then
2339    AC_DEFINE_UNQUOTED(HAVE_SPEED_CYCLECOUNTER, $cyclecounter_size,
2340    [Tune directory speed_cyclecounter, undef=none, 1=32bits, 2=64bits)])
2341  fi
2342  AC_SUBST(SPEED_CYCLECOUNTER_OBJ)
2343
2344
2345  # Calling conventions checking, selected according to ABI.
2346  #
2347                    eval tmp=\"\$CALLING_CONVENTIONS_OBJS$abi1\"
2348  test -n "$tmp" || eval tmp=\"\$CALLING_CONVENTIONS_OBJS$abi2\"
2349  if test "$enable_assembly" = "yes"; then
2350     CALLING_CONVENTIONS_OBJS="$tmp"
2351  else
2352     CALLING_CONVENTIONS_OBJS=""
2353  fi
2354
2355  if test -n "$CALLING_CONVENTIONS_OBJS"; then
2356    AC_DEFINE(HAVE_CALLING_CONVENTIONS,1,
2357    [Define to 1 if tests/libtests has calling conventions checking for the CPU])
2358  fi
2359  AC_SUBST(CALLING_CONVENTIONS_OBJS)
2360
2361fi
2362
2363
2364# If the user gave an MPN_PATH, use that verbatim, otherwise choose
2365# according to the ABI and add "generic".
2366#
2367if test -n "$MPN_PATH"; then
2368  path="$MPN_PATH"
2369else
2370                    eval tmp=\"\$path$abi1\"
2371  test -n "$tmp" || eval tmp=\"\$path$abi2\"
2372  path="$tmp generic"
2373fi
2374
2375
2376# Long long limb setup for gmp.h.
2377case $limb_chosen in
2378longlong) DEFN_LONG_LONG_LIMB="#define _LONG_LONG_LIMB 1"    ;;
2379*)        DEFN_LONG_LONG_LIMB="/* #undef _LONG_LONG_LIMB */" ;;
2380esac
2381AC_SUBST(DEFN_LONG_LONG_LIMB)
2382
2383
2384# The C compiler and preprocessor, put into ANSI mode if possible.
2385AC_PROG_CC
2386AC_PROG_CC_STDC
2387AC_PROG_CPP
2388
2389
2390# The C compiler on the build system, and associated tests.
2391GMP_PROG_CC_FOR_BUILD
2392GMP_PROG_CPP_FOR_BUILD
2393GMP_PROG_EXEEXT_FOR_BUILD
2394GMP_C_FOR_BUILD_ANSI
2395GMP_CHECK_LIBM_FOR_BUILD
2396
2397
2398# How to assemble, used with CFLAGS etc, see mpn/Makeasm.am.
2399# Using the compiler is a lot easier than figuring out how to invoke the
2400# assembler directly.
2401#
2402test -n "$CCAS" || CCAS="$CC -c"
2403AC_SUBST(CCAS)
2404
2405
2406# The C++ compiler, if desired.
2407want_cxx=no
2408if test $enable_cxx != no; then
2409  test_CXXFLAGS=${CXXFLAGS+set}
2410  AC_PROG_CXX
2411
2412  echo "CXXFLAGS chosen by autoconf: $CXXFLAGS" >&AC_FD_CC
2413  cxxflags_ac_prog_cxx=$CXXFLAGS
2414  cxxflags_list=ac_prog_cxx
2415
2416  # If the user didn't specify $CXXFLAGS, then try $CFLAGS, with -g removed
2417  # if AC_PROG_CXX thinks that doesn't work.  $CFLAGS stands a good chance
2418  # of working, eg. on a GNU system where CC=gcc and CXX=g++.
2419  #
2420  if test "$test_CXXFLAGS" != set; then
2421    cxxflags_cflags=$CFLAGS
2422    cxxflags_list="cflags $cxxflags_list"
2423    if test "$ac_prog_cxx_g" = no; then
2424      cxxflags_cflags=`echo "$cxxflags_cflags" | sed -e 's/ -g //' -e 's/^-g //' -e 's/ -g$//'`
2425    fi
2426  fi
2427
2428  # See if the C++ compiler works.  If the user specified CXXFLAGS then all
2429  # we're doing is checking whether AC_PROG_CXX succeeded, since it doesn't
2430  # give a fatal error, just leaves CXX set to a default g++.  If on the
2431  # other hand the user didn't specify CXXFLAGS then we get to try here our
2432  # $cxxflags_list alternatives.
2433  #
2434  # Automake includes $CPPFLAGS in a C++ compile, so we do the same here.
2435  #
2436  for cxxflags_choice in $cxxflags_list; do
2437    eval CXXFLAGS=\"\$cxxflags_$cxxflags_choice\"
2438    GMP_PROG_CXX_WORKS($CXX $CPPFLAGS $CXXFLAGS,
2439      [want_cxx=yes
2440      break])
2441  done
2442
2443  # If --enable-cxx=yes but a C++ compiler can't be found, then abort.
2444  if test $want_cxx = no && test $enable_cxx = yes; then
2445    AC_MSG_ERROR([C++ compiler not available, see config.log for details])
2446  fi
2447fi
2448
2449AM_CONDITIONAL(WANT_CXX, test $want_cxx = yes)
2450
2451# FIXME: We're not interested in CXXCPP for ourselves, but if we don't do it
2452# here then AC_PROG_LIBTOOL will AC_REQUIRE it (via _LT_AC_TAGCONFIG) and
2453# hence execute it unconditionally, and that will fail if there's no C++
2454# compiler (and no generic /lib/cpp).
2455#
2456if test $want_cxx = yes; then
2457  AC_PROG_CXXCPP
2458fi
2459
2460
2461# Path setups for Cray, according to IEEE or CFP.  These must come after
2462# deciding the compiler.
2463#
2464GMP_CRAY_OPTIONS(
2465  [add_path="cray/ieee"],
2466  [add_path="cray/cfp"; extra_functions="mulwwc90"],
2467  [add_path="cray/cfp"; extra_functions="mulwwj90"])
2468
2469
2470if test -z "$MPN_PATH"; then
2471  path="$add_path $path"
2472fi
2473
2474# For a nail build, also look in "nails" subdirectories.
2475#
2476if test $GMP_NAIL_BITS != 0 && test -z "$MPN_PATH"; then
2477  new_path=
2478  for i in $path; do
2479    case $i in
2480    generic) new_path="$new_path $i" ;;
2481    *)       new_path="$new_path $i/nails $i" ;;
2482    esac
2483  done
2484  path=$new_path
2485fi
2486
2487
2488# Put all directories into CPUVEC_list so as to get a full set of
2489# CPUVEC_SETUP_$tmp_suffix defines into config.h, even if some of them are
2490# empty because mmx and/or sse2 had to be dropped.
2491#
2492for i in $fat_path; do
2493  GMP_FAT_SUFFIX(tmp_suffix, $i)
2494  CPUVEC_list="$CPUVEC_list CPUVEC_SETUP_$tmp_suffix"
2495done
2496
2497
2498# If there's any sse2 or mmx in the path, check whether the assembler
2499# supports it, and remove if not.
2500#
2501# We only need this in ABI=32, for ABI=64 on x86_64 we can assume a new
2502# enough assembler.
2503#
2504case $host in
2505  X86_PATTERN | X86_64_PATTERN)
2506    if test "$ABI" = 32; then
2507      case "$path $fat_path" in
2508        *mmx*)   GMP_ASM_X86_MMX( , [GMP_STRIP_PATH(*mmx*)]) ;;
2509      esac
2510      case "$path $fat_path" in
2511        *sse2*)  GMP_ASM_X86_SSE2( , [GMP_STRIP_PATH(sse2)]) ;;
2512      esac
2513    fi
2514    case "$path $fat_path" in
2515      *mulx*)  GMP_ASM_X86_MULX( , [GMP_STRIP_PATH(mulx)]) ;;
2516    esac
2517    case "$path $fat_path" in
2518      *adx*)   GMP_ASM_X86_ADX( , [GMP_STRIP_PATH(adx)]) ;;
2519    esac
2520    ;;
2521esac
2522
2523
2524if test "$enable_assembly" = "no"; then
2525  path="generic"
2526  AC_DEFINE([NO_ASM],1,[Define to 1 to disable the use of inline assembly])
2527#  for abi in $abilist; do
2528#    eval unset "path_\$abi"
2529#    eval gcc_${abi}_cflags=\"\$gcc_${abi}_cflags -DNO_ASM\"
2530#  done
2531fi
2532
2533
2534cat >&AC_FD_CC <<EOF
2535Decided:
2536ABI=$ABI
2537CC=$CC
2538CFLAGS=$CFLAGS
2539CPPFLAGS=$CPPFLAGS
2540GMP_LDFLAGS=$GMP_LDFLAGS
2541CXX=$CXX
2542CXXFLAGS=$CXXFLAGS
2543path=$path
2544EOF
2545echo "using ABI=\"$ABI\""
2546echo "      CC=\"$CC\""
2547echo "      CFLAGS=\"$CFLAGS\""
2548echo "      CPPFLAGS=\"$CPPFLAGS\""
2549if test $want_cxx = yes; then
2550  echo "      CXX=\"$CXX\""
2551  echo "      CXXFLAGS=\"$CXXFLAGS\""
2552fi
2553echo "      MPN_PATH=\"$path\""
2554
2555
2556CL_AS_NOEXECSTACK
2557
2558GMP_PROG_AR
2559GMP_PROG_NM
2560
2561case $host in
2562  # FIXME: On AIX 3 and 4, $libname.a is included in libtool
2563  # $library_names_spec, so libgmp.a becomes a symlink to libgmp.so, making
2564  # it impossible to build shared and static libraries simultaneously.
2565  # Disable shared libraries by default, but let the user override with
2566  # --enable-shared --disable-static.
2567  #
2568  # FIXME: This $libname.a problem looks like it might apply to *-*-amigaos*
2569  # and *-*-os2* too, but wait for someone to test this before worrying
2570  # about it.  If there is a problem then of course libtool is the right
2571  # place to fix it.
2572  #
2573  [*-*-aix[34]*])
2574    if test -z "$enable_shared"; then enable_shared=no; fi ;;
2575esac
2576
2577
2578# Configs for Windows DLLs.
2579
2580AC_LIBTOOL_WIN32_DLL
2581
2582AC_SUBST(LIBGMP_DLL,0)
2583case $host in
2584  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
2585    # By default, build only static.
2586    if test -z "$enable_shared"; then
2587      enable_shared=no
2588    fi
2589    # Don't allow both static and DLL.
2590    if test "$enable_shared" != no && test "$enable_static" != no; then
2591      AC_MSG_ERROR([cannot build both static and DLL, since gmp.h is different for each.
2592Use "--disable-static --enable-shared" to build just a DLL.])
2593    fi
2594
2595    # "-no-undefined" is required when building a DLL, see documentation on
2596    # AC_LIBTOOL_WIN32_DLL.
2597    #
2598    # "-Wl,--export-all-symbols" is a bit of a hack, it gets all libgmp and
2599    # libgmpxx functions and variables exported.  This is what libtool did
2600    # in the past, and it's convenient for us in the test programs.
2601    #
2602    # Maybe it'd be prudent to check for --export-all-symbols before using
2603    # it, but it seems to have been in ld since at least 2000, and there's
2604    # not really any alternative we want to take up at the moment.
2605    #
2606    # "-Wl,output-def" is used to get a .def file for use by MS lib to make
2607    # a .lib import library, described in the manual.  libgmp-3.dll.def
2608    # corresponds to the libmp-3.dll.def generated by libtool (as a result
2609    # of -export-symbols on that library).
2610    #
2611    # Incidentally, libtool does generate an import library libgmp.dll.a,
2612    # but it's "ar" format and cannot be used by the MS linker.  There
2613    # doesn't seem to be any GNU tool for generating or converting to .lib.
2614    #
2615    # FIXME: The .def files produced by -Wl,output-def include isascii,
2616    # iscsym, iscsymf and toascii, apparently because mingw ctype.h doesn't
2617    # inline isascii (used in gmp).  It gives an extern inline for
2618    # __isascii, but for some reason not the plain isascii.
2619    #
2620    if test "$enable_shared" = yes; then
2621      GMP_LDFLAGS="$GMP_LDFLAGS -no-undefined -Wl,--export-all-symbols"
2622      LIBGMP_LDFLAGS="$LIBGMP_LDFLAGS -Wl,--output-def,.libs/libgmp-3.dll.def"
2623      LIBGMPXX_LDFLAGS="$LIBGMP_LDFLAGS -Wl,--output-def,.libs/libgmpxx-3.dll.def"
2624      LIBGMP_DLL=1
2625    fi
2626    ;;
2627esac
2628
2629
2630# Ensure that $CONFIG_SHELL is available for AC_LIBTOOL_SYS_MAX_CMD_LEN.
2631# It's often set already by _LT_AC_PROG_ECHO_BACKSLASH or
2632# _AS_LINENO_PREPARE, but not always.
2633#
2634# The symptom of CONFIG_SHELL unset is some "expr" errors during the test,
2635# and an empty result.  This only happens when invoked as "sh configure",
2636# ie. no path, and can be seen for instance on ia64-*-hpux*.
2637#
2638# FIXME: Newer libtool should have it's own fix for this.
2639#
2640if test -z "$CONFIG_SHELL"; then
2641  CONFIG_SHELL=$SHELL
2642fi
2643
2644# Enable CXX in libtool only if we want it, and never enable GCJ, nor RC on
2645# mingw and cygwin.  Under --disable-cxx this avoids some error messages
2646# from libtool arising from the fact we didn't actually run AC_PROG_CXX.
2647# Notice that any user-supplied --with-tags setting takes precedence.
2648#
2649# FIXME: Is this the right way to get this effect?  Very possibly not, but
2650# the current _LT_AC_TAGCONFIG doesn't really suggest an alternative.
2651#
2652if test "${with_tags+set}" != set; then
2653  if test $want_cxx = yes; then
2654    with_tags=CXX
2655  else
2656    with_tags=
2657  fi
2658fi
2659
2660# The dead hand of AC_REQUIRE makes AC_PROG_LIBTOOL expand and execute
2661# AC_PROG_F77, even when F77 is not in the selected with_tags.  This is
2662# probably harmless, but it's unsightly and bloats our configure, so pretend
2663# AC_PROG_F77 has been expanded already.
2664#
2665# FIXME: Rumour has it libtool will one day provide a way for a configure.in
2666# to say what it wants from among supported languages etc.
2667#
2668#AC_PROVIDE([AC_PROG_F77])
2669
2670AC_PROG_LIBTOOL
2671
2672# Generate an error here if attempting to build both shared and static when
2673# $libname.a is in $library_names_spec (as mentioned above), rather than
2674# wait for ar or ld to fail.
2675#
2676if test "$enable_shared" = yes && test "$enable_static" = yes; then
2677  case $library_names_spec in
2678    *libname.a*)
2679      AC_MSG_ERROR([cannot create both shared and static libraries on this system, --disable one of the two])
2680      ;;
2681  esac
2682fi
2683
2684AM_CONDITIONAL(ENABLE_STATIC, test "$enable_static" = yes)
2685
2686
2687# Many of these library and header checks are for the benefit of
2688# supplementary programs.  libgmp doesn't use anything too weird.
2689
2690AC_HEADER_STDC
2691AC_HEADER_TIME
2692
2693# Reasons for testing:
2694#   float.h - not in SunOS bundled cc
2695#   invent.h - IRIX specific
2696#   langinfo.h - X/Open standard only, not in djgpp for instance
2697#   locale.h - old systems won't have this
2698#   nl_types.h - X/Open standard only, not in djgpp for instance
2699#       (usually langinfo.h gives nl_item etc, but not on netbsd 1.4.1)
2700#   sys/attributes.h - IRIX specific
2701#   sys/iograph.h - IRIX specific
2702#   sys/mman.h - not in Cray Unicos
2703#   sys/param.h - not in mingw
2704#   sys/processor.h - solaris specific, though also present in macos
2705#   sys/pstat.h - HPUX specific
2706#   sys/resource.h - not in mingw
2707#   sys/sysctl.h - not in mingw
2708#   sys/sysinfo.h - OSF specific
2709#   sys/syssgi.h - IRIX specific
2710#   sys/systemcfg.h - AIX specific
2711#   sys/time.h - autoconf suggests testing, don't know anywhere without it
2712#   sys/times.h - not in mingw
2713#   machine/hal_sysinfo.h - OSF specific
2714#
2715# inttypes.h, stdint.h, unistd.h and sys/types.h are already in the autoconf
2716# default tests
2717#
2718AC_CHECK_HEADERS(fcntl.h float.h invent.h langinfo.h locale.h nl_types.h sys/attributes.h sys/iograph.h sys/mman.h sys/param.h sys/processor.h sys/pstat.h sys/sysinfo.h sys/syssgi.h sys/systemcfg.h sys/time.h sys/times.h)
2719
2720# On SunOS, sys/resource.h needs sys/time.h (for struct timeval)
2721AC_CHECK_HEADERS(sys/resource.h,,,
2722[#if TIME_WITH_SYS_TIME
2723# include <sys/time.h>
2724# include <time.h>
2725#else
2726# if HAVE_SYS_TIME_H
2727#  include <sys/time.h>
2728# else
2729#  include <time.h>
2730# endif
2731#endif])
2732
2733# On NetBSD and OpenBSD, sys/sysctl.h needs sys/param.h for various constants
2734AC_CHECK_HEADERS(sys/sysctl.h,,,
2735[#if HAVE_SYS_PARAM_H
2736# include <sys/param.h>
2737#endif])
2738
2739# On OSF 4.0, <machine/hal_sysinfo.h> must have <sys/sysinfo.h> for ulong_t
2740AC_CHECK_HEADERS(machine/hal_sysinfo.h,,,
2741[#if HAVE_SYS_SYSINFO_H
2742# include <sys/sysinfo.h>
2743#endif])
2744
2745# Reasons for testing:
2746#   optarg - not declared in mingw
2747#   fgetc, fscanf, ungetc, vfprintf - not declared in SunOS 4
2748#   sys_errlist, sys_nerr - not declared in SunOS 4
2749#
2750# optarg should be in unistd.h and the rest in stdio.h, both of which are
2751# in the autoconf default includes.
2752#
2753# sys_errlist and sys_nerr are supposed to be in <errno.h> on SunOS according
2754# to the man page (but aren't), in glibc they're in stdio.h.
2755#
2756AC_CHECK_DECLS([fgetc, fscanf, optarg, ungetc, vfprintf])
2757AC_CHECK_DECLS([sys_errlist, sys_nerr], , ,
2758[#include <stdio.h>
2759#include <errno.h>])
2760
2761AC_TYPE_SIGNAL
2762
2763# Reasons for testing:
2764#   intmax_t       - C99
2765#   long double    - not in the HP bundled K&R cc
2766#   long long      - only in reasonably recent compilers
2767#   ptrdiff_t      - seems to be everywhere, maybe don't need to check this
2768#   quad_t         - BSD specific
2769#   uint_least32_t - C99
2770#
2771# the default includes are sufficient for all these types
2772#
2773AC_CHECK_TYPES([intmax_t, long double, long long, ptrdiff_t, quad_t,
2774		uint_least32_t, intptr_t])
2775
2776# FIXME: Really want #ifndef __cplusplus around the #define volatile
2777# replacement autoconf gives, since volatile is always available in C++.
2778# But we don't use it in C++ currently.
2779AC_C_VOLATILE
2780
2781AC_C_RESTRICT
2782
2783# GMP_C_STDARG
2784GMP_C_ATTRIBUTE_CONST
2785GMP_C_ATTRIBUTE_MALLOC
2786GMP_C_ATTRIBUTE_MODE
2787GMP_C_ATTRIBUTE_NORETURN
2788GMP_C_HIDDEN_ALIAS
2789
2790GMP_H_EXTERN_INLINE
2791
2792# from libtool
2793AC_CHECK_LIBM
2794AC_SUBST(LIBM)
2795
2796GMP_FUNC_ALLOCA
2797GMP_OPTION_ALLOCA
2798
2799GMP_H_HAVE_FILE
2800
2801AC_C_BIGENDIAN(
2802  [AC_DEFINE(HAVE_LIMB_BIG_ENDIAN, 1)
2803   GMP_DEFINE_RAW("define_not_for_expansion(\`HAVE_LIMB_BIG_ENDIAN')", POST)],
2804  [AC_DEFINE(HAVE_LIMB_LITTLE_ENDIAN, 1)
2805   GMP_DEFINE_RAW("define_not_for_expansion(\`HAVE_LIMB_LITTLE_ENDIAN')", POST)
2806  ], [:])
2807AH_VERBATIM([HAVE_LIMB],
2808[/* Define one of these to 1 for the endianness of `mp_limb_t'.
2809   If the endianness is not a simple big or little, or you don't know what
2810   it is, then leave both undefined. */
2811#undef HAVE_LIMB_BIG_ENDIAN
2812#undef HAVE_LIMB_LITTLE_ENDIAN])
2813
2814GMP_C_DOUBLE_FORMAT
2815
2816
2817# Reasons for testing:
2818#   alarm - not in mingw
2819#   attr_get - IRIX specific
2820#   clock_gettime - not in glibc 2.2.4, only very recent systems
2821#   cputime - not in glibc
2822#   getsysinfo - OSF specific
2823#   getrusage - not in mingw
2824#   gettimeofday - not in mingw
2825#   mmap - not in mingw, djgpp
2826#   nl_langinfo - X/Open standard only, not in djgpp for instance
2827#   obstack_vprintf - glibc specific
2828#   processor_info - solaris specific
2829#   pstat_getprocessor - HPUX specific (10.x and up)
2830#   raise - an ANSI-ism, though probably almost universal by now
2831#   read_real_time - AIX specific
2832#   sigaction - not in mingw
2833#   sigaltstack - not in mingw, or old AIX (reputedly)
2834#   sigstack - not in mingw
2835#   strerror - not in SunOS
2836#   strnlen - glibc extension (some other systems too)
2837#   syssgi - IRIX specific
2838#   times - not in mingw
2839#
2840# AC_FUNC_STRNLEN is not used because we don't want the AC_LIBOBJ
2841# replacement setups it gives.  It detects a faulty strnlen on AIX, but
2842# missing out on that test is ok since our only use of strnlen is in
2843# __gmp_replacement_vsnprintf which is not required on AIX since it has a
2844# vsnprintf.
2845#
2846AC_CHECK_FUNCS(alarm attr_get clock cputime getpagesize getrusage gettimeofday getsysinfo localeconv memset mmap mprotect nl_langinfo obstack_vprintf popen processor_info pstat_getprocessor raise read_real_time sigaction sigaltstack sigstack syssgi strchr strerror strnlen strtol strtoul sysconf sysctl sysctlbyname times)
2847
2848# clock_gettime is in librt on *-*-osf5.1 and on glibc, so att -lrt to
2849# TUNE_LIBS if needed. On linux (tested on x86_32, 2.6.26),
2850# clock_getres reports ns accuracy, while in a quick test on osf
2851# clock_getres said only 1 millisecond.
2852
2853old_LIBS="$LIBS"
2854AC_SEARCH_LIBS(clock_gettime, rt, [
2855  AC_DEFINE([HAVE_CLOCK_GETTIME],1,[Define to 1 if you have the `clock_gettime' function])])
2856TUNE_LIBS="$LIBS"
2857LIBS="$old_LIBS"
2858
2859AC_SUBST(TUNE_LIBS)
2860
2861GMP_FUNC_VSNPRINTF
2862GMP_FUNC_SSCANF_WRITABLE_INPUT
2863
2864# Reasons for checking:
2865#   pst_processor psp_iticksperclktick - not in hpux 9
2866#
2867AC_CHECK_MEMBER(struct pst_processor.psp_iticksperclktick,
2868                [AC_DEFINE(HAVE_PSP_ITICKSPERCLKTICK, 1,
2869[Define to 1 if <sys/pstat.h> `struct pst_processor' exists
2870and contains `psp_iticksperclktick'.])],,
2871                [#include <sys/pstat.h>])
2872
2873# C++ tests, when required
2874#
2875if test $enable_cxx = yes; then
2876  AC_LANG_PUSH(C++)
2877
2878  # Reasons for testing:
2879  #   <sstream> - not in g++ 2.95.2
2880  #   std::locale - not in g++ 2.95.4
2881  #
2882  AC_CHECK_HEADERS([sstream])
2883  AC_CHECK_TYPES([std::locale],,,[#include <locale>])
2884
2885  AC_LANG_POP(C++)
2886fi
2887
2888
2889# Pick the correct source files in $path and link them to mpn/.
2890# $gmp_mpn_functions lists all functions we need.
2891#
2892# The rule is to find a file with the function name and a .asm, .S,
2893# .s, or .c extension.  Certain multi-function files with special names
2894# can provide some functions too.  (mpn/Makefile.am passes
2895# -DOPERATION_<func> to get them to generate the right code.)
2896
2897# Note: $gmp_mpn_functions must have mod_1 before pre_mod_1 so the former
2898#       can optionally provide the latter as an extra entrypoint.  Likewise
2899#       divrem_1 and pre_divrem_1.
2900
2901gmp_mpn_functions_optional="umul udiv					\
2902  invert_limb sqr_diagonal sqr_diag_addlsh1				\
2903  mul_2 mul_3 mul_4 mul_5 mul_6						\
2904  addmul_2 addmul_3 addmul_4 addmul_5 addmul_6 addmul_7 addmul_8	\
2905  addlsh1_n sublsh1_n rsblsh1_n rsh1add_n rsh1sub_n			\
2906  addlsh2_n sublsh2_n rsblsh2_n						\
2907  addlsh_n sublsh_n rsblsh_n						\
2908  add_n_sub_n addaddmul_1msb0"
2909
2910gmp_mpn_functions="$extra_functions					   \
2911  add add_1 add_n sub sub_1 sub_n cnd_add_n cnd_sub_n cnd_swap neg com	   \
2912  mul_1 addmul_1 submul_1						   \
2913  add_err1_n add_err2_n add_err3_n sub_err1_n sub_err2_n sub_err3_n	   \
2914  lshift rshift dive_1 diveby3 divis divrem divrem_1 divrem_2		   \
2915  fib2_ui mod_1 mod_34lsub1 mode1o pre_divrem_1 pre_mod_1 dump		   \
2916  mod_1_1 mod_1_2 mod_1_3 mod_1_4 lshiftc				   \
2917  mul mul_fft mul_n sqr mul_basecase sqr_basecase nussbaumer_mul	   \
2918  mulmid_basecase toom42_mulmid mulmid_n mulmid				   \
2919  random random2 pow_1							   \
2920  rootrem sqrtrem sizeinbase get_str set_str				   \
2921  scan0 scan1 popcount hamdist cmp zero_p				   \
2922  perfsqr perfpow							   \
2923  gcd_1 gcd gcdext_1 gcdext gcd_subdiv_step				   \
2924  gcdext_lehmer								   \
2925  div_q tdiv_qr jacbase jacobi_2 jacobi get_d				   \
2926  matrix22_mul matrix22_mul1_inverse_vector				   \
2927  hgcd_matrix hgcd2 hgcd_step hgcd_reduce hgcd hgcd_appr		   \
2928  hgcd2_jacobi hgcd_jacobi						   \
2929  mullo_n mullo_basecase sqrlo sqrlo_basecase				   \
2930  toom22_mul toom32_mul toom42_mul toom52_mul toom62_mul		   \
2931  toom33_mul toom43_mul toom53_mul toom54_mul toom63_mul		   \
2932  toom44_mul								   \
2933  toom6h_mul toom6_sqr toom8h_mul toom8_sqr				   \
2934  toom_couple_handling							   \
2935  toom2_sqr toom3_sqr toom4_sqr						   \
2936  toom_eval_dgr3_pm1 toom_eval_dgr3_pm2					   \
2937  toom_eval_pm1 toom_eval_pm2 toom_eval_pm2exp toom_eval_pm2rexp	   \
2938  toom_interpolate_5pts toom_interpolate_6pts toom_interpolate_7pts	   \
2939  toom_interpolate_8pts toom_interpolate_12pts toom_interpolate_16pts	   \
2940  invertappr invert binvert mulmod_bnm1 sqrmod_bnm1			   \
2941  div_qr_1 div_qr_1n_pi1						   \
2942  div_qr_2 div_qr_2n_pi1 div_qr_2u_pi1					   \
2943  sbpi1_div_q sbpi1_div_qr sbpi1_divappr_q				   \
2944  dcpi1_div_q dcpi1_div_qr dcpi1_divappr_q				   \
2945  mu_div_qr mu_divappr_q mu_div_q					   \
2946  bdiv_q_1								   \
2947  sbpi1_bdiv_q sbpi1_bdiv_qr						   \
2948  dcpi1_bdiv_q dcpi1_bdiv_qr						   \
2949  mu_bdiv_q mu_bdiv_qr							   \
2950  bdiv_q bdiv_qr broot brootinv bsqrt bsqrtinv				   \
2951  divexact bdiv_dbm1c redc_1 redc_2 redc_n powm powlo sec_powm		   \
2952  sec_mul sec_sqr sec_div_qr sec_div_r sec_pi1_div_qr sec_pi1_div_r	   \
2953  sec_add_1 sec_sub_1 sec_invert					   \
2954  trialdiv remove							   \
2955  and_n andn_n nand_n ior_n iorn_n nior_n xor_n xnor_n			   \
2956  copyi copyd zero sec_tabselect					   \
2957  comb_tables								   \
2958  $gmp_mpn_functions_optional"
2959
2960define(GMP_MULFUNC_CHOICES,
2961[# functions that can be provided by multi-function files
2962tmp_mulfunc=
2963case $tmp_fn in
2964  add_n|sub_n)       tmp_mulfunc="aors_n"    ;;
2965  add_err1_n|sub_err1_n)
2966		     tmp_mulfunc="aors_err1_n" ;;
2967  add_err2_n|sub_err2_n)
2968		     tmp_mulfunc="aors_err2_n" ;;
2969  add_err3_n|sub_err3_n)
2970		     tmp_mulfunc="aors_err3_n" ;;
2971  cnd_add_n|cnd_sub_n) tmp_mulfunc="cnd_aors_n"   ;;
2972  sec_add_1|sec_sub_1) tmp_mulfunc="sec_aors_1"   ;;
2973  addmul_1|submul_1) tmp_mulfunc="aorsmul_1" ;;
2974  mul_2|addmul_2)    tmp_mulfunc="aormul_2" ;;
2975  mul_3|addmul_3)    tmp_mulfunc="aormul_3" ;;
2976  mul_4|addmul_4)    tmp_mulfunc="aormul_4" ;;
2977  popcount|hamdist)  tmp_mulfunc="popham"    ;;
2978  and_n|andn_n|nand_n | ior_n|iorn_n|nior_n | xor_n|xnor_n)
2979                     tmp_mulfunc="logops_n"  ;;
2980  lshift|rshift)     tmp_mulfunc="lorrshift";;
2981  addlsh1_n)
2982		     tmp_mulfunc="aorslsh1_n aorrlsh1_n aorsorrlsh1_n";;
2983  sublsh1_n)
2984		     tmp_mulfunc="aorslsh1_n sorrlsh1_n aorsorrlsh1_n";;
2985  rsblsh1_n)
2986		     tmp_mulfunc="aorrlsh1_n sorrlsh1_n aorsorrlsh1_n";;
2987  addlsh2_n)
2988		     tmp_mulfunc="aorslsh2_n aorrlsh2_n aorsorrlsh2_n";;
2989  sublsh2_n)
2990		     tmp_mulfunc="aorslsh2_n sorrlsh2_n aorsorrlsh2_n";;
2991  rsblsh2_n)
2992		     tmp_mulfunc="aorrlsh2_n sorrlsh2_n aorsorrlsh2_n";;
2993  addlsh_n)
2994		     tmp_mulfunc="aorslsh_n aorrlsh_n aorsorrlsh_n";;
2995  sublsh_n)
2996		     tmp_mulfunc="aorslsh_n sorrlsh_n aorsorrlsh_n";;
2997  rsblsh_n)
2998		     tmp_mulfunc="aorrlsh_n sorrlsh_n aorsorrlsh_n";;
2999  rsh1add_n|rsh1sub_n)
3000		     tmp_mulfunc="rsh1aors_n";;
3001  sec_div_qr|sec_div_r)
3002		     tmp_mulfunc="sec_div";;
3003  sec_pi1_div_qr|sec_pi1_div_r)
3004		     tmp_mulfunc="sec_pi1_div";;
3005esac
3006])
3007
3008# the list of all object files used by mpn/Makefile.in and the
3009# top-level Makefile.in, respectively
3010mpn_objects=
3011mpn_objs_in_libgmp=
3012
3013# links from the sources, to be removed by "make distclean"
3014gmp_srclinks=
3015
3016
3017# mpn_relative_top_srcdir is $top_srcdir, but for use from within the mpn
3018# build directory.  If $srcdir is relative then we use a relative path too,
3019# so the two trees can be moved together.
3020case $srcdir in
3021  [[\\/]* | ?:[\\/]*])  # absolute, as per autoconf
3022    mpn_relative_top_srcdir=$srcdir ;;
3023  *)                    # relative
3024    mpn_relative_top_srcdir=../$srcdir ;;
3025esac
3026
3027
3028define(MPN_SUFFIXES,[asm S s c])
3029
3030dnl  Usage: GMP_FILE_TO_FUNCTION_BASE(func,file)
3031dnl
3032dnl  Set $func to the function base name for $file, eg. dive_1 gives
3033dnl  divexact_1.
3034dnl
3035define(GMP_FILE_TO_FUNCTION,
3036[case $$2 in
3037  dive_1)	$1=divexact_1 ;;
3038  diveby3)	$1=divexact_by3c ;;
3039  pre_divrem_1) $1=preinv_divrem_1 ;;
3040  mode1o)	$1=modexact_1c_odd ;;
3041  pre_mod_1)	$1=preinv_mod_1 ;;
3042  mod_1_1)	$1=mod_1_1p ;;
3043  mod_1_1_cps)	$1=mod_1_1p_cps ;;
3044  mod_1_2)	$1=mod_1s_2p ;;
3045  mod_1_2_cps)	$1=mod_1s_2p_cps ;;
3046  mod_1_3)	$1=mod_1s_3p ;;
3047  mod_1_3_cps)	$1=mod_1s_3p_cps ;;
3048  mod_1_4)	$1=mod_1s_4p ;;
3049  mod_1_4_cps)	$1=mod_1s_4p_cps ;;
3050  *)		$1=$$2 ;;
3051esac
3052])
3053
3054# Fat binary setups.
3055#
3056# We proceed through each $fat_path directory, and look for $fat_function
3057# routines there.  Those found are incorporated in the build by generating a
3058# little mpn/<foo>.asm or mpn/<foo>.c file in the build directory, with
3059# suitable function renaming, and adding that to $mpn_objects (the same as a
3060# normal mpn file).
3061#
3062# fat.h is generated with macros to let internal calls to each $fat_function
3063# go directly through __gmpn_cpuvec, plus macros and declarations helping to
3064# setup that structure, on a per-directory basis ready for
3065# mpn/<cpu>/fat/fat.c.
3066#
3067# fat.h includes thresholds listed in $fat_thresholds, extracted from
3068# gmp-mparam.h in each directory.  An overall maximum for each threshold is
3069# established, for use in making fixed size arrays of temporary space.
3070# (Eg. MUL_TOOM33_THRESHOLD_LIMIT used by mpn/generic/mul.c.)
3071#
3072# It'd be possible to do some of this manually, but when there's more than a
3073# few functions and a few directories it becomes very tedious, and very
3074# prone to having some routine accidentally omitted.  On that basis it seems
3075# best to automate as much as possible, even if the code to do so is a bit
3076# ugly.
3077#
3078
3079if test -n "$fat_path"; then
3080  # Usually the mpn build directory is created with mpn/Makefile
3081  # instantiation, but we want to write to it sooner.
3082  mkdir mpn 2>/dev/null
3083
3084  echo "/* fat.h - setups for fat binaries." >fat.h
3085  echo "   Generated by configure - DO NOT EDIT.  */" >>fat.h
3086
3087  AC_DEFINE(WANT_FAT_BINARY, 1, [Define to 1 when building a fat binary.])
3088  GMP_DEFINE(WANT_FAT_BINARY, yes)
3089
3090  # Don't want normal copies of fat functions
3091  for tmp_fn in $fat_functions; do
3092    GMP_REMOVE_FROM_LIST(gmp_mpn_functions, $tmp_fn)
3093    GMP_REMOVE_FROM_LIST(gmp_mpn_functions_optional, $tmp_fn)
3094  done
3095
3096  for tmp_fn in $fat_functions; do
3097    GMP_FILE_TO_FUNCTION(tmp_fbase,tmp_fn)
3098    echo "
3099#ifndef OPERATION_$tmp_fn
3100#undef  mpn_$tmp_fbase
3101#define mpn_$tmp_fbase  (*__gmpn_cpuvec.$tmp_fbase)
3102#endif
3103DECL_$tmp_fbase (__MPN(${tmp_fbase}_init));" >>fat.h
3104    # encourage various macros to use fat functions
3105    AC_DEFINE_UNQUOTED(HAVE_NATIVE_mpn_$tmp_fbase)
3106  done
3107
3108  echo "" >>fat.h
3109  echo "/* variable thresholds */" >>fat.h
3110  for tmp_tn in $fat_thresholds; do
3111    echo "#undef  $tmp_tn" >>fat.h
3112    echo "#define $tmp_tn  CPUVEC_THRESHOLD (`echo $tmp_tn | tr [A-Z] [a-z]`)" >>fat.h
3113  done
3114
3115  echo "
3116/* Copy all fields into __gmpn_cpuvec.
3117   memcpy is not used because it might operate byte-wise (depending on its
3118   implementation), and we need the function pointer writes to be atomic.
3119   "volatile" discourages the compiler from trying to optimize this.  */
3120#define CPUVEC_INSTALL(vec) \\
3121  do { \\
3122    volatile struct cpuvec_t *p = &__gmpn_cpuvec; \\" >>fat.h
3123  for tmp_fn in $fat_functions; do
3124    GMP_FILE_TO_FUNCTION(tmp_fbase,tmp_fn)
3125    echo "    p->$tmp_fbase = vec.$tmp_fbase; \\" >>fat.h
3126  done
3127  for tmp_tn in $fat_thresholds; do
3128    tmp_field_name=`echo $tmp_tn | tr [[A-Z]] [[a-z]]`
3129    echo "    p->$tmp_field_name = vec.$tmp_field_name; \\" >>fat.h
3130  done
3131  echo "  } while (0)" >>fat.h
3132
3133  echo "
3134/* A helper to check all fields are filled. */
3135#define ASSERT_CPUVEC(vec) \\
3136  do { \\" >>fat.h
3137  for tmp_fn in $fat_functions; do
3138    GMP_FILE_TO_FUNCTION(tmp_fbase,tmp_fn)
3139    echo "    ASSERT (vec.$tmp_fbase != NULL); \\" >>fat.h
3140  done
3141  for tmp_tn in $fat_thresholds; do
3142    tmp_field_name=`echo $tmp_tn | tr [[A-Z]] [[a-z]]`
3143    echo "    ASSERT (vec.$tmp_field_name != 0); \\" >>fat.h
3144  done
3145  echo "  } while (0)" >>fat.h
3146
3147  echo "
3148/* Call ITERATE(field) for each fat threshold field. */
3149#define ITERATE_FAT_THRESHOLDS() \\
3150  do { \\" >>fat.h
3151  for tmp_tn in $fat_thresholds; do
3152    tmp_field_name=`echo $tmp_tn | tr [[A-Z]] [[a-z]]`
3153    echo "    ITERATE ($tmp_tn, $tmp_field_name); \\" >>fat.h
3154  done
3155  echo "  } while (0)" >>fat.h
3156
3157  for tmp_dir in $fat_path; do
3158    CPUVEC_SETUP=
3159    THRESH_ASM_SETUP=
3160    echo "" >>fat.h
3161    GMP_FAT_SUFFIX(tmp_suffix, $tmp_dir)
3162
3163    # In order to keep names unique on a DOS 8.3 filesystem, use a prefix
3164    # (rather than a suffix) for the generated file names, and abbreviate.
3165    case $tmp_suffix in
3166      pentium)       tmp_prefix=p   ;;
3167      pentium_mmx)   tmp_prefix=pm  ;;
3168      p6_mmx)        tmp_prefix=p2  ;;
3169      p6_p3mmx)      tmp_prefix=p3  ;;
3170      pentium4)      tmp_prefix=p4  ;;
3171      pentium4_mmx)  tmp_prefix=p4m ;;
3172      pentium4_sse2) tmp_prefix=p4s ;;
3173      k6_mmx)        tmp_prefix=k6m ;;
3174      k6_k62mmx)     tmp_prefix=k62 ;;
3175      k7_mmx)        tmp_prefix=k7m ;;
3176      *)             tmp_prefix=$tmp_suffix ;;
3177    esac
3178
3179    # Extract desired thresholds from gmp-mparam.h file in this directory,
3180    # if present.
3181    tmp_mparam=$srcdir/mpn/$tmp_dir/gmp-mparam.h
3182    if test -f $tmp_mparam; then
3183      for tmp_tn in $fat_thresholds; do
3184        tmp_thresh=`sed -n "s/^#define $tmp_tn[ 	]*\\([0-9][0-9]*\\).*$/\\1/p" $tmp_mparam`
3185        if test -n "$tmp_thresh"; then
3186          THRESH_ASM_SETUP=["${THRESH_ASM_SETUP}define($tmp_tn,$tmp_thresh)
3187"]
3188          CPUVEC_SETUP="$CPUVEC_SETUP    decided_cpuvec.`echo $tmp_tn | tr [[A-Z]] [[a-z]]` = $tmp_thresh; \\
3189"
3190          eval tmp_limit=\$${tmp_tn}_LIMIT
3191          if test -z "$tmp_limit"; then
3192            tmp_limit=0
3193          fi
3194          if test $tmp_thresh -gt $tmp_limit; then
3195            eval ${tmp_tn}_LIMIT=$tmp_thresh
3196          fi
3197        fi
3198      done
3199    fi
3200
3201    for tmp_fn in $fat_functions; do
3202      GMP_MULFUNC_CHOICES
3203
3204      for tmp_base in $tmp_fn $tmp_mulfunc; do
3205        for tmp_ext in MPN_SUFFIXES; do
3206          tmp_file=$srcdir/mpn/$tmp_dir/$tmp_base.$tmp_ext
3207          if test -f $tmp_file; then
3208
3209	    # If the host uses a non-standard ABI, check if tmp_file supports it
3210	    #
3211	    if test -n "$GMP_NONSTD_ABI" && test $tmp_ext != "c"; then
3212	      abi=[`sed -n 's/^[ 	]*ABI_SUPPORT(\(.*\))/\1/p' $tmp_file `]
3213	      if echo "$abi" | grep -q "\\b${GMP_NONSTD_ABI}\\b"; then
3214		true
3215	      else
3216		continue
3217	      fi
3218	    fi
3219
3220            mpn_objects="$mpn_objects ${tmp_prefix}_$tmp_fn.lo"
3221            mpn_objs_in_libgmp="$mpn_objs_in_libgmp mpn/${tmp_prefix}_$tmp_fn.lo"
3222
3223            GMP_FILE_TO_FUNCTION(tmp_fbase,tmp_fn)
3224
3225            # carry-in variant, eg. divrem_1c or modexact_1c_odd
3226            case $tmp_fbase in
3227              *_1*) tmp_fbasec=`echo $tmp_fbase | sed 's/_1/_1c/'` ;;
3228              *)    tmp_fbasec=${tmp_fbase}c ;;
3229            esac
3230
3231            # Create a little file doing an include from srcdir.  The
3232            # OPERATION and renamings aren't all needed all the time, but
3233            # they don't hurt if unused.
3234            #
3235            # FIXME: Should generate these via config.status commands.
3236            # Would need them all in one AC_CONFIG_COMMANDS though, since
3237            # that macro doesn't accept a set of separate commands generated
3238            # by shell code.
3239            #
3240            case $tmp_ext in
3241              asm)
3242                # hide the d-n-l from autoconf's error checking
3243                tmp_d_n_l=d""nl
3244                echo ["$tmp_d_n_l  mpn_$tmp_fbase - from $tmp_dir directory for fat binary.
3245$tmp_d_n_l  Generated by configure - DO NOT EDIT.
3246
3247define(OPERATION_$tmp_fn)
3248define(__gmpn_$tmp_fbase, __gmpn_${tmp_fbase}_$tmp_suffix)
3249define(__gmpn_$tmp_fbasec,__gmpn_${tmp_fbasec}_${tmp_suffix})
3250define(__gmpn_preinv_${tmp_fbase},__gmpn_preinv_${tmp_fbase}_${tmp_suffix})
3251define(__gmpn_${tmp_fbase}_cps,__gmpn_${tmp_fbase}_cps_${tmp_suffix})
3252
3253$tmp_d_n_l  For k6 and k7 gcd_1 calling their corresponding mpn_modexact_1_odd
3254ifdef(\`__gmpn_modexact_1_odd',,
3255\`define(__gmpn_modexact_1_odd,__gmpn_modexact_1_odd_${tmp_suffix})')
3256
3257$THRESH_ASM_SETUP
3258include][($mpn_relative_top_srcdir/mpn/$tmp_dir/$tmp_base.asm)
3259"] >mpn/${tmp_prefix}_$tmp_fn.asm
3260                ;;
3261              c)
3262                echo ["/* mpn_$tmp_fbase - from $tmp_dir directory for fat binary.
3263   Generated by configure - DO NOT EDIT. */
3264
3265#define OPERATION_$tmp_fn 1
3266#define __gmpn_$tmp_fbase           __gmpn_${tmp_fbase}_$tmp_suffix
3267#define __gmpn_$tmp_fbasec          __gmpn_${tmp_fbasec}_${tmp_suffix}
3268#define __gmpn_preinv_${tmp_fbase}  __gmpn_preinv_${tmp_fbase}_${tmp_suffix}
3269#define __gmpn_${tmp_fbase}_cps     __gmpn_${tmp_fbase}_cps_${tmp_suffix}
3270
3271#include \"$mpn_relative_top_srcdir/mpn/$tmp_dir/$tmp_base.c\"
3272"] >mpn/${tmp_prefix}_$tmp_fn.c
3273                ;;
3274            esac
3275
3276            # Prototype, and append to CPUVEC_SETUP for this directory.
3277            echo "DECL_$tmp_fbase (__gmpn_${tmp_fbase}_$tmp_suffix);" >>fat.h
3278            CPUVEC_SETUP="$CPUVEC_SETUP    decided_cpuvec.$tmp_fbase = __gmpn_${tmp_fbase}_${tmp_suffix}; \\
3279"
3280            # Ditto for any preinv variant (preinv_divrem_1, preinv_mod_1).
3281            if grep "^PROLOGUE(mpn_preinv_$tmp_fn)" $tmp_file >/dev/null; then
3282              echo "DECL_preinv_$tmp_fbase (__gmpn_preinv_${tmp_fbase}_$tmp_suffix);" >>fat.h
3283              CPUVEC_SETUP="$CPUVEC_SETUP    decided_cpuvec.preinv_$tmp_fbase = __gmpn_preinv_${tmp_fbase}_${tmp_suffix}; \\
3284"
3285            fi
3286
3287            # Ditto for any mod_1...cps variant
3288            if grep "^PROLOGUE(mpn_${tmp_fbase}_cps)" $tmp_file >/dev/null; then
3289              echo "DECL_${tmp_fbase}_cps (__gmpn_${tmp_fbase}_cps_$tmp_suffix);" >>fat.h
3290              CPUVEC_SETUP="$CPUVEC_SETUP    decided_cpuvec.${tmp_fbase}_cps = __gmpn_${tmp_fbase}_cps_${tmp_suffix}; \\
3291"
3292            fi
3293          fi
3294        done
3295      done
3296    done
3297
3298    # Emit CPUVEC_SETUP for this directory
3299    echo "" >>fat.h
3300    echo "#define CPUVEC_SETUP_$tmp_suffix \\" >>fat.h
3301    echo "  do { \\" >>fat.h
3302    echo "$CPUVEC_SETUP  } while (0)" >>fat.h
3303  done
3304
3305  # Emit threshold limits
3306  echo "" >>fat.h
3307  for tmp_tn in $fat_thresholds; do
3308    eval tmp_limit=\$${tmp_tn}_LIMIT
3309    echo "#define ${tmp_tn}_LIMIT  $tmp_limit" >>fat.h
3310  done
3311fi
3312
3313
3314# Normal binary setups.
3315#
3316
3317for tmp_ext in MPN_SUFFIXES; do
3318  eval found_$tmp_ext=no
3319done
3320
3321for tmp_fn in $gmp_mpn_functions; do
3322  for tmp_ext in MPN_SUFFIXES; do
3323    test "$no_create" = yes || rm -f mpn/$tmp_fn.$tmp_ext
3324  done
3325
3326  # mpn_preinv_divrem_1 might have been provided by divrem_1.asm, likewise
3327  # mpn_preinv_mod_1 by mod_1.asm.
3328  case $tmp_fn in
3329  pre_divrem_1)
3330    if test "$HAVE_NATIVE_mpn_preinv_divrem_1" = yes; then continue; fi ;;
3331  pre_mod_1)
3332    if test "$HAVE_NATIVE_mpn_preinv_mod_1" = yes; then continue; fi ;;
3333  esac
3334
3335  GMP_MULFUNC_CHOICES
3336
3337  found=no
3338  for tmp_dir in $path; do
3339    for tmp_base in $tmp_fn $tmp_mulfunc; do
3340      for tmp_ext in MPN_SUFFIXES; do
3341        tmp_file=$srcdir/mpn/$tmp_dir/$tmp_base.$tmp_ext
3342        if test -f $tmp_file; then
3343
3344          # For a nails build, check if the file supports our nail bits.
3345          # Generic code always supports all nails.
3346          #
3347          # FIXME: When a multi-function file is selected to provide one of
3348          # the nails-neutral routines, like logops_n for and_n, the
3349          # PROLOGUE grepping will create HAVE_NATIVE_mpn_<foo> defines for
3350          # all functions in that file, even if they haven't all been
3351          # nailified.  Not sure what to do about this, it's only really a
3352          # problem for logops_n, and it's not too terrible to insist those
3353          # get nailified always.
3354          #
3355          if test $GMP_NAIL_BITS != 0 && test $tmp_dir != generic; then
3356            case $tmp_fn in
3357              and_n | ior_n | xor_n | andn_n | \
3358              copyi | copyd | \
3359              popcount | hamdist | \
3360              udiv | udiv_w_sdiv | umul | \
3361              cntlz | invert_limb)
3362                # these operations are either unaffected by nails or defined
3363                # to operate on full limbs
3364                ;;
3365              *)
3366                nails=[`sed -n 's/^[ 	]*NAILS_SUPPORT(\(.*\))/\1/p' $tmp_file `]
3367                for n in $nails; do
3368                  case $n in
3369                  *-*)
3370                    n_start=`echo "$n" | sed -n 's/\(.*\)-.*/\1/p'`
3371                    n_end=`echo "$n" | sed -n 's/.*-\(.*\)/\1/p'`
3372                    ;;
3373                  *)
3374                    n_start=$n
3375                    n_end=$n
3376                    ;;
3377                  esac
3378                  if test $GMP_NAIL_BITS -ge $n_start && test $GMP_NAIL_BITS -le $n_end; then
3379                    found=yes
3380                    break
3381                  fi
3382                done
3383                if test $found != yes; then
3384                  continue
3385                fi
3386                ;;
3387            esac
3388          fi
3389
3390	  # If the host uses a non-standard ABI, check if tmp_file supports it
3391	  #
3392	  if test -n "$GMP_NONSTD_ABI" && test $tmp_ext != "c"; then
3393	    abi=[`sed -n 's/^[ 	]*ABI_SUPPORT(\(.*\))/\1/p' $tmp_file `]
3394	    if echo "$abi" | grep -q "\\b${GMP_NONSTD_ABI}\\b"; then
3395	      true
3396	    else
3397	      continue
3398	    fi
3399	  fi
3400
3401          found=yes
3402          eval found_$tmp_ext=yes
3403
3404          if test $tmp_ext = c; then
3405            tmp_u='$U'
3406          else
3407            tmp_u=
3408          fi
3409
3410          mpn_objects="$mpn_objects $tmp_fn$tmp_u.lo"
3411          mpn_objs_in_libgmp="$mpn_objs_in_libgmp mpn/$tmp_fn$tmp_u.lo"
3412          AC_CONFIG_LINKS(mpn/$tmp_fn.$tmp_ext:mpn/$tmp_dir/$tmp_base.$tmp_ext)
3413          gmp_srclinks="$gmp_srclinks mpn/$tmp_fn.$tmp_ext"
3414
3415          # Duplicate AC_DEFINEs are harmless, so it doesn't matter
3416          # that multi-function files get grepped here repeatedly.
3417          # The PROLOGUE pattern excludes the optional second parameter.
3418          gmp_ep=[`
3419            sed -n 's/^[ 	]*MULFUNC_PROLOGUE(\(.*\))/\1/p' $tmp_file ;
3420            sed -n 's/^[ 	]*PROLOGUE(\([^,]*\).*)/\1/p' $tmp_file
3421          `]
3422          for gmp_tmp in $gmp_ep; do
3423            AC_DEFINE_UNQUOTED(HAVE_NATIVE_$gmp_tmp)
3424            eval HAVE_NATIVE_$gmp_tmp=yes
3425          done
3426
3427          case $tmp_fn in
3428          sqr_basecase) sqr_basecase_source=$tmp_file ;;
3429          esac
3430
3431          break
3432        fi
3433      done
3434      if test $found = yes; then break ; fi
3435    done
3436    if test $found = yes; then break ; fi
3437  done
3438
3439  if test $found = no; then
3440    for tmp_optional in $gmp_mpn_functions_optional; do
3441      if test $tmp_optional = $tmp_fn; then
3442        found=yes
3443      fi
3444    done
3445    if test $found = no; then
3446      AC_MSG_ERROR([no version of $tmp_fn found in path: $path])
3447    fi
3448  fi
3449done
3450
3451# All cycle counters are .asm files currently
3452if test -n "$SPEED_CYCLECOUNTER_OBJ"; then
3453  found_asm=yes
3454fi
3455
3456dnl  The following list only needs to have templates for those defines which
3457dnl  are going to be tested by the code, there's no need to have every
3458dnl  possible mpn routine.
3459
3460AH_VERBATIM([HAVE_NATIVE],
3461[/* Define to 1 each of the following for which a native (ie. CPU specific)
3462    implementation of the corresponding routine exists.  */
3463#undef HAVE_NATIVE_mpn_add_n
3464#undef HAVE_NATIVE_mpn_add_n_sub_n
3465#undef HAVE_NATIVE_mpn_add_nc
3466#undef HAVE_NATIVE_mpn_addaddmul_1msb0
3467#undef HAVE_NATIVE_mpn_addlsh1_n
3468#undef HAVE_NATIVE_mpn_addlsh2_n
3469#undef HAVE_NATIVE_mpn_addlsh_n
3470#undef HAVE_NATIVE_mpn_addlsh1_nc
3471#undef HAVE_NATIVE_mpn_addlsh2_nc
3472#undef HAVE_NATIVE_mpn_addlsh_nc
3473#undef HAVE_NATIVE_mpn_addlsh1_n_ip1
3474#undef HAVE_NATIVE_mpn_addlsh2_n_ip1
3475#undef HAVE_NATIVE_mpn_addlsh_n_ip1
3476#undef HAVE_NATIVE_mpn_addlsh1_nc_ip1
3477#undef HAVE_NATIVE_mpn_addlsh2_nc_ip1
3478#undef HAVE_NATIVE_mpn_addlsh_nc_ip1
3479#undef HAVE_NATIVE_mpn_addlsh1_n_ip2
3480#undef HAVE_NATIVE_mpn_addlsh2_n_ip2
3481#undef HAVE_NATIVE_mpn_addlsh_n_ip2
3482#undef HAVE_NATIVE_mpn_addlsh1_nc_ip2
3483#undef HAVE_NATIVE_mpn_addlsh2_nc_ip2
3484#undef HAVE_NATIVE_mpn_addlsh_nc_ip2
3485#undef HAVE_NATIVE_mpn_addmul_1c
3486#undef HAVE_NATIVE_mpn_addmul_2
3487#undef HAVE_NATIVE_mpn_addmul_3
3488#undef HAVE_NATIVE_mpn_addmul_4
3489#undef HAVE_NATIVE_mpn_addmul_5
3490#undef HAVE_NATIVE_mpn_addmul_6
3491#undef HAVE_NATIVE_mpn_addmul_7
3492#undef HAVE_NATIVE_mpn_addmul_8
3493#undef HAVE_NATIVE_mpn_addmul_2s
3494#undef HAVE_NATIVE_mpn_and_n
3495#undef HAVE_NATIVE_mpn_andn_n
3496#undef HAVE_NATIVE_mpn_bdiv_dbm1c
3497#undef HAVE_NATIVE_mpn_bdiv_q_1
3498#undef HAVE_NATIVE_mpn_pi1_bdiv_q_1
3499#undef HAVE_NATIVE_mpn_cnd_add_n
3500#undef HAVE_NATIVE_mpn_cnd_sub_n
3501#undef HAVE_NATIVE_mpn_com
3502#undef HAVE_NATIVE_mpn_copyd
3503#undef HAVE_NATIVE_mpn_copyi
3504#undef HAVE_NATIVE_mpn_div_qr_1n_pi1
3505#undef HAVE_NATIVE_mpn_div_qr_2
3506#undef HAVE_NATIVE_mpn_divexact_1
3507#undef HAVE_NATIVE_mpn_divexact_by3c
3508#undef HAVE_NATIVE_mpn_divrem_1
3509#undef HAVE_NATIVE_mpn_divrem_1c
3510#undef HAVE_NATIVE_mpn_divrem_2
3511#undef HAVE_NATIVE_mpn_gcd_1
3512#undef HAVE_NATIVE_mpn_hamdist
3513#undef HAVE_NATIVE_mpn_invert_limb
3514#undef HAVE_NATIVE_mpn_ior_n
3515#undef HAVE_NATIVE_mpn_iorn_n
3516#undef HAVE_NATIVE_mpn_lshift
3517#undef HAVE_NATIVE_mpn_lshiftc
3518#undef HAVE_NATIVE_mpn_lshsub_n
3519#undef HAVE_NATIVE_mpn_mod_1
3520#undef HAVE_NATIVE_mpn_mod_1_1p
3521#undef HAVE_NATIVE_mpn_mod_1c
3522#undef HAVE_NATIVE_mpn_mod_1s_2p
3523#undef HAVE_NATIVE_mpn_mod_1s_4p
3524#undef HAVE_NATIVE_mpn_mod_34lsub1
3525#undef HAVE_NATIVE_mpn_modexact_1_odd
3526#undef HAVE_NATIVE_mpn_modexact_1c_odd
3527#undef HAVE_NATIVE_mpn_mul_1
3528#undef HAVE_NATIVE_mpn_mul_1c
3529#undef HAVE_NATIVE_mpn_mul_2
3530#undef HAVE_NATIVE_mpn_mul_3
3531#undef HAVE_NATIVE_mpn_mul_4
3532#undef HAVE_NATIVE_mpn_mul_5
3533#undef HAVE_NATIVE_mpn_mul_6
3534#undef HAVE_NATIVE_mpn_mul_basecase
3535#undef HAVE_NATIVE_mpn_mullo_basecase
3536#undef HAVE_NATIVE_mpn_nand_n
3537#undef HAVE_NATIVE_mpn_nior_n
3538#undef HAVE_NATIVE_mpn_popcount
3539#undef HAVE_NATIVE_mpn_preinv_divrem_1
3540#undef HAVE_NATIVE_mpn_preinv_mod_1
3541#undef HAVE_NATIVE_mpn_redc_1
3542#undef HAVE_NATIVE_mpn_redc_2
3543#undef HAVE_NATIVE_mpn_rsblsh1_n
3544#undef HAVE_NATIVE_mpn_rsblsh2_n
3545#undef HAVE_NATIVE_mpn_rsblsh_n
3546#undef HAVE_NATIVE_mpn_rsblsh1_nc
3547#undef HAVE_NATIVE_mpn_rsblsh2_nc
3548#undef HAVE_NATIVE_mpn_rsblsh_nc
3549#undef HAVE_NATIVE_mpn_rsh1add_n
3550#undef HAVE_NATIVE_mpn_rsh1add_nc
3551#undef HAVE_NATIVE_mpn_rsh1sub_n
3552#undef HAVE_NATIVE_mpn_rsh1sub_nc
3553#undef HAVE_NATIVE_mpn_rshift
3554#undef HAVE_NATIVE_mpn_sqr_basecase
3555#undef HAVE_NATIVE_mpn_sqr_diagonal
3556#undef HAVE_NATIVE_mpn_sqr_diag_addlsh1
3557#undef HAVE_NATIVE_mpn_sub_n
3558#undef HAVE_NATIVE_mpn_sub_nc
3559#undef HAVE_NATIVE_mpn_sublsh1_n
3560#undef HAVE_NATIVE_mpn_sublsh2_n
3561#undef HAVE_NATIVE_mpn_sublsh_n
3562#undef HAVE_NATIVE_mpn_sublsh1_nc
3563#undef HAVE_NATIVE_mpn_sublsh2_nc
3564#undef HAVE_NATIVE_mpn_sublsh_nc
3565#undef HAVE_NATIVE_mpn_sublsh1_n_ip1
3566#undef HAVE_NATIVE_mpn_sublsh2_n_ip1
3567#undef HAVE_NATIVE_mpn_sublsh_n_ip1
3568#undef HAVE_NATIVE_mpn_sublsh1_nc_ip1
3569#undef HAVE_NATIVE_mpn_sublsh2_nc_ip1
3570#undef HAVE_NATIVE_mpn_sublsh_nc_ip1
3571#undef HAVE_NATIVE_mpn_submul_1c
3572#undef HAVE_NATIVE_mpn_tabselect
3573#undef HAVE_NATIVE_mpn_udiv_qrnnd
3574#undef HAVE_NATIVE_mpn_udiv_qrnnd_r
3575#undef HAVE_NATIVE_mpn_umul_ppmm
3576#undef HAVE_NATIVE_mpn_umul_ppmm_r
3577#undef HAVE_NATIVE_mpn_xor_n
3578#undef HAVE_NATIVE_mpn_xnor_n])
3579
3580
3581# Don't demand an m4 unless it's actually needed.
3582if test $found_asm = yes; then
3583  GMP_PROG_M4
3584  GMP_M4_M4WRAP_SPURIOUS
3585# else
3586# It's unclear why this m4-not-needed stuff was ever done.
3587#  if test -z "$M4" ; then
3588#    M4=m4-not-needed
3589#  fi
3590fi
3591
3592# Only do the GMP_ASM checks if there's a .S or .asm wanting them.
3593if test $found_asm = no && test $found_S = no; then
3594  gmp_asm_syntax_testing=no
3595fi
3596
3597if test "$gmp_asm_syntax_testing" != no; then
3598  GMP_ASM_TEXT
3599  GMP_ASM_DATA
3600  GMP_ASM_LABEL_SUFFIX
3601  GMP_ASM_GLOBL
3602  GMP_ASM_GLOBL_ATTR
3603  GMP_ASM_UNDERSCORE
3604  GMP_ASM_RODATA
3605  GMP_ASM_TYPE
3606  GMP_ASM_SIZE
3607  GMP_ASM_LSYM_PREFIX
3608  GMP_ASM_W32
3609  GMP_ASM_ALIGN_LOG
3610
3611  case $host in
3612    arm*-*-* | aarch64*-*-*)
3613      case $ABI in
3614        32)
3615	  GMP_INCLUDE_MPN(arm/arm-defs.m4) ;;
3616      esac
3617      ;;
3618    hppa*-*-*)
3619      # for both pa32 and pa64
3620      GMP_INCLUDE_MPN(pa32/pa-defs.m4)
3621      ;;
3622    IA64_PATTERN)
3623      GMP_ASM_IA64_ALIGN_OK
3624      ;;
3625    M68K_PATTERN)
3626      GMP_ASM_M68K_INSTRUCTION
3627      GMP_ASM_M68K_ADDRESSING
3628      GMP_ASM_M68K_BRANCHES
3629      ;;
3630    [powerpc*-*-* | power[3-9]-*-*])
3631      GMP_ASM_POWERPC_PIC_ALWAYS
3632      GMP_ASM_POWERPC_R_REGISTERS
3633      GMP_INCLUDE_MPN(powerpc32/powerpc-defs.m4)
3634
3635      # Check for Linux ELFv2 ABI
3636      AC_EGREP_CPP(yes,
3637[#if _CALL_ELF == 2
3638yes
3639#endif],
3640      [GMP_DEFINE_RAW(["define(<ELFv2_ABI>)"])])
3641
3642      case $host in
3643        *-*-aix*)
3644	  case $ABI in
3645	    mode64)      GMP_INCLUDE_MPN(powerpc64/aix.m4) ;;
3646            *)           GMP_INCLUDE_MPN(powerpc32/aix.m4) ;;
3647          esac
3648          ;;
3649        *-*-linux* | *-*-*bsd*)
3650	  case $ABI in
3651	    mode64)      GMP_INCLUDE_MPN(powerpc64/elf.m4) ;;
3652	    mode32 | 32) GMP_INCLUDE_MPN(powerpc32/elf.m4) ;;
3653          esac
3654          ;;
3655        *-*-darwin*)
3656	  case $ABI in
3657	    mode64)      GMP_INCLUDE_MPN(powerpc64/darwin.m4) ;;
3658	    mode32 | 32) GMP_INCLUDE_MPN(powerpc32/darwin.m4) ;;
3659          esac
3660          ;;
3661        *)
3662	  # Assume unrecognized operating system is the powerpc eABI
3663          GMP_INCLUDE_MPN(powerpc32/eabi.m4)
3664	  ;;
3665      esac
3666      ;;
3667    power*-*-aix*)
3668      GMP_INCLUDE_MPN(powerpc32/aix.m4)
3669      ;;
3670    *sparc*-*-*)
3671      case $ABI in
3672        64)
3673          GMP_ASM_SPARC_REGISTER
3674          ;;
3675      esac
3676      GMP_ASM_SPARC_GOTDATA
3677      GMP_ASM_SPARC_SHARED_THUNKS
3678      ;;
3679    X86_PATTERN | X86_64_PATTERN)
3680      GMP_ASM_ALIGN_FILL_0x90
3681      case $ABI in
3682        32)
3683          GMP_INCLUDE_MPN(x86/x86-defs.m4)
3684          AC_DEFINE(HAVE_HOST_CPU_FAMILY_x86)
3685          GMP_ASM_COFF_TYPE
3686          GMP_ASM_X86_GOT_UNDERSCORE
3687          GMP_ASM_X86_SHLDL_CL
3688	  case $enable_profiling in
3689	    prof | gprof)  GMP_ASM_X86_MCOUNT ;;
3690	  esac
3691	  case $host in
3692	    *-*-darwin*)
3693	      GMP_INCLUDE_MPN(x86/darwin.m4) ;;
3694	  esac
3695          ;;
3696        64|x32)
3697          GMP_INCLUDE_MPN(x86_64/x86_64-defs.m4)
3698          AC_DEFINE(HAVE_HOST_CPU_FAMILY_x86_64)
3699	  case $host in
3700	    *-*-darwin*)
3701	      GMP_INCLUDE_MPN(x86_64/darwin.m4) ;;
3702	    *-*-mingw* | *-*-cygwin)
3703	      GMP_INCLUDE_MPN(x86_64/dos64.m4) ;;
3704	    *-openbsd*)
3705	      GMP_DEFINE_RAW(["define(<OPENBSD>,1)"]) ;;
3706	    *-linux*)
3707	      GMP_DEFINE_RAW(["define(<LINUX>,1)"]) ;;
3708	  esac
3709          ;;
3710      esac
3711      ;;
3712  esac
3713fi
3714
3715# For --enable-minithres, prepend "minithres" to path so that its special
3716# gmp-mparam.h will be used.
3717if test $enable_minithres = yes; then
3718  path="minithres $path"
3719fi
3720
3721# Create link for gmp-mparam.h.
3722gmp_mparam_source=
3723for gmp_mparam_dir in $path; do
3724  test "$no_create" = yes || rm -f gmp-mparam.h
3725  tmp_file=$srcdir/mpn/$gmp_mparam_dir/gmp-mparam.h
3726  if test -f $tmp_file; then
3727    AC_CONFIG_LINKS(gmp-mparam.h:mpn/$gmp_mparam_dir/gmp-mparam.h)
3728    gmp_srclinks="$gmp_srclinks gmp-mparam.h"
3729    gmp_mparam_source=$tmp_file
3730    break
3731  fi
3732done
3733if test -z "$gmp_mparam_source"; then
3734  AC_MSG_ERROR([no version of gmp-mparam.h found in path: $path])
3735fi
3736
3737# For a helpful message from tune/tuneup.c
3738gmp_mparam_suggest=$gmp_mparam_source
3739if test "$gmp_mparam_dir" = generic; then
3740  for i in $path; do break; done
3741  if test "$i" != generic; then
3742    gmp_mparam_suggest="new file $srcdir/mpn/$i/gmp-mparam.h"
3743  fi
3744fi
3745AC_DEFINE_UNQUOTED(GMP_MPARAM_H_SUGGEST, "$gmp_mparam_source",
3746[The gmp-mparam.h file (a string) the tune program should suggest updating.])
3747
3748
3749# Copy relevant parameters from gmp-mparam.h to config.m4.
3750# We only do this for parameters that are used by some assembly files.
3751# Fat binaries do this on a per-file basis, so skip in that case.
3752#
3753if test -z "$fat_path"; then
3754  for i in SQR_TOOM2_THRESHOLD BMOD_1_TO_MOD_1_THRESHOLD SHLD_SLOW SHRD_SLOW; do
3755    value=`sed -n 's/^#define '$i'[ 	]*\([0-9][0-9]*\).*$/\1/p' $gmp_mparam_source`
3756    if test -n "$value"; then
3757      GMP_DEFINE_RAW(["define(<$i>,<$value>)"])
3758    fi
3759  done
3760fi
3761
3762
3763# Sizes of some types, needed at preprocessing time.
3764#
3765# FIXME: The assumption that GMP_LIMB_BITS is 8*sizeof(mp_limb_t) might
3766# be slightly rash, but it's true everywhere we know of and ought to be true
3767# of any sensible system.  In a generic C build, grepping LONG_BIT out of
3768# <limits.h> might be an alternative, for maximum portability.
3769#
3770AC_CHECK_SIZEOF(void *)
3771AC_CHECK_SIZEOF(unsigned short)
3772AC_CHECK_SIZEOF(unsigned)
3773AC_CHECK_SIZEOF(unsigned long)
3774AC_CHECK_SIZEOF(mp_limb_t, , GMP_INCLUDE_GMP_H)
3775if test "$ac_cv_sizeof_mp_limb_t" = 0; then
3776  AC_MSG_ERROR([Oops, mp_limb_t doesn't seem to work])
3777fi
3778AC_SUBST(GMP_LIMB_BITS, `expr 8 \* $ac_cv_sizeof_mp_limb_t`)
3779GMP_DEFINE_RAW(["define(<SIZEOF_UNSIGNED>,<$ac_cv_sizeof_unsigned>)"])
3780
3781# Check compiler limb size matches gmp-mparam.h
3782#
3783# FIXME: Some of the cycle counter objects in the tune directory depend on
3784# the size of ulong, it'd be possible to check that here, though a mismatch
3785# probably wouldn't want to be fatal, none of the libgmp assembler code
3786# depends on ulong.
3787#
3788mparam_bits=[`sed -n 's/^#define GMP_LIMB_BITS[ 	][ 	]*\([0-9]*\).*$/\1/p' $gmp_mparam_source`]
3789if test -n "$mparam_bits" && test "$mparam_bits" -ne $GMP_LIMB_BITS; then
3790  if test "$test_CFLAGS" = set; then
3791    AC_MSG_ERROR([Oops, mp_limb_t is $GMP_LIMB_BITS bits, but the assembler code
3792in this configuration expects $mparam_bits bits.
3793You appear to have set \$CFLAGS, perhaps you also need to tell GMP the
3794intended ABI, see "ABI and ISA" in the manual.])
3795  else
3796    AC_MSG_ERROR([Oops, mp_limb_t is $GMP_LIMB_BITS bits, but the assembler code
3797in this configuration expects $mparam_bits bits.])
3798  fi
3799fi
3800
3801GMP_DEFINE_RAW(["define(<GMP_LIMB_BITS>,$GMP_LIMB_BITS)"])
3802GMP_DEFINE_RAW(["define(<GMP_NAIL_BITS>,$GMP_NAIL_BITS)"])
3803GMP_DEFINE_RAW(["define(<GMP_NUMB_BITS>,eval(GMP_LIMB_BITS-GMP_NAIL_BITS))"])
3804
3805
3806AC_SUBST(mpn_objects)
3807AC_SUBST(mpn_objs_in_libgmp)
3808AC_SUBST(gmp_srclinks)
3809
3810
3811# A recompiled sqr_basecase for use in the tune program, if necessary.
3812TUNE_SQR_OBJ=
3813test -d tune || mkdir tune
3814case $sqr_basecase_source in
3815  *.asm)
3816    sqr_max=[`sed -n 's/^def...(SQR_TOOM2_THRESHOLD_MAX, *\([0-9]*\))/\1/p' $sqr_basecase_source`]
3817    if test -n "$sqr_max"; then
3818      TUNE_SQR_OBJ=sqr_asm.o
3819      AC_DEFINE_UNQUOTED(TUNE_SQR_TOOM2_MAX,$sqr_max,
3820      [Maximum size the tune program can test for SQR_TOOM2_THRESHOLD])
3821    fi
3822    cat >tune/sqr_basecase.c <<EOF
3823/* not sure that an empty file can compile, so put in a dummy */
3824int sqr_basecase_dummy;
3825EOF
3826    ;;
3827  *.c)
3828    TUNE_SQR_OBJ=
3829    AC_DEFINE(TUNE_SQR_TOOM2_MAX,SQR_TOOM2_MAX_GENERIC)
3830    cat >tune/sqr_basecase.c <<EOF
3831#define TUNE_PROGRAM_BUILD 1
3832#define TUNE_PROGRAM_BUILD_SQR 1
3833#include "mpn/sqr_basecase.c"
3834EOF
3835    ;;
3836esac
3837AC_SUBST(TUNE_SQR_OBJ)
3838
3839
3840# Configs for demos/pexpr.c.
3841#
3842AC_CONFIG_FILES(demos/pexpr-config.h:demos/pexpr-config-h.in)
3843GMP_SUBST_CHECK_FUNCS(clock, cputime, getrusage, gettimeofday, sigaction, sigaltstack, sigstack)
3844GMP_SUBST_CHECK_HEADERS(sys/resource.h)
3845AC_CHECK_TYPES([stack_t], HAVE_STACK_T_01=1, HAVE_STACK_T_01=0,
3846               [#include <signal.h>])
3847AC_SUBST(HAVE_STACK_T_01)
3848
3849# Configs for demos/calc directory
3850#
3851# AC_SUBST+AC_CONFIG_FILES is used for calc-config.h, rather than AC_DEFINE+
3852# AC_CONFIG_HEADERS, since with the latter automake (1.8) will then put the
3853# directory (ie. demos/calc) into $(DEFAULT_INCLUDES) for every Makefile.in,
3854# which would look very strange.
3855#
3856# -lcurses is required by libreadline.  On a typical SVR4 style system this
3857# normally doesn't have to be given explicitly, since libreadline.so will
3858# have a NEEDED record for it.  But if someone for some reason is using only
3859# a static libreadline.a then we must give -lcurses.  Readline (as of
3860# version 4.3) doesn't use libtool, so we can't rely on a .la to cover
3861# necessary dependencies.
3862#
3863# On a couple of systems we've seen libreadline available, but the headers
3864# not in the default include path, so check for readline/readline.h.  We've
3865# also seen readline/history.h missing, not sure if that's just a broken
3866# install or a very old version, but check that too.
3867#
3868AC_CONFIG_FILES(demos/calc/calc-config.h:demos/calc/calc-config-h.in)
3869LIBCURSES=
3870if test $with_readline != no; then
3871  AC_CHECK_LIB(ncurses, tputs, [LIBCURSES=-lncurses],
3872    [AC_CHECK_LIB(curses, tputs, [LIBCURSES=-lcurses])])
3873fi
3874AC_SUBST(LIBCURSES)
3875use_readline=$with_readline
3876if test $with_readline = detect; then
3877  use_readline=no
3878  AC_CHECK_LIB(readline, readline,
3879    [AC_CHECK_HEADER(readline/readline.h,
3880      [AC_CHECK_HEADER(readline/history.h, use_readline=yes)])],
3881    , $LIBCURSES)
3882  AC_MSG_CHECKING(readline detected)
3883  AC_MSG_RESULT($use_readline)
3884fi
3885if test $use_readline = yes; then
3886  AC_SUBST(WITH_READLINE_01, 1)
3887  AC_SUBST(LIBREADLINE, -lreadline)
3888else
3889  WITH_READLINE_01=0
3890fi
3891AC_PROG_YACC
3892AM_PROG_LEX
3893
3894# Configs for demos/expr directory
3895#
3896# Libtool already runs an AC_CHECK_TOOL for ranlib, but we give
3897# AC_PROG_RANLIB anyway since automake is supposed to complain if it's not
3898# called.  (Automake 1.8.4 doesn't, at least not when the only library is in
3899# an EXTRA_LIBRARIES.)
3900#
3901AC_PROG_RANLIB
3902
3903
3904# Create config.m4.
3905GMP_FINISH
3906
3907# Create Makefiles
3908# FIXME: Upcoming version of autoconf/automake may not like broken lines.
3909#        Right now automake isn't accepting the new AC_CONFIG_FILES scheme.
3910
3911AC_OUTPUT(Makefile							\
3912  mpf/Makefile mpn/Makefile mpq/Makefile				\
3913  mpz/Makefile printf/Makefile scanf/Makefile rand/Makefile cxx/Makefile \
3914  tests/Makefile tests/devel/Makefile					\
3915  tests/mpf/Makefile tests/mpn/Makefile tests/mpq/Makefile		\
3916  tests/mpz/Makefile tests/rand/Makefile tests/misc/Makefile		\
3917  tests/cxx/Makefile							\
3918  doc/Makefile tune/Makefile						\
3919  demos/Makefile demos/calc/Makefile demos/expr/Makefile		\
3920  gmp.h:gmp-h.in)
3921
3922AC_MSG_NOTICE([summary of build options:
3923
3924  Version:           ${PACKAGE_STRING}
3925  Host type:         ${host}
3926  ABI:               ${ABI}
3927  Install prefix:    ${prefix}
3928  Compiler:          ${CC}
3929  Static libraries:  ${enable_static}
3930  Shared libraries:  ${enable_shared}
3931])
3932
3933if test x$cross_compiling = xyes ; then
3934   case "$host" in
3935     *-*-mingw* | *-*-cygwin)
3936     if test x$ABI = x64 ; then
3937	AC_MSG_NOTICE([If wine64 is installed, use make check TESTS_ENVIRONMENT=wine64.])
3938     else
3939	AC_MSG_NOTICE([If wine is installed, use make check TESTS_ENVIRONMENT=wine.])
3940     fi
3941     ;;
3942   esac
3943fi
3944