From 159319544b909404d2ba3997c58a0cbe6541030a Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Wed, 11 Aug 2004 21:01:04 -0700 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++ gcc/fold-const.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++ gcc/stor-layout.c | 58 --------------------------------------- 3 files changed, 76 insertions(+), 58 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2ab0e90305d..e3cd92d3725 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-08-12 Richard Henderson + + * 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 * gimplify.c (struct gimplify_init_ctor_preeval_data): New. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 0b225c05e02..f7e90be6eaa 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -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" diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 3a0acd70725..661cb8b3173 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -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. */