Fixed x86-32 recompiler MMX entry code
Fixed FPU tag resetting in EMMS instruction Clear MMX state in FINIT Reset FPU state in FSAVE/FNSAVE Fixes issues with MMX when more than one MMX program is running
This commit is contained in:
parent
bb625f4fcf
commit
9167b3a71f
3 changed files with 13 additions and 4 deletions
|
|
@ -3460,13 +3460,13 @@ static void MMX_ENTER()
|
|||
addbyte(0x45);
|
||||
addbyte(cpu_state_offset(ismmx));
|
||||
addbyte(1);
|
||||
addbyte(0x8b); /*MOV TOP, EAX*/
|
||||
addbyte(0x89); /*MOV TOP, EAX*/
|
||||
addbyte(0x45);
|
||||
addbyte(cpu_state_offset(TOP));
|
||||
addbyte(0x8b); /*MOV tag, EAX*/
|
||||
addbyte(0x89); /*MOV tag, EAX*/
|
||||
addbyte(0x45);
|
||||
addbyte(cpu_state_offset(tag[0]));
|
||||
addbyte(0x8b); /*MOV tag+4, EAX*/
|
||||
addbyte(0x89); /*MOV tag+4, EAX*/
|
||||
addbyte(0x45);
|
||||
addbyte(cpu_state_offset(tag[4]));
|
||||
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ static inline void x87_set_mmx()
|
|||
|
||||
static inline void x87_emms()
|
||||
{
|
||||
*cpu_state.tag = 0x0303030303030303ll;
|
||||
*(uint64_t *)cpu_state.tag = 0x0303030303030303ll;
|
||||
cpu_state.ismmx = 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ static int opFINIT(uint32_t fetchdat)
|
|||
cpu_state.npxs = 0;
|
||||
*(uint64_t *)cpu_state.tag = 0x0303030303030303ll;
|
||||
cpu_state.TOP = 0;
|
||||
cpu_state.ismmx = 0;
|
||||
CLOCK_CYCLES(17);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -272,6 +273,14 @@ static int FSAVE()
|
|||
}
|
||||
break;
|
||||
}
|
||||
|
||||
cpu_state.npxc = 0x37F;
|
||||
cpu_state.new_npxc = (cpu_state.old_npxc & ~0xc00);
|
||||
cpu_state.npxs = 0;
|
||||
*(uint64_t *)cpu_state.tag = 0x0303030303030303ll;
|
||||
cpu_state.TOP = 0;
|
||||
cpu_state.ismmx = 0;
|
||||
|
||||
CLOCK_CYCLES((cr0 & 1) ? 56 : 67);
|
||||
return cpu_state.abrt;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue