Home | History | Annotate | Line # | Download | only in dist
config.guess revision 1.2.2.1
      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 # Disabled for NetBSD cross builds
    949 if false && 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:
    961