Blame config.guess

Packit 15dc08
#! /bin/sh
Packit 15dc08
#
Packit 15dc08
# GMP config.guess wrapper.
Packit 15dc08
Packit 15dc08
Packit 15dc08
# Copyright 2000-2006, 2008, 2011-2016 Free Software Foundation, Inc.
Packit 15dc08
#
Packit 15dc08
#  This file is part of the GNU MP Library.
Packit 15dc08
#
Packit 15dc08
#  The GNU MP Library is free software; you can redistribute it and/or modify
Packit 15dc08
#  it under the terms of either:
Packit 15dc08
#
Packit 15dc08
#    * the GNU Lesser General Public License as published by the Free
Packit 15dc08
#      Software Foundation; either version 3 of the License, or (at your
Packit 15dc08
#      option) any later version.
Packit 15dc08
#
Packit 15dc08
#  or
Packit 15dc08
#
Packit 15dc08
#    * the GNU General Public License as published by the Free Software
Packit 15dc08
#      Foundation; either version 2 of the License, or (at your option) any
Packit 15dc08
#      later version.
Packit 15dc08
#
Packit 15dc08
#  or both in parallel, as here.
Packit 15dc08
#
Packit 15dc08
#  The GNU MP Library is distributed in the hope that it will be useful, but
Packit 15dc08
#  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit 15dc08
#  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit 15dc08
#  for more details.
Packit 15dc08
#
Packit 15dc08
#  You should have received copies of the GNU General Public License and the
Packit 15dc08
#  GNU Lesser General Public License along with the GNU MP Library.  If not,
Packit 15dc08
#  see https://www.gnu.org/licenses/.
Packit 15dc08
Packit 15dc08
Packit 15dc08
# Usage: config.guess
Packit 15dc08
#
Packit 15dc08
# Print the host system CPU-VENDOR-OS.
Packit 15dc08
#
Packit 15dc08
# configfsf.guess is run and its guess then sharpened up to take advantage
Packit 15dc08
# of the finer grained CPU types that GMP knows.
Packit 15dc08
Packit 15dc08
Packit 15dc08
# Expect to find configfsf.guess in the same directory as this config.guess
Packit 15dc08
configfsf_guess="`echo \"$0\" | sed 's/config.guess$/configfsf.guess/'`"
Packit 15dc08
if test "$configfsf_guess" = "$0"; then
Packit 15dc08
  echo "Cannot derive configfsf.guess from $0" 1>&2
Packit 15dc08
  exit 1
Packit 15dc08
fi
Packit 15dc08
if test -f "$configfsf_guess"; then
Packit 15dc08
  :
Packit 15dc08
else
Packit 15dc08
  echo "$configfsf_guess not found" 1>&2
Packit 15dc08
  exit 1
Packit 15dc08
fi
Packit 15dc08
Packit 15dc08
# Setup a $SHELL with which to run configfsf.guess, using the same
Packit 15dc08
# $CONFIG_SHELL or /bin/sh as autoconf does when running config.guess
Packit 15dc08
SHELL=${CONFIG_SHELL-/bin/sh}
Packit 15dc08
Packit 15dc08
# Identify ourselves on --version, --help or errors
Packit 15dc08
if test $# != 0; then
Packit 15dc08
  echo "(GNU MP wrapped config.guess)"
Packit 15dc08
  $SHELL $configfsf_guess "$@"
Packit 15dc08
  exit 1
Packit 15dc08
fi
Packit 15dc08
Packit 15dc08
guess_full=`$SHELL $configfsf_guess`
Packit 15dc08
if test $? != 0; then
Packit 15dc08
  exit 1
Packit 15dc08
fi
Packit 15dc08
Packit 15dc08
guess_cpu=`echo "$guess_full" | sed 's/-.*$//'`
Packit 15dc08
guess_rest=`echo "$guess_full" | sed 's/^[^-]*//'`
Packit 15dc08
exact_cpu=
Packit 15dc08
Packit 15dc08
Packit 15dc08
# -------------------------------------------------------------------------
Packit 15dc08
# The following should look at the current guess and probe the system to
Packit 15dc08
# establish a better guess in exact_cpu.  Leave exact_cpu empty if probes
Packit 15dc08
# can't be done, or don't work.
Packit 15dc08
#
Packit 15dc08
# When a number of probes are done, test -z "$exact_cpu" can be used instead
Packit 15dc08
# of putting each probe under an "else" of the preceeding.  That can stop
Packit 15dc08
# the code getting horribly nested and marching off the right side of the
Packit 15dc08
# screen.
Packit 15dc08
Packit 15dc08
# Note that when a compile-and-link is done in one step we need to remove .o
Packit 15dc08
# files, since lame C compilers generate these even when not asked.
Packit 15dc08
#
Packit 15dc08
Packit 15dc08
# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
Packit 15dc08
# compiler to aid in system detection is discouraged as it requires
Packit 15dc08
# temporary files to be created and, as you can see below, it is a
Packit 15dc08
# headache to deal with in a portable fashion.
Packit 15dc08
Packit 15dc08
# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
Packit 15dc08
# use `HOST_CC' if defined, but it is deprecated.
Packit 15dc08
Packit 15dc08
# Portable tmp directory creation inspired by the Autoconf team.
Packit 15dc08
Packit 15dc08
set_cc_for_build='
Packit 15dc08
trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
Packit 15dc08
trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
Packit 15dc08
: ${TMPDIR=/tmp} ;
Packit 15dc08
 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
Packit 15dc08
 { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
Packit 15dc08
 { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
Packit 15dc08
 { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
Packit 15dc08
dummy=$tmp/dummy ;
Packit 15dc08
tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy $dummy.core ${dummy}0.s" ;
Packit 15dc08
case $CC_FOR_BUILD,$HOST_CC,$CC in
Packit 15dc08
 ,,)    echo "int x;" > $dummy.c ;
Packit 15dc08
	for c in cc gcc c89 c99 ; do
Packit 15dc08
	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
Packit 15dc08
	     CC_FOR_BUILD="$c"; break ;
Packit 15dc08
	  fi ;
Packit 15dc08
	done ;
Packit 15dc08
	if test x"$CC_FOR_BUILD" = x ; then
Packit 15dc08
	  CC_FOR_BUILD=no_compiler_found ;
Packit 15dc08
	fi
Packit 15dc08
	;;
Packit 15dc08
 ,,*)   CC_FOR_BUILD=$CC ;;
Packit 15dc08
 ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
Packit 15dc08
esac ; set_cc_for_build= ;'
Packit 15dc08
Packit 15dc08
Packit 15dc08
case "$guess_full" in
Packit 15dc08
Packit 15dc08
alpha-*-*)
Packit 15dc08
  eval $set_cc_for_build
Packit 15dc08
  # configfsf.guess detects exact alpha cpu types for OSF and GNU/Linux, but
Packit 15dc08
  # not for *BSD and other systems.  We try to get an exact type for any
Packit 15dc08
  # plain "alpha" it leaves.
Packit 15dc08
  #
Packit 15dc08
  # configfsf.guess used to have a block of code not unlike this, but these
Packit 15dc08
  # days does its thing with Linux kernel /proc/cpuinfo or OSF psrinfo.
Packit 15dc08
  #
Packit 15dc08
  cat <<EOF >${dummy}0.s
Packit 15dc08
	.data
Packit 15dc08
Lformat:
Packit 15dc08
	.byte 37,100,45,37,120,10,0	# "%d-%x\n"
Packit 15dc08
	.text
Packit 15dc08
	.globl main
Packit 15dc08
	.align 4
Packit 15dc08
	.ent main
Packit 15dc08
main:
Packit 15dc08
	.frame \$30,16,\$26,0
Packit 15dc08
	ldgp \$29,0(\$27)
Packit 15dc08
	.prologue 1
Packit 15dc08
	.long 0x47e03d91 # implver \$17
Packit 15dc08
	lda \$2,-1
Packit 15dc08
	.long 0x47e20c21 # amask \$2,\$1
Packit 15dc08
	lda \$16,Lformat
Packit 15dc08
	not \$1,\$18
Packit 15dc08
	jsr \$26,printf
Packit 15dc08
	ldgp \$29,0(\$26)
Packit 15dc08
	mov 0,\$16
Packit 15dc08
	jsr \$26,exit
Packit 15dc08
	.end main
Packit 15dc08
EOF
Packit 15dc08
  $CC_FOR_BUILD ${dummy}0.s -o $dummy 2>/dev/null
Packit 15dc08
  if test "$?" = 0 ; then
Packit 15dc08
    case `$dummy` in
Packit 15dc08
    0-0)	exact_cpu=alpha      ;;
Packit 15dc08
    1-0)	exact_cpu=alphaev5   ;;
Packit 15dc08
    1-1)	exact_cpu=alphaev56  ;;
Packit 15dc08
    1-101)	exact_cpu=alphapca56 ;;
Packit 15dc08
    2-303)	exact_cpu=alphaev6   ;;
Packit 15dc08
    2-307)	exact_cpu=alphaev67  ;;
Packit 15dc08
    2-1307)	exact_cpu=alphaev68  ;;
Packit 15dc08
    esac
Packit 15dc08
  fi
Packit 15dc08
  ;;
Packit 15dc08
Packit 15dc08
arm*-*-* | aarch64-*-*)
Packit 15dc08
  cpu_code=`sed -n 's/^CPU part.*\(0x.*\)$/\1/p' /proc/cpuinfo 2>/dev/null | sort -r | head -n 1 2>/dev/null`
Packit 15dc08
  cpu_implementer=`sed -n 's/^CPU implementer.*\(0x.*\)$/\1/p' /proc/cpuinfo 2>/dev/null | head -n 1 2>/dev/null`
Packit 15dc08
  case "${cpu_implementer}_${cpu_code}" in
Packit 15dc08
    0x53_0x001) exact_cpu=armexynosm1  ;;
Packit 15dc08
    0x51_0x800) exact_cpu=armcortexa57 ;;
Packit 15dc08
    0x43_0x0a1) exact_cpu=armthunderx  ;;
Packit 15dc08
    0x50_0x000) exact_cpu=armxgene1    ;;
Packit 15dc08
  esac
Packit 15dc08
  if test -z "$exact_cpu"; then
Packit 15dc08
    case "$cpu_code" in
Packit 15dc08
	0xa10 | 0xa11 | 0xb11)			# v4 strongarm/sa1100
Packit 15dc08
		exact_cpu="armsa1";;
Packit 15dc08
	0x915 | 0x925 | \
Packit 15dc08
	0x920 | 0x922 | 0x940)			# v4
Packit 15dc08
		exact_cpu="arm9tdmi";;
Packit 15dc08
	0x210 | 0x290 | 0x2d0 | \
Packit 15dc08
	0x212 | 0x292 | 0x2d2 | \
Packit 15dc08
	0x411)	exact_cpu="armxscale";;		# v5 pxa2xx
Packit 15dc08
	0x926 | 0x946 | 0x966 | 0x968)		# v5te/v5tej
Packit 15dc08
		exact_cpu="arm9te";;
Packit 15dc08
	0xa20 | 0xa22 | 0xa26)			# v5te
Packit 15dc08
		exact_cpu="arm10";;
Packit 15dc08
	0xb02)	exact_cpu="arm11mpcore";;	# v6
Packit 15dc08
	0xb36)	exact_cpu="arm1136";;		# v6
Packit 15dc08
	0xb56)	exact_cpu="arm1156";;		# v6t2
Packit 15dc08
	0xb76)	exact_cpu="arm1176";;		# v6
Packit 15dc08
	0xc05)	exact_cpu="armcortexa5";;	# v7a
Packit 15dc08
	0xc07)	exact_cpu="armcortexa7";;	# v7a
Packit 15dc08
	0xc08)	exact_cpu="armcortexa8";;	# v7a
Packit 15dc08
	0xc09)	exact_cpu="armcortexa9";;	# v7a
Packit 15dc08
	0xc0f)	exact_cpu="armcortexa15";;	# v7a
Packit 15dc08
	0xc14)	exact_cpu="armcortexr4";;	# v7r
Packit 15dc08
	0xc15)	exact_cpu="armcortexr5";;	# v7r
Packit 15dc08
	0xc23)	exact_cpu="armcortexm3";;	# v7m
Packit 15dc08
Packit 15dc08
	0xd04)	exact_cpu="armcortexa35";;	# v8-32
Packit 15dc08
	0xd03)	exact_cpu="armcortexa53";;	# v8
Packit 15dc08
	0xd07)	exact_cpu="armcortexa57";;	# v8
Packit 15dc08
	0xd08)	exact_cpu="armcortexa72";;	# v8
Packit 15dc08
	*)	exact_cpu=$guess_cpu;;
Packit 15dc08
    esac
Packit 15dc08
  fi
Packit 15dc08
  exact_cpu="${exact_cpu}`sed -n 's;^Features.*\(neon\).*;\1;p' /proc/cpuinfo 2>/dev/null | head -n 1 2>/dev/null`"
Packit 15dc08
  ;;
Packit 15dc08
Packit 15dc08
ia64*-*-*)
Packit 15dc08
  eval $set_cc_for_build
Packit 15dc08
  # CPUID[3] bits 24 to 31 is the processor family.  itanium2 is documented
Packit 15dc08
  # as 0x1f, plain itanium has been seen returning 0x07 on two systems, but
Packit 15dc08
  # haven't found any documentation on it as such.
Packit 15dc08
  #
Packit 15dc08
  # Defining both getcpuid and _getcpuid lets us ignore whether the system
Packit 15dc08
  # expects underscores or not.
Packit 15dc08
  #
Packit 15dc08
  # "unsigned long long" is always 64 bits, in fact on hpux in ilp32 mode
Packit 15dc08
  # (which is the default there), it's the only 64-bit type.
Packit 15dc08
  #
Packit 15dc08
  cat >${dummy}0.s <
Packit 15dc08
	.text
Packit 15dc08
	.global	_getcpuid
Packit 15dc08
	.proc	_getcpuid
Packit 15dc08
_getcpuid:
Packit 15dc08
	mov	r8 = CPUID[r32] ;;
Packit 15dc08
	br.ret.sptk.many rp ;;
Packit 15dc08
	.endp	_getcpuid
Packit 15dc08
	.global	getcpuid
Packit 15dc08
	.proc	getcpuid
Packit 15dc08
getcpuid:
Packit 15dc08
	mov	r8 = CPUID[r32] ;;
Packit 15dc08
	br.ret.sptk.many rp ;;
Packit 15dc08
	.endp	getcpuid
Packit 15dc08
EOF
Packit 15dc08
  cat >$dummy.c <
Packit 15dc08
#include <stdio.h>
Packit 15dc08
unsigned long long getcpuid ();
Packit 15dc08
int
Packit 15dc08
main ()
Packit 15dc08
{
Packit 15dc08
  if (getcpuid(0LL) == 0x49656E69756E6547LL && getcpuid(1LL) == 0x6C65746ELL)
Packit 15dc08
    {
Packit 15dc08
      /* "GenuineIntel" */
Packit 15dc08
      switch ((getcpuid(3LL) >> 24) & 0xFF) {
Packit 15dc08
      case 0x07: puts ("itanium");  break;
Packit 15dc08
      case 0x1F: puts ("itanium2"); break; /* McKinley, Madison */
Packit 15dc08
      case 0x20: puts ("itanium2"); break; /* Montecito, Montvale, Tukwila */
Packit 15dc08
      case 0x21: puts ("itanium2"); break; /* Poulson */
Packit 15dc08
      }
Packit 15dc08
    }
Packit 15dc08
  return 0;
Packit 15dc08
}
Packit 15dc08
EOF
Packit 15dc08
  if $CC_FOR_BUILD ${dummy}0.s $dummy.c -o $dummy >/dev/null 2>&1; then
Packit 15dc08
    exact_cpu=`$dummy`
Packit 15dc08
  fi
Packit 15dc08
  ;;
Packit 15dc08
Packit 15dc08
mips-*-irix[6789]*)
Packit 15dc08
  # IRIX 6 and up always has a 64-bit mips cpu
Packit 15dc08
  exact_cpu=mips64
Packit 15dc08
  ;;
Packit 15dc08
Packit 15dc08
m68k-*-*)
Packit 15dc08
  eval $set_cc_for_build
Packit 15dc08
  # NetBSD (and presumably other *BSD) "sysctl hw.model" gives for example
Packit 15dc08
  #   hw.model = Apple Macintosh Quadra 610  (68040)
Packit 15dc08
  exact_cpu=`(sysctl hw.model) 2>/dev/null | sed -n 's/^.*\(680[012346]0\).*$/m\1/p'`
Packit 15dc08
  if test -z "$exact_cpu"; then
Packit 15dc08
    # Linux kernel 2.2 gives for example "CPU: 68020" (tabs in between).
Packit 15dc08
    exact_cpu=`sed -n 's/^CPU:.*\(680[012346]0\).*$/m\1/p' /proc/cpuinfo 2>/dev/null`
Packit 15dc08
  fi
Packit 15dc08
  if test -z "$exact_cpu"; then
Packit 15dc08
    # Try: movel #0,%d0; rts
Packit 15dc08
    # This is to check the compiler and our asm code works etc, before
Packit 15dc08
    # assuming failures below indicate cpu characteristics.
Packit 15dc08
    # .byte is used to avoid problems with assembler syntax variations.
Packit 15dc08
    # For testing, provoke failures by adding "illegal" possibly as
Packit 15dc08
    # ".byte 0x4A, 0xFC"
Packit 15dc08
    cat >${dummy}0.s <
Packit 15dc08
	.text
Packit 15dc08
	.globl main
Packit 15dc08
	.globl _main
Packit 15dc08
main:
Packit 15dc08
_main:
Packit 15dc08
	.byte	0x70, 0x00
Packit 15dc08
	.byte	0x4e, 0x75
Packit 15dc08
EOF
Packit 15dc08
Packit 15dc08
    if ($CC_FOR_BUILD ${dummy}0.s -o $dummy && $dummy) >/dev/null 2>&1; then
Packit 15dc08
Packit 15dc08
      # $SHELL -c is used to execute $dummy below, since ($dummy)
Packit 15dc08
      # 2>/dev/null still prints the SIGILL message on some shells.
Packit 15dc08
      #
Packit 15dc08
        # Try: movel #0,%d0
Packit 15dc08
        #      rtd #0
Packit 15dc08
        cat >${dummy}0.s <
Packit 15dc08
	.text
Packit 15dc08
	.globl main
Packit 15dc08
	.globl _main
Packit 15dc08
main:
Packit 15dc08
_main:
Packit 15dc08
	.byte	0x70, 0x00
Packit 15dc08
	.byte	0x4e, 0x74, 0x00, 0x00
Packit 15dc08
EOF
Packit 15dc08
        if $CC_FOR_BUILD ${dummy}0.s -o $dummy >/dev/null 2>&1; then
Packit 15dc08
          $SHELL -c $dummy >/dev/null 2>&1
Packit 15dc08
	  if test $? != 0; then
Packit 15dc08
            exact_cpu=m68000    # because rtd didn't work
Packit 15dc08
          fi
Packit 15dc08
        fi
Packit 15dc08
      #
Packit 15dc08
Packit 15dc08
      if test -z "$exact_cpu"; then
Packit 15dc08
        # Try: trapf
Packit 15dc08
        #      movel #0,%d0
Packit 15dc08
        #      rts
Packit 15dc08
        # Another possibility for identifying 68000 and 68010 is the
Packit 15dc08
        # different value stored by "movem a0,(a0)+"
Packit 15dc08
        cat >${dummy}0.s <
Packit 15dc08
	.text
Packit 15dc08
	.globl main
Packit 15dc08
	.globl _main
Packit 15dc08
main:
Packit 15dc08
_main:
Packit 15dc08
	.byte	0x51, 0xFC
Packit 15dc08
	.byte	0x70, 0x00
Packit 15dc08
	.byte	0x4e, 0x75
Packit 15dc08
EOF
Packit 15dc08
        if $CC_FOR_BUILD ${dummy}0.s -o $dummy >/dev/null 2>&1; then
Packit 15dc08
          $SHELL -c $dummy >/dev/null 2>&1
Packit 15dc08
	  if test $? != 0; then
Packit 15dc08
            exact_cpu=m68010    # because trapf didn't work
Packit 15dc08
          fi
Packit 15dc08
        fi
Packit 15dc08
      fi
Packit 15dc08
Packit 15dc08
      if test -z "$exact_cpu"; then
Packit 15dc08
        # Try: bfffo %d1{0:31},%d0
Packit 15dc08
        #      movel #0,%d0
Packit 15dc08
        #      rts
Packit 15dc08
        cat >${dummy}0.s <
Packit 15dc08
	.text
Packit 15dc08
	.globl main
Packit 15dc08
	.globl _main
Packit 15dc08
main:
Packit 15dc08
_main:
Packit 15dc08
	.byte	0xED, 0xC1, 0x00, 0x1F
Packit 15dc08
	.byte	0x70, 0x00
Packit 15dc08
	.byte	0x4e, 0x75
Packit 15dc08
EOF
Packit 15dc08
        if $CC_FOR_BUILD ${dummy}0.s -o $dummy >/dev/null 2>&1; then
Packit 15dc08
          $SHELL -c $dummy >/dev/null 2>&1
Packit 15dc08
	  if test $? != 0; then
Packit 15dc08
            exact_cpu=m68360  # cpu32, because bfffo didn't work
Packit 15dc08
          fi
Packit 15dc08
        fi
Packit 15dc08
      fi
Packit 15dc08
Packit 15dc08
      if test -z "$exact_cpu"; then
Packit 15dc08
        # FIXME: Now we know 68020 or up, but how to detect 030, 040 and 060?
Packit 15dc08
        exact_cpu=m68020
Packit 15dc08
      fi
Packit 15dc08
    fi
Packit 15dc08
  fi
Packit 15dc08
  if test -z "$exact_cpu"; then
Packit 15dc08
    case "$guess_full" in
Packit 15dc08
      *-*-next* | *-*-openstep*)  # NeXTs are 68020 or better
Packit 15dc08
        exact_cpu=m68020 ;;
Packit 15dc08
    esac
Packit 15dc08
  fi
Packit 15dc08
  ;;
Packit 15dc08
Packit 15dc08
Packit 15dc08
rs6000-*-* | powerpc*-*-*)
Packit 15dc08
  # Enhancement: On MacOS the "machine" command prints for instance
Packit 15dc08
  # "ppc750".  Interestingly on powerpc970-apple-darwin6.8.5 it prints
Packit 15dc08
  # "ppc970" where there's no actual #define for 970 from NXGetLocalArchInfo
Packit 15dc08
  # (as noted below).  But the man page says the command is still "under
Packit 15dc08
  # development", so it doesn't seem wise to use it just yet, not while
Packit 15dc08
  # there's an alternative.
Packit 15dc08
Packit 15dc08
  # Grep the /proc/cpuinfo pseudo-file.
Packit 15dc08
  # Anything unrecognised is ignored, since of course we mustn't spit out
Packit 15dc08
  # a cpu type config.sub doesn't know.
Packit 15dc08
  if test -z "$exact_cpu" && test -f /proc/cpuinfo; then
Packit 15dc08
    x=`grep "^cpu[ 	]" /proc/cpuinfo | head -n 1`
Packit 15dc08
    x=`echo $x | sed -n 's/^cpu[ 	]*:[ 	]*\([A-Za-z0-9]*\).*/\1/p'`
Packit 15dc08
    x=`echo $x | sed 's/PPC//'`
Packit 15dc08
    case $x in
Packit 15dc08
      601)     exact_cpu="power" ;;
Packit 15dc08
      603ev)   exact_cpu="powerpc603e" ;;
Packit 15dc08
      604ev5)  exact_cpu="powerpc604e" ;;
Packit 15dc08
      970??)   exact_cpu="powerpc970" ;;
Packit 15dc08
      603 | 603e | 604 | 604e | 750 | 821 | 860)
Packit 15dc08
        exact_cpu="powerpc$x" ;;
Packit 15dc08
      POWER[4-9]*)
Packit 15dc08
        exact_cpu=`echo $x | sed -e "s;POWER;power;" -e "s;[a-zA-Z]*$;;"` ;;
Packit 15dc08
    esac
Packit 15dc08
  fi
Packit 15dc08
Packit 15dc08
  # Try to read the PVR.  mfpvr is a protected instruction, NetBSD, MacOS
Packit 15dc08
  # and AIX don't allow it in user mode, but the Linux kernel does.
Packit 15dc08
  #
Packit 15dc08
  # Note this is no good on AIX, since a C function there is the address of
Packit 15dc08
  # a function descriptor, not actual code.  But this doesn't matter since
Packit 15dc08
  # AIX doesn't allow mfpvr anyway.
Packit 15dc08
  #
Packit 15dc08
  if test -z "$exact_cpu"; then
Packit 15dc08
    eval $set_cc_for_build
Packit 15dc08
    cat >$dummy.c <<\EOF
Packit 15dc08
#include <stdio.h>
Packit 15dc08
int
Packit 15dc08
main ()
Packit 15dc08
{
Packit 15dc08
  unsigned  pvr;
Packit 15dc08
Packit 15dc08
  asm ("mfpvr	%0" : "=r" (pvr));
Packit 15dc08
Packit 15dc08
  switch (pvr >> 16) {
Packit 15dc08
  case 0x0001: puts ("powerpc601");  break;
Packit 15dc08
  case 0x0003: puts ("powerpc603");  break;
Packit 15dc08
  case 0x0004: puts ("powerpc604");  break;
Packit 15dc08
  case 0x0006: puts ("powerpc603e"); break;
Packit 15dc08
  case 0x0007: puts ("powerpc603e"); break;  /* 603ev */
Packit 15dc08
  case 0x0008: puts ("powerpc750");  break;
Packit 15dc08
  case 0x0009: puts ("powerpc604e"); break;
Packit 15dc08
  case 0x000a: puts ("powerpc604e"); break;  /* 604ev5 */
Packit 15dc08
  case 0x000c: puts ("powerpc7400"); break;
Packit 15dc08
  case 0x0041: puts ("powerpc630");  break;
Packit 15dc08
  case 0x003f: puts ("power7");      break;
Packit 15dc08
  case 0x004b: puts ("power8");      break;
Packit 15dc08
  case 0x0050: puts ("powerpc860");  break;
Packit 15dc08
  case 0x8000: puts ("powerpc7450"); break;
Packit 15dc08
  case 0x8001: puts ("powerpc7455"); break;
Packit 15dc08
  case 0x8002: puts ("powerpc7457"); break;
Packit 15dc08
  case 0x8003: puts ("powerpc7447"); break; /* really 7447A */
Packit 15dc08
  case 0x800c: puts ("powerpc7410"); break;
Packit 15dc08
  }
Packit 15dc08
  return 0;
Packit 15dc08
}
Packit 15dc08
EOF
Packit 15dc08
    if ($CC_FOR_BUILD $dummy.c -o $dummy) >/dev/null 2>&1; then
Packit 15dc08
      # This style construct is needed on AIX 4.3 to suppress the SIGILL error
Packit 15dc08
      # from (*fun)().  Using $SHELL -c $dummy 2>/dev/null doesn't work.
Packit 15dc08
      { x=`$dummy`; } 2>/dev/null
Packit 15dc08
      if test -n "$x"; then
Packit 15dc08
	exact_cpu=$x
Packit 15dc08
      fi
Packit 15dc08
    fi
Packit 15dc08
  fi
Packit 15dc08
Packit 15dc08
  if test -z "$exact_cpu"; then
Packit 15dc08
    # On AIX, try looking at _system_configuration.  This is present in
Packit 15dc08
    # version 4 at least.
Packit 15dc08
    cat >$dummy.c <
Packit 15dc08
#include <stdio.h>
Packit 15dc08
#include <sys/systemcfg.h>
Packit 15dc08
int
Packit 15dc08
main ()
Packit 15dc08
{
Packit 15dc08
  switch (_system_configuration.implementation) {
Packit 15dc08
  /* Old versions of AIX don't have all these constants,
Packit 15dc08
     use ifdef for safety. */
Packit 15dc08
#ifdef POWER_RS2
Packit 15dc08
  case POWER_RS2:    puts ("power2");     break;
Packit 15dc08
#endif
Packit 15dc08
#ifdef POWER_601
Packit 15dc08
  case POWER_601:    puts ("power");      break;
Packit 15dc08
#endif
Packit 15dc08
#ifdef POWER_603
Packit 15dc08
  case POWER_603:    puts ("powerpc603"); break;
Packit 15dc08
#endif
Packit 15dc08
#ifdef POWER_604
Packit 15dc08
  case POWER_604:    puts ("powerpc604"); break;
Packit 15dc08
#endif
Packit 15dc08
#ifdef POWER_620
Packit 15dc08
  case POWER_620:    puts ("powerpc620"); break;
Packit 15dc08
#endif
Packit 15dc08
#ifdef POWER_630
Packit 15dc08
  case POWER_630:    puts ("powerpc630"); break;
Packit 15dc08
#endif
Packit 15dc08
  /* Dunno what this is, leave it out for now.
Packit 15dc08
  case POWER_A35:    puts ("powerpca35"); break;
Packit 15dc08
  */
Packit 15dc08
  /* This is waiting for a bit more info.
Packit 15dc08
  case POWER_RS64II: puts ("powerpcrs64ii"); break;
Packit 15dc08
  */
Packit 15dc08
#ifdef POWER_4
Packit 15dc08
  case POWER_4:    puts ("power4"); break;
Packit 15dc08
#endif
Packit 15dc08
#ifdef POWER_5
Packit 15dc08
  case POWER_5:    puts ("power5"); break;
Packit 15dc08
#endif
Packit 15dc08
#ifdef POWER_6
Packit 15dc08
  case POWER_6:    puts ("power6"); break;
Packit 15dc08
#endif
Packit 15dc08
#ifdef POWER_7
Packit 15dc08
  case POWER_7:    puts ("power7"); break;
Packit 15dc08
#endif
Packit 15dc08
#ifdef POWER_8
Packit 15dc08
  case POWER_8:    puts ("power8"); break;
Packit 15dc08
#endif
Packit 15dc08
  default:
Packit 15dc08
    if (_system_configuration.architecture == POWER_RS)
Packit 15dc08
      puts ("power");
Packit 15dc08
    else if (_system_configuration.width == 64)
Packit 15dc08
      puts ("powerpc64");
Packit 15dc08
  }
Packit 15dc08
  return 0;
Packit 15dc08
}
Packit 15dc08
EOF
Packit 15dc08
    if ($CC_FOR_BUILD $dummy.c -o $dummy) >/dev/null 2>&1; then
Packit 15dc08
      x=`$dummy`
Packit 15dc08
      if test -n "$x"; then
Packit 15dc08
        exact_cpu=$x
Packit 15dc08
      fi
Packit 15dc08
    fi
Packit 15dc08
  fi
Packit 15dc08
Packit 15dc08
  if test -z "$exact_cpu"; then
Packit 15dc08
    # On MacOS X (or any Mach-O presumably), NXGetLocalArchInfo cpusubtype
Packit 15dc08
    # can tell us the exact cpu.
Packit 15dc08
    cat >$dummy.c <
Packit 15dc08
#include <stdio.h>
Packit 15dc08
#include <mach-o/arch.h>
Packit 15dc08
int
Packit 15dc08
main (void)
Packit 15dc08
{
Packit 15dc08
  const NXArchInfo *a = NXGetLocalArchInfo();
Packit 15dc08
  if (a->cputype == CPU_TYPE_POWERPC)
Packit 15dc08
    {
Packit 15dc08
      switch (a->cpusubtype) {
Packit 15dc08
      /* The following known to Darwin 1.3. */
Packit 15dc08
      case CPU_SUBTYPE_POWERPC_601:   puts ("powerpc601");  break;
Packit 15dc08
      case CPU_SUBTYPE_POWERPC_602:   puts ("powerpc602");  break;
Packit 15dc08
      case CPU_SUBTYPE_POWERPC_603:   puts ("powerpc603");  break;
Packit 15dc08
      case CPU_SUBTYPE_POWERPC_603e:  puts ("powerpc603e"); break;
Packit 15dc08
      case CPU_SUBTYPE_POWERPC_603ev: puts ("powerpc603e"); break;
Packit 15dc08
      case CPU_SUBTYPE_POWERPC_604:   puts ("powerpc604");  break;
Packit 15dc08
      case CPU_SUBTYPE_POWERPC_604e:  puts ("powerpc604e"); break;
Packit 15dc08
      case CPU_SUBTYPE_POWERPC_620:   puts ("powerpc620");  break;
Packit 15dc08
      case CPU_SUBTYPE_POWERPC_750:   puts ("powerpc750");  break;
Packit 15dc08
      case CPU_SUBTYPE_POWERPC_7400:  puts ("powerpc7400"); break;
Packit 15dc08
      case CPU_SUBTYPE_POWERPC_7450:  puts ("powerpc7450"); break;
Packit 15dc08
      /* Darwin 6.8.5 doesn't define the following */
Packit 15dc08
      case 0x8001:                    puts ("powerpc7455"); break;
Packit 15dc08
      case 0x8002:                    puts ("powerpc7457"); break;
Packit 15dc08
      case 0x8003:                    puts ("powerpc7447"); break;
Packit 15dc08
      case 100:                       puts ("powerpc970");  break;
Packit 15dc08
      }
Packit 15dc08
    }
Packit 15dc08
  return 0;
Packit 15dc08
}
Packit 15dc08
EOF
Packit 15dc08
    if ($CC_FOR_BUILD $dummy.c -o $dummy) >/dev/null 2>&1; then
Packit 15dc08
      x=`$dummy`
Packit 15dc08
      if test -n "$x"; then
Packit 15dc08
        exact_cpu=$x
Packit 15dc08
      fi
Packit 15dc08
    fi
Packit 15dc08
  fi
Packit 15dc08
  ;;
Packit 15dc08
Packit 15dc08
sparc-*-* | sparc64-*-*)
Packit 15dc08
  # If we can recognise an actual v7 then $exact_cpu is set to "sparc" so as
Packit 15dc08
  # to short-circuit subsequent tests.
Packit 15dc08
Packit 15dc08
  # Grep the linux kernel /proc/cpuinfo pseudo-file.
Packit 15dc08
  # A typical line is "cpu\t\t: TI UltraSparc II  (BlackBird)"
Packit 15dc08
  # See arch/sparc/kernel/cpu.c and arch/sparc64/kernel/cpu.c.
Packit 15dc08
  #
Packit 15dc08
  if test -f /proc/cpuinfo; then
Packit 15dc08
    if grep 'cpu.*Cypress' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      exact_cpu="sparc"   # ie. v7
Packit 15dc08
    elif grep 'cpu.*Power-UP' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      exact_cpu="sparc"   # ie. v7
Packit 15dc08
    elif grep 'cpu.*HyperSparc' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      exact_cpu="sparcv8"
Packit 15dc08
    elif grep 'cpu.*SuperSparc' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      exact_cpu="supersparc"
Packit 15dc08
    elif grep 'cpu.*MicroSparc' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      exact_cpu="microsparc"
Packit 15dc08
    elif grep 'cpu.*MB86904' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      # actually MicroSPARC-II
Packit 15dc08
      exact_cpu=microsparc
Packit 15dc08
    elif grep 'cpu.*UltraSparc T5' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      exact_cpu="ultrasparct5"
Packit 15dc08
    elif grep 'cpu.*UltraSparc T4' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      exact_cpu="ultrasparct4"
Packit 15dc08
    elif grep 'cpu.*UltraSparc T3' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      exact_cpu="ultrasparct3"
Packit 15dc08
    elif grep 'cpu.*UltraSparc T2' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      exact_cpu="ultrasparct2"
Packit 15dc08
    elif grep 'cpu.*UltraSparc T1' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      exact_cpu="ultrasparct1"
Packit 15dc08
    elif grep 'cpu.*UltraSparc III' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      exact_cpu="ultrasparc3"
Packit 15dc08
    elif grep 'cpu.*UltraSparc IIi' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      exact_cpu="ultrasparc2i"
Packit 15dc08
    elif grep 'cpu.*UltraSparc II' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      exact_cpu="ultrasparc2"
Packit 15dc08
    elif grep 'cpu.*UltraSparc' /proc/cpuinfo >/dev/null; then
Packit 15dc08
      exact_cpu="ultrasparc"
Packit 15dc08
    fi
Packit 15dc08
  fi
Packit 15dc08
Packit 15dc08
  # Need to invoke this for setup of $dummy
Packit 15dc08
  eval $set_cc_for_build
Packit 15dc08
Packit 15dc08
  # Grep the output from sysinfo on SunOS.
Packit 15dc08
  # sysinfo has been seen living in /bin or in /usr/kvm
Packit 15dc08
  #	cpu0 is a "SuperSPARC Model 41 SPARCmodule" CPU
Packit 15dc08
  #	cpu0 is a "75 MHz TI,TMS390Z55" CPU
Packit 15dc08
  #
Packit 15dc08
  if test -z "$exact_cpu"; then
Packit 15dc08
    for i in sysinfo /usr/kvm/sysinfo; do
Packit 15dc08
      if $SHELL -c $i 2>/dev/null >$dummy; then
Packit 15dc08
        if grep 'cpu0 is a "SuperSPARC' $dummy >/dev/null; then
Packit 15dc08
          exact_cpu=supersparc
Packit 15dc08
          break
Packit 15dc08
        elif grep 'cpu0 is a .*TMS390Z5.' $dummy >/dev/null; then
Packit 15dc08
          # TMS390Z50 and TMS390Z55
Packit 15dc08
          exact_cpu=supersparc
Packit 15dc08
          break
Packit 15dc08
        fi
Packit 15dc08
      fi
Packit 15dc08
    done
Packit 15dc08
  fi
Packit 15dc08
Packit 15dc08
  # Grep the output from prtconf on Solaris.
Packit 15dc08
  # Use an explicit /usr/sbin, since that directory might not be in a normal
Packit 15dc08
  # user's path.
Packit 15dc08
  #
Packit 15dc08
  #     SUNW,UltraSPARC (driver not attached)
Packit 15dc08
  #     SUNW,UltraSPARC-II (driver not attached)
Packit 15dc08
  #     SUNW,UltraSPARC-IIi (driver not attached)
Packit 15dc08
  #     SUNW,UltraSPARC-III+ (driver not attached)
Packit 15dc08
  #     Ross,RT625 (driver not attached)
Packit 15dc08
  #     TI,TMS390Z50 (driver not attached)
Packit 15dc08
  #
Packit 15dc08
  # /usr/sbin/sysdef prints similar information, but includes all loadable
Packit 15dc08
  # cpu modules, not just the real cpu.
Packit 15dc08
  #
Packit 15dc08
  # We first try a plain prtconf, since that is known to work on older systems.
Packit 15dc08
  # But for newer T1 systems, that doesn't produce any useful output, we need
Packit 15dc08
  # "prtconf -vp" there.
Packit 15dc08
  #
Packit 15dc08
  for prtconfopt in "" "-vp"; do
Packit 15dc08
    if test -z "$exact_cpu"; then
Packit 15dc08
      if $SHELL -c "/usr/sbin/prtconf $prtconfopt" 2>/dev/null >$dummy; then
Packit 15dc08
	if grep 'SUNW,UltraSPARC-T5' $dummy >/dev/null; then
Packit 15dc08
	  exact_cpu=ultrasparct5
Packit 15dc08
	elif grep 'SUNW,UltraSPARC-T4' $dummy >/dev/null; then
Packit 15dc08
	  exact_cpu=ultrasparct4
Packit 15dc08
	elif grep 'SUNW,UltraSPARC-T3' $dummy >/dev/null; then
Packit 15dc08
	  exact_cpu=ultrasparct3
Packit 15dc08
	elif grep 'SUNW,UltraSPARC-T2' $dummy >/dev/null; then
Packit 15dc08
	  exact_cpu=ultrasparct2
Packit 15dc08
	elif grep 'SUNW,UltraSPARC-T1' $dummy >/dev/null; then
Packit 15dc08
	  exact_cpu=ultrasparct1
Packit 15dc08
	elif grep 'SUNW,UltraSPARC-III' $dummy >/dev/null; then
Packit 15dc08
	  exact_cpu=ultrasparc3
Packit 15dc08
	elif grep 'SUNW,UltraSPARC-IIi' $dummy >/dev/null; then
Packit 15dc08
	  exact_cpu=ultrasparc2i
Packit 15dc08
	elif grep 'SUNW,UltraSPARC-II' $dummy >/dev/null; then
Packit 15dc08
	  exact_cpu=ultrasparc2
Packit 15dc08
	elif grep 'SUNW,UltraSPARC' $dummy >/dev/null; then
Packit 15dc08
	  exact_cpu=ultrasparc
Packit 15dc08
	elif grep 'Ross,RT62.' $dummy >/dev/null; then
Packit 15dc08
	  # RT620, RT625, RT626 hypersparcs (v8).
Packit 15dc08
	  exact_cpu=sparcv8
Packit 15dc08
	elif grep 'TI,TMS390Z5.' $dummy >/dev/null; then
Packit 15dc08
	  # TMS390Z50 and TMS390Z55
Packit 15dc08
	  exact_cpu=supersparc
Packit 15dc08
	elif grep 'TI,TMS390S10' $dummy >/dev/null; then
Packit 15dc08
	  exact_cpu=microsparc
Packit 15dc08
	elif grep 'FMI,MB86904' $dummy >/dev/null; then
Packit 15dc08
	  # actually MicroSPARC-II
Packit 15dc08
	  exact_cpu=microsparc
Packit 15dc08
	fi
Packit 15dc08
      fi
Packit 15dc08
    fi
Packit 15dc08
  done
Packit 15dc08
Packit 15dc08
  # Grep the output from sysctl hw.model on sparc or sparc64 *BSD.
Packit 15dc08
  # Use an explicit /sbin, since that directory might not be in a normal
Packit 15dc08
  # user's path.  Example outputs,
Packit 15dc08
  #
Packit 15dc08
  #     hw.model: Sun Microsystems UltraSparc-IIi
Packit 15dc08
  #
Packit 15dc08
  if test -z "$exact_cpu"; then
Packit 15dc08
    if $SHELL -c "/sbin/sysctl hw.model" 2>/dev/null >$dummy; then
Packit 15dc08
      if grep -i 'UltraSparc-T5' $dummy >/dev/null; then
Packit 15dc08
        exact_cpu=ultrasparct5
Packit 15dc08
      elif grep -i 'UltraSparc-T4' $dummy >/dev/null; then
Packit 15dc08
        exact_cpu=ultrasparct4
Packit 15dc08
      elif grep -i 'UltraSparc-T3' $dummy >/dev/null; then
Packit 15dc08
        exact_cpu=ultrasparct3
Packit 15dc08
      elif grep -i 'UltraSparc-T2' $dummy >/dev/null; then
Packit 15dc08
        exact_cpu=ultrasparct2
Packit 15dc08
      elif grep -i 'UltraSparc-T1' $dummy >/dev/null; then
Packit 15dc08
        exact_cpu=ultrasparct1
Packit 15dc08
      elif grep -i 'UltraSparc-III' $dummy >/dev/null; then
Packit 15dc08
        exact_cpu=ultrasparc3
Packit 15dc08
      elif grep -i 'UltraSparc-IIi' $dummy >/dev/null; then
Packit 15dc08
        exact_cpu=ultrasparc2i
Packit 15dc08
      elif grep -i 'UltraSparc-II' $dummy >/dev/null; then
Packit 15dc08
        exact_cpu=ultrasparc2
Packit 15dc08
      elif grep -i 'UltraSparc' $dummy >/dev/null; then
Packit 15dc08
        exact_cpu=ultrasparc
Packit 15dc08
      elif grep 'TMS390Z5.' $dummy >/dev/null; then
Packit 15dc08
        # TMS390Z50 and TMS390Z55
Packit 15dc08
        exact_cpu=supersparc
Packit 15dc08
      elif grep 'TMS390S10' $dummy >/dev/null; then
Packit 15dc08
        exact_cpu=microsparc
Packit 15dc08
      elif grep 'MB86904' $dummy >/dev/null; then
Packit 15dc08
        # actually MicroSPARC-II
Packit 15dc08
        exact_cpu=microsparc
Packit 15dc08
      elif grep 'MB86907' $dummy >/dev/null; then
Packit 15dc08
        exact_cpu=turbosparc
Packit 15dc08
      fi
Packit 15dc08
    fi
Packit 15dc08
  fi
Packit 15dc08
Packit 15dc08
  # sun4m and sun4d are v8s of some sort, sun4u is a v9 of some sort
Packit 15dc08
  #
Packit 15dc08
  if test -z "$exact_cpu"; then
Packit 15dc08
    case `uname -m` in
Packit 15dc08
      sun4[md]) exact_cpu=sparcv8 ;;
Packit 15dc08
      sun4u)    exact_cpu=sparcv9 ;;
Packit 15dc08
    esac
Packit 15dc08
  fi
Packit 15dc08
  ;;
Packit 15dc08
Packit 15dc08
Packit 15dc08
# Recognise x86 processors using a tricky cpuid with 4 arguments, repeating
Packit 15dc08
# arguments; for x86-64 we effectively pass the 1st in rdx and the 2nd in rcx.
Packit 15dc08
# This allows the same asm to work for both standard and Windoze calling
Packit 15dc08
# conventions.
Packit 15dc08
Packit 15dc08
i?86-*-* | amd64-*-* | x86_64-*-*)
Packit 15dc08
  eval $set_cc_for_build
Packit 15dc08
Packit 15dc08
  cat <<EOF >$dummy.c
Packit 15dc08
#include <string.h>
Packit 15dc08
#include <stdio.h>
Packit 15dc08
#define CPUID(a,b) cpuid(b,a,a,b)
Packit 15dc08
#if __cplusplus
Packit 15dc08
extern "C"
Packit 15dc08
#endif
Packit 15dc08
unsigned int cpuid (int, char *, char *, int);
Packit 15dc08
Packit 15dc08
int
Packit 15dc08
gmp_workaround_skylake_cpuid_bug ()
Packit 15dc08
{
Packit 15dc08
  char feature_string[49];
Packit 15dc08
  char processor_name_string[49];
Packit 15dc08
  static const char *bad_cpus[] = {" G44", " G45", " G39" /* , "6600" */ };
Packit 15dc08
  int i;
Packit 15dc08
Packit 15dc08
  /* Example strings:                                   */
Packit 15dc08
  /* "Intel(R) Pentium(R) CPU G4400 @ 3.30GHz"          */
Packit 15dc08
  /* "Intel(R) Core(TM) i5-6600K CPU @ 3.50GHz"         */
Packit 15dc08
  /*                  ^               ^               ^ */
Packit 15dc08
  /*     0x80000002       0x80000003      0x80000004    */
Packit 15dc08
  /* We match out just the 0x80000003 part here. */
Packit 15dc08
Packit 15dc08
  /* In their infinitive wisdom, Intel decided to use one register order for
Packit 15dc08
     the vendor string, and another for the processor name string.  We shuffle
Packit 15dc08
     things about here, rather than write a new variant of our assembly cpuid.
Packit 15dc08
  */
Packit 15dc08
Packit 15dc08
  unsigned int eax, ebx, ecx, edx;
Packit 15dc08
  eax = CPUID (feature_string, 0x80000003);
Packit 15dc08
  ebx = ((unsigned int *)feature_string)[0];
Packit 15dc08
  edx = ((unsigned int *)feature_string)[1];
Packit 15dc08
  ecx = ((unsigned int *)feature_string)[2];
Packit 15dc08
Packit 15dc08
  ((unsigned int *) (processor_name_string))[0] = eax;
Packit 15dc08
  ((unsigned int *) (processor_name_string))[1] = ebx;
Packit 15dc08
  ((unsigned int *) (processor_name_string))[2] = ecx;
Packit 15dc08
  ((unsigned int *) (processor_name_string))[3] = edx;
Packit 15dc08
Packit 15dc08
  processor_name_string[16] = 0;
Packit 15dc08
Packit 15dc08
  for (i = 0; i < sizeof (bad_cpus) / sizeof (char *); i++)
Packit 15dc08
    {
Packit 15dc08
      if (strstr (processor_name_string, bad_cpus[i]) != 0)
Packit 15dc08
	return 1;
Packit 15dc08
    }
Packit 15dc08
  return 0;
Packit 15dc08
}
Packit 15dc08
Packit 15dc08
int
Packit 15dc08
main ()
Packit 15dc08
{
Packit 15dc08
  char vendor_string[13];
Packit 15dc08
  char feature_string[12];
Packit 15dc08
  long fms;
Packit 15dc08
  int family, model;
Packit 15dc08
  const char *modelstr, *suffix;
Packit 15dc08
  int cpu_64bit = 0, cpu_avx = 0;
Packit 15dc08
  int cpuid_64bit, cpuid_avx, cpuid_osxsave;
Packit 15dc08
Packit 15dc08
  CPUID (vendor_string, 0);
Packit 15dc08
  vendor_string[12] = 0;
Packit 15dc08
Packit 15dc08
  fms = CPUID (feature_string, 1);
Packit 15dc08
Packit 15dc08
  family = ((fms >> 8) & 0xf) + ((fms >> 20) & 0xff);
Packit 15dc08
  model = ((fms >> 4) & 0xf) + ((fms >> 12) & 0xf0);
Packit 15dc08
Packit 15dc08
  cpuid_avx     = (feature_string[11] >> 4) & 1;
Packit 15dc08
  cpuid_osxsave = (feature_string[11] >> 3) & 1;
Packit 15dc08
Packit 15dc08
  modelstr = "$guess_cpu";
Packit 15dc08
Packit 15dc08
  /**************************************************/
Packit 15dc08
  /*** WARNING: keep this list in sync with fat.c ***/
Packit 15dc08
  /**************************************************/
Packit 15dc08
  if (strcmp (vendor_string, "GenuineIntel") == 0)
Packit 15dc08
    {
Packit 15dc08
      switch (family)
Packit 15dc08
	{
Packit 15dc08
	case 5:
Packit 15dc08
	  if (model <= 2)	modelstr = "pentium";
Packit 15dc08
	  else if (model >= 4)	modelstr = "pentiummmx";
Packit 15dc08
	  break;
Packit 15dc08
	case 6:
Packit 15dc08
          if (model <= 1)                                   modelstr = "pentiumpro";
Packit 15dc08
          else if (model <= 6)                              modelstr = "pentium2";
Packit 15dc08
          else if (model <= 8)                              modelstr = "pentium3";
Packit 15dc08
          else if (model <= 9)                              modelstr = "pentiumm";
Packit 15dc08
          else if (model <= 0x0c)                           modelstr = "pentium3";
Packit 15dc08
          else if (model <= 0x0e)                           modelstr = "pentiumm";
Packit 15dc08
          else if (model <= 0x19) cpu_64bit = 1,            modelstr = "core2";
Packit 15dc08
          else if (model == 0x1a) cpu_64bit = 1,            modelstr = "nehalem";    /* NHM Gainestown */
Packit 15dc08
          else if (model == 0x1c) cpu_64bit = 1,            modelstr = "atom";       /* Silverthorne */
Packit 15dc08
          else if (model == 0x1d) cpu_64bit = 1,            modelstr = "core2";      /* PNR Dunnington */
Packit 15dc08
          else if (model == 0x1e) cpu_64bit = 1,            modelstr = "nehalem";    /* NHM Lynnfield/Jasper */
Packit 15dc08
          else if (model == 0x25) cpu_64bit = 1,            modelstr = "westmere";   /* WSM Clarkdale/Arrandale */
Packit 15dc08
          else if (model == 0x26) cpu_64bit = 1,            modelstr = "atom";       /* Lincroft */
Packit 15dc08
          else if (model == 0x27) cpu_64bit = 1,            modelstr = "atom";       /* Saltwell */
Packit 15dc08
          else if (model == 0x2a) cpu_64bit = 1, cpu_avx=1, modelstr = "sandybridge";/* SB */
Packit 15dc08
          else if (model == 0x2c) cpu_64bit = 1,            modelstr = "westmere";   /* WSM Gulftown */
Packit 15dc08
          else if (model == 0x2d) cpu_64bit = 1, cpu_avx=1, modelstr = "sandybridge";/* SBC-EP */
Packit 15dc08
          else if (model == 0x2e) cpu_64bit = 1,            modelstr = "nehalem";    /* NHM Beckton */
Packit 15dc08
          else if (model == 0x2f) cpu_64bit = 1,            modelstr = "westmere";   /* WSM Eagleton */
Packit 15dc08
          else if (model == 0x36) cpu_64bit = 1,            modelstr = "atom";       /* Cedarview/Saltwell */
Packit 15dc08
          else if (model == 0x37) cpu_64bit = 1,            modelstr = "silvermont"; /* Silvermont */
Packit 15dc08
          else if (model == 0x3a) cpu_64bit = 1, cpu_avx=1, modelstr = "ivybridge";  /* IBR */
Packit 15dc08
          else if (model == 0x3c) cpu_64bit = 1, cpu_avx=1, modelstr = "haswell";    /* Haswell client */
Packit 15dc08
          else if (model == 0x3d) cpu_64bit = 1, cpu_avx=1, modelstr = "broadwell";  /* Broadwell */
Packit 15dc08
          else if (model == 0x3e) cpu_64bit = 1, cpu_avx=1, modelstr = "ivybridge";  /* Ivytown */
Packit 15dc08
          else if (model == 0x3f) cpu_64bit = 1, cpu_avx=1, modelstr = "haswell";    /* Haswell server */
Packit 15dc08
          else if (model == 0x45) cpu_64bit = 1, cpu_avx=1, modelstr = "haswell";    /* Haswell ULT */
Packit 15dc08
          else if (model == 0x46) cpu_64bit = 1, cpu_avx=1, modelstr = "haswell";    /* Crystal Well */
Packit 15dc08
          else if (model == 0x47) cpu_64bit = 1, cpu_avx=1, modelstr = "broadwell";  /* Broadwell */
Packit 15dc08
          else if (model == 0x4a) cpu_64bit = 1,            modelstr = "silvermont"; /* Silvermont */
Packit 15dc08
          else if (model == 0x4c) cpu_64bit = 1,            modelstr = "silvermont"; /* Airmont */
Packit 15dc08
          else if (model == 0x4d) cpu_64bit = 1,            modelstr = "silvermont"; /* Silvermont/Avoton */
Packit 15dc08
          else if (model == 0x4e) cpu_64bit = 1, cpu_avx=1, modelstr = "skylake";    /* Skylake client */
Packit 15dc08
          else if (model == 0x4f) cpu_64bit = 1, cpu_avx=1, modelstr = "broadwell";  /* Broadwell server */
Packit 15dc08
          else if (model == 0x55) cpu_64bit = 1, cpu_avx=1, modelstr = "skylake";    /* Skylake server */
Packit 15dc08
          else if (model == 0x56) cpu_64bit = 1, cpu_avx=1, modelstr = "broadwell";  /* Broadwell microserver */
Packit 15dc08
          else if (model == 0x57) cpu_64bit = 1,            modelstr = "knightslanding"; /* aka Xeon Phi */
Packit 15dc08
          else if (model == 0x5a) cpu_64bit = 1,            modelstr = "silvermont"; /* Silvermont */
Packit 15dc08
          else if (model == 0x5c) cpu_64bit = 1,            modelstr = "goldmont";   /* Goldmont */
Packit 15dc08
          else if (model == 0x5e) cpu_64bit = 1, cpu_avx=1, modelstr = "skylake";    /* Skylake */
Packit 15dc08
          else if (model == 0x5f) cpu_64bit = 1,            modelstr = "goldmont";   /* Goldmont */
Packit 15dc08
          else if (model == 0x8e) cpu_64bit = 1, cpu_avx=1, modelstr = "kabylake";   /* Kabylake Y/U */
Packit 15dc08
          else if (model == 0x9e) cpu_64bit = 1, cpu_avx=1, modelstr = "kabylake";   /* Kabylake desktop */
Packit 15dc08
          else                    cpu_64bit = 1,            modelstr = "nehalem";    /* default */
Packit 15dc08
Packit 15dc08
	  if (strcmp (modelstr, "haswell") == 0 ||
Packit 15dc08
	      strcmp (modelstr, "broadwell") == 0 ||
Packit 15dc08
	      strcmp (modelstr, "skylake") == 0)
Packit 15dc08
	    {
Packit 15dc08
	      /* Some haswell, broadwell, skylake lack BMI2.  Let them appear
Packit 15dc08
		 as sandybridge for now.  */
Packit 15dc08
	      CPUID (feature_string, 7);
Packit 15dc08
	      if ((feature_string[0 + 8 / 8] & (1 << (8 % 8))) == 0
Packit 15dc08
		  || gmp_workaround_skylake_cpuid_bug ())
Packit 15dc08
		modelstr = "sandybridge";
Packit 15dc08
	    }
Packit 15dc08
Packit 15dc08
	  break;
Packit 15dc08
	case 15:
Packit 15dc08
	  cpu_64bit = 1, modelstr = "pentium4";
Packit 15dc08
	  break;
Packit 15dc08
	}
Packit 15dc08
    }
Packit 15dc08
  else if (strcmp (vendor_string, "AuthenticAMD") == 0)
Packit 15dc08
    {
Packit 15dc08
      switch (family)
Packit 15dc08
	{
Packit 15dc08
	case 5:
Packit 15dc08
	  if (model <= 3)	modelstr = "k5";
Packit 15dc08
	  else if (model <= 7)	modelstr = "k6";
Packit 15dc08
	  else if (model == 8)	modelstr = "k62";
Packit 15dc08
	  else if (model == 9)	modelstr = "k63";
Packit 15dc08
	  else if (model == 10) modelstr = "geode";
Packit 15dc08
	  else if (model == 13) modelstr = "k63";
Packit 15dc08
	  break;
Packit 15dc08
	case 6:
Packit 15dc08
	  modelstr = "athlon";
Packit 15dc08
	  break;
Packit 15dc08
	case 15:		/* K8, K9 */
Packit 15dc08
	  cpu_64bit = 1, modelstr = "k8";
Packit 15dc08
	  break;
Packit 15dc08
	case 16:		/* K10 */
Packit 15dc08
	  cpu_64bit = 1, modelstr = "k10";
Packit 15dc08
	  break;
Packit 15dc08
	case 17:		/* Hybrid k8/k10, claim k8 */
Packit 15dc08
	  cpu_64bit = 1, modelstr = "k8";
Packit 15dc08
	  break;
Packit 15dc08
	case 18:		/* Llano, uses K10 core */
Packit 15dc08
	  cpu_64bit = 1, modelstr = "k10";
Packit 15dc08
	  break;
Packit 15dc08
	case 19:		/* AMD Internal, assume future K10 */
Packit 15dc08
	  cpu_64bit = 1, modelstr = "k10";
Packit 15dc08
	  break;
Packit 15dc08
	case 20:		/* Bobcat */
Packit 15dc08
	  cpu_64bit = 1, modelstr = "bobcat";
Packit 15dc08
	  break;
Packit 15dc08
	case 21:		/* Bulldozer */
Packit 15dc08
	  cpu_64bit = 1, cpu_avx = 1;
Packit 15dc08
	  if (model <= 1)
Packit 15dc08
	    modelstr = "bulldozer";
Packit 15dc08
	  else if (model < 0x20)	/* really 2, [0x10-0x20) */
Packit 15dc08
	    modelstr = "piledriver";
Packit 15dc08
	  else if (model < 0x40)	/* really [0x30-0x40) */
Packit 15dc08
	    modelstr = "steamroller";
Packit 15dc08
	  else				/* really [0x60-0x70) */
Packit 15dc08
	    modelstr = "excavator";
Packit 15dc08
	  break;
Packit 15dc08
	case 22:		/* Jaguar, an improved bobcat */
Packit 15dc08
	  cpu_64bit = 1, cpu_avx = 1, modelstr = "jaguar";
Packit 15dc08
	  break;
Packit 15dc08
	}
Packit 15dc08
    }
Packit 15dc08
  else if (strcmp (vendor_string, "CyrixInstead") == 0)
Packit 15dc08
    {
Packit 15dc08
      /* Should recognize Cyrix' processors too.  */
Packit 15dc08
    }
Packit 15dc08
  else if (strcmp (vendor_string, "CentaurHauls") == 0)
Packit 15dc08
    {
Packit 15dc08
      switch (family)
Packit 15dc08
	{
Packit 15dc08
	case 6:
Packit 15dc08
	  if (model < 9)	modelstr = "viac3";
Packit 15dc08
	  else if (model < 15)	modelstr = "viac32";
Packit 15dc08
	  else			cpu_64bit = 1, modelstr = "nano";
Packit 15dc08
	  break;
Packit 15dc08
	}
Packit 15dc08
    }
Packit 15dc08
Packit 15dc08
  CPUID (feature_string, 0x80000001);
Packit 15dc08
  cpuid_64bit = (feature_string[7] >> 5) & 1;
Packit 15dc08
Packit 15dc08
  suffix = "";
Packit 15dc08
Packit 15dc08
  if (cpuid_64bit && ! cpu_64bit)
Packit 15dc08
    /* If our cpuid-based CPU identification thinks this is a 32-bit CPU but
Packit 15dc08
       cpuid claims AMD64 capabilities, then revert to the generic "x86_64".
Packit 15dc08
       This is of course wrong, but it can happen in some virtualisers and
Packit 15dc08
       emulators, and this workaround allows for successful 64-bit builds.  */
Packit 15dc08
    modelstr = "x86_64";
Packit 15dc08
  else if (cpu_avx && ! (cpuid_avx && cpuid_osxsave))
Packit 15dc08
    /* For CPUs nominally capable of executing AVX, append "noavx" when not
Packit 15dc08
       both the AVX and OSXSAVE cpuid bits are set.  We tolerate weirdness
Packit 15dc08
       here, as some virtualisers set a broken cpuid state here, while other
Packit 15dc08
       virtualisers allow users to set a broken state.  */
Packit 15dc08
    suffix = "noavx";
Packit 15dc08
Packit 15dc08
  printf ("%s%s", modelstr, suffix);
Packit 15dc08
  return 0;
Packit 15dc08
}
Packit 15dc08
EOF
Packit 15dc08
Packit 15dc08
# The rcx/ecx zeroing here and in the variant below is needed for the BMI2
Packit 15dc08
# check.
Packit 15dc08
Packit 15dc08
  cat <<EOF >${dummy}0.s
Packit 15dc08
	.globl cpuid
Packit 15dc08
	.globl _cpuid
Packit 15dc08
cpuid:
Packit 15dc08
_cpuid:
Packit 15dc08
	push	%rbx
Packit 15dc08
	mov	%rdx, %r8
Packit 15dc08
	mov	%ecx, %eax
Packit 15dc08
	xor	%ecx, %ecx
Packit 15dc08
	.byte	0x0f
Packit 15dc08
	.byte	0xa2
Packit 15dc08
	mov	%ebx, (%r8)
Packit 15dc08
	mov	%edx, 4(%r8)
Packit 15dc08
	mov	%ecx, 8(%r8)
Packit 15dc08
	pop	%rbx
Packit 15dc08
	ret
Packit 15dc08
EOF
Packit 15dc08
Packit 15dc08
  if ($CC_FOR_BUILD ${dummy}0.s $dummy.c -o $dummy) >/dev/null 2>&1; then
Packit 15dc08
    # On 80386 and early 80486 cpuid is not available and will result in a
Packit 15dc08
    # SIGILL message, hence 2>/dev/null.
Packit 15dc08
    #
Packit 15dc08
    # On i386-unknown-freebsd4.9, "/bin/sh -c ./dummy" seems to send an
Packit 15dc08
    # "Illegal instruction (core dumped)" message to stdout, so we test $?
Packit 15dc08
    # to check if the program run was successful.
Packit 15dc08
    #
Packit 15dc08
    x=`$SHELL -c $dummy 2>/dev/null`
Packit 15dc08
    if test $? = 0 && test -n "$x"; then
Packit 15dc08
      exact_cpu=$x
Packit 15dc08
    fi
Packit 15dc08
  fi
Packit 15dc08
Packit 15dc08
  cat <<EOF >${dummy}0.s
Packit 15dc08
	.globl cpuid
Packit 15dc08
	.globl _cpuid
Packit 15dc08
cpuid:
Packit 15dc08
_cpuid:
Packit 15dc08
	pushl %esi
Packit 15dc08
	pushl %ebx
Packit 15dc08
	movl 24(%esp),%eax
Packit 15dc08
	xor	%ecx, %ecx
Packit 15dc08
	.byte 0x0f
Packit 15dc08
	.byte 0xa2
Packit 15dc08
	movl 20(%esp),%esi
Packit 15dc08
	movl %ebx,(%esi)
Packit 15dc08
	movl %edx,4(%esi)
Packit 15dc08
	movl %ecx,8(%esi)
Packit 15dc08
	popl %ebx
Packit 15dc08
	popl %esi
Packit 15dc08
	ret
Packit 15dc08
EOF
Packit 15dc08
Packit 15dc08
  if test -z "$exact_cpu"; then
Packit 15dc08
  if ($CC_FOR_BUILD ${dummy}0.s $dummy.c -o $dummy) >/dev/null 2>&1; then
Packit 15dc08
    # On 80386 and early 80486 cpuid is not available and will result in a
Packit 15dc08
    # SIGILL message, hence 2>/dev/null.
Packit 15dc08
    #
Packit 15dc08
    # On i386-unknown-freebsd4.9, "/bin/sh -c ./dummy" seems to send an
Packit 15dc08
    # "Illegal instruction (core dumped)" message to stdout, so we test $?
Packit 15dc08
    # to check if the program run was successful.
Packit 15dc08
    #
Packit 15dc08
    x=`$SHELL -c $dummy 2>/dev/null`
Packit 15dc08
    if test $? = 0 && test -n "$x"; then
Packit 15dc08
      exact_cpu=$x
Packit 15dc08
    fi
Packit 15dc08
  fi
Packit 15dc08
  fi
Packit 15dc08
Packit 15dc08
  # We need to remove some .o files here since lame C compilers
Packit 15dc08
  # generate these even when not asked.
Packit 15dc08
  ;;
Packit 15dc08
Packit 15dc08
s390*-*-*)
Packit 15dc08
  if test -f /proc/cpuinfo; then
Packit 15dc08
    model=`grep "^processor 0: version =" /proc/cpuinfo | sed -e 's/.*machine = //'`
Packit 15dc08
    case $model in
Packit 15dc08
      2064 | 2066) zcpu="z900" ;;
Packit 15dc08
      2084 | 2086) zcpu="z990" ;;
Packit 15dc08
      2094 | 2096) zcpu="z9"   ;;
Packit 15dc08
      2097 | 2098) zcpu="z10"  ;;
Packit 15dc08
      2817 | 2818 | *) zcpu="z196" ;;
Packit 15dc08
    esac
Packit 15dc08
    case "$guess_full" in
Packit 15dc08
      s390x-*-*) exact_cpu=${zcpu}    ;;
Packit 15dc08
      s390-*-*)  exact_cpu=${zcpu}esa ;;
Packit 15dc08
    esac
Packit 15dc08
  fi
Packit 15dc08
  ;;
Packit 15dc08
Packit 15dc08
esac
Packit 15dc08
Packit 15dc08
Packit 15dc08
Packit 15dc08
# -------------------------------------------------------------------------
Packit 15dc08
# Use an exact cpu, if possible
Packit 15dc08
Packit 15dc08
if test -n "$exact_cpu"; then
Packit 15dc08
  echo "$exact_cpu$guess_rest"
Packit 15dc08
else
Packit 15dc08
  echo "$guess_full"
Packit 15dc08
fi
Packit 15dc08
exit 0
Packit 15dc08
Packit 15dc08
Packit 15dc08
Packit 15dc08
# Local variables:
Packit 15dc08
# fill-column: 76
Packit 15dc08
# End: