Split branches for mov src and dst
This commit is contained in:
parent
5760f7fd3c
commit
e9535a439b
@ -19,14 +19,14 @@ module RubyVM::MJIT
|
|||||||
def leave(jit, ctx, asm)
|
def leave(jit, ctx, asm)
|
||||||
assert_eq!(ctx.stack_size, 1)
|
assert_eq!(ctx.stack_size, 1)
|
||||||
|
|
||||||
asm.comment("RUBY_VM_CHECK_INTS(ec)")
|
asm.comment('RUBY_VM_CHECK_INTS(ec)')
|
||||||
asm.mov(:eax, [EC, C.rb_execution_context_t.offsetof(:interrupt_flag)])
|
asm.mov(:eax, [EC, C.rb_execution_context_t.offsetof(:interrupt_flag)])
|
||||||
asm.test(:eax, :eax)
|
asm.test(:eax, :eax)
|
||||||
asm.jz(not_interrupted = asm.new_label(:not_interrupted))
|
asm.jz(not_interrupted = asm.new_label(:not_interrupted))
|
||||||
Compiler.compile_exit(jit, ctx, asm) # TODO: use ocb
|
Compiler.compile_exit(jit, ctx, asm) # TODO: use ocb
|
||||||
asm.write_label(not_interrupted)
|
asm.write_label(not_interrupted)
|
||||||
|
|
||||||
asm.comment("pop stack frame")
|
asm.comment('pop stack frame')
|
||||||
asm.add(CFP, C.rb_control_frame_t.size) # cfp = cfp + 1
|
asm.add(CFP, C.rb_control_frame_t.size) # cfp = cfp + 1
|
||||||
asm.mov([EC, C.rb_execution_context_t.offsetof(:cfp)], CFP) # ec->cfp = cfp
|
asm.mov([EC, C.rb_execution_context_t.offsetof(:cfp)], CFP) # ec->cfp = cfp
|
||||||
|
|
||||||
|
@ -68,9 +68,20 @@ module RubyVM::MJIT
|
|||||||
end
|
end
|
||||||
|
|
||||||
def mov(dst, src)
|
def mov(dst, src)
|
||||||
case [dst, src]
|
case dst
|
||||||
|
in Symbol => dst_reg
|
||||||
|
case src
|
||||||
|
# MOV r64, r/m64 (Mod 00)
|
||||||
|
in [Symbol => src_reg] if r64?(dst_reg) && r64?(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 r32 r/m32 (Mod 01)
|
# MOV r32 r/m32 (Mod 01)
|
||||||
in [Symbol => dst_reg, [Symbol => src_reg, Integer => src_disp]] if r32?(dst_reg) && imm8?(src_disp)
|
in [Symbol => src_reg, Integer => src_disp] if r32?(dst_reg) && imm8?(src_disp)
|
||||||
# 8B /r
|
# 8B /r
|
||||||
# RM: Operand 1: ModRM:reg (w), Operand 2: ModRM:r/m (r)
|
# RM: Operand 1: ModRM:reg (w), Operand 2: ModRM:r/m (r)
|
||||||
insn(
|
insn(
|
||||||
@ -78,18 +89,18 @@ module RubyVM::MJIT
|
|||||||
mod_rm: mod_rm(mod: 0b01, reg: reg_code(dst_reg), rm: reg_code(src_reg)), # Mod 01: [reg]+disp8
|
mod_rm: mod_rm(mod: 0b01, reg: reg_code(dst_reg), rm: reg_code(src_reg)), # Mod 01: [reg]+disp8
|
||||||
disp: src_disp,
|
disp: src_disp,
|
||||||
)
|
)
|
||||||
# MOV r/m64, imm32 (Mod 00)
|
# MOV r64, r/m64 (Mod 01)
|
||||||
in [[Symbol => dst_reg], Integer => src_imm] if r64?(dst_reg)
|
in [Symbol => src_reg, Integer => src_disp] if r64?(dst_reg) && r64?(src_reg) && imm8?(src_disp)
|
||||||
# REX.W + C7 /0 id
|
# REX.W + 8B /r
|
||||||
# MI: Operand 1: ModRM:r/m (w), Operand 2: imm8/16/32/64
|
# RM: Operand 1: ModRM:reg (w), Operand 2: ModRM:r/m (r)
|
||||||
insn(
|
insn(
|
||||||
prefix: REX_W,
|
prefix: REX_W,
|
||||||
opcode: 0xc7,
|
opcode: 0x8b,
|
||||||
mod_rm: mod_rm(mod: 0b00, rm: reg_code(dst_reg)), # Mod 00: [reg]
|
mod_rm: mod_rm(mod: 0b01, reg: reg_code(dst_reg), rm: reg_code(src_reg)), # Mod 01: [reg]+disp8
|
||||||
imm: imm32(src_imm),
|
disp: src_disp,
|
||||||
)
|
)
|
||||||
# MOV r/m64, imm32 (Mod 11)
|
# MOV r/m64, imm32 (Mod 11)
|
||||||
in [Symbol => dst_reg, Integer => src_imm] if r64?(dst_reg) && imm32?(src_imm)
|
in Integer => src_imm if r64?(dst_reg) && imm32?(src_imm)
|
||||||
# REX.W + C7 /0 id
|
# REX.W + C7 /0 id
|
||||||
# MI: Operand 1: ModRM:r/m (w), Operand 2: imm8/16/32/64
|
# MI: Operand 1: ModRM:r/m (w), Operand 2: imm8/16/32/64
|
||||||
insn(
|
insn(
|
||||||
@ -99,7 +110,7 @@ module RubyVM::MJIT
|
|||||||
imm: imm32(src_imm),
|
imm: imm32(src_imm),
|
||||||
)
|
)
|
||||||
# MOV r64, imm64
|
# MOV r64, imm64
|
||||||
in [Symbol => dst_reg, Integer => src_imm] if r64?(dst_reg) && imm64?(src_imm)
|
in Integer => src_imm if r64?(dst_reg) && imm64?(src_imm)
|
||||||
# REX.W + B8+ rd io
|
# REX.W + B8+ rd io
|
||||||
# OI: Operand 1: opcode + rd (w), Operand 2: imm8/16/32/64
|
# OI: Operand 1: opcode + rd (w), Operand 2: imm8/16/32/64
|
||||||
insn(
|
insn(
|
||||||
@ -107,8 +118,26 @@ module RubyVM::MJIT
|
|||||||
opcode: 0xb8 + reg_code(dst_reg),
|
opcode: 0xb8 + reg_code(dst_reg),
|
||||||
imm: imm64(src_imm),
|
imm: imm64(src_imm),
|
||||||
)
|
)
|
||||||
# MOV r/m64, r64
|
else
|
||||||
in [[Symbol => dst_reg, Integer => dst_disp], Symbol => src_reg] if r64?(dst_reg) && r64?(src_reg) && imm8?(dst_disp)
|
raise NotImplementedError, "mov: not-implemented operands: #{dst.inspect}, #{src.inspect}"
|
||||||
|
end
|
||||||
|
in [Symbol => dst_reg]
|
||||||
|
case src
|
||||||
|
# MOV r/m64, imm32 (Mod 00)
|
||||||
|
in Integer => src_imm if r64?(dst_reg) && imm32?(src_imm)
|
||||||
|
# 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),
|
||||||
|
)
|
||||||
|
end
|
||||||
|
in [Symbol => dst_reg, Integer => dst_disp]
|
||||||
|
# MOV r/m64, r64 (Mod 01)
|
||||||
|
case src
|
||||||
|
in Symbol => src_reg if r64?(dst_reg) && imm8?(dst_disp) && r64?(src_reg)
|
||||||
# REX.W + 89 /r
|
# REX.W + 89 /r
|
||||||
# MR: Operand 1: ModRM:r/m (w), Operand 2: ModRM:reg (r)
|
# MR: Operand 1: ModRM:r/m (w), Operand 2: ModRM:reg (r)
|
||||||
insn(
|
insn(
|
||||||
@ -117,25 +146,9 @@ module RubyVM::MJIT
|
|||||||
mod_rm: mod_rm(mod: 0b01, reg: reg_code(src_reg), rm: reg_code(dst_reg)), # Mod 01: [reg]+disp8
|
mod_rm: mod_rm(mod: 0b01, reg: reg_code(src_reg), rm: reg_code(dst_reg)), # Mod 01: [reg]+disp8
|
||||||
disp: dst_disp,
|
disp: dst_disp,
|
||||||
)
|
)
|
||||||
# MOV r64, r/m64 (Mod 00)
|
else
|
||||||
in [Symbol => dst_reg, [Symbol => src_reg]] if r64?(dst_reg) && r64?(src_reg)
|
raise NotImplementedError, "mov: not-implemented operands: #{dst.inspect}, #{src.inspect}"
|
||||||
# REX.W + 8B /r
|
end
|
||||||
# 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 r64?(dst_reg) && r64?(src_reg) && imm8?(src_offset)
|
|
||||||
# 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
|
else
|
||||||
raise NotImplementedError, "mov: not-implemented operands: #{dst.inspect}, #{src.inspect}"
|
raise NotImplementedError, "mov: not-implemented operands: #{dst.inspect}, #{src.inspect}"
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user