Apply stack_size_32 cache optimization to push r/m
This commit is contained in:
parent
515a8f4111
commit
843527ac04
|
@ -234,7 +234,7 @@ const encodings = [
|
|||
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 3, jump: 1, skip: 1, },
|
||||
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 4, jump: 1, skip: 1, },
|
||||
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 5, jump: 1, skip: 1, },
|
||||
{ opcode: 0xFF, os: 1, e: 1, fixed_g: 6, },
|
||||
{ opcode: 0xFF, custom: 1, os: 1, e: 1, fixed_g: 6, },
|
||||
|
||||
{ opcode: 0x0F00, fixed_g: 0, e: 1, skip: 1 },
|
||||
{ opcode: 0x0F00, fixed_g: 1, e: 1, skip: 1 },
|
||||
|
|
|
@ -1449,6 +1449,7 @@ void instr16_FF_5_mem(int32_t addr)
|
|||
diverged();
|
||||
}
|
||||
DEFINE_MODRM_INSTR1_READ16(instr16_FF_6, push16(___))
|
||||
void instr16_FF_6_jit(int32_t modrm_byte) { push16_modrm_jit(modrm_byte); }
|
||||
|
||||
DEFINE_MODRM_INSTR1_READ_WRITE_32(instr32_FF_0, inc32(___))
|
||||
DEFINE_MODRM_INSTR1_READ_WRITE_32(instr32_FF_1, dec32(___))
|
||||
|
@ -1519,6 +1520,7 @@ void instr32_FF_5_mem(int32_t addr)
|
|||
diverged();
|
||||
}
|
||||
DEFINE_MODRM_INSTR1_READ32(instr32_FF_6, push32(___))
|
||||
void instr32_FF_6_jit(int32_t modrm_byte) { push32_modrm_jit(modrm_byte); }
|
||||
|
||||
void run_instruction(int32_t opcode)
|
||||
{
|
||||
|
|
|
@ -262,6 +262,9 @@ void push16_ss32(int32_t imm16)
|
|||
reg32s[ESP] += -2;
|
||||
}
|
||||
|
||||
void push16_ss16_mem(int32_t addr) { push16_ss16(safe_read16(addr)); }
|
||||
void push16_ss32_mem(int32_t addr) { push16_ss32(safe_read16(addr)); }
|
||||
|
||||
void push16(int32_t imm16)
|
||||
{
|
||||
if(*stack_size_32)
|
||||
|
@ -298,6 +301,25 @@ void push16_imm_jit(int32_t imm)
|
|||
}
|
||||
}
|
||||
|
||||
void push16_modrm_jit(int32_t modrm_byte)
|
||||
{
|
||||
if(modrm_byte < 0xC0)
|
||||
{
|
||||
if(*stack_size_32)
|
||||
{
|
||||
gen_modrm_fn0("push16_ss32_mem", 15, modrm_byte);
|
||||
}
|
||||
else
|
||||
{
|
||||
gen_modrm_fn0("push16_ss16_mem", 15, modrm_byte);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
push16_reg_jit(modrm_byte & 7);
|
||||
}
|
||||
}
|
||||
|
||||
__attribute__((always_inline))
|
||||
void push32_ss16(int32_t imm32)
|
||||
{
|
||||
|
@ -314,6 +336,9 @@ void push32_ss32(int32_t imm32)
|
|||
reg32s[ESP] = new_esp;
|
||||
}
|
||||
|
||||
void push32_ss16_mem(int32_t addr) { push32_ss16(safe_read32s(addr)); }
|
||||
void push32_ss32_mem(int32_t addr) { push32_ss32(safe_read32s(addr)); }
|
||||
|
||||
__attribute__((always_inline))
|
||||
void push32(int32_t imm32)
|
||||
{
|
||||
|
@ -351,6 +376,25 @@ void push32_imm_jit(int32_t imm)
|
|||
}
|
||||
}
|
||||
|
||||
void push32_modrm_jit(int32_t modrm_byte)
|
||||
{
|
||||
if(modrm_byte < 0xC0)
|
||||
{
|
||||
if(*stack_size_32)
|
||||
{
|
||||
gen_modrm_fn0("push32_ss32_mem", 15, modrm_byte);
|
||||
}
|
||||
else
|
||||
{
|
||||
gen_modrm_fn0("push32_ss16_mem", 15, modrm_byte);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
push32_reg_jit(modrm_byte & 7);
|
||||
}
|
||||
}
|
||||
|
||||
__attribute__((always_inline))
|
||||
int32_t pop16_ss16()
|
||||
{
|
||||
|
|
|
@ -43,14 +43,20 @@ int32_t get_stack_pointer(int32_t offset);
|
|||
void adjust_stack_reg(int32_t adjustment);
|
||||
void push16_ss16(int32_t imm16);
|
||||
void push16_ss32(int32_t imm16);
|
||||
void push16_ss16_mem(int32_t imm16);
|
||||
void push16_ss32_mem(int32_t imm16);
|
||||
void push16(int32_t imm16);
|
||||
void push16_reg_jit(int32_t reg);
|
||||
void push16_imm_jit(int32_t imm);
|
||||
void push16_modrm_jit(int32_t modrm_byte);
|
||||
void push32_ss16(int32_t imm32);
|
||||
void push32_ss32(int32_t imm32);
|
||||
void push32_ss16_mem(int32_t imm32);
|
||||
void push32_ss32_mem(int32_t imm32);
|
||||
void push32(int32_t imm32);
|
||||
void push32_reg_jit(int32_t reg);
|
||||
void push32_imm_jit(int32_t imm);
|
||||
void push32_modrm_jit(int32_t modrm_byte);
|
||||
int32_t pop16(void);
|
||||
void pop16_reg_jit(int32_t reg);
|
||||
int32_t pop32_ss16(void);
|
||||
|
|
Loading…
Reference in a new issue