From 1b5acebef2d447a3dbed6cf5e146fda74b81f10d Mon Sep 17 00:00:00 2001 From: normal Date: Thu, 2 Oct 2014 21:17:13 +0000 Subject: [PATCH] st.c (new_size): use next_pow2 function Reduces object size slightly on x86-64: text data bss dec hex filename 2782359 22400 71880 2876639 2be4df ruby.orig 2781831 22400 71880 2876111 2be2cf ruby.pow2 And on 32-bit x86: text data bss dec hex filename 2814751 12100 30552 2857403 2b99bb ruby.orig 2814051 12100 30552 2856703 2b96ff ruby.pow2 This is not a performance-critical function, but the smaller icache footprint seems worth it. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47767 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ st.c | 25 +++++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9dffbed6f4..21d35117d2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri Oct 3 06:06:28 2014 Eric Wong + + * st.c (next_pow2): new function (from old bignum.c) + (new_size): use next_pow2 function + Fri Oct 3 05:58:58 2014 Eric Wong * vm_trace.c (rb_tp_t): pack 56 => 48 bytes on 64-bit diff --git a/st.c b/st.c index fa3fa3f037..ac58e4d44b 100644 --- a/st.c +++ b/st.c @@ -140,14 +140,31 @@ remove_safe_packed_entry(st_table *table, st_index_t i, st_data_t never) PHASH_SET(table, i, 0); } +static st_index_t +next_pow2(st_index_t x) +{ + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; +#if SIZEOF_ST_INDEX_T == 8 + x |= x >> 32; +#endif + return x + 1; +} + static st_index_t new_size(st_index_t size) { - st_index_t i; + st_index_t n; - for (i=3; i<31; i++) { - if ((st_index_t)(1< size) return 1< size) + return n; #ifndef NOT_RUBY rb_raise(rb_eRuntimeError, "st_table too big"); #endif