source: trunk/third/gmp/config.guess @ 18191

Revision 18191, 17.4 KB checked in by ghudson, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18190, which included commits to RCS files with non-trunk default branches.
  • Property svn:executable set to *
Line 
1#! /bin/sh
2#
3# GMP config.guess wrapper.
4
5
6# Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
7#
8# This file is part of the GNU MP Library.
9#
10# The GNU MP Library is free software; you can redistribute it and/or modify
11# it under the terms of the GNU Lesser General Public License as published
12# by the Free Software Foundation; either version 2.1 of the License, or (at
13# your option) any later version.
14#
15# The GNU MP Library is distributed in the hope that it will be useful, but
16# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
18# License for more details.
19#
20# You should have received a copy of the GNU Lesser General Public License
21# along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
22# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
23# MA 02111-1307, USA.
24
25
26# Usage: config.guess
27#
28# Print the host system CPU-VENDOR-OS.  configfsf.guess is run and its
29# guess then sharpened up to take advantage of the finer grained CPU
30# types GMP knows.
31
32
33# Expect to find configfsf.guess in the same directory as this config.guess
34configfsf_guess="`echo \"$0\" | sed 's/config.guess$/configfsf.guess/'`"
35if test "$configfsf_guess" = "$0"; then
36  echo "Cannot derive configfsf.guess from $0" 1>&2
37  exit 1
38fi
39if test -f "$configfsf_guess"; then
40  :
41else
42  echo "$configfsf_guess not found" 1>&2
43  exit 1
44fi
45
46# Always run configfsf.guess with $SHELL, like autoconf does for config.guess
47SHELL=${CONFIG_SHELL-/bin/sh}
48
49# Identify ourselves on --version, --help or errors
50if test $# != 0; then
51  echo "(GNU MP wrapped config.guess)"
52  $SHELL $configfsf_guess "$@"
53  exit 1
54fi
55
56
57guess_full=`$SHELL $configfsf_guess`
58if test $? != 0; then
59  exit 1
60fi
61
62guess_cpu=`echo "$guess_full" | sed 's/-.*$//'`
63guess_rest=`echo "$guess_full" | sed 's/^[^-]*//'`
64exact_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
78dummy=dummy-$$
79trap 'rm -f $dummy.c $dummy.o $dummy ${dummy}1.s ${dummy}2.c ; exit 1' 1 2 15
80
81# Use $HOST_CC if defined. $CC may point to a cross-compiler
82if test x"$CC_FOR_BUILD" = x; then
83  if test x"$HOST_CC" != x; then
84    CC_FOR_BUILD="$HOST_CC"
85  else
86    if test x"$CC" != x; then
87      CC_FOR_BUILD="$CC"
88    else
89      echo 'dummy(){}' >$dummy.c
90      for c in cc c89 gcc; do
91          ($c $dummy.c -c) >/dev/null 2>&1
92          if test $? = 0; then
93              CC_FOR_BUILD="$c"; break
94          fi
95      done
96      rm -f $dummy.c $dummy.o
97      if test x"$CC_FOR_BUILD" = x; then
98        CC_FOR_BUILD=no_compiler_found
99      fi
100    fi
101  fi
102fi
103
104
105case "$guess_full" in
106
107alpha-*-*)
108  # configfsf.guess has a block of code not unlike this for OSF and linsux.
109  # Perhaps it'll support *BSD too some time, in which case the code here
110  # can be removed.
111
112  cat <<EOF >$dummy.s
113        .data
114Lformat:
115        .byte 37,100,45,37,120,10,0     # "%d-%x\n"
116        .text
117        .globl main
118        .align 4
119        .ent main
120main:
121        .frame \$30,16,\$26,0
122        ldgp \$29,0(\$27)
123        .prologue 1
124        .long 0x47e03d91 # implver \$17
125        lda \$2,-1
126        .long 0x47e20c21 # amask \$2,\$1
127        lda \$16,Lformat
128        not \$1,\$18
129        jsr \$26,printf
130        ldgp \$29,0(\$26)
131        mov 0,\$16
132        jsr \$26,exit
133        .end main
134EOF
135  $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
136  if test "$?" = 0 ; then
137    case `./$dummy` in
138    0-0)        exact_cpu=alpha      ;;
139    1-0)        exact_cpu=alphaev5   ;;
140    1-1)        exact_cpu=alphaev56  ;;
141    1-101)      exact_cpu=alphapca56 ;;
142    2-303)      exact_cpu=alphaev6   ;;
143    2-307)      exact_cpu=alphaev67  ;;
144    2-1307)     exact_cpu=alphaev68  ;;
145    esac
146  fi
147  rm -f $dummy.s $dummy
148  ;;
149
150mips-*-irix[6789]*)
151  # IRIX 6 and up always has a 64-bit mips cpu
152  exact_cpu=mips64
153  ;;
154
155m68k-*-*)
156  # NetBSD (and presumably other *BSD) "sysctl hw.model" gives for example
157  #   hw.model = Apple Macintosh Quadra 610  (68040)
158  exact_cpu=`(sysctl hw.model) 2>/dev/null | sed -n 's/^.*\(680[012346]0\).*$/m\1/p'`
159  if test -z "$exact_cpu"; then
160    # Linux kernel 2.2 gives for example "CPU: 68020" (tabs in between).
161    exact_cpu=`sed -n 's/^CPU:.*\(680[012346]0\).*$/m\1/p' /proc/cpuinfo 2>/dev/null`
162  fi
163  if test -z "$exact_cpu"; then
164    # Try: movel #0,%d0; rts
165    # This is to check the compiler and our asm code works etc, before
166    # assuming failures below indicate cpu characteristics.
167    # .byte is used to avoid problems with assembler syntax variations.
168    # For testing, provoke failures by adding "illegal" possibly as
169    # ".byte 0x4A, 0xFC"
170    cat >$dummy.s <<EOF
171        .text
172        .globl main
173        .globl _main
174main:
175_main:
176        .byte   0x70, 0x00
177        .byte   0x4e, 0x75
178EOF
179    if ($CC_FOR_BUILD $dummy.s -o $dummy && ./$dummy) >/dev/null 2>&1; then
180
181      # $SHELL -c is used to execute ./$dummy below, since (./$dummy)
182      # 2>/dev/null still prints the SIGILL message on some shells.
183      #
184        # Try: movel #0,%d0
185        #      rtd #0
186        cat >$dummy.s <<EOF
187        .text
188        .globl main
189        .globl _main
190main:
191_main:
192        .byte   0x70, 0x00
193        .byte   0x4e, 0x74, 0x00, 0x00
194EOF
195        if $CC_FOR_BUILD $dummy.s -o $dummy >/dev/null 2>&1; then
196          $SHELL -c ./$dummy >/dev/null 2>&1
197          if test $? != 0; then
198            exact_cpu=m68000    # because rtd didn't work
199          fi
200        fi
201      #
202
203      if test -z "$exact_cpu"; then
204        # Try: trapf
205        #      movel #0,%d0
206        #      rts
207        # Another possibility for identifying 68000 and 68010 is the
208        # different value stored by "movem a0,(a0)+"
209        cat >$dummy.s <<EOF
210        .text
211        .globl main
212        .globl _main
213main:
214_main:
215        .byte   0x51, 0xFC
216        .byte   0x70, 0x00
217        .byte   0x4e, 0x75
218EOF
219        if $CC_FOR_BUILD $dummy.s -o $dummy >/dev/null 2>&1; then
220          $SHELL -c ./$dummy >/dev/null 2>&1
221          if test $? != 0; then
222            exact_cpu=m68010    # because trapf didn't work
223          fi
224        fi
225      fi
226
227      if test -z "$exact_cpu"; then
228        # Try: bfffo %d1{0:31},%d0
229        #      movel #0,%d0
230        #      rts
231        cat >$dummy.s <<EOF
232        .text
233        .globl main
234        .globl _main
235main:
236_main:
237        .byte   0xED, 0xC1, 0x00, 0x1F
238        .byte   0x70, 0x00
239        .byte   0x4e, 0x75
240EOF
241        if $CC_FOR_BUILD $dummy.s -o $dummy >/dev/null 2>&1; then
242          $SHELL -c ./$dummy >/dev/null 2>&1
243          if test $? != 0; then
244            exact_cpu=m68360  # cpu32, because bfffo didn't work
245          fi
246        fi
247      fi
248
249      if test -z "$exact_cpu"; then
250        # FIXME: Now we know 68020 or up, but how to detect 030, 040 and 060?
251        exact_cpu=m68020
252      fi
253    fi
254    rm -f $dummy.s $dummy $dummy.core core
255  fi
256  if test -z "$exact_cpu"; then
257    case "$guess_full" in
258      *-*-next* | *-*-openstep*)  # NeXTs are 68020 or better
259        exact_cpu=m68020 ;;
260    esac
261  fi
262  ;;
263
264
265rs6000-*-* | powerpc*-*-*)
266  # Try to read the PVR.  mfpvr is a protected instruction, MacOS and AIX
267  # don't allow it in user mode, but the Linux kernel does.
268  #
269  # Using explicit bytes for mfpvr avoids worrying about assembler syntax
270  # and underscores.  "char"s are used instead of "int"s to avoid worrying
271  # whether sizeof(int)==4 or if it's the right endianness.
272  #
273  # Note this is no good on AIX, since a C function there is the address of
274  # a function descriptor, not actual code.  But this doesn't matter since
275  # AIX doesn't allow mfpvr anyway.
276  #
277  cat >$dummy.c <<\EOF
278#include <stdio.h>
279struct {
280  int   n;  /* force 4-byte alignment */
281  char  a[8];
282} getpvr = {
283  0,
284  {
285    0x7c, 0x7f, 0x42, 0xa6,  /* mfpvr r3 */
286    0x4e, 0x80, 0x00, 0x20,  /* blr      */
287  }
288};
289int
290main ()
291{
292  unsigned  (*fun)();
293  unsigned  pvr;
294
295  /* a separate "fun" variable is necessary for gcc 2.95.2 on MacOS,
296     it gets a compiler error on a combined cast and call */
297  fun = (unsigned (*)()) getpvr.a;
298  pvr = (*fun) ();
299
300  switch (pvr >> 16) {
301  case 1:  puts ("powerpc601");  break;
302  case 3:  puts ("powerpc603");  break;
303  case 4:  puts ("powerpc604");  break;
304  case 6:  puts ("powerpc603e"); break;
305  case 7:  puts ("powerpc603e"); break;  /* 603ev */
306  case 8:  puts ("powerpc750");  break;
307  case 9:  puts ("powerpc604e"); break;
308  case 10: puts ("powerpc604e"); break;  /* 604ev5 */
309  case 50: puts ("powerpc821");  break;
310  case 80: puts ("powerpc860");  break;
311  }
312  return 0;
313}
314EOF
315  if ($CC_FOR_BUILD $dummy.c -o $dummy) >/dev/null 2>&1; then
316    # use $SHELL -c to avoid a segv message when this program is run on AIX
317    x=`$SHELL -c ./$dummy 2>/dev/null`
318    if test -n "$x"; then
319      exact_cpu=$x
320    fi
321  fi
322  rm -f $dummy.c $dummy
323
324  # Grep the linux kernel /proc/cpuinfo pseudo-file.
325  # Anything unrecognised is ignored, since of course we mustn't spit out
326  # a cpu type config.sub doesn't know.
327  if test -z "$exact_cpu" && test -f /proc/cpuinfo; then
328    x=`sed -n 's/^cpu[  ]*:[    ]*\([a-z0-9]*\).*/\1/p' /proc/cpuinfo`
329    case $x in
330      601)     exact_cpu="power" ;;
331      603ev)   exact_cpu="powerpc603e" ;;
332      604ev5)  exact_cpu="powerpc604e" ;;
333      603 | 603e | 604 | 604e | 750 | 821 | 860)
334        exact_cpu="powerpc$x" ;;
335    esac
336  fi
337
338  if test -z "$exact_cpu"; then
339    # On AIX, try looking at _system_configuration.  This is present in
340    # version 4 at least.
341    cat >$dummy.c <<EOF
342#include <stdio.h>
343#include <sys/systemcfg.h>
344int
345main ()
346{
347  switch (_system_configuration.implementation) {
348  /* Old versions of AIX don't have all these constants,
349     use ifdef for safety. */
350#ifdef POWER_601
351  case POWER_601:    puts ("power");      break;
352#endif
353#ifdef POWER_603
354  case POWER_603:    puts ("powerpc603"); break;
355#endif
356#ifdef POWER_604
357  case POWER_604:    puts ("powerpc604"); break;
358#endif
359#ifdef POWER_620
360  case POWER_620:    puts ("powerpc620"); break;
361#endif
362#ifdef POWER_630
363  case POWER_630:    puts ("powerpc630"); break;
364#endif
365  /* Dunno what this is, leave it out for now.
366  case POWER_A35:    puts ("powerpca35"); break;
367  */
368  /* This is waiting for a bit more info.
369  case POWER_RS64II: puts ("powerpcrs64ii"); break;
370  */
371  default:
372    if (_system_configuration.architecture == POWER_RS)
373      puts ("power");
374    else if (_system_configuration.width == 64)
375      puts ("powerpc64");
376  }
377  return 0;
378}
379EOF
380    if ($CC_FOR_BUILD $dummy.c -o $dummy) >/dev/null 2>&1; then
381      x=`./$dummy`
382      if test -n "$x"; then
383        exact_cpu=$x
384      fi
385    fi
386    rm -f $dummy.c $dummy
387  fi
388
389  if test -z "$exact_cpu"; then
390    # On MacOS X (or any Mach-O presumably), NXGetLocalArchInfo cpusubtype
391    # can tell us the exact cpu.
392    cat >$dummy.c <<EOF
393#include <stdio.h>
394#include <mach-o/arch.h>
395int
396main (void)
397{
398  const NXArchInfo *a = NXGetLocalArchInfo();
399  if (a->cputype == CPU_TYPE_POWERPC)
400    {
401      switch (a->cpusubtype) {
402      /* The following known to Darwin 1.3. */
403      case CPU_SUBTYPE_POWERPC_601:   puts ("powerpc601");  break;
404      case CPU_SUBTYPE_POWERPC_602:   puts ("powerpc602");  break;
405      case CPU_SUBTYPE_POWERPC_603:   puts ("powerpc603");  break;
406      case CPU_SUBTYPE_POWERPC_603e:  puts ("powerpc603e"); break;
407      case CPU_SUBTYPE_POWERPC_603ev: puts ("powerpc603e"); break;
408      case CPU_SUBTYPE_POWERPC_604:   puts ("powerpc604");  break;
409      case CPU_SUBTYPE_POWERPC_604e:  puts ("powerpc604e"); break;
410      case CPU_SUBTYPE_POWERPC_620:   puts ("powerpc620");  break;
411      case CPU_SUBTYPE_POWERPC_750:   puts ("powerpc750");  break;
412      case CPU_SUBTYPE_POWERPC_7400:  puts ("powerpc7400"); break;
413      case CPU_SUBTYPE_POWERPC_7450:  puts ("powerpc7450"); break;
414      }
415    }
416  return 0;
417}
418EOF
419    if ($CC_FOR_BUILD $dummy.c -o $dummy) >/dev/null 2>&1; then
420      x=`./$dummy`
421      if test -n "$x"; then
422        exact_cpu=$x
423      fi
424    fi
425    rm -f $dummy.c $dummy
426  fi
427  ;;
428
429sparc-*-* | sparc64-*-*)
430  # If we can recognise an actual v7 then $exact_cpu is set to "sparc" so as
431  # to short-circuit subsequent tests.
432
433  # Grep the linux kernel /proc/cpuinfo pseudo-file.
434  # A typical line is "cpu\t\t: TI UltraSparc II  (BlackBird)"
435  # See arch/sparc/kernel/cpu.c and arch/sparc64/kernel/cpu.c.
436  #
437  if test -f /proc/cpuinfo; then
438    if grep 'cpu.*Cypress' /proc/cpuinfo >/dev/null; then
439      exact_cpu="sparc"   # ie. v7
440    elif grep 'cpu.*Power-UP' /proc/cpuinfo >/dev/null; then
441      exact_cpu="sparc"   # ie. v7
442    elif grep 'cpu.*HyperSparc' /proc/cpuinfo >/dev/null; then
443      exact_cpu="sparcv8"
444    elif grep 'cpu.*SuperSparc' /proc/cpuinfo >/dev/null; then
445      exact_cpu="supersparc"
446    elif grep 'cpu.*MicroSparc' /proc/cpuinfo >/dev/null; then
447      exact_cpu="microsparc"
448    elif grep 'cpu.*MB86904' /proc/cpuinfo >/dev/null; then
449      # actually MicroSPARC-II
450      exact_cpu=microsparc
451    elif grep 'cpu.*UltraSparc III' /proc/cpuinfo >/dev/null; then
452      exact_cpu="ultrasparc3"
453    elif grep 'cpu.*UltraSparc IIi' /proc/cpuinfo >/dev/null; then
454      exact_cpu="ultrasparc2i"
455    elif grep 'cpu.*UltraSparc II' /proc/cpuinfo >/dev/null; then
456      exact_cpu="ultrasparc2"
457    elif grep 'cpu.*UltraSparc' /proc/cpuinfo >/dev/null; then
458      exact_cpu="ultrasparc"
459    fi
460  fi
461
462  # Grep the output from sysinfo on SunOS.
463  # sysinfo has been seen living in /bin or in /usr/kvm
464  #     cpu0 is a "SuperSPARC Model 41 SPARCmodule" CPU
465  #     cpu0 is a "75 MHz TI,TMS390Z55" CPU
466  #
467  if test -z "$exact_cpu"; then
468    for i in sysinfo /usr/kvm/sysinfo; do
469      if $SHELL -c $i 2>/dev/null >conftest.dat; then
470        if grep 'cpu0 is a "SuperSPARC' conftest.dat >/dev/null; then
471          exact_cpu=supersparc
472          break
473        elif grep 'cpu0 is a .*TMS390Z55' conftest.dat >/dev/null; then
474          # TMS390Z55 is a supersparc
475          exact_cpu=supersparc
476          break
477        fi
478      fi
479    done
480    rm -f conftest.dat
481  fi 
482
483  # Grep the output from prtconf on Solaris.
484  # Use an explicit /usr/sbin, since that directory might not be in a normal
485  # user's path.
486  #
487  #     SUNW,UltraSPARC (driver not attached)
488  #     SUNW,UltraSPARC-II (driver not attached)
489  #     SUNW,UltraSPARC-IIi (driver not attached)
490  #     SUNW,UltraSPARC-III+ (driver not attached)
491  #     Ross,RT625 (driver not attached)
492  #     TI,TMS390Z50 (driver not attached)
493  #
494  # /usr/sbin/sysdef prints similar information, but includes all loadable
495  # cpu modules, not just the real cpu.
496  #
497  if test -z "$exact_cpu"; then
498    if $SHELL -c /usr/sbin/prtconf 2>/dev/null >conftest.dat; then
499      if grep 'SUNW,UltraSPARC-III' conftest.dat >/dev/null; then
500        exact_cpu=ultrasparc3
501      elif grep 'SUNW,UltraSPARC-IIi' conftest.dat >/dev/null; then
502        exact_cpu=ultrasparc2i
503      elif grep 'SUNW,UltraSPARC-II' conftest.dat >/dev/null; then
504        exact_cpu=ultrasparc2
505      elif grep 'SUNW,UltraSPARC' conftest.dat >/dev/null; then
506        exact_cpu=ultrasparc
507      elif grep 'Ross,RT62.' conftest.dat >/dev/null; then
508        # RT620, RT625, RT626 hypersparcs (v8).
509        exact_cpu=sparcv8
510      elif grep 'TI,TMS390Z5.' conftest.dat >/dev/null; then
511        # TMS390Z50 and TMS390Z55
512        exact_cpu=supersparc
513      elif grep 'TI,TMS390S10' conftest.dat >/dev/null; then
514        exact_cpu=microsparc
515      elif grep 'FMI,MB86904' conftest.dat >/dev/null; then
516        # actually MicroSPARC-II
517        exact_cpu=microsparc
518      fi
519    fi
520    rm -f conftest.dat
521  fi 
522
523  # sun4m and sun4d are v8s of some sort, sun4u is a v9 of some sort
524  #
525  if test -z "$exact_cpu"; then
526    case `uname -m` in
527      sun4[md]) exact_cpu=sparcv8 ;;
528      sun4u)    exact_cpu=sparcv9 ;;
529    esac
530  fi
531  ;;
532
533i?86-*-*)
534  cat <<EOF >${dummy}1.s
535        .globl cpuid
536        .globl _cpuid
537cpuid:
538_cpuid:
539        pushl %esi
540        pushl %ebx
541        movl 16(%esp),%eax
542        .byte 0x0f
543        .byte 0xa2
544        movl 12(%esp),%esi
545        movl %ebx,(%esi)
546        movl %edx,4(%esi)
547        movl %ecx,8(%esi)
548        popl %ebx
549        popl %esi
550        ret
551EOF
552  cat <<EOF >${dummy}2.c
553main ()
554{
555  char vendor_string[13];
556  char dummy_string[12];
557  long fms;
558  int family, model;
559  char *modelstr;
560
561  cpuid (vendor_string, 0);
562  vendor_string[12] = 0;
563
564  fms = cpuid (dummy_string, 1);
565
566  family = (fms >> 8) & 15;
567  model = (fms >> 4) & 15;
568
569  modelstr = "i486";
570  if (strcmp (vendor_string, "GenuineIntel") == 0)
571    {
572      switch (family)
573        {
574        case 5:
575          if (model <= 2)       modelstr = "pentium";
576          else if (model >= 4)  modelstr = "pentiummmx";
577          break;
578        case 6:
579          if (model == 1)       modelstr = "pentiumpro";
580          else if (model <= 6)  modelstr = "pentium2";
581          else                  modelstr = "pentium3";
582          break;
583        case 15:
584          modelstr = "pentium4";
585          break;
586        }
587    }
588  else if (strcmp (vendor_string, "AuthenticAMD") == 0)
589    {
590      switch (family)
591        {
592        case 5:
593          if (model <= 3)       modelstr = "k5";
594          else if (model <= 7)  modelstr = "k6";
595          else if (model <= 8)  modelstr = "k62";
596          else if (model <= 9)  modelstr = "k63";
597          break;
598        case 6:
599          modelstr = "athlon";
600          break;
601        }
602    }
603  else if (strcmp (vendor_string, "CyrixInstead") == 0)
604    {
605      /* Should recognize Cyrix' processors too.  */
606    }
607
608  printf ("%s\n", modelstr);
609  return 0;
610}
611EOF
612
613  if ($CC_FOR_BUILD ${dummy}1.s ${dummy}2.c -o $dummy) >/dev/null 2>&1; then
614    # suppress SIGILL message on 80386
615    x=`$SHELL -c ./$dummy 2>/dev/null`
616    if test -n "$x"; then
617      exact_cpu=$x
618    fi
619  fi
620
621  # We need to remove some .o files here since lame C compilers
622  # generate these even when not asked.
623  rm -f ${dummy}1.s ${dummy}1.o ${dummy}2.c ${dummy}2.o $dummy
624  ;;
625
626esac
627
628
629
630# -------------------------------------------------------------------------
631# Use an exact cpu, if possible
632
633if test -n "$exact_cpu"; then
634  echo "$exact_cpu$guess_rest"
635else
636  echo "$guess_full"
637fi
638exit 0
639
640
641
642# Local variables:
643# fill-column: 76
644# End:
Note: See TracBrowser for help on using the repository browser.