This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH][1/n] Always-64bit HWI cleanups
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Cc: tromey at redhat dot com, Jakub Jelinek <jakub at redhat dot com>
- Date: Mon, 19 May 2014 15:58:35 +0200 (CEST)
- Subject: Re: [PATCH][1/n] Always-64bit HWI cleanups
- Authentication-results: sourceware.org; auth=none
- References: <alpine dot LSU dot 2 dot 11 dot 1405071217090 dot 18709 at zhemvz dot fhfr dot qr>
On Wed, 7 May 2014, Richard Biener wrote:
>
> This removes the need_64bit_hwi logic, nothing else (well, brings
> libcpp in line with gcc).
>
> Bootstrap / regtest pending on x86_64-unknown-linux-gnu.
Bootstrapped and tested on x86_64-unknown-linux-gnu, ok for trunk?
Thanks,
Richard.
> Just as I promised to send this before committing the "let's try this"
> patch (which is now said to fix wide-int fallout).
>
> Richard.
>
> 2014-05-07 Richard Biener <rguenther@suse.de>
>
> gcc/
> * config.gcc: Remove need_64bit_hwint.
> * configure.ac: Do not define NEED_64BIT_HOST_WIDE_INT.
> * hwint.h: Do not check NEED_64BIT_HOST_WIDE_INT but assume
> it to be true.
> * config.in: Regenerate.
> * configure: Likewise.
>
> libcpp/
> * configure.ac: Copy gcc logic of detecting a 64bit type.
> Remove HOST_WIDE_INT define.
> * include/cpplib.h: typedef cpp_num_part to a 64bit type,
> similar to how hwint.h does it.
> * config.in: Regenerate.
> * configure: Likewise.
>
> Index: trunk/gcc/config.gcc
> ===================================================================
> *** trunk.orig/gcc/config.gcc 2014-04-30 10:16:58.491135331 +0200
> --- trunk/gcc/config.gcc 2014-04-30 10:24:43.902103288 +0200
> ***************
> *** 164,176 ****
> # gas Set to yes or no depending on whether the target
> # system normally uses GNU as.
> #
> - # need_64bit_hwint Set to yes if HOST_WIDE_INT must be 64 bits wide
> - # for this target. This is true if this target
> - # supports "long" or "wchar_t" wider than 32 bits,
> - # or BITS_PER_WORD is wider than 32 bits.
> - # The setting made here must match the one made in
> - # other locations such as libcpp/configure.ac
> - #
> # configure_default_options
> # Set to an initializer for configure_default_options
> # in configargs.h, based on --with-cpu et cetera.
> --- 164,169 ----
> *************** gnu_ld="$gnu_ld_flag"
> *** 233,239 ****
> default_use_cxa_atexit=no
> default_gnu_indirect_function=no
> target_gtfiles=
> - need_64bit_hwint=yes
> need_64bit_isa=
> native_system_header_dir=/usr/include
> target_type_format_char='@'
> --- 226,231 ----
> *************** m32c*-*-*)
> *** 310,323 ****
> ;;
> aarch64*-*-*)
> cpu_type=aarch64
> - need_64bit_hwint=yes
> extra_headers="arm_neon.h"
> extra_objs="aarch64-builtins.o aarch-common.o"
> target_has_targetm_common=yes
> ;;
> alpha*-*-*)
> cpu_type=alpha
> - need_64bit_hwint=yes
> extra_options="${extra_options} g.opt"
> ;;
> am33_2.0-*-linux*)
> --- 302,313 ----
> *************** arm*-*-*)
> *** 333,339 ****
> target_type_format_char='%'
> c_target_objs="arm-c.o"
> cxx_target_objs="arm-c.o"
> - need_64bit_hwint=yes
> extra_options="${extra_options} arm/arm-tables.opt"
> ;;
> avr-*-*)
> --- 323,328 ----
> *************** i[34567]86-*-*)
> *** 363,369 ****
> cpu_type=i386
> c_target_objs="i386-c.o"
> cxx_target_objs="i386-c.o"
> - need_64bit_hwint=yes
> extra_options="${extra_options} fused-madd.opt"
> extra_headers="cpuid.h mmintrin.h mm3dnow.h xmmintrin.h emmintrin.h
> pmmintrin.h tmmintrin.h ammintrin.h smmintrin.h
> --- 352,357 ----
> *************** x86_64-*-*)
> *** 393,403 ****
> adxintrin.h fxsrintrin.h xsaveintrin.h xsaveoptintrin.h
> avx512cdintrin.h avx512erintrin.h avx512pfintrin.h
> shaintrin.h"
> - need_64bit_hwint=yes
> ;;
> ia64-*-*)
> extra_headers=ia64intrin.h
> - need_64bit_hwint=yes
> extra_options="${extra_options} g.opt fused-madd.opt"
> ;;
> hppa*-*-*)
> --- 381,389 ----
> *************** microblaze*-*-*)
> *** 420,426 ****
> ;;
> mips*-*-*)
> cpu_type=mips
> - need_64bit_hwint=yes
> extra_headers="loongson.h"
> extra_options="${extra_options} g.opt mips/mips-tables.opt"
> ;;
> --- 406,411 ----
> *************** picochip-*-*)
> *** 438,444 ****
> powerpc*-*-*)
> cpu_type=rs6000
> extra_headers="ppc-asm.h altivec.h spe.h ppu_intrinsics.h paired.h spu2vmx.h vec_types.h si2vmx.h htmintrin.h htmxlintrin.h"
> - need_64bit_hwint=yes
> case x$with_cpu in
> xpowerpc64|xdefault64|x6[23]0|x970|xG5|xpower[345678]|xpower6x|xrs64a|xcell|xa2|xe500mc64|xe5500|Xe6500)
> cpu_is_64bit=yes
> --- 423,428 ----
> *************** powerpc*-*-*)
> *** 447,453 ****
> extra_options="${extra_options} g.opt fused-madd.opt rs6000/rs6000-tables.opt"
> ;;
> rs6000*-*-*)
> - need_64bit_hwint=yes
> extra_options="${extra_options} g.opt fused-madd.opt rs6000/rs6000-tables.opt"
> ;;
> score*-*-*)
> --- 431,436 ----
> *************** sparc*-*-*)
> *** 459,480 ****
> c_target_objs="sparc-c.o"
> cxx_target_objs="sparc-c.o"
> extra_headers="visintrin.h"
> - need_64bit_hwint=yes
> ;;
> spu*-*-*)
> cpu_type=spu
> - need_64bit_hwint=yes
> ;;
> s390*-*-*)
> cpu_type=s390
> - need_64bit_hwint=yes
> extra_options="${extra_options} fused-madd.opt"
> extra_headers="s390intrin.h htmintrin.h htmxlintrin.h"
> ;;
> # Note the 'l'; we need to be able to match e.g. "shle" or "shl".
> sh[123456789lbe]*-*-* | sh-*-*)
> cpu_type=sh
> - need_64bit_hwint=yes
> extra_options="${extra_options} fused-madd.opt"
> extra_objs="${extra_objs} sh_treg_combine.o sh-mem.o sh_optimize_sett_clrt.o"
> ;;
> --- 442,459 ----
> *************** xtensa*-*-*)
> *** 491,501 ****
> ;;
> tilegx*-*-*)
> cpu_type=tilegx
> - need_64bit_hwint=yes
> ;;
> tilepro*-*-*)
> cpu_type=tilepro
> - need_64bit_hwint=yes
> ;;
> esac
>
> --- 470,478 ----
> *************** case ${target} in
> *** 683,689 ****
> *)
> default_use_cxa_atexit=yes;;
> esac
> - # need_64bit_hwint=yes # system compiler has this for all arch!
> use_gcc_stdint=wrap
> ;;
> *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-knetbsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu)
> --- 660,665 ----
> *************** hppa*64*-*-linux*)
> *** 1183,1189 ****
> glibc-stdint.h pa/pa-linux.h pa/pa64-regs.h pa/pa-64.h \
> pa/pa64-linux.h"
> gas=yes gnu_ld=yes
> - need_64bit_hwint=yes
> ;;
> hppa*-*-linux*)
> target_cpu_default="MASK_PA_11|MASK_NO_SPACE_REGS"
> --- 1159,1164 ----
> *************** hppa*64*-*-hpux11*)
> *** 1258,1264 ****
> esac
> extra_options="${extra_options} pa/pa-hpux.opt \
> pa/pa-hpux1010.opt pa/pa64-hpux.opt hpux11.opt"
> - need_64bit_hwint=yes
> tmake_file="t-slibgcc"
> case x${enable_threads} in
> x | xyes | xposix )
> --- 1233,1238 ----
> *************** mipstx39-*-elf* | mipstx39el-*-elf*)
> *** 2092,2098 ****
> ;;
> mmix-knuth-mmixware)
> tm_file="${tm_file} newlib-stdint.h"
> - need_64bit_hwint=yes
> use_gcc_stdint=wrap
> ;;
> mn10300-*-*)
> --- 2066,2071 ----
> Index: trunk/gcc/config.in
> ===================================================================
> *** trunk.orig/gcc/config.in 2014-04-28 11:53:47.560632455 +0200
> --- trunk/gcc/config.in 2014-04-30 10:26:38.000000000 +0200
> ***************
> *** 1729,1740 ****
> #endif
>
>
> - /* Define to 1 if HOST_WIDE_INT must be 64 bits wide (see hwint.h). */
> - #ifndef USED_FOR_TARGET
> - #undef NEED_64BIT_HOST_WIDE_INT
> - #endif
> -
> -
> /* Define to the address where bug reports for this package should be sent. */
> #ifndef USED_FOR_TARGET
> #undef PACKAGE_BUGREPORT
> --- 1729,1734 ----
> Index: trunk/gcc/configure
> ===================================================================
> *** trunk.orig/gcc/configure 2014-04-28 13:26:42.395248635 +0200
> --- trunk/gcc/configure 2014-04-30 10:26:36.287095551 +0200
> *************** else
> *** 11150,11161 ****
> done
> fi
>
> - if test x$need_64bit_hwint = xyes; then
> -
> - $as_echo "#define NEED_64BIT_HOST_WIDE_INT 1" >>confdefs.h
> -
> - fi
> -
> if test x$use_long_long_for_widest_fast_int = xyes; then
>
> $as_echo "#define USE_LONG_LONG_FOR_WIDEST_FAST_INT 1" >>confdefs.h
> --- 11150,11155 ----
> *************** else
> *** 17994,18000 ****
> lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
> lt_status=$lt_dlunknown
> cat > conftest.$ac_ext <<_LT_EOF
> ! #line 17997 "configure"
> #include "confdefs.h"
>
> #if HAVE_DLFCN_H
> --- 17988,17994 ----
> lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
> lt_status=$lt_dlunknown
> cat > conftest.$ac_ext <<_LT_EOF
> ! #line 17991 "configure"
> #include "confdefs.h"
>
> #if HAVE_DLFCN_H
> *************** else
> *** 18100,18106 ****
> lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
> lt_status=$lt_dlunknown
> cat > conftest.$ac_ext <<_LT_EOF
> ! #line 18103 "configure"
> #include "confdefs.h"
>
> #if HAVE_DLFCN_H
> --- 18094,18100 ----
> lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
> lt_status=$lt_dlunknown
> cat > conftest.$ac_ext <<_LT_EOF
> ! #line 18097 "configure"
> #include "confdefs.h"
>
> #if HAVE_DLFCN_H
> Index: trunk/gcc/configure.ac
> ===================================================================
> *** trunk.orig/gcc/configure.ac 2014-04-28 13:26:42.397248634 +0200
> --- trunk/gcc/configure.ac 2014-04-30 10:54:47.723979097 +0200
> *************** else
> *** 1372,1382 ****
> done
> fi
>
> - if test x$need_64bit_hwint = xyes; then
> - AC_DEFINE(NEED_64BIT_HOST_WIDE_INT, 1,
> - [Define to 1 if HOST_WIDE_INT must be 64 bits wide (see hwint.h).])
> - fi
> -
> if test x$use_long_long_for_widest_fast_int = xyes; then
> AC_DEFINE(USE_LONG_LONG_FOR_WIDEST_FAST_INT, 1,
> [Define to 1 if the 'long long' (or '__int64') is wider than 'long' but still
> --- 1372,1377 ----
> Index: trunk/gcc/hwint.h
> ===================================================================
> *** trunk.orig/gcc/hwint.h 2014-01-07 10:20:15.790453288 +0100
> --- trunk/gcc/hwint.h 2014-04-30 10:27:31.640091740 +0200
> *************** extern char sizeof_long_long_must_be_8[s
> *** 56,62 ****
> Thus, we use that unless we have to use 'long long' or '__int64'
> because we're targeting a 64-bit machine from a 32-bit host. */
>
> ! #if HOST_BITS_PER_LONG >= 64 || !defined NEED_64BIT_HOST_WIDE_INT
> # define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG
> # define HOST_WIDE_INT long
> # define HOST_WIDE_INT_C(X) X ## L
> --- 56,62 ----
> Thus, we use that unless we have to use 'long long' or '__int64'
> because we're targeting a 64-bit machine from a 32-bit host. */
>
> ! #if HOST_BITS_PER_LONG >= 64
> # define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG
> # define HOST_WIDE_INT long
> # define HOST_WIDE_INT_C(X) X ## L
> Index: trunk/libcpp/config.in
> ===================================================================
> *** trunk.orig/libcpp/config.in 2013-03-01 12:05:05.628540226 +0100
> --- trunk/libcpp/config.in 2014-04-30 11:09:46.000000000 +0200
> ***************
> *** 180,185 ****
> --- 180,188 ----
> /* Define to 1 if you have the <locale.h> header file. */
> #undef HAVE_LOCALE_H
>
> + /* Define to 1 if the system has the type `long long'. */
> + #undef HAVE_LONG_LONG
> +
> /* Define to 1 if you have the <memory.h> header file. */
> #undef HAVE_MEMORY_H
>
> ***************
> *** 228,236 ****
> /* Define to 1 if you have the <unistd.h> header file. */
> #undef HAVE_UNISTD_H
>
> ! /* Define to the widest efficient host integer type at least as wide as the
> ! target's size_t type. */
> ! #undef HOST_WIDE_INT
>
> /* Define as const if the declaration of iconv() needs const. */
> #undef ICONV_CONST
> --- 231,238 ----
> /* Define to 1 if you have the <unistd.h> header file. */
> #undef HAVE_UNISTD_H
>
> ! /* Define to 1 if the system has the type `__int64'. */
> ! #undef HAVE___INT64
>
> /* Define as const if the declaration of iconv() needs const. */
> #undef ICONV_CONST
> ***************
> *** 262,267 ****
> --- 264,275 ----
> /* The size of `long', as computed by sizeof. */
> #undef SIZEOF_LONG
>
> + /* The size of `long long', as computed by sizeof. */
> + #undef SIZEOF_LONG_LONG
> +
> + /* The size of `__int64', as computed by sizeof. */
> + #undef SIZEOF___INT64
> +
> /* If using the C implementation of alloca, define if you know the
> direction of stack growth for your system; otherwise it will be
> automatically deduced at runtime.
> Index: trunk/libcpp/configure
> ===================================================================
> *** trunk.orig/libcpp/configure 2014-02-24 17:40:11.060711433 +0100
> --- trunk/libcpp/configure 2014-04-30 11:09:43.683917411 +0200
> *************** _ACEOF
> *** 5566,5571 ****
> --- 5566,5657 ----
>
> fi
>
> + ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default"
> + if test "x$ac_cv_type_long_long" = x""yes; then :
> +
> + cat >>confdefs.h <<_ACEOF
> + #define HAVE_LONG_LONG 1
> + _ACEOF
> +
> + # The cast to long int works around a bug in the HP C Compiler
> + # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
> + # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
> + # This bug is HP SR number 8606223364.
> + { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
> + $as_echo_n "checking size of long long... " >&6; }
> + if test "${ac_cv_sizeof_long_long+set}" = set; then :
> + $as_echo_n "(cached) " >&6
> + else
> + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then :
> +
> + else
> + if test "$ac_cv_type_long_long" = yes; then
> + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
> + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
> + { as_fn_set_status 77
> + as_fn_error "cannot compute sizeof (long long)
> + See \`config.log' for more details." "$LINENO" 5; }; }
> + else
> + ac_cv_sizeof_long_long=0
> + fi
> + fi
> +
> + fi
> + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
> + $as_echo "$ac_cv_sizeof_long_long" >&6; }
> +
> +
> +
> + cat >>confdefs.h <<_ACEOF
> + #define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
> + _ACEOF
> +
> +
> + fi
> +
> + ac_fn_c_check_type "$LINENO" "__int64" "ac_cv_type___int64" "$ac_includes_default"
> + if test "x$ac_cv_type___int64" = x""yes; then :
> +
> + cat >>confdefs.h <<_ACEOF
> + #define HAVE___INT64 1
> + _ACEOF
> +
> + # The cast to long int works around a bug in the HP C Compiler
> + # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
> + # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
> + # This bug is HP SR number 8606223364.
> + { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of __int64" >&5
> + $as_echo_n "checking size of __int64... " >&6; }
> + if test "${ac_cv_sizeof___int64+set}" = set; then :
> + $as_echo_n "(cached) " >&6
> + else
> + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int64))" "ac_cv_sizeof___int64" "$ac_includes_default"; then :
> +
> + else
> + if test "$ac_cv_type___int64" = yes; then
> + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
> + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
> + { as_fn_set_status 77
> + as_fn_error "cannot compute sizeof (__int64)
> + See \`config.log' for more details." "$LINENO" 5; }; }
> + else
> + ac_cv_sizeof___int64=0
> + fi
> + fi
> +
> + fi
> + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof___int64" >&5
> + $as_echo "$ac_cv_sizeof___int64" >&6; }
> +
> +
> +
> + cat >>confdefs.h <<_ACEOF
> + #define SIZEOF___INT64 $ac_cv_sizeof___int64
> + _ACEOF
> +
> +
> + fi
> +
> { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5
> $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; }
> if test "${ac_cv_struct_tm+set}" = set; then :
> *************** $as_echo "#define ENABLE_CANONICAL_SYSTE
> *** 7151,7191 ****
>
> fi
>
> -
> - case $target in
> - aarch64*-*-* | \
> - alpha*-*-* | \
> - arm*-*-* | \
> - x86_64-*-* | \
> - ia64-*-* | \
> - hppa*64*-*-* | \
> - i[34567]86-*-* | x86_64-*-solaris2.1[0-9]* | \
> - mips*-*-* | \
> - mmix-*-* | \
> - powerpc*-*-* | \
> - rs6000*-*-* | \
> - s390*-*-* | \
> - sparc*-*-* | \
> - spu-*-* | \
> - sh[123456789lbe]*-*-* | sh-*-* | \
> - tilegx*-*-* | tilepro*-*-* )
> - need_64bit_hwint=yes ;;
> - *)
> - need_64bit_hwint=no ;;
> - esac
> -
> - case $need_64bit_hwint:$ac_cv_sizeof_long in
> - *:8 | no:*) host_wide_int=long ;;
> - *) host_wide_int='long long' ;;
> - esac
> -
> -
> -
> - cat >>confdefs.h <<_ACEOF
> - #define HOST_WIDE_INT $host_wide_int
> - _ACEOF
> -
> -
> case $target in
> i?86-* | x86_64-*)
> cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> --- 7237,7242 ----
> Index: trunk/libcpp/configure.ac
> ===================================================================
> *** trunk.orig/libcpp/configure.ac 2014-04-30 10:16:58.480135332 +0200
> --- trunk/libcpp/configure.ac 2014-04-30 10:56:21.677972629 +0200
> *************** AC_TYPE_SIZE_T
> *** 64,69 ****
> --- 64,71 ----
> AC_TYPE_SSIZE_T
> AC_TYPE_UINTPTR_T
> AC_CHECK_TYPE(ptrdiff_t, int)
> + AC_CHECK_TYPES([long long], [AC_CHECK_SIZEOF(long long)])
> + AC_CHECK_TYPES([__int64], [AC_CHECK_SIZEOF(__int64)])
> AC_STRUCT_TM
> AC_CHECK_SIZEOF(int)
> AC_CHECK_SIZEOF(long)
> *************** if test $enable_canonical_system_headers
> *** 180,218 ****
> 1, [Define to enable system headers canonicalization.])
> fi
>
> - m4_changequote(,)
> - case $target in
> - aarch64*-*-* | \
> - alpha*-*-* | \
> - arm*-*-* | \
> - x86_64-*-* | \
> - ia64-*-* | \
> - hppa*64*-*-* | \
> - i[34567]86-*-* | x86_64-*-solaris2.1[0-9]* | \
> - mips*-*-* | \
> - mmix-*-* | \
> - powerpc*-*-* | \
> - rs6000*-*-* | \
> - s390*-*-* | \
> - sparc*-*-* | \
> - spu-*-* | \
> - sh[123456789lbe]*-*-* | sh-*-* | \
> - tilegx*-*-* | tilepro*-*-* )
> - need_64bit_hwint=yes ;;
> - *)
> - need_64bit_hwint=yes ;;
> - esac
> -
> - case $need_64bit_hwint:$ac_cv_sizeof_long in
> - *:8 | no:*) host_wide_int=long ;;
> - *) host_wide_int='long long' ;;
> - esac
> - m4_changequote([,])
> -
> - AC_DEFINE_UNQUOTED(HOST_WIDE_INT, $host_wide_int,
> - [Define to the widest efficient host integer type at least
> - as wide as the target's size_t type.])
> -
> case $target in
> i?86-* | x86_64-*)
> AC_TRY_COMPILE([], [asm ("pcmpestri %0, %%xmm0, %%xmm1" : : "i"(0))],
> --- 182,187 ----
> Index: trunk/libcpp/include/cpplib.h
> ===================================================================
> *** trunk.orig/libcpp/include/cpplib.h 2014-01-07 10:20:27.942452756 +0100
> --- trunk/libcpp/include/cpplib.h 2014-04-30 11:09:27.230918544 +0200
> *************** extern int cpp_defined (cpp_reader *, co
> *** 819,825 ****
>
> /* A preprocessing number. Code assumes that any unused high bits of
> the double integer are set to zero. */
> ! typedef unsigned HOST_WIDE_INT cpp_num_part;
> typedef struct cpp_num cpp_num;
> struct cpp_num
> {
> --- 819,842 ----
>
> /* A preprocessing number. Code assumes that any unused high bits of
> the double integer are set to zero. */
> !
> ! /* Find a type with at least 64bit precision, mimicking hwint.h.
> ! This type has to be equal to unsigned HOST_WIDE_INT, see
> ! gcc/c-family/c-lex.c. */
> ! #if SIZEOF_LONG >= 8
> ! typedef unsigned long cpp_num_part;
> ! #else
> ! # if SIZEOF_LONG_LONG >= 8
> ! typedef unsigned long long cpp_num_part;
> ! # else
> ! # if SIZEOF___INT64 >= 8
> ! typedef unsigned __int64 cpp_num_part;
> ! # else
> ! #error "This line should be impossible to reach"
> ! # endif
> ! # endif
> ! #endif
> !
> typedef struct cpp_num cpp_num;
> struct cpp_num
> {
>