GCC Middle and Back End API Reference
double-int.c File Reference
#include "tree.h"
Include dependency graph for double-int.c:

Functions

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 ()
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 ()
void dump_double_int ()
void mpz_set_double_int ()
double_int mpz_get_double_int ()

Function Documentation

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
@verbatim Operations with long integers.

Copyright (C) 2006-2013 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 HOST_WIDE_INT.

Referenced by double_int::add_with_sign().

static void decode ( HOST_WIDE_INT words,
unsigned HOST_WIDE_INT low,
HOST_WIDE_INT hi 
)
static
Pack an array of 4 words into a two-word integer.
   WORDS points to the array of words.
   The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces.   

Referenced by div_and_round_double(), and mul_double_wide_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 decode(), encode(), HOST_WIDE_INT, memset(), and neg_double().

Referenced by double_int::divmod(), double_int::divmod_with_overflow(), and double_int_split_digit().

static unsigned double_int_split_digit ( )
static
Splits last digit of *CST (taken as unsigned) in BASE and returns it.   

References div_and_round_double(), double_int::high, HOST_WIDE_INT, and double_int::low.

Referenced by dump_double_int().

void dump_double_int ( )
static void encode ( )
static
Unpack a two-word integer into 4 words.
   LOW and HI are the integer, as two `HOST_WIDE_INT' pieces.
   WORDS points to the array of HOST_WIDE_INTs.   

Referenced by div_and_round_double(), and mul_double_wide_with_sign().

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
Shift the doubleword integer in L1, H1 left by COUNT places
   keeping only PREC bits of result.
   Shift right if COUNT is negative.
   ARITH nonzero specifies arithmetic shifting; otherwise use logical shift.
   Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.   

References count, HOST_BITS_PER_WIDE_INT, HOST_WIDE_INT, and HOST_WIDE_INT_M1U.

Referenced by double_int::alshift(), double_int::arshift(), double_int::llshift(), double_int::lrshift(), double_int::lshift(), and double_int::rshift().

double_int mpz_get_double_int ( )
Returns VAL converted to TYPE.  If WRAP is true, then out-of-range
   values of VAL will be wrapped; otherwise, they will be set to the
   appropriate minimum or maximum TYPE bound.   

References count, double_int::ext(), get_type_static_bounds(), double_int::high, HOST_WIDE_INT, and double_int::low.

Referenced by gmp_cst_to_tree(), number_of_iterations_lt(), and number_of_iterations_ne().

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 decode(), encode(), HOST_WIDE_INT, memset(), and neg_double().

Referenced by double_int::mul_with_sign(), and double_int::wide_mul_with_sign().

static int neg_double ( unsigned HOST_WIDE_INT  l1,
HOST_WIDE_INT  h1,
unsigned HOST_WIDE_INT lv,
HOST_WIDE_INT hv 
)
static
Negate a doubleword integer with doubleword result.
   Return nonzero if the operation overflows, assuming it's signed.
   The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1.
   The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV.   

Referenced by div_and_round_double(), mul_double_wide_with_sign(), double_int::neg_with_overflow(), double_int::operator-(), double_int::operator-=(), and double_int::sub_with_overflow().

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
Shift the doubleword integer in L1, H1 right by COUNT places
   keeping only PREC bits of result.  ARITH nonzero specifies
   arithmetic shifting; otherwise use logical shift.
   Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV.   

References count, HOST_BITS_PER_WIDE_INT, HOST_WIDE_INT, and HOST_WIDE_INT_M1U.

Referenced by double_int::alshift(), double_int::arshift(), double_int::llshift(), double_int::lrshift(), double_int::lshift(), and double_int::rshift().