summaryrefslogtreecommitdiff
path: root/lib/mjit/x86_assembler.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mjit/x86_assembler.rb')
-rw-r--r--lib/mjit/x86_assembler.rb20
1 files changed, 19 insertions, 1 deletions
diff --git a/lib/mjit/x86_assembler.rb b/lib/mjit/x86_assembler.rb
index ad194185ae..890fa2b80a 100644
--- a/lib/mjit/x86_assembler.rb
+++ b/lib/mjit/x86_assembler.rb
@@ -34,7 +34,7 @@ module RubyVM::MJIT
def add(dst, src)
case [dst, src]
- # ADD r/m64, imm8
+ # ADD r/m64, imm8 (Mod 11)
in [Symbol => dst_reg, Integer => src_imm] if r64?(dst_reg) && imm8?(src_imm)
# REX.W + 83 /0 ib
# MI: Operand 1: ModRM:r/m (r, w), Operand 2: imm8/16/32
@@ -44,6 +44,16 @@ module RubyVM::MJIT
mod_rm: mod_rm(mod: 0b11, rm: reg_code(dst_reg)),
imm: imm8(src_imm),
)
+ # ADD r/m64, imm8 (Mod 00)
+ in [[Symbol => dst_reg], Integer => src_imm] if r64?(dst_reg) && imm8?(src_imm)
+ # REX.W + 83 /0 ib
+ # MI: Operand 1: ModRM:r/m (r, w), Operand 2: imm8/16/32
+ insn(
+ prefix: REX_W,
+ opcode: 0x83,
+ mod_rm: mod_rm(mod: 0b00, rm: reg_code(dst_reg)), # Mod 00: [reg]
+ imm: imm8(src_imm),
+ )
else
raise NotImplementedError, "add: not-implemented operands: #{dst.inspect}, #{src.inspect}"
end
@@ -189,6 +199,14 @@ module RubyVM::MJIT
@labels[label] = @bytes.size
end
+ def incr_counter(name)
+ if C.mjit_opts.stats
+ comment("increment counter #{name}")
+ mov(:rax, C.rb_mjit_counters[name].to_i)
+ add([:rax], 1) # TODO: lock
+ end
+ end
+
private
def insn(prefix: nil, opcode:, mod_rm: nil, disp: nil, imm: nil)