1
0
Fork 0
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:
normal 2014-10-02 21:17:13 +00:00
parent 7f28451684
commit 1b5acebef2
2 changed files with 26 additions and 4 deletions

View file

@ -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
View file

@ -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