Tweak flat DS/SS dynarec optimisation, should reduce block churn when routines are called both with and without flat DS/SS.
Fixed incorrect STACK32 flag when entering V86 mode that was hidden by block churn. Protected and V86 mode status now considered when selecting block.
This commit is contained in:
parent
13496ba7b9
commit
717d815604
10 changed files with 108 additions and 78 deletions
|
|
@ -869,7 +869,7 @@ static inline void CHECK_SEG_READ(x86seg *seg)
|
|||
return;
|
||||
if (seg->checked)
|
||||
return;
|
||||
if ((seg == &_ds) && codegen_flat_ds)
|
||||
if (seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS))
|
||||
return;
|
||||
|
||||
if (IS_32_ADDR(&seg->base))
|
||||
|
|
@ -905,7 +905,7 @@ static inline void CHECK_SEG_WRITE(x86seg *seg)
|
|||
return;
|
||||
if (seg->checked)
|
||||
return;
|
||||
if ((seg == &_ds) && codegen_flat_ds)
|
||||
if (seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS))
|
||||
return;
|
||||
|
||||
if (IS_32_ADDR(&seg->base))
|
||||
|
|
@ -933,7 +933,7 @@ static inline void CHECK_SEG_WRITE(x86seg *seg)
|
|||
}
|
||||
static inline void CHECK_SEG_LIMITS(x86seg *seg, int end_offset)
|
||||
{
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
return;
|
||||
|
||||
if (IS_32_ADDR(&seg->base))
|
||||
|
|
@ -972,7 +972,7 @@ static inline void CHECK_SEG_LIMITS(x86seg *seg, int end_offset)
|
|||
|
||||
static inline void MEM_LOAD_ADDR_EA_B(x86seg *seg)
|
||||
{
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ECX, ECX*/
|
||||
addbyte(0xc9);
|
||||
|
|
@ -1045,7 +1045,7 @@ static inline void MEM_LOAD_ADDR_EA_B(x86seg *seg)
|
|||
}
|
||||
static inline void MEM_LOAD_ADDR_EA_W(x86seg *seg)
|
||||
{
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ECX, ECX*/
|
||||
addbyte(0xc9);
|
||||
|
|
@ -1131,7 +1131,7 @@ static inline void MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset)
|
|||
}
|
||||
static inline void MEM_LOAD_ADDR_EA_L(x86seg *seg)
|
||||
{
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ECX, ECX*/
|
||||
addbyte(0xc9);
|
||||
|
|
@ -1209,7 +1209,7 @@ static inline void MEM_LOAD_ADDR_EA_L(x86seg *seg)
|
|||
}
|
||||
static inline void MEM_LOAD_ADDR_EA_Q(x86seg *seg)
|
||||
{
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ECX, ECX*/
|
||||
addbyte(0xc9);
|
||||
|
|
@ -1330,7 +1330,7 @@ static inline void MEM_STORE_ADDR_EA_B(x86seg *seg, int host_reg)
|
|||
addbyte(8);
|
||||
host_reg = 8;
|
||||
}
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ECX, ECX*/
|
||||
addbyte(0xc9);
|
||||
|
|
@ -1414,7 +1414,7 @@ static inline void MEM_STORE_ADDR_EA_B(x86seg *seg, int host_reg)
|
|||
}
|
||||
static inline void MEM_STORE_ADDR_EA_W(x86seg *seg, int host_reg)
|
||||
{
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ECX, ECX*/
|
||||
addbyte(0xc9);
|
||||
|
|
@ -1505,7 +1505,7 @@ static inline void MEM_STORE_ADDR_EA_W(x86seg *seg, int host_reg)
|
|||
}
|
||||
static inline void MEM_STORE_ADDR_EA_L(x86seg *seg, int host_reg)
|
||||
{
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ECX, ECX*/
|
||||
addbyte(0xc9);
|
||||
|
|
@ -1594,7 +1594,7 @@ static inline void MEM_STORE_ADDR_EA_L(x86seg *seg, int host_reg)
|
|||
}
|
||||
static inline void MEM_STORE_ADDR_EA_Q(x86seg *seg, int host_reg, int host_reg2)
|
||||
{
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ECX, ECX*/
|
||||
addbyte(0xc9);
|
||||
|
|
@ -5283,7 +5283,7 @@ static inline void MEM_CHECK_WRITE(x86seg *seg)
|
|||
|
||||
CHECK_SEG_WRITE(seg);
|
||||
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ESI, ESI*/
|
||||
addbyte(0xf6);
|
||||
|
|
@ -5335,7 +5335,7 @@ static inline void MEM_CHECK_WRITE(x86seg *seg)
|
|||
addbyte(0xc1); /*SHR EDI, 12*/
|
||||
addbyte(0xef);
|
||||
addbyte(12);
|
||||
if (!(seg == &_ds && codegen_flat_ds) && !(seg == &_ss && codegen_flat_ss))
|
||||
if (!(seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) && !(seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x83); /*CMP ESI, -1*/
|
||||
addbyte(0xfe);
|
||||
|
|
@ -5367,7 +5367,7 @@ static inline void MEM_CHECK_WRITE(x86seg *seg)
|
|||
addbyte(0);
|
||||
// addbyte(0xc3); /*RET*/
|
||||
|
||||
if (!(seg == &_ds && codegen_flat_ds) && !(seg == &_ss && codegen_flat_ss))
|
||||
if (!(seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) && !(seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
*jump3 = (uintptr_t)&codeblock[block_current].data[block_pos] - (uintptr_t)jump3 - 1;
|
||||
/*slowpath:*/
|
||||
addbyte(0x67); /*LEA EDI, [EAX+ESI]*/
|
||||
|
|
@ -5413,7 +5413,7 @@ static inline void MEM_CHECK_WRITE_W(x86seg *seg)
|
|||
|
||||
CHECK_SEG_WRITE(seg);
|
||||
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ESI, ESI*/
|
||||
addbyte(0xf6);
|
||||
|
|
@ -5461,7 +5461,7 @@ static inline void MEM_CHECK_WRITE_W(x86seg *seg)
|
|||
addbyte(0x79); /*JNS +*/
|
||||
jump1 = &codeblock[block_current].data[block_pos];
|
||||
addbyte(0);
|
||||
if (!(seg == &_ds && codegen_flat_ds) && !(seg == &_ss && codegen_flat_ss))
|
||||
if (!(seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) && !(seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x83); /*CMP ESI, -1*/
|
||||
addbyte(0xfe);
|
||||
|
|
@ -5470,7 +5470,7 @@ static inline void MEM_CHECK_WRITE_W(x86seg *seg)
|
|||
addbyte(0x8d); /*LEA ESI, 1[EDI]*/
|
||||
addbyte(0x77);
|
||||
addbyte(0x01);
|
||||
if (!(seg == &_ds && codegen_flat_ds) && !(seg == &_ss && codegen_flat_ss))
|
||||
if (!(seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) && !(seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
jump4 = &codeblock[block_current].data[block_pos];
|
||||
|
|
@ -5526,7 +5526,7 @@ static inline void MEM_CHECK_WRITE_W(x86seg *seg)
|
|||
|
||||
/*slowpath:*/
|
||||
*jump2 = (uintptr_t)&codeblock[block_current].data[block_pos] - (uintptr_t)jump2 - 1;
|
||||
if (!(seg == &_ds && codegen_flat_ds) && !(seg == &_ss && codegen_flat_ss))
|
||||
if (!(seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) && !(seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
*jump4 = (uintptr_t)&codeblock[block_current].data[block_pos] - (uintptr_t)jump4 - 1;
|
||||
jump_pos = block_pos;
|
||||
load_param_1_reg_32(REG_EBX);
|
||||
|
|
@ -5562,7 +5562,7 @@ static inline void MEM_CHECK_WRITE_L(x86seg *seg)
|
|||
|
||||
CHECK_SEG_WRITE(seg);
|
||||
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ESI, ESI*/
|
||||
addbyte(0xf6);
|
||||
|
|
@ -5610,7 +5610,7 @@ static inline void MEM_CHECK_WRITE_L(x86seg *seg)
|
|||
addbyte(0x79); /*JNS +*/
|
||||
jump1 = &codeblock[block_current].data[block_pos];
|
||||
addbyte(0);
|
||||
if (!(seg == &_ds && codegen_flat_ds) && !(seg == &_ss && codegen_flat_ss))
|
||||
if (!(seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) && !(seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x83); /*CMP ESI, -1*/
|
||||
addbyte(0xfe);
|
||||
|
|
@ -5619,7 +5619,7 @@ static inline void MEM_CHECK_WRITE_L(x86seg *seg)
|
|||
addbyte(0x8d); /*LEA ESI, 3[EDI]*/
|
||||
addbyte(0x77);
|
||||
addbyte(0x03);
|
||||
if (!(seg == &_ds && codegen_flat_ds) && !(seg == &_ss && codegen_flat_ss))
|
||||
if (!(seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) && !(seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x74); /*JE slowpath*/
|
||||
jump4 = &codeblock[block_current].data[block_pos];
|
||||
|
|
@ -5675,7 +5675,7 @@ static inline void MEM_CHECK_WRITE_L(x86seg *seg)
|
|||
|
||||
/*slowpath:*/
|
||||
*jump2 = (uintptr_t)&codeblock[block_current].data[block_pos] - (uintptr_t)jump2 - 1;
|
||||
if (!(seg == &_ds && codegen_flat_ds) && !(seg == &_ss && codegen_flat_ss))
|
||||
if (!(seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) && !(seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
*jump4 = (uintptr_t)&codeblock[block_current].data[block_pos] - (uintptr_t)jump4 - 1;
|
||||
jump_pos = block_pos;
|
||||
load_param_1_reg_32(REG_EBX);
|
||||
|
|
@ -5706,7 +5706,7 @@ static inline void MEM_CHECK_WRITE_L(x86seg *seg)
|
|||
|
||||
static inline int MEM_LOAD_ADDR_EA_B_NO_ABRT(x86seg *seg)
|
||||
{
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ECX, ECX*/
|
||||
addbyte(0xc9);
|
||||
|
|
@ -5778,7 +5778,7 @@ static inline int MEM_LOAD_ADDR_EA_B_NO_ABRT(x86seg *seg)
|
|||
}
|
||||
static inline int MEM_LOAD_ADDR_EA_W_NO_ABRT(x86seg *seg)
|
||||
{
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ECX, ECX*/
|
||||
addbyte(0xc9);
|
||||
|
|
@ -5856,7 +5856,7 @@ static inline int MEM_LOAD_ADDR_EA_W_NO_ABRT(x86seg *seg)
|
|||
}
|
||||
static inline int MEM_LOAD_ADDR_EA_L_NO_ABRT(x86seg *seg)
|
||||
{
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ECX, ECX*/
|
||||
addbyte(0xc9);
|
||||
|
|
@ -5956,7 +5956,7 @@ static inline void MEM_STORE_ADDR_EA_B_NO_ABRT(x86seg *seg, int host_reg)
|
|||
addbyte(8);
|
||||
host_reg = 8;
|
||||
}
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR EBX, EBX*/
|
||||
addbyte(0xdb);
|
||||
|
|
@ -6033,7 +6033,7 @@ static inline void MEM_STORE_ADDR_EA_B_NO_ABRT(x86seg *seg, int host_reg)
|
|||
}
|
||||
static inline void MEM_STORE_ADDR_EA_W_NO_ABRT(x86seg *seg, int host_reg)
|
||||
{
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR EBX, EBX*/
|
||||
addbyte(0xdb);
|
||||
|
|
@ -6117,7 +6117,7 @@ static inline void MEM_STORE_ADDR_EA_W_NO_ABRT(x86seg *seg, int host_reg)
|
|||
}
|
||||
static inline void MEM_STORE_ADDR_EA_L_NO_ABRT(x86seg *seg, int host_reg)
|
||||
{
|
||||
if ((seg == &_ds && codegen_flat_ds) || (seg == &_ss && codegen_flat_ss))
|
||||
if ((seg == &_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR EBX, EBX*/
|
||||
addbyte(0xdb);
|
||||
|
|
|
|||
Loading…
Reference in a new issue