summaryrefslogtreecommitdiff
path: root/lib/mjit/x86_assembler.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <[email protected]>2022-12-20 23:38:00 -0800
committerTakashi Kokubun <[email protected]>2023-03-05 22:11:20 -0800
commitdfa19a16586b0760d1644170a5096ec6bf4831fd (patch)
tree8592c7ac3a748081638308169a953f389c0279db /lib/mjit/x86_assembler.rb
parent145c937f3f9600166de7c4c3aceb724d8218cfeb (diff)
Properly return a value from the stack as well
Diffstat (limited to 'lib/mjit/x86_assembler.rb')
-rw-r--r--lib/mjit/x86_assembler.rb11
1 files changed, 10 insertions, 1 deletions
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)