diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-10-02 21:17:13 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-10-02 21:17:13 +0000 |
commit | 1b5acebef2d447a3dbed6cf5e146fda74b81f10d (patch) | |
tree | d1d9ce1d3ccf154fcf2a780aa1f6861878f50e46 /st.c | |
parent | 7f284516842bd732770ad0cb2223638dd98d33a1 (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
Diffstat (limited to 'st.c')
-rw-r--r-- | st.c | 25 |
1 files changed, 21 insertions, 4 deletions
@@ -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 |