diff options
author | Takashi Kokubun <[email protected]> | 2023-02-07 00:17:13 -0800 |
---|---|---|
committer | Takashi Kokubun <[email protected]> | 2023-03-05 22:11:20 -0800 |
commit | 6c1b1fa1f52f7c79b98a6b86f4f1f03f069dd36b (patch) | |
tree | 8e7b58b688c2e3f6f3877ae2ef2f90a25985c6ac /lib/ruby_vm/mjit/insn_compiler.rb | |
parent | 4bb4479165209af59efae2dd3248873eecc3d4f5 (diff) |
Refactor BranchStub
Diffstat (limited to 'lib/ruby_vm/mjit/insn_compiler.rb')
-rw-r--r-- | lib/ruby_vm/mjit/insn_compiler.rb | 44 |
1 files changed, 19 insertions, 25 deletions
diff --git a/lib/ruby_vm/mjit/insn_compiler.rb b/lib/ruby_vm/mjit/insn_compiler.rb index fb8b4af4ab..55d2e072f0 100644 --- a/lib/ruby_vm/mjit/insn_compiler.rb +++ b/lib/ruby_vm/mjit/insn_compiler.rb @@ -279,45 +279,38 @@ module RubyVM::MJIT ctx.stack_pop(1) # Set stubs - # TODO: reuse already-compiled blocks jumped from different blocks branch_stub = BranchStub.new( iseq: jit.iseq, - ctx: ctx.dup, - branch_target_pc: jit.pc + (jit.insn.len + jit.operand(0)) * C.VALUE.size, - fallthrough_pc: jit.pc + jit.insn.len * C.VALUE.size, + shape: Default, + target0: BranchTarget.new(ctx:, pc: jit.pc + C.VALUE.size * (jit.insn.len + jit.operand(0))), # branch target + target1: BranchTarget.new(ctx:, pc: jit.pc + C.VALUE.size * jit.insn.len), # fallthrough ) - branch_stub.branch_target_addr = Assembler.new.then do |ocb_asm| + branch_stub.target0.address = Assembler.new.then do |ocb_asm| @exit_compiler.compile_branch_stub(jit, ctx, ocb_asm, branch_stub, true) @ocb.write(ocb_asm) end - branch_stub.fallthrough_addr = Assembler.new.then do |ocb_asm| + branch_stub.target1.address = Assembler.new.then do |ocb_asm| @exit_compiler.compile_branch_stub(jit, ctx, ocb_asm, branch_stub, false) @ocb.write(ocb_asm) end - # Prepare codegen for all cases - branch_stub.branch_target_next = proc do |branch_asm| + # Jump to target0 on jz + branch_stub.compile = proc do |branch_asm| + branch_asm.comment("branchunless #{branch_stub.shape}") branch_asm.stub(branch_stub) do - branch_asm.comment('branch_target_next') - branch_asm.jnz(branch_stub.fallthrough_addr) - end - end - branch_stub.fallthrough_next = proc do |branch_asm| - branch_asm.stub(branch_stub) do - branch_asm.comment('fallthrough_next') - branch_asm.jz(branch_stub.branch_target_addr) - end - end - branch_stub.neither_next = proc do |branch_asm| - branch_asm.stub(branch_stub) do - branch_asm.comment('neither_next') - branch_asm.jz(branch_stub.branch_target_addr) - branch_asm.jmp(branch_stub.fallthrough_addr) + case branch_stub.shape + in Default + branch_asm.jz(branch_stub.target0.address) + branch_asm.jmp(branch_stub.target1.address) + in Next0 + branch_asm.jnz(branch_stub.target1.address) + in Next1 + branch_asm.jz(branch_stub.target0.address) + end end end + branch_stub.compile.call(asm) - # Just jump to stubs - branch_stub.neither_next.call(asm) EndBlock end @@ -598,6 +591,7 @@ module RubyVM::MJIT asm.incr_counter(:send_protected) return CantCompile # TODO: support this else + # TODO: Change them to a constant and use case-in instead raise 'unreachable' end |