resetting manifest requested domain to floor
[platform/upstream/gmp.git] / config.guess
1 #! /bin/sh
2 #
3 # GMP config.guess wrapper.
4
5
6 # Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2011, 2012 Free
7 # Software Foundation, Inc.
8 #
9 # This file is part of the GNU MP Library.
10 #
11 # The GNU MP Library is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU Lesser General Public License as published
13 # by the Free Software Foundation; either version 3 of the License, or (at
14 # your option) any later version.
15 #
16 # The GNU MP Library is distributed in the hope that it will be useful, but
17 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
19 # License for more details.
20 #
21 # You should have received a copy of the GNU Lesser General Public License
22 # along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
23
24
25 # Usage: config.guess
26 #
27 # Print the host system CPU-VENDOR-OS.
28 #
29 # configfsf.guess is run and its guess then sharpened up to take advantage
30 # of the finer grained CPU types that GMP knows.
31
32
33 # Expect to find configfsf.guess in the same directory as this config.guess
34 configfsf_guess="`echo \"$0\" | sed 's/config.guess$/configfsf.guess/'`"
35 if test "$configfsf_guess" = "$0"; then
36   echo "Cannot derive configfsf.guess from $0" 1>&2
37   exit 1
38 fi
39 if test -f "$configfsf_guess"; then
40   :
41 else
42   echo "$configfsf_guess not found" 1>&2
43   exit 1
44 fi
45
46 # Setup a $SHELL with which to run configfsf.guess, using the same
47 # $CONFIG_SHELL or /bin/sh as autoconf does when running config.guess
48 SHELL=${CONFIG_SHELL-/bin/sh}
49
50 # Identify ourselves on --version, --help or errors
51 if test $# != 0; then
52   echo "(GNU MP wrapped config.guess)"
53   $SHELL $configfsf_guess "$@"
54   exit 1
55 fi
56
57 guess_full=`$SHELL $configfsf_guess`
58 if test $? != 0; then
59   exit 1
60 fi
61
62 guess_cpu=`echo "$guess_full" | sed 's/-.*$//'`
63 guess_rest=`echo "$guess_full" | sed 's/^[^-]*//'`
64 exact_cpu=
65
66
67 # -------------------------------------------------------------------------
68 # The following should look at the current guess and probe the system to
69 # establish a better guess in exact_cpu.  Leave exact_cpu empty if probes
70 # can't be done, or don't work.
71 #
72 # When a number of probes are done, test -z "$exact_cpu" can be used instead
73 # of putting each probe under an "else" of the preceeding.  That can stop
74 # the code getting horribly nested and marching off the right side of the
75 # screen.
76
77 # Note that when a compile-and-link is done in one step we need to remove .o
78 # files, since lame C compilers generate these even when not asked.
79 #
80
81 dummy=dummy-$$
82 trap 'rm -f $dummy.c $dummy.o $dummy.core $dummy ${dummy}1.s ${dummy}2.c ; exit 1' 1 2 15
83
84 # Use $HOST_CC if defined. $CC may point to a cross-compiler
85 if test x"$CC_FOR_BUILD" = x; then
86   if test x"$HOST_CC" != x; then
87     CC_FOR_BUILD="$HOST_CC"
88   else
89     if test x"$CC" != x; then
90       CC_FOR_BUILD="$CC"
91     else
92       echo 'dummy(){}' >$dummy.c
93       for c in cc gcc c89 c99; do
94           ($c $dummy.c -c) >/dev/null 2>&1
95           if test $? = 0; then
96               CC_FOR_BUILD="$c"; break
97           fi
98       done
99       rm -f $dummy.c $dummy.o
100       if test x"$CC_FOR_BUILD" = x; then
101         CC_FOR_BUILD=no_compiler_found
102       fi
103     fi
104   fi
105 fi
106
107
108 case "$guess_full" in
109
110 alpha-*-*)
111   # configfsf.guess detects exact alpha cpu types for OSF and GNU/Linux, but
112   # not for *BSD and other systems.  We try to get an exact type for any
113   # plain "alpha" it leaves.
114   #
115   # configfsf.guess used to have a block of code not unlike this, but these
116   # days does its thing with Linux kernel /proc/cpuinfo or OSF psrinfo.
117   #
118   cat <<EOF >$dummy.s
119         .data
120 Lformat:
121         .byte 37,100,45,37,120,10,0     # "%d-%x\n"
122         .text
123         .globl main
124         .align 4
125         .ent main
126 main:
127         .frame \$30,16,\$26,0
128         ldgp \$29,0(\$27)
129         .prologue 1
130         .long 0x47e03d91 # implver \$17
131         lda \$2,-1
132         .long 0x47e20c21 # amask \$2,\$1
133         lda \$16,Lformat
134         not \$1,\$18
135         jsr \$26,printf
136         ldgp \$29,0(\$26)
137         mov 0,\$16
138         jsr \$26,exit
139         .end main
140 EOF
141   $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
142   if test "$?" = 0 ; then
143     case `./$dummy` in
144     0-0)        exact_cpu=alpha      ;;
145     1-0)        exact_cpu=alphaev5   ;;
146     1-1)        exact_cpu=alphaev56  ;;
147     1-101)      exact_cpu=alphapca56 ;;
148     2-303)      exact_cpu=alphaev6   ;;
149     2-307)      exact_cpu=alphaev67  ;;
150     2-1307)     exact_cpu=alphaev68  ;;
151     esac
152   fi
153   rm -f $dummy.s $dummy.o $dummy
154   ;;
155
156 arm*-*-*)
157   cpu_code=`sed -n 's/^CPU part.*\(0x.*\)$/\1/p' /proc/cpuinfo 2>/dev/null`
158   case "$cpu_code" in
159       0x210)    exact_cpu="armxscale";;         # v5 pxa250
160       0x290)    exact_cpu="armxscale";;         # v5 pxa260
161       0x2d0)    exact_cpu="armxscale";;         # v5 pxa255
162       0x2d0)    exact_cpu="armxscale";;         # v5 pxa261
163       0x2d0)    exact_cpu="armxscale";;         # v5 pxa262
164       0x411)    exact_cpu="armxscale";;         # v5 pxa270
165       0x915)    exact_cpu="armti915t";;         # v?
166       0x925)    exact_cpu="armti925t";;         # v?
167       0x926)    exact_cpu="arm926";;            # v5
168       0x946)    exact_cpu="arm946";;            # v5
169       0x966)    exact_cpu="arm966";;            # v5
170       0xa11)    exact_cpu="armsa1";;            # v4 strongarm/sa1100
171       0xa26)    exact_cpu="arm1026";;           # v5
172       0xb02)    exact_cpu="arm11mpcore";;       # v6
173       0xb11)    exact_cpu="armsa1";;            # v4 strongarm/sa1110
174       0xb36)    exact_cpu="arm1136";;           # v6
175       0xb56)    exact_cpu="arm1156";;           # v6t2
176       0xb76)    exact_cpu="arm1176";;           # v6
177       0xc05)    exact_cpu="armcortexa5";;       # v7a
178       0xc08)    exact_cpu="armcortexa8";;       # v7a
179       0xc09)    exact_cpu="armcortexa9";;       # v7a
180       0xc0f)    exact_cpu="armcortexa15";;      # v7a
181       0xc14)    exact_cpu="armcortexr4";;       # v7r
182       0xc15)    exact_cpu="armcortexr5";;       # v7r
183       0xc23)    exact_cpu="armcortexm3";;       # v7m
184   esac
185   ;;
186
187 ia64*-*-*)
188   # CPUID[3] bits 24 to 31 is the processor family.  itanium2 is documented
189   # as 0x1f, plain itanium has been seen returning 0x07 on two systems, but
190   # haven't found any documentation on it as such.
191   #
192   # Defining both getcpuid and _getcpuid lets us ignore whether the system
193   # expects underscores or not.
194   #
195   # "unsigned long long" is always 64 bits, in fact on hpux in ilp32 mode
196   # (which is the default there), it's the only 64-bit type.
197   #
198   cat >${dummy}a.s <<EOF
199         .text
200         .global _getcpuid
201         .proc   _getcpuid
202 _getcpuid:
203         mov     r8 = CPUID[r32] ;;
204         br.ret.sptk.many rp ;;
205         .endp   _getcpuid
206         .global getcpuid
207         .proc   getcpuid
208 getcpuid:
209         mov     r8 = CPUID[r32] ;;
210         br.ret.sptk.many rp ;;
211         .endp   getcpuid
212 EOF
213   cat >${dummy}b.c <<EOF
214 #include <stdio.h>
215 unsigned long long getcpuid ();
216 int
217 main ()
218 {
219   if (getcpuid(0LL) == 0x49656E69756E6547LL && getcpuid(1LL) == 0x6C65746ELL)
220     {
221       /* "GenuineIntel" */
222       switch ((getcpuid(3LL) >> 24) & 0xFF) {
223       case 0x07: puts ("itanium");  break;
224       case 0x1F: puts ("itanium2"); break; /* McKinley, Madison */
225       case 0x20: puts ("itanium2"); break; /* Montecito */
226       }
227     }
228   return 0;
229 }
230 EOF
231   if $CC_FOR_BUILD ${dummy}a.s ${dummy}b.c -o $dummy >/dev/null 2>&1; then
232     exact_cpu=`./$dummy`
233   fi
234   rm -f ${dummy}a.s ${dummy}a.o ${dummy}b.c ${dummy}b.o $dummy $dummy.core core
235   ;;
236
237 mips-*-irix[6789]*)
238   # IRIX 6 and up always has a 64-bit mips cpu
239   exact_cpu=mips64
240   ;;
241
242 m68k-*-*)
243   # NetBSD (and presumably other *BSD) "sysctl hw.model" gives for example
244   #   hw.model = Apple Macintosh Quadra 610  (68040)
245   exact_cpu=`(sysctl hw.model) 2>/dev/null | sed -n 's/^.*\(680[012346]0\).*$/m\1/p'`
246   if test -z "$exact_cpu"; then
247     # Linux kernel 2.2 gives for example "CPU: 68020" (tabs in between).
248     exact_cpu=`sed -n 's/^CPU:.*\(680[012346]0\).*$/m\1/p' /proc/cpuinfo 2>/dev/null`
249   fi
250   if test -z "$exact_cpu"; then
251     # Try: movel #0,%d0; rts
252     # This is to check the compiler and our asm code works etc, before
253     # assuming failures below indicate cpu characteristics.
254     # .byte is used to avoid problems with assembler syntax variations.
255     # For testing, provoke failures by adding "illegal" possibly as
256     # ".byte 0x4A, 0xFC"
257     cat >$dummy.s <<EOF
258         .text
259         .globl main
260         .globl _main
261 main:
262 _main:
263         .byte   0x70, 0x00
264         .byte   0x4e, 0x75
265 EOF
266     if ($CC_FOR_BUILD $dummy.s -o $dummy && ./$dummy) >/dev/null 2>&1; then
267
268       # $SHELL -c is used to execute ./$dummy below, since (./$dummy)
269       # 2>/dev/null still prints the SIGILL message on some shells.
270       #
271         # Try: movel #0,%d0
272         #      rtd #0
273         cat >$dummy.s <<EOF
274         .text
275         .globl main
276         .globl _main
277 main:
278 _main:
279         .byte   0x70, 0x00
280         .byte   0x4e, 0x74, 0x00, 0x00
281 EOF
282         if $CC_FOR_BUILD $dummy.s -o $dummy >/dev/null 2>&1; then
283           $SHELL -c ./$dummy >/dev/null 2>&1
284           if test $? != 0; then
285             exact_cpu=m68000    # because rtd didn't work
286           fi
287         fi
288       #
289
290       if test -z "$exact_cpu"; then
291         # Try: trapf
292         #      movel #0,%d0
293         #      rts
294         # Another possibility for identifying 68000 and 68010 is the
295         # different value stored by "movem a0,(a0)+"
296         cat >$dummy.s <<EOF
297         .text
298         .globl main
299         .globl _main
300 main:
301 _main:
302         .byte   0x51, 0xFC
303         .byte   0x70, 0x00
304         .byte   0x4e, 0x75
305 EOF
306         if $CC_FOR_BUILD $dummy.s -o $dummy >/dev/null 2>&1; then
307           $SHELL -c ./$dummy >/dev/null 2>&1
308           if test $? != 0; then
309             exact_cpu=m68010    # because trapf didn't work
310           fi
311         fi
312       fi
313
314       if test -z "$exact_cpu"; then
315         # Try: bfffo %d1{0:31},%d0
316         #      movel #0,%d0
317         #      rts
318         cat >$dummy.s <<EOF
319         .text
320         .globl main
321         .globl _main
322 main:
323 _main:
324         .byte   0xED, 0xC1, 0x00, 0x1F
325         .byte   0x70, 0x00
326         .byte   0x4e, 0x75
327 EOF
328         if $CC_FOR_BUILD $dummy.s -o $dummy >/dev/null 2>&1; then
329           $SHELL -c ./$dummy >/dev/null 2>&1
330           if test $? != 0; then
331             exact_cpu=m68360  # cpu32, because bfffo didn't work
332           fi
333         fi
334       fi
335
336       if test -z "$exact_cpu"; then
337         # FIXME: Now we know 68020 or up, but how to detect 030, 040 and 060?
338         exact_cpu=m68020
339       fi
340     fi
341     rm -f $dummy.s $dummy.o $dummy $dummy.core core
342   fi
343   if test -z "$exact_cpu"; then
344     case "$guess_full" in
345       *-*-next* | *-*-openstep*)  # NeXTs are 68020 or better
346         exact_cpu=m68020 ;;
347     esac
348   fi
349   ;;
350
351
352 rs6000-*-* | powerpc*-*-*)
353   # Enhancement: On MacOS the "machine" command prints for instance
354   # "ppc750".  Interestingly on powerpc970-apple-darwin6.8.5 it prints
355   # "ppc970" where there's no actual #define for 970 from NXGetLocalArchInfo
356   # (as noted below).  But the man page says the command is still "under
357   # development", so it doesn't seem wise to use it just yet, not while
358   # there's an alternative.
359   #
360   # Try to read the PVR.  mfpvr is a protected instruction, NetBSD, MacOS
361   # and AIX don't allow it in user mode, but the Linux kernel does.
362   #
363   # Using explicit bytes for mfpvr avoids worrying about assembler syntax
364   # and underscores.  "char"s are used instead of "int"s to avoid worrying
365   # whether sizeof(int)==4 or if it's the right endianness.
366   #
367   # Note this is no good on AIX, since a C function there is the address of
368   # a function descriptor, not actual code.  But this doesn't matter since
369   # AIX doesn't allow mfpvr anyway.
370   #
371   cat >$dummy.c <<\EOF
372 #include <stdio.h>
373 struct {
374   int   n;  /* force 4-byte alignment */
375   char  a[8];
376 } getpvr = {
377   0,
378   {
379     0x7c, 0x7f, 0x42, 0xa6,  /* mfpvr r3 */
380     0x4e, 0x80, 0x00, 0x20,  /* blr      */
381   }
382 };
383 int
384 main ()
385 {
386   unsigned  (*fun)();
387   unsigned  pvr;
388
389   /* a separate "fun" variable is necessary for gcc 2.95.2 on MacOS,
390      it gets a compiler error on a combined cast and call */
391   fun = (unsigned (*)()) getpvr.a;
392   pvr = (*fun) ();
393
394   switch (pvr >> 16) {
395   case 0x0001: puts ("powerpc601");  break;
396   case 0x0003: puts ("powerpc603");  break;
397   case 0x0004: puts ("powerpc604");  break;
398   case 0x0006: puts ("powerpc603e"); break;
399   case 0x0007: puts ("powerpc603e"); break;  /* 603ev */
400   case 0x0008: puts ("powerpc750");  break;
401   case 0x0009: puts ("powerpc604e"); break;
402   case 0x000a: puts ("powerpc604e"); break;  /* 604ev5 */
403   case 0x000c: puts ("powerpc7400"); break;
404   case 0x0041: puts ("powerpc630");  break;
405   case 0x0050: puts ("powerpc860");  break;
406   case 0x8000: puts ("powerpc7450"); break;
407   case 0x8001: puts ("powerpc7455"); break;
408   case 0x8002: puts ("powerpc7457"); break;
409   case 0x8003: puts ("powerpc7447"); break; /* really 7447A */
410   case 0x800c: puts ("powerpc7410"); break;
411   }
412   return 0;
413 }
414 EOF
415   if ($CC_FOR_BUILD $dummy.c -o $dummy) >/dev/null 2>&1; then
416     # This style construct is needed on AIX 4.3 to suppress the SIGILL error
417     # from (*fun)().  Using $SHELL -c ./$dummy 2>/dev/null doesn't work.
418     { x=`./$dummy`; } 2>/dev/null
419     if test -n "$x"; then
420       exact_cpu=$x
421     fi
422   fi
423   rm -f $dummy.c $dummy.o $dummy $dummy.core
424
425   # Grep the linux kernel /proc/cpuinfo pseudo-file.
426   # Anything unrecognised is ignored, since of course we mustn't spit out
427   # a cpu type config.sub doesn't know.
428   if test -z "$exact_cpu" && test -f /proc/cpuinfo; then
429     x=`grep "^cpu[      ]" /proc/cpuinfo | head -n 1`
430     x=`echo $x | sed -n 's/^cpu[        ]*:[    ]*\([A-Za-z0-9]*\).*/\1/p'`
431     x=`echo $x | sed 's/PPC//'`
432     case $x in
433       601)     exact_cpu="power" ;;
434       603ev)   exact_cpu="powerpc603e" ;;
435       604ev5)  exact_cpu="powerpc604e" ;;
436       603 | 603e | 604 | 604e | 750 | 821 | 860 | 970)
437         exact_cpu="powerpc$x" ;;
438       POWER[4-9])
439         exact_cpu=`echo $x | sed "s;POWER;power;"` ;;
440     esac
441   fi
442
443   if test -z "$exact_cpu"; then
444     # On AIX, try looking at _system_configuration.  This is present in
445     # version 4 at least.
446     cat >$dummy.c <<EOF
447 #include <stdio.h>
448 #include <sys/systemcfg.h>
449 int
450 main ()
451 {
452   switch (_system_configuration.implementation) {
453   /* Old versions of AIX don't have all these constants,
454      use ifdef for safety. */
455 #ifdef POWER_RS2
456   case POWER_RS2:    puts ("power2");     break;
457 #endif
458 #ifdef POWER_601
459   case POWER_601:    puts ("power");      break;
460 #endif
461 #ifdef POWER_603
462   case POWER_603:    puts ("powerpc603"); break;
463 #endif
464 #ifdef POWER_604
465   case POWER_604:    puts ("powerpc604"); break;
466 #endif
467 #ifdef POWER_620
468   case POWER_620:    puts ("powerpc620"); break;
469 #endif
470 #ifdef POWER_630
471   case POWER_630:    puts ("powerpc630"); break;
472 #endif
473   /* Dunno what this is, leave it out for now.
474   case POWER_A35:    puts ("powerpca35"); break;
475   */
476   /* This is waiting for a bit more info.
477   case POWER_RS64II: puts ("powerpcrs64ii"); break;
478   */
479 #ifdef POWER_4
480   case POWER_4:    puts ("power4"); break;
481 #endif
482 #ifdef POWER_5
483   case POWER_5:    puts ("power5"); break;
484 #endif
485 #ifdef POWER_6
486   case POWER_6:    puts ("power6"); break;
487 #endif
488 #ifdef POWER_7
489   case POWER_7:    puts ("power7"); break;
490 #endif
491   default:
492     if (_system_configuration.architecture == POWER_RS)
493       puts ("power");
494     else if (_system_configuration.width == 64)
495       puts ("powerpc64");
496   }
497   return 0;
498 }
499 EOF
500     if ($CC_FOR_BUILD $dummy.c -o $dummy) >/dev/null 2>&1; then
501       x=`./$dummy`
502       if test -n "$x"; then
503         exact_cpu=$x
504       fi
505     fi
506     rm -f $dummy.c $dummy.o $dummy
507   fi
508
509   if test -z "$exact_cpu"; then
510     # On MacOS X (or any Mach-O presumably), NXGetLocalArchInfo cpusubtype
511     # can tell us the exact cpu.
512     cat >$dummy.c <<EOF
513 #include <stdio.h>
514 #include <mach-o/arch.h>
515 int
516 main (void)
517 {
518   const NXArchInfo *a = NXGetLocalArchInfo();
519   if (a->cputype == CPU_TYPE_POWERPC)
520     {
521       switch (a->cpusubtype) {
522       /* The following known to Darwin 1.3. */
523       case CPU_SUBTYPE_POWERPC_601:   puts ("powerpc601");  break;
524       case CPU_SUBTYPE_POWERPC_602:   puts ("powerpc602");  break;
525       case CPU_SUBTYPE_POWERPC_603:   puts ("powerpc603");  break;
526       case CPU_SUBTYPE_POWERPC_603e:  puts ("powerpc603e"); break;
527       case CPU_SUBTYPE_POWERPC_603ev: puts ("powerpc603e"); break;
528       case CPU_SUBTYPE_POWERPC_604:   puts ("powerpc604");  break;
529       case CPU_SUBTYPE_POWERPC_604e:  puts ("powerpc604e"); break;
530       case CPU_SUBTYPE_POWERPC_620:   puts ("powerpc620");  break;
531       case CPU_SUBTYPE_POWERPC_750:   puts ("powerpc750");  break;
532       case CPU_SUBTYPE_POWERPC_7400:  puts ("powerpc7400"); break;
533       case CPU_SUBTYPE_POWERPC_7450:  puts ("powerpc7450"); break;
534       /* Darwin 6.8.5 doesn't define the following */
535       case 0x8001:                    puts ("powerpc7455"); break;
536       case 0x8002:                    puts ("powerpc7457"); break;
537       case 0x8003:                    puts ("powerpc7447"); break;
538       case 100:                       puts ("powerpc970");  break;
539       }
540     }
541   return 0;
542 }
543 EOF
544     if ($CC_FOR_BUILD $dummy.c -o $dummy) >/dev/null 2>&1; then
545       x=`./$dummy`
546       if test -n "$x"; then
547         exact_cpu=$x
548       fi
549     fi
550     rm -f $dummy.c $dummy.o $dummy
551   fi
552   ;;
553
554 sparc-*-* | sparc64-*-*)
555   # If we can recognise an actual v7 then $exact_cpu is set to "sparc" so as
556   # to short-circuit subsequent tests.
557
558   # Grep the linux kernel /proc/cpuinfo pseudo-file.
559   # A typical line is "cpu\t\t: TI UltraSparc II  (BlackBird)"
560   # See arch/sparc/kernel/cpu.c and arch/sparc64/kernel/cpu.c.
561   #
562   if test -f /proc/cpuinfo; then
563     if grep 'cpu.*Cypress' /proc/cpuinfo >/dev/null; then
564       exact_cpu="sparc"   # ie. v7
565     elif grep 'cpu.*Power-UP' /proc/cpuinfo >/dev/null; then
566       exact_cpu="sparc"   # ie. v7
567     elif grep 'cpu.*HyperSparc' /proc/cpuinfo >/dev/null; then
568       exact_cpu="sparcv8"
569     elif grep 'cpu.*SuperSparc' /proc/cpuinfo >/dev/null; then
570       exact_cpu="supersparc"
571     elif grep 'cpu.*MicroSparc' /proc/cpuinfo >/dev/null; then
572       exact_cpu="microsparc"
573     elif grep 'cpu.*MB86904' /proc/cpuinfo >/dev/null; then
574       # actually MicroSPARC-II
575       exact_cpu=microsparc
576     elif grep 'cpu.*UltraSparc T3' /proc/cpuinfo >/dev/null; then
577       exact_cpu="ultrasparct3"
578     elif grep 'cpu.*UltraSparc T2' /proc/cpuinfo >/dev/null; then
579       exact_cpu="ultrasparct2"
580     elif grep 'cpu.*UltraSparc T1' /proc/cpuinfo >/dev/null; then
581       exact_cpu="ultrasparct1"
582     elif grep 'cpu.*UltraSparc III' /proc/cpuinfo >/dev/null; then
583       exact_cpu="ultrasparc3"
584     elif grep 'cpu.*UltraSparc IIi' /proc/cpuinfo >/dev/null; then
585       exact_cpu="ultrasparc2i"
586     elif grep 'cpu.*UltraSparc II' /proc/cpuinfo >/dev/null; then
587       exact_cpu="ultrasparc2"
588     elif grep 'cpu.*UltraSparc' /proc/cpuinfo >/dev/null; then
589       exact_cpu="ultrasparc"
590     fi
591   fi
592
593   # Grep the output from sysinfo on SunOS.
594   # sysinfo has been seen living in /bin or in /usr/kvm
595   #     cpu0 is a "SuperSPARC Model 41 SPARCmodule" CPU
596   #     cpu0 is a "75 MHz TI,TMS390Z55" CPU
597   #
598   if test -z "$exact_cpu"; then
599     for i in sysinfo /usr/kvm/sysinfo; do
600       if $SHELL -c $i 2>/dev/null >conftest.dat; then
601         if grep 'cpu0 is a "SuperSPARC' conftest.dat >/dev/null; then
602           exact_cpu=supersparc
603           break
604         elif grep 'cpu0 is a .*TMS390Z5.' conftest.dat >/dev/null; then
605           # TMS390Z50 and TMS390Z55
606           exact_cpu=supersparc
607           break
608         fi
609       fi
610     done
611     rm -f conftest.dat
612   fi
613
614   # Grep the output from prtconf on Solaris.
615   # Use an explicit /usr/sbin, since that directory might not be in a normal
616   # user's path.
617   #
618   #     SUNW,UltraSPARC (driver not attached)
619   #     SUNW,UltraSPARC-II (driver not attached)
620   #     SUNW,UltraSPARC-IIi (driver not attached)
621   #     SUNW,UltraSPARC-III+ (driver not attached)
622   #     Ross,RT625 (driver not attached)
623   #     TI,TMS390Z50 (driver not attached)
624   #
625   # /usr/sbin/sysdef prints similar information, but includes all loadable
626   # cpu modules, not just the real cpu.
627   #
628   # We first try a plain prtconf, since that is known to work on older systems.
629   # But for newer T1 systems, that doesn't produce any useful output, we need
630   # "prtconf -vp" there.
631   #
632   for prtconfopt in "" "-vp"; do
633     if test -z "$exact_cpu"; then
634       if $SHELL -c "/usr/sbin/prtconf $prtconfopt" 2>/dev/null >conftest.dat; then
635         if grep 'SUNW,UltraSPARC-T3' conftest.dat >/dev/null; then
636           exact_cpu=ultrasparct3
637         elif grep 'SUNW,UltraSPARC-T2' conftest.dat >/dev/null; then
638           exact_cpu=ultrasparct2
639         elif grep 'SUNW,UltraSPARC-T1' conftest.dat >/dev/null; then
640           exact_cpu=ultrasparct1
641         elif grep 'SUNW,UltraSPARC-III' conftest.dat >/dev/null; then
642           exact_cpu=ultrasparc3
643         elif grep 'SUNW,UltraSPARC-IIi' conftest.dat >/dev/null; then
644           exact_cpu=ultrasparc2i
645         elif grep 'SUNW,UltraSPARC-II' conftest.dat >/dev/null; then
646           exact_cpu=ultrasparc2
647         elif grep 'SUNW,UltraSPARC' conftest.dat >/dev/null; then
648           exact_cpu=ultrasparc
649         elif grep 'Ross,RT62.' conftest.dat >/dev/null; then
650           # RT620, RT625, RT626 hypersparcs (v8).
651           exact_cpu=sparcv8
652         elif grep 'TI,TMS390Z5.' conftest.dat >/dev/null; then
653           # TMS390Z50 and TMS390Z55
654           exact_cpu=supersparc
655         elif grep 'TI,TMS390S10' conftest.dat >/dev/null; then
656           exact_cpu=microsparc
657         elif grep 'FMI,MB86904' conftest.dat >/dev/null; then
658           # actually MicroSPARC-II
659           exact_cpu=microsparc
660         fi
661       fi
662       rm -f conftest.dat
663     fi
664   done
665
666   # Grep the output from sysctl hw.model on sparc or sparc64 *BSD.
667   # Use an explicit /sbin, since that directory might not be in a normal
668   # user's path.  Example outputs,
669   #
670   #     hw.model: Sun Microsystems UltraSparc-IIi
671   #
672   if test -z "$exact_cpu"; then
673     if $SHELL -c "/sbin/sysctl hw.model" 2>/dev/null >conftest.dat; then
674       if grep -i 'UltraSparc-T3' conftest.dat >/dev/null; then
675         exact_cpu=ultrasparct3
676       elif grep -i 'UltraSparc-T2' conftest.dat >/dev/null; then
677         exact_cpu=ultrasparct2
678       elif grep -i 'UltraSparc-T1' conftest.dat >/dev/null; then
679         exact_cpu=ultrasparct1
680       elif grep -i 'UltraSparc-III' conftest.dat >/dev/null; then
681         exact_cpu=ultrasparc3
682       elif grep -i 'UltraSparc-IIi' conftest.dat >/dev/null; then
683         exact_cpu=ultrasparc2i
684       elif grep -i 'UltraSparc-II' conftest.dat >/dev/null; then
685         exact_cpu=ultrasparc2
686       elif grep -i 'UltraSparc' conftest.dat >/dev/null; then
687         exact_cpu=ultrasparc
688       elif grep 'TMS390Z5.' conftest.dat >/dev/null; then
689         # TMS390Z50 and TMS390Z55
690         exact_cpu=supersparc
691       elif grep 'TMS390S10' conftest.dat >/dev/null; then
692         exact_cpu=microsparc
693       elif grep 'MB86904' conftest.dat >/dev/null; then
694         # actually MicroSPARC-II
695         exact_cpu=microsparc
696       elif grep 'MB86907' conftest.dat >/dev/null; then
697         exact_cpu=turbosparc
698       fi
699     fi
700     rm -f conftest.dat
701   fi
702
703   # sun4m and sun4d are v8s of some sort, sun4u is a v9 of some sort
704   #
705   if test -z "$exact_cpu"; then
706     case `uname -m` in
707       sun4[md]) exact_cpu=sparcv8 ;;
708       sun4u)    exact_cpu=sparcv9 ;;
709     esac
710   fi
711   ;;
712
713
714 # Recognise x86 processors using a tricky cpuid with 4 arguments, repeating
715 # arguments; for x86-64 we effectively pass the 1st in rdx and the 2nd in rcx.
716 # This allows the same asm to work for both standard and Windoze calling
717 # conventions.
718
719 i?86-*-* | amd64-*-* | x86_64-*-*)
720   cat <<EOF >${dummy}0.s
721         .globl cpuid
722         .globl _cpuid
723 cpuid:
724 _cpuid:
725         pushl %esi
726         pushl %ebx
727         movl 24(%esp),%eax
728         .byte 0x0f
729         .byte 0xa2
730         movl 20(%esp),%esi
731         movl %ebx,(%esi)
732         movl %edx,4(%esi)
733         movl %ecx,8(%esi)
734         popl %ebx
735         popl %esi
736         ret
737 EOF
738   cat <<EOF >${dummy}1.s
739         .globl cpuid
740         .globl _cpuid
741 cpuid:
742 _cpuid:
743         push    %rbx
744         mov     %rdx, %r8
745         mov     %ecx, %eax
746         .byte   0x0f
747         .byte   0xa2
748         mov     %ebx, (%r8)
749         mov     %edx, 4(%r8)
750         mov     %ecx, 8(%r8)
751         pop     %rbx
752         ret
753 EOF
754   cat <<EOF >${dummy}2.c
755 #include <string.h>
756 #include <stdio.h>
757 #define CPUID(a,b) cpuid(b,a,a,b)
758 #if __cplusplus
759 extern "C"
760 #endif
761 unsigned int cpuid (int, char *, char *, int);
762 int
763 main ()
764 {
765   char vendor_string[13];
766   char dummy_string[12];
767   long fms;
768   int family, model, stepping;
769   const char *modelstr;
770   int cpu_64bit = 0;
771
772   CPUID (vendor_string, 0);
773   vendor_string[12] = 0;
774
775   fms = CPUID (dummy_string, 1);
776
777   family = ((fms >> 8) & 0xf) + ((fms >> 20) & 0xff);
778   model = ((fms >> 4) & 0xf) + ((fms >> 12) & 0xf0);
779   stepping = fms & 0xf;
780
781   modelstr = "$guess_cpu";
782
783   /**************************************************/
784   /*** WARNING: keep this list in sync with fat.c ***/
785   /**************************************************/
786   if (strcmp (vendor_string, "GenuineIntel") == 0)
787     {
788       switch (family)
789         {
790         case 5:
791           if (model <= 2)       modelstr = "pentium";
792           else if (model >= 4)  modelstr = "pentiummmx";
793           break;
794         case 6:
795           if (model <= 1)               modelstr = "pentiumpro";
796           else if (model <= 6)          modelstr = "pentium2";
797           else if (model <= 8)          modelstr = "pentium3";
798           else if (model <= 9)          modelstr = "pentiumm";
799           else if (model <= 0x0c)       modelstr = "pentium3";
800           else if (model <= 0x0e)       modelstr = "pentiumm";
801           else if (model <= 0x19)       cpu_64bit = 1, modelstr = "core2";
802           else if (model == 0x1a)       cpu_64bit = 1, modelstr = "coreinhm"; /* NHM Gainestown */
803           else if (model == 0x1c)       cpu_64bit = 1, modelstr = "atom";  /* Silverthorne */
804           else if (model == 0x1d)       cpu_64bit = 1, modelstr = "core2"; /* PNR Dunnington */
805           else if (model == 0x1e)       cpu_64bit = 1, modelstr = "coreinhm"; /* NHM Lynnfield/Jasper */
806           else if (model == 0x25)       cpu_64bit = 1, modelstr = "coreiwsm"; /* WSM Clarkdale/Arrandale */
807           else if (model == 0x26)       cpu_64bit = 1, modelstr = "atom";  /* Lincroft */
808           else if (model == 0x27)       cpu_64bit = 1, modelstr = "atom";  /* Saltwell */
809           else if (model == 0x2a)       cpu_64bit = 1, modelstr = "coreisbr"; /* SB */
810           else if (model == 0x2c)       cpu_64bit = 1, modelstr = "coreiwsm"; /* WSM Gulftown */
811           else if (model == 0x2d)       cpu_64bit = 1, modelstr = "coreisbr"; /* SBC-EP */
812           else if (model == 0x2e)       cpu_64bit = 1, modelstr = "coreinhm"; /* NHM Beckton */
813           else if (model == 0x2f)       cpu_64bit = 1, modelstr = "coreiwsm"; /* WSM Eagleton */
814           else if (model == 0x3a)       cpu_64bit = 1, modelstr = "coreisbr"; /* IBR */
815           else if (model == 0x3c)       cpu_64bit = 1, modelstr = "coreisbr"; /* Haswell */
816           else if (model == 0x36)       cpu_64bit = 1, modelstr = "atom";  /* Cedarview/Saltwell */
817           else cpu_64bit = 1, modelstr = "corei"; /* default */
818           break;
819         case 15:
820           cpu_64bit = 1, modelstr = "pentium4";
821           break;
822         }
823     }
824   else if (strcmp (vendor_string, "AuthenticAMD") == 0)
825     {
826       switch (family)
827         {
828         case 5:
829           if (model <= 3)       modelstr = "k5";
830           else if (model <= 7)  modelstr = "k6";
831           else if (model == 8)  modelstr = "k62";
832           else if (model == 9)  modelstr = "k63";
833           else if (model == 10) modelstr = "geode";
834           else if (model == 13) modelstr = "k63";
835           break;
836         case 6:
837           modelstr = "athlon";
838           break;
839         case 15:                /* K8, K9 */
840           cpu_64bit = 1, modelstr = "k8";
841           break;
842         case 16:                /* K10 */
843           cpu_64bit = 1, modelstr = "k10";
844           break;
845         case 17:                /* Hybrid k8/k10, claim k8 */
846           cpu_64bit = 1, modelstr = "k8";
847           break;
848         case 18:                /* Llano, uses K10 core */
849           cpu_64bit = 1, modelstr = "k10";
850           break;
851         case 19:                /* AMD Internal, assume future K10 */
852           cpu_64bit = 1, modelstr = "k10";
853           break;
854         case 20:                /* Bobcat */
855           cpu_64bit = 1, modelstr = "bobcat";
856           break;
857         case 21:                /* Bulldozer */
858           cpu_64bit = 1, modelstr = "bulldozer";
859           break;
860         case 22:                /* jaguar, an improved bobcat */
861           cpu_64bit = 1, modelstr = "bobcat";
862           break;
863         }
864     }
865   else if (strcmp (vendor_string, "CyrixInstead") == 0)
866     {
867       /* Should recognize Cyrix' processors too.  */
868     }
869   else if (strcmp (vendor_string, "CentaurHauls") == 0)
870     {
871       switch (family)
872         {
873         case 6:
874           if (model < 9)        modelstr = "viac3";
875           else if (model < 15)  modelstr = "viac32";
876           else                  cpu_64bit = 1, modelstr = "nano";
877           break;
878         }
879     }
880
881   /* If our cpuid-based exact guess is more conservative than the previous
882      guess, revert.  This is of course wrong, but it can happen in an emulator,
883      so this workaround allows for successful 64-bit builds.  */
884   if (strcmp ("$guess_cpu", "x86_64") == 0 && ! cpu_64bit)
885     modelstr = "$guess_cpu";
886
887   printf ("%s", modelstr);
888   return 0;
889 }
890 EOF
891
892   if ($CC_FOR_BUILD ${dummy}1.s ${dummy}2.c -o $dummy) >/dev/null 2>&1; then
893     # On 80386 and early 80486 cpuid is not available and will result in a
894     # SIGILL message, hence 2>/dev/null.
895     #
896     # On i386-unknown-freebsd4.9, "/bin/sh -c ./dummy" seems to send an
897     # "Illegal instruction (core dumped)" message to stdout, so we test $?
898     # to check if the program run was successful.
899     #
900     x=`$SHELL -c ./$dummy 2>/dev/null`
901     if test $? = 0 && test -n "$x"; then
902       exact_cpu=$x
903     fi
904   fi
905
906   if test -z "$exact_cpu"; then
907   if ($CC_FOR_BUILD ${dummy}0.s ${dummy}2.c -o $dummy) >/dev/null 2>&1; then
908     # On 80386 and early 80486 cpuid is not available and will result in a
909     # SIGILL message, hence 2>/dev/null.
910     #
911     # On i386-unknown-freebsd4.9, "/bin/sh -c ./dummy" seems to send an
912     # "Illegal instruction (core dumped)" message to stdout, so we test $?
913     # to check if the program run was successful.
914     #
915     x=`$SHELL -c ./$dummy 2>/dev/null`
916     if test $? = 0 && test -n "$x"; then
917       exact_cpu=$x
918     fi
919   fi
920   fi
921
922   # We need to remove some .o files here since lame C compilers
923   # generate these even when not asked.
924   rm -f ${dummy}0.s ${dummy}0.o ${dummy}1.s ${dummy}1.o ${dummy}2.c ${dummy}2.o $dummy
925   ;;
926
927 s390*-*-*)
928   model=`grep "^processor 0: version =" /proc/cpuinfo | sed -e 's/.*machine = //'`
929   case $model in
930     2064 | 2066) zcpu="z900" ;;
931     2084 | 2086) zcpu="z990" ;;
932     2094 | 2096) zcpu="z9"   ;;
933     2097 | 2098) zcpu="z10"  ;;
934     2817 | 2818 | *) zcpu="z196" ;;
935   esac
936   case "$guess_full" in
937     s390x-*-*) exact_cpu=${zcpu}    ;;
938     s390-*-*)  exact_cpu=${zcpu}esa ;;
939   esac
940   ;;
941
942 esac
943
944
945
946 # -------------------------------------------------------------------------
947 # Use an exact cpu, if possible
948
949 if test -n "$exact_cpu"; then
950   echo "$exact_cpu$guess_rest"
951 else
952   echo "$guess_full"
953 fi
954 exit 0
955
956
957
958 # Local variables:
959 # fill-column: 76
960 # End: