GCC Middle and Back End API Reference
double_int Struct Reference

#include <double-int.h>

Public Member Functions

double_intoperator++ ()
double_intoperator-- ()
double_intoperator*= (double_int)
double_intoperator+= (double_int)
double_intoperator-= (double_int)
double_intoperator&= (double_int)
double_intoperator^= (double_int)
double_intoperator|= (double_int)
HOST_WIDE_INT to_shwi () const
unsigned HOST_WIDE_INT to_uhwi () const
bool fits_uhwi () const
bool fits_shwi () const
bool fits_hwi (bool uns) const
int trailing_zeros () const
int popcount () const
bool multiple_of (double_int, bool, double_int *) const
double_int set_bit (unsigned) const
double_int mul_with_sign (double_int, bool unsigned_p, bool *overflow) const
double_int wide_mul_with_sign (double_int, bool unsigned_p, double_int *higher, bool *overflow) const
double_int add_with_sign (double_int, bool unsigned_p, bool *overflow) const
double_int sub_with_overflow (double_int, bool *overflow) const
double_int neg_with_overflow (bool *overflow) const
double_int operator* (double_int) const
double_int operator+ (double_int) const
double_int operator- (double_int) const
double_int operator- () const
double_int operator~ () const
double_int operator& (double_int) const
double_int operator| (double_int) const
double_int operator^ (double_int) const
double_int and_not (double_int) const
double_int lshift (HOST_WIDE_INT count) const
double_int lshift (HOST_WIDE_INT count, unsigned int prec, bool arith) const
double_int rshift (HOST_WIDE_INT count) const
double_int rshift (HOST_WIDE_INT count, unsigned int prec, bool arith) const
double_int alshift (HOST_WIDE_INT count, unsigned int prec) const
double_int arshift (HOST_WIDE_INT count, unsigned int prec) const
double_int llshift (HOST_WIDE_INT count, unsigned int prec) const
double_int lrshift (HOST_WIDE_INT count, unsigned int prec) const
double_int lrotate (HOST_WIDE_INT count, unsigned int prec) const
double_int rrotate (HOST_WIDE_INT count, unsigned int prec) const
double_int div (double_int, bool, unsigned) const
double_int sdiv (double_int, unsigned) const
double_int udiv (double_int, unsigned) const
double_int mod (double_int, bool, unsigned) const
double_int smod (double_int, unsigned) const
double_int umod (double_int, unsigned) const
double_int divmod_with_overflow (double_int, bool, unsigned, double_int *, bool *) const
double_int divmod (double_int, bool, unsigned, double_int *) const
double_int sdivmod (double_int, unsigned, double_int *) const
double_int udivmod (double_int, unsigned, double_int *) const
double_int ext (unsigned prec, bool uns) const
double_int zext (unsigned prec) const
double_int sext (unsigned prec) const
bool is_zero () const
bool is_one () const
bool is_minus_one () const
bool is_negative () const
int cmp (double_int b, bool uns) const
int ucmp (double_int b) const
int scmp (double_int b) const
bool ult (double_int b) const
bool ule (double_int b) const
bool ugt (double_int b) const
bool slt (double_int b) const
bool sle (double_int b) const
bool sgt (double_int b) const
double_int max (double_int b, bool uns)
double_int smax (double_int b)
double_int umax (double_int b)
double_int min (double_int b, bool uns)
double_int smin (double_int b)
double_int umin (double_int b)
bool operator== (double_int cst2) const
bool operator!= (double_int cst2) const

Static Public Member Functions

static double_int from_uhwi (unsigned HOST_WIDE_INT cst)
static double_int from_shwi (HOST_WIDE_INT cst)
static double_int from_pair (HOST_WIDE_INT high, unsigned HOST_WIDE_INT low)
static double_int from_buffer (const unsigned char *buffer, int len)
static double_int mask (unsigned prec)
static double_int max_value (unsigned int prec, bool uns)
static double_int min_value (unsigned int prec, bool uns)

Data Fields

unsigned HOST_WIDE_INT low
HOST_WIDE_INT high

Detailed Description

Operations with long integers. Copyright (C) 2006-2013 Free Software Foundation, Inc.

This file is part of GCC.

GCC 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, or (at your option) any later version.

GCC 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 GCC; see the file COPYING3. If not see http://www.gnu.org/licenses/. A large integer is currently represented as a pair of HOST_WIDE_INTs. It therefore represents a number with precision of 2 * HOST_BITS_PER_WIDE_INT bits (it is however possible that the internal representation will change, if numbers with greater precision are needed, so the users should not rely on it). The representation does not contain any information about signedness of the represented value, so it can be used to represent both signed and unsigned numbers. For operations where the results depend on signedness (division, comparisons), it must be specified separately. For each such operation, there are three versions of the function – double_int_op, that takes an extra UNS argument giving the signedness of the values, and double_int_sop and double_int_uop that stand for its specializations for signed and unsigned values.

You may also represent with numbers in smaller precision using double_int. You however need to use double_int_ext (that fills in the bits of the number over the prescribed precision with zeros or with the sign bit) before operations that do not perform arithmetics modulo 2^precision (comparisons, division), and possibly before storing the results, if you want to keep them in some canonical form). In general, the signedness of double_int_ext should match the signedness of the operation.

??? The components of double_int differ in signedness mostly for historical reasons (they replace an older structure used to represent numbers with precision higher than HOST_WIDE_INT). It might be less confusing to have them both signed or both unsigned.


Member Function Documentation

double_int double_int::add_with_sign ( double_int  b,
bool  unsigned_p,
bool overflow 
) const

Returns A + B. If the operation overflows according to UNSIGNED_P, *OVERFLOW is set to nonzero.

double_int double_int::alshift ( HOST_WIDE_INT  count,
unsigned int  prec 
) const

Arithmetic shift A left by COUNT places keeping only PREC bits of result. Shift right if COUNT is negative.

Referenced by simplify_const_binary_operation().

double_int double_int::and_not ( double_int  b) const
inline

Returns A & ~B.

References high, and low.

Referenced by bit_value_binop_1(), and vrp_intersect_ranges_1().

double_int double_int::arshift ( HOST_WIDE_INT  count,
unsigned int  prec 
) const

Arithmetic shift A right by COUNT places keeping only PREC bits of result. Shift left if COUNT is negative.

int double_int::cmp ( double_int  b,
bool  uns 
) const

Returns -1 if A < B, 0 if A == B and 1 if A > B. Signedness of the comparison is given by UNS.

References high, and low.

Referenced by ule().

double_int double_int::div ( double_int  b,
bool  uns,
unsigned  code 
) const

You must ensure that double_int::ext is called on the operands of the following operations, if the precision of the numbers is less than HOST_BITS_PER_DOUBLE_INT bits.

Returns A / B (computed as unsigned depending on UNS, and rounded as specified by CODE). CODE is enum tree_code in fact, but double_int.h must be included before tree.h.

Referenced by divmod_with_overflow().

double_int double_int::divmod ( double_int  b,
bool  uns,
unsigned  code,
double_int mod 
) const
double_int double_int::divmod_with_overflow ( double_int  b,
bool  uns,
unsigned  code,
double_int mod,
bool overflow 
) const

Returns A / B (computed as unsigned depending on UNS, and rounded as specified by CODE). CODE is enum tree_code in fact, but double_int.h must be included before tree.h. The remainder after the division is stored to MOD.

References div().

double_int double_int::ext ( unsigned  prec,
bool  uns 
) const

Precision control functions.

Clears the bits of CST over the precision PREC. If UNS is false, the bits outside of the precision are set to the sign bit (i.e., the PREC-th one), otherwise they are set to zero.

This corresponds to returning the value represented by PREC lowermost bits of CST, with the given signedness.

Referenced by bit_value_binop_1(), and double_int_to_tree().

bool double_int::fits_hwi ( bool  uns) const

Returns true if CST fits in HOST_WIDE_INT if UNS is false, or in unsigned HOST_WIDE_INT if UNS is true.

References add_double, high, and low.

bool double_int::fits_shwi ( ) const

Returns true if CST fits in signed HOST_WIDE_INT.

Referenced by fold_builtin_logarithm(), and replace_ref().

bool double_int::fits_uhwi ( ) const
inline

Conversion query functions.

Returns true if CST fits in unsigned HOST_WIDE_INT.

double_int double_int::from_buffer ( const unsigned char *  buffer,
int  len 
)
static

Construct from a fuffer of length LEN. BUFFER will be read according to byte endianess and word endianess.

Construct from a buffer of length LEN. BUFFER will be read according to byte endianess and word endianess. Only the lower LEN bytes of the result are set; the remaining high bytes are cleared.

References ALL_ONES, high, HOST_BITS_PER_WIDE_INT, HOST_WIDE_INT, low, and mask().

double_int double_int::from_pair ( HOST_WIDE_INT  high,
unsigned HOST_WIDE_INT  low 
)
inlinestatic
double_int double_int::from_shwi ( HOST_WIDE_INT  cst)
inlinestatic

Constructors and conversions. Constructs double_int from integer CST. The bits over the precision of HOST_WIDE_INT are filled with the sign bit.

References high, and low.

Referenced by cgraph_create_function_alias(), fold_builtin_logarithm(), and vect_update_ivs_after_vectorizer().

double_int double_int::from_uhwi ( unsigned HOST_WIDE_INT  cst)
inlinestatic

Normally, we would define constructors to create instances. Two things prevent us from doing so. First, defining a constructor makes the class non-POD in C++03, and we certainly want double_int to be a POD. Second, the GCC conding conventions prefer explicit conversion, and explicit conversion operators are not available until C++11.

Constructs double_int from unsigned integer CST. The bits over the precision of HOST_WIDE_INT are filled with zeros.

References double_int_one.

Referenced by backtrace_base_for_ref(), fold_builtin_strcspn(), tree_fold_binomial(), and tree_to_aff_combination().

bool double_int::is_minus_one ( ) const
inline

Returns true if CST is minus one.

Referenced by ncd_for_two_cands().

bool double_int::is_one ( ) const
inline

Returns true if CST is one.

Referenced by create_mul_ssa_cand(), fixed_address_object_p(), and ncd_for_two_cands().

bool double_int::is_zero ( ) const
inline

Comparative functions.

The operands of the following comparison functions must be processed with double_int_ext, if their precision is less than HOST_BITS_PER_DOUBLE_INT bits. Returns true if CST is zero.

Referenced by aff_combination_add_elt(), backtrace_base_for_ref(), double_int_constant_multiple_p(), free_name_expansion(), infer_loop_bounds_from_signedness(), ncd_for_two_cands(), register_edge_assert_for_2(), sle(), udivmod(), and vrp_intersect_ranges_1().

double_int double_int::llshift ( HOST_WIDE_INT  count,
unsigned int  prec 
) const

Logical shift A left by COUNT places keeping only PREC bits of result. Shift right if COUNT is negative.

Referenced by fixed_compare(), lshift(), and register_edge_assert_for_2().

double_int double_int::lrotate ( HOST_WIDE_INT  count,
unsigned int  prec 
) const

Rotate A left by COUNT places keeping only PREC bits of result. Rotate right if COUNT is negative.

Referenced by bit_value_unop_1(), and simplify_const_binary_operation().

double_int double_int::lrshift ( HOST_WIDE_INT  count,
unsigned int  prec 
) const

Logical shift A right by COUNT places keeping only PREC bits of result. Shift left if COUNT is negative.

Referenced by lshift().

double_int double_int::lshift ( HOST_WIDE_INT  count) const

Shift A left by COUNT places.

Shifting by the host word size is undefined according to the ANSI standard, so we must handle this as a special case.

References absu_hwi(), high, low, lshift_double(), and rshift_double().

Referenced by fixed_compare(), and fold_convert_const_int_from_int().

double_int double_int::lshift ( HOST_WIDE_INT  count,
unsigned int  prec,
bool  arith 
) const

Shift A left by COUNT places keeping only PREC bits of result. Shift right if COUNT is negative. ARITH true specifies arithmetic shifting; otherwise use logical shift.

References llshift(), and lrshift().

double_int double_int::mask ( unsigned  prec)
static

No copy assignment operator or destructor to keep the type a POD. There are some special value-creation static member functions.

Returns mask for PREC bits.

References sext(), and zext().

Referenced by build_method_type_directly(), from_buffer(), max_value(), number_of_iterations_ne_max(), and register_edge_assert_for_2().

double_int double_int::max ( double_int  b,
bool  uns 
)

Compares two values A and B. Returns max value. Signedness of the comparison is given by UNS.

double_int double_int::max_value ( unsigned int  prec,
bool  uns 
)
static

Returns a maximum value for signed or unsigned integer of precision PREC.

References HOST_BITS_PER_WIDE_INT, and mask().

double_int double_int::min ( double_int  b,
bool  uns 
)

Compares two values A and B. Returns mix value. Signedness of the comparison is given by UNS.

double_int double_int::min_value ( unsigned int  prec,
bool  uns 
)
static

Returns a minimum value for signed or unsigned integer of precision PREC.

References high, HOST_BITS_PER_WIDE_INT, and HOST_WIDE_INT.

double_int double_int::mod ( double_int  b,
bool  uns,
unsigned  code 
) const

Returns A % B (computed as unsigned depending on UNS, and rounded as specified by CODE). CODE is enum tree_code in fact, but double_int.h must be included before tree.h.

References gcc_checking_assert, and HOST_BITS_PER_DOUBLE_INT.

Referenced by operator-(), and sdivmod().

double_int double_int::mul_with_sign ( double_int  b,
bool  unsigned_p,
bool overflow 
) const

Returns A * B. If the operation overflows according to UNSIGNED_P, *OVERFLOW is set to nonzero.

References add_double, high, low, and neg_double().

Referenced by tree_fold_binomial().

bool double_int::multiple_of ( double_int  factor,
bool  unsigned_p,
double_int multiple 
) const

Arithmetic query operations.

Return TRUE iff PRODUCT is an integral multiple of FACTOR, and return the multiple in *MULTIPLE. Otherwise return FALSE and leave *MULTIPLE unchanged.

References gcc_checking_assert, high, HOST_BITS_PER_DOUBLE_INT, HOST_BITS_PER_WIDE_INT, and low.

double_int double_int::neg_with_overflow ( bool overflow) const
bool double_int::operator!= ( double_int  cst2) const
inline

Returns true if CST1 != CST2.

double_int double_int::operator& ( double_int  b) const
inline

Returns A & B.

double_int & double_int::operator&= ( double_int  b)
inline

References HOST_WIDE_INT, and low.

double_int double_int::operator* ( double_int  b) const

Returns A * B.

References add_double, high, and low.

double_int & double_int::operator*= ( double_int  b)

Multiplies *this with B and returns a reference to *this.

References add_double_with_sign(), high, and low.

double_int double_int::operator+ ( double_int  b) const

Returns A + B.

References add_double, high, low, neg_double(), and OVERFLOW_SUM_SIGN.

double_int & double_int::operator++ ( )
inline

The following functions are mutating operations.

double_int & double_int::operator+= ( double_int  b)

Adds B to *this and returns a reference to *this.

References high, low, and neg_double().

double_int double_int::operator- ( double_int  b) const

Returns A - B.

double_int double_int::operator- ( ) const

Returns -A.

References divmod(), and mod().

double_int & double_int::operator-- ( )
inline
double_int & double_int::operator-= ( double_int  b)

Subtracts B from *this and returns a reference to *this.

bool double_int::operator== ( double_int  cst2) const
inline

Returns true if CST1 == CST2.

double_int double_int::operator^ ( double_int  b) const
inline

Returns A ^ B.

References ALL_ONES, high, and low.

double_int & double_int::operator^= ( double_int  b)
inline

References low.

double_int double_int::operator| ( double_int  b) const
inline

Returns A | B.

References high, and low.

double_int & double_int::operator|= ( double_int  b)
inline

References high.

double_int double_int::operator~ ( ) const
inline

Logical operations. Returns ~A.

int double_int::popcount ( ) const
inline

Return number of set bits of CST.

double_int double_int::rrotate ( HOST_WIDE_INT  count,
unsigned int  prec 
) const

Rotate A rigth by COUNT places keeping only PREC bits of result. Rotate right if COUNT is negative.

Referenced by simplify_const_binary_operation().

double_int double_int::rshift ( HOST_WIDE_INT  count) const

Shift A right by COUNT places.

Shifting by the host word size is undefined according to the ANSI standard, so we must handle this as a special case.

References absu_hwi(), high, low, lshift_double(), and rshift_double().

Referenced by fold_convert_const_int_from_int(), and simplify_const_binary_operation().

double_int double_int::rshift ( HOST_WIDE_INT  count,
unsigned int  prec,
bool  arith 
) const

Shift A right by COUNT places keeping only PREC bits of result. Shift left if COUNT is negative. ARITH true specifies arithmetic shifting; otherwise use logical shift.

int double_int::scmp ( double_int  b) const

Compares two signed values A and B. Returns -1 if A < B, 0 if A == B, and 1 if A > B.

Referenced by ult().

double_int double_int::sdiv ( double_int  b,
unsigned  code 
) const

The same as double_int::div with UNS = false.

double_int double_int::sdivmod ( double_int  b,
unsigned  code,
double_int mod 
) const

The same as double_int::divmod with UNS = false.

References mod().

double_int double_int::set_bit ( unsigned  bitpos) const

Arithmetic operation functions. The following operations perform arithmetics modulo 2^precision, so you do not need to call .ext between them, even if you are representing numbers with precision less than HOST_BITS_PER_DOUBLE_INT bits.

Set BITPOS bit in A.

double_int double_int::sext ( unsigned  prec) const

The same as double_int::ext with UNS = false.

Referenced by fixed_compare(), and mask().

bool double_int::sgt ( double_int  b) const

Compares two signed values A and B for greater-than.

bool double_int::sle ( double_int  b) const

Compares two signed values A and B for less-than or equal-to.

References is_negative(), and is_zero().

bool double_int::slt ( double_int  b) const

Compares two signed values A and B for less-than.

double_int double_int::smax ( double_int  b)

Compares two signed values A and B. Returns max value.

double_int double_int::smin ( double_int  b)

Compares two signed values A and B. Returns min value.

double_int double_int::smod ( double_int  b,
unsigned  code 
) const

The same as double_int::mod with UNS = false.

double_int double_int::sub_with_overflow ( double_int  b,
bool overflow 
) const

Returns A - B. If the operation overflows via inconsistent sign bits, *OVERFLOW is set to nonzero.

References divmod().

HOST_WIDE_INT double_int::to_shwi ( ) const
inline

The following functions are non-mutating operations. Conversion functions.

Returns value of CST as a signed number. CST must satisfy double_int::fits_signed.

References high, and low.

Referenced by get_addr_base_and_unit_offset_1(), and replace_ref().

unsigned HOST_WIDE_INT double_int::to_uhwi ( ) const
inline

Returns value of CST as an unsigned number. CST must satisfy double_int::fits_unsigned.

References high, and low.

int double_int::trailing_zeros ( ) const

Attribute query functions.

Count trailing zeros in A.

References absu_hwi(), high, low, lshift_double(), and rshift_double().

int double_int::ucmp ( double_int  b) const

Compares two unsigned values A and B. Returns -1 if A < B, 0 if A == B, and 1 if A > B.

References high, and low.

double_int double_int::udiv ( double_int  b,
unsigned  code 
) const
double_int double_int::udivmod ( double_int  b,
unsigned  code,
double_int mod 
) const

The same as double_int::divmod with UNS = true.

References divmod(), and is_zero().

bool double_int::ugt ( double_int  b) const

Compares two unsigned values A and B for greater-than.

Referenced by build_varargs_function_type_list().

bool double_int::ule ( double_int  b) const

Compares two unsigned values A and B for less-than or equal-to.

References cmp().

bool double_int::ult ( double_int  b) const

Compares two unsigned values A and B for less-than.

References scmp().

double_int double_int::umax ( double_int  b)

Compares two unsigned values A and B. Returns max value.

References count.

double_int double_int::umin ( double_int  b)

Compares two unsigned values A and B. Returns min value.

double_int double_int::umod ( double_int  b,
unsigned  code 
) const

The same as double_int::mod with UNS = true.

References count, high, HOST_BITS_PER_WIDE_INT, HOST_WIDE_INT, and low.

Referenced by backtrace_base_for_ref().

double_int double_int::wide_mul_with_sign ( double_int  b,
bool  unsigned_p,
double_int higher,
bool overflow 
) const

References add_double, high, low, and neg_double().

Referenced by int_const_binop_1().

double_int double_int::zext ( unsigned  prec) const

The same as double_int::ext with UNS = true.

Referenced by mask(), and register_edge_assert_for_2().


Field Documentation


The documentation for this struct was generated from the following files: