Apply stack_size_32 cache optimization to push r/m

This commit is contained in:
Amaan Cheval 2018-02-23 13:14:49 +05:30 committed by Fabian
parent 515a8f4111
commit 843527ac04
4 changed files with 53 additions and 1 deletions

View file

@ -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 },

View file

@ -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)
{

View file

@ -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()
{

View file

@ -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);