blob: 663148895f875b6d786b28ff9ed2ad44f61254ea [file] [log] [blame]
Austin Schuhdace2a62020-08-18 10:56:48 -07001#! /bin/sh
2#
3# GMP config.guess wrapper.
4
5
6# Copyright 2000-2019 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 either:
12#
13# * the GNU Lesser General Public License as published by the Free
14# Software Foundation; either version 3 of the License, or (at your
15# option) any later version.
16#
17# or
18#
19# * the GNU General Public License as published by the Free Software
20# Foundation; either version 2 of the License, or (at your option) any
21# later version.
22#
23# or both in parallel, as here.
24#
25# The GNU MP Library is distributed in the hope that it will be useful, but
26# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
27# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
28# for more details.
29#
30# You should have received copies of the GNU General Public License and the
31# GNU Lesser General Public License along with the GNU MP Library. If not,
32# see https://www.gnu.org/licenses/.
33
34
35# Usage: config.guess
36#
37# Print the host system CPU-VENDOR-OS.
38#
39# configfsf.guess is run and its guess then sharpened up to take advantage
40# of the finer grained CPU types that GMP knows.
41
42
43# Expect to find configfsf.guess in the same directory as this config.guess
44configfsf_guess="`echo \"$0\" | sed 's/config.guess$/configfsf.guess/'`"
45if test "$configfsf_guess" = "$0"; then
46 echo "Cannot derive configfsf.guess from $0" 1>&2
47 exit 1
48fi
49if test -f "$configfsf_guess"; then
50 :
51else
52 echo "$configfsf_guess not found" 1>&2
53 exit 1
54fi
55
56# Setup a $SHELL with which to run configfsf.guess, using the same
57# $CONFIG_SHELL or /bin/sh as autoconf does when running config.guess
58SHELL=${CONFIG_SHELL-/bin/sh}
59
60# Identify ourselves on --version, --help or errors
61if test $# != 0; then
62 echo "(GNU MP wrapped config.guess)"
63 $SHELL $configfsf_guess "$@"
64 exit 1
65fi
66
67guess_full=`$SHELL $configfsf_guess`
68if test $? != 0; then
69 exit 1
70fi
71
72guess_cpu=`echo "$guess_full" | sed 's/-.*$//'`
73guess_rest=`echo "$guess_full" | sed 's/^[^-]*//'`
74exact_cpu=
75
76
77# -------------------------------------------------------------------------
78# The following should look at the current guess and probe the system to
79# establish a better guess in exact_cpu. Leave exact_cpu empty if probes
80# can't be done, or don't work.
81#
82# When a number of probes are done, test -z "$exact_cpu" can be used instead
83# of putting each probe under an "else" of the preceeding. That can stop
84# the code getting horribly nested and marching off the right side of the
85# screen.
86
87# Note that when a compile-and-link is done in one step we need to remove .o
88# files, since lame C compilers generate these even when not asked.
89#
90
91# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
92# compiler to aid in system detection is discouraged as it requires
93# temporary files to be created and, as you can see below, it is a
94# headache to deal with in a portable fashion.
95
96# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
97# use `HOST_CC' if defined, but it is deprecated.
98
99# Portable tmp directory creation inspired by the Autoconf team.
100
101set_cc_for_build='
102trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
103trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
104: ${TMPDIR=/tmp} ;
105 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
106 { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
107 { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
108 { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
109dummy=$tmp/dummy ;
110tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy $dummy.core ${dummy}0.s" ;
111case $CC_FOR_BUILD,$HOST_CC,$CC in
112 ,,) echo "int x;" > $dummy.c ;
113 for c in cc gcc c89 c99 ; do
114 if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
115 CC_FOR_BUILD="$c"; break ;
116 fi ;
117 done ;
118 if test x"$CC_FOR_BUILD" = x ; then
119 CC_FOR_BUILD=no_compiler_found ;
120 fi
121 ;;
122 ,,*) CC_FOR_BUILD=$CC ;;
123 ,*,*) CC_FOR_BUILD=$HOST_CC ;;
124esac ; set_cc_for_build= ;'
125
126
127case "$guess_full" in
128
129alpha-*-*)
130 eval $set_cc_for_build
131 # configfsf.guess detects exact alpha cpu types for OSF and GNU/Linux, but
132 # not for *BSD and other systems. We try to get an exact type for any
133 # plain "alpha" it leaves.
134 #
135 # configfsf.guess used to have a block of code not unlike this, but these
136 # days does its thing with Linux kernel /proc/cpuinfo or OSF psrinfo.
137 #
138 cat <<EOF >${dummy}0.s
139 .data
140Lformat:
141 .byte 37,100,45,37,120,10,0 # "%d-%x\n"
142 .text
143 .globl main
144 .align 4
145 .ent main
146main:
147 .frame \$30,16,\$26,0
148 ldgp \$29,0(\$27)
149 .prologue 1
150 .long 0x47e03d91 # implver \$17
151 lda \$2,-1
152 .long 0x47e20c21 # amask \$2,\$1
153 lda \$16,Lformat
154 not \$1,\$18
155 jsr \$26,printf
156 ldgp \$29,0(\$26)
157 mov 0,\$16
158 jsr \$26,exit
159 .end main
160EOF
161 $CC_FOR_BUILD ${dummy}0.s -o $dummy 2>/dev/null
162 if test "$?" = 0 ; then
163 case `$dummy` in
164 0-0) exact_cpu=alpha ;;
165 1-0) exact_cpu=alphaev5 ;;
166 1-1) exact_cpu=alphaev56 ;;
167 1-101) exact_cpu=alphapca56 ;;
168 2-303) exact_cpu=alphaev6 ;;
169 2-307) exact_cpu=alphaev67 ;;
170 2-1307) exact_cpu=alphaev68 ;;
171 esac
172 fi
173 ;;
174
175arm*-*-* | aarch64-*-*)
176 cpu_code=`sed -n 's/^CPU part.*\(0x.*\)$/\1/p' /proc/cpuinfo 2>/dev/null | sort -r | head -n 1 2>/dev/null`
177 cpu_implementer=`sed -n 's/^CPU implementer.*\(0x.*\)$/\1/p' /proc/cpuinfo 2>/dev/null | head -n 1 2>/dev/null`
178 case "${cpu_implementer}_${cpu_code}" in
179 0x53_0x001) exact_cpu=armexynosm1 ;;
180 0x51_0x800) exact_cpu=armcortexa57 ;;
181 0x43_0x0a1) exact_cpu=armthunderx ;;
182 0x50_0x000) exact_cpu=armxgene1 ;;
183 esac
184 if test -z "$exact_cpu"; then
185 case "$cpu_code" in
186 0xa10 | 0xa11 | 0xb11) # v4 strongarm/sa1100
187 exact_cpu="armsa1";;
188 0x915 | 0x925 | \
189 0x920 | 0x922 | 0x940) # v4
190 exact_cpu="arm9tdmi";;
191 0x210 | 0x290 | 0x2d0 | \
192 0x212 | 0x292 | 0x2d2 | \
193 0x411) exact_cpu="armxscale";; # v5 pxa2xx
194 0x926 | 0x946 | 0x966 | 0x968) # v5te/v5tej
195 exact_cpu="arm9te";;
196 0xa20 | 0xa22 | 0xa26) # v5te
197 exact_cpu="arm10";;
198 0xb02) exact_cpu="arm11mpcore";; # v6
199 0xb36) exact_cpu="arm1136";; # v6
200 0xb56) exact_cpu="arm1156";; # v6t2
201 0xb76) exact_cpu="arm1176";; # v6
202 0xc05) exact_cpu="armcortexa5";; # v7a
203 0xc07) exact_cpu="armcortexa7";; # v7a
204 0xc08) exact_cpu="armcortexa8";; # v7a
205 0xc09) exact_cpu="armcortexa9";; # v7a
206 0xc0f) exact_cpu="armcortexa15";; # v7a
207 0xc0d) exact_cpu="armcortexa12";; # v7a
208 0xc0e) exact_cpu="armcortexa17";; # v7a
209 0xc14) exact_cpu="armcortexr4";; # v7r
210 0xc15) exact_cpu="armcortexr5";; # v7r
211 0xc23) exact_cpu="armcortexm3";; # v7m
212
213 0xd04) exact_cpu="armcortexa35";; # v8
214 0xd03) exact_cpu="armcortexa53";; # v8
215 0xd05) exact_cpu="armcortexa55";; # v8.2
216 0xd07) exact_cpu="armcortexa57";; # v8
217 0xd08) exact_cpu="armcortexa72";; # v8
218 0xd09) exact_cpu="armcortexa73";; # v8
219 0xd0a) exact_cpu="armcortexa75";; # v8.2
220 0xd0b) exact_cpu="armcortexa76";; # v8.3
221 *) exact_cpu=$guess_cpu;;
222 esac
223 fi
224 exact_cpu="${exact_cpu}`sed -n 's;^Features.*\(neon\).*;\1;p' /proc/cpuinfo 2>/dev/null | head -n 1 2>/dev/null`"
225 ;;
226
227ia64*-*-*)
228 eval $set_cc_for_build
229 # CPUID[3] bits 24 to 31 is the processor family. itanium2 is documented
230 # as 0x1f, plain itanium has been seen returning 0x07 on two systems, but
231 # haven't found any documentation on it as such.
232 #
233 # Defining both getcpuid and _getcpuid lets us ignore whether the system
234 # expects underscores or not.
235 #
236 # "unsigned long long" is always 64 bits, in fact on hpux in ilp32 mode
237 # (which is the default there), it's the only 64-bit type.
238 #
239 cat >${dummy}0.s <<EOF
240 .text
241 .global _getcpuid
242 .proc _getcpuid
243_getcpuid:
244 mov r8 = CPUID[r32] ;;
245 br.ret.sptk.many rp ;;
246 .endp _getcpuid
247 .global getcpuid
248 .proc getcpuid
249getcpuid:
250 mov r8 = CPUID[r32] ;;
251 br.ret.sptk.many rp ;;
252 .endp getcpuid
253EOF
254 cat >$dummy.c <<EOF
255#include <stdio.h>
256unsigned long long getcpuid ();
257int
258main ()
259{
260 if (getcpuid(0LL) == 0x49656E69756E6547LL && getcpuid(1LL) == 0x6C65746ELL)
261 {
262 /* "GenuineIntel" */
263 switch ((getcpuid(3LL) >> 24) & 0xFF) {
264 case 0x07: puts ("itanium"); break;
265 case 0x1F: puts ("itanium2"); break; /* McKinley, Madison */
266 case 0x20: puts ("itanium2"); break; /* Montecito, Montvale, Tukwila */
267 case 0x21: puts ("itanium2"); break; /* Poulson */
268 }
269 }
270 return 0;
271}
272EOF
273 if $CC_FOR_BUILD ${dummy}0.s $dummy.c -o $dummy >/dev/null 2>&1; then
274 exact_cpu=`$dummy`
275 fi
276 ;;
277
278mips-*-irix[6789]*)
279 # IRIX 6 and up always has a 64-bit mips cpu
280 exact_cpu=mips64
281 ;;
282
283mips-*-*)
284 case $(uname -m) in
285 mips64) exact_cpu=mips64;;
286 esac
287 ;;
288
289mipsel-*-*)
290 case $(uname -m) in
291 mips64) exact_cpu=mips64el;;
292 esac
293 ;;
294
295m68k-*-*)
296 eval $set_cc_for_build
297 # NetBSD (and presumably other *BSD) "sysctl hw.model" gives for example
298 # hw.model = Apple Macintosh Quadra 610 (68040)
299 exact_cpu=`(sysctl hw.model) 2>/dev/null | sed -n 's/^.*\(680[012346]0\).*$/m\1/p'`
300 if test -z "$exact_cpu"; then
301 # Linux kernel 2.2 gives for example "CPU: 68020" (tabs in between).
302 exact_cpu=`sed -n 's/^CPU:.*\(680[012346]0\).*$/m\1/p' /proc/cpuinfo 2>/dev/null`
303 fi
304 if test -z "$exact_cpu"; then
305 # Try: movel #0,%d0; rts
306 # This is to check the compiler and our asm code works etc, before
307 # assuming failures below indicate cpu characteristics.
308 # .byte is used to avoid problems with assembler syntax variations.
309 # For testing, provoke failures by adding "illegal" possibly as
310 # ".byte 0x4A, 0xFC"
311 cat >${dummy}0.s <<EOF
312 .text
313 .globl main
314 .globl _main
315main:
316_main:
317 .byte 0x70, 0x00
318 .byte 0x4e, 0x75
319EOF
320
321 if ($CC_FOR_BUILD ${dummy}0.s -o $dummy && $dummy) >/dev/null 2>&1; then
322
323 # $SHELL -c is used to execute $dummy below, since ($dummy)
324 # 2>/dev/null still prints the SIGILL message on some shells.
325 #
326 # Try: movel #0,%d0
327 # rtd #0
328 cat >${dummy}0.s <<EOF
329 .text
330 .globl main
331 .globl _main
332main:
333_main:
334 .byte 0x70, 0x00
335 .byte 0x4e, 0x74, 0x00, 0x00
336EOF
337 if $CC_FOR_BUILD ${dummy}0.s -o $dummy >/dev/null 2>&1; then
338 $SHELL -c $dummy >/dev/null 2>&1
339 if test $? != 0; then
340 exact_cpu=m68000 # because rtd didn't work
341 fi
342 fi
343 #
344
345 if test -z "$exact_cpu"; then
346 # Try: trapf
347 # movel #0,%d0
348 # rts
349 # Another possibility for identifying 68000 and 68010 is the
350 # different value stored by "movem a0,(a0)+"
351 cat >${dummy}0.s <<EOF
352 .text
353 .globl main
354 .globl _main
355main:
356_main:
357 .byte 0x51, 0xFC
358 .byte 0x70, 0x00
359 .byte 0x4e, 0x75
360EOF
361 if $CC_FOR_BUILD ${dummy}0.s -o $dummy >/dev/null 2>&1; then
362 $SHELL -c $dummy >/dev/null 2>&1
363 if test $? != 0; then
364 exact_cpu=m68010 # because trapf didn't work
365 fi
366 fi
367 fi
368
369 if test -z "$exact_cpu"; then
370 # Try: bfffo %d1{0:31},%d0
371 # movel #0,%d0
372 # rts
373 cat >${dummy}0.s <<EOF
374 .text
375 .globl main
376 .globl _main
377main:
378_main:
379 .byte 0xED, 0xC1, 0x00, 0x1F
380 .byte 0x70, 0x00
381 .byte 0x4e, 0x75
382EOF
383 if $CC_FOR_BUILD ${dummy}0.s -o $dummy >/dev/null 2>&1; then
384 $SHELL -c $dummy >/dev/null 2>&1
385 if test $? != 0; then
386 exact_cpu=m68360 # cpu32, because bfffo didn't work
387 fi
388 fi
389 fi
390
391 if test -z "$exact_cpu"; then
392 # FIXME: Now we know 68020 or up, but how to detect 030, 040 and 060?
393 exact_cpu=m68020
394 fi
395 fi
396 fi
397 if test -z "$exact_cpu"; then
398 case "$guess_full" in
399 *-*-next* | *-*-openstep*) # NeXTs are 68020 or better
400 exact_cpu=m68020 ;;
401 esac
402 fi
403 ;;
404
405
406rs6000-*-* | powerpc*-*-*)
407 # Enhancement: On MacOS the "machine" command prints for instance
408 # "ppc750". Interestingly on powerpc970-apple-darwin6.8.5 it prints
409 # "ppc970" where there's no actual #define for 970 from NXGetLocalArchInfo
410 # (as noted below). But the man page says the command is still "under
411 # development", so it doesn't seem wise to use it just yet, not while
412 # there's an alternative.
413
414 # Try to read the PVR. mfpvr is a protected instruction, NetBSD, MacOS and
415 # AIX don't allow it in user mode, but the Linux kernel does. We prefer this
416 # to /proc/cpuinfo since the latter lags for newer CPUs.
417 #
418 # Note this is no good on AIX, since a C function there is the address of
419 # a function descriptor, not actual code. But this doesn't matter since
420 # AIX doesn't allow mfpvr anyway.
421 #
422 if test -z "$exact_cpu"; then
423 eval $set_cc_for_build
424 cat >$dummy.c <<\EOF
425#include <stdio.h>
426int
427main ()
428{
429 unsigned pvr;
430
431 asm ("mfpvr %0" : "=r" (pvr));
432
433 switch (pvr >> 16) {
434 case 0x0001: puts ("powerpc601"); break;
435 case 0x0003: puts ("powerpc603"); break;
436 case 0x0004: puts ("powerpc604"); break;
437 case 0x0006: puts ("powerpc603e"); break;
438 case 0x0007: puts ("powerpc603e"); break; /* 603ev */
439 case 0x0008: puts ("powerpc750"); break;
440 case 0x0009: puts ("powerpc604e"); break;
441 case 0x000a: puts ("powerpc604e"); break; /* 604ev5 */
442 case 0x000c: puts ("powerpc7400"); break;
443 case 0x0041: puts ("powerpc630"); break;
444 case 0x003f: puts ("power7"); break;
445 case 0x004b:
446 case 0x004c:
447 case 0x004d: puts ("power8"); break;
448 case 0x004e: puts ("power9"); break;
449 case 0x0050: puts ("powerpc860"); break;
450 case 0x8000: puts ("powerpc7450"); break;
451 case 0x8001: puts ("powerpc7455"); break;
452 case 0x8002: puts ("powerpc7457"); break;
453 case 0x8003: puts ("powerpc7447"); break; /* really 7447A */
454 case 0x800c: puts ("powerpc7410"); break;
455 }
456 return 0;
457}
458EOF
459 if ($CC_FOR_BUILD $dummy.c -o $dummy) >/dev/null 2>&1; then
460 # This style construct is needed on AIX 4.3 to suppress the SIGILL error
461 # from (*fun)(). Using $SHELL -c $dummy 2>/dev/null doesn't work.
462 { x=`$dummy`; } 2>/dev/null
463 if test -n "$x"; then
464 exact_cpu=$x
465 fi
466 fi
467 fi
468
469
470 # Grep the /proc/cpuinfo pseudo-file.
471 # Anything unrecognised is ignored, since of course we mustn't spit out
472 # a cpu type config.sub doesn't know.
473 if test -z "$exact_cpu" && test -f /proc/cpuinfo; then
474 x=`grep "^cpu[ ]" /proc/cpuinfo | head -n 1`
475 x=`echo $x | sed -n 's/^cpu[ ]*:[ ]*\([A-Za-z0-9]*\).*/\1/p'`
476 x=`echo $x | sed 's/PPC//'`
477 case $x in
478 601) exact_cpu="power" ;;
479 603ev) exact_cpu="powerpc603e" ;;
480 604ev5) exact_cpu="powerpc604e" ;;
481 970??) exact_cpu="powerpc970" ;;
482 603 | 603e | 604 | 604e | 750 | 821 | 860)
483 exact_cpu="powerpc$x" ;;
484 POWER[4-9]*)
485 exact_cpu=`echo $x | sed -e "s;POWER;power;" -e "s;[a-zA-Z]*$;;"` ;;
486 esac
487 fi
488
489
490 if test -z "$exact_cpu"; then
491 # On AIX, try looking at _system_configuration. This is present in
492 # version 4 at least.
493 cat >$dummy.c <<EOF
494#include <stdio.h>
495#include <sys/systemcfg.h>
496int
497main ()
498{
499 switch (_system_configuration.implementation) {
500 /* Old versions of AIX don't have all these constants,
501 use ifdef for safety. */
502#ifdef POWER_RS2
503 case POWER_RS2: puts ("power2"); break;
504#endif
505#ifdef POWER_601
506 case POWER_601: puts ("power"); break;
507#endif
508#ifdef POWER_603
509 case POWER_603: puts ("powerpc603"); break;
510#endif
511#ifdef POWER_604
512 case POWER_604: puts ("powerpc604"); break;
513#endif
514#ifdef POWER_620
515 case POWER_620: puts ("powerpc620"); break;
516#endif
517#ifdef POWER_630
518 case POWER_630: puts ("powerpc630"); break;
519#endif
520 /* Dunno what this is, leave it out for now.
521 case POWER_A35: puts ("powerpca35"); break;
522 */
523 /* This is waiting for a bit more info.
524 case POWER_RS64II: puts ("powerpcrs64ii"); break;
525 */
526#ifdef POWER_4
527 case POWER_4: puts ("power4"); break;
528#endif
529#ifdef POWER_5
530 case POWER_5: puts ("power5"); break;
531#endif
532#ifdef POWER_6
533 case POWER_6: puts ("power6"); break;
534#endif
535#ifdef POWER_7
536 case POWER_7: puts ("power7"); break;
537#endif
538#ifdef POWER_8
539 case POWER_8: puts ("power8"); break;
540#endif
541#ifdef POWER_9
542 case POWER_9: puts ("power9"); break;
543#endif
544 default:
545 if (_system_configuration.architecture == POWER_RS)
546 puts ("power");
547 else if (_system_configuration.width == 64)
548 puts ("powerpc64");
549 }
550 return 0;
551}
552EOF
553 if ($CC_FOR_BUILD $dummy.c -o $dummy) >/dev/null 2>&1; then
554 x=`$dummy`
555 if test -n "$x"; then
556 exact_cpu=$x
557 fi
558 fi
559 fi
560
561 if test -z "$exact_cpu"; then
562 # On MacOS X (or any Mach-O presumably), NXGetLocalArchInfo cpusubtype
563 # can tell us the exact cpu.
564 cat >$dummy.c <<EOF
565#include <stdio.h>
566#include <mach-o/arch.h>
567int
568main (void)
569{
570 const NXArchInfo *a = NXGetLocalArchInfo();
571 if (a->cputype == CPU_TYPE_POWERPC)
572 {
573 switch (a->cpusubtype) {
574 /* The following known to Darwin 1.3. */
575 case CPU_SUBTYPE_POWERPC_601: puts ("powerpc601"); break;
576 case CPU_SUBTYPE_POWERPC_602: puts ("powerpc602"); break;
577 case CPU_SUBTYPE_POWERPC_603: puts ("powerpc603"); break;
578 case CPU_SUBTYPE_POWERPC_603e: puts ("powerpc603e"); break;
579 case CPU_SUBTYPE_POWERPC_603ev: puts ("powerpc603e"); break;
580 case CPU_SUBTYPE_POWERPC_604: puts ("powerpc604"); break;
581 case CPU_SUBTYPE_POWERPC_604e: puts ("powerpc604e"); break;
582 case CPU_SUBTYPE_POWERPC_620: puts ("powerpc620"); break;
583 case CPU_SUBTYPE_POWERPC_750: puts ("powerpc750"); break;
584 case CPU_SUBTYPE_POWERPC_7400: puts ("powerpc7400"); break;
585 case CPU_SUBTYPE_POWERPC_7450: puts ("powerpc7450"); break;
586 /* Darwin 6.8.5 doesn't define the following */
587 case 0x8001: puts ("powerpc7455"); break;
588 case 0x8002: puts ("powerpc7457"); break;
589 case 0x8003: puts ("powerpc7447"); break;
590 case 100: puts ("powerpc970"); break;
591 }
592 }
593 return 0;
594}
595EOF
596 if ($CC_FOR_BUILD $dummy.c -o $dummy) >/dev/null 2>&1; then
597 x=`$dummy`
598 if test -n "$x"; then
599 exact_cpu=$x
600 fi
601 fi
602 fi
603 ;;
604
605sparc-*-* | sparc64-*-*)
606 # If we can recognise an actual v7 then $exact_cpu is set to "sparc" so as
607 # to short-circuit subsequent tests.
608
609 # Grep the linux kernel /proc/cpuinfo pseudo-file.
610 # A typical line is "cpu\t\t: TI UltraSparc II (BlackBird)"
611 # See arch/sparc/kernel/cpu.c and arch/sparc64/kernel/cpu.c.
612 #
613 if test -f /proc/cpuinfo; then
614 if grep 'cpu.*Cypress' /proc/cpuinfo >/dev/null; then
615 exact_cpu="sparc" # ie. v7
616 elif grep 'cpu.*Power-UP' /proc/cpuinfo >/dev/null; then
617 exact_cpu="sparc" # ie. v7
618 elif grep 'cpu.*HyperSparc' /proc/cpuinfo >/dev/null; then
619 exact_cpu="sparcv8"
620 elif grep 'cpu.*SuperSparc' /proc/cpuinfo >/dev/null; then
621 exact_cpu="supersparc"
622 elif grep 'cpu.*MicroSparc' /proc/cpuinfo >/dev/null; then
623 exact_cpu="microsparc"
624 elif grep 'cpu.*MB86904' /proc/cpuinfo >/dev/null; then
625 # actually MicroSPARC-II
626 exact_cpu=microsparc
627 elif grep 'cpu.*UltraSparc T5' /proc/cpuinfo >/dev/null; then
628 exact_cpu="ultrasparct5"
629 elif grep 'cpu.*UltraSparc T4' /proc/cpuinfo >/dev/null; then
630 exact_cpu="ultrasparct4"
631 elif grep 'cpu.*UltraSparc T3' /proc/cpuinfo >/dev/null; then
632 exact_cpu="ultrasparct3"
633 elif grep 'cpu.*UltraSparc T2' /proc/cpuinfo >/dev/null; then
634 exact_cpu="ultrasparct2"
635 elif grep 'cpu.*UltraSparc T1' /proc/cpuinfo >/dev/null; then
636 exact_cpu="ultrasparct1"
637 elif grep 'cpu.*UltraSparc III' /proc/cpuinfo >/dev/null; then
638 exact_cpu="ultrasparc3"
639 elif grep 'cpu.*UltraSparc IIi' /proc/cpuinfo >/dev/null; then
640 exact_cpu="ultrasparc2i"
641 elif grep 'cpu.*UltraSparc II' /proc/cpuinfo >/dev/null; then
642 exact_cpu="ultrasparc2"
643 elif grep 'cpu.*UltraSparc' /proc/cpuinfo >/dev/null; then
644 exact_cpu="ultrasparc"
645 fi
646 fi
647
648 # Need to invoke this for setup of $dummy
649 eval $set_cc_for_build
650
651 # Grep the output from sysinfo on SunOS.
652 # sysinfo has been seen living in /bin or in /usr/kvm
653 # cpu0 is a "SuperSPARC Model 41 SPARCmodule" CPU
654 # cpu0 is a "75 MHz TI,TMS390Z55" CPU
655 #
656 if test -z "$exact_cpu"; then
657 for i in sysinfo /usr/kvm/sysinfo; do
658 if $SHELL -c $i 2>/dev/null >$dummy; then
659 if grep 'cpu0 is a "SuperSPARC' $dummy >/dev/null; then
660 exact_cpu=supersparc
661 break
662 elif grep 'cpu0 is a .*TMS390Z5.' $dummy >/dev/null; then
663 # TMS390Z50 and TMS390Z55
664 exact_cpu=supersparc
665 break
666 fi
667 fi
668 done
669 fi
670
671 # Grep the output from prtconf on Solaris.
672 # Use an explicit /usr/sbin, since that directory might not be in a normal
673 # user's path.
674 #
675 # SUNW,UltraSPARC (driver not attached)
676 # SUNW,UltraSPARC-II (driver not attached)
677 # SUNW,UltraSPARC-IIi (driver not attached)
678 # SUNW,UltraSPARC-III+ (driver not attached)
679 # Ross,RT625 (driver not attached)
680 # TI,TMS390Z50 (driver not attached)
681 #
682 # /usr/sbin/sysdef prints similar information, but includes all loadable
683 # cpu modules, not just the real cpu.
684 #
685 # We first try a plain prtconf, since that is known to work on older systems.
686 # But for newer T1 systems, that doesn't produce any useful output, we need
687 # "prtconf -vp" there.
688 #
689 for prtconfopt in "" "-vp"; do
690 if test -z "$exact_cpu"; then
691 if $SHELL -c "/usr/sbin/prtconf $prtconfopt" 2>/dev/null >$dummy; then
692 if grep 'SUNW,UltraSPARC-T5' $dummy >/dev/null; then
693 exact_cpu=ultrasparct5
694 elif grep 'SUNW,UltraSPARC-T4' $dummy >/dev/null; then
695 exact_cpu=ultrasparct4
696 elif grep 'SUNW,UltraSPARC-T3' $dummy >/dev/null; then
697 exact_cpu=ultrasparct3
698 elif grep 'SUNW,UltraSPARC-T2' $dummy >/dev/null; then
699 exact_cpu=ultrasparct2
700 elif grep 'SUNW,UltraSPARC-T1' $dummy >/dev/null; then
701 exact_cpu=ultrasparct1
702 elif grep 'SUNW,UltraSPARC-III' $dummy >/dev/null; then
703 exact_cpu=ultrasparc3
704 elif grep 'SUNW,UltraSPARC-IIi' $dummy >/dev/null; then
705 exact_cpu=ultrasparc2i
706 elif grep 'SUNW,UltraSPARC-II' $dummy >/dev/null; then
707 exact_cpu=ultrasparc2
708 elif grep 'SUNW,UltraSPARC' $dummy >/dev/null; then
709 exact_cpu=ultrasparc
710 elif grep 'Ross,RT62.' $dummy >/dev/null; then
711 # RT620, RT625, RT626 hypersparcs (v8).
712 exact_cpu=sparcv8
713 elif grep 'TI,TMS390Z5.' $dummy >/dev/null; then
714 # TMS390Z50 and TMS390Z55
715 exact_cpu=supersparc
716 elif grep 'TI,TMS390S10' $dummy >/dev/null; then
717 exact_cpu=microsparc
718 elif grep 'FMI,MB86904' $dummy >/dev/null; then
719 # actually MicroSPARC-II
720 exact_cpu=microsparc
721 fi
722 fi
723 fi
724 done
725
726 # Grep the output from sysctl hw.model on sparc or sparc64 *BSD.
727 # Use an explicit /sbin, since that directory might not be in a normal
728 # user's path. Example outputs,
729 #
730 # hw.model: Sun Microsystems UltraSparc-IIi
731 #
732 if test -z "$exact_cpu"; then
733 if $SHELL -c "/sbin/sysctl hw.model" 2>/dev/null >$dummy; then
734 if grep -i 'UltraSparc-T5' $dummy >/dev/null; then
735 exact_cpu=ultrasparct5
736 elif grep -i 'UltraSparc-T4' $dummy >/dev/null; then
737 exact_cpu=ultrasparct4
738 elif grep -i 'UltraSparc-T3' $dummy >/dev/null; then
739 exact_cpu=ultrasparct3
740 elif grep -i 'UltraSparc-T2' $dummy >/dev/null; then
741 exact_cpu=ultrasparct2
742 elif grep -i 'UltraSparc-T1' $dummy >/dev/null; then
743 exact_cpu=ultrasparct1
744 elif grep -i 'UltraSparc-III' $dummy >/dev/null; then
745 exact_cpu=ultrasparc3
746 elif grep -i 'UltraSparc-IIi' $dummy >/dev/null; then
747 exact_cpu=ultrasparc2i
748 elif grep -i 'UltraSparc-II' $dummy >/dev/null; then
749 exact_cpu=ultrasparc2
750 elif grep -i 'UltraSparc' $dummy >/dev/null; then
751 exact_cpu=ultrasparc
752 elif grep 'TMS390Z5.' $dummy >/dev/null; then
753 # TMS390Z50 and TMS390Z55
754 exact_cpu=supersparc
755 elif grep 'TMS390S10' $dummy >/dev/null; then
756 exact_cpu=microsparc
757 elif grep 'MB86904' $dummy >/dev/null; then
758 # actually MicroSPARC-II
759 exact_cpu=microsparc
760 elif grep 'MB86907' $dummy >/dev/null; then
761 exact_cpu=turbosparc
762 fi
763 fi
764 fi
765
766 # sun4m and sun4d are v8s of some sort, sun4u is a v9 of some sort
767 #
768 if test -z "$exact_cpu"; then
769 case `uname -m` in
770 sun4[md]) exact_cpu=sparcv8 ;;
771 sun4u) exact_cpu=sparcv9 ;;
772 esac
773 fi
774 ;;
775
776
777# Recognise x86 processors using a tricky cpuid with 4 arguments, repeating
778# arguments; for x86-64 we effectively pass the 1st in rdx and the 2nd in rcx.
779# This allows the same asm to work for both standard and Windoze calling
780# conventions.
781
782i?86-*-* | amd64-*-* | x86_64-*-*)
783 eval $set_cc_for_build
784
785 cat <<EOF >$dummy.c
786#include <string.h>
787#include <stdio.h>
788#define CPUID(a,b) cpuid(b,a,a,b)
789#if __cplusplus
790extern "C"
791#endif
792unsigned int cpuid (int, char *, char *, int);
793
794int
795gmp_workaround_skylake_cpuid_bug ()
796{
797 char feature_string[49];
798 char processor_name_string[49];
799 static const char *bad_cpus[] = {" G44", " G45", " G39" /* , "6600" */ };
800 int i;
801
802 /* Example strings: */
803 /* "Intel(R) Pentium(R) CPU G4400 @ 3.30GHz" */
804 /* "Intel(R) Core(TM) i5-6600K CPU @ 3.50GHz" */
805 /* ^ ^ ^ */
806 /* 0x80000002 0x80000003 0x80000004 */
807 /* We match out just the 0x80000003 part here. */
808
809 /* In their infinitive wisdom, Intel decided to use one register order for
810 the vendor string, and another for the processor name string. We shuffle
811 things about here, rather than write a new variant of our assembly cpuid.
812 */
813
814 unsigned int eax, ebx, ecx, edx;
815 eax = CPUID (feature_string, 0x80000003);
816 ebx = ((unsigned int *)feature_string)[0];
817 edx = ((unsigned int *)feature_string)[1];
818 ecx = ((unsigned int *)feature_string)[2];
819
820 ((unsigned int *) (processor_name_string))[0] = eax;
821 ((unsigned int *) (processor_name_string))[1] = ebx;
822 ((unsigned int *) (processor_name_string))[2] = ecx;
823 ((unsigned int *) (processor_name_string))[3] = edx;
824
825 processor_name_string[16] = 0;
826
827 for (i = 0; i < sizeof (bad_cpus) / sizeof (char *); i++)
828 {
829 if (strstr (processor_name_string, bad_cpus[i]) != 0)
830 return 1;
831 }
832 return 0;
833}
834
835int
836main ()
837{
838 char vendor_string[13];
839 char feature_string[12];
840 long fms;
841 int family, model;
842 const char *modelstr, *suffix;
843 int cpu_64bit = 0, cpu_avx = 0;
844 int cpuid_64bit, cpuid_avx, cpuid_osxsave;
845
846 CPUID (vendor_string, 0);
847 vendor_string[12] = 0;
848
849 fms = CPUID (feature_string, 1);
850
851 family = ((fms >> 8) & 0xf) + ((fms >> 20) & 0xff);
852 model = ((fms >> 4) & 0xf) + ((fms >> 12) & 0xf0);
853
854 cpuid_avx = (feature_string[11] >> 4) & 1;
855 cpuid_osxsave = (feature_string[11] >> 3) & 1;
856
857 modelstr = "$guess_cpu";
858
859 /**************************************************/
860 /*** WARNING: keep this list in sync with fat.c ***/
861 /**************************************************/
862 if (strcmp (vendor_string, "GenuineIntel") == 0)
863 {
864 switch (family)
865 {
866 case 5:
867 if (model == 4 || model == 8) modelstr = "pentiummmx";
868 else modelstr = "pentium";
869 break;
870 case 6:
871 if (model <= 1) modelstr = "pentiumpro";
872 else if (model <= 6) modelstr = "pentium2";
873 else if (model <= 8) modelstr = "pentium3";
874 else if (model <= 9) modelstr = "pentiumm";
875 else if (model <= 0x0c) modelstr = "pentium3";
876 else if (model <= 0x0e) modelstr = "pentiumm";
877 else if (model <= 0x19) cpu_64bit = 1, modelstr = "core2";
878 else if (model == 0x1a) cpu_64bit = 1, modelstr = "nehalem"; /* NHM Gainestown */
879 else if (model == 0x1c) cpu_64bit = 1, modelstr = "atom"; /* Silverthorne */
880 else if (model == 0x1d) cpu_64bit = 1, modelstr = "core2"; /* PNR Dunnington */
881 else if (model == 0x1e) cpu_64bit = 1, modelstr = "nehalem"; /* NHM Lynnfield/Jasper */
882 else if (model == 0x25) cpu_64bit = 1, modelstr = "westmere"; /* WSM Clarkdale/Arrandale */
883 else if (model == 0x26) cpu_64bit = 1, modelstr = "atom"; /* Lincroft */
884 else if (model == 0x27) cpu_64bit = 1, modelstr = "atom"; /* Saltwell */
885 else if (model == 0x2a) cpu_64bit = 1, cpu_avx=1, modelstr = "sandybridge";/* SB */
886 else if (model == 0x2c) cpu_64bit = 1, modelstr = "westmere"; /* WSM Gulftown */
887 else if (model == 0x2d) cpu_64bit = 1, cpu_avx=1, modelstr = "sandybridge";/* SBC-EP */
888 else if (model == 0x2e) cpu_64bit = 1, modelstr = "nehalem"; /* NHM Beckton */
889 else if (model == 0x2f) cpu_64bit = 1, modelstr = "westmere"; /* WSM Eagleton */
890 else if (model == 0x36) cpu_64bit = 1, modelstr = "atom"; /* Cedarview/Saltwell */
891 else if (model == 0x37) cpu_64bit = 1, modelstr = "silvermont"; /* Silvermont */
892 else if (model == 0x3a) cpu_64bit = 1, cpu_avx=1, modelstr = "ivybridge"; /* IBR */
893 else if (model == 0x3c) cpu_64bit = 1, cpu_avx=1, modelstr = "haswell"; /* Haswell client */
894 else if (model == 0x3d) cpu_64bit = 1, cpu_avx=1, modelstr = "broadwell"; /* Broadwell */
895 else if (model == 0x3e) cpu_64bit = 1, cpu_avx=1, modelstr = "ivybridge"; /* Ivytown */
896 else if (model == 0x3f) cpu_64bit = 1, cpu_avx=1, modelstr = "haswell"; /* Haswell server */
897 else if (model == 0x45) cpu_64bit = 1, cpu_avx=1, modelstr = "haswell"; /* Haswell ULT */
898 else if (model == 0x46) cpu_64bit = 1, cpu_avx=1, modelstr = "haswell"; /* Crystal Well */
899 else if (model == 0x47) cpu_64bit = 1, cpu_avx=1, modelstr = "broadwell"; /* Broadwell */
900 else if (model == 0x4a) cpu_64bit = 1, modelstr = "silvermont"; /* Silvermont */
901 else if (model == 0x4c) cpu_64bit = 1, modelstr = "silvermont"; /* Airmont */
902 else if (model == 0x4d) cpu_64bit = 1, modelstr = "silvermont"; /* Silvermont/Avoton */
903 else if (model == 0x4e) cpu_64bit = 1, cpu_avx=1, modelstr = "skylake"; /* Skylake client */
904 else if (model == 0x4f) cpu_64bit = 1, cpu_avx=1, modelstr = "broadwell"; /* Broadwell server */
905 else if (model == 0x55) cpu_64bit = 1, cpu_avx=1, modelstr = "skylake"; /* Skylake server */
906 else if (model == 0x56) cpu_64bit = 1, cpu_avx=1, modelstr = "broadwell"; /* Broadwell microserver */
907 else if (model == 0x57) cpu_64bit = 1, modelstr = "knightslanding"; /* aka Xeon Phi */
908 else if (model == 0x5a) cpu_64bit = 1, modelstr = "silvermont"; /* Silvermont */
909 else if (model == 0x5c) cpu_64bit = 1, modelstr = "goldmont"; /* Goldmont */
910 else if (model == 0x5e) cpu_64bit = 1, cpu_avx=1, modelstr = "skylake"; /* Skylake */
911 else if (model == 0x5f) cpu_64bit = 1, modelstr = "goldmont"; /* Goldmont */
912 else if (model == 0x7a) cpu_64bit = 1, modelstr = "goldmont"; /* Goldmont Plus */
913 else if (model == 0x8e) cpu_64bit = 1, cpu_avx=1, modelstr = "kabylake"; /* Kabylake Y/U */
914 else if (model == 0x9e) cpu_64bit = 1, cpu_avx=1, modelstr = "kabylake"; /* Kabylake desktop */
915 else cpu_64bit = 1, modelstr = "nehalem"; /* default */
916
917 if (strcmp (modelstr, "haswell") == 0 ||
918 strcmp (modelstr, "broadwell") == 0 ||
919 strcmp (modelstr, "skylake") == 0)
920 {
921 /* Some haswell, broadwell, skylake lack BMI2. Let them appear
922 as sandybridge for now. */
923 CPUID (feature_string, 7);
924 if ((feature_string[0 + 8 / 8] & (1 << (8 % 8))) == 0
925 || gmp_workaround_skylake_cpuid_bug ())
926 modelstr = "sandybridge";
927 }
928
929 break;
930 case 15:
931 cpu_64bit = 1, modelstr = "pentium4";
932 break;
933 }
934 }
935 else if (strcmp (vendor_string, "AuthenticAMD") == 0)
936 {
937 switch (family)
938 {
939 case 5:
940 if (model <= 3) modelstr = "k5";
941 else if (model <= 7) modelstr = "k6";
942 else if (model == 8) modelstr = "k62";
943 else if (model == 9) modelstr = "k63";
944 else if (model == 10) modelstr = "geode";
945 else if (model == 13) modelstr = "k63";
946 break;
947 case 6:
948 modelstr = "athlon";
949 break;
950 case 15: /* K8, K9 */
951 cpu_64bit = 1, modelstr = "k8";
952 break;
953 case 16: /* K10 */
954 cpu_64bit = 1, modelstr = "k10";
955 break;
956 case 17: /* Hybrid k8/k10, claim k8 */
957 cpu_64bit = 1, modelstr = "k8";
958 break;
959 case 18: /* Llano, uses K10 core */
960 cpu_64bit = 1, modelstr = "k10";
961 break;
962 case 19: /* AMD Internal, assume future K10 */
963 cpu_64bit = 1, modelstr = "k10";
964 break;
965 case 20: /* Bobcat */
966 cpu_64bit = 1, modelstr = "bobcat";
967 break;
968 case 21: /* Bulldozer */
969 cpu_64bit = 1, cpu_avx = 1;
970 if (model <= 1)
971 modelstr = "bulldozer";
972 else if (model < 0x20) /* really 2, [0x10-0x20) */
973 modelstr = "piledriver";
974 else if (model < 0x40) /* really [0x30-0x40) */
975 modelstr = "steamroller";
976 else /* really [0x60-0x70) */
977 modelstr = "excavator";
978 break;
979 case 22: /* Jaguar, an improved bobcat */
980 cpu_64bit = 1, cpu_avx = 1, modelstr = "jaguar";
981 break;
982 case 23: /* Zen */
983 cpu_64bit = 1, cpu_avx = 1;
984 switch (model)
985 {
986 case 1:
987 case 8:
988 case 17:
989 case 24:
990 modelstr = "zen";
991 break;
992 default:
993 modelstr = "zen2";
994 break;
995 }
996 }
997 }
998 else if (strcmp (vendor_string, "CyrixInstead") == 0)
999 {
1000 /* Should recognize Cyrix' processors too. */
1001 }
1002 else if (strcmp (vendor_string, "CentaurHauls") == 0)
1003 {
1004 switch (family)
1005 {
1006 case 6:
1007 if (model < 9) modelstr = "viac3";
1008 else if (model < 15) modelstr = "viac32";
1009 else cpu_64bit = 1, modelstr = "nano";
1010 break;
1011 }
1012 }
1013
1014 CPUID (feature_string, 0x80000001);
1015 cpuid_64bit = (feature_string[7] >> 5) & 1;
1016
1017 suffix = "";
1018
1019 if (cpuid_64bit && ! cpu_64bit)
1020 /* If our cpuid-based CPU identification thinks this is a 32-bit CPU but
1021 cpuid claims AMD64 capabilities, then revert to the generic "x86_64".
1022 This is of course wrong, but it can happen in some virtualisers and
1023 emulators, and this workaround allows for successful 64-bit builds. */
1024 modelstr = "x86_64";
1025 else if (cpu_avx && ! (cpuid_avx && cpuid_osxsave))
1026 /* For CPUs nominally capable of executing AVX, append "noavx" when not
1027 both the AVX and OSXSAVE cpuid bits are set. We tolerate weirdness
1028 here, as some virtualisers set a broken cpuid state, while other
1029 virtualisers allow guests to set a broken state. */
1030 suffix = "noavx";
1031
1032 printf ("%s%s", modelstr, suffix);
1033 return 0;
1034}
1035EOF
1036
1037# The rcx/ecx zeroing here and in the variant below is needed for the BMI2
1038# check.
1039
1040 cat <<EOF >${dummy}0.s
1041 .globl cpuid
1042 .globl _cpuid
1043cpuid:
1044_cpuid:
1045 push %rbx
1046 mov %rdx, %r8
1047 mov %ecx, %eax
1048 xor %ecx, %ecx
1049 .byte 0x0f
1050 .byte 0xa2
1051 mov %ebx, (%r8)
1052 mov %edx, 4(%r8)
1053 mov %ecx, 8(%r8)
1054 pop %rbx
1055 ret
1056EOF
1057
1058 if ($CC_FOR_BUILD ${dummy}0.s $dummy.c -o $dummy) >/dev/null 2>&1; then
1059 # On 80386 and early 80486 cpuid is not available and will result in a
1060 # SIGILL message, hence 2>/dev/null.
1061 #
1062 # On i386-unknown-freebsd4.9, "/bin/sh -c ./dummy" seems to send an
1063 # "Illegal instruction (core dumped)" message to stdout, so we test $?
1064 # to check if the program run was successful.
1065 #
1066 x=`$SHELL -c $dummy 2>/dev/null`
1067 if test $? = 0 && test -n "$x"; then
1068 exact_cpu=$x
1069 fi
1070 fi
1071
1072 cat <<EOF >${dummy}0.s
1073 .globl cpuid
1074 .globl _cpuid
1075cpuid:
1076_cpuid:
1077 pushl %esi
1078 pushl %ebx
1079 movl 24(%esp),%eax
1080 xor %ecx, %ecx
1081 .byte 0x0f
1082 .byte 0xa2
1083 movl 20(%esp),%esi
1084 movl %ebx,(%esi)
1085 movl %edx,4(%esi)
1086 movl %ecx,8(%esi)
1087 popl %ebx
1088 popl %esi
1089 ret
1090EOF
1091
1092 if test -z "$exact_cpu"; then
1093 if ($CC_FOR_BUILD ${dummy}0.s $dummy.c -o $dummy) >/dev/null 2>&1; then
1094 # On 80386 and early 80486 cpuid is not available and will result in a
1095 # SIGILL message, hence 2>/dev/null.
1096 #
1097 # On i386-unknown-freebsd4.9, "/bin/sh -c ./dummy" seems to send an
1098 # "Illegal instruction (core dumped)" message to stdout, so we test $?
1099 # to check if the program run was successful.
1100 #
1101 x=`$SHELL -c $dummy 2>/dev/null`
1102 if test $? = 0 && test -n "$x"; then
1103 exact_cpu=$x
1104 fi
1105 fi
1106 fi
1107
1108 # We need to remove some .o files here since lame C compilers
1109 # generate these even when not asked.
1110 ;;
1111
1112s390*-*-*)
1113 if test -f /proc/cpuinfo; then
1114 model=`grep "^processor 0: version =" /proc/cpuinfo | sed -e 's/.*machine = //'`
1115 case $model in
1116 2064 | 2066) zcpu="z900" ;;
1117 2084 | 2086) zcpu="z990" ;;
1118 2094 | 2096) zcpu="z9" ;;
1119 2097 | 2098) zcpu="z10" ;;
1120 2817 | 2818 | *) zcpu="z196" ;;
1121 esac
1122 case "$guess_full" in
1123 s390x-*-*) exact_cpu=${zcpu} ;;
1124 s390-*-*) exact_cpu=${zcpu}esa ;;
1125 esac
1126 fi
1127 ;;
1128
1129esac
1130
1131
1132
1133# -------------------------------------------------------------------------
1134# Use an exact cpu, if possible
1135
1136if test -n "$exact_cpu"; then
1137 echo "$exact_cpu$guess_rest"
1138else
1139 echo "$guess_full"
1140fi
1141exit 0
1142
1143
1144
1145# Local variables:
1146# fill-column: 76
1147# End: