Permalink
Browse files

vm_insnhelper.c: inline array aref with integer

internal.h: define inlinable rb_ary_entry_internal.

array.c: use rb_ary_entry_internal.

* Benchmark
ruby --jit mame/optcarrot/bin/optcarrot --benchmark mame/optcarrot/examples/Lan_Master.nes

** Before

checksum: 59662
fps: 58.095175012159686

** After

fps: 59.874751599221526
checksum: 59662

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62388 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information...
k0kubun committed Feb 12, 2018
1 parent 1012e50 commit 1fd816803b3c7c2d0b138e06be578b833a132718
Showing with 23 additions and 12 deletions.
  1. +1 −11 array.c
  2. +16 −0 internal.h
  3. +6 −1 vm_insnhelper.c
View
12 array.c
@@ -1209,17 +1209,7 @@ rb_ary_elt(VALUE ary, long offset)
VALUE
rb_ary_entry(VALUE ary, long offset)
{
long len = RARRAY_LEN(ary);
const VALUE *ptr = RARRAY_CONST_PTR(ary);
if (len == 0) return Qnil;
if (offset < 0) {
offset += len;
if (offset < 0) return Qnil;
}
else if (len <= offset) {
return Qnil;
}
return ptr[offset];
return rb_ary_entry_internal(ary, offset);
}
VALUE
View
@@ -1093,6 +1093,22 @@ VALUE rb_check_to_array(VALUE ary);
})
#endif
static inline VALUE
rb_ary_entry_internal(VALUE ary, long offset)
{
long len = RARRAY_LEN(ary);
const VALUE *ptr = RARRAY_CONST_PTR(ary);
if (len == 0) return Qnil;
if (offset < 0) {
offset += len;
if (offset < 0) return Qnil;
}
else if (len <= offset) {
return Qnil;
}
return ptr[offset];
}
/* bignum.c */
extern const char ruby_digitmap[];
double rb_big_fdiv_double(VALUE x, VALUE y);
View
@@ -3647,7 +3647,12 @@ vm_opt_aref(VALUE recv, VALUE obj)
}
else if (RBASIC_CLASS(recv) == rb_cArray &&
BASIC_OP_UNREDEFINED_P(BOP_AREF, ARRAY_REDEFINED_OP_FLAG)) {
return rb_ary_aref1(recv, obj);
if (FIXNUM_P(obj)) {
return rb_ary_entry_internal(recv, FIX2LONG(obj));
}
else {
return rb_ary_aref1(recv, obj);
}
}
else if (RBASIC_CLASS(recv) == rb_cHash &&
BASIC_OP_UNREDEFINED_P(BOP_AREF, HASH_REDEFINED_OP_FLAG)) {

0 comments on commit 1fd8168

Please sign in to comment.