From 59ff7b6e271e2d9b3cd5df791e039d9c12d178e0 Mon Sep 17 00:00:00 2001 From: rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Thu, 12 Aug 2004 04:01:04 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@85848 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 2ab0e90305db..e3cd92d37258 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 0b225c05e029..f7e90be6eaac 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 3a0acd707259..661cb8b31738 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. */ -- GitLab