Browse Source

Apply stack_size_32 cache optimization to push r/m

Amaan Cheval 6 years ago
parent
commit
843527ac04
4 changed files with 53 additions and 1 deletions
  1. 1 1
      gen/x86_table.js
  2. 2 0
      src/native/instructions.c
  3. 44 0
      src/native/misc_instr.c
  4. 6 0
      src/native/misc_instr.h

+ 1 - 1
gen/x86_table.js

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

+ 2 - 0
src/native/instructions.c

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

+ 44 - 0
src/native/misc_instr.c

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

+ 6 - 0
src/native/misc_instr.h

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