
2011-01-17 Sebastian Pop <sebastian.pop@amd.com> toplev/ * MAINTAINERS (linear loop transforms): Removed. toplev/gcc/ * Makefile.in (LAMBDA_H): Removed. (TREE_DATA_REF_H): Remove dependence on LAMBDA_H. (OBJS-common): Remove dependence on lambda-code.o, lambda-mat.o, lambda-trans.o, and tree-loop-linear.o. (lto-symtab.o): Remove dependence on LAMBDA_H. (tree-loop-linear.o): Remove rule. (lambda-mat.o): Same. (lambda-trans.o): Same. (lambda-code.o): Same. (tree-vect-loop.o): Add missing dependence on TREE_DATA_REF_H. (tree-vect-slp.o): Same. * hwint.h (gcd): Moved here. (least_common_multiple): Same. * lambda-code.c: Removed. * lambda-mat.c: Removed. * lambda-trans.c: Removed. * lambda.h: Removed. * tree-loop-linear.c: Removed. * lto-symtab.c: Do not include lambda.h. * omega.c (gcd): Removed. * passes.c (init_optimization_passes): Remove pass_linear_transform. * tree-data-ref.c (print_lambda_vector): Moved here. (lambda_vector_copy): Same. (lambda_matrix_copy): Same. (lambda_matrix_id): Same. (lambda_vector_first_nz): Same. (lambda_matrix_row_add): Same. (lambda_matrix_row_exchange): Same. (lambda_vector_mult_const): Same. (lambda_vector_negate): Same. (lambda_matrix_row_negate): Same. (lambda_vector_equal): Same. (lambda_matrix_right_hermite): Same. * tree-data-ref.h: Do not include lambda.h. (lambda_vector): Moved here. (lambda_matrix): Same. (dependence_level): Same. (lambda_transform_legal_p): Removed declaration. (lambda_collect_parameters): Same. (lambda_compute_access_matrices): Same. (lambda_vector_gcd): Same. (lambda_vector_new): Same. (lambda_vector_clear): Same. (lambda_vector_lexico_pos): Same. (lambda_vector_zerop): Same. (lambda_matrix_new): Same. * tree-flow.h (least_common_multiple): Removed declaration. * tree-parloops.c (lambda_trans_matrix): Moved here. (LTM_MATRIX): Same. (LTM_ROWSIZE): Same. (LTM_COLSIZE): Same. (LTM_DENOMINATOR): Same. (lambda_trans_matrix_new): Same. (lambda_matrix_vector_mult): Same. (lambda_transform_legal_p): Same. * tree-pass.h (pass_linear_transform): Removed declaration. * tree-ssa-loop.c (tree_linear_transform): Removed. (gate_tree_linear_transform): Removed. (pass_linear_transform): Removed. (gate_graphite_transforms): Make flag_tree_loop_linear an alias of flag_loop_interchange. toplev/gcc/testsuite/ * gfortran.dg/graphite/interchange-4.f: New. * gfortran.dg/graphite/interchange-5.f: New. * gcc.dg/tree-ssa/ltrans-1.c: Removed. * gcc.dg/tree-ssa/ltrans-2.c: Removed. * gcc.dg/tree-ssa/ltrans-3.c: Removed. * gcc.dg/tree-ssa/ltrans-4.c: Removed. * gcc.dg/tree-ssa/ltrans-5.c: Removed. * gcc.dg/tree-ssa/ltrans-6.c: Removed. * gcc.dg/tree-ssa/ltrans-8.c: Removed. * gfortran.dg/ltrans-7.f90: Removed. * gcc.dg/tree-ssa/data-dep-1.c: Removed. * gcc.dg/pr18792.c: -> gcc.dg/graphite/pr18792.c * gcc.dg/pr19910.c: -> gcc.dg/graphite/pr19910.c * gcc.dg/tree-ssa/20041110-1.c: -> gcc.dg/graphite/pr20041110-1.c * gcc.dg/tree-ssa/pr20256.c: -> gcc.dg/graphite/pr20256.c * gcc.dg/pr23625.c: -> gcc.dg/graphite/pr23625.c * gcc.dg/tree-ssa/pr23820.c: -> gcc.dg/graphite/pr23820.c * gcc.dg/tree-ssa/pr24309.c: -> gcc.dg/graphite/pr24309.c * gcc.dg/tree-ssa/pr26435.c: -> gcc.dg/graphite/pr26435.c * gcc.dg/pr29330.c: -> gcc.dg/graphite/pr29330.c * gcc.dg/pr29581-1.c: -> gcc.dg/graphite/pr29581-1.c * gcc.dg/pr29581-2.c: -> gcc.dg/graphite/pr29581-2.c * gcc.dg/pr29581-3.c: -> gcc.dg/graphite/pr29581-3.c * gcc.dg/pr29581-4.c: -> gcc.dg/graphite/pr29581-4.c * gcc.dg/tree-ssa/loop-27.c: -> gcc.dg/graphite/pr30565.c * gcc.dg/tree-ssa/pr31183.c: -> gcc.dg/graphite/pr31183.c * gcc.dg/tree-ssa/pr33576.c: -> gcc.dg/graphite/pr33576.c * gcc.dg/tree-ssa/pr33766.c: -> gcc.dg/graphite/pr33766.c * gcc.dg/pr34016.c: -> gcc.dg/graphite/pr34016.c * gcc.dg/tree-ssa/pr34017.c: -> gcc.dg/graphite/pr34017.c * gcc.dg/tree-ssa/pr34123.c: -> gcc.dg/graphite/pr34123.c * gcc.dg/tree-ssa/pr36287.c: -> gcc.dg/graphite/pr36287.c * gcc.dg/tree-ssa/pr37686.c: -> gcc.dg/graphite/pr37686.c * gcc.dg/pr42917.c: -> gcc.dg/graphite/pr42917.c * gfortran.dg/loop_nest_1.f90: -> gfortran.dg/graphite/pr29290.f90 * gfortran.dg/pr29581.f90: -> gfortran.dg/graphite/pr29581.f90 * gfortran.dg/pr36286.f90: -> gfortran.dg/graphite/pr36286.f90 * gfortran.dg/pr36922.f: -> gfortran.dg/graphite/pr36922.f * gfortran.dg/pr39516.f: -> gfortran.dg/graphite/pr39516.f From-SVN: r169251
260 lines
8.2 KiB
C
260 lines
8.2 KiB
C
/* HOST_WIDE_INT definitions for the GNU compiler.
|
|
Copyright (C) 1998, 2002, 2004, 2008, 2009, 2010
|
|
Free Software Foundation, Inc.
|
|
|
|
This file is part of GCC.
|
|
|
|
Provide definitions for macros which depend on HOST_BITS_PER_INT
|
|
and HOST_BITS_PER_LONG. */
|
|
|
|
#ifndef GCC_HWINT_H
|
|
#define GCC_HWINT_H
|
|
|
|
/* This describes the machine the compiler is hosted on. */
|
|
#define HOST_BITS_PER_CHAR CHAR_BIT
|
|
#define HOST_BITS_PER_SHORT (CHAR_BIT * SIZEOF_SHORT)
|
|
#define HOST_BITS_PER_INT (CHAR_BIT * SIZEOF_INT)
|
|
#define HOST_BITS_PER_LONG (CHAR_BIT * SIZEOF_LONG)
|
|
|
|
/* The string that should be inserted into a printf style format to
|
|
indicate a "long" operand. */
|
|
#ifndef HOST_LONG_FORMAT
|
|
#define HOST_LONG_FORMAT "l"
|
|
#endif
|
|
|
|
/* The string that should be inserted into a printf style format to
|
|
indicate a "long long" operand. */
|
|
#ifndef HOST_LONG_LONG_FORMAT
|
|
#define HOST_LONG_LONG_FORMAT "ll"
|
|
#endif
|
|
|
|
/* If HAVE_LONG_LONG and SIZEOF_LONG_LONG aren't defined, but
|
|
GCC_VERSION >= 3000, assume this is the second or later stage of a
|
|
bootstrap, we do have long long, and it's 64 bits. (This is
|
|
required by C99; we do have some ports that violate that assumption
|
|
but they're all cross-compile-only.) Just in case, force a
|
|
constraint violation if that assumption is incorrect. */
|
|
#if !defined HAVE_LONG_LONG
|
|
# if GCC_VERSION >= 3000
|
|
# define HAVE_LONG_LONG 1
|
|
# define SIZEOF_LONG_LONG 8
|
|
extern char sizeof_long_long_must_be_8[sizeof(long long) == 8 ? 1 : -1];
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef HAVE_LONG_LONG
|
|
# define HOST_BITS_PER_LONGLONG (CHAR_BIT * SIZEOF_LONG_LONG)
|
|
#endif
|
|
#ifdef HAVE___INT64
|
|
# define HOST_BITS_PER___INT64 (CHAR_BIT * SIZEOF___INT64)
|
|
#endif
|
|
|
|
/* Set HOST_WIDE_INT. This should be the widest efficient host
|
|
integer type. It can be 32 or 64 bits, except that if we are
|
|
targeting a machine with 64-bit size_t then it has to be 64 bits.
|
|
|
|
With a sane ABI, 'long' is the largest efficient host integer type.
|
|
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
|
|
#else
|
|
# if HOST_BITS_PER_LONGLONG >= 64
|
|
# define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONGLONG
|
|
# define HOST_WIDE_INT long long
|
|
# else
|
|
# if HOST_BITS_PER___INT64 >= 64
|
|
# define HOST_BITS_PER_WIDE_INT HOST_BITS_PER___INT64
|
|
# define HOST_WIDE_INT __int64
|
|
# else
|
|
#error "Unable to find a suitable type for HOST_WIDE_INT"
|
|
# endif
|
|
# endif
|
|
#endif
|
|
|
|
/* Various printf format strings for HOST_WIDE_INT. */
|
|
|
|
#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
|
|
# define HOST_WIDE_INT_PRINT HOST_LONG_FORMAT
|
|
# define HOST_WIDE_INT_PRINT_C "L"
|
|
/* 'long' might be 32 or 64 bits, and the number of leading zeroes
|
|
must be tweaked accordingly. */
|
|
# if HOST_BITS_PER_WIDE_INT == 64
|
|
# define HOST_WIDE_INT_PRINT_DOUBLE_HEX \
|
|
"0x%" HOST_LONG_FORMAT "x%016" HOST_LONG_FORMAT "x"
|
|
# else
|
|
# define HOST_WIDE_INT_PRINT_DOUBLE_HEX \
|
|
"0x%" HOST_LONG_FORMAT "x%08" HOST_LONG_FORMAT "x"
|
|
# endif
|
|
#else
|
|
# define HOST_WIDE_INT_PRINT HOST_LONG_LONG_FORMAT
|
|
# define HOST_WIDE_INT_PRINT_C "LL"
|
|
/* We can assume that 'long long' is at least 64 bits. */
|
|
# define HOST_WIDE_INT_PRINT_DOUBLE_HEX \
|
|
"0x%" HOST_LONG_LONG_FORMAT "x%016" HOST_LONG_LONG_FORMAT "x"
|
|
#endif /* HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG */
|
|
|
|
#define HOST_WIDE_INT_PRINT_DEC "%" HOST_WIDE_INT_PRINT "d"
|
|
#define HOST_WIDE_INT_PRINT_DEC_C HOST_WIDE_INT_PRINT_DEC HOST_WIDE_INT_PRINT_C
|
|
#define HOST_WIDE_INT_PRINT_UNSIGNED "%" HOST_WIDE_INT_PRINT "u"
|
|
#define HOST_WIDE_INT_PRINT_HEX "%#" HOST_WIDE_INT_PRINT "x"
|
|
|
|
/* Set HOST_WIDEST_INT. This is a 64-bit type unless the compiler
|
|
in use has no 64-bit type at all; in that case it's 32 bits. */
|
|
|
|
#if HOST_BITS_PER_WIDE_INT >= 64 \
|
|
|| (HOST_BITS_PER_LONGLONG < 64 && HOST_BITS_PER___INT64 < 64)
|
|
# define HOST_WIDEST_INT HOST_WIDE_INT
|
|
# define HOST_BITS_PER_WIDEST_INT HOST_BITS_PER_WIDE_INT
|
|
# define HOST_WIDEST_INT_PRINT HOST_WIDE_INT_PRINT
|
|
# define HOST_WIDEST_INT_PRINT_DEC HOST_WIDE_INT_PRINT_DEC
|
|
# define HOST_WIDEST_INT_PRINT_DEC_C HOST_WIDE_INT_PRINT_DEC_C
|
|
# define HOST_WIDEST_INT_PRINT_UNSIGNED HOST_WIDE_INT_PRINT_UNSIGNED
|
|
# define HOST_WIDEST_INT_PRINT_HEX HOST_WIDE_INT_PRINT_HEX
|
|
# define HOST_WIDEST_INT_PRINT_DOUBLE_HEX HOST_WIDE_INT_PRINT_DOUBLE_HEX
|
|
#else
|
|
# if HOST_BITS_PER_LONGLONG >= 64
|
|
# define HOST_BITS_PER_WIDEST_INT HOST_BITS_PER_LONGLONG
|
|
# define HOST_WIDEST_INT long long
|
|
# else
|
|
# if HOST_BITS_PER___INT64 >= 64
|
|
# define HOST_BITS_PER_WIDEST_INT HOST_BITS_PER___INT64
|
|
# define HOST_WIDEST_INT __int64
|
|
# else
|
|
#error "This line should be impossible to reach"
|
|
# endif
|
|
# endif
|
|
# define HOST_WIDEST_INT_PRINT HOST_LONG_LONG_FORMAT
|
|
# define HOST_WIDEST_INT_PRINT_DEC "%" HOST_LONG_LONG_FORMAT "d"
|
|
# define HOST_WIDEST_INT_PRINT_DEC_C "%" HOST_LONG_LONG_FORMAT "dLL"
|
|
# define HOST_WIDEST_INT_PRINT_UNSIGNED "%" HOST_LONG_LONG_FORMAT "u"
|
|
# define HOST_WIDEST_INT_PRINT_HEX "%#" HOST_LONG_LONG_FORMAT "x"
|
|
# define HOST_WIDEST_INT_PRINT_DOUBLE_HEX \
|
|
"0x%" HOST_LONG_LONG_FORMAT "x%016" HOST_LONG_LONG_FORMAT "x"
|
|
#endif
|
|
|
|
/* Define HOST_WIDEST_FAST_INT to the widest integer type supported
|
|
efficiently in hardware. (That is, the widest integer type that fits
|
|
in a hardware register.) Normally this is "long" but on some hosts it
|
|
should be "long long" or "__int64". This is no convenient way to
|
|
autodetect this, so such systems must set a flag in config.host; see there
|
|
for details. */
|
|
|
|
#ifdef USE_LONG_LONG_FOR_WIDEST_FAST_INT
|
|
# ifdef HAVE_LONG_LONG
|
|
# define HOST_WIDEST_FAST_INT long long
|
|
# define HOST_BITS_PER_WIDEST_FAST_INT HOST_BITS_PER_LONGLONG
|
|
# elif defined (HAVE___INT64)
|
|
# define HOST_WIDEST_FAST_INT __int64
|
|
# define HOST_BITS_PER_WIDEST_FAST_INT HOST_BITS_PER___INT64
|
|
# else
|
|
# error "Your host said it wanted to use long long or __int64 but neither"
|
|
# error "exist"
|
|
# endif
|
|
#else
|
|
# define HOST_WIDEST_FAST_INT long
|
|
# define HOST_BITS_PER_WIDEST_FAST_INT HOST_BITS_PER_LONG
|
|
#endif
|
|
|
|
/* Inline functions operating on HOST_WIDE_INT. */
|
|
#if GCC_VERSION < 3004
|
|
|
|
extern int clz_hwi (unsigned HOST_WIDE_INT x);
|
|
extern int ctz_hwi (unsigned HOST_WIDE_INT x);
|
|
extern int ffs_hwi (unsigned HOST_WIDE_INT x);
|
|
|
|
/* Return log2, or -1 if not exact. */
|
|
extern int exact_log2 (unsigned HOST_WIDE_INT);
|
|
|
|
/* Return floor of log2, with -1 for zero. */
|
|
extern int floor_log2 (unsigned HOST_WIDE_INT);
|
|
|
|
#else /* GCC_VERSION >= 3004 */
|
|
|
|
/* For convenience, define 0 -> word_size. */
|
|
static inline int
|
|
clz_hwi (unsigned HOST_WIDE_INT x)
|
|
{
|
|
if (x == 0)
|
|
return HOST_BITS_PER_WIDE_INT;
|
|
# if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
|
|
return __builtin_clzl (x);
|
|
# elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
|
|
return __builtin_clzll (x);
|
|
# else
|
|
return __builtin_clz (x);
|
|
# endif
|
|
}
|
|
|
|
static inline int
|
|
ctz_hwi (unsigned HOST_WIDE_INT x)
|
|
{
|
|
if (x == 0)
|
|
return HOST_BITS_PER_WIDE_INT;
|
|
# if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
|
|
return __builtin_ctzl (x);
|
|
# elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
|
|
return __builtin_ctzll (x);
|
|
# else
|
|
return __builtin_ctz (x);
|
|
# endif
|
|
}
|
|
|
|
static inline int
|
|
ffs_hwi (unsigned HOST_WIDE_INT x)
|
|
{
|
|
# if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
|
|
return __builtin_ffsl (x);
|
|
# elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
|
|
return __builtin_ffsll (x);
|
|
# else
|
|
return __builtin_ffs (x);
|
|
# endif
|
|
}
|
|
|
|
static inline int
|
|
floor_log2 (unsigned HOST_WIDE_INT x)
|
|
{
|
|
return HOST_BITS_PER_WIDE_INT - 1 - clz_hwi (x);
|
|
}
|
|
|
|
static inline int
|
|
exact_log2 (unsigned HOST_WIDE_INT x)
|
|
{
|
|
return x == (x & -x) && x ? ctz_hwi (x) : -1;
|
|
}
|
|
|
|
#endif /* GCC_VERSION >= 3004 */
|
|
|
|
/* Compute the greatest common divisor of two numbers using
|
|
Euclid's algorithm. */
|
|
|
|
static inline int
|
|
gcd (int a, int b)
|
|
{
|
|
int x, y, z;
|
|
|
|
x = abs (a);
|
|
y = abs (b);
|
|
|
|
while (x > 0)
|
|
{
|
|
z = y % x;
|
|
y = x;
|
|
x = z;
|
|
}
|
|
|
|
return y;
|
|
}
|
|
|
|
/* Compute the least common multiple of two numbers A and B . */
|
|
|
|
static inline int
|
|
least_common_multiple (int a, int b)
|
|
{
|
|
return (abs (a) * abs (b) / gcd (a, b));
|
|
}
|
|
|
|
#endif /* ! GCC_HWINT_H */
|