diff options
author | Richard Henderson <rth@redhat.com> | 2010-08-05 12:41:31 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2010-08-05 12:41:31 -0700 |
commit | bd95721f862876dac7d1560806b18015bb5bbeb6 (patch) | |
tree | ebb0bcbba694540435097fb9c41ec0f70c57ab41 /gcc/explow.c | |
parent | 55b324a67cf91568372f4e93c7dae01a572de9f4 (diff) | |
download | gcc-bd95721f862876dac7d1560806b18015bb5bbeb6.zip gcc-bd95721f862876dac7d1560806b18015bb5bbeb6.tar.gz gcc-bd95721f862876dac7d1560806b18015bb5bbeb6.tar.bz2 |
Replace exact_log2(x & -x) in favor of more direct computation.
* toplev.h (ctz_hwi, clz_hwi, ffs_hwi): New.
(floor_log2): Use clz_hwi.
(exact_log2): Use ctz_hwi.
* toplev.c (ctz_hwi, clz_hwi, ffs_hwi): New.
* builtins.c (fold_builtin_bitop): Use them.
* simplify-rtx.c (simplify_const_unary_operation): Likewise.
* combine.c (get_pos_from_mask): Use ctz_hwi.
* double-int.c (double_int_ctz): Likewise.
* explow.c (force_reg): Likewise.
* tree.h (SET_DECL_OFFSET_ALIGN): Use ffs_hwi.
From-SVN: r162920
Diffstat (limited to 'gcc/explow.c')
-rw-r--r-- | gcc/explow.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/gcc/explow.c b/gcc/explow.c index 09f786a..6f60b2e 100644 --- a/gcc/explow.c +++ b/gcc/explow.c @@ -707,9 +707,13 @@ force_reg (enum machine_mode mode, rtx x) if (SYMBOL_REF_DECL (s) && DECL_P (SYMBOL_REF_DECL (s))) sa = DECL_ALIGN (SYMBOL_REF_DECL (s)); - ca = exact_log2 (INTVAL (c) & -INTVAL (c)) * BITS_PER_UNIT; - - align = MIN (sa, ca); + if (INTVAL (c) == 0) + align = sa; + else + { + ca = ctz_hwi (INTVAL (c)) * BITS_PER_UNIT; + align = MIN (sa, ca); + } } if (align || (MEM_P (x) && MEM_POINTER (x))) |