|
static 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) |
|
static int | neg_double (unsigned HOST_WIDE_INT, HOST_WIDE_INT, unsigned HOST_WIDE_INT *, HOST_WIDE_INT *) |
|
static 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) |
|
static 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 *) |
|
static void | encode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT low, HOST_WIDE_INT hi) |
|
static void | decode (HOST_WIDE_INT *words, unsigned HOST_WIDE_INT *low, HOST_WIDE_INT *hi) |
|
static void | rshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1, unsigned HOST_WIDE_INT count, unsigned int prec, unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv, bool arith) |
|
static void | lshift_double (unsigned HOST_WIDE_INT l1, HOST_WIDE_INT h1, unsigned HOST_WIDE_INT count, unsigned int prec, unsigned HOST_WIDE_INT *lv, HOST_WIDE_INT *hv) |
|
static unsigned | double_int_split_digit (double_int *cst, unsigned base) |
|
void | dump_double_int (FILE *file, double_int cst, bool uns) |
|
void | mpz_set_double_int (mpz_t result, double_int val, bool uns) |
|
double_int | mpz_get_double_int (const_tree type, mpz_t val, bool wrap) |
|
#define OVERFLOW_SUM_SIGN |
( |
| a, |
|
|
| b, |
|
|
| sum ) |
Value:((~((
a) ^ (
b)) & ((
a) ^ (sum))) < 0)
Ca const poly_int< N, Cb > & b
Definition poly-int.h:771
Ca & a
Definition poly-int.h:770
We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring
overflow. Suppose A, B and SUM have the same respective signs as A1, B1,
and SUM1. Then this yields nonzero if overflow occurred during the
addition.
Overflow occurs if A and B have the same sign, but A and SUM differ in
sign. Use `^' to test whether signs differ, and `< 0' to isolate the
sign.
Referenced by add_double_with_sign(), and double_int::sub_with_overflow().
static int add_double_with_sign |
( |
unsigned HOST_WIDE_INT | l1, |
|
|
HOST_WIDE_INT | h1, |
|
|
unsigned HOST_WIDE_INT | l2, |
|
|
HOST_WIDE_INT | h2, |
|
|
unsigned HOST_WIDE_INT * | lv, |
|
|
HOST_WIDE_INT * | hv, |
|
|
bool | unsigned_p ) |
|
static |
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/>.
Add two doubleword integers with doubleword result.
Return nonzero if the operation overflows according to UNSIGNED_P.
Each argument is given as two `HOST_WIDE_INT' pieces.
One argument is L1 and H1; the other, L2 and H2.
The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.
References OVERFLOW_SUM_SIGN.
Referenced by double_int::add_with_sign().
static int div_and_round_double |
( |
unsigned | code, |
|
|
int | uns, |
|
|
unsigned HOST_WIDE_INT | lnum_orig, |
|
|
HOST_WIDE_INT | hnum_orig, |
|
|
unsigned HOST_WIDE_INT | lden_orig, |
|
|
HOST_WIDE_INT | hden_orig, |
|
|
unsigned HOST_WIDE_INT * | lquo, |
|
|
HOST_WIDE_INT * | hquo, |
|
|
unsigned HOST_WIDE_INT * | lrem, |
|
|
HOST_WIDE_INT * | hrem ) |
|
static |
Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN
for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM).
CODE is a tree code for a kind of division, one of
TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR
or EXACT_DIV_EXPR
It controls how the quotient is rounded to an integer.
Return nonzero if the operation overflows.
UNS nonzero says do unsigned division.
References add_double, BASE, decode(), encode(), gcc_unreachable, HIGHPART, HOST_WIDE_INT_0, HOST_WIDE_INT_1, HOST_WIDE_INT_M1, i, LOWPART, mul_double, and neg_double().
Referenced by double_int::divmod(), double_int::divmod_with_overflow(), and double_int_split_digit().
static void lshift_double |
( |
unsigned HOST_WIDE_INT | l1, |
|
|
HOST_WIDE_INT | h1, |
|
|
unsigned HOST_WIDE_INT | count, |
|
|
unsigned int | prec, |
|
|
unsigned HOST_WIDE_INT * | lv, |
|
|
HOST_WIDE_INT * | hv ) |
|
static |
static int mul_double_wide_with_sign |
( |
unsigned HOST_WIDE_INT | l1, |
|
|
HOST_WIDE_INT | h1, |
|
|
unsigned HOST_WIDE_INT | l2, |
|
|
HOST_WIDE_INT | h2, |
|
|
unsigned HOST_WIDE_INT * | lv, |
|
|
HOST_WIDE_INT * | hv, |
|
|
unsigned HOST_WIDE_INT * | lw, |
|
|
HOST_WIDE_INT * | hw, |
|
|
bool | unsigned_p ) |
|
static |
Multiply two doubleword integers with quadword result.
Return nonzero if the operation overflows according to UNSIGNED_P.
Each argument is given as two `HOST_WIDE_INT' pieces.
One argument is L1 and H1; the other, L2 and H2.
The value is stored as four `HOST_WIDE_INT' pieces in *LV and *HV,
*LW and *HW.
If lw is NULL then only the low part and no overflow is computed.
References add_double, decode(), encode(), HIGHPART, i, LOWPART, neg_double(), and NULL.
Referenced by double_int::mul_with_sign(), and double_int::wide_mul_with_sign().
static void rshift_double |
( |
unsigned HOST_WIDE_INT | l1, |
|
|
HOST_WIDE_INT | h1, |
|
|
unsigned HOST_WIDE_INT | count, |
|
|
unsigned int | prec, |
|
|
unsigned HOST_WIDE_INT * | lv, |
|
|
HOST_WIDE_INT * | hv, |
|
|
bool | arith ) |
|
static |