diff options
-rw-r--r-- | lib/ruby_vm/rjit/assembler.rb | 10 | ||||
-rw-r--r-- | test/ruby/rjit/test_assembler.rb | 4 |
2 files changed, 13 insertions, 1 deletions
diff --git a/lib/ruby_vm/rjit/assembler.rb b/lib/ruby_vm/rjit/assembler.rb index 8003c854ef..6bd654fd3e 100644 --- a/lib/ruby_vm/rjit/assembler.rb +++ b/lib/ruby_vm/rjit/assembler.rb @@ -355,6 +355,16 @@ module RubyVM::RJIT mod_rm: ModRM[mod: Mod01, reg: right_reg, rm: left_reg], disp: left_disp, ) + # CMP r/m64, r64 (Mod 10: [reg]+disp32) + in [QwordPtr[R64 => left_reg, IMM32 => left_disp], R64 => right_reg] + # REX.W + 39 /r + # MR: Operand 1: ModRM:r/m (r), Operand 2: ModRM:reg (r) + insn( + prefix: REX_W, + opcode: 0x39, + mod_rm: ModRM[mod: Mod10, reg: right_reg, rm: left_reg], + disp: imm32(left_disp), + ) # CMP r/m64, r64 (Mod 11: reg) in [R64 => left_reg, R64 => right_reg] # REX.W + 39 /r diff --git a/test/ruby/rjit/test_assembler.rb b/test/ruby/rjit/test_assembler.rb index a1f8e9dc2a..57c84cfd50 100644 --- a/test/ruby/rjit/test_assembler.rb +++ b/test/ruby/rjit/test_assembler.rb @@ -118,6 +118,7 @@ module RubyVM::RJIT asm.cmp(:rax, 8) # CMP r/m64, imm8 (Mod 11: reg) asm.cmp(:rax, 0x100) # CMP r/m64, imm32 (Mod 11: reg) asm.cmp([:rax, 8], :rbx) # CMP r/m64, r64 (Mod 01: [reg]+disp8) + asm.cmp([:rax, -0x100], :rbx) # CMP r/m64, r64 (Mod 10: [reg]+disp32) asm.cmp(:rax, :rbx) # CMP r/m64, r64 (Mod 11: reg) assert_compile(asm, <<~EOS) 0x0: cmp byte ptr [rax + 8], 8 @@ -127,7 +128,8 @@ module RubyVM::RJIT 0x18: cmp rax, 8 0x1c: cmp rax, 0x100 0x23: cmp qword ptr [rax + 8], rbx - 0x27: cmp rax, rbx + 0x27: cmp qword ptr [rax - 0x100], rbx + 0x2e: cmp rax, rbx EOS end |