summaryrefslogtreecommitdiff
path: root/mjit_compiler.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <[email protected]>2022-09-04 21:53:46 -0700
committerGitHub <[email protected]>2022-09-04 21:53:46 -0700
commit3767c6a90d8970f9b39e9ed116a7b9bbac3f9f26 (patch)
tree36e1c581b45edebcba4b33e1ca3f35c6fffa05f4 /mjit_compiler.rb
parent277498e2a2b62b564e3d39ca54aa15b6e8a2c41a (diff)
Ruby MJIT (#6028)
Notes
Notes: Merged-By: k0kubun <[email protected]>
Diffstat (limited to 'mjit_compiler.rb')
-rw-r--r--mjit_compiler.rb135
1 files changed, 135 insertions, 0 deletions
diff --git a/mjit_compiler.rb b/mjit_compiler.rb
new file mode 100644
index 0000000000..565649acbe
--- /dev/null
+++ b/mjit_compiler.rb
@@ -0,0 +1,135 @@
+# frozen_string_literal: true
+# TODO: Merge this to mjit.rb
+if RubyVM::MJIT.enabled?
+ begin
+ require 'etc'
+ rescue LoadError
+ return # skip miniruby
+ end
+
+ case RUBY_PLATFORM.split('-', 2).first
+ when 'x86_64', 'aarch64', 'arm64'
+ require 'mjit/c_64'
+ else
+ require 'mjit/c_32'
+ end
+
+ class << RubyVM::MJIT::C
+ def ROBJECT_EMBED_LEN_MAX
+ Primitive.cexpr! 'INT2NUM(RBIMPL_EMBED_LEN_MAX_OF(VALUE))'
+ end
+
+ def cdhash_to_hash(cdhash_addr)
+ Primitive.cdhash_to_hash(cdhash_addr)
+ end
+
+ def builtin_compiler(f, bf, index, stack_size, builtin_inline_p)
+ bf_addr = bf.to_i
+ Primitive.builtin_compile(f, bf_addr, index, stack_size, builtin_inline_p)
+ end
+
+ def has_cache_for_send(cc, insn)
+ cc_addr = cc.to_i
+ Primitive.has_cache_for_send(cc_addr, insn)
+ end
+
+ def rb_iseq_check(iseq)
+ iseq_addr = iseq.to_i
+ iseq_addr = Primitive.cexpr! 'PTR2NUM((VALUE)rb_iseq_check((rb_iseq_t *)NUM2PTR(iseq_addr)))'
+ rb_iseq_t.new(iseq_addr)
+ end
+
+ def rb_iseq_path(iseq)
+ iseq_addr = iseq.to_i
+ Primitive.cexpr! 'rb_iseq_path((rb_iseq_t *)NUM2PTR(iseq_addr))'
+ end
+
+ def vm_ci_argc(ci)
+ ci_addr = ci.to_i
+ Primitive.cexpr! 'UINT2NUM(vm_ci_argc((CALL_INFO)NUM2PTR(ci_addr)))'
+ end
+
+ def vm_ci_flag(ci)
+ ci_addr = ci.to_i
+ Primitive.cexpr! 'UINT2NUM(vm_ci_flag((CALL_INFO)NUM2PTR(ci_addr)))'
+ end
+
+ def rb_splat_or_kwargs_p(ci)
+ ci_addr = ci.to_i
+ Primitive.cexpr! 'RBOOL(rb_splat_or_kwargs_p((CALL_INFO)NUM2PTR(ci_addr)))'
+ end
+
+ def fastpath_applied_iseq_p(ci, cc, iseq)
+ ci_addr = ci.to_i
+ cc_addr = cc.to_i
+ iseq_addr = iseq.to_i
+ Primitive.cexpr! 'RBOOL(fastpath_applied_iseq_p((CALL_INFO)NUM2PTR(ci_addr), (CALL_CACHE)NUM2PTR(cc_addr), (rb_iseq_t *)NUM2PTR(iseq_addr)))'
+ end
+
+ def mjit_opts
+ addr = Primitive.cexpr! 'PTR2NUM((VALUE)&mjit_opts)'
+ mjit_options.new(addr)
+ end
+
+ def mjit_call_attribute_sp_inc(insn, operands)
+ operands_addr = operands.to_i
+ Primitive.cexpr! 'LONG2NUM(mjit_call_attribute_sp_inc(NUM2INT(insn), (VALUE *)NUM2PTR(operands_addr)))'
+ end
+
+ def mjit_capture_cc_entries(compiled_body, captured_body)
+ compiled_body_addr = compiled_body.to_i
+ captured_body_addr = captured_body.to_i
+ Primitive.cexpr! 'INT2NUM(mjit_capture_cc_entries((struct rb_iseq_constant_body *)NUM2PTR(compiled_body_addr), (struct rb_iseq_constant_body *)NUM2PTR(captured_body_addr)))'
+ end
+
+ #const struct rb_iseq_constant_body *body, union iseq_inline_storage_entry *is_entries
+ def mjit_capture_is_entries(body, is_entries)
+ body_addr = body.to_i
+ is_entries_addr = is_entries.to_i
+ Primitive.cstmt! %{
+ mjit_capture_is_entries((struct rb_iseq_constant_body *)NUM2PTR(body_addr), (union iseq_inline_storage_entry *)NUM2PTR(is_entries_addr));
+ return Qnil;
+ }
+ end
+
+ def rb_vm_insn_decode(encoded)
+ Primitive.cexpr! 'INT2NUM(rb_vm_insn_decode(NUM2PTR(encoded)))'
+ end
+
+ def insn_may_depend_on_sp_or_pc(insn, opes)
+ opes_addr = opes.to_i
+ Primitive.cexpr! 'RBOOL(insn_may_depend_on_sp_or_pc(NUM2INT(insn), (VALUE *)NUM2PTR(opes_addr)))'
+ end
+
+ # Convert Integer VALUE to an actual Ruby object
+ def to_ruby(value)
+ Primitive.cexpr! '(VALUE)NUM2PTR(value)'
+ end
+
+ def debug(status)
+ cc_entries_addr = status.compiled_iseq.jit_unit.cc_entries.instance_variable_get(:@addr)
+ Primitive.cstmt! %{
+ const struct rb_callcache **cc_entries = (const struct rb_callcache **)NUM2PTR(cc_entries_addr);
+ fprintf(stderr, "debug: %p\n", cc_entries[0]);
+ return Qnil;
+ }
+ end
+
+ # TODO: remove this after migration
+ def fprintf(f, str)
+ Primitive.cstmt! %{
+ fprintf((FILE *)NUM2PTR(f), "%s", RSTRING_PTR(str));
+ return Qnil;
+ }
+ end
+
+ def rb_cFalseClass; Primitive.cexpr! 'PTR2NUM(rb_cFalseClass)' end
+ def rb_cNilClass; Primitive.cexpr! 'PTR2NUM(rb_cNilClass)' end
+ def rb_cTrueClass; Primitive.cexpr! 'PTR2NUM(rb_cTrueClass)' end
+ def rb_cInteger; Primitive.cexpr! 'PTR2NUM(rb_cInteger)' end
+ def rb_cSymbol; Primitive.cexpr! 'PTR2NUM(rb_cSymbol)' end
+ def rb_cFloat; Primitive.cexpr! 'PTR2NUM(rb_cFloat)' end
+ end
+
+ require "mjit/compiler"
+end