diff options
author | Peter Zhu <peter@peterzhu.ca> | 2022-07-11 10:09:39 -0400 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2022-07-15 09:21:07 -0400 |
commit | 7424ea184f9d67c1c7f3ee97494ed3bd1aa60833 (patch) | |
tree | 822838e39d81cd2785c970cb45a86854823af6fe /tool/ruby_vm/views | |
parent | 7fda741f6e67b809b08423f0d4e903c078da2eed (diff) | |
download | ruby-7424ea184f9d67c1c7f3ee97494ed3bd1aa60833.tar.gz |
Implement Objects on VWA
This commit implements Objects on Variable Width Allocation. This allows
Objects with more ivars to be embedded (i.e. contents directly follow the
object header) which improves performance through better cache locality.
Diffstat (limited to 'tool/ruby_vm/views')
-rw-r--r-- | tool/ruby_vm/views/_mjit_compile_ivar.erb | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/tool/ruby_vm/views/_mjit_compile_ivar.erb b/tool/ruby_vm/views/_mjit_compile_ivar.erb index 5105584ba3..1425b3b055 100644 --- a/tool/ruby_vm/views/_mjit_compile_ivar.erb +++ b/tool/ruby_vm/views/_mjit_compile_ivar.erb @@ -30,15 +30,24 @@ fprintf(f, " VM_ASSERT((rb_serial_t)%"PRI_SERIALT_PREFIX"u == RCLASS_SERIAL(RBASIC(obj)->klass));\n", ic_copy->entry->class_serial); fprintf(f, " VM_ASSERT(index < ROBJECT_NUMIV(obj));\n"); % if insn.name == 'setinstancevariable' +#if USE_RVARGC + fprintf(f, " if (LIKELY(!RB_OBJ_FROZEN_RAW(obj) && index < ROBJECT_NUMIV(obj))) {\n"); + fprintf(f, " RB_OBJ_WRITE(obj, &ROBJECT_IVPTR(obj)[index], stack[%d]);\n", b->stack_size - 1); +#else fprintf(f, " if (LIKELY(!RB_OBJ_FROZEN_RAW(obj) && %s)) {\n", status->max_ivar_index >= ROBJECT_EMBED_LEN_MAX ? "true" : "RB_FL_ANY_RAW(obj, ROBJECT_EMBED)"); fprintf(f, " RB_OBJ_WRITE(obj, &ROBJECT(obj)->as.%s, stack[%d]);\n", status->max_ivar_index >= ROBJECT_EMBED_LEN_MAX ? "heap.ivptr[index]" : "ary[index]", b->stack_size - 1); +#endif fprintf(f, " }\n"); % else fprintf(f, " VALUE val;\n"); +#if USE_RVARGC + fprintf(f, " if (LIKELY(index < ROBJECT_NUMIV(obj) && (val = ROBJECT_IVPTR(obj)[index]) != Qundef)) {\n"); +#else fprintf(f, " if (LIKELY(%s && (val = ROBJECT(obj)->as.%s) != Qundef)) {\n", status->max_ivar_index >= ROBJECT_EMBED_LEN_MAX ? "true" : "RB_FL_ANY_RAW(obj, ROBJECT_EMBED)", status->max_ivar_index >= ROBJECT_EMBED_LEN_MAX ? "heap.ivptr[index]" : "ary[index]"); +#endif fprintf(f, " stack[%d] = val;\n", b->stack_size); fprintf(f, " }\n"); %end |