summaryrefslogtreecommitdiff
path: root/lib/ruby_vm/mjit/insn_compiler.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <[email protected]>2023-02-07 00:17:13 -0800
committerTakashi Kokubun <[email protected]>2023-03-05 22:11:20 -0800
commit6c1b1fa1f52f7c79b98a6b86f4f1f03f069dd36b (patch)
tree8e7b58b688c2e3f6f3877ae2ef2f90a25985c6ac /lib/ruby_vm/mjit/insn_compiler.rb
parent4bb4479165209af59efae2dd3248873eecc3d4f5 (diff)
Refactor BranchStub
Diffstat (limited to 'lib/ruby_vm/mjit/insn_compiler.rb')
-rw-r--r--lib/ruby_vm/mjit/insn_compiler.rb44
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