return r;
}
+/* Returns value of CST as a signed number. CST must satisfy
+ double_int_fits_in_shwi_p. */
+
+static inline HOST_WIDE_INT
+double_int_to_shwi (double_int cst)
+{
+ return (HOST_WIDE_INT) cst.low;
+}
+
+/* Returns value of CST as an unsigned number. CST must satisfy
+ double_int_fits_in_uhwi_p. */
+
+static inline unsigned HOST_WIDE_INT
+double_int_to_uhwi (double_int cst)
+{
+ return cst.low;
+}
+
+bool double_int_fits_in_hwi_p (double_int, bool);
+bool double_int_fits_in_shwi_p (double_int);
+
+/* Returns true if CST fits in unsigned HOST_WIDE_INT. */
+
+static inline bool
+double_int_fits_in_uhwi_p (double_int cst)
+{
+ return cst.high == 0;
+}
+
/* 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
2 * HOST_BITS_PER_WIDE_INT bits. */
double_int double_int_mul (double_int, double_int);
+double_int double_int_mul_with_sign (double_int, double_int, bool, int *);
double_int double_int_add (double_int, double_int);
+double_int double_int_sub (double_int, double_int);
double_int double_int_neg (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 2 * HOST_BITS_PER_WIDE_INT bits. */
-bool double_int_fits_in_hwi_p (double_int, bool);
-bool double_int_fits_in_shwi_p (double_int);
-bool double_int_fits_in_uhwi_p (double_int);
-HOST_WIDE_INT double_int_to_shwi (double_int);
-unsigned HOST_WIDE_INT double_int_to_uhwi (double_int);
double_int double_int_div (double_int, double_int, bool, unsigned);
double_int double_int_sdiv (double_int, double_int, unsigned);
double_int double_int_udiv (double_int, double_int, unsigned);
double_int double_int_divmod (double_int, double_int, bool, unsigned, double_int *);
double_int double_int_sdivmod (double_int, double_int, unsigned, double_int *);
double_int double_int_udivmod (double_int, double_int, unsigned, double_int *);
+
double_int double_int_setbit (double_int, unsigned);
+int double_int_ctz (double_int);
/* Logical operations. */
double_int_not (double_int a)
{
a.low = ~a.low;
- a.high = ~ a.high;
+ a.high = ~a.high;
return a;
}
return a;
}
+/* Returns A & B. */
+
+static inline double_int
+double_int_and (double_int a, double_int b)
+{
+ a.low &= b.low;
+ a.high &= b.high;
+ return a;
+}
+
+/* Returns A & ~B. */
+
+static inline double_int
+double_int_and_not (double_int a, double_int b)
+{
+ a.low &= ~b.low;
+ a.high &= ~b.high;
+ return a;
+}
+
+/* Returns A ^ B. */
+
+static inline double_int
+double_int_xor (double_int a, double_int b)
+{
+ a.low ^= b.low;
+ a.high ^= b.high;
+ return a;
+}
+
+
/* Shift operations. */
double_int double_int_lshift (double_int, HOST_WIDE_INT, unsigned int, bool);
double_int double_int_rshift (double_int, HOST_WIDE_INT, unsigned int, bool);
+double_int double_int_lrotate (double_int, HOST_WIDE_INT, unsigned int);
+double_int double_int_rrotate (double_int, HOST_WIDE_INT, unsigned int);
/* Returns true if CST is negative. Of course, CST is considered to
be signed. */
int double_int_cmp (double_int, double_int, bool);
int double_int_scmp (double_int, double_int);
int double_int_ucmp (double_int, double_int);
+
+double_int double_int_max (double_int, double_int, bool);
+double_int double_int_smax (double_int, double_int);
+double_int double_int_umax (double_int, double_int);
+
+double_int double_int_min (double_int, double_int, bool);
+double_int double_int_smin (double_int, double_int);
+double_int double_int_umin (double_int, double_int);
+
void dump_double_int (FILE *, double_int, bool);
/* Zero and sign extension of numbers in smaller precisions. */
/* Legacy interface with decomposed high/low parts. */
-extern tree force_fit_type_double (tree, unsigned HOST_WIDE_INT, HOST_WIDE_INT,
- int, bool);
-extern int fit_double_type (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
- unsigned HOST_WIDE_INT *, HOST_WIDE_INT *,
- const_tree);
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 *,
extern void rshift_double (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
HOST_WIDE_INT, unsigned int,
unsigned HOST_WIDE_INT *, HOST_WIDE_INT *, bool);
-extern void lrotate_double (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
- HOST_WIDE_INT, unsigned int,
- unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
-extern void rrotate_double (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
- HOST_WIDE_INT, unsigned int,
- unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
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 *,