summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-10-02 21:17:13 +0000
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-10-02 21:17:13 +0000
commit1b5acebef2d447a3dbed6cf5e146fda74b81f10d (patch)
treed1d9ce1d3ccf154fcf2a780aa1f6861878f50e46
parent7f284516842bd732770ad0cb2223638dd98d33a1 (diff)
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
-rw-r--r--ChangeLog5
-rw-r--r--st.c25
2 files changed, 26 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 9dffbed6f45..21d35117d2d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Oct 3 06:06:28 2014 Eric Wong <e@80x24.org>
+
+ * 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 <e@80x24.org>
* vm_trace.c (rb_tp_t): pack 56 => 48 bytes on 64-bit
diff --git a/st.c b/st.c
index fa3fa3f037f..ac58e4d44be 100644
--- a/st.c
+++ b/st.c
@@ -141,13 +141,30 @@ remove_safe_packed_entry(st_table *table, st_index_t i, st_data_t never)
}
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<<i) > size) return 1<<i;
- }
+ if (size && (size & ~(size - 1)) == size) /* already a power-of-two? */
+ return size;
+
+ n = next_pow2(size);
+ if (n > size)
+ return n;
#ifndef NOT_RUBY
rb_raise(rb_eRuntimeError, "st_table too big");
#endif