mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
This commit is contained in:
parent
7f28451684
commit
1b5acebef2
2 changed files with 26 additions and 4 deletions
|
@ -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>
|
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
|
* vm_trace.c (rb_tp_t): pack 56 => 48 bytes on 64-bit
|
||||||
|
|
25
st.c
25
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);
|
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
|
static st_index_t
|
||||||
new_size(st_index_t size)
|
new_size(st_index_t size)
|
||||||
{
|
{
|
||||||
st_index_t i;
|
st_index_t n;
|
||||||
|
|
||||||
for (i=3; i<31; i++) {
|
if (size && (size & ~(size - 1)) == size) /* already a power-of-two? */
|
||||||
if ((st_index_t)(1<<i) > size) return 1<<i;
|
return size;
|
||||||
}
|
|
||||||
|
n = next_pow2(size);
|
||||||
|
if (n > size)
|
||||||
|
return n;
|
||||||
#ifndef NOT_RUBY
|
#ifndef NOT_RUBY
|
||||||
rb_raise(rb_eRuntimeError, "st_table too big");
|
rb_raise(rb_eRuntimeError, "st_table too big");
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue