GCC Middle and Back End API Reference
|
#include <double-int.h>
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 |
Operations with long integers. Copyright (C) 2006-2024 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.
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 a, add_double_with_sign(), b, high, and low.
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(), count, high, low, lshift_double(), r, and rshift_double().
Referenced by fixed_saturate2().
|
inline |
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(), count, high, low, lshift_double(), r, and rshift_double().
int double_int::cmp | ( | double_int | b, |
bool | uns ) const |
double_int double_int::div | ( | double_int | b, |
bool | uns, | ||
unsigned | code ) const |
double_int double_int::divmod | ( | double_int | b, |
bool | uns, | ||
unsigned | code, | ||
double_int * | mod ) const |
References a, b, div_and_round_double(), high, low, and mod().
Referenced by div(), do_fixed_divide(), mod(), multiple_of(), sdivmod(), and udivmod().
double_int double_int::divmod_with_overflow | ( | double_int | b, |
bool | uns, | ||
unsigned | code, | ||
double_int * | mod, | ||
bool * | overflow ) const |
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 do_fixed_add(), do_fixed_shift(), and mpz_get_double_int().
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_shwi | ( | ) | const |
Returns true if CST fits in signed HOST_WIDE_INT.
Referenced by fits_hwi(), and pp_double_int().
|
inline |
Returns true if CST fits in unsigned HOST_WIDE_INT.
References high.
Referenced by fits_hwi(), and pp_double_int().
|
static |
Construct from a buffer of length LEN. BUFFER will be read according to byte endianness and word endianness. Only the lower LEN bytes of the result are set; the remaining high bytes are cleared.
References double_int_zero, gcc_assert, high, HOST_BITS_PER_DOUBLE_INT, HOST_BITS_PER_WIDE_INT, low, and offset.
Referenced by native_interpret_fixed().
|
inlinestatic |
|
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.
Referenced by mem_loc_descriptor(), and rtx_to_double_int().
|
inlinestatic |
|
inline |
|
inline |
Returns true if CST is negative.
References high.
Referenced by dump_double_int(), fold_convert_const_int_from_fixed(), mpz_set_double_int(), and pp_double_int().
|
inline |
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 dump_double_int(), and multiple_of().
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.
References absu_hwi(), count, high, low, lshift_double(), r, and rshift_double().
Referenced by do_fixed_divide(), do_fixed_multiply(), do_fixed_shift(), fixed_convert(), fixed_convert_from_int(), lrotate(), and rrotate().
double_int double_int::lrotate | ( | HOST_WIDE_INT | count, |
unsigned int | prec ) const |
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(), count, high, low, lshift_double(), r, and rshift_double().
double_int double_int::lshift | ( | HOST_WIDE_INT | count | ) | const |
Shift A left by COUNT places.
References count, gcc_checking_assert, high, HOST_BITS_PER_DOUBLE_INT, HOST_BITS_PER_WIDE_INT, and low.
Referenced by do_fixed_divide(), do_fixed_shift(), fixed_convert(), fold_convert_const_int_from_fixed(), and min_value().
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(), count, high, low, lshift_double(), and rshift_double().
|
static |
Returns mask for PREC bits.
References ALL_ONES, high, HOST_BITS_PER_WIDE_INT, HOST_WIDE_INT_UC, low, and mask().
Referenced by mask(), max_value(), sext(), and zext().
double_int double_int::max | ( | double_int | b, |
bool | uns ) |
|
static |
Returns a maximum value for signed or unsigned integer of precision PREC.
References mask().
double_int double_int::min | ( | double_int | b, |
bool | uns ) |
|
static |
Returns a minimum value for signed or unsigned integer of precision PREC.
References double_int_one, double_int_zero, and lshift().
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(), and mod().
Referenced by div(), divmod(), divmod_with_overflow(), mod(), sdivmod(), smod(), udivmod(), 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 a, b, high, low, and mul_double_wide_with_sign().
bool double_int::multiple_of | ( | double_int | factor, |
bool | unsigned_p, | ||
double_int * | multiple ) const |
double_int double_int::neg_with_overflow | ( | bool * | overflow | ) | const |
References high, low, and neg_double().
|
inline |
|
inline |
|
inline |
References b.
double_int double_int::operator* | ( | double_int | b | ) | const |
Returns A * B.
References a, b, high, low, and mul_double.
double_int & double_int::operator*= | ( | double_int | b | ) |
Multiplies *this with B and returns a reference to *this.
References b, high, low, and mul_double.
double_int double_int::operator+ | ( | double_int | b | ) | const |
Returns A + B.
References a, add_double, b, high, and low.
|
inline |
References double_int_one.
double_int & double_int::operator+= | ( | double_int | b | ) |
Adds B to *this and returns a reference to *this.
References add_double, b, high, and low.
double_int double_int::operator- | ( | ) | const |
Returns -A.
References a, high, low, and neg_double().
double_int double_int::operator- | ( | double_int | b | ) | const |
Returns A - B.
References a, add_double, b, high, low, and neg_double().
|
inline |
References double_int_one.
double_int & double_int::operator-= | ( | double_int | b | ) |
Subtracts B from *this and returns a reference to *this.
References add_double, b, high, low, and neg_double().
|
inline |
|
inline |
|
inline |
References b.
|
inline |
|
inline |
References b.
|
inline |
|
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 |
double_int double_int::rshift | ( | HOST_WIDE_INT | count | ) | const |
Shift A right by COUNT places.
References count, gcc_checking_assert, high, HOST_BITS_PER_DOUBLE_INT, HOST_BITS_PER_WIDE_INT, and low.
Referenced by fold_convert_const_int_from_fixed().
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(), count, high, low, lshift_double(), and rshift_double().
int double_int::scmp | ( | double_int | b | ) | const |
double_int double_int::sdiv | ( | double_int | b, |
unsigned | code ) const |
The same as double_int::div with UNS = false.
References div().
double_int double_int::sdivmod | ( | double_int | b, |
unsigned | code, | ||
double_int * | mod ) const |
double_int double_int::set_bit | ( | unsigned | bitpos | ) | const |
Set BITPOS bit in A.
References a, HOST_BITS_PER_WIDE_INT, HOST_WIDE_INT_1, HOST_WIDE_INT_1U, and low.
double_int double_int::sext | ( | unsigned | prec | ) | const |
The same as double_int::ext with UNS = false.
References high, HOST_BITS_PER_WIDE_INT, low, mask(), and r.
Referenced by ext(), fixed_convert(), fixed_convert_from_int(), fixed_from_double_int(), and fixed_saturate2().
bool double_int::sgt | ( | double_int | b | ) | const |
Compares two signed values A and B for greater-than.
Referenced by fixed_saturate2().
bool double_int::sle | ( | double_int | b | ) | const |
bool double_int::slt | ( | double_int | b | ) | const |
Compares two signed values A and B for less-than.
Referenced by fixed_saturate2().
double_int double_int::smax | ( | double_int | b | ) |
double_int double_int::smin | ( | double_int | b | ) |
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 add_double, b, high, low, neg_double(), and OVERFLOW_SUM_SIGN.
|
inline |
Returns value of CST as a signed number. CST must satisfy double_int::fits_signed.
References low.
|
inline |
Returns value of CST as an unsigned number. CST must satisfy double_int::fits_unsigned.
References low.
int double_int::trailing_zeros | ( | ) | const |
Count trailing zeros in A.
References a, ctz_hwi(), HOST_BITS_PER_DOUBLE_INT, HOST_BITS_PER_WIDE_INT, and low.
int double_int::ucmp | ( | double_int | b | ) | const |
double_int double_int::udiv | ( | double_int | b, |
unsigned | code ) const |
The same as double_int::div with UNS = true.
References div().
double_int double_int::udivmod | ( | double_int | b, |
unsigned | code, | ||
double_int * | mod ) const |
bool double_int::ugt | ( | double_int | b | ) | const |
Compares two unsigned values A and B for greater-than.
Referenced by fixed_saturate2().
bool double_int::ule | ( | double_int | b | ) | const |
bool double_int::ult | ( | double_int | b | ) | const |
Compares two unsigned values A and B for less-than.
Referenced by do_fixed_multiply(), and fixed_saturate2().
double_int double_int::umax | ( | double_int | b | ) |
double_int double_int::umin | ( | double_int | b | ) |
double_int double_int::umod | ( | double_int | b, |
unsigned | code ) const |
The same as double_int::mod with UNS = true.
References mod().
double_int double_int::wide_mul_with_sign | ( | double_int | b, |
bool | unsigned_p, | ||
double_int * | higher, | ||
bool * | overflow ) const |
References b, high, low, lower(), and mul_double_wide_with_sign().
double_int double_int::zext | ( | unsigned | prec | ) | const |
The same as double_int::ext with UNS = true.
References high, low, mask(), and r.
Referenced by ext(), fixed_from_double_int(), and fixed_saturate2().
HOST_WIDE_INT double_int::high |
Referenced by add_AT_double(), add_with_sign(), alshift(), and_not(), arshift(), divmod(), divmod_with_overflow(), do_fixed_divide(), do_fixed_multiply(), do_fixed_shift(), double_int_split_digit(), fits_shwi(), fits_uhwi(), fixed_convert(), fixed_convert_from_int(), fixed_saturate2(), fold_convert_const_fixed_from_int(), from_buffer(), from_pair(), hash_locs(), is_minus_one(), is_negative(), is_one(), is_zero(), llshift(), lrshift(), lshift(), 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|(), operator~(), output_loc_operands(), pack_ts_fixed_cst_value_fields(), popcount(), pp_double_int(), print_dw_val(), rshift(), rshift(), same_dw_val_p(), sext(), sgt(), sle(), slt(), sub_with_overflow(), ugt(), ule(), ult(), wide_mul_with_sign(), and zext().
unsigned HOST_WIDE_INT double_int::low |
Referenced by add_AT_double(), add_with_sign(), alshift(), and_not(), arshift(), divmod(), divmod_with_overflow(), do_fixed_divide(), do_fixed_multiply(), do_fixed_shift(), double_int_split_digit(), fits_shwi(), fixed_convert_from_int(), fixed_saturate2(), fold_convert_const_fixed_from_int(), from_buffer(), from_pair(), from_shwi(), from_uhwi(), hash_locs(), is_minus_one(), is_one(), is_zero(), llshift(), lrshift(), lshift(), 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|(), operator~(), output_loc_operands(), pack_ts_fixed_cst_value_fields(), popcount(), pp_double_int(), print_dw_val(), rshift(), rshift(), same_dw_val_p(), set_bit(), sext(), sgt(), sle(), slt(), sub_with_overflow(), to_shwi(), to_uhwi(), trailing_zeros(), ugt(), ule(), ult(), wide_mul_with_sign(), and zext().