1AC_DEFUN([AX_GCC_ARCHFLAG],
2[AC_REQUIRE([AC_PROG_CC])
3
4AC_ARG_WITH(gcc-arch, [AC_HELP_STRING([--with-gcc-arch=<arch>], [use architecture <arch> for gcc -march/-mtune, instead of guessing])],
5        ax_gcc_arch=$withval, ax_gcc_arch=yes)
6
7AC_MSG_CHECKING([for gcc architecture flag])
8AC_MSG_RESULT([])
9AC_CACHE_VAL(ax_cv_gcc_archflag,
10[
11ax_cv_gcc_archflag="unknown"
12
13if test "$GCC" = yes; then
14
15if test "x$ax_gcc_arch" = xyes; then
16ax_gcc_arch=""
17if test "$cross_compiling" = no; then
18case $host_cpu in
19  i[[3456]]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
20     AX_GCC_X86_CPUID(0)
21     AX_GCC_X86_CPUID(1)
22     case $ax_cv_gcc_x86_cpuid_0 in
23       *:756e6547:*:*) # Intel
24          case $ax_cv_gcc_x86_cpuid_1 in
25            *5[[48]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
26            *5??:*:*:*) ax_gcc_arch=pentium ;;
27            *6[[3456]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
28            *6a?:*[[01]]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
29            *6a?:*[[234]]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
30            *6[[9d]]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
31            *6[[78b]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
32            *6??:*:*:*) ax_gcc_arch=pentiumpro ;;
33            *f3[[347]]:*:*:*|*f4[1347]:*:*:*)
34                case $host_cpu in
35                  x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
36                  *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
37                esac ;;
38            *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
39          esac ;;
40       *:68747541:*:*) # AMD
41          case $ax_cv_gcc_x86_cpuid_1 in
42            *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;;
43            *5[[8d]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;;
44            *5[[9]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;;
45            *60?:*:*:*) ax_gcc_arch=k7 ;;
46            *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;;
47            *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;;
48            *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;;
49            *6[[68a]]?:*:*:*)
50               AX_GCC_X86_CPUID(0x80000006) # L2 cache size
51               case $ax_cv_gcc_x86_cpuid_0x80000006 in
52                 *:*:*[[1-9a-f]]??????:*) # (L2 = ecx >> 16) >= 256
53                        ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
54                 *) ax_gcc_arch="athlon-4 athlon k7" ;;
55               esac ;;
56            *f[[4cef8b]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
57            *f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
58            *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
59            *f??:*:*:*) ax_gcc_arch="k8" ;;
60          esac ;;
61        *:746e6543:*:*) # IDT
62           case $ax_cv_gcc_x86_cpuid_1 in
63             *54?:*:*:*) ax_gcc_arch=winchip-c6 ;;
64             *58?:*:*:*) ax_gcc_arch=winchip2 ;;
65             *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;;
66             *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;;
67           esac ;;
68     esac
69     if test x"$ax_gcc_arch" = x; then # fallback
70        case $host_cpu in
71          i586*) ax_gcc_arch=pentium ;;
72          i686*) ax_gcc_arch=pentiumpro ;;
73        esac
74     fi
75     ;;
76
77  sparc*)
78     AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/])
79     cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null`
80     cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters`
81     case $cputype in
82         *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;;
83         *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;;
84         *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;;
85         *supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;;
86         *hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;;
87         *cypress*) ax_gcc_arch=cypress ;;
88     esac ;;
89
90  alphaev5) ax_gcc_arch=ev5 ;;
91  alphaev56) ax_gcc_arch=ev56 ;;
92  alphapca56) ax_gcc_arch="pca56 ev56" ;;
93  alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;;
94  alphaev6) ax_gcc_arch=ev6 ;;
95  alphaev67) ax_gcc_arch=ev67 ;;
96  alphaev68) ax_gcc_arch="ev68 ev67" ;;
97  alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;;
98  alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;;
99  alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;;
100
101  powerpc*)
102     cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null`
103     cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'`
104     case $cputype in
105       *750*) ax_gcc_arch="750 G3" ;;
106       *740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;;
107       *74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;;
108       *74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;;
109       *970*) ax_gcc_arch="970 G5 power4";;
110       *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";;
111       *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";;
112       603ev|8240) ax_gcc_arch="$cputype 603e 603";;
113       *) ax_gcc_arch=$cputype ;;
114     esac
115     ax_gcc_arch="$ax_gcc_arch powerpc"
116     ;;
117esac
118fi # not cross-compiling
119fi # guess arch
120
121if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then
122for arch in $ax_gcc_arch; do
123  if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code
124    flags="-mtune=$arch"
125    # -mcpu=$arch and m$arch generate nonportable code on every arch except
126    # x86.  And some other arches (e.g. Alpha) don't accept -mtune.  Grrr.
127    case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac
128  else
129    flags="-march=$arch -mcpu=$arch -m$arch"
130  fi
131  for flag in $flags; do
132    AX_CHECK_COMPILER_FLAGS($flag, [ax_cv_gcc_archflag=$flag; break])
133  done
134  test "x$ax_cv_gcc_archflag" = xunknown || break
135done
136fi
137
138fi # $GCC=yes
139])
140AC_MSG_CHECKING([for gcc architecture flag])
141AC_MSG_RESULT($ax_cv_gcc_archflag)
142if test "x$ax_cv_gcc_archflag" = xunknown; then
143  m4_default([$3],:)
144else
145  m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"])
146fi
147])
148
149