aboutsummaryrefslogtreecommitdiff
path: root/gcc/double-int.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/double-int.h')
-rw-r--r--gcc/double-int.h460
1 files changed, 18 insertions, 442 deletions
diff --git a/gcc/double-int.h b/gcc/double-int.h
index bc7aca1..f4eb6ab 100644
--- a/gcc/double-int.h
+++ b/gcc/double-int.h
@@ -61,6 +61,7 @@ struct double_int
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);
/* No copy assignment operator or destructor to keep the type a POD. */
@@ -105,9 +106,17 @@ struct double_int
/* 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. */
+
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;
@@ -131,12 +140,15 @@ struct double_int
/* 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. */
+
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;
@@ -199,13 +211,6 @@ double_int::from_shwi (HOST_WIDE_INT cst)
return r;
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline double_int
-shwi_to_double_int (HOST_WIDE_INT cst)
-{
- return double_int::from_shwi (cst);
-}
-
/* Some useful constants. */
/* FIXME(crowl): Maybe remove after converting callers?
The problem is that a named constant would not be as optimizable,
@@ -229,11 +234,13 @@ double_int::from_uhwi (unsigned HOST_WIDE_INT cst)
return r;
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline double_int
-uhwi_to_double_int (unsigned HOST_WIDE_INT cst)
+inline double_int
+double_int::from_pair (HOST_WIDE_INT high, unsigned HOST_WIDE_INT low)
{
- return double_int::from_uhwi (cst);
+ double_int r;
+ r.low = low;
+ r.high = high;
+ return r;
}
inline double_int &
@@ -301,13 +308,6 @@ double_int::to_shwi () const
return (HOST_WIDE_INT) low;
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline HOST_WIDE_INT
-double_int_to_shwi (double_int cst)
-{
- return cst.to_shwi ();
-}
-
/* Returns value of CST as an unsigned number. CST must satisfy
double_int::fits_unsigned. */
@@ -317,13 +317,6 @@ double_int::to_uhwi () const
return low;
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline unsigned HOST_WIDE_INT
-double_int_to_uhwi (double_int cst)
-{
- return cst.to_uhwi ();
-}
-
/* Returns true if CST fits in unsigned HOST_WIDE_INT. */
inline bool
@@ -332,164 +325,6 @@ double_int::fits_uhwi () const
return high == 0;
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline bool
-double_int_fits_in_uhwi_p (double_int cst)
-{
- return cst.fits_uhwi ();
-}
-
-/* Returns true if CST fits in signed HOST_WIDE_INT. */
-
-/* FIXME(crowl): Remove after converting callers. */
-inline bool
-double_int_fits_in_shwi_p (double_int cst)
-{
- return cst.fits_shwi ();
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline bool
-double_int_fits_in_hwi_p (double_int cst, bool uns)
-{
- return cst.fits_hwi (uns);
-}
-
-/* The following operations perform arithmetics modulo 2^precision,
- so you do not need to call double_int_ext between them, even if
- you are representing numbers with precision less than
- HOST_BITS_PER_DOUBLE_INT bits. */
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_mul (double_int a, double_int b)
-{
- return a * b;
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_mul_with_sign (double_int a, double_int b,
- bool unsigned_p, int *overflow)
-{
- bool ovf;
- return a.mul_with_sign (b, unsigned_p, &ovf);
- *overflow = ovf;
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_add (double_int a, double_int b)
-{
- return a + b;
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_sub (double_int a, double_int b)
-{
- return a - b;
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_neg (double_int a)
-{
- return -a;
-}
-
-/* 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. */
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_div (double_int a, double_int b, bool uns, unsigned code)
-{
- return a.div (b, uns, code);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_sdiv (double_int a, double_int b, unsigned code)
-{
- return a.sdiv (b, code);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_udiv (double_int a, double_int b, unsigned code)
-{
- return a.udiv (b, code);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_mod (double_int a, double_int b, bool uns, unsigned code)
-{
- return a.mod (b, uns, code);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_smod (double_int a, double_int b, unsigned code)
-{
- return a.smod (b, code);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_umod (double_int a, double_int b, unsigned code)
-{
- return a.umod (b, code);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_divmod (double_int a, double_int b, bool uns,
- unsigned code, double_int *mod)
-{
- return a.divmod (b, uns, code, mod);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_sdivmod (double_int a, double_int b, unsigned code, double_int *mod)
-{
- return a.sdivmod (b, code, mod);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_udivmod (double_int a, double_int b, unsigned code, double_int *mod)
-{
- return a.udivmod (b, code, mod);
-}
-
-/***/
-
-/* FIXME(crowl): Remove after converting callers. */
-inline bool
-double_int_multiple_of (double_int product, double_int factor,
- bool unsigned_p, double_int *multiple)
-{
- return product.multiple_of (factor, unsigned_p, multiple);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_setbit (double_int a, unsigned bitpos)
-{
- return a.set_bit (bitpos);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline int
-double_int_ctz (double_int a)
-{
- return a.trailing_zeros ();
-}
-
/* Logical operations. */
/* Returns ~A. */
@@ -503,13 +338,6 @@ double_int::operator ~ () const
return result;
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline double_int
-double_int_not (double_int a)
-{
- return ~a;
-}
-
/* Returns A | B. */
inline double_int
@@ -521,13 +349,6 @@ double_int::operator | (double_int b) const
return result;
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline double_int
-double_int_ior (double_int a, double_int b)
-{
- return a | b;
-}
-
/* Returns A & B. */
inline double_int
@@ -539,13 +360,6 @@ double_int::operator & (double_int b) const
return result;
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline double_int
-double_int_and (double_int a, double_int b)
-{
- return a & b;
-}
-
/* Returns A & ~B. */
inline double_int
@@ -557,13 +371,6 @@ double_int::and_not (double_int b) const
return result;
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline double_int
-double_int_and_not (double_int a, double_int b)
-{
- return a.and_not (b);
-}
-
/* Returns A ^ B. */
inline double_int
@@ -575,165 +382,8 @@ double_int::operator ^ (double_int b) const
return result;
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline double_int
-double_int_xor (double_int a, double_int b)
-{
- return a ^ b;
-}
-
-
-/* Shift operations. */
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_lshift (double_int a, HOST_WIDE_INT count, unsigned int prec,
- bool arith)
-{
- return a.lshift (count, prec, arith);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_rshift (double_int a, HOST_WIDE_INT count, unsigned int prec,
- bool arith)
-{
- return a.rshift (count, prec, arith);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_lrotate (double_int a, HOST_WIDE_INT count, unsigned int prec)
-{
- return a.lrotate (count, prec);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_rrotate (double_int a, HOST_WIDE_INT count, unsigned int prec)
-{
- return a.rrotate (count, prec);
-}
-
-/* Returns true if CST is negative. Of course, CST is considered to
- be signed. */
-
-static inline bool
-double_int_negative_p (double_int cst)
-{
- return cst.high < 0;
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline int
-double_int_cmp (double_int a, double_int b, bool uns)
-{
- return a.cmp (b, uns);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline int
-double_int_scmp (double_int a, double_int b)
-{
- return a.scmp (b);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline int
-double_int_ucmp (double_int a, double_int b)
-{
- return a.ucmp (b);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_max (double_int a, double_int b, bool uns)
-{
- return a.max (b, uns);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_smax (double_int a, double_int b)
-{
- return a.smax (b);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_umax (double_int a, double_int b)
-{
- return a.umax (b);
-}
-
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_min (double_int a, double_int b, bool uns)
-{
- return a.min (b, uns);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_smin (double_int a, double_int b)
-{
- return a.smin (b);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_umin (double_int a, double_int b)
-{
- return a.umin (b);
-}
-
void dump_double_int (FILE *, double_int, bool);
-/* Zero and sign extension of numbers in smaller precisions. */
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_ext (double_int a, unsigned prec, bool uns)
-{
- return a.ext (prec, uns);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_sext (double_int a, unsigned prec)
-{
- return a.sext (prec);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_zext (double_int a, unsigned prec)
-{
- return a.zext (prec);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_mask (unsigned prec)
-{
- return double_int::mask (prec);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_max_value (unsigned int prec, bool uns)
-{
- return double_int::max_value (prec, uns);
-}
-
-/* FIXME(crowl): Remove after converting callers. */
-inline double_int
-double_int_min_value (unsigned int prec, bool uns)
-{
- return double_int::min_value (prec, uns);
-}
-
#define ALL_ONES (~((unsigned HOST_WIDE_INT) 0))
/* The operands of the following comparison functions must be processed
@@ -748,13 +398,6 @@ double_int::is_zero () const
return low == 0 && high == 0;
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline bool
-double_int_zero_p (double_int cst)
-{
- return cst.is_zero ();
-}
-
/* Returns true if CST is one. */
inline bool
@@ -763,13 +406,6 @@ double_int::is_one () const
return low == 1 && high == 0;
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline bool
-double_int_one_p (double_int cst)
-{
- return cst.is_one ();
-}
-
/* Returns true if CST is minus one. */
inline bool
@@ -778,13 +414,6 @@ double_int::is_minus_one () const
return low == ALL_ONES && high == -1;
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline bool
-double_int_minus_one_p (double_int cst)
-{
- return cst.is_minus_one ();
-}
-
/* Returns true if CST is negative. */
inline bool
@@ -801,13 +430,6 @@ double_int::operator == (double_int cst2) const
return low == cst2.low && high == cst2.high;
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline bool
-double_int_equal_p (double_int cst1, double_int cst2)
-{
- return cst1 == cst2;
-}
-
/* Returns true if CST1 != CST2. */
inline bool
@@ -824,52 +446,6 @@ double_int::popcount () const
return popcount_hwi (high) + popcount_hwi (low);
}
-/* FIXME(crowl): Remove after converting callers. */
-static inline int
-double_int_popcount (double_int cst)
-{
- return cst.popcount ();
-}
-
-
-/* Legacy interface with decomposed high/low parts. */
-
-/* FIXME(crowl): Remove after converting callers. */
-extern int add_double_with_sign (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
- unsigned HOST_WIDE_INT, HOST_WIDE_INT,
- unsigned HOST_WIDE_INT *, HOST_WIDE_INT *,
- bool);
-/* FIXME(crowl): Remove after converting callers. */
-#define add_double(l1,h1,l2,h2,lv,hv) \
- add_double_with_sign (l1, h1, l2, h2, lv, hv, false)
-/* FIXME(crowl): Remove after converting callers. */
-extern int neg_double (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
- unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
-/* FIXME(crowl): Remove after converting callers. */
-extern int mul_double_with_sign (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
- unsigned HOST_WIDE_INT, HOST_WIDE_INT,
- unsigned HOST_WIDE_INT *, HOST_WIDE_INT *,
- bool);
-/* FIXME(crowl): Remove after converting callers. */
-extern int mul_double_wide_with_sign (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
- unsigned HOST_WIDE_INT, HOST_WIDE_INT,
- unsigned HOST_WIDE_INT *, HOST_WIDE_INT *,
- unsigned HOST_WIDE_INT *, HOST_WIDE_INT *,
- bool);
-/* FIXME(crowl): Remove after converting callers. */
-#define mul_double(l1,h1,l2,h2,lv,hv) \
- mul_double_with_sign (l1, h1, l2, h2, lv, hv, false)
-/* FIXME(crowl): Remove after converting callers. */
-extern void lshift_double (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
- HOST_WIDE_INT, unsigned int,
- unsigned HOST_WIDE_INT *, HOST_WIDE_INT *, bool);
-/* FIXME(crowl): Remove after converting callers. */
-extern int div_and_round_double (unsigned, int, unsigned HOST_WIDE_INT,
- HOST_WIDE_INT, unsigned HOST_WIDE_INT,
- HOST_WIDE_INT, unsigned HOST_WIDE_INT *,
- HOST_WIDE_INT *, unsigned HOST_WIDE_INT *,
- HOST_WIDE_INT *);
-
#ifndef GENERATOR_FILE
/* Conversion to and from GMP integer representations. */