Commit 3e93ff81 by Anatoly Sokolov Committed by Anatoly Sokolov

rtl.h (CONST_DOUBLE_P): Define.

	* rtl.h (CONST_DOUBLE_P): Define.
	(rtx_to_double_int): Declare.
	* emit-rtl.c (rtx_to_double_int): New function.
	* dwarf2out.c (insert_double): New function.
	(loc_descriptor, add_const_value_attribute): Clean up, use
	rtx_to_double_int and insert_double functions.

From-SVN: r158963
parent bcbc9564
2010-05-01 Anatoly Sokolov <aesok@post.ru>
* rtl.h (CONST_DOUBLE_P): Define.
(rtx_to_double_int): Declare.
* emit-rtl.c (rtx_to_double_int): New function.
* dwarf2out.c (insert_double): New function.
(loc_descriptor, add_const_value_attribute): Clean up, use
rtx_to_double_int and insert_double functions.
2010-05-01 Jonathan Wakely <jwakely.gcc@gmail.com>
* doc/extend.texi (Inline): Add missing return keyword to examples.
......
......@@ -6116,6 +6116,7 @@ static void add_AT_location_description (dw_die_ref, enum dwarf_attribute,
static void add_data_member_location_attribute (dw_die_ref, tree);
static bool add_const_value_attribute (dw_die_ref, rtx);
static void insert_int (HOST_WIDE_INT, unsigned, unsigned char *);
static void insert_double (double_int, unsigned char *);
static void insert_float (const_rtx, unsigned char *);
static rtx rtl_for_decl_location (tree);
static bool add_location_or_const_value_attribute (dw_die_ref, tree,
......@@ -13887,10 +13888,8 @@ loc_descriptor (rtx rtl, enum machine_mode mode,
else
{
loc_result->dw_loc_oprnd2.val_class = dw_val_class_const_double;
loc_result->dw_loc_oprnd2.v.val_double.high
= CONST_DOUBLE_HIGH (rtl);
loc_result->dw_loc_oprnd2.v.val_double.low
= CONST_DOUBLE_LOW (rtl);
loc_result->dw_loc_oprnd2.v.val_double
= rtx_to_double_int (rtl);
}
}
break;
......@@ -13914,39 +13913,14 @@ loc_descriptor (rtx rtl, enum machine_mode mode,
for (i = 0, p = array; i < length; i++, p += elt_size)
{
rtx elt = CONST_VECTOR_ELT (rtl, i);
HOST_WIDE_INT lo, hi;
switch (GET_CODE (elt))
{
case CONST_INT:
lo = INTVAL (elt);
hi = -(lo < 0);
break;
case CONST_DOUBLE:
lo = CONST_DOUBLE_LOW (elt);
hi = CONST_DOUBLE_HIGH (elt);
break;
default:
gcc_unreachable ();
}
double_int val = rtx_to_double_int (elt);
if (elt_size <= sizeof (HOST_WIDE_INT))
insert_int (lo, elt_size, p);
insert_int (double_int_to_shwi (val), elt_size, p);
else
{
unsigned char *p0 = p;
unsigned char *p1 = p + sizeof (HOST_WIDE_INT);
gcc_assert (elt_size == 2 * sizeof (HOST_WIDE_INT));
if (WORDS_BIG_ENDIAN)
{
p0 = p1;
p1 = p;
}
insert_int (lo, sizeof (HOST_WIDE_INT), p0);
insert_int (hi, sizeof (HOST_WIDE_INT), p1);
insert_double (val, p);
}
}
break;
......@@ -15334,6 +15308,24 @@ extract_int (const unsigned char *src, unsigned int size)
return val;
}
/* Writes double_int values to dw_vec_const array. */
static void
insert_double (double_int val, unsigned char *dest)
{
unsigned char *p0 = dest;
unsigned char *p1 = dest + sizeof (HOST_WIDE_INT);
if (WORDS_BIG_ENDIAN)
{
p0 = p1;
p1 = dest;
}
insert_int ((HOST_WIDE_INT) val.low, sizeof (HOST_WIDE_INT), p0);
insert_int ((HOST_WIDE_INT) val.high, sizeof (HOST_WIDE_INT), p1);
}
/* Writes floating point values to dw_vec_const array. */
static void
......@@ -15413,39 +15405,14 @@ add_const_value_attribute (dw_die_ref die, rtx rtl)
for (i = 0, p = array; i < length; i++, p += elt_size)
{
rtx elt = CONST_VECTOR_ELT (rtl, i);
HOST_WIDE_INT lo, hi;
switch (GET_CODE (elt))
{
case CONST_INT:
lo = INTVAL (elt);
hi = -(lo < 0);
break;
case CONST_DOUBLE:
lo = CONST_DOUBLE_LOW (elt);
hi = CONST_DOUBLE_HIGH (elt);
break;
default:
gcc_unreachable ();
}
double_int val = rtx_to_double_int (elt);
if (elt_size <= sizeof (HOST_WIDE_INT))
insert_int (lo, elt_size, p);
insert_int (double_int_to_shwi (val), elt_size, p);
else
{
unsigned char *p0 = p;
unsigned char *p1 = p + sizeof (HOST_WIDE_INT);
gcc_assert (elt_size == 2 * sizeof (HOST_WIDE_INT));
if (WORDS_BIG_ENDIAN)
{
p0 = p1;
p1 = p;
}
insert_int (lo, sizeof (HOST_WIDE_INT), p0);
insert_int (hi, sizeof (HOST_WIDE_INT), p1);
insert_double (val, p);
}
}
break;
......
......@@ -518,6 +518,27 @@ const_fixed_from_fixed_value (FIXED_VALUE_TYPE value, enum machine_mode mode)
return lookup_const_fixed (fixed);
}
/* Constructs double_int from rtx CST. */
double_int
rtx_to_double_int (const_rtx cst)
{
double_int r;
if (CONST_INT_P (cst))
r = shwi_to_double_int (INTVAL (cst));
else if (CONST_DOUBLE_P (cst) && GET_MODE (cst) == VOIDmode)
{
r.low = CONST_DOUBLE_LOW (cst);
r.high = CONST_DOUBLE_HIGH (cst);
}
else
gcc_unreachable ();
return r;
}
/* Return a CONST_DOUBLE or CONST_INT for a value specified as
a double_int. */
......
......@@ -375,6 +375,10 @@ struct GTY(()) rtvec_def {
/* Predicate yielding nonzero iff X is an rtx for a constant integer. */
#define CONST_INT_P(X) (GET_CODE (X) == CONST_INT)
/* Predicate yielding true iff X is an rtx for a double-int
or floating point constant. */
#define CONST_DOUBLE_P(X) (GET_CODE (X) == CONST_DOUBLE)
/* Predicate yielding nonzero iff X is a label insn. */
#define LABEL_P(X) (GET_CODE (X) == CODE_LABEL)
......@@ -1627,6 +1631,7 @@ extern void start_sequence (void);
extern void push_to_sequence (rtx);
extern void push_to_sequence2 (rtx, rtx);
extern void end_sequence (void);
extern double_int rtx_to_double_int (const_rtx);
extern rtx immed_double_int_const (double_int, enum machine_mode);
extern rtx immed_double_const (HOST_WIDE_INT, HOST_WIDE_INT,
enum machine_mode);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment