Core/DSP/Jit: Ensure aligned stack when pushing registers for ABI calls

This fixes issue 4378: DSP LLE Jit not working on OSX


git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7450 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
pierre 2011-04-11 20:54:52 +00:00
parent 37beef5a35
commit 4f603ef730
1 changed files with 30 additions and 0 deletions

View File

@ -418,6 +418,21 @@ void DSPJitRegCache::pushRegs() {
movToMemory(i); movToMemory(i);
} }
int push_count = 0;
for(unsigned int i = 0; i < NUMXREGS; i++) {
if (xregs[i].guest_reg == DSP_REG_USED)
push_count++;
}
//hardcoding alignment to 16 bytes
#ifdef _M_X64
if (push_count & 1)
emitter.SUB(64,R(RSP),Imm32(8));
#else
if (push_count & 3)
emitter.SUB(32,R(ESP),Imm32(16 - 4 * (push_count & 3)));
#endif
for(unsigned int i = 0; i < NUMXREGS; i++) { for(unsigned int i = 0; i < NUMXREGS; i++) {
if (xregs[i].guest_reg == DSP_REG_USED) { if (xregs[i].guest_reg == DSP_REG_USED) {
emitter.PUSH((X64Reg)i); emitter.PUSH((X64Reg)i);
@ -452,6 +467,12 @@ void DSPJitRegCache::popRegs() {
#else #else
emitter.MOV(32, M(&ebp_store), R(EBP)); emitter.MOV(32, M(&ebp_store), R(EBP));
#endif #endif
int push_count = 0;
for(unsigned int i = 0; i < NUMXREGS; i++) {
if (xregs[i].pushed)
push_count++;
}
for(int i = NUMXREGS-1; i >= 0; i--) { for(int i = NUMXREGS-1; i >= 0; i--) {
if (xregs[i].pushed) { if (xregs[i].pushed) {
emitter.POP((X64Reg)i); emitter.POP((X64Reg)i);
@ -460,6 +481,15 @@ void DSPJitRegCache::popRegs() {
} }
} }
//hardcoding alignment to 16 bytes
#ifdef _M_X64
if (push_count & 1)
emitter.ADD(64,R(RSP),Imm32(8));
#else
if (push_count & 3)
emitter.ADD(32,R(ESP),Imm32(16 - 4 * (push_count & 3)));
#endif
for(unsigned int i = 0; i <= DSP_REG_MAX_MEM_BACKED; i++) { for(unsigned int i = 0; i <= DSP_REG_MAX_MEM_BACKED; i++) {
if (regs[i].host_reg != INVALID_REG) if (regs[i].host_reg != INVALID_REG)
movToHostReg(i,regs[i].host_reg); movToHostReg(i,regs[i].host_reg);