MMX fixes :
- Initialise x87 tags correctly in recompiler - EMMS/FEMMS now respect cr0 TS bit - FRSTOR now doesn't force all non-uint64 tags to valid Fixes Heaven 7 with AudioPCI
This commit is contained in:
parent
b84fefacb7
commit
cb6422b324
7 changed files with 12 additions and 10 deletions
|
|
@ -839,8 +839,9 @@ static int codegen_MMX_ENTER(codeblock_t *block, uop_t *uop)
|
|||
|
||||
host_arm64_branch_set_offset(branch_ptr, &block->data[block_pos]);
|
||||
|
||||
host_arm64_STR_IMM_W(block, REG_WZR, REG_CPUSTATE, (uintptr_t)&cpu_state.tag[0] - (uintptr_t)&cpu_state);
|
||||
host_arm64_STR_IMM_W(block, REG_WZR, REG_CPUSTATE, (uintptr_t)&cpu_state.tag[4] - (uintptr_t)&cpu_state);
|
||||
host_arm64_mov_imm(block, REG_TEMP, 0x01010101);
|
||||
host_arm64_STR_IMM_W(block, REG_TEMP, REG_CPUSTATE, (uintptr_t)&cpu_state.tag[0] - (uintptr_t)&cpu_state);
|
||||
host_arm64_STR_IMM_W(block, REG_TEMP, REG_CPUSTATE, (uintptr_t)&cpu_state.tag[4] - (uintptr_t)&cpu_state);
|
||||
host_arm64_STR_IMM_W(block, REG_WZR, REG_CPUSTATE, (uintptr_t)&cpu_state.TOP - (uintptr_t)&cpu_state);
|
||||
host_arm64_STRB_IMM(block, REG_WZR, REG_CPUSTATE, (uintptr_t)&cpu_state.ismmx - (uintptr_t)&cpu_state);
|
||||
|
||||
|
|
|
|||
|
|
@ -910,9 +910,10 @@ static int codegen_MMX_ENTER(codeblock_t *block, uop_t *uop)
|
|||
|
||||
*branch_ptr |= ((((uintptr_t)&block_write_data[block_pos] - (uintptr_t)branch_ptr) - 8) & 0x3fffffc) >> 2;
|
||||
|
||||
host_arm_MOV_IMM(block, REG_TEMP, 0);
|
||||
host_arm_MOV_IMM(block, REG_TEMP, 0x01010101);
|
||||
host_arm_STR_IMM(block, REG_TEMP, REG_CPUSTATE, (uintptr_t)&cpu_state.tag[0] - (uintptr_t)&cpu_state);
|
||||
host_arm_STR_IMM(block, REG_TEMP, REG_CPUSTATE, (uintptr_t)&cpu_state.tag[4] - (uintptr_t)&cpu_state);
|
||||
host_arm_MOV_IMM(block, REG_TEMP, 0);
|
||||
host_arm_STR_IMM(block, REG_TEMP, REG_CPUSTATE, (uintptr_t)&cpu_state.TOP - (uintptr_t)&cpu_state);
|
||||
host_arm_STRB_IMM(block, REG_TEMP, REG_CPUSTATE, (uintptr_t)&cpu_state.ismmx - (uintptr_t)&cpu_state);
|
||||
|
||||
|
|
|
|||
|
|
@ -826,8 +826,8 @@ static int codegen_MMX_ENTER(codeblock_t *block, uop_t *uop)
|
|||
host_x86_CALL(block, x86_int);
|
||||
host_x86_JMP(block, codegen_exit_rout);
|
||||
*branch_offset = (uint32_t)((uintptr_t)&block_write_data[block_pos] - (uintptr_t)branch_offset) - 4;
|
||||
host_x86_MOV32_ABS_IMM(block, &cpu_state.tag[0], 0);
|
||||
host_x86_MOV32_ABS_IMM(block, &cpu_state.tag[4], 0);
|
||||
host_x86_MOV32_ABS_IMM(block, &cpu_state.tag[0], 0x01010101);
|
||||
host_x86_MOV32_ABS_IMM(block, &cpu_state.tag[4], 0x01010101);
|
||||
host_x86_MOV32_ABS_IMM(block, &cpu_state.TOP, 0);
|
||||
host_x86_MOV8_ABS_IMM(block, &cpu_state.ismmx, 1);
|
||||
|
||||
|
|
|
|||
|
|
@ -827,8 +827,8 @@ static int codegen_MMX_ENTER(codeblock_t *block, uop_t *uop)
|
|||
host_x86_CALL(block, x86_int);
|
||||
host_x86_JMP(block, codegen_exit_rout);
|
||||
*branch_offset = (uint32_t)((uintptr_t)&block_write_data[block_pos] - (uintptr_t)branch_offset) - 4;
|
||||
host_x86_MOV32_ABS_IMM(block, &cpu_state.tag[0], 0);
|
||||
host_x86_MOV32_ABS_IMM(block, &cpu_state.tag[4], 0);
|
||||
host_x86_MOV32_ABS_IMM(block, &cpu_state.tag[0], 0x01010101);
|
||||
host_x86_MOV32_ABS_IMM(block, &cpu_state.tag[4], 0x01010101);
|
||||
host_x86_MOV32_ABS_IMM(block, &cpu_state.TOP, 0);
|
||||
host_x86_MOV8_ABS_IMM(block, &cpu_state.ismmx, 1);
|
||||
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ static int opPREFETCH_a32(uint32_t fetchdat)
|
|||
static int opFEMMS(uint32_t fetchdat)
|
||||
{
|
||||
ILLEGAL_ON(!cpu_has_feature(CPU_FEATURE_MMX));
|
||||
if (cr0 & 4)
|
||||
if (cr0 & 0xc)
|
||||
{
|
||||
x86_int(7);
|
||||
return 1;
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ static int opEMMS(uint32_t fetchdat)
|
|||
x86illegal();
|
||||
return 1;
|
||||
}
|
||||
if (cr0 & 4)
|
||||
if (cr0 & 0xc)
|
||||
{
|
||||
x86_int(7);
|
||||
return 1;
|
||||
|
|
|
|||
|
|
@ -187,7 +187,7 @@ static inline void x87_ld_frstor(int reg)
|
|||
}
|
||||
else
|
||||
{
|
||||
cpu_state.tag[reg] = TAG_VALID;
|
||||
cpu_state.tag[reg] &= ~TAG_UINT64;
|
||||
cpu_state.ST[reg] = x87_ld80();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue