summaryrefslogtreecommitdiff
path: root/lib/mjit/x86_assembler.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <[email protected]>2022-12-20 21:54:54 -0800
committerTakashi Kokubun <[email protected]>2023-03-05 22:11:20 -0800
commit145c937f3f9600166de7c4c3aceb724d8218cfeb (patch)
treef15efeaab42ac6a7bb78888a9aab44181b77c179 /lib/mjit/x86_assembler.rb
parent8deb0438c48c7c140a1aec1eef055d972aff7507 (diff)
Compile putnil properly
Diffstat (limited to 'lib/mjit/x86_assembler.rb')
-rw-r--r--lib/mjit/x86_assembler.rb26
1 files changed, 23 insertions, 3 deletions
diff --git a/lib/mjit/x86_assembler.rb b/lib/mjit/x86_assembler.rb
index 934bf071c7..bc447e7808 100644
--- a/lib/mjit/x86_assembler.rb
+++ b/lib/mjit/x86_assembler.rb
@@ -43,14 +43,24 @@ module RubyVM::MJIT
def mov(dst, src)
case [dst, src]
- # MOV r/m64, imm32
+ # MOV r/m64, imm32 (Mod 00)
+ in [[Symbol => dst_reg], Integer => src_imm] if r_reg?(dst_reg)
+ # REX.W + C7 /0 id
+ # MI: Operand 1: ModRM:r/m (w), Operand 2: imm8/16/32/64
+ insn(
+ prefix: REX_W,
+ opcode: 0xc7,
+ mod_rm: mod_rm(mod: 0b00, rm: reg_code(dst_reg)), # Mod 00: [reg]
+ imm: imm32(src_imm),
+ )
+ # MOV r/m64, imm32 (Mod 11)
in [Symbol => dst_reg, Integer => src_imm] if r_reg?(dst_reg)
# REX.W + C7 /0 id
# MI: Operand 1: ModRM:r/m (w), Operand 2: imm8/16/32/64
insn(
prefix: REX_W,
opcode: 0xc7,
- mod_rm: mod_rm(mod: 0b11, rm: reg_code(dst_reg)),
+ mod_rm: mod_rm(mod: 0b11, rm: reg_code(dst_reg)), # Mod 11: reg
imm: imm32(src_imm),
)
# MOV r/m64, r64
@@ -60,9 +70,19 @@ module RubyVM::MJIT
insn(
prefix: REX_W,
opcode: 0x89,
- mod_rm: mod_rm(mod: 0b01, reg: reg_code(src_reg), rm: reg_code(dst_reg)), # disp8
+ 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
+ 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)
+ insn(
+ prefix: REX_W,
+ opcode: 0x8b,
+ mod_rm: mod_rm(mod: 0b01, reg: reg_code(dst_reg), rm: reg_code(src_reg)), # Mod 01: [reg]+disp8
+ disp: src_offset,
+ )
else
raise NotImplementedError, "mov: not-implemented input: #{dst.inspect}, #{src.inspect}"
end