RJIT: Define QwordPtr for in-clause readability

This commit is contained in:
Takashi Kokubun 2023-03-11 22:30:53 -08:00
parent 9501283dea
commit 8835f9d3bf

View File

@ -6,6 +6,9 @@ module RubyVM::RJIT
# 32-bit memory access # 32-bit memory access
class DwordPtr < Data.define(:reg, :disp); end class DwordPtr < Data.define(:reg, :disp); end
# 64-bit memory access
QwordPtr = Array
# SystemV x64 calling convention # SystemV x64 calling convention
C_ARGS = [:rdi, :rsi, :rdx, :rcx, :r8, :r9] C_ARGS = [:rdi, :rsi, :rdx, :rcx, :r8, :r9]
C_RET = :rax C_RET = :rax
@ -69,7 +72,7 @@ module RubyVM::RJIT
def add(dst, src) def add(dst, src)
case [dst, src] case [dst, src]
# ADD r/m64, imm8 (Mod 00: [reg]) # ADD r/m64, imm8 (Mod 00: [reg])
in [Array[Symbol => dst_reg], Integer => src_imm] if r64?(dst_reg) && imm8?(src_imm) in [QwordPtr[Symbol => dst_reg], Integer => src_imm] if r64?(dst_reg) && imm8?(src_imm)
# REX.W + 83 /0 ib # REX.W + 83 /0 ib
# MI: Operand 1: ModRM:r/m (r, w), Operand 2: imm8/16/32 # MI: Operand 1: ModRM:r/m (r, w), Operand 2: imm8/16/32
insn( insn(
@ -133,7 +136,7 @@ module RubyVM::RJIT
imm: imm32(src_imm), imm: imm32(src_imm),
) )
# AND r64, r/m64 (Mod 01: [reg]+disp8) # AND r64, r/m64 (Mod 01: [reg]+disp8)
in [Symbol => dst_reg, Array[Symbol => src_reg, Integer => src_disp]] if r64?(dst_reg) && r64?(src_reg) && imm8?(src_disp) in [Symbol => dst_reg, QwordPtr[Symbol => src_reg, Integer => src_disp]] if r64?(dst_reg) && r64?(src_reg) && imm8?(src_disp)
# REX.W + 23 /r # REX.W + 23 /r
# RM: Operand 1: ModRM:reg (r, w), Operand 2: ModRM:r/m (r) # RM: Operand 1: ModRM:reg (r, w), Operand 2: ModRM:r/m (r)
insn( insn(
@ -259,7 +262,7 @@ module RubyVM::RJIT
mod_rm: ModRM[mod: Mod11, reg: dst_reg, rm: src_reg], mod_rm: ModRM[mod: Mod11, reg: dst_reg, rm: src_reg],
) )
# CMOVZ r64, r/m64 (Mod 01: [reg]+disp8) # CMOVZ r64, r/m64 (Mod 01: [reg]+disp8)
in [Symbol => dst_reg, Array[Symbol => src_reg, Integer => src_disp]] if r64?(dst_reg) && r64?(src_reg) && imm8?(src_disp) in [Symbol => dst_reg, QwordPtr[Symbol => src_reg, Integer => src_disp]] if r64?(dst_reg) && r64?(src_reg) && imm8?(src_disp)
# REX.W + 0F 44 /r # REX.W + 0F 44 /r
# RM: Operand 1: ModRM:reg (r, w), Operand 2: ModRM:r/m (r) # RM: Operand 1: ModRM:reg (r, w), Operand 2: ModRM:r/m (r)
insn( insn(
@ -294,7 +297,7 @@ module RubyVM::RJIT
imm: imm32(right_imm), imm: imm32(right_imm),
) )
# CMP r/m64, imm8 (Mod 01: [reg]+disp8) # CMP r/m64, imm8 (Mod 01: [reg]+disp8)
in [Array[Symbol => left_reg, Integer => left_disp], Integer => right_imm] if r64?(left_reg) && imm8?(left_disp) && imm8?(right_imm) in [QwordPtr[Symbol => left_reg, Integer => left_disp], Integer => right_imm] if r64?(left_reg) && imm8?(left_disp) && imm8?(right_imm)
# REX.W + 83 /7 ib # REX.W + 83 /7 ib
# MI: Operand 1: ModRM:r/m (r), Operand 2: imm8/16/32 # MI: Operand 1: ModRM:r/m (r), Operand 2: imm8/16/32
insn( insn(
@ -305,7 +308,7 @@ module RubyVM::RJIT
imm: imm8(right_imm), imm: imm8(right_imm),
) )
# CMP r/m64, imm8 (Mod 10: [reg]+disp32) # CMP r/m64, imm8 (Mod 10: [reg]+disp32)
in [Array[Symbol => left_reg, Integer => left_disp], Integer => right_imm] if r64?(left_reg) && imm32?(left_disp) && imm8?(right_imm) in [QwordPtr[Symbol => left_reg, Integer => left_disp], Integer => right_imm] if r64?(left_reg) && imm32?(left_disp) && imm8?(right_imm)
# REX.W + 83 /7 ib # REX.W + 83 /7 ib
# MI: Operand 1: ModRM:r/m (r), Operand 2: imm8/16/32 # MI: Operand 1: ModRM:r/m (r), Operand 2: imm8/16/32
insn( insn(
@ -336,7 +339,7 @@ module RubyVM::RJIT
imm: imm32(right_imm), imm: imm32(right_imm),
) )
# CMP r/m64, r64 (Mod 01: [reg]+disp8) # CMP r/m64, r64 (Mod 01: [reg]+disp8)
in [Array[Symbol => left_reg, Integer => left_disp], Symbol => right_reg] if r64?(right_reg) in [QwordPtr[Symbol => left_reg, Integer => left_disp], Symbol => right_reg] if r64?(right_reg)
# REX.W + 39 /r # REX.W + 39 /r
# MR: Operand 1: ModRM:r/m (r), Operand 2: ModRM:reg (r) # MR: Operand 1: ModRM:r/m (r), Operand 2: ModRM:reg (r)
insn( insn(
@ -403,7 +406,7 @@ module RubyVM::RJIT
# E9 cd # E9 cd
insn(opcode: 0xe9, imm: rel32(dst_addr)) insn(opcode: 0xe9, imm: rel32(dst_addr))
# JMP r/m64 (Mod 01: [reg]+disp8) # JMP r/m64 (Mod 01: [reg]+disp8)
in Array[Symbol => dst_reg, Integer => dst_disp] if r64?(dst_reg) && imm8?(dst_disp) in QwordPtr[Symbol => dst_reg, Integer => dst_disp] if r64?(dst_reg) && imm8?(dst_disp)
# FF /4 # FF /4
insn(opcode: 0xff, mod_rm: ModRM[mod: Mod01, reg: 4, rm: dst_reg], disp: dst_disp) insn(opcode: 0xff, mod_rm: ModRM[mod: Mod01, reg: 4, rm: dst_reg], disp: dst_disp)
# JMP r/m64 (Mod 11: reg) # JMP r/m64 (Mod 11: reg)
@ -460,7 +463,7 @@ module RubyVM::RJIT
def lea(dst, src) def lea(dst, src)
case [dst, src] case [dst, src]
# LEA r64,m (Mod 01: [reg]+disp8) # LEA r64,m (Mod 01: [reg]+disp8)
in [Symbol => dst_reg, Array[Symbol => src_reg, Integer => src_disp]] if r64?(dst_reg) && r64?(src_reg) && imm8?(src_disp) in [Symbol => dst_reg, QwordPtr[Symbol => src_reg, Integer => src_disp]] if r64?(dst_reg) && r64?(src_reg) && imm8?(src_disp)
# REX.W + 8D /r # REX.W + 8D /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(
@ -470,7 +473,7 @@ module RubyVM::RJIT
disp: imm8(src_disp), disp: imm8(src_disp),
) )
# LEA r64,m (Mod 10: [reg]+disp32) # LEA r64,m (Mod 10: [reg]+disp32)
in [Symbol => dst_reg, Array[Symbol => src_reg, Integer => src_disp]] if r64?(dst_reg) && r64?(src_reg) && imm32?(src_disp) in [Symbol => dst_reg, QwordPtr[Symbol => src_reg, Integer => src_disp]] if r64?(dst_reg) && r64?(src_reg) && imm32?(src_disp)
# REX.W + 8D /r # REX.W + 8D /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(
@ -487,7 +490,7 @@ module RubyVM::RJIT
in Symbol => dst_reg in Symbol => dst_reg
case src case src
# MOV r64, r/m64 (Mod 00: [reg]) # MOV r64, r/m64 (Mod 00: [reg])
in Array[Symbol => src_reg] if r64?(dst_reg) && r64?(src_reg) in QwordPtr[Symbol => src_reg] if r64?(dst_reg) && r64?(src_reg)
# REX.W + 8B /r # REX.W + 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(
@ -496,7 +499,7 @@ module RubyVM::RJIT
mod_rm: ModRM[mod: Mod00, reg: dst_reg, rm: src_reg], mod_rm: ModRM[mod: Mod00, reg: dst_reg, rm: src_reg],
) )
# MOV r64, r/m64 (Mod 01: [reg]+disp8) # MOV r64, r/m64 (Mod 01: [reg]+disp8)
in Array[Symbol => src_reg, Integer => src_disp] if r64?(dst_reg) && r64?(src_reg) && imm8?(src_disp) in QwordPtr[Symbol => src_reg, Integer => src_disp] if r64?(dst_reg) && r64?(src_reg) && imm8?(src_disp)
# REX.W + 8B /r # REX.W + 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(
@ -506,7 +509,7 @@ module RubyVM::RJIT
disp: src_disp, disp: src_disp,
) )
# MOV r64, r/m64 (Mod 10: [reg]+disp16) # MOV r64, r/m64 (Mod 10: [reg]+disp16)
in Array[Symbol => src_reg, Integer => src_disp] if r64?(dst_reg) && r64?(src_reg) && imm32?(src_disp) in QwordPtr[Symbol => src_reg, Integer => src_disp] if r64?(dst_reg) && r64?(src_reg) && imm32?(src_disp)
# REX.W + 8B /r # REX.W + 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(
@ -525,7 +528,7 @@ module RubyVM::RJIT
mod_rm: ModRM[mod: Mod11, reg: dst_reg, rm: src_reg], mod_rm: ModRM[mod: Mod11, reg: dst_reg, rm: src_reg],
) )
# MOV r32 r/m32 (Mod 01: [reg]+disp8) # MOV r32 r/m32 (Mod 01: [reg]+disp8)
in Array[Symbol => src_reg, Integer => src_disp] if r32?(dst_reg) && imm8?(src_disp) in QwordPtr[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(
@ -563,7 +566,7 @@ module RubyVM::RJIT
imm: imm64(src_imm), imm: imm64(src_imm),
) )
end end
in Array[Symbol => dst_reg] in QwordPtr[Symbol => dst_reg]
case src case src
# MOV r/m64, imm32 (Mod 00: [reg]) # MOV r/m64, imm32 (Mod 00: [reg])
in Integer => src_imm if r64?(dst_reg) && imm32?(src_imm) in Integer => src_imm if r64?(dst_reg) && imm32?(src_imm)
@ -598,7 +601,7 @@ module RubyVM::RJIT
imm: imm32(src_imm), imm: imm32(src_imm),
) )
end end
in Array[Symbol => dst_reg, Integer => dst_disp] in QwordPtr[Symbol => dst_reg, Integer => dst_disp]
# Optimize encoding when disp is 0 # Optimize encoding when disp is 0
return mov([dst_reg], src) if dst_disp == 0 return mov([dst_reg], src) if dst_disp == 0
@ -672,7 +675,7 @@ module RubyVM::RJIT
imm: imm32(src_imm), imm: imm32(src_imm),
) )
# OR r64, r/m64 (Mod 01: [reg]+disp8) # OR r64, r/m64 (Mod 01: [reg]+disp8)
in [Symbol => dst_reg, Array[Symbol => src_reg, Integer => src_disp]] if r64?(dst_reg) && r64?(src_reg) && imm8?(src_disp) in [Symbol => dst_reg, QwordPtr[Symbol => src_reg, Integer => src_disp]] if r64?(dst_reg) && r64?(src_reg) && imm8?(src_disp)
# REX.W + 0B /r # REX.W + 0B /r
# RM: Operand 1: ModRM:reg (r, w), Operand 2: ModRM:r/m (r) # RM: Operand 1: ModRM:reg (r, w), Operand 2: ModRM:r/m (r)
insn( insn(
@ -761,7 +764,7 @@ module RubyVM::RJIT
imm: imm8(right_imm), imm: imm8(right_imm),
) )
# TEST r/m64, imm32 (Mod 01: [reg]+disp8) # TEST r/m64, imm32 (Mod 01: [reg]+disp8)
in [Array[Symbol => left_reg, Integer => left_disp], Integer => right_imm] if imm8?(left_disp) && imm32?(right_imm) in [QwordPtr[Symbol => left_reg, Integer => left_disp], Integer => right_imm] if imm8?(left_disp) && imm32?(right_imm)
# REX.W + F7 /0 id # REX.W + F7 /0 id
# MI: Operand 1: ModRM:r/m (r), Operand 2: imm8/16/32 # MI: Operand 1: ModRM:r/m (r), Operand 2: imm8/16/32
insn( insn(
@ -772,7 +775,7 @@ module RubyVM::RJIT
imm: imm32(right_imm), imm: imm32(right_imm),
) )
# TEST r/m64, imm32 (Mod 10: [reg]+disp32) # TEST r/m64, imm32 (Mod 10: [reg]+disp32)
in [Array[Symbol => left_reg, Integer => left_disp], Integer => right_imm] if imm32?(left_disp) && imm32?(right_imm) in [QwordPtr[Symbol => left_reg, Integer => left_disp], Integer => right_imm] if imm32?(left_disp) && imm32?(right_imm)
# REX.W + F7 /0 id # REX.W + F7 /0 id
# MI: Operand 1: ModRM:r/m (r), Operand 2: imm8/16/32 # MI: Operand 1: ModRM:r/m (r), Operand 2: imm8/16/32
insn( insn(