packages feed

ghc-bignum 1.0 → 1.3

raw patch · 15 files changed

Files

changelog.md view
@@ -1,1 +1,20 @@ # Changelog for `ghc-bignum` package++## 1.3++- Expose backendName+- Add `naturalSetBit[#]` (#21173), `naturalClearBit[#]` (#21175), `naturalComplementBit[#]` (#21181)++## 1.2++- Moved naturalToDouble# and naturalToFloat# to `base` package++## 1.1++- Moved integerToDouble# and integerToFloat# to `base` package with fixed+  rounding (#15926, #17231, #17782)+- Added Eq and Ord instances for BigNat (#19647)+- Bump in-tree GMP to version 6.2.1+- Support for autoconf >= 2.70 especially on Windows (#19189)+- Fixed extra-source-files in .cabal file+- Fixed incorrect declaration in .hs-boot file (#19638)
− config.guess
@@ -1,1700 +0,0 @@-#! /bin/sh-# Attempt to guess a canonical system name.-#   Copyright 1992-2021 Free Software Foundation, Inc.--timestamp='2021-01-25'--# This file is free software; you can redistribute it and/or modify it-# under the terms of the GNU General Public License as published by-# the Free Software Foundation; either version 3 of the License, or-# (at your option) any later version.-#-# This program is distributed in the hope that it will be useful, but-# WITHOUT ANY WARRANTY; without even the implied warranty of-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU-# General Public License for more details.-#-# You should have received a copy of the GNU General Public License-# along with this program; if not, see <https://www.gnu.org/licenses/>.-#-# As a special exception to the GNU General Public License, if you-# distribute this file as part of a program that contains a-# configuration script generated by Autoconf, you may include it under-# the same distribution terms that you use for the rest of that-# program.  This Exception is an additional permission under section 7-# of the GNU General Public License, version 3 ("GPLv3").-#-# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.-#-# You can get the latest version of this script from:-# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess-#-# Please send patches to <config-patches@gnu.org>.---me=$(echo "$0" | sed -e 's,.*/,,')--usage="\-Usage: $0 [OPTION]--Output the configuration name of the system \`$me' is run on.--Options:-  -h, --help         print this help, then exit-  -t, --time-stamp   print date of last modification, then exit-  -v, --version      print version number, then exit--Report bugs and patches to <config-patches@gnu.org>."--version="\-GNU config.guess ($timestamp)--Originally written by Per Bothner.-Copyright 1992-2021 Free Software Foundation, Inc.--This is free software; see the source for copying conditions.  There is NO-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."--help="-Try \`$me --help' for more information."--# Parse command line-while test $# -gt 0 ; do-  case $1 in-    --time-stamp | --time* | -t )-       echo "$timestamp" ; exit ;;-    --version | -v )-       echo "$version" ; exit ;;-    --help | --h* | -h )-       echo "$usage"; exit ;;-    -- )     # Stop option processing-       shift; break ;;-    - )	# Use stdin as input.-       break ;;-    -* )-       echo "$me: invalid option $1$help" >&2-       exit 1 ;;-    * )-       break ;;-  esac-done--if test $# != 0; then-  echo "$me: too many arguments$help" >&2-  exit 1-fi--# CC_FOR_BUILD -- compiler used by this script. Note that the use of a-# compiler to aid in system detection is discouraged as it requires-# temporary files to be created and, as you can see below, it is a-# headache to deal with in a portable fashion.--# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still-# use `HOST_CC' if defined, but it is deprecated.--# Portable tmp directory creation inspired by the Autoconf team.--tmp=-# shellcheck disable=SC2172-trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15--set_cc_for_build() {-    # prevent multiple calls if $tmp is already set-    test "$tmp" && return 0-    : "${TMPDIR=/tmp}"-    # shellcheck disable=SC2039-    { tmp=$( (umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null) && test -n "$tmp" && test -d "$tmp" ; } ||-	{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||-	{ tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||-	{ echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }-    dummy=$tmp/dummy-    case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in-	,,)    echo "int x;" > "$dummy.c"-	       for driver in cc gcc c89 c99 ; do-		   if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then-		       CC_FOR_BUILD="$driver"-		       break-		   fi-	       done-	       if test x"$CC_FOR_BUILD" = x ; then-		   CC_FOR_BUILD=no_compiler_found-	       fi-	       ;;-	,,*)   CC_FOR_BUILD=$CC ;;-	,*,*)  CC_FOR_BUILD=$HOST_CC ;;-    esac-}--# This is needed to find uname on a Pyramid OSx when run in the BSD universe.-# (ghazi@noc.rutgers.edu 1994-08-24)-if test -f /.attbin/uname ; then-	PATH=$PATH:/.attbin ; export PATH-fi--UNAME_MACHINE=$( (uname -m) 2>/dev/null) || UNAME_MACHINE=unknown-UNAME_RELEASE=$( (uname -r) 2>/dev/null) || UNAME_RELEASE=unknown-UNAME_SYSTEM=$( (uname -s) 2>/dev/null) || UNAME_SYSTEM=unknown-UNAME_VERSION=$( (uname -v) 2>/dev/null) || UNAME_VERSION=unknown--case "$UNAME_SYSTEM" in-Linux|GNU|GNU/*)-	LIBC=unknown--	set_cc_for_build-	cat <<-EOF > "$dummy.c"-	#include <features.h>-	#if defined(__UCLIBC__)-	LIBC=uclibc-	#elif defined(__dietlibc__)-	LIBC=dietlibc-	#elif defined(__GLIBC__)-	LIBC=gnu-	#else-	#include <stdarg.h>-	/* First heuristic to detect musl libc.  */-	#ifdef __DEFINED_va_list-	LIBC=musl-	#endif-	#endif-	EOF-	eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g')"--	# Second heuristic to detect musl libc.-	if [ "$LIBC" = unknown ] &&-	   command -v ldd >/dev/null &&-	   ldd --version 2>&1 | grep -q ^musl; then-		LIBC=musl-	fi--	# If the system lacks a compiler, then just pick glibc.-	# We could probably try harder.-	if [ "$LIBC" = unknown ]; then-		LIBC=gnu-	fi-	;;-esac--# Note: order is significant - the case branches are not exclusive.--case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in-    *:NetBSD:*:*)-	# NetBSD (nbsd) targets should (where applicable) match one or-	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently-	# switched to ELF, *-*-netbsd* would select the old-	# object file format.  This provides both forward-	# compatibility and a consistent mechanism for selecting the-	# object file format.-	#-	# Note: NetBSD doesn't particularly care about the vendor-	# portion of the name.  We always set it to "unknown".-	UNAME_MACHINE_ARCH=$( (uname -p 2>/dev/null || \-	    /sbin/sysctl -n hw.machine_arch 2>/dev/null || \-	    /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \-	    echo unknown))-	case "$UNAME_MACHINE_ARCH" in-	    aarch64eb) machine=aarch64_be-unknown ;;-	    armeb) machine=armeb-unknown ;;-	    arm*) machine=arm-unknown ;;-	    sh3el) machine=shl-unknown ;;-	    sh3eb) machine=sh-unknown ;;-	    sh5el) machine=sh5le-unknown ;;-	    earmv*)-		arch=$(echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,')-		endian=$(echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p')-		machine="${arch}${endian}"-unknown-		;;-	    *) machine="$UNAME_MACHINE_ARCH"-unknown ;;-	esac-	# The Operating System including object format, if it has switched-	# to ELF recently (or will in the future) and ABI.-	case "$UNAME_MACHINE_ARCH" in-	    earm*)-		os=netbsdelf-		;;-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)-		set_cc_for_build-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \-			| grep -q __ELF__-		then-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).-		    # Return netbsd for either.  FIX?-		    os=netbsd-		else-		    os=netbsdelf-		fi-		;;-	    *)-		os=netbsd-		;;-	esac-	# Determine ABI tags.-	case "$UNAME_MACHINE_ARCH" in-	    earm*)-		expr='s/^earmv[0-9]/-eabi/;s/eb$//'-		abi=$(echo "$UNAME_MACHINE_ARCH" | sed -e "$expr")-		;;-	esac-	# The OS release-	# Debian GNU/NetBSD machines have a different userland, and-	# thus, need a distinct triplet. However, they do not need-	# kernel version information, so it can be replaced with a-	# suitable tag, in the style of linux-gnu.-	case "$UNAME_VERSION" in-	    Debian*)-		release='-gnu'-		;;-	    *)-		release=$(echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2)-		;;-	esac-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:-	# contains redundant information, the shorter form:-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.-	echo "$machine-${os}${release}${abi-}"-	exit ;;-    *:Bitrig:*:*)-	UNAME_MACHINE_ARCH=$(arch | sed 's/Bitrig.//')-	echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"-	exit ;;-    *:OpenBSD:*:*)-	UNAME_MACHINE_ARCH=$(arch | sed 's/OpenBSD.//')-	echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE"-	exit ;;-    *:LibertyBSD:*:*)-	UNAME_MACHINE_ARCH=$(arch | sed 's/^.*BSD\.//')-	echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE"-	exit ;;-    *:MidnightBSD:*:*)-	echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE"-	exit ;;-    *:ekkoBSD:*:*)-	echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE"-	exit ;;-    *:SolidBSD:*:*)-	echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"-	exit ;;-    *:OS108:*:*)-	echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE"-	exit ;;-    macppc:MirBSD:*:*)-	echo powerpc-unknown-mirbsd"$UNAME_RELEASE"-	exit ;;-    *:MirBSD:*:*)-	echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE"-	exit ;;-    *:Sortix:*:*)-	echo "$UNAME_MACHINE"-unknown-sortix-	exit ;;-    *:Twizzler:*:*)-	echo "$UNAME_MACHINE"-unknown-twizzler-	exit ;;-    *:Redox:*:*)-	echo "$UNAME_MACHINE"-unknown-redox-	exit ;;-    mips:OSF1:*.*)-	echo mips-dec-osf1-	exit ;;-    alpha:OSF1:*:*)-	case $UNAME_RELEASE in-	*4.0)-		UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $3}')-		;;-	*5.*)-		UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $4}')-		;;-	esac-	# According to Compaq, /usr/sbin/psrinfo has been available on-	# OSF/1 and Tru64 systems produced since 1995.  I hope that-	# covers most systems running today.  This code pipes the CPU-	# types through head -n 1, so we only detect the type of CPU 0.-	ALPHA_CPU_TYPE=$(/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1)-	case "$ALPHA_CPU_TYPE" in-	    "EV4 (21064)")-		UNAME_MACHINE=alpha ;;-	    "EV4.5 (21064)")-		UNAME_MACHINE=alpha ;;-	    "LCA4 (21066/21068)")-		UNAME_MACHINE=alpha ;;-	    "EV5 (21164)")-		UNAME_MACHINE=alphaev5 ;;-	    "EV5.6 (21164A)")-		UNAME_MACHINE=alphaev56 ;;-	    "EV5.6 (21164PC)")-		UNAME_MACHINE=alphapca56 ;;-	    "EV5.7 (21164PC)")-		UNAME_MACHINE=alphapca57 ;;-	    "EV6 (21264)")-		UNAME_MACHINE=alphaev6 ;;-	    "EV6.7 (21264A)")-		UNAME_MACHINE=alphaev67 ;;-	    "EV6.8CB (21264C)")-		UNAME_MACHINE=alphaev68 ;;-	    "EV6.8AL (21264B)")-		UNAME_MACHINE=alphaev68 ;;-	    "EV6.8CX (21264D)")-		UNAME_MACHINE=alphaev68 ;;-	    "EV6.9A (21264/EV69A)")-		UNAME_MACHINE=alphaev69 ;;-	    "EV7 (21364)")-		UNAME_MACHINE=alphaev7 ;;-	    "EV7.9 (21364A)")-		UNAME_MACHINE=alphaev79 ;;-	esac-	# A Pn.n version is a patched version.-	# A Vn.n version is a released version.-	# A Tn.n version is a released field test version.-	# A Xn.n version is an unreleased experimental baselevel.-	# 1.2 uses "1.2" for uname -r.-	echo "$UNAME_MACHINE"-dec-osf"$(echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)"-	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.-	exitcode=$?-	trap '' 0-	exit $exitcode ;;-    Amiga*:UNIX_System_V:4.0:*)-	echo m68k-unknown-sysv4-	exit ;;-    *:[Aa]miga[Oo][Ss]:*:*)-	echo "$UNAME_MACHINE"-unknown-amigaos-	exit ;;-    *:[Mm]orph[Oo][Ss]:*:*)-	echo "$UNAME_MACHINE"-unknown-morphos-	exit ;;-    *:OS/390:*:*)-	echo i370-ibm-openedition-	exit ;;-    *:z/VM:*:*)-	echo s390-ibm-zvmoe-	exit ;;-    *:OS400:*:*)-	echo powerpc-ibm-os400-	exit ;;-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)-	echo arm-acorn-riscix"$UNAME_RELEASE"-	exit ;;-    arm*:riscos:*:*|arm*:RISCOS:*:*)-	echo arm-unknown-riscos-	exit ;;-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)-	echo hppa1.1-hitachi-hiuxmpp-	exit ;;-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)-	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.-	if test "$( (/bin/universe) 2>/dev/null)" = att ; then-		echo pyramid-pyramid-sysv3-	else-		echo pyramid-pyramid-bsd-	fi-	exit ;;-    NILE*:*:*:dcosx)-	echo pyramid-pyramid-svr4-	exit ;;-    DRS?6000:unix:4.0:6*)-	echo sparc-icl-nx6-	exit ;;-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)-	case $(/usr/bin/uname -p) in-	    sparc) echo sparc-icl-nx7; exit ;;-	esac ;;-    s390x:SunOS:*:*)-	echo "$UNAME_MACHINE"-ibm-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"-	exit ;;-    sun4H:SunOS:5.*:*)-	echo sparc-hal-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"-	exit ;;-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)-	echo sparc-sun-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"-	exit ;;-    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)-	echo i386-pc-auroraux"$UNAME_RELEASE"-	exit ;;-    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)-	set_cc_for_build-	SUN_ARCH=i386-	# If there is a compiler, see if it is configured for 64-bit objects.-	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.-	# This test works for both compilers.-	if test "$CC_FOR_BUILD" != no_compiler_found; then-	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \-		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \-		grep IS_64BIT_ARCH >/dev/null-	    then-		SUN_ARCH=x86_64-	    fi-	fi-	echo "$SUN_ARCH"-pc-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"-	exit ;;-    sun4*:SunOS:6*:*)-	# According to config.sub, this is the proper way to canonicalize-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but-	# it's likely to be more like Solaris than SunOS4.-	echo sparc-sun-solaris3"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"-	exit ;;-    sun4*:SunOS:*:*)-	case "$(/usr/bin/arch -k)" in-	    Series*|S4*)-		UNAME_RELEASE=$(uname -v)-		;;-	esac-	# Japanese Language versions have a version number like `4.1.3-JL'.-	echo sparc-sun-sunos"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/')"-	exit ;;-    sun3*:SunOS:*:*)-	echo m68k-sun-sunos"$UNAME_RELEASE"-	exit ;;-    sun*:*:4.2BSD:*)-	UNAME_RELEASE=$( (sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null)-	test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3-	case "$(/bin/arch)" in-	    sun3)-		echo m68k-sun-sunos"$UNAME_RELEASE"-		;;-	    sun4)-		echo sparc-sun-sunos"$UNAME_RELEASE"-		;;-	esac-	exit ;;-    aushp:SunOS:*:*)-	echo sparc-auspex-sunos"$UNAME_RELEASE"-	exit ;;-    # The situation for MiNT is a little confusing.  The machine name-    # can be virtually everything (everything which is not-    # "atarist" or "atariste" at least should have a processor-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"-    # to the lowercase version "mint" (or "freemint").  Finally-    # the system name "TOS" denotes a system which is actually not-    # MiNT.  But MiNT is downward compatible to TOS, so this should-    # be no problem.-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)-	echo m68k-atari-mint"$UNAME_RELEASE"-	exit ;;-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)-	echo m68k-atari-mint"$UNAME_RELEASE"-	exit ;;-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)-	echo m68k-atari-mint"$UNAME_RELEASE"-	exit ;;-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)-	echo m68k-milan-mint"$UNAME_RELEASE"-	exit ;;-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)-	echo m68k-hades-mint"$UNAME_RELEASE"-	exit ;;-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)-	echo m68k-unknown-mint"$UNAME_RELEASE"-	exit ;;-    m68k:machten:*:*)-	echo m68k-apple-machten"$UNAME_RELEASE"-	exit ;;-    powerpc:machten:*:*)-	echo powerpc-apple-machten"$UNAME_RELEASE"-	exit ;;-    RISC*:Mach:*:*)-	echo mips-dec-mach_bsd4.3-	exit ;;-    RISC*:ULTRIX:*:*)-	echo mips-dec-ultrix"$UNAME_RELEASE"-	exit ;;-    VAX*:ULTRIX*:*:*)-	echo vax-dec-ultrix"$UNAME_RELEASE"-	exit ;;-    2020:CLIX:*:* | 2430:CLIX:*:*)-	echo clipper-intergraph-clix"$UNAME_RELEASE"-	exit ;;-    mips:*:*:UMIPS | mips:*:*:RISCos)-	set_cc_for_build-	sed 's/^	//' << EOF > "$dummy.c"-#ifdef __cplusplus-#include <stdio.h>  /* for printf() prototype */-	int main (int argc, char *argv[]) {-#else-	int main (argc, argv) int argc; char *argv[]; {-#endif-	#if defined (host_mips) && defined (MIPSEB)-	#if defined (SYSTYPE_SYSV)-	  printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);-	#endif-	#if defined (SYSTYPE_SVR4)-	  printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);-	#endif-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)-	  printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);-	#endif-	#endif-	  exit (-1);-	}-EOF-	$CC_FOR_BUILD -o "$dummy" "$dummy.c" &&-	  dummyarg=$(echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p') &&-	  SYSTEM_NAME=$("$dummy" "$dummyarg") &&-	    { echo "$SYSTEM_NAME"; exit; }-	echo mips-mips-riscos"$UNAME_RELEASE"-	exit ;;-    Motorola:PowerMAX_OS:*:*)-	echo powerpc-motorola-powermax-	exit ;;-    Motorola:*:4.3:PL8-*)-	echo powerpc-harris-powermax-	exit ;;-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)-	echo powerpc-harris-powermax-	exit ;;-    Night_Hawk:Power_UNIX:*:*)-	echo powerpc-harris-powerunix-	exit ;;-    m88k:CX/UX:7*:*)-	echo m88k-harris-cxux7-	exit ;;-    m88k:*:4*:R4*)-	echo m88k-motorola-sysv4-	exit ;;-    m88k:*:3*:R3*)-	echo m88k-motorola-sysv3-	exit ;;-    AViiON:dgux:*:*)-	# DG/UX returns AViiON for all architectures-	UNAME_PROCESSOR=$(/usr/bin/uname -p)-	if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110-	then-	    if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \-	       test "$TARGET_BINARY_INTERFACE"x = x-	    then-		echo m88k-dg-dgux"$UNAME_RELEASE"-	    else-		echo m88k-dg-dguxbcs"$UNAME_RELEASE"-	    fi-	else-	    echo i586-dg-dgux"$UNAME_RELEASE"-	fi-	exit ;;-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)-	echo m88k-dolphin-sysv3-	exit ;;-    M88*:*:R3*:*)-	# Delta 88k system running SVR3-	echo m88k-motorola-sysv3-	exit ;;-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)-	echo m88k-tektronix-sysv3-	exit ;;-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)-	echo m68k-tektronix-bsd-	exit ;;-    *:IRIX*:*:*)-	echo mips-sgi-irix"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/g')"-	exit ;;-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id-	exit ;;               # Note that: echo "'$(uname -s)'" gives 'AIX '-    i*86:AIX:*:*)-	echo i386-ibm-aix-	exit ;;-    ia64:AIX:*:*)-	if test -x /usr/bin/oslevel ; then-		IBM_REV=$(/usr/bin/oslevel)-	else-		IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"-	fi-	echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV"-	exit ;;-    *:AIX:2:3)-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then-		set_cc_for_build-		sed 's/^		//' << EOF > "$dummy.c"-		#include <sys/systemcfg.h>--		main()-			{-			if (!__power_pc())-				exit(1);-			puts("powerpc-ibm-aix3.2.5");-			exit(0);-			}-EOF-		if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy")-		then-			echo "$SYSTEM_NAME"-		else-			echo rs6000-ibm-aix3.2.5-		fi-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then-		echo rs6000-ibm-aix3.2.4-	else-		echo rs6000-ibm-aix3.2-	fi-	exit ;;-    *:AIX:*:[4567])-	IBM_CPU_ID=$(/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }')-	if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then-		IBM_ARCH=rs6000-	else-		IBM_ARCH=powerpc-	fi-	if test -x /usr/bin/lslpp ; then-		IBM_REV=$(/usr/bin/lslpp -Lqc bos.rte.libc |-			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/)-	else-		IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"-	fi-	echo "$IBM_ARCH"-ibm-aix"$IBM_REV"-	exit ;;-    *:AIX:*:*)-	echo rs6000-ibm-aix-	exit ;;-    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)-	echo romp-ibm-bsd4.4-	exit ;;-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and-	echo romp-ibm-bsd"$UNAME_RELEASE"   # 4.3 with uname added to-	exit ;;                             # report: romp-ibm BSD 4.3-    *:BOSX:*:*)-	echo rs6000-bull-bosx-	exit ;;-    DPX/2?00:B.O.S.:*:*)-	echo m68k-bull-sysv3-	exit ;;-    9000/[34]??:4.3bsd:1.*:*)-	echo m68k-hp-bsd-	exit ;;-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)-	echo m68k-hp-bsd4.4-	exit ;;-    9000/[34678]??:HP-UX:*:*)-	HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')-	case "$UNAME_MACHINE" in-	    9000/31?)            HP_ARCH=m68000 ;;-	    9000/[34]??)         HP_ARCH=m68k ;;-	    9000/[678][0-9][0-9])-		if test -x /usr/bin/getconf; then-		    sc_cpu_version=$(/usr/bin/getconf SC_CPU_VERSION 2>/dev/null)-		    sc_kernel_bits=$(/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null)-		    case "$sc_cpu_version" in-		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0-		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1-		      532)                      # CPU_PA_RISC2_0-			case "$sc_kernel_bits" in-			  32) HP_ARCH=hppa2.0n ;;-			  64) HP_ARCH=hppa2.0w ;;-			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20-			esac ;;-		    esac-		fi-		if test "$HP_ARCH" = ""; then-		    set_cc_for_build-		    sed 's/^		//' << EOF > "$dummy.c"--		#define _HPUX_SOURCE-		#include <stdlib.h>-		#include <unistd.h>--		int main ()-		{-		#if defined(_SC_KERNEL_BITS)-		    long bits = sysconf(_SC_KERNEL_BITS);-		#endif-		    long cpu  = sysconf (_SC_CPU_VERSION);--		    switch (cpu)-			{-			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;-			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;-			case CPU_PA_RISC2_0:-		#if defined(_SC_KERNEL_BITS)-			    switch (bits)-				{-				case 64: puts ("hppa2.0w"); break;-				case 32: puts ("hppa2.0n"); break;-				default: puts ("hppa2.0"); break;-				} break;-		#else  /* !defined(_SC_KERNEL_BITS) */-			    puts ("hppa2.0"); break;-		#endif-			default: puts ("hppa1.0"); break;-			}-		    exit (0);-		}-EOF-		    (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=$("$dummy")-		    test -z "$HP_ARCH" && HP_ARCH=hppa-		fi ;;-	esac-	if test "$HP_ARCH" = hppa2.0w-	then-	    set_cc_for_build--	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler-	    # generating 64-bit code.  GNU and HP use different nomenclature:-	    #-	    # $ CC_FOR_BUILD=cc ./config.guess-	    # => hppa2.0w-hp-hpux11.23-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess-	    # => hppa64-hp-hpux11.23--	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |-		grep -q __LP64__-	    then-		HP_ARCH=hppa2.0w-	    else-		HP_ARCH=hppa64-	    fi-	fi-	echo "$HP_ARCH"-hp-hpux"$HPUX_REV"-	exit ;;-    ia64:HP-UX:*:*)-	HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')-	echo ia64-hp-hpux"$HPUX_REV"-	exit ;;-    3050*:HI-UX:*:*)-	set_cc_for_build-	sed 's/^	//' << EOF > "$dummy.c"-	#include <unistd.h>-	int-	main ()-	{-	  long cpu = sysconf (_SC_CPU_VERSION);-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct-	     results, however.  */-	  if (CPU_IS_PA_RISC (cpu))-	    {-	      switch (cpu)-		{-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;-		  default: puts ("hppa-hitachi-hiuxwe2"); break;-		}-	    }-	  else if (CPU_IS_HP_MC68K (cpu))-	    puts ("m68k-hitachi-hiuxwe2");-	  else puts ("unknown-hitachi-hiuxwe2");-	  exit (0);-	}-EOF-	$CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") &&-		{ echo "$SYSTEM_NAME"; exit; }-	echo unknown-hitachi-hiuxwe2-	exit ;;-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)-	echo hppa1.1-hp-bsd-	exit ;;-    9000/8??:4.3bsd:*:*)-	echo hppa1.0-hp-bsd-	exit ;;-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)-	echo hppa1.0-hp-mpeix-	exit ;;-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)-	echo hppa1.1-hp-osf-	exit ;;-    hp8??:OSF1:*:*)-	echo hppa1.0-hp-osf-	exit ;;-    i*86:OSF1:*:*)-	if test -x /usr/sbin/sysversion ; then-	    echo "$UNAME_MACHINE"-unknown-osf1mk-	else-	    echo "$UNAME_MACHINE"-unknown-osf1-	fi-	exit ;;-    parisc*:Lites*:*:*)-	echo hppa1.1-hp-lites-	exit ;;-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)-	echo c1-convex-bsd-	exit ;;-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)-	if getsysinfo -f scalar_acc-	then echo c32-convex-bsd-	else echo c2-convex-bsd-	fi-	exit ;;-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)-	echo c34-convex-bsd-	exit ;;-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)-	echo c38-convex-bsd-	exit ;;-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)-	echo c4-convex-bsd-	exit ;;-    CRAY*Y-MP:*:*:*)-	echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'-	exit ;;-    CRAY*[A-Z]90:*:*:*)-	echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \-	      -e 's/\.[^.]*$/.X/'-	exit ;;-    CRAY*TS:*:*:*)-	echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'-	exit ;;-    CRAY*T3E:*:*:*)-	echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'-	exit ;;-    CRAY*SV1:*:*:*)-	echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'-	exit ;;-    *:UNICOS/mp:*:*)-	echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'-	exit ;;-    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)-	FUJITSU_PROC=$(uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)-	FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')-	FUJITSU_REL=$(echo "$UNAME_RELEASE" | sed -e 's/ /_/')-	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"-	exit ;;-    5000:UNIX_System_V:4.*:*)-	FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')-	FUJITSU_REL=$(echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/')-	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"-	exit ;;-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)-	echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE"-	exit ;;-    sparc*:BSD/OS:*:*)-	echo sparc-unknown-bsdi"$UNAME_RELEASE"-	exit ;;-    *:BSD/OS:*:*)-	echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"-	exit ;;-    arm:FreeBSD:*:*)-	UNAME_PROCESSOR=$(uname -p)-	set_cc_for_build-	if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \-	    | grep -q __ARM_PCS_VFP-	then-	    echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabi-	else-	    echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabihf-	fi-	exit ;;-    *:FreeBSD:*:*)-	UNAME_PROCESSOR=$(/usr/bin/uname -p)-	case "$UNAME_PROCESSOR" in-	    amd64)-		UNAME_PROCESSOR=x86_64 ;;-	    i386)-		UNAME_PROCESSOR=i586 ;;-	esac-	echo "$UNAME_PROCESSOR"-unknown-freebsd"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"-	exit ;;-    i*:CYGWIN*:*)-	echo "$UNAME_MACHINE"-pc-cygwin-	exit ;;-    *:MINGW64*:*)-	echo "$UNAME_MACHINE"-pc-mingw64-	exit ;;-    *:MINGW*:*)-	echo "$UNAME_MACHINE"-pc-mingw32-	exit ;;-    *:MSYS*:*)-	echo "$UNAME_MACHINE"-pc-msys-	exit ;;-    i*:PW*:*)-	echo "$UNAME_MACHINE"-pc-pw32-	exit ;;-    *:Interix*:*)-	case "$UNAME_MACHINE" in-	    x86)-		echo i586-pc-interix"$UNAME_RELEASE"-		exit ;;-	    authenticamd | genuineintel | EM64T)-		echo x86_64-unknown-interix"$UNAME_RELEASE"-		exit ;;-	    IA64)-		echo ia64-unknown-interix"$UNAME_RELEASE"-		exit ;;-	esac ;;-    i*:UWIN*:*)-	echo "$UNAME_MACHINE"-pc-uwin-	exit ;;-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)-	echo x86_64-pc-cygwin-	exit ;;-    prep*:SunOS:5.*:*)-	echo powerpcle-unknown-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"-	exit ;;-    *:GNU:*:*)-	# the GNU system-	echo "$(echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,')-unknown-$LIBC$(echo "$UNAME_RELEASE"|sed -e 's,/.*$,,')"-	exit ;;-    *:GNU/*:*:*)-	# other systems with GNU libc and userland-	echo "$UNAME_MACHINE-unknown-$(echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]")$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')-$LIBC"-	exit ;;-    *:Minix:*:*)-	echo "$UNAME_MACHINE"-unknown-minix-	exit ;;-    aarch64:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    aarch64_be:Linux:*:*)-	UNAME_MACHINE=aarch64_be-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    alpha:Linux:*:*)-	case $(sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null) in-	  EV5)   UNAME_MACHINE=alphaev5 ;;-	  EV56)  UNAME_MACHINE=alphaev56 ;;-	  PCA56) UNAME_MACHINE=alphapca56 ;;-	  PCA57) UNAME_MACHINE=alphapca56 ;;-	  EV6)   UNAME_MACHINE=alphaev6 ;;-	  EV67)  UNAME_MACHINE=alphaev67 ;;-	  EV68*) UNAME_MACHINE=alphaev68 ;;-	esac-	objdump --private-headers /bin/sh | grep -q ld.so.1-	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    arc:Linux:*:* | arceb:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    arm*:Linux:*:*)-	set_cc_for_build-	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \-	    | grep -q __ARM_EABI__-	then-	    echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	else-	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \-		| grep -q __ARM_PCS_VFP-	    then-		echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi-	    else-		echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf-	    fi-	fi-	exit ;;-    avr32*:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    cris:Linux:*:*)-	echo "$UNAME_MACHINE"-axis-linux-"$LIBC"-	exit ;;-    crisv32:Linux:*:*)-	echo "$UNAME_MACHINE"-axis-linux-"$LIBC"-	exit ;;-    e2k:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    frv:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    hexagon:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    i*86:Linux:*:*)-	echo "$UNAME_MACHINE"-pc-linux-"$LIBC"-	exit ;;-    ia64:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    k1om:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    m32r*:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    m68*:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    mips:Linux:*:* | mips64:Linux:*:*)-	set_cc_for_build-	IS_GLIBC=0-	test x"${LIBC}" = xgnu && IS_GLIBC=1-	sed 's/^	//' << EOF > "$dummy.c"-	#undef CPU-	#undef mips-	#undef mipsel-	#undef mips64-	#undef mips64el-	#if ${IS_GLIBC} && defined(_ABI64)-	LIBCABI=gnuabi64-	#else-	#if ${IS_GLIBC} && defined(_ABIN32)-	LIBCABI=gnuabin32-	#else-	LIBCABI=${LIBC}-	#endif-	#endif--	#if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6-	CPU=mipsisa64r6-	#else-	#if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6-	CPU=mipsisa32r6-	#else-	#if defined(__mips64)-	CPU=mips64-	#else-	CPU=mips-	#endif-	#endif-	#endif--	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)-	MIPS_ENDIAN=el-	#else-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)-	MIPS_ENDIAN=-	#else-	MIPS_ENDIAN=-	#endif-	#endif-EOF-	eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI')"-	test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }-	;;-    mips64el:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    openrisc*:Linux:*:*)-	echo or1k-unknown-linux-"$LIBC"-	exit ;;-    or32:Linux:*:* | or1k*:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    padre:Linux:*:*)-	echo sparc-unknown-linux-"$LIBC"-	exit ;;-    parisc64:Linux:*:* | hppa64:Linux:*:*)-	echo hppa64-unknown-linux-"$LIBC"-	exit ;;-    parisc:Linux:*:* | hppa:Linux:*:*)-	# Look for CPU level-	case $(grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2) in-	  PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;;-	  PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;;-	  *)    echo hppa-unknown-linux-"$LIBC" ;;-	esac-	exit ;;-    ppc64:Linux:*:*)-	echo powerpc64-unknown-linux-"$LIBC"-	exit ;;-    ppc:Linux:*:*)-	echo powerpc-unknown-linux-"$LIBC"-	exit ;;-    ppc64le:Linux:*:*)-	echo powerpc64le-unknown-linux-"$LIBC"-	exit ;;-    ppcle:Linux:*:*)-	echo powerpcle-unknown-linux-"$LIBC"-	exit ;;-    riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    s390:Linux:*:* | s390x:Linux:*:*)-	echo "$UNAME_MACHINE"-ibm-linux-"$LIBC"-	exit ;;-    sh64*:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    sh*:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    sparc:Linux:*:* | sparc64:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    tile*:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    vax:Linux:*:*)-	echo "$UNAME_MACHINE"-dec-linux-"$LIBC"-	exit ;;-    x86_64:Linux:*:*)-	set_cc_for_build-	LIBCABI=$LIBC-	if test "$CC_FOR_BUILD" != no_compiler_found; then-	    if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \-		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \-		grep IS_X32 >/dev/null-	    then-		LIBCABI="$LIBC"x32-	    fi-	fi-	echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI"-	exit ;;-    xtensa*:Linux:*:*)-	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"-	exit ;;-    i*86:DYNIX/ptx:4*:*)-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.-	# earlier versions are messed up and put the nodename in both-	# sysname and nodename.-	echo i386-sequent-sysv4-	exit ;;-    i*86:UNIX_SV:4.2MP:2.*)-	# Unixware is an offshoot of SVR4, but it has its own version-	# number series starting with 2...-	# I am not positive that other SVR4 systems won't match this,-	# I just have to hope.  -- rms.-	# Use sysv4.2uw... so that sysv4* matches it.-	echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION"-	exit ;;-    i*86:OS/2:*:*)-	# If we were able to find `uname', then EMX Unix compatibility-	# is probably installed.-	echo "$UNAME_MACHINE"-pc-os2-emx-	exit ;;-    i*86:XTS-300:*:STOP)-	echo "$UNAME_MACHINE"-unknown-stop-	exit ;;-    i*86:atheos:*:*)-	echo "$UNAME_MACHINE"-unknown-atheos-	exit ;;-    i*86:syllable:*:*)-	echo "$UNAME_MACHINE"-pc-syllable-	exit ;;-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)-	echo i386-unknown-lynxos"$UNAME_RELEASE"-	exit ;;-    i*86:*DOS:*:*)-	echo "$UNAME_MACHINE"-pc-msdosdjgpp-	exit ;;-    i*86:*:4.*:*)-	UNAME_REL=$(echo "$UNAME_RELEASE" | sed 's/\/MP$//')-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then-		echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"-	else-		echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL"-	fi-	exit ;;-    i*86:*:5:[678]*)-	# UnixWare 7.x, OpenUNIX and OpenServer 6.-	case $(/bin/uname -X | grep "^Machine") in-	    *486*)	     UNAME_MACHINE=i486 ;;-	    *Pentium)	     UNAME_MACHINE=i586 ;;-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;-	esac-	echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}"-	exit ;;-    i*86:*:3.2:*)-	if test -f /usr/options/cb.name; then-		UNAME_REL=$(sed -n 's/.*Version //p' </usr/options/cb.name)-		echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"-	elif /bin/uname -X 2>/dev/null >/dev/null ; then-		UNAME_REL=$( (/bin/uname -X|grep Release|sed -e 's/.*= //'))-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \-			&& UNAME_MACHINE=i586-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \-			&& UNAME_MACHINE=i686-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \-			&& UNAME_MACHINE=i686-		echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL"-	else-		echo "$UNAME_MACHINE"-pc-sysv32-	fi-	exit ;;-    pc:*:*:*)-	# Left here for compatibility:-	# uname -m prints for DJGPP always 'pc', but it prints nothing about-	# the processor, so we play safe by assuming i586.-	# Note: whatever this is, it MUST be the same as what config.sub-	# prints for the "djgpp" host, or else GDB configure will decide that-	# this is a cross-build.-	echo i586-pc-msdosdjgpp-	exit ;;-    Intel:Mach:3*:*)-	echo i386-pc-mach3-	exit ;;-    paragon:*:*:*)-	echo i860-intel-osf1-	exit ;;-    i860:*:4.*:*) # i860-SVR4-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then-	  echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4-	else # Add other i860-SVR4 vendors below as they are discovered.-	  echo i860-unknown-sysv"$UNAME_RELEASE"  # Unknown i860-SVR4-	fi-	exit ;;-    mini*:CTIX:SYS*5:*)-	# "miniframe"-	echo m68010-convergent-sysv-	exit ;;-    mc68k:UNIX:SYSTEM5:3.51m)-	echo m68k-convergent-sysv-	exit ;;-    M680?0:D-NIX:5.3:*)-	echo m68k-diab-dnix-	exit ;;-    M68*:*:R3V[5678]*:*)-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)-	OS_REL=''-	test -r /etc/.relid \-	&& OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \-	  && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \-	  && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \-	  && { echo i486-ncr-sysv4; exit; } ;;-    NCR*:*:4.2:* | MPRAS*:*:4.2:*)-	OS_REL='.3'-	test -r /etc/.relid \-	    && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \-	    && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \-	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }-	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \-	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)-	echo m68k-unknown-lynxos"$UNAME_RELEASE"-	exit ;;-    mc68030:UNIX_System_V:4.*:*)-	echo m68k-atari-sysv4-	exit ;;-    TSUNAMI:LynxOS:2.*:*)-	echo sparc-unknown-lynxos"$UNAME_RELEASE"-	exit ;;-    rs6000:LynxOS:2.*:*)-	echo rs6000-unknown-lynxos"$UNAME_RELEASE"-	exit ;;-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)-	echo powerpc-unknown-lynxos"$UNAME_RELEASE"-	exit ;;-    SM[BE]S:UNIX_SV:*:*)-	echo mips-dde-sysv"$UNAME_RELEASE"-	exit ;;-    RM*:ReliantUNIX-*:*:*)-	echo mips-sni-sysv4-	exit ;;-    RM*:SINIX-*:*:*)-	echo mips-sni-sysv4-	exit ;;-    *:SINIX-*:*:*)-	if uname -p 2>/dev/null >/dev/null ; then-		UNAME_MACHINE=$( (uname -p) 2>/dev/null)-		echo "$UNAME_MACHINE"-sni-sysv4-	else-		echo ns32k-sni-sysv-	fi-	exit ;;-    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort-			# says <Richard.M.Bartel@ccMail.Census.GOV>-	echo i586-unisys-sysv4-	exit ;;-    *:UNIX_System_V:4*:FTX*)-	# From Gerald Hewes <hewes@openmarket.com>.-	# How about differentiating between stratus architectures? -djm-	echo hppa1.1-stratus-sysv4-	exit ;;-    *:*:*:FTX*)-	# From seanf@swdc.stratus.com.-	echo i860-stratus-sysv4-	exit ;;-    i*86:VOS:*:*)-	# From Paul.Green@stratus.com.-	echo "$UNAME_MACHINE"-stratus-vos-	exit ;;-    *:VOS:*:*)-	# From Paul.Green@stratus.com.-	echo hppa1.1-stratus-vos-	exit ;;-    mc68*:A/UX:*:*)-	echo m68k-apple-aux"$UNAME_RELEASE"-	exit ;;-    news*:NEWS-OS:6*:*)-	echo mips-sony-newsos6-	exit ;;-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)-	if test -d /usr/nec; then-		echo mips-nec-sysv"$UNAME_RELEASE"-	else-		echo mips-unknown-sysv"$UNAME_RELEASE"-	fi-	exit ;;-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.-	echo powerpc-be-beos-	exit ;;-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.-	echo powerpc-apple-beos-	exit ;;-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.-	echo i586-pc-beos-	exit ;;-    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.-	echo i586-pc-haiku-	exit ;;-    x86_64:Haiku:*:*)-	echo x86_64-unknown-haiku-	exit ;;-    SX-4:SUPER-UX:*:*)-	echo sx4-nec-superux"$UNAME_RELEASE"-	exit ;;-    SX-5:SUPER-UX:*:*)-	echo sx5-nec-superux"$UNAME_RELEASE"-	exit ;;-    SX-6:SUPER-UX:*:*)-	echo sx6-nec-superux"$UNAME_RELEASE"-	exit ;;-    SX-7:SUPER-UX:*:*)-	echo sx7-nec-superux"$UNAME_RELEASE"-	exit ;;-    SX-8:SUPER-UX:*:*)-	echo sx8-nec-superux"$UNAME_RELEASE"-	exit ;;-    SX-8R:SUPER-UX:*:*)-	echo sx8r-nec-superux"$UNAME_RELEASE"-	exit ;;-    SX-ACE:SUPER-UX:*:*)-	echo sxace-nec-superux"$UNAME_RELEASE"-	exit ;;-    Power*:Rhapsody:*:*)-	echo powerpc-apple-rhapsody"$UNAME_RELEASE"-	exit ;;-    *:Rhapsody:*:*)-	echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"-	exit ;;-    arm64:Darwin:*:*)-	echo aarch64-apple-darwin"$UNAME_RELEASE"-	exit ;;-    *:Darwin:*:*)-	UNAME_PROCESSOR=$(uname -p)-	case $UNAME_PROCESSOR in-	    unknown) UNAME_PROCESSOR=powerpc ;;-	esac-	if command -v xcode-select > /dev/null 2> /dev/null && \-		! xcode-select --print-path > /dev/null 2> /dev/null ; then-	    # Avoid executing cc if there is no toolchain installed as-	    # cc will be a stub that puts up a graphical alert-	    # prompting the user to install developer tools.-	    CC_FOR_BUILD=no_compiler_found-	else-	    set_cc_for_build-	fi-	if test "$CC_FOR_BUILD" != no_compiler_found; then-	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \-		   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \-		   grep IS_64BIT_ARCH >/dev/null-	    then-		case $UNAME_PROCESSOR in-		    i386) UNAME_PROCESSOR=x86_64 ;;-		    powerpc) UNAME_PROCESSOR=powerpc64 ;;-		esac-	    fi-	    # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc-	    if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \-		   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \-		   grep IS_PPC >/dev/null-	    then-		UNAME_PROCESSOR=powerpc-	    fi-	elif test "$UNAME_PROCESSOR" = i386 ; then-	    # uname -m returns i386 or x86_64-	    UNAME_PROCESSOR=$UNAME_MACHINE-	fi-	echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"-	exit ;;-    *:procnto*:*:* | *:QNX:[0123456789]*:*)-	UNAME_PROCESSOR=$(uname -p)-	if test "$UNAME_PROCESSOR" = x86; then-		UNAME_PROCESSOR=i386-		UNAME_MACHINE=pc-	fi-	echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE"-	exit ;;-    *:QNX:*:4*)-	echo i386-pc-qnx-	exit ;;-    NEO-*:NONSTOP_KERNEL:*:*)-	echo neo-tandem-nsk"$UNAME_RELEASE"-	exit ;;-    NSE-*:NONSTOP_KERNEL:*:*)-	echo nse-tandem-nsk"$UNAME_RELEASE"-	exit ;;-    NSR-*:NONSTOP_KERNEL:*:*)-	echo nsr-tandem-nsk"$UNAME_RELEASE"-	exit ;;-    NSV-*:NONSTOP_KERNEL:*:*)-	echo nsv-tandem-nsk"$UNAME_RELEASE"-	exit ;;-    NSX-*:NONSTOP_KERNEL:*:*)-	echo nsx-tandem-nsk"$UNAME_RELEASE"-	exit ;;-    *:NonStop-UX:*:*)-	echo mips-compaq-nonstopux-	exit ;;-    BS2000:POSIX*:*:*)-	echo bs2000-siemens-sysv-	exit ;;-    DS/*:UNIX_System_V:*:*)-	echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE"-	exit ;;-    *:Plan9:*:*)-	# "uname -m" is not consistent, so use $cputype instead. 386-	# is converted to i386 for consistency with other x86-	# operating systems.-	# shellcheck disable=SC2154-	if test "$cputype" = 386; then-	    UNAME_MACHINE=i386-	else-	    UNAME_MACHINE="$cputype"-	fi-	echo "$UNAME_MACHINE"-unknown-plan9-	exit ;;-    *:TOPS-10:*:*)-	echo pdp10-unknown-tops10-	exit ;;-    *:TENEX:*:*)-	echo pdp10-unknown-tenex-	exit ;;-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)-	echo pdp10-dec-tops20-	exit ;;-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)-	echo pdp10-xkl-tops20-	exit ;;-    *:TOPS-20:*:*)-	echo pdp10-unknown-tops20-	exit ;;-    *:ITS:*:*)-	echo pdp10-unknown-its-	exit ;;-    SEI:*:*:SEIUX)-	echo mips-sei-seiux"$UNAME_RELEASE"-	exit ;;-    *:DragonFly:*:*)-	echo "$UNAME_MACHINE"-unknown-dragonfly"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"-	exit ;;-    *:*VMS:*:*)-	UNAME_MACHINE=$( (uname -p) 2>/dev/null)-	case "$UNAME_MACHINE" in-	    A*) echo alpha-dec-vms ; exit ;;-	    I*) echo ia64-dec-vms ; exit ;;-	    V*) echo vax-dec-vms ; exit ;;-	esac ;;-    *:XENIX:*:SysV)-	echo i386-pc-xenix-	exit ;;-    i*86:skyos:*:*)-	echo "$UNAME_MACHINE"-pc-skyos"$(echo "$UNAME_RELEASE" | sed -e 's/ .*$//')"-	exit ;;-    i*86:rdos:*:*)-	echo "$UNAME_MACHINE"-pc-rdos-	exit ;;-    *:AROS:*:*)-	echo "$UNAME_MACHINE"-unknown-aros-	exit ;;-    x86_64:VMkernel:*:*)-	echo "$UNAME_MACHINE"-unknown-esx-	exit ;;-    amd64:Isilon\ OneFS:*:*)-	echo x86_64-unknown-onefs-	exit ;;-    *:Unleashed:*:*)-	echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"-	exit ;;-esac--# No uname command or uname output not recognized.-set_cc_for_build-cat > "$dummy.c" <<EOF-#ifdef _SEQUENT_-#include <sys/types.h>-#include <sys/utsname.h>-#endif-#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)-#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)-#include <signal.h>-#if defined(_SIZE_T_) || defined(SIGLOST)-#include <sys/utsname.h>-#endif-#endif-#endif-main ()-{-#if defined (sony)-#if defined (MIPSEB)-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,-     I don't know....  */-  printf ("mips-sony-bsd\n"); exit (0);-#else-#include <sys/param.h>-  printf ("m68k-sony-newsos%s\n",-#ifdef NEWSOS4-  "4"-#else-  ""-#endif-  ); exit (0);-#endif-#endif--#if defined (NeXT)-#if !defined (__ARCHITECTURE__)-#define __ARCHITECTURE__ "m68k"-#endif-  int version;-  version=$( (hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null);-  if (version < 4)-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);-  else-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);-  exit (0);-#endif--#if defined (MULTIMAX) || defined (n16)-#if defined (UMAXV)-  printf ("ns32k-encore-sysv\n"); exit (0);-#else-#if defined (CMU)-  printf ("ns32k-encore-mach\n"); exit (0);-#else-  printf ("ns32k-encore-bsd\n"); exit (0);-#endif-#endif-#endif--#if defined (__386BSD__)-  printf ("i386-pc-bsd\n"); exit (0);-#endif--#if defined (sequent)-#if defined (i386)-  printf ("i386-sequent-dynix\n"); exit (0);-#endif-#if defined (ns32000)-  printf ("ns32k-sequent-dynix\n"); exit (0);-#endif-#endif--#if defined (_SEQUENT_)-  struct utsname un;--  uname(&un);-  if (strncmp(un.version, "V2", 2) == 0) {-    printf ("i386-sequent-ptx2\n"); exit (0);-  }-  if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */-    printf ("i386-sequent-ptx1\n"); exit (0);-  }-  printf ("i386-sequent-ptx\n"); exit (0);-#endif--#if defined (vax)-#if !defined (ultrix)-#include <sys/param.h>-#if defined (BSD)-#if BSD == 43-  printf ("vax-dec-bsd4.3\n"); exit (0);-#else-#if BSD == 199006-  printf ("vax-dec-bsd4.3reno\n"); exit (0);-#else-  printf ("vax-dec-bsd\n"); exit (0);-#endif-#endif-#else-  printf ("vax-dec-bsd\n"); exit (0);-#endif-#else-#if defined(_SIZE_T_) || defined(SIGLOST)-  struct utsname un;-  uname (&un);-  printf ("vax-dec-ultrix%s\n", un.release); exit (0);-#else-  printf ("vax-dec-ultrix\n"); exit (0);-#endif-#endif-#endif-#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)-#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)-#if defined(_SIZE_T_) || defined(SIGLOST)-  struct utsname *un;-  uname (&un);-  printf ("mips-dec-ultrix%s\n", un.release); exit (0);-#else-  printf ("mips-dec-ultrix\n"); exit (0);-#endif-#endif-#endif--#if defined (alliant) && defined (i860)-  printf ("i860-alliant-bsd\n"); exit (0);-#endif--  exit (1);-}-EOF--$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=$($dummy) &&-	{ echo "$SYSTEM_NAME"; exit; }--# Apollos put the system type in the environment.-test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }--echo "$0: unable to guess system type" >&2--case "$UNAME_MACHINE:$UNAME_SYSTEM" in-    mips:Linux | mips64:Linux)-	# If we got here on MIPS GNU/Linux, output extra information.-	cat >&2 <<EOF--NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize-the system type. Please install a C compiler and try again.-EOF-	;;-esac--cat >&2 <<EOF--This script (version $timestamp), has failed to recognize the-operating system you are using. If your script is old, overwrite *all*-copies of config.guess and config.sub with the latest versions from:--  https://git.savannah.gnu.org/cgit/config.git/plain/config.guess-and-  https://git.savannah.gnu.org/cgit/config.git/plain/config.sub-EOF--year=$(echo $timestamp | sed 's,-.*,,')-# shellcheck disable=SC2003-if test "$(expr "$(date +%Y)" - "$year")" -lt 3 ; then-   cat >&2 <<EOF--If $0 has already been updated, send the following data and any-information you think might be pertinent to config-patches@gnu.org to-provide the necessary information to handle your system.--config.guess timestamp = $timestamp--uname -m = $( (uname -m) 2>/dev/null || echo unknown)-uname -r = $( (uname -r) 2>/dev/null || echo unknown)-uname -s = $( (uname -s) 2>/dev/null || echo unknown)-uname -v = $( (uname -v) 2>/dev/null || echo unknown)--/usr/bin/uname -p = $( (/usr/bin/uname -p) 2>/dev/null)-/bin/uname -X     = $( (/bin/uname -X) 2>/dev/null)--hostinfo               = $( (hostinfo) 2>/dev/null)-/bin/universe          = $( (/bin/universe) 2>/dev/null)-/usr/bin/arch -k       = $( (/usr/bin/arch -k) 2>/dev/null)-/bin/arch              = $( (/bin/arch) 2>/dev/null)-/usr/bin/oslevel       = $( (/usr/bin/oslevel) 2>/dev/null)-/usr/convex/getsysinfo = $( (/usr/convex/getsysinfo) 2>/dev/null)--UNAME_MACHINE = "$UNAME_MACHINE"-UNAME_RELEASE = "$UNAME_RELEASE"-UNAME_SYSTEM  = "$UNAME_SYSTEM"-UNAME_VERSION = "$UNAME_VERSION"-EOF-fi--exit 1--# Local variables:-# eval: (add-hook 'before-save-hook 'time-stamp)-# time-stamp-start: "timestamp='"-# time-stamp-format: "%:y-%02m-%02d"-# time-stamp-end: "'"-# End:
− config.sub
@@ -1,1860 +0,0 @@-#! /bin/sh-# Configuration validation subroutine script.-#   Copyright 1992-2021 Free Software Foundation, Inc.--timestamp='2021-01-08'--# This file is free software; you can redistribute it and/or modify it-# under the terms of the GNU General Public License as published by-# the Free Software Foundation; either version 3 of the License, or-# (at your option) any later version.-#-# This program is distributed in the hope that it will be useful, but-# WITHOUT ANY WARRANTY; without even the implied warranty of-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU-# General Public License for more details.-#-# You should have received a copy of the GNU General Public License-# along with this program; if not, see <https://www.gnu.org/licenses/>.-#-# As a special exception to the GNU General Public License, if you-# distribute this file as part of a program that contains a-# configuration script generated by Autoconf, you may include it under-# the same distribution terms that you use for the rest of that-# program.  This Exception is an additional permission under section 7-# of the GNU General Public License, version 3 ("GPLv3").---# Please send patches to <config-patches@gnu.org>.-#-# Configuration subroutine to validate and canonicalize a configuration type.-# Supply the specified configuration type as an argument.-# If it is invalid, we print an error message on stderr and exit with code 1.-# Otherwise, we print the canonical config type on stdout and succeed.--# You can get the latest version of this script from:-# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub--# This file is supposed to be the same for all GNU packages-# and recognize all the CPU types, system types and aliases-# that are meaningful with *any* GNU software.-# Each package is responsible for reporting which valid configurations-# it does not support.  The user should be able to distinguish-# a failure to support a valid configuration from a meaningless-# configuration.--# The goal of this file is to map all the various variations of a given-# machine specification into a single specification in the form:-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM-# or in some cases, the newer four-part form:-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM-# It is wrong to echo any other type of specification.--me=$(echo "$0" | sed -e 's,.*/,,')--usage="\-Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS--Canonicalize a configuration name.--Options:-  -h, --help         print this help, then exit-  -t, --time-stamp   print date of last modification, then exit-  -v, --version      print version number, then exit--Report bugs and patches to <config-patches@gnu.org>."--version="\-GNU config.sub ($timestamp)--Copyright 1992-2021 Free Software Foundation, Inc.--This is free software; see the source for copying conditions.  There is NO-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."--help="-Try \`$me --help' for more information."--# Parse command line-while test $# -gt 0 ; do-  case $1 in-    --time-stamp | --time* | -t )-       echo "$timestamp" ; exit ;;-    --version | -v )-       echo "$version" ; exit ;;-    --help | --h* | -h )-       echo "$usage"; exit ;;-    -- )     # Stop option processing-       shift; break ;;-    - )	# Use stdin as input.-       break ;;-    -* )-       echo "$me: invalid option $1$help" >&2-       exit 1 ;;--    *local*)-       # First pass through any local machine types.-       echo "$1"-       exit ;;--    * )-       break ;;-  esac-done--case $# in- 0) echo "$me: missing argument$help" >&2-    exit 1;;- 1) ;;- *) echo "$me: too many arguments$help" >&2-    exit 1;;-esac--# Split fields of configuration type-# shellcheck disable=SC2162-IFS="-" read field1 field2 field3 field4 <<EOF-$1-EOF--# Separate into logical components for further validation-case $1 in-	*-*-*-*-*)-		echo Invalid configuration \`"$1"\': more than four components >&2-		exit 1-		;;-	*-*-*-*)-		basic_machine=$field1-$field2-		basic_os=$field3-$field4-		;;-	*-*-*)-		# Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two-		# parts-		maybe_os=$field2-$field3-		case $maybe_os in-			nto-qnx* | linux-* | uclinux-uclibc* \-			| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \-			| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \-			| storm-chaos* | os2-emx* | rtmk-nova*)-				basic_machine=$field1-				basic_os=$maybe_os-				;;-			android-linux)-				basic_machine=$field1-unknown-				basic_os=linux-android-				;;-			*)-				basic_machine=$field1-$field2-				basic_os=$field3-				;;-		esac-		;;-	*-*)-		# A lone config we happen to match not fitting any pattern-		case $field1-$field2 in-			decstation-3100)-				basic_machine=mips-dec-				basic_os=-				;;-			*-*)-				# Second component is usually, but not always the OS-				case $field2 in-					# Prevent following clause from handling this valid os-					sun*os*)-						basic_machine=$field1-						basic_os=$field2-						;;-					# Manufacturers-					dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \-					| att* | 7300* | 3300* | delta* | motorola* | sun[234]* \-					| unicom* | ibm* | next | hp | isi* | apollo | altos* \-					| convergent* | ncr* | news | 32* | 3600* | 3100* \-					| hitachi* | c[123]* | convex* | sun | crds | omron* | dg \-					| ultra | tti* | harris | dolphin | highlevel | gould \-					| cbm | ns | masscomp | apple | axis | knuth | cray \-					| microblaze* | sim | cisco \-					| oki | wec | wrs | winbond)-						basic_machine=$field1-$field2-						basic_os=-						;;-					*)-						basic_machine=$field1-						basic_os=$field2-						;;-				esac-			;;-		esac-		;;-	*)-		# Convert single-component short-hands not valid as part of-		# multi-component configurations.-		case $field1 in-			386bsd)-				basic_machine=i386-pc-				basic_os=bsd-				;;-			a29khif)-				basic_machine=a29k-amd-				basic_os=udi-				;;-			adobe68k)-				basic_machine=m68010-adobe-				basic_os=scout-				;;-			alliant)-				basic_machine=fx80-alliant-				basic_os=-				;;-			altos | altos3068)-				basic_machine=m68k-altos-				basic_os=-				;;-			am29k)-				basic_machine=a29k-none-				basic_os=bsd-				;;-			amdahl)-				basic_machine=580-amdahl-				basic_os=sysv-				;;-			amiga)-				basic_machine=m68k-unknown-				basic_os=-				;;-			amigaos | amigados)-				basic_machine=m68k-unknown-				basic_os=amigaos-				;;-			amigaunix | amix)-				basic_machine=m68k-unknown-				basic_os=sysv4-				;;-			apollo68)-				basic_machine=m68k-apollo-				basic_os=sysv-				;;-			apollo68bsd)-				basic_machine=m68k-apollo-				basic_os=bsd-				;;-			aros)-				basic_machine=i386-pc-				basic_os=aros-				;;-			aux)-				basic_machine=m68k-apple-				basic_os=aux-				;;-			balance)-				basic_machine=ns32k-sequent-				basic_os=dynix-				;;-			blackfin)-				basic_machine=bfin-unknown-				basic_os=linux-				;;-			cegcc)-				basic_machine=arm-unknown-				basic_os=cegcc-				;;-			convex-c1)-				basic_machine=c1-convex-				basic_os=bsd-				;;-			convex-c2)-				basic_machine=c2-convex-				basic_os=bsd-				;;-			convex-c32)-				basic_machine=c32-convex-				basic_os=bsd-				;;-			convex-c34)-				basic_machine=c34-convex-				basic_os=bsd-				;;-			convex-c38)-				basic_machine=c38-convex-				basic_os=bsd-				;;-			cray)-				basic_machine=j90-cray-				basic_os=unicos-				;;-			crds | unos)-				basic_machine=m68k-crds-				basic_os=-				;;-			da30)-				basic_machine=m68k-da30-				basic_os=-				;;-			decstation | pmax | pmin | dec3100 | decstatn)-				basic_machine=mips-dec-				basic_os=-				;;-			delta88)-				basic_machine=m88k-motorola-				basic_os=sysv3-				;;-			dicos)-				basic_machine=i686-pc-				basic_os=dicos-				;;-			djgpp)-				basic_machine=i586-pc-				basic_os=msdosdjgpp-				;;-			ebmon29k)-				basic_machine=a29k-amd-				basic_os=ebmon-				;;-			es1800 | OSE68k | ose68k | ose | OSE)-				basic_machine=m68k-ericsson-				basic_os=ose-				;;-			gmicro)-				basic_machine=tron-gmicro-				basic_os=sysv-				;;-			go32)-				basic_machine=i386-pc-				basic_os=go32-				;;-			h8300hms)-				basic_machine=h8300-hitachi-				basic_os=hms-				;;-			h8300xray)-				basic_machine=h8300-hitachi-				basic_os=xray-				;;-			h8500hms)-				basic_machine=h8500-hitachi-				basic_os=hms-				;;-			harris)-				basic_machine=m88k-harris-				basic_os=sysv3-				;;-			hp300 | hp300hpux)-				basic_machine=m68k-hp-				basic_os=hpux-				;;-			hp300bsd)-				basic_machine=m68k-hp-				basic_os=bsd-				;;-			hppaosf)-				basic_machine=hppa1.1-hp-				basic_os=osf-				;;-			hppro)-				basic_machine=hppa1.1-hp-				basic_os=proelf-				;;-			i386mach)-				basic_machine=i386-mach-				basic_os=mach-				;;-			isi68 | isi)-				basic_machine=m68k-isi-				basic_os=sysv-				;;-			m68knommu)-				basic_machine=m68k-unknown-				basic_os=linux-				;;-			magnum | m3230)-				basic_machine=mips-mips-				basic_os=sysv-				;;-			merlin)-				basic_machine=ns32k-utek-				basic_os=sysv-				;;-			mingw64)-				basic_machine=x86_64-pc-				basic_os=mingw64-				;;-			mingw32)-				basic_machine=i686-pc-				basic_os=mingw32-				;;-			mingw32ce)-				basic_machine=arm-unknown-				basic_os=mingw32ce-				;;-			monitor)-				basic_machine=m68k-rom68k-				basic_os=coff-				;;-			morphos)-				basic_machine=powerpc-unknown-				basic_os=morphos-				;;-			moxiebox)-				basic_machine=moxie-unknown-				basic_os=moxiebox-				;;-			msdos)-				basic_machine=i386-pc-				basic_os=msdos-				;;-			msys)-				basic_machine=i686-pc-				basic_os=msys-				;;-			mvs)-				basic_machine=i370-ibm-				basic_os=mvs-				;;-			nacl)-				basic_machine=le32-unknown-				basic_os=nacl-				;;-			ncr3000)-				basic_machine=i486-ncr-				basic_os=sysv4-				;;-			netbsd386)-				basic_machine=i386-pc-				basic_os=netbsd-				;;-			netwinder)-				basic_machine=armv4l-rebel-				basic_os=linux-				;;-			news | news700 | news800 | news900)-				basic_machine=m68k-sony-				basic_os=newsos-				;;-			news1000)-				basic_machine=m68030-sony-				basic_os=newsos-				;;-			necv70)-				basic_machine=v70-nec-				basic_os=sysv-				;;-			nh3000)-				basic_machine=m68k-harris-				basic_os=cxux-				;;-			nh[45]000)-				basic_machine=m88k-harris-				basic_os=cxux-				;;-			nindy960)-				basic_machine=i960-intel-				basic_os=nindy-				;;-			mon960)-				basic_machine=i960-intel-				basic_os=mon960-				;;-			nonstopux)-				basic_machine=mips-compaq-				basic_os=nonstopux-				;;-			os400)-				basic_machine=powerpc-ibm-				basic_os=os400-				;;-			OSE68000 | ose68000)-				basic_machine=m68000-ericsson-				basic_os=ose-				;;-			os68k)-				basic_machine=m68k-none-				basic_os=os68k-				;;-			paragon)-				basic_machine=i860-intel-				basic_os=osf-				;;-			parisc)-				basic_machine=hppa-unknown-				basic_os=linux-				;;-			psp)-				basic_machine=mipsallegrexel-sony-				basic_os=psp-				;;-			pw32)-				basic_machine=i586-unknown-				basic_os=pw32-				;;-			rdos | rdos64)-				basic_machine=x86_64-pc-				basic_os=rdos-				;;-			rdos32)-				basic_machine=i386-pc-				basic_os=rdos-				;;-			rom68k)-				basic_machine=m68k-rom68k-				basic_os=coff-				;;-			sa29200)-				basic_machine=a29k-amd-				basic_os=udi-				;;-			sei)-				basic_machine=mips-sei-				basic_os=seiux-				;;-			sequent)-				basic_machine=i386-sequent-				basic_os=-				;;-			sps7)-				basic_machine=m68k-bull-				basic_os=sysv2-				;;-			st2000)-				basic_machine=m68k-tandem-				basic_os=-				;;-			stratus)-				basic_machine=i860-stratus-				basic_os=sysv4-				;;-			sun2)-				basic_machine=m68000-sun-				basic_os=-				;;-			sun2os3)-				basic_machine=m68000-sun-				basic_os=sunos3-				;;-			sun2os4)-				basic_machine=m68000-sun-				basic_os=sunos4-				;;-			sun3)-				basic_machine=m68k-sun-				basic_os=-				;;-			sun3os3)-				basic_machine=m68k-sun-				basic_os=sunos3-				;;-			sun3os4)-				basic_machine=m68k-sun-				basic_os=sunos4-				;;-			sun4)-				basic_machine=sparc-sun-				basic_os=-				;;-			sun4os3)-				basic_machine=sparc-sun-				basic_os=sunos3-				;;-			sun4os4)-				basic_machine=sparc-sun-				basic_os=sunos4-				;;-			sun4sol2)-				basic_machine=sparc-sun-				basic_os=solaris2-				;;-			sun386 | sun386i | roadrunner)-				basic_machine=i386-sun-				basic_os=-				;;-			sv1)-				basic_machine=sv1-cray-				basic_os=unicos-				;;-			symmetry)-				basic_machine=i386-sequent-				basic_os=dynix-				;;-			t3e)-				basic_machine=alphaev5-cray-				basic_os=unicos-				;;-			t90)-				basic_machine=t90-cray-				basic_os=unicos-				;;-			toad1)-				basic_machine=pdp10-xkl-				basic_os=tops20-				;;-			tpf)-				basic_machine=s390x-ibm-				basic_os=tpf-				;;-			udi29k)-				basic_machine=a29k-amd-				basic_os=udi-				;;-			ultra3)-				basic_machine=a29k-nyu-				basic_os=sym1-				;;-			v810 | necv810)-				basic_machine=v810-nec-				basic_os=none-				;;-			vaxv)-				basic_machine=vax-dec-				basic_os=sysv-				;;-			vms)-				basic_machine=vax-dec-				basic_os=vms-				;;-			vsta)-				basic_machine=i386-pc-				basic_os=vsta-				;;-			vxworks960)-				basic_machine=i960-wrs-				basic_os=vxworks-				;;-			vxworks68)-				basic_machine=m68k-wrs-				basic_os=vxworks-				;;-			vxworks29k)-				basic_machine=a29k-wrs-				basic_os=vxworks-				;;-			xbox)-				basic_machine=i686-pc-				basic_os=mingw32-				;;-			ymp)-				basic_machine=ymp-cray-				basic_os=unicos-				;;-			*)-				basic_machine=$1-				basic_os=-				;;-		esac-		;;-esac--# Decode 1-component or ad-hoc basic machines-case $basic_machine in-	# Here we handle the default manufacturer of certain CPU types.  It is in-	# some cases the only manufacturer, in others, it is the most popular.-	w89k)-		cpu=hppa1.1-		vendor=winbond-		;;-	op50n)-		cpu=hppa1.1-		vendor=oki-		;;-	op60c)-		cpu=hppa1.1-		vendor=oki-		;;-	ibm*)-		cpu=i370-		vendor=ibm-		;;-	orion105)-		cpu=clipper-		vendor=highlevel-		;;-	mac | mpw | mac-mpw)-		cpu=m68k-		vendor=apple-		;;-	pmac | pmac-mpw)-		cpu=powerpc-		vendor=apple-		;;--	# Recognize the various machine names and aliases which stand-	# for a CPU type and a company and sometimes even an OS.-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)-		cpu=m68000-		vendor=att-		;;-	3b*)-		cpu=we32k-		vendor=att-		;;-	bluegene*)-		cpu=powerpc-		vendor=ibm-		basic_os=cnk-		;;-	decsystem10* | dec10*)-		cpu=pdp10-		vendor=dec-		basic_os=tops10-		;;-	decsystem20* | dec20*)-		cpu=pdp10-		vendor=dec-		basic_os=tops20-		;;-	delta | 3300 | motorola-3300 | motorola-delta \-	      | 3300-motorola | delta-motorola)-		cpu=m68k-		vendor=motorola-		;;-	dpx2*)-		cpu=m68k-		vendor=bull-		basic_os=sysv3-		;;-	encore | umax | mmax)-		cpu=ns32k-		vendor=encore-		;;-	elxsi)-		cpu=elxsi-		vendor=elxsi-		basic_os=${basic_os:-bsd}-		;;-	fx2800)-		cpu=i860-		vendor=alliant-		;;-	genix)-		cpu=ns32k-		vendor=ns-		;;-	h3050r* | hiux*)-		cpu=hppa1.1-		vendor=hitachi-		basic_os=hiuxwe2-		;;-	hp3k9[0-9][0-9] | hp9[0-9][0-9])-		cpu=hppa1.0-		vendor=hp-		;;-	hp9k2[0-9][0-9] | hp9k31[0-9])-		cpu=m68000-		vendor=hp-		;;-	hp9k3[2-9][0-9])-		cpu=m68k-		vendor=hp-		;;-	hp9k6[0-9][0-9] | hp6[0-9][0-9])-		cpu=hppa1.0-		vendor=hp-		;;-	hp9k7[0-79][0-9] | hp7[0-79][0-9])-		cpu=hppa1.1-		vendor=hp-		;;-	hp9k78[0-9] | hp78[0-9])-		# FIXME: really hppa2.0-hp-		cpu=hppa1.1-		vendor=hp-		;;-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)-		# FIXME: really hppa2.0-hp-		cpu=hppa1.1-		vendor=hp-		;;-	hp9k8[0-9][13679] | hp8[0-9][13679])-		cpu=hppa1.1-		vendor=hp-		;;-	hp9k8[0-9][0-9] | hp8[0-9][0-9])-		cpu=hppa1.0-		vendor=hp-		;;-	i*86v32)-		cpu=$(echo "$1" | sed -e 's/86.*/86/')-		vendor=pc-		basic_os=sysv32-		;;-	i*86v4*)-		cpu=$(echo "$1" | sed -e 's/86.*/86/')-		vendor=pc-		basic_os=sysv4-		;;-	i*86v)-		cpu=$(echo "$1" | sed -e 's/86.*/86/')-		vendor=pc-		basic_os=sysv-		;;-	i*86sol2)-		cpu=$(echo "$1" | sed -e 's/86.*/86/')-		vendor=pc-		basic_os=solaris2-		;;-	j90 | j90-cray)-		cpu=j90-		vendor=cray-		basic_os=${basic_os:-unicos}-		;;-	iris | iris4d)-		cpu=mips-		vendor=sgi-		case $basic_os in-		    irix*)-			;;-		    *)-			basic_os=irix4-			;;-		esac-		;;-	miniframe)-		cpu=m68000-		vendor=convergent-		;;-	*mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)-		cpu=m68k-		vendor=atari-		basic_os=mint-		;;-	news-3600 | risc-news)-		cpu=mips-		vendor=sony-		basic_os=newsos-		;;-	next | m*-next)-		cpu=m68k-		vendor=next-		case $basic_os in-		    openstep*)-		        ;;-		    nextstep*)-			;;-		    ns2*)-		      basic_os=nextstep2-			;;-		    *)-		      basic_os=nextstep3-			;;-		esac-		;;-	np1)-		cpu=np1-		vendor=gould-		;;-	op50n-* | op60c-*)-		cpu=hppa1.1-		vendor=oki-		basic_os=proelf-		;;-	pa-hitachi)-		cpu=hppa1.1-		vendor=hitachi-		basic_os=hiuxwe2-		;;-	pbd)-		cpu=sparc-		vendor=tti-		;;-	pbb)-		cpu=m68k-		vendor=tti-		;;-	pc532)-		cpu=ns32k-		vendor=pc532-		;;-	pn)-		cpu=pn-		vendor=gould-		;;-	power)-		cpu=power-		vendor=ibm-		;;-	ps2)-		cpu=i386-		vendor=ibm-		;;-	rm[46]00)-		cpu=mips-		vendor=siemens-		;;-	rtpc | rtpc-*)-		cpu=romp-		vendor=ibm-		;;-	sde)-		cpu=mipsisa32-		vendor=sde-		basic_os=${basic_os:-elf}-		;;-	simso-wrs)-		cpu=sparclite-		vendor=wrs-		basic_os=vxworks-		;;-	tower | tower-32)-		cpu=m68k-		vendor=ncr-		;;-	vpp*|vx|vx-*)-		cpu=f301-		vendor=fujitsu-		;;-	w65)-		cpu=w65-		vendor=wdc-		;;-	w89k-*)-		cpu=hppa1.1-		vendor=winbond-		basic_os=proelf-		;;-	none)-		cpu=none-		vendor=none-		;;-	leon|leon[3-9])-		cpu=sparc-		vendor=$basic_machine-		;;-	leon-*|leon[3-9]-*)-		cpu=sparc-		vendor=$(echo "$basic_machine" | sed 's/-.*//')-		;;--	*-*)-		# shellcheck disable=SC2162-		IFS="-" read cpu vendor <<EOF-$basic_machine-EOF-		;;-	# We use `pc' rather than `unknown'-	# because (1) that's what they normally are, and-	# (2) the word "unknown" tends to confuse beginning users.-	i*86 | x86_64)-		cpu=$basic_machine-		vendor=pc-		;;-	# These rules are duplicated from below for sake of the special case above;-	# i.e. things that normalized to x86 arches should also default to "pc"-	pc98)-		cpu=i386-		vendor=pc-		;;-	x64 | amd64)-		cpu=x86_64-		vendor=pc-		;;-	# Recognize the basic CPU types without company name.-	*)-		cpu=$basic_machine-		vendor=unknown-		;;-esac--unset -v basic_machine--# Decode basic machines in the full and proper CPU-Company form.-case $cpu-$vendor in-	# Here we handle the default manufacturer of certain CPU types in canonical form. It is in-	# some cases the only manufacturer, in others, it is the most popular.-	craynv-unknown)-		vendor=cray-		basic_os=${basic_os:-unicosmp}-		;;-	c90-unknown | c90-cray)-		vendor=cray-		basic_os=${Basic_os:-unicos}-		;;-	fx80-unknown)-		vendor=alliant-		;;-	romp-unknown)-		vendor=ibm-		;;-	mmix-unknown)-		vendor=knuth-		;;-	microblaze-unknown | microblazeel-unknown)-		vendor=xilinx-		;;-	rs6000-unknown)-		vendor=ibm-		;;-	vax-unknown)-		vendor=dec-		;;-	pdp11-unknown)-		vendor=dec-		;;-	we32k-unknown)-		vendor=att-		;;-	cydra-unknown)-		vendor=cydrome-		;;-	i370-ibm*)-		vendor=ibm-		;;-	orion-unknown)-		vendor=highlevel-		;;-	xps-unknown | xps100-unknown)-		cpu=xps100-		vendor=honeywell-		;;--	# Here we normalize CPU types with a missing or matching vendor-	dpx20-unknown | dpx20-bull)-		cpu=rs6000-		vendor=bull-		basic_os=${basic_os:-bosx}-		;;--	# Here we normalize CPU types irrespective of the vendor-	amd64-*)-		cpu=x86_64-		;;-	blackfin-*)-		cpu=bfin-		basic_os=linux-		;;-	c54x-*)-		cpu=tic54x-		;;-	c55x-*)-		cpu=tic55x-		;;-	c6x-*)-		cpu=tic6x-		;;-	e500v[12]-*)-		cpu=powerpc-		basic_os=${basic_os}"spe"-		;;-	mips3*-*)-		cpu=mips64-		;;-	ms1-*)-		cpu=mt-		;;-	m68knommu-*)-		cpu=m68k-		basic_os=linux-		;;-	m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)-		cpu=s12z-		;;-	openrisc-*)-		cpu=or32-		;;-	parisc-*)-		cpu=hppa-		basic_os=linux-		;;-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)-		cpu=i586-		;;-	pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)-		cpu=i686-		;;-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)-		cpu=i686-		;;-	pentium4-*)-		cpu=i786-		;;-	pc98-*)-		cpu=i386-		;;-	ppc-* | ppcbe-*)-		cpu=powerpc-		;;-	ppcle-* | powerpclittle-*)-		cpu=powerpcle-		;;-	ppc64-*)-		cpu=powerpc64-		;;-	ppc64le-* | powerpc64little-*)-		cpu=powerpc64le-		;;-	sb1-*)-		cpu=mipsisa64sb1-		;;-	sb1el-*)-		cpu=mipsisa64sb1el-		;;-	sh5e[lb]-*)-		cpu=$(echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/')-		;;-	spur-*)-		cpu=spur-		;;-	strongarm-* | thumb-*)-		cpu=arm-		;;-	tx39-*)-		cpu=mipstx39-		;;-	tx39el-*)-		cpu=mipstx39el-		;;-	x64-*)-		cpu=x86_64-		;;-	xscale-* | xscalee[bl]-*)-		cpu=$(echo "$cpu" | sed 's/^xscale/arm/')-		;;-	arm64-*)-		cpu=aarch64-		;;--	# Recognize the canonical CPU Types that limit and/or modify the-	# company names they are paired with.-	cr16-*)-		basic_os=${basic_os:-elf}-		;;-	crisv32-* | etraxfs*-*)-		cpu=crisv32-		vendor=axis-		;;-	cris-* | etrax*-*)-		cpu=cris-		vendor=axis-		;;-	crx-*)-		basic_os=${basic_os:-elf}-		;;-	neo-tandem)-		cpu=neo-		vendor=tandem-		;;-	nse-tandem)-		cpu=nse-		vendor=tandem-		;;-	nsr-tandem)-		cpu=nsr-		vendor=tandem-		;;-	nsv-tandem)-		cpu=nsv-		vendor=tandem-		;;-	nsx-tandem)-		cpu=nsx-		vendor=tandem-		;;-	mipsallegrexel-sony)-		cpu=mipsallegrexel-		vendor=sony-		;;-	tile*-*)-		basic_os=${basic_os:-linux-gnu}-		;;--	*)-		# Recognize the canonical CPU types that are allowed with any-		# company name.-		case $cpu in-			1750a | 580 \-			| a29k \-			| aarch64 | aarch64_be \-			| abacus \-			| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \-			| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \-			| alphapca5[67] | alpha64pca5[67] \-			| am33_2.0 \-			| amdgcn \-			| arc | arceb \-			| arm | arm[lb]e | arme[lb] | armv* \-			| avr | avr32 \-			| asmjs \-			| ba \-			| be32 | be64 \-			| bfin | bpf | bs2000 \-			| c[123]* | c30 | [cjt]90 | c4x \-			| c8051 | clipper | craynv | csky | cydra \-			| d10v | d30v | dlx | dsp16xx \-			| e2k | elxsi | epiphany \-			| f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \-			| h8300 | h8500 \-			| hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \-			| hexagon \-			| i370 | i*86 | i860 | i960 | ia16 | ia64 \-			| ip2k | iq2000 \-			| k1om \-			| le32 | le64 \-			| lm32 \-			| loongarch32 | loongarch64 | loongarchx32 \-			| m32c | m32r | m32rle \-			| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \-			| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \-			| m88110 | m88k | maxq | mb | mcore | mep | metag \-			| microblaze | microblazeel \-			| mips | mipsbe | mipseb | mipsel | mipsle \-			| mips16 \-			| mips64 | mips64eb | mips64el \-			| mips64octeon | mips64octeonel \-			| mips64orion | mips64orionel \-			| mips64r5900 | mips64r5900el \-			| mips64vr | mips64vrel \-			| mips64vr4100 | mips64vr4100el \-			| mips64vr4300 | mips64vr4300el \-			| mips64vr5000 | mips64vr5000el \-			| mips64vr5900 | mips64vr5900el \-			| mipsisa32 | mipsisa32el \-			| mipsisa32r2 | mipsisa32r2el \-			| mipsisa32r6 | mipsisa32r6el \-			| mipsisa64 | mipsisa64el \-			| mipsisa64r2 | mipsisa64r2el \-			| mipsisa64r6 | mipsisa64r6el \-			| mipsisa64sb1 | mipsisa64sb1el \-			| mipsisa64sr71k | mipsisa64sr71kel \-			| mipsr5900 | mipsr5900el \-			| mipstx39 | mipstx39el \-			| mmix \-			| mn10200 | mn10300 \-			| moxie \-			| mt \-			| msp430 \-			| nds32 | nds32le | nds32be \-			| nfp \-			| nios | nios2 | nios2eb | nios2el \-			| none | np1 | ns16k | ns32k | nvptx \-			| open8 \-			| or1k* \-			| or32 \-			| orion \-			| picochip \-			| pdp10 | pdp11 | pj | pjl | pn | power \-			| powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \-			| pru \-			| pyramid \-			| riscv | riscv32 | riscv32be | riscv64 | riscv64be \-			| rl78 | romp | rs6000 | rx \-			| s390 | s390x \-			| score \-			| sh | shl \-			| sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \-			| sh[1234]e[lb] |  sh[12345][lb]e | sh[23]ele | sh64 | sh64le \-			| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \-			| sparclite \-			| sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \-			| spu \-			| tahoe \-			| thumbv7* \-			| tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \-			| tron \-			| ubicom32 \-			| v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \-			| vax \-			| visium \-			| w65 \-			| wasm32 | wasm64 \-			| we32k \-			| x86 | x86_64 | xc16x | xgate | xps100 \-			| xstormy16 | xtensa* \-			| ymp \-			| z8k | z80)-				;;--			*)-				echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2-				exit 1-				;;-		esac-		;;-esac--# Here we canonicalize certain aliases for manufacturers.-case $vendor in-	digital*)-		vendor=dec-		;;-	commodore*)-		vendor=cbm-		;;-	*)-		;;-esac--# Decode manufacturer-specific aliases for certain operating systems.--if test x$basic_os != x-then--# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just-# set os.-case $basic_os in-	gnu/linux*)-		kernel=linux-		os=$(echo $basic_os | sed -e 's|gnu/linux|gnu|')-		;;-	os2-emx)-		kernel=os2-		os=$(echo $basic_os | sed -e 's|os2-emx|emx|')-		;;-	nto-qnx*)-		kernel=nto-		os=$(echo $basic_os | sed -e 's|nto-qnx|qnx|')-		;;-	*-*)-		# shellcheck disable=SC2162-		IFS="-" read kernel os <<EOF-$basic_os-EOF-		;;-	# Default OS when just kernel was specified-	nto*)-		kernel=nto-		os=$(echo $basic_os | sed -e 's|nto|qnx|')-		;;-	linux*)-		kernel=linux-		os=$(echo $basic_os | sed -e 's|linux|gnu|')-		;;-	*)-		kernel=-		os=$basic_os-		;;-esac--# Now, normalize the OS (knowing we just have one component, it's not a kernel,-# etc.)-case $os in-	# First match some system type aliases that might get confused-	# with valid system types.-	# solaris* is a basic system type, with this one exception.-	auroraux)-		os=auroraux-		;;-	bluegene*)-		os=cnk-		;;-	solaris1 | solaris1.*)-		os=$(echo $os | sed -e 's|solaris1|sunos4|')-		;;-	solaris)-		os=solaris2-		;;-	unixware*)-		os=sysv4.2uw-		;;-	# es1800 is here to avoid being matched by es* (a different OS)-	es1800*)-		os=ose-		;;-	# Some version numbers need modification-	chorusos*)-		os=chorusos-		;;-	isc)-		os=isc2.2-		;;-	sco6)-		os=sco5v6-		;;-	sco5)-		os=sco3.2v5-		;;-	sco4)-		os=sco3.2v4-		;;-	sco3.2.[4-9]*)-		os=$(echo $os | sed -e 's/sco3.2./sco3.2v/')-		;;-	sco*v* | scout)-		# Don't match below-		;;-	sco*)-		os=sco3.2v2-		;;-	psos*)-		os=psos-		;;-	qnx*)-		os=qnx-		;;-	hiux*)-		os=hiuxwe2-		;;-	lynx*178)-		os=lynxos178-		;;-	lynx*5)-		os=lynxos5-		;;-	lynxos*)-		# don't get caught up in next wildcard-		;;-	lynx*)-		os=lynxos-		;;-	mac[0-9]*)-		os=$(echo "$os" | sed -e 's|mac|macos|')-		;;-	opened*)-		os=openedition-		;;-	os400*)-		os=os400-		;;-	sunos5*)-		os=$(echo "$os" | sed -e 's|sunos5|solaris2|')-		;;-	sunos6*)-		os=$(echo "$os" | sed -e 's|sunos6|solaris3|')-		;;-	wince*)-		os=wince-		;;-	utek*)-		os=bsd-		;;-	dynix*)-		os=bsd-		;;-	acis*)-		os=aos-		;;-	atheos*)-		os=atheos-		;;-	syllable*)-		os=syllable-		;;-	386bsd)-		os=bsd-		;;-	ctix* | uts*)-		os=sysv-		;;-	nova*)-		os=rtmk-nova-		;;-	ns2)-		os=nextstep2-		;;-	# Preserve the version number of sinix5.-	sinix5.*)-		os=$(echo $os | sed -e 's|sinix|sysv|')-		;;-	sinix*)-		os=sysv4-		;;-	tpf*)-		os=tpf-		;;-	triton*)-		os=sysv3-		;;-	oss*)-		os=sysv3-		;;-	svr4*)-		os=sysv4-		;;-	svr3)-		os=sysv3-		;;-	sysvr4)-		os=sysv4-		;;-	ose*)-		os=ose-		;;-	*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)-		os=mint-		;;-	dicos*)-		os=dicos-		;;-	pikeos*)-		# Until real need of OS specific support for-		# particular features comes up, bare metal-		# configurations are quite functional.-		case $cpu in-		    arm*)-			os=eabi-			;;-		    *)-			os=elf-			;;-		esac-		;;-	*)-		# No normalization, but not necessarily accepted, that comes below.-		;;-esac--else--# Here we handle the default operating systems that come with various machines.-# The value should be what the vendor currently ships out the door with their-# machine or put another way, the most popular os provided with the machine.--# Note that if you're going to try to match "-MANUFACTURER" here (say,-# "-sun"), then you have to tell the case statement up towards the top-# that MANUFACTURER isn't an operating system.  Otherwise, code above-# will signal an error saying that MANUFACTURER isn't an operating-# system, and we'll never get to this point.--kernel=-case $cpu-$vendor in-	score-*)-		os=elf-		;;-	spu-*)-		os=elf-		;;-	*-acorn)-		os=riscix1.2-		;;-	arm*-rebel)-		kernel=linux-		os=gnu-		;;-	arm*-semi)-		os=aout-		;;-	c4x-* | tic4x-*)-		os=coff-		;;-	c8051-*)-		os=elf-		;;-	clipper-intergraph)-		os=clix-		;;-	hexagon-*)-		os=elf-		;;-	tic54x-*)-		os=coff-		;;-	tic55x-*)-		os=coff-		;;-	tic6x-*)-		os=coff-		;;-	# This must come before the *-dec entry.-	pdp10-*)-		os=tops20-		;;-	pdp11-*)-		os=none-		;;-	*-dec | vax-*)-		os=ultrix4.2-		;;-	m68*-apollo)-		os=domain-		;;-	i386-sun)-		os=sunos4.0.2-		;;-	m68000-sun)-		os=sunos3-		;;-	m68*-cisco)-		os=aout-		;;-	mep-*)-		os=elf-		;;-	mips*-cisco)-		os=elf-		;;-	mips*-*)-		os=elf-		;;-	or32-*)-		os=coff-		;;-	*-tti)	# must be before sparc entry or we get the wrong os.-		os=sysv3-		;;-	sparc-* | *-sun)-		os=sunos4.1.1-		;;-	pru-*)-		os=elf-		;;-	*-be)-		os=beos-		;;-	*-ibm)-		os=aix-		;;-	*-knuth)-		os=mmixware-		;;-	*-wec)-		os=proelf-		;;-	*-winbond)-		os=proelf-		;;-	*-oki)-		os=proelf-		;;-	*-hp)-		os=hpux-		;;-	*-hitachi)-		os=hiux-		;;-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)-		os=sysv-		;;-	*-cbm)-		os=amigaos-		;;-	*-dg)-		os=dgux-		;;-	*-dolphin)-		os=sysv3-		;;-	m68k-ccur)-		os=rtu-		;;-	m88k-omron*)-		os=luna-		;;-	*-next)-		os=nextstep-		;;-	*-sequent)-		os=ptx-		;;-	*-crds)-		os=unos-		;;-	*-ns)-		os=genix-		;;-	i370-*)-		os=mvs-		;;-	*-gould)-		os=sysv-		;;-	*-highlevel)-		os=bsd-		;;-	*-encore)-		os=bsd-		;;-	*-sgi)-		os=irix-		;;-	*-siemens)-		os=sysv4-		;;-	*-masscomp)-		os=rtu-		;;-	f30[01]-fujitsu | f700-fujitsu)-		os=uxpv-		;;-	*-rom68k)-		os=coff-		;;-	*-*bug)-		os=coff-		;;-	*-apple)-		os=macos-		;;-	*-atari*)-		os=mint-		;;-	*-wrs)-		os=vxworks-		;;-	*)-		os=none-		;;-esac--fi--# Now, validate our (potentially fixed-up) OS.-case $os in-	# Sometimes we do "kernel-libc", so those need to count as OSes.-	musl* | newlib* | uclibc*)-		;;-	# Likewise for "kernel-abi"-	eabi* | gnueabi*)-		;;-	# VxWorks passes extra cpu info in the 4th filed.-	simlinux | simwindows | spe)-		;;-	# Now accept the basic system types.-	# The portable systems comes first.-	# Each alternative MUST end in a * to match a version number.-	gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \-	     | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \-	     | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \-	     | sym* |  plan9* | psp* | sim* | xray* | os68k* | v88r* \-	     | hiux* | abug | nacl* | netware* | windows* \-	     | os9* | macos* | osx* | ios* \-	     | mpw* | magic* | mmixware* | mon960* | lnews* \-	     | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \-	     | aos* | aros* | cloudabi* | sortix* | twizzler* \-	     | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \-	     | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \-	     | mirbsd* | netbsd* | dicos* | openedition* | ose* \-	     | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \-	     | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \-	     | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \-	     | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \-	     | udi* | lites* | ieee* | go32* | aux* | hcos* \-	     | chorusrdb* | cegcc* | glidix* \-	     | cygwin* | msys* | pe* | moss* | proelf* | rtems* \-	     | midipix* | mingw32* | mingw64* | mint* \-	     | uxpv* | beos* | mpeix* | udk* | moxiebox* \-	     | interix* | uwin* | mks* | rhapsody* | darwin* \-	     | openstep* | oskit* | conix* | pw32* | nonstopux* \-	     | storm-chaos* | tops10* | tenex* | tops20* | its* \-	     | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \-	     | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \-	     | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \-	     | skyos* | haiku* | rdos* | toppers* | drops* | es* \-	     | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \-	     | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \-	     | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*)-		;;-	# This one is extra strict with allowed versions-	sco3.2v2 | sco3.2v[4-9]* | sco5v6*)-		# Don't forget version if it is 3.2v4 or newer.-		;;-	none)-		;;-	*)-		echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2-		exit 1-		;;-esac--# As a final step for OS-related things, validate the OS-kernel combination-# (given a valid OS), if there is a kernel.-case $kernel-$os in-	linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* )-		;;-	uclinux-uclibc* )-		;;-	-dietlibc* | -newlib* | -musl* | -uclibc* )-		# These are just libc implementations, not actual OSes, and thus-		# require a kernel.-		echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2-		exit 1-		;;-	kfreebsd*-gnu* | kopensolaris*-gnu*)-		;;-	vxworks-simlinux | vxworks-simwindows | vxworks-spe)-		;;-	nto-qnx*)-		;;-	os2-emx)-		;;-	*-eabi* | *-gnueabi*)-		;;-	-*)-		# Blank kernel with real OS is always fine.-		;;-	*-*)-		echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2-		exit 1-		;;-esac--# Here we handle the case where we know the os, and the CPU type, but not the-# manufacturer.  We pick the logical manufacturer.-case $vendor in-	unknown)-		case $cpu-$os in-			*-riscix*)-				vendor=acorn-				;;-			*-sunos*)-				vendor=sun-				;;-			*-cnk* | *-aix*)-				vendor=ibm-				;;-			*-beos*)-				vendor=be-				;;-			*-hpux*)-				vendor=hp-				;;-			*-mpeix*)-				vendor=hp-				;;-			*-hiux*)-				vendor=hitachi-				;;-			*-unos*)-				vendor=crds-				;;-			*-dgux*)-				vendor=dg-				;;-			*-luna*)-				vendor=omron-				;;-			*-genix*)-				vendor=ns-				;;-			*-clix*)-				vendor=intergraph-				;;-			*-mvs* | *-opened*)-				vendor=ibm-				;;-			*-os400*)-				vendor=ibm-				;;-			s390-* | s390x-*)-				vendor=ibm-				;;-			*-ptx*)-				vendor=sequent-				;;-			*-tpf*)-				vendor=ibm-				;;-			*-vxsim* | *-vxworks* | *-windiss*)-				vendor=wrs-				;;-			*-aux*)-				vendor=apple-				;;-			*-hms*)-				vendor=hitachi-				;;-			*-mpw* | *-macos*)-				vendor=apple-				;;-			*-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)-				vendor=atari-				;;-			*-vos*)-				vendor=stratus-				;;-		esac-		;;-esac--echo "$cpu-$vendor-${kernel:+$kernel-}$os"-exit--# Local variables:-# eval: (add-hook 'before-save-hook 'time-stamp)-# time-stamp-start: "timestamp='"-# time-stamp-format: "%:y-%02m-%02d"-# time-stamp-end: "'"-# End:
configure view
@@ -664,6 +664,7 @@ docdir oldincludedir includedir+runstatedir localstatedir sharedstatedir sysconfdir@@ -739,6 +740,7 @@ sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var'+runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'@@ -991,6 +993,15 @@   | -silent | --silent | --silen | --sile | --sil)     silent=yes ;; +  -runstatedir | --runstatedir | --runstatedi | --runstated \+  | --runstate | --runstat | --runsta | --runst | --runs \+  | --run | --ru | --r)+    ac_prev=runstatedir ;;+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \+  | --run=* | --ru=* | --r=*)+    runstatedir=$ac_optarg ;;+   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)     ac_prev=sbindir ;;   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \@@ -1128,7 +1139,7 @@ for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \ 		datadir sysconfdir sharedstatedir localstatedir includedir \ 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \-		libdir localedir mandir+		libdir localedir mandir runstatedir do   eval ac_val=\$$ac_var   # Remove trailing slashes.@@ -1281,6 +1292,7 @@   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]   --libdir=DIR            object code libraries [EPREFIX/lib]   --includedir=DIR        C header files [PREFIX/include]   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
ghc-bignum.cabal view
@@ -1,6 +1,6 @@ cabal-version:       2.0 name:                ghc-bignum-version:             1.0+version:             1.3 synopsis:            GHC BigNum library license:             BSD3 license-file:        LICENSE@@ -17,8 +17,6 @@     aclocal.m4     cbits/gmp_wrappers.c     changelog.md-    config.guess-    config.sub     configure     configure.ac     config.mk.in@@ -79,7 +77,7 @@     ForeignFunctionInterface    build-depends:-    ghc-prim >= 0.5.1.0 && < 0.8+    ghc-prim >= 0.5.1.0 && < 0.10    hs-source-dirs: src/   include-dirs: include/
src/GHC/Num/Backend/Check.hs view
@@ -12,6 +12,7 @@ -- | Check Native implementation against another backend module GHC.Num.Backend.Check where +import GHC.CString import GHC.Prim import GHC.Types import GHC.Num.WordArray@@ -27,6 +28,12 @@  default () +-- | ghc-bignum backend name+backendName :: [Char]+backendName = unpackAppendCString# "check-"# Other.backendName+  -- we don't have (++) at our disposal, so we directly use+  -- `unpackAppendCString#`+ bignat_compare    :: WordArray#    -> WordArray#@@ -36,7 +43,7 @@       gr = Other.bignat_compare a b       nr = Native.bignat_compare a b    in case gr ==# nr of-         0# -> unexpectedValue_Int# void#+         0# -> unexpectedValue_Int# (# #)          _  -> gr  mwaCompare@@ -374,7 +381,7 @@       nr = Native.bignat_rem_word wa b    in case gr `eqWord#` nr of        1# -> gr-       _  -> unexpectedValue_Word# void#+       _  -> unexpectedValue_Word# (# #)  bignat_gcd    :: MutableWordArray# RealWorld@@ -397,7 +404,7 @@       nr = Native.bignat_gcd_word wa b    in case gr `eqWord#` nr of        1# -> gr-       _  -> unexpectedValue_Word# void#+       _  -> unexpectedValue_Word# (# #)  bignat_gcd_word_word    :: Word#@@ -409,7 +416,7 @@       nr = Native.bignat_gcd_word_word a b    in case gr `eqWord#` nr of        1# -> gr-       _  -> unexpectedValue_Word# void#+       _  -> unexpectedValue_Word# (# #)  bignat_encode_double :: WordArray# -> Int# -> Double# bignat_encode_double a e =@@ -429,7 +436,7 @@       nr = Native.bignat_powmod_word b e m    in case gr `eqWord#` nr of        1# -> gr-       _  -> unexpectedValue_Word# void#+       _  -> unexpectedValue_Word# (# #)  bignat_powmod    :: MutableWordArray# RealWorld@@ -454,7 +461,7 @@       nr = Native.bignat_powmod_words b e m    in case gr `eqWord#` nr of        1# -> gr-       _  -> unexpectedValue_Word# void#+       _  -> unexpectedValue_Word# (# #)  integer_gcde    :: Integer
src/GHC/Num/Backend/FFI.hs view
@@ -25,6 +25,10 @@  default () +-- | ghc-bignum backend name+backendName :: [Char]+backendName = "ffi"+ -- | Compare two non-zero BigNat of the same length -- -- Return:
src/GHC/Num/Backend/GMP.hs view
@@ -32,6 +32,10 @@  default () +-- | ghc-bignum backend name+backendName :: [Char]+backendName = "gmp"+ ---------------------------------------------------------------------------- -- type definitions @@ -435,11 +439,11 @@          case readInt32OffAddr# sg_ptr  0# s of { (# s, sg #) ->          case touch# szs s of { s ->          -- shrink x, y and g to their actual sizes and freeze them-         let !sx = absI# ssx in-         let !sy = absI# ssy in+         let !sx = absI# (int32ToInt# ssx) in+         let !sy = absI# (int32ToInt# ssy) in          case mwaSetSize# mbx sx s of { s ->          case mwaSetSize# mby sy s of { s ->-         case mwaSetSize# mbg sg s of { s ->+         case mwaSetSize# mbg (int32ToInt# sg) s of { s ->           -- return x, y and g as Integer          case unsafeFreezeByteArray# mbx s of { (# s, bx #) ->@@ -447,8 +451,8 @@          case unsafeFreezeByteArray# mbg s of { (# s, bg #) ->           (# s, (# integerFromBigNat# bg-               ,  integerFromBigNatSign# (ssx <# 0#) bx-               ,  integerFromBigNatSign# (ssy <# 0#) by #) #)+               ,  integerFromBigNatSign# (int32ToInt# ssx <# 0#) bx+               ,  integerFromBigNatSign# (int32ToInt# ssy <# 0#) by #) #)          }}}}}}}}}}}}}}}}  
src/GHC/Num/Backend/Native.hs view
@@ -30,6 +30,11 @@  default () +-- | ghc-bignum backend name+backendName :: [Char]+backendName = "native"++ count_words_bits :: Word# -> (# Word#, Word# #) count_words_bits n = (# nw, nb #)    where@@ -182,8 +187,8 @@       !ctzB = word2Int# (bigNatCtzWord# wb)        -- multiply a single bj Word# to the whole wa WordArray-      mul bj j i carry s-         | isTrue# (i ==# szA)+      mul mwa wa bj j i carry s+         | isTrue# (i ==# wordArraySize# wa)          -- write the carry          = mwaAddInplaceWord# mwa (i +# j) carry s @@ -193,7 +198,7 @@                      !(# c'',r #) = plusWord2# r' carry                      carry'       = plusWord# c' c''                   in case mwaAddInplaceWord# mwa (i +# j) r s of-                        s' -> mul bj j (i +# 1#) carry' s'+                        s' -> mul mwa wa bj j (i +# 1#) carry' s'        -- for each bj in wb, call `mul bj wa`       mulEachB i s@@ -201,7 +206,7 @@          | True = case indexWordArray# wb i of             -- detect bj == 0## and skip the loop             0## -> mulEachB (i +# 1#) s-            bi  -> case mul bi i ctzA 0## s of+            bi  -> case mul mwa wa bi i ctzA 0## s of                      s' -> mulEachB (i +# 1#) s'  bignat_sub
src/GHC/Num/BigNat.hs view
@@ -25,10 +25,6 @@ import GHC.Num.WordArray import GHC.Num.Backend -#if WORD_SIZE_IN_BITS < 64-import GHC.IntWord64-#endif- default ()  -- | A BigNat@@ -53,11 +49,11 @@ -- As a consequence, zero is represented with a WordArray# whose size is 0. data BigNat = BN# { unBigNat :: BigNat# } --- Note [Why Void#?]+-- Note [Why (# #)?] -- ~~~~~~~~~~~~~~~~~ -- -- We can't have top-level BigNat# for now because they are unlifted ByteArray#--- (see #17521). So we use functions that take an empty argument Void# that+-- (see #17521). So we use functions that take an empty argument (# #) that -- will be discarded at compile time.  @@ -93,18 +89,18 @@ bigNatOne = BN# (bigNatFromWord# 1##)  -- | BigNat Zero-bigNatZero# :: Void# -> BigNat# -- cf Note [Why Void#?]+bigNatZero# :: (# #) -> BigNat# -- cf Note [Why (# #)?] bigNatZero# _ = case bigNatZero of    BN# w -> w  -- | BigNat one-bigNatOne# :: Void# -> BigNat# -- cf Note [Why Void#?]+bigNatOne# :: (# #) -> BigNat# -- cf Note [Why (# #)?] bigNatOne# _ = case bigNatOne of    BN# w -> w -raiseDivZero_BigNat :: Void# -> BigNat#+raiseDivZero_BigNat :: (# #) -> BigNat# raiseDivZero_BigNat _ = case raiseDivZero of-   !_ -> bigNatZero# void#+   !_ -> bigNatZero# (# #)    -- see Note [ghc-bignum exceptions] in GHC.Num.Primitives  -- | Indicate if a bigNat is zero@@ -173,7 +169,7 @@  -- | Create a BigNat from a Word bigNatFromWord# :: Word# -> BigNat#-bigNatFromWord# 0## = bigNatZero# void#+bigNatFromWord# 0## = bigNatZero# (# #) bigNatFromWord# w   = wordArrayFromWord# w  -- | Convert a list of non-zero Words (most-significant first) into a BigNat@@ -193,7 +189,7 @@ -- | Convert a list of non-zero Words (most-significant first) into a BigNat. -- Don't remove most-significant zero words bigNatFromWordListUnsafe :: [Word] -> BigNat#-bigNatFromWordListUnsafe [] = bigNatZero# void#+bigNatFromWordListUnsafe [] = bigNatZero# (# #) bigNatFromWordListUnsafe xs =    let       length i []     = i@@ -216,7 +212,7 @@  -- | Convert two Word# (most-significant first) into a BigNat bigNatFromWord2# :: Word# -> Word# -> BigNat#-bigNatFromWord2# 0## 0## = bigNatZero# void#+bigNatFromWord2# 0## 0## = bigNatZero# (# #) bigNatFromWord2# 0## l   = bigNatFromWord# l bigNatFromWord2# h   l   = wordArrayFromWord2# h l @@ -267,6 +263,16 @@          in uncheckedShiftL64# wh 32# `or64#` wl       else wl +#else++-- | Convert a Word64# into a BigNat on 64-bit architectures+bigNatFromWord64# :: Word64# -> BigNat#+bigNatFromWord64# w64 = bigNatFromWord# (word64ToWord# w64)++-- | Convert a BigNat into a Word64# on 64-bit architectures+bigNatToWord64# :: BigNat# -> Word64#+bigNatToWord64# b = wordToWord64# (bigNatToWord# b)+ #endif  -- | Encode (# BigNat mantissa, Int# exponent #) into a Double#@@ -316,6 +322,7 @@  -- | Equality test for BigNat bigNatEq# :: BigNat# -> BigNat# -> Bool#+{-# NOINLINE bigNatEq# #-} bigNatEq# wa wb    | isTrue# (wordArraySize# wa /=# wordArraySize# wb) = 0#    | isTrue# (wordArraySize# wa ==# 0#)                = 1#@@ -335,6 +342,7 @@  -- | Compare a BigNat and a Word# bigNatCompareWord# :: BigNat# -> Word# -> Ordering+{-# NOINLINE bigNatCompareWord# #-} bigNatCompareWord# a b    | bigNatIsZero a                   = cmpW# 0## b    | isTrue# (wordArraySize# a ># 1#) = GT@@ -347,6 +355,7 @@  -- | Compare two BigNat bigNatCompare :: BigNat# -> BigNat# -> Ordering+{-# NOINLINE bigNatCompare #-} bigNatCompare a b =    let       szA = wordArraySize# a@@ -412,7 +421,7 @@    = bigNatFromWord# b     | True-   = withNewWordArrayTrimed# (wordArraySize# a +# 1#) \mwa s ->+   = withNewWordArrayTrimmed# (wordArraySize# a +# 1#) \mwa s ->          inline bignat_add_word mwa a b s  -- | Add a bigNat and a Word@@ -430,7 +439,7 @@       !szB     = wordArraySize# b       !szMax   = maxI# szA szB       !sz      = szMax +# 1# -- for the potential carry-   in withNewWordArrayTrimed# sz \mwa s ->+   in withNewWordArrayTrimmed# sz \mwa s ->          inline bignat_add mwa a b s  -------------------------------------------------@@ -440,14 +449,14 @@ -- | Multiply a BigNat by a Word# bigNatMulWord# :: BigNat# -> Word# -> BigNat# bigNatMulWord# a w-   | 0## <- w       = bigNatZero# void#+   | 0## <- w       = bigNatZero# (# #)    | 1## <- w       = a-   | bigNatIsZero a = bigNatZero# void#+   | bigNatIsZero a = bigNatZero# (# #)    | bigNatIsOne  a = bigNatFromWord# w    | isTrue# (bigNatSize# a ==# 1#)    = case timesWord2# (bigNatIndex# a 0#) w of       (# h, l #) -> bigNatFromWord2# h l-   | True = withNewWordArrayTrimed# (bigNatSize# a +# 1#) \mwa s ->+   | True = withNewWordArrayTrimmed# (bigNatSize# a +# 1#) \mwa s ->                inline bignat_mul_word mwa a w s  -- | Multiply a BigNAt by a Word@@ -473,7 +482,7 @@          !szA = wordArraySize# a          !szB = wordArraySize# b          !sz  = szA +# szB-      in withNewWordArrayTrimed# sz \mwa s->+      in withNewWordArrayTrimmed# sz \mwa s->             inline bignat_mul mwa a b s  @@ -487,7 +496,7 @@ bigNatSubWordUnsafe# :: BigNat# -> Word# -> BigNat# bigNatSubWordUnsafe# x y    | 0## <- y = x-   | True     = withNewWordArrayTrimed# sz \mwa -> go mwa y 0#+   | True     = withNewWordArrayTrimmed# sz \mwa -> go mwa y 0#    where       !sz = wordArraySize# x @@ -515,7 +524,7 @@    | 0## <- b          = (# | a #)    | bigNatIsZero a    = (# (# #) | #)    | True-   = withNewWordArrayTrimedMaybe# (bigNatSize# a) \mwa s ->+   = withNewWordArrayTrimmedMaybe# (bigNatSize# a) \mwa s ->             inline bignat_sub_word mwa a b s  @@ -525,7 +534,7 @@    | bigNatIsZero b = a    | True =       let szA = wordArraySize# a-      in withNewWordArrayTrimed# szA \mwa s->+      in withNewWordArrayTrimmed# szA \mwa s->             case inline bignat_sub mwa a b s of                (# s', 1# #) -> s'                (# s', _  #) -> case raiseUnderflow of@@ -541,7 +550,7 @@    = (# (# #) | #)     | True-   = withNewWordArrayTrimedMaybe# (bigNatSize# a) \mwa s ->+   = withNewWordArrayTrimmedMaybe# (bigNatSize# a) \mwa s ->             inline bignat_sub mwa a b s  @@ -556,11 +565,11 @@ bigNatQuotWord# :: BigNat# -> Word# -> BigNat# bigNatQuotWord# a b    | 1## <- b = a-   | 0## <- b = raiseDivZero_BigNat void#+   | 0## <- b = raiseDivZero_BigNat (# #)    | True =    let       sz = wordArraySize# a-   in withNewWordArrayTrimed# sz \mwq s ->+   in withNewWordArrayTrimmed# sz \mwq s ->          inline bignat_quot_word mwq a b s  -- | Divide a BigNat by a Word, return the quotient@@ -576,7 +585,7 @@ --    b /= 0 bigNatRemWord# :: BigNat# -> Word# -> Word# bigNatRemWord# a b-   | 0## <- b       = raiseDivZero_Word# void#+   | 0## <- b       = raiseDivZero_Word# (# #)    | 1## <- b       = 0##    | bigNatIsZero a = 0##    | True           = inline bignat_rem_word a b@@ -595,14 +604,14 @@ bigNatQuotRemWord# :: BigNat# -> Word# -> (# BigNat#, Word# #) bigNatQuotRemWord# a b    | 0## <- b = case raiseDivZero of-                  !_ -> (# bigNatZero# void#, 0## #)+                  !_ -> (# bigNatZero# (# #), 0## #)                   -- see Note [ghc-bignum exceptions] in GHC.Num.Primitives    | 1## <- b = (# a, 0## #)    | isTrue# (bigNatSize# a ==# 1#)    , a0 <- indexWordArray# a 0#    = case compareWord# a0 b of-      LT -> (# bigNatZero# void#, a0  #)-      EQ -> (# bigNatOne#  void#, 0## #)+      LT -> (# bigNatZero# (# #), a0  #)+      EQ -> (# bigNatOne#  (# #), 0## #)       GT -> case quotRemWord# a0 b of                (# q, r #) -> (# bigNatFromWord# q, r #)    | True =@@ -623,16 +632,16 @@ bigNatQuotRem# :: BigNat# -> BigNat# -> (# BigNat#, BigNat# #) bigNatQuotRem# a b    | bigNatIsZero b          = case raiseDivZero of-                                 !_ -> (# bigNatZero# void#, bigNatZero# void# #)+                                 !_ -> (# bigNatZero# (# #), bigNatZero# (# #) #)                                  -- see Note [ghc-bignum exceptions] in GHC.Num.Primitives-   | bigNatIsZero a          = (# bigNatZero# void#, bigNatZero# void# #)-   | bigNatIsOne b           = (# a                , bigNatZero# void# #)-   | LT <- cmp               = (# bigNatZero# void#, a #)-   | EQ <- cmp               = (# bigNatOne#  void#, bigNatZero# void# #)+   | bigNatIsZero a          = (# bigNatZero# (# #), bigNatZero# (# #) #)+   | bigNatIsOne b           = (# a                , bigNatZero# (# #) #)+   | LT <- cmp               = (# bigNatZero# (# #), a #)+   | EQ <- cmp               = (# bigNatOne#  (# #), bigNatZero# (# #) #)    | isTrue# (szB ==# 1#)    = case bigNatQuotRemWord# a (bigNatIndex# b 0#) of                                  (# q, r #) -> (# q, bigNatFromWord# r #) -   | True = withNewWordArray2Trimed# szQ szR \mwq mwr s ->+   | True = withNewWordArray2Trimmed# szQ szR \mwq mwr s ->                      inline bignat_quotrem mwq mwr a b s    where    cmp = bigNatCompare a b@@ -645,13 +654,13 @@ -- | BigNat division returning quotient bigNatQuot :: BigNat# -> BigNat# -> BigNat# bigNatQuot a b-   | bigNatIsZero b          = raiseDivZero_BigNat void#-   | bigNatIsZero a          = bigNatZero# void#+   | bigNatIsZero b          = raiseDivZero_BigNat (# #)+   | bigNatIsZero a          = bigNatZero# (# #)    | bigNatIsOne b           = a-   | LT <- cmp               = bigNatZero# void#-   | EQ <- cmp               = bigNatOne# void#+   | LT <- cmp               = bigNatZero# (# #)+   | EQ <- cmp               = bigNatOne# (# #)    | isTrue# (szB ==# 1#)    = bigNatQuotWord# a (bigNatIndex# b 0#)-   | True                    = withNewWordArrayTrimed# szQ \mwq s ->+   | True                    = withNewWordArrayTrimmed# szQ \mwq s ->                                  inline bignat_quot mwq a b s    where    cmp = bigNatCompare a b@@ -662,14 +671,14 @@ -- | BigNat division returning remainder bigNatRem :: BigNat# -> BigNat# -> BigNat# bigNatRem a b-   | bigNatIsZero b          = raiseDivZero_BigNat void#-   | bigNatIsZero a          = bigNatZero# void#-   | bigNatIsOne b           = bigNatZero# void#+   | bigNatIsZero b          = raiseDivZero_BigNat (# #)+   | bigNatIsZero a          = bigNatZero# (# #)+   | bigNatIsOne b           = bigNatZero# (# #)    | LT <- cmp               = a-   | EQ <- cmp               = bigNatZero# void#+   | EQ <- cmp               = bigNatZero# (# #)    | isTrue# (szB ==# 1#)    = case bigNatRemWord# a (bigNatIndex# b 0#) of                                  r -> bigNatFromWord# r-   | True                    = withNewWordArrayTrimed# szR \mwr s ->+   | True                    = withNewWordArrayTrimmed# szR \mwr s ->                                  inline bignat_rem mwr a b s    where    cmp = bigNatCompare a b@@ -723,7 +732,7 @@       _            ->          let             go wx wy = -- wx > wy-               withNewWordArrayTrimed# (wordArraySize# wy) \mwr s ->+               withNewWordArrayTrimmed# (wordArraySize# wy) \mwr s ->                   bignat_gcd mwr wx wy s          in case bigNatCompare a b of                EQ -> a@@ -744,8 +753,8 @@ -- | Least common multiple bigNatLcm :: BigNat# -> BigNat# -> BigNat# bigNatLcm a b-   | bigNatIsZero a = bigNatZero# void#-   | bigNatIsZero b = bigNatZero# void#+   | bigNatIsZero a = bigNatZero# (# #)+   | bigNatIsZero b = bigNatZero# (# #)    | bigNatIsOne  a = b    | bigNatIsOne  b = a    | True@@ -759,8 +768,8 @@ -- | Least common multiple with a Word# bigNatLcmWord# :: BigNat# -> Word# -> BigNat# bigNatLcmWord# a b-   | bigNatIsZero a      = bigNatZero# void#-   | 0## <- b            = bigNatZero# void#+   | bigNatIsZero a      = bigNatZero# (# #)+   | 0## <- b            = bigNatZero# (# #)    | bigNatIsOne  a      = bigNatFromWord# b    | 1## <- b            = a    | 1# <- bigNatSize# a = bigNatLcmWordWord# (bigNatIndex# a 0#) b@@ -771,8 +780,8 @@ -- | Least common multiple between two Word# bigNatLcmWordWord# :: Word# -> Word# -> BigNat# bigNatLcmWordWord# a b-   | 0## <- a = bigNatZero# void#-   | 0## <- b = bigNatZero# void#+   | 0## <- a = bigNatZero# (# #)+   | 0## <- b = bigNatZero# (# #)    | 1## <- a = bigNatFromWord# b    | 1## <- b = bigNatFromWord# a    | True     = case (a `quotWord#` (a `gcdWord#` b)) `timesWord2#` b of@@ -812,7 +821,7 @@ bigNatAnd a b    | bigNatIsZero a = a    | bigNatIsZero b = b-   | True           = withNewWordArrayTrimed# sz \mwa s ->+   | True           = withNewWordArrayTrimmed# sz \mwa s ->                         inline bignat_and mwa a b s    where       !szA = wordArraySize# a@@ -824,7 +833,7 @@ bigNatAndNot a b    | bigNatIsZero a = a    | bigNatIsZero b = a-   | True           = withNewWordArrayTrimed# szA \mwa s ->+   | True           = withNewWordArrayTrimmed# szA \mwa s ->                         inline bignat_and_not mwa a b s    where       !szA = wordArraySize# a@@ -864,7 +873,7 @@ bigNatXor a b    | bigNatIsZero a = b    | bigNatIsZero b = a-   | True           = withNewWordArrayTrimed# sz \mwa s ->+   | True           = withNewWordArrayTrimmed# sz \mwa s ->                         inline bignat_xor mwa a b s    where       !szA = wordArraySize# a@@ -904,14 +913,14 @@     | nw <- word2Int# (n `uncheckedShiftRL#` WORD_SIZE_BITS_SHIFT#)    , isTrue# (nw >=# wordArraySize# a)-   = bigNatZero# void#+   = bigNatZero# (# #)     | True    = let       !szA = wordArraySize# a       !nw  = word2Int# (n `uncheckedShiftRL#` WORD_SIZE_BITS_SHIFT#)       !sz  = szA -# nw-     in withNewWordArrayTrimed# sz \mwa s ->+     in withNewWordArrayTrimmed# sz \mwa s ->          inline bignat_shiftr mwa a n s  -- | Bit shift right (two's complement)@@ -925,14 +934,14 @@     | nw <- word2Int# (n `uncheckedShiftRL#` WORD_SIZE_BITS_SHIFT#)    , isTrue# (nw >=# wordArraySize# a)-   = bigNatZero# void#+   = bigNatZero# (# #)     | True    = let       !szA = wordArraySize# a       !nw  = (word2Int# n -# 1#) `uncheckedIShiftRL#` WORD_SIZE_BITS_SHIFT#       !sz  = szA -# nw-     in withNewWordArrayTrimed# sz \mwa s ->+     in withNewWordArrayTrimmed# sz \mwa s ->          inline bignat_shiftr_neg mwa a n s  @@ -960,7 +969,7 @@       !nb  = word2Int# (n `and#` WORD_SIZE_BITS_MASK##)       !sz   = szA +# nw +# (nb /=# 0#) -     in withNewWordArrayTrimed# sz \mwa s ->+     in withNewWordArrayTrimmed# sz \mwa s ->          inline bignat_shiftl mwa a n s  @@ -986,7 +995,7 @@ -- bigNatBit# :: Word# -> BigNat# bigNatBit# i-   | 0## <- i = bigNatOne# void#+   | 0## <- i = bigNatOne# (# #)    | True =    let       !nw = word2Int# (i `uncheckedShiftRL#` WORD_SIZE_BITS_SHIFT#)@@ -1025,7 +1034,7 @@       | 0## <- nv       , isTrue# (nw +# 1# ==# sz)       -> case sz -# (waClzAt a (sz -# 2#) +# 1#) of-            0#  -> bigNatZero# void#+            0#  -> bigNatZero# (# #)             nsz -> withNewWordArray# nsz \mwa s ->                      mwaArrayCopy# mwa 0# a 0# nsz s @@ -1036,6 +1045,7 @@  -- | BigNat set bit bigNatSetBit# :: BigNat# -> Word# -> BigNat#+{-# NOINLINE bigNatSetBit# #-} bigNatSetBit# a n    -- check the current bit value    | isTrue# (bigNatTestBit# a n) = a@@ -1060,10 +1070,25 @@  -- | Reverse the given bit bigNatComplementBit# :: BigNat# -> Word# -> BigNat#-bigNatComplementBit# bn i-  | isTrue# (bigNatTestBit# bn i) = bigNatClearBit# bn i-  | True                          = bigNatSetBit#   bn i+bigNatComplementBit# a n =+   let+      !sz = wordArraySize# a+      !nw = word2Int# (n `uncheckedShiftRL#` WORD_SIZE_BITS_SHIFT#)+      !nb = word2Int# (n `and#` WORD_SIZE_BITS_MASK##)+      d   = nw +# 1# -# sz+   in if+      -- result BigNat will have more limbs+      | isTrue# (d ># 0#)+      -> withNewWordArray# (nw +# 1#) \mwa s ->+            case mwaArrayCopy# mwa 0# a 0# sz s of+               s' -> case mwaFill# mwa 0## (int2Word# sz) (int2Word# (d -# 1#)) s' of+                  s'' -> writeWordArray# mwa nw (bitW# nb) s'' +      | nv <- bigNatIndex# a nw `xor#` bitW# nb+      -> withNewWordArrayTrimmed# sz \mwa s ->+            case mwaArrayCopy# mwa 0# a 0# sz s of+               s' -> writeWordArray# mwa nw nv s'+ ------------------------------------------------- -- Log operations -------------------------------------------------@@ -1085,7 +1110,7 @@ bigNatLogBase# :: BigNat# -> BigNat# -> Word# bigNatLogBase# base a    | bigNatIsZero base || bigNatIsOne base-   = unexpectedValue_Word# void#+   = unexpectedValue_Word# (# #)     | 1# <- bigNatSize# base    , 2## <- bigNatIndex# base 0#@@ -1111,8 +1136,8 @@ -- | Logarithm for an arbitrary base bigNatLogBaseWord# :: Word# -> BigNat# -> Word# bigNatLogBaseWord# base a-   | 0## <- base = unexpectedValue_Word# void#-   | 1## <- base = unexpectedValue_Word# void#+   | 0## <- base = unexpectedValue_Word# (# #)+   | 1## <- base = unexpectedValue_Word# (# #)    | 2## <- base = bigNatLog2# a    -- TODO: optimize log base power of 2 (256, etc.)    | True = bigNatLogBase# (bigNatFromWord# base) a@@ -1131,7 +1156,7 @@ bigNatSizeInBase# :: Word# -> BigNat# -> Word# bigNatSizeInBase# base a    | isTrue# (base `leWord#` 1##)-   = unexpectedValue_Word# void#+   = unexpectedValue_Word# (# #)     | bigNatIsZero a    = 0##@@ -1160,7 +1185,7 @@ -- | \"@'bigNatPowModWord#' /b/ /e/ /m/@\" computes base @/b/@ raised to -- exponent @/e/@ modulo @/m/@. bigNatPowModWord# :: BigNat# -> BigNat# -> Word# -> Word#-bigNatPowModWord# !_ !_ 0## = raiseDivZero_Word# void#+bigNatPowModWord# !_ !_ 0## = raiseDivZero_Word# (# #) bigNatPowModWord# _  _  1## = 0## bigNatPowModWord# b  e  m    | bigNatIsZero e         = 1##@@ -1174,12 +1199,12 @@ bigNatPowMod !b !e !m    | (# | m' #) <- bigNatToWordMaybe# m    = bigNatFromWord# (bigNatPowModWord# b e m')-   | bigNatIsZero m = raiseDivZero_BigNat void#+   | bigNatIsZero m = raiseDivZero_BigNat (# #)    | bigNatIsOne  m = bigNatFromWord# 0##    | bigNatIsZero e = bigNatFromWord# 1##    | bigNatIsZero b = bigNatFromWord# 0##    | bigNatIsOne  b = bigNatFromWord# 1##-   | True           = withNewWordArrayTrimed# (bigNatSize# m) \mwa s ->+   | True           = withNewWordArrayTrimmed# (bigNatSize# m) \mwa s ->                          inline bignat_powmod mwa b e m s  -- | Return count of trailing zero bits@@ -1230,6 +1255,7 @@ -- written in advance. In case of @/i/ == 0@, the function will write and report -- zero bytes written. bigNatToAddrLE# :: BigNat# -> Addr# -> State# s -> (# State# s, Word# #)+{-# NOINLINE bigNatToAddrLE# #-} bigNatToAddrLE# a addr s0    | isTrue# (sz ==# 0#) = (# s0, 0## #)    | True = case writeMSB s0 of@@ -1259,6 +1285,7 @@ -- written in advance. In case of @/i/ == 0@, the function will write and report -- zero bytes written. bigNatToAddrBE# :: BigNat# -> Addr# -> State# s -> (# State# s, Word# #)+{-# NOINLINE bigNatToAddrBE# #-} bigNatToAddrBE# a addr s0    | isTrue# (sz ==# 0#) = (# s0, 0## #)    | msw <- indexWordArray# a (sz -# 1#)@@ -1316,9 +1343,10 @@ -- -- The size is given in bytes. ----- Higher limbs equal to 0 are automatically trimed.+-- Higher limbs equal to 0 are automatically trimmed. bigNatFromAddrLE# :: Word# -> Addr# -> State# s -> (# State# s, BigNat# #)-bigNatFromAddrLE# 0## _    s = (# s, bigNatZero# void# #)+{-# NOINLINE bigNatFromAddrLE# #-}+bigNatFromAddrLE# 0## _    s = (# s, bigNatZero# (# #) #) bigNatFromAddrLE# sz  addr s =    let       !nw = sz `uncheckedShiftRL#` WORD_SIZE_BYTES_SHIFT#@@ -1351,9 +1379,10 @@ -- -- The size is given in bytes. ----- Null higher limbs are automatically trimed.+-- Null higher limbs are automatically trimmed. bigNatFromAddrBE# :: Word# -> Addr# -> State# s -> (# State# s, BigNat# #)-bigNatFromAddrBE# 0## _    s = (# s, bigNatZero# void# #)+{-# NOINLINE bigNatFromAddrBE# #-}+bigNatFromAddrBE# 0## _    s = (# s, bigNatZero# (# #) #) bigNatFromAddrBE# sz  addr s =    let       !nw = word2Int# (sz `uncheckedShiftRL#` WORD_SIZE_BYTES_SHIFT#)@@ -1391,7 +1420,7 @@ -- byte first (big-endian) if @1#@ or least significant byte first -- (little-endian) if @0#@. ----- Null higher limbs are automatically trimed.+-- Null higher limbs are automatically trimmed. bigNatFromAddr# :: Word# -> Addr# -> Bool# -> State# s -> (# State# s, BigNat# #) bigNatFromAddr# sz addr 0# s = bigNatFromAddrLE# sz addr s bigNatFromAddr# sz addr _  s = bigNatFromAddrBE# sz addr s@@ -1407,6 +1436,7 @@ -- written in advance. In case of @/i/ == 0@, the function will write and report -- zero bytes written. bigNatToMutableByteArrayLE# :: BigNat# -> MutableByteArray# s -> Word# -> State# s -> (# State# s, Word# #)+{-# NOINLINE bigNatToMutableByteArrayLE# #-} bigNatToMutableByteArrayLE# a mba moff s0    | isTrue# (sz ==# 0#) = (# s0, 0## #)    | True = case writeMSB s0 of@@ -1436,6 +1466,7 @@ -- written in advance. In case of @/i/ == 0@, the function will write and report -- zero bytes written. bigNatToMutableByteArrayBE# :: BigNat# -> MutableByteArray# s -> Word# -> State# s -> (# State# s, Word# #)+{-# NOINLINE bigNatToMutableByteArrayBE# #-} bigNatToMutableByteArrayBE# a mba moff s0    | isTrue# (sz ==# 0#) = (# s0, 0## #)    | msw <- indexWordArray# a (sz -# 1#)@@ -1477,9 +1508,10 @@ -- -- The size is given in bytes. ----- Null higher limbs are automatically trimed.+-- Null higher limbs are automatically trimmed. bigNatFromByteArrayLE# :: Word# -> ByteArray# -> Word# -> State# s -> (# State# s, BigNat# #)-bigNatFromByteArrayLE# 0## _  _    s = (# s, bigNatZero# void# #)+{-# NOINLINE bigNatFromByteArrayLE# #-}+bigNatFromByteArrayLE# 0## _  _    s = (# s, bigNatZero# (# #) #) bigNatFromByteArrayLE# sz  ba moff s =    let       !nw = sz `uncheckedShiftRL#` WORD_SIZE_BYTES_SHIFT#@@ -1512,9 +1544,10 @@ -- -- The size is given in bytes. ----- Null higher limbs are automatically trimed.+-- Null higher limbs are automatically trimmed. bigNatFromByteArrayBE# :: Word# -> ByteArray# -> Word# -> State# s -> (# State# s, BigNat# #)-bigNatFromByteArrayBE# 0## _  _    s = (# s, bigNatZero# void# #)+{-# NOINLINE bigNatFromByteArrayBE# #-}+bigNatFromByteArrayBE# 0## _  _    s = (# s, bigNatZero# (# #) #) bigNatFromByteArrayBE# sz  ba moff s =    let       !nw = sz `uncheckedShiftRL#` WORD_SIZE_BYTES_SHIFT#@@ -1552,7 +1585,7 @@ -- byte first (big-endian) if @1#@ or least significant byte first -- (little-endian) if @0#@. ----- Null higher limbs are automatically trimed.+-- Null higher limbs are automatically trimmed. bigNatFromByteArray# :: Word# -> ByteArray# -> Word# -> Bool# -> State# s -> (# State# s, BigNat# #) bigNatFromByteArray# sz ba off 0# s = bigNatFromByteArrayLE# sz ba off s bigNatFromByteArray# sz ba off _  s = bigNatFromByteArrayBE# sz ba off s@@ -1566,9 +1599,10 @@ -- If possible 'WordArray#', will be used directly (i.e. shared -- /without/ cloning the 'WordArray#' into a newly allocated one) bigNatFromWordArray# :: WordArray# -> Word# -> BigNat#+{-# NOINLINE bigNatFromWordArray# #-} bigNatFromWordArray# wa n0    | isTrue# (n `eqWord#` 0##)-   = bigNatZero# void#+   = bigNatZero# (# #)     | isTrue# (r `eqWord#` 0##) -- i.e. wa is multiple of limb-size    , isTrue# (q `eqWord#` n)@@ -1595,3 +1629,19 @@ -- /without/ cloning the 'WordArray#' into a newly allocated one) bigNatFromWordArray :: WordArray# -> Word# -> BigNat bigNatFromWordArray wa n = BN# (bigNatFromWordArray# wa n)++-------------------------------------------------+-- Instances+-------------------------------------------------++instance Eq BigNat where+   BN# a == BN# b = bigNatEq a b+   BN# a /= BN# b = bigNatNe a b++instance Ord BigNat where+   (BN# a) `compare` (BN# b) = bigNatCompare a b+   BN# a <  BN# b = bigNatLt a b+   BN# a <= BN# b = bigNatLe a b+   BN# a >  BN# b = bigNatGt a b+   BN# a >= BN# b = bigNatGe a b+
src/GHC/Num/Integer.hs view
@@ -34,10 +34,6 @@ import GHC.Num.Natural import qualified GHC.Num.Backend as Backend -#if WORD_SIZE_IN_BITS < 64-import GHC.IntWord64-#endif- default ()  -- | Arbitrary precision integers. In contrast with fixed-size integral types@@ -133,7 +129,7 @@ integerToBigNatClamp# (IP x) = x integerToBigNatClamp# (IS x)    | isTrue# (x >=# 0#)     = bigNatFromWord# (int2Word# x)-integerToBigNatClamp# _     = bigNatZero# void#+integerToBigNatClamp# _     = bigNatZero# (# #)  -- | Create an Integer from an Int# integerFromInt# :: Int# -> Integer@@ -198,7 +194,7 @@ integerFromNatural :: Natural -> Integer {-# NOINLINE integerFromNatural #-} integerFromNatural (NS x) = integerFromWord# x-integerFromNatural (NB x) = integerFromBigNat# x+integerFromNatural (NB x) = IP x  -- | Convert a list of Word into an Integer integerFromWordList :: Bool -> [Word] -> Integer@@ -286,7 +282,6 @@  -- | Equal predicate. integerEq# :: Integer -> Integer -> Bool#-{-# NOINLINE integerEq# #-} integerEq# (IS x) (IS y) = x ==# y integerEq# (IN x) (IN y) = bigNatEq# x y integerEq# (IP x) (IP y) = bigNatEq# x y@@ -294,7 +289,6 @@  -- | Not-equal predicate. integerNe# :: Integer -> Integer -> Bool#-{-# NOINLINE integerNe# #-} integerNe# (IS x) (IS y) = x /=# y integerNe# (IN x) (IN y) = bigNatNe# x y integerNe# (IP x) (IP y) = bigNatNe# x y@@ -302,31 +296,27 @@  -- | Greater predicate. integerGt# :: Integer -> Integer -> Bool#-{-# NOINLINE integerGt# #-}-integerGt# (IS x) (IS y)                   = x ># y-integerGt# x y | GT <- integerCompare' x y = 1#-integerGt# _ _                             = 0#+integerGt# (IS x) (IS y)                  = x ># y+integerGt# x y | GT <- integerCompare x y = 1#+integerGt# _ _                            = 0#  -- | Lower-or-equal predicate. integerLe# :: Integer -> Integer -> Bool#-{-# NOINLINE integerLe# #-}-integerLe# (IS x) (IS y)                   = x <=# y-integerLe# x y | GT <- integerCompare' x y = 0#-integerLe# _ _                             = 1#+integerLe# (IS x) (IS y)                  = x <=# y+integerLe# x y | GT <- integerCompare x y = 0#+integerLe# _ _                            = 1#  -- | Lower predicate. integerLt# :: Integer -> Integer -> Bool#-{-# NOINLINE integerLt# #-}-integerLt# (IS x) (IS y)                   = x <# y-integerLt# x y | LT <- integerCompare' x y = 1#-integerLt# _ _                             = 0#+integerLt# (IS x) (IS y)                  = x <# y+integerLt# x y | LT <- integerCompare x y = 1#+integerLt# _ _                            = 0#  -- | Greater-or-equal predicate. integerGe# :: Integer -> Integer -> Bool#-{-# NOINLINE integerGe# #-}-integerGe# (IS x) (IS y)                   = x >=# y-integerGe# x y | LT <- integerCompare' x y = 0#-integerGe# _ _                             = 1#+integerGe# (IS x) (IS y)                  = x >=# y+integerGe# x y | LT <- integerCompare x y = 0#+integerGe# _ _                            = 1#  instance Eq Integer where    (==) = integerEq@@ -334,20 +324,16 @@  -- | Compare two Integer integerCompare :: Integer -> Integer -> Ordering-{-# NOINLINE integerCompare #-}-integerCompare = integerCompare'--integerCompare' :: Integer -> Integer -> Ordering-{-# INLINE integerCompare' #-}-integerCompare' (IS x) (IS y) = compareInt# x y-integerCompare' (IP x) (IP y) = bigNatCompare x y-integerCompare' (IN x) (IN y) = bigNatCompare y x-integerCompare' (IS _) (IP _) = LT-integerCompare' (IS _) (IN _) = GT-integerCompare' (IP _) (IS _) = GT-integerCompare' (IN _) (IS _) = LT-integerCompare' (IP _) (IN _) = GT-integerCompare' (IN _) (IP _) = LT+{-# INLINEABLE integerCompare #-}+integerCompare (IS x) (IS y) = compareInt# x y+integerCompare (IP x) (IP y) = bigNatCompare x y+integerCompare (IN x) (IN y) = bigNatCompare y x+integerCompare (IS _) (IP _) = LT+integerCompare (IS _) (IN _) = GT+integerCompare (IP _) (IS _) = GT+integerCompare (IN _) (IS _) = LT+integerCompare (IP _) (IN _) = GT+integerCompare (IN _) (IP _) = LT  instance Ord Integer where    compare = integerCompare@@ -528,13 +514,11 @@ -- | Return @-1@, @0@, and @1@ depending on whether argument is -- negative, zero, or positive, respectively integerSignum :: Integer -> Integer-{-# NOINLINE integerSignum #-} integerSignum !j = IS (integerSignum# j)  -- | Return @-1#@, @0#@, and @1#@ depending on whether argument is -- negative, zero, or positive, respectively integerSignum# :: Integer -> Int#-{-# NOINLINE integerSignum# #-} integerSignum# (IN _)  = -1# integerSignum# (IS i#) = sgnI# i# integerSignum# (IP _ ) =  1#@@ -577,7 +561,7 @@    | isTrue# (iw >=# n)    = 1#    -- if all the limbs j with j < iw are null, then we have to consider the-   -- carry of the 2's complement convertion. Otherwise we just have to return+   -- carry of the 2's complement conversion. Otherwise we just have to return    -- the inverse of the bit test    | allZ iw = testBitW# (xi `minusWord#` 1##) ib ==# 0#    | True    = testBitW# xi ib ==# 0#@@ -653,7 +637,7 @@                IS -1# -> IS -1#                IS  y  -> IS (orI# x y)                IP  y-                  | isTrue# (x >=# 0#) -> integerFromBigNat# (bigNatOrWord# y (int2Word# x))+                  | isTrue# (x >=# 0#) -> IP (bigNatOrWord# y (int2Word# x))                   | True               -> integerFromBigNatNeg#                                              (bigNatAddWord#                                                 (bigNatAndNot -- use De Morgan's laws@@ -676,7 +660,7 @@                                                 1##)    IP  x  -> case b of                IS _ -> integerOr b a-               IP y -> integerFromBigNat# (bigNatOr x y)+               IP y -> IP (bigNatOr x y)                IN y -> integerFromBigNatNeg#                         (bigNatAddWord#                            (bigNatAndNot -- use De Morgan's laws@@ -1014,14 +998,12 @@ integerIsPowerOf2# (IN _) = (# (# #) | #) integerIsPowerOf2# (IP w) = bigNatIsPowerOf2# w -#if WORD_SIZE_IN_BITS == 32---- | Convert an Int64# into an Integer on 32-bit architectures+-- | Convert an Int64# into an Integer integerFromInt64# :: Int64# -> Integer {-# NOINLINE integerFromInt64# #-}-integerFromInt64# !i-  | isTrue# ((i `leInt64#` intToInt64#  0x7FFFFFFF#)-      &&# (i `geInt64#` intToInt64# -0x80000000#))+integerFromInt64# i+  | isTrue# ((i `leInt64#` intToInt64#  INT_MAXBOUND#)+      &&# (i `geInt64#` intToInt64# INT_MINBOUND#))   = IS (int64ToInt# i)    | isTrue# (i `geInt64#` intToInt64# 0#)@@ -1030,37 +1012,29 @@   | True   = IN (bigNatFromWord64# (int64ToWord64# (negateInt64# i))) --- | Convert a Word64# into an Integer on 32-bit architectures+-- | Convert a Word64# into an Integer integerFromWord64# :: Word64# -> Integer {-# NOINLINE integerFromWord64# #-} integerFromWord64# !w-  | isTrue# (w `leWord64#` wordToWord64# 0x7FFFFFFF##)+  | isTrue# (w `leWord64#` wordToWord64# INT_MAXBOUND##)   = IS (int64ToInt# (word64ToInt64# w))   | True   = IP (bigNatFromWord64# w) --- | Convert an Integer into an Int64# on 32-bit architectures+-- | Convert an Integer into an Int64# integerToInt64# :: Integer -> Int64# {-# NOINLINE integerToInt64# #-} integerToInt64# (IS i) = intToInt64# i integerToInt64# (IP b) = word64ToInt64# (bigNatToWord64# b) integerToInt64# (IN b) = negateInt64# (word64ToInt64# (bigNatToWord64# b)) --- | Convert an Integer into a Word64# on 32-bit architectures+-- | Convert an Integer into a Word64# integerToWord64# :: Integer -> Word64# {-# NOINLINE integerToWord64# #-} integerToWord64# (IS i) = int64ToWord64# (intToInt64# i) integerToWord64# (IP b) = bigNatToWord64# b integerToWord64# (IN b) = int64ToWord64# (negateInt64# (word64ToInt64# (bigNatToWord64# b))) -#else---- | Convert an Int64# into an Integer on 64-bit architectures-integerFromInt64# :: Int# -> Integer-integerFromInt64# !x = IS x--#endif- ---------------------------------------------------------------------------- -- Conversions to/from floating point ----------------------------------------------------------------------------@@ -1084,22 +1058,11 @@ integerEncodeDouble :: Integer -> Int -> Double integerEncodeDouble !m (I# e)  = D# (integerEncodeDouble# m e) --- | Encode an Integer (mantissa) into a Double#-integerToDouble# :: Integer -> Double#-{-# NOINLINE integerToDouble# #-}-integerToDouble# !i = integerEncodeDouble# i 0#---- | Encode an Integer (mantissa) into a Float#-integerToFloat# :: Integer -> Float#-{-# NOINLINE integerToFloat# #-}-integerToFloat# !i = integerEncodeFloat# i 0#- -- | Encode (# Integer mantissa, Int# exponent #) into a Float# -- -- TODO: Not sure if it's worth to write 'Float' optimized versions here integerEncodeFloat# :: Integer -> Int# -> Float# {-# NOINLINE integerEncodeFloat# #-}-integerEncodeFloat# !m 0# = double2Float# (integerToDouble# m) integerEncodeFloat# !m e  = double2Float# (integerEncodeDouble# m e)  -- | Compute the number of digits of the Integer (without the sign) in the given base.@@ -1284,3 +1247,271 @@       -- e > 0 by cases above    | True = (# Backend.integer_powmod b (integerToNatural e) m | #)+++{-+Note [Optimising conversions between numeric types]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+Converting between numeric types is very common in Haskell codes.  Suppose that+we have N inter-convertible numeric types (Word, Word8, Word32, Int, etc.).++- We don't want to have to use one conversion function per pair of types as that+would require N^2 functions: wordToWord8, wordToInt, word8ToWord32...++- The following kind of class would allow us to have a single conversion+function but at the price of N^2 instances and of the use of+MultiParamTypeClasses extension.++    class Convert a b where+      convert :: a -> b++So what we do instead is that we use the Integer type (signed, unbounded) as a+passthrough type to perform every conversion. Hence we only need to define two+functions per numeric type:++  class Integral a where+    toInteger :: a -> Integer++  class Num a where+    fromInteger :: Integer -> a++These classes have a single parameter and can be derived automatically (e.g. for+newtypes). So we don't even have to define 2*N instances. For example, all the+instances for the types in Foreign.C.Types (CChar, CShort, CInt, CUInt, etc.)+are automatically derived from the instances for Word, Int, Word8, Word16, etc.++Finally we can define a generic conversion function:++  -- in the Prelude+  fromIntegral :: (Integral a, Num b) => a -> b+  fromIntegral = fromInteger . toInteger++Efficient conversions+~~~~~~~~~~~~~~~~~~~~~++An issue with this approach is that performance might be terrible. E.g.+converting an Int into a Word, which is a no-op at the machine level, becomes+costly when performed via `fromIntegral` or any similar function because an+intermediate Integer has to be allocated in the heap to perform the conversion.++A solution is to bless one particular `fromIntegral`-like function and to use+rewrite rules to replace it with a more efficient function when both types are+known. This is what was done in the past, see next section. We use another+approach nowadays:++Notice that the set of primitive operations to convert from and to Integer and+Natural is pretty small:++  - Natural <-> Word#/BigNat#+  - Integer <-> Int#/Word#/Natural/BigNat# (+ Int64#/Word64# on 32-bit arch)++For example, we have the following primitives:+  - integerToWord#   :: Integer -> Word#+  - integerFromWord# :: Word# -> Integer+  - integerToInt#    :: Integer -> Int#+  - ...++Compared to optimising `fromIntegral :: (Integral a, Num b) => a -> b` where `a`+and `b` are arbitrary, we only have to write rewrite rules for the concrete+types that can be converted from and to Natural/Integer. All the other ones+necessarily pass through these concrete types!++For example we have the following rules:+    integerToWord# (integerFromWord# x) ===> x+    integerToInt# (integerFromWord# x)  ===> word2Int# x++But we don't need rules to handle conversion from/to e.g. Word32# because there+is no Word32#-to-Integer primitive: Word32# must be converted into something+else first (e.g. Word#) for which we have rules.++We rely on inlining of fromInteger/toInteger and on other transformations (e.g.+float-in) to make these rules likely to fire. It seems to work well in practice.++Example 1: converting an Int into a Word++  fromIntegral @Int @Word x++  ===> {inline fromIntegral}+  fromInteger @Word (toInteger @Int x)++  ===> {inline fromInteger and toInteger}+  W# (integerToWord# (case x of { I# x# -> IS x# }))++  ===> {float-in}+  case x of { I# x# -> W# (integerToWord# (IS x#)) }++  ===> {rewrite rule for "integerToWord# . IS"}+  case x of { I# x# -> W# (int2Word# x#) }+++Example 2: converting an Int8 into a Word32++  fromIntegral @Int8 @Word32 x++  ===> {inline fromIntegral}+  fromInteger @Word32 (toInteger @Int8 x)++  ===> {inline fromInteger and toInteger}+  W32# (wordToWord32# (integerToWord# (case x of { I8# x# -> IS (int8ToInt# x#) })))++  ===> {float-in}+  case x of { I8# x# -> W32# (wordToWord32# (integerToWord# (IS (int8ToInt# x#)))) }++  ===> {rewrite rule for "integerToWord# . IS"}+  case x of { I8# x# -> W32# (wordToWord32# (int2Word# (int8ToInt# x#))) }++  Notice that in the resulting expression the value passes through types Int#+  and Word# with native machine word size: it is first sign-extended from Int8#+  to Int#, then cast into Word#, and finally truncated into Word32#. These are+  all very cheap operations that are performed in registers without allocating+  anything in the heap.++++Historical fromIntegral optimisations+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++In the past, `fromIntegral` function in the Prelude was special because many+rewrite rules were mentioning it explicitly. For example to replace a call to+`fromIntegral :: Int -> Word`, which allocates an intermediate Integer, with a+call to `intToWord`, which is a no-op when compiled into machine code. Nowadays+`fromIntegral` isn't a special function anymore and we just INLINE it (see above).++- first `fromIntegral` was specialized (SPECIALIZE pragma). However it would+need N^2 pragmas to cover every case and it wouldn't cover user defined numeric+types which don't belong to base.++- `-fwarn-identities` enables a warning to detect useless conversions via+fromIntegral (since 0656c72a8f):++  > fromIntegral (1 :: Int) :: Int++  <interactive>:3:21: warning: [-Widentities]+      Call of fromIntegral :: Int -> Int+        can probably be omitted+++- many rules were added (e.g. in e0c787c10f) to perform float-in transformations+explicitly (to allow more fromIntegral rules to fire) and to replace some+fromIntegral calls with faster operations:++    "fromIntegral/Int8->Int8" fromIntegral = id :: Int8 -> Int8+    "fromIntegral/a->Int8"    fromIntegral = \x -> case fromIntegral x of I# x# -> I8# (intToInt8# x#)+    "fromIntegral/Int8->a"    fromIntegral = \(I8# x#) -> fromIntegral (I# x#)++It worked but there were still some issues with this approach:++1. These rules only work for `fromIntegral`. If we wanted to define our own+   similar function (e.g. using other type-classes), we would also have to redefine+   all the rules to get similar performance.++2. `fromIntegral` had to be marked `NOINLINE [1]`:+    - NOINLINE to allow rules to match+    - [1] to allow inlining in later phases to avoid incurring a function call+      overhead for such a trivial operation++   Users of the function had to be careful because a simple helper without an+   INLINE pragma like:++      toInt :: Integral a => a -> Int+      toInt = fromIntegral++   had the following unfolding:++      toInt = integerToInt . toInteger++   which doesn't mention `fromIntegral` anymore. Hence `fromIntegral` rules+   wouldn't fire for codes using `toInt` while they would if they had used+   `fromIntegral` directly!+   For this reason, a bunch of rules for bignum primitives as we have now were+   already present to handle these cases.++3. These rewrite rules were tedious to write and error-prone (cf #19345).++For these reasons, it is simpler to not consider fromIntegral special at all and+to only rely on rewrite rules for bignum functions.++-}++-- See Note [Optimising conversions between numeric types]+{-# RULES+"Word# -> Natural -> Integer"+  forall x. integerFromNatural (NS x) = integerFromWord# x++"BigNat# -> Natural -> Integer"+  forall x. integerFromNatural (NB x) = IP x++"Int# -> Integer -> Int#"+  forall x. integerToInt# (IS x) = x++"Word# -> Integer -> Word#"+  forall x. integerToWord# (integerFromWord# x) = x++"Natural -> Integer -> Natural (wrap)"+  forall x. integerToNatural (integerFromNatural x) = x++"Natural -> Integer -> Natural (throw)"+  forall x. integerToNaturalThrow (integerFromNatural x) = x++"Natural -> Integer -> Natural (clamp)"+  forall x. integerToNaturalClamp (integerFromNatural x) = x++"Natural -> Integer -> Word#"+  forall x. integerToWord# (integerFromNatural x) = naturalToWord# x++"Int# -> Integer -> Word#"+  forall x. integerToWord# (IS x) = int2Word# x++"Word# -> Integer -> Int#"+  forall x. integerToInt# (integerFromWord# x) = word2Int# x++"Word# -> Integer -> Natural (wrap)"+  forall x. integerToNatural (integerFromWord# x) = NS x++"Word# -> Integer -> Natural (throw)"+  forall x. integerToNaturalThrow (integerFromWord# x) = NS x++"Word# -> Integer -> Natural (clamp)"+  forall x. integerToNaturalClamp (integerFromWord# x) = NS x++#-}++{-# RULES++"Int64# -> Integer -> Int64#"+  forall x. integerToInt64# (integerFromInt64# x) = x++"Word64# -> Integer -> Word64#"+  forall x. integerToWord64# (integerFromWord64# x) = x++"Int64# -> Integer -> Word64#"+  forall x. integerToWord64# (integerFromInt64# x) = int64ToWord64# x++"Word64# -> Integer -> Int64#"+  forall x. integerToInt64# (integerFromWord64# x) = word64ToInt64# x++"Word# -> Integer -> Word64#"+  forall x. integerToWord64# (integerFromWord# x) = wordToWord64# x++"Word64# -> Integer -> Word#"+  forall x. integerToWord# (integerFromWord64# x) = word64ToWord# x++"Int# -> Integer -> Int64#"+  forall x. integerToInt64# (IS x) = intToInt64# x++"Int64# -> Integer -> Int#"+  forall x. integerToInt# (integerFromInt64# x) = int64ToInt# x++"Int# -> Integer -> Word64#"+  forall x. integerToWord64# (IS x) = int64ToWord64# (intToInt64# x)++"Int64# -> Integer -> Word#"+  forall x. integerToWord# (integerFromInt64# x) = int2Word# (int64ToInt# x)++"Word# -> Integer -> Int64#"+  forall x. integerToInt64# (integerFromWord# x) = word64ToInt64# (wordToWord64# x)++"Word64# -> Integer -> Int#"+  forall x. integerToInt# (integerFromWord64# x) = word2Int# (word64ToWord# x)++#-}
src/GHC/Num/Natural.hs view
@@ -72,6 +72,7 @@  -- | Create a Natural from a BigNat# (respect the invariants) naturalFromBigNat# :: BigNat# -> Natural+{-# NOINLINE naturalFromBigNat# #-} naturalFromBigNat# x = case bigNatSize# x of    0# -> naturalZero    1# -> NS (bigNatIndex# x 0#)@@ -79,6 +80,7 @@  -- | Convert a Natural into a BigNat# naturalToBigNat# :: Natural -> BigNat#+{-# NOINLINE naturalToBigNat# #-} naturalToBigNat# (NS w)  = bigNatFromWord# w naturalToBigNat# (NB bn) = bn @@ -112,7 +114,6 @@  -- | Convert a Natural into a Word# clamping to (maxBound :: Word#). naturalToWordClamp# :: Natural -> Word#-{-# NOINLINE naturalToWordClamp #-} naturalToWordClamp# (NS x) = x naturalToWordClamp# (NB _) = WORD_MAXBOUND## @@ -132,24 +133,14 @@ naturalEncodeDouble# (NS w) e  = wordEncodeDouble# w e naturalEncodeDouble# (NB b) e  = bigNatEncodeDouble# b e --- | Encode a Natural (mantissa) into a Double#-naturalToDouble# :: Natural -> Double#-naturalToDouble# !n = naturalEncodeDouble# n 0#---- | Encode a Natural (mantissa) into a Float#-naturalToFloat# :: Natural -> Float#-naturalToFloat# !i = naturalEncodeFloat# i 0#- -- | Encode (# Natural mantissa, Int# exponent #) into a Float# -- -- TODO: Not sure if it's worth to write 'Float' optimized versions here naturalEncodeFloat# :: Natural -> Int# -> Float#-naturalEncodeFloat# !m 0# = double2Float# (naturalToDouble# m) naturalEncodeFloat# !m e  = double2Float# (naturalEncodeDouble# m e)  -- | Equality test for Natural naturalEq# :: Natural -> Natural -> Bool#-{-# NOINLINE naturalEq# #-} naturalEq# (NS x) (NS y) = x `eqWord#` y naturalEq# (NB x) (NB y) = bigNatEq# x y naturalEq# _      _      = 0#@@ -160,7 +151,6 @@  -- | Inequality test for Natural naturalNe# :: Natural -> Natural -> Bool#-{-# NOINLINE naturalNe# #-} naturalNe# (NS x) (NS y) = x `neWord#` y naturalNe# (NB x) (NB y) = bigNatNe# x y naturalNe# _      _      = 1#@@ -171,7 +161,6 @@  -- | Greater or equal test for Natural naturalGe# :: Natural -> Natural -> Bool#-{-# NOINLINE naturalGe# #-} naturalGe# (NS x) (NS y) = x `geWord#` y naturalGe# (NS _) (NB _) = 0# naturalGe# (NB _) (NS _) = 1#@@ -183,7 +172,6 @@  -- | Lower or equal test for Natural naturalLe# :: Natural -> Natural -> Bool#-{-# NOINLINE naturalLe# #-} naturalLe# (NS x) (NS y) = x `leWord#` y naturalLe# (NS _) (NB _) = 1# naturalLe# (NB _) (NS _) = 0#@@ -196,7 +184,6 @@  -- | Greater test for Natural naturalGt# :: Natural -> Natural -> Bool#-{-# NOINLINE naturalGt# #-} naturalGt# (NS x) (NS y) = x `gtWord#` y naturalGt# (NS _) (NB _) = 0# naturalGt# (NB _) (NS _) = 1#@@ -208,7 +195,6 @@  -- | Lower test for Natural naturalLt# :: Natural -> Natural -> Bool#-{-# NOINLINE naturalLt# #-} naturalLt# (NS x) (NS y) = x `ltWord#` y naturalLt# (NS _) (NB _) = 1# naturalLt# (NB _) (NS _) = 0#@@ -220,7 +206,6 @@  -- | Compare two Natural naturalCompare :: Natural -> Natural -> Ordering-{-# NOINLINE naturalCompare #-} naturalCompare (NS x) (NS y) = cmpW# x y naturalCompare (NB x) (NB y) = bigNatCompare x y naturalCompare (NS _) (NB _) = LT@@ -272,17 +257,17 @@       (# l,c  #) -> NB (bigNatFromWord2# (int2Word# c) l)  -- | Sub two naturals-naturalSub :: Natural -> Natural -> (# Void# | Natural #)+naturalSub :: Natural -> Natural -> (# (# #) | Natural #) {-# NOINLINE naturalSub #-}-naturalSub (NS _) (NB _) = (# void# | #)+naturalSub (NS _) (NB _) = (# (# #) | #) naturalSub (NB x) (NS y) = (# | naturalFromBigNat# (bigNatSubWordUnsafe# x y) #) naturalSub (NS x) (NS y) =    case subWordC# x y of       (# l,0# #) -> (#       | NS l #)-      (# _,_  #) -> (# void# |      #)+      (# _,_  #) -> (# (# #) |      #) naturalSub (NB x) (NB y) =    case bigNatSub x y of-      (# (# #) |    #) -> (# void# | #)+      (# (# #) |    #) -> (# (# #) | #)       (#       | z  #) -> (#       | naturalFromBigNat# z #)  -- | Sub two naturals@@ -339,13 +324,11 @@  -- | Signum for Natural naturalSignum :: Natural -> Natural-{-# NOINLINE naturalSignum #-} naturalSignum (NS 0##) = NS 0## naturalSignum _        = NS 1##  -- | Negate for Natural naturalNegate :: Natural -> Natural-{-# NOINLINE naturalNegate #-} naturalNegate (NS 0##) = NS 0## naturalNegate _        = raiseUnderflow @@ -438,6 +421,39 @@ naturalBit :: Word -> Natural naturalBit (W# i) = naturalBit# i +-- | @since 1.3+naturalSetBit# :: Natural -> Word# -> Natural+naturalSetBit# (NS n) i+  | isTrue# (i `ltWord#` WORD_SIZE_IN_BITS##) = NS (n `or#` (1## `uncheckedShiftL#` word2Int# i))+  | True                                      = NB (bigNatSetBit# (bigNatFromWord# n) i)+naturalSetBit# (NB n) i                       = NB (bigNatSetBit# n i)++-- | @since 1.3+naturalSetBit :: Natural -> Word -> Natural+naturalSetBit !n (W# i) = naturalSetBit# n i++-- | @since 1.3+naturalClearBit# :: Natural -> Word# -> Natural+naturalClearBit# x@(NS n) i+  | isTrue# (i `ltWord#` WORD_SIZE_IN_BITS##) = NS (n `and#` not# (1## `uncheckedShiftL#` word2Int# i))+  | True                                      = x+naturalClearBit# (NB n) i                     = naturalFromBigNat# (bigNatClearBit# n i)++-- | @since 1.3+naturalClearBit :: Natural -> Word -> Natural+naturalClearBit !n (W# i) = naturalClearBit# n i++-- | @since 1.3+naturalComplementBit# :: Natural -> Word# -> Natural+naturalComplementBit# (NS n) i+  | isTrue# (i `ltWord#` WORD_SIZE_IN_BITS##) = NS (n `xor#` (1## `uncheckedShiftL#` word2Int# i))+  | True                                      = NB (bigNatSetBit# (bigNatFromWord# n) i)+naturalComplementBit# (NB n) i                = naturalFromBigNat# (bigNatComplementBit# n i)++-- | @since 1.3+naturalComplementBit :: Natural -> Word -> Natural+naturalComplementBit !n (W# i) = naturalComplementBit# n i+ -- | Compute greatest common divisor. naturalGcd :: Natural -> Natural -> Natural {-# NOINLINE naturalGcd #-}@@ -527,7 +543,6 @@ -- byte first (big-endian) if @1#@ or least significant byte first -- (little-endian) if @0#@. naturalToAddr# :: Natural -> Addr# -> Bool# -> State# s -> (# State# s, Word# #)-{-# NOINLINE naturalToAddr# #-} naturalToAddr# (NS i) = wordToAddr# i naturalToAddr# (NB n) = bigNatToAddr# n @@ -552,7 +567,6 @@ -- -- Null higher limbs are automatically trimed. naturalFromAddr# :: Word# -> Addr# -> Bool# -> State# s -> (# State# s, Natural #)-{-# NOINLINE naturalFromAddr# #-} naturalFromAddr# sz addr e s =    case bigNatFromAddr# sz addr e s of       (# s', n #) -> (# s', naturalFromBigNat# n #)@@ -577,7 +591,6 @@ -- byte first (big-endian) if @1#@ or least significant byte first -- (little-endian) if @0#@. naturalToMutableByteArray# :: Natural -> MutableByteArray# s -> Word# -> Bool# -> State# s -> (# State# s, Word# #)-{-# NOINLINE naturalToMutableByteArray# #-} naturalToMutableByteArray# (NS w) = wordToMutableByteArray# w naturalToMutableByteArray# (NB a) = bigNatToMutableByteArray# a @@ -591,6 +604,17 @@ -- -- Null higher limbs are automatically trimed. naturalFromByteArray# :: Word# -> ByteArray# -> Word# -> Bool# -> State# s -> (# State# s, Natural #)-{-# NOINLINE naturalFromByteArray# #-} naturalFromByteArray# sz ba off e s = case bigNatFromByteArray# sz ba off e s of    (# s', a #) -> (# s', naturalFromBigNat# a #)++++-- See Note [Optimising conversions between numeric types]+-- in GHC.Num.Integer+{-# RULES+"Word# -> Natural -> Word#"+  forall x. naturalToWord# (NS x) = x++"BigNat# -> Natural -> BigNat#"+  forall x. naturalToBigNat# (naturalFromBigNat# x) = x+#-}
src/GHC/Num/Natural.hs-boot view
@@ -10,7 +10,7 @@  data Natural    = NS !Word#-   | NB !BigNat+   | NB !BigNat#  naturalToWord# :: Natural -> Word# naturalFromWord# :: Word# -> Natural
src/GHC/Num/Primitives.hs view
@@ -247,7 +247,7 @@ wordLogBase# :: Word# -> Word# -> Word# wordLogBase# base a    | isTrue# (base `leWord#` 1##)-   = unexpectedValue_Word# void#+   = unexpectedValue_Word# (# #)     | 2## <- base    = wordLog2# a@@ -334,7 +334,7 @@          = (# s, int2Word# c #)           | True-         = case writeWord8OffAddr# addr c (w `and#` 0xFF##) s of+         = case writeWord8OffAddr# addr c (wordToWord8# w) s of             s' -> go (w `uncheckedShiftRL#` 8#) (c +# 1#) s'  -- | Write a Word to @/addr/@ in base-256 big-endian representation and@@ -349,7 +349,7 @@       = (# s, int2Word# c #)        | True-      , w' <- (w `uncheckedShiftRL#` (sh -# 8#)) `and#` 0xFF##+      , w' <- wordToWord8# (w `uncheckedShiftRL#` (sh -# 8#))       = case writeWord8OffAddr# addr c w' s of          s' -> go (c +# 1#) (sh -# 8#) s' @@ -386,7 +386,7 @@           | True          = case readWord8OffAddr# addr c s of-            (# s', b #) -> go (w `or#` (b `uncheckedShiftL#` (c `uncheckedIShiftL#` 3#)))+            (# s', b #) -> go (w `or#` (word8ToWord# b `uncheckedShiftL#` (c `uncheckedIShiftL#` 3#)))                               (c +# 1#)                               s' @@ -412,7 +412,7 @@           | True          = case readWord8OffAddr# addr c s of-            (# s', b #) -> go ((w `uncheckedShiftL#` 8#) `or#` b)+            (# s', b #) -> go ((w `uncheckedShiftL#` 8#) `or#` word8ToWord# b)                               (c +# 1#)                               s' @@ -459,7 +459,7 @@          = (# s, int2Word# c #)           | True-         = case writeWord8Array# mba (word2Int# off +# c) (w `and#` 0xFF##) s of+         = case writeWord8Array# mba (word2Int# off +# c) (wordToWord8# w) s of             s' -> go (w `uncheckedShiftRL#` 8#) (c +# 1#) s'  -- | Write a Word to @/MutableByteArray/@ in base-256 big-endian representation and@@ -476,7 +476,7 @@       = (# s, int2Word# c #)        | True-      , w' <- (w `uncheckedShiftRL#` (sh -# 8#)) `and#` 0xFF##+      , w' <- wordToWord8# (w `uncheckedShiftRL#` (sh -# 8#))       = case writeWord8Array# mba (word2Int# off +# c) w' s of          s' -> go (c +# 1#) (sh -# 8#) s' @@ -531,7 +531,7 @@                 | True                = case indexWord8Array# ba (word2Int# off +# c) of-                  b -> go (w `or#` (b `uncheckedShiftL#` (c `uncheckedIShiftL#` 3#)))+                  b -> go (w `or#` (word8ToWord# b `uncheckedShiftL#` (c `uncheckedIShiftL#` 3#)))                           (c +# 1#)            in go 0## 0# @@ -557,7 +557,7 @@           | True          = case indexWord8Array# ba (word2Int# off +# c) of-            b -> go ((w `uncheckedShiftL#` 8#) `or#` b) (c +# 1#)+            b -> go ((w `uncheckedShiftL#` 8#) `or#` word8ToWord# b) (c +# 1#)  -- | Read a Word from @/ByteArray/@ in base-256 representation. --@@ -598,7 +598,6 @@  -- Note [ghc-bignum exceptions] -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~--- -- `ghc-bignum` package can't depend on `base` package (it would create a cyclic -- dependency). Hence it can't import "Control.Exception" and throw exceptions -- the usual way. Instead it uses some wired-in functions from `ghc-prim` which@@ -616,19 +615,19 @@ --                          -- 0## is a dummy value (unreachable code) -- -unexpectedValue_Int# :: Void# -> Int#+unexpectedValue_Int# :: (# #) -> Int# unexpectedValue_Int# _ = case unexpectedValue of    !_ -> 0# -- see Note [ghc-bignum exceptions] -unexpectedValue_Word# :: Void# -> Word#+unexpectedValue_Word# :: (# #) -> Word# unexpectedValue_Word# _ = case unexpectedValue of    !_ -> 0## -- see Note [ghc-bignum exceptions] -raiseDivZero_Word# :: Void# -> Word#+raiseDivZero_Word# :: (# #) -> Word# raiseDivZero_Word# _ = case raiseDivZero of    !_ -> 0## -- see Note [ghc-bignum exceptions] -raiseUnderflow_Word# :: Void# -> Word#+raiseUnderflow_Word# :: (# #) -> Word# raiseUnderflow_Word# _ = case raiseUnderflow of    !_ -> 0## -- see Note [ghc-bignum exceptions] 
src/GHC/Num/WordArray.hs view
@@ -79,17 +79,17 @@  -- | Create a new WordArray# of the given size (*in Word#*), apply the action to -- it, trim its most significant zeroes, then return it frozen-withNewWordArrayTrimed#+withNewWordArrayTrimmed#    :: Int#  -- ^ Size in Word    -> (MutableWordArray# RealWorld -> State# RealWorld -> State# RealWorld)    -> WordArray#-withNewWordArrayTrimed# sz act = withNewWordArray# sz \mwa s ->+withNewWordArrayTrimmed# sz act = withNewWordArray# sz \mwa s ->    case act mwa s of       s' -> mwaTrimZeroes# mwa s'  -- | Create two new WordArray# of the given sizes (*in Word#*), apply the action -- to them, trim their most significant zeroes, then return them frozen-withNewWordArray2Trimed#+withNewWordArray2Trimmed#    :: Int#  -- ^ Size in Word    -> Int#  -- ^ Ditto    -> (MutableWordArray# RealWorld@@ -97,7 +97,7 @@       -> State# RealWorld       -> State# RealWorld)    -> (# WordArray#, WordArray# #)-withNewWordArray2Trimed# sz1 sz2 act = withNewWordArray2# sz1 sz2 \mwa1 mwa2 s ->+withNewWordArray2Trimmed# sz1 sz2 act = withNewWordArray2# sz1 sz2 \mwa1 mwa2 s ->    case act mwa1 mwa2 s of       s' -> case mwaTrimZeroes# mwa1 s' of          s'' -> mwaTrimZeroes# mwa2 s''@@ -105,11 +105,11 @@ -- | Create a new WordArray# of the given size (*in Word#*), apply the action to -- it. If the action returns true#, trim its most significant zeroes, then -- return it frozen. Otherwise, return ().-withNewWordArrayTrimedMaybe#+withNewWordArrayTrimmedMaybe#    :: Int#  -- ^ Size in Word    -> (MutableWordArray# RealWorld -> State# RealWorld -> (# State# RealWorld, Bool# #))    -> (# (# #) | WordArray# #)-withNewWordArrayTrimedMaybe# sz act = case runRW# io of (# _, a #) -> a+withNewWordArrayTrimmedMaybe# sz act = case runRW# io of (# _, a #) -> a    where       io s =          case newWordArray# sz s of