stor-layout.c (round_up, round_down): Move ...
* stor-layout.c (round_up, round_down): Move ... * fold-const.c (round_up, round_down): ... here. Use multiple_of_p to avoid any arithmetic at all. From-SVN: r85848
This commit is contained in:
parent
57d1dd8704
commit
159319544b
@ -1,3 +1,9 @@
|
||||
2004-08-12 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* stor-layout.c (round_up, round_down): Move ...
|
||||
* fold-const.c (round_up, round_down): ... here. Use
|
||||
multiple_of_p to avoid any arithmetic at all.
|
||||
|
||||
2004-08-12 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* gimplify.c (struct gimplify_init_ctor_preeval_data): New.
|
||||
|
@ -10678,4 +10678,74 @@ fold_ignored_result (tree t)
|
||||
}
|
||||
}
|
||||
|
||||
/* Return the value of VALUE, rounded up to a multiple of DIVISOR.
|
||||
This can only be applied to objects of a sizetype. */
|
||||
|
||||
tree
|
||||
round_up (tree value, int divisor)
|
||||
{
|
||||
tree div, t;
|
||||
|
||||
if (divisor == 0)
|
||||
abort ();
|
||||
if (divisor == 1)
|
||||
return value;
|
||||
|
||||
div = size_int_type (divisor, TREE_TYPE (value));
|
||||
|
||||
/* See if VALUE is already a multiple of DIVISOR. If so, we don't
|
||||
have to do anything. */
|
||||
if (multiple_of_p (TREE_TYPE (value), value, div))
|
||||
return value;
|
||||
|
||||
/* If divisor is a power of two, simplify this to bit manipulation. */
|
||||
if (divisor == (divisor & -divisor))
|
||||
{
|
||||
t = size_int_type (divisor - 1, TREE_TYPE (value));
|
||||
value = size_binop (PLUS_EXPR, value, t);
|
||||
t = size_int_type (-divisor, TREE_TYPE (value));
|
||||
value = size_binop (BIT_AND_EXPR, value, t);
|
||||
}
|
||||
else
|
||||
{
|
||||
value = size_binop (CEIL_DIV_EXPR, value, div);
|
||||
value = size_binop (MULT_EXPR, value, div);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/* Likewise, but round down. */
|
||||
|
||||
tree
|
||||
round_down (tree value, int divisor)
|
||||
{
|
||||
tree div, t;
|
||||
|
||||
if (divisor == 0)
|
||||
abort ();
|
||||
if (divisor == 1)
|
||||
return value;
|
||||
|
||||
div = size_int_type (divisor, TREE_TYPE (value));
|
||||
|
||||
/* See if VALUE is already a multiple of DIVISOR. If so, we don't
|
||||
have to do anything. */
|
||||
if (multiple_of_p (TREE_TYPE (value), value, div))
|
||||
return value;
|
||||
|
||||
/* If divisor is a power of two, simplify this to bit manipulation. */
|
||||
if (divisor == (divisor & -divisor))
|
||||
{
|
||||
t = size_int_type (-divisor, TREE_TYPE (value));
|
||||
value = size_binop (BIT_AND_EXPR, value, t);
|
||||
}
|
||||
else
|
||||
{
|
||||
value = size_binop (FLOOR_DIV_EXPR, value, div);
|
||||
value = size_binop (MULT_EXPR, value, div);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
#include "gt-fold-const.h"
|
||||
|
@ -269,64 +269,6 @@ get_mode_alignment (enum machine_mode mode)
|
||||
return MIN (BIGGEST_ALIGNMENT, MAX (1, mode_base_align[mode]*BITS_PER_UNIT));
|
||||
}
|
||||
|
||||
/* Return the value of VALUE, rounded up to a multiple of DIVISOR.
|
||||
This can only be applied to objects of a sizetype. */
|
||||
|
||||
tree
|
||||
round_up (tree value, int divisor)
|
||||
{
|
||||
tree t;
|
||||
|
||||
if (divisor == 0)
|
||||
abort ();
|
||||
if (divisor == 1)
|
||||
return value;
|
||||
|
||||
/* If divisor is a power of two, simplify this to bit manipulation. */
|
||||
if (divisor == (divisor & -divisor))
|
||||
{
|
||||
t = size_int_type (divisor - 1, TREE_TYPE (value));
|
||||
value = size_binop (PLUS_EXPR, value, t);
|
||||
t = size_int_type (-divisor, TREE_TYPE (value));
|
||||
value = size_binop (BIT_AND_EXPR, value, t);
|
||||
}
|
||||
else
|
||||
{
|
||||
t = size_int_type (divisor, TREE_TYPE (value));
|
||||
value = size_binop (CEIL_DIV_EXPR, value, t);
|
||||
value = size_binop (MULT_EXPR, value, t);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/* Likewise, but round down. */
|
||||
|
||||
tree
|
||||
round_down (tree value, int divisor)
|
||||
{
|
||||
tree t;
|
||||
|
||||
if (divisor == 0)
|
||||
abort ();
|
||||
if (divisor == 1)
|
||||
return value;
|
||||
|
||||
/* If divisor is a power of two, simplify this to bit manipulation. */
|
||||
if (divisor == (divisor & -divisor))
|
||||
{
|
||||
t = size_int_type (-divisor, TREE_TYPE (value));
|
||||
value = size_binop (BIT_AND_EXPR, value, t);
|
||||
}
|
||||
else
|
||||
{
|
||||
t = size_int_type (divisor, TREE_TYPE (value));
|
||||
value = size_binop (FLOOR_DIV_EXPR, value, t);
|
||||
value = size_binop (MULT_EXPR, value, t);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/* Subroutine of layout_decl: Force alignment required for the data type.
|
||||
But if the decl itself wants greater alignment, don't override that. */
|
||||
|
Loading…
Reference in New Issue
Block a user