diff options
author | Takashi Kokubun <[email protected]> | 2023-01-07 14:06:38 -0800 |
---|---|---|
committer | Takashi Kokubun <[email protected]> | 2023-03-05 22:11:20 -0800 |
commit | 9ef04f56367453d9c3a374bb4dfda2b64ba57924 (patch) | |
tree | 42540fa5a6cba15d45273b45518df44ea7e4e125 /lib/ruby_vm/mjit/assembler.rb | |
parent | ee6d627b434c4bc977c059a0e1d885800de90b63 (diff) |
Implement opt_minus
Diffstat (limited to 'lib/ruby_vm/mjit/assembler.rb')
-rw-r--r-- | lib/ruby_vm/mjit/assembler.rb | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/lib/ruby_vm/mjit/assembler.rb b/lib/ruby_vm/mjit/assembler.rb index 32668ff3c8..adf7fd1821 100644 --- a/lib/ruby_vm/mjit/assembler.rb +++ b/lib/ruby_vm/mjit/assembler.rb @@ -163,6 +163,17 @@ module RubyVM::MJIT end end + def jo(dst) + case dst + # JO rel32 + in Integer => dst_addr + # 0F 80 cd + insn(opcode: [0x0f, 0x80], imm: rel32(dst_addr)) + else + raise NotImplementedError, "jo: not-implemented operands: #{dst.inspect}" + end + end + def jz(dst) case dst # JZ rel8 @@ -333,12 +344,28 @@ module RubyVM::MJIT end end - # RET def ret + # RET # Near return: A return to a procedure within the current code segment insn(opcode: 0xc3) end + def sub(dst, src) + case [dst, src] + # SUB r/m64, r64 (Mod 11: reg) + in [Symbol => dst_reg, Symbol => src_reg] if r64?(dst_reg) && r64?(src_reg) + # REX.W + 29 /r + # MR: Operand 1: ModRM:r/m (r, w), Operand 2: ModRM:reg (r) + insn( + prefix: REX_W, + opcode: 0x29, + mod_rm: ModRM[mod: Mod11, reg: src_reg, rm: dst_reg], + ) + else + raise NotImplementedError, "sub: not-implemented operands: #{dst.inspect}, #{src.inspect}" + end + end + def test(left, right) case [left, right] # TEST r/m8*, imm8 (Mod 01: [reg]+disp8) |