summaryrefslogtreecommitdiff
path: root/lib/ruby_vm/mjit/assembler.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <[email protected]>2023-01-07 21:24:30 -0800
committerTakashi Kokubun <[email protected]>2023-03-05 22:11:20 -0800
commitfa0b9c1c97ba1ab03e2675ce96bceda9ef046127 (patch)
tree358201d8036c7ffba93990d4c740519bebbaa8f5 /lib/ruby_vm/mjit/assembler.rb
parentd09c723975a4386d283ca914a7369340fd07d925 (diff)
Initial implementation of send
Diffstat (limited to 'lib/ruby_vm/mjit/assembler.rb')
-rw-r--r--lib/ruby_vm/mjit/assembler.rb32
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/ruby_vm/mjit/assembler.rb b/lib/ruby_vm/mjit/assembler.rb
index 543d94bef2..c9f179c3b9 100644
--- a/lib/ruby_vm/mjit/assembler.rb
+++ b/lib/ruby_vm/mjit/assembler.rb
@@ -136,6 +136,10 @@ module RubyVM::MJIT
in Integer => dst_addr
# E9 cd
insn(opcode: 0xe9, imm: rel32(dst_addr))
+ # JMP r/m64 (Mod 01: [reg]+disp8)
+ in [Symbol => dst_reg, Integer => dst_disp] if imm8?(dst_disp)
+ # FF /4
+ insn(opcode: 0xff, mod_rm: ModRM[mod: Mod01, reg: 4, rm: dst_reg], disp: dst_disp)
# JMP r/m64 (Mod 11: reg)
in Symbol => dst_reg
# FF /4
@@ -145,6 +149,17 @@ module RubyVM::MJIT
end
end
+ def jne(dst)
+ case dst
+ # JNE rel32
+ in Integer => dst_addr
+ # 0F 85 cd
+ insn(opcode: [0x0f, 0x85], imm: rel32(dst_addr))
+ else
+ raise NotImplementedError, "jne: not-implemented operands: #{dst.inspect}"
+ end
+ end
+
def jnz(dst)
case dst
# JNZ rel32
@@ -182,6 +197,23 @@ module RubyVM::MJIT
end
end
+ def lea(dst, src)
+ case [dst, src]
+ # LEA r64,m (Mod 01: [reg]+disp8)
+ in [Symbol => dst_reg, [Symbol => src_reg, Integer => src_disp]] if r64?(dst_reg) && r64?(src_reg) && imm8?(src_disp)
+ # REX.W + 8D /r
+ # RM: Operand 1: ModRM:reg (w), Operand 2: ModRM:r/m (r)
+ insn(
+ prefix: REX_W,
+ opcode: 0x8d,
+ mod_rm: ModRM[mod: Mod01, reg: dst_reg, rm: src_reg],
+ disp: src_disp,
+ )
+ else
+ raise NotImplementedError, "lea: not-implemented operands: #{dst.inspect}, #{src.inspect}"
+ end
+ end
+
def mov(dst, src)
case dst
in Symbol => dst_reg