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

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.   

References add_double_with_sign(), high, and low.

Referenced by fold_div_compare(), int_const_binop_1(), plus_constant(), and pointer_may_wrap_p().

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.   

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

Referenced by fixed_saturate1(), fixed_saturate2(), and simplify_const_binary_operation().

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.   

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

Referenced by get_inner_reference(), and predict_iv_comparison().

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 scmp(), and ucmp().

Referenced by bit_value_binop_1(), extract_range_from_binary_expr_1(), fold_array_ctor_reference(), fold_nonarray_ctor_reference(), int_fits_type_p(), max(), min(), quad_int_cmp(), and simplify_conversion_using_ranges().

double_int double_int::div ( 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 divmod(), and mod().

Referenced by choose_multiplier(), field_byte_offset(), round_up_to_align(), sdiv(), tree_fold_binomial(), and udiv().

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_and_round_double(), high, and low.

Referenced by int_const_binop_1(), predict_iv_comparison(), and simplify_const_binary_operation().

double_int double_int::ext ( unsigned  prec,
bool  uns 
) const
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.   

References sext(), and zext().

Referenced by bit_value_binop_1(), bit_value_unop_1(), do_fixed_shift(), double_int_fits_to_tree_p(), double_int_to_tree(), extract_muldiv_1(), extract_range_from_binary_expr_1(), fold_array_ctor_reference(), fold_binary_loc(), force_fit_type_double(), mpz_get_double_int(), range_fits_type_p(), and simplify_conversion_using_ranges().

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 fits_shwi(), and fits_uhwi().

bool double_int::fits_uhwi ( ) const
inline
Returns true if CST fits in unsigned HOST_WIDE_INT.   

References high.

Referenced by addr_object_size(), array_size_for_constructor(), and fits_hwi().

double_int double_int::from_buffer ( const unsigned char *  buffer,
int  len 
)
static
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 high, HOST_BITS_PER_WIDE_INT, HOST_WIDE_INT, len, low, and offset.

Referenced by native_interpret_fixed(), and native_interpret_int().

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

References high, and low.

Referenced by plus_constant(), and simplify_const_unary_operation().

bool double_int::is_minus_one ( ) const
inline
double_int double_int::llshift ( HOST_WIDE_INT  count,
unsigned int  prec 
) const
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.   

References llshift(), and lrshift().

Referenced by bit_value_binop_1(), int_const_binop_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.   

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

Referenced by lrotate(), rrotate(), and simplify_conversion_using_ranges().

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 absu_hwi(), high, low, lshift_double(), and rshift_double().

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.   

References cmp().

Referenced by extract_range_from_binary_expr_1(), and int_const_binop_1().

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 mask().

Referenced by extract_range_from_binary_expr_1(), and register_edge_assert_for_2().

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.   

References cmp().

Referenced by extract_range_from_binary_expr_1(), and int_const_binop_1().

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 lshift().

Referenced by extract_range_from_binary_expr_1(), and register_edge_assert_for_2().

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 divmod().

Referenced by div(), number_of_iterations_ne_max(), smod(), and umod().

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 high, low, and mul_double_wide_with_sign().

Referenced by adjust_range_with_scev(), extract_muldiv_1(), fold_div_compare(), int_const_binop_1(), predict_iv_comparison(), and tree_fold_binomial().

bool double_int::multiple_of ( double_int  factor,
bool  unsigned_p,
double_int multiple 
) const
Return TRUE iff PRODUCT is an integral multiple of FACTOR, and return
   the multiple in *MULTIPLE.  Otherwise return FALSE and leave *MULTIPLE
   unchanged.   

References divmod(), and is_zero().

Referenced by create_add_imm_cand().

double_int double_int::neg_with_overflow ( bool *  overflow) const

References high, low, and neg_double().

Referenced by fold_abs_const(), and fold_negate_const().

bool double_int::operator!= ( double_int  cst2) const
inline
Returns true if CST1 != CST2.   

References high, and 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
double_int double_int::operator* ( double_int  b) const
Returns A * B.   

References high, and low.

double_int & double_int::operator*= ( double_int  b)
Multiplies *this with B and returns a reference to *this.   

References high, and low.

double_int double_int::operator+ ( double_int  b) const
Returns A + B.   

References high, and low.

double_int & double_int::operator++ ( )
inline
double_int & double_int::operator+= ( double_int  b)
Adds B to *this and returns a reference to *this.   

References high, and low.

double_int double_int::operator- ( double_int  b) const
Returns A - B.   

References high, low, and neg_double().

double_int double_int::operator- ( ) const
Returns -A.   

References high, low, and neg_double().

double_int & double_int::operator-- ( )
inline
double_int & double_int::operator-= ( double_int  b)
Subtracts B from *this and returns a reference to *this.   

References high, low, and neg_double().

bool double_int::operator== ( double_int  cst2) const
inline
Returns true if CST1 == CST2.   

References high, and 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
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
double_int double_int::operator~ ( ) const
inline
Logical operations.   
Returns ~A.   

References high, and low.

int double_int::popcount ( ) const
inline
Return number of set bits of CST.   

References high, low, and popcount_hwi().

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.   

References llshift(), and lrshift().

Referenced by int_const_binop_1(), 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.   

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

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.   

References high, and low.

Referenced by cmp(), order_drefs(), predict_iv_comparison(), smax(), and smin().

double_int double_int::sdiv ( double_int  b,
unsigned  code 
) const
The same as double_int::div with UNS = false.   

References div().

Referenced by search_for_addr_array().

double_int double_int::sdivmod ( double_int  b,
unsigned  code,
double_int mod 
) const
The same as double_int::divmod with UNS = false.   

References divmod().

Referenced by constant_multiple_of(), and double_int_constant_multiple_p().

bool double_int::sgt ( double_int  b) const
Compares two signed values A and B for greater-than.   

References high, and low.

Referenced by fixed_saturate1(), fixed_saturate2(), record_increment(), and search_for_addr_array().

bool double_int::sle ( double_int  b) const
Compares two signed values A and B for less-than or equal-to.   

References high, and low.

Referenced by add_ref_to_chain(), and aff_comb_cannot_overlap_p().

bool double_int::slt ( double_int  b) const
double_int double_int::smax ( double_int  b)
Compares two signed values A and B.  Returns max value.   

References scmp().

Referenced by simplify_const_binary_operation().

double_int double_int::smin ( double_int  b)
Compares two signed values A and B.  Returns min value.   

References scmp().

Referenced by simplify_const_binary_operation().

double_int double_int::smod ( double_int  b,
unsigned  code 
) const
The same as double_int::mod with UNS = false.   

References mod().

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 high, low, and neg_double().

Referenced by int_const_binop_1(), and predict_iv_comparison().

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 low.

Referenced by addr_object_size(), fold_array_ctor_reference(), fold_nonarray_ctor_reference(), and predict_iv_comparison().

int double_int::trailing_zeros ( ) const
Count trailing zeros in A.   

References ctz_hwi(), high, HOST_BITS_PER_WIDE_INT, HOST_WIDE_INT, and low.

Referenced by fold_binary_loc().

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, HOST_WIDE_INT, and low.

Referenced by cmp(), do_fixed_divide(), do_warn_aggressive_loop_optimizations(), quad_int_cmp(), umax(), and umin().

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().

bool double_int::ugt ( double_int  b) const
bool double_int::ule ( double_int  b) const
Compares two unsigned values A and B for less-than or equal-to.   

References high, HOST_WIDE_INT, and low.

Referenced by add_ref_to_chain(), determine_roots_comp(), doloop_modify(), doloop_optimize(), remove_exits_and_undefined_stmts(), and unroll_loop_constant_iterations().

double_int double_int::umax ( double_int  b)
Compares two unsigned values A and B.  Returns max value.   

References ucmp().

Referenced by simplify_const_binary_operation().

double_int double_int::umin ( double_int  b)
Compares two unsigned values A and B.  Returns min value.   

References ucmp().

Referenced by simplify_const_binary_operation().

double_int double_int::umod ( double_int  b,
unsigned  code 
) const
The same as double_int::mod with UNS = true.   

References mod().

Referenced by restructure_reference().

double_int double_int::wide_mul_with_sign ( double_int  b,
bool  unsigned_p,
double_int higher,
bool *  overflow 
) const
double_int double_int::zext ( unsigned  prec) const

Field Documentation

HOST_WIDE_INT double_int::high

Referenced by add_AT_double(), add_with_sign(), adjust_range_with_scev(), alshift(), and_not(), arshift(), build_low_bits_mask(), choose_multiplier(), compare_loc_operands(), div_if_zero_remainder(), divmod(), divmod_with_overflow(), do_fixed_add(), do_fixed_divide(), do_fixed_multiply(), do_fixed_shift(), double_int_split_digit(), double_int_to_tree(), dump_lattice_value(), dw_val_equal_p(), fits_shwi(), fits_uhwi(), fixed_convert(), fixed_convert_from_int(), fixed_saturate1(), fixed_saturate2(), fold_binary_loc(), fold_builtin_int_roundingfn(), fold_convert_const_int_from_real(), from_buffer(), from_pair(), from_shwi(), from_uhwi(), gcov_type_to_double_int(), get_addr_base_and_unit_offset_1(), get_fixed_sign_bit(), hash_loc_operands(), immed_double_int_const(), input_cfg(), insert_double(), int_const_binop_1(), int_fits_type_p(), is_minus_one(), is_negative(), is_one(), is_zero(), llshift(), lower_bound_in_type(), lrshift(), lshift(), mask(), mpz_get_double_int(), mpz_set_double_int(), mul_with_sign(), neg_with_overflow(), operator!=(), operator&(), operator*(), operator*=(), operator+(), operator+=(), operator-(), operator-=(), operator==(), operator^(), operator|(), operator~(), output_cfg(), output_die(), output_loc_operands(), pack_ts_fixed_cst_value_fields(), pointer_may_wrap_p(), popcount(), predict_iv_comparison(), print_die(), round_up_loc(), rshift(), rtx_to_double_int(), same_dw_val_p(), scmp(), set_bit(), sext(), sgt(), simplify_const_unary_operation(), sle(), slt(), sub_with_overflow(), trailing_zeros(), tree_fold_binomial(), ucmp(), ugt(), ule(), ult(), upper_bound_in_type(), wide_mul_with_sign(), zero_nonzero_bits_from_vr(), and zext().

unsigned HOST_WIDE_INT double_int::low

Referenced by add_AT_double(), add_with_sign(), alshift(), and_not(), array_size_for_constructor(), arshift(), bit_value_assume_aligned(), build_low_bits_mask(), ccp_finalize(), choose_multiplier(), compare_loc_operands(), compute_complex_assign_jump_func(), copy_reference_ops_from_ref(), decode_addr_const(), div_if_zero_remainder(), divmod(), divmod_with_overflow(), do_fixed_divide(), do_fixed_multiply(), do_fixed_shift(), double_int_split_digit(), double_int_to_tree(), dump_lattice_value(), dw_val_equal_p(), expand_expr_real_1(), fits_shwi(), fixed_convert_from_int(), fixed_saturate1(), fixed_saturate2(), fold_binary_loc(), fold_builtin_int_roundingfn(), fold_builtin_memory_op(), fold_convert_const_int_from_real(), from_buffer(), from_pair(), from_shwi(), from_uhwi(), gcov_type_to_double_int(), get_ancestor_addr_info(), get_base_constructor(), get_constraint_for_ptr_offset(), get_fixed_sign_bit(), get_object_alignment_2(), hash_loc_operands(), immed_double_int_const(), indirect_ref_may_alias_decl_p(), indirect_refs_may_alias_p(), input_cfg(), insert_double(), int_const_binop_1(), int_fits_type_p(), ipa_modify_call_arguments(), is_minus_one(), is_one(), is_zero(), llshift(), lower_bound_in_type(), lrshift(), lshift(), mask(), mpz_get_double_int(), mpz_set_double_int(), mul_with_sign(), neg_with_overflow(), operator!=(), operator&(), operator*(), operator*=(), operator+(), operator+=(), operator-(), operator-=(), operator==(), operator^(), operator|(), operator~(), output_cfg(), output_constructor_regular_field(), output_die(), output_loc_operands(), pack_ts_fixed_cst_value_fields(), phi_translate_1(), pointer_may_wrap_p(), popcount(), print_die(), round_up_loc(), rshift(), rtx_to_double_int(), same_dw_val_p(), scmp(), set_bit(), sext(), sgt(), simplify_const_unary_operation(), size_low_cst(), sle(), slt(), sra_ipa_modify_expr(), sub_with_overflow(), to_shwi(), to_uhwi(), trailing_zeros(), tree_fold_binomial(), ucmp(), ugt(), ule(), ult(), upper_bound_in_type(), valueize_refs_1(), wide_mul_with_sign(), zero_nonzero_bits_from_vr(), and zext().


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