diff options
author | Takashi Kokubun <[email protected]> | 2022-12-20 23:38:00 -0800 |
---|---|---|
committer | Takashi Kokubun <[email protected]> | 2023-03-05 22:11:20 -0800 |
commit | dfa19a16586b0760d1644170a5096ec6bf4831fd (patch) | |
tree | 8592c7ac3a748081638308169a953f389c0279db | |
parent | 145c937f3f9600166de7c4c3aceb724d8218cfeb (diff) |
Properly return a value from the stack as well
-rw-r--r-- | lib/mjit/insn_compiler.rb | 2 | ||||
-rw-r--r-- | lib/mjit/x86_assembler.rb | 11 |
2 files changed, 11 insertions, 2 deletions
diff --git a/lib/mjit/insn_compiler.rb b/lib/mjit/insn_compiler.rb index 4dbb19a96e..6941000b80 100644 --- a/lib/mjit/insn_compiler.rb +++ b/lib/mjit/insn_compiler.rb @@ -18,7 +18,7 @@ module RubyVM::MJIT asm.mov([:rdi, C.rb_execution_context_t.offsetof(:cfp)], :rsi) # ec->cfp = rsi # return a value - asm.mov(:rax, 1001) + asm.mov(:rax, [:rbx]) asm.ret EndBlock end diff --git a/lib/mjit/x86_assembler.rb b/lib/mjit/x86_assembler.rb index bc447e7808..d9d9730299 100644 --- a/lib/mjit/x86_assembler.rb +++ b/lib/mjit/x86_assembler.rb @@ -73,7 +73,16 @@ module RubyVM::MJIT mod_rm: mod_rm(mod: 0b01, reg: reg_code(src_reg), rm: reg_code(dst_reg)), # Mod 01: [reg]+disp8 disp: dst_offset, ) - # MOV r64, r/m64 + # MOV r64, r/m64 (Mod 00) + in [Symbol => dst_reg, [Symbol => src_reg]] if r_reg?(dst_reg) && r_reg?(src_reg) + # REX.W + 8B /r + # RM: Operand 1: ModRM:reg (w), Operand 2: ModRM:r/m (r) + insn( + prefix: REX_W, + opcode: 0x8b, + mod_rm: mod_rm(mod: 0b00, reg: reg_code(dst_reg), rm: reg_code(src_reg)), # Mod 00: [reg] + ) + # MOV r64, r/m64 (Mod 01) in [Symbol => dst_reg, [Symbol => src_reg, Integer => src_offset]] if r_reg?(dst_reg) && r_reg?(src_reg) && src_offset <= 0xff # REX.W + 8B /r # RM: Operand 1: ModRM:reg (w), Operand 2: ModRM:r/m (r) |